@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.
- package/README.md +0 -6
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +64 -0
- package/dist/cli.js.map +1 -0
- package/dist/codemods/joi-to-zod/index.d.ts +10 -0
- package/dist/codemods/joi-to-zod/index.js +83 -0
- package/dist/codemods/joi-to-zod/index.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-add-manual-migration-todo.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-add-manual-migration-todo.js +36 -0
- package/dist/codemods/joi-to-zod/rules/joi-add-manual-migration-todo.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-add-optional.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-add-optional.js +19 -0
- package/dist/codemods/joi-to-zod/rules/joi-add-optional.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-alternatives-to-union.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-alternatives-to-union.js +24 -0
- package/dist/codemods/joi-to-zod/rules/joi-alternatives-to-union.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-array-items-unnest.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-array-items-unnest.js +28 -0
- package/dist/codemods/joi-to-zod/rules/joi-array-items-unnest.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-assert-to-refine.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-assert-to-refine.js +68 -0
- package/dist/codemods/joi-to-zod/rules/joi-assert-to-refine.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-binary-to-instanceof.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-binary-to-instanceof.js +12 -0
- package/dist/codemods/joi-to-zod/rules/joi-binary-to-instanceof.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-check-to-enum.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-check-to-enum.js +57 -0
- package/dist/codemods/joi-to-zod/rules/joi-check-to-enum.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-concat-to-intersection.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-concat-to-intersection.js +24 -0
- package/dist/codemods/joi-to-zod/rules/joi-concat-to-intersection.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-custom-to-transform.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-custom-to-transform.js +95 -0
- package/dist/codemods/joi-to-zod/rules/joi-custom-to-transform.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-date-to-coerce-date.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-date-to-coerce-date.js +55 -0
- package/dist/codemods/joi-to-zod/rules/joi-date-to-coerce-date.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-forbidden-to-never.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-forbidden-to-never.js +13 -0
- package/dist/codemods/joi-to-zod/rules/joi-forbidden-to-never.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-formats-to-zod-base.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-formats-to-zod-base.js +64 -0
- package/dist/codemods/joi-to-zod/rules/joi-formats-to-zod-base.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-object-keys-unnest.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-object-keys-unnest.js +24 -0
- package/dist/codemods/joi-to-zod/rules/joi-object-keys-unnest.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-object-pattern-to-record.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-object-pattern-to-record.js +25 -0
- package/dist/codemods/joi-to-zod/rules/joi-object-pattern-to-record.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-object-relations-to-refine.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-object-relations-to-refine.js +90 -0
- package/dist/codemods/joi-to-zod/rules/joi-object-relations-to-refine.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-reference-to-zod.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-reference-to-zod.js +18 -0
- package/dist/codemods/joi-to-zod/rules/joi-reference-to-zod.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-import.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-import.js +17 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-import.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-options-from-regex.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-options-from-regex.js +27 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-options-from-regex.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-primitive-for-enum.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-primitive-for-enum.js +21 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-primitive-for-enum.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-required.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-required.js +18 -0
- package/dist/codemods/joi-to-zod/rules/joi-remove-required.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-validations-to-zod-validations.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-validations-to-zod-validations.js +92 -0
- package/dist/codemods/joi-to-zod/rules/joi-validations-to-zod-validations.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/joi-when-to-refine.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/joi-when-to-refine.js +182 -0
- package/dist/codemods/joi-to-zod/rules/joi-when-to-refine.js.map +1 -0
- package/dist/codemods/joi-to-zod/rules/zod-add-import.d.ts +3 -0
- package/dist/codemods/joi-to-zod/rules/zod-add-import.js +20 -0
- package/dist/codemods/joi-to-zod/rules/zod-add-import.js.map +1 -0
- package/dist/codemods/joi-to-zod/types.d.ts +1 -0
- package/dist/codemods/joi-to-zod/types.js +2 -0
- package/dist/codemods/joi-to-zod/types.js.map +1 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-identifier-name.d.ts +4 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-identifier-name.js +6 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-identifier-name.js.map +1 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-import.d.ts +5 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-import.js +8 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-import.js.map +1 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-primitive.d.ts +4 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-primitive.js +11 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-primitive.js.map +1 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-properties.d.ts +8 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-properties.js +64 -0
- package/dist/codemods/joi-to-zod/utils/get-joi-properties.js.map +1 -0
- package/dist/codemods/joi-to-zod/utils/has-joi-import.d.ts +4 -0
- package/dist/codemods/joi-to-zod/utils/has-joi-import.js +7 -0
- package/dist/codemods/joi-to-zod/utils/has-joi-import.js.map +1 -0
- package/dist/codemods/joi-to-zod/utils/has-zod-import.d.ts +4 -0
- package/dist/codemods/joi-to-zod/utils/has-zod-import.js +14 -0
- package/dist/codemods/joi-to-zod/utils/has-zod-import.js.map +1 -0
- package/dist/codemods/joi-to-zod/utils/object-path-accessor.d.ts +3 -0
- package/dist/codemods/joi-to-zod/utils/object-path-accessor.js +32 -0
- package/dist/codemods/joi-to-zod/utils/object-path-accessor.js.map +1 -0
- package/dist/codemods/joi-to-zod/utils/remove-joi-validation-edits.d.ts +8 -0
- package/dist/codemods/joi-to-zod/utils/remove-joi-validation-edits.js +6 -0
- package/dist/codemods/joi-to-zod/utils/remove-joi-validation-edits.js.map +1 -0
- package/dist/codemods/joi-to-zod/utils/replace-joi-validation-with-zod-edits.d.ts +9 -0
- package/dist/codemods/joi-to-zod/utils/replace-joi-validation-with-zod-edits.js +93 -0
- package/dist/codemods/joi-to-zod/utils/replace-joi-validation-with-zod-edits.js.map +1 -0
- package/dist/codemods/registry.d.ts +11 -0
- package/dist/codemods/registry.js +15 -0
- package/dist/codemods/registry.js.map +1 -0
- package/dist/codemods/utils/commit-edit-modifications-until-stable.d.ts +4 -0
- package/dist/codemods/utils/commit-edit-modifications-until-stable.js +9 -0
- package/dist/codemods/utils/commit-edit-modifications-until-stable.js.map +1 -0
- package/dist/codemods/utils/commit-edit-modifications.d.ts +4 -0
- package/dist/codemods/utils/commit-edit-modifications.js +16 -0
- package/dist/codemods/utils/commit-edit-modifications.js.map +1 -0
- package/dist/codemods/utils/extract-args-from-call-expression.d.ts +2 -0
- package/dist/codemods/utils/extract-args-from-call-expression.js +13 -0
- package/dist/codemods/utils/extract-args-from-call-expression.js.map +1 -0
- package/dist/codemods/utils/extract-name-from-call-expression.d.ts +2 -0
- package/dist/codemods/utils/extract-name-from-call-expression.js +10 -0
- package/dist/codemods/utils/extract-name-from-call-expression.js.map +1 -0
- package/dist/codemods/utils/innermost-nodes.d.ts +6 -0
- package/dist/codemods/utils/innermost-nodes.js +14 -0
- package/dist/codemods/utils/innermost-nodes.js.map +1 -0
- package/dist/codemods/utils/parse-call-chain.d.ts +13 -0
- package/dist/codemods/utils/parse-call-chain.js +67 -0
- package/dist/codemods/utils/parse-call-chain.js.map +1 -0
- package/dist/codemods/utils/scan-call-arguments.d.ts +8 -0
- package/dist/codemods/utils/scan-call-arguments.js +99 -0
- package/dist/codemods/utils/scan-call-arguments.js.map +1 -0
- package/dist/codemods/utils/split-arguments.d.ts +2 -0
- package/dist/codemods/utils/split-arguments.js +28 -0
- package/dist/codemods/utils/split-arguments.js.map +1 -0
- package/dist/codemods/utils/traverse-up.d.ts +4 -0
- package/dist/codemods/utils/traverse-up.js +11 -0
- package/dist/codemods/utils/traverse-up.js.map +1 -0
- package/dist/commands/list.d.ts +1 -0
- package/dist/commands/list.js +10 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.js +91 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/errors.d.ts +3 -0
- package/dist/errors.js +4 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/kit/collections.d.ts +3 -0
- package/dist/kit/collections.js +9 -0
- package/dist/kit/collections.js.map +1 -0
- package/dist/kit/config.d.ts +31 -0
- package/dist/kit/config.js +44 -0
- package/dist/kit/config.js.map +1 -0
- package/dist/kit/constants.d.ts +1 -0
- package/dist/kit/constants.js +13 -0
- package/dist/kit/constants.js.map +1 -0
- package/dist/kit/errors.d.ts +12 -0
- package/dist/kit/errors.js +13 -0
- package/dist/kit/errors.js.map +1 -0
- package/dist/kit/result.d.ts +4 -0
- package/dist/kit/result.js +18 -0
- package/dist/kit/result.js.map +1 -0
- package/dist/kit/runner.d.ts +13 -0
- package/dist/kit/runner.js +126 -0
- package/dist/kit/runner.js.map +1 -0
- package/dist/kit/types.d.ts +36 -0
- package/dist/kit/types.js +2 -0
- package/dist/kit/types.js.map +1 -0
- package/dist/utils/arrays.d.ts +2 -0
- package/dist/utils/arrays.js +25 -0
- package/dist/utils/arrays.js.map +1 -0
- package/dist/utils/asserts.d.ts +1 -0
- package/dist/utils/asserts.js +5 -0
- package/dist/utils/asserts.js.map +1 -0
- package/dist/utils/objects.d.ts +5 -0
- package/dist/utils/objects.js +4 -0
- package/dist/utils/objects.js.map +1 -0
- 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,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,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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/codemods/joi-to-zod/types.ts"],"names":[],"mappings":""}
|
|
@@ -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,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,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;
|