@reliverse/dler 1.7.152 → 1.7.153
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/bin/impl/auth/impl/init.d.ts +2 -2
- package/bin/impl/build/impl.d.ts +7 -1
- package/bin/impl/build/impl.js +161 -1
- package/bin/impl/config/constants.d.ts +1 -1
- package/bin/impl/config/constants.js +1 -1
- package/bin/impl/providers/better-t-stack/types.d.ts +7 -7
- package/bin/impl/pub/impl.d.ts +6 -1
- package/bin/impl/pub/impl.js +176 -2
- package/bin/impl/schema/mod.d.ts +140 -0
- package/bin/impl/schema/mod.js +22 -0
- package/bin/impl/utils/workspace-prompt.d.ts +9 -0
- package/bin/impl/utils/workspace-prompt.js +46 -0
- package/bin/impl/utils/workspace-utils.d.ts +28 -0
- package/bin/impl/utils/workspace-utils.js +127 -0
- package/bin/mod.d.ts +2 -9
- package/bin/mod.js +9 -23
- package/package.json +2 -1
- package/bin/impl/migrate/codemods/anything-bun.d.ts +0 -5
- package/bin/impl/migrate/codemods/anything-bun.js +0 -577
- package/bin/impl/migrate/codemods/commander-rempts.d.ts +0 -4
- package/bin/impl/migrate/codemods/commander-rempts.js +0 -250
- package/bin/impl/migrate/codemods/console-relinka.d.ts +0 -3
- package/bin/impl/migrate/codemods/console-relinka.js +0 -142
- package/bin/impl/migrate/codemods/fs-relifso.d.ts +0 -8
- package/bin/impl/migrate/codemods/fs-relifso.js +0 -156
- package/bin/impl/migrate/codemods/monorepo-catalog.d.ts +0 -96
- package/bin/impl/migrate/codemods/monorepo-catalog.js +0 -517
- package/bin/impl/migrate/codemods/nodenext-bundler.d.ts +0 -10
- package/bin/impl/migrate/codemods/nodenext-bundler.js +0 -222
- package/bin/impl/migrate/codemods/path-pathkit.d.ts +0 -8
- package/bin/impl/migrate/codemods/path-pathkit.js +0 -143
- package/bin/impl/migrate/codemods/readdir-glob.d.ts +0 -8
- package/bin/impl/migrate/codemods/readdir-glob.js +0 -133
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import { glob } from "tinyglobby";
|
|
2
|
-
import { ModuleKind, Node, Project, ScriptTarget, SyntaxKind } from "ts-morph";
|
|
3
|
-
function parseCommanderFlags(flags) {
|
|
4
|
-
const parts = flags.split(/[\s,]+/).filter(Boolean);
|
|
5
|
-
let longName = "";
|
|
6
|
-
let shortName;
|
|
7
|
-
let takesValue = false;
|
|
8
|
-
for (const part of parts) {
|
|
9
|
-
if (part.startsWith("--")) {
|
|
10
|
-
longName = part.substring(2);
|
|
11
|
-
} else if (part.startsWith("-") && part.length === 2) {
|
|
12
|
-
shortName = part.substring(1);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
if (flags.includes("<") || flags.includes("[")) {
|
|
16
|
-
takesValue = true;
|
|
17
|
-
longName = longName.replace(/[<[].*/, "").trim();
|
|
18
|
-
}
|
|
19
|
-
if (!longName && shortName) {
|
|
20
|
-
if (flags.includes(`<${shortName}>`)) takesValue = true;
|
|
21
|
-
longName = shortName;
|
|
22
|
-
}
|
|
23
|
-
if (!longName) {
|
|
24
|
-
throw new Error(`Could not parse flags: ${flags}`);
|
|
25
|
-
}
|
|
26
|
-
return { longName, shortName, takesValue };
|
|
27
|
-
}
|
|
28
|
-
function getDefaultValueText(node) {
|
|
29
|
-
if (!node) return;
|
|
30
|
-
if (Node.isLiteralExpression(node)) {
|
|
31
|
-
return node.getText();
|
|
32
|
-
}
|
|
33
|
-
if (Node.isIdentifier(node) || Node.isPropertyAccessExpression(node)) {
|
|
34
|
-
return node.getText();
|
|
35
|
-
}
|
|
36
|
-
if (Node.isCallExpression(node)) {
|
|
37
|
-
return node.getText();
|
|
38
|
-
}
|
|
39
|
-
if (Node.isPrefixUnaryExpression(node)) {
|
|
40
|
-
return node.getText();
|
|
41
|
-
}
|
|
42
|
-
console.warn(`Unhandled default value type: ${node.getKindName()}, text: ${node.getText()}`);
|
|
43
|
-
return node.getText();
|
|
44
|
-
}
|
|
45
|
-
async function transformCommand(varDecl, info, sourceFile) {
|
|
46
|
-
const commandName = info.commandName;
|
|
47
|
-
if (!commandName) {
|
|
48
|
-
console.warn("No command name found");
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
let actionBodyText = "";
|
|
52
|
-
if (info.actionFunction) {
|
|
53
|
-
if (Node.isArrowFunction(info.actionFunction) || Node.isFunctionExpression(info.actionFunction) || Node.isFunctionDeclaration(info.actionFunction)) {
|
|
54
|
-
const body = info.actionFunction.getBody();
|
|
55
|
-
if (body) {
|
|
56
|
-
actionBodyText = body.getText();
|
|
57
|
-
if (Node.isBlock(body)) {
|
|
58
|
-
actionBodyText = actionBodyText.slice(1, -1).trim();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
} else {
|
|
62
|
-
console.warn(`Unhandled action function type: ${info.actionFunction.getKindName()}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
info.options.reverse();
|
|
66
|
-
if (info.actionFunctionParam) {
|
|
67
|
-
const paramRegex = new RegExp(`\\b${info.actionFunctionParam}\\b`, "g");
|
|
68
|
-
actionBodyText = actionBodyText.replace(paramRegex, "args");
|
|
69
|
-
}
|
|
70
|
-
const argsProperties = info.options.map((opt) => {
|
|
71
|
-
const defaultValueStr = opt.defaultValue ? `,
|
|
72
|
-
default: ${String(opt.defaultValue)}` : "";
|
|
73
|
-
const requiredStr = opt.required ? ",\n required: true" : "";
|
|
74
|
-
return ` ${opt.name}: {
|
|
75
|
-
type: "${opt.type}",
|
|
76
|
-
description: "${opt.description}"${defaultValueStr}${requiredStr}
|
|
77
|
-
}`;
|
|
78
|
-
}).join(",\n");
|
|
79
|
-
const defineCommandText = `
|
|
80
|
-
export const ${varDecl.getName()} = defineCommand({
|
|
81
|
-
meta: {
|
|
82
|
-
name: "${commandName}",
|
|
83
|
-
version: "${info.version || "1.0.0"}",
|
|
84
|
-
description: "${info.description || "Migrated from Commander"}",
|
|
85
|
-
},
|
|
86
|
-
args: {
|
|
87
|
-
${argsProperties}
|
|
88
|
-
},
|
|
89
|
-
async run({ args }) {
|
|
90
|
-
${actionBodyText}
|
|
91
|
-
},
|
|
92
|
-
});
|
|
93
|
-
// Add runMain at the end of the file
|
|
94
|
-
await runMain(${varDecl.getName()});
|
|
95
|
-
`;
|
|
96
|
-
varDecl.replaceWithText(defineCommandText);
|
|
97
|
-
if (info.actionFunction && Node.isIdentifier(info.actionFunction)) {
|
|
98
|
-
const funcName = info.actionFunction.getText();
|
|
99
|
-
const funcDecl = sourceFile.getFunction(funcName);
|
|
100
|
-
if (funcDecl) {
|
|
101
|
-
funcDecl.remove();
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
sourceFile.fixMissingImports();
|
|
105
|
-
await sourceFile.save();
|
|
106
|
-
console.log(`Transformed command in: ${sourceFile.getFilePath()}`);
|
|
107
|
-
}
|
|
108
|
-
function extractCommandInfo(node, sourceFile) {
|
|
109
|
-
const info = {
|
|
110
|
-
options: []
|
|
111
|
-
};
|
|
112
|
-
if (Node.isNewExpression(node)) {
|
|
113
|
-
const expr = node.getExpression();
|
|
114
|
-
if (expr && Node.isIdentifier(expr) && expr.getText() === "Command") {
|
|
115
|
-
const commandArg = node.getArguments()[0];
|
|
116
|
-
if (commandArg && Node.isStringLiteral(commandArg)) {
|
|
117
|
-
info.commandName = commandArg.getLiteralText();
|
|
118
|
-
}
|
|
119
|
-
return info;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
if (Node.isCallExpression(node)) {
|
|
123
|
-
let tempExpr = node;
|
|
124
|
-
while (tempExpr && Node.isCallExpression(tempExpr)) {
|
|
125
|
-
const expression = tempExpr.getExpression();
|
|
126
|
-
if (Node.isPropertyAccessExpression(expression)) {
|
|
127
|
-
const methodName = expression.getName();
|
|
128
|
-
switch (methodName) {
|
|
129
|
-
case "action":
|
|
130
|
-
handleActionMethod(tempExpr, info, sourceFile);
|
|
131
|
-
break;
|
|
132
|
-
case "option":
|
|
133
|
-
handleOptionMethod(tempExpr, info);
|
|
134
|
-
break;
|
|
135
|
-
case "description":
|
|
136
|
-
handleDescriptionMethod(tempExpr, info);
|
|
137
|
-
break;
|
|
138
|
-
case "version":
|
|
139
|
-
handleVersionMethod(tempExpr, info);
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
const parent = tempExpr.getParent();
|
|
144
|
-
tempExpr = Node.isCallExpression(parent) ? parent : void 0;
|
|
145
|
-
}
|
|
146
|
-
return info;
|
|
147
|
-
}
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
function handleActionMethod(node, info, sourceFile) {
|
|
151
|
-
const [actionArg] = node.getArguments();
|
|
152
|
-
if (actionArg && Node.isIdentifier(actionArg)) {
|
|
153
|
-
const funcDef = sourceFile.getFunction(actionArg.getText()) || sourceFile.getVariableDeclaration(actionArg.getText())?.getInitializer();
|
|
154
|
-
if (funcDef && (Node.isArrowFunction(funcDef) || Node.isFunctionDeclaration(funcDef) || Node.isFunctionExpression(funcDef))) {
|
|
155
|
-
info.actionFunction = funcDef;
|
|
156
|
-
const firstParam = funcDef.getParameters()[0];
|
|
157
|
-
if (firstParam) {
|
|
158
|
-
info.actionFunctionParam = firstParam.getName();
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
function handleOptionMethod(node, info) {
|
|
164
|
-
const [flagsArg, descArg, defaultValueArg] = node.getArguments();
|
|
165
|
-
if (flagsArg && Node.isStringLiteral(flagsArg)) {
|
|
166
|
-
const { longName, shortName, takesValue } = parseCommanderFlags(flagsArg.getLiteralText());
|
|
167
|
-
info.options.push({
|
|
168
|
-
name: longName,
|
|
169
|
-
shortFlag: shortName,
|
|
170
|
-
type: takesValue ? "string" : "boolean",
|
|
171
|
-
description: Node.isStringLiteral(descArg) ? descArg.getLiteralText() : "TODO: Add description",
|
|
172
|
-
defaultValue: defaultValueArg ? getDefaultValueText(defaultValueArg) : void 0
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
function handleDescriptionMethod(node, info) {
|
|
177
|
-
const [descArg] = node.getArguments();
|
|
178
|
-
if (descArg && Node.isStringLiteral(descArg)) {
|
|
179
|
-
info.description = descArg.getLiteralText();
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
function handleVersionMethod(node, info) {
|
|
183
|
-
const [versionArg] = node.getArguments();
|
|
184
|
-
if (versionArg && Node.isStringLiteral(versionArg)) {
|
|
185
|
-
info.version = versionArg.getLiteralText();
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
export async function commanderToRempts(targetDirectory) {
|
|
189
|
-
if (!targetDirectory) {
|
|
190
|
-
throw new Error("Target directory is required");
|
|
191
|
-
}
|
|
192
|
-
const project = new Project({
|
|
193
|
-
compilerOptions: {
|
|
194
|
-
target: ScriptTarget.ESNext,
|
|
195
|
-
module: ModuleKind.ESNext,
|
|
196
|
-
esModuleInterop: true,
|
|
197
|
-
skipLibCheck: true
|
|
198
|
-
},
|
|
199
|
-
skipAddingFilesFromTsConfig: true
|
|
200
|
-
});
|
|
201
|
-
const filePaths = await glob(`${targetDirectory}/**/*.ts`, {
|
|
202
|
-
ignore: ["**/node_modules/**", "**/*.d.ts"],
|
|
203
|
-
absolute: true
|
|
204
|
-
});
|
|
205
|
-
for (const filePath of filePaths) {
|
|
206
|
-
console.log(`Processing: ${filePath}`);
|
|
207
|
-
project.addSourceFileAtPath(filePath);
|
|
208
|
-
try {
|
|
209
|
-
await transformFile(filePath, project);
|
|
210
|
-
} catch (error) {
|
|
211
|
-
console.error(`Error transforming file ${filePath}:`, error);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
console.log("Migration completed successfully.");
|
|
215
|
-
}
|
|
216
|
-
async function transformFile(filePath, project) {
|
|
217
|
-
const sourceFile = project.getSourceFile(filePath);
|
|
218
|
-
if (!sourceFile) {
|
|
219
|
-
console.error(`Could not find source file: ${filePath}`);
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const commanderImport = sourceFile.getImportDeclaration("commander");
|
|
223
|
-
if (commanderImport) {
|
|
224
|
-
commanderImport.remove();
|
|
225
|
-
}
|
|
226
|
-
const remptsImport = sourceFile.getImportDeclaration("@reliverse/rempts");
|
|
227
|
-
const neededRemptsImports = ["defineCommand", "runMain"];
|
|
228
|
-
if (remptsImport) {
|
|
229
|
-
const existingNamedImports = remptsImport.getNamedImports().map((ni) => ni.getName());
|
|
230
|
-
for (const neededImport of neededRemptsImports) {
|
|
231
|
-
if (!existingNamedImports.includes(neededImport)) {
|
|
232
|
-
remptsImport.addNamedImport(neededImport);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
} else {
|
|
236
|
-
sourceFile.addImportDeclaration({
|
|
237
|
-
moduleSpecifier: "@reliverse/rempts",
|
|
238
|
-
namedImports: neededRemptsImports
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
const variableDeclarations = sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration);
|
|
242
|
-
for (const varDecl of variableDeclarations) {
|
|
243
|
-
const initializer = varDecl.getInitializer();
|
|
244
|
-
if (!initializer) continue;
|
|
245
|
-
const commandInfo = extractCommandInfo(initializer, sourceFile);
|
|
246
|
-
if (commandInfo) {
|
|
247
|
-
await transformCommand(varDecl, commandInfo, sourceFile);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import fs from "@reliverse/relifso";
|
|
2
|
-
import { relinka } from "@reliverse/relinka";
|
|
3
|
-
import { inputPrompt, selectPrompt } from "@reliverse/rempts";
|
|
4
|
-
export async function consoleToRelinka(input, from, to) {
|
|
5
|
-
const finalInput = input ?? await inputPrompt({
|
|
6
|
-
title: "Enter input file or directory path",
|
|
7
|
-
placeholder: "e.g., src/**/*.ts"
|
|
8
|
-
});
|
|
9
|
-
const finalFrom = from ?? await selectPrompt({
|
|
10
|
-
title: "Select source format",
|
|
11
|
-
options: [
|
|
12
|
-
{ label: "console", value: "console" },
|
|
13
|
-
{ label: "consola method", value: "consolaMethod" },
|
|
14
|
-
{ label: "consola object", value: "consolaObject" },
|
|
15
|
-
{ label: "relinka function", value: "relinkaFunction" },
|
|
16
|
-
{ label: "relinka method", value: "relinkaMethod" },
|
|
17
|
-
{ label: "relinka object", value: "relinkaObject" }
|
|
18
|
-
]
|
|
19
|
-
});
|
|
20
|
-
const finalTo = to ?? await selectPrompt({
|
|
21
|
-
title: "Select target format",
|
|
22
|
-
options: [
|
|
23
|
-
{ label: "console", value: "console" },
|
|
24
|
-
{ label: "consola method", value: "consolaMethod" },
|
|
25
|
-
{ label: "consola object", value: "consolaObject" },
|
|
26
|
-
{ label: "relinka function", value: "relinkaFunction" },
|
|
27
|
-
{ label: "relinka method", value: "relinkaMethod" },
|
|
28
|
-
{ label: "relinka object", value: "relinkaObject" }
|
|
29
|
-
]
|
|
30
|
-
});
|
|
31
|
-
if (!finalInput || !finalFrom || !finalTo) {
|
|
32
|
-
relinka("error", "Missing required arguments for console-relinka migration");
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
if (!await fs.pathExists(finalInput)) {
|
|
36
|
-
relinka("error", `\u274C Input path does not exist: ${finalInput}`);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
let content = await fs.readFile(finalInput, "utf8");
|
|
40
|
-
let changes = false;
|
|
41
|
-
const levels = [
|
|
42
|
-
"log",
|
|
43
|
-
"info",
|
|
44
|
-
"warn",
|
|
45
|
-
"error",
|
|
46
|
-
"debug",
|
|
47
|
-
"verbose",
|
|
48
|
-
"success",
|
|
49
|
-
"ready",
|
|
50
|
-
"start",
|
|
51
|
-
"box",
|
|
52
|
-
"trace"
|
|
53
|
-
];
|
|
54
|
-
const getSourcePattern = (level, format) => {
|
|
55
|
-
switch (format) {
|
|
56
|
-
case "console":
|
|
57
|
-
return new RegExp(`console\\.${level}\\((.*?)(?:,\\s*(.*))?\\)`, "g");
|
|
58
|
-
case "consolaMethod":
|
|
59
|
-
if (level === "box") {
|
|
60
|
-
return /consola\.box\(\s*{\s*title:\s*"([^"]*)",\s*message:\s*"([^"]*)"\s*\}\s*\)/g;
|
|
61
|
-
}
|
|
62
|
-
return new RegExp(`consola\\.${level}\\((.*?)(?:,\\s*(.*))?\\)`, "g");
|
|
63
|
-
case "consolaObject":
|
|
64
|
-
return new RegExp(
|
|
65
|
-
`consola\\({level:\\s*"${level}",\\s*message:\\s*(.*?)(?:,\\s*title:\\s*"([^"]*)")?\\s*\\}\\)`,
|
|
66
|
-
"g"
|
|
67
|
-
);
|
|
68
|
-
case "relinkaFunction":
|
|
69
|
-
return new RegExp(`relinka\\("${level}",\\s*(.*?)(?:,\\s*(.*))?\\)`, "g");
|
|
70
|
-
case "relinkaMethod":
|
|
71
|
-
return new RegExp(`relinka\\.${level}\\((.*?)(?:,\\s*(.*))?\\)`, "g");
|
|
72
|
-
case "relinkaObject":
|
|
73
|
-
return new RegExp(
|
|
74
|
-
`relinka\\({level:\\s*"${level}",\\s*message:\\s*(.*?)(?:,\\s*title:\\s*"([^"]*)")?\\s*\\}\\)`,
|
|
75
|
-
"g"
|
|
76
|
-
);
|
|
77
|
-
default:
|
|
78
|
-
throw new Error(`Invalid source format: ${format}`);
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
const createReplacement = (level, message, title, args) => {
|
|
82
|
-
switch (finalTo) {
|
|
83
|
-
case "console":
|
|
84
|
-
return `console.${level}(${message}${args ? `, ${args}` : ""})`;
|
|
85
|
-
case "consolaMethod":
|
|
86
|
-
if (level === "box" && title) {
|
|
87
|
-
return `consola.box({ title: "${title}", message: "${message}" })`;
|
|
88
|
-
}
|
|
89
|
-
return `consola.${level}(${message}${args ? `, ${args}` : ""})`;
|
|
90
|
-
case "consolaObject": {
|
|
91
|
-
const obj = {
|
|
92
|
-
level: `"${level}"`,
|
|
93
|
-
message,
|
|
94
|
-
...title && { title: `"${title}"` },
|
|
95
|
-
...args && { args: `[${args}]` }
|
|
96
|
-
};
|
|
97
|
-
return `consola(${JSON.stringify(obj).replace(/"([^"]+)":/g, "$1:")})`;
|
|
98
|
-
}
|
|
99
|
-
case "relinkaFunction":
|
|
100
|
-
if (level === "box" && title) {
|
|
101
|
-
return `relinka("${level}", "${title}\\n${message}"${args ? `, ${args}` : ""})`;
|
|
102
|
-
}
|
|
103
|
-
return `relinka("${level}", ${message}${args ? `, ${args}` : ""})`;
|
|
104
|
-
case "relinkaMethod":
|
|
105
|
-
if (level === "box" && title) {
|
|
106
|
-
return `relinka.${level}("${title}\\n${message}"${args ? `, ${args}` : ""})`;
|
|
107
|
-
}
|
|
108
|
-
return `relinka.${level}(${message}${args ? `, ${args}` : ""})`;
|
|
109
|
-
case "relinkaObject": {
|
|
110
|
-
const obj = {
|
|
111
|
-
level: `"${level}"`,
|
|
112
|
-
message,
|
|
113
|
-
...title && { title: `"${title}"` },
|
|
114
|
-
...args && { args: `[${args}]` }
|
|
115
|
-
};
|
|
116
|
-
return `relinka(${JSON.stringify(obj).replace(/"([^"]+)":/g, "$1:")})`;
|
|
117
|
-
}
|
|
118
|
-
default:
|
|
119
|
-
throw new Error(`Invalid target format: ${finalTo}`);
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
for (const level of levels) {
|
|
123
|
-
const pattern = getSourcePattern(level, finalFrom);
|
|
124
|
-
const newContent = content.replace(pattern, (_, message, titleOrArgs, args) => {
|
|
125
|
-
changes = true;
|
|
126
|
-
if ((finalFrom === "consolaMethod" || finalFrom === "relinkaMethod") && level === "box") {
|
|
127
|
-
return createReplacement(level, message, titleOrArgs, args);
|
|
128
|
-
}
|
|
129
|
-
return createReplacement(level, message, void 0, titleOrArgs);
|
|
130
|
-
});
|
|
131
|
-
if (newContent !== content) {
|
|
132
|
-
content = newContent;
|
|
133
|
-
relinka("verbose", `\u2705 Converted ${level} calls from ${finalFrom} to ${finalTo} format`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
if (!changes) {
|
|
137
|
-
relinka("warn", "\u26A0\uFE0F No matching calls found to convert");
|
|
138
|
-
} else {
|
|
139
|
-
await fs.writeFile(finalInput, content, "utf8");
|
|
140
|
-
relinka("success", "\u2728 Successfully converted all logging calls to the target format");
|
|
141
|
-
}
|
|
142
|
-
}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { existsSync } from "node:fs";
|
|
2
|
-
import { readdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
3
|
-
import { extname, join } from "@reliverse/pathkit";
|
|
4
|
-
async function getAllTsFiles(dir) {
|
|
5
|
-
const files = [];
|
|
6
|
-
try {
|
|
7
|
-
const entries = await readdir(dir);
|
|
8
|
-
for (const entry of entries) {
|
|
9
|
-
const fullPath = join(dir, entry);
|
|
10
|
-
const stats = await stat(fullPath);
|
|
11
|
-
if (stats.isDirectory() && !entry.startsWith(".") && entry !== "node_modules") {
|
|
12
|
-
const subFiles = await getAllTsFiles(fullPath);
|
|
13
|
-
files.push(...subFiles);
|
|
14
|
-
} else if (stats.isFile()) {
|
|
15
|
-
const ext = extname(entry);
|
|
16
|
-
if ([".ts", ".tsx", ".js", ".jsx", ".vue", ".svelte"].includes(ext)) {
|
|
17
|
-
files.push(fullPath);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
} catch {
|
|
22
|
-
}
|
|
23
|
-
return files;
|
|
24
|
-
}
|
|
25
|
-
export async function migrateFsToRelifso(dryRun = false) {
|
|
26
|
-
const results = [];
|
|
27
|
-
const files = await getAllTsFiles(".");
|
|
28
|
-
for (const file of files) {
|
|
29
|
-
try {
|
|
30
|
-
const content = await readFile(file, "utf8");
|
|
31
|
-
let modified = content;
|
|
32
|
-
const changes = [];
|
|
33
|
-
const nodeFsImportRegex = /import\s+(?:(\{[^}]*\})|(\w+))\s+from\s+["']node:fs["']/g;
|
|
34
|
-
if (nodeFsImportRegex.test(content)) {
|
|
35
|
-
modified = modified.replace(nodeFsImportRegex, (_match, namedExports, defaultExport) => {
|
|
36
|
-
if (namedExports) {
|
|
37
|
-
return `import ${namedExports} from "@reliverse/relifso"`;
|
|
38
|
-
}
|
|
39
|
-
return `import ${defaultExport} from "@reliverse/relifso"`;
|
|
40
|
-
});
|
|
41
|
-
changes.push("Updated node:fs imports to @reliverse/relifso");
|
|
42
|
-
}
|
|
43
|
-
const nodeFsPromisesImportRegex = /import\s+(?:(\{[^}]*\})|(\w+))\s+from\s+["']node:fs\/promises["']/g;
|
|
44
|
-
if (nodeFsPromisesImportRegex.test(content)) {
|
|
45
|
-
modified = modified.replace(
|
|
46
|
-
nodeFsPromisesImportRegex,
|
|
47
|
-
(_match, namedExports, defaultExport) => {
|
|
48
|
-
if (namedExports) {
|
|
49
|
-
return `import ${namedExports} from "@reliverse/relifso"`;
|
|
50
|
-
}
|
|
51
|
-
return `import ${defaultExport} from "@reliverse/relifso"`;
|
|
52
|
-
}
|
|
53
|
-
);
|
|
54
|
-
changes.push("Updated node:fs/promises imports to @reliverse/relifso");
|
|
55
|
-
}
|
|
56
|
-
const fsExtraImportRegex = /import\s+(?:(\{[^}]*\})|(\w+))\s+from\s+["']fs-extra["']/g;
|
|
57
|
-
if (fsExtraImportRegex.test(content)) {
|
|
58
|
-
modified = modified.replace(fsExtraImportRegex, (_match, namedExports, defaultExport) => {
|
|
59
|
-
if (namedExports) {
|
|
60
|
-
return `import ${namedExports} from "@reliverse/relifso"`;
|
|
61
|
-
}
|
|
62
|
-
return `import ${defaultExport} from "@reliverse/relifso"`;
|
|
63
|
-
});
|
|
64
|
-
changes.push("Updated fs-extra imports to @reliverse/relifso");
|
|
65
|
-
}
|
|
66
|
-
const nodeFsRequireRegex = /require\s*\(\s*["']node:fs["']\s*\)/g;
|
|
67
|
-
if (nodeFsRequireRegex.test(content)) {
|
|
68
|
-
modified = modified.replace(nodeFsRequireRegex, 'require("@reliverse/relifso")');
|
|
69
|
-
changes.push("Updated node:fs require to @reliverse/relifso");
|
|
70
|
-
}
|
|
71
|
-
const nodeFsPromisesRequireRegex = /require\s*\(\s*["']node:fs\/promises["']\s*\)/g;
|
|
72
|
-
if (nodeFsPromisesRequireRegex.test(content)) {
|
|
73
|
-
modified = modified.replace(nodeFsPromisesRequireRegex, 'require("@reliverse/relifso")');
|
|
74
|
-
changes.push("Updated node:fs/promises require to @reliverse/relifso");
|
|
75
|
-
}
|
|
76
|
-
const fsExtraRequireRegex = /require\s*\(\s*["']fs-extra["']\s*\)/g;
|
|
77
|
-
if (fsExtraRequireRegex.test(content)) {
|
|
78
|
-
modified = modified.replace(fsExtraRequireRegex, 'require("@reliverse/relifso")');
|
|
79
|
-
changes.push("Updated fs-extra require to @reliverse/relifso");
|
|
80
|
-
}
|
|
81
|
-
if (changes.length > 0) {
|
|
82
|
-
if (!dryRun) {
|
|
83
|
-
await writeFile(file, modified, "utf8");
|
|
84
|
-
}
|
|
85
|
-
results.push({
|
|
86
|
-
file,
|
|
87
|
-
success: true,
|
|
88
|
-
message: `${changes.length} change(s) made`,
|
|
89
|
-
changes
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
} catch (error) {
|
|
93
|
-
results.push({
|
|
94
|
-
file,
|
|
95
|
-
success: false,
|
|
96
|
-
message: `Failed to process: ${error instanceof Error ? error.message : String(error)}`
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
await updatePackageJson(results, dryRun, {
|
|
101
|
-
remove: ["fs-extra"],
|
|
102
|
-
add: { "@reliverse/relifso": "^latest" }
|
|
103
|
-
});
|
|
104
|
-
return results;
|
|
105
|
-
}
|
|
106
|
-
async function updatePackageJson(results, dryRun, config) {
|
|
107
|
-
try {
|
|
108
|
-
const packageJsonPath = "./package.json";
|
|
109
|
-
if (existsSync(packageJsonPath)) {
|
|
110
|
-
const packageContent = await readFile(packageJsonPath, "utf8");
|
|
111
|
-
const packageJson = JSON.parse(packageContent);
|
|
112
|
-
let packageChanged = false;
|
|
113
|
-
const packageChanges = [];
|
|
114
|
-
for (const pkg of config.remove) {
|
|
115
|
-
if (packageJson.dependencies?.[pkg]) {
|
|
116
|
-
packageJson.dependencies = Object.fromEntries(
|
|
117
|
-
Object.entries(packageJson.dependencies).filter(([key]) => key !== pkg)
|
|
118
|
-
);
|
|
119
|
-
packageChanged = true;
|
|
120
|
-
packageChanges.push(`Removed ${pkg} from dependencies`);
|
|
121
|
-
}
|
|
122
|
-
if (packageJson.devDependencies?.[pkg]) {
|
|
123
|
-
packageJson.devDependencies = Object.fromEntries(
|
|
124
|
-
Object.entries(packageJson.devDependencies).filter(([key]) => key !== pkg)
|
|
125
|
-
);
|
|
126
|
-
packageChanged = true;
|
|
127
|
-
packageChanges.push(`Removed ${pkg} from devDependencies`);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
for (const [pkg, version] of Object.entries(config.add)) {
|
|
131
|
-
if (packageChanged && !packageJson.dependencies?.[pkg]) {
|
|
132
|
-
if (!packageJson.dependencies) packageJson.dependencies = {};
|
|
133
|
-
packageJson.dependencies[pkg] = version;
|
|
134
|
-
packageChanges.push(`Added ${pkg} to dependencies`);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
if (packageChanged) {
|
|
138
|
-
if (!dryRun) {
|
|
139
|
-
await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n", "utf8");
|
|
140
|
-
}
|
|
141
|
-
results.push({
|
|
142
|
-
file: packageJsonPath,
|
|
143
|
-
success: true,
|
|
144
|
-
message: `${packageChanges.length} change(s) made`,
|
|
145
|
-
changes: packageChanges
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
} catch (error) {
|
|
150
|
-
results.push({
|
|
151
|
-
file: "./package.json",
|
|
152
|
-
success: false,
|
|
153
|
-
message: `Failed to update package.json: ${error instanceof Error ? error.message : String(error)}`
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
export interface MigrationResult {
|
|
2
|
-
package: string;
|
|
3
|
-
action: "added-to-catalog" | "replaced-with-catalog" | "restored-from-catalog" | "version-bumped";
|
|
4
|
-
oldVersion?: string;
|
|
5
|
-
newVersion?: string;
|
|
6
|
-
location: string;
|
|
7
|
-
packageJsonPath?: string;
|
|
8
|
-
}
|
|
9
|
-
export interface DependencyEntry {
|
|
10
|
-
name: string;
|
|
11
|
-
version: string;
|
|
12
|
-
locations: Set<string>;
|
|
13
|
-
packageJsonPath: string;
|
|
14
|
-
oldVersion?: string;
|
|
15
|
-
}
|
|
16
|
-
export interface CatalogMergeResult {
|
|
17
|
-
added: DependencyEntry[];
|
|
18
|
-
bumped: DependencyEntry[];
|
|
19
|
-
skipped: DependencyEntry[];
|
|
20
|
-
}
|
|
21
|
-
export interface PackageJson {
|
|
22
|
-
name?: string;
|
|
23
|
-
version?: string;
|
|
24
|
-
dependencies?: Record<string, string>;
|
|
25
|
-
devDependencies?: Record<string, string>;
|
|
26
|
-
peerDependencies?: Record<string, string>;
|
|
27
|
-
optionalDependencies?: Record<string, string>;
|
|
28
|
-
workspaces?: {
|
|
29
|
-
packages?: string[];
|
|
30
|
-
catalog?: Record<string, string>;
|
|
31
|
-
catalogs?: Record<string, Record<string, string>>;
|
|
32
|
-
} | string[];
|
|
33
|
-
catalog?: Record<string, string>;
|
|
34
|
-
catalogs?: Record<string, Record<string, string>>;
|
|
35
|
-
scripts?: Record<string, string>;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Check if a dependency is a catalog reference (e.g., "catalog:", "catalog:foo")
|
|
39
|
-
*/
|
|
40
|
-
export declare function isCatalogReference(versionSpec: string): boolean;
|
|
41
|
-
/**
|
|
42
|
-
* Check if a dependency is a workspace dependency (e.g., "workspace:*")
|
|
43
|
-
*/
|
|
44
|
-
export declare function isWorkspaceDependency(versionSpec: string): boolean;
|
|
45
|
-
/**
|
|
46
|
-
* Check if a dependency is an npm alias (e.g., "npm:package-name@version")
|
|
47
|
-
*/
|
|
48
|
-
export declare function isNpmAlias(versionSpec: string): boolean;
|
|
49
|
-
/**
|
|
50
|
-
* Check if a dependency should be skipped (non-semver or special specifier)
|
|
51
|
-
*/
|
|
52
|
-
export declare function shouldSkipDependency(versionSpec: string): boolean;
|
|
53
|
-
/**
|
|
54
|
-
* Find all workspace package.json paths from root cwd. Supports workspaces array or { packages: [] }.
|
|
55
|
-
*/
|
|
56
|
-
export declare function findWorkspacePackageJsons(cwd: string): Promise<string[]>;
|
|
57
|
-
/**
|
|
58
|
-
* Check if we're in a monorepo by detecting workspace configuration
|
|
59
|
-
*/
|
|
60
|
-
export declare function isMonorepo(cwd: string): Promise<boolean>;
|
|
61
|
-
/**
|
|
62
|
-
* Extract dependencies from package.json (dependencies and devDependencies)
|
|
63
|
-
*/
|
|
64
|
-
export declare function extractDependencies(packageJson: PackageJson, packageJsonPath: string): DependencyEntry[];
|
|
65
|
-
/**
|
|
66
|
-
* Merge dependencies into catalog, handling version conflicts intelligently
|
|
67
|
-
*/
|
|
68
|
-
export declare function mergeToCatalog(existingCatalog: Record<string, string>, newDependencies: DependencyEntry[]): CatalogMergeResult;
|
|
69
|
-
/**
|
|
70
|
-
* Replace dependencies with catalog references in package.json
|
|
71
|
-
*/
|
|
72
|
-
export declare function replaceDependenciesWithCatalogRefs(packageJsonPath: string, dependenciesToReplace: DependencyEntry[]): Promise<number>;
|
|
73
|
-
/**
|
|
74
|
-
* Restore catalog references to actual versions
|
|
75
|
-
*/
|
|
76
|
-
export declare function restoreCatalogReferences(packageJsonPath: string, catalog: Record<string, string>): Promise<number>;
|
|
77
|
-
/**
|
|
78
|
-
* Update root package.json with catalog
|
|
79
|
-
*/
|
|
80
|
-
export declare function updateRootWithCatalog(rootPackageJsonPath: string, catalog: Record<string, string>): Promise<void>;
|
|
81
|
-
/**
|
|
82
|
-
* Remove catalog from root package.json
|
|
83
|
-
*/
|
|
84
|
-
export declare function removeCatalogFromRoot(rootPackageJsonPath: string): Promise<void>;
|
|
85
|
-
/**
|
|
86
|
-
* Migrate TO catalog: centralize dependencies to workspaces.catalog
|
|
87
|
-
*/
|
|
88
|
-
export declare function migrateToCatalog(rootPath: string, dryRun?: boolean, interactive?: boolean): Promise<MigrationResult[]>;
|
|
89
|
-
/**
|
|
90
|
-
* Migrate FROM catalog: restore catalog references to actual versions
|
|
91
|
-
*/
|
|
92
|
-
export declare function migrateFromCatalog(rootPath: string, removeCatalog?: boolean, dryRun?: boolean, interactive?: boolean): Promise<MigrationResult[]>;
|
|
93
|
-
/**
|
|
94
|
-
* Display migration results
|
|
95
|
-
*/
|
|
96
|
-
export declare function displayMigrationResults(results: MigrationResult[]): void;
|