@wise/wds-codemods 0.0.1-experimental-17c5d52 → 0.0.1-experimental-a5131aa

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/dist/index.js +133 -134
  2. package/dist/index.js.map +1 -1
  3. package/dist/reportManualReview-DQ00-OKx.js +50 -0
  4. package/dist/reportManualReview-DQ00-OKx.js.map +1 -0
  5. package/dist/transforms/button.js +493 -566
  6. package/dist/transforms/button.js.map +1 -1
  7. package/package.json +28 -23
  8. package/.changeset/better-impalas-drop.md +0 -5
  9. package/.changeset/config.json +0 -13
  10. package/.changeset/quick-mails-joke.md +0 -128
  11. package/.github/CODEOWNERS +0 -1
  12. package/.github/actions/bootstrap/action.yml +0 -49
  13. package/.github/actions/commitlint/action.yml +0 -27
  14. package/.github/actions/test/action.yml +0 -23
  15. package/.github/workflows/cd-cd.yml +0 -127
  16. package/.github/workflows/renovate.yml +0 -16
  17. package/.husky/commit-msg +0 -1
  18. package/.husky/pre-commit +0 -1
  19. package/.nvmrc +0 -1
  20. package/.prettierignore +0 -1
  21. package/.prettierrc.js +0 -5
  22. package/DEVELOPER.md +0 -783
  23. package/babel.config.js +0 -28
  24. package/commitlint.config.js +0 -3
  25. package/dist/index.d.ts +0 -1
  26. package/dist/transforms/button.d.ts +0 -16
  27. package/eslint.config.js +0 -15
  28. package/jest.config.js +0 -9
  29. package/mkdocs.yml +0 -4
  30. package/renovate.json +0 -9
  31. package/scripts/build.sh +0 -10
  32. package/src/__tests__/runCodemod.test.ts +0 -96
  33. package/src/index.ts +0 -4
  34. package/src/runCodemod.ts +0 -88
  35. package/src/transforms/button/__tests__/button.test.tsx +0 -153
  36. package/src/transforms/button/button.ts +0 -418
  37. package/src/transforms/helpers/__tests__/createTestTransform.test.ts +0 -27
  38. package/src/transforms/helpers/__tests__/hasImport.test.ts +0 -52
  39. package/src/transforms/helpers/__tests__/iconUtils.test.ts +0 -207
  40. package/src/transforms/helpers/__tests__/jsxElementUtils.test.ts +0 -130
  41. package/src/transforms/helpers/__tests__/jsxReportingUtils.test.ts +0 -265
  42. package/src/transforms/helpers/createTestTransform.ts +0 -18
  43. package/src/transforms/helpers/hasImport.ts +0 -60
  44. package/src/transforms/helpers/iconUtils.ts +0 -87
  45. package/src/transforms/helpers/index.ts +0 -5
  46. package/src/transforms/helpers/jsxElementUtils.ts +0 -67
  47. package/src/transforms/helpers/jsxReportingUtils.ts +0 -224
  48. package/src/utils/__tests__/getOptions.test.ts +0 -170
  49. package/src/utils/__tests__/handleError.test.ts +0 -18
  50. package/src/utils/__tests__/loadTransformModules.test.ts +0 -51
  51. package/src/utils/__tests__/reportManualReview.test.ts +0 -42
  52. package/src/utils/getOptions.ts +0 -63
  53. package/src/utils/handleError.ts +0 -6
  54. package/src/utils/index.ts +0 -4
  55. package/src/utils/loadTransformModules.ts +0 -28
  56. package/src/utils/reportManualReview.ts +0 -17
  57. package/test-button.tsx +0 -230
  58. package/test-file.js +0 -2
  59. package/tsconfig.json +0 -14
  60. package/tsup.config.js +0 -13
package/dist/index.js CHANGED
@@ -1,146 +1,145 @@
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"));
2
9
 
3
- // src/runCodemod.ts
4
- import fs2 from "node: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";
10
+ //#region src/utils/getOptions.ts
11
11
  async function getOptions(transformFiles) {
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 };
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
+ };
58
69
  }
59
- var getOptions_default = getOptions;
60
70
 
61
- // src/utils/loadTransformModules.ts
62
- import { promises as fs } from "fs";
63
- import path from "path";
71
+ //#endregion
72
+ //#region src/utils/loadTransformModules.ts
64
73
  async function loadTransformModules(transformsDir) {
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 };
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
+ };
76
89
  }
77
- var loadTransformModules_default = loadTransformModules;
78
-
79
- // src/utils/reportManualReview.ts
80
- import path2 from "path";
81
- var REPORT_PATH = path2.resolve(process.cwd(), "codemod-report.txt");
82
90
 
