@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,92 @@
1
+ import { toEntries } from '../../../utils/objects.js';
2
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
3
+ import replaceJoiValidationWithZodEdits from '../utils/replace-joi-validation-with-zod-edits.js';
4
+ const JOI_VALIDATIONS_TO_ZOD_VALIDATION_MAPPING = {
5
+ string: [
6
+ { joi: 'alphanum()', zod: 'regex(/^[a-zA-Z0-9]+$/)' },
7
+ { joi: 'lowercase()', zod: 'toLowerCase()' },
8
+ { joi: 'uppercase()', zod: 'toUpperCase()' },
9
+ { joi: 'token()', zod: 'regex(/^\\w+$/)' },
10
+ { joi: 'pattern($ARGS)', zod: 'regex($ARGS)' },
11
+ { joi: "allow('')", zod: undefined },
12
+ { joi: "case('lower')", zod: 'toLowerCase()' },
13
+ { joi: "case('upper')", zod: 'toUpperCase()' },
14
+ { joi: 'ip()', zod: 'refine(value => z.ipv4().safeParse(value).success || z.ipv6().safeParse(value).success)' },
15
+ { joi: 'truncate()', zod: undefined },
16
+ { joi: 'normalize()', zod: 'transform(value => value.normalize())' },
17
+ ],
18
+ '*': [
19
+ { joi: 'description($ARGS)', zod: 'describe($ARGS)' },
20
+ { joi: 'label($ARGS)', zod: 'describe($ARGS)' },
21
+ { joi: 'allow(null)', zod: 'nullable()' },
22
+ { joi: 'required(false)', zod: 'optional()' },
23
+ { joi: 'unknown(true)', zod: 'passthrough()' },
24
+ { joi: 'unknown(false)', zod: 'strict()' },
25
+ { joi: 'unknown()', zod: 'passthrough()' },
26
+ { joi: 'bool()', zod: 'boolean()' },
27
+ { joi: 'failover($ARGS)', zod: 'catch($ARGS)' },
28
+ { joi: 'func()', zod: 'function()' },
29
+ { joi: 'invalid($ARGS)', zod: 'refine(value => ![$ARGS].includes(value))' },
30
+ { joi: 'disallow($ARGS)', zod: 'refine(value => ![$ARGS].includes(value))' },
31
+ { joi: 'raw()', zod: undefined },
32
+ { joi: 'cast($ARGS)', zod: undefined },
33
+ { joi: 'meta($ARGS)', zod: undefined },
34
+ { joi: 'tag($ARGS)', zod: undefined },
35
+ { joi: 'note($ARGS)', zod: undefined },
36
+ { joi: 'example($ARGS)', zod: undefined },
37
+ { joi: 'prefs($ARGS)', zod: undefined },
38
+ ],
39
+ number: [
40
+ { joi: 'integer()', zod: 'int()' },
41
+ { joi: 'greater($ARGS)', zod: 'gt($ARGS)' },
42
+ { joi: 'less($ARGS)', zod: 'lt($ARGS)' },
43
+ { joi: 'precision($ARGS)', zod: 'transform(value => Number(value.toFixed($ARGS)))' },
44
+ { joi: 'multiple($ARGS)', zod: 'multipleOf($ARGS)' },
45
+ { joi: 'port()', zod: 'int().min(0).max(65535)' },
46
+ { joi: "sign('positive')", zod: 'positive()' },
47
+ { joi: "sign('negative')", zod: 'negative()' },
48
+ { joi: 'unsafe()', zod: undefined },
49
+ ],
50
+ array: [
51
+ { joi: 'unique()', zod: 'refine(value => new Set(value).size === value.length)' },
52
+ { joi: 'sparse(false)', zod: 'refine(value => value.every(item => item != null))' },
53
+ { joi: 'sparse()', zod: 'refine(value => value.every(item => item != null))' },
54
+ ],
55
+ date: [
56
+ { joi: 'iso()', zod: undefined },
57
+ { joi: 'timestamp()', zod: undefined },
58
+ ],
59
+ object: [
60
+ { joi: 'min($ARGS)', zod: 'refine(value => Object.keys(value).length >= $ARGS)' },
61
+ { joi: 'max($ARGS)', zod: 'refine(value => Object.keys(value).length <= $ARGS)' },
62
+ { joi: 'length($ARGS)', zod: 'refine(value => Object.keys(value).length === $ARGS)' },
63
+ ],
64
+ boolean: [{ joi: 'sensitive()', zod: undefined }],
65
+ };
66
+ async function joiValidationsToZodValidations(modifications) {
67
+ const mappings = toEntries(JOI_VALIDATIONS_TO_ZOD_VALIDATION_MAPPING).flatMap(([primitive, values]) => {
68
+ return values.map(({ joi, zod }) => ({ primitive, joi, zod }));
69
+ });
70
+ return replaceValidations(modifications, mappings, 0);
71
+ }
72
+ async function replaceValidations(modifications, mappings, mappingIndex) {
73
+ const mapping = mappings[mappingIndex];
74
+ if (mapping == null)
75
+ return modifications;
76
+ const updated = await replaceValidation(modifications, mapping);
77
+ return replaceValidations(updated, mappings, mappingIndex + 1);
78
+ }
79
+ async function replaceValidation(modifications, { primitive, joi, zod }) {
80
+ const edits = replaceJoiValidationWithZodEdits(modifications.ast.root(), {
81
+ primitive,
82
+ validationTargetKey: joi,
83
+ zodValidation: zod,
84
+ });
85
+ const updated = await commitEditModifications(edits, modifications);
86
+ const isUnchanged = updated.ast.root().text() === modifications.ast.root().text();
87
+ if (isUnchanged)
88
+ return modifications;
89
+ return replaceValidation(updated, { primitive, joi, zod });
90
+ }
91
+ export default joiValidationsToZodValidations;
92
+ //# sourceMappingURL=joi-validations-to-zod-validations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-validations-to-zod-validations.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-validations-to-zod-validations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiWhenToRefine(modifications: Modifications): Promise<Modifications>;
3
+ export default joiWhenToRefine;
@@ -0,0 +1,182 @@
1
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
2
+ import scanCallArguments from '../../utils/scan-call-arguments.js';
3
+ import splitArguments from '../../utils/split-arguments.js';
4
+ import traverseUp from '../../utils/traverse-up.js';
5
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
6
+ import { buildValueAccessor, referenceToAccessor } from '../utils/object-path-accessor.js';
7
+ const UNSUPPORTED_OPTIONS = new Set(['switch', 'not', 'break']);
8
+ const LITERAL_PATTERN = /^(['"].*['"]|-?\d+(\.\d+)?|true|false|null)$/s;
9
+ function parseWhenOptions(optionsNode) {
10
+ const options = { unsupported: false };
11
+ optionsNode.children().forEach(child => {
12
+ if (child.kind() !== 'pair')
13
+ return;
14
+ const key = child.child(0)?.text().replace(/['"]/g, '');
15
+ const valueNode = child.child(2);
16
+ if (key == null || valueNode == null)
17
+ return;
18
+ if (UNSUPPORTED_OPTIONS.has(key)) {
19
+ options.unsupported = true;
20
+ return;
21
+ }
22
+ if (key === 'is' || key === 'then' || key === 'otherwise')
23
+ options[key] = valueNode.text();
24
+ });
25
+ return options;
26
+ }
27
+ function buildCondition(reference, is, joiIdentifierName) {
28
+ const referenceAccessor = referenceToAccessor(reference);
29
+ if (referenceAccessor == null)
30
+ return undefined;
31
+ if (is == null)
32
+ return `${referenceAccessor} !== undefined`;
33
+ const trimmedIs = is.trim();
34
+ if (LITERAL_PATTERN.test(trimmedIs))
35
+ return `${referenceAccessor} === ${trimmedIs}`;
36
+ const isReferenceAccessor = referenceToAccessor(trimmedIs);
37
+ if (isReferenceAccessor != null)
38
+ return `${referenceAccessor} === ${isReferenceAccessor}`;
39
+ if (!trimmedIs.startsWith(joiIdentifierName))
40
+ return undefined;
41
+ const requiredMatch = scanCallArguments(trimmedIs, 'required');
42
+ const isRequired = requiredMatch != null && requiredMatch.args.trim().length === 0;
43
+ const schema = requiredMatch == null
44
+ ? trimmedIs
45
+ : trimmedIs.slice(0, requiredMatch.startIndex) + trimmedIs.slice(requiredMatch.endIndex);
46
+ const parses = `${schema}.safeParse(${referenceAccessor}).success`;
47
+ return isRequired
48
+ ? `(${referenceAccessor} !== undefined && ${parses})`
49
+ : `(${referenceAccessor} === undefined || ${parses})`;
50
+ }
51
+ function buildBranchPredicate(branch, fieldAccessor, joiIdentifierName) {
52
+ const trimmed = branch.trim();
53
+ if (trimmed === `${joiIdentifierName}.optional()`)
54
+ return { predicate: undefined, description: 'optional' };
55
+ if (trimmed === `${joiIdentifierName}.required()`) {
56
+ return { predicate: `${fieldAccessor} !== undefined`, description: 'required' };
57
+ }
58
+ if (trimmed === `${joiIdentifierName}.forbidden()`) {
59
+ return { predicate: `${fieldAccessor} === undefined`, description: 'forbidden' };
60
+ }
61
+ if (!trimmed.startsWith(joiIdentifierName))
62
+ return undefined;
63
+ const requiredMatch = scanCallArguments(trimmed, 'required');
64
+ const isRequired = requiredMatch != null && requiredMatch.args.trim().length === 0;
65
+ const schema = requiredMatch == null
66
+ ? trimmed
67
+ : trimmed.slice(0, requiredMatch.startIndex) + trimmed.slice(requiredMatch.endIndex);
68
+ const parses = `${schema}.safeParse(${fieldAccessor}).success`;
69
+ return {
70
+ predicate: isRequired
71
+ ? `(${fieldAccessor} !== undefined && ${parses})`
72
+ : `(${fieldAccessor} === undefined || ${parses})`,
73
+ description: 'valid',
74
+ };
75
+ }
76
+ function parenthesize(expression) {
77
+ if (!expression.startsWith('(') || !expression.endsWith(')'))
78
+ return `(${expression})`;
79
+ let depth = 0;
80
+ for (let index = 0; index < expression.length; index += 1) {
81
+ if (expression[index] === '(')
82
+ depth += 1;
83
+ if (expression[index] === ')')
84
+ depth -= 1;
85
+ if (depth === 0 && index < expression.length - 1)
86
+ return `(${expression})`;
87
+ }
88
+ return expression;
89
+ }
90
+ function buildRefinement(condition, negate, predicate, path, description) {
91
+ const group = parenthesize(condition);
92
+ const guard = negate ? group : `!${group}`;
93
+ const pathText = path.map(segment => `'${segment}'`).join(', ');
94
+ const message = `'"${path.join('.')}" is ${description} when the "when" condition ${negate ? 'does not hold' : 'holds'}'`;
95
+ return `.refine(value => ${guard} || ${predicate}, { message: ${message}, path: [${pathText}] })`;
96
+ }
97
+ function outermostChain(node) {
98
+ let chain = node;
99
+ while (chain.parent()?.kind() === 'member_expression') {
100
+ const next = chain.parent()?.parent();
101
+ if (next?.kind() !== 'call_expression')
102
+ break;
103
+ chain = next;
104
+ }
105
+ return chain;
106
+ }
107
+ function planConversion(whenCall, joiIdentifierName) {
108
+ const whenArgs = scanCallArguments(whenCall.text(), 'when');
109
+ if (whenArgs == null)
110
+ return undefined;
111
+ const [reference] = splitArguments(whenArgs.args).map(argument => argument.trim());
112
+ if (reference == null)
113
+ return undefined;
114
+ const optionsNode = whenCall
115
+ .children()
116
+ .find(child => child.kind() === 'arguments')
117
+ ?.children()
118
+ .find(child => child.kind() === 'object');
119
+ if (optionsNode == null)
120
+ return undefined;
121
+ const options = parseWhenOptions(optionsNode);
122
+ if (options.unsupported)
123
+ return undefined;
124
+ if (options.then == null && options.otherwise == null)
125
+ return undefined;
126
+ const pair = traverseUp(whenCall, node => node.kind() === 'pair');
127
+ const fieldName = pair?.child(0)?.text().replace(/['"]/g, '');
128
+ if (pair == null || fieldName == null)
129
+ return undefined;
130
+ const objectCall = traverseUp(pair, node => node.kind() === 'call_expression');
131
+ if (objectCall == null)
132
+ return undefined;
133
+ const objectChain = outermostChain(objectCall);
134
+ const objectText = objectChain.text();
135
+ if (!objectText.startsWith(joiIdentifierName))
136
+ return undefined;
137
+ const condition = buildCondition(reference, options.is, joiIdentifierName);
138
+ if (condition == null)
139
+ return undefined;
140
+ const fieldPath = [fieldName];
141
+ const fieldAccessor = buildValueAccessor(fieldPath);
142
+ const branches = [
143
+ { branch: options.then, negate: false },
144
+ { branch: options.otherwise, negate: true },
145
+ ];
146
+ const refinements = [];
147
+ for (const { branch, negate } of branches) {
148
+ if (branch == null)
149
+ continue;
150
+ const built = buildBranchPredicate(branch, fieldAccessor, joiIdentifierName);
151
+ if (built == null)
152
+ return undefined;
153
+ if (built.predicate == null)
154
+ continue;
155
+ refinements.push(buildRefinement(condition, negate, built.predicate, fieldPath, built.description));
156
+ }
157
+ const whenStart = whenCall.range().start.index - objectChain.range().start.index + whenArgs.startIndex;
158
+ const whenEnd = whenCall.range().start.index - objectChain.range().start.index + whenArgs.endIndex;
159
+ const withoutWhen = objectText.slice(0, whenStart) + objectText.slice(whenEnd);
160
+ return { objectChain, objectText, replacement: withoutWhen + refinements.join('') };
161
+ }
162
+ async function joiWhenToRefine(modifications) {
163
+ const root = modifications.ast.root();
164
+ const joiIdentifierName = getJoiIdentifierName(root);
165
+ if (joiIdentifierName == null)
166
+ return modifications;
167
+ const whenCalls = root
168
+ .findAll({ rule: { kind: 'call_expression' } })
169
+ .filter(node => scanCallArguments(node.text(), 'when') != null && node.text().startsWith(joiIdentifierName));
170
+ for (const whenCall of whenCalls) {
171
+ const conversion = planConversion(whenCall, joiIdentifierName);
172
+ if (conversion == null)
173
+ continue;
174
+ const committed = await commitEditModifications([conversion.objectChain.replace(conversion.replacement)], modifications);
175
+ if (committed.ast.root().text() === modifications.ast.root().text())
176
+ continue;
177
+ return joiWhenToRefine(committed);
178
+ }
179
+ return modifications;
180
+ }
181
+ export default joiWhenToRefine;
182
+ //# sourceMappingURL=joi-when-to-refine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-when-to-refine.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-when-to-refine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function zodAddImport(modifications: Modifications): Promise<Modifications>;
3
+ export default zodAddImport;
@@ -0,0 +1,20 @@
1
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
2
+ import getJoiImport from '../utils/get-joi-import.js';
3
+ import hasZodImport from '../utils/has-zod-import.js';
4
+ async function zodAddImport(modifications) {
5
+ const root = modifications.ast.root();
6
+ const joiImport = getJoiImport(root);
7
+ if (joiImport == null)
8
+ return modifications;
9
+ if (hasZodImport(root))
10
+ return modifications;
11
+ const joiRange = joiImport.range();
12
+ const edit = {
13
+ startPos: joiRange.end.index,
14
+ endPos: joiRange.end.index,
15
+ insertedText: '\nimport { z } from "zod";',
16
+ };
17
+ return commitEditModifications([edit], modifications);
18
+ }
19
+ export default zodAddImport;
20
+ //# sourceMappingURL=zod-add-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-add-import.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/zod-add-import.ts"],"names":[],"mappings":"AACA,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,YAAY,MAAM,4BAA4B,CAAC;AAEtD,KAAK,UAAU,YAAY,CAAC,aAA4B;IACtD,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;IAC5C,IAAI,YAAY,CAAC,IAAI,CAAC;QAAE,OAAO,aAAa,CAAC;IAE7C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK;QAC5B,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK;QAC1B,YAAY,EAAE,4BAA4B;KAC3C,CAAC;IAEF,OAAO,uBAAuB,CAAC,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ export type JoiPrimitives = 'string' | 'number' | 'array' | 'date' | 'object' | 'boolean' | '*';
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/codemods/joi-to-zod/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { SgNode } from '@ast-grep/napi';
2
+ import type { Kinds, TypesMap } from '@ast-grep/napi/types/staticTypes.js';
3
+ declare function getJoiIdentifierName(root: SgNode<TypesMap, Kinds<TypesMap>>): string | undefined;
4
+ export default getJoiIdentifierName;
@@ -0,0 +1,6 @@
1
+ import getJoiImport, { JOI_IMPORT_META_IDENTIFIER } from './get-joi-import.js';
2
+ function getJoiIdentifierName(root) {
3
+ return getJoiImport(root)?.getMatch(JOI_IMPORT_META_IDENTIFIER)?.text();
4
+ }
5
+ export default getJoiIdentifierName;
6
+ //# sourceMappingURL=get-joi-identifier-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-joi-identifier-name.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/utils/get-joi-identifier-name.ts"],"names":[],"mappings":"AAGA,OAAO,YAAY,EAAE,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAE/E,SAAS,oBAAoB,CAAC,IAAuC;IACnE,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,0BAA0B,CAAC,EAAE,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { SgNode } from '@ast-grep/napi';
2
+ import type { Kinds, TypesMap } from '@ast-grep/napi/types/staticTypes.js';
3
+ export declare const JOI_IMPORT_META_IDENTIFIER = "J";
4
+ declare function getJoiImport(root: SgNode<TypesMap, Kinds<TypesMap>>): SgNode<TypesMap, Kinds<TypesMap>> | undefined;
5
+ export default getJoiImport;
@@ -0,0 +1,8 @@
1
+ export const JOI_IMPORT_META_IDENTIFIER = 'J';
2
+ function getJoiImport(root) {
3
+ const joiImport = root.find(`import $${JOI_IMPORT_META_IDENTIFIER} from 'joi'`) ??
4
+ root.find(`import $${JOI_IMPORT_META_IDENTIFIER} from "joi"`);
5
+ return joiImport ?? undefined;
6
+ }
7
+ export default getJoiImport;
8
+ //# sourceMappingURL=get-joi-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-joi-import.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/utils/get-joi-import.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAE9C,SAAS,YAAY,CAAC,IAAuC;IAC3D,MAAM,SAAS,GACb,IAAI,CAAC,IAAI,CAAC,WAAW,0BAA0B,aAAa,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,WAAW,0BAA0B,aAAa,CAAC,CAAC;IAEhE,OAAO,SAAS,IAAI,SAAS,CAAC;AAChC,CAAC;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SgNode } from '@ast-grep/napi';
2
+ import type { Kinds, TypesMap } from '@ast-grep/napi/types/staticTypes.js';
3
+ declare function getJoiPrimitive(property: SgNode<TypesMap, Kinds<TypesMap>>, joiImportIdentifierName: string): string | undefined;
4
+ export default getJoiPrimitive;
@@ -0,0 +1,11 @@
1
+ import extractNameFromCallExpression from '../../utils/extract-name-from-call-expression.js';
2
+ function getJoiPrimitive(property, joiImportIdentifierName) {
3
+ return extractNameFromCallExpression(property
4
+ .text()
5
+ .split(joiImportIdentifierName)
6
+ .filter(value => value.length > 0)[0]
7
+ ?.split('.')
8
+ .filter(value => value.length > 0)[0]);
9
+ }
10
+ export default getJoiPrimitive;
11
+ //# sourceMappingURL=get-joi-primitive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-joi-primitive.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/utils/get-joi-primitive.ts"],"names":[],"mappings":"AAGA,OAAO,6BAA6B,MAAM,kDAAkD,CAAC;AAE7F,SAAS,eAAe,CACtB,QAA2C,EAC3C,uBAA+B;IAE/B,OAAO,6BAA6B,CAClC,QAAQ;SACL,IAAI,EAAE;SACN,KAAK,CAAC,uBAAuB,CAAC;SAC9B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,EAAE,KAAK,CAAC,GAAG,CAAC;SACX,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SgNode } from '@ast-grep/napi';
2
+ import type { Kinds, TypesMap } from '@ast-grep/napi/types/staticTypes.js';
3
+ import type { JoiPrimitives } from '../types.ts';
4
+ declare function getJoiProperties(root: SgNode<TypesMap, Kinds<TypesMap>>, params: {
5
+ primitive?: JoiPrimitives;
6
+ validationName?: string;
7
+ }): Array<SgNode<TypesMap, Kinds<TypesMap>>>;
8
+ export default getJoiProperties;
@@ -0,0 +1,64 @@
1
+ import extractArgsFromCallExpression from '../../utils/extract-args-from-call-expression.js';
2
+ import extractNameFromCallExpression from '../../utils/extract-name-from-call-expression.js';
3
+ import traverseUp from '../../utils/traverse-up.js';
4
+ import getJoiIdentifierName from './get-joi-identifier-name.js';
5
+ function getJoiProperties(root, params) {
6
+ const joiImportIdentifierName = getJoiIdentifierName(root);
7
+ if (joiImportIdentifierName == null)
8
+ return [];
9
+ let propertyIdentifiers = root.findAll({ rule: { kind: 'property_identifier' } });
10
+ if (propertyIdentifiers.length === 0)
11
+ return [];
12
+ const validationName = extractNameFromCallExpression(params.validationName);
13
+ const validationArgs = extractArgsFromCallExpression(params.validationName);
14
+ const validationArgsIsMeta = validationArgs?.includes('$') ?? false;
15
+ if (validationName != null) {
16
+ propertyIdentifiers = propertyIdentifiers.filter(propertyIdentifier => {
17
+ const sameSignature = traverseUp(propertyIdentifier, node => node.kind() === 'call_expression')
18
+ ?.text()
19
+ .split('.')
20
+ .reverse()
21
+ .find(transformation => {
22
+ if (extractNameFromCallExpression(transformation) !== validationName)
23
+ return false;
24
+ const transformationArgs = extractArgsFromCallExpression(transformation);
25
+ if (transformationArgs == null && validationArgs == null)
26
+ return true;
27
+ const transformationArgsIsMeta = transformationArgs?.includes('$') ?? false;
28
+ if (transformationArgsIsMeta || validationArgsIsMeta)
29
+ return true;
30
+ return true;
31
+ }) != null;
32
+ return propertyIdentifier.text() === validationName && sameSignature;
33
+ });
34
+ }
35
+ return propertyIdentifiers.reduce((acc, propertyIdentifier) => {
36
+ const callExpression = traverseUp(propertyIdentifier, node => node.kind() === 'call_expression');
37
+ if (callExpression == null)
38
+ return acc;
39
+ let schemaCallExpression = callExpression;
40
+ while (schemaCallExpression.parent()?.kind() === 'member_expression') {
41
+ const nextCallExpression = schemaCallExpression.parent()?.parent();
42
+ if (nextCallExpression?.kind() !== 'call_expression')
43
+ break;
44
+ schemaCallExpression = nextCallExpression;
45
+ }
46
+ const callExpressionText = schemaCallExpression.text();
47
+ if (!callExpressionText.startsWith(joiImportIdentifierName))
48
+ return acc;
49
+ if (params.primitive != null &&
50
+ params.primitive !== '*' &&
51
+ !callExpressionText.includes(`.${params.primitive}(`)) {
52
+ return acc;
53
+ }
54
+ const range = schemaCallExpression.range();
55
+ const rangeKey = `${range.start.index}:${range.end.index}`;
56
+ if (acc.checkedIn.has(rangeKey))
57
+ return acc;
58
+ acc.results.push(schemaCallExpression);
59
+ acc.checkedIn.add(rangeKey);
60
+ return acc;
61
+ }, { results: [], checkedIn: new Set([]) }).results;
62
+ }
63
+ export default getJoiProperties;
64
+ //# sourceMappingURL=get-joi-properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-joi-properties.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/utils/get-joi-properties.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SgNode } from '@ast-grep/napi';
2
+ import type { Kinds, TypesMap } from '@ast-grep/napi/types/staticTypes.js';
3
+ declare function hasJoiImport(root: SgNode<TypesMap, Kinds<TypesMap>>): boolean;
4
+ export default hasJoiImport;
@@ -0,0 +1,7 @@
1
+ import getJoiImport, { JOI_IMPORT_META_IDENTIFIER } from './get-joi-import.js';
2
+ function hasJoiImport(root) {
3
+ const joiImport = getJoiImport(root);
4
+ return joiImport?.getMatch(JOI_IMPORT_META_IDENTIFIER) != null;
5
+ }
6
+ export default hasJoiImport;
7
+ //# sourceMappingURL=has-joi-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-joi-import.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/utils/has-joi-import.ts"],"names":[],"mappings":"AAGA,OAAO,YAAY,EAAE,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAE/E,SAAS,YAAY,CAAC,IAAuC;IAC3D,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO,SAAS,EAAE,QAAQ,CAAC,0BAA0B,CAAC,IAAI,IAAI,CAAC;AACjE,CAAC;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SgNode } from '@ast-grep/napi';
2
+ import type { Kinds, TypesMap } from '@ast-grep/napi/types/staticTypes.js';
3
+ declare function hasZodImport(root: SgNode<TypesMap, Kinds<TypesMap>>): boolean;
4
+ export default hasZodImport;
@@ -0,0 +1,14 @@
1
+ function getZodImport(root) {
2
+ return (root.find("import $Z from 'zod'") ??
3
+ root.find('import $Z from "zod"') ??
4
+ root.find("import { $$$IMPORTS } from 'zod'") ??
5
+ root.find('import { $$$IMPORTS } from "zod"') ??
6
+ root.find("import * as $Z from 'zod'") ??
7
+ root.find('import * as $Z from "zod"'));
8
+ }
9
+ function hasZodImport(root) {
10
+ const zodImport = getZodImport(root);
11
+ return zodImport != null;
12
+ }
13
+ export default hasZodImport;
14
+ //# sourceMappingURL=has-zod-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-zod-import.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/utils/has-zod-import.ts"],"names":[],"mappings":"AAGA,SAAS,YAAY,CAAC,IAAuC;IAC3D,OAAO,CACL,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAuC;IAC3D,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO,SAAS,IAAI,IAAI,CAAC;AAC3B,CAAC;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function parseJoiReferencePath(argument: string): Array<string> | undefined;
2
+ export declare function buildValueAccessor(segments: Array<string>, valueIdentifier?: string): string;
3
+ export declare function referenceToAccessor(argument: string, valueIdentifier?: string): string | undefined;
@@ -0,0 +1,32 @@
1
+ const STRING_LITERAL_PATTERN = /^(['"])(.*)\1$/s;
2
+ const REF_CALL_PATTERN = /^[$\w]+\.ref\(\s*(['"])(.*?)\1\s*\)$/s;
3
+ export function parseJoiReferencePath(argument) {
4
+ const trimmed = argument.trim();
5
+ const literal = STRING_LITERAL_PATTERN.exec(trimmed) ?? REF_CALL_PATTERN.exec(trimmed);
6
+ if (literal == null)
7
+ return undefined;
8
+ const raw = literal[2];
9
+ if (raw == null)
10
+ return undefined;
11
+ const segments = raw
12
+ .replace(/^\./, '')
13
+ .split('.')
14
+ .map(segment => segment.trim())
15
+ .filter(segment => segment.length > 0);
16
+ if (segments.length === 0)
17
+ return undefined;
18
+ return segments;
19
+ }
20
+ export function buildValueAccessor(segments, valueIdentifier = 'value') {
21
+ return segments.reduce((accessor, segment, index) => {
22
+ const key = `['${segment}']`;
23
+ return index === 0 ? `${accessor}${key}` : `${accessor}?.${key}`;
24
+ }, valueIdentifier);
25
+ }
26
+ export function referenceToAccessor(argument, valueIdentifier = 'value') {
27
+ const segments = parseJoiReferencePath(argument);
28
+ if (segments == null)
29
+ return undefined;
30
+ return buildValueAccessor(segments, valueIdentifier);
31
+ }
32
+ //# sourceMappingURL=object-path-accessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-path-accessor.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/utils/object-path-accessor.ts"],"names":[],"mappings":"AAAA,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;AACjD,MAAM,gBAAgB,GAAG,uCAAuC,CAAC;AAEjE,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvF,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAEtC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAElC,MAAM,QAAQ,GAAG,GAAG;SACjB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE5C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAuB,EAAE,eAAe,GAAG,OAAO;IACnF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,GAAG,GAAG,KAAK,OAAO,IAAI,CAAC;QAE7B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,GAAG,EAAE,CAAC;IACnE,CAAC,EAAE,eAAe,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,eAAe,GAAG,OAAO;IAC7E,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAEvC,OAAO,kBAAkB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SgNode } from '@ast-grep/napi';
2
+ import type { Kinds, TypesMap } from '@ast-grep/napi/types/staticTypes.js';
3
+ import type { JoiPrimitives } from '../types.ts';
4
+ declare function removeJoiValidationEdits(root: SgNode<TypesMap, Kinds<TypesMap>>, params: {
5
+ primitive: JoiPrimitives;
6
+ validationTargetKey: string;
7
+ }): import("@ast-grep/napi").Edit[];
8
+ export default removeJoiValidationEdits;
@@ -0,0 +1,6 @@
1
+ import replaceJoiValidationWithZodEdits from './replace-joi-validation-with-zod-edits.js';
2
+ function removeJoiValidationEdits(root, params) {
3
+ return replaceJoiValidationWithZodEdits(root, { ...params, zodValidation: undefined });
4
+ }
5
+ export default removeJoiValidationEdits;
6
+ //# sourceMappingURL=remove-joi-validation-edits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-joi-validation-edits.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/utils/remove-joi-validation-edits.ts"],"names":[],"mappings":"AAIA,OAAO,gCAAgC,MAAM,4CAA4C,CAAC;AAE1F,SAAS,wBAAwB,CAC/B,IAAuC,EACvC,MAAiE;IAEjE,OAAO,gCAAgC,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,eAAe,wBAAwB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Edit, SgNode } from '@ast-grep/napi';
2
+ import type { Kinds, TypesMap } from '@ast-grep/napi/types/staticTypes.js';
3
+ import type { JoiPrimitives } from '../types.ts';
4
+ declare function replaceJoiValidationWithZodEdits(root: SgNode<TypesMap, Kinds<TypesMap>>, params: {
5
+ primitive: JoiPrimitives;
6
+ validationTargetKey: string;
7
+ zodValidation: string | undefined;
8
+ }): Array<Edit>;
9
+ export default replaceJoiValidationWithZodEdits;