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