@shibanet0/datamitsu-config 0.0.1-alpha-21 → 0.0.1-alpha-23

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.
Files changed (63) hide show
  1. package/.oxlintrc.json +5 -4
  2. package/datamitsu.js +107 -46
  3. package/dist/arrow-return-style-QXEK7JRB.js +8 -0
  4. package/dist/boundaries-7E4X4KF5.js +19 -0
  5. package/dist/clsx-M6OKU3PA.js +8 -0
  6. package/dist/clsx-S7LTRDUJ.js +8 -0
  7. package/dist/command-3BA63SHO.js +8 -0
  8. package/dist/command-DSHZBIFC.js +10 -0
  9. package/dist/compat-6O7XHMYR.js +8 -0
  10. package/dist/cspell-NJAMCYWA.js +8 -0
  11. package/dist/cspell-TO7G3MKP.js +10 -0
  12. package/dist/depend-4TLGRJ4A.js +8 -0
  13. package/dist/dist-HY4C5Z2A.js +145 -0
  14. package/dist/escompat-2HZB2VKK.js +8 -0
  15. package/dist/escompat-4SQ3LROQ.js +11 -0
  16. package/dist/escompat-LOSSJ2E4.js +11 -0
  17. package/dist/escompat-TAO52CFN.js +10 -0
  18. package/dist/eslint/index.js +59 -59
  19. package/dist/eslint/plugins/clsx.d.ts +2 -0
  20. package/dist/eslint/plugins/command.d.ts +2 -0
  21. package/dist/eslint/plugins/cspell.d.ts +2 -0
  22. package/dist/eslint/plugins/escompat.d.ts +2 -0
  23. package/dist/eslint/plugins/fsecond.d.ts +2 -0
  24. package/dist/eslint/plugins/html.d.ts +2 -0
  25. package/dist/eslint/plugins/i18next.d.ts +2 -0
  26. package/dist/eslint/plugins/jsonc.d.ts +2 -0
  27. package/dist/eslint/plugins/oxlint.d.ts +5 -0
  28. package/dist/eslint/plugins/pnpm.d.ts +2 -0
  29. package/dist/eslint/plugins/react.d.ts +4 -1
  30. package/dist/eslint/plugins/stylistic.d.ts +2 -0
  31. package/dist/eslint/plugins/vitest.d.ts +2 -0
  32. package/dist/eslint/types.d.ts +35 -0
  33. package/dist/fsecond-3RU4GC2P.js +8 -0
  34. package/dist/fsecond-L3WD5A5A.js +13 -0
  35. package/dist/fsecond-T4KZEO22.js +12 -0
  36. package/dist/fsecond-U7QFID4J.js +16 -0
  37. package/dist/html-Q7HLWKMH.js +17 -0
  38. package/dist/i18next-QAQGS665.js +10 -0
  39. package/dist/i18next-XPRQSLOK.js +8 -0
  40. package/dist/jsdoc-T3RUTVU2.js +8 -0
  41. package/dist/jsonc-4Q5WZVF3.js +12 -0
  42. package/dist/jsonc-5WI2LEKI.js +11 -0
  43. package/dist/jsonc-C4HCFU4B.js +10 -0
  44. package/dist/no-unsanitized-2CVGQCKY.js +8 -0
  45. package/dist/oxlint-5VSAV63M.js +58 -0
  46. package/dist/oxlint-ESXR6S2H.js +55 -0
  47. package/dist/oxlint-SQKVSEWV.js +58 -0
  48. package/dist/oxlint-UN6IGLH6.js +55 -0
  49. package/dist/pnpm-KEJEST6B.js +15 -0
  50. package/dist/pnpm-KXXRNMOS.js +10 -0
  51. package/dist/react-QYLHZO2Q.js +66 -0
  52. package/dist/react-ZSFMBR63.js +66 -0
  53. package/dist/react-you-might-not-need-an-effect-7LQCVBLO.js +8 -0
  54. package/dist/regexp-D6CKMCXH.js +8 -0
  55. package/dist/s0/__tests__/helpers/mockCrypto.d.ts +1 -1
  56. package/dist/s0/index.js +30 -51
  57. package/dist/s0/utils/encryption.d.ts +8 -6
  58. package/dist/stylistic-ID5P6T22.js +18 -0
  59. package/dist/stylistic-XPSWOXE5.js +18 -0
  60. package/dist/unused-imports-B24FSXNB.js +29 -0
  61. package/dist/vitest-OL2AMOGF.js +20 -0
  62. package/oxlint_configuration_schema.json +14 -2
  63. package/package.json +30 -14
