eslint-config-isaacscript 1.0.68 → 1.0.71

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/.cspell.json CHANGED
@@ -1,24 +1,14 @@
1
1
  {
2
- "version": "0.1",
3
- "language": "en",
4
- "dictionaries": [
5
- "en_US"
6
- ],
2
+ "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json",
3
+ "version": "0.2",
7
4
  "words": [
8
5
  "backticks",
9
- "chdir",
10
- "config",
11
- "deno",
12
- "eqeqeq",
13
- "eslint",
14
6
  "isaacscript",
15
7
  "plusplus",
16
8
  "sarisia",
17
9
  "technote",
18
- "turnbull",
19
- "unexported",
10
+ "Turnbull",
20
11
  "unfixable",
21
- "winpty",
22
- "zamiell"
12
+ "Zamiell"
23
13
  ]
24
- }
14
+ }
package/.eslintrc.js CHANGED
@@ -1,4 +1,4 @@
1
- // This is a shared configuration file for ESLint
1
+ // This is a shared configuration file for ESLint:
2
2
  // https://eslint.org/docs/user-guide/configuring
3
3
  module.exports = {
4
4
  plugins: ["prettier"],
@@ -12,8 +12,7 @@ jobs:
12
12
  - name: Setup Node.js
13
13
  uses: actions/setup-node@v2
14
14
  with:
15
- # The default version is 14
16
- # The ESLint config requires Node 16 to work properly
15
+ # The default version is 14. The ESLint config requires Node 16 to work properly.
17
16
  node-version: '16'
18
17
 
19
18
  - name: Retrieve the cached "node_modules" directory (if present)
@@ -33,7 +32,7 @@ jobs:
33
32
  discord:
34
33
  name: Discord Failure Notification
35
34
  needs: [lint]
36
- if: always() # This is needed to always run this job, even if the other jobs fail
35
+ if: always() # This is needed to always run this job, even if the other jobs fail.
37
36
  runs-on: ubuntu-latest
38
37
  steps:
39
38
  - uses: technote-space/workflow-conclusion-action@v2
package/.prettierrc.js CHANGED
@@ -1,10 +1,9 @@
1
- // This is the configuration file for Prettier, the auto-formatter
1
+ // This is the configuration file for Prettier, the auto-formatter:
2
2
  // https://prettier.io/docs/en/configuration.html
3
3
  module.exports = {
4
4
  // https://prettier.io/docs/en/options.html#trailing-commas
5
5
  // The default is "es5" - Trailing commas where valid in ES5 (objects, arrays, etc.)
6
- // However, always having trailing commas is objectively better
7
- // The Airbnb style guide agrees:
6
+ // However, always having trailing commas is objectively better. The Airbnb style guide agrees:
8
7
  // https://github.com/airbnb/javascript#commas--dangling
9
8
  // Prettier itself also acknowledges Nik Graf's blog in their official blog:
10
9
  // https://prettier.io/blog/2020/03/21/2.0.0.html#change-default-value-for-trailingcomma-to-es5-6963httpsgithubcomprettierprettierpull6963-by-fiskerhttpsgithubcomfisker
@@ -1,5 +1,5 @@
1
1
  // These are Visual Studio Code extensions that are intended to be used with this particular
2
- // repository
2
+ // repository:
3
3
  // https://go.microsoft.com/fwlink/?LinkId=827846
4
4
  {
5
5
  "recommendations": [
@@ -1,30 +1,30 @@
1
- // These are Visual Studio Code settings that should apply to this particular repository
1
+ // These are Visual Studio Code settings that should apply to this particular repository.
2
2
  {
3
3
  // ----------------
4
4
  // Vanilla settings
5
5
  // ----------------
6
6
 
7
- // This matches the Airbnb JavaScript style guide
7
+ // This matches the Airbnb JavaScript style guide.
8
8
  "editor.rulers": [100],
9
9
  "editor.tabSize": 2,
10
10
 
11
- // Linux line endings are used in this project
11
+ // Linux line endings are used in this project.
12
12
  "files.eol": "\n",
13
13
 
14
- // Automatically removing all trailing whitespace when saving a file
14
+ // Automatically removing all trailing whitespace when saving a file.
15
15
  "files.trimTrailingWhitespace": true,
16
16
 
17
17
  // ----------
18
18
  // JavaScript
19
19
  // ----------
20
20
 
21
- // Automatically run the formatter when a JavaScript file is saved
21
+ // Automatically run the formatter when certain files are saved.
22
22
  "[javascript]": {
23
+ "editor.codeActionsOnSave": [
24
+ "source.fixAll.eslint",
25
+ ],
23
26
  "editor.defaultFormatter": "esbenp.prettier-vscode",
24
27
  "editor.formatOnSave": true,
25
- "editor.codeActionsOnSave": {
26
- "source.fixAll.eslint": true,
27
- },
28
28
  "editor.tabSize": 2,
29
29
  },
30
30
  }
package/base.js CHANGED
@@ -1,127 +1,174 @@
1
- // This is a shared configuration file for ESLint
1
+ // This is a shared configuration file for ESLint:
2
2
  // https://eslint.org/docs/user-guide/configuring
3
3
  module.exports = {
4
4
  extends: [
5
- // The linter base is the Airbnb style guide,
6
- // which is the most popular JavaScript style guide in the world:
7
- // https://github.com/airbnb/javascript
8
- // The actual ESLint config is located here:
9
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules
10
- // The TypeScript config extends it:
11
- // https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js
12
- // This includes the "parser" declaration of "@typescript-eslint/parser"
5
+ /**
6
+ * The linter base is the Airbnb style guide, which is the most popular JavaScript style guide
7
+ * in the world: https://github.com/airbnb/javascript
8
+ *
9
+ * The actual ESLint config is located here:
10
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules
11
+ */
13
12
  "airbnb-base",
13
+
14
+ /**
15
+ * The TypeScript config extends it:
16
+ * https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js
17
+ * (This includes the "parser" declaration of "@typescript-eslint/parser".)
18
+ */
14
19
  "airbnb-typescript/base",
15
20
 
16
- // We extend the Airbnb rules with the "recommended" and "recommended-requiring-type-checking"
17
- // rules from the "typescript-eslint" plugin, which is also recommended by Matt Turnbull,
18
- // the author of "airbnb-typescript/base"
19
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/README.md#recommended
20
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/recommended.ts
21
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/recommended-requiring-type-checking.ts
21
+ /**
22
+ * We extend the Airbnb rules with the "recommended" and "recommended-requiring-type-checking"
23
+ * rules from the "typescript-eslint" plugin, which is also recommended by Matt Turnbull, the
24
+ * author of "airbnb-typescript/base":
25
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/README.md#recommended
26
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/recommended.ts
27
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/recommended-requiring-type-checking.ts
28
+ */
22
29
  "plugin:@typescript-eslint/recommended",
23
30
  "plugin:@typescript-eslint/recommended-requiring-type-checking",
24
31
 
25
- // This provides extra miscellaneous rules to keep code safe
32
+ /**
33
+ * This provides extra miscellaneous rules to keep code safe:
34
+ * https://github.com/IsaacScript/eslint-plugin-isaacscript
35
+ */
26
36
  "plugin:isaacscript/recommended",
27
37
 
28
- // Find unused "eslint-disable" comments
29
- // https://github.com/mysticatea/eslint-plugin-eslint-comments
38
+ /**
39
+ * Find unused "eslint-disable" comments:
40
+ * https://github.com/mysticatea/eslint-plugin-eslint-comments
41
+ */
30
42
  "plugin:eslint-comments/recommended",
31
43
 
32
- // This provides rules to lint JSDoc comments
44
+ /** Lint JSDoc comments. */
33
45
  "./jsdoc",
34
46
 
35
- // Disable any ESLint rules that conflict with Prettier
36
- // (otherwise, we will have unfixable ESLint errors)
37
- // https://github.com/prettier/eslint-config-prettier
47
+ /**
48
+ * Disable any ESLint rules that conflict with Prettier:
49
+ * https://github.com/prettier/eslint-config-prettier
50
+ * (Otherwise, we will have unfixable ESLint errors.)
51
+ */
38
52
  "prettier",
39
53
  ],
40
54
 
41
55
  plugins: [
42
- // Use the "eslint-plugin-only-warn" plugin to change all errors to warnings
43
- // This allows the end-user to more easily distinguish between errors from the TypeScript
44
- // compiler (which show up in red) and ESLint rule violations (which show up in yellow)
56
+ /**
57
+ * Use the "eslint-plugin-only-warn" plugin to change all errors to warnings:
58
+ * https://github.com/bfanger/eslint-plugin-only-warn
59
+ *
60
+ * This allows the end-user to more easily distinguish between errors from the TypeScript
61
+ * compiler (which show up in red) and ESLint rule violations (which show up in yellow).
62
+ */
45
63
  "only-warn",
46
64
 
47
- // Activate the "sort-exports" plugin, which allows the "sort-exports" rule to be optionally
48
- // enabled on a per-project basis
65
+ /**
66
+ * Activate the "sort-exports" plugin, which allows the "sort-exports" rule to be optionally
67
+ * enabled on a per-project basis.
68
+ */
49
69
  "sort-exports",
50
70
  ],
51
71
 
52
- // We modify the linting rules from the base for some specific things
53
- // (listed in alphabetical order)
54
72
  rules: {
55
- // Documentation:
56
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/array-type.md
57
- // Not defined in the parent configs
58
- // Prefer the "string[]" syntax over "Array<string>"
59
- "@typescript-eslint/array-type": ["warn", { default: "array-simple" }],
73
+ /**
74
+ * Documentation:
75
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/array-type.md
76
+ *
77
+ * Not defined in the parent configs.
78
+ *
79
+ * Prefer the "string[]" syntax over "Array<string>".
80
+ */
81
+ "@typescript-eslint/array-type": [
82
+ "warn",
83
+ {
84
+ default: "array-simple",
85
+ },
86
+ ],
60
87
 
61
- // Documentation:
62
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/explicit-module-boundary-types.md
63
- // Not defined in the parent configs
64
- // Specifying explicit return types can help prevent bugs, but only require it on exported
65
- // functions
88
+ /**
89
+ * Documentation:
90
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/explicit-module-boundary-types.md
91
+ *
92
+ * Not defined in the parent configs.
93
+ *
94
+ * Specifying explicit return types can help prevent bugs, but only require it on exported
95
+ * functions.
96
+ */
66
97
  "@typescript-eslint/explicit-module-boundary-types": "warn",
67
98
 
68
- // Documentation:
69
- // https://eslint.org/docs/rules/lines-between-class-members
70
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/lines-between-class-members.md
71
- // Defined at:
72
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
73
- // Airbnb has "exceptAfterSingleLine" turned off by default
74
- // A list of single-line variable declarations at the top of a class is common in TypeScript
99
+ /**
100
+ * Documentation:
101
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/lines-between-class-members.md
102
+ *
103
+ * Defined at:
104
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
105
+ *
106
+ * Airbnb has "exceptAfterSingleLine" turned off by default. A list of single-line variable
107
+ * declarations at the top of a class is common in TypeScript.
108
+ */
75
109
  "@typescript-eslint/lines-between-class-members": [
76
110
  "warn",
77
111
  "always",
78
- { exceptAfterSingleLine: true },
112
+ {
113
+ exceptAfterSingleLine: true,
114
+ },
79
115
  ],
80
116
 
81
- // Documentation:
82
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/naming-convention.md
83
- // Defined at:
84
- // https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js
85
- // Modify the Airbnb config to allow for a leading underscore,
86
- // which signifies that it is temporarily not being used
117
+ /**
118
+ * Documentation:
119
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/naming-convention.md
120
+ *
121
+ * Defined at:
122
+ * https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js
123
+ *
124
+ * Modify the Airbnb config to allow for a leading underscore, which signifies that it is
125
+ * temporarily not being used.
126
+ */
87
127
  "@typescript-eslint/naming-convention": [
88
128
  "warn",
89
- // Allow camelCase variables (23.2), PascalCase variables (23.8),
90
- // and UPPER_CASE variables (23.10)
129
+ // Allow camelCase variables (23.2), PascalCase variables (23.8), and UPPER_CASE variables
130
+ // (23.10).
91
131
  {
92
132
  selector: "variable",
93
133
  format: ["camelCase", "PascalCase", "UPPER_CASE"],
94
134
  leadingUnderscore: "allow",
95
135
  },
96
- // Allow camelCase functions (23.2), and PascalCase functions (23.8)
136
+ // Allow camelCase functions (23.2), and PascalCase functions (23.8).
97
137
  {
98
138
  selector: "function",
99
139
  format: ["camelCase", "PascalCase"],
100
140
  leadingUnderscore: "allow",
101
141
  },
102
- // Airbnb recommends PascalCase for classes (23.3),
103
- // and although Airbnb does not make TypeScript recommendations,
104
- // we are assuming this rule would similarly apply to anything "type like",
105
- // including interfaces, type aliases, and enums
142
+ // Airbnb recommends PascalCase for classes (23.3), and although Airbnb does not make
143
+ // TypeScript recommendations, we are assuming this rule would similarly apply to anything
144
+ // "type like", including interfaces, type aliases, and enums.
106
145
  {
107
146
  selector: "typeLike",
108
147
  format: ["PascalCase"],
109
148
  },
110
149
  ],
111
150
 
112
- // Documentation:
113
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-unnecessary-boolean-literal-compare.md
114
- // Not defined in the parent configs
115
- // This prevents useless code after refactoring variables to pure booleans
151
+ /**
152
+ * Documentation:
153
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-unnecessary-boolean-literal-compare.md
154
+ *
155
+ * Not defined in the parent configs.
156
+ *
157
+ * This prevents useless code after refactoring variables to pure booleans.
158
+ */
116
159
  "@typescript-eslint/no-unnecessary-boolean-literal-compare": "warn",
117
160
 
118
- // Documentation:
119
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-unused-vars.md
120
- // Defined at:
121
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/variables.js
122
- // We want to lint unused arguments (the default is "after-used")
123
- // We also want to ignore arguments/variables that start with an underscore
124
- // This matches the behavior of the TypeScript compiler flag "--noUnusedLocals"
161
+ /**
162
+ * Documentation:
163
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-unused-vars.md
164
+ *
165
+ * Defined at:
166
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/variables.js
167
+ *
168
+ * We want to lint unused arguments (the default is "after-used"). We also want to ignore
169
+ * arguments/variables that start with an underscore. This matches the behavior of the
170
+ * TypeScript compiler flag "--noUnusedLocals".
171
+ */
125
172
  "@typescript-eslint/no-unused-vars": [
126
173
  "warn",
127
174
  {
@@ -131,39 +178,57 @@ module.exports = {
131
178
  },
132
179
  ],
133
180
 
134
- // Documentation:
135
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-use-before-define.md
136
- // https://eslint.org/docs/rules/no-use-before-define
137
- // Defined at:
138
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/variables.js
139
- // This allows code to be structured in a more logical order
181
+ /**
182
+ * Documentation:
183
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-use-before-define.md
184
+ *
185
+ * Defined at:
186
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/variables.js
187
+ *
188
+ * This allows code to be structured in a more logical order.
189
+ */
140
190
  "@typescript-eslint/no-use-before-define": "off",
141
191
 
142
- // Documentation:
143
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/quotes.md
144
- // Defined at:
145
- // https://github.com/prettier/eslint-config-prettier/blob/main/%40typescript-eslint.js
146
- // In order to forbid unnecessary backticks, we must re-enable the "@typescript-eslint/quotes"
147
- // rule as specified in the eslint-config-prettier documentation:
148
- // https://github.com/prettier/eslint-config-prettier#enforce-backticks
192
+ /**
193
+ * Documentation:
194
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/quotes.md
195
+ *
196
+ * Defined at:
197
+ * https://github.com/prettier/eslint-config-prettier/blob/main/%40typescript-eslint.js
198
+ *
199
+ * In order to forbid unnecessary backticks, we must re-enable the "@typescript-eslint/quotes"
200
+ * rule as specified in the eslint-config-prettier documentation:
201
+ * https://github.com/prettier/eslint-config-prettier#enforce-backticks
202
+ */
149
203
  "@typescript-eslint/quotes": [
150
204
  "warn",
151
205
  "double",
152
- { avoidEscape: true, allowTemplateLiterals: false },
206
+ {
207
+ avoidEscape: true,
208
+ allowTemplateLiterals: false,
209
+ },
153
210
  ],
154
211
 
155
- // Documentation:
156
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/restrict-template-expressions.md
157
- // Defined at:
158
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/recommended-requiring-type-checking.ts
159
- // This rule disallows booleans and nulls in template expressions
160
- // However, a common use-case of template strings is to coerce everything to a string
212
+ /**
213
+ * Documentation:
214
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/restrict-template-expressions.md
215
+ *
216
+ * Defined at:
217
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/recommended-requiring-type-checking.ts
218
+ *
219
+ * This rule disallows booleans and nulls in template expressions. However, a common use-case of
220
+ * template strings is to coerce everything to a string.
221
+ */
161
222
  "@typescript-eslint/restrict-template-expressions": "off",
162
223
 
163
- // Documentation:
164
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/restrict-template-expressions.md
165
- // Not defined in the parent configs
166
- // This rule prevents bugs when refactoring a boolean to a number
224
+ /**
225
+ * Documentation:
226
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/restrict-template-expressions.md
227
+ *
228
+ * Not defined in the parent configs.
229
+ *
230
+ * This rule prevents bugs when refactoring a boolean to a number.
231
+ */
167
232
  "@typescript-eslint/strict-boolean-expressions": [
168
233
  "warn",
169
234
  {
@@ -177,36 +242,16 @@ module.exports = {
177
242
  },
178
243
  ],
179
244
 
180
- // Documentation:
181
- // https://github.com/lasselupe33/eslint-plugin-comment-length
182
- // Defined at:
183
- // https://github.com/lasselupe33/eslint-plugin-comment-length/blob/master/rules/src/index.ts
184
- // Auto-fix long comments. We specify 100 to match the ruler and the Airbnb style guide.
185
- "comment-length-2/limit-multi-line-comments": [
186
- "warn",
187
- {
188
- maxLength: 100,
189
- },
190
- ],
191
-
192
- // Documentation:
193
- // https://github.com/lasselupe33/eslint-plugin-comment-length
194
- // Defined at:
195
- // https://github.com/lasselupe33/eslint-plugin-comment-length/blob/master/rules/src/index.ts
196
- // Auto-fix long comments. We specify 100 to match the ruler and the Airbnb style guide.
197
- "comment-length-2/limit-single-line-comments": [
198
- "warn",
199
- {
200
- maxLength: 100,
201
- },
202
- ],
203
-
204
- // Documentation:
205
- // https://github.com/mysticatea/eslint-plugin-eslint-comments/blob/master/docs/rules/disable-enable-pair.md
206
- // Defined at:
207
- // https://github.com/mysticatea/eslint-plugin-eslint-comments/blob/master/lib/configs/recommended.js
208
- // By default, it does not allow "eslint-disable" comments for a whole file,
209
- // which is standard practice
245
+ /**
246
+ * Documentation:
247
+ * https://github.com/mysticatea/eslint-plugin-eslint-comments/blob/master/docs/rules/disable-enable-pair.md
248
+ *
249
+ * Defined at:
250
+ * https://github.com/mysticatea/eslint-plugin-eslint-comments/blob/master/lib/configs/recommended.js
251
+ *
252
+ * By default, it does not allow "eslint-disable" comments for a whole file, which is standard
253
+ * practice.
254
+ */
210
255
  "eslint-comments/disable-enable-pair": [
211
256
  "warn",
212
257
  {
@@ -214,56 +259,85 @@ module.exports = {
214
259
  },
215
260
  ],
216
261
 
217
- // Documentation:
218
- // https://github.com/mysticatea/eslint-plugin-eslint-comments/blob/master/docs/rules/no-unlimited-disable.md
219
- // Defined at:
220
- // https://github.com/mysticatea/eslint-plugin-eslint-comments/blob/master/lib/configs/recommended.js
221
- // If a line breaks two or more ESLint rules,
222
- // then it is useful to use a single "eslint-disable" comment
262
+ /**
263
+ * Documentation:
264
+ * https://github.com/mysticatea/eslint-plugin-eslint-comments/blob/master/docs/rules/no-unlimited-disable.md
265
+ *
266
+ * Defined at:
267
+ * https://github.com/mysticatea/eslint-plugin-eslint-comments/blob/master/lib/configs/recommended.js
268
+ *
269
+ * If a line breaks two or more ESLint rules, then it is useful to use a single "eslint-disable"
270
+ * comment.
271
+ */
223
272
  "eslint-comments/no-unlimited-disable": "off",
224
273
 
225
- // Documentation:
226
- // https://github.com/mysticatea/eslint-plugin-eslint-comments/blob/master/docs/rules/no-unused-disable.md
227
- // Not defined in parent configs
228
- // This can help clean up unnecessary comments
274
+ /**
275
+ * Documentation:
276
+ * https://github.com/mysticatea/eslint-plugin-eslint-comments/blob/master/docs/rules/no-unused-disable.md
277
+ *
278
+ * Not defined in the parent configs.
279
+ *
280
+ * This can help clean up unnecessary comments.
281
+ */
229
282
  "eslint-comments/no-unused-disable": "warn",
230
283
 
231
- // Documentation:
232
- // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/prefer-default-export.md
233
- // Defined at:
234
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/imports.js
235
- // The case against default exports is layed out here:
236
- // https://basarat.gitbook.io/typescript/main-1/defaultisbad
284
+ /**
285
+ * Documentation:
286
+ * https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/prefer-default-export.md
287
+ *
288
+ * Defined at:
289
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/imports.js
290
+ *
291
+ * The case against default exports is layed out here:
292
+ * https://basarat.gitbook.io/typescript/main-1/defaultisbad
293
+ */
237
294
  "import/prefer-default-export": "off",
238
295
 
239
- // Documentation:
240
- // https://eslint.org/docs/rules/no-console
241
- // Defined at:
242
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/errors.js
243
- // Command-line programs commonly write to standard out and standard error
296
+ /**
297
+ * Documentation: https://eslint.org/docs/rules/no-console
298
+ *
299
+ * Defined at:
300
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/errors.js
301
+ *
302
+ * Command-line programs commonly write to standard out and standard error.
303
+ */
244
304
  "no-console": "off",
245
305
 
246
- // Documentation:
247
- // https://eslint.org/docs/rules/no-continue
248
- // Defined at:
249
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
250
- // Proper use of continues can reduce indentation for long blocks of code
306
+ /**
307
+ * Documentation: https://eslint.org/docs/rules/no-continue
308
+ *
309
+ * Defined at:
310
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
311
+ *
312
+ * Proper use of continues can reduce indentation for long blocks of code.
313
+ */
251
314
  "no-continue": "off",
252
315
 
253
- // Documentation:
254
- // https://eslint.org/docs/rules/no-plusplus
255
- // Defined at:
256
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
257
- // Airbnb disallows these because it can lead to errors with minified code;
258
- // we don't have to worry about this in for loops though
259
- "no-plusplus": ["warn", { allowForLoopAfterthoughts: true }],
316
+ /**
317
+ * Documentation: https://eslint.org/docs/rules/no-plusplus
318
+ *
319
+ * Defined at:
320
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
321
+ *
322
+ * Airbnb disallows these because it can lead to errors with minified code. We don't have to
323
+ * worry about this in for loops though.
324
+ */
325
+ "no-plusplus": [
326
+ "warn",
327
+ {
328
+ allowForLoopAfterthoughts: true,
329
+ },
330
+ ],
260
331
 
261
- // Documentation:
262
- // https://eslint.org/docs/rules/no-restricted-syntax
263
- // Defined at:
264
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
265
- // We move the selector for "for..of" loops, since they are commonly used
266
- // We add a selector for "empty" invocations of the "array.push()" method
332
+ /**
333
+ * Documentation: https://eslint.org/docs/rules/no-restricted-syntax
334
+ *
335
+ * Defined at:
336
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
337
+ *
338
+ * - We move the selector for "for..of" loops, since they are commonly used.
339
+ * - We add a selector for "empty" invocations of the "array.push()" method.
340
+ */
267
341
  "no-restricted-syntax": [
268
342
  "warn",
269
343
  {
@@ -288,13 +362,15 @@ module.exports = {
288
362
  },
289
363
  ],
290
364
 
291
- // Documentation:
292
- // https://eslint.org/docs/rules/prefer-destructuring
293
- // Defined at:
294
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/es6.js
295
- // Array destructuring can result in non-intuitive code
296
- // Object destructuring is disgustingly verbose in TypeScript
297
- // e.g. "const foo: string = bar.foo;" vs "const { foo }: { foo: string } = bar;"
365
+ /**
366
+ * Documentation: https://eslint.org/docs/rules/prefer-destructuring
367
+ *
368
+ * Defined at:
369
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/es6.js
370
+ *
371
+ * - Array destructuring can result in non-intuitive code.
372
+ * - Object destructuring is disgustingly verbose in TypeScript.
373
+ */
298
374
  "prefer-destructuring": "off",
299
375
  },
300
376
  };
package/jsdoc.js CHANGED
@@ -1,65 +1,185 @@
1
- // This is a shared configuration file for ESLint
1
+ // This is a shared configuration file for ESLint:
2
2
  // https://eslint.org/docs/user-guide/configuring
3
3
  module.exports = {
4
4
  plugins: [
5
- // Lint JSDoc style comments
6
- // https://github.com/gajus/eslint-plugin-jsdoc
5
+ /** Lint JSDoc style comments: https://github.com/gajus/eslint-plugin-jsdoc */
7
6
  "jsdoc",
8
7
  ],
9
8
 
10
9
  rules: {
11
- // jsdoc/check-access - Not needed in TypeScript.
12
- // jsdoc/check-alignment - Overlaps with `isaacscript-limit-jsdoc-comments`.
13
- // jsdoc/check-examples - Not worth it since some ESLint rules may not apply to examples.
14
- // jsdoc/check-indentation - Overlaps with `isaacscript-limit-jsdoc-comments`.
15
- // jsdoc/check-line-alignment - This is not a common formatting scheme in the wild. It's also
16
- // not recommended by the plugin.
17
-
18
- // Documentation:
19
- // https://github.com/gajus/eslint-plugin-jsdoc#check-param-names
20
- // Ensures that parameter names in JSDoc match those in the function declaration.
10
+ // - jsdoc/check-access - Not needed in TypeScript.
11
+ // - jsdoc/check-alignment - Overlaps with `isaacscript/limit-jsdoc-comments`.
12
+ // - jsdoc/check-examples - Not worth it since some ESLint rules may not apply to examples.
13
+ // - jsdoc/check-indentation - Overlaps with `isaacscript/limit-jsdoc-comments`.
14
+ // - jsdoc/check-line-alignment - This is not a common formatting scheme in the wild. It's also
15
+ // not recommended by the plugin.
16
+
17
+ /**
18
+ * Documentation: https://github.com/gajus/eslint-plugin-jsdoc#check-param-names
19
+ *
20
+ * Ensures that parameter names in JSDoc match those in the function declaration.
21
+ */
21
22
  "jsdoc/check-param-names": "warn",
22
23
 
23
- // jsdoc/check-property-names - Not needed in TypeScript.
24
- // jsdoc/check-syntax - Not needed in TypeScript.
24
+ // - jsdoc/check-property-names - Not needed in TypeScript.
25
+ // - jsdoc/check-syntax - Not needed in TypeScript.
25
26
 
26
- // Documentation:
27
- // https://github.com/gajus/eslint-plugin-jsdoc#check-tag-names
28
- // Allow the use of TypeScriptToLua compiler annotations as documented here:
29
- // https://typescripttolua.github.io/docs/advanced/compiler-annotations
27
+ /**
28
+ * Documentation: https://github.com/gajus/eslint-plugin-jsdoc#check-tag-names
29
+ *
30
+ * Reports invalid block tag names.
31
+ */
30
32
  "jsdoc/check-tag-names": [
31
33
  "warn",
32
34
  {
33
35
  definedTags: [
34
- "category", // Used in TypeDoc
35
- "hidden", // Used in TypeDoc
36
+ // Used by the TypeScript compiler:
37
+ // https://www.typescriptlang.org/tsconfig#stripInternal
36
38
  "internal", // Used by TypeScript
37
- "noResolution", // Used in TypeScriptToLua as a compiler annotation
38
- "noSelf", // Used in TypeScriptToLua as a compiler annotation
39
+
40
+ // Add tags used in TypeDoc:
41
+ // https://typedoc.org/guides/doccomments/
42
+ "category",
43
+ "hidden",
44
+
45
+ // Add tags used in TypeScriptToLua:
46
+ // https://typescripttolua.github.io/docs/advanced/compiler-annotations
47
+ "noResolution",
48
+ "noSelf",
39
49
  ],
40
50
  },
41
51
  ],
42
52
 
43
- // jsdoc/check-types - Not needed in TypeScript.
53
+ // - jsdoc/check-types - Not needed in TypeScript.
44
54
 
45
- // Documentation:
46
- // https://github.com/gajus/eslint-plugin-jsdoc#check-values
47
- // Validates the content of some uncommon JSDoc tags
55
+ /**
56
+ * Documentation: https://github.com/gajus/eslint-plugin-jsdoc#check-values
57
+ *
58
+ * Validates the content of some uncommon JSDoc tags.
59
+ */
48
60
  "jsdoc/check-values": "warn",
49
61
 
50
- // Documentation:
51
- // https://github.com/gajus/eslint-plugin-jsdoc#check-values
52
- // Validates the content of some uncommon JSDoc tags
62
+ /**
63
+ * Documentation: https://github.com/gajus/eslint-plugin-jsdoc#check-values
64
+ *
65
+ * Validates that specific tags are never empty.
66
+ */
53
67
  "jsdoc/empty-tags": "warn",
54
68
 
55
- // Documentation:
56
- // https://github.com/gajus/eslint-plugin-jsdoc#implements-on-classes
57
- // Reports issues with incorrect usage of @implements
69
+ /**
70
+ * Documentation: https://github.com/gajus/eslint-plugin-jsdoc#implements-on-classes
71
+ *
72
+ * Reports issues with incorrect usage of `@implements`.
73
+ */
58
74
  "jsdoc/implements-on-classes": "warn",
59
75
 
60
- // Documentation:
61
- // https://github.com/gajus/eslint-plugin-jsdoc#match-description
62
- // JSDoc comments should always be full sentences
63
- "jsdoc/match-description": ["warn"],
76
+ // - jsdoc/match-description - Overlaps with `isaacscript/jsdoc-full-sentences`.
77
+ // - jsdoc/match-name - Only needed for projects with specific JSDoc requirements.
78
+ // - jsdoc/multiline-blocks - Overlaps with `isaacscript/limit-jsdoc-comments`.
79
+ // - jsdoc/newline-after-description - Overlaps with `isaacscript/limit-jsdoc-comments`.
80
+ // - jsdoc/no-bad-blocks - Provides little value, since it only detects JSDoc comments with tags
81
+ // in them.
82
+ // - jsdoc/no-defaults - Provides little value, since the @default tag is rare.
83
+ // - jsdoc/no-missing-syntax - Not generally relevant.
84
+ // - jsdoc/no-multi-asterisks - Overlaps with `isaacscript/limit-jsdoc-comments`.
85
+ // - jsdoc/no-restricted-syntax - Not generally relevant.
86
+
87
+ /**
88
+ * Documentation: https://github.com/gajus/eslint-plugin-jsdoc#no-types
89
+ *
90
+ * Disallows types being used on `@param` or `@returns`.
91
+ */
92
+ "jsdoc/no-types": "warn",
93
+
94
+ // - jsdoc/no-undefined-types - Not needed in TypeScript.
95
+
96
+ /**
97
+ * Documentation: https://github.com/gajus/eslint-plugin-jsdoc#require-asterisk-prefix
98
+ *
99
+ * Requires that each JSDoc line starts with an `*`.
100
+ */
101
+ "jsdoc/require-asterisk-prefix": "warn",
102
+
103
+ // - jsdoc/require-description-complete-sentence - Overlaps with
104
+ // `isaacscript/jsdoc-complete-sentences`.
105
+ // - jsdoc/require-description - It's overboard for every function to have a description.
106
+ // - jsdoc/require-example - It's overboard for every function to require an example.
107
+ // - jsdoc/require-file-overview - It's overboard for every file to require an overview.
108
+
109
+ /**
110
+ * Documentation:
111
+ * https://github.com/gajus/eslint-plugin-jsdoc#require-hyphen-before-param-description
112
+ *
113
+ * Disallow hyphens before parameter descriptions, as it is non-standard syntax.
114
+ */
115
+ "jsdoc/require-hyphen-before-param-description": ["warn", "never"],
116
+
117
+ // - jsdoc/require-jsdoc - It's overboard for every function to have a JSDoc comment.
118
+
119
+ /**
120
+ * Documentation:
121
+ * https://github.com/gajus/eslint-plugin-jsdoc#require-param-description
122
+ *
123
+ * Requires that each `@param` tag has a description.
124
+ */
125
+ "jsdoc/require-param-description": "warn",
126
+
127
+ /**
128
+ * Documentation:
129
+ * https://github.com/gajus/eslint-plugin-jsdoc#require-param-name
130
+ *
131
+ * Requires that each `@param` tag has a name.
132
+ */
133
+ "jsdoc/require-param-name": "warn",
134
+
135
+ // - jsdoc/require-param-type - Not needed in TypeScript.
136
+ // - jsdoc/require-param - It's overboard for every function to document every parameter.
137
+ // - jsdoc/require-property - Probably not needed in TypeScript.
138
+
139
+ /**
140
+ * Documentation:
141
+ * https://github.com/gajus/eslint-plugin-jsdoc#require-property-description
142
+ *
143
+ * Requires that each `@property` tag has a description.
144
+ */
145
+ "jsdoc/require-property-description": "warn",
146
+
147
+ /**
148
+ * Documentation:
149
+ * https://github.com/gajus/eslint-plugin-jsdoc#require-property-name
150
+ *
151
+ * Requires that each `@property` tag has a name.
152
+ */
153
+ "jsdoc/require-property-name": "warn",
154
+
155
+ // - jsdoc/require-property-type - Not needed in TypeScript.
156
+ // - jsdoc/require-returns-check - It's overboard for every function to document every return
157
+ // value.
158
+
159
+ /**
160
+ * Documentation:
161
+ * https://github.com/gajus/eslint-plugin-jsdoc#require-returns-description
162
+ *
163
+ * Requires that each `@returns` tag has a description.
164
+ */
165
+ "jsdoc/require-returns-description": "warn",
166
+
167
+ // - jsdoc/require-returns-type - Not needed in TypeScript.
168
+ // - jsdoc/require-returns - It's overboard for every function to document every return value.
169
+ // - jsdoc/require-throws - It's overboard to document every throw statement.
170
+ // - jsdoc/require-yields - It's overboard to document every yield.
171
+ // - jsdoc/require-yields-check - It's overboard to document every yield.
172
+ // - jsdoc/sort-tags - Not very useful since there are typically only `@param` and `@return`
173
+ // tags.
174
+
175
+ /**
176
+ * Documentation:
177
+ * https://github.com/gajus/eslint-plugin-jsdoc#tag-lines
178
+ *
179
+ * Enforces no lines between tags.
180
+ */
181
+ "jsdoc/tag-lines": "warn",
182
+
183
+ // - jsdoc/valid-types - Not needed in TypeScript.
64
184
  },
65
185
  };
package/lint.sh CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  set -e # Exit on any errors
4
4
 
5
- # Get the directory of this script
5
+ # Get the directory of this script:
6
6
  # https://stackoverflow.com/questions/59895/getting-the-source-directory-of-a-bash-script-from-within
7
7
  DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
8
8
 
package/mod.js CHANGED
@@ -1,52 +1,109 @@
1
- // This is a shared configuration file for ESLint
1
+ // This is a shared configuration file for ESLint:
2
2
  // https://eslint.org/docs/user-guide/configuring
3
3
  module.exports = {
4
4
  extends: [
5
- // The mod config extends the base configuration:
6
- // https://github.com/IsaacScript/eslint-config-isaacscript/blob/main/base.js
5
+ /**
6
+ * The mod config extends the base configuration:
7
+ * https://github.com/IsaacScript/eslint-config-isaacscript/blob/main/base.js
8
+ */
7
9
  "./base",
8
10
  ],
9
11
 
10
- // We modify the linting rules from the base for some specific things
11
- // (listed in alphabetical order)
12
12
  rules: {
13
- // Documentation:
14
- // https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-loop-func.md
15
- // https://eslint.org/docs/rules/no-loop-func
16
- // Defined at:
17
- // https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js
18
- // This rule throws false positives with API functions
19
- // It can be worked around by supplying lists of globals to ESLint, but this is ugly
20
- // See: https://github.com/typescript-eslint/typescript-eslint/issues/2780
13
+ /**
14
+ * Documentation:
15
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/naming-convention.md
16
+ *
17
+ * Defined at:
18
+ * https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js
19
+ *
20
+ * Modify the Airbnb config to allow for a leading underscore, which signifies that it is
21
+ * temporarily not being used.
22
+ *
23
+ * Additionally, ensure that all enums match the Isaac convention of using UPPER_CASE.
24
+ */
25
+ "@typescript-eslint/naming-convention": [
26
+ "warn",
27
+ // Allow camelCase variables (23.2), PascalCase variables (23.8), and UPPER_CASE variables
28
+ // (23.10).
29
+ {
30
+ selector: "variable",
31
+ format: ["camelCase", "PascalCase", "UPPER_CASE"],
32
+ leadingUnderscore: "allow",
33
+ },
34
+ // Allow camelCase functions (23.2), and PascalCase functions (23.8).
35
+ {
36
+ selector: "function",
37
+ format: ["camelCase", "PascalCase"],
38
+ leadingUnderscore: "allow",
39
+ },
40
+ // Airbnb recommends PascalCase for classes (23.3), and although Airbnb does not make
41
+ // TypeScript recommendations, we are assuming this rule would similarly apply to anything
42
+ // "type like", including interfaces, type aliases, and enums.
43
+ {
44
+ selector: "typeLike",
45
+ format: ["PascalCase"],
46
+ },
47
+ // The vanilla Isaac enums all use UPPER_CASE:
48
+ // https://wofsauge.github.io/IsaacDocs/rep/enums/CollectibleType.html
49
+ {
50
+ selector: "enumMember",
51
+ format: ["UPPER_CASE"],
52
+ },
53
+ ],
54
+
55
+ /**
56
+ * Documentation:
57
+ * https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-loop-func.md
58
+ *
59
+ * Defined at:
60
+ * https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/lib/shared.js
61
+ *
62
+ * This rule throws false positives with API functions. It can be worked around by supplying
63
+ * lists of globals to ESLint, but this is ugly. See:
64
+ * https://github.com/typescript-eslint/typescript-eslint/issues/2780
65
+ */
21
66
  "@typescript-eslint/no-loop-func": "off",
22
67
 
23
- // Documentation:
24
- // https://github.com/eslint/eslint/blob/master/docs/rules/no-bitwise.md
25
- // Defined at:
26
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
27
- // Isaac enums use bitwise operators (e.g. "EntityFlag")
68
+ /**
69
+ * Documentation: https://github.com/eslint/eslint/blob/master/docs/rules/no-bitwise.md
70
+ *
71
+ * Defined at:
72
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
73
+ *
74
+ * Isaac enums use bitwise operators (e.g. "EntityFlag").
75
+ */
28
76
  "no-bitwise": "off",
29
77
 
30
- // Documentation:
31
- // https://eslint.org/docs/rules/no-param-reassign
32
- // Defined at:
33
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/best-practices.js
34
- // The Isaac API callback functions expect you to modify the provided object
78
+ /**
79
+ * Documentation: https://eslint.org/docs/rules/no-param-reassign
80
+ *
81
+ * Defined at:
82
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/best-practices.js
83
+ *
84
+ * The Isaac API callback functions expect you to modify the provided object.
85
+ */
35
86
  "no-param-reassign": "off",
36
87
 
37
- // Documentation:
38
- // https://eslint.org/docs/rules/no-restricted-globals
39
- // Defined at:
40
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/variables.js
41
- // print is used with Lua mods
88
+ /**
89
+ * Documentation: https://eslint.org/docs/rules/no-restricted-globals
90
+ *
91
+ * Defined at:
92
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/variables.js
93
+ *
94
+ * "print" is used with Lua mods.
95
+ */
42
96
  "no-restricted-globals": "off",
43
97
 
44
- // Documentation:
45
- // https://eslint.org/docs/rules/no-underscore-dangle
46
- // Defined at:
47
- // https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
48
- // We keep the Airbnb specification but allow calling functions that overload Lua operators:
49
- // https://moddingofisaac.com/docs/class_vector.html
98
+ /**
99
+ * Documentation: https://eslint.org/docs/rules/no-underscore-dangle
100
+ *
101
+ * Defined at:
102
+ * https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/rules/style.js
103
+ *
104
+ * We keep the Airbnb specification but allow calling functions that overload Lua operators:
105
+ * https://moddingofisaac.com/docs/class_vector.html
106
+ */
50
107
  "no-underscore-dangle": [
51
108
  "warn",
52
109
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-config-isaacscript",
3
- "version": "1.0.68",
3
+ "version": "1.0.71",
4
4
  "description": "An ESLint config for IsaacScript projects.",
5
5
  "repository": {
6
6
  "type": "git",
package/publish.sh CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  set -e # Exit on any errors
4
4
 
5
- # Get the directory of this script
5
+ # Get the directory of this script:
6
6
  # https://stackoverflow.com/questions/59895/getting-the-source-directory-of-a-bash-script-from-within
7
7
  DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
8
8
 
package/update.sh CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  set -e # Exit on any errors
4
4
 
5
- # Get the directory of this script
5
+ # Get the directory of this script:
6
6
  # https://stackoverflow.com/questions/59895/getting-the-source-directory-of-a-bash-script-from-within
7
7
  DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
8
8