@kamaalio/codemods 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +0 -6
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.js +64 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/codemods/joi-to-zod/index.d.ts +10 -0
  6. package/dist/codemods/joi-to-zod/index.js +83 -0
  7. package/dist/codemods/joi-to-zod/index.js.map +1 -0
  8. package/dist/codemods/joi-to-zod/rules/joi-add-manual-migration-todo.d.ts +3 -0
  9. package/dist/codemods/joi-to-zod/rules/joi-add-manual-migration-todo.js +36 -0
  10. package/dist/codemods/joi-to-zod/rules/joi-add-manual-migration-todo.js.map +1 -0
  11. package/dist/codemods/joi-to-zod/rules/joi-add-optional.d.ts +3 -0
  12. package/dist/codemods/joi-to-zod/rules/joi-add-optional.js +19 -0
  13. package/dist/codemods/joi-to-zod/rules/joi-add-optional.js.map +1 -0
  14. package/dist/codemods/joi-to-zod/rules/joi-alternatives-to-union.d.ts +3 -0
  15. package/dist/codemods/joi-to-zod/rules/joi-alternatives-to-union.js +24 -0
  16. package/dist/codemods/joi-to-zod/rules/joi-alternatives-to-union.js.map +1 -0
  17. package/dist/codemods/joi-to-zod/rules/joi-array-items-unnest.d.ts +3 -0
  18. package/dist/codemods/joi-to-zod/rules/joi-array-items-unnest.js +28 -0
  19. package/dist/codemods/joi-to-zod/rules/joi-array-items-unnest.js.map +1 -0
  20. package/dist/codemods/joi-to-zod/rules/joi-assert-to-refine.d.ts +3 -0
  21. package/dist/codemods/joi-to-zod/rules/joi-assert-to-refine.js +68 -0
  22. package/dist/codemods/joi-to-zod/rules/joi-assert-to-refine.js.map +1 -0
  23. package/dist/codemods/joi-to-zod/rules/joi-binary-to-instanceof.d.ts +3 -0
  24. package/dist/codemods/joi-to-zod/rules/joi-binary-to-instanceof.js +12 -0
  25. package/dist/codemods/joi-to-zod/rules/joi-binary-to-instanceof.js.map +1 -0
  26. package/dist/codemods/joi-to-zod/rules/joi-check-to-enum.d.ts +3 -0
  27. package/dist/codemods/joi-to-zod/rules/joi-check-to-enum.js +57 -0
  28. package/dist/codemods/joi-to-zod/rules/joi-check-to-enum.js.map +1 -0
  29. package/dist/codemods/joi-to-zod/rules/joi-concat-to-intersection.d.ts +3 -0
  30. package/dist/codemods/joi-to-zod/rules/joi-concat-to-intersection.js +24 -0
  31. package/dist/codemods/joi-to-zod/rules/joi-concat-to-intersection.js.map +1 -0
  32. package/dist/codemods/joi-to-zod/rules/joi-custom-to-transform.d.ts +3 -0
  33. package/dist/codemods/joi-to-zod/rules/joi-custom-to-transform.js +95 -0
  34. package/dist/codemods/joi-to-zod/rules/joi-custom-to-transform.js.map +1 -0
  35. package/dist/codemods/joi-to-zod/rules/joi-date-to-coerce-date.d.ts +3 -0
  36. package/dist/codemods/joi-to-zod/rules/joi-date-to-coerce-date.js +55 -0
  37. package/dist/codemods/joi-to-zod/rules/joi-date-to-coerce-date.js.map +1 -0
  38. package/dist/codemods/joi-to-zod/rules/joi-forbidden-to-never.d.ts +3 -0
  39. package/dist/codemods/joi-to-zod/rules/joi-forbidden-to-never.js +13 -0
  40. package/dist/codemods/joi-to-zod/rules/joi-forbidden-to-never.js.map +1 -0
  41. package/dist/codemods/joi-to-zod/rules/joi-formats-to-zod-base.d.ts +3 -0
  42. package/dist/codemods/joi-to-zod/rules/joi-formats-to-zod-base.js +64 -0
  43. package/dist/codemods/joi-to-zod/rules/joi-formats-to-zod-base.js.map +1 -0
  44. package/dist/codemods/joi-to-zod/rules/joi-object-keys-unnest.d.ts +3 -0
  45. package/dist/codemods/joi-to-zod/rules/joi-object-keys-unnest.js +24 -0
  46. package/dist/codemods/joi-to-zod/rules/joi-object-keys-unnest.js.map +1 -0
  47. package/dist/codemods/joi-to-zod/rules/joi-object-pattern-to-record.d.ts +3 -0
  48. package/dist/codemods/joi-to-zod/rules/joi-object-pattern-to-record.js +25 -0
  49. package/dist/codemods/joi-to-zod/rules/joi-object-pattern-to-record.js.map +1 -0
  50. package/dist/codemods/joi-to-zod/rules/joi-object-relations-to-refine.d.ts +3 -0
  51. package/dist/codemods/joi-to-zod/rules/joi-object-relations-to-refine.js +90 -0
  52. package/dist/codemods/joi-to-zod/rules/joi-object-relations-to-refine.js.map +1 -0
  53. package/dist/codemods/joi-to-zod/rules/joi-reference-to-zod.d.ts +3 -0
  54. package/dist/codemods/joi-to-zod/rules/joi-reference-to-zod.js +18 -0
  55. package/dist/codemods/joi-to-zod/rules/joi-reference-to-zod.js.map +1 -0
  56. package/dist/codemods/joi-to-zod/rules/joi-remove-import.d.ts +3 -0
  57. package/dist/codemods/joi-to-zod/rules/joi-remove-import.js +17 -0
  58. package/dist/codemods/joi-to-zod/rules/joi-remove-import.js.map +1 -0
  59. package/dist/codemods/joi-to-zod/rules/joi-remove-options-from-regex.d.ts +3 -0
  60. package/dist/codemods/joi-to-zod/rules/joi-remove-options-from-regex.js +27 -0
  61. package/dist/codemods/joi-to-zod/rules/joi-remove-options-from-regex.js.map +1 -0
  62. package/dist/codemods/joi-to-zod/rules/joi-remove-primitive-for-enum.d.ts +3 -0
  63. package/dist/codemods/joi-to-zod/rules/joi-remove-primitive-for-enum.js +21 -0
  64. package/dist/codemods/joi-to-zod/rules/joi-remove-primitive-for-enum.js.map +1 -0
  65. package/dist/codemods/joi-to-zod/rules/joi-remove-required.d.ts +3 -0
  66. package/dist/codemods/joi-to-zod/rules/joi-remove-required.js +18 -0
  67. package/dist/codemods/joi-to-zod/rules/joi-remove-required.js.map +1 -0
  68. package/dist/codemods/joi-to-zod/rules/joi-validations-to-zod-validations.d.ts +3 -0
  69. package/dist/codemods/joi-to-zod/rules/joi-validations-to-zod-validations.js +92 -0
  70. package/dist/codemods/joi-to-zod/rules/joi-validations-to-zod-validations.js.map +1 -0
  71. package/dist/codemods/joi-to-zod/rules/joi-when-to-refine.d.ts +3 -0
  72. package/dist/codemods/joi-to-zod/rules/joi-when-to-refine.js +182 -0
  73. package/dist/codemods/joi-to-zod/rules/joi-when-to-refine.js.map +1 -0
  74. package/dist/codemods/joi-to-zod/rules/zod-add-import.d.ts +3 -0
  75. package/dist/codemods/joi-to-zod/rules/zod-add-import.js +20 -0
  76. package/dist/codemods/joi-to-zod/rules/zod-add-import.js.map +1 -0
  77. package/dist/codemods/joi-to-zod/types.d.ts +1 -0
  78. package/dist/codemods/joi-to-zod/types.js +2 -0
  79. package/dist/codemods/joi-to-zod/types.js.map +1 -0
  80. package/dist/codemods/joi-to-zod/utils/get-joi-identifier-name.d.ts +4 -0
  81. package/dist/codemods/joi-to-zod/utils/get-joi-identifier-name.js +6 -0
  82. package/dist/codemods/joi-to-zod/utils/get-joi-identifier-name.js.map +1 -0
  83. package/dist/codemods/joi-to-zod/utils/get-joi-import.d.ts +5 -0
  84. package/dist/codemods/joi-to-zod/utils/get-joi-import.js +8 -0
  85. package/dist/codemods/joi-to-zod/utils/get-joi-import.js.map +1 -0
  86. package/dist/codemods/joi-to-zod/utils/get-joi-primitive.d.ts +4 -0
  87. package/dist/codemods/joi-to-zod/utils/get-joi-primitive.js +11 -0
  88. package/dist/codemods/joi-to-zod/utils/get-joi-primitive.js.map +1 -0
  89. package/dist/codemods/joi-to-zod/utils/get-joi-properties.d.ts +8 -0
  90. package/dist/codemods/joi-to-zod/utils/get-joi-properties.js +64 -0
  91. package/dist/codemods/joi-to-zod/utils/get-joi-properties.js.map +1 -0
  92. package/dist/codemods/joi-to-zod/utils/has-joi-import.d.ts +4 -0
  93. package/dist/codemods/joi-to-zod/utils/has-joi-import.js +7 -0
  94. package/dist/codemods/joi-to-zod/utils/has-joi-import.js.map +1 -0
  95. package/dist/codemods/joi-to-zod/utils/has-zod-import.d.ts +4 -0
  96. package/dist/codemods/joi-to-zod/utils/has-zod-import.js +14 -0
  97. package/dist/codemods/joi-to-zod/utils/has-zod-import.js.map +1 -0
  98. package/dist/codemods/joi-to-zod/utils/object-path-accessor.d.ts +3 -0
  99. package/dist/codemods/joi-to-zod/utils/object-path-accessor.js +32 -0
  100. package/dist/codemods/joi-to-zod/utils/object-path-accessor.js.map +1 -0
  101. package/dist/codemods/joi-to-zod/utils/remove-joi-validation-edits.d.ts +8 -0
  102. package/dist/codemods/joi-to-zod/utils/remove-joi-validation-edits.js +6 -0
  103. package/dist/codemods/joi-to-zod/utils/remove-joi-validation-edits.js.map +1 -0
  104. package/dist/codemods/joi-to-zod/utils/replace-joi-validation-with-zod-edits.d.ts +9 -0
  105. package/dist/codemods/joi-to-zod/utils/replace-joi-validation-with-zod-edits.js +93 -0
  106. package/dist/codemods/joi-to-zod/utils/replace-joi-validation-with-zod-edits.js.map +1 -0
  107. package/dist/codemods/registry.d.ts +11 -0
  108. package/dist/codemods/registry.js +15 -0
  109. package/dist/codemods/registry.js.map +1 -0
  110. package/dist/codemods/utils/commit-edit-modifications-until-stable.d.ts +4 -0
  111. package/dist/codemods/utils/commit-edit-modifications-until-stable.js +9 -0
  112. package/dist/codemods/utils/commit-edit-modifications-until-stable.js.map +1 -0
  113. package/dist/codemods/utils/commit-edit-modifications.d.ts +4 -0
  114. package/dist/codemods/utils/commit-edit-modifications.js +16 -0
  115. package/dist/codemods/utils/commit-edit-modifications.js.map +1 -0
  116. package/dist/codemods/utils/extract-args-from-call-expression.d.ts +2 -0
  117. package/dist/codemods/utils/extract-args-from-call-expression.js +13 -0
  118. package/dist/codemods/utils/extract-args-from-call-expression.js.map +1 -0
  119. package/dist/codemods/utils/extract-name-from-call-expression.d.ts +2 -0
  120. package/dist/codemods/utils/extract-name-from-call-expression.js +10 -0
  121. package/dist/codemods/utils/extract-name-from-call-expression.js.map +1 -0
  122. package/dist/codemods/utils/innermost-nodes.d.ts +6 -0
  123. package/dist/codemods/utils/innermost-nodes.js +14 -0
  124. package/dist/codemods/utils/innermost-nodes.js.map +1 -0
  125. package/dist/codemods/utils/parse-call-chain.d.ts +13 -0
  126. package/dist/codemods/utils/parse-call-chain.js +67 -0
  127. package/dist/codemods/utils/parse-call-chain.js.map +1 -0
  128. package/dist/codemods/utils/scan-call-arguments.d.ts +8 -0
  129. package/dist/codemods/utils/scan-call-arguments.js +99 -0
  130. package/dist/codemods/utils/scan-call-arguments.js.map +1 -0
  131. package/dist/codemods/utils/split-arguments.d.ts +2 -0
  132. package/dist/codemods/utils/split-arguments.js +28 -0
  133. package/dist/codemods/utils/split-arguments.js.map +1 -0
  134. package/dist/codemods/utils/traverse-up.d.ts +4 -0
  135. package/dist/codemods/utils/traverse-up.js +11 -0
  136. package/dist/codemods/utils/traverse-up.js.map +1 -0
  137. package/dist/commands/list.d.ts +1 -0
  138. package/dist/commands/list.js +10 -0
  139. package/dist/commands/list.js.map +1 -0
  140. package/dist/commands/run.d.ts +3 -0
  141. package/dist/commands/run.js +91 -0
  142. package/dist/commands/run.js.map +1 -0
  143. package/dist/errors.d.ts +3 -0
  144. package/dist/errors.js +4 -0
  145. package/dist/errors.js.map +1 -0
  146. package/dist/index.d.ts +2 -0
  147. package/dist/index.js +3 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/kit/collections.d.ts +3 -0
  150. package/dist/kit/collections.js +9 -0
  151. package/dist/kit/collections.js.map +1 -0
  152. package/dist/kit/config.d.ts +31 -0
  153. package/dist/kit/config.js +44 -0
  154. package/dist/kit/config.js.map +1 -0
  155. package/dist/kit/constants.d.ts +1 -0
  156. package/dist/kit/constants.js +13 -0
  157. package/dist/kit/constants.js.map +1 -0
  158. package/dist/kit/errors.d.ts +12 -0
  159. package/dist/kit/errors.js +13 -0
  160. package/dist/kit/errors.js.map +1 -0
  161. package/dist/kit/result.d.ts +4 -0
  162. package/dist/kit/result.js +18 -0
  163. package/dist/kit/result.js.map +1 -0
  164. package/dist/kit/runner.d.ts +13 -0
  165. package/dist/kit/runner.js +126 -0
  166. package/dist/kit/runner.js.map +1 -0
  167. package/dist/kit/types.d.ts +36 -0
  168. package/dist/kit/types.js +2 -0
  169. package/dist/kit/types.js.map +1 -0
  170. package/dist/utils/arrays.d.ts +2 -0
  171. package/dist/utils/arrays.js +25 -0
  172. package/dist/utils/arrays.js.map +1 -0
  173. package/dist/utils/asserts.d.ts +1 -0
  174. package/dist/utils/asserts.js +5 -0
  175. package/dist/utils/asserts.js.map +1 -0
  176. package/dist/utils/objects.d.ts +5 -0
  177. package/dist/utils/objects.js +4 -0
  178. package/dist/utils/objects.js.map +1 -0
  179. package/package.json +1 -1
