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,41 +1,33 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.noEmptyCustomSchema = 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.noEmptyCustomSchema = (0, create_plugin_rule_js_1.createZodPluginRule)({
8
- name: 'no-empty-custom-schema',
9
- meta: {
10
- hasSuggestions: false,
11
- type: 'suggestion',
12
- docs: {
13
- zodImportAllowedSource,
14
- description: 'Disallow usage of `z.custom()` without arguments',
15
- },
16
- messages: {
17
- noEmptyCustomSchema: 'You should provide a validate function within `z.custom()`',
18
- },
19
- schema: [],
20
- },
21
- defaultOptions: [],
22
- create(context) {
23
- const { importDeclarationListener, detectZodSchemaRootNode, } = trackZodSchemaImports();
24
- return {
25
- ImportDeclaration: importDeclarationListener,
26
- CallExpression(node) {
27
- const zodSchemaMeta = detectZodSchemaRootNode(node);
28
- if (!zodSchemaMeta) {
29
- return;
30
- }
31
- if (zodSchemaMeta.schemaType === 'custom' &&
32
- node.arguments.length === 0) {
33
- context.report({
34
- node,
35
- messageId: 'noEmptyCustomSchema',
36
- });
37
- }
38
- },
39
- };
40
- },
1
+ const require_create_plugin_rule = require("../utils/create-plugin-rule.cjs");
2
+ //#region src/rules/no-empty-custom-schema.ts
3
+ const { zodImportAllowedSource, trackZodSchemaImports } = require("../utils/track-zod-schema-imports.cjs").createZodSchemaImportTrack("all");
4
+ const noEmptyCustomSchema = require_create_plugin_rule.createZodPluginRule({
5
+ name: "no-empty-custom-schema",
6
+ meta: {
7
+ hasSuggestions: false,
8
+ type: "suggestion",
9
+ docs: {
10
+ zodImportAllowedSource,
11
+ description: "Disallow usage of `z.custom()` without arguments"
12
+ },
13
+ messages: { noEmptyCustomSchema: "You should provide a validate function within `z.custom()`" },
14
+ schema: []
15
+ },
16
+ defaultOptions: [],
17
+ create(context) {
18
+ const { importDeclarationListener, detectZodSchemaRootNode } = trackZodSchemaImports();
19
+ return {
20
+ ImportDeclaration: importDeclarationListener,
21
+ CallExpression(node) {
22
+ const zodSchemaMeta = detectZodSchemaRootNode(node);
23
+ if (!zodSchemaMeta) return;
24
+ if (zodSchemaMeta.schemaType === "custom" && node.arguments.length === 0) context.report({
25
+ node,
26
+ messageId: "noEmptyCustomSchema"
27
+ });
28
+ }
29
+ };
30
+ }
41
31
  });
32
+ //#endregion
33
+ exports.noEmptyCustomSchema = noEmptyCustomSchema;
@@ -0,0 +1,34 @@
1
+ import { createZodPluginRule } from "../utils/create-plugin-rule.mjs";
2
+ import { createZodSchemaImportTrack } from "../utils/track-zod-schema-imports.mjs";
3
+ //#region src/rules/no-empty-custom-schema.ts
4
+ const { zodImportAllowedSource, trackZodSchemaImports } = createZodSchemaImportTrack("all");
5
+ const noEmptyCustomSchema = createZodPluginRule({
6
+ name: "no-empty-custom-schema",
7
+ meta: {
8
+ hasSuggestions: false,
9
+ type: "suggestion",
10
+ docs: {
11
+ zodImportAllowedSource,
12
+ description: "Disallow usage of `z.custom()` without arguments"
13
+ },
14
+ messages: { noEmptyCustomSchema: "You should provide a validate function within `z.custom()`" },
15
+ schema: []
16
+ },
17
+ defaultOptions: [],
18
+ create(context) {
19
+ const { importDeclarationListener, detectZodSchemaRootNode } = trackZodSchemaImports();
20
+ return {
21
+ ImportDeclaration: importDeclarationListener,
22
+ CallExpression(node) {
23
+ const zodSchemaMeta = detectZodSchemaRootNode(node);
24
+ if (!zodSchemaMeta) return;
25
+ if (zodSchemaMeta.schemaType === "custom" && node.arguments.length === 0) context.report({
26
+ node,
27
+ messageId: "noEmptyCustomSchema"
28
+ });
29
+ }
30
+ };
31
+ }
32
+ });
33
+ //#endregion
34
+ export { noEmptyCustomSchema };
@@ -1,63 +1,57 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.noNumberSchemaWithInt = void 0;
4
- const build_zod_chain_replacement_fix_js_1 = require("../utils/build-zod-chain-replacement-fix.cjs");
5
- const create_plugin_rule_js_1 = require("../utils/create-plugin-rule.cjs");
6
- const track_zod_schema_imports_js_1 = require("../utils/track-zod-schema-imports.cjs");
7
- const { zodImportAllowedSource, trackZodSchemaImports, } = (0, track_zod_schema_imports_js_1.createZodSchemaImportTrack)('zod');
8
- exports.noNumberSchemaWithInt = (0, create_plugin_rule_js_1.createZodPluginRule)({
9
- name: 'no-number-schema-with-int',
10
- meta: {
11
- fixable: 'code',
12
- type: 'problem',
13
- docs: {
14
- zodImportAllowedSource,
15
- description: 'Disallow usage of `z.number().int()` as it is considered legacy',
16
- },
17
- messages: {
18
- removeNumber: '`z.number().int()` is considered legacy. Use `z.int()` instead.',
19
- },
20
- schema: [],
21
- },
22
- defaultOptions: [],
23
- create(context) {
24
- const { sourceCode } = context;
25
- const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods, } = trackZodSchemaImports();
26
- return {
27
- ImportDeclaration: importDeclarationListener,
28
- CallExpression(node) {
29
- const zodSchemaMeta = detectZodSchemaRootNode(node);
30
- if ((zodSchemaMeta === null || zodSchemaMeta === void 0 ? void 0 : zodSchemaMeta.schemaType) !== 'number') {
31
- return;
32
- }
33
- const methods = collectZodChainMethods(node);
34
- const intIndex = methods.findIndex((m) => m.name === 'int');
35
- if (intIndex === -1) {
36
- return;
37
- }
38
- const numberIndex = methods.findIndex((m) => m.name === 'number');
39
- if (zodSchemaMeta.schemaDecl === 'named') {
40
- context.report({
41
- node,
42
- messageId: 'removeNumber',
43
- });
44
- return;
45
- }
46
- context.report({
47
- node,
48
- messageId: 'removeNumber',
49
- fix(fixer) {
50
- return (0, build_zod_chain_replacement_fix_js_1.buildZodChainReplacementFix)({
51
- sourceCode,
52
- fixer,
53
- methods,
54
- fromIndex: numberIndex,
55
- toIndex: intIndex,
56
- toMethodName: 'int',
57
- });
58
- },
59
- });
60
- },
61
- };
62
- },
1
+ const require_create_plugin_rule = require("../utils/create-plugin-rule.cjs");
2
+ const require_track_zod_schema_imports = require("../utils/track-zod-schema-imports.cjs");
3
+ const require_build_zod_chain_replacement_fix = require("../utils/build-zod-chain-replacement-fix.cjs");
4
+ //#region src/rules/no-number-schema-with-int.ts
5
+ const { zodImportAllowedSource, trackZodSchemaImports } = require_track_zod_schema_imports.createZodSchemaImportTrack("zod");
6
+ const noNumberSchemaWithInt = require_create_plugin_rule.createZodPluginRule({
7
+ name: "no-number-schema-with-int",
8
+ meta: {
9
+ fixable: "code",
10
+ type: "problem",
11
+ docs: {
12
+ zodImportAllowedSource,
13
+ description: "Disallow usage of `z.number().int()` as it is considered legacy"
14
+ },
15
+ messages: { removeNumber: "`z.number().int()` is considered legacy. Use `z.int()` instead." },
16
+ schema: []
17
+ },
18
+ defaultOptions: [],
19
+ create(context) {
20
+ const { sourceCode } = context;
21
+ const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods } = trackZodSchemaImports();
22
+ return {
23
+ ImportDeclaration: importDeclarationListener,
24
+ CallExpression(node) {
25
+ const zodSchemaMeta = detectZodSchemaRootNode(node);
26
+ if (zodSchemaMeta?.schemaType !== "number") return;
27
+ const methods = collectZodChainMethods(node);
28
+ const intIndex = methods.findIndex((m) => m.name === "int");
29
+ if (intIndex === -1) return;
30
+ const numberIndex = methods.findIndex((m) => m.name === "number");
31
+ if (zodSchemaMeta.schemaDecl === "named") {
32
+ context.report({
33
+ node,
34
+ messageId: "removeNumber"
35
+ });
36
+ return;
37
+ }
38
+ context.report({
39
+ node,
40
+ messageId: "removeNumber",
41
+ fix(fixer) {
42
+ return require_build_zod_chain_replacement_fix.buildZodChainReplacementFix({
43
+ sourceCode,
44
+ fixer,
45
+ methods,
46
+ fromIndex: numberIndex,
47
+ toIndex: intIndex,
48
+ toMethodName: "int"
49
+ });
50
+ }
51
+ });
52
+ }
53
+ };
54
+ }
63
55
  });
56
+ //#endregion
57
+ exports.noNumberSchemaWithInt = noNumberSchemaWithInt;
@@ -0,0 +1,57 @@
1
+ import { createZodPluginRule } from "../utils/create-plugin-rule.mjs";
2
+ import { createZodSchemaImportTrack } from "../utils/track-zod-schema-imports.mjs";
3
+ import { buildZodChainReplacementFix } from "../utils/build-zod-chain-replacement-fix.mjs";
4
+ //#region src/rules/no-number-schema-with-int.ts
5
+ const { zodImportAllowedSource, trackZodSchemaImports } = createZodSchemaImportTrack("zod");
6
+ const noNumberSchemaWithInt = createZodPluginRule({
7
+ name: "no-number-schema-with-int",
8
+ meta: {
9
+ fixable: "code",
10
+ type: "problem",
11
+ docs: {
12
+ zodImportAllowedSource,
13
+ description: "Disallow usage of `z.number().int()` as it is considered legacy"
14
+ },
15
+ messages: { removeNumber: "`z.number().int()` is considered legacy. Use `z.int()` instead." },
16
+ schema: []
17
+ },
18
+ defaultOptions: [],
19
+ create(context) {
20
+ const { sourceCode } = context;
21
+ const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods } = trackZodSchemaImports();
22
+ return {
23
+ ImportDeclaration: importDeclarationListener,
24
+ CallExpression(node) {
25
+ const zodSchemaMeta = detectZodSchemaRootNode(node);
26
+ if (zodSchemaMeta?.schemaType !== "number") return;
27
+ const methods = collectZodChainMethods(node);
28
+ const intIndex = methods.findIndex((m) => m.name === "int");
29
+ if (intIndex === -1) return;
30
+ const numberIndex = methods.findIndex((m) => m.name === "number");
31
+ if (zodSchemaMeta.schemaDecl === "named") {
32
+ context.report({
33
+ node,
34
+ messageId: "removeNumber"
35
+ });
36
+ return;
37
+ }
38
+ context.report({
39
+ node,
40
+ messageId: "removeNumber",
41
+ fix(fixer) {
42
+ return buildZodChainReplacementFix({
43
+ sourceCode,
44
+ fixer,
45
+ methods,
46
+ fromIndex: numberIndex,
47
+ toIndex: intIndex,
48
+ toMethodName: "int"
49
+ });
50
+ }
51
+ });
52
+ }
53
+ };
54
+ }
55
+ });
56
+ //#endregion
57
+ export { noNumberSchemaWithInt };
@@ -1,81 +1,70 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.noOptionalAndDefaultTogether = 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
- const preferredMethods = ['none', 'default', 'optional'];
8
- const defaultOptions = { preferredMethod: 'none' };
9
- exports.noOptionalAndDefaultTogether = (0, create_plugin_rule_js_1.createZodPluginRule)({
10
- name: 'no-optional-and-default-together',
11
- meta: {
12
- type: 'problem',
13
- fixable: 'code',
14
- docs: {
15
- zodImportAllowedSource,
16
- description: 'Disallow using both `.optional()` and `.default()` on the same Zod schema',
17
- },
18
- messages: {
19
- noOptionalAndDefaultTogether: 'Using both `.optional()` and `.default()` is redundant. A schema with a default value is already optional.',
20
- noOptionalAndDefaultTogetherRemoveMethod: 'Using both `.optional()` and `.default()` is redundant. Remove the `.{{method}}()` method to avoid redundancy.',
21
- },
22
- schema: [
23
- {
24
- type: 'object',
25
- properties: {
26
- preferredMethod: {
27
- description: 'Determines which method to keep when both are present',
28
- type: 'string',
29
- enum: [...preferredMethods],
30
- },
31
- },
32
- additionalProperties: false,
33
- },
34
- ],
35
- },
36
- defaultOptions: [defaultOptions],
37
- create(context, [{ preferredMethod }]) {
38
- const { sourceCode } = context;
39
- const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods, } = trackZodSchemaImports();
40
- return {
41
- ImportDeclaration: importDeclarationListener,
42
- CallExpression(node) {
43
- if (!detectZodSchemaRootNode(node)) {
44
- return;
45
- }
46
- const methods = collectZodChainMethods(node);
47
- if (methods.length === 0) {
48
- return;
49
- }
50
- const optionalMethod = methods.find((m) => m.name === 'optional');
51
- const defaultMethod = methods.find((m) => m.name === 'default');
52
- if (!optionalMethod || !defaultMethod) {
53
- return;
54
- }
55
- const reportNode = methods.indexOf(optionalMethod) > methods.indexOf(defaultMethod)
56
- ? optionalMethod.node
57
- : defaultMethod.node;
58
- if (preferredMethod === 'none') {
59
- context.report({
60
- node: reportNode,
61
- messageId: 'noOptionalAndDefaultTogether',
62
- });
63
- return;
64
- }
65
- const methodToRemoveName = preferredMethod === 'default' ? 'optional' : 'default';
66
- context.report({
67
- node: reportNode,
68
- messageId: 'noOptionalAndDefaultTogetherRemoveMethod',
69
- data: { method: methodToRemoveName },
70
- fix(fixer) {
71
- const nodeToRemove = preferredMethod === 'default'
72
- ? optionalMethod.node
73
- : defaultMethod.node;
74
- const calleeToRemove = nodeToRemove.callee;
75
- return fixer.replaceText(nodeToRemove, sourceCode.getText(calleeToRemove.object));
76
- },
77
- });
78
- },
79
- };
80
- },
1
+ const require_create_plugin_rule = require("../utils/create-plugin-rule.cjs");
2
+ //#region src/rules/no-optional-and-default-together.ts
3
+ const { zodImportAllowedSource, trackZodSchemaImports } = require("../utils/track-zod-schema-imports.cjs").createZodSchemaImportTrack("zod");
4
+ const preferredMethods = [
5
+ "none",
6
+ "default",
7
+ "optional"
8
+ ];
9
+ const defaultOptions = { preferredMethod: "none" };
10
+ const noOptionalAndDefaultTogether = require_create_plugin_rule.createZodPluginRule({
11
+ name: "no-optional-and-default-together",
12
+ meta: {
13
+ type: "problem",
14
+ fixable: "code",
15
+ docs: {
16
+ zodImportAllowedSource,
17
+ description: "Disallow using both `.optional()` and `.default()` on the same Zod schema"
18
+ },
19
+ messages: {
20
+ noOptionalAndDefaultTogether: "Using both `.optional()` and `.default()` is redundant. A schema with a default value is already optional.",
21
+ noOptionalAndDefaultTogetherRemoveMethod: "Using both `.optional()` and `.default()` is redundant. Remove the `.{{method}}()` method to avoid redundancy."
22
+ },
23
+ schema: [{
24
+ type: "object",
25
+ properties: { preferredMethod: {
26
+ description: "Determines which method to keep when both are present",
27
+ type: "string",
28
+ enum: [...preferredMethods]
29
+ } },
30
+ additionalProperties: false
31
+ }]
32
+ },
33
+ defaultOptions: [defaultOptions],
34
+ create(context, [{ preferredMethod }]) {
35
+ const { sourceCode } = context;
36
+ const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods } = trackZodSchemaImports();
37
+ return {
38
+ ImportDeclaration: importDeclarationListener,
39
+ CallExpression(node) {
40
+ if (!detectZodSchemaRootNode(node)) return;
41
+ const methods = collectZodChainMethods(node);
42
+ if (methods.length === 0) return;
43
+ const optionalMethod = methods.find((m) => m.name === "optional");
44
+ const defaultMethod = methods.find((m) => m.name === "default");
45
+ if (!optionalMethod || !defaultMethod) return;
46
+ const reportNode = methods.indexOf(optionalMethod) > methods.indexOf(defaultMethod) ? optionalMethod.node : defaultMethod.node;
47
+ if (preferredMethod === "none") {
48
+ context.report({
49
+ node: reportNode,
50
+ messageId: "noOptionalAndDefaultTogether"
51
+ });
52
+ return;
53
+ }
54
+ const methodToRemoveName = preferredMethod === "default" ? "optional" : "default";
55
+ context.report({
56
+ node: reportNode,
57
+ messageId: "noOptionalAndDefaultTogetherRemoveMethod",
58
+ data: { method: methodToRemoveName },
59
+ fix(fixer) {
60
+ const nodeToRemove = preferredMethod === "default" ? optionalMethod.node : defaultMethod.node;
61
+ const calleeToRemove = nodeToRemove.callee;
62
+ return fixer.replaceText(nodeToRemove, sourceCode.getText(calleeToRemove.object));
63
+ }
64
+ });
65
+ }
66
+ };
67
+ }
81
68
  });
69
+ //#endregion
70
+ exports.noOptionalAndDefaultTogether = noOptionalAndDefaultTogether;
@@ -0,0 +1,71 @@
1
+ import { createZodPluginRule } from "../utils/create-plugin-rule.mjs";
2
+ import { createZodSchemaImportTrack } from "../utils/track-zod-schema-imports.mjs";
3
+ //#region src/rules/no-optional-and-default-together.ts
4
+ const { zodImportAllowedSource, trackZodSchemaImports } = createZodSchemaImportTrack("zod");
5
+ const preferredMethods = [
6
+ "none",
7
+ "default",
8
+ "optional"
9
+ ];
10
+ const defaultOptions = { preferredMethod: "none" };
11
+ const noOptionalAndDefaultTogether = createZodPluginRule({
12
+ name: "no-optional-and-default-together",
13
+ meta: {
14
+ type: "problem",
15
+ fixable: "code",
16
+ docs: {
17
+ zodImportAllowedSource,
18
+ description: "Disallow using both `.optional()` and `.default()` on the same Zod schema"
19
+ },
20
+ messages: {
21
+ noOptionalAndDefaultTogether: "Using both `.optional()` and `.default()` is redundant. A schema with a default value is already optional.",
22
+ noOptionalAndDefaultTogetherRemoveMethod: "Using both `.optional()` and `.default()` is redundant. Remove the `.{{method}}()` method to avoid redundancy."
23
+ },
24
+ schema: [{
25
+ type: "object",
26
+ properties: { preferredMethod: {
27
+ description: "Determines which method to keep when both are present",
28
+ type: "string",
29
+ enum: [...preferredMethods]
30
+ } },
31
+ additionalProperties: false
32
+ }]
33
+ },
34
+ defaultOptions: [defaultOptions],
35
+ create(context, [{ preferredMethod }]) {
36
+ const { sourceCode } = context;
37
+ const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods } = trackZodSchemaImports();
38
+ return {
39
+ ImportDeclaration: importDeclarationListener,
40
+ CallExpression(node) {
41
+ if (!detectZodSchemaRootNode(node)) return;
42
+ const methods = collectZodChainMethods(node);
43
+ if (methods.length === 0) return;
44
+ const optionalMethod = methods.find((m) => m.name === "optional");
45
+ const defaultMethod = methods.find((m) => m.name === "default");
46
+ if (!optionalMethod || !defaultMethod) return;
47
+ const reportNode = methods.indexOf(optionalMethod) > methods.indexOf(defaultMethod) ? optionalMethod.node : defaultMethod.node;
48
+ if (preferredMethod === "none") {
49
+ context.report({
50
+ node: reportNode,
51
+ messageId: "noOptionalAndDefaultTogether"
52
+ });
53
+ return;
54
+ }
55
+ const methodToRemoveName = preferredMethod === "default" ? "optional" : "default";
56
+ context.report({
57
+ node: reportNode,
58
+ messageId: "noOptionalAndDefaultTogetherRemoveMethod",
59
+ data: { method: methodToRemoveName },
60
+ fix(fixer) {
61
+ const nodeToRemove = preferredMethod === "default" ? optionalMethod.node : defaultMethod.node;
62
+ const calleeToRemove = nodeToRemove.callee;
63
+ return fixer.replaceText(nodeToRemove, sourceCode.getText(calleeToRemove.object));
64
+ }
65
+ });
66
+ }
67
+ };
68
+ }
69
+ });
70
+ //#endregion
71
+ export { noOptionalAndDefaultTogether };
@@ -1,64 +1,58 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.noStringSchemaWithUuid = void 0;
4
- const build_zod_chain_replacement_fix_js_1 = require("../utils/build-zod-chain-replacement-fix.cjs");
5
- const create_plugin_rule_js_1 = require("../utils/create-plugin-rule.cjs");
6
- const track_zod_schema_imports_js_1 = require("../utils/track-zod-schema-imports.cjs");
7
- const { zodImportAllowedSource, trackZodSchemaImports, } = (0, track_zod_schema_imports_js_1.createZodSchemaImportTrack)('zod');
8
- exports.noStringSchemaWithUuid = (0, create_plugin_rule_js_1.createZodPluginRule)({
9
- name: 'no-string-schema-with-uuid',
10
- meta: {
11
- fixable: 'code',
12
- type: 'problem',
13
- docs: {
14
- zodImportAllowedSource,
15
- description: 'Disallow usage of `z.string().uuid()` in favor of the dedicated `z.uuid()` schema',
16
- url: 'https://zod.dev/api#uuids',
17
- },
18
- messages: {
19
- useUuid: '`z.string().uuid()` is redundant. Use `z.uuid()` instead.',
20
- },
21
- schema: [],
22
- },
23
- defaultOptions: [],
24
- create(context) {
25
- const { sourceCode } = context;
26
- const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods, } = trackZodSchemaImports();
27
- return {
28
- ImportDeclaration: importDeclarationListener,
29
- CallExpression(node) {
30
- const zodSchemaMeta = detectZodSchemaRootNode(node);
31
- if ((zodSchemaMeta === null || zodSchemaMeta === void 0 ? void 0 : zodSchemaMeta.schemaType) !== 'string') {
32
- return;
33
- }
34
- const methods = collectZodChainMethods(node);
35
- const uuidIndex = methods.findIndex((m) => m.name === 'uuid');
36
- if (uuidIndex === -1) {
37
- return;
38
- }
39
- const stringIndex = methods.findIndex((m) => m.name === 'string');
40
- if (zodSchemaMeta.schemaDecl === 'named') {
41
- context.report({
42
- node,
43
- messageId: 'useUuid',
44
- });
45
- return;
46
- }
47
- context.report({
48
- node,
49
- messageId: 'useUuid',
50
- fix(fixer) {
51
- return (0, build_zod_chain_replacement_fix_js_1.buildZodChainReplacementFix)({
52
- sourceCode,
53
- fixer,
54
- methods,
55
- fromIndex: stringIndex,
56
- toIndex: uuidIndex,
57
- toMethodName: 'uuid',
58
- });
59
- },
60
- });
61
- },
62
- };
63
- },
1
+ const require_create_plugin_rule = require("../utils/create-plugin-rule.cjs");
2
+ const require_track_zod_schema_imports = require("../utils/track-zod-schema-imports.cjs");
3
+ const require_build_zod_chain_replacement_fix = require("../utils/build-zod-chain-replacement-fix.cjs");
4
+ //#region src/rules/no-string-schema-with-uuid.ts
5
+ const { zodImportAllowedSource, trackZodSchemaImports } = require_track_zod_schema_imports.createZodSchemaImportTrack("zod");
6
+ const noStringSchemaWithUuid = require_create_plugin_rule.createZodPluginRule({
7
+ name: "no-string-schema-with-uuid",
8
+ meta: {
9
+ fixable: "code",
10
+ type: "problem",
11
+ docs: {
12
+ zodImportAllowedSource,
13
+ description: "Disallow usage of `z.string().uuid()` in favor of the dedicated `z.uuid()` schema",
14
+ url: "https://zod.dev/api#uuids"
15
+ },
16
+ messages: { useUuid: "`z.string().uuid()` is redundant. Use `z.uuid()` instead." },
17
+ schema: []
18
+ },
19
+ defaultOptions: [],
20
+ create(context) {
21
+ const { sourceCode } = context;
22
+ const { importDeclarationListener, detectZodSchemaRootNode, collectZodChainMethods } = trackZodSchemaImports();
23
+ return {
24
+ ImportDeclaration: importDeclarationListener,
25
+ CallExpression(node) {
26
+ const zodSchemaMeta = detectZodSchemaRootNode(node);
27
+ if (zodSchemaMeta?.schemaType !== "string") return;
28
+ const methods = collectZodChainMethods(node);
29
+ const uuidIndex = methods.findIndex((m) => m.name === "uuid");
30
+ if (uuidIndex === -1) return;
31
+ const stringIndex = methods.findIndex((m) => m.name === "string");
32
+ if (zodSchemaMeta.schemaDecl === "named") {
33
+ context.report({
34
+ node,
35
+ messageId: "useUuid"
36
+ });
37
+ return;
38
+ }
39
+ context.report({
40
+ node,
41
+ messageId: "useUuid",
42
+ fix(fixer) {
43
+ return require_build_zod_chain_replacement_fix.buildZodChainReplacementFix({
44
+ sourceCode,
45
+ fixer,
46
+ methods,
47
+ fromIndex: stringIndex,
48
+ toIndex: uuidIndex,
49
+ toMethodName: "uuid"
50
+ });
51
+ }
52
+ });
53
+ }
54
+ };
55
+ }
64
56
  });
57
+ //#endregion
58
+ exports.noStringSchemaWithUuid = noStringSchemaWithUuid;