eslint-plugin-zod 3.5.1 → 3.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  2. package/dist/index.cjs +94 -83
  3. package/dist/index.d.cts +17 -16
  4. package/dist/index.d.mts +24 -0
  5. package/dist/index.mjs +98 -0
  6. package/dist/meta.cjs +11 -11
  7. package/dist/meta.mjs +10 -0
  8. package/dist/rules/array-style.cjs +88 -101
  9. package/dist/rules/array-style.mjs +89 -0
  10. package/dist/rules/consistent-import-source.cjs +59 -66
  11. package/dist/rules/consistent-import-source.mjs +60 -0
  12. package/dist/rules/consistent-import.cjs +146 -172
  13. package/dist/rules/consistent-import.mjs +152 -0
  14. package/dist/rules/consistent-object-schema-type.cjs +81 -84
  15. package/dist/rules/consistent-object-schema-type.mjs +81 -0
  16. package/dist/rules/no-any-schema.cjs +62 -67
  17. package/dist/rules/no-any-schema.mjs +62 -0
  18. package/dist/rules/no-empty-custom-schema.cjs +32 -40
  19. package/dist/rules/no-empty-custom-schema.mjs +34 -0
  20. package/dist/rules/no-number-schema-with-int.cjs +56 -62
  21. package/dist/rules/no-number-schema-with-int.mjs +57 -0
  22. package/dist/rules/no-optional-and-default-together.cjs +69 -80
  23. package/dist/rules/no-optional-and-default-together.mjs +71 -0
  24. package/dist/rules/no-string-schema-with-uuid.cjs +57 -63
  25. package/dist/rules/no-string-schema-with-uuid.mjs +58 -0
  26. package/dist/rules/no-throw-in-refine.cjs +69 -87
  27. package/dist/rules/no-throw-in-refine.mjs +69 -0
  28. package/dist/rules/no-unknown-schema.cjs +29 -35
  29. package/dist/rules/no-unknown-schema.mjs +31 -0
  30. package/dist/rules/prefer-enum-over-literal-union.cjs +63 -79
  31. package/dist/rules/prefer-enum-over-literal-union.mjs +63 -0
  32. package/dist/rules/prefer-meta-last.cjs +47 -63
  33. package/dist/rules/prefer-meta-last.mjs +49 -0
  34. package/dist/rules/prefer-meta.cjs +38 -48
  35. package/dist/rules/prefer-meta.mjs +40 -0
  36. package/dist/rules/prefer-namespace-import.cjs +110 -142
  37. package/dist/rules/prefer-namespace-import.mjs +116 -0
  38. package/dist/rules/prefer-string-schema-with-trim.cjs +45 -52
  39. package/dist/rules/prefer-string-schema-with-trim.mjs +47 -0
  40. package/dist/rules/require-brand-type-parameter.cjs +47 -60
  41. package/dist/rules/require-brand-type-parameter.mjs +49 -0
  42. package/dist/rules/require-error-message.cjs +83 -102
  43. package/dist/rules/require-error-message.mjs +83 -0
  44. package/dist/rules/require-schema-suffix.cjs +67 -78
  45. package/dist/rules/require-schema-suffix.mjs +67 -0
  46. package/dist/rules/schema-error-property-style.cjs +95 -107
  47. package/dist/rules/schema-error-property-style.mjs +94 -0
  48. package/dist/utils/build-zod-chain-replacement-fix.cjs +28 -29
  49. package/dist/utils/build-zod-chain-replacement-fix.mjs +30 -0
  50. package/dist/utils/create-plugin-rule.cjs +6 -6
  51. package/dist/utils/create-plugin-rule.mjs +6 -0
  52. package/dist/utils/detect-zod-schema-root-node.cjs +94 -96
  53. package/dist/utils/detect-zod-schema-root-node.mjs +101 -0
  54. package/dist/utils/is-zod-import-source.cjs +14 -18
  55. package/dist/utils/is-zod-import-source.mjs +16 -0
  56. package/dist/utils/track-zod-schema-imports.cjs +61 -63
  57. package/dist/utils/track-zod-schema-imports.mjs +64 -0
  58. package/package.json +14 -17
  59. package/dist/index.d.ts +0 -22
  60. package/dist/index.js +0 -84
  61. package/dist/meta.d.cts +0 -3
  62. package/dist/meta.d.ts +0 -3
  63. package/dist/meta.js +0 -8
  64. package/dist/rules/array-style.d.cts +0 -11
  65. package/dist/rules/array-style.d.ts +0 -11
  66. package/dist/rules/array-style.js +0 -99
  67. package/dist/rules/consistent-import-source.d.cts +0 -11
  68. package/dist/rules/consistent-import-source.d.ts +0 -11
  69. package/dist/rules/consistent-import-source.js +0 -64
  70. package/dist/rules/consistent-import.d.cts +0 -12
  71. package/dist/rules/consistent-import.d.ts +0 -12
  72. package/dist/rules/consistent-import.js +0 -176
  73. package/dist/rules/consistent-object-schema-type.d.cts +0 -13
  74. package/dist/rules/consistent-object-schema-type.d.ts +0 -13
  75. package/dist/rules/consistent-object-schema-type.js +0 -82
  76. package/dist/rules/no-any-schema.d.cts +0 -6
  77. package/dist/rules/no-any-schema.d.ts +0 -6
  78. package/dist/rules/no-any-schema.js +0 -65
  79. package/dist/rules/no-empty-custom-schema.d.cts +0 -5
  80. package/dist/rules/no-empty-custom-schema.d.ts +0 -5
  81. package/dist/rules/no-empty-custom-schema.js +0 -38
  82. package/dist/rules/no-number-schema-with-int.d.cts +0 -5
  83. package/dist/rules/no-number-schema-with-int.d.ts +0 -5
  84. package/dist/rules/no-number-schema-with-int.js +0 -60
  85. package/dist/rules/no-optional-and-default-together.d.cts +0 -12
  86. package/dist/rules/no-optional-and-default-together.d.ts +0 -12
  87. package/dist/rules/no-optional-and-default-together.js +0 -78
  88. package/dist/rules/no-string-schema-with-uuid.d.cts +0 -5
  89. package/dist/rules/no-string-schema-with-uuid.d.ts +0 -5
  90. package/dist/rules/no-string-schema-with-uuid.js +0 -61
  91. package/dist/rules/no-throw-in-refine.d.cts +0 -5
  92. package/dist/rules/no-throw-in-refine.d.ts +0 -5
  93. package/dist/rules/no-throw-in-refine.js +0 -85
  94. package/dist/rules/no-unknown-schema.d.cts +0 -5
  95. package/dist/rules/no-unknown-schema.d.ts +0 -5
  96. package/dist/rules/no-unknown-schema.js +0 -33
  97. package/dist/rules/prefer-enum-over-literal-union.d.cts +0 -5
  98. package/dist/rules/prefer-enum-over-literal-union.d.ts +0 -5
  99. package/dist/rules/prefer-enum-over-literal-union.js +0 -77
  100. package/dist/rules/prefer-meta-last.d.cts +0 -5
  101. package/dist/rules/prefer-meta-last.d.ts +0 -5
  102. package/dist/rules/prefer-meta-last.js +0 -61
  103. package/dist/rules/prefer-meta.d.cts +0 -5
  104. package/dist/rules/prefer-meta.d.ts +0 -5
  105. package/dist/rules/prefer-meta.js +0 -46
  106. package/dist/rules/prefer-namespace-import.d.cts +0 -5
  107. package/dist/rules/prefer-namespace-import.d.ts +0 -5
  108. package/dist/rules/prefer-namespace-import.js +0 -146
  109. package/dist/rules/prefer-string-schema-with-trim.d.cts +0 -5
  110. package/dist/rules/prefer-string-schema-with-trim.d.ts +0 -5
  111. package/dist/rules/prefer-string-schema-with-trim.js +0 -50
  112. package/dist/rules/require-brand-type-parameter.d.cts +0 -6
  113. package/dist/rules/require-brand-type-parameter.d.ts +0 -6
  114. package/dist/rules/require-brand-type-parameter.js +0 -58
  115. package/dist/rules/require-error-message.d.cts +0 -5
  116. package/dist/rules/require-error-message.d.ts +0 -5
  117. package/dist/rules/require-error-message.js +0 -100
  118. package/dist/rules/require-schema-suffix.d.cts +0 -9
  119. package/dist/rules/require-schema-suffix.d.ts +0 -9
  120. package/dist/rules/require-schema-suffix.js +0 -76
  121. package/dist/rules/schema-error-property-style.d.cts +0 -10
  122. package/dist/rules/schema-error-property-style.d.ts +0 -10
  123. package/dist/rules/schema-error-property-style.js +0 -102
  124. package/dist/utils/build-zod-chain-replacement-fix.d.cts +0 -12
  125. package/dist/utils/build-zod-chain-replacement-fix.d.ts +0 -12
  126. package/dist/utils/build-zod-chain-replacement-fix.js +0 -28
  127. package/dist/utils/create-plugin-rule.d.cts +0 -13
  128. package/dist/utils/create-plugin-rule.d.ts +0 -13
  129. package/dist/utils/create-plugin-rule.js +0 -3
  130. package/dist/utils/detect-zod-schema-root-node.d.cts +0 -10
  131. package/dist/utils/detect-zod-schema-root-node.d.ts +0 -10
  132. package/dist/utils/detect-zod-schema-root-node.js +0 -101
  133. package/dist/utils/is-zod-import-source.d.cts +0 -4
  134. package/dist/utils/is-zod-import-source.d.ts +0 -4
  135. package/dist/utils/is-zod-import-source.js +0 -17
  136. package/dist/utils/track-zod-schema-imports.d.cts +0 -18
  137. package/dist/utils/track-zod-schema-imports.d.ts +0 -18
  138. package/dist/utils/track-zod-schema-imports.js +0 -64