@@ -0,0 +1,58 @@
1
+ // package.json
2
+ var name = "@shibanet0/datamitsu-config";
3
+
4
+ // src/oxlint/index.ts
5
+ var oxlintConfig = {
6
+ $schema: `./node_modules/${name}/oxlint_configuration_schema.json`,
7
+ categories: {
8
+ correctness: "error",
9
+ pedantic: "error",
10
+ perf: "error",
11
+ style: "warn",
12
+ suspicious: "error"
13
+ },
14
+ rules: {
15
+ "array-type": "off",
16
+ "arrow-body-style": "off",
17
+ "capitalized-comments": "off",
18
+ "func-style": "off",
19
+ "id-length": "off",
20
+ "init-declarations": "off",
21
+ "max-lines": "off",
22
+ "max-lines-per-function": "off",
23
+ "no-await-in-loop": "off",
24
+ "no-inline-comments": "off",
25
+ "no-magic-numbers": "off",
26
+ "no-ternary": "off",
27
+ "no-warning-comments": "off",
28
+ "prefer-destructuring": "off",
29
+ "prefer-template": "off",
30
+ "require-await": "off",
31
+ "sort-imports": "off",
32
+ "triple-slash-reference": "off",
33
+ "unicorn/filename-case": "off",
34
+ "unicorn/no-array-sort": "off",
35
+ "unicorn/no-null": "off",
36
+ "unicorn/no-object-as-default-parameter": "off",
37
+ "unicorn/require-module-specifiers": "off"
38
+ }
39
+ };
40
+
41
+ // src/eslint/plugins/oxlint.ts
42
+ async function oxlint(options) {
43
+ const plugin = await import("eslint-plugin-oxlint");
44
+ console.log(options?.configPath);
45
+ if (!options?.configPath) {
46
+ const oxlintRules2 = plugin.default.buildFromOxlintConfig(
47
+ oxlintConfig
48
+ );
49
+ console.log(1);
50
+ return [...oxlintRules2];
51
+ }
52
+ console.log(2);
53
+ const oxlintRules = plugin.default.buildFromOxlintConfigFile(options.configPath);
54
+ return [...oxlintRules];
55
+ }
56
+ export {
57
+ oxlint
58
+ };
@@ -0,0 +1,55 @@
1
+ // package.json
2
+ var name = "@shibanet0/datamitsu-config";
3
+
4
+ // src/oxlint/index.ts
5
+ var oxlintConfig = {
6
+ $schema: `./node_modules/${name}/oxlint_configuration_schema.json`,
7
+ categories: {
8
+ correctness: "error",
9
+ pedantic: "error",
10
+ perf: "error",
11
+ style: "warn",
12
+ suspicious: "error"
13
+ },
14
+ rules: {
15
+ "array-type": "off",
16
+ "arrow-body-style": "off",
17
+ "capitalized-comments": "off",
18
+ "func-style": "off",
19
+ "id-length": "off",
20
+ "init-declarations": "off",
21
+ "max-lines": "off",
22
+ "max-lines-per-function": "off",
23
+ "no-await-in-loop": "off",
24
+ "no-inline-comments": "off",
25
+ "no-magic-numbers": "off",
26
+ "no-ternary": "off",
27
+ "no-warning-comments": "off",
28
+ "prefer-destructuring": "off",
29
+ "prefer-template": "off",
30
+ "require-await": "off",
31
+ "sort-imports": "off",
32
+ "triple-slash-reference": "off",
33
+ "unicorn/filename-case": "off",
34
+ "unicorn/no-array-sort": "off",
35
+ "unicorn/no-null": "off",
36
+ "unicorn/no-object-as-default-parameter": "off",
37
+ "unicorn/require-module-specifiers": "off"
38
+ }
39
+ };
40
+
41
+ // src/eslint/plugins/oxlint.ts
42
+ async function oxlint(options) {
43
+ const plugin = await import("eslint-plugin-oxlint");
44
+ if (!options?.configPath) {
45
+ const oxlintRules2 = plugin.default.buildFromOxlintConfig(
46
+ oxlintConfig
47
+ );
48
+ return [...oxlintRules2];
49
+ }
50
+ const oxlintRules = plugin.default.buildFromOxlintConfigFile(options.configPath);
51
+ return [...oxlintRules];
52
+ }
53
+ export {
54
+ oxlint
55
+ };
@@ -0,0 +1,15 @@
1
+ // src/eslint/plugins/pnpm.ts
2
+ async function pnpm() {
3
+ const plugin = await import("eslint-plugin-pnpm");
4
+ return [
5
+ ...plugin.configs.recommended,
6
+ {
7
+ rules: {
8
+ "pnpm/json-enforce-catalog": "off"
9
+ }
10
+ }
11
+ ];
12
+ }
13
+ export {
14
+ pnpm
15
+ };
@@ -0,0 +1,10 @@
1
+ // src/eslint/plugins/pnpm.ts
2
+ async function pnpm() {
3
+ const plugin = await import("eslint-plugin-pnpm");
4
+ return [
5
+ ...plugin.configs.recommended
6
+ ];
7
+ }
8
+ export {
9
+ pnpm
10
+ };
@@ -0,0 +1,66 @@
1
+ // src/eslint/plugins/react.ts
2
+ async function react(version) {
3
+ const plugin = await import("eslint-plugin-react");
4
+ return [
5
+ {
6
+ name: "shibanet0/react/rules",
7
+ plugins: {
8
+ react: plugin.default
9
+ },
10
+ rules: {
11
+ ...plugin.default.configs["jsx-runtime"].rules,
12
+ ...plugin.default.configs.recommended.rules,
13
+ "react/destructuring-assignment": "off",
14
+ // TODO
15
+ "react/display-name": "off",
16
+ "react/forbid-component-props": "off",
17
+ // TODO
18
+ "react/forward-ref-uses-ref": "off",
19
+ "react/function-component-definition": "off",
20
+ "react/iframe-missing-sandbox": "off",
21
+ "react/jsx-child-element-spacing": "off",
22
+ "react/jsx-closing-tag-location": "off",
23
+ // TODO
24
+ "react/jsx-curly-newline": "off",
25
+ // TODO
26
+ "react/jsx-filename-extension": "off",
27
+ "react/jsx-handler-names": "off",
28
+ "react/jsx-indent": "off",
29
+ // TODO
30
+ // "react/jsx-max-depth": "off", // TODO
31
+ "react/jsx-max-props-per-line": "off",
32
+ // TODO
33
+ "react/jsx-newline": "off",
34
+ // TODO
35
+ "react/jsx-no-bind": "off",
36
+ // TODO
37
+ "react/jsx-no-literals": "off",
38
+ // TODO
39
+ "react/jsx-no-useless-fragment": "off",
40
+ "react/jsx-one-expression-per-line": "off",
41
+ // TODO
42
+ "react/jsx-pascal-case": "off",
43
+ "react/jsx-props-no-spreading": "off",
44
+ "react/jsx-sort-props": "off",
45
+ // TODO
46
+ "react/no-array-index-key": "off",
47
+ // TODO
48
+ "react/no-unknown-property": "off",
49
+ "react/no-unused-prop-types": "warn",
50
+ "react/prefer-read-only-props": "off",
51
+ // TODO
52
+ "react/prop-types": "off",
53
+ "react/react-in-jsx-scope": "off",
54
+ "react/require-default-props": "off"
55
+ },
56
+ settings: {
57
+ react: {
58
+ version: version || "16.3"
59
+ }
60
+ }
61
+ }
62
+ ];
63
+ }
64
+ export {
65
+ react
66
+ };
@@ -0,0 +1,66 @@
1
+ // src/eslint/plugins/react.ts
2
+ async function react(options) {
3
+ const plugin = await import("eslint-plugin-react");
4
+ return [
5
+ {
6
+ name: "shibanet0/react/rules",
7
+ plugins: {
8
+ react: plugin.default
9
+ },
10
+ rules: {
11
+ ...plugin.default.configs["jsx-runtime"].rules,
12
+ ...plugin.default.configs.recommended.rules,
13
+ "react/destructuring-assignment": "off",
14
+ // TODO
15
+ "react/display-name": "off",
16
+ "react/forbid-component-props": "off",
17
+ // TODO
18
+ "react/forward-ref-uses-ref": "off",
19
+ "react/function-component-definition": "off",
20
+ "react/iframe-missing-sandbox": "off",
21
+ "react/jsx-child-element-spacing": "off",
22
+ "react/jsx-closing-tag-location": "off",
23
+ // TODO
24
+ "react/jsx-curly-newline": "off",
25
+ // TODO
26
+ "react/jsx-filename-extension": "off",
27
+ "react/jsx-handler-names": "off",
28
+ "react/jsx-indent": "off",
29
+ // TODO
30
+ // "react/jsx-max-depth": "off", // TODO
31
+ "react/jsx-max-props-per-line": "off",
32
+ // TODO
33
+ "react/jsx-newline": "off",
34
+ // TODO
35
+ "react/jsx-no-bind": "off",
36
+ // TODO
37
+ "react/jsx-no-literals": "off",
38
+ // TODO
39
+ "react/jsx-no-useless-fragment": "off",
40
+ "react/jsx-one-expression-per-line": "off",
41
+ // TODO
42
+ "react/jsx-pascal-case": "off",
43
+ "react/jsx-props-no-spreading": "off",
44
+ "react/jsx-sort-props": "off",
45
+ // TODO
46
+ "react/no-array-index-key": "off",
47
+ // TODO
48
+ "react/no-unknown-property": "off",
49
+ "react/no-unused-prop-types": "warn",
50
+ "react/prefer-read-only-props": "off",
51
+ // TODO
52
+ "react/prop-types": "off",
53
+ "react/react-in-jsx-scope": "off",
54
+ "react/require-default-props": "off"
55
+ },
56
+ settings: {
57
+ react: {
58
+ version: options?.version || "latest"
59
+ }
60
+ }
61
+ }
62
+ ];
63
+ }
64
+ export {
65
+ react
66
+ };
@@ -0,0 +1,8 @@
1
+ // src/eslint/plugins/react-you-might-not-need-an-effect.ts
2
+ async function reactYouMightNotNeedAnEffect() {
3
+ const plugin = await import("eslint-plugin-react-you-might-not-need-an-effect");
4
+ return [plugin.default.configs.recommended];
5
+ }
6
+ export {
7
+ reactYouMightNotNeedAnEffect
8
+ };
@@ -0,0 +1,8 @@
1
+ // src/eslint/plugins/regexp.ts
2
+ async function regexp() {
3
+ const plugin = await import("eslint-plugin-regexp");
4
+ return [plugin.default.configs.recommended];
5
+ }
6
+ export {
7
+ regexp
8
+ };
@@ -1,4 +1,4 @@
1
- import type { CryptoModule } from '../../utils/encryption.js';
1
+ import type { CryptoModule } from "../../utils/encryption.js";
2
2
  export declare class MockCryptoBuilder {
3
3
  private randomBytesIndex;
4
4
  private randomBytesValues;
package/dist/s0/index.js CHANGED
@@ -87,15 +87,11 @@ async function checkGitSafety() {
87
87
  try {
88
88
  await execa3("git", ["rev-parse", "--git-dir"], { cwd: process.cwd() });
89
89
  } catch {
90
- throw new Error(
91
- "\u274C Not in a git repository. Cleanup requires git for safety."
92
- );
90
+ throw new Error("\u274C Not in a git repository. Cleanup requires git for safety.");
93
91
  }
94
- const { stdout: gitRoot } = await execa3(
95
- "git",
96
- ["rev-parse", "--show-toplevel"],
97
- { cwd: process.cwd() }
98
- );
92
+ const { stdout: gitRoot } = await execa3("git", ["rev-parse", "--show-toplevel"], {
93
+ cwd: process.cwd()
94
+ });
99
95
  const currentDir = process.cwd();
100
96
  if (gitRoot !== currentDir) {
101
97
  throw new Error(
@@ -114,21 +110,15 @@ async function checkGitSafety() {
114
110
  );
115
111
  }
116
112
  try {
117
- const { stdout: unpushed } = await execa3(
118
- "git",
119
- ["log", "@{u}..", "--oneline"],
120
- { cwd: process.cwd() }
121
- );
113
+ const { stdout: unpushed } = await execa3("git", ["log", "@{u}..", "--oneline"], {
114
+ cwd: process.cwd()
115
+ });
122
116
  if (unpushed.trim()) {
123
- throw new Error(
124
- "\u274C Unpushed commits detected. Please push commits before cleanup."
125
- );
117
+ throw new Error("\u274C Unpushed commits detected. Please push commits before cleanup.");
126
118
  }
127
119
  } catch (error) {
128
120
  if (error.message?.includes("no upstream")) {
129
- console.warn(
130
- "\u26A0\uFE0F Warning: No upstream branch configured. Proceeding with caution...\n"
131
- );
121
+ console.warn("\u26A0\uFE0F Warning: No upstream branch configured. Proceeding with caution...\n");
132
122
  } else {
133
123
  throw error;
134
124
  }
@@ -188,10 +178,8 @@ var pulumiCleanup = async () => {
188
178
  `);
189
179
  return;
190
180
  }
191
- console.log(
192
- `\u{1F5D1}\uFE0F Found ${filesToRemove.length} unencrypted file(s) to remove:
193
- `
194
- );
181
+ console.log(`\u{1F5D1}\uFE0F Found ${filesToRemove.length} unencrypted file(s) to remove:
182
+ `);
195
183
  for (const file of filesToRemove) {
196
184
  console.log(` - ${path.relative(process.cwd(), file)}`);
197
185
  }
@@ -205,17 +193,12 @@ var pulumiCleanup = async () => {
205
193
  console.log(` \u2705 Removed: ${path.relative(process.cwd(), file)}`);
206
194
  removed++;
207
195
  } catch (error) {
208
- console.error(
209
- ` \u274C Failed to remove: ${path.relative(process.cwd(), file)}`,
210
- error
211
- );
196
+ console.error(` \u274C Failed to remove: ${path.relative(process.cwd(), file)}`, error);
212
197
  }
213
198
  }
214
- console.log(
215
- `
199
+ console.log(`
216
200
  \u2728 Cleanup complete! (${removed}/${filesToRemove.length} removed)
217
- `
218
- );
201
+ `);
219
202
  };
220
203
 
221
204
  // src/s0/cmd/pulumi/decryptState.ts
@@ -274,11 +257,9 @@ var pulumiDecrypt = async () => {
274
257
  processed++;
275
258
  }
276
259
  }
277
- console.log(
278
- `
260
+ console.log(`
279
261
  \u2728 Decryption complete! (${processed - errors}/${processed} succeeded)
280
- `
281
- );
262
+ `);
282
263
  if (errors > 0) {
283
264
  process.exit(1);
284
265
  }
@@ -536,24 +517,22 @@ var pulumiCommand = new Command("pulumi-sops").addArgument(
536
517
  "decrypt-all-state",
537
518
  "cleanup-all-state"
538
519
  ])
539
- ).action(
540
- async (type) => {
541
- switch (type) {
542
- case "cleanup-all-state": {
543
- await pulumiCleanup();
544
- break;
545
- }
546
- case "decrypt-all-state": {
547
- await pulumiDecrypt();
548
- break;
549
- }
550
- case "encrypt-all-state": {
551
- await pulumiEncrypt();
552
- break;
553
- }
520
+ ).action(async (type) => {
521
+ switch (type) {
522
+ case "cleanup-all-state": {
523
+ await pulumiCleanup();
524
+ break;
525
+ }
526
+ case "decrypt-all-state": {
527
+ await pulumiDecrypt();
528
+ break;
529
+ }
530
+ case "encrypt-all-state": {
531
+ await pulumiEncrypt();
532
+ break;
554
533
  }
555
534
  }
556
- );
535
+ });
557
536
 
558
537
  // src/s0/index.ts
559
538
  program.addCommand(pulumiCommand).parse();
@@ -1,8 +1,11 @@
1
- export type CipherGCMTypes = import("node:crypto").CipherGCMTypes;
2
- export type CryptoModule = typeof import("node:crypto");
3
- export type UtilModule = {
4
- promisify: typeof import("node:util").promisify;
5
- };
1
+ import type { CipherGCMTypes } from "node:crypto";
2
+ export type { CipherGCMTypes } from "node:crypto";
3
+ import type util from "node:util";
4
+ export type CryptoModule = typeof crypto;
5
+ import type crypto from "node:crypto";
6
+ export interface UtilModule {
7
+ promisify: typeof util.promisify;
8
+ }
6
9
  interface EncryptorConfig {
7
10
  algorithm?: CipherGCMTypes;
8
11
  authTagLength?: number;
@@ -23,4 +26,3 @@ export declare class Encryptor {
23
26
  encrypt(buffer: Buffer, key: Buffer): Promise<Buffer>;
24
27
  generateKey(): Buffer;
25
28
  }
26
- export {};
@@ -0,0 +1,18 @@
1
+ // src/eslint/plugins/stylistic.ts
2
+ async function stylistic() {
3
+ const plugin = await import("@stylistic/eslint-plugin");
4
+ return [
5
+ {
6
+ plugins: {
7
+ "@stylistic": plugin.default
8
+ },
9
+ rules: {
10
+ // "@stylistic/indent": ["error", 2],
11
+ // indent: ["error", 2],
12
+ }
13
+ }
14
+ ];
15
+ }
16
+ export {
17
+ stylistic
18
+ };
@@ -0,0 +1,18 @@
1
+ // src/eslint/plugins/stylistic.ts
2
+ async function stylistic() {
3
+ const plugin = await import("@stylistic/eslint-plugin");
4
+ return [
5
+ {
6
+ plugins: {
7
+ "@stylistic": plugin.default
8
+ },
9
+ rules: {
10
+ "@stylistic/indent": ["error", 2],
11
+ indent: ["error", 2]
12
+ }
13
+ }
14
+ ];
15
+ }
16
+ export {
17
+ stylistic
18
+ };
@@ -0,0 +1,29 @@
1
+ // src/eslint/plugins/unused-imports.ts
2
+ async function unusedImports() {
3
+ const plugin = await import("./dist-HY4C5Z2A.js");
4
+ return [
5
+ {
6
+ name: "shibanet0/unused-imports/rules",
7
+ plugins: {
8
+ "unused-imports": plugin.default
9
+ },
10
+ rules: {
11
+ "no-unused-vars": "off",
12
+ // or "@typescript-eslint/no-unused-vars": "off",
13
+ "unused-imports/no-unused-imports": "error",
14
+ "unused-imports/no-unused-vars": [
15
+ "warn",
16
+ {
17
+ args: "after-used",
18
+ argsIgnorePattern: "^_",
19
+ vars: "all",
20
+ varsIgnorePattern: "^_"
21
+ }
22
+ ]
23
+ }
24
+ }
25
+ ];
26
+ }
27
+ export {
28
+ unusedImports
29
+ };
@@ -0,0 +1,20 @@
1
+ // src/eslint/plugins/vitest.ts
2
+ async function vitest() {
3
+ const plugin = await import("@vitest/eslint-plugin");
4
+ return [
5
+ {
6
+ files: ["tests/**"],
7
+ plugins: {
8
+ vitest
9
+ },
10
+ rules: {
11
+ ...plugin.default.configs.recommended.rules
12
+ // you can also use vitest.configs.all.rules to enable all rules
13
+ // 'vitest/max-nested-describe': ['error', { max: 3 }], // you can also modify rules' behavior using option like this
14
+ }
15
+ }
16
+ ];
17
+ }
18
+ export {
19
+ vitest
20
+ };
@@ -119,7 +119,8 @@
119
119
  },
120
120
  "react": {
121
121
  "formComponents": [],
122
- "linkComponents": []
122
+ "linkComponents": [],
123
+ "version": null
123
124
  },
124
125
  "jsdoc": {
125
126
  "ignorePrivate": false,
@@ -612,7 +613,8 @@
612
613
  "react": {
613
614
  "default": {
614
615
  "formComponents": [],
615
- "linkComponents": []
616
+ "linkComponents": [],
617
+ "version": null
616
618
  },
617
619
  "allOf": [
618
620
  {
@@ -654,6 +656,16 @@
654
656
  "$ref": "#/definitions/CustomComponent"
655
657
  },
656
658
  "markdownDescription": "Components used as alternatives to `<a>` for linking, such as `<Link>`.\n\nExample:\n\n```jsonc\n{\n\"settings\": {\n\"react\": {\n\"linkComponents\": [\n\"HyperLink\",\n// Use `linkAttribute` for components that use a different prop name\n// than `href`.\n{ \"name\": \"MyLink\", \"linkAttribute\": \"to\" },\n// allows specifying multiple properties if necessary\n{ \"name\": \"Link\", \"linkAttribute\": [\"to\", \"href\"] }\n]\n}\n}\n}\n```"
659
+ },
660
+ "version": {
661
+ "description": "React version to use for version-specific rules.\n\nAccepts semver versions (e.g., \"18.2.0\", \"17.0\").\n\nExample:\n\n```jsonc\n{\n\"settings\": {\n\"react\": {\n\"version\": \"18.2.0\"\n}\n}\n}\n```",
662
+ "default": null,
663
+ "type": [
664
+ "string",
665
+ "null"
666
+ ],
667
+ "pattern": "^[1-9]\\d*(\\.(0|[1-9]\\d*))?(\\.(0|[1-9]\\d*))?$",
668
+ "markdownDescription": "React version to use for version-specific rules.\n\nAccepts semver versions (e.g., \"18.2.0\", \"17.0\").\n\nExample:\n\n```jsonc\n{\n\"settings\": {\n\"react\": {\n\"version\": \"18.2.0\"\n}\n}\n}\n```"
657
669
  }
658
670
  },
659
671
  "markdownDescription": "Configure React plugin rules.\n\nDerived from [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react#configuration-legacy-eslintrc-)"