diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..16f3fce4e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +root = true + +[*] +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..83448f7c2 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +*.template.js +plugins/* +themes/* diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..9fb9f465e --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,248 @@ +{ + "root": true, + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint", "react"], + "globals": { + "powercord": true, + "webpackChunkdiscord_app": true, + "DiscordNative": false, + "PowercordNative": false, + "GLOBAL_ENV": true, + "BigInt": false + }, + "parserOptions": { + "ecmaVersion": 2021, + "sourceType": "script", + "ecmaFeatures": { + "jsx": true + }, + "project": ["./tsconfig.json"] + }, + "env": { + "node": true, + "es6": true, + "browser": true + }, + "rules": { + "for-direction": [ "error" ], + "getter-return": [ "error" ], + "no-compare-neg-zero": [ "error" ], + "no-cond-assign": [ "error" ], + "no-constant-condition": [ "error" ], + "no-control-regex": [ "error" ], + "no-debugger": [ "error" ], + "no-dupe-args": [ "error" ], + "no-dupe-keys": [ "error" ], + "no-duplicate-case": [ "error" ], + "no-empty": [ "error", { + "allowEmptyCatch": true + }], + "no-empty-character-class": [ "error" ], + "no-extra-boolean-cast": [ "error" ], + "@typescript-eslint/no-extra-semi": [ "error" ], + "no-func-assign": [ "error" ], + "no-invalid-regexp": [ "error" ], + "no-irregular-whitespace": [ "error", { + "skipStrings": true, + "skipRegExps": true + }], + "no-obj-calls": [ "error" ], + "no-regex-spaces": [ "error" ], + "no-sparse-arrays": [ "error" ], + "no-template-curly-in-string": [ "error" ], + "no-unexpected-multiline": [ "error" ], + "no-unreachable": [ "error" ], + "no-unsafe-negation": [ "error" ], + "use-isnan": [ "error" ], + "valid-typeof": [ "error", { + "requireStringLiterals": true + }], + "accessor-pairs": [ "error" ], + "array-callback-return": [ "error", { + "allowImplicit": true + }], + "curly": [ "error", "all" ], + "dot-location": [ "error", "property" ], + "@typescript-eslint/dot-notation": [ "error" ], + "eqeqeq": [ "error", "always" ], + "no-caller": [ "error" ], + "no-case-declarations": [ "error" ], + "no-else-return": [ "error", { + "allowElseIf": true + }], + "@typescript-eslint/no-empty-function": [ "error" ], + "no-empty-pattern": [ "error" ], + "no-eq-null": [ "error" ], + "no-eval": [ "error" ], + "no-extend-native": [ "error" ], + "no-extra-bind": [ "error" ], + "no-extra-label": [ "error" ], + "no-fallthrough": [ "error" ], + "no-floating-decimal": [ "error" ], + "no-global-assign": [ "error" ], + "no-lone-blocks": [ "error" ], + "no-multi-spaces": [ "error", { + "exceptions": { + "Property": true, + "BinaryExpression": false, + "VariableDeclarator": true + } + }], + "no-multi-str": [ "error" ], + "no-new-func": [ "error" ], + "no-new-wrappers": [ "error" ], + "no-octal": [ "error" ], + "no-octal-escape": [ "error" ], + "@typescript-eslint/no-redeclare": [ "error", { + "builtinGlobals": true + }], + "no-return-await": [ "error" ], + "no-self-assign": [ "error", { + "props": true + }], + "no-self-compare": [ "error" ], + "no-sequences": [ "error" ], + "no-unmodified-loop-condition": [ "error" ], + "@typescript-eslint/no-unused-expressions": [ "error" ], + "no-unused-labels": [ "error" ], + "no-useless-call": [ "error" ], + "no-useless-concat": [ "error" ], + "no-useless-escape": [ "error" ], + "no-useless-return": [ "error" ], + "no-warning-comments": [ "warn" ], + "no-with": [ "error" ], + "prefer-promise-reject-errors": ["error", { + "allowEmptyReject": true + }], + "radix": [ "error", "as-needed" ], + "wrap-iife": [ "error" ], + "yoda": [ "error" ], + "no-delete-var": [ "error" ], + "no-shadow-restricted-names": [ "error" ], + "no-undef": [ "error" ], + "no-undef-init": [ "error" ], + "no-undefined": [ "error" ], + "@typescript-eslint/no-unused-vars": [ "error" ], + "@typescript-eslint/no-use-before-define": [ "error" ], + "callback-return": [ "error" ], + "handle-callback-err": [ "error" ], + "no-buffer-constructor": [ "error" ], + "no-mixed-requires": [ "error" ], + "array-bracket-newline": [ "error", "consistent" ], + "array-bracket-spacing": [ "error", "always" ], + "block-spacing": [ "error", "always" ], + "@typescript-eslint/brace-style": [ "error", "1tbs" ], + "@typescript-eslint/comma-dangle": [ "error" ], + "@typescript-eslint/comma-spacing": [ "error", { + "before": false, + "after": true + }], + "comma-style": [ "error" ], + "computed-property-spacing": [ "error" ], + "consistent-this": [ "error", "_this" ], + "eol-last": [ "error", "always" ], + "@typescript-eslint/func-call-spacing": [ "error", "never" ], + "func-name-matching": [ "error", "always" ], + "@typescript-eslint/indent": [ "error", 2, { + "SwitchCase": 1 + }], + "@typescript-eslint/keyword-spacing": [ "error" ], + "@typescript-eslint/lines-between-class-members": [ "error", "always", { + "exceptAfterSingleLine": true + }], + "max-statements-per-line": [ "error", { + "max": 2 + }], + // "multiline-comment-style": [ "error" ], + "multiline-ternary": [ "error", "always-multiline" ], + "new-cap": [ "error", { + "newIsCap": true + }], + "new-parens": [ "error" ], + "@typescript-eslint/no-array-constructor": [ "error" ], + "no-mixed-operators": [ "error" ], + "no-mixed-spaces-and-tabs": [ "error" ], + "no-multiple-empty-lines": [ "error" ], + "no-new-object": [ "error" ], + "no-tabs": [ "error" ], + "no-trailing-spaces": [ "error" ], + "no-unneeded-ternary": [ "error" ], + "no-whitespace-before-property": [ "error" ], + "@typescript-eslint/object-curly-spacing": [ "error", "always" ], + "object-property-newline": [ "error" ], + "one-var-declaration-per-line": [ "error", "initializations" ], + "operator-assignment": [ "error", "always" ], + "operator-linebreak": [ "error", "after", { + "overrides": { + "?": "before", + ":": "before" + } + }], + "padded-blocks": [ "error", "never" ], + "quote-props": [ "error", "as-needed" ], + "@typescript-eslint/quotes": [ "error", "single" ], + "@typescript-eslint/semi": [ "error", "always" ], + "semi-spacing": [ "error", { + "before": false, + "after": true + }], + "semi-style": [ "error", "last" ], + "@typescript-eslint/space-before-blocks": [ "error", "always" ], + "@typescript-eslint/space-before-function-paren": [ "error", "always" ], + "space-in-parens": [ "error", "never" ], + "@typescript-eslint/space-infix-ops": [ "error" ], + "space-unary-ops": [ "error", { + "words": true, + "nonwords": false + }], + "spaced-comment": [ "error", "always" ], + "switch-colon-spacing": [ "error", { + "before": false, + "after": true + }], + "template-tag-spacing": [ "error", "always" ], + "wrap-regex": [ "error" ], + "arrow-body-style": [ "error", "as-needed" ], + "arrow-spacing": [ "error", { + "before": true, + "after": true + }], + "constructor-super": [ "error" ], + "no-class-assign": [ "error" ], + "no-const-assign": [ "error" ], + "@typescript-eslint/no-dupe-class-members": [ "error" ], + "no-new-symbol": [ "error" ], + "no-this-before-super": [ "error" ], + "no-useless-computed-key": [ "error" ], + "@typescript-eslint/no-useless-constructor": [ "error" ], + "no-var": [ "error" ], + "object-shorthand": [ "error", "always" ], + "prefer-arrow-callback": [ "error" ], + "prefer-const": [ "error", { + "destructuring": "all" + }], + "prefer-destructuring": ["error", { + "VariableDeclarator": { + "array": false, + "object": true + }, + "AssignmentExpression": { + "array": true, + "object": true + } + }, { + "enforceForRenamedProperties": false + }], + "prefer-numeric-literals": [ "error" ], + "prefer-rest-params": [ "error" ], + "prefer-spread": [ "error" ], + "prefer-template": [ "error" ], + "rest-spread-spacing": [ "error", "never" ], + "symbol-description": [ "error" ], + "template-curly-spacing": [ "error", "never" ], + "react/jsx-uses-react": "error", + "react/jsx-uses-vars": 1, + "linebreak-style": ["error", "unix"] + } +} diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..e18780657 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug Report +about: Create a report to help us improve +title: 'short description of bug' +labels: 'bug' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Desktop (please complete the following information):** + - OS: [e.g. Windows] + - Replugged version: [You can find it in the Updater tab, available in your settings] + +**Additional context** + - [ ] I checked if Discord and/or Replugged are up to date + - [ ] I made sure this is not related to an external plugin or a theme + +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..e10528c23 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,4 @@ +contact_links: + - name: Support Server + url: https://discord.gg/B2TcnXV9Rg + about: If you need help with Replugged, join our support server and ask in the appropriated channel. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..aa49fd430 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +--- +name: Feature Request +about: Create a feature request +title: '[Feature Request]' +labels: 'enhancement' +assignees: '' + +--- + +**Describe the feature request** +A clear and concise description of what the feature is. + +**What Plugin would it be for?** +Name of plugin if applicable + +**Expected behavior** +A clear and concise description of what you expected to happen. diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml new file mode 100644 index 000000000..ab36281f3 --- /dev/null +++ b/.github/workflows/eslint.yml @@ -0,0 +1,29 @@ +name: Lint + +on: + push: + branches: + - '*' + pull_request: + branches: + - '*' + +jobs: + run-linters: + name: Run linters + runs-on: ubuntu-latest + + steps: + - name: Check out Git repository + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v1 + with: + node-version: 12 + + - name: Install Node.js dependencies + run: npm ci + + - name: Run linters + run: npm run lint diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml new file mode 100644 index 000000000..6205c9ebe --- /dev/null +++ b/.github/workflows/nix.yml @@ -0,0 +1,24 @@ +name: Build the Nix flake +on: + push: + paths: + - "flake.*" + +jobs: + build: + name: Build the Nix flake + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Install Nix + uses: cachix/install-nix-action@v15 + with: + nix_path: nixpkgs=channel:nixos-unstable + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + + - name: Build the flake + run: nix build + - name: Check the flake + run: nix flake check diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..7b5f512b3 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "EditorConfig.EditorConfig" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..47b7dd10c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.defaultFormatter": "dbaeumer.vscode-eslint", + "editor.formatOnSave": true, +} diff --git a/package.json b/package.json index 0f9fdf654..e2413e6c9 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,9 @@ "scripts": { "build": "parcel build", "watch": "parcel watch", - "check": "tsc --noEmit" + "check": "tsc --noEmit", + "lint": "eslint --ext js --ext ts --ext jsx --ext tsx .", + "format": "npm run lint -- --fix" }, "repository": "https://github.com/replugged-org/replugged.git", "author": "Replugged", @@ -16,7 +18,11 @@ }, "devDependencies": { "@types/node": "^18.7.23", + "@typescript-eslint/eslint-plugin": "^5.38.1", + "@typescript-eslint/parser": "^5.38.1", "electron": "13", + "eslint": "^8.24.0", + "eslint-plugin-react": "^7.31.8", "parcel": "^2.7.0", "typescript": "^4.8.4" },