@@ -1,64 +1,48 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.preferMetaLast = void 0;
4
- const create_plugin_rule_js_1 = require("../utils/create-plugin-rule.cjs");
5
- const track_zod_schema_imports_js_1 = require("../utils/track-zod-schema-imports.cjs");
6
- const { zodImportAllowedSource, trackZodSchemaImports, } = (0, track_zod_schema_imports_js_1.createZodSchemaImportTrack)('zod');
7
- exports.preferMetaLast = (0, create_plugin_rule_js_1.createZodPluginRule)({
8
- name: 'prefer-meta-last',
9
- meta: {
10
- type: 'suggestion',
11
- docs: {
12
- zodImportAllowedSource,
13
- description: 'Enforce `.meta()` as last method',
14
- },
15
- fixable: 'code',
16
- messages: {
17
- metaNotLast: 'The `.meta()` methods should be the last one called',
18
- },
19
- schema: [],
20
- },
21
- defaultOptions: [],
22
- create(context) {
23
- const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods, } = trackZodSchemaImports();
24
- return {
25
- ImportDeclaration: importDeclarationListener,
26
- CallExpression(node) {
27
- const zodSchemaMeta = detectZodSchemaRootNode(node);
28
- if (!zodSchemaMeta) {
29
- return;
30
- }
31
- const chain = collectZodChainMethods(node);
32
- const metaIndex = chain.findIndex((c) => c.name === 'meta');
33
- if (metaIndex === -1) {
34
- return;
35
- }
36
- const hasAnyNonMetaAfter = chain
37
- .slice(metaIndex + 1)
38
- .some((c) => c.name !== 'meta');
39
- if (!hasAnyNonMetaAfter) {
40
- return;
41
- }
42
- const metaCall = chain[metaIndex].node;
43
- const metaCallCallee = metaCall.callee;
44
- context.report({
45
- node: metaCallCallee.property,
46
- messageId: 'metaNotLast',
47
- fix(fixer) {
48
- const source = context.sourceCode;
49
- const metaCallText = source.getText(metaCall);
50
- const objectText = source.getText(metaCallCallee.object);
51
- const onlyMetaSuffix = metaCallText.slice(objectText.length);
52
- const [, removeStart] = metaCallCallee.object.range;
53
- const [, removeEnd] = metaCall.range;
54
- const lastCall = chain[chain.length - 1].node;
55
- return [
56
- fixer.removeRange([removeStart, removeEnd]),
57
- fixer.insertTextAfterRange(lastCall.range, onlyMetaSuffix),
58
- ];
59
- },
60
- });
61
- },
62
- };
63
- },
1
+ const require_create_plugin_rule = require("../utils/create-plugin-rule.cjs");
2
+ //#region src/rules/prefer-meta-last.ts
3
+ const { zodImportAllowedSource, trackZodSchemaImports } = require("../utils/track-zod-schema-imports.cjs").createZodSchemaImportTrack("zod");
4
+ const preferMetaLast = require_create_plugin_rule.createZodPluginRule({
5
+ name: "prefer-meta-last",
6
+ meta: {
7
+ type: "suggestion",
8
+ docs: {
9
+ zodImportAllowedSource,
10
+ description: "Enforce `.meta()` as last method"
11
+ },
12
+ fixable: "code",
13
+ messages: { metaNotLast: "The `.meta()` methods should be the last one called" },
14
+ schema: []
15
+ },
16
+ defaultOptions: [],
17
+ create(context) {
18
+ const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods } = trackZodSchemaImports();
19
+ return {
20
+ ImportDeclaration: importDeclarationListener,
21
+ CallExpression(node) {
22
+ if (!detectZodSchemaRootNode(node)) return;
23
+ const chain = collectZodChainMethods(node);
24
+ const metaIndex = chain.findIndex((c) => c.name === "meta");
25
+ if (metaIndex === -1) return;
26
+ if (!chain.slice(metaIndex + 1).some((c) => c.name !== "meta")) return;
27
+ const metaCall = chain[metaIndex].node;
28
+ const metaCallCallee = metaCall.callee;
29
+ context.report({
30
+ node: metaCallCallee.property,
31
+ messageId: "metaNotLast",
32
+ fix(fixer) {
33
+ const source = context.sourceCode;
34
+ const metaCallText = source.getText(metaCall);
35
+ const objectText = source.getText(metaCallCallee.object);
36
+ const onlyMetaSuffix = metaCallText.slice(objectText.length);
37
+ const [, removeStart] = metaCallCallee.object.range;
38
+ const [, removeEnd] = metaCall.range;
39
+ const lastCall = chain[chain.length - 1].node;
40
+ return [fixer.removeRange([removeStart, removeEnd]), fixer.insertTextAfterRange(lastCall.range, onlyMetaSuffix)];
41
+ }
42
+ });
43
+ }
44
+ };
45
+ }
64
46
  });
