@wise/wds-codemods 0.0.1-experimental-731cdc7 → 0.0.1-experimental-cbae00f

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 (60) hide show
  1. package/.changeset/better-impalas-drop.md +5 -0
  2. package/.changeset/config.json +13 -0
  3. package/.changeset/quick-mails-joke.md +128 -0
  4. package/.github/CODEOWNERS +1 -0
  5. package/.github/actions/bootstrap/action.yml +49 -0
  6. package/.github/actions/commitlint/action.yml +27 -0
  7. package/.github/actions/test/action.yml +23 -0
  8. package/.github/workflows/cd-cd.yml +127 -0
  9. package/.github/workflows/renovate.yml +16 -0
  10. package/.husky/commit-msg +1 -0
  11. package/.husky/pre-commit +1 -0
  12. package/.nvmrc +1 -0
  13. package/.prettierignore +1 -0
  14. package/.prettierrc.js +5 -0
  15. package/DEVELOPER.md +783 -0
  16. package/babel.config.js +28 -0
  17. package/commitlint.config.js +3 -0
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.js +135 -133
  20. package/dist/index.js.map +1 -1
  21. package/dist/transforms/button.d.ts +16 -0
  22. package/dist/transforms/button.js +566 -493
  23. package/dist/transforms/button.js.map +1 -1
  24. package/eslint.config.js +15 -0
  25. package/jest.config.js +9 -0
  26. package/mkdocs.yml +4 -0
  27. package/package.json +14 -19
  28. package/renovate.json +9 -0
  29. package/scripts/build.sh +10 -0
  30. package/src/__tests__/runCodemod.test.ts +96 -0
  31. package/src/index.ts +4 -0
  32. package/src/runCodemod.ts +88 -0
  33. package/src/transforms/button/__tests__/button.test.tsx +153 -0
  34. package/src/transforms/button/button.ts +418 -0
  35. package/src/transforms/helpers/__tests__/createTestTransform.test.ts +27 -0
  36. package/src/transforms/helpers/__tests__/hasImport.test.ts +52 -0
  37. package/src/transforms/helpers/__tests__/iconUtils.test.ts +207 -0
  38. package/src/transforms/helpers/__tests__/jsxElementUtils.test.ts +130 -0
  39. package/src/transforms/helpers/__tests__/jsxReportingUtils.test.ts +265 -0
  40. package/src/transforms/helpers/createTestTransform.ts +18 -0
  41. package/src/transforms/helpers/hasImport.ts +60 -0
  42. package/src/transforms/helpers/iconUtils.ts +87 -0
  43. package/src/transforms/helpers/index.ts +5 -0
  44. package/src/transforms/helpers/jsxElementUtils.ts +67 -0
  45. package/src/transforms/helpers/jsxReportingUtils.ts +224 -0
  46. package/src/utils/__tests__/getOptions.test.ts +170 -0
  47. package/src/utils/__tests__/handleError.test.ts +18 -0
  48. package/src/utils/__tests__/loadTransformModules.test.ts +51 -0
  49. package/src/utils/__tests__/reportManualReview.test.ts +42 -0
  50. package/src/utils/getOptions.ts +63 -0
  51. package/src/utils/handleError.ts +6 -0
  52. package/src/utils/index.ts +4 -0
  53. package/src/utils/loadTransformModules.ts +28 -0
  54. package/src/utils/reportManualReview.ts +17 -0
  55. package/test-button.tsx +230 -0
  56. package/test-file.js +2 -0
  57. package/tsconfig.json +14 -0
  58. package/tsup.config.js +13 -0
  59. package/dist/reportManualReview-DQ00-OKx.js +0 -50
  60. package/dist/reportManualReview-DQ00-OKx.js.map +0 -1
