From 726423422b71e03fd78f07065c25c9a673adce3b Mon Sep 17 00:00:00 2001 From: Aetherinox Date: Fri, 19 Jul 2024 06:37:10 -0700 Subject: [PATCH] docs: update CONTRIBUTING push changes pending last week --- CONTRIBUTING.md | 594 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 471 insertions(+), 123 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ab2e052..69ab73f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,49 +1,114 @@
-

Ntfy Desktop πŸ”…

-
-

Contributor Documentation

+
Thank you for your interest in contributing!
+

♾️ Contributing ♾️


-[![Test Status][test-badge]][build] -[![Code Coverage][coverage-badge]][coverage] -[![Version][version]][package] -[![Last Commit][badge-commit]][badge-commit] -[![Size][badge-size]][badge-size] -[![All Contributors][all-contributors-badge]](#contributors-) +[![Version][github-version-img]][github-version-uri] +[![Build Status][github-build-img]][github-build-uri] +[![Downloads][github-downloads-img]][github-downloads-uri] +[![Size][github-size-img]][github-size-img] +[![Last Commit][github-commit-img]][github-commit-img] +[![Contributors][contribs-all-img]](#contributors-)
+
+ +--- + +
+ +## About + +Below are a list of ways that you can help contribute to this project, as well as policies and guides that explain how to get started. + +Please review everything on this page before you submit your contribution. + +
+ ---
-- [Submitting Bugs](#submitting-bugs) -- [Contributing](#contributing) - - [Pull requests eligible for review](#pull-requests-eligible-for-review) - - [Conventional Commit Specification](#conventional-commit-specification) - - [Types](#types) - - [Example 1:](#example-1) - - [Example 2:](#example-2) - - [References](#references) - - [Code Styling](#code-styling) - - [Spaces Instead Of Tabs](#spaces-instead-of-tabs) - - [Commenting](#commenting) - - [Casing](#casing) +- [About](#about) +- [Issues, Bugs, Ideas](#issues-bugs-ideas) +- [Contributing](#contributing) + - [Before Submitting Pull Requests](#before-submitting-pull-requests) + - [Conventional Commit Specification](#conventional-commit-specification) + - [Types](#types) + - [Example 1:](#example-1) + - [Example 2:](#example-2) + - [Commiting](#commiting) + - [Languages](#languages) + - [Python](#python) + - [Indentation](#indentation) + - [Line Length](#line-length) + - [Blank Lines](#blank-lines) + - [Imports](#imports) + - [Commenting](#commenting) + - [Casing](#casing) + - [NodeJS - ESLint \& Prettier](#nodejs---eslint--prettier) + - [Indentation](#indentation-1) + - [Style](#style) + - [Line Length](#line-length-1) + - [Packages](#packages) + - [Configs](#configs) + - [ESLint \>= v9 Config](#eslint--v9-config) + - [ESLint \< v9 Config](#eslint--v9-config-1) + - [Prettier](#prettier) + - [Commenting](#commenting-1) + - [Casing](#casing-1) + +
---
-## Submitting Bugs +## Issues, Bugs, Ideas +Stuff happens, and sometimes as best as we try, there may be issues within this project that we are unaware of. That is the great thing about open-source; anyone can use the program and contribute to making it better. + +
+ +If you have found a bug, have an issue, or maybe even a cool idea; you can let us know by [submitting it](https://github.com/aetherinox/ntfy-desktop/issues). However, before you submit your new issue, bug report, or feature request; head over to the [Issues Section](https://github.com/aetherinox/ntfy-desktop/issues) and ensure nobody else has already submitted it. + +
+ +Once you are sure that your issue has not already being dealt with; you may submit a new issue at [here](https://github.com/aetherinox/ntfy-desktop/issues/new/choose). You'll be asked to specify exactly what your new submission targets, such as: +- Bug report +- Feature Suggestion -Please ensure that when you submit bugs; you are detailed. +
-- Explain the issue -- Describe how the function should operate, and what you are experiencing instead. -- Provide possible options for a resolution or insight +When writing a new submission; ensure you fill out any of the questions asked of you. If you do not provide enough information, we cannot help. Be as detailed as possible, and provide any logs or screenshots you may have to help us better understand what you mean. Failure to fill out the submission properly may result in it being closed without a response. + +
+ +If you are submitting a bug report: + +- Explain the issue +- Describe how you expect for a feature to work, and what you're seeing instead of what you expected. +- List possible options for a resolution or insight +- Provide screenshots, logs, or anything else that can visually help track down the issue. + +
+ +
+ +[![Submit Issue][btn-github-submit-img]][btn-github-submit-uri] + +
+ +
+ +
+ +**[`^ back to top ^`](#about)** + +

@@ -52,36 +117,36 @@ Please ensure that when you submit bugs; you are detailed.
## Contributing +If you are looking to contribute to this project by actually submit your own code; please review this section completely. There is important information and policies provided below that you must follow for your pull request to get accepted. The source is here for everyone to collectively share and colaborate on. If you think you have a possible solution to a problem; don't be afraid to get your hands dirty. -Unless you are fixing a known bug, we strongly recommend discussing it with the core team via a GitHub issue before getting started to ensure your work does not conflict with future plans. - -All contributions are made via pull requests. To make a pull request, you will need a GitHub account; if you are unclear on this process, see [GitHub's documentation on forking and pull requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork). Pull requests should be targeted at the master branch. +All contributions are made via pull requests. To create a pull request, you need a GitHub account. If you are unclear on this process, see [GitHub's documentation on forking and pull requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork). Pull requests should be targeted at the master branch.
-### Pull requests eligible for review +### Before Submitting Pull Requests -- Follow the repository's code formatting conventions (see below); -- Include tests that prove that the change works as intended and does not add regressions; -- Document the changes in the code and/or the project's documentation; -- Pass the CI pipeline; -- Include a proper git commit message following the [Conventional Commit Specification](https://conventionalcommits.org/en/v1.0.0/#specification). +- Follow the repository's code formatting conventions (see below); +- Include tests that prove that the change works as intended and does not add regressions; +- Document the changes in the code and/or the project's documentation; +- Your PR must pass the CI pipeline; +- When submitting your Pull Request, use one of the following branches: + - For bug fixes: `main` branch + - For features & functionality: `development` branch +- Include a proper git commit message following the [Conventional Commit Specification](https://www.conventionalcommits.org/en/v1.0.0/#specification).
-If all of these items are checked, the pull request is ready to be reviewed and you should change the status to "Ready for review" and request review from a maintainer. +If you have completed the above tasks, the pull request is ready to be reviewed and your pull request's label will be changed to "Ready for Review". At this point, a human will need to step in and manually verify your submission. -Reviewers will approve the pull request once they are satisfied with the patch. +Reviewers will approve the pull request once they are satisfied with the patch it will be merged.
### Conventional Commit Specification -When commiting your changes, we require you to follow the Conventional Commit Specification, described below. - -**The Conventional Commits** is a specification for the format and content of a commit message. The concept behind Conventional Commits is to provide a rich commit history that can be read and understood by both humans and automated tools. Conventional Commits have the following format: +When commiting your changes, we require you to follow the [Conventional Commit Specification](https://www.conventionalcommits.org/en/v1.0.0/#specification). The **Conventional Commits** is a specification for the format and content of a commit message. The concept behind Conventional Commits is to provide a rich commit history that can be read and understood by both humans and automated tools. Conventional Commits have the following format:
@@ -93,33 +158,37 @@ When commiting your changes, we require you to follow the Conventional Commit Sp [optional ] ``` -#### Types +
-| Type | Description | -| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `feat` | Introduces a new feature | -| `fix` | A bug fix for the end user | -| `docs` | A change to the website or Markdown documents | -| `build` | The commit alters the build process. E.g: creating a new build task, updating the release script, editing Makefile. | -| `test` | Adds missing tests, refactoring tests; no production code change. Usually changes the suite of automated tests for the product. | -| `perf` | Improves performance of algorithms or general execution time of the product, but does not fundamentally change an existing feature. | -| `style` | Updates or reformats the style of the source code, but does not otherwise change the product implementation. Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) | -| `refactor` | A change to production code that leads to no behavior difference, e.g. splitting files, renaming internal variables, improving code style, etc. | -| `change` | Changes the implementation of an existing feature. | -| `chore` | Includes a technical or preventative maintenance task that is necessary for managing the product or the repository, but is not tied to any specific feature. E.g. updating dependencies. These are usually done for maintanence purposes. | -| `ci` | Changes related to Continuous Integration (usually `yml` and other configuration files). | -| `misc` | Anything else that doesn't change production code, yet is not ci, test or chore. | -| `revert` | Revert to a previous commit | -| `remove` | Removes a feature from the product. Typically features are deprecated first for a period of time before being removed. Removing a feature from the product may be considered a breaking change that will require a major version number increment. | -| `deprecate` | Deprecates existing functionality, but does not remove it from the product. | +#### Types +| Type | Description | +| --- | --- | +| `feat` |
Introduce new feature

| +| `fix` |
Bug fix

| +| `deps` |
Add or update existing dependencies

| +| `docs` |
Change website or markdown documents. Does not mean changes to the documentation generator script itself, only the documents created from the generator.

E.g: documentation, readme.md or markdown

| +| `build` |
Changes to the build / compilation / packaging process or auxiliary tools such as doc generation

E.g: create new build tasks, update release script, etc.

| +| `test` |
Add or refactor tests, no production code change. Changes the suite of automated tests for the app.

| +| `perf` |
Performance improvement of algorithms or execution time of the app. Does not change an existing feature.

| +| `style` |
Update / reformat style of source code. Does not change the way app is implemented. Changes that do not affect the meaning of the code

E.g: white-space, formatting, missing semi-colons, change tabs to spaces, etc)

| +| `refactor` |
Change to production code that leads to no behavior difference,

E.g: split files, rename variables, rename package, improve code style, etc.

| +| `change` |
Change an existing feature.

| +| `chore` |
Includes technical or preventative maintenance task that is necessary for managing the app or repo, such as updating grunt tasks, but is not tied to any specific feature. Usually done for maintanence purposes.

E.g: Edit .gitignore, .prettierrc, .prettierignore, .gitignore, eslint.config.js file

| +| `ci` |
Changes related to Continuous Integration (usually `yml` and other configuration files).

| +| `misc` |
Anything that doesn't fit into another commit type. Usually doesn't change production code; yet is not ci, test or chore.

| +| `revert` |
Revert a previous commit

| +| `remove` |
Remove a feature from app. Features are usually first deprecated for a period of time before being removed. Removing a feature from the app may be considered a breaking change that will require a major version number increment.

| +| `deprecate` |
Deprecate existing functionality, but does not remove it from the app.

|
##### Example 1: ``` -feat(core): allow overriding of webpack config -^───^────^ ^────────────────────────────────^ +feat(core): bug affecting menu [#22] +^───^────^ ^────────────────^ ^───^ +| | | | +| | | └───⫸ (ISSUE): Reference issue ID β”‚ β”‚ β”‚ β”‚ β”‚ └───⫸ (DESC): Summary in present tense. Use lower case not title case! β”‚ β”‚ @@ -131,9 +200,10 @@ feat(core): allow overriding of webpack config
##### Example 2: - ``` -(): +(): [issue] + | | | | + | | | └─⫸ Reference issue id (optional) β”‚ β”‚ β”‚ β”‚ β”‚ └─⫸ Summary in present tense. Not capitalized. No period at the end. β”‚ β”‚ @@ -149,9 +219,8 @@ feat(core): allow overriding of webpack config
-### References - -If you are pushing a commit which addresses a submitted issue, reference your issue in the description of your commit. You may also optionally add the major issue to the end of your commit title. +### Commiting +If you are pushing a commit which addresses a submitted issue, reference your issue at the end of the commit message. You may also optionally add the major issue to the end of your commit body. References should be on their own line, following the word `Ref` or `Refs` @@ -162,60 +231,279 @@ Description: The description of your commit Ref: #22, #34, #37 ``` +

-### Code Styling - -This repo utilizes [prettier](https://npmjs.com/package/prettier) and [eslint](https://npmjs.com/package/eslint) for formatting. Prior to a pull request being approved; ensure you lint your code with the following settings for prettier: - -```json -printWidth: 120, -tabWidth: 4, -useTabs: false, -semi: true, -singleQuote: true, -quoteProps: 'preserve', -jsxSingleQuote: true, -trailingComma: 'none', -bracketSpacing: true, -bracketSameLine: false, -arrowParens: 'always', -proseWrap: 'preserve', -htmlWhitespaceSensitivity: 'ignore', -endOfLine: 'auto', -embeddedLanguageFormatting: 'auto', -singleAttributePerLine: false +### Languages +The formatting of code greatly depends on the language being used for this repository. + +- [Python](#python) +- [Javascript/Typescript/NodeJS](#nodejs---eslint--prettier) + +
+ +#### Python +The following guidelines apply to any projects written with Python: + +
+ +##### Indentation +Use `4 spaces` per indentation level. + +
+ +> [!TIP] Correct +> ```python +> def Encrypt( key : int, bytestr : bytes ): +> res = b'' +> i_blk, left_bytes = divmod( len(bytestr), 3 ) +> ``` + +
+ +> [!CAUTION] Wrong +> ```python +> def encrypt( key : int, byteStr : bytes ): +> Res = b'' +> iBlk, leftBytes = divmod( len(byteStr), 3 ) +> ``` + +
+ +##### Line Length +Keep the maximum character count to `100 characters per line`. If you are revising old code which doesn't follow this guideline; please rewrite it to conform. + +
+ +##### Blank Lines +Surround top-level functions and class definitions with a blank in-between. + +Method definitions inside a class are surrounded by a single blank line. + +Extra blank lines may be used (sparingly) to separate groups of functions related to one another. Blank lines may be omitted between a bunch of related one-liners (e.g: set of dummy implementations). + +
+ +##### Imports +Imports should usually be on separate lines: + +
+ +> [!TIP] Correct +> ```python +> import os +> import sys +> ``` + +
+ +> [!CAUTION] Wrong +> ```python +> import sys, os +> ``` + +
+ +The following is ok to do: + +
+ +> [!TIP] Correct +> ```python +> from mypkg import siblingA, siblingB, siblingC +> ``` + +
+ +##### Commenting +Comment your code. It helps novice readers to better understand the process. It doesn't have to be painfully obvious explanations, but it helps to give an idea of what something does. + +Please append `#` to the beginning of each line. + +```python +# # +# byteString : b'1#Aetherx|232#1#233262#0#0#0#' +# # + +def Encrypt( key : int, byteString : bytes ): + res = bytearray( ) ```
-### Spaces Instead Of Tabs +
-When writing your code, set your IDE to utilize **spaces**, with a configured tab size of `4 characters`. +##### Casing +- Stick to `snake_case`; unless: + - naming functions, capitalize the first letter + - Capitalize enums +- If you see code not conforming with this, please revise it in your pull request.
-### Commenting +> [!TIP] Correct +> ```python +> def Encrypt( key : int, bytestr : bytes ): +> res = b'' +> i_blk, left_bytes = divmod( len(bytestr), 3 ) +> ``` -Comment your code. If someone else comes along, they should be able to do a quick glance and have an idea of what is going on. Plus it helps novice readers to better understand the process. +
-You may use block style commenting, or single lines: +> [!CAUTION] Wrong +> ```python +> def encrypt( key : int, byteStr : bytes ): +> Res = b'' +> iBlk, leftBytes = divmod( len(byteStr), 3 ) +> ``` + +
+ +
+ +
+ +**[`^ back to top ^`](#about)** + +
+ +
+ +--- + +
+ +#### NodeJS - ESLint & Prettier +The following allows you to configure ESLint and Prettier. + +
+ + +##### Indentation +Use `4 spaces` per indentation level. + +
+ +##### Style +For files that are not controlled by prettier or eslint; use `Allman Style`. Braces should be on their own lines, and any code inside the braces should be indented 4 spaces. + +
```javascript -/* - make platform writable -*/ +return { + status: "failure", + user: + { + id: "1aaa35aa-fb3a-62ae-ffec-a14g7fc401ac", + label: "Test String", + } +}; + +while (x == y) +{ + foo(); + bar(); +} +``` -Object.defineProperty(process, 'platform', { - value: platform, - writable: true -}); +
-afterEach(() => { - process.platform = platform; - process.env.OSTYPE = OSTYPE; -}); +##### Line Length +Keep the maximum character count to `100 characters per line`. The configs on this page have prettier automatically set up to detect more than 100 characters per line. + +
+ +##### Packages +We use the following packages for linting and prettier. + +
+ +| Package | Repo File | Description | +| --- | --- | --- | +| [typescript-eslint](https://npmjs.com/package/typescript-eslint) | [package.json](./package.json) | Tooling which enables you to use TypeScript with ESLint | +| [eslint-plugin-prettier](https://npmjs.com/package/eslint-plugin-prettier) | [package.json](./package.json) | Runs Prettier as an ESLint rule and reports differences as individual ESLint issues. | +| [@typescript-eslint/parser](https://npmjs.com/package/@typescript-eslint/parser) | [package.json](./package.json) | An ESLint parser which leverages TypeScript ESTree to allow for ESLint to lint TypeScript source code. | +| [@typescript-eslint/eslint-plugin](https://npmjs.com/package/@typescript-eslint/eslint-plugin) | [package.json](./package.json) | An ESLint plugin which provides lint rules for TypeScript codebases. | +| [@stylistic/eslint-plugin-js](https://npmjs.com/package/@stylistic/eslint-plugin-js) | [package.json](./package.json) | JavaScript stylistic rules for ESLint, migrated from eslint core. | +| [@stylistic/eslint-plugin-ts](https://npmjs.com/package/@stylistic/eslint-plugin-ts) | [package.json](./package.json) | TypeScript stylistic rules for ESLint, migrated from typescript-eslint. | +| [@stylistic/eslint-plugin-plus](https://npmjs.com/package/@stylistic/eslint-plugin-plus) | [package.json](./package.json) | Supplementary rules introduced by ESLint Stylistic. | +| [prettier](https://npmjs.com/package/prettier) | [package.json](./package.json) | Prettier is an opinionated code formatter. It enforces a consistent style by parsing your code and re-printing it with its own rules that take the maximum line length into account, wrapping code when necessary. | + +
+ +You can add the following to your `package.json` file: +```yml +"devDependencies": { + "eslint-plugin-prettier": "^5.1.3", + "typescript-eslint": "^7.14.0", + "@typescript-eslint/parser": "^7.16.0", + "@typescript-eslint/eslint-plugin": "^7.16.0", + "@stylistic/eslint-plugin-js": "^2.3.0", + "@stylistic/eslint-plugin-ts": "^2.3.0", + "@stylistic/eslint-plugin-plus": "^2.3.0", + "prettier": "^3.2.5" +}, +``` + +
+ +##### Configs +Within the root folder of the repo, there are several configuration files which you should be using within the project. These files dictate how prettier and eslint will behave and what is acceptable / not acceptable. + +
+ +Pick the config file below depending on which version of ESLint you are using. The v8 and older `.eslint` may not be there if we have migrated over to an Eslint v9 flat config file: +
+ +###### ESLint >= v9 Config +- [eslint.config.mjs](https://github.com/aetherinox/ntfy-desktop/blob/main/eslint.config.mjs) +- [eslint.config.js](https://github.com/aetherinox/ntfy-desktop/blob/main/eslint.config.js) + + https://github.com/Aetherinox/ntfy-desktop/blob/27ba6d6984aaf6c4d24a1c0b7e37fece88ada788/eslint.config.js#L1-L152 + +
+ +###### ESLint < v9 Config +- [.eslintrc](https://github.com/aetherinox/ntfy-desktop/blob/main/.eslintrc) + +
+ +###### Prettier +- [.prettierrc](https://github.com/aetherinox/ntfy-desktop/blob/main/.prettierrc) + + ```yml + printWidth: 100, + tabWidth: 4, + useTabs: false, + semi: false, + singleQuote: true, + quoteProps: 'preserve', + jsxSingleQuote: true, + trailingComma: 'none', + bracketSpacing: true, + bracketSameLine: false, + arrowParens: 'always', + proseWrap: 'preserve', + htmlWhitespaceSensitivity: 'ignore', + endOfLine: 'auto', + embeddedLanguageFormatting: 'auto', + singleAttributePerLine: false, + experimentalTernaries: false + ``` + +
+ +When submitting your pull request, these linting and style rules will be verified with all of your files. If you did not follow these rules; the linter tests on your pull request will fail; and you'll be expected to correct these issues before your submission will be transferred over for human review. + +
+ +##### Commenting +Comment your code. It helps novice readers to better understand the process. + +You may use block style commenting, or single lines: + +```javascript /* tests to decide if the end-user is running on Darwin or another platform. */ @@ -233,9 +521,9 @@ test(`Return false if platform is not Darwin`, () => {
-### Casing +##### Casing -When writing your code, ensure you stick to `camelCase` +Stick to `camelCase` ```javascript let myVar = 'one'; @@ -244,24 +532,84 @@ let secondVar = 'two';
+
+ +
+ +**[`^ back to top ^`](#about)** + +
+ +
+
+ -[npm]: https://npmjs.com -[node]: https://nodejs.org -[badge-commit]: https://img.shields.io/github/last-commit/Aetherinox/ntfy-desktop?color=b43bcc -[badge-size]: https://img.shields.io/github/repo-size/Aetherinox/ntfy-desktop?label=size&color=59702a -[test-badge]: https://img.shields.io/github/actions/workflow/status/Aetherinox/ntfy-desktop/npm-tests.yml?logo=github&label=Tests&color=%23278b30 -[build]: https://github.com/Aetherinox/ntfy-desktop/actions/workflows/npm-publish.yml?query=workflow%3Anpm-publish.yml -[coverage-badge]: https://img.shields.io/codecov/c/github/Aetherinox/xsumjs?token=MPAVASGIOG&logo=codecov&logoColor=FFFFFF&label=Coverage&color=354b9e -[coverage]: https://codecov.io/github/Aetherinox/ntfy-desktop -[version]: https://img.shields.io/npm/v/@aetherinox/ntfy-desktop -[package]: https://npmjs.com/package/@aetherinox/ntfy-desktop -[downloads-badge]: https://img.shields.io/npm/dm/ntfy-desktop.svg -[npmtrends]: http://npmtrends.com/ntfy-desktop -[license-badge]: https://img.shields.io/npm/l/ntfy-desktop.svg -[license]: https://github.com/Aetherinox/ntfy-desktop/blob/master/LICENSE -[all-contributors]: https://github.com/all-contributors/all-contributors -[all-contributors-badge]: https://img.shields.io/github/all-contributors/Aetherinox/ntfy-desktop?color=de1f6f&label=contributors -[cross-spawn]: https://www.npmjs.com/package/cross-spawn -[ts-loader]: https://www.npmjs.com/package/ts-loader -[win-bash]: https://msdn.microsoft.com/en-us/commandline/wsl/about + + + + [general-npmjs-uri]: https://npmjs.com + [general-nodejs-uri]: https://nodejs.org + [general-npmtrends-uri]: http://npmtrends.com/ntfy-desktop + + + [github-version-img]: https://img.shields.io/github/v/tag/Aetherinox/ntfy-desktop?logo=GitHub&label=Version&color=ba5225 + [github-version-uri]: https://github.com/Aetherinox/ntfy-desktop/releases + + + [npm-version-img]: https://img.shields.io/npm/v/ntfy-desktop?logo=npm&label=Version&color=ba5225 + [npm-version-uri]: https://npmjs.com/package/ntfy-desktop + + + [pypi-version-img]: https://img.shields.io/pypi/v/ntfy-desktop-plugin + [pypi-version-uri]: https://pypi.org/project/ntfy-desktop-plugin/ + + + [license-mit-img]: https://img.shields.io/badge/MIT-FFF?logo=creativecommons&logoColor=FFFFFF&label=License&color=9d29a0 + [license-mit-uri]: https://github.com/Aetherinox/ntfy-desktop/blob/main/LICENSE + + + [github-downloads-img]: https://img.shields.io/github/downloads/Aetherinox/ntfy-desktop/total?logo=github&logoColor=FFFFFF&label=Downloads&color=376892 + [github-downloads-uri]: https://github.com/Aetherinox/ntfy-desktop/releases + + + [npmjs-downloads-img]: https://img.shields.io/npm/dw/%40aetherinox%2Fmkdocs-link-embeds?logo=npm&&label=Downloads&color=376892 + [npmjs-downloads-uri]: https://npmjs.com/package/ntfy-desktop + + + [github-size-img]: https://img.shields.io/github/repo-size/Aetherinox/ntfy-desktop?logo=github&label=Size&color=59702a + [github-size-uri]: https://github.com/Aetherinox/ntfy-desktop/releases + + + [npmjs-size-img]: https://img.shields.io/npm/unpacked-size/ntfy-desktop/latest?logo=npm&label=Size&color=59702a + [npmjs-size-uri]: https://npmjs.com/package/ntfy-desktop + + + [codecov-coverage-img]: https://img.shields.io/codecov/c/github/Aetherinox/ntfy-desktop?token=MPAVASGIOG&logo=codecov&logoColor=FFFFFF&label=Coverage&color=354b9e + [codecov-coverage-uri]: https://codecov.io/github/Aetherinox/ntfy-desktop + + + [contribs-all-img]: https://img.shields.io/github/all-contributors/Aetherinox/ntfy-desktop?logo=contributorcovenant&color=de1f6f&label=contributors + [contribs-all-uri]: https://github.com/all-contributors/all-contributors + + + [github-build-img]: https://img.shields.io/github/actions/workflow/status/Aetherinox/ntfy-desktop/release.yml?logo=github&logoColor=FFFFFF&label=Build&color=%23278b30 + [github-build-uri]: https://github.com/Aetherinox/ntfy-desktop/actions/workflows/release.yml + + + [github-build-pypi-img]: https://img.shields.io/github/actions/workflow/status/Aetherinox/ntfy-desktop/release-pypi.yml?logo=github&logoColor=FFFFFF&label=Build&color=%23278b30 + [github-build-pypi-uri]: https://github.com/Aetherinox/ntfy-desktop/actions/workflows/pypi-release.yml + + + [github-tests-img]: https://img.shields.io/github/actions/workflow/status/Aetherinox/ntfy-desktop/npm-tests.yml?logo=github&label=Tests&color=2c6488 + [github-tests-uri]: https://github.com/Aetherinox/ntfy-desktop/actions/workflows/npm-tests.yml + + + [github-commit-img]: https://img.shields.io/github/last-commit/Aetherinox/ntfy-desktop?logo=conventionalcommits&logoColor=FFFFFF&label=Last%20Commit&color=313131 + [github-commit-uri]: https://github.com/Aetherinox/ntfy-desktop/commits/main/ + + + [btn-github-submit-img]: https://img.shields.io/badge/submit%20new%20issue-de1f5c?style=for-the-badge&logo=github&logoColor=FFFFFF + [btn-github-submit-uri]: https://github.com/aetherinox/ntfy-desktop/issues + +