47
+ //#endregion
48
+ exports.preferMetaLast = preferMetaLast;
@@ -0,0 +1,49 @@
1
+ import { createZodPluginRule } from "../utils/create-plugin-rule.mjs";
2
+ import { createZodSchemaImportTrack } from "../utils/track-zod-schema-imports.mjs";
3
+ //#region src/rules/prefer-meta-last.ts
4
+ const { zodImportAllowedSource, trackZodSchemaImports } = createZodSchemaImportTrack("zod");
5
+ const preferMetaLast = createZodPluginRule({
6
+ name: "prefer-meta-last",
7
+ meta: {
8
+ type: "suggestion",
9
+ docs: {
10
+ zodImportAllowedSource,
11
+ description: "Enforce `.meta()` as last method"
12
+ },
13
+ fixable: "code",
14
+ messages: { metaNotLast: "The `.meta()` methods should be the last one called" },
15
+ schema: []
16
+ },
17
+ defaultOptions: [],
18
+ create(context) {
19
+ const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods } = trackZodSchemaImports();
20
+ return {
21
+ ImportDeclaration: importDeclarationListener,
22
+ CallExpression(node) {
23
+ if (!detectZodSchemaRootNode(node)) return;
24
+ const chain = collectZodChainMethods(node);
25
+ const metaIndex = chain.findIndex((c) => c.name === "meta");
26
+ if (metaIndex === -1) return;
27
+ if (!chain.slice(metaIndex + 1).some((c) => c.name !== "meta")) return;
28
+ const metaCall = chain[metaIndex].node;
29
+ const metaCallCallee = metaCall.callee;
30
+ context.report({
31
+ node: metaCallCallee.property,
32
+ messageId: "metaNotLast",
33
+ fix(fixer) {
34
+ const source = context.sourceCode;
35
+ const metaCallText = source.getText(metaCall);
36
+ const objectText = source.getText(metaCallCallee.object);
37
+ const onlyMetaSuffix = metaCallText.slice(objectText.length);
38
+ const [, removeStart] = metaCallCallee.object.range;
39
+ const [, removeEnd] = metaCall.range;
40
+ const lastCall = chain[chain.length - 1].node;
41
+ return [fixer.removeRange([removeStart, removeEnd]), fixer.insertTextAfterRange(lastCall.range, onlyMetaSuffix)];
42
+ }
43
+ });
44
+ }
45
+ };
46
+ }
47
+ });
48
+ //#endregion
49
+ export { preferMetaLast };
@@ -1,49 +1,39 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.preferMeta = void 0;
4
- const create_plugin_rule_js_1 = require("../utils/create-plugin-rule.cjs");
5
- const track_zod_schema_imports_js_1 = require("../utils/track-zod-schema-imports.cjs");
6
- const { zodImportAllowedSource, trackZodSchemaImports, } = (0, track_zod_schema_imports_js_1.createZodSchemaImportTrack)('all');
7
- exports.preferMeta = (0, create_plugin_rule_js_1.createZodPluginRule)({
8
- name: 'prefer-meta',
9
- meta: {
10
- type: 'suggestion',
11
- fixable: 'code',
12
- docs: {
13
- zodImportAllowedSource,
14
- description: 'Enforce usage of `.meta()` over `.describe()`',
15
- },
16
- messages: {
17
- preferMeta: 'The `.describe()` method still exists for compatibility with Zod 3, but `.meta()` is now the recommended approach.',
18
- },
19
- schema: [],
20
- },
21
- defaultOptions: [],
22
- create(context) {
23
- const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods, } = trackZodSchemaImports();
24
- return {
25
- ImportDeclaration: importDeclarationListener,
26
- CallExpression(node) {
27
- const zodSchemaMeta = detectZodSchemaRootNode(node);
28
- if (!zodSchemaMeta) {
29
- return;
30
- }
31
- const describe = collectZodChainMethods(zodSchemaMeta.node).find((it) => it.name === 'describe');
32
- if (!describe) {
33
- return;
34
- }
35
- const { callee, arguments: [describeArg], } = describe.node;
36
- context.report({
37
- node,
38
- messageId: 'preferMeta',
39
- fix(fixer) {
40
- return [
41
- fixer.replaceText(callee.property, 'meta'),
42
- fixer.replaceText(describeArg, `{ description: ${context.sourceCode.getText(describeArg)} }`),
43
- ];
44
- },
45
- });
46
- },
47
- };
48
- },
1
+ const require_create_plugin_rule = require("../utils/create-plugin-rule.cjs");
2
+ //#region src/rules/prefer-meta.ts
3
+ const { zodImportAllowedSource, trackZodSchemaImports } = require("../utils/track-zod-schema-imports.cjs").createZodSchemaImportTrack("all");
4
+ const preferMeta = require_create_plugin_rule.createZodPluginRule({
5
+ name: "prefer-meta",
6
+ meta: {
7
+ type: "suggestion",
8
+ fixable: "code",
9
+ docs: {
10
+ zodImportAllowedSource,
11
+ description: "Enforce usage of `.meta()` over `.describe()`"
12
+ },
13
+ messages: { preferMeta: "The `.describe()` method still exists for compatibility with Zod 3, but `.meta()` is now the recommended approach." },
14
+ schema: []
15
+ },
16
+ defaultOptions: [],
17
+ create(context) {
18
+ const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods } = trackZodSchemaImports();
19
+ return {
20
+ ImportDeclaration: importDeclarationListener,
21
+ CallExpression(node) {
22
+ const zodSchemaMeta = detectZodSchemaRootNode(node);
23
+ if (!zodSchemaMeta) return;
24
+ const describe = collectZodChainMethods(zodSchemaMeta.node).find((it) => it.name === "describe");
25
+ if (!describe) return;
26
+ const { callee, arguments: [describeArg] } = describe.node;
27
+ context.report({
28
+ node,
29
+ messageId: "preferMeta",
30
+ fix(fixer) {
31
+ return [fixer.replaceText(callee.property, "meta"), fixer.replaceText(describeArg, `{ description: ${context.sourceCode.getText(describeArg)} }`)];
32
+ }
33
+ });
34
+ }
35
+ };
36
+ }
49
37
  });