@@ -0,0 +1,28 @@
1
+ export default {
2
+ presets: [
3
+ [
4
+ '@babel/preset-env',
5
+ {
6
+ targets: { node: 'current' },
7
+ modules: false,
8
+ },
9
+ ],
10
+ '@babel/preset-typescript',
11
+ ],
12
+ plugins: ['@babel/plugin-syntax-import-meta', 'babel-plugin-transform-import-meta'],
13
+ env: {
14
+ test: {
15
+ presets: [
16
+ [
17
+ '@babel/preset-env',
18
+ {
19
+ targets: { node: 'current' },
20
+ modules: 'commonjs',
21
+ },
22
+ ],
23
+ '@babel/preset-typescript',
24
+ ],
25
+ plugins: ['@babel/plugin-syntax-import-meta', 'babel-plugin-transform-import-meta'],
26
+ },
27
+ },
28
+ };
@@ -0,0 +1,3 @@
1
+ export default {
2
+ extends: ['@commitlint/config-conventional'],
3
+ };
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/index.js CHANGED
@@ -1,145 +1,147 @@
1
1
  #!/usr/bin/env node
2
- const require_reportManualReview = require('./reportManualReview-DQ00-OKx.js');
3
- const node_fs_promises = require_reportManualReview.__toESM(require("node:fs/promises"));
4
- const node_child_process = require_reportManualReview.__toESM(require("node:child_process"));
5
- const node_path = require_reportManualReview.__toESM(require("node:path"));
6
- const node_url = require_reportManualReview.__toESM(require("node:url"));
7
- const __inquirer_prompts = require_reportManualReview.__toESM(require("@inquirer/prompts"));
8
- const node_fs = require_reportManualReview.__toESM(require("node:fs"));
9
2
 
