@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
package/README.md CHANGED
@@ -348,12 +348,6 @@ Every task lives in `package.json` — there is no task runner to install:
348
348
  | `yarn new:codemod <name>` | Scaffold a new codemod |
349
349
  | `yarn release <version>` | Publish to npm |
350
350
 
351
- The release workflow uses npm trusted publishing through GitHub Actions. To
352
- bootstrap the first release, add a write-capable `NPM_TOKEN` repository secret
353
- temporarily. The release script passes it only to Yarn's npm authentication.
354
- After the package exists, configure `kamaal111/codemods` and `release.yml` as
355
- its trusted publisher in npm, then remove the secret; future releases use OIDC.
356
-
357
351
  ## Contributing
358
352
 
359
353
  Adding a codemod takes about ten minutes. See [CONTRIBUTING.md](./CONTRIBUTING.md).
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare function run(argv?: Array<string>): Promise<void>;
package/dist/cli.js ADDED
@@ -0,0 +1,64 @@
1
+ import packageJSON from '../package.json' with { type: 'json' };
2
+ import { CODEMOD_REGISTRY, codemodNames, isCodemodName } from './codemods/registry.js';
3
+ import { listCommand } from './commands/list.js';
4
+ import { makeRunHelpText, runCodemodCommand } from './commands/run.js';
5
+ import { CliUsageError } from './errors.js';
6
+ const HELP_FLAGS = new Set(['-h', '--help']);
7
+ const VERSION_FLAGS = new Set(['-v', '--version']);
8
+ function topLevelHelpText() {
9
+ const names = codemodNames();
10
+ const longestName = Math.max(...names.map(name => name.length));
11
+ const codemodLines = names.map(name => ` ${name.padEnd(longestName)} ${CODEMOD_REGISTRY[name].summary}`).join('\n');
12
+ return `Run a codemod over your source tree.
13
+
14
+ USAGE
15
+ $ codemods [CODEMOD] [PATH] [FLAGS]
16
+
17
+ CODEMODS
18
+ ${codemodLines}
19
+
20
+ COMMANDS
21
+ ${'list'.padEnd(longestName)} List the available codemods
22
+
23
+ Run '$ codemods <codemod> --help' for codemod-specific usage.
24
+ `;
25
+ }
26
+ export async function run(argv = process.argv.slice(2)) {
27
+ const [command, ...rest] = argv;
28
+ if (command === undefined || HELP_FLAGS.has(command)) {
29
+ console.log(topLevelHelpText());
30
+ return;
31
+ }
32
+ if (VERSION_FLAGS.has(command)) {
33
+ console.log(packageJSON.version);
34
+ return;
35
+ }
36
+ if (command === 'list') {
37
+ if (rest.some(arg => HELP_FLAGS.has(arg))) {
38
+ console.log(topLevelHelpText());
39
+ return;
40
+ }
41
+ listCommand();
42
+ return;
43
+ }
44
+ if (!isCodemodName(command)) {
45
+ handleError(new CliUsageError(`Unknown codemod '${command}'. Run 'codemods --help' for a list of available codemods.`));
46
+ return;
47
+ }
48
+ if (rest.some(arg => HELP_FLAGS.has(arg))) {
49
+ console.log(makeRunHelpText(command));
50
+ return;
51
+ }
52
+ try {
53
+ await runCodemodCommand(command, rest);
54
+ }
55
+ catch (error) {
56
+ handleError(error);
57
+ }
58
+ }
59
+ function handleError(error) {
60
+ const message = error instanceof Error ? error.message : String(error);
61
+ process.stderr.write(`${message}\n`);
62
+ process.exitCode = error instanceof CliUsageError ? 2 : 1;
63
+ }
64
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Lang, type SgRoot } from '@ast-grep/napi';
2
+ import type { TypesMap } from '@ast-grep/napi/types/staticTypes.js';
3
+ import type { Codemod, Modifications } from '../../kit/types.ts';
4
+ export declare const JOI_TO_ZOD_LANGUAGE = Lang.TypeScript;
5
+ export declare function joiToZodModifications(modifications: Modifications): Promise<Modifications>;
6
+ export declare function makeJoiToZodInitialModification(ast: SgRoot<TypesMap>, filename?: string): Modifications;
7
+ declare function joiToZod(content: string, filename?: string): Promise<string>;
8
+ export declare function joiToZodTransformer(content: string, filename?: string): Promise<Modifications>;
9
+ export declare const JOI_TO_ZOD_CODEMOD: Codemod;
10
+ export default joiToZod;
@@ -0,0 +1,83 @@
1
+ import { Lang, parseAsync } from '@ast-grep/napi';
2
+ import joiAddManualMigrationTodo from './rules/joi-add-manual-migration-todo.js';
3
+ import joiAddOptional from './rules/joi-add-optional.js';
4
+ import joiAlternativesToUnion from './rules/joi-alternatives-to-union.js';
5
+ import joiArrayItemsUnnest from './rules/joi-array-items-unnest.js';
6
+ import joiAssertToRefine from './rules/joi-assert-to-refine.js';
7
+ import joiBinaryToInstanceof from './rules/joi-binary-to-instanceof.js';
8
+ import joiCheckToEnum from './rules/joi-check-to-enum.js';
9
+ import joiConcatToIntersection from './rules/joi-concat-to-intersection.js';
10
+ import joiCustomToTransform from './rules/joi-custom-to-transform.js';
11
+ import joiDateToCoerceDate from './rules/joi-date-to-coerce-date.js';
12
+ import joiForbiddenToNever from './rules/joi-forbidden-to-never.js';
13
+ import joiFormatsToZodBase from './rules/joi-formats-to-zod-base.js';
14
+ import joiObjectKeysUnnest from './rules/joi-object-keys-unnest.js';
15
+ import joiObjectPatternToRecord from './rules/joi-object-pattern-to-record.js';
16
+ import joiObjectRelationsToRefine from './rules/joi-object-relations-to-refine.js';
17
+ import joiReferenceToZod from './rules/joi-reference-to-zod.js';
18
+ import joiRemoveImport from './rules/joi-remove-import.js';
19
+ import joiRemoveOptionsFromRegex from './rules/joi-remove-options-from-regex.js';
20
+ import joiRemovePrimitiveForEnum from './rules/joi-remove-primitive-for-enum.js';
21
+ import joiRemoveRequired from './rules/joi-remove-required.js';
22
+ import joiValidationsToZodValidations from './rules/joi-validations-to-zod-validations.js';
23
+ import joiWhenToRefine from './rules/joi-when-to-refine.js';
24
+ import zodAddImport from './rules/zod-add-import.js';
25
+ import hasJoiImport from './utils/has-joi-import.js';
26
+ export const JOI_TO_ZOD_LANGUAGE = Lang.TypeScript;
27
+ function joiToZodFilter(root) {
28
+ return hasJoiImport(root);
29
+ }
30
+ export async function joiToZodModifications(modifications) {
31
+ const root = modifications.ast.root();
32
+ if (!joiToZodFilter(root))
33
+ return modifications;
34
+ return zodAddImport(modifications)
35
+ .then(joiRemoveOptionsFromRegex)
36
+ .then(joiObjectPatternToRecord)
37
+ .then(joiWhenToRefine)
38
+ .then(joiAssertToRefine)
39
+ .then(joiCustomToTransform)
40
+ .then(joiBinaryToInstanceof)
41
+ .then(joiConcatToIntersection)
42
+ .then(joiForbiddenToNever)
43
+ .then(joiFormatsToZodBase)
44
+ .then(joiDateToCoerceDate)
45
+ .then(joiObjectRelationsToRefine)
46
+ .then(joiValidationsToZodValidations)
47
+ .then(joiCheckToEnum)
48
+ .then(joiRemovePrimitiveForEnum)
49
+ .then(joiObjectKeysUnnest)
50
+ .then(joiArrayItemsUnnest)
51
+ .then(joiAlternativesToUnion)
52
+ .then(joiAddOptional)
53
+ .then(joiRemoveRequired)
54
+ .then(joiAddManualMigrationTodo)
55
+ .then(joiReferenceToZod)
56
+ .then(joiRemoveImport);
57
+ }
58
+ export function makeJoiToZodInitialModification(ast, filename) {
59
+ return {
60
+ lang: JOI_TO_ZOD_LANGUAGE,
61
+ report: { changesApplied: 0 },
62
+ ast,
63
+ filename,
64
+ history: [ast],
65
+ };
66
+ }
67
+ async function joiToZod(content, filename) {
68
+ const ast = await parseAsync(JOI_TO_ZOD_LANGUAGE, content);
69
+ return joiToZodModifications(makeJoiToZodInitialModification(ast, filename)).then(modifications => {
70
+ return modifications.ast.root().text();
71
+ });
72
+ }
73
+ export async function joiToZodTransformer(content, filename) {
74
+ const ast = await parseAsync(JOI_TO_ZOD_LANGUAGE, content);
75
+ return joiToZodModifications(makeJoiToZodInitialModification(ast, filename));
76
+ }
77
+ export const JOI_TO_ZOD_CODEMOD = {
78
+ name: 'joi-to-zod-transformer',
79
+ languages: [JOI_TO_ZOD_LANGUAGE],
80
+ transformer: joiToZod,
81
+ };
82
+ export default joiToZod;
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/codemods/joi-to-zod/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiAddManualMigrationTodo(modifications: Modifications): Promise<Modifications>;
3
+ export default joiAddManualMigrationTodo;
@@ -0,0 +1,36 @@
1
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
2
+ import getJoiProperties from '../utils/get-joi-properties.js';
3
+ const UNSUPPORTED_VALIDATIONS = [
4
+ {
5
+ name: 'when',
6
+ guidance: 'switch/not/break conditions and conditionals outside an object property have no direct equivalent; use a discriminated union or an object-level superRefine',
7
+ },
8
+ {
9
+ name: 'custom',
10
+ guidance: 'its callback needs Joi helpers beyond error and message, or is followed by calls a transform would remove; rewrite it as refine or superRefine',
11
+ },
12
+ {
13
+ name: 'assert',
14
+ guidance: 'its subject is not a plain reference; rewrite the cross-field assertion as superRefine',
15
+ },
16
+ ];
17
+ async function joiAddManualMigrationTodo(modifications) {
18
+ return addManualMigrationTodos(modifications, 0);
19
+ }
20
+ async function addManualMigrationTodos(modifications, validationIndex) {
21
+ const validation = UNSUPPORTED_VALIDATIONS[validationIndex];
22
+ if (validation == null)
23
+ return modifications;
24
+ const { name, guidance } = validation;
25
+ const properties = getJoiProperties(modifications.ast.root(), {
26
+ primitive: '*',
27
+ validationName: `${name}($ARGS)`,
28
+ });
29
+ const edits = properties.map(property => {
30
+ return property.replace(`/* TODO(joi-to-zod): Manually migrate ${name}(); ${guidance}. */ ${property.text()}`);
31
+ });
32
+ const committed = await commitEditModifications(edits, modifications);
33
+ return addManualMigrationTodos(committed, validationIndex + 1);
34
+ }
35
+ export default joiAddManualMigrationTodo;
36
+ //# sourceMappingURL=joi-add-manual-migration-todo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-add-manual-migration-todo.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-add-manual-migration-todo.ts"],"names":[],"mappings":"AACA,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAE9D,MAAM,uBAAuB,GAAG;IAC9B;QACE,IAAI,EAAE,MAAM;QACZ,QAAQ,EACN,6JAA6J;KAChK;IACD;QACE,IAAI,EAAE,QAAQ;QACd,QAAQ,EACN,gJAAgJ;KACnJ;IACD;QACE,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,wFAAwF;KACnG;CACF,CAAC;AAEF,KAAK,UAAU,yBAAyB,CAAC,aAA4B;IACnE,OAAO,uBAAuB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,aAA4B,EAAE,eAAuB;IAC1F,MAAM,UAAU,GAAG,uBAAuB,CAAC,eAAe,CAAC,CAAC;IAC5D,IAAI,UAAU,IAAI,IAAI;QAAE,OAAO,aAAa,CAAC;IAE7C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;IACtC,MAAM,UAAU,GAAG,gBAAgB,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE;QAC5D,SAAS,EAAE,GAAG;QACd,cAAc,EAAE,GAAG,IAAI,SAAS;KACjC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;QACtC,OAAO,QAAQ,CAAC,OAAO,CAAC,yCAAyC,IAAI,OAAO,QAAQ,QAAQ,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjH,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAEtE,OAAO,uBAAuB,CAAC,SAAS,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiAddOptional(modifications: Modifications): Promise<Modifications>;
3
+ export default joiAddOptional;
@@ -0,0 +1,19 @@
1
+ import commitEditModificationsUntilStable from '../../utils/commit-edit-modifications-until-stable.js';
2
+ import innermostNodes from '../../utils/innermost-nodes.js';
3
+ import getJoiProperties from '../utils/get-joi-properties.js';
4
+ const PRESENCE_BEARING_PARENTS = new Set(['pair', 'variable_declarator']);
5
+ async function joiAddOptional(modifications) {
6
+ return commitEditModificationsUntilStable(modifications, current => {
7
+ const root = current.ast.root();
8
+ const candidates = getJoiProperties(root, { primitive: '*' }).filter(property => {
9
+ const parentKind = property.parent()?.kind();
10
+ if (parentKind == null || !PRESENCE_BEARING_PARENTS.has(String(parentKind)))
11
+ return false;
12
+ const text = property.text();
13
+ return !text.includes('.required') && !text.trimEnd().endsWith('.optional()');
14
+ });
15
+ return innermostNodes(candidates).map(property => property.replace(`${property.text()}.optional()`));
16
+ });
17
+ }
18
+ export default joiAddOptional;
19
+ //# sourceMappingURL=joi-add-optional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-add-optional.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-add-optional.ts"],"names":[],"mappings":"AACA,OAAO,kCAAkC,MAAM,uDAAuD,CAAC;AACvG,OAAO,cAAc,MAAM,gCAAgC,CAAC;AAC5D,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAE9D,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;AAElF,KAAK,UAAU,cAAc,CAAC,aAA4B;IACxD,OAAO,kCAAkC,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;YAC9E,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC;YAC7C,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YAE1F,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAE7B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiAlternativesToUnion(modifications: Modifications): Promise<Modifications>;
3
+ export default joiAlternativesToUnion;
@@ -0,0 +1,24 @@
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 ARGS_META_IDENTIFIER = 'ARGS';
5
+ async function joiAlternativesToUnion(modifications) {
6
+ const root = modifications.ast.root();
7
+ const joiImportIdentifierName = getJoiIdentifierName(root);
8
+ if (joiImportIdentifierName == null)
9
+ return modifications;
10
+ const tryPrefix = `${joiImportIdentifierName}.alternatives().try(`;
11
+ const alternativeTries = root.findAll({
12
+ rule: { pattern: `${joiImportIdentifierName}.alternatives().try($$$${ARGS_META_IDENTIFIER})` },
13
+ });
14
+ const edits = compactMap(alternativeTries, node => {
15
+ const text = node.text();
16
+ if (!text.startsWith(tryPrefix) || !text.endsWith(')'))
17
+ return null;
18
+ const argsText = text.slice(tryPrefix.length, -1);
19
+ return node.replace(`${joiImportIdentifierName}.union([${argsText}])`);
20
+ });
21
+ return commitEditModifications(edits, modifications);
22
+ }
23
+ export default joiAlternativesToUnion;
24
+ //# sourceMappingURL=joi-alternatives-to-union.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-alternatives-to-union.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-alternatives-to-union.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,oBAAoB,GAAG,MAAM,CAAC;AAEpC,KAAK,UAAU,sBAAsB,CAAC,aAA4B;IAChE,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,SAAS,GAAG,GAAG,uBAAuB,sBAAsB,CAAC;IACnE,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,uBAAuB,0BAA0B,oBAAoB,GAAG,EAAE;KAC/F,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAElD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,uBAAuB,WAAW,QAAQ,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,OAAO,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiArrayItemsUnnest(modifications: Modifications): Promise<Modifications>;
3
+ export default joiArrayItemsUnnest;
@@ -0,0 +1,28 @@
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 ARGS_META_IDENTIFIER = 'ARGS';
5
+ async function joiArrayItemsUnnest(modifications) {
6
+ const joiImportIdentifierName = getJoiIdentifierName(modifications.ast.root());
7
+ if (joiImportIdentifierName == null)
8
+ return modifications;
9
+ return unnestArrayItems(modifications, joiImportIdentifierName);
10
+ }
11
+ async function unnestArrayItems(modifications, joiImportIdentifierName) {
12
+ const arrayItems = modifications.ast
13
+ .root()
14
+ .findAll({ rule: { pattern: `${joiImportIdentifierName}.array().items($${ARGS_META_IDENTIFIER})` } });
15
+ const edits = compactMap(arrayItems, node => {
16
+ const itemsSchema = node.getMatch(ARGS_META_IDENTIFIER);
17
+ if (itemsSchema == null)
18
+ return null;
19
+ return node.replace(`${joiImportIdentifierName}.array(${itemsSchema.text()})`);
20
+ });
21
+ const updated = await commitEditModifications(edits, modifications);
22
+ const isUnchanged = updated.ast.root().text() === modifications.ast.root().text();
23
+ if (isUnchanged)
24
+ return modifications;
25
+ return unnestArrayItems(updated, joiImportIdentifierName);
26
+ }
27
+ export default joiArrayItemsUnnest;
28
+ //# sourceMappingURL=joi-array-items-unnest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-array-items-unnest.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-array-items-unnest.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,oBAAoB,GAAG,MAAM,CAAC;AAEpC,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,OAAO,gBAAgB,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,aAA4B,EAAE,uBAA+B;IAC3F,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG;SACjC,IAAI,EAAE;SACN,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,uBAAuB,mBAAmB,oBAAoB,GAAG,EAAE,EAAE,CAAC,CAAC;IACxG,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;QACxD,IAAI,WAAW,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAErC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,uBAAuB,UAAU,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC,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,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;AAC5D,CAAC;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiAssertToRefine(modifications: Modifications): Promise<Modifications>;
3
+ export default joiAssertToRefine;
@@ -0,0 +1,68 @@
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
+ import { buildValueAccessor, parseJoiReferencePath, referenceToAccessor } from '../utils/object-path-accessor.js';
9
+ function buildAssertReplacement(args, joiIdentifierName) {
10
+ const parsedArgs = splitArguments(args).map(argument => argument.trim());
11
+ const [subject, schema, message] = parsedArgs;
12
+ if (subject == null || schema == null)
13
+ return undefined;
14
+ const subjectSegments = parseJoiReferencePath(subject);
15
+ if (subjectSegments == null)
16
+ return undefined;
17
+ const subjectAccessor = buildValueAccessor(subjectSegments);
18
+ const referenceAccessor = referenceToAccessor(schema);
19
+ const predicate = referenceAccessor != null
20
+ ? `${subjectAccessor} === ${referenceAccessor}`
21
+ : `${schema}.safeParse(${subjectAccessor}).success`;
22
+ if (referenceAccessor == null && !schema.startsWith(joiIdentifierName))
23
+ return undefined;
24
+ const path = subjectSegments.map(segment => `'${segment}'`).join(', ');
25
+ const options = message == null ? `{ path: [${path}] }` : `{ message: ${message}, path: [${path}] }`;
26
+ return `refine(value => ${predicate}, ${options})`;
27
+ }
28
+ function rewriteAsserts(chainText, joiIdentifierName) {
29
+ for (const { segments } of findIdentifierCallChains(chainText, joiIdentifierName)) {
30
+ const baseSegment = segments[0];
31
+ if (baseSegment == null || baseSegment.name !== 'object')
32
+ continue;
33
+ const assertSegments = segments
34
+ .slice(1)
35
+ .filter(segment => segment.name === 'assert')
36
+ .reverse();
37
+ if (assertSegments.length === 0)
38
+ continue;
39
+ return assertSegments.reduce((accumulator, segment) => {
40
+ const replacement = buildAssertReplacement(segment.args, joiIdentifierName);
41
+ if (replacement == null)
42
+ return accumulator;
43
+ return accumulator.slice(0, segment.startIndex) + `.${replacement}` + accumulator.slice(segment.endIndex);
44
+ }, chainText);
45
+ }
46
+ return chainText;
47
+ }
48
+ async function joiAssertToRefine(modifications) {
49
+ return commitEditModificationsUntilStable(modifications, current => {
50
+ const root = current.ast.root();
51
+ const joiIdentifierName = getJoiIdentifierName(root);
52
+ if (joiIdentifierName == null)
53
+ return [];
54
+ const properties = getJoiProperties(root, { primitive: 'object' });
55
+ const rewrites = compactMap(properties, property => {
56
+ const propertyText = property.text();
57
+ const replacement = rewriteAsserts(propertyText, joiIdentifierName);
58
+ if (replacement === propertyText)
59
+ return null;
60
+ return { property, replacement };
61
+ });
62
+ return innermostBy(rewrites, rewrite => rewrite.property).map(rewrite => {
63
+ return rewrite.property.replace(rewrite.replacement);
64
+ });
65
+ });
66
+ }
67
+ export default joiAssertToRefine;
68
+ //# sourceMappingURL=joi-assert-to-refine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-assert-to-refine.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-assert-to-refine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiBinaryToInstanceof(modifications: Modifications): Promise<Modifications>;
3
+ export default joiBinaryToInstanceof;
@@ -0,0 +1,12 @@
1
+ import commitEditModifications from '../../utils/commit-edit-modifications.js';
2
+ import getJoiIdentifierName from '../utils/get-joi-identifier-name.js';
3
+ async function joiBinaryToInstanceof(modifications) {
4
+ const joiImportIdentifierName = getJoiIdentifierName(modifications.ast.root());
5
+ if (joiImportIdentifierName == null)
6
+ return modifications;
7
+ const binaries = modifications.ast.root().findAll({ rule: { pattern: `${joiImportIdentifierName}.binary()` } });
8
+ const edits = binaries.map(node => node.replace(`${joiImportIdentifierName}.instanceof(Buffer)`));
9
+ return commitEditModifications(edits, modifications);
10
+ }
11
+ export default joiBinaryToInstanceof;
12
+ //# sourceMappingURL=joi-binary-to-instanceof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-binary-to-instanceof.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-binary-to-instanceof.ts"],"names":[],"mappings":"AACA,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAC/E,OAAO,oBAAoB,MAAM,qCAAqC,CAAC;AAEvE,KAAK,UAAU,qBAAqB,CAAC,aAA4B;IAC/D,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,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,uBAAuB,WAAW,EAAE,EAAE,CAAC,CAAC;IAChH,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,uBAAuB,qBAAqB,CAAC,CAAC,CAAC;IAElG,OAAO,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiCheckToEnum(modifications: Modifications): Promise<Modifications>;
3
+ export default joiCheckToEnum;
@@ -0,0 +1,57 @@
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
+ const ARGS_META_IDENTIFIER = 'ARGS';
7
+ const CHAIN_META_IDENTIFIER = 'CHAIN';
8
+ const ENUM_VALUES_PATTERN = /^\.\.\.\s*Object\.values\(\s*([$_\p{ID_Start}][$_\p{ID_Continue}]*)\s*\)$/u;
9
+ function getEnumIdentifierFromSpread(argsText) {
10
+ return ENUM_VALUES_PATTERN.exec(argsText)?.[1];
11
+ }
12
+ async function joiCheckToEnum(modifications) {
13
+ const joiImportIdentifierName = getJoiIdentifierName(modifications.ast.root());
14
+ if (joiImportIdentifierName == null)
15
+ return modifications;
16
+ return convertChecksToEnums(modifications, joiImportIdentifierName);
17
+ }
18
+ async function convertChecksToEnums(modifications, joiImportIdentifierName) {
19
+ const properties = getJoiProperties(modifications.ast.root(), { primitive: '*', validationName: 'valid($ARGS)' });
20
+ const edits = compactMap(properties, property => {
21
+ const primitive = getJoiPrimitive(property, joiImportIdentifierName);
22
+ if (primitive == null)
23
+ return null;
24
+ const validCallNode = property.find({
25
+ rule: { pattern: `$${CHAIN_META_IDENTIFIER}.valid($$$${ARGS_META_IDENTIFIER})` },
26
+ });
27
+ if (validCallNode == null)
28
+ return null;
29
+ const chainNode = validCallNode.getMatch(CHAIN_META_IDENTIFIER);
30
+ if (chainNode == null)
31
+ return null;
32
+ const argNodes = validCallNode.getMultipleMatches(ARGS_META_IDENTIFIER).filter(n => n.isNamed());
33
+ const argsText = argNodes.map(n => n.text()).join(', ');
34
+ if (primitive !== 'string') {
35
+ const [firstLiteral, ...restLiterals] = argNodes.map(node => `${joiImportIdentifierName}.literal(${node.text()})`);
36
+ if (firstLiteral == null)
37
+ return null;
38
+ const replacement = restLiterals.length === 0
39
+ ? firstLiteral
40
+ : `${joiImportIdentifierName}.union([${[firstLiteral, ...restLiterals].join(', ')}])`;
41
+ return validCallNode.replace(replacement);
42
+ }
43
+ const enumIdentifier = getEnumIdentifierFromSpread(argsText);
44
+ if (enumIdentifier != null)
45
+ return validCallNode.replace(`${chainNode.text()}.enum(${enumIdentifier})`);
46
+ const trimmedArgsText = argsText.trimStart();
47
+ const enumValues = trimmedArgsText.startsWith('...') ? trimmedArgsText.slice(3) : `[${argsText}]`;
48
+ return validCallNode.replace(`${chainNode.text()}.enum(${enumValues})`);
49
+ });
50
+ const updated = await commitEditModifications(edits, modifications);
51
+ const isUnchanged = updated.ast.root().text() === modifications.ast.root().text();
52
+ if (isUnchanged)
53
+ return modifications;
54
+ return convertChecksToEnums(updated, joiImportIdentifierName);
55
+ }
56
+ export default joiCheckToEnum;
57
+ //# sourceMappingURL=joi-check-to-enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-check-to-enum.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-check-to-enum.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiConcatToIntersection(modifications: Modifications): Promise<Modifications>;
3
+ export default joiConcatToIntersection;
@@ -0,0 +1,24 @@
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 CHAIN_META_IDENTIFIER = 'CHAIN';
5
+ const SCHEMA_META_IDENTIFIER = 'SCHEMA';
6
+ async function joiConcatToIntersection(modifications) {
7
+ const joiImportIdentifierName = getJoiIdentifierName(modifications.ast.root());
8
+ if (joiImportIdentifierName == null)
9
+ return modifications;
10
+ const concatenations = modifications.ast.root().findAll({
11
+ rule: { pattern: `$${CHAIN_META_IDENTIFIER}.concat($${SCHEMA_META_IDENTIFIER})` },
12
+ });
13
+ const edits = compactMap(concatenations, node => {
14
+ const chain = node.getMatch(CHAIN_META_IDENTIFIER);
15
+ const schema = node.getMatch(SCHEMA_META_IDENTIFIER);
16
+ const isNotJoiConcatChain = chain == null || schema == null || !chain.text().startsWith(joiImportIdentifierName);
17
+ if (isNotJoiConcatChain)
18
+ return null;
19
+ return node.replace(`${joiImportIdentifierName}.intersection(${chain.text()}, ${schema.text()})`);
20
+ });
21
+ return commitEditModifications(edits, modifications);
22
+ }
23
+ export default joiConcatToIntersection;
24
+ //# sourceMappingURL=joi-concat-to-intersection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-concat-to-intersection.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/rules/joi-concat-to-intersection.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,qBAAqB,GAAG,OAAO,CAAC;AACtC,MAAM,sBAAsB,GAAG,QAAQ,CAAC;AAExC,KAAK,UAAU,uBAAuB,CAAC,aAA4B;IACjE,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,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC;QACtD,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,qBAAqB,YAAY,sBAAsB,GAAG,EAAE;KAClF,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,mBAAmB,GAAG,KAAK,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;QACjH,IAAI,mBAAmB;YAAE,OAAO,IAAI,CAAC;QAErC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,uBAAuB,iBAAiB,KAAK,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpG,CAAC,CAAC,CAAC;IAEH,OAAO,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Modifications } from '../../../kit/types.ts';
2
+ declare function joiCustomToTransform(modifications: Modifications): Promise<Modifications>;
3
+ export default joiCustomToTransform;