@nekoyasuii/config 0.2.0 → 0.2.1

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.
@@ -1,63 +1,51 @@
1
1
  // tools/oxlint/config/js-plugins/index.ts
2
2
  import { existsSync } from "node:fs";
3
3
  import path from "node:path";
4
+ import { defineConfig as defineConfig9 } from "oxlint";
5
+
6
+ // tools/oxlint/config/js-plugins/anti-slop.ts
4
7
  import { defineConfig } from "oxlint";
5
- var packageRoot = (() => {
6
- let dir = import.meta.dirname;
7
- while (!existsSync(path.join(dir, "tools", "oxlint")) && dir !== path.dirname(dir))
8
- dir = path.dirname(dir);
9
- return dir;
10
- })();
11
- var localPlugin = (relative) => path.join(packageRoot, relative);
12
- var reactDoctorRules = await import("oxlint-plugin-react-doctor").then(({ ALL_REACT_DOCTOR_RULES }) => ALL_REACT_DOCTOR_RULES).catch(() => null);
13
- var jsPluginEntries = [
14
- { name: "github", specifier: "eslint-plugin-github" },
15
- { name: "sonarjs", specifier: "eslint-plugin-sonarjs" },
16
- { name: "react-doctor", specifier: "oxlint-plugin-react-doctor" },
17
- { name: "tailwindcss", specifier: "oxlint-tailwindcss" },
18
- { name: "anti-slop", specifier: localPlugin("tools/oxlint/config/vendors/anti-slop.js") },
19
- {
20
- name: "no-comment-slop",
21
- specifier: localPlugin("tools/oxlint/config/vendors/no-comment-slop.js")
22
- },
23
- { name: "shadcn", specifier: localPlugin("tools/oxlint/config/vendors/shadcn.js") },
24
- { name: "lazuee", specifier: localPlugin("tools/oxlint/rules/index.js") }
25
- ];
26
- var jsPluginSettings2 = {
27
- "react-doctor": {
28
- portedRuleMode: "curated"
29
- }
30
- };
31
- var jsPlugins = [...jsPluginEntries];
32
- var PAGE_ROUTE_FILENAME_PATTERN = "^(?:\\[\\[\\.\\.\\.[a-z0-9-]+\\]\\]|\\[(?:\\.\\.\\.)?[a-z0-9-]+\\]|[a-z0-9-]+)+(?:\\.[a-z0-9-]+)?$";
33
- var config = defineConfig({
34
- jsPlugins,
35
- settings: jsPluginSettings2,
8
+ var antiSlopConfig = defineConfig({
36
9
  overrides: [
37
10
  {
38
- files: [
39
- "**/*.{test,spec,test-d,spec-d}.{ts,tsx,js,jsx}",
40
- "**/__tests__/**/*.{ts,tsx,js,jsx}"
41
- ],
42
- rules: {
43
- "sonarjs/no-duplicate-string": "off"
44
- }
45
- },
46
- {
47
- files: ["**/*.{ts,tsx}"],
48
- rules: {
49
- "lazuee/no-ts-accessibility": "error",
50
- "lazuee/interface-pascal-case": "error"
51
- }
52
- },
53
- {
54
- files: ["**/*.{ts,tsx,js,jsx}"],
11
+ files: ["scripts/**"],
55
12
  rules: {
56
- "lazuee/canonical-header-names": "off"
13
+ "anti-slop/no-unknown-parameters": "off",
14
+ "anti-slop/no-unsafe-dictionary-type": "off"
57
15
  }
58
- },
16
+ }
17
+ ],
18
+ rules: {
19
+ "anti-slop/no-chained-type-assertions": "error",
20
+ "anti-slop/no-conditional-empty-object-spread": "error",
21
+ "anti-slop/no-known-value-widening": "error",
22
+ "anti-slop/no-module-mocking": "error",
23
+ "anti-slop/no-object-parameters": "error",
24
+ "anti-slop/no-reflect-apply": "error",
25
+ "anti-slop/no-reflect-get": "error",
26
+ "anti-slop/no-runtime-typeof": ["error", { allowInTypeGuards: true }],
27
+ "anti-slop/no-shape-in-symbol-names": "error",
28
+ "anti-slop/no-unknown-parameters": "error",
29
+ "anti-slop/no-unknown-returns": "error",
30
+ "anti-slop/no-unknown-type-aliases": "error",
31
+ "anti-slop/no-unsafe-dictionary-type": "error",
32
+ "anti-slop/no-widen-then-assert": "error",
33
+ "anti-slop/require-safety-comment-for-type-assertion": "error",
34
+ "typescript/consistent-indexed-object-style": "off",
35
+ "unicorn/no-immediate-mutation": "off"
36
+ }
37
+ });
38
+
39
+ // tools/shared/route-filenames.ts
40
+ var ROUTE_FILE_GLOB = "**/routes/**/*.{js,jsx,ts,tsx}";
41
+ var PAGE_ROUTE_FILENAME_PATTERN = "^_?(?:\\[\\[\\.\\.\\.[a-z0-9-]+\\]\\]|\\[(?:\\.\\.\\.)?[a-z0-9-]+\\]|[a-z0-9-]+)+(?:\\.[a-z0-9-]+)?$";
42
+
43
+ // tools/oxlint/config/js-plugins/github.ts
44
+ import { defineConfig as defineConfig2 } from "oxlint";
45
+ var githubConfig = defineConfig2({
46
+ overrides: [
59
47
  {
60
- files: ["**/routes/**/*.{tsx,ts}", "**/app/routes/**/*.{tsx,ts}"],
48
+ files: [ROUTE_FILE_GLOB],
61
49
  rules: {
62
50
  "github/filenames-match-regex": "off"
63
51
  }
@@ -67,25 +55,6 @@ var config = defineConfig({
67
55
  rules: {
68
56
  "github/filenames-match-regex": ["error", PAGE_ROUTE_FILENAME_PATTERN]
69
57
  }
70
- },
71
- {
72
- files: ["**/components/**/*.{tsx,jsx}"],
73
- rules: {
74
- "shadcn/no-restyle": "off",
75
- "shadcn/no-arbitrary-values": "off",
76
- "shadcn/require-static-classes": "off"
77
- }
78
- },
79
- {
80
- files: ["**/logo.tsx"],
81
- rules: { "shadcn/no-raw-colors": "off" }
82
- },
83
- {
84
- files: ["scripts/**"],
85
- rules: {
86
- "anti-slop/no-unknown-parameters": "off",
87
- "anti-slop/no-unsafe-dictionary-type": "off"
88
- }
89
58
  }
90
59
  ],
91
60
  rules: {
@@ -112,10 +81,309 @@ var config = defineConfig({
112
81
  "github/no-useless-passive": "error",
113
82
  "github/prefer-observers": "error",
114
83
  "github/require-passive-events": "error",
115
- "github/unescaped-html-literal": "off",
84
+ "github/unescaped-html-literal": "off"
85
+ }
86
+ });
87
+
88
+ // tools/oxlint/config/js-plugins/lazuee.ts
89
+ import { defineConfig as defineConfig3 } from "oxlint";
90
+ var lazueeConfig = defineConfig3({
91
+ overrides: [
92
+ {
93
+ files: ["**/*.{ts,tsx}"],
94
+ rules: {
95
+ "lazuee/interface-pascal-case": "error",
96
+ "lazuee/no-ts-accessibility": "error"
97
+ }
98
+ },
99
+ {
100
+ files: ["**/*.{ts,tsx,js,jsx}"],
101
+ rules: {
102
+ "lazuee/canonical-header-names": "off"
103
+ }
104
+ }
105
+ ],
106
+ rules: {
107
+ "lazuee/canonical-header-names": "off",
108
+ "lazuee/interface-pascal-case": "off",
109
+ "lazuee/no-ts-accessibility": "off",
110
+ "lazuee/prefer-alias": "error"
111
+ }
112
+ });
113
+
114
+ // tools/oxlint/config/js-plugins/no-comment-slop.ts
115
+ import { defineConfig as defineConfig4 } from "oxlint";
116
+ var noCommentSlopConfig = defineConfig4({
117
+ rules: {
118
+ "no-comment-slop/max-comment-lines": "error",
119
+ "no-comment-slop/multiline-jsdoc-format": "error",
120
+ "no-comment-slop/no-banner-comment": "error",
121
+ "no-comment-slop/no-em-dash": "error",
122
+ "no-comment-slop/no-foreign-syntax": "error",
123
+ "no-comment-slop/no-jargon": "error",
124
+ "no-comment-slop/no-trailing-comment": "error",
125
+ "no-comment-slop/no-trailing-period": "error",
126
+ "no-comment-slop/prefer-jsdoc-for-exports": "error",
127
+ "no-comment-slop/prefer-jsdoc-for-members": "error",
128
+ "no-comment-slop/require-member-docs": "error"
129
+ }
130
+ });
131
+
132
+ // tools/oxlint/config/js-plugins/react-doctor.ts
133
+ import { defineConfig as defineConfig5 } from "oxlint";
134
+ var reactDoctorRules = await import("oxlint-plugin-react-doctor").then(({ ALL_REACT_DOCTOR_RULES }) => ALL_REACT_DOCTOR_RULES).catch(() => null);
135
+ var reactDoctorConfig = defineConfig5({
136
+ rules: {
137
+ ...reactDoctorRules,
138
+ "react-doctor/activity-wraps-effect-heavy-subtree": "error",
139
+ "react-doctor/advanced-event-handler-refs": "error",
140
+ "react-doctor/async-await-in-loop": "error",
141
+ "react-doctor/async-defer-await": "error",
142
+ "react-doctor/async-parallel": "error",
143
+ "react-doctor/auth-token-in-web-storage": "error",
144
+ "react-doctor/client-localstorage-no-version": "error",
145
+ "react-doctor/client-passive-event-listeners": "error",
146
+ "react-doctor/dialog-has-accessible-name": "error",
147
+ "react-doctor/effect-needs-cleanup": "error",
148
+ "react-doctor/hooks-no-nan-in-deps": "error",
149
+ "react-doctor/html-no-invalid-paragraph-child": "error",
150
+ "react-doctor/html-no-invalid-table-nesting": "error",
151
+ "react-doctor/html-no-nested-interactive": "error",
152
+ "react-doctor/jotai-derived-atom-returns-fresh-object": "error",
153
+ "react-doctor/jotai-select-atom-in-render-body": "error",
154
+ "react-doctor/jotai-tq-use-raw-query-atom": "error",
155
+ "react-doctor/js-async-reduce-without-awaited-acc": "error",
156
+ "react-doctor/js-batch-dom-css": "error",
157
+ "react-doctor/js-cache-property-access": "error",
158
+ "react-doctor/js-cache-storage": "error",
159
+ "react-doctor/js-combine-iterations": "error",
160
+ "react-doctor/js-early-exit": "error",
161
+ "react-doctor/js-flatmap-filter": "error",
162
+ "react-doctor/js-hoist-intl": "error",
163
+ "react-doctor/js-hoist-regexp": "error",
164
+ "react-doctor/js-index-maps": "error",
165
+ "react-doctor/js-length-check-first": "error",
166
+ "react-doctor/js-min-max-loop": "error",
167
+ "react-doctor/js-set-map-lookups": "error",
168
+ "react-doctor/js-tosorted-immutable": "error",
169
+ "react-doctor/no-adjust-state-on-prop-change": "error",
170
+ "react-doctor/no-array-index-as-key": "error",
171
+ "react-doctor/no-async-effect-callback": "error",
172
+ "react-doctor/no-barrel-import": "error",
173
+ "react-doctor/no-call-component-as-function": "error",
174
+ "react-doctor/no-cascading-set-state": "error",
175
+ "react-doctor/no-chain-state-updates": "error",
176
+ "react-doctor/no-create-context-in-render": "error",
177
+ "react-doctor/no-create-ref-in-function-component": "error",
178
+ "react-doctor/no-create-store-in-render": "error",
179
+ "react-doctor/no-derived-state": "error",
180
+ "react-doctor/no-derived-state-effect": "error",
181
+ "react-doctor/no-derived-useState": "error",
182
+ "react-doctor/no-direct-state-mutation": "error",
183
+ "react-doctor/no-disabled-zoom": "error",
184
+ "react-doctor/no-document-start-view-transition": "error",
185
+ "react-doctor/no-document-write": "error",
186
+ "react-doctor/no-dynamic-import-path": "error",
187
+ "react-doctor/no-effect-chain": "error",
188
+ "react-doctor/no-effect-event-handler": "error",
189
+ "react-doctor/no-effect-event-in-deps": "error",
190
+ "react-doctor/no-effect-with-fresh-deps": "error",
191
+ "react-doctor/no-eval": "error",
192
+ "react-doctor/no-event-handler": "error",
193
+ "react-doctor/no-event-trigger-state": "error",
194
+ "react-doctor/no-fetch-in-effect": "error",
195
+ "react-doctor/no-flush-sync": "error",
196
+ "react-doctor/no-full-lodash-import": "error",
197
+ "react-doctor/no-giant-component": "error",
198
+ "react-doctor/no-global-css-variable-animation": "error",
199
+ "react-doctor/no-gray-on-colored-background": "error",
200
+ "react-doctor/no-img-lazy-with-high-fetchpriority": "error",
201
+ "react-doctor/no-initialize-state": "error",
202
+ "react-doctor/no-inline-bounce-easing": "error",
203
+ "react-doctor/no-inline-exhaustive-style": "error",
204
+ "react-doctor/no-inline-prop-on-memo-component": "error",
205
+ "react-doctor/no-json-parse-stringify-clone": "error",
206
+ "react-doctor/no-jsx-element-type": "error",
207
+ "react-doctor/no-large-animated-blur": "error",
208
+ "react-doctor/no-layout-property-animation": "error",
209
+ "react-doctor/no-layout-transition-inline": "error",
210
+ "react-doctor/no-legacy-class-lifecycles": "error",
211
+ "react-doctor/no-legacy-context-api": "error",
212
+ "react-doctor/no-long-transition-duration": "error",
213
+ "react-doctor/no-many-boolean-props": "error",
214
+ "react-doctor/no-mirror-prop-effect": "error",
215
+ "react-doctor/no-moment": "error",
216
+ "react-doctor/no-mutable-in-deps": "error",
217
+ "react-doctor/no-mutating-reducer-state": "error",
218
+ "react-doctor/no-nested-component-definition": "error",
219
+ "react-doctor/no-outline-none": "error",
220
+ "react-doctor/no-pass-data-to-parent": "error",
221
+ "react-doctor/no-pass-live-state-to-parent": "error",
222
+ "react-doctor/no-permanent-will-change": "error",
223
+ "react-doctor/no-polymorphic-children": "error",
224
+ "react-doctor/no-prevent-default": "error",
225
+ "react-doctor/no-prop-callback-in-effect": "error",
226
+ "react-doctor/no-random-key": "error",
227
+ "react-doctor/no-react-dom-deprecated-apis": "error",
228
+ "react-doctor/no-react19-deprecated-apis": "error",
229
+ "react-doctor/no-render-in-render": "error",
230
+ "react-doctor/no-render-prop-children": "error",
231
+ "react-doctor/no-reset-all-state-on-prop-change": "error",
232
+ "react-doctor/no-scale-from-zero": "error",
233
+ "react-doctor/no-secrets-in-client-code": "error",
234
+ "react-doctor/no-self-updating-effect": "error",
235
+ "react-doctor/no-set-state-in-render": "error",
236
+ "react-doctor/no-string-false-on-boolean-attribute": "error",
237
+ "react-doctor/no-sync-xhr": "error",
238
+ "react-doctor/no-tiny-text": "error",
239
+ "react-doctor/no-transition-all": "error",
240
+ "react-doctor/no-uncontrolled-input": "error",
241
+ "react-doctor/no-undeferred-third-party": "error",
242
+ "react-doctor/no-usememo-simple-expression": "error",
243
+ "react-doctor/only-export-components": "error",
244
+ "react-doctor/prefer-dynamic-import": "error",
245
+ "react-doctor/prefer-explicit-variants": "error",
246
+ "react-doctor/prefer-html-dialog": "error",
247
+ "react-doctor/prefer-module-scope-pure-function": "error",
248
+ "react-doctor/prefer-module-scope-static-value": "error",
249
+ "react-doctor/prefer-stable-empty-fallback": "error",
250
+ "react-doctor/prefer-use-effect-event": "error",
251
+ "react-doctor/prefer-use-sync-external-store": "error",
252
+ "react-doctor/prefer-useReducer": "error",
253
+ "react-doctor/react-compiler-no-manual-memoization": "error",
254
+ "react-doctor/redux-useselector-inline-derivation": "error",
255
+ "react-doctor/redux-useselector-returns-new-collection": "error",
256
+ "react-doctor/rendering-animate-svg-wrapper": "error",
257
+ "react-doctor/rendering-conditional-render": "error",
258
+ "react-doctor/rendering-hoist-jsx": "error",
259
+ "react-doctor/rendering-hydration-mismatch-time": "error",
260
+ "react-doctor/rendering-hydration-no-flicker": "error",
261
+ "react-doctor/rendering-script-defer-async": "error",
262
+ "react-doctor/rendering-svg-precision": "error",
263
+ "react-doctor/rendering-usetransition-loading": "error",
264
+ "react-doctor/rerender-defer-reads-hook": "error",
265
+ "react-doctor/rerender-dependencies": "error",
266
+ "react-doctor/rerender-derived-state-from-hook": "error",
267
+ "react-doctor/rerender-functional-setstate": "error",
268
+ "react-doctor/rerender-lazy-ref-init": "error",
269
+ "react-doctor/rerender-lazy-state-init": "error",
270
+ "react-doctor/rerender-memo-before-early-return": "error",
271
+ "react-doctor/rerender-memo-with-default-value": "error",
272
+ "react-doctor/rerender-state-only-in-handlers": "error",
273
+ "react-doctor/rerender-transitions-scroll": "error",
274
+ "react-doctor/server-after-nonblocking": "error",
275
+ "react-doctor/server-auth-actions": "error",
276
+ "react-doctor/server-cache-with-object-literal": "error",
277
+ "react-doctor/server-dedup-props": "error",
278
+ "react-doctor/server-fetch-without-revalidate": "error",
279
+ "react-doctor/server-hoist-static-io": "error",
280
+ "react-doctor/server-no-mutable-module-state": "error",
281
+ "react-doctor/server-sequential-independent-await": "error",
282
+ "react-doctor/use-lazy-motion": "error",
283
+ "react-doctor/zod-v4-no-deprecated-error-apis": "error",
284
+ "react-doctor/zod-v4-no-deprecated-error-customization": "error",
285
+ "react-doctor/zod-v4-no-deprecated-schema-apis": "error",
286
+ "react-doctor/zod-v4-prefer-top-level-string-formats": "error"
287
+ },
288
+ settings: {
289
+ "react-doctor": {
290
+ portedRuleMode: "curated"
291
+ }
292
+ }
293
+ });
294
+
295
+ // tools/oxlint/config/js-plugins/shadcn.ts
296
+ import { defineConfig as defineConfig6 } from "oxlint";
297
+ var shadcnConfig = defineConfig6({
298
+ overrides: [
299
+ {
300
+ files: ["**/components/**/*.{tsx,jsx}"],
301
+ rules: {
302
+ "shadcn/no-arbitrary-values": "off",
303
+ "shadcn/no-restyle": "off",
304
+ "shadcn/require-static-classes": "off"
305
+ }
306
+ },
307
+ {
308
+ files: ["**/logo.tsx"],
309
+ rules: { "shadcn/no-raw-colors": "off" }
310
+ }
311
+ ],
312
+ rules: {
313
+ "shadcn/no-arbitrary-values": ["error", { allow: ["layout"] }],
314
+ "shadcn/no-inline-styles": [
315
+ "error",
316
+ {
317
+ allow: [
318
+ "left",
319
+ "top",
320
+ "width",
321
+ "height",
322
+ "background",
323
+ "backgroundColor",
324
+ "borderColor",
325
+ "color",
326
+ "gridTemplateColumns",
327
+ "paddingLeft"
328
+ ]
329
+ }
330
+ ],
331
+ "shadcn/no-raw-colors": "error",
332
+ "shadcn/no-restyle": [
333
+ "error",
334
+ {
335
+ allow: ["layout"],
336
+ contracts: [
337
+ {
338
+ allow: ["layout", "spacing"],
339
+ pattern: "(Content|Header|Footer|Group|Panel)$"
340
+ },
341
+ {
342
+ allow: ["layout", "spacing"],
343
+ pattern: "^Card(Action|Content|Description|Footer|Header|Title)?$"
344
+ },
345
+ { allow: ["layout", "shape"], pattern: "^Skeleton$" },
346
+ {
347
+ allow: ["layout", "bg-background", "shadow-none"],
348
+ pattern: "^InputGroup$"
349
+ },
350
+ { allow: ["layout", "hover:bg-transparent"], pattern: "^TableRow$" },
351
+ { allow: ["layout", "spacing"], pattern: "^Tabs$" },
352
+ { allow: ["layout", "border-*"], pattern: "^Sidebar$" },
353
+ {
354
+ allow: ["layout", "spacing"],
355
+ pattern: "^Sidebar(GroupContent|Header|Menu|MenuItem)$"
356
+ },
357
+ { allow: ["layout", "truncate"], pattern: "^BreadcrumbPage$" }
358
+ ]
359
+ }
360
+ ],
361
+ "shadcn/no-unknown-classes": "error",
362
+ "shadcn/require-static-classes": "error"
363
+ }
364
+ });
365
+
366
+ // tools/oxlint/config/js-plugins/sonarjs.ts
367
+ import { defineConfig as defineConfig7 } from "oxlint";
368
+ var sonarJSConfig = defineConfig7({
369
+ overrides: [
370
+ {
371
+ files: [
372
+ "**/*.{test,spec,test-d,spec-d}.{ts,tsx,js,jsx,mts,cts,mjs,cjs}",
373
+ "**/__tests__/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs}"
374
+ ],
375
+ rules: {
376
+ "sonarjs/no-duplicate-string": "off"
377
+ }
378
+ }
379
+ ],
380
+ rules: {
116
381
  "sonarjs/arguments-usage": "error",
117
382
  "sonarjs/array-constructor": "error",
118
383
  "sonarjs/arrow-function-convention": "off",
384
+ "sonarjs/assertions-in-test-cases": "error",
385
+ "sonarjs/async-test-assertions": "error",
386
+ "sonarjs/avoid-mutating-nested-properties-of-shallow-clones": "error",
119
387
  "sonarjs/aws-apigateway-public-api": "error",
120
388
  "sonarjs/aws-ec2-rds-dms-public": "error",
121
389
  "sonarjs/aws-ec2-unencrypted-ebs-volume": "error",
@@ -143,6 +411,7 @@ var config = defineConfig({
143
411
  "sonarjs/cognitive-complexity": ["error", 20],
144
412
  "sonarjs/comma-or-logical-or-case": "error",
145
413
  "sonarjs/comment-regex": "error",
414
+ "sonarjs/composite-assertions": "error",
146
415
  "sonarjs/constructor-for-side-effects": "error",
147
416
  "sonarjs/content-length": "error",
148
417
  "sonarjs/content-security-policy": "error",
@@ -156,6 +425,7 @@ var config = defineConfig({
156
425
  "sonarjs/dynamically-constructed-templates": "error",
157
426
  "sonarjs/elseif-without-else": "off",
158
427
  "sonarjs/encryption-secure-mode": "error",
428
+ "sonarjs/explicit-test-skip": "error",
159
429
  "sonarjs/expression-complexity": "error",
160
430
  "sonarjs/file-header": "off",
161
431
  "sonarjs/file-name-differ-from-class": "off",
@@ -170,6 +440,7 @@ var config = defineConfig({
170
440
  "sonarjs/generator-without-yield": "error",
171
441
  "sonarjs/hardcoded-secret-signatures": "error",
172
442
  "sonarjs/hashing": "error",
443
+ "sonarjs/hooks-before-test-cases": "error",
173
444
  "sonarjs/inconsistent-function-call": "error",
174
445
  "sonarjs/insecure-cookie": "error",
175
446
  "sonarjs/insecure-jwt-token": "error",
@@ -180,6 +451,7 @@ var config = defineConfig({
180
451
  "sonarjs/max-lines-per-function": "off",
181
452
  "sonarjs/max-switch-cases": "error",
182
453
  "sonarjs/max-union-size": "error",
454
+ "sonarjs/memoize-cache-key": "error",
183
455
  "sonarjs/misplaced-loop-counter": "error",
184
456
  "sonarjs/nested-control-flow": "off",
185
457
  "sonarjs/no-all-duplicated-branches": "error",
@@ -191,17 +463,27 @@ var config = defineConfig({
191
463
  "sonarjs/no-collapsible-if": "error",
192
464
  "sonarjs/no-commented-code": "error",
193
465
  "sonarjs/no-dead-store": "error",
466
+ "sonarjs/no-debounce-throttle-in-render": "error",
467
+ "sonarjs/no-debug-commands-in-ui-tests": "error",
468
+ "sonarjs/no-default-utility-imports": "error",
194
469
  "sonarjs/no-delete-var": "error",
195
470
  "sonarjs/no-duplicate-in-composite": "error",
471
+ "sonarjs/no-duplicate-parameterized-test-case": "error",
196
472
  "sonarjs/no-duplicate-string": "error",
473
+ "sonarjs/no-duplicate-test-title": "error",
197
474
  "sonarjs/no-duplicated-branches": "error",
198
475
  "sonarjs/no-element-overwrite": "error",
199
476
  "sonarjs/no-empty-collection": "error",
477
+ "sonarjs/no-empty-parameterized-test-dataset": "error",
200
478
  "sonarjs/no-empty-test-file": "error",
479
+ "sonarjs/no-empty-test-title": "error",
201
480
  "sonarjs/no-equals-in-for-termination": "error",
202
481
  "sonarjs/no-exclusive-tests": "error",
203
482
  "sonarjs/no-extra-arguments": "error",
204
483
  "sonarjs/no-fallthrough": "error",
484
+ "sonarjs/no-fixed-wait-in-tests": "error",
485
+ "sonarjs/no-floating-point-equality": "error",
486
+ "sonarjs/no-forced-browser-interaction": "error",
205
487
  "sonarjs/no-function-declaration-in-block": "error",
206
488
  "sonarjs/no-global-this": "error",
207
489
  "sonarjs/no-globals-shadowing": "error",
@@ -218,17 +500,21 @@ var config = defineConfig({
218
500
  "sonarjs/no-implicit-global": "error",
219
501
  "sonarjs/no-incomplete-assertions": "error",
220
502
  "sonarjs/no-internal-api-use": "error",
503
+ "sonarjs/no-interpolation-in-inline-snapshots": "error",
221
504
  "sonarjs/no-invariant-returns": "error",
222
505
  "sonarjs/no-inverted-boolean-check": "error",
223
506
  "sonarjs/no-labels": "error",
224
507
  "sonarjs/no-literal-call": "error",
225
508
  "sonarjs/no-mime-sniff": "error",
509
+ "sonarjs/no-mixed-completion-style": "error",
510
+ "sonarjs/no-mutate-reactive-state-in-updated-hook": "error",
226
511
  "sonarjs/no-nested-assignment": "error",
227
512
  "sonarjs/no-nested-conditional": "error",
228
- "sonarjs/no-nested-functions": "error",
513
+ "sonarjs/no-nested-functions": ["error", { threshold: 4 }],
229
514
  "sonarjs/no-nested-incdec": "error",
230
515
  "sonarjs/no-nested-switch": "error",
231
516
  "sonarjs/no-nested-template-literals": "error",
517
+ "sonarjs/no-networkidle-wait": "error",
232
518
  "sonarjs/no-os-command-from-path": "error",
233
519
  "sonarjs/no-parameter-reassignment": "error",
234
520
  "sonarjs/no-primitive-wrappers": "error",
@@ -243,6 +529,7 @@ var config = defineConfig({
243
529
  "sonarjs/no-skipped-tests": "error",
244
530
  "sonarjs/no-sonar-comments": "error",
245
531
  "sonarjs/no-table-as-layout": "error",
532
+ "sonarjs/no-trivial-assertions": "error",
246
533
  "sonarjs/no-undefined-assignment": "error",
247
534
  "sonarjs/no-unenclosed-multiline-block": "error",
248
535
  "sonarjs/no-uniq-key": "error",
@@ -255,15 +542,23 @@ var config = defineConfig({
255
542
  "sonarjs/no-useless-increment": "error",
256
543
  "sonarjs/no-useless-react-setstate": "error",
257
544
  "sonarjs/no-variable-usage-before-declaration": "error",
545
+ "sonarjs/no-vue-class-component": "error",
546
+ "sonarjs/no-vue-mixins": "error",
258
547
  "sonarjs/no-weak-cipher": "error",
259
548
  "sonarjs/no-weak-keys": "error",
260
549
  "sonarjs/no-wildcard-import": "error",
261
550
  "sonarjs/non-existent-operator": "error",
262
551
  "sonarjs/object-alt-content": "error",
552
+ "sonarjs/parameterized-tests": "error",
553
+ "sonarjs/prefer-cypress-should": "error",
263
554
  "sonarjs/prefer-default-last": "error",
555
+ "sonarjs/prefer-native-axios-alternative": "error",
556
+ "sonarjs/prefer-native-jquery-alternative": "error",
557
+ "sonarjs/prefer-native-lodash-alternative": "error",
264
558
  "sonarjs/prefer-object-literal": "error",
265
559
  "sonarjs/prefer-promise-shorthand": "error",
266
560
  "sonarjs/prefer-single-boolean-return": "error",
561
+ "sonarjs/prefer-specific-assertions": "error",
267
562
  "sonarjs/prefer-type-guard": "error",
268
563
  "sonarjs/prefer-while": "error",
269
564
  "sonarjs/production-debug": "error",
@@ -277,9 +572,13 @@ var config = defineConfig({
277
572
  "sonarjs/stable-tests": "error",
278
573
  "sonarjs/stateful-regex": "error",
279
574
  "sonarjs/strict-transport-security": "error",
575
+ "sonarjs/super-linear-regex": "error",
576
+ "sonarjs/synchronous-suite-callback": "error",
280
577
  "sonarjs/table-header": "error",
281
578
  "sonarjs/table-header-reference": "error",
282
579
  "sonarjs/test-check-exception": "error",
580
+ "sonarjs/testing-library-prefer-query-by-disappearance": "error",
581
+ "sonarjs/testing-library-query-assertion": "error",
283
582
  "sonarjs/todo-tag": "error",
284
583
  "sonarjs/too-many-break-or-continue-in-loop": "error",
285
584
  "sonarjs/unverified-certificate": "error",
@@ -288,169 +587,17 @@ var config = defineConfig({
288
587
  "sonarjs/updated-loop-counter": "error",
289
588
  "sonarjs/use-type-alias": "error",
290
589
  "sonarjs/variable-name": "error",
590
+ "sonarjs/vitest-mock-at-module-scope": "error",
291
591
  "sonarjs/weak-ssl": "error",
292
592
  "sonarjs/x-powered-by": "error",
293
- "sonarjs/xml-parser-xxe": "error",
294
- ...reactDoctorRules,
295
- "react-doctor/activity-wraps-effect-heavy-subtree": "error",
296
- "react-doctor/advanced-event-handler-refs": "error",
297
- "react-doctor/async-await-in-loop": "error",
298
- "react-doctor/async-defer-await": "error",
299
- "react-doctor/async-parallel": "error",
300
- "react-doctor/auth-token-in-web-storage": "error",
301
- "react-doctor/client-localstorage-no-version": "error",
302
- "react-doctor/client-passive-event-listeners": "error",
303
- "react-doctor/dialog-has-accessible-name": "error",
304
- "react-doctor/effect-needs-cleanup": "error",
305
- "react-doctor/hooks-no-nan-in-deps": "error",
306
- "react-doctor/html-no-invalid-paragraph-child": "error",
307
- "react-doctor/html-no-invalid-table-nesting": "error",
308
- "react-doctor/html-no-nested-interactive": "error",
309
- "react-doctor/jotai-derived-atom-returns-fresh-object": "error",
310
- "react-doctor/jotai-select-atom-in-render-body": "error",
311
- "react-doctor/jotai-tq-use-raw-query-atom": "error",
312
- "react-doctor/js-async-reduce-without-awaited-acc": "error",
313
- "react-doctor/js-batch-dom-css": "error",
314
- "react-doctor/js-cache-property-access": "error",
315
- "react-doctor/js-cache-storage": "error",
316
- "react-doctor/js-combine-iterations": "error",
317
- "react-doctor/js-early-exit": "error",
318
- "react-doctor/js-flatmap-filter": "error",
319
- "react-doctor/js-hoist-intl": "error",
320
- "react-doctor/js-hoist-regexp": "error",
321
- "react-doctor/js-index-maps": "error",
322
- "react-doctor/js-length-check-first": "error",
323
- "react-doctor/js-min-max-loop": "error",
324
- "react-doctor/js-set-map-lookups": "error",
325
- "react-doctor/js-tosorted-immutable": "error",
326
- "react-doctor/no-adjust-state-on-prop-change": "error",
327
- "react-doctor/no-array-index-as-key": "error",
328
- "react-doctor/no-async-effect-callback": "error",
329
- "react-doctor/no-barrel-import": "error",
330
- "react-doctor/no-call-component-as-function": "error",
331
- "react-doctor/no-cascading-set-state": "error",
332
- "react-doctor/no-chain-state-updates": "error",
333
- "react-doctor/no-create-context-in-render": "error",
334
- "react-doctor/no-create-ref-in-function-component": "error",
335
- "react-doctor/no-create-store-in-render": "error",
336
- "react-doctor/no-derived-state": "error",
337
- "react-doctor/no-derived-state-effect": "error",
338
- "react-doctor/no-derived-useState": "error",
339
- "react-doctor/no-direct-state-mutation": "error",
340
- "react-doctor/no-disabled-zoom": "error",
341
- "react-doctor/no-document-start-view-transition": "error",
342
- "react-doctor/no-document-write": "error",
343
- "react-doctor/no-dynamic-import-path": "error",
344
- "react-doctor/no-effect-chain": "error",
345
- "react-doctor/no-effect-event-handler": "error",
346
- "react-doctor/no-effect-event-in-deps": "error",
347
- "react-doctor/no-effect-with-fresh-deps": "error",
348
- "react-doctor/no-eval": "error",
349
- "react-doctor/no-event-handler": "error",
350
- "react-doctor/no-event-trigger-state": "error",
351
- "react-doctor/no-fetch-in-effect": "error",
352
- "react-doctor/no-flush-sync": "error",
353
- "react-doctor/no-full-lodash-import": "error",
354
- "react-doctor/no-giant-component": "error",
355
- "react-doctor/no-global-css-variable-animation": "error",
356
- "react-doctor/no-gray-on-colored-background": "error",
357
- "react-doctor/no-img-lazy-with-high-fetchpriority": "error",
358
- "react-doctor/no-initialize-state": "error",
359
- "react-doctor/no-inline-bounce-easing": "error",
360
- "react-doctor/no-inline-exhaustive-style": "error",
361
- "react-doctor/no-inline-prop-on-memo-component": "error",
362
- "react-doctor/no-json-parse-stringify-clone": "error",
363
- "react-doctor/no-jsx-element-type": "error",
364
- "react-doctor/no-large-animated-blur": "error",
365
- "react-doctor/no-layout-property-animation": "error",
366
- "react-doctor/no-layout-transition-inline": "error",
367
- "react-doctor/no-legacy-class-lifecycles": "error",
368
- "react-doctor/no-legacy-context-api": "error",
369
- "react-doctor/no-long-transition-duration": "error",
370
- "react-doctor/no-many-boolean-props": "error",
371
- "react-doctor/no-mirror-prop-effect": "error",
372
- "react-doctor/no-moment": "error",
373
- "react-doctor/no-mutable-in-deps": "error",
374
- "react-doctor/no-mutating-reducer-state": "error",
375
- "react-doctor/no-nested-component-definition": "error",
376
- "react-doctor/no-outline-none": "error",
377
- "react-doctor/no-pass-data-to-parent": "error",
378
- "react-doctor/no-pass-live-state-to-parent": "error",
379
- "react-doctor/no-permanent-will-change": "error",
380
- "react-doctor/no-polymorphic-children": "error",
381
- "react-doctor/no-prevent-default": "error",
382
- "react-doctor/no-prop-callback-in-effect": "error",
383
- "react-doctor/no-random-key": "error",
384
- "react-doctor/no-react-dom-deprecated-apis": "error",
385
- "react-doctor/no-react19-deprecated-apis": "error",
386
- "react-doctor/no-render-in-render": "error",
387
- "react-doctor/no-render-prop-children": "error",
388
- "react-doctor/no-reset-all-state-on-prop-change": "error",
389
- "react-doctor/no-scale-from-zero": "error",
390
- "react-doctor/no-secrets-in-client-code": "error",
391
- "react-doctor/no-self-updating-effect": "error",
392
- "react-doctor/no-set-state-in-render": "error",
393
- "react-doctor/no-string-false-on-boolean-attribute": "error",
394
- "react-doctor/no-sync-xhr": "error",
395
- "react-doctor/no-tiny-text": "error",
396
- "react-doctor/no-transition-all": "error",
397
- "react-doctor/no-uncontrolled-input": "error",
398
- "react-doctor/no-undeferred-third-party": "error",
399
- "react-doctor/no-usememo-simple-expression": "error",
400
- "react-doctor/prefer-dynamic-import": "error",
401
- "react-doctor/prefer-explicit-variants": "error",
402
- "react-doctor/prefer-html-dialog": "error",
403
- "react-doctor/prefer-module-scope-pure-function": "error",
404
- "react-doctor/prefer-module-scope-static-value": "error",
405
- "react-doctor/prefer-stable-empty-fallback": "error",
406
- "react-doctor/prefer-use-effect-event": "error",
407
- "react-doctor/prefer-use-sync-external-store": "error",
408
- "react-doctor/prefer-useReducer": "error",
409
- "react-doctor/react-compiler-no-manual-memoization": "error",
410
- "react-doctor/redux-useselector-inline-derivation": "error",
411
- "react-doctor/redux-useselector-returns-new-collection": "error",
412
- "react-doctor/rendering-animate-svg-wrapper": "error",
413
- "react-doctor/rendering-conditional-render": "error",
414
- "react-doctor/rendering-hoist-jsx": "error",
415
- "react-doctor/rendering-hydration-mismatch-time": "error",
416
- "react-doctor/rendering-hydration-no-flicker": "error",
417
- "react-doctor/rendering-script-defer-async": "error",
418
- "react-doctor/rendering-svg-precision": "error",
419
- "react-doctor/rendering-usetransition-loading": "error",
420
- "react-doctor/rerender-defer-reads-hook": "error",
421
- "react-doctor/rerender-dependencies": "error",
422
- "react-doctor/rerender-derived-state-from-hook": "error",
423
- "react-doctor/rerender-functional-setstate": "error",
424
- "react-doctor/rerender-lazy-ref-init": "error",
425
- "react-doctor/rerender-lazy-state-init": "error",
426
- "react-doctor/rerender-memo-before-early-return": "error",
427
- "react-doctor/rerender-memo-with-default-value": "error",
428
- "react-doctor/rerender-state-only-in-handlers": "error",
429
- "react-doctor/rerender-transitions-scroll": "error",
430
- "react-doctor/server-after-nonblocking": "error",
431
- "react-doctor/server-auth-actions": "error",
432
- "react-doctor/server-cache-with-object-literal": "error",
433
- "react-doctor/server-dedup-props": "error",
434
- "react-doctor/server-fetch-without-revalidate": "error",
435
- "react-doctor/server-hoist-static-io": "error",
436
- "react-doctor/server-no-mutable-module-state": "error",
437
- "react-doctor/server-sequential-independent-await": "error",
438
- "react-doctor/use-lazy-motion": "error",
439
- "react-doctor/zod-v4-no-deprecated-error-apis": "error",
440
- "react-doctor/zod-v4-no-deprecated-error-customization": "error",
441
- "react-doctor/zod-v4-no-deprecated-schema-apis": "error",
442
- "react-doctor/zod-v4-prefer-top-level-string-formats": "error",
443
- "react-doctor/react-in-jsx-scope": "off",
444
- "react-doctor/jsx-boolean-value": "off",
445
- "react-doctor/jsx-handler-names": "off",
446
- "react-doctor/jsx-props-no-spreading": "off",
447
- "react-doctor/nextjs-missing-metadata": "off",
448
- "react-doctor/nextjs-no-a-element": "off",
449
- "react-doctor/nextjs-no-img-element": "off",
450
- "react-doctor/preact-no-react-hooks-import": "off",
451
- "react-doctor/no-multi-comp": "off",
452
- "react-doctor/no-multi-component-file": "off",
453
- "react-doctor/only-export-components": "off",
593
+ "sonarjs/xml-parser-xxe": "error"
594
+ }
595
+ });
596
+
597
+ // tools/oxlint/config/js-plugins/tailwindcss.ts
598
+ import { defineConfig as defineConfig8 } from "oxlint";
599
+ var tailwindConfig = defineConfig8({
600
+ rules: {
454
601
  "tailwindcss/no-conflicting-classes": "error",
455
602
  "tailwindcss/no-deprecated-classes": "error",
456
603
  "tailwindcss/no-duplicate-classes": "warn",
@@ -460,107 +607,74 @@ var config = defineConfig({
460
607
  "tailwindcss/enforce-sort-order": "warn",
461
608
  "tailwindcss/consistent-variant-order": "warn",
462
609
  "tailwindcss/enforce-consistent-important-position": "warn",
463
- "tailwindcss/no-unnecessary-whitespace": "warn",
464
- "lazuee/prefer-alias": "error",
465
- "lazuee/no-ts-accessibility": "off",
466
- "lazuee/interface-pascal-case": "off",
467
- "lazuee/canonical-header-names": "off",
468
- "anti-slop/no-chained-type-assertions": "error",
469
- "anti-slop/no-conditional-empty-object-spread": "error",
470
- "anti-slop/no-known-value-widening": "error",
471
- "anti-slop/no-module-mocking": "error",
472
- "anti-slop/no-object-parameters": "error",
473
- "anti-slop/no-reflect-apply": "error",
474
- "anti-slop/no-reflect-get": "error",
475
- "anti-slop/no-runtime-typeof": ["error", { allowInTypeGuards: true }],
476
- "anti-slop/no-shape-in-symbol-names": "error",
477
- "anti-slop/no-unknown-parameters": "error",
478
- "anti-slop/no-unknown-returns": "error",
479
- "anti-slop/no-unknown-type-aliases": "error",
480
- "anti-slop/no-unsafe-dictionary-type": "error",
481
- "anti-slop/no-widen-then-assert": "error",
482
- "anti-slop/require-safety-comment-for-type-assertion": "error",
483
- "typescript/consistent-indexed-object-style": "off",
484
- "unicorn/no-immediate-mutation": "off",
485
- "no-comment-slop/max-comment-lines": "error",
486
- "no-comment-slop/no-banner-comment": "error",
487
- "no-comment-slop/no-trailing-comment": "error",
488
- "no-comment-slop/prefer-jsdoc-for-exports": "error",
489
- "no-comment-slop/prefer-jsdoc-for-members": "error",
490
- "no-comment-slop/require-member-docs": "error",
491
- "no-comment-slop/multiline-jsdoc-format": "error",
492
- "no-comment-slop/no-trailing-period": "error",
493
- "no-comment-slop/no-em-dash": "error",
494
- "no-comment-slop/no-jargon": "error",
495
- "no-comment-slop/no-foreign-syntax": "error",
496
- "shadcn/no-restyle": [
497
- "error",
498
- {
499
- allow: ["layout"],
500
- contracts: [
501
- {
502
- pattern: "(Content|Header|Footer|Group|Panel)$",
503
- allow: ["layout", "spacing"]
504
- },
505
- {
506
- pattern: "^Card(Action|Content|Description|Footer|Header|Title)?$",
507
- allow: ["layout", "spacing"]
508
- },
509
- { pattern: "^Skeleton$", allow: ["layout", "shape"] },
510
- {
511
- pattern: "^InputGroup$",
512
- allow: ["layout", "bg-background", "shadow-none"]
513
- },
514
- { pattern: "^TableRow$", allow: ["layout", "hover:bg-transparent"] },
515
- { pattern: "^Tabs$", allow: ["layout", "spacing"] },
516
- { pattern: "^Sidebar$", allow: ["layout", "border-*"] },
517
- {
518
- pattern: "^Sidebar(GroupContent|Header|Menu|MenuItem)$",
519
- allow: ["layout", "spacing"]
520
- },
521
- { pattern: "^BreadcrumbPage$", allow: ["layout", "truncate"] }
522
- ]
523
- }
524
- ],
525
- "shadcn/no-raw-colors": "error",
526
- "shadcn/no-arbitrary-values": ["error", { allow: ["layout"] }],
527
- "shadcn/no-inline-styles": [
528
- "error",
529
- {
530
- allow: [
531
- "left",
532
- "top",
533
- "width",
534
- "height",
535
- "background",
536
- "backgroundColor",
537
- "borderColor",
538
- "color",
539
- "gridTemplateColumns",
540
- "paddingLeft"
541
- ]
542
- }
543
- ],
544
- "shadcn/no-unknown-classes": "error",
545
- "shadcn/require-static-classes": "error"
610
+ "tailwindcss/no-unnecessary-whitespace": "warn"
611
+ }
612
+ });
613
+
614
+ // tools/oxlint/config/js-plugins/index.ts
615
+ var packageRoot = (() => {
616
+ let dir = import.meta.dirname;
617
+ while (!existsSync(path.join(dir, "tools", "oxlint")) && dir !== path.dirname(dir)) {
618
+ dir = path.dirname(dir);
546
619
  }
620
+ return dir;
621
+ })();
622
+ var localPlugin = (relative) => path.join(packageRoot, relative);
623
+ var jsPluginEntries = [
624
+ { name: "github", specifier: "eslint-plugin-github", config: githubConfig },
625
+ { name: "sonarjs", specifier: "eslint-plugin-sonarjs", config: sonarJSConfig },
626
+ { name: "react-doctor", specifier: "oxlint-plugin-react-doctor", config: reactDoctorConfig },
627
+ { name: "tailwindcss", specifier: "oxlint-tailwindcss", config: tailwindConfig },
628
+ {
629
+ name: "anti-slop",
630
+ specifier: localPlugin("tools/oxlint/config/vendors/anti-slop.js"),
631
+ config: antiSlopConfig
632
+ },
633
+ {
634
+ name: "no-comment-slop",
635
+ specifier: localPlugin("tools/oxlint/config/vendors/no-comment-slop.js"),
636
+ config: noCommentSlopConfig
637
+ },
638
+ {
639
+ name: "shadcn",
640
+ specifier: localPlugin("tools/oxlint/config/vendors/shadcn.js"),
641
+ config: shadcnConfig
642
+ },
643
+ { name: "lazuee", specifier: localPlugin("tools/oxlint/rules/index.js"), config: lazueeConfig }
644
+ ];
645
+ var jsPlugins = [...jsPluginEntries].map(({ name, specifier }) => ({ name, specifier }));
646
+ var config = defineConfig9({
647
+ jsPlugins
547
648
  });
548
649
  var js_plugins_default = config;
549
650
  var selectJsPlugins2 = (pluginNames) => {
550
651
  const names = new Set(pluginNames);
652
+ const configs = jsPluginEntries.filter(({ name }) => names.has(name)).map((x) => x.config);
551
653
  const isSelectedRule = ([ruleName]) => {
552
654
  const [pluginName = ""] = ruleName.split("/");
553
655
  return names.has(pluginName);
554
656
  };
555
- return defineConfig({
657
+ return defineConfig9({
556
658
  ...config,
557
- jsPlugins: jsPluginEntries.filter((plugin) => names.has(plugin.name)),
558
- overrides: config.overrides?.map((override) => ({
559
- ...override,
560
- rules: Object.fromEntries(Object.entries(override.rules ?? {}).filter(isSelectedRule))
561
- })),
562
- rules: Object.fromEntries(Object.entries(config.rules ?? {}).filter(isSelectedRule))
659
+ ...configs.reduce(function merge(acc, curr) {
660
+ for (const [key, val] of Object.entries(curr)) {
661
+ if (Array.isArray(acc[key]) && Array.isArray(val)) {
662
+ acc[key] = [...acc[key], ...val];
663
+ } else if (acc[key] && typeof acc[key] === "object" && !Array.isArray(acc[key]) && val && typeof val === "object" && !Array.isArray(val)) {
664
+ acc[key] = merge(acc[key], val);
665
+ } else {
666
+ acc[key] = val;
667
+ }
668
+ }
669
+ return acc;
670
+ }, {}),
671
+ jsPlugins: jsPluginEntries.filter((plugin) => names.has(plugin.name)).map(({ name, specifier }) => ({ name, specifier })),
672
+ overrides: configs.flatMap(({ overrides = [] }) => overrides.map((x) => ({
673
+ ...x,
674
+ rules: Object.fromEntries(Object.entries(x.rules ?? {}).filter(isSelectedRule))
675
+ }))),
676
+ rules: Object.assign({}, ...configs.map(({ rules = {} }) => Object.fromEntries(Object.entries(rules).filter(isSelectedRule))))
563
677
  });
564
678
  };
565
679
 
566
- export { jsPluginSettings2, selectJsPlugins2, js_plugins_default };
680
+ export { selectJsPlugins2, js_plugins_default };