@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,91 @@
1
+ import { parseArgs } from 'node:util';
2
+ import { CODEMOD_REGISTRY } from '../codemods/registry.js';
3
+ import { CliUsageError } from '../errors.js';
4
+ import { loadCodemodConfig } from '../kit/config.js';
5
+ import { runCodemod } from '../kit/runner.js';
6
+ const DEFAULT_DRY_RUN_OPTION = false;
7
+ const DEFAULT_NO_LOG_OPTION = false;
8
+ const DEFAULT_PATH_ARG = '.';
9
+ /** Mirrors oclif's `charAliases`: accept the uppercase short flag as an alias for the lowercase one. */
10
+ const UPPERCASE_SHORT_FLAG_ALIASES = { '-C': '-c', '-D': '-d', '-N': '-n' };
11
+ export function makeRunHelpText(name) {
12
+ return `${CODEMOD_REGISTRY[name].summary}
13
+
14
+ USAGE
15
+ $ codemods ${name} [PATH] [-d] [-n] [-c <value>]
16
+
17
+ ARGUMENTS
18
+ PATH The file or directory path to transform (default: ".")
19
+
20
+ FLAGS
21
+ -c, --config=<value> Path to a JSON config file listing the paths to migrate (mutually exclusive with the path argument)
22
+ -d, --dry When enabled the transformer will not write to the file but print what would have changed instead
23
+ -n, --no-log When enabled no logs will be displayed
24
+
25
+ EXAMPLES
26
+ $ codemods ${name}
27
+ $ codemods ${name} ./src --dry
28
+ `;
29
+ }
30
+ export async function runCodemodCommand(name, argv) {
31
+ const start = performance.now();
32
+ const { flags, path } = parseRunArgs(argv);
33
+ if (flags.config != null && path !== DEFAULT_PATH_ARG) {
34
+ throw new CliUsageError("Cannot use '--config' together with a path argument. Choose one.");
35
+ }
36
+ const config = await resolveConfig(flags, path);
37
+ await runCodemod(CODEMOD_REGISTRY[name].codemod, config);
38
+ const end = performance.now();
39
+ if (config.log !== false) {
40
+ console.log(`✨ transformation took ${(end - start).toFixed(2)} milliseconds`);
41
+ }
42
+ }
43
+ function parseRunArgs(argv) {
44
+ const normalized = argv.map(arg => UPPERCASE_SHORT_FLAG_ALIASES[arg] ?? arg);
45
+ let values;
46
+ let positionals;
47
+ try {
48
+ ({ values, positionals } = parseArgs({
49
+ args: normalized,
50
+ options: {
51
+ dry: { type: 'boolean', short: 'd', default: DEFAULT_DRY_RUN_OPTION },
52
+ ['no-log']: { type: 'boolean', short: 'n', default: DEFAULT_NO_LOG_OPTION },
53
+ config: { type: 'string', short: 'c' },
54
+ },
55
+ allowPositionals: true,
56
+ strict: true,
57
+ }));
58
+ }
59
+ catch (error) {
60
+ throw new CliUsageError(error instanceof Error ? error.message : String(error));
61
+ }
62
+ if (positionals.length > 1) {
63
+ throw new CliUsageError(`Unexpected argument '${positionals[1]}'.`);
64
+ }
65
+ return {
66
+ flags: {
67
+ config: values.config,
68
+ dry: values.dry ?? DEFAULT_DRY_RUN_OPTION,
69
+ 'no-log': values['no-log'] ?? DEFAULT_NO_LOG_OPTION,
70
+ },
71
+ path: positionals[0] ?? DEFAULT_PATH_ARG,
72
+ };
73
+ }
74
+ async function resolveConfig(flags, path) {
75
+ if (flags.config == null) {
76
+ return { paths: [path], dry_run: flags.dry, log: !flags['no-log'] };
77
+ }
78
+ const config = await loadCodemodConfig(flags.config);
79
+ if (flags.dry && config.dry_run !== undefined) {
80
+ throw new CliUsageError("Cannot use '--dry' together with 'dry_run' in the config file. Choose one.");
81
+ }
82
+ if (flags['no-log'] && config.log !== undefined) {
83
+ throw new CliUsageError("Cannot use '--no-log' together with 'log' in the config file. Choose one.");
84
+ }
85
+ return {
86
+ ...config,
87
+ dry_run: flags.dry || (config.dry_run ?? false),
88
+ log: flags['no-log'] ? false : (config.log ?? true),
89
+ };
90
+ }
91
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Thrown for invalid CLI usage (bad flags, conflicting options, unknown commands). */
2
+ export declare class CliUsageError extends Error {
3
+ }
package/dist/errors.js ADDED
@@ -0,0 +1,4 @@
1
+ /** Thrown for invalid CLI usage (bad flags, conflicting options, unknown commands). */
2
+ export class CliUsageError extends Error {
3
+ }
4
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,OAAO,aAAc,SAAQ,KAAK;CAAG"}
@@ -0,0 +1,2 @@
1
+ export { run } from './cli.ts';
2
+ export { default, joiToZodTransformer, JOI_TO_ZOD_LANGUAGE, JOI_TO_ZOD_CODEMOD } from './codemods/joi-to-zod/index.ts';
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { run } from './cli.js';
2
+ export { default, joiToZodTransformer, JOI_TO_ZOD_LANGUAGE, JOI_TO_ZOD_CODEMOD } from './codemods/joi-to-zod/index.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,3 @@
1
+ type AnyCollection<Value = unknown> = Array<Value> | Set<Value>;
2
+ export declare function collectionIsEmpty<T extends AnyCollection>(collection: T): boolean;
3
+ export {};
@@ -0,0 +1,9 @@
1
+ function getCollectionCount(collection) {
2
+ if (Array.isArray(collection))
3
+ return collection.length;
4
+ return collection.size;
5
+ }
6
+ export function collectionIsEmpty(collection) {
7
+ return getCollectionCount(collection) === 0;
8
+ }
9
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/kit/collections.ts"],"names":[],"mappings":"AAEA,SAAS,kBAAkB,CAA0B,UAAa;IAChE,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC,MAAM,CAAC;IAExD,OAAO,UAAU,CAAC,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAA0B,UAAa;IACtE,OAAO,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,31 @@
1
+ import z from 'zod';
2
+ declare const CodemodConfigSchema: z.ZodObject<{
3
+ paths: z.ZodArray<z.ZodString>;
4
+ dry_run: z.ZodOptional<z.ZodBoolean>;
5
+ log: z.ZodOptional<z.ZodBoolean>;
6
+ }, z.core.$strip>;
7
+ export type CodemodConfig = z.infer<typeof CodemodConfigSchema>;
8
+ declare class ConfigError extends Error {
9
+ readonly cause: unknown;
10
+ constructor(message: string, options?: {
11
+ cause: unknown;
12
+ });
13
+ }
14
+ export declare class ConfigNotFoundError extends ConfigError {
15
+ constructor(configPath: string, options?: {
16
+ cause: unknown;
17
+ });
18
+ }
19
+ export declare class ConfigParseError extends ConfigError {
20
+ constructor(configPath: string, options?: {
21
+ cause: unknown;
22
+ });
23
+ }
24
+ export declare class ConfigValidationError extends ConfigError {
25
+ constructor(configPath: string, zodError: z.ZodError, options?: {
26
+ cause: unknown;
27
+ });
28
+ }
29
+ export declare function loadCodemodConfig(configPath: string): Promise<CodemodConfig>;
30
+ export declare function loadCodemodConfig<Schema extends z.ZodType<CodemodConfig>>(configPath: string, schema: Schema): Promise<z.infer<Schema>>;
31
+ export {};
@@ -0,0 +1,44 @@
1
+ import fs from 'node:fs/promises';
2
+ import z, { prettifyError } from 'zod';
3
+ import { tryCatch, tryCatchAsync } from './result.js';
4
+ const CodemodConfigSchema = z.object({
5
+ paths: z.array(z.string().nonempty()).nonempty(),
6
+ dry_run: z.boolean().optional(),
7
+ log: z.boolean().optional(),
8
+ });
9
+ class ConfigError extends Error {
10
+ cause;
11
+ constructor(message, options) {
12
+ super(message);
13
+ this.cause = options?.cause;
14
+ }
15
+ }
16
+ export class ConfigNotFoundError extends ConfigError {
17
+ constructor(configPath, options) {
18
+ super(`No config file found at '${configPath}'. Check that the path is correct.`, options);
19
+ }
20
+ }
21
+ export class ConfigParseError extends ConfigError {
22
+ constructor(configPath, options) {
23
+ const reason = options?.cause instanceof Error ? options.cause.message : String(options?.cause);
24
+ super(`Config file at '${configPath}' is not valid JSON: ${reason}`, options);
25
+ }
26
+ }
27
+ export class ConfigValidationError extends ConfigError {
28
+ constructor(configPath, zodError, options) {
29
+ super(`Config file at '${configPath}' failed schema validation:\n${prettifyError(zodError)}`, options);
30
+ }
31
+ }
32
+ export async function loadCodemodConfig(configPath, schema = CodemodConfigSchema) {
33
+ const readResult = await tryCatchAsync(() => fs.readFile(configPath, { encoding: 'utf-8' }));
34
+ if (readResult.isErr())
35
+ throw new ConfigNotFoundError(configPath, { cause: readResult.error });
36
+ const parsedResult = tryCatch(() => JSON.parse(readResult.value));
37
+ if (parsedResult.isErr())
38
+ throw new ConfigParseError(configPath, { cause: parsedResult.error });
39
+ const validated = await schema.safeParseAsync(parsedResult.value);
40
+ if (!validated.success)
41
+ throw new ConfigValidationError(configPath, validated.error);
42
+ return validated.data;
43
+ }
44
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/kit/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC,OAAO,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAIH,MAAM,WAAY,SAAQ,KAAK;IACpB,KAAK,CAAU;IAExB,YAAY,OAAe,EAAE,OAA4B;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IAClD,YAAY,UAAkB,EAAE,OAA4B;QAC1D,KAAK,CAAC,4BAA4B,UAAU,oCAAoC,EAAE,OAAO,CAAC,CAAC;IAC7F,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,WAAW;IAC/C,YAAY,UAAkB,EAAE,OAA4B;QAC1D,MAAM,MAAM,GAAG,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChG,KAAK,CAAC,mBAAmB,UAAU,wBAAwB,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,WAAW;IACpD,YAAY,UAAkB,EAAE,QAAoB,EAAE,OAA4B;QAChF,KAAK,CAAC,mBAAmB,UAAU,gCAAgC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACzG,CAAC;CACF;AAOD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,MAAM,GAA6B,mBAAmB;IAEtD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7F,IAAI,UAAU,CAAC,KAAK,EAAE;QAAE,MAAM,IAAI,mBAAmB,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAE/F,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAY,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,IAAI,YAAY,CAAC,KAAK,EAAE;QAAE,MAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;IAEhG,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAClE,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,MAAM,IAAI,qBAAqB,CAAC,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAErF,OAAO,SAAS,CAAC,IAAI,CAAC;AACxB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const LANG_TO_EXTENSIONS_MAPPING: Record<string, Set<string>>;
@@ -0,0 +1,13 @@
1
+ import { Lang } from '@ast-grep/napi';
2
+ const JAVASCRIPT_EXTENSIONS = ['.js', '.cjs', '.mjs'];
3
+ const TYPESCRIPT_EXTENSIONS = JAVASCRIPT_EXTENSIONS.concat(['.ts', '.mts']);
4
+ const JSX_EXTENSIONS = ['.jsx'];
5
+ export const LANG_TO_EXTENSIONS_MAPPING = Object.fromEntries(Object.entries({
6
+ [Lang.TypeScript]: TYPESCRIPT_EXTENSIONS,
7
+ ts: TYPESCRIPT_EXTENSIONS,
8
+ [Lang.Tsx]: JSX_EXTENSIONS.concat(['.tsx']),
9
+ jsx: JSX_EXTENSIONS,
10
+ [Lang.JavaScript]: JAVASCRIPT_EXTENSIONS,
11
+ js: JAVASCRIPT_EXTENSIONS,
12
+ }).map(([key, value]) => [key.toLowerCase(), new Set(value)]));
13
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/kit/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACtD,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5E,MAAM,cAAc,GAAG,CAAC,MAAM,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,0BAA0B,GAAgC,MAAM,CAAC,WAAW,CACvF,MAAM,CAAC,OAAO,CAAC;IACb,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,qBAAqB;IACxC,EAAE,EAAE,qBAAqB;IACzB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3C,GAAG,EAAE,cAAc;IACnB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,qBAAqB;IACxC,EAAE,EAAE,qBAAqB;CAC1B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAC9D,CAAC"}
@@ -0,0 +1,12 @@
1
+ declare class CodemodError extends Error {
2
+ readonly cause: unknown;
3
+ constructor(message: string, options?: {
4
+ cause: unknown;
5
+ });
6
+ }
7
+ export declare class CodemodTargetNotFoundError extends CodemodError {
8
+ constructor(targetPath: string, options?: {
9
+ cause: unknown;
10
+ });
11
+ }
12
+ export {};
@@ -0,0 +1,13 @@
1
+ class CodemodError extends Error {
2
+ cause;
3
+ constructor(message, options) {
4
+ super(message);
5
+ this.cause = options?.cause;
6
+ }
7
+ }
8
+ export class CodemodTargetNotFoundError extends CodemodError {
9
+ constructor(targetPath, options) {
10
+ super(`No file or directory found at '${targetPath}'`, options);
11
+ }
12
+ }
13
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/kit/errors.ts"],"names":[],"mappings":"AAAA,MAAM,YAAa,SAAQ,KAAK;IACrB,KAAK,CAAU;IAExB,YAAY,OAAe,EAAE,OAA4B;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,YAAY;IAC1D,YAAY,UAAkB,EAAE,OAA4B;QAC1D,KAAK,CAAC,kCAAkC,UAAU,GAAG,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { ResultAsync, type Result } from 'neverthrow';
2
+ export declare function tryCatch<T>(callback: () => T): Result<T, unknown>;
3
+ export declare function tryCatchAsync<T>(callback: () => Promise<T>): ResultAsync<T, unknown>;
4
+ export declare function toError(value: unknown): Error;
@@ -0,0 +1,18 @@
1
+ import { err, ok, ResultAsync } from 'neverthrow';
2
+ export function tryCatch(callback) {
3
+ try {
4
+ return ok(callback());
5
+ }
6
+ catch (error) {
7
+ return err(error);
8
+ }
9
+ }
10
+ export function tryCatchAsync(callback) {
11
+ return ResultAsync.fromPromise(callback(), e => e);
12
+ }
13
+ export function toError(value) {
14
+ if (value instanceof Error)
15
+ return value;
16
+ return new Error(String(value));
17
+ }
18
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/kit/result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,EAAe,MAAM,YAAY,CAAC;AAE/D,MAAM,UAAU,QAAQ,CAAI,QAAiB;IAC3C,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAI,QAA0B;IACzD,OAAO,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { CodemodConfig } from './config.ts';
2
+ import type { Codemod, RunCodemodResult } from './types.ts';
3
+ type RunCodemodHooks<C extends Codemod = Codemod> = {
4
+ targetFiltering?: (filepath: string, codemod: C) => boolean;
5
+ preCodemodRun?: (codemod: C) => Promise<void>;
6
+ postTransform?: (transformedContent: string, codemod: C) => Promise<string>;
7
+ };
8
+ type RunCodemodOptions<C extends Codemod = Codemod> = {
9
+ hooks?: RunCodemodHooks<C>;
10
+ rootPaths?: Array<string>;
11
+ };
12
+ export declare function runCodemod<C extends Codemod = Codemod>(codemod: C, config: CodemodConfig, options?: RunCodemodOptions<C>): Promise<Array<RunCodemodResult>>;
13
+ export {};
@@ -0,0 +1,126 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import fg from 'fast-glob';
4
+ import { err, ok } from 'neverthrow';
5
+ import { compactMap, groupBy } from '../utils/arrays.js';
6
+ import { collectionIsEmpty } from './collections.js';
7
+ import { LANG_TO_EXTENSIONS_MAPPING } from './constants.js';
8
+ import { CodemodTargetNotFoundError } from './errors.js';
9
+ import { toError, tryCatchAsync } from './result.js';
10
+ function getSupportedExtensions(codemod) {
11
+ return new Set(Array.from(codemod.languages).reduce((acc, language) => {
12
+ const mappedExtensions = LANG_TO_EXTENSIONS_MAPPING[language.toLowerCase()];
13
+ if (mappedExtensions == null)
14
+ return acc;
15
+ return acc.concat(Array.from(mappedExtensions));
16
+ }, []));
17
+ }
18
+ async function transformFile(codemod, fullPath, filepath, hooks, enableLogging, runInDryMode, root) {
19
+ try {
20
+ const content = await fs.readFile(fullPath, { encoding: 'utf-8' });
21
+ const modifiedContent = await codemod.transformer(content, fullPath);
22
+ const hasChanges = modifiedContent !== content;
23
+ if (hasChanges) {
24
+ const transformedContent = await hooks.postTransform(modifiedContent, codemod);
25
+ if (!runInDryMode) {
26
+ await fs.writeFile(fullPath, transformedContent);
27
+ }
28
+ if (enableLogging) {
29
+ console.log(`🚀 finished '${codemod.name}'`, { filename: filepath });
30
+ }
31
+ }
32
+ return ok({ hasChanges, content: modifiedContent, fullPath, root });
33
+ }
34
+ catch (error) {
35
+ if (enableLogging) {
36
+ console.error(`❌ '${codemod.name}' failed to parse file`, filepath, error);
37
+ }
38
+ return err(toError(error));
39
+ }
40
+ }
41
+ async function runPostTransformHook(codemod, results, rootPaths) {
42
+ const successes = compactMap(results, result => {
43
+ if (result.isErr())
44
+ return undefined;
45
+ return result.value;
46
+ });
47
+ const successesGroupedByRoot = groupBy(successes, 'root');
48
+ const rootPathsWithResults = rootPaths.map(root => ({
49
+ root,
50
+ results: successesGroupedByRoot[root] ?? [],
51
+ }));
52
+ await Promise.all(rootPathsWithResults.map(r => (codemod.postTransform ?? (async () => { }))(r, codemod)));
53
+ }
54
+ async function resolveDirectoryTargets(codemod, transformationPath, hooks) {
55
+ const globItems = await fg.glob(['**/*'], { cwd: transformationPath });
56
+ const extensions = getSupportedExtensions(codemod);
57
+ const codemodTargetFiltering = codemod.targetFiltering ?? (() => true);
58
+ const targets = globItems.filter(filepath => {
59
+ if (!hooks.targetFiltering(filepath, codemod))
60
+ return false;
61
+ if (!codemodTargetFiltering(filepath, codemod))
62
+ return false;
63
+ return collectionIsEmpty(extensions) || extensions.has(path.extname(filepath));
64
+ });
65
+ return targets.map(filepath => ({
66
+ fullPath: path.resolve(transformationPath, filepath),
67
+ filepath,
68
+ root: path.resolve(transformationPath, filepath.split('/')[0] ?? filepath),
69
+ }));
70
+ }
71
+ function resolveFileTarget(codemod, transformationPath, hooks) {
72
+ const filepath = path.basename(transformationPath);
73
+ const extensions = getSupportedExtensions(codemod);
74
+ const codemodTargetFiltering = codemod.targetFiltering ?? (() => true);
75
+ const isTarget = hooks.targetFiltering(filepath, codemod) &&
76
+ codemodTargetFiltering(filepath, codemod) &&
77
+ (collectionIsEmpty(extensions) || extensions.has(path.extname(filepath)));
78
+ if (!isTarget)
79
+ return undefined;
80
+ const fullPath = path.resolve(transformationPath);
81
+ return { fullPath, filepath, root: path.dirname(fullPath) };
82
+ }
83
+ async function resolveTargetsForPath(codemod, transformationPath, hooks) {
84
+ const statResult = await tryCatchAsync(() => fs.stat(transformationPath));
85
+ if (statResult.isErr()) {
86
+ throw new CodemodTargetNotFoundError(transformationPath, { cause: toError(statResult.error) });
87
+ }
88
+ if (statResult.value.isFile()) {
89
+ const target = resolveFileTarget(codemod, transformationPath, hooks);
90
+ return target == null ? [] : [target];
91
+ }
92
+ return resolveDirectoryTargets(codemod, transformationPath, hooks);
93
+ }
94
+ function dedupeTargetsByFullPath(targetsPerPath) {
95
+ const seenFullPaths = new Set();
96
+ return targetsPerPath.flat().filter(target => {
97
+ if (seenFullPaths.has(target.fullPath))
98
+ return false;
99
+ seenFullPaths.add(target.fullPath);
100
+ return true;
101
+ });
102
+ }
103
+ function defaultedHooks(hooks) {
104
+ const targetFiltering = hooks?.targetFiltering ?? (() => true);
105
+ const postTransform = hooks?.postTransform ?? (content => Promise.resolve(content));
106
+ const preCodemodRun = hooks?.preCodemodRun ?? (async () => { });
107
+ return { targetFiltering, postTransform, preCodemodRun };
108
+ }
109
+ export async function runCodemod(codemod, config, options) {
110
+ const hooks = defaultedHooks(options?.hooks);
111
+ const rootPaths = options?.rootPaths ?? [];
112
+ const enableLogging = config.log ?? true;
113
+ const runInDryMode = config.dry_run ?? false;
114
+ await hooks.preCodemodRun(codemod);
115
+ const targetsPerPath = await Promise.all(config.paths.map(transformationPath => resolveTargetsForPath(codemod, transformationPath, hooks)));
116
+ const targets = dedupeTargetsByFullPath(targetsPerPath);
117
+ if (targets.length === 0)
118
+ return [];
119
+ if (enableLogging) {
120
+ console.log(`🧉 '${codemod.name}' targeting ${targets.length} ${targets.length === 1 ? 'file' : 'files'} to transform, chill and grab some maté`);
121
+ }
122
+ const results = await Promise.all(targets.map(target => transformFile(codemod, target.fullPath, target.filepath, hooks, enableLogging, runInDryMode, target.root)));
123
+ await runPostTransformHook(codemod, results, rootPaths);
124
+ return results;
125
+ }
126
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/kit/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { SgRoot } from '@ast-grep/napi';
2
+ import type { NapiLang } from '@ast-grep/napi/types/lang.js';
3
+ import type { TypesMap } from '@ast-grep/napi/types/staticTypes.js';
4
+ import type { Result } from 'neverthrow';
5
+ export type RunCodemodOkResult = {
6
+ hasChanges: boolean;
7
+ content: string;
8
+ fullPath: string;
9
+ root: string;
10
+ };
11
+ export type RunCodemodResult = Result<RunCodemodOkResult, Error>;
12
+ type CodemodOptions = {
13
+ postTransform?: Record<string, unknown>;
14
+ };
15
+ export type Codemod = {
16
+ name: string;
17
+ languages: Set<NapiLang> | Array<NapiLang>;
18
+ options?: CodemodOptions;
19
+ transformer: (content: string, filename?: string, codemod?: Codemod) => Promise<string>;
20
+ postTransform?: (results: {
21
+ root: string;
22
+ results: Array<RunCodemodOkResult>;
23
+ }, codemod: Codemod) => Promise<void>;
24
+ targetFiltering?: (filepath: string, codemod: Codemod) => boolean;
25
+ };
26
+ type ModificationsReport = {
27
+ changesApplied: number;
28
+ };
29
+ export type Modifications = {
30
+ ast: SgRoot<TypesMap>;
31
+ report: ModificationsReport;
32
+ lang: NapiLang;
33
+ filename: string | undefined;
34
+ history: Array<SgRoot<TypesMap>>;
35
+ };
36
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/kit/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function compactMap<TargetElement, TransformedElement>(array: Array<TargetElement>, transformer: (value: TargetElement, index: number) => TransformedElement | null | undefined): Array<TransformedElement>;
2
+ export declare function groupBy<T, K extends keyof T>(array: Array<T>, key: K): Record<string, Array<T>>;
@@ -0,0 +1,25 @@
1
+ export function compactMap(array, transformer) {
2
+ const newArray = [];
3
+ array.forEach((item, index) => {
4
+ const transformedItem = transformer(item, index);
5
+ if (transformedItem == null) {
6
+ return;
7
+ }
8
+ newArray.push(transformedItem);
9
+ });
10
+ return newArray;
11
+ }
12
+ export function groupBy(array, key) {
13
+ return [...array].reduce((acc, current) => {
14
+ const keyValue = String(current[key]);
15
+ const existing = acc[keyValue];
16
+ if (existing == null) {
17
+ acc[keyValue] = [current];
18
+ }
19
+ else {
20
+ existing.push(current);
21
+ }
22
+ return acc;
23
+ }, {});
24
+ }
25
+ //# sourceMappingURL=arrays.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrays.js","sourceRoot":"","sources":["../../src/utils/arrays.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CACxB,KAA2B,EAC3B,WAA2F;IAE3F,MAAM,QAAQ,GAA8B,EAAE,CAAC;IAC/C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjD,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,OAAO,CAAuB,KAAe,EAAE,GAAM;IACnE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAA2B,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function invariant<Assertion extends boolean>(assertion: Assertion, message?: string): asserts assertion;
@@ -0,0 +1,5 @@
1
+ export function invariant(assertion, message) {
2
+ if (!assertion)
3
+ throw new Error(message ?? 'Assertion failed');
4
+ }
5
+ //# sourceMappingURL=asserts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asserts.js","sourceRoot":"","sources":["../../src/utils/asserts.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAA4B,SAAoB,EAAE,OAAgB;IACzF,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,5 @@
1
+ type Entry<T> = {
2
+ [K in keyof T]: [K, T[K]];
3
+ }[keyof T];
4
+ export declare function toEntries<Target extends object>(object: Target): Array<Entry<Target>>;
5
+ export {};
@@ -0,0 +1,4 @@
1
+ export function toEntries(object) {
2
+ return Object.entries(object);
3
+ }
4
+ //# sourceMappingURL=objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.js","sourceRoot":"","sources":["../../src/utils/objects.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,SAAS,CAAwB,MAAc;IAC7D,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAyB,CAAC;AACxD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kamaalio/codemods",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "A collection of codemods, runnable as a single CLI.",
5
5
  "keywords": [
6
6
  "codemod",