@@ -0,0 +1,93 @@
1
+ import { compactMap } from '../../../utils/arrays.js';
2
+ import extractArgsFromCallExpression from '../../utils/extract-args-from-call-expression.js';
3
+ import extractNameFromCallExpression from '../../utils/extract-name-from-call-expression.js';
4
+ import scanCallArguments from '../../utils/scan-call-arguments.js';
5
+ import splitArguments from '../../utils/split-arguments.js';
6
+ import getJoiIdentifierName from './get-joi-identifier-name.js';
7
+ import getJoiProperties from './get-joi-properties.js';
8
+ function substituteMetaArguments(zodValidation, metaSpecification, foundArguments) {
9
+ const metaTokens = splitArguments(metaSpecification)
10
+ .map(token => token.trim())
11
+ .filter(token => token.startsWith('$'));
12
+ if (metaTokens.length === 0)
13
+ return zodValidation;
14
+ const [singleToken] = metaTokens;
15
+ const isSingleWholeToken = singleToken != null && metaTokens.length === 1 && metaSpecification.trim() === singleToken;
16
+ if (isSingleWholeToken)
17
+ return zodValidation.replaceAll(singleToken, foundArguments);
18
+ const foundArgumentsComponents = splitArguments(foundArguments).map(argument => argument.trim());
19
+ return metaTokens.reduce((accumulator, token, index) => {
20
+ const foundArgument = foundArgumentsComponents[index];
21
+ if (foundArgument == null)
22
+ return accumulator;
23
+ return accumulator.replaceAll(token, foundArgument);
24
+ }, zodValidation);
25
+ }
26
+ function normalizeArguments(args) {
27
+ return splitArguments(args)
28
+ .map(argument => argument.trim())
29
+ .join(',');
30
+ }
31
+ function rewriteChain(chainText, params) {
32
+ const expectedArgs = normalizeArguments(params.validationArgs);
33
+ let result = chainText;
34
+ let searchIndex = 0;
35
+ while (searchIndex < result.length) {
36
+ const match = scanCallArguments(result, params.validationName, searchIndex);
37
+ if (match == null)
38
+ break;
39
+ if (!params.validationArgsIsMeta && normalizeArguments(match.args) !== expectedArgs) {
40
+ searchIndex = match.startIndex + 1;
41
+ continue;
42
+ }
43
+ const isBaseCall = result.slice(0, match.startIndex).endsWith(params.joiIdentifierName);
44
+ if (isBaseCall && params.zodValidation == null) {
45
+ searchIndex = match.endIndex;
46
+ continue;
47
+ }
48
+ const replacement = params.zodValidation == null
49
+ ? ''
50
+ : `.${params.validationArgsIsMeta
51
+ ? substituteMetaArguments(params.zodValidation, params.validationArgs, match.args)
52
+ : params.zodValidation}`;
53
+ result = result.slice(0, match.startIndex) + replacement + result.slice(match.endIndex);
54
+ searchIndex = match.startIndex + replacement.length;
55
+ }
56
+ if (result === chainText)
57
+ return chainText;
58
+ return result
59
+ .split('\n')
60
+ .filter(value => value.trim().length > 0)
61
+ .join('\n')
62
+ .trim();
63
+ }
64
+ function replaceJoiValidationWithZodEdits(root, params) {
65
+ const joiImportIdentifierName = getJoiIdentifierName(root);
66
+ if (joiImportIdentifierName == null)
67
+ return [];
68
+ const validationTargetKeyName = extractNameFromCallExpression(params.validationTargetKey);
69
+ if (validationTargetKeyName == null)
70
+ return [];
71
+ const validationTargetKeyArgs = extractArgsFromCallExpression(params.validationTargetKey);
72
+ if (validationTargetKeyArgs == null)
73
+ return [];
74
+ const joiProperties = getJoiProperties(root, {
75
+ primitive: params.primitive,
76
+ validationName: params.validationTargetKey,
77
+ });
78
+ return compactMap(joiProperties, callExpression => {
79
+ const callExpressionText = callExpression.text();
80
+ const replacement = rewriteChain(callExpressionText, {
81
+ validationName: validationTargetKeyName,
82
+ validationArgs: validationTargetKeyArgs,
83
+ validationArgsIsMeta: validationTargetKeyArgs.includes('$'),
84
+ zodValidation: params.zodValidation,
85
+ joiIdentifierName: joiImportIdentifierName,
86
+ });
87
+ if (replacement === callExpressionText)
88
+ return undefined;
89
+ return callExpression.replace(replacement);
90
+ });
91
+ }
92
+ export default replaceJoiValidationWithZodEdits;
93
+ //# sourceMappingURL=replace-joi-validation-with-zod-edits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-joi-validation-with-zod-edits.js","sourceRoot":"","sources":["../../../../src/codemods/joi-to-zod/utils/replace-joi-validation-with-zod-edits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Codemod } from '../kit/types.ts';
2
+ /** Every codemod the CLI can run. Adding a codemod means adding an entry here. */
3
+ export declare const CODEMOD_REGISTRY: {
4
+ readonly 'joi-to-zod': {
5
+ readonly codemod: Codemod;
6
+ readonly summary: 'Rewrite supported Joi schema patterns into Zod equivalents';
7
+ };
8
+ };
9
+ export type CodemodName = keyof typeof CODEMOD_REGISTRY;
10
+ export declare function isCodemodName(value: string): value is CodemodName;
11
+ export declare function codemodNames(): Array<CodemodName>;
@@ -0,0 +1,15 @@
1
+ import { JOI_TO_ZOD_CODEMOD } from './joi-to-zod/index.js';
2
+ /** Every codemod the CLI can run. Adding a codemod means adding an entry here. */
3
+ export const CODEMOD_REGISTRY = {
4
+ 'joi-to-zod': {
5
+ codemod: JOI_TO_ZOD_CODEMOD,
6
+ summary: 'Rewrite supported Joi schema patterns into Zod equivalents',
7
+ },
8
+ };
9
+ export function isCodemodName(value) {
10
+ return Object.hasOwn(CODEMOD_REGISTRY, value);
11
+ }
12
+ export function codemodNames() {
13
+ return Object.keys(CODEMOD_REGISTRY);
14
+ }
15
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/codemods/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAI3D,kFAAkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,YAAY,EAAE;QACZ,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE,4DAA4D;KACtE;CAC8C,CAAC;AAIlD,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAuB,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type Edit } from '@ast-grep/napi';
2
+ import type { Modifications } from '../../kit/types.ts';
3
+ declare function commitEditModificationsUntilStable(modifications: Modifications, buildEdits: (modifications: Modifications) => Array<Edit>): Promise<Modifications>;
4
+ export default commitEditModificationsUntilStable;
@@ -0,0 +1,9 @@
1
+ import commitEditModifications from './commit-edit-modifications.js';
2
+ async function commitEditModificationsUntilStable(modifications, buildEdits) {
3
+ const committed = await commitEditModifications(buildEdits(modifications), modifications);
4
+ if (committed.ast.root().text() === modifications.ast.root().text())
5
+ return modifications;
6
+ return commitEditModificationsUntilStable(committed, buildEdits);
7
+ }
8
+ export default commitEditModificationsUntilStable;
9
+ //# sourceMappingURL=commit-edit-modifications-until-stable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-edit-modifications-until-stable.js","sourceRoot":"","sources":["../../../src/codemods/utils/commit-edit-modifications-until-stable.ts"],"names":[],"mappings":"AAGA,OAAO,uBAAuB,MAAM,gCAAgC,CAAC;AAErE,KAAK,UAAU,kCAAkC,CAC/C,aAA4B,EAC5B,UAAyD;IAEzD,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC;IAC1F,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,aAAa,CAAC;IAE1F,OAAO,kCAAkC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACnE,CAAC;AAED,eAAe,kCAAkC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type Edit } from '@ast-grep/napi';
2
+ import type { Modifications } from '../../kit/types.ts';
3
+ declare function commitEditModifications(edits: Array<Edit>, modifications: Modifications): Promise<Modifications>;
4
+ export default commitEditModifications;
@@ -0,0 +1,16 @@
1
+ import { parseAsync } from '@ast-grep/napi';
2
+ async function commitEditModifications(edits, modifications) {
3
+ if (edits.length === 0)
4
+ return modifications;
5
+ const root = modifications.ast.root();
6
+ const committed = root.commitEdits(edits);
7
+ const modifiedAST = await parseAsync(modifications.lang, committed);
8
+ return {
9
+ ...modifications,
10
+ ast: modifiedAST,
11
+ report: { changesApplied: modifications.report.changesApplied + edits.length },
12
+ history: modifications.history.concat([modifiedAST]),
13
+ };
14
+ }
15
+ export default commitEditModifications;
16
+ //# sourceMappingURL=commit-edit-modifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-edit-modifications.js","sourceRoot":"","sources":["../../../src/codemods/utils/commit-edit-modifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAIvD,KAAK,UAAU,uBAAuB,CAAC,KAAkB,EAAE,aAA4B;IACrF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IAE7C,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEpE,OAAO;QACL,GAAG,aAAa;QAChB,GAAG,EAAE,WAAW;QAChB,MAAM,EAAE,EAAE,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,EAAE;QAC9E,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare function extractArgsFromCallExpression(callExpression: string | undefined): string | undefined;
2
+ export default extractArgsFromCallExpression;
@@ -0,0 +1,13 @@
1
+ function extractArgsFromCallExpression(callExpression) {
2
+ if (callExpression == null)
3
+ return undefined;
4
+ const trimmed = callExpression.trim();
5
+ const isCallExpression = trimmed.includes('(');
6
+ if (!isCallExpression)
7
+ return undefined;
8
+ if (trimmed.length === 2)
9
+ return undefined;
10
+ return trimmed.split('(').slice(1).join('(').slice(undefined, -1);
11
+ }
12
+ export default extractArgsFromCallExpression;
13
+ //# sourceMappingURL=extract-args-from-call-expression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-args-from-call-expression.js","sourceRoot":"","sources":["../../../src/codemods/utils/extract-args-from-call-expression.ts"],"names":[],"mappings":"AAAA,SAAS,6BAA6B,CAAC,cAAkC;IACvE,IAAI,cAAc,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAE7C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3C,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,eAAe,6BAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare function extractNameFromCallExpression(callExpression: string | undefined): string | undefined;
2
+ export default extractNameFromCallExpression;
@@ -0,0 +1,10 @@
1
+ function extractNameFromCallExpression(callExpression) {
2
+ if (callExpression == null)
3
+ return undefined;
4
+ const isCallExpression = callExpression.includes('(');
5
+ if (!isCallExpression)
6
+ return callExpression;
7
+ return callExpression.split('(')[0];
8
+ }
9
+ export default extractNameFromCallExpression;
10
+ //# sourceMappingURL=extract-name-from-call-expression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-name-from-call-expression.js","sourceRoot":"","sources":["../../../src/codemods/utils/extract-name-from-call-expression.ts"],"names":[],"mappings":"AAAA,SAAS,6BAA6B,CAAC,cAAkC;IACvE,IAAI,cAAc,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAE7C,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,gBAAgB;QAAE,OAAO,cAAc,CAAC;IAE7C,OAAO,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,eAAe,6BAA6B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SgNode } from '@ast-grep/napi';
2
+ import type { Kinds, TypesMap } from '@ast-grep/napi/types/staticTypes.js';
3
+ type AnyNode = SgNode<TypesMap, Kinds<TypesMap>>;
4
+ export declare function innermostBy<Item>(items: Array<Item>, toNode: (item: Item) => AnyNode): Array<Item>;
5
+ declare function innermostNodes(nodes: Array<AnyNode>): Array<AnyNode>;
6
+ export default innermostNodes;
@@ -0,0 +1,14 @@
1
+ function contains(outer, inner) {
2
+ const outerRange = outer.range();
3
+ const innerRange = inner.range();
4
+ const isSameRange = outerRange.start.index === innerRange.start.index && outerRange.end.index === innerRange.end.index;
5
+ return (!isSameRange && outerRange.start.index <= innerRange.start.index && outerRange.end.index >= innerRange.end.index);
6
+ }
7
+ export function innermostBy(items, toNode) {
8
+ return items.filter(candidate => !items.some(other => contains(toNode(candidate), toNode(other))));
9
+ }
10
+ function innermostNodes(nodes) {
11
+ return innermostBy(nodes, node => node);
12
+ }
13
+ export default innermostNodes;
14
+ //# sourceMappingURL=innermost-nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"innermost-nodes.js","sourceRoot":"","sources":["../../../src/codemods/utils/innermost-nodes.ts"],"names":[],"mappings":"AAKA,SAAS,QAAQ,CAAC,KAAc,EAAE,KAAc;IAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IACjC,MAAM,WAAW,GACf,UAAU,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,KAAK,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAErG,OAAO,CACL,CAAC,WAAW,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CACjH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAO,KAAkB,EAAE,MAA+B;IACnF,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrG,CAAC;AAED,SAAS,cAAc,CAAC,KAAqB;IAC3C,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,13 @@
1
+ export type ChainSegment = {
2
+ name: string;
3
+ args: string;
4
+ startIndex: number;
5
+ endIndex: number;
6
+ };
7
+ type IdentifierCallChain = {
8
+ rootStartIndex: number;
9
+ segments: Array<ChainSegment>;
10
+ };
11
+ declare function parseCallChain(text: string, rootEndIndex: number): Array<ChainSegment>;
12
+ export declare function findIdentifierCallChains(text: string, identifierName: string): Iterable<IdentifierCallChain>;
13
+ export default parseCallChain;
@@ -0,0 +1,67 @@
1
+ import { skipLiteralAt } from './scan-call-arguments.js';
2
+ const IDENTIFIER_PATTERN = /[$\w]/;
3
+ function findClosingParenthesis(text, openingIndex) {
4
+ let depth = 0;
5
+ for (let index = openingIndex; index < text.length; index += 1) {
6
+ const skipped = skipLiteralAt(text, index);
7
+ if (skipped !== index) {
8
+ index = skipped - 1;
9
+ continue;
10
+ }
11
+ const character = text[index];
12
+ if (character === '(' || character === '[' || character === '{')
13
+ depth += 1;
14
+ if (character === ')' || character === ']' || character === '}') {
15
+ depth -= 1;
16
+ if (depth === 0)
17
+ return character === ')' ? index : undefined;
18
+ }
19
+ }
20
+ return undefined;
21
+ }
22
+ function parseCallChain(text, rootEndIndex) {
23
+ const segments = [];
24
+ let cursor = rootEndIndex;
25
+ while (cursor < text.length) {
26
+ let dotIndex = cursor;
27
+ while (dotIndex < text.length && /\s/.test(text[dotIndex] ?? ''))
28
+ dotIndex += 1;
29
+ if (text[dotIndex] !== '.')
30
+ break;
31
+ let nameEnd = dotIndex + 1;
32
+ while (nameEnd < text.length && IDENTIFIER_PATTERN.test(text[nameEnd] ?? ''))
33
+ nameEnd += 1;
34
+ if (nameEnd === dotIndex + 1)
35
+ break;
36
+ let parenthesisIndex = nameEnd;
37
+ while (parenthesisIndex < text.length && /\s/.test(text[parenthesisIndex] ?? ''))
38
+ parenthesisIndex += 1;
39
+ if (text[parenthesisIndex] !== '(')
40
+ break;
41
+ const closingIndex = findClosingParenthesis(text, parenthesisIndex);
42
+ if (closingIndex == null)
43
+ break;
44
+ segments.push({
45
+ name: text.slice(dotIndex + 1, nameEnd),
46
+ args: text.slice(parenthesisIndex + 1, closingIndex),
47
+ startIndex: dotIndex,
48
+ endIndex: closingIndex + 1,
49
+ });
50
+ cursor = closingIndex + 1;
51
+ }
52
+ return segments;
53
+ }
54
+ export function* findIdentifierCallChains(text, identifierName) {
55
+ for (let rootStartIndex = 0; rootStartIndex < text.length; rootStartIndex += 1) {
56
+ if (!text.startsWith(identifierName, rootStartIndex))
57
+ continue;
58
+ if (rootStartIndex > 0 && /[$\w.]/.test(text[rootStartIndex - 1] ?? ''))
59
+ continue;
60
+ yield {
61
+ rootStartIndex,
62
+ segments: parseCallChain(text, rootStartIndex + identifierName.length),
63
+ };
64
+ }
65
+ }
66
+ export default parseCallChain;
67
+ //# sourceMappingURL=parse-call-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-call-chain.js","sourceRoot":"","sources":["../../../src/codemods/utils/parse-call-chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ type CallArgumentsMatch = {
2
+ startIndex: number;
3
+ endIndex: number;
4
+ args: string;
5
+ };
6
+ export declare function skipLiteralAt(text: string, index: number): number;
7
+ declare function scanCallArguments(text: string, name: string, fromIndex?: number): CallArgumentsMatch | undefined;
8
+ export default scanCallArguments;
@@ -0,0 +1,99 @@
1
+ const IDENTIFIER_PATTERN = /[$\w]/;
2
+ const REGEX_ALLOWED_PRECEDING_PATTERN = /[(,=:[!&|?{};+\-*/%<>~^]/;
3
+ function isIdentifierCharacter(character) {
4
+ return character != null && IDENTIFIER_PATTERN.test(character);
5
+ }
6
+ function startsRegexLiteral(text, index) {
7
+ for (let cursor = index - 1; cursor >= 0; cursor -= 1) {
8
+ const character = text[cursor];
9
+ if (character == null || /\s/.test(character))
10
+ continue;
11
+ return REGEX_ALLOWED_PRECEDING_PATTERN.test(character);
12
+ }
13
+ return true;
14
+ }
15
+ export function skipLiteralAt(text, index) {
16
+ const character = text[index];
17
+ if (character == null)
18
+ return index;
19
+ const isQuote = character === "'" || character === '"' || character === '`';
20
+ const isRegex = character === '/' && startsRegexLiteral(text, index);
21
+ if (!isQuote && !isRegex)
22
+ return index;
23
+ const terminator = isRegex ? '/' : character;
24
+ for (let cursor = index + 1; cursor < text.length; cursor += 1) {
25
+ const current = text[cursor];
26
+ if (current === '\\') {
27
+ cursor += 1;
28
+ continue;
29
+ }
30
+ if (isRegex && current === '[') {
31
+ cursor = skipRegexCharacterClass(text, cursor);
32
+ continue;
33
+ }
34
+ if (current === terminator)
35
+ return cursor + 1;
36
+ }
37
+ return text.length;
38
+ }
39
+ function skipRegexCharacterClass(text, index) {
40
+ for (let cursor = index + 1; cursor < text.length; cursor += 1) {
41
+ const current = text[cursor];
42
+ if (current === '\\') {
43
+ cursor += 1;
44
+ continue;
45
+ }
46
+ if (current === ']')
47
+ return cursor;
48
+ }
49
+ return text.length;
50
+ }
51
+ function scanCallArguments(text, name, fromIndex = 0) {
52
+ const target = `.${name}`;
53
+ for (let index = fromIndex; index < text.length; index += 1) {
54
+ const skipped = skipLiteralAt(text, index);
55
+ if (skipped !== index) {
56
+ index = skipped - 1;
57
+ continue;
58
+ }
59
+ if (!text.startsWith(target, index))
60
+ continue;
61
+ if (isIdentifierCharacter(text[index + target.length]))
62
+ continue;
63
+ let parenthesisIndex = index + target.length;
64
+ while (parenthesisIndex < text.length && /\s/.test(text[parenthesisIndex] ?? ''))
65
+ parenthesisIndex += 1;
66
+ if (text[parenthesisIndex] !== '(')
67
+ continue;
68
+ const closingIndex = findClosingParenthesis(text, parenthesisIndex);
69
+ if (closingIndex == null)
70
+ continue;
71
+ return {
72
+ startIndex: index,
73
+ endIndex: closingIndex + 1,
74
+ args: text.slice(parenthesisIndex + 1, closingIndex),
75
+ };
76
+ }
77
+ return undefined;
78
+ }
79
+ function findClosingParenthesis(text, openingIndex) {
80
+ let depth = 0;
81
+ for (let index = openingIndex; index < text.length; index += 1) {
82
+ const skipped = skipLiteralAt(text, index);
83
+ if (skipped !== index) {
84
+ index = skipped - 1;
85
+ continue;
86
+ }
87
+ const character = text[index];
88
+ if (character === '(' || character === '[' || character === '{')
89
+ depth += 1;
90
+ if (character === ')' || character === ']' || character === '}') {
91
+ depth -= 1;
92
+ if (depth === 0)
93
+ return character === ')' ? index : undefined;
94
+ }
95
+ }
96
+ return undefined;
97
+ }
98
+ export default scanCallArguments;
99
+ //# sourceMappingURL=scan-call-arguments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-call-arguments.js","sourceRoot":"","sources":["../../../src/codemods/utils/scan-call-arguments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ declare function splitArguments(args: string): Array<string>;
2
+ export default splitArguments;
@@ -0,0 +1,28 @@
1
+ import { skipLiteralAt } from './scan-call-arguments.js';
2
+ function splitArguments(args) {
3
+ if (args.trim().length === 0)
4
+ return [];
5
+ const results = [];
6
+ let depth = 0;
7
+ let start = 0;
8
+ for (let index = 0; index < args.length; index += 1) {
9
+ const skipped = skipLiteralAt(args, index);
10
+ if (skipped !== index) {
11
+ index = skipped - 1;
12
+ continue;
13
+ }
14
+ const character = args[index];
15
+ if (character === '(' || character === '[' || character === '{')
16
+ depth += 1;
17
+ if (character === ')' || character === ']' || character === '}')
18
+ depth -= 1;
19
+ if (character === ',' && depth === 0) {
20
+ results.push(args.slice(start, index));
21
+ start = index + 1;
22
+ }
23
+ }
24
+ results.push(args.slice(start));
25
+ return results;
26
+ }
27
+ export default splitArguments;
28
+ //# sourceMappingURL=split-arguments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-arguments.js","sourceRoot":"","sources":["../../../src/codemods/utils/split-arguments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YACtB,KAAK,GAAG,OAAO,GAAG,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;QAC5E,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;QAC5E,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACvC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAEhC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,eAAe,cAAc,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 traverseUp(node: SgNode<TypesMap, Kinds<TypesMap>>, until: (node: SgNode<TypesMap, Kinds<TypesMap>>) => boolean): SgNode<TypesMap, Kinds<TypesMap>> | undefined;
4
+ export default traverseUp;
@@ -0,0 +1,11 @@
1
+ function traverseUp(node, until) {
2
+ let current = node.parent() ?? undefined;
3
+ while (current != null) {
4
+ if (until(current))
5
+ return current;
6
+ current = current.parent() ?? undefined;
7
+ }
8
+ return undefined;
9
+ }
10
+ export default traverseUp;
11
+ //# sourceMappingURL=traverse-up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverse-up.js","sourceRoot":"","sources":["../../../src/codemods/utils/traverse-up.ts"],"names":[],"mappings":"AAGA,SAAS,UAAU,CACjB,IAAuC,EACvC,KAA2D;IAE3D,IAAI,OAAO,GAAkD,IAAI,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC;IAExF,OAAO,OAAO,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC;QAEnC,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC;IAC1C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function listCommand(): void;
@@ -0,0 +1,10 @@
1
+ import { CODEMOD_REGISTRY, codemodNames } from '../codemods/registry.js';
2
+ export function listCommand() {
3
+ const names = codemodNames();
4
+ const longestName = Math.max(...names.map(name => name.length));
5
+ console.log('CODEMODS');
6
+ for (const name of names) {
7
+ console.log(` ${name.padEnd(longestName)} ${CODEMOD_REGISTRY[name].summary}`);
8
+ }
9
+ }
10
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEzE,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type CodemodName } from '../codemods/registry.ts';
2
+ export declare function makeRunHelpText(name: CodemodName): string;
3
+ export declare function runCodemodCommand(name: CodemodName, argv: Array<string>): Promise<void>;