38
+ //#endregion
39
+ exports.preferMeta = preferMeta;
@@ -0,0 +1,40 @@
1
+ import { createZodPluginRule } from "../utils/create-plugin-rule.mjs";
2
+ import { createZodSchemaImportTrack } from "../utils/track-zod-schema-imports.mjs";
3
+ //#region src/rules/prefer-meta.ts
4
+ const { zodImportAllowedSource, trackZodSchemaImports } = createZodSchemaImportTrack("all");
5
+ const preferMeta = createZodPluginRule({
6
+ name: "prefer-meta",
7
+ meta: {
8
+ type: "suggestion",
9
+ fixable: "code",
10
+ docs: {
11
+ zodImportAllowedSource,
12
+ description: "Enforce usage of `.meta()` over `.describe()`"
13
+ },
14
+ messages: { preferMeta: "The `.describe()` method still exists for compatibility with Zod 3, but `.meta()` is now the recommended approach." },
15
+ schema: []
16
+ },
17
+ defaultOptions: [],
18
+ create(context) {
19
+ const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods } = trackZodSchemaImports();
20
+ return {
21
+ ImportDeclaration: importDeclarationListener,
22
+ CallExpression(node) {
23
+ const zodSchemaMeta = detectZodSchemaRootNode(node);
24
+ if (!zodSchemaMeta) return;
25
+ const describe = collectZodChainMethods(zodSchemaMeta.node).find((it) => it.name === "describe");
26
+ if (!describe) return;
27
+ const { callee, arguments: [describeArg] } = describe.node;
28
+ context.report({
29
+ node,
30
+ messageId: "preferMeta",
31
+ fix(fixer) {
32
+ return [fixer.replaceText(callee.property, "meta"), fixer.replaceText(describeArg, `{ description: ${context.sourceCode.getText(describeArg)} }`)];
33
+ }
34
+ });
35
+ }
36
+ };
37
+ }
38
+ });
39
+ //#endregion
40
+ export { preferMeta };
@@ -1,149 +1,117 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.preferNamespaceImport = void 0;
4
- const utils_1 = require("@typescript-eslint/utils");
5
- const create_plugin_rule_js_1 = require("../utils/create-plugin-rule.cjs");
6
- const is_zod_import_source_js_1 = require("../utils/is-zod-import-source.cjs");
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_create_plugin_rule = require("../utils/create-plugin-rule.cjs");
3
+ const require_is_zod_import_source = require("../utils/is-zod-import-source.cjs");
4
+ let _typescript_eslint_utils = require("@typescript-eslint/utils");
5
+ //#region src/rules/prefer-namespace-import.ts
7
6
  function isGroupFirstImportTypeNamespace(group) {
8
- const { hasOnlyTypeImports, nodes: [firstImportNode], } = group;
9
- const { specifiers } = firstImportNode;
10
- if (specifiers.length === 1 &&
11
- specifiers[0].type === utils_1.AST_NODE_TYPES.ImportNamespaceSpecifier) {
12
- if (hasOnlyTypeImports) {
13
- if (firstImportNode.importKind === 'type') {
14
- return true;
15
- }
16
- }
17
- else {
18
- return true;
19
- }
20
- }
21
- return false;
7
+ const { hasOnlyTypeImports, nodes: [firstImportNode] } = group;
8
+ const { specifiers } = firstImportNode;
9
+ if (specifiers.length === 1 && specifiers[0].type === _typescript_eslint_utils.AST_NODE_TYPES.ImportNamespaceSpecifier) if (hasOnlyTypeImports) {
10
+ if (firstImportNode.importKind === "type") return true;
11
+ } else return true;
12
+ return false;
22
13
  }
