@kamaalio/codemods 0.0.1 → 0.0.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 (179) hide show
  1. package/README.md +0 -6
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.js +64 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/codemods/joi-to-zod/index.d.ts +10 -0
  6. package/dist/codemods/joi-to-zod/index.js +83 -0
  7. package/dist/codemods/joi-to-zod/index.js.map +1 -0
  8. package/dist/codemods/joi-to-zod/rules/joi-add-manual-migration-todo.d.ts +3 -0
  9. package/dist/codemods/joi-to-zod/rules/joi-add-manual-migration-todo.js +36 -0
  10. package/dist/codemods/joi-to-zod/rules/joi-add-manual-migration-todo.js.map +1 -0
  11. package/dist/codemods/joi-to-zod/rules/joi-add-optional.d.ts +3 -0
  12. package/dist/codemods/joi-to-zod/rules/joi-add-optional.js +19 -0
  13. package/dist/codemods/joi-to-zod/rules/joi-add-optional.js.map +1 -0
  14. package/dist/codemods/joi-to-zod/rules/joi-alternatives-to-union.d.ts +3 -0
  15. package/dist/codemods/joi-to-zod/rules/joi-alternatives-to-union.js +24 -0
  16. package/dist/codemods/joi-to-zod/rules/joi-alternatives-to-union.js.map +1 -0
  17. package/dist/codemods/joi-to-zod/rules/joi-array-items-unnest.d.ts +3 -0
  18. package/dist/codemods/joi-to-zod/rules/joi-array-items-unnest.js +28 -0
  19. package/dist/codemods/joi-to-zod/rules/joi-array-items-unnest.js.map +1 -0
  20. package/dist/codemods/joi-to-zod/rules/joi-assert-to-refine.d.ts +3 -0
  21. package/dist/codemods/joi-to-zod/rules/joi-assert-to-refine.js +68 -0
  22. package/dist/codemods/joi-to-zod/rules/joi-assert-to-refine.js.map +1 -0
  23. package/dist/codemods/joi-to-zod/rules/joi-binary-to-instanceof.d.ts +3 -0
  24. package/dist/codemods/joi-to-zod/rules/joi-binary-to-instanceof.js +12 -0
  25. package/dist/codemods/joi-to-zod/rules/joi-binary-to-instanceof.js.map +1 -0
  26. package/dist/codemods/joi-to-zod/rules/joi-check-to-enum.d.ts +3 -0
  27. package/dist/codemods/joi-to-zod/rules/joi-check-to-enum.js +57 -0
  28. package/dist/codemods/joi-to-zod/rules/joi-check-to-enum.js.map +1 -0
  29. package/dist/codemods/joi-to-zod/rules/joi-concat-to-intersection.d.ts +3 -0
  30. package/dist/codemods/joi-to-zod/rules/joi-concat-to-intersection.js +24 -0
  31. package/dist/codemods/joi-to-zod/rules/joi-concat-to-intersection.js.map +1 -0
  32. package/dist/codemods/joi-to-zod/rules/joi-custom-to-transform.d.ts +3 -0
  33. package/dist/codemods/joi-to-zod/rules/joi-custom-to-transform.js +95 -0
  34. package/dist/codemods/joi-to-zod/rules/joi-custom-to-transform.js.map +1 -0
  35. package/dist/codemods/joi-to-zod/rules/joi-date-to-coerce-date.d.ts +3 -0
  36. package/dist/codemods/joi-to-zod/rules/joi-date-to-coerce-date.js +55 -0
  37. package/dist/codemods/joi-to-zod/rules/joi-date-to-coerce-date.js.map +1 -0
  38. package/dist/codemods/joi-to-zod/rules/joi-forbidden-to-never.d.ts +3 -0
  39. package/dist/codemods/joi-to-zod/rules/joi-forbidden-to-never.js +13 -0
  40. package/dist/codemods/joi-to-zod/rules/joi-forbidden-to-never.js.map +1 -0
  41. package/dist/codemods/joi-to-zod/rules/joi-formats-to-zod-base.d.ts +3 -0
  42. package/dist/codemods/joi-to-zod/rules/joi-formats-to-zod-base.js +64 -0
  43. package/dist/codemods/joi-to-zod/rules/joi-formats-to-zod-base.js.map +1 -0
  44. package/dist/codemods/joi-to-zod/rules/joi-object-keys-unnest.d.ts +3 -0
  45. package/dist/codemods/joi-to-zod/rules/joi-object-keys-unnest.js +24 -0
  46. package/dist/codemods/joi-to-zod/rules/joi-object-keys-unnest.js.map +1 -0
  47. package/dist/codemods/joi-to-zod/rules/joi-object-pattern-to-record.d.ts +3 -0
  48. package/dist/codemods/joi-to-zod/rules/joi-object-pattern-to-record.js +25 -0
  49. package/dist/codemods/joi-to-zod/rules/joi-object-pattern-to-record.js.map +1 -0
  50. package/dist/codemods/joi-to-zod/rules/joi-object-relations-to-refine.d.ts +3 -0
  51. package/dist/codemods/joi-to-zod/rules/joi-object-relations-to-refine.js +90 -0
  52. package/dist/codemods/joi-to-zod/rules/joi-object-relations-to-refine.js.map +1 -0
  53. package/dist/codemods/joi-to-zod/rules/joi-reference-to-zod.d.ts +3 -0
  54. package/dist/codemods/joi-to-zod/rules/joi-reference-to-zod.js +18 -0
  55. package/dist/codemods/joi-to-zod/rules/joi-reference-to-zod.js.map +1 -0
  56. package/dist/codemods/joi-to-zod/rules/joi-remove-import.d.ts +3 -0
  57. package/dist/codemods/joi-to-zod/rules/joi-remove-import.js +17 -0
  58. package/dist/codemods/joi-to-zod/rules/joi-remove-import.js.map +1 -0
  59. package/dist/codemods/joi-to-zod/rules/joi-remove-options-from-regex.d.ts +3 -0
  60. package/dist/codemods/joi-to-zod/rules/joi-remove-options-from-regex.js +27 -0
  61. package/dist/codemods/joi-to-zod/rules/joi-remove-options-from-regex.js.map +1 -0
  62. package/dist/codemods/joi-to-zod/rules/joi-remove-primitive-for-enum.d.ts +3 -0
  63. package/dist/codemods/joi-to-zod/rules/joi-remove-primitive-for-enum.js +21 -0
  64. package/dist/codemods/joi-to-zod/rules/joi-remove-primitive-for-enum.js.map +1 -0
  65. package/dist/codemods/joi-to-zod/rules/joi-remove-required.d.ts +3 -0
  66. package/dist/codemods/joi-to-zod/rules/joi-remove-required.js +18 -0
  67. package/dist/codemods/joi-to-zod/rules/joi-remove-required.js.map +1 -0
  68. package/dist/codemods/joi-to-zod/rules/joi-validations-to-zod-validations.d.ts +3 -0
  69. package/dist/codemods/joi-to-zod/rules/joi-validations-to-zod-validations.js +92 -0
  70. package/dist/codemods/joi-to-zod/rules/joi-validations-to-zod-validations.js.map +1 -0
  71. package/dist/codemods/joi-to-zod/rules/joi-when-to-refine.d.ts +3 -0
  72. package/dist/codemods/joi-to-zod/rules/joi-when-to-refine.js +182 -0
  73. package/dist/codemods/joi-to-zod/rules/joi-when-to-refine.js.map +1 -0
  74. package/dist/codemods/joi-to-zod/rules/zod-add-import.d.ts +3 -0
  75. package/dist/codemods/joi-to-zod/rules/zod-add-import.js +20 -0
  76. package/dist/codemods/joi-to-zod/rules/zod-add-import.js.map +1 -0
  77. package/dist/codemods/joi-to-zod/types.d.ts +1 -0
  78. package/dist/codemods/joi-to-zod/types.js +2 -0
  79. package/dist/codemods/joi-to-zod/types.js.map +1 -0
  80. package/dist/codemods/joi-to-zod/utils/get-joi-identifier-name.d.ts +4 -0
  81. package/dist/codemods/joi-to-zod/utils/get-joi-identifier-name.js +6 -0
  82. package/dist/codemods/joi-to-zod/utils/get-joi-identifier-name.js.map +1 -0
  83. package/dist/codemods/joi-to-zod/utils/get-joi-import.d.ts +5 -0
  84. package/dist/codemods/joi-to-zod/utils/get-joi-import.js +8 -0
  85. package/dist/codemods/joi-to-zod/utils/get-joi-import.js.map +1 -0
  86. package/dist/codemods/joi-to-zod/utils/get-joi-primitive.d.ts +4 -0
  87. package/dist/codemods/joi-to-zod/utils/get-joi-primitive.js +11 -0
  88. package/dist/codemods/joi-to-zod/utils/get-joi-primitive.js.map +1 -0
  89. package/dist/codemods/joi-to-zod/utils/get-joi-properties.d.ts +8 -0
  90. package/dist/codemods/joi-to-zod/utils/get-joi-properties.js +64 -0
  91. package/dist/codemods/joi-to-zod/utils/get-joi-properties.js.map +1 -0
  92. package/dist/codemods/joi-to-zod/utils/has-joi-import.d.ts +4 -0
  93. package/dist/codemods/joi-to-zod/utils/has-joi-import.js +7 -0
  94. package/dist/codemods/joi-to-zod/utils/has-joi-import.js.map +1 -0
  95. package/dist/codemods/joi-to-zod/utils/has-zod-import.d.ts +4 -0
  96. package/dist/codemods/joi-to-zod/utils/has-zod-import.js +14 -0
  97. package/dist/codemods/joi-to-zod/utils/has-zod-import.js.map +1 -0
  98. package/dist/codemods/joi-to-zod/utils/object-path-accessor.d.ts +3 -0
  99. package/dist/codemods/joi-to-zod/utils/object-path-accessor.js +32 -0
  100. package/dist/codemods/joi-to-zod/utils/object-path-accessor.js.map +1 -0
  101. package/dist/codemods/joi-to-zod/utils/remove-joi-validation-edits.d.ts +8 -0
  102. package/dist/codemods/joi-to-zod/utils/remove-joi-validation-edits.js +6 -0
  103. package/dist/codemods/joi-to-zod/utils/remove-joi-validation-edits.js.map +1 -0
  104. package/dist/codemods/joi-to-zod/utils/replace-joi-validation-with-zod-edits.d.ts +9 -0
  105. package/dist/codemods/joi-to-zod/utils/replace-joi-validation-with-zod-edits.js +93 -0
  106. package/dist/codemods/joi-to-zod/utils/replace-joi-validation-with-zod-edits.js.map +1 -0
  107. package/dist/codemods/registry.d.ts +11 -0
  108. package/dist/codemods/registry.js +15 -0
  109. package/dist/codemods/registry.js.map +1 -0
  110. package/dist/codemods/utils/commit-edit-modifications-until-stable.d.ts +4 -0
  111. package/dist/codemods/utils/commit-edit-modifications-until-stable.js +9 -0
  112. package/dist/codemods/utils/commit-edit-modifications-until-stable.js.map +1 -0
  113. package/dist/codemods/utils/commit-edit-modifications.d.ts +4 -0
  114. package/dist/codemods/utils/commit-edit-modifications.js +16 -0
  115. package/dist/codemods/utils/commit-edit-modifications.js.map +1 -0
  116. package/dist/codemods/utils/extract-args-from-call-expression.d.ts +2 -0
  117. package/dist/codemods/utils/extract-args-from-call-expression.js +13 -0
  118. package/dist/codemods/utils/extract-args-from-call-expression.js.map +1 -0
  119. package/dist/codemods/utils/extract-name-from-call-expression.d.ts +2 -0
  120. package/dist/codemods/utils/extract-name-from-call-expression.js +10 -0
  121. package/dist/codemods/utils/extract-name-from-call-expression.js.map +1 -0
  122. package/dist/codemods/utils/innermost-nodes.d.ts +6 -0
  123. package/dist/codemods/utils/innermost-nodes.js +14 -0
  124. package/dist/codemods/utils/innermost-nodes.js.map +1 -0
  125. package/dist/codemods/utils/parse-call-chain.d.ts +13 -0
  126. package/dist/codemods/utils/parse-call-chain.js +67 -0
  127. package/dist/codemods/utils/parse-call-chain.js.map +1 -0
  128. package/dist/codemods/utils/scan-call-arguments.d.ts +8 -0
  129. package/dist/codemods/utils/scan-call-arguments.js +99 -0
  130. package/dist/codemods/utils/scan-call-arguments.js.map +1 -0
  131. package/dist/codemods/utils/split-arguments.d.ts +2 -0
  132. package/dist/codemods/utils/split-arguments.js +28 -0
  133. package/dist/codemods/utils/split-arguments.js.map +1 -0
  134. package/dist/codemods/utils/traverse-up.d.ts +4 -0
  135. package/dist/codemods/utils/traverse-up.js +11 -0
  136. package/dist/codemods/utils/traverse-up.js.map +1 -0
  137. package/dist/commands/list.d.ts +1 -0
  138. package/dist/commands/list.js +10 -0
  139. package/dist/commands/list.js.map +1 -0
  140. package/dist/commands/run.d.ts +3 -0
  141. package/dist/commands/run.js +91 -0
  142. package/dist/commands/run.js.map +1 -0
  143. package/dist/errors.d.ts +3 -0
  144. package/dist/errors.js +4 -0
  145. package/dist/errors.js.map +1 -0
  146. package/dist/index.d.ts +2 -0
  147. package/dist/index.js +3 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/kit/collections.d.ts +3 -0
  150. package/dist/kit/collections.js +9 -0
  151. package/dist/kit/collections.js.map +1 -0
  152. package/dist/kit/config.d.ts +31 -0
  153. package/dist/kit/config.js +44 -0
  154. package/dist/kit/config.js.map +1 -0
  155. package/dist/kit/constants.d.ts +1 -0
  156. package/dist/kit/constants.js +13 -0
  157. package/dist/kit/constants.js.map +1 -0
  158. package/dist/kit/errors.d.ts +12 -0
  159. package/dist/kit/errors.js +13 -0
  160. package/dist/kit/errors.js.map +1 -0
  161. package/dist/kit/result.d.ts +4 -0
  162. package/dist/kit/result.js +18 -0
  163. package/dist/kit/result.js.map +1 -0
  164. package/dist/kit/runner.d.ts +13 -0
  165. package/dist/kit/runner.js +126 -0
  166. package/dist/kit/runner.js.map +1 -0
  167. package/dist/kit/types.d.ts +36 -0
  168. package/dist/kit/types.js +2 -0
  169. package/dist/kit/types.js.map +1 -0
  170. package/dist/utils/arrays.d.ts +2 -0
  171. package/dist/utils/arrays.js +25 -0
  172. package/dist/utils/arrays.js.map +1 -0
  173. package/dist/utils/asserts.d.ts +1 -0
  174. package/dist/utils/asserts.js +5 -0
  175. package/dist/utils/asserts.js.map +1 -0
  176. package/dist/utils/objects.d.ts +5 -0
  177. package/dist/utils/objects.js +4 -0
  178. package/dist/utils/objects.js.map +1 -0
  179. package/package.json +1 -1