83
- // src/runCodemod.ts
84
- var currentFilePath = fileURLToPath(import.meta.url);
85
- var currentDirPath = path3.dirname(currentFilePath);
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);
86
95
  async function runCodemod(transformsDir) {
87
- try {
88
- const resolvedTransformsDir = transformsDir ?? path3.resolve(currentDirPath, "../dist/transforms");
89
- console.debug(`Resolved transforms directory: ${resolvedTransformsDir}`);
90
- const { transformFiles } = await loadTransformModules_default(resolvedTransformsDir);
91
- if (transformFiles.length === 0) {
92
- throw new Error(`No transform scripts found in directory: ${resolvedTransformsDir}`);
93
- }
94
- const resolvedTransformFiles = await Promise.all(transformFiles);
95
- const options = await getOptions_default(resolvedTransformFiles);
96
- const codemodPath = path3.resolve(resolvedTransformsDir, `${options.transformFile}.js`);
97
- console.debug(`Resolved codemod path: ${codemodPath}`);
98
- const args = [
99
- "-t",
100
- codemodPath,
101
- options.targetPath,
102
- options.dry ? "--dry" : "",
103
- options.print ? "--print" : "",
104
- options.ignorePattern ? options.ignorePattern.split(",").map((pattern) => `--ignore-pattern=${pattern.trim()}`).join(" ") : "",
105
- options.gitignore ? "--gitignore" : ""
106
- ].filter(Boolean);
107
- const command = `npx jscodeshift ${args.join(" ")}`;
108
- console.debug(`Running: ${command}`);
109
- const reportPath = path3.resolve(process.cwd(), "codemod-report.txt");
110
- try {
111
- await fs2.access(reportPath);
112
- await fs2.rm(reportPath);
113
- console.debug(`Removed existing report file: ${reportPath}`);
114
- } catch {
115
- console.debug(`No existing report file to remove: ${reportPath}`);
116
- }
117
- execSync(command, { stdio: "inherit" });
118
- try {
119
- const reportContent = await fs2.readFile(reportPath, "utf8");
120
- const lines = reportContent.split("\n").filter(Boolean);
121
- if (lines.length) {
122
- console.log(
123
- `
124
- \u26A0\uFE0F ${lines.length} manual review${lines.length > 1 ? "s are" : " is"} required. See ${reportPath} for details.`
125
- );
126
- } else {
127
- console.debug(`Report file exists but is empty: ${reportPath}`);
128
- }
129
- } catch {
130
- console.debug(`No report file generated - no manual reviews needed`);
131
- }
132
- } catch (error) {
133
- if (error instanceof Error) {
134
- console.error("Error running codemod:", error.message);
135
- } else {
136
- console.error("Error running codemod:", error);
137
- }
138
- if (process.env.NODE_ENV !== "test") {
139
- process.exit(1);
140
- }
141
- }
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
+ }
142
138
  }
143
139
 
144
- // src/index.ts
145
- void runCodemod();
140
+ //#endregion
141
+ //#region src/index.ts
142
+ runCodemod();
143
+
144
+ //#endregion
146
145
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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","path","path","fs"]}
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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"}
@@ -0,0 +1,50 @@
1
+ //#region rolldown:runtime
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+
23
+ //#endregion
24
+ const node_fs_promises = __toESM(require("node:fs/promises"));
25
+ const node_path = __toESM(require("node:path"));
26
+
27
+ //#region src/utils/reportManualReview.ts
28
+ const REPORT_PATH = node_path.default.resolve(process.cwd(), "codemod-report.txt");
29
+ const reportManualReview = async (filePath, message) => {
30
+ const lineMatch = /at line (\d+)/u.exec(message);
31
+ const lineNumber = lineMatch?.[1];
32
+ const cleanMessage = message.replace(/ at line \d+/u, "");
33
+ const lineInfo = lineNumber ? `:${lineNumber}` : "";
34
+ await node_fs_promises.default.appendFile(REPORT_PATH, `[${filePath}${lineInfo}] ${cleanMessage}\n`, "utf8");
35
+ };
36
+
37
+ //#endregion
38
+ Object.defineProperty(exports, '__toESM', {
39
+ enumerable: true,
40
+ get: function () {
41
+ return __toESM;
42
+ }
43
+ });
44
+ Object.defineProperty(exports, 'reportManualReview', {
45
+ enumerable: true,
46
+ get: function () {
47
+ return reportManualReview;
48
+ }
49
+ });
50
+ //# sourceMappingURL=reportManualReview-DQ00-OKx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportManualReview-DQ00-OKx.js","names":["path","fs"],"sources":["../src/utils/reportManualReview.ts"],"sourcesContent":["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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,cAAcA,kBAAK,QAAQ,QAAQ,OAAO;AAEhD,MAAM,qBAAqB,OAAO,UAAkB,YAAmC;CACrF,MAAM,YAAY,iBAAiB,KAAK;CACxC,MAAM,aAAa,YAAY;CAE/B,MAAM,eAAe,QAAQ,QAAQ,iBAAiB;CACtD,MAAM,WAAW,aAAa,IAAI,eAAe;AAEjD,OAAMC,yBAAG,WAAW,aAAa,IAAI,WAAW,SAAS,IAAI,aAAa,KAAK;AAChF"}