23
14
  function shouldIdentifierBeRenamed(node) {
24
- if (node.parent.type === utils_1.AST_NODE_TYPES.ImportSpecifier) {
25
- return false;
26
- }
27
- if (node.parent.type === utils_1.AST_NODE_TYPES.MemberExpression &&
28
- node.parent.object.type === utils_1.AST_NODE_TYPES.Identifier &&
29
- node.parent.object.name !== node.name) {
30
- return false;
31
- }
32
- return true;
15
+ if (node.parent.type === _typescript_eslint_utils.AST_NODE_TYPES.ImportSpecifier) return false;
16
+ if (node.parent.type === _typescript_eslint_utils.AST_NODE_TYPES.MemberExpression && node.parent.object.type === _typescript_eslint_utils.AST_NODE_TYPES.Identifier && node.parent.object.name !== node.name) return false;
17
+ return true;
33
18
  }
19
+ /**
20
+ * From a given specifiers retrieve the most significant to use when creating an alias import
21
+ */
34
22
  function getNamespaceAliasNameFrom(node) {
35
- if (node.type === utils_1.AST_NODE_TYPES.ImportDefaultSpecifier ||
36
- node.type === utils_1.AST_NODE_TYPES.ImportNamespaceSpecifier) {
37
- return node.local.name;
38
- }
39
- if (node.imported.type === utils_1.AST_NODE_TYPES.Identifier &&
40
- node.imported.name === 'z') {
41
- return node.local.name;
42
- }
43
- return null;
23
+ if (node.type === _typescript_eslint_utils.AST_NODE_TYPES.ImportDefaultSpecifier || node.type === _typescript_eslint_utils.AST_NODE_TYPES.ImportNamespaceSpecifier) return node.local.name;
24
+ if (node.imported.type === _typescript_eslint_utils.AST_NODE_TYPES.Identifier && node.imported.name === "z") return node.local.name;
25
+ return null;
44
26
  }