@@ -0,0 +1,95 @@
1
+ import assert from 'node:assert/strict';
2
+ import { compactMap } from '../../../utils/arrays.js';
3
+ import commitEditModificationsUntilStable from '../../utils/commit-edit-modifications-until-stable.js';
4
+ import { innermostBy } from '../../utils/innermost-nodes.js';
5
+ import { findIdentifierCallChains } from '../../utils/parse-call-chain.js';
6
+ import splitArguments from '../../utils/split-arguments.js';
7
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
8
+ import getJoiProperties from '../utils/get-joi-properties.js';
9
+ const PRESENCE_SEGMENTS = new Set(['required', 'optional']);
10
+ const SHIMMABLE_HELPERS = new Set(['error', 'message']);
11
+ const ARROW_PARAMETERS_PATTERN = /^\(([^)]*)\)\s*=>/s;
12
+ const FUNCTION_PARAMETERS_PATTERN = /^function\s*[$\w]*\s*\(([^)]*)\)/s;
13
+ function parseCallbackParameters(callback) {
14
+ const match = ARROW_PARAMETERS_PATTERN.exec(callback) ?? FUNCTION_PARAMETERS_PATTERN.exec(callback);
15
+ if (match?.[1] == null)
16
+ return undefined;
17
+ return compactMap(splitArguments(match[1]), parameter => {
18
+ const trimmedParameter = parameter.trim();
19
+ if (trimmedParameter.length === 0)
20
+ return null;
21
+ return trimmedParameter;
22
+ });
23
+ }
24
+ function referencedHelperMembers(callback, helpersName) {
25
+ const pattern = new RegExp(String.raw `\b${helpersName}\s*\.\s*([$\w]+)`, 'g');
26
+ const members = Array.from(callback.matchAll(pattern), match => {
27
+ assert(match[1] != null, 'the capture group always matches when the pattern matches');
28
+ return match[1];
29
+ });
30
+ return new Set(members);
31
+ }
32
+ function buildCustomReplacement(args) {
33
+ const [callback] = splitArguments(args).map(argument => argument.trim());
34
+ if (callback == null || callback.length === 0)
35
+ return undefined;
36
+ const parameters = parseCallbackParameters(callback);
37
+ const helpersName = parameters?.[1];
38
+ if (helpersName == null)
39
+ return `transform(${callback})`;
40
+ const members = referencedHelperMembers(callback, helpersName);
41
+ if (members.size === 0)
42
+ return `transform(${callback})`;
43
+ if (Array.from(members).some(member => !SHIMMABLE_HELPERS.has(member)))
44
+ return undefined;
45
+ return [
46
+ 'transform((value, ctx) => {',
47
+ ' const helpers = {',
48
+ " error: (code: unknown) => { ctx.addIssue({ code: 'custom', message: String(code) }); return z.NEVER; },",
49
+ " message: (text: unknown) => { ctx.addIssue({ code: 'custom', message: String(text) }); return z.NEVER; },",
50
+ ' };',
51
+ '',
52
+ ` return (${callback})(value, helpers);`,
53
+ '})',
54
+ ].join('\n');
55
+ }
56
+ function isConvertible(segments, customIndex) {
57
+ return segments.slice(customIndex + 1).every(segment => PRESENCE_SEGMENTS.has(segment.name));
58
+ }
59
+ function rewriteCustoms(chainText, joiIdentifierName) {
60
+ for (const { segments } of findIdentifierCallChains(chainText, joiIdentifierName)) {
61
+ const customSegment = segments.find(segment => segment.name === 'custom');
62
+ if (customSegment == null)
63
+ continue;
64
+ const customIndex = segments.indexOf(customSegment);
65
+ assert(customIndex >= 0, 'segment was already found, so its index must certainly also be found');
66
+ if (!isConvertible(segments, customIndex))
67
+ continue;
68
+ const replacement = buildCustomReplacement(customSegment.args);
69
+ if (replacement == null)
70
+ continue;
71
+ return chainText.slice(0, customSegment.startIndex) + `.${replacement}` + chainText.slice(customSegment.endIndex);
72
+ }
73
+ return chainText;
74
+ }
75
+ async function joiCustomToTransform(modifications) {
76
+ return commitEditModificationsUntilStable(modifications, current => {
77
+ const root = current.ast.root();
78
+ const joiIdentifierName = getJoiIdentifierName(root);
79
+ if (joiIdentifierName == null)
80
+ return [];
81
+ const properties = getJoiProperties(root, { primitive: '*' });
82
+ const rewrites = compactMap(properties, property => {
83
+ const propertyText = property.text();
84
+ const replacement = rewriteCustoms(propertyText, joiIdentifierName);
85
+ if (replacement === propertyText)
86
+ return undefined;
87
+ return { property, replacement };
88
+ });
89
+ return innermostBy(rewrites, rewrite => rewrite.property).map(rewrite => {
90
+ return rewrite.property.replace(rewrite.replacement);
91
+ });
92
+ });
93
+ }
94
+ export default joiCustomToTransform;
95
+ //# sourceMappingURL=joi-custom-to-transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-custom-to-transform.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-custom-to-transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiDateToCoerceDate(modifications: Modifications): Promise<Modifications>;
3
+ export default joiDateToCoerceDate;
@@ -0,0 +1,55 @@
1
+ import { compactMap } from '../../../utils/arrays.js';
2
+ import commitEditModificationsUntilStable from '../../utils/commit-edit-modifications-until-stable.js';
3
+ import { findIdentifierCallChains } from '../../utils/parse-call-chain.js';
4
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
5
+ import getJoiProperties from '../utils/get-joi-properties.js';
6
+ const DATE_BOUNDS = new Set(['min', 'max', 'greater', 'less']);
7
+ const ZOD_BOUNDS = { min: 'min', max: 'max', greater: 'min', less: 'max' };
8
+ function coerceBoundArgument(args) {
9
+ const trimmed = args.trim();
10
+ if (trimmed.length === 0)
11
+ return trimmed;
12
+ if (trimmed === "'now'" || trimmed === '"now"')
13
+ return 'new Date()';
14
+ const isStringLiteral = /^(['"]).*\1$/s.test(trimmed);
15
+ const isNumberLiteral = /^-?\d+(\.\d+)?$/.test(trimmed);
16
+ if (isStringLiteral || isNumberLiteral)
17
+ return `new Date(${trimmed})`;
18
+ return trimmed;
19
+ }
20
+ function rewriteDateChain(chainText, joiIdentifierName) {
21
+ for (const { segments } of findIdentifierCallChains(chainText, joiIdentifierName)) {
22
+ const baseSegment = segments[0];
23
+ if (baseSegment == null || baseSegment.name !== 'date' || baseSegment.args.trim().length > 0)
24
+ continue;
25
+ const rewritten = segments
26
+ .slice(1)
27
+ .filter(segment => DATE_BOUNDS.has(segment.name))
28
+ .reverse()
29
+ .reduce((accumulator, segment) => {
30
+ const zodName = ZOD_BOUNDS[segment.name] ?? segment.name;
31
+ const replacement = `.${zodName}(${coerceBoundArgument(segment.args)})`;
32
+ return accumulator.slice(0, segment.startIndex) + replacement + accumulator.slice(segment.endIndex);
33
+ }, chainText);
34
+ return rewritten.slice(0, baseSegment.startIndex) + '.coerce.date()' + rewritten.slice(baseSegment.endIndex);
35
+ }
36
+ return chainText;
37
+ }
38
+ async function joiDateToCoerceDate(modifications) {
39
+ return commitEditModificationsUntilStable(modifications, current => {
40
+ const root = current.ast.root();
41
+ const joiIdentifierName = getJoiIdentifierName(root);
42
+ if (joiIdentifierName == null)
43
+ return [];
44
+ const properties = getJoiProperties(root, { primitive: 'date' });
45
+ return compactMap(properties, property => {
46
+ const propertyText = property.text();
47
+ const replacement = rewriteDateChain(propertyText, joiIdentifierName);
48
+ if (replacement === propertyText)
49
+ return undefined;
50
+ return property.replace(replacement);
51
+ });
52
+ });
53
+ }
54
+ export default joiDateToCoerceDate;
55
+ //# sourceMappingURL=joi-date-to-coerce-date.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-date-to-coerce-date.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-date-to-coerce-date.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiForbiddenToNever(modifications: Modifications): Promise<Modifications>;
3
+ export default joiForbiddenToNever;
@@ -0,0 +1,13 @@
1
+ import { compactMap } from '../../../utils/arrays.js';
2
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
3
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
4
+ async function joiForbiddenToNever(modifications) {
5
+ const joiImportIdentifierName = getJoiIdentifierName(modifications.ast.root());
6
+ if (joiImportIdentifierName == null)
7
+ return modifications;
8
+ const nodes = modifications.ast.root().findAll({ rule: { pattern: `${joiImportIdentifierName}.forbidden()` } });
9
+ const edits = compactMap(nodes, node => node.replace(`${joiImportIdentifierName}.never()`));
10
+ return commitEditModifications(edits, modifications);
11
+ }
12
+ export default joiForbiddenToNever;
13
+ //# sourceMappingURL=joi-forbidden-to-never.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-forbidden-to-never.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-forbidden-to-never.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,oBAAoB,MAAM,qCAAqC,CAAC;AAEvE,KAAK,UAAU,mBAAmB,CAAC,aAA4B;IAC7D,MAAM,uBAAuB,GAAG,oBAAoB,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/E,IAAI,uBAAuB,IAAI,IAAI;QAAE,OAAO,aAAa,CAAC;IAE1D,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,uBAAuB,cAAc,EAAE,EAAE,CAAC,CAAC;IAChH,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,uBAAuB,UAAU,CAAC,CAAC,CAAC;IAE5F,OAAO,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiFormatsToZodBase(modifications: Modifications): Promise<Modifications>;
3
+ export default joiFormatsToZodBase;
@@ -0,0 +1,64 @@
1
+ import { compactMap } from '../../../utils/arrays.js';
2
+ import commitEditModificationsUntilStable from '../../utils/commit-edit-modifications-until-stable.js';
3
+ import { findIdentifierCallChains } from '../../utils/parse-call-chain.js';
4
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
5
+ import getJoiProperties from '../utils/get-joi-properties.js';
6
+ const FORMAT_BASE_TRANSFORMATIONS = [
7
+ { primitive: 'string', joi: 'guid', zod: 'uuid()' },
8
+ { primitive: 'string', joi: 'uuid', zod: 'uuid()' },
9
+ { primitive: 'string', joi: 'uri', zod: 'url()' },
10
+ { primitive: 'string', joi: 'url', zod: 'url()' },
11
+ { primitive: 'string', joi: 'email', zod: 'email()' },
12
+ { primitive: 'string', joi: 'domain', zod: 'hostname()' },
13
+ { primitive: 'string', joi: 'hostname', zod: 'hostname()' },
14
+ { primitive: 'string', joi: 'hex', zod: 'hex()' },
15
+ { primitive: 'string', joi: 'base64', zod: 'base64()' },
16
+ { primitive: 'string', joi: 'isoDate', zod: 'iso.datetime()' },
17
+ { primitive: 'string', joi: 'datetime', zod: 'iso.datetime()' },
18
+ { primitive: 'string', joi: 'isoDuration', zod: 'iso.duration()' },
19
+ ];
20
+ function hoistFormatToBase(chainText, joiIdentifierName, params) {
21
+ const result = chainText;
22
+ for (const { segments } of findIdentifierCallChains(result, joiIdentifierName)) {
23
+ const baseSegment = segments[0];
24
+ if (baseSegment == null || baseSegment.name !== params.primitive)
25
+ continue;
26
+ const formatSegment = segments.find(segment => segment.name === params.joi && segment.args.trim().length === 0);
27
+ if (formatSegment == null)
28
+ continue;
29
+ const withoutFormat = result.slice(0, formatSegment.startIndex) + result.slice(formatSegment.endIndex);
30
+ return (withoutFormat.slice(0, baseSegment.startIndex) + `.${params.zod}` + withoutFormat.slice(baseSegment.endIndex));
31
+ }
32
+ return result;
33
+ }
34
+ async function joiFormatsToZodBase(modifications) {
35
+ return transformFormats(modifications, 0);
36
+ }
37
+ async function transformFormats(modifications, transformationIndex) {
38
+ const transformation = FORMAT_BASE_TRANSFORMATIONS[transformationIndex];
39
+ if (transformation == null)
40
+ return modifications;
41
+ const applied = await applyFormatTransformation(modifications, transformation);
42
+ return transformFormats(applied, transformationIndex + 1);
43
+ }
44
+ async function applyFormatTransformation(modifications, transformation) {
45
+ return commitEditModificationsUntilStable(modifications, current => {
46
+ const root = current.ast.root();
47
+ const joiIdentifierName = getJoiIdentifierName(root);
48
+ if (joiIdentifierName == null)
49
+ return [];
50
+ const properties = getJoiProperties(root, {
51
+ primitive: transformation.primitive,
52
+ validationName: `${transformation.joi}()`,
53
+ });
54
+ return compactMap(properties, property => {
55
+ const propertyText = property.text();
56
+ const replacement = hoistFormatToBase(propertyText, joiIdentifierName, transformation);
57
+ if (replacement === propertyText)
58
+ return undefined;
59
+ return property.replace(replacement);
60
+ });
61
+ });
62
+ }
63
+ export default joiFormatsToZodBase;
64
+ //# sourceMappingURL=joi-formats-to-zod-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-formats-to-zod-base.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-formats-to-zod-base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiObjectKeysUnnest(modifications: Modifications): Promise<Modifications>;
3
+ export default joiObjectKeysUnnest;
@@ -0,0 +1,24 @@
1
+ import { compactMap } from '../../../utils/arrays.js';
2
+ import commitEditModificationsUntilStable from '../../utils/commit-edit-modifications-until-stable.js';
3
+ import innermostNodes from '../../utils/innermost-nodes.js';
4
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
5
+ const ARGS_META_IDENTIFIER = 'ARGS';
6
+ async function joiObjectKeysUnnest(modifications) {
7
+ return commitEditModificationsUntilStable(modifications, current => {
8
+ const root = current.ast.root();
9
+ const joiImportIdentifierName = getJoiIdentifierName(root);
10
+ if (joiImportIdentifierName == null)
11
+ return [];
12
+ const matches = root.findAll({
13
+ rule: { pattern: `${joiImportIdentifierName}.object().keys($${ARGS_META_IDENTIFIER})` },
14
+ });
15
+ return compactMap(innermostNodes(matches), node => {
16
+ const objectSchema = node.getMatch(ARGS_META_IDENTIFIER);
17
+ if (objectSchema == null)
18
+ return undefined;
19
+ return node.replace(`${joiImportIdentifierName}.object(${objectSchema.text()}).strict()`);
20
+ });
21
+ });
22
+ }
23
+ export default joiObjectKeysUnnest;
24
+ //# sourceMappingURL=joi-object-keys-unnest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-object-keys-unnest.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-object-keys-unnest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,kCAAkC,MAAM,uDAAuD,CAAC;AACvG,OAAO,cAAc,MAAM,gCAAgC,CAAC;AAC5D,OAAO,oBAAoB,MAAM,qCAAqC,CAAC;AAEvE,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,KAAK,UAAU,mBAAmB,CAAC,aAA4B;IAC7D,OAAO,kCAAkC,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,uBAAuB,IAAI,IAAI;YAAE,OAAO,EAAE,CAAC;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC3B,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,uBAAuB,mBAAmB,oBAAoB,GAAG,EAAE;SACxF,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;YAChD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;YACzD,IAAI,YAAY,IAAI,IAAI;gBAAE,OAAO,SAAS,CAAC;YAE3C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,uBAAuB,WAAW,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiObjectPatternToRecord(modifications: Modifications): Promise<Modifications>;
3
+ export default joiObjectPatternToRecord;
@@ -0,0 +1,25 @@
1
+ import { compactMap } from '../../../utils/arrays.js';
2
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
3
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
4
+ const KEY_META_IDENTIFIER = 'KEY';
5
+ const VALUE_META_IDENTIFIER = 'VALUE';
6
+ async function joiObjectPatternToRecord(modifications) {
7
+ const root = modifications.ast.root();
8
+ const joiImportIdentifierName = getJoiIdentifierName(root);
9
+ if (joiImportIdentifierName == null)
10
+ return modifications;
11
+ const patternRule = `${joiImportIdentifierName}.object().pattern($${KEY_META_IDENTIFIER}, $${VALUE_META_IDENTIFIER})`;
12
+ const edits = compactMap(root.findAll({ rule: { pattern: patternRule } }), node => {
13
+ const keyNode = node.getMatch(KEY_META_IDENTIFIER);
14
+ const valueNode = node.getMatch(VALUE_META_IDENTIFIER);
15
+ if (keyNode == null || valueNode == null)
16
+ return undefined;
17
+ const keyText = keyNode.text();
18
+ const valueText = valueNode.text();
19
+ const finalKeyText = keyText.startsWith('/') ? `${joiImportIdentifierName}.string().regex(${keyText})` : keyText;
20
+ return node.replace(`${joiImportIdentifierName}.record(${finalKeyText}, ${valueText})`);
21
+ });
22
+ return commitEditModifications(edits, modifications);
23
+ }
24
+ export default joiObjectPatternToRecord;
25
+ //# sourceMappingURL=joi-object-pattern-to-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-object-pattern-to-record.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-object-pattern-to-record.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,oBAAoB,MAAM,qCAAqC,CAAC;AAEvE,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC,KAAK,UAAU,wBAAwB,CAAC,aAA4B;IAClE,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,uBAAuB,IAAI,IAAI;QAAE,OAAO,aAAa,CAAC;IAE1D,MAAM,WAAW,GAAG,GAAG,uBAAuB,sBAAsB,mBAAmB,MAAM,qBAAqB,GAAG,CAAC;IAEtH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;QAChF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QACvD,IAAI,OAAO,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QAE3D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAEnC,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,uBAAuB,mBAAmB,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QAEjH,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,uBAAuB,WAAW,YAAY,KAAK,SAAS,GAAG,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,OAAO,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,eAAe,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiObjectRelationsToRefine(modifications: Modifications): Promise<Modifications>;
3
+ export default joiObjectRelationsToRefine;
@@ -0,0 +1,90 @@
1
+ import { compactMap } from '../../../utils/arrays.js';
2
+ import commitEditModificationsUntilStable from '../../utils/commit-edit-modifications-until-stable.js';
3
+ import { innermostBy } from '../../utils/innermost-nodes.js';
4
+ import { findIdentifierCallChains } from '../../utils/parse-call-chain.js';
5
+ import splitArguments from '../../utils/split-arguments.js';
6
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
7
+ import getJoiProperties from '../utils/get-joi-properties.js';
8
+ const PRESENT = 'field => field !== undefined';
9
+ const ABSENT = 'field => field === undefined';
10
+ const PEER_RELATIONS = {
11
+ or: peers => `refine(value => [${peers}].some(${PRESENT}))`,
12
+ xor: peers => `refine(value => [${peers}].filter(${PRESENT}).length === 1)`,
13
+ oxor: peers => `refine(value => [${peers}].filter(${PRESENT}).length <= 1)`,
14
+ and: peers => `refine(value => [${peers}].every(${PRESENT}) || [${peers}].every(${ABSENT}))`,
15
+ nand: peers => `refine(value => ![${peers}].every(${PRESENT}))`,
16
+ };
17
+ const DEPENDENCY_RELATIONS = {
18
+ with: (subject, peers) => `refine(value => value[${subject}] === undefined || [${peers}].every(${PRESENT}))`,
19
+ without: (subject, peers) => `refine(value => value[${subject}] === undefined || [${peers}].every(${ABSENT}))`,
20
+ };
21
+ function flattenPeers(args) {
22
+ return args
23
+ .flatMap(argument => {
24
+ const trimmed = argument.trim();
25
+ if (!trimmed.startsWith('[') || !trimmed.endsWith(']'))
26
+ return [trimmed];
27
+ return splitArguments(trimmed.slice(1, -1)).map(key => key.trim());
28
+ })
29
+ .filter(argument => argument.length > 0)
30
+ .map(key => `value[${key}]`)
31
+ .join(', ');
32
+ }
33
+ function buildRelationReplacement(name, args) {
34
+ const parsedArgs = splitArguments(args)
35
+ .map(argument => argument.trim())
36
+ .filter(argument => argument.length > 0);
37
+ if (parsedArgs.length === 0)
38
+ return undefined;
39
+ const peerRelation = PEER_RELATIONS[name];
40
+ if (peerRelation != null)
41
+ return peerRelation(flattenPeers(parsedArgs));
42
+ const dependencyRelation = DEPENDENCY_RELATIONS[name];
43
+ if (dependencyRelation == null)
44
+ return undefined;
45
+ const [subject, ...peers] = parsedArgs;
46
+ if (subject == null || peers.length === 0)
47
+ return undefined;
48
+ return dependencyRelation(subject, flattenPeers(peers));
49
+ }
50
+ function rewriteObjectRelations(chainText, joiIdentifierName) {
51
+ for (const { segments } of findIdentifierCallChains(chainText, joiIdentifierName)) {
52
+ const baseSegment = segments[0];
53
+ if (baseSegment == null || baseSegment.name !== 'object')
54
+ continue;
55
+ const relationSegments = segments
56
+ .slice(1)
57
+ .filter(segment => PEER_RELATIONS[segment.name] != null || DEPENDENCY_RELATIONS[segment.name] != null)
58
+ .reverse();
59
+ if (relationSegments.length === 0)
60
+ continue;
61
+ return relationSegments.reduce((accumulator, segment) => {
62
+ const replacement = buildRelationReplacement(segment.name, segment.args);
63
+ if (replacement == null)
64
+ return accumulator;
65
+ return accumulator.slice(0, segment.startIndex) + `.${replacement}` + accumulator.slice(segment.endIndex);
66
+ }, chainText);
67
+ }
68
+ return chainText;
69
+ }
70
+ async function joiObjectRelationsToRefine(modifications) {
71
+ return commitEditModificationsUntilStable(modifications, current => {
72
+ const root = current.ast.root();
73
+ const joiIdentifierName = getJoiIdentifierName(root);
74
+ if (joiIdentifierName == null)
75
+ return [];
76
+ const properties = getJoiProperties(root, { primitive: 'object' });
77
+ const rewrites = compactMap(properties, property => {
78
+ const propertyText = property.text();
79
+ const replacement = rewriteObjectRelations(propertyText, joiIdentifierName);
80
+ if (replacement === propertyText)
81
+ return undefined;
82
+ return { property, replacement };
83
+ });
84
+ return innermostBy(rewrites, rewrite => rewrite.property).map(rewrite => {
85
+ return rewrite.property.replace(rewrite.replacement);
86
+ });
87
+ });
88
+ }
89
+ export default joiObjectRelationsToRefine;
90
+ //# sourceMappingURL=joi-object-relations-to-refine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-object-relations-to-refine.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-object-relations-to-refine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiReferenceToZod(modifications: Modifications): Promise<Modifications>;
3
+ export default joiReferenceToZod;
@@ -0,0 +1,18 @@
1
+ import { compactMap } from '../../../utils/arrays.js';
2
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
3
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
4
+ async function joiReferenceToZod(modifications) {
5
+ const root = modifications.ast.root();
6
+ const joiImportIdentifierName = getJoiIdentifierName(root);
7
+ if (joiImportIdentifierName == null)
8
+ return modifications;
9
+ const edits = compactMap(root.findAll({ rule: { pattern: `${joiImportIdentifierName}.` } }), node => {
10
+ return node
11
+ .children()
12
+ .find(child => child.text() === joiImportIdentifierName)
13
+ ?.replace('z');
14
+ }).flat();
15
+ return commitEditModifications(edits, modifications);
16
+ }
17
+ export default joiReferenceToZod;
18
+ //# sourceMappingURL=joi-reference-to-zod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-reference-to-zod.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-reference-to-zod.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,oBAAoB,MAAM,qCAAqC,CAAC;AAEvE,KAAK,UAAU,iBAAiB,CAAC,aAA4B;IAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,uBAAuB,IAAI,IAAI;QAAE,OAAO,aAAa,CAAC;IAE1D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,uBAAuB,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;QAClG,OAAO,IAAI;aACR,QAAQ,EAAE;aACV,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,uBAAuB,CAAC;YACxD,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEV,OAAO,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiRemoveImport(modifications: Modifications): Promise<Modifications>;
3
+ export default joiRemoveImport;
@@ -0,0 +1,17 @@
1
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
2
+ import getJoiImport from '../utils/get-joi-import.js';
3
+ async function joiRemoveImport(modifications) {
4
+ const root = modifications.ast.root();
5
+ const joiImport = getJoiImport(root);
6
+ if (joiImport == null)
7
+ return modifications;
8
+ const lines = root.text().split('\n');
9
+ const index = lines.findIndex(line => line.includes(joiImport.text()));
10
+ if (index === -1)
11
+ return modifications;
12
+ lines.splice(index, 1);
13
+ const edit = root.replace(lines.join('\n'));
14
+ return commitEditModifications([edit], modifications);
15
+ }
16
+ export default joiRemoveImport;
17
+ //# sourceMappingURL=joi-remove-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-remove-import.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-remove-import.ts"],"names":[],"mappings":"AACA,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,YAAY,MAAM,4BAA4B,CAAC;AAEtD,KAAK,UAAU,eAAe,CAAC,aAA4B;IACzD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,aAAa,CAAC;IAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,aAAa,CAAC;IAEvC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5C,OAAO,uBAAuB,CAAC,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiRemoveOptionsFromRegex(modifications: Modifications): Promise<Modifications>;
3
+ export default joiRemoveOptionsFromRegex;
@@ -0,0 +1,27 @@
1
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
2
+ import extractArgsFromCallExpression from '../../utils/extract-args-from-call-expression.js';
3
+ import getJoiProperties from '../utils/get-joi-properties.js';
4
+ async function joiRemoveOptionsFromRegex(modifications) {
5
+ const root = modifications.ast.root();
6
+ const edits = getJoiProperties(root, { primitive: 'string', validationName: 'regex($REGEX,$$$OPTIONS)' }).map(property => {
7
+ const replacement = property
8
+ .text()
9
+ .split('.')
10
+ .map(validation => {
11
+ const trimmed = validation.trim();
12
+ if (!trimmed.startsWith('regex'))
13
+ return validation;
14
+ const argsComponents = extractArgsFromCallExpression(trimmed)?.split(',');
15
+ if (argsComponents == null)
16
+ return validation;
17
+ if (argsComponents.length < 2)
18
+ return validation;
19
+ return `regex(${argsComponents[0]})`;
20
+ })
21
+ .join('.');
22
+ return property.replace(replacement);
23
+ });
24
+ return commitEditModifications(edits, modifications);
25
+ }
26
+ export default joiRemoveOptionsFromRegex;
27
+ //# sourceMappingURL=joi-remove-options-from-regex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-remove-options-from-regex.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-remove-options-from-regex.ts"],"names":[],"mappings":"AACA,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,6BAA6B,MAAM,kDAAkD,CAAC;AAC7F,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAE9D,KAAK,UAAU,yBAAyB,CAAC,aAA4B;IACnE,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC,GAAG,CAC3G,QAAQ,CAAC,EAAE;QACT,MAAM,WAAW,GAAG,QAAQ;aACzB,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,UAAU,CAAC,EAAE;YAChB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,OAAO,UAAU,CAAC;YAEpD,MAAM,cAAc,GAAG,6BAA6B,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1E,IAAI,cAAc,IAAI,IAAI;gBAAE,OAAO,UAAU,CAAC;YAC9C,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,UAAU,CAAC;YAEjD,OAAO,SAAS,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC;QACvC,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC,CACF,CAAC;IAEF,OAAO,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiRemovePrimitiveForEnum(modifications: Modifications): Promise<Modifications>;
3
+ export default joiRemovePrimitiveForEnum;
@@ -0,0 +1,21 @@
1
+ import { compactMap } from '../../../utils/arrays.js';
2
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
3
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
4
+ import getJoiPrimitive from '../utils/get-joi-primitive.js';
5
+ import getJoiProperties from '../utils/get-joi-properties.js';
6
+ async function joiRemovePrimitiveForEnum(modifications) {
7
+ const root = modifications.ast.root();
8
+ const joiImportIdentifierName = getJoiIdentifierName(root);
9
+ if (joiImportIdentifierName == null)
10
+ return modifications;
11
+ const edits = compactMap(getJoiProperties(root, { primitive: '*', validationName: 'enum($ARGS)' }), property => {
12
+ const primitive = getJoiPrimitive(property, joiImportIdentifierName);
13
+ if (primitive == null)
14
+ return undefined;
15
+ const replacement = property.text().replace(`.${primitive}()`, '');
16
+ return property.replace(replacement);
17
+ });
18
+ return commitEditModifications(edits, modifications);
19
+ }
20
+ export default joiRemovePrimitiveForEnum;
21
+ //# sourceMappingURL=joi-remove-primitive-for-enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-remove-primitive-for-enum.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-remove-primitive-for-enum.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,oBAAoB,MAAM,qCAAqC,CAAC;AACvE,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAC5D,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAE9D,KAAK,UAAU,yBAAyB,CAAC,aAA4B;IACnE,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,uBAAuB,IAAI,IAAI;QAAE,OAAO,aAAa,CAAC;IAE1D,MAAM,KAAK,GAAG,UAAU,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE;QAC7G,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QACrE,IAAI,SAAS,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QAExC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC;QAEnE,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,OAAO,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiRemoveRequired(modifications: Modifications): Promise<Modifications>;
3
+ export default joiRemoveRequired;
@@ -0,0 +1,18 @@
1
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
2
+ import removeJoiValidationEdits from '../utils/remove-joi-validation-edits.js';
3
+ async function joiRemoveRequired(modifications) {
4
+ return removeRequired(modifications);
5
+ }
6
+ async function removeRequired(modifications) {
7
+ const edits = removeJoiValidationEdits(modifications.ast.root(), {
8
+ primitive: '*',
9
+ validationTargetKey: 'required()',
10
+ });
11
+ const updated = await commitEditModifications(edits, modifications);
12
+ const isUnchanged = updated.ast.root().text() === modifications.ast.root().text();
13
+ if (isUnchanged)
14
+ return modifications;
15
+ return removeRequired(updated);
16
+ }
17
+ export default joiRemoveRequired;
18
+ //# sourceMappingURL=joi-remove-required.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-remove-required.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-remove-required.ts"],"names":[],"mappings":"AACA,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,wBAAwB,MAAM,yCAAyC,CAAC;AAE/E,KAAK,UAAU,iBAAiB,CAAC,aAA4B;IAC3D,OAAO,cAAc,CAAC,aAAa,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,aAA4B;IACxD,MAAM,KAAK,GAAG,wBAAwB,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE;QAC/D,SAAS,EAAE,GAAG;QACd,mBAAmB,EAAE,YAAY;KAClC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IAClF,IAAI,WAAW;QAAE,OAAO,aAAa,CAAC;IAEtC,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiValidationsToZodValidations(modifications: Modifications): Promise<Modifications>;
3
+ export default joiValidationsToZodValidations;