10
- //#region src/utils/getOptions.ts
3
+ // src/runCodemod.ts
4
+ import fs3 from "fs/promises";
5
+ import { execSync } from "child_process";
6
+ import path3 from "path";
7
+ import { fileURLToPath } from "url";
8
+
9
+ // src/utils/getOptions.ts
10
+ import { confirm, input, select as list } from "@inquirer/prompts";
11
11
  async function getOptions(transformFiles) {
12
- const args = process.argv.slice(2);
13
- if (args.length > 0) {
14
- const [transformFile$1, targetPath$1] = args;
15
- const dry$1 = args.includes("--dry") || args.includes("--dry-run");
16
- const print$1 = args.includes("--print");
17
- const ignorePatternIndex = args.findIndex((arg) => arg === "--ignore-pattern");
18
- let ignorePattern$1;
19
- if (ignorePatternIndex !== -1 && args.length > ignorePatternIndex + 1) ignorePattern$1 = args[ignorePatternIndex + 1];
20
- const gitignore$1 = args.includes("--gitignore");
21
- const noGitignore = args.includes("--no-gitignore");
22
- if (!transformFile$1 || !transformFiles.includes(transformFile$1)) throw new Error("Invalid transform file specified.");
23
- if (!targetPath$1) throw new Error("Target path cannot be empty.");
24
- const useGitignore = !!(gitignore$1 || !gitignore$1 && !noGitignore);
25
- return {
26
- transformFile: transformFile$1,
27
- targetPath: targetPath$1,
28
- dry: dry$1,
29
- print: print$1,
30
- ignorePattern: ignorePattern$1,
31
- gitignore: useGitignore
32
- };
33
- }
34
- const transformFile = await (0, __inquirer_prompts.select)({
35
- message: "Select a codemod transform to run:",
36
- choices: transformFiles.map((file) => ({
37
- name: file,
38
- value: file
39
- }))
40
- });
41
- const targetPath = await (0, __inquirer_prompts.input)({
42
- message: "Enter the target directory or file path to run codemod on:",
43
- validate: (value) => value.trim() !== "" || "Target path cannot be empty"
44
- });
45
- const dry = await (0, __inquirer_prompts.confirm)({
46
- message: "Run in dry mode (no changes written to files)?",
47
- default: true
48
- });
49
- const print = await (0, __inquirer_prompts.confirm)({
50
- message: "Print transformed source to console?",
51
- default: false
52
- });
53
- const ignorePattern = await (0, __inquirer_prompts.input)({
54
- message: "Enter ignore pattern(s) (comma separated) or leave empty:",
55
- validate: (value) => true
56
- });
57
- const gitignore = await (0, __inquirer_prompts.confirm)({
58
- message: "Respect .gitignore files?",
59
- default: true
60
- });
61
- return {
62
- transformFile,
63
- targetPath,
64
- dry,
65
- print,
66
- ignorePattern,
67
- gitignore
68
- };
12
+ const args = process.argv.slice(2);
13
+ if (args.length > 0) {
14
+ const [transformFile2, targetPath2] = args;
15
+ const dry2 = args.includes("--dry") || args.includes("--dry-run");
16
+ const print2 = args.includes("--print");
17
+ const ignorePatternIndex = args.findIndex((arg) => arg === "--ignore-pattern");
18
+ let ignorePattern2;
19
+ if (ignorePatternIndex !== -1 && args.length > ignorePatternIndex + 1) {
20
+ ignorePattern2 = args[ignorePatternIndex + 1];
21
+ }
22
+ const gitignore2 = args.includes("--gitignore");
23
+ const noGitignore = args.includes("--no-gitignore");
24
+ if (!transformFile2 || !transformFiles.includes(transformFile2)) {
25
+ throw new Error("Invalid transform file specified.");
26
+ }
27
+ if (!targetPath2) {
28
+ throw new Error("Target path cannot be empty.");
29
+ }
30
+ const useGitignore = !!(gitignore2 || !gitignore2 && !noGitignore);
31
+ return { transformFile: transformFile2, targetPath: targetPath2, dry: dry2, print: print2, ignorePattern: ignorePattern2, gitignore: useGitignore };
32
+ }
33
+ const transformFile = await list({
34
+ message: "Select a codemod transform to run:",
35
+ choices: transformFiles.map((file) => ({ name: file, value: file }))
36
+ });
37
+ const targetPath = await input({
38
+ message: "Enter the target directory or file path to run codemod on:",
39
+ validate: (value) => value.trim() !== "" || "Target path cannot be empty"
40
+ });
41
+ const dry = await confirm({
42
+ message: "Run in dry mode (no changes written to files)?",
43
+ default: true
44
+ });
45
+ const print = await confirm({
46
+ message: "Print transformed source to console?",
47
+ default: false
48
+ });
49
+ const ignorePattern = await input({
50
+ message: "Enter ignore pattern(s) (comma separated) or leave empty:",
51
+ validate: (value) => true
52
+ });
53
+ const gitignore = await confirm({
54
+ message: "Respect .gitignore files?",
55
+ default: true
56
+ });
57
+ return { transformFile, targetPath, dry, print, ignorePattern, gitignore };
69
58
  }
59
+ var getOptions_default = getOptions;
70
60
 
71
- //#endregion
72
- //#region src/utils/loadTransformModules.ts
61
+ // src/utils/loadTransformModules.ts
62
+ import { promises as fs } from "fs";
63
+ import path from "path";
73
64
  async function loadTransformModules(transformsDir) {
74
- let transformModules = {};
75
- const files = await node_fs.promises.readdir(transformsDir);
76
- const transformFiles = await Promise.all(files.filter((file) => file.endsWith(".js")).map(async (file) => {
77
- const transformPath = node_path.default.join(transformsDir, file);
78
- const transformModule = await import(transformPath);
79
- transformModules = {
80
- ...transformModules,
81
- [file]: transformModule.default.default
82
- };
83
- return file.replace(".js", "");
84
- }));
85
- return {
86
- transformModules,
87
- transformFiles
88
- };
65
+ let transformModules = {};
66
+ const files = await fs.readdir(transformsDir);
67
+ const transformFiles = await Promise.all(
68
+ files.filter((file) => file.endsWith(".js")).map(async (file) => {
69
+ const transformPath = path.join(transformsDir, file);
70
+ const transformModule = await import(transformPath);
71
+ transformModules = { ...transformModules, [file]: transformModule.default.default };
72
+ return file.replace(".js", "");
73
+ })
74
+ );
75
+ return { transformModules, transformFiles };
89
76
  }
