@openrewrite/rewrite 8.68.0-20251204-145030 → 8.68.0-20251204-171340
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/cli-utils.d.ts +69 -0
- package/dist/cli/cli-utils.d.ts.map +1 -0
- package/dist/cli/cli-utils.js +580 -0
- package/dist/cli/cli-utils.js.map +1 -0
- package/dist/cli/rewrite.d.ts +6 -0
- package/dist/cli/rewrite.d.ts.map +1 -0
- package/dist/cli/rewrite.js +196 -0
- package/dist/cli/rewrite.js.map +1 -0
- package/dist/javascript/package-json-parser.d.ts +13 -0
- package/dist/javascript/package-json-parser.d.ts.map +1 -1
- package/dist/javascript/package-json-parser.js +43 -3
- package/dist/javascript/package-json-parser.js.map +1 -1
- package/dist/javascript/search/find-dependency.d.ts.map +1 -1
- package/dist/javascript/search/find-dependency.js +4 -3
- package/dist/javascript/search/find-dependency.js.map +1 -1
- package/dist/version.txt +1 -1
- package/package.json +3 -2
- package/src/cli/cli-utils.ts +554 -0
- package/src/cli/rewrite.ts +185 -0
- package/src/javascript/package-json-parser.ts +50 -3
- package/src/javascript/search/find-dependency.ts +4 -2
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Recipe, RecipeRegistry } from '../recipe';
|
|
2
|
+
import { SourceFile } from '../tree';
|
|
3
|
+
export interface RecipeSpec {
|
|
4
|
+
packageName: string;
|
|
5
|
+
recipeName: string;
|
|
6
|
+
isLocalPath: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Parse a recipe specification in format "package:recipe" or "/path/to/module:recipe"
|
|
10
|
+
*
|
|
11
|
+
* Examples:
|
|
12
|
+
* @openrewrite/recipes-nodejs:replace-deprecated-slice
|
|
13
|
+
* some-package:my-recipe
|
|
14
|
+
* @scope/package:org.openrewrite.recipe.name
|
|
15
|
+
* /Users/dev/my-recipes:my-recipe
|
|
16
|
+
* ./local-recipes:my-recipe
|
|
17
|
+
* ../other-recipes:my-recipe
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseRecipeSpec(arg: string): RecipeSpec | null;
|
|
20
|
+
/**
|
|
21
|
+
* Parse recipe options from command line format
|
|
22
|
+
*
|
|
23
|
+
* Options can be:
|
|
24
|
+
* - key=value pairs (e.g., "text=hello")
|
|
25
|
+
* - boolean flags (just the key name, implies true)
|
|
26
|
+
* - JSON values (e.g., "items=[1,2,3]")
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseRecipeOptions(options: string[]): Record<string, any>;
|
|
29
|
+
/**
|
|
30
|
+
* Load recipes from a local directory path
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadLocalRecipes(localPath: string, registry: RecipeRegistry, verbose?: boolean): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Install a recipe package from NPM and load its recipes into the registry
|
|
35
|
+
*/
|
|
36
|
+
export declare function installRecipePackage(packageName: string, installDir: string, registry: RecipeRegistry, verbose?: boolean): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Set up shared dependencies to avoid instanceof failures when loading recipes
|
|
39
|
+
* from a separate node_modules directory
|
|
40
|
+
*/
|
|
41
|
+
export declare function setupSharedDependencies(targetModulePath: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Find a recipe by name in the registry
|
|
44
|
+
*
|
|
45
|
+
* Supports:
|
|
46
|
+
* - Exact match by FQN
|
|
47
|
+
* - Match by suffix (last segment of FQN)
|
|
48
|
+
* - Partial match (case-insensitive)
|
|
49
|
+
*
|
|
50
|
+
* Returns null if not found or if ambiguous (prints error message)
|
|
51
|
+
*/
|
|
52
|
+
export declare function findRecipe(registry: RecipeRegistry, recipeName: string, options: Record<string, any>): Recipe | null;
|
|
53
|
+
/**
|
|
54
|
+
* Discover source files in a project directory, respecting .gitignore
|
|
55
|
+
*/
|
|
56
|
+
export declare function discoverFiles(projectRoot: string, verbose?: boolean): Promise<string[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Walk a directory recursively, collecting files
|
|
59
|
+
*/
|
|
60
|
+
export declare function walkDirectory(dir: string, files: string[], ignored: Set<string>, projectRoot: string): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Check if a file is accepted for parsing based on its extension
|
|
63
|
+
*/
|
|
64
|
+
export declare function isAcceptedFile(filePath: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Parse source files using appropriate parsers
|
|
67
|
+
*/
|
|
68
|
+
export declare function parseFiles(filePaths: string[], projectRoot: string, verbose?: boolean): Promise<SourceFile[]>;
|
|
69
|
+
//# sourceMappingURL=cli-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-utils.d.ts","sourceRoot":"","sources":["../../src/cli/cli-utils.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,WAAW,CAAC;AACjD,OAAO,EAAC,UAAU,EAAC,MAAM,SAAS,CAAC;AAInC,MAAM,WAAW,UAAU;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAqB9D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAsBzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAClC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,OAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CA2Df;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,OAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CA8Df;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAgEtE;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACtB,QAAQ,EAAE,cAAc,EACxB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,MAAM,GAAG,IAAI,CA8Cf;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmEpG;AAED;;GAEG;AACH,wBAAsB,aAAa,CAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EACpB,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAcxD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC5B,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAe,GACzB,OAAO,CAAC,UAAU,EAAE,CAAC,CAuDvB"}
|
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
45
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
46
|
+
var m = o[Symbol.asyncIterator], i;
|
|
47
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
48
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
49
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
50
|
+
};
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.parseRecipeSpec = parseRecipeSpec;
|
|
53
|
+
exports.parseRecipeOptions = parseRecipeOptions;
|
|
54
|
+
exports.loadLocalRecipes = loadLocalRecipes;
|
|
55
|
+
exports.installRecipePackage = installRecipePackage;
|
|
56
|
+
exports.setupSharedDependencies = setupSharedDependencies;
|
|
57
|
+
exports.findRecipe = findRecipe;
|
|
58
|
+
exports.discoverFiles = discoverFiles;
|
|
59
|
+
exports.walkDirectory = walkDirectory;
|
|
60
|
+
exports.isAcceptedFile = isAcceptedFile;
|
|
61
|
+
exports.parseFiles = parseFiles;
|
|
62
|
+
/*
|
|
63
|
+
* Copyright 2025 the original author or authors.
|
|
64
|
+
* <p>
|
|
65
|
+
* Licensed under the Moderne Source Available License (the "License");
|
|
66
|
+
* you may not use this file except in compliance with the License.
|
|
67
|
+
* You may obtain a copy of the License at
|
|
68
|
+
* <p>
|
|
69
|
+
* https://docs.moderne.io/licensing/moderne-source-available-license
|
|
70
|
+
* <p>
|
|
71
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
72
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
73
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
74
|
+
* See the License for the specific language governing permissions and
|
|
75
|
+
* limitations under the License.
|
|
76
|
+
*/
|
|
77
|
+
const fs = __importStar(require("fs"));
|
|
78
|
+
const fsp = __importStar(require("fs/promises"));
|
|
79
|
+
const path = __importStar(require("path"));
|
|
80
|
+
const child_process_1 = require("child_process");
|
|
81
|
+
const javascript_1 = require("../javascript");
|
|
82
|
+
const json_1 = require("../json");
|
|
83
|
+
/**
|
|
84
|
+
* Parse a recipe specification in format "package:recipe" or "/path/to/module:recipe"
|
|
85
|
+
*
|
|
86
|
+
* Examples:
|
|
87
|
+
* @openrewrite/recipes-nodejs:replace-deprecated-slice
|
|
88
|
+
* some-package:my-recipe
|
|
89
|
+
* @scope/package:org.openrewrite.recipe.name
|
|
90
|
+
* /Users/dev/my-recipes:my-recipe
|
|
91
|
+
* ./local-recipes:my-recipe
|
|
92
|
+
* ../other-recipes:my-recipe
|
|
93
|
+
*/
|
|
94
|
+
function parseRecipeSpec(arg) {
|
|
95
|
+
// Format: "package:recipe" where package can be scoped (@scope/package) or a local path
|
|
96
|
+
const lastColonIndex = arg.lastIndexOf(':');
|
|
97
|
+
if (lastColonIndex === -1) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const packageName = arg.substring(0, lastColonIndex);
|
|
101
|
+
const recipeName = arg.substring(lastColonIndex + 1);
|
|
102
|
+
if (!packageName || !recipeName) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
// Check if this is a local path
|
|
106
|
+
const isLocalPath = packageName.startsWith('/') ||
|
|
107
|
+
packageName.startsWith('./') ||
|
|
108
|
+
packageName.startsWith('../') ||
|
|
109
|
+
/^[A-Za-z]:[\\/]/.test(packageName); // Windows absolute path
|
|
110
|
+
return { packageName, recipeName, isLocalPath };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse recipe options from command line format
|
|
114
|
+
*
|
|
115
|
+
* Options can be:
|
|
116
|
+
* - key=value pairs (e.g., "text=hello")
|
|
117
|
+
* - boolean flags (just the key name, implies true)
|
|
118
|
+
* - JSON values (e.g., "items=[1,2,3]")
|
|
119
|
+
*/
|
|
120
|
+
function parseRecipeOptions(options) {
|
|
121
|
+
const result = {};
|
|
122
|
+
for (const opt of options) {
|
|
123
|
+
const eqIndex = opt.indexOf('=');
|
|
124
|
+
if (eqIndex === -1) {
|
|
125
|
+
// Boolean flag
|
|
126
|
+
result[opt] = true;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const key = opt.substring(0, eqIndex);
|
|
130
|
+
const value = opt.substring(eqIndex + 1);
|
|
131
|
+
// Try to parse as JSON for complex types
|
|
132
|
+
try {
|
|
133
|
+
result[key] = JSON.parse(value);
|
|
134
|
+
}
|
|
135
|
+
catch (_a) {
|
|
136
|
+
result[key] = value;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Load recipes from a local directory path
|
|
144
|
+
*/
|
|
145
|
+
function loadLocalRecipes(localPath_1, registry_1) {
|
|
146
|
+
return __awaiter(this, arguments, void 0, function* (localPath, registry, verbose = false) {
|
|
147
|
+
// Resolve the path
|
|
148
|
+
const resolvedPath = path.resolve(localPath);
|
|
149
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
150
|
+
throw new Error(`Local path does not exist: ${resolvedPath}`);
|
|
151
|
+
}
|
|
152
|
+
// Check if it's a directory or file
|
|
153
|
+
const stat = fs.statSync(resolvedPath);
|
|
154
|
+
let modulePath;
|
|
155
|
+
if (stat.isDirectory()) {
|
|
156
|
+
// Look for package.json to find the main entry point
|
|
157
|
+
const packageJsonPath = path.join(resolvedPath, 'package.json');
|
|
158
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
159
|
+
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
160
|
+
// Use the main field, or default to dist/index.js
|
|
161
|
+
const main = pkg.main || 'dist/index.js';
|
|
162
|
+
modulePath = path.join(resolvedPath, main);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// Try common entry points
|
|
166
|
+
const candidates = ['dist/index.js', 'index.js', 'src/index.ts'];
|
|
167
|
+
const found = candidates.find(c => fs.existsSync(path.join(resolvedPath, c)));
|
|
168
|
+
if (found) {
|
|
169
|
+
modulePath = path.join(resolvedPath, found);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
throw new Error(`Cannot find entry point in ${resolvedPath}. Expected package.json with main field or dist/index.js`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
modulePath = resolvedPath;
|
|
178
|
+
}
|
|
179
|
+
if (!fs.existsSync(modulePath)) {
|
|
180
|
+
throw new Error(`Module entry point not found: ${modulePath}. Did you run 'npm run build'?`);
|
|
181
|
+
}
|
|
182
|
+
if (verbose) {
|
|
183
|
+
console.log(`Loading recipes from ${modulePath}...`);
|
|
184
|
+
}
|
|
185
|
+
// Set up shared dependencies
|
|
186
|
+
setupSharedDependencies(modulePath);
|
|
187
|
+
const recipeModule = require(modulePath);
|
|
188
|
+
if (typeof recipeModule.activate !== 'function') {
|
|
189
|
+
throw new Error(`${localPath} does not export an 'activate' function`);
|
|
190
|
+
}
|
|
191
|
+
const activatePromise = recipeModule.activate(registry);
|
|
192
|
+
if (activatePromise instanceof Promise) {
|
|
193
|
+
yield activatePromise;
|
|
194
|
+
}
|
|
195
|
+
if (verbose) {
|
|
196
|
+
console.log(`Loaded ${registry.all.size} recipes`);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Install a recipe package from NPM and load its recipes into the registry
|
|
202
|
+
*/
|
|
203
|
+
function installRecipePackage(packageName_1, installDir_1, registry_1) {
|
|
204
|
+
return __awaiter(this, arguments, void 0, function* (packageName, installDir, registry, verbose = false) {
|
|
205
|
+
// Ensure directory exists
|
|
206
|
+
if (!fs.existsSync(installDir)) {
|
|
207
|
+
fs.mkdirSync(installDir, { recursive: true });
|
|
208
|
+
}
|
|
209
|
+
// Check if package.json exists, if not create one
|
|
210
|
+
const packageJsonPath = path.join(installDir, 'package.json');
|
|
211
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
212
|
+
const packageJson = {
|
|
213
|
+
name: 'openrewrite-recipes',
|
|
214
|
+
version: '1.0.0',
|
|
215
|
+
description: 'OpenRewrite recipe installation',
|
|
216
|
+
private: true
|
|
217
|
+
};
|
|
218
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
219
|
+
if (verbose) {
|
|
220
|
+
console.log('Created package.json for recipe dependencies');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Install the package
|
|
224
|
+
if (verbose) {
|
|
225
|
+
console.log(`Installing ${packageName}...`);
|
|
226
|
+
}
|
|
227
|
+
yield new Promise((resolve, reject) => {
|
|
228
|
+
const child = (0, child_process_1.spawn)('npm', ['install', packageName, '--no-fund'], {
|
|
229
|
+
cwd: installDir,
|
|
230
|
+
stdio: verbose ? 'inherit' : 'pipe'
|
|
231
|
+
});
|
|
232
|
+
child.on('error', reject);
|
|
233
|
+
child.on('close', (exitCode) => {
|
|
234
|
+
if (exitCode === 0) {
|
|
235
|
+
resolve();
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
reject(new Error(`npm install exited with code ${exitCode}`));
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
// Load the module and activate recipes
|
|
243
|
+
const resolvedPath = require.resolve(path.join(installDir, 'node_modules', packageName));
|
|
244
|
+
// Set up shared dependencies to avoid instanceof failures
|
|
245
|
+
setupSharedDependencies(resolvedPath);
|
|
246
|
+
const recipeModule = require(resolvedPath);
|
|
247
|
+
if (typeof recipeModule.activate !== 'function') {
|
|
248
|
+
throw new Error(`${packageName} does not export an 'activate' function`);
|
|
249
|
+
}
|
|
250
|
+
const activatePromise = recipeModule.activate(registry);
|
|
251
|
+
if (activatePromise instanceof Promise) {
|
|
252
|
+
yield activatePromise;
|
|
253
|
+
}
|
|
254
|
+
if (verbose) {
|
|
255
|
+
console.log(`Loaded ${registry.all.size} recipes`);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Set up shared dependencies to avoid instanceof failures when loading recipes
|
|
261
|
+
* from a separate node_modules directory
|
|
262
|
+
*/
|
|
263
|
+
function setupSharedDependencies(targetModulePath) {
|
|
264
|
+
const sharedDeps = ['@openrewrite/rewrite'];
|
|
265
|
+
const targetDir = path.dirname(targetModulePath);
|
|
266
|
+
for (const depName of sharedDeps) {
|
|
267
|
+
try {
|
|
268
|
+
const hostPackageEntry = require.resolve(depName);
|
|
269
|
+
// Find host package root
|
|
270
|
+
let hostPackageRoot = path.dirname(hostPackageEntry);
|
|
271
|
+
while (hostPackageRoot !== path.dirname(hostPackageRoot)) {
|
|
272
|
+
const pkgJsonPath = path.join(hostPackageRoot, 'package.json');
|
|
273
|
+
if (fs.existsSync(pkgJsonPath)) {
|
|
274
|
+
try {
|
|
275
|
+
const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8'));
|
|
276
|
+
if (pkg.name === depName) {
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (_a) {
|
|
281
|
+
// Not a valid package.json
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
hostPackageRoot = path.dirname(hostPackageRoot);
|
|
285
|
+
}
|
|
286
|
+
// Find target package root
|
|
287
|
+
let targetPackageRoot;
|
|
288
|
+
let searchDir = targetDir;
|
|
289
|
+
while (searchDir !== path.dirname(searchDir)) {
|
|
290
|
+
const nodeModulesPath = path.join(searchDir, 'node_modules', ...depName.split('/'));
|
|
291
|
+
if (fs.existsSync(nodeModulesPath)) {
|
|
292
|
+
const pkgJsonPath = path.join(nodeModulesPath, 'package.json');
|
|
293
|
+
if (fs.existsSync(pkgJsonPath)) {
|
|
294
|
+
try {
|
|
295
|
+
const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8'));
|
|
296
|
+
if (pkg.name === depName) {
|
|
297
|
+
targetPackageRoot = nodeModulesPath;
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch (_b) {
|
|
302
|
+
// Not a valid package.json
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
searchDir = path.dirname(searchDir);
|
|
307
|
+
}
|
|
308
|
+
if (!targetPackageRoot || hostPackageRoot === targetPackageRoot) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
// Map all cached modules
|
|
312
|
+
const hostPrefix = hostPackageRoot + path.sep;
|
|
313
|
+
for (const cachedPath of Object.keys(require.cache)) {
|
|
314
|
+
if (cachedPath.startsWith(hostPrefix)) {
|
|
315
|
+
const relativePath = cachedPath.substring(hostPrefix.length);
|
|
316
|
+
const targetPath = path.join(targetPackageRoot, relativePath);
|
|
317
|
+
require.cache[targetPath] = require.cache[cachedPath];
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
catch (_c) {
|
|
322
|
+
// Failed to set up shared dependency
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Find a recipe by name in the registry
|
|
328
|
+
*
|
|
329
|
+
* Supports:
|
|
330
|
+
* - Exact match by FQN
|
|
331
|
+
* - Match by suffix (last segment of FQN)
|
|
332
|
+
* - Partial match (case-insensitive)
|
|
333
|
+
*
|
|
334
|
+
* Returns null if not found or if ambiguous (prints error message)
|
|
335
|
+
*/
|
|
336
|
+
function findRecipe(registry, recipeName, options) {
|
|
337
|
+
// Try exact match first
|
|
338
|
+
const RecipeClass = registry.all.get(recipeName);
|
|
339
|
+
if (RecipeClass) {
|
|
340
|
+
return new RecipeClass(options);
|
|
341
|
+
}
|
|
342
|
+
// Try matching by suffix (last segment of FQN)
|
|
343
|
+
const matches = [];
|
|
344
|
+
for (const name of registry.all.keys()) {
|
|
345
|
+
if (name.endsWith('.' + recipeName) || name.endsWith('-' + recipeName) ||
|
|
346
|
+
name === recipeName || name.toLowerCase().endsWith(recipeName.toLowerCase())) {
|
|
347
|
+
matches.push(name);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if (matches.length === 0) {
|
|
351
|
+
// Try partial match
|
|
352
|
+
for (const name of registry.all.keys()) {
|
|
353
|
+
if (name.toLowerCase().includes(recipeName.toLowerCase())) {
|
|
354
|
+
matches.push(name);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
if (matches.length === 0) {
|
|
359
|
+
console.error(`Recipe not found: ${recipeName}`);
|
|
360
|
+
console.error('\nAvailable recipes:');
|
|
361
|
+
for (const name of [...registry.all.keys()].sort()) {
|
|
362
|
+
console.error(` ${name}`);
|
|
363
|
+
}
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
if (matches.length > 1) {
|
|
367
|
+
console.error(`Ambiguous recipe name: ${recipeName}`);
|
|
368
|
+
console.error('\nMatching recipes:');
|
|
369
|
+
for (const name of matches.sort()) {
|
|
370
|
+
console.error(` ${name}`);
|
|
371
|
+
}
|
|
372
|
+
console.error('\nPlease use a more specific recipe name.');
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
const MatchedRecipeClass = registry.all.get(matches[0]);
|
|
376
|
+
return new MatchedRecipeClass(options);
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Discover source files in a project directory, respecting .gitignore
|
|
380
|
+
*/
|
|
381
|
+
function discoverFiles(projectRoot_1) {
|
|
382
|
+
return __awaiter(this, arguments, void 0, function* (projectRoot, verbose = false) {
|
|
383
|
+
const files = [];
|
|
384
|
+
if (verbose) {
|
|
385
|
+
console.log(`Discovering files in ${projectRoot}...`);
|
|
386
|
+
}
|
|
387
|
+
// Get list of git-ignored files
|
|
388
|
+
const ignoredFiles = new Set();
|
|
389
|
+
try {
|
|
390
|
+
const result = (0, child_process_1.spawnSync)('git', ['ls-files', '--ignored', '--exclude-standard', '-o'], {
|
|
391
|
+
cwd: projectRoot,
|
|
392
|
+
encoding: 'utf8'
|
|
393
|
+
});
|
|
394
|
+
if (result.stdout) {
|
|
395
|
+
for (const line of result.stdout.split('\n')) {
|
|
396
|
+
if (line.trim()) {
|
|
397
|
+
ignoredFiles.add(path.join(projectRoot, line.trim()));
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
catch (_a) {
|
|
403
|
+
// Git not available or not a git repository
|
|
404
|
+
}
|
|
405
|
+
// Get tracked and untracked (but not ignored) files
|
|
406
|
+
const trackedFiles = new Set();
|
|
407
|
+
try {
|
|
408
|
+
// Get tracked files
|
|
409
|
+
const tracked = (0, child_process_1.spawnSync)('git', ['ls-files'], {
|
|
410
|
+
cwd: projectRoot,
|
|
411
|
+
encoding: 'utf8'
|
|
412
|
+
});
|
|
413
|
+
if (tracked.stdout) {
|
|
414
|
+
for (const line of tracked.stdout.split('\n')) {
|
|
415
|
+
if (line.trim()) {
|
|
416
|
+
trackedFiles.add(path.join(projectRoot, line.trim()));
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// Get untracked but not ignored files
|
|
421
|
+
const untracked = (0, child_process_1.spawnSync)('git', ['ls-files', '--others', '--exclude-standard'], {
|
|
422
|
+
cwd: projectRoot,
|
|
423
|
+
encoding: 'utf8'
|
|
424
|
+
});
|
|
425
|
+
if (untracked.stdout) {
|
|
426
|
+
for (const line of untracked.stdout.split('\n')) {
|
|
427
|
+
if (line.trim()) {
|
|
428
|
+
trackedFiles.add(path.join(projectRoot, line.trim()));
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
catch (_b) {
|
|
434
|
+
// Not a git repository, fall back to recursive directory scan
|
|
435
|
+
yield walkDirectory(projectRoot, files, ignoredFiles, projectRoot);
|
|
436
|
+
return files.filter(isAcceptedFile);
|
|
437
|
+
}
|
|
438
|
+
// Filter to accepted file types
|
|
439
|
+
for (const file of trackedFiles) {
|
|
440
|
+
if (!ignoredFiles.has(file) && isAcceptedFile(file)) {
|
|
441
|
+
files.push(file);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return files;
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Walk a directory recursively, collecting files
|
|
449
|
+
*/
|
|
450
|
+
function walkDirectory(dir, files, ignored, projectRoot) {
|
|
451
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
452
|
+
const entries = yield fsp.readdir(dir, { withFileTypes: true });
|
|
453
|
+
for (const entry of entries) {
|
|
454
|
+
const fullPath = path.join(dir, entry.name);
|
|
455
|
+
// Skip hidden files and common ignore patterns
|
|
456
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist' ||
|
|
457
|
+
entry.name === 'build' || entry.name === 'coverage') {
|
|
458
|
+
continue;
|
|
459
|
+
}
|
|
460
|
+
if (ignored.has(fullPath)) {
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
if (entry.isDirectory()) {
|
|
464
|
+
yield walkDirectory(fullPath, files, ignored, projectRoot);
|
|
465
|
+
}
|
|
466
|
+
else if (entry.isFile() && isAcceptedFile(fullPath)) {
|
|
467
|
+
files.push(fullPath);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Check if a file is accepted for parsing based on its extension
|
|
474
|
+
*/
|
|
475
|
+
function isAcceptedFile(filePath) {
|
|
476
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
477
|
+
// JavaScript/TypeScript files
|
|
478
|
+
if (['.js', '.jsx', '.ts', '.tsx', '.mjs', '.mts', '.cjs', '.cts'].includes(ext)) {
|
|
479
|
+
return true;
|
|
480
|
+
}
|
|
481
|
+
// JSON files (including package.json which gets special parsing)
|
|
482
|
+
if (ext === '.json') {
|
|
483
|
+
return true;
|
|
484
|
+
}
|
|
485
|
+
return false;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Parse source files using appropriate parsers
|
|
489
|
+
*/
|
|
490
|
+
function parseFiles(filePaths_1, projectRoot_1) {
|
|
491
|
+
return __awaiter(this, arguments, void 0, function* (filePaths, projectRoot, verbose = false) {
|
|
492
|
+
var _a, e_1, _b, _c, _d, e_2, _e, _f, _g, e_3, _h, _j;
|
|
493
|
+
const parsed = [];
|
|
494
|
+
// Group files by type
|
|
495
|
+
const jsFiles = [];
|
|
496
|
+
const packageJsonFiles = [];
|
|
497
|
+
const jsonFiles = [];
|
|
498
|
+
for (const filePath of filePaths) {
|
|
499
|
+
const basename = path.basename(filePath);
|
|
500
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
501
|
+
if (basename === 'package.json') {
|
|
502
|
+
packageJsonFiles.push(filePath);
|
|
503
|
+
}
|
|
504
|
+
else if (['.js', '.jsx', '.ts', '.tsx', '.mjs', '.mts', '.cjs', '.cts'].includes(ext)) {
|
|
505
|
+
jsFiles.push(filePath);
|
|
506
|
+
}
|
|
507
|
+
else if (ext === '.json') {
|
|
508
|
+
jsonFiles.push(filePath);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
// Parse JavaScript/TypeScript files
|
|
512
|
+
if (jsFiles.length > 0) {
|
|
513
|
+
if (verbose) {
|
|
514
|
+
console.log(`Parsing ${jsFiles.length} JavaScript/TypeScript files...`);
|
|
515
|
+
}
|
|
516
|
+
const jsParser = new javascript_1.JavaScriptParser({ relativeTo: projectRoot });
|
|
517
|
+
try {
|
|
518
|
+
for (var _k = true, _l = __asyncValues(jsParser.parse(...jsFiles)), _m; _m = yield _l.next(), _a = _m.done, !_a; _k = true) {
|
|
519
|
+
_c = _m.value;
|
|
520
|
+
_k = false;
|
|
521
|
+
const sf = _c;
|
|
522
|
+
parsed.push(sf);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
526
|
+
finally {
|
|
527
|
+
try {
|
|
528
|
+
if (!_k && !_a && (_b = _l.return)) yield _b.call(_l);
|
|
529
|
+
}
|
|
530
|
+
finally { if (e_1) throw e_1.error; }
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
// Parse package.json files
|
|
534
|
+
if (packageJsonFiles.length > 0) {
|
|
535
|
+
if (verbose) {
|
|
536
|
+
console.log(`Parsing ${packageJsonFiles.length} package.json files...`);
|
|
537
|
+
}
|
|
538
|
+
const pkgParser = new javascript_1.PackageJsonParser({ relativeTo: projectRoot });
|
|
539
|
+
try {
|
|
540
|
+
for (var _o = true, _p = __asyncValues(pkgParser.parse(...packageJsonFiles)), _q; _q = yield _p.next(), _d = _q.done, !_d; _o = true) {
|
|
541
|
+
_f = _q.value;
|
|
542
|
+
_o = false;
|
|
543
|
+
const sf = _f;
|
|
544
|
+
parsed.push(sf);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
548
|
+
finally {
|
|
549
|
+
try {
|
|
550
|
+
if (!_o && !_d && (_e = _p.return)) yield _e.call(_p);
|
|
551
|
+
}
|
|
552
|
+
finally { if (e_2) throw e_2.error; }
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
// Parse other JSON files
|
|
556
|
+
if (jsonFiles.length > 0) {
|
|
557
|
+
if (verbose) {
|
|
558
|
+
console.log(`Parsing ${jsonFiles.length} JSON files...`);
|
|
559
|
+
}
|
|
560
|
+
const jsonParser = new json_1.JsonParser({ relativeTo: projectRoot });
|
|
561
|
+
try {
|
|
562
|
+
for (var _r = true, _s = __asyncValues(jsonParser.parse(...jsonFiles)), _t; _t = yield _s.next(), _g = _t.done, !_g; _r = true) {
|
|
563
|
+
_j = _t.value;
|
|
564
|
+
_r = false;
|
|
565
|
+
const sf = _j;
|
|
566
|
+
parsed.push(sf);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
570
|
+
finally {
|
|
571
|
+
try {
|
|
572
|
+
if (!_r && !_g && (_h = _s.return)) yield _h.call(_s);
|
|
573
|
+
}
|
|
574
|
+
finally { if (e_3) throw e_3.error; }
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
return parsed;
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=cli-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-utils.js","sourceRoot":"","sources":["../../src/cli/cli-utils.ts"],"names":[],"mappings":"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"}
|