@evertondgn/solid-tooling 0.2.0 → 0.4.0

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.
@@ -0,0 +1,983 @@
1
+ import { n as RENDER_INTEGRITY_MODULE, t as RELATIVE_IMPORT_RESTRICTION } from "./constants-Jqvtbvxu.mjs";
2
+ // src/backendPolicy/index.ts
3
+ const NETWORK = [
4
+ "fetch",
5
+ "XMLHttpRequest",
6
+ "WebSocket",
7
+ "EventSource"
8
+ ];
9
+ const RESTRICTED_GLOBALS = [...NETWORK, "console"];
10
+ const GLOBALS = [
11
+ "globalThis",
12
+ "window",
13
+ "self",
14
+ "global"
15
+ ];
16
+ const SAFE_ERRORS = {
17
+ name: "@solidjs/web",
18
+ importNames: ["markSafeError", "SAFE_ERROR"],
19
+ message: "Use createPublicError; only publicErrors may mark an error as public."
20
+ };
21
+ const SERVER_ERROR_HOOK = {
22
+ name: "@solidjs/web",
23
+ importNames: ["configureServerErrors"],
24
+ message: "Only src/infra/server/configureServerErrors/index.ts may import this: server error handling is configured in that module."
25
+ };
26
+ const SERVER_CONFIG = ["@solidjs/web/server-functions", "@solidjs/web/server-functions/server"].map((name) => ({
27
+ name,
28
+ message: "Only src/infra/server/configureServerErrors/index.ts may import this: server error handling is configured in that module."
29
+ }));
30
+ const RENDER_OBSERVER = {
31
+ regex: RENDER_INTEGRITY_MODULE,
32
+ importNames: ["observeRenderFailures"],
33
+ message: "Only configureServerErrors may declare that render failures are observed."
34
+ };
35
+ const TRANSPORTS = [
36
+ "http",
37
+ "https",
38
+ "http2",
39
+ "net",
40
+ "tls",
41
+ "undici"
42
+ ].flatMap((name) => [name, `node:${name}`]).map((name) => ({
43
+ name,
44
+ message: "Node transports cannot be imported in src/. Use requestJson for HTTP, or an adapter in src/infra/server/ wrapped in protectServerOperation."
45
+ }));
46
+ function imports({ paths, patterns = [] }) {
47
+ return { "eslint/no-restricted-imports": ["error", {
48
+ paths,
49
+ patterns: [RELATIVE_IMPORT_RESTRICTION, ...patterns]
50
+ }] };
51
+ }
52
+ function globals({ names, properties = names }) {
53
+ return {
54
+ "eslint/no-restricted-globals": ["error", {
55
+ globals: names,
56
+ checkGlobalObject: true,
57
+ globalObjects: ["global"]
58
+ }],
59
+ "eslint/no-restricted-properties": ["error", ...GLOBALS.flatMap((object) => properties.map((property) => ({
60
+ object,
61
+ property,
62
+ message: property === "console" ? "Log failures only through logServerFailure." : "Call the backend through requestJson, or through an adapter in src/infra/server/ wrapped in protectServerOperation."
63
+ })))]
64
+ };
65
+ }
66
+ const backendPolicy = [
67
+ {
68
+ files: ["src/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}"],
69
+ rules: {
70
+ "backend/static-solid-imports": "error",
71
+ "backend/static-render-integrity-imports": "error",
72
+ "eslint/no-console": ["error", { allow: [] }],
73
+ ...globals({ names: RESTRICTED_GLOBALS }),
74
+ ...imports({
75
+ paths: [
76
+ SAFE_ERRORS,
77
+ SERVER_ERROR_HOOK,
78
+ ...SERVER_CONFIG,
79
+ ...TRANSPORTS
80
+ ],
81
+ patterns: [RENDER_OBSERVER]
82
+ })
83
+ }
84
+ },
85
+ {
86
+ files: ["src/infra/server/logServerFailure/index.ts"],
87
+ rules: {
88
+ ...globals({
89
+ names: NETWORK,
90
+ properties: RESTRICTED_GLOBALS
91
+ }),
92
+ "eslint/no-console": ["error", { allow: ["error"] }]
93
+ }
94
+ },
95
+ {
96
+ files: ["src/infra/server/requestJson/index.ts"],
97
+ rules: globals({ names: RESTRICTED_GLOBALS.filter((name) => name !== "fetch") })
98
+ },
99
+ {
100
+ files: ["src/infra/server/publicErrors/index.ts"],
101
+ rules: imports({
102
+ paths: [
103
+ SERVER_ERROR_HOOK,
104
+ ...SERVER_CONFIG,
105
+ ...TRANSPORTS
106
+ ],
107
+ patterns: [RENDER_OBSERVER]
108
+ })
109
+ },
110
+ {
111
+ files: ["src/infra/server/configureServerErrors/index.ts"],
112
+ rules: imports({ paths: [SAFE_ERRORS, ...TRANSPORTS] })
113
+ },
114
+ {
115
+ files: [
116
+ "src/**/*.test.{ts,tsx,mts,cts,js,jsx,mjs,cjs}",
117
+ "src/**/*.test-d.{ts,tsx}",
118
+ "src/**/*.d.{ts,mts,cts}"
119
+ ],
120
+ rules: {
121
+ "backend/static-solid-imports": "off",
122
+ "backend/static-render-integrity-imports": "off",
123
+ "eslint/no-console": "off",
124
+ "eslint/no-restricted-globals": "off",
125
+ "eslint/no-restricted-properties": "off",
126
+ ...imports({ paths: [] })
127
+ }
128
+ }
129
+ ];
130
+ // src/lint/rules/environment.ts
131
+ const environmentRules = {
132
+ "architecture/layer-imports": "error",
133
+ "project/css-modules-import": "error",
134
+ "project/css-filename": "error",
135
+ "project/test-filename": "error",
136
+ "project/no-export-list": "error",
137
+ "project/seo-module": "error",
138
+ "jsx-a11y/alt-text": "error",
139
+ "jsx-a11y/anchor-ambiguous-text": "error",
140
+ "jsx-a11y/anchor-has-content": "error",
141
+ "jsx-a11y/anchor-is-valid": "error",
142
+ "jsx-a11y/aria-activedescendant-has-tabindex": "error",
143
+ "jsx-a11y/aria-props": "error",
144
+ "jsx-a11y/aria-proptypes": "error",
145
+ "jsx-a11y/aria-role": "error",
146
+ "jsx-a11y/aria-unsupported-elements": "error",
147
+ "jsx-a11y/autocomplete-valid": "error",
148
+ "jsx-a11y/click-events-have-key-events": "error",
149
+ "jsx-a11y/control-has-associated-label": "error",
150
+ "jsx-a11y/heading-has-content": "error",
151
+ "jsx-a11y/html-has-lang": "error",
152
+ "jsx-a11y/iframe-has-title": "error",
153
+ "jsx-a11y/img-redundant-alt": "error",
154
+ "jsx-a11y/interactive-supports-focus": "error",
155
+ "jsx-a11y/label-has-associated-control": "error",
156
+ "jsx-a11y/lang": "error",
157
+ "jsx-a11y/media-has-caption": "error",
158
+ "jsx-a11y/mouse-events-have-key-events": "error",
159
+ "jsx-a11y/no-access-key": "error",
160
+ "jsx-a11y/no-aria-hidden-on-focusable": "error",
161
+ "jsx-a11y/no-autofocus": "error",
162
+ "jsx-a11y/no-distracting-elements": "error",
163
+ "jsx-a11y/no-interactive-element-to-noninteractive-role": "error",
164
+ "jsx-a11y/no-noninteractive-element-interactions": "error",
165
+ "jsx-a11y/no-noninteractive-element-to-interactive-role": "error",
166
+ "jsx-a11y/no-noninteractive-tabindex": "error",
167
+ "jsx-a11y/no-redundant-roles": "error",
168
+ "jsx-a11y/no-static-element-interactions": "error",
169
+ "jsx-a11y/prefer-tag-over-role": "error",
170
+ "jsx-a11y/role-has-required-aria-props": "error",
171
+ "jsx-a11y/role-supports-aria-props": "error",
172
+ "jsx-a11y/scope": "error",
173
+ "jsx-a11y/tabindex-no-positive": "error",
174
+ "node/callback-return": "error",
175
+ "node/exports-style": "error",
176
+ "node/global-require": "error",
177
+ "node/handle-callback-err": "error",
178
+ "node/no-exports-assign": "error",
179
+ "node/no-mixed-requires": "error",
180
+ "node/no-new-require": "error",
181
+ "node/no-path-concat": "error",
182
+ "node/no-process-env": "error",
183
+ "node/no-sync": "error",
184
+ "oxc/approx-constant": "error",
185
+ "oxc/bad-array-method-on-arguments": "error",
186
+ "oxc/bad-bitwise-operator": "error",
187
+ "oxc/bad-char-at-comparison": "error",
188
+ "oxc/bad-comparison-sequence": "error",
189
+ "oxc/bad-match-all-arg": "error",
190
+ "oxc/bad-min-max-func": "error",
191
+ "oxc/bad-object-literal-comparison": "error",
192
+ "oxc/bad-replace-all-arg": "error",
193
+ "oxc/branches-sharing-code": "error",
194
+ "oxc/const-comparisons": "error",
195
+ "oxc/double-comparisons": "error",
196
+ "oxc/erasing-op": "error",
197
+ "oxc/misrefactored-assign-op": "error",
198
+ "oxc/missing-throw": "error",
199
+ "oxc/no-accumulating-spread": "error",
200
+ "oxc/no-async-endpoint-handlers": "error",
201
+ "oxc/no-barrel-file": "error",
202
+ "oxc/no-const-enum": "error",
203
+ "oxc/no-map-spread": "error",
204
+ "oxc/no-this-in-exported-function": "error",
205
+ "oxc/number-arg-out-of-range": "error",
206
+ "oxc/only-used-in-recursion": "error",
207
+ "oxc/uninvoked-array-callback": "error",
208
+ "paraglide/no-dynamic-message-access": ["error", { messageModules: ["@paraglide/messages.js", "@paraglide/messages/_index.js"] }],
209
+ "promise/always-return": "error",
210
+ "promise/avoid-new": "error",
211
+ "promise/catch-or-return": ["error", {
212
+ allowThen: true,
213
+ allowFinally: true
214
+ }],
215
+ "promise/no-callback-in-promise": "error",
216
+ "promise/no-multiple-resolved": "error",
217
+ "promise/no-nesting": "error",
218
+ "promise/no-new-statics": "error",
219
+ "promise/no-promise-in-callback": "error",
220
+ "promise/no-return-in-finally": "error",
221
+ "promise/no-return-wrap": "error",
222
+ "promise/param-names": "error",
223
+ "promise/prefer-await-to-callbacks": "error",
224
+ "promise/prefer-await-to-then": ["error", { strict: true }],
225
+ "promise/prefer-catch": "error",
226
+ "promise/spec-only": "error",
227
+ "promise/valid-params": "error",
228
+ "solid/action-yield-after-await": "error",
229
+ "solid/components-return-once": "warn",
230
+ "solid/event-handlers": "error",
231
+ "solid/imports": "warn",
232
+ "solid/jsx-no-duplicate-props": "error",
233
+ "solid/jsx-no-script-url": "error",
234
+ "solid/jsx-no-undef": ["error", { typescriptEnabled: true }],
235
+ "solid/jsx-uses-vars": "error",
236
+ "solid/no-accessor-as-prop": "error",
237
+ "solid/no-boolean-enumerated-attribute": "error",
238
+ "solid/no-browser-globals-in-server-function": "error",
239
+ "solid/no-destructure": "error",
240
+ "solid/no-innerhtml": "error",
241
+ "solid/no-invalid-server-capture": "error",
242
+ "solid/no-module-scope-reactive-primitive": "error",
243
+ "solid/no-react-specific-props": "error",
244
+ "solid/no-restated-default-options": "error",
245
+ "solid/no-single-arg-create-effect": "error",
246
+ "solid/no-store-mutation-outside-setter": "error",
247
+ "solid/no-unassigned-vars": "error",
248
+ "solid/no-unknown-namespaces": "error",
249
+ "solid/no-unused-signal": "error",
250
+ "solid/no-write-in-pure-computation": "error",
251
+ "solid/prefer-for": "error",
252
+ "solid/prefer-onSettled-for-side-effects": "warn",
253
+ "solid/prefer-structured-class": "error",
254
+ "solid/reactivity": "warn",
255
+ "solid/removed-api": "error",
256
+ "solid/require-async-server-function": "error",
257
+ "solid/self-closing-comp": "warn",
258
+ "solid/style-prop": "warn",
259
+ "solid/valid-use-server": "error",
260
+ "solid/validate-jsx-nesting": "error",
261
+ "vite-plus/prefer-vite-plus-imports": "error"
262
+ };
263
+ // src/lint/rules/imports.ts
264
+ const importRules = {
265
+ "import/consistent-type-specifier-style": ["error", "prefer-top-level-if-only-type-imports"],
266
+ "import/default": "error",
267
+ "import/export": "error",
268
+ "import/exports-last": "error",
269
+ "import/extensions": ["error", "ignorePackages"],
270
+ "import/first": "error",
271
+ "import/named": "error",
272
+ "import/namespace": "error",
273
+ "import/newline-after-import": "error",
274
+ "import/no-absolute-path": "error",
275
+ "import/no-amd": "error",
276
+ "import/no-anonymous-default-export": "error",
277
+ "import/no-commonjs": "error",
278
+ "import/no-cycle": "error",
279
+ "import/no-duplicates": ["error", { preferInline: true }],
280
+ "import/no-dynamic-require": "error",
281
+ "import/no-empty-named-blocks": "error",
282
+ "import/no-mutable-exports": "error",
283
+ "import/no-named-as-default": "error",
284
+ "import/no-named-as-default-member": "error",
285
+ "import/no-named-default": "error",
286
+ "import/no-namespace": ["error", { ignore: ["valibot"] }],
287
+ "import/no-nodejs-modules": "error",
288
+ "import/no-self-import": "error",
289
+ "import/no-unassigned-import": ["error", { allow: ["**/*.css"] }],
290
+ "import/no-webpack-loader-syntax": "error",
291
+ "import/unambiguous": "error"
292
+ };
293
+ // src/lint/rules/javascript.ts
294
+ const javascriptRules = {
295
+ "eslint/accessor-pairs": "error",
296
+ "eslint/array-callback-return": "error",
297
+ "eslint/arrow-body-style": ["error", "as-needed"],
298
+ "eslint/block-scoped-var": "error",
299
+ "eslint/complexity": ["error", { max: 20 }],
300
+ "eslint/constructor-super": "error",
301
+ "eslint/curly": ["error", "multi-line"],
302
+ "eslint/default-case-last": "error",
303
+ "eslint/default-param-last": "error",
304
+ "eslint/eqeqeq": ["error", "always"],
305
+ "eslint/for-direction": "error",
306
+ "eslint/func-names": ["error", "always"],
307
+ "eslint/getter-return": "error",
308
+ "eslint/grouped-accessor-pairs": "error",
309
+ "eslint/guard-for-in": "error",
310
+ "eslint/logical-assignment-operators": [
311
+ "error",
312
+ "always",
313
+ { enforceForIfStatements: true }
314
+ ],
315
+ "eslint/max-depth": ["error", { max: 4 }],
316
+ "eslint/max-lines": ["warn", {
317
+ max: 800,
318
+ skipBlankLines: true,
319
+ skipComments: true
320
+ }],
321
+ "eslint/max-lines-per-function": ["warn", {
322
+ max: 200,
323
+ skipBlankLines: true,
324
+ skipComments: true
325
+ }],
326
+ "eslint/max-nested-callbacks": ["warn", { max: 3 }],
327
+ "eslint/max-params": ["error", { max: 2 }],
328
+ "eslint/no-array-constructor": "error",
329
+ "eslint/no-async-promise-executor": "error",
330
+ "eslint/no-caller": "error",
331
+ "eslint/no-case-declarations": "error",
332
+ "eslint/no-class-assign": "error",
333
+ "eslint/no-compare-neg-zero": "error",
334
+ "eslint/no-cond-assign": "error",
335
+ "eslint/no-console": ["warn", { allow: ["warn", "error"] }],
336
+ "eslint/no-const-assign": "error",
337
+ "eslint/no-constant-binary-expression": "error",
338
+ "eslint/no-constant-condition": "error",
339
+ "eslint/no-constructor-return": "error",
340
+ "eslint/no-control-regex": "error",
341
+ "eslint/no-debugger": "error",
342
+ "eslint/no-delete-var": "error",
343
+ "eslint/no-div-regex": "error",
344
+ "eslint/no-dupe-class-members": "error",
345
+ "eslint/no-dupe-else-if": "error",
346
+ "eslint/no-dupe-keys": "error",
347
+ "eslint/no-duplicate-case": "error",
348
+ "eslint/no-else-return": "error",
349
+ "eslint/no-empty": ["error", { allowEmptyCatch: false }],
350
+ "eslint/no-empty-character-class": "error",
351
+ "eslint/no-empty-function": "error",
352
+ "eslint/no-empty-pattern": "error",
353
+ "eslint/no-empty-static-block": "error",
354
+ "eslint/no-eq-null": "error",
355
+ "eslint/no-eval": "error",
356
+ "eslint/no-ex-assign": "error",
357
+ "eslint/no-extend-native": "error",
358
+ "eslint/no-extra-bind": "error",
359
+ "eslint/no-extra-boolean-cast": "error",
360
+ "eslint/no-extra-label": "error",
361
+ "eslint/no-fallthrough": "error",
362
+ "eslint/no-func-assign": "error",
363
+ "eslint/no-global-assign": "error",
364
+ "eslint/no-implicit-coercion": "error",
365
+ "eslint/no-implicit-globals": "error",
366
+ "eslint/no-implied-eval": "error",
367
+ "eslint/no-import-assign": "error",
368
+ "eslint/no-inline-comments": "error",
369
+ "eslint/no-inner-declarations": "error",
370
+ "eslint/no-invalid-regexp": "error",
371
+ "eslint/no-irregular-whitespace": "error",
372
+ "eslint/no-iterator": "error",
373
+ "eslint/no-label-var": "error",
374
+ "eslint/no-labels": "error",
375
+ "eslint/no-lone-blocks": "error",
376
+ "eslint/no-lonely-if": "error",
377
+ "eslint/no-loop-func": "error",
378
+ "eslint/no-loss-of-precision": "error",
379
+ "eslint/no-magic-numbers": ["error", {
380
+ ignore: [
381
+ -1,
382
+ 0,
383
+ 1
384
+ ],
385
+ ignoreNumericLiteralTypes: true,
386
+ ignoreDefaultValues: true,
387
+ ignoreArrayIndexes: true
388
+ }],
389
+ "eslint/no-misleading-character-class": "error",
390
+ "eslint/no-multi-assign": "error",
391
+ "eslint/no-multi-str": "error",
392
+ "eslint/no-negated-condition": "error",
393
+ "eslint/no-nested-ternary": "error",
394
+ "eslint/no-new": "error",
395
+ "eslint/no-new-func": "error",
396
+ "eslint/no-new-native-nonconstructor": "error",
397
+ "eslint/no-new-wrappers": "error",
398
+ "eslint/no-nonoctal-decimal-escape": "error",
399
+ "eslint/no-obj-calls": "error",
400
+ "eslint/no-object-constructor": "error",
401
+ "eslint/no-param-reassign": "error",
402
+ "eslint/no-plusplus": "error",
403
+ "eslint/no-promise-executor-return": "error",
404
+ "eslint/no-proto": "error",
405
+ "eslint/no-prototype-builtins": "error",
406
+ "eslint/no-redeclare": "error",
407
+ "eslint/no-regex-spaces": "error",
408
+ "eslint/no-restricted-imports": ["error", { patterns: [RELATIVE_IMPORT_RESTRICTION] }],
409
+ "eslint/no-return-assign": "error",
410
+ "eslint/no-script-url": "error",
411
+ "eslint/no-self-assign": "error",
412
+ "eslint/no-self-compare": "error",
413
+ "eslint/no-sequences": "error",
414
+ "eslint/no-setter-return": "error",
415
+ "eslint/no-shadow": "error",
416
+ "eslint/no-shadow-restricted-names": "error",
417
+ "eslint/no-sparse-arrays": "error",
418
+ "eslint/no-template-curly-in-string": "error",
419
+ "eslint/no-this-before-super": "error",
420
+ "eslint/no-throw-literal": "error",
421
+ "eslint/no-undef": "error",
422
+ "eslint/no-underscore-dangle": "error",
423
+ "eslint/no-unexpected-multiline": "error",
424
+ "eslint/no-unmodified-loop-condition": "error",
425
+ "eslint/no-unneeded-ternary": "error",
426
+ "eslint/no-unreachable": "error",
427
+ "eslint/no-unreachable-loop": "error",
428
+ "eslint/no-unsafe-finally": "error",
429
+ "eslint/no-unsafe-negation": "error",
430
+ "eslint/no-unsafe-optional-chaining": "error",
431
+ "eslint/no-unused-expressions": "error",
432
+ "eslint/no-unused-labels": "error",
433
+ "eslint/no-unused-private-class-members": "error",
434
+ "eslint/no-unused-vars": "error",
435
+ "eslint/no-use-before-define": "error",
436
+ "eslint/no-useless-assignment": "error",
437
+ "eslint/no-useless-backreference": "error",
438
+ "eslint/no-useless-call": "error",
439
+ "eslint/no-useless-catch": "error",
440
+ "eslint/no-useless-computed-key": "error",
441
+ "eslint/no-useless-concat": "error",
442
+ "eslint/no-useless-constructor": "error",
443
+ "eslint/no-useless-escape": "error",
444
+ "eslint/no-useless-rename": "error",
445
+ "eslint/no-useless-return": "error",
446
+ "eslint/no-var": "error",
447
+ "eslint/no-with": "error",
448
+ "eslint/object-shorthand": "error",
449
+ "eslint/operator-assignment": "error",
450
+ "eslint/prefer-arrow-callback": ["error", {
451
+ allowNamedFunctions: true,
452
+ allowUnboundThis: true
453
+ }],
454
+ "eslint/prefer-const": "error",
455
+ "eslint/prefer-destructuring": "error",
456
+ "eslint/prefer-exponentiation-operator": "error",
457
+ "eslint/prefer-named-capture-group": "error",
458
+ "eslint/prefer-numeric-literals": "error",
459
+ "eslint/prefer-object-has-own": "error",
460
+ "eslint/prefer-object-spread": "error",
461
+ "eslint/prefer-promise-reject-errors": "error",
462
+ "eslint/prefer-regex-literals": "error",
463
+ "eslint/prefer-rest-params": "error",
464
+ "eslint/prefer-spread": "error",
465
+ "eslint/prefer-template": "error",
466
+ "eslint/preserve-caught-error": "error",
467
+ "eslint/radix": "error",
468
+ "eslint/require-unicode-regexp": "error",
469
+ "eslint/require-yield": "error",
470
+ "eslint/symbol-description": "error",
471
+ "eslint/unicode-bom": "error",
472
+ "eslint/use-isnan": "error",
473
+ "eslint/valid-typeof": "error",
474
+ "eslint/vars-on-top": "error",
475
+ "eslint/yoda": "error"
476
+ };
477
+ // src/lint/rules/testing.ts
478
+ const testRules = {
479
+ "vitest/consistent-each-for": "error",
480
+ "vitest/consistent-test-filename": "error",
481
+ "vitest/consistent-test-it": ["error", { fn: "it" }],
482
+ "vitest/consistent-vitest-vi": "error",
483
+ "vitest/expect-expect": "error",
484
+ "vitest/hoisted-apis-on-top": "error",
485
+ "vitest/max-expects": "error",
486
+ "vitest/max-nested-describe": "error",
487
+ "vitest/no-alias-methods": "error",
488
+ "vitest/no-commented-out-tests": "error",
489
+ "vitest/no-conditional-expect": "error",
490
+ "vitest/no-conditional-tests": "error",
491
+ "vitest/no-disabled-tests": "error",
492
+ "vitest/no-duplicate-hooks": "error",
493
+ "vitest/no-focused-tests": "error",
494
+ "vitest/no-identical-title": "error",
495
+ "vitest/no-import-node-test": "error",
496
+ "vitest/no-interpolation-in-snapshots": "error",
497
+ "vitest/no-large-snapshots": "error",
498
+ "vitest/no-mocks-import": "error",
499
+ "vitest/no-standalone-expect": "error",
500
+ "vitest/no-test-prefixes": "error",
501
+ "vitest/no-test-return-statement": "error",
502
+ "vitest/no-unneeded-async-expect-function": "error",
503
+ "vitest/padding-around-after-all-blocks": "error",
504
+ "vitest/padding-around-test-blocks": "error",
505
+ "vitest/prefer-called-exactly-once-with": "error",
506
+ "vitest/prefer-called-once": "error",
507
+ "vitest/prefer-called-with": "error",
508
+ "vitest/prefer-comparison-matcher": "error",
509
+ "vitest/prefer-describe-function-title": "error",
510
+ "vitest/prefer-each": "error",
511
+ "vitest/prefer-equality-matcher": "error",
512
+ "vitest/prefer-expect-resolves": "error",
513
+ "vitest/prefer-expect-type-of": "error",
514
+ "vitest/prefer-hooks-in-order": "error",
515
+ "vitest/prefer-hooks-on-top": "error",
516
+ "vitest/prefer-import-in-mock": "error",
517
+ "vitest/prefer-lowercase-title": ["error", { allowedPrefixes: [
518
+ "API",
519
+ "CSP",
520
+ "CSS",
521
+ "DOM",
522
+ "HTML",
523
+ "HTTP",
524
+ "JSON",
525
+ "SEO",
526
+ "SSR",
527
+ "URL"
528
+ ] }],
529
+ "vitest/prefer-mock-promise-shorthand": "error",
530
+ "vitest/prefer-mock-return-shorthand": "error",
531
+ "vitest/prefer-snapshot-hint": "error",
532
+ "vitest/prefer-spy-on": "error",
533
+ "vitest/prefer-strict-boolean-matchers": "error",
534
+ "vitest/prefer-strict-equal": "error",
535
+ "vitest/prefer-to-be": "error",
536
+ "vitest/prefer-to-be-object": "error",
537
+ "vitest/prefer-to-contain": "error",
538
+ "vitest/prefer-to-have-been-called-times": "error",
539
+ "vitest/prefer-to-have-length": "error",
540
+ "vitest/prefer-todo": "error",
541
+ "vitest/require-awaited-expect-poll": "error",
542
+ "vitest/require-local-test-context-for-concurrent-snapshots": "error",
543
+ "vitest/require-mock-type-parameters": "error",
544
+ "vitest/require-to-throw-message": "error",
545
+ "vitest/require-top-level-describe": "error",
546
+ "vitest/valid-describe-callback": "error",
547
+ "vitest/valid-expect": "error",
548
+ "vitest/valid-expect-in-promise": "error",
549
+ "vitest/valid-title": "error",
550
+ "vitest/warn-todo": "error"
551
+ };
552
+ // src/lint/rules/typescript.ts
553
+ const typescriptRules = {
554
+ "typescript/adjacent-overload-signatures": "error",
555
+ "typescript/array-type": "error",
556
+ "typescript/await-thenable": "error",
557
+ "typescript/ban-ts-comment": "error",
558
+ "typescript/ban-tslint-comment": "error",
559
+ "typescript/ban-types": "error",
560
+ "typescript/class-literal-property-style": "error",
561
+ "typescript/consistent-generic-constructors": "error",
562
+ "typescript/consistent-indexed-object-style": "error",
563
+ "typescript/consistent-return": "error",
564
+ "typescript/consistent-type-assertions": "error",
565
+ "typescript/consistent-type-definitions": ["error", "type"],
566
+ "typescript/consistent-type-exports": "error",
567
+ "typescript/consistent-type-imports": ["error", {
568
+ prefer: "type-imports",
569
+ fixStyle: "inline-type-imports"
570
+ }],
571
+ "typescript/dot-notation": "error",
572
+ "typescript/explicit-member-accessibility": "error",
573
+ "typescript/explicit-module-boundary-types": "error",
574
+ "typescript/method-signature-style": "error",
575
+ "typescript/no-array-delete": "error",
576
+ "typescript/no-base-to-string": "error",
577
+ "typescript/no-confusing-non-null-assertion": "error",
578
+ "typescript/no-confusing-void-expression": ["error", { ignoreArrowShorthand: true }],
579
+ "typescript/no-deprecated": "error",
580
+ "typescript/no-duplicate-enum-values": "error",
581
+ "typescript/no-duplicate-type-constituents": "error",
582
+ "typescript/no-dynamic-delete": "error",
583
+ "typescript/no-empty-interface": "error",
584
+ "typescript/no-empty-object-type": "error",
585
+ "typescript/no-explicit-any": "error",
586
+ "typescript/no-extra-non-null-assertion": "error",
587
+ "typescript/no-extraneous-class": "error",
588
+ "typescript/no-floating-promises": "error",
589
+ "typescript/no-for-in-array": "error",
590
+ "typescript/no-implied-eval": "error",
591
+ "typescript/no-import-type-side-effects": "error",
592
+ "typescript/no-inferrable-types": "error",
593
+ "typescript/no-invalid-void-type": "error",
594
+ "typescript/no-meaningless-void-operator": "error",
595
+ "typescript/no-misused-new": "error",
596
+ "typescript/no-misused-promises": ["error", { checksVoidReturn: { attributes: false } }],
597
+ "typescript/no-misused-spread": "error",
598
+ "typescript/no-mixed-enums": "error",
599
+ "typescript/no-namespace": "error",
600
+ "typescript/no-non-null-asserted-nullish-coalescing": "error",
601
+ "typescript/no-non-null-asserted-optional-chain": "error",
602
+ "typescript/no-non-null-assertion": "error",
603
+ "typescript/no-redundant-type-constituents": "error",
604
+ "typescript/no-require-imports": "error",
605
+ "typescript/no-this-alias": "error",
606
+ "typescript/no-unnecessary-boolean-literal-compare": "error",
607
+ "typescript/no-unnecessary-condition": "error",
608
+ "typescript/no-unnecessary-parameter-property-assignment": "error",
609
+ "typescript/no-unnecessary-qualifier": "error",
610
+ "typescript/no-unnecessary-template-expression": "error",
611
+ "typescript/no-unnecessary-type-arguments": "error",
612
+ "typescript/no-unnecessary-type-assertion": "error",
613
+ "typescript/no-unnecessary-type-constraint": "error",
614
+ "typescript/no-unnecessary-type-conversion": "error",
615
+ "typescript/no-unnecessary-type-parameters": "error",
616
+ "typescript/no-unsafe-argument": "error",
617
+ "typescript/no-unsafe-assignment": "error",
618
+ "typescript/no-unsafe-call": "error",
619
+ "typescript/no-unsafe-declaration-merging": "error",
620
+ "typescript/no-unsafe-enum-comparison": "error",
621
+ "typescript/no-unsafe-function-type": "error",
622
+ "typescript/no-unsafe-member-access": "error",
623
+ "typescript/no-unsafe-return": "error",
624
+ "typescript/no-unsafe-type-assertion": "error",
625
+ "typescript/no-unsafe-unary-minus": "error",
626
+ "typescript/no-useless-default-assignment": "error",
627
+ "typescript/no-useless-empty-export": "error",
628
+ "typescript/no-var-requires": "error",
629
+ "typescript/no-wrapper-object-types": "error",
630
+ "typescript/non-nullable-type-assertion-style": "error",
631
+ "typescript/only-throw-error": "error",
632
+ "typescript/parameter-properties": "error",
633
+ "typescript/prefer-as-const": "error",
634
+ "typescript/prefer-enum-initializers": "error",
635
+ "typescript/prefer-find": "error",
636
+ "typescript/prefer-for-of": "error",
637
+ "typescript/prefer-function-type": "error",
638
+ "typescript/prefer-includes": "error",
639
+ "typescript/prefer-literal-enum-member": "error",
640
+ "typescript/prefer-namespace-keyword": "error",
641
+ "typescript/prefer-nullish-coalescing": "error",
642
+ "typescript/prefer-optional-chain": "error",
643
+ "typescript/prefer-promise-reject-errors": "error",
644
+ "typescript/prefer-readonly": "error",
645
+ "typescript/prefer-reduce-type-parameter": "error",
646
+ "typescript/prefer-regexp-exec": "error",
647
+ "typescript/prefer-return-this-type": "error",
648
+ "typescript/prefer-string-starts-ends-with": "error",
649
+ "typescript/prefer-ts-expect-error": "error",
650
+ "typescript/related-getter-setter-pairs": "error",
651
+ "typescript/require-array-sort-compare": "error",
652
+ "typescript/require-await": "error",
653
+ "typescript/restrict-plus-operands": "error",
654
+ "typescript/restrict-template-expressions": "error",
655
+ "typescript/return-await": "error",
656
+ "typescript/strict-boolean-expressions": ["error", {
657
+ allowNullableBoolean: true,
658
+ allowNullableString: true,
659
+ allowNullableNumber: true
660
+ }],
661
+ "typescript/switch-exhaustiveness-check": "error",
662
+ "typescript/triple-slash-reference": "error",
663
+ "typescript/unbound-method": "error",
664
+ "typescript/unified-signatures": "error",
665
+ "typescript/use-unknown-in-catch-callback-variable": "error"
666
+ };
667
+ // src/lint/rules/unicorn.ts
668
+ const unicornRules = {
669
+ "unicorn/catch-error-name": "error",
670
+ "unicorn/consistent-assert": "error",
671
+ "unicorn/consistent-date-clone": "error",
672
+ "unicorn/consistent-empty-array-spread": "error",
673
+ "unicorn/consistent-existence-index-check": "error",
674
+ "unicorn/consistent-function-scoping": "error",
675
+ "unicorn/consistent-template-literal-escape": "error",
676
+ "unicorn/custom-error-definition": "error",
677
+ "unicorn/empty-brace-spaces": "error",
678
+ "unicorn/error-message": "error",
679
+ "unicorn/escape-case": "error",
680
+ "unicorn/explicit-length-check": "error",
681
+ "unicorn/explicit-timer-delay": "error",
682
+ "unicorn/filename-case": "error",
683
+ "unicorn/import-style": "error",
684
+ "unicorn/max-nested-calls": "error",
685
+ "unicorn/new-for-builtins": "error",
686
+ "unicorn/no-abusive-eslint-disable": "error",
687
+ "unicorn/no-accessor-recursion": "error",
688
+ "unicorn/no-anonymous-default-export": "error",
689
+ "unicorn/no-array-callback-reference": "error",
690
+ "unicorn/no-array-fill-with-reference-type": "error",
691
+ "unicorn/no-array-method-this-argument": "error",
692
+ "unicorn/no-array-reduce": "error",
693
+ "unicorn/no-array-reverse": "error",
694
+ "unicorn/no-array-sort": "error",
695
+ "unicorn/no-await-expression-member": "error",
696
+ "unicorn/no-await-in-promise-methods": "error",
697
+ "unicorn/no-confusing-array-with": "error",
698
+ "unicorn/no-console-spaces": "error",
699
+ "unicorn/no-document-cookie": "error",
700
+ "unicorn/no-empty-file": "error",
701
+ "unicorn/no-hex-escape": "error",
702
+ "unicorn/no-immediate-mutation": "error",
703
+ "unicorn/no-instanceof-array": "error",
704
+ "unicorn/no-instanceof-builtins": "error",
705
+ "unicorn/no-invalid-fetch-options": "error",
706
+ "unicorn/no-invalid-remove-event-listener": "error",
707
+ "unicorn/no-length-as-slice-end": "error",
708
+ "unicorn/no-lonely-if": "error",
709
+ "unicorn/no-magic-array-flat-depth": "error",
710
+ "unicorn/no-negation-in-equality-check": "error",
711
+ "unicorn/no-new-array": "error",
712
+ "unicorn/no-new-buffer": "error",
713
+ "unicorn/no-object-as-default-parameter": "error",
714
+ "unicorn/no-process-exit": "error",
715
+ "unicorn/no-single-promise-in-promise-methods": "error",
716
+ "unicorn/no-static-only-class": "error",
717
+ "unicorn/no-thenable": "error",
718
+ "unicorn/no-this-assignment": "error",
719
+ "unicorn/no-typeof-undefined": "error",
720
+ "unicorn/no-unnecessary-array-flat-depth": "error",
721
+ "unicorn/no-unnecessary-array-splice-count": "error",
722
+ "unicorn/no-unnecessary-await": "error",
723
+ "unicorn/no-unnecessary-slice-end": "error",
724
+ "unicorn/no-unreadable-array-destructuring": "error",
725
+ "unicorn/no-unreadable-iife": "error",
726
+ "unicorn/no-useless-collection-argument": "error",
727
+ "unicorn/no-useless-error-capture-stack-trace": "error",
728
+ "unicorn/no-useless-fallback-in-spread": "error",
729
+ "unicorn/no-useless-iterator-to-array": "error",
730
+ "unicorn/no-useless-length-check": "error",
731
+ "unicorn/no-useless-promise-resolve-reject": "error",
732
+ "unicorn/no-useless-spread": "error",
733
+ "unicorn/no-useless-switch-case": "error",
734
+ "unicorn/no-useless-undefined": "error",
735
+ "unicorn/no-zero-fractions": "error",
736
+ "unicorn/number-literal-case": "error",
737
+ "unicorn/numeric-separators-style": "error",
738
+ "unicorn/prefer-add-event-listener": "error",
739
+ "unicorn/prefer-array-find": "error",
740
+ "unicorn/prefer-array-flat": "error",
741
+ "unicorn/prefer-array-flat-map": "error",
742
+ "unicorn/prefer-array-index-of": "error",
743
+ "unicorn/prefer-array-some": "error",
744
+ "unicorn/prefer-at": "error",
745
+ "unicorn/prefer-bigint-literals": "error",
746
+ "unicorn/prefer-blob-reading-methods": "error",
747
+ "unicorn/prefer-class-fields": "error",
748
+ "unicorn/prefer-classlist-toggle": "error",
749
+ "unicorn/prefer-code-point": "error",
750
+ "unicorn/prefer-date-now": "error",
751
+ "unicorn/prefer-default-parameters": "error",
752
+ "unicorn/prefer-dom-node-append": "error",
753
+ "unicorn/prefer-dom-node-dataset": "error",
754
+ "unicorn/prefer-dom-node-remove": "error",
755
+ "unicorn/prefer-dom-node-text-content": "error",
756
+ "unicorn/prefer-event-target": "error",
757
+ "unicorn/prefer-export-from": "error",
758
+ "unicorn/prefer-global-this": "error",
759
+ "unicorn/prefer-import-meta-properties": "error",
760
+ "unicorn/prefer-includes": "error",
761
+ "unicorn/prefer-keyboard-event-key": "error",
762
+ "unicorn/prefer-logical-operator-over-ternary": "error",
763
+ "unicorn/prefer-math-min-max": "error",
764
+ "unicorn/prefer-math-trunc": "error",
765
+ "unicorn/prefer-modern-dom-apis": "error",
766
+ "unicorn/prefer-modern-math-apis": "error",
767
+ "unicorn/prefer-module": "error",
768
+ "unicorn/prefer-native-coercion-functions": "error",
769
+ "unicorn/prefer-negative-index": "error",
770
+ "unicorn/prefer-node-protocol": "error",
771
+ "unicorn/prefer-number-coercion": "error",
772
+ "unicorn/prefer-number-properties": "error",
773
+ "unicorn/prefer-object-from-entries": "error",
774
+ "unicorn/prefer-optional-catch-binding": "error",
775
+ "unicorn/prefer-prototype-methods": "error",
776
+ "unicorn/prefer-query-selector": "error",
777
+ "unicorn/prefer-reflect-apply": "error",
778
+ "unicorn/prefer-regexp-test": "error",
779
+ "unicorn/prefer-response-static-json": "error",
780
+ "unicorn/prefer-set-has": "error",
781
+ "unicorn/prefer-set-size": "error",
782
+ "unicorn/prefer-single-call": "error",
783
+ "unicorn/prefer-spread": "error",
784
+ "unicorn/prefer-string-raw": "error",
785
+ "unicorn/prefer-string-replace-all": "error",
786
+ "unicorn/prefer-string-slice": "error",
787
+ "unicorn/prefer-string-starts-ends-with": "error",
788
+ "unicorn/prefer-string-trim-start-end": "error",
789
+ "unicorn/prefer-structured-clone": "error",
790
+ "unicorn/prefer-ternary": "error",
791
+ "unicorn/prefer-top-level-await": "error",
792
+ "unicorn/prefer-type-error": "error",
793
+ "unicorn/relative-url-style": "error",
794
+ "unicorn/require-array-join-separator": "error",
795
+ "unicorn/require-module-attributes": "error",
796
+ "unicorn/require-module-specifiers": "error",
797
+ "unicorn/require-number-to-fixed-digits-argument": "error",
798
+ "unicorn/require-post-message-target-origin": "error",
799
+ "unicorn/switch-case-braces": "error",
800
+ "unicorn/switch-case-break-position": "error",
801
+ "unicorn/text-encoding-identifier-case": "error",
802
+ "unicorn/throw-new-error": "error"
803
+ };
804
+ // src/lint.ts
805
+ const TEST_FILES = [
806
+ "**/*.test.{ts,tsx}",
807
+ "**/*.test-d.{ts,tsx}",
808
+ "**/tests/**"
809
+ ];
810
+ const lint = {
811
+ ignorePatterns: [
812
+ "public/**",
813
+ "src/assets/**",
814
+ "src/@types/routes.d.ts",
815
+ ".agents/**",
816
+ ".claude/**"
817
+ ],
818
+ categories: {
819
+ correctness: "off",
820
+ nursery: "off",
821
+ pedantic: "off",
822
+ perf: "off",
823
+ restriction: "off",
824
+ style: "off",
825
+ suspicious: "off"
826
+ },
827
+ jsPlugins: [
828
+ {
829
+ name: "project",
830
+ specifier: "@evertondgn/solid-tooling/project-plugin"
831
+ },
832
+ {
833
+ name: "backend",
834
+ specifier: "@evertondgn/solid-tooling/backend-plugin"
835
+ },
836
+ {
837
+ name: "architecture",
838
+ specifier: "@evertondgn/solid-tooling/architecture-plugin"
839
+ },
840
+ {
841
+ name: "paraglide",
842
+ specifier: "@inlang/paraglide-js/eslint"
843
+ },
844
+ {
845
+ name: "solid",
846
+ specifier: "@evertondgn/solid-tooling/solid-plugin"
847
+ },
848
+ {
849
+ name: "vite-plus",
850
+ specifier: "vite-plus/oxlint-plugin"
851
+ }
852
+ ],
853
+ options: {
854
+ typeAware: true,
855
+ typeCheck: true,
856
+ denyWarnings: true,
857
+ reportUnusedDisableDirectives: "error"
858
+ },
859
+ overrides: [
860
+ ...backendPolicy,
861
+ {
862
+ files: ["src/infra/server/**/index.ts"],
863
+ rules: { "import/no-unassigned-import": ["error", { allow: ["server-only"] }] }
864
+ },
865
+ {
866
+ files: [
867
+ "src/**/*.node.test.{ts,tsx}",
868
+ "src/tests/pages/**/*.e2e.test.ts",
869
+ "src/tests/helpers/readSiteOrigin/index.ts",
870
+ "src/tests/fixtures/e2e/routes/publication-probe/metrics.ts",
871
+ "src/infra/server/publicationScope/index.ts"
872
+ ],
873
+ rules: { "import/no-nodejs-modules": "off" }
874
+ },
875
+ {
876
+ files: [
877
+ "src/**/*.test.{ts,tsx}",
878
+ "src/**/*.test-d.{ts,tsx}",
879
+ "tooling/**/*.test.ts"
880
+ ],
881
+ rules: { "unicorn/filename-case": "off" }
882
+ },
883
+ {
884
+ files: [
885
+ "src/**/*.test.{ts,tsx}",
886
+ "src/tests/**/*.{ts,tsx}",
887
+ "tooling/**/__tests__/**/*.ts",
888
+ "tooling/i18n/i18nPlugin/index.ts",
889
+ "vite.config.ts"
890
+ ],
891
+ rules: { "eslint/max-params": "off" }
892
+ },
893
+ {
894
+ files: ["src/@types/icons.d.ts"],
895
+ rules: { "import/unambiguous": "off" }
896
+ },
897
+ {
898
+ files: ["src/**/*.tsx"],
899
+ rules: { "typescript/explicit-module-boundary-types": "off" }
900
+ },
901
+ {
902
+ files: [
903
+ "src/@types/solid.d.ts",
904
+ "src/@types/env.d.ts",
905
+ "src/@types/router.d.ts"
906
+ ],
907
+ rules: {
908
+ "import/no-unassigned-import": "off",
909
+ "typescript/consistent-type-definitions": "off"
910
+ }
911
+ },
912
+ {
913
+ files: TEST_FILES,
914
+ rules: {
915
+ "eslint/no-empty": "off",
916
+ "vitest/require-hook": "error"
917
+ }
918
+ },
919
+ {
920
+ files: ["tooling/**/*.ts"],
921
+ rules: { "vitest/no-import-node-test": "off" }
922
+ },
923
+ {
924
+ files: ["tooling/**/__tests__/**/*.ts"],
925
+ rules: {
926
+ "typescript/no-floating-promises": ["error", { allowForKnownSafeCalls: [{
927
+ from: "package",
928
+ package: "node:test",
929
+ name: [
930
+ "describe",
931
+ "it",
932
+ "test",
933
+ "suite"
934
+ ]
935
+ }] }],
936
+ "vitest/prefer-each": "off"
937
+ }
938
+ },
939
+ {
940
+ files: ["src/tests/pages/**/*.e2e.test.ts"],
941
+ rules: { "vitest/prefer-each": "off" }
942
+ },
943
+ {
944
+ files: ["**/*.{ts,tsx,mts,cts}"],
945
+ rules: { "eslint/no-undef": "off" }
946
+ },
947
+ {
948
+ files: ["vite.config.ts", "tooling/**/*.ts"],
949
+ rules: { "import/no-nodejs-modules": "off" }
950
+ },
951
+ {
952
+ files: ["src/App.tsx", "src/Document.tsx"],
953
+ rules: { "unicorn/filename-case": "off" }
954
+ },
955
+ {
956
+ files: ["src/tests/fixtures/e2e/middleware/index.ts", "src/middleware/localizeRequest/index.ts"],
957
+ rules: { "node/callback-return": "off" }
958
+ }
959
+ ],
960
+ plugins: [
961
+ "import",
962
+ "jsx-a11y",
963
+ "node",
964
+ "oxc",
965
+ "promise",
966
+ "typescript",
967
+ "unicorn",
968
+ "vitest"
969
+ ],
970
+ rules: {
971
+ ...environmentRules,
972
+ ...javascriptRules,
973
+ ...importRules,
974
+ ...typescriptRules,
975
+ ...unicornRules,
976
+ ...testRules
977
+ },
978
+ settings: {
979
+ "jsx-a11y": { attributes: { for: ["htmlFor", "for"] } },
980
+ solid: { version: 2 }
981
+ }
982
+ };
983
+ export { lint as t };