45
- exports.preferNamespaceImport = (0, create_plugin_rule_js_1.createZodPluginRule)({
46
- name: 'prefer-namespace-import',
47
- meta: {
48
- type: 'suggestion',
49
- deprecated: {
50
- message: "Use `zod/consistent-import` with `{ syntax: 'namespace' }`",
51
- },
52
- docs: {
53
- zodImportAllowedSource: 'all',
54
- description: "Enforce importing zod as a namespace import (`import * as z from 'zod'`)",
55
- },
56
- fixable: 'code',
57
- messages: {
58
- useNamespace: 'Import Zod with a namespace import',
59
- removeDuplicate: 'Zod is already imported via namespace import',
60
- convertUsage: 'Convert to namespace usage',
61
- },
62
- schema: [],
63
- },
64
- defaultOptions: [],
65
- create(context) {
66
- const { sourceCode } = context;
67
- const importGroups = {};
68
- return {
69
- ImportDeclaration(node) {
70
- const { source, importKind } = node;
71
- if (!(0, is_zod_import_source_js_1.isZodImportSource)(source.value, 'all')) {
72
- return;
73
- }
74
- if (!importGroups[source.value]) {
75
- importGroups[source.value] = {
76
- hasOnlyTypeImports: true,
77
- nodes: [],
78
- };
79
- }
80
- if (importGroups[source.value].hasOnlyTypeImports &&
81
- importKind === 'value') {
82
- importGroups[source.value].hasOnlyTypeImports = false;
83
- }
84
- importGroups[source.value].nodes.push(node);
85
- },
86
- 'Program:exit': function () {
87
- let namespaceAliasNameIndex = 0;
88
- for (const importGroup of Object.values(importGroups)) {
89
- const { hasOnlyTypeImports, nodes } = importGroup;
90
- const [firstImportNode, ...othersImportNodes] = nodes;
91
- const nodesWithVariablesToUpdate = [];
92
- let namespaceAliasName = null;
93
- for (const specifier of nodes.flatMap((it) => it.specifiers)) {
94
- if (!namespaceAliasName) {
95
- namespaceAliasName = getNamespaceAliasNameFrom(specifier);
96
- if (namespaceAliasName) {
97
- continue;
98
- }
99
- }
100
- nodesWithVariablesToUpdate.push(specifier);
101
- }
102
- if (!namespaceAliasName) {
103
- namespaceAliasName = 'z';
104
- if (namespaceAliasNameIndex > 0) {
105
- namespaceAliasName = `z${namespaceAliasNameIndex}`;
106
- namespaceAliasNameIndex += 1;
107
- }
108
- }
109
- const isFirstImportValid = isGroupFirstImportTypeNamespace(importGroup);
110
- if (!isFirstImportValid) {
111
- context.report({
112
- node: firstImportNode,
113
- messageId: 'useNamespace',
114
- fix(fixer) {
115
- const importTypeKeyword = hasOnlyTypeImports ? 'type ' : '';
116
- const newImportText = `import ${importTypeKeyword}* as ${namespaceAliasName} from ${firstImportNode.source.raw};`;
117
- return fixer.replaceText(firstImportNode, newImportText);
118
- },
119
- });
120
- }
121
- const allVariables = nodesWithVariablesToUpdate.flatMap((it) => sourceCode.getDeclaredVariables(it));
122
- const allReferences = allVariables.flatMap((it) => it.references);
123
- for (const ref of allReferences) {
124
- const { identifier } = ref;
125
- if (shouldIdentifierBeRenamed(identifier)) {
126
- context.report({
127
- node: identifier,
128
- messageId: 'convertUsage',
129
- fix(fixer) {
130
- const newId = `${namespaceAliasName}.${identifier.name}`;
131
- return fixer.replaceText(identifier, newId);
132
- },
133
- });
134
- }
135
- }
136
- for (const extraImport of othersImportNodes) {
137
- context.report({
138
- node: extraImport,
139
- messageId: 'removeDuplicate',
140
- fix(fixer) {
141
- return fixer.removeRange(extraImport.range);
142
- },
143
- });
144
- }
145
- }
146
- },
147
- };
148
- },
27
+ const preferNamespaceImport = require_create_plugin_rule.createZodPluginRule({
28
+ name: "prefer-namespace-import",
29
+ meta: {
30
+ type: "suggestion",
31
+ deprecated: { message: "Use `zod/consistent-import` with `{ syntax: 'namespace' }`" },
32
+ docs: {
33
+ zodImportAllowedSource: "all",
34
+ description: "Enforce importing zod as a namespace import (`import * as z from 'zod'`)"
35
+ },
36
+ fixable: "code",
37
+ messages: {
38
+ useNamespace: "Import Zod with a namespace import",
39
+ removeDuplicate: "Zod is already imported via namespace import",
40
+ convertUsage: "Convert to namespace usage"
41
+ },
42
+ schema: []
43
+ },
44
+ defaultOptions: [],
45
+ create(context) {
46
+ const { sourceCode } = context;
47
+ const importGroups = {};
48
+ return {
49
+ ImportDeclaration(node) {
50
+ const { source, importKind } = node;
51
+ if (!require_is_zod_import_source.isZodImportSource(source.value, "all")) return;
52
+ if (!importGroups[source.value]) importGroups[source.value] = {
53
+ hasOnlyTypeImports: true,
54
+ nodes: []
55
+ };
56
+ if (importGroups[source.value].hasOnlyTypeImports && importKind === "value") importGroups[source.value].hasOnlyTypeImports = false;
57
+ importGroups[source.value].nodes.push(node);
58
+ },
59
+ "Program:exit": function() {
60
+ let namespaceAliasNameIndex = 0;
61
+ for (const importGroup of Object.values(importGroups)) {
62
+ const { hasOnlyTypeImports, nodes } = importGroup;
63
+ const [firstImportNode, ...othersImportNodes] = nodes;
64
+ /**
65
+ * Variable to track all specifiers that later are used by {@link getDeclaredVariables}
66
+ * to add the namespace prefix
67
+ */
68
+ const nodesWithVariablesToUpdate = [];
69
+ let namespaceAliasName = null;
70
+ for (const specifier of nodes.flatMap((it) => it.specifiers)) {
71
+ if (!namespaceAliasName) {
72
+ namespaceAliasName = getNamespaceAliasNameFrom(specifier);
73
+ if (namespaceAliasName) continue;
74
+ }
75
+ nodesWithVariablesToUpdate.push(specifier);
76
+ }
77
+ if (!namespaceAliasName) {
78
+ namespaceAliasName = "z";
79
+ if (namespaceAliasNameIndex > 0) {
80
+ namespaceAliasName = `z${namespaceAliasNameIndex}`;
81
+ namespaceAliasNameIndex += 1;
82
+ }
83
+ }
84
+ if (!isGroupFirstImportTypeNamespace(importGroup)) context.report({
85
+ node: firstImportNode,
86
+ messageId: "useNamespace",
87
+ fix(fixer) {
88
+ const newImportText = `import ${hasOnlyTypeImports ? "type " : ""}* as ${namespaceAliasName} from ${firstImportNode.source.raw};`;
89
+ return fixer.replaceText(firstImportNode, newImportText);
90
+ }
91
+ });
92
+ const allReferences = nodesWithVariablesToUpdate.flatMap((it) => sourceCode.getDeclaredVariables(it)).flatMap((it) => it.references);
93
+ for (const ref of allReferences) {
94
+ const { identifier } = ref;
95
+ if (shouldIdentifierBeRenamed(identifier)) context.report({
96
+ node: identifier,
97
+ messageId: "convertUsage",
98
+ fix(fixer) {
99
+ const newId = `${namespaceAliasName}.${identifier.name}`;
100
+ return fixer.replaceText(identifier, newId);
101
+ }
102
+ });
103
+ }
104
+ for (const extraImport of othersImportNodes) context.report({
105
+ node: extraImport,
106
+ messageId: "removeDuplicate",
107
+ fix(fixer) {
108
+ return fixer.removeRange(extraImport.range);
109
+ }
110
+ });
111
+ }
112
+ }
113
+ };
114
+ }
149
115
  });
116
+ //#endregion
117
+ exports.preferNamespaceImport = preferNamespaceImport;