77
+ var loadTransformModules_default = loadTransformModules;
78
+
79
+ // src/utils/reportManualReview.ts
80
+ import fs2 from "fs/promises";
81
+ import path2 from "path";
82
+ var REPORT_PATH = path2.resolve(process.cwd(), "codemod-report.txt");
90
83
 
91
- //#endregion
92
- //#region src/runCodemod.ts
93
- const currentFilePath = (0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href);
94
- const currentDirPath = node_path.default.dirname(currentFilePath);
84
+ // src/runCodemod.ts
85
+ var currentFilePath = fileURLToPath(import.meta.url);
86
+ var currentDirPath = path3.dirname(currentFilePath);
95
87
  async function runCodemod(transformsDir) {
96
- try {
97
- const resolvedTransformsDir = transformsDir ?? node_path.default.resolve(currentDirPath, "../dist/transforms");
98
- console.debug(`Resolved transforms directory: ${resolvedTransformsDir}`);
99
- const { transformFiles } = await loadTransformModules(resolvedTransformsDir);
100
- if (transformFiles.length === 0) throw new Error(`No transform scripts found in directory: ${resolvedTransformsDir}`);
101
- const resolvedTransformFiles = await Promise.all(transformFiles);
102
- const options = await getOptions(resolvedTransformFiles);
103
- const codemodPath = node_path.default.resolve(resolvedTransformsDir, `${options.transformFile}.js`);
104
- console.debug(`Resolved codemod path: ${codemodPath}`);
105
- const args = [
106
- "-t",
107
- codemodPath,
108
- options.targetPath,
109
- options.dry ? "--dry" : "",
110
- options.print ? "--print" : "",
111
- options.ignorePattern ? options.ignorePattern.split(",").map((pattern) => `--ignore-pattern=${pattern.trim()}`).join(" ") : "",
112
- options.gitignore ? "--gitignore" : ""
113
- ].filter(Boolean);
114
- const command = `npx jscodeshift ${args.join(" ")}`;
115
- console.debug(`Running: ${command}`);
116
- const reportPath = node_path.default.resolve(process.cwd(), "codemod-report.txt");
117
- try {
118
- await node_fs_promises.default.access(reportPath);
119
- await node_fs_promises.default.rm(reportPath);
120
- console.debug(`Removed existing report file: ${reportPath}`);
121
- } catch {
122
- console.debug(`No existing report file to remove: ${reportPath}`);
123
- }
124
- (0, node_child_process.execSync)(command, { stdio: "inherit" });
125
- try {
126
- const reportContent = await node_fs_promises.default.readFile(reportPath, "utf8");
127
- const lines = reportContent.split("\n").filter(Boolean);
128
- if (lines.length) console.log(`\n⚠️ ${lines.length} manual review${lines.length > 1 ? "s are" : " is"} required. See ${reportPath} for details.`);
129
- else console.debug(`Report file exists but is empty: ${reportPath}`);
130
- } catch {
131
- console.debug(`No report file generated - no manual reviews needed`);
132
- }
133
- } catch (error) {
134
- if (error instanceof Error) console.error("Error running codemod:", error.message);
135
- else console.error("Error running codemod:", error);
136
- if (process.env.NODE_ENV !== "test") process.exit(1);
137
- }
88
+ try {
89
+ const resolvedTransformsDir = transformsDir ?? path3.resolve(currentDirPath, "../dist/transforms");
90
+ console.debug(`Resolved transforms directory: ${resolvedTransformsDir}`);
91
+ const { transformFiles } = await loadTransformModules_default(resolvedTransformsDir);
92
+ if (transformFiles.length === 0) {
93
+ throw new Error(`No transform scripts found in directory: ${resolvedTransformsDir}`);
94
+ }
95
+ const resolvedTransformFiles = await Promise.all(transformFiles);
96
+ const options = await getOptions_default(resolvedTransformFiles);
97
+ const codemodPath = path3.resolve(resolvedTransformsDir, `${options.transformFile}.js`);
98
+ console.debug(`Resolved codemod path: ${codemodPath}`);
99
+ const args = [
100
+ "-t",
101
+ codemodPath,
102
+ options.targetPath,
103
+ options.dry ? "--dry" : "",
104
+ options.print ? "--print" : "",
105
+ options.ignorePattern ? options.ignorePattern.split(",").map((pattern) => `--ignore-pattern=${pattern.trim()}`).join(" ") : "",
106
+ options.gitignore ? "--gitignore" : ""
107
+ ].filter(Boolean);
108
+ const command = `npx jscodeshift ${args.join(" ")}`;
109
+ console.debug(`Running: ${command}`);
110
+ const reportPath = path3.resolve(process.cwd(), "codemod-report.txt");
111
+ try {
112
+ await fs3.access(reportPath);
113
+ await fs3.rm(reportPath);
114
+ console.debug(`Removed existing report file: ${reportPath}`);
115
+ } catch {
116
+ console.debug(`No existing report file to remove: ${reportPath}`);
117
+ }
118
+ execSync(command, { stdio: "inherit" });
119
+ try {
120
+ const reportContent = await fs3.readFile(reportPath, "utf8");
121
+ const lines = reportContent.split("\n").filter(Boolean);
122
+ if (lines.length) {
123
+ console.log(
124
+ `
125
+ \u26A0\uFE0F ${lines.length} manual review${lines.length > 1 ? "s are" : " is"} required. See ${reportPath} for details.`
126
+ );
127
+ } else {
128
+ console.debug(`Report file exists but is empty: ${reportPath}`);
129
+ }
130
+ } catch {
131
+ console.debug(`No report file generated - no manual reviews needed`);
132
+ }
133
+ } catch (error) {
134
+ if (error instanceof Error) {
135
+ console.error("Error running codemod:", error.message);
136
+ } else {
137
+ console.error("Error running codemod:", error);
138
+ }
139
+ if (process.env.NODE_ENV !== "test") {
140
+ process.exit(1);
141
+ }
142
+ }
138
143
  }
