@uva-glass/eslint-config 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.editorconfig ADDED
@@ -0,0 +1,15 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ indent_size = 2
7
+ indent_style = space
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.md]
12
+ trim_trailing_whitespace = false
13
+
14
+ [Makefile]
15
+ indent_style = tab
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="WEB_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$">
5
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
6
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
7
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
8
+ </content>
9
+ <orderEntry type="inheritedJdk" />
10
+ <orderEntry type="sourceFolder" forTests="false" />
11
+ </component>
12
+ </module>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
+ </profile>
6
+ </component>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/GLASS-eslint.iml" filepath="$PROJECT_DIR$/.idea/GLASS-eslint.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # GLASS-eslint
2
+
3
+ Eslint configuration for the Glass frontend
4
+
5
+ The default configuration contains linting rules for [javascript][1], [imports][2], [React][3] and [Typescript][4]. Optionally, configuration for [Node][5], and [testing][6] can be included.
6
+
7
+ ## Installation and usage
8
+
9
+ ### Install
10
+
11
+ > **Note**
12
+ >
13
+ > Make sure Node >= 18 is installed
14
+
15
+ ```
16
+ npm i git@github.com:uva/GLASS-eslint.git --save-dev
17
+ ```
18
+
19
+ ### Using
20
+
21
+ Create an `.eslintrc.json` file in the root of your project and add the following configuration:
22
+
23
+ #### Basic
24
+
25
+ ```json
26
+ {
27
+ "extends": ["glass"]
28
+ }
29
+ ```
30
+
31
+ This will apply Eslint rules from `@typescript-eslint/recommended`, `plugin:import/recommended`, `plugin:react/recommended`, and `plugin:react/jsx-runtime`.
32
+
33
+ #### Include rules for testing
34
+
35
+ ```json
36
+ {
37
+ "extends": ["glass", "glass/testing-library-react"]
38
+ }
39
+ ```
40
+
41
+ ### Overriding
42
+
43
+ The default set of rules is (more or less) equal to those that are available in [create-react-app][7]. The reason behind this, is that both [Lens][8] and [Prism][9] were both initially created from a create-react-app template. For an easy transition, the applicable Eslint rules were copied into this repository.
44
+
45
+ Some rules might not be too specific or limiting for your code. In those cases, the default configuration can be extended or overwritten. For instance for files that are used on the command line by Jest, but are included in the regular code base:
46
+
47
+ ```json
48
+ {
49
+ "extends": ["glass", "glass/testing-library-react"],
50
+ "overrides": [
51
+ {
52
+ "extends": ["glass/node"],
53
+ "files": ["**/__mocks__/*.js"],
54
+ "env": {
55
+ "browser": false,
56
+ "node": true
57
+ },
58
+ "rules": {
59
+ "import/no-commonjs": "off",
60
+ "import/unambiguous": "off"
61
+ }
62
+ }
63
+ ]
64
+ }
65
+ ```
66
+
67
+ [1]: ./base.js
68
+ [2]: ./import.js
69
+ [3]: ./react.js
70
+ [4]: ./typescript.js
71
+ [5]: ./node.js
72
+ [6]: ./testing-library-react.js
73
+ [7]: https://github.com/facebook/create-react-app/tree/main/packages/eslint-config-react-app
74
+ [8]: https://github.com/uva/GLASS-lens
75
+ [9]: https://github.com/uva/GLASS-prism
package/base.js ADDED
@@ -0,0 +1,87 @@
1
+ module.exports = {
2
+ extends: ["eslint:recommended"],
3
+ plugins: ["promise"],
4
+ settings: { react: { version: "detect" } },
5
+ rules: {
6
+ "array-callback-return": "warn",
7
+ "dot-location": ["warn", "property"],
8
+ eqeqeq: ["warn", "smart"],
9
+ "new-parens": "warn",
10
+ "id-length": ["warn", { exceptions: ["t", "_"] }],
11
+ "no-caller": "warn",
12
+ "no-cond-assign": ["warn", "except-parens"],
13
+ "no-const-assign": "warn",
14
+ "no-control-regex": "warn",
15
+ "no-delete-var": "warn",
16
+ "no-dupe-args": "warn",
17
+ "no-dupe-keys": "warn",
18
+ "no-duplicate-case": "warn",
19
+ "no-empty-character-class": "warn",
20
+ "no-empty-pattern": "warn",
21
+ "no-eval": "warn",
22
+ "no-ex-assign": "warn",
23
+ "no-extend-native": "warn",
24
+ "no-extra-bind": "warn",
25
+ "no-extra-label": "warn",
26
+ "no-fallthrough": "warn",
27
+ "no-func-assign": "warn",
28
+ "no-implied-eval": "warn",
29
+ "no-invalid-regexp": "warn",
30
+ "no-iterator": "warn",
31
+ "no-label-var": "warn",
32
+ "no-labels": ["warn", { allowLoop: true, allowSwitch: false }],
33
+ "no-lone-blocks": "warn",
34
+ "no-loop-func": "warn",
35
+ "no-mixed-operators": [
36
+ "warn",
37
+ {
38
+ groups: [
39
+ ["&", "|", "^", "~", "<<", ">>", ">>>"],
40
+ ["==", "!=", "===", "!==", ">", ">=", "<", "<="],
41
+ ["&&", "||"],
42
+ ["in", "instanceof"],
43
+ ],
44
+ allowSamePrecedence: false,
45
+ },
46
+ ],
47
+ "no-multi-str": "warn",
48
+ "no-global-assign": "warn",
49
+ "no-unsafe-negation": "warn",
50
+ "no-new-func": "warn",
51
+ "no-new-object": "warn",
52
+ "no-new-symbol": "warn",
53
+ "no-new-wrappers": "warn",
54
+ "no-obj-calls": "warn",
55
+ "no-octal": "warn",
56
+ "no-octal-escape": "warn",
57
+ "no-regex-spaces": "warn",
58
+ "no-restricted-syntax": ["warn", "WithStatement"],
59
+ "no-script-url": "warn",
60
+ "no-self-assign": "warn",
61
+ "no-self-compare": "warn",
62
+ "no-sequences": "warn",
63
+ "no-shadow-restricted-names": "warn",
64
+ "no-sparse-arrays": "warn",
65
+ "no-template-curly-in-string": "warn",
66
+ "no-this-before-super": "warn",
67
+ "no-throw-literal": "warn",
68
+ "no-useless-computed-key": "warn",
69
+ "no-useless-concat": "warn",
70
+ "no-useless-escape": "warn",
71
+ "no-useless-rename": [
72
+ "warn",
73
+ {
74
+ ignoreDestructuring: false,
75
+ ignoreImport: false,
76
+ ignoreExport: false,
77
+ },
78
+ ],
79
+
80
+ "no-with": "warn",
81
+ "no-whitespace-before-property": "warn",
82
+ "require-yield": "warn",
83
+ "rest-spread-spacing": ["warn", "never"],
84
+ "no-lonely-if": "warn",
85
+ "no-implicit-coercion": "warn",
86
+ },
87
+ };
package/import.js ADDED
@@ -0,0 +1,57 @@
1
+ /** @type {import('eslint').ESLint} */
2
+ module.exports = {
3
+ extends: ["plugin:import/recommended"],
4
+ plugins: ["import", "no-relative-import-paths"],
5
+ rules: {
6
+ "no-relative-import-paths/no-relative-import-paths": [
7
+ "warn",
8
+ { allowSameFolder: true, rootDir: "src" },
9
+ ],
10
+
11
+ // enabled rules
12
+ "import/no-anonymous-default-export": "error",
13
+ "import/no-commonjs": "error",
14
+ "import/no-webpack-loader-syntax": "error",
15
+ "import/unambiguous": "error",
16
+ "import/no-default-export": "error",
17
+ "import/first": "error",
18
+ "import/namespace": ["error", { allowComputed: true }],
19
+ "import/no-unassigned-import": ["error", { allow: ["**/*.css"] }],
20
+ "import/no-named-as-default": "error",
21
+ "import/prefer-default-export": "off",
22
+ "import/extensions": "error",
23
+ "import/first": "error",
24
+ "import/no-absolute-path": "error",
25
+ "import/no-amd": "error",
26
+ "import/no-cycle": "error",
27
+ "import/no-deprecated": "error",
28
+ "import/no-mutable-exports": "error",
29
+ "import/no-named-default": "error",
30
+ "import/no-nodejs-modules": "error",
31
+ "import/no-restricted-paths": "error",
32
+ "import/no-self-import": "error",
33
+ "import/no-unresolved": ["error", { commonjs: true }],
34
+ "import/no-unused-modules": "error",
35
+ "import/no-useless-path-segments": "error",
36
+ "import/order": [
37
+ "error",
38
+ {
39
+ groups: [
40
+ ["builtin", "external"],
41
+ "type",
42
+ ["parent", "sibling"],
43
+ "index",
44
+ ],
45
+ "newlines-between": "always",
46
+ },
47
+ ],
48
+ },
49
+ settings: {
50
+ "import/resolver": {
51
+ node: {
52
+ extensions: [".ts", ".tsx", ".js", ".jsx"],
53
+ moduleDirectory: ["node_modules", "./src"],
54
+ },
55
+ },
56
+ },
57
+ };
package/index.js ADDED
@@ -0,0 +1,12 @@
1
+ module.exports = {
2
+ extends: ["./base", "./import", "./react", "./typescript"],
3
+ // configs: {
4
+ // base: require("./base"),
5
+ // import: require("./import"),
6
+ // node: require("./node"),
7
+ // react: require("./react"),
8
+ // "testing-library-react": require("./testing-library-react"),
9
+ // typescript: require("./typescript"),
10
+ // },
11
+ // rules: {},
12
+ };
package/node.js ADDED
@@ -0,0 +1,21 @@
1
+ module.exports = {
2
+ extends: ["eslint:recommended", "plugin:node/recommended"],
3
+ parserOptions: { ecmaVersion: 2020 },
4
+ rules: {
5
+ "node/exports-style": ["error", "module.exports"],
6
+ "node/file-extension-in-import": ["error", "always"],
7
+ "node/prefer-global/buffer": ["error", "always"],
8
+ "node/prefer-global/console": ["error", "always"],
9
+ "node/prefer-global/process": ["error", "always"],
10
+ "node/prefer-global/url-search-params": ["error", "always"],
11
+ "node/prefer-global/url": ["error", "always"],
12
+ "node/prefer-promises/dns": "error",
13
+ "node/prefer-promises/fs": "error",
14
+ "node/no-unsupported-features/es-builtins": [
15
+ "error",
16
+ {
17
+ version: ">=18",
18
+ },
19
+ ],
20
+ },
21
+ };
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@uva-glass/eslint-config",
3
+ "version": "1.0.2",
4
+ "engines": {
5
+ "node": ">=18"
6
+ },
7
+ "private": false,
8
+ "description": "GLASS eslint configuration",
9
+ "main": "index.js",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/uva/GLASS-eslint.git"
13
+ },
14
+ "author": "",
15
+ "license": "ISC",
16
+ "bugs": {
17
+ "url": "https://github.com/uva/GLASS-eslint/issues"
18
+ },
19
+ "homepage": "https://github.com/uva/GLASS-eslint#readme",
20
+ "devDependencies": {
21
+ "@typescript-eslint/eslint-plugin": "^5.48.2",
22
+ "@typescript-eslint/parser": "^5.48.2"
23
+ },
24
+ "dependencies": {
25
+ "eslint-import-resolver-typescript": "^3.5.3",
26
+ "eslint-plugin-import": "^2.27.5",
27
+ "eslint-plugin-jest": "^27.2.1",
28
+ "eslint-plugin-jsx-a11y": "^6.7.1",
29
+ "eslint-plugin-no-relative-import-paths": "^1.5.2",
30
+ "eslint-plugin-node": "^11.1.0",
31
+ "eslint-plugin-promise": "^6.1.1",
32
+ "eslint-plugin-react": "^7.32.1",
33
+ "eslint-plugin-react-hooks": "^4.6.0",
34
+ "eslint-plugin-testing-library": "^5.9.1"
35
+ },
36
+ "peerDependencies": {
37
+ "eslint": "^8"
38
+ },
39
+ "scripts": {
40
+ "test": "echo \"Error: no test specified\" && exit 1"
41
+ }
42
+ }
package/react.js ADDED
@@ -0,0 +1,81 @@
1
+ module.exports = {
2
+ extends: ["plugin:react/recommended", "plugin:react/jsx-runtime"],
3
+ plugins: ["jsx-a11y", "react", "react-hooks"],
4
+ env: { browser: true },
5
+ settings: { react: { version: "detect" } },
6
+ parserOptions: { ecmaVersion: 2020, sourceType: "module" },
7
+ rules: {
8
+ "react/display-name": "off",
9
+ "react/button-has-type": "off",
10
+
11
+ // jsx-a11y
12
+ "jsx-a11y/alt-text": "error",
13
+ "jsx-a11y/anchor-has-content": "error",
14
+ "jsx-a11y/anchor-is-valid": [
15
+ "error",
16
+ { aspects: ["noHref", "invalidHref"] },
17
+ ],
18
+ "jsx-a11y/aria-activedescendant-has-tabindex": "error",
19
+ "jsx-a11y/aria-props": "error",
20
+ "jsx-a11y/aria-proptypes": "error",
21
+ "jsx-a11y/aria-role": ["error", { ignoreNonDOM: true }],
22
+ "jsx-a11y/aria-unsupported-elements": "error",
23
+ "jsx-a11y/autocomplete-valid": "error",
24
+ "jsx-a11y/click-events-have-key-events": "error",
25
+ "jsx-a11y/heading-has-content": "error",
26
+ "jsx-a11y/html-has-lang": "error",
27
+ "jsx-a11y/iframe-has-title": "error",
28
+ "jsx-a11y/img-redundant-alt": "error",
29
+ "jsx-a11y/interactive-supports-focus": "error",
30
+ "jsx-a11y/label-has-associated-control": [
31
+ "error",
32
+ { controlComponents: ["Input"] },
33
+ ],
34
+ "jsx-a11y/lang": "error",
35
+ "jsx-a11y/media-has-caption": "error",
36
+ "jsx-a11y/mouse-events-have-key-events": "error",
37
+ "jsx-a11y/no-access-key": "error",
38
+ "jsx-a11y/no-distracting-elements": "error",
39
+ "jsx-a11y/no-interactive-element-to-noninteractive-role": "error",
40
+ "jsx-a11y/no-noninteractive-element-interactions": "error",
41
+ "jsx-a11y/no-noninteractive-element-to-interactive-role": "error",
42
+ "jsx-a11y/no-noninteractive-tabindex": "error",
43
+ "jsx-a11y/no-redundant-roles": "error",
44
+ "jsx-a11y/no-static-element-interactions": "error",
45
+ "jsx-a11y/role-has-required-aria-props": "error",
46
+ "jsx-a11y/role-supports-aria-props": "error",
47
+ "jsx-a11y/scope": "error",
48
+ "jsx-a11y/tabindex-no-positive": "error",
49
+
50
+ // react-hooks
51
+ "react-hooks/exhaustive-deps": "error",
52
+ "react-hooks/rules-of-hooks": "error",
53
+
54
+ // rules
55
+ "react/boolean-prop-naming": "error",
56
+ "react/forbid-foreign-prop-types": ["error", { allowInPropTypes: true }],
57
+ "react/jsx-closing-bracket-location": ["error", "tag-aligned"],
58
+ "react/jsx-curly-spacing": "error",
59
+ "react/jsx-first-prop-new-line": ["error", "multiline-multiprop"],
60
+ "react/jsx-fragments": ["error", "syntax"],
61
+ "react/jsx-key": "error",
62
+ "react/jsx-no-comment-textnodes": "error",
63
+ "react/jsx-no-duplicate-props": "error",
64
+ "react/jsx-no-undef": "error",
65
+ "react/jsx-no-useless-fragment": "error",
66
+ "react/jsx-pascal-case": ["error", { allowAllCaps: true, ignore: [] }],
67
+ "react/jsx-tag-spacing": "error",
68
+ "react/jsx-uses-react": "error",
69
+ "react/jsx-uses-vars": "error",
70
+ "react/no-danger-with-children": "error",
71
+ "react/no-deprecated": "error",
72
+ "react/no-did-mount-set-state": "error",
73
+ "react/no-direct-mutation-state": "error",
74
+ "react/no-is-mounted": "error",
75
+ "react/no-typos": "error",
76
+ "react/prop-types": "error",
77
+ "react/require-optimization": "error",
78
+ "react/require-render-return": "error",
79
+ "react/style-prop-object": "error",
80
+ },
81
+ };
package/renovate.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "config:base"
5
+ ]
6
+ }
@@ -0,0 +1,66 @@
1
+ module.exports = {
2
+ extends: ["plugin:testing-library/react"],
3
+ plugins: ["jest", "testing-library"],
4
+ overrides: [
5
+ {
6
+ files: ["**/*.test.ts", "**/*.test.tsx"],
7
+ extends: ["plugin:jest/recommended"],
8
+ env: {
9
+ "jest/globals": true,
10
+ },
11
+ rules: {
12
+ // base overrides
13
+ "max-nested-callbacks": "off",
14
+ "no-constructor-return": "off",
15
+ "no-undef": "off",
16
+ "promise/always-return": "off",
17
+ "promise/avoid-new": "off",
18
+ "promise/catch-or-return": "off",
19
+ "promise/no-callback-in-promise": "off",
20
+
21
+ // rules
22
+ "max-len": "off",
23
+ "no-empty-function": "warn",
24
+ "require-await": "warn",
25
+ "import/no-unassigned-import": "off",
26
+ "class-methods-use-this": "off",
27
+
28
+ "jest/no-conditional-expect": "error",
29
+ "jest/no-identical-title": "error",
30
+ "jest/no-interpolation-in-snapshots": "error",
31
+ "jest/no-jasmine-globals": "error",
32
+ "jest/no-mocks-import": "error",
33
+ "jest/valid-describe-callback": "error",
34
+ "jest/valid-expect": "error",
35
+ "jest/valid-expect-in-promise": "error",
36
+ "jest/valid-title": "warn",
37
+ "jest/no-hooks": [
38
+ "error",
39
+ {
40
+ allow: ["beforeAll", "beforeEach", "afterAll", "afterEach"],
41
+ },
42
+ ],
43
+
44
+ "testing-library/await-async-query": "error",
45
+ "testing-library/await-async-utils": "error",
46
+ "testing-library/no-await-sync-query": "error",
47
+ "testing-library/no-container": "error",
48
+ "testing-library/no-debugging-utils": "error",
49
+ "testing-library/no-dom-import": ["error", "react"],
50
+ "testing-library/no-node-access": "error",
51
+ "testing-library/no-promise-in-fire-event": "error",
52
+ "testing-library/no-render-in-setup": "error",
53
+ "testing-library/no-unnecessary-act": "error",
54
+ "testing-library/no-wait-for-empty-callback": "error",
55
+ "testing-library/no-wait-for-multiple-assertions": "error",
56
+ "testing-library/no-wait-for-side-effects": "error",
57
+ "testing-library/no-wait-for-snapshot": "error",
58
+ "testing-library/prefer-find-by": "warn",
59
+ "testing-library/prefer-presence-queries": "error",
60
+ "testing-library/prefer-query-by-disappearance": "error",
61
+ "testing-library/prefer-screen-queries": "error",
62
+ "testing-library/render-result-naming-convention": "error",
63
+ },
64
+ },
65
+ ],
66
+ };
package/typescript.js ADDED
@@ -0,0 +1,96 @@
1
+ module.exports = {
2
+ parser: "@typescript-eslint/parser",
3
+ overrides: [
4
+ {
5
+ files: ["**/*.ts", "**/*.tsx"],
6
+ plugins: ["@typescript-eslint"],
7
+ extends: ["plugin:@typescript-eslint/recommended"],
8
+ parserOptions: {
9
+ project: "./tsconfig.json",
10
+ },
11
+ rules: {
12
+ // disabled
13
+ "@typescript-eslint/typedef": "off",
14
+ "@typescript-eslint/brace-style": "off",
15
+ "@typescript-eslint/lines-between-class-members": "off",
16
+ "@typescript-eslint/comma-dangle": "off",
17
+ "@typescript-eslint/object-curly-spacing": "off",
18
+ "@typescript-eslint/prefer-readonly-parameter-types": "off",
19
+ "@typescript-eslint/restrict-template-expressions": "off",
20
+ "@typescript-eslint/explicit-function-return-type": "off",
21
+ "@typescript-eslint/no-extra-parens": "off",
22
+ "@typescript-eslint/no-type-alias": "off",
23
+ "@typescript-eslint/indent": "off",
24
+
25
+ // requires strictNullChecks compiler option
26
+ "@typescript-eslint/no-unnecessary-condition": "off",
27
+ "@typescript-eslint/strict-boolean-expressions": "off",
28
+ "@typescript-eslint/explicit-module-boundary-types": "off",
29
+
30
+ "@typescript-eslint/quotes": ["error", "single", { avoidEscape: true }],
31
+ "@typescript-eslint/no-unnecessary-type-assertion": "error",
32
+ "@typescript-eslint/consistent-type-assertions": "warn",
33
+ "@typescript-eslint/no-array-constructor": "warn",
34
+ "@typescript-eslint/no-redeclare": "warn",
35
+ "@typescript-eslint/no-use-before-define": [
36
+ "warn",
37
+ {
38
+ functions: false,
39
+ classes: false,
40
+ variables: false,
41
+ typedefs: false,
42
+ },
43
+ ],
44
+ "@typescript-eslint/no-unused-expressions": [
45
+ "error",
46
+ {
47
+ allowShortCircuit: true,
48
+ allowTernary: true,
49
+ allowTaggedTemplates: true,
50
+ },
51
+ ],
52
+ "@typescript-eslint/no-unused-vars": [
53
+ "warn",
54
+ {
55
+ args: "none",
56
+ ignoreRestSiblings: true,
57
+ },
58
+ ],
59
+ "@typescript-eslint/no-magic-numbers": [
60
+ "warn",
61
+ {
62
+ ignore: [0],
63
+ ignoreArrayIndexes: true,
64
+ ignoreEnums: true,
65
+ ignoreNumericLiteralTypes: true,
66
+ ignoreTypeIndexes: true,
67
+ },
68
+ ],
69
+ "@typescript-eslint/no-useless-constructor": "warn",
70
+ "@typescript-eslint/consistent-type-imports": "error",
71
+ "@typescript-eslint/consistent-type-assertions": "warn",
72
+ "@typescript-eslint/no-array-constructor": "warn",
73
+ "@typescript-eslint/dot-notation": "warn",
74
+
75
+ // disable for tests
76
+ "@typescript-eslint/init-declarations": "off",
77
+ "@typescript-eslint/semi": ["error", "always"],
78
+
79
+ // extensions (superseded by typescript rules)
80
+ "init-declarations": "off",
81
+ "no-use-before-define": "off",
82
+ "no-useless-constructor": "off",
83
+ "no-unused-vars": "off",
84
+ "no-unused-expressions": "off",
85
+ "no-use-before-define": "off",
86
+ "no-redeclare": "off",
87
+ "no-undef": "off",
88
+ "no-array-constructor": "off",
89
+ "no-magic-numbers": "off",
90
+ "space-before-function-paren": "off",
91
+ "dot-notation": "off",
92
+ },
93
+ },
94
+ ],
95
+ rules: {},
96
+ };