139
144
 
140
- //#endregion
141
- //#region src/index.ts
142
- runCodemod();
143
-
144
- //#endregion
145
+ // src/index.ts
146
+ void runCodemod();
145
147
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["transformFile","targetPath","dry","print","ignorePattern: string | undefined","gitignore","transformModules: Record<string, unknown>","fs","path","path","fs","error: unknown"],"sources":["../src/utils/getOptions.ts","../src/utils/loadTransformModules.ts","../src/runCodemod.ts","../src/index.ts"],"sourcesContent":["import { confirm, input, select as list } from '@inquirer/prompts';\n\nasync function getOptions(transformFiles: string[]) {\n const args = process.argv.slice(2);\n if (args.length > 0) {\n const [transformFile, targetPath] = args;\n const dry = args.includes('--dry') || args.includes('--dry-run');\n const print = args.includes('--print');\n const ignorePatternIndex = args.findIndex((arg) => arg === '--ignore-pattern');\n let ignorePattern: string | undefined;\n if (ignorePatternIndex !== -1 && args.length > ignorePatternIndex + 1) {\n ignorePattern = args[ignorePatternIndex + 1];\n }\n const gitignore = args.includes('--gitignore');\n const noGitignore = args.includes('--no-gitignore');\n\n if (!transformFile || !transformFiles.includes(transformFile)) {\n throw new Error('Invalid transform file specified.');\n }\n if (!targetPath) {\n throw new Error('Target path cannot be empty.');\n }\n\n // If both --gitignore and --no-gitignore are specified, prioritize --gitignore\n const useGitignore = !!(gitignore || (!gitignore && !noGitignore));\n\n return { transformFile, targetPath, dry, print, ignorePattern, gitignore: useGitignore };\n }\n\n const transformFile = await list({\n message: 'Select a codemod transform to run:',\n choices: transformFiles.map((file) => ({ name: file, value: file })),\n });\n\n const targetPath = await input({\n message: 'Enter the target directory or file path to run codemod on:',\n validate: (value) => value.trim() !== '' || 'Target path cannot be empty',\n });\n\n const dry = await confirm({\n message: 'Run in dry mode (no changes written to files)?',\n default: true,\n });\n\n const print = await confirm({\n message: 'Print transformed source to console?',\n default: false,\n });\n\n const ignorePattern = await input({\n message: 'Enter ignore pattern(s) (comma separated) or leave empty:',\n validate: (value) => true,\n });\n\n const gitignore = await confirm({\n message: 'Respect .gitignore files?',\n default: true,\n });\n\n return { transformFile, targetPath, dry, print, ignorePattern, gitignore };\n}\n\nexport default getOptions;\n","import { promises as fs } from 'fs';\nimport path from 'path';\n\ninterface TransformModule {\n default: {\n default: unknown;\n };\n}\n\nasync function loadTransformModules(transformsDir: string) {\n let transformModules: Record<string, unknown> = {};\n\n const files = await fs.readdir(transformsDir);\n const transformFiles = await Promise.all(\n files\n .filter((file) => file.endsWith('.js'))\n .map(async (file) => {\n const transformPath = path.join(transformsDir, file);\n const transformModule = (await import(transformPath)) as TransformModule;\n transformModules = { ...transformModules, [file]: transformModule.default.default };\n return file.replace('.js', '');\n }),\n );\n\n return { transformModules, transformFiles };\n}\n\nexport default loadTransformModules;\n","#!/usr/bin/env node\n\nimport fs from 'node:fs/promises';\n\nimport { execSync } from 'child_process';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nimport { getOptions, handleError, loadTransformModules } from './utils';\n\nconst currentFilePath = fileURLToPath(import.meta.url);\nconst currentDirPath = path.dirname(currentFilePath);\n\nasync function runCodemod(transformsDir?: string) {\n try {\n const resolvedTransformsDir =\n transformsDir ?? path.resolve(currentDirPath, '../dist/transforms');\n console.debug(`Resolved transforms directory: ${resolvedTransformsDir}`);\n\n const { transformFiles } = await loadTransformModules(resolvedTransformsDir);\n\n if (transformFiles.length === 0) {\n throw new Error(`No transform scripts found in directory: ${resolvedTransformsDir}`);\n }\n\n const resolvedTransformFiles = await Promise.all(transformFiles);\n const options = await getOptions(resolvedTransformFiles);\n\n const codemodPath = path.resolve(resolvedTransformsDir, `${options.transformFile}.js`);\n console.debug(`Resolved codemod path: ${codemodPath}`);\n\n const args = [\n '-t',\n codemodPath,\n options.targetPath,\n options.dry ? '--dry' : '',\n options.print ? '--print' : '',\n options.ignorePattern\n ? options.ignorePattern\n .split(',')\n .map((pattern) => `--ignore-pattern=${pattern.trim()}`)\n .join(' ')\n : '',\n options.gitignore ? '--gitignore' : '',\n ].filter(Boolean);\n\n const command = `npx jscodeshift ${args.join(' ')}`;\n\n console.debug(`Running: ${command}`);\n\n const reportPath = path.resolve(process.cwd(), 'codemod-report.txt');\n\n try {\n await fs.access(reportPath);\n await fs.rm(reportPath);\n console.debug(`Removed existing report file: ${reportPath}`);\n } catch {\n console.debug(`No existing report file to remove: ${reportPath}`);\n }\n\n execSync(command, { stdio: 'inherit' });\n\n try {\n const reportContent = await fs.readFile(reportPath, 'utf8');\n const lines = reportContent.split('\\n').filter(Boolean);\n if (lines.length) {\n console.log(\n `\\n⚠️ ${lines.length} manual review${lines.length > 1 ? 's are' : ' is'} required. See ${reportPath} for details.`,\n );\n } else {\n console.debug(`Report file exists but is empty: ${reportPath}`);\n }\n } catch {\n console.debug(`No report file generated - no manual reviews needed`);\n }\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error('Error running codemod:', error.message);\n } else {\n console.error('Error running codemod:', error);\n }\n if (process.env.NODE_ENV !== 'test') {\n process.exit(1);\n }\n }\n}\n\nexport { runCodemod };\n","#!/usr/bin/env node\nimport { runCodemod } from './runCodemod';\n\nvoid runCodemod();\n"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/runCodemod.ts","../src/utils/getOptions.ts","../src/utils/loadTransformModules.ts","../src/utils/reportManualReview.ts","../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'node:fs/promises';\n\nimport { execSync } from 'child_process';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nimport { getOptions, handleError, loadTransformModules } from './utils';\n\nconst currentFilePath = fileURLToPath(import.meta.url);\nconst currentDirPath = path.dirname(currentFilePath);\n\nasync function runCodemod(transformsDir?: string) {\n try {\n const resolvedTransformsDir =\n transformsDir ?? path.resolve(currentDirPath, '../dist/transforms');\n console.debug(`Resolved transforms directory: ${resolvedTransformsDir}`);\n\n const { transformFiles } = await loadTransformModules(resolvedTransformsDir);\n\n if (transformFiles.length === 0) {\n throw new Error(`No transform scripts found in directory: ${resolvedTransformsDir}`);\n }\n\n const resolvedTransformFiles = await Promise.all(transformFiles);\n const options = await getOptions(resolvedTransformFiles);\n\n const codemodPath = path.resolve(resolvedTransformsDir, `${options.transformFile}.js`);\n console.debug(`Resolved codemod path: ${codemodPath}`);\n\n const args = [\n '-t',\n codemodPath,\n options.targetPath,\n options.dry ? '--dry' : '',\n options.print ? '--print' : '',\n options.ignorePattern\n ? options.ignorePattern\n .split(',')\n .map((pattern) => `--ignore-pattern=${pattern.trim()}`)\n .join(' ')\n : '',\n options.gitignore ? '--gitignore' : '',\n ].filter(Boolean);\n\n const command = `npx jscodeshift ${args.join(' ')}`;\n\n console.debug(`Running: ${command}`);\n\n const reportPath = path.resolve(process.cwd(), 'codemod-report.txt');\n\n try {\n await fs.access(reportPath);\n await fs.rm(reportPath);\n console.debug(`Removed existing report file: ${reportPath}`);\n } catch {\n console.debug(`No existing report file to remove: ${reportPath}`);\n }\n\n execSync(command, { stdio: 'inherit' });\n\n try {\n const reportContent = await fs.readFile(reportPath, 'utf8');\n const lines = reportContent.split('\\n').filter(Boolean);\n if (lines.length) {\n console.log(\n `\\n⚠️ ${lines.length} manual review${lines.length > 1 ? 's are' : ' is'} required. See ${reportPath} for details.`,\n );\n } else {\n console.debug(`Report file exists but is empty: ${reportPath}`);\n }\n } catch {\n console.debug(`No report file generated - no manual reviews needed`);\n }\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error('Error running codemod:', error.message);\n } else {\n console.error('Error running codemod:', error);\n }\n if (process.env.NODE_ENV !== 'test') {\n process.exit(1);\n }\n }\n}\n\nexport { runCodemod };\n","import { confirm, input, select as list } from '@inquirer/prompts';\n\nasync function getOptions(transformFiles: string[]) {\n const args = process.argv.slice(2);\n if (args.length > 0) {\n const [transformFile, targetPath] = args;\n const dry = args.includes('--dry') || args.includes('--dry-run');\n const print = args.includes('--print');\n const ignorePatternIndex = args.findIndex((arg) => arg === '--ignore-pattern');\n let ignorePattern: string | undefined;\n if (ignorePatternIndex !== -1 && args.length > ignorePatternIndex + 1) {\n ignorePattern = args[ignorePatternIndex + 1];\n }\n const gitignore = args.includes('--gitignore');\n const noGitignore = args.includes('--no-gitignore');\n\n if (!transformFile || !transformFiles.includes(transformFile)) {\n throw new Error('Invalid transform file specified.');\n }\n if (!targetPath) {\n throw new Error('Target path cannot be empty.');\n }\n\n // If both --gitignore and --no-gitignore are specified, prioritize --gitignore\n const useGitignore = !!(gitignore || (!gitignore && !noGitignore));\n\n return { transformFile, targetPath, dry, print, ignorePattern, gitignore: useGitignore };\n }\n\n const transformFile = await list({\n message: 'Select a codemod transform to run:',\n choices: transformFiles.map((file) => ({ name: file, value: file })),\n });\n\n const targetPath = await input({\n message: 'Enter the target directory or file path to run codemod on:',\n validate: (value) => value.trim() !== '' || 'Target path cannot be empty',\n });\n\n const dry = await confirm({\n message: 'Run in dry mode (no changes written to files)?',\n default: true,\n });\n\n const print = await confirm({\n message: 'Print transformed source to console?',\n default: false,\n });\n\n const ignorePattern = await input({\n message: 'Enter ignore pattern(s) (comma separated) or leave empty:',\n validate: (value) => true,\n });\n\n const gitignore = await confirm({\n message: 'Respect .gitignore files?',\n default: true,\n });\n\n return { transformFile, targetPath, dry, print, ignorePattern, gitignore };\n}\n\nexport default getOptions;\n","import { promises as fs } from 'fs';\nimport path from 'path';\n\ninterface TransformModule {\n default: {\n default: unknown;\n };\n}\n\nasync function loadTransformModules(transformsDir: string) {\n let transformModules: Record<string, unknown> = {};\n\n const files = await fs.readdir(transformsDir);\n const transformFiles = await Promise.all(\n files\n .filter((file) => file.endsWith('.js'))\n .map(async (file) => {\n const transformPath = path.join(transformsDir, file);\n const transformModule = (await import(transformPath)) as TransformModule;\n transformModules = { ...transformModules, [file]: transformModule.default.default };\n return file.replace('.js', '');\n }),\n );\n\n return { transformModules, transformFiles };\n}\n\nexport default loadTransformModules;\n","import fs from 'node:fs/promises';\n\nimport path from 'path';\n\nconst REPORT_PATH = path.resolve(process.cwd(), 'codemod-report.txt');\n\nconst reportManualReview = async (filePath: string, message: string): Promise<void> => {\n const lineMatch = /at line (\\d+)/u.exec(message);\n const lineNumber = lineMatch?.[1];\n\n const cleanMessage = message.replace(/ at line \\d+/u, '');\n const lineInfo = lineNumber ? `:${lineNumber}` : '';\n\n await fs.appendFile(REPORT_PATH, `[${filePath}${lineInfo}] ${cleanMessage}\\n`, 'utf8');\n};\n\nexport default reportManualReview;\n","#!/usr/bin/env node\nimport { runCodemod } from './runCodemod';\n\nvoid runCodemod();\n"],"mappings":"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","names":["fs","path","transformFile","targetPath","dry","print","ignorePattern","gitignore","fs","path","path","fs"]}
@@ -0,0 +1,16 @@
1
+ import { FileInfo, API, Options } from 'jscodeshift';
2
+
3
+ declare const parser = "tsx";
4
+ /**
5
+ * This transform function modifies the Button and ActionButton components from the @transferwise/components library.
6
+ * It updates the ActionButton component to use the Button component with specific attributes and mappings.
7
+ * It also processes icon children and removes legacy props.
8
+ *
9
+ * @param {FileInfo} file - The file information object.
10
+ * @param {API} api - The API object for jscodeshift.
11
+ * @param {Options} options - The options object for jscodeshift.
12
+ * @returns {string} - The transformed source code.
13
+ */
14
+ declare const transformer: (file: FileInfo, api: API, options: Options) => string;
15
+
16
+ export { transformer as default, parser };