@xylabs/ts-scripts-common 7.5.2 → 7.5.4
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/actions/deplint/checkPackage/checkPackage.mjs +52 -5
- package/dist/actions/deplint/checkPackage/checkPackage.mjs.map +1 -1
- package/dist/actions/deplint/checkPackage/getUnlistedDependencies.mjs +17 -2
- package/dist/actions/deplint/checkPackage/getUnlistedDependencies.mjs.map +1 -1
- package/dist/actions/deplint/checkPackage/getUnlistedDevDependencies.mjs +15 -1
- package/dist/actions/deplint/checkPackage/getUnlistedDevDependencies.mjs.map +1 -1
- package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs +15 -1
- package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs.map +1 -1
- package/dist/actions/deplint/checkPackage/getUnusedDevDependencies.mjs +41 -1
- package/dist/actions/deplint/checkPackage/getUnusedDevDependencies.mjs.map +1 -1
- package/dist/actions/deplint/checkPackage/index.mjs +52 -5
- package/dist/actions/deplint/checkPackage/index.mjs.map +1 -1
- package/dist/actions/deplint/deplint.mjs +43 -5
- package/dist/actions/deplint/deplint.mjs.map +1 -1
- package/dist/actions/deplint/implicitDevDependencies.mjs +25 -0
- package/dist/actions/deplint/implicitDevDependencies.mjs.map +1 -1
- package/dist/actions/deplint/index.mjs +43 -5
- package/dist/actions/deplint/index.mjs.map +1 -1
- package/dist/actions/deplint/tsScriptsAliases.mjs +20 -0
- package/dist/actions/deplint/tsScriptsAliases.mjs.map +1 -0
- package/dist/actions/index.mjs +195 -98
- package/dist/actions/index.mjs.map +1 -1
- package/dist/actions/packman/convert.mjs +142 -83
- package/dist/actions/packman/convert.mjs.map +1 -1
- package/dist/actions/packman/convertToPnpm.mjs +94 -36
- package/dist/actions/packman/convertToPnpm.mjs.map +1 -1
- package/dist/actions/packman/convertToYarn.mjs +95 -37
- package/dist/actions/packman/convertToYarn.mjs.map +1 -1
- package/dist/actions/packman/index.mjs +142 -83
- package/dist/actions/packman/index.mjs.map +1 -1
- package/dist/actions/packman/rewriteSourceImports.mjs +60 -0
- package/dist/actions/packman/rewriteSourceImports.mjs.map +1 -0
- package/dist/bin/xy.mjs +212 -115
- package/dist/bin/xy.mjs.map +1 -1
- package/dist/index.mjs +214 -117
- package/dist/index.mjs.map +1 -1
- package/dist/xy/common/index.mjs +142 -83
- package/dist/xy/common/index.mjs.map +1 -1
- package/dist/xy/common/packmanCommand.mjs +142 -83
- package/dist/xy/common/packmanCommand.mjs.map +1 -1
- package/dist/xy/index.mjs +212 -115
- package/dist/xy/index.mjs.map +1 -1
- package/dist/xy/lint/deplintCommand.mjs +43 -5
- package/dist/xy/lint/deplintCommand.mjs.map +1 -1
- package/dist/xy/lint/index.mjs +43 -5
- package/dist/xy/lint/index.mjs.map +1 -1
- package/dist/xy/xy.mjs +212 -115
- package/dist/xy/xy.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// src/actions/packman/convertToPnpm.ts
|
|
2
2
|
import {
|
|
3
|
-
existsSync as
|
|
3
|
+
existsSync as existsSync3,
|
|
4
4
|
mkdirSync,
|
|
5
|
-
readFileSync as
|
|
5
|
+
readFileSync as readFileSync3,
|
|
6
6
|
rmSync,
|
|
7
|
-
writeFileSync as
|
|
7
|
+
writeFileSync as writeFileSync3
|
|
8
8
|
} from "fs";
|
|
9
9
|
import PATH2 from "path";
|
|
10
|
-
import
|
|
10
|
+
import chalk3 from "chalk";
|
|
11
11
|
|
|
12
12
|
// src/actions/packman/rewriteScripts.ts
|
|
13
13
|
function rewriteYarnToPnpm(script) {
|
|
@@ -57,14 +57,71 @@ function rewriteScriptsInPackageJson(pkg, direction) {
|
|
|
57
57
|
return { ...pkg, scripts: rewritten };
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
// src/actions/packman/
|
|
60
|
+
// src/actions/packman/rewriteSourceImports.ts
|
|
61
61
|
import {
|
|
62
62
|
existsSync,
|
|
63
63
|
readFileSync,
|
|
64
64
|
writeFileSync
|
|
65
65
|
} from "fs";
|
|
66
|
-
import PATH from "path";
|
|
67
66
|
import chalk from "chalk";
|
|
67
|
+
import { globSync } from "glob";
|
|
68
|
+
var IMPORT_SWAP_MAP = {
|
|
69
|
+
"yarn-to-pnpm": [
|
|
70
|
+
["@xylabs/ts-scripts-yarn3", "@xylabs/ts-scripts-pnpm"],
|
|
71
|
+
["@xylabs/ts-scripts-react-yarn3", "@xylabs/ts-scripts-react-pnpm"]
|
|
72
|
+
],
|
|
73
|
+
"pnpm-to-yarn": [
|
|
74
|
+
["@xylabs/ts-scripts-pnpm", "@xylabs/ts-scripts-yarn3"],
|
|
75
|
+
["@xylabs/ts-scripts-react-pnpm", "@xylabs/ts-scripts-react-yarn3"]
|
|
76
|
+
]
|
|
77
|
+
};
|
|
78
|
+
var SOURCE_GLOBS = [
|
|
79
|
+
"**/*.ts",
|
|
80
|
+
"**/*.tsx",
|
|
81
|
+
"**/*.mts",
|
|
82
|
+
"**/*.cts",
|
|
83
|
+
"**/*.js",
|
|
84
|
+
"**/*.mjs"
|
|
85
|
+
];
|
|
86
|
+
var IGNORE_PATTERNS = [
|
|
87
|
+
"**/node_modules/**",
|
|
88
|
+
"**/dist/**",
|
|
89
|
+
"**/build/**",
|
|
90
|
+
"**/.yarn/**"
|
|
91
|
+
];
|
|
92
|
+
function rewriteSourceImports(cwd, direction) {
|
|
93
|
+
const swaps = IMPORT_SWAP_MAP[direction];
|
|
94
|
+
const files = globSync(SOURCE_GLOBS, {
|
|
95
|
+
cwd,
|
|
96
|
+
absolute: true,
|
|
97
|
+
ignore: IGNORE_PATTERNS
|
|
98
|
+
});
|
|
99
|
+
let count = 0;
|
|
100
|
+
for (const file of files) {
|
|
101
|
+
if (!existsSync(file)) continue;
|
|
102
|
+
const original = readFileSync(file, "utf8");
|
|
103
|
+
let content = original;
|
|
104
|
+
for (const [from, to] of swaps) {
|
|
105
|
+
content = content.replaceAll(from, to);
|
|
106
|
+
}
|
|
107
|
+
if (content !== original) {
|
|
108
|
+
writeFileSync(file, content, "utf8");
|
|
109
|
+
count++;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (count > 0) {
|
|
113
|
+
console.log(chalk.green(` Rewrote ts-scripts imports in ${count} source file(s)`));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// src/actions/packman/swapTsScriptsDependency.ts
|
|
118
|
+
import {
|
|
119
|
+
existsSync as existsSync2,
|
|
120
|
+
readFileSync as readFileSync2,
|
|
121
|
+
writeFileSync as writeFileSync2
|
|
122
|
+
} from "fs";
|
|
123
|
+
import PATH from "path";
|
|
124
|
+
import chalk2 from "chalk";
|
|
68
125
|
var SWAP_MAP = {
|
|
69
126
|
"yarn-to-pnpm": [
|
|
70
127
|
["@xylabs/ts-scripts-yarn3", "@xylabs/ts-scripts-pnpm"]
|
|
@@ -74,8 +131,8 @@ var SWAP_MAP = {
|
|
|
74
131
|
]
|
|
75
132
|
};
|
|
76
133
|
function swapInPackageJson(pkgPath, direction) {
|
|
77
|
-
if (!
|
|
78
|
-
const raw =
|
|
134
|
+
if (!existsSync2(pkgPath)) return false;
|
|
135
|
+
const raw = readFileSync2(pkgPath, "utf8");
|
|
79
136
|
const pkg = JSON.parse(raw);
|
|
80
137
|
let changed = false;
|
|
81
138
|
for (const depField of ["dependencies", "devDependencies"]) {
|
|
@@ -90,7 +147,7 @@ function swapInPackageJson(pkgPath, direction) {
|
|
|
90
147
|
}
|
|
91
148
|
}
|
|
92
149
|
if (changed) {
|
|
93
|
-
|
|
150
|
+
writeFileSync2(pkgPath, JSON.stringify(pkg, null, 2) + "\n", "utf8");
|
|
94
151
|
}
|
|
95
152
|
return changed;
|
|
96
153
|
}
|
|
@@ -107,7 +164,7 @@ function swapTsScriptsDependency(cwd, workspacePackageJsonPaths, direction) {
|
|
|
107
164
|
}
|
|
108
165
|
if (count > 0) {
|
|
109
166
|
const target = direction === "yarn-to-pnpm" ? "@xylabs/ts-scripts-pnpm" : "@xylabs/ts-scripts-yarn3";
|
|
110
|
-
console.log(
|
|
167
|
+
console.log(chalk2.green(` Swapped ts-scripts dependency to ${target} in ${count} package(s)`));
|
|
111
168
|
}
|
|
112
169
|
}
|
|
113
170
|
|
|
@@ -118,13 +175,13 @@ function createPnpmWorkspaceYaml(cwd, workspacePatterns) {
|
|
|
118
175
|
for (const pattern of workspacePatterns) {
|
|
119
176
|
lines.push(` - '${pattern}'`);
|
|
120
177
|
}
|
|
121
|
-
|
|
122
|
-
console.log(
|
|
178
|
+
writeFileSync3(PATH2.join(cwd, "pnpm-workspace.yaml"), lines.join("\n") + "\n", "utf8");
|
|
179
|
+
console.log(chalk3.green(" Created pnpm-workspace.yaml"));
|
|
123
180
|
}
|
|
124
181
|
function readPnpmWorkspacePatterns(cwd) {
|
|
125
182
|
const wsPath = PATH2.join(cwd, "pnpm-workspace.yaml");
|
|
126
|
-
if (!
|
|
127
|
-
const content =
|
|
183
|
+
if (!existsSync3(wsPath)) return [];
|
|
184
|
+
const content = readFileSync3(wsPath, "utf8");
|
|
128
185
|
const patterns = [];
|
|
129
186
|
const lines = content.split("\n");
|
|
130
187
|
let inPackages = false;
|
|
@@ -144,19 +201,19 @@ function readPnpmWorkspacePatterns(cwd) {
|
|
|
144
201
|
}
|
|
145
202
|
function updateRootPackageJson(cwd) {
|
|
146
203
|
const pkgPath = PATH2.join(cwd, "package.json");
|
|
147
|
-
const pkg = JSON.parse(
|
|
204
|
+
const pkg = JSON.parse(readFileSync3(pkgPath, "utf8"));
|
|
148
205
|
const workspacePatterns = pkg.workspaces ?? readPnpmWorkspacePatterns(cwd);
|
|
149
206
|
delete pkg.workspaces;
|
|
150
207
|
pkg.packageManager = `pnpm@${PNPM_VERSION}`;
|
|
151
208
|
const updated = rewriteScriptsInPackageJson(pkg, "yarn-to-pnpm");
|
|
152
|
-
|
|
153
|
-
console.log(
|
|
209
|
+
writeFileSync3(pkgPath, JSON.stringify(updated, null, 2) + "\n", "utf8");
|
|
210
|
+
console.log(chalk3.green(" Updated root package.json"));
|
|
154
211
|
return workspacePatterns;
|
|
155
212
|
}
|
|
156
213
|
function updateGitignore(cwd) {
|
|
157
214
|
const gitignorePath = PATH2.join(cwd, ".gitignore");
|
|
158
|
-
if (!
|
|
159
|
-
let content =
|
|
215
|
+
if (!existsSync3(gitignorePath)) return;
|
|
216
|
+
let content = readFileSync3(gitignorePath, "utf8");
|
|
160
217
|
const yarnLines = [
|
|
161
218
|
".pnp.*",
|
|
162
219
|
".pnp",
|
|
@@ -171,52 +228,53 @@ function updateGitignore(cwd) {
|
|
|
171
228
|
content = content.replaceAll(new RegExp(String.raw`^${line.replaceAll(".", String.raw`\.`).replaceAll("*", String.raw`\*`).replaceAll("!", String.raw`\!`)}\s*$`, "gm"), "");
|
|
172
229
|
}
|
|
173
230
|
content = content.replaceAll(/\n{3,}/g, "\n\n");
|
|
174
|
-
|
|
175
|
-
console.log(
|
|
231
|
+
writeFileSync3(gitignorePath, content, "utf8");
|
|
232
|
+
console.log(chalk3.green(" Updated .gitignore"));
|
|
176
233
|
}
|
|
177
234
|
function deleteYarnArtifacts(cwd) {
|
|
178
235
|
const yarnLock = PATH2.join(cwd, "yarn.lock");
|
|
179
236
|
const yarnrc = PATH2.join(cwd, ".yarnrc.yml");
|
|
180
237
|
const yarnDir = PATH2.join(cwd, ".yarn");
|
|
181
|
-
if (
|
|
238
|
+
if (existsSync3(yarnLock)) {
|
|
182
239
|
rmSync(yarnLock);
|
|
183
|
-
console.log(
|
|
240
|
+
console.log(chalk3.gray(" Deleted yarn.lock"));
|
|
184
241
|
}
|
|
185
|
-
if (
|
|
242
|
+
if (existsSync3(yarnrc)) {
|
|
186
243
|
rmSync(yarnrc);
|
|
187
|
-
console.log(
|
|
244
|
+
console.log(chalk3.gray(" Deleted .yarnrc.yml"));
|
|
188
245
|
}
|
|
189
|
-
if (
|
|
246
|
+
if (existsSync3(yarnDir)) {
|
|
190
247
|
rmSync(yarnDir, { force: true, recursive: true });
|
|
191
|
-
console.log(
|
|
248
|
+
console.log(chalk3.gray(" Deleted .yarn/"));
|
|
192
249
|
}
|
|
193
250
|
}
|
|
194
251
|
function createNpmrc(cwd) {
|
|
195
252
|
const npmrcPath = PATH2.join(cwd, ".npmrc");
|
|
196
|
-
if (
|
|
253
|
+
if (existsSync3(npmrcPath)) return;
|
|
197
254
|
mkdirSync(PATH2.dirname(npmrcPath), { recursive: true });
|
|
198
|
-
|
|
199
|
-
console.log(
|
|
255
|
+
writeFileSync3(npmrcPath, "", "utf8");
|
|
256
|
+
console.log(chalk3.green(" Created .npmrc"));
|
|
200
257
|
}
|
|
201
258
|
function convertToPnpm(cwd, workspacePackageJsonPaths) {
|
|
202
|
-
console.log(
|
|
259
|
+
console.log(chalk3.blue("\nConverting to pnpm...\n"));
|
|
203
260
|
const workspacePatterns = updateRootPackageJson(cwd);
|
|
204
261
|
createPnpmWorkspaceYaml(cwd, workspacePatterns);
|
|
205
262
|
for (const pkgPath of workspacePackageJsonPaths) {
|
|
206
263
|
const fullPath = PATH2.resolve(cwd, pkgPath, "package.json");
|
|
207
|
-
if (!
|
|
208
|
-
const pkg = JSON.parse(
|
|
264
|
+
if (!existsSync3(fullPath)) continue;
|
|
265
|
+
const pkg = JSON.parse(readFileSync3(fullPath, "utf8"));
|
|
209
266
|
const updated = rewriteScriptsInPackageJson(pkg, "yarn-to-pnpm");
|
|
210
267
|
if (JSON.stringify(pkg) !== JSON.stringify(updated)) {
|
|
211
|
-
|
|
268
|
+
writeFileSync3(fullPath, JSON.stringify(updated, null, 2) + "\n", "utf8");
|
|
212
269
|
}
|
|
213
270
|
}
|
|
214
|
-
console.log(
|
|
271
|
+
console.log(chalk3.green(` Rewrote scripts in ${workspacePackageJsonPaths.length} workspace package(s)`));
|
|
215
272
|
updateGitignore(cwd);
|
|
216
273
|
createNpmrc(cwd);
|
|
217
274
|
swapTsScriptsDependency(cwd, workspacePackageJsonPaths, "yarn-to-pnpm");
|
|
275
|
+
rewriteSourceImports(cwd, "yarn-to-pnpm");
|
|
218
276
|
deleteYarnArtifacts(cwd);
|
|
219
|
-
console.log(
|
|
277
|
+
console.log(chalk3.blue("\nConversion complete. Run `pnpm install` to generate pnpm-lock.yaml.\n"));
|
|
220
278
|
return 0;
|
|
221
279
|
}
|
|
222
280
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/packman/convertToPnpm.ts","../../../src/actions/packman/rewriteScripts.ts","../../../src/actions/packman/swapTsScriptsDependency.ts"],"sourcesContent":["import {\n existsSync, mkdirSync, readFileSync, rmSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport { rewriteScriptsInPackageJson } from './rewriteScripts.ts'\nimport { swapTsScriptsDependency } from './swapTsScriptsDependency.ts'\n\nconst PNPM_VERSION = '10.12.1'\n\nfunction createPnpmWorkspaceYaml(cwd: string, workspacePatterns: string[]): void {\n const lines = ['packages:']\n for (const pattern of workspacePatterns) {\n lines.push(` - '${pattern}'`)\n }\n writeFileSync(PATH.join(cwd, 'pnpm-workspace.yaml'), lines.join('\\n') + '\\n', 'utf8')\n console.log(chalk.green(' Created pnpm-workspace.yaml'))\n}\n\nfunction readPnpmWorkspacePatterns(cwd: string): string[] {\n const wsPath = PATH.join(cwd, 'pnpm-workspace.yaml')\n if (!existsSync(wsPath)) return []\n\n const content = readFileSync(wsPath, 'utf8')\n const patterns: string[] = []\n const lines = content.split('\\n')\n let inPackages = false\n for (const line of lines) {\n if (line.trim() === 'packages:') {\n inPackages = true\n continue\n }\n if (inPackages && /^\\s+-\\s+/.test(line)) {\n const pattern = line.replace(/^\\s+-\\s+/, '').replaceAll(/['\"]/g, '').trim()\n if (pattern) patterns.push(pattern)\n } else if (inPackages && !/^\\s/.test(line) && line.trim()) {\n inPackages = false\n }\n }\n return patterns\n}\n\nfunction updateRootPackageJson(cwd: string): string[] {\n const pkgPath = PATH.join(cwd, 'package.json')\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'))\n\n // Save workspace patterns before removing — fall back to pnpm-workspace.yaml if already converted\n const workspacePatterns: string[] = pkg.workspaces ?? readPnpmWorkspacePatterns(cwd)\n\n // Remove yarn workspaces field (pnpm uses pnpm-workspace.yaml)\n delete pkg.workspaces\n\n // Update packageManager\n pkg.packageManager = `pnpm@${PNPM_VERSION}`\n\n // Rewrite scripts\n const updated = rewriteScriptsInPackageJson(pkg, 'yarn-to-pnpm')\n\n writeFileSync(pkgPath, JSON.stringify(updated, null, 2) + '\\n', 'utf8')\n console.log(chalk.green(' Updated root package.json'))\n\n return workspacePatterns\n}\n\nfunction updateGitignore(cwd: string): void {\n const gitignorePath = PATH.join(cwd, '.gitignore')\n if (!existsSync(gitignorePath)) return\n\n let content = readFileSync(gitignorePath, 'utf8')\n\n // Remove yarn-specific entries\n const yarnLines = [\n '.pnp.*',\n '.pnp',\n '.yarn/*',\n '!.yarn/patches',\n '!.yarn/plugins',\n '!.yarn/releases',\n '!.yarn/sdks',\n '!.yarn/versions',\n ]\n for (const line of yarnLines) {\n content = content.replaceAll(new RegExp(String.raw`^${line.replaceAll('.', String.raw`\\.`).replaceAll('*', String.raw`\\*`).replaceAll('!', String.raw`\\!`)}\\s*$`, 'gm'), '')\n }\n\n // Clean up multiple blank lines\n content = content.replaceAll(/\\n{3,}/g, '\\n\\n')\n\n writeFileSync(gitignorePath, content, 'utf8')\n console.log(chalk.green(' Updated .gitignore'))\n}\n\nfunction deleteYarnArtifacts(cwd: string): void {\n const yarnLock = PATH.join(cwd, 'yarn.lock')\n const yarnrc = PATH.join(cwd, '.yarnrc.yml')\n const yarnDir = PATH.join(cwd, '.yarn')\n\n if (existsSync(yarnLock)) {\n rmSync(yarnLock)\n console.log(chalk.gray(' Deleted yarn.lock'))\n }\n if (existsSync(yarnrc)) {\n rmSync(yarnrc)\n console.log(chalk.gray(' Deleted .yarnrc.yml'))\n }\n if (existsSync(yarnDir)) {\n rmSync(yarnDir, { force: true, recursive: true })\n console.log(chalk.gray(' Deleted .yarn/'))\n }\n}\n\nfunction createNpmrc(cwd: string): void {\n const npmrcPath = PATH.join(cwd, '.npmrc')\n if (existsSync(npmrcPath)) return\n\n mkdirSync(PATH.dirname(npmrcPath), { recursive: true })\n writeFileSync(npmrcPath, '', 'utf8')\n console.log(chalk.green(' Created .npmrc'))\n}\n\nexport function convertToPnpm(cwd: string, workspacePackageJsonPaths: string[]): number {\n console.log(chalk.blue('\\nConverting to pnpm...\\n'))\n\n // 1. Read workspace patterns and update root package.json\n const workspacePatterns = updateRootPackageJson(cwd)\n\n // 2. Create pnpm-workspace.yaml\n createPnpmWorkspaceYaml(cwd, workspacePatterns)\n\n // 3. Rewrite scripts in workspace package.json files\n for (const pkgPath of workspacePackageJsonPaths) {\n const fullPath = PATH.resolve(cwd, pkgPath, 'package.json')\n if (!existsSync(fullPath)) continue\n const pkg = JSON.parse(readFileSync(fullPath, 'utf8'))\n const updated = rewriteScriptsInPackageJson(pkg, 'yarn-to-pnpm')\n if (JSON.stringify(pkg) !== JSON.stringify(updated)) {\n writeFileSync(fullPath, JSON.stringify(updated, null, 2) + '\\n', 'utf8')\n }\n }\n console.log(chalk.green(` Rewrote scripts in ${workspacePackageJsonPaths.length} workspace package(s)`))\n\n // 4. Update .gitignore\n updateGitignore(cwd)\n\n // 5. Create .npmrc\n createNpmrc(cwd)\n\n // 6. Swap ts-scripts devDependency (yarn3 → pnpm) in root and workspace packages\n swapTsScriptsDependency(cwd, workspacePackageJsonPaths, 'yarn-to-pnpm')\n\n // 7. Delete yarn artifacts\n deleteYarnArtifacts(cwd)\n\n console.log(chalk.blue('\\nConversion complete. Run `pnpm install` to generate pnpm-lock.yaml.\\n'))\n return 0\n}\n","type Direction = 'pnpm-to-yarn' | 'yarn-to-pnpm'\n\nfunction rewriteYarnToPnpm(script: string): string {\n let result = script\n // yarn workspace @pkg run script → pnpm --filter @pkg run script\n result = result.replaceAll(/\\byarn workspace (\\S+) run /g, 'pnpm --filter $1 run ')\n // yarn workspace @pkg package-X → pnpm --filter @pkg run package-X\n result = result.replaceAll(/\\byarn workspace (\\S+) (package-\\S+)/g, 'pnpm --filter $1 run $2')\n // yarn workspaces foreach [flags] run script → pnpm -r run script\n result = result.replaceAll(/\\byarn workspaces foreach\\s+(?:[^\\s]*\\s+)*run /g, 'pnpm -r run ')\n // yarn workspaces foreach --all version X --deferred → pnpm -r exec npm version X --no-git-tag-version\n result = result.replaceAll(/\\byarn workspaces foreach --all version (\\S+) --deferred/g, 'pnpm -r exec npm version $1 --no-git-tag-version')\n // yarn version apply --all → (remove, handled in bump)\n result = result.replaceAll(/\\byarn version apply --all/g, 'echo \"versions applied\"')\n // yarn xy → pnpm xy\n result = result.replaceAll(/\\byarn xy\\b/g, 'pnpm xy')\n // yarn add/remove/install/dedupe/outdated → pnpm equivalents\n result = result.replaceAll(/\\byarn add\\b/g, 'pnpm add')\n result = result.replaceAll(/\\byarn remove\\b/g, 'pnpm remove')\n result = result.replaceAll(/\\byarn install\\b/g, 'pnpm install')\n result = result.replaceAll(/\\byarn dedupe\\b/g, 'pnpm dedupe')\n result = result.replaceAll(/\\byarn outdated\\b/g, 'pnpm outdated')\n result = result.replaceAll(/\\byarn run\\b/g, 'pnpm run')\n // yarn rimraf → rimraf (no PM prefix)\n result = result.replaceAll(/\\byarn rimraf\\b/g, 'rimraf')\n // yarn npm → npm (direct)\n result = result.replaceAll(/\\byarn npm\\b/g, 'npm')\n // Remaining bare \"yarn\" at word boundary (but not in URLs or package names)\n result = result.replaceAll(/\\byarn\\b(?![@/.])/g, 'pnpm')\n return result\n}\n\nfunction rewritePnpmToYarn(script: string): string {\n let result = script\n // pnpm --filter @pkg run script → yarn workspace @pkg run script\n result = result.replaceAll(/\\bpnpm --filter (\\S+) run /g, 'yarn workspace $1 run ')\n // pnpm -r run script → yarn workspaces foreach -Apt run script\n result = result.replaceAll(/\\bpnpm -r run /g, 'yarn workspaces foreach -Apt run ')\n // pnpm -r exec npm version X → yarn workspaces foreach --all version X --deferred\n result = result.replaceAll(/\\bpnpm -r exec npm version (\\S+) --no-git-tag-version/g, 'yarn workspaces foreach --all version $1 --deferred')\n // pnpm xy → yarn xy\n result = result.replaceAll(/\\bpnpm xy\\b/g, 'yarn xy')\n // pnpm add/remove/install/dedupe/outdated → yarn equivalents\n result = result.replaceAll(/\\bpnpm add\\b/g, 'yarn add')\n result = result.replaceAll(/\\bpnpm remove\\b/g, 'yarn remove')\n result = result.replaceAll(/\\bpnpm install\\b/g, 'yarn install')\n result = result.replaceAll(/\\bpnpm dedupe\\b/g, 'yarn dedupe')\n result = result.replaceAll(/\\bpnpm outdated\\b/g, 'yarn outdated')\n result = result.replaceAll(/\\bpnpm run\\b/g, 'yarn run')\n // Remaining bare \"pnpm\"\n result = result.replaceAll(/\\bpnpm\\b(?![@/.])/g, 'yarn')\n return result\n}\n\nexport function rewriteScript(script: string, direction: Direction): string {\n return direction === 'yarn-to-pnpm'\n ? rewriteYarnToPnpm(script)\n : rewritePnpmToYarn(script)\n}\n\nexport function rewriteScriptsInPackageJson(\n pkg: Record<string, unknown>,\n direction: Direction,\n): Record<string, unknown> {\n const scripts = pkg.scripts as Record<string, string> | undefined\n if (!scripts) return pkg\n\n const rewritten: Record<string, string> = {}\n for (const [name, script] of Object.entries(scripts)) {\n rewritten[name] = rewriteScript(script, direction)\n }\n return { ...pkg, scripts: rewritten }\n}\n","import {\n existsSync, readFileSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\ntype Direction = 'pnpm-to-yarn' | 'yarn-to-pnpm'\n\nconst SWAP_MAP: Record<Direction, [from: string, to: string][]> = {\n 'yarn-to-pnpm': [\n ['@xylabs/ts-scripts-yarn3', '@xylabs/ts-scripts-pnpm'],\n ],\n 'pnpm-to-yarn': [\n ['@xylabs/ts-scripts-pnpm', '@xylabs/ts-scripts-yarn3'],\n ],\n}\n\nfunction swapInPackageJson(pkgPath: string, direction: Direction): boolean {\n if (!existsSync(pkgPath)) return false\n\n const raw = readFileSync(pkgPath, 'utf8')\n const pkg = JSON.parse(raw)\n let changed = false\n\n for (const depField of ['dependencies', 'devDependencies']) {\n const deps = pkg[depField] as Record<string, string> | undefined\n if (!deps) continue\n\n for (const [from, to] of SWAP_MAP[direction]) {\n if (deps[from]) {\n deps[to] = deps[from]\n delete deps[from]\n changed = true\n }\n }\n }\n\n if (changed) {\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf8')\n }\n return changed\n}\n\nexport function swapTsScriptsDependency(cwd: string, workspacePackageJsonPaths: string[], direction: Direction): void {\n let count = 0\n\n // Swap in root package.json\n if (swapInPackageJson(PATH.join(cwd, 'package.json'), direction)) {\n count++\n }\n\n // Swap in workspace package.json files\n for (const pkgPath of workspacePackageJsonPaths) {\n const fullPath = PATH.resolve(cwd, pkgPath, 'package.json')\n if (swapInPackageJson(fullPath, direction)) {\n count++\n }\n }\n\n if (count > 0) {\n const target = direction === 'yarn-to-pnpm' ? '@xylabs/ts-scripts-pnpm' : '@xylabs/ts-scripts-yarn3'\n console.log(chalk.green(` Swapped ts-scripts dependency to ${target} in ${count} package(s)`))\n }\n}\n"],"mappings":"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","names":["existsSync","readFileSync","writeFileSync","PATH","chalk","writeFileSync","PATH","chalk","existsSync","readFileSync"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/packman/convertToPnpm.ts","../../../src/actions/packman/rewriteScripts.ts","../../../src/actions/packman/rewriteSourceImports.ts","../../../src/actions/packman/swapTsScriptsDependency.ts"],"sourcesContent":["import {\n existsSync, mkdirSync, readFileSync, rmSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport { rewriteScriptsInPackageJson } from './rewriteScripts.ts'\nimport { rewriteSourceImports } from './rewriteSourceImports.ts'\nimport { swapTsScriptsDependency } from './swapTsScriptsDependency.ts'\n\nconst PNPM_VERSION = '10.12.1'\n\nfunction createPnpmWorkspaceYaml(cwd: string, workspacePatterns: string[]): void {\n const lines = ['packages:']\n for (const pattern of workspacePatterns) {\n lines.push(` - '${pattern}'`)\n }\n writeFileSync(PATH.join(cwd, 'pnpm-workspace.yaml'), lines.join('\\n') + '\\n', 'utf8')\n console.log(chalk.green(' Created pnpm-workspace.yaml'))\n}\n\nfunction readPnpmWorkspacePatterns(cwd: string): string[] {\n const wsPath = PATH.join(cwd, 'pnpm-workspace.yaml')\n if (!existsSync(wsPath)) return []\n\n const content = readFileSync(wsPath, 'utf8')\n const patterns: string[] = []\n const lines = content.split('\\n')\n let inPackages = false\n for (const line of lines) {\n if (line.trim() === 'packages:') {\n inPackages = true\n continue\n }\n if (inPackages && /^\\s+-\\s+/.test(line)) {\n const pattern = line.replace(/^\\s+-\\s+/, '').replaceAll(/['\"]/g, '').trim()\n if (pattern) patterns.push(pattern)\n } else if (inPackages && !/^\\s/.test(line) && line.trim()) {\n inPackages = false\n }\n }\n return patterns\n}\n\nfunction updateRootPackageJson(cwd: string): string[] {\n const pkgPath = PATH.join(cwd, 'package.json')\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'))\n\n // Save workspace patterns before removing — fall back to pnpm-workspace.yaml if already converted\n const workspacePatterns: string[] = pkg.workspaces ?? readPnpmWorkspacePatterns(cwd)\n\n // Remove yarn workspaces field (pnpm uses pnpm-workspace.yaml)\n delete pkg.workspaces\n\n // Update packageManager\n pkg.packageManager = `pnpm@${PNPM_VERSION}`\n\n // Rewrite scripts\n const updated = rewriteScriptsInPackageJson(pkg, 'yarn-to-pnpm')\n\n writeFileSync(pkgPath, JSON.stringify(updated, null, 2) + '\\n', 'utf8')\n console.log(chalk.green(' Updated root package.json'))\n\n return workspacePatterns\n}\n\nfunction updateGitignore(cwd: string): void {\n const gitignorePath = PATH.join(cwd, '.gitignore')\n if (!existsSync(gitignorePath)) return\n\n let content = readFileSync(gitignorePath, 'utf8')\n\n // Remove yarn-specific entries\n const yarnLines = [\n '.pnp.*',\n '.pnp',\n '.yarn/*',\n '!.yarn/patches',\n '!.yarn/plugins',\n '!.yarn/releases',\n '!.yarn/sdks',\n '!.yarn/versions',\n ]\n for (const line of yarnLines) {\n content = content.replaceAll(new RegExp(String.raw`^${line.replaceAll('.', String.raw`\\.`).replaceAll('*', String.raw`\\*`).replaceAll('!', String.raw`\\!`)}\\s*$`, 'gm'), '')\n }\n\n // Clean up multiple blank lines\n content = content.replaceAll(/\\n{3,}/g, '\\n\\n')\n\n writeFileSync(gitignorePath, content, 'utf8')\n console.log(chalk.green(' Updated .gitignore'))\n}\n\nfunction deleteYarnArtifacts(cwd: string): void {\n const yarnLock = PATH.join(cwd, 'yarn.lock')\n const yarnrc = PATH.join(cwd, '.yarnrc.yml')\n const yarnDir = PATH.join(cwd, '.yarn')\n\n if (existsSync(yarnLock)) {\n rmSync(yarnLock)\n console.log(chalk.gray(' Deleted yarn.lock'))\n }\n if (existsSync(yarnrc)) {\n rmSync(yarnrc)\n console.log(chalk.gray(' Deleted .yarnrc.yml'))\n }\n if (existsSync(yarnDir)) {\n rmSync(yarnDir, { force: true, recursive: true })\n console.log(chalk.gray(' Deleted .yarn/'))\n }\n}\n\nfunction createNpmrc(cwd: string): void {\n const npmrcPath = PATH.join(cwd, '.npmrc')\n if (existsSync(npmrcPath)) return\n\n mkdirSync(PATH.dirname(npmrcPath), { recursive: true })\n writeFileSync(npmrcPath, '', 'utf8')\n console.log(chalk.green(' Created .npmrc'))\n}\n\nexport function convertToPnpm(cwd: string, workspacePackageJsonPaths: string[]): number {\n console.log(chalk.blue('\\nConverting to pnpm...\\n'))\n\n // 1. Read workspace patterns and update root package.json\n const workspacePatterns = updateRootPackageJson(cwd)\n\n // 2. Create pnpm-workspace.yaml\n createPnpmWorkspaceYaml(cwd, workspacePatterns)\n\n // 3. Rewrite scripts in workspace package.json files\n for (const pkgPath of workspacePackageJsonPaths) {\n const fullPath = PATH.resolve(cwd, pkgPath, 'package.json')\n if (!existsSync(fullPath)) continue\n const pkg = JSON.parse(readFileSync(fullPath, 'utf8'))\n const updated = rewriteScriptsInPackageJson(pkg, 'yarn-to-pnpm')\n if (JSON.stringify(pkg) !== JSON.stringify(updated)) {\n writeFileSync(fullPath, JSON.stringify(updated, null, 2) + '\\n', 'utf8')\n }\n }\n console.log(chalk.green(` Rewrote scripts in ${workspacePackageJsonPaths.length} workspace package(s)`))\n\n // 4. Update .gitignore\n updateGitignore(cwd)\n\n // 5. Create .npmrc\n createNpmrc(cwd)\n\n // 6. Swap ts-scripts devDependency (yarn3 → pnpm) in root and workspace packages\n swapTsScriptsDependency(cwd, workspacePackageJsonPaths, 'yarn-to-pnpm')\n\n // 7. Rewrite ts-scripts imports in source files\n rewriteSourceImports(cwd, 'yarn-to-pnpm')\n\n // 8. Delete yarn artifacts\n deleteYarnArtifacts(cwd)\n\n console.log(chalk.blue('\\nConversion complete. Run `pnpm install` to generate pnpm-lock.yaml.\\n'))\n return 0\n}\n","type Direction = 'pnpm-to-yarn' | 'yarn-to-pnpm'\n\nfunction rewriteYarnToPnpm(script: string): string {\n let result = script\n // yarn workspace @pkg run script → pnpm --filter @pkg run script\n result = result.replaceAll(/\\byarn workspace (\\S+) run /g, 'pnpm --filter $1 run ')\n // yarn workspace @pkg package-X → pnpm --filter @pkg run package-X\n result = result.replaceAll(/\\byarn workspace (\\S+) (package-\\S+)/g, 'pnpm --filter $1 run $2')\n // yarn workspaces foreach [flags] run script → pnpm -r run script\n result = result.replaceAll(/\\byarn workspaces foreach\\s+(?:[^\\s]*\\s+)*run /g, 'pnpm -r run ')\n // yarn workspaces foreach --all version X --deferred → pnpm -r exec npm version X --no-git-tag-version\n result = result.replaceAll(/\\byarn workspaces foreach --all version (\\S+) --deferred/g, 'pnpm -r exec npm version $1 --no-git-tag-version')\n // yarn version apply --all → (remove, handled in bump)\n result = result.replaceAll(/\\byarn version apply --all/g, 'echo \"versions applied\"')\n // yarn xy → pnpm xy\n result = result.replaceAll(/\\byarn xy\\b/g, 'pnpm xy')\n // yarn add/remove/install/dedupe/outdated → pnpm equivalents\n result = result.replaceAll(/\\byarn add\\b/g, 'pnpm add')\n result = result.replaceAll(/\\byarn remove\\b/g, 'pnpm remove')\n result = result.replaceAll(/\\byarn install\\b/g, 'pnpm install')\n result = result.replaceAll(/\\byarn dedupe\\b/g, 'pnpm dedupe')\n result = result.replaceAll(/\\byarn outdated\\b/g, 'pnpm outdated')\n result = result.replaceAll(/\\byarn run\\b/g, 'pnpm run')\n // yarn rimraf → rimraf (no PM prefix)\n result = result.replaceAll(/\\byarn rimraf\\b/g, 'rimraf')\n // yarn npm → npm (direct)\n result = result.replaceAll(/\\byarn npm\\b/g, 'npm')\n // Remaining bare \"yarn\" at word boundary (but not in URLs or package names)\n result = result.replaceAll(/\\byarn\\b(?![@/.])/g, 'pnpm')\n return result\n}\n\nfunction rewritePnpmToYarn(script: string): string {\n let result = script\n // pnpm --filter @pkg run script → yarn workspace @pkg run script\n result = result.replaceAll(/\\bpnpm --filter (\\S+) run /g, 'yarn workspace $1 run ')\n // pnpm -r run script → yarn workspaces foreach -Apt run script\n result = result.replaceAll(/\\bpnpm -r run /g, 'yarn workspaces foreach -Apt run ')\n // pnpm -r exec npm version X → yarn workspaces foreach --all version X --deferred\n result = result.replaceAll(/\\bpnpm -r exec npm version (\\S+) --no-git-tag-version/g, 'yarn workspaces foreach --all version $1 --deferred')\n // pnpm xy → yarn xy\n result = result.replaceAll(/\\bpnpm xy\\b/g, 'yarn xy')\n // pnpm add/remove/install/dedupe/outdated → yarn equivalents\n result = result.replaceAll(/\\bpnpm add\\b/g, 'yarn add')\n result = result.replaceAll(/\\bpnpm remove\\b/g, 'yarn remove')\n result = result.replaceAll(/\\bpnpm install\\b/g, 'yarn install')\n result = result.replaceAll(/\\bpnpm dedupe\\b/g, 'yarn dedupe')\n result = result.replaceAll(/\\bpnpm outdated\\b/g, 'yarn outdated')\n result = result.replaceAll(/\\bpnpm run\\b/g, 'yarn run')\n // Remaining bare \"pnpm\"\n result = result.replaceAll(/\\bpnpm\\b(?![@/.])/g, 'yarn')\n return result\n}\n\nexport function rewriteScript(script: string, direction: Direction): string {\n return direction === 'yarn-to-pnpm'\n ? rewriteYarnToPnpm(script)\n : rewritePnpmToYarn(script)\n}\n\nexport function rewriteScriptsInPackageJson(\n pkg: Record<string, unknown>,\n direction: Direction,\n): Record<string, unknown> {\n const scripts = pkg.scripts as Record<string, string> | undefined\n if (!scripts) return pkg\n\n const rewritten: Record<string, string> = {}\n for (const [name, script] of Object.entries(scripts)) {\n rewritten[name] = rewriteScript(script, direction)\n }\n return { ...pkg, scripts: rewritten }\n}\n","import {\n existsSync, readFileSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\nimport { globSync } from 'glob'\n\ntype Direction = 'pnpm-to-yarn' | 'yarn-to-pnpm'\n\nconst IMPORT_SWAP_MAP: Record<Direction, [from: string, to: string][]> = {\n 'yarn-to-pnpm': [\n ['@xylabs/ts-scripts-yarn3', '@xylabs/ts-scripts-pnpm'],\n ['@xylabs/ts-scripts-react-yarn3', '@xylabs/ts-scripts-react-pnpm'],\n ],\n 'pnpm-to-yarn': [\n ['@xylabs/ts-scripts-pnpm', '@xylabs/ts-scripts-yarn3'],\n ['@xylabs/ts-scripts-react-pnpm', '@xylabs/ts-scripts-react-yarn3'],\n ],\n}\n\nconst SOURCE_GLOBS = [\n '**/*.ts',\n '**/*.tsx',\n '**/*.mts',\n '**/*.cts',\n '**/*.js',\n '**/*.mjs',\n]\n\nconst IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.yarn/**',\n]\n\nexport function rewriteSourceImports(cwd: string, direction: Direction): void {\n const swaps = IMPORT_SWAP_MAP[direction]\n const files = globSync(SOURCE_GLOBS, {\n cwd,\n absolute: true,\n ignore: IGNORE_PATTERNS,\n })\n\n let count = 0\n for (const file of files) {\n if (!existsSync(file)) continue\n const original = readFileSync(file, 'utf8')\n let content = original\n for (const [from, to] of swaps) {\n content = content.replaceAll(from, to)\n }\n if (content !== original) {\n writeFileSync(file, content, 'utf8')\n count++\n }\n }\n\n if (count > 0) {\n console.log(chalk.green(` Rewrote ts-scripts imports in ${count} source file(s)`))\n }\n}\n","import {\n existsSync, readFileSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\ntype Direction = 'pnpm-to-yarn' | 'yarn-to-pnpm'\n\nconst SWAP_MAP: Record<Direction, [from: string, to: string][]> = {\n 'yarn-to-pnpm': [\n ['@xylabs/ts-scripts-yarn3', '@xylabs/ts-scripts-pnpm'],\n ],\n 'pnpm-to-yarn': [\n ['@xylabs/ts-scripts-pnpm', '@xylabs/ts-scripts-yarn3'],\n ],\n}\n\nfunction swapInPackageJson(pkgPath: string, direction: Direction): boolean {\n if (!existsSync(pkgPath)) return false\n\n const raw = readFileSync(pkgPath, 'utf8')\n const pkg = JSON.parse(raw)\n let changed = false\n\n for (const depField of ['dependencies', 'devDependencies']) {\n const deps = pkg[depField] as Record<string, string> | undefined\n if (!deps) continue\n\n for (const [from, to] of SWAP_MAP[direction]) {\n if (deps[from]) {\n deps[to] = deps[from]\n delete deps[from]\n changed = true\n }\n }\n }\n\n if (changed) {\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf8')\n }\n return changed\n}\n\nexport function swapTsScriptsDependency(cwd: string, workspacePackageJsonPaths: string[], direction: Direction): void {\n let count = 0\n\n // Swap in root package.json\n if (swapInPackageJson(PATH.join(cwd, 'package.json'), direction)) {\n count++\n }\n\n // Swap in workspace package.json files\n for (const pkgPath of workspacePackageJsonPaths) {\n const fullPath = PATH.resolve(cwd, pkgPath, 'package.json')\n if (swapInPackageJson(fullPath, direction)) {\n count++\n }\n }\n\n if (count > 0) {\n const target = direction === 'yarn-to-pnpm' ? '@xylabs/ts-scripts-pnpm' : '@xylabs/ts-scripts-yarn3'\n console.log(chalk.green(` Swapped ts-scripts dependency to ${target} in ${count} package(s)`))\n }\n}\n"],"mappings":"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","names":["existsSync","readFileSync","writeFileSync","PATH","chalk","existsSync","readFileSync","writeFileSync","chalk","writeFileSync","PATH","chalk","existsSync","readFileSync"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// src/actions/packman/convertToYarn.ts
|
|
2
2
|
import {
|
|
3
|
-
existsSync as
|
|
4
|
-
readFileSync as
|
|
3
|
+
existsSync as existsSync3,
|
|
4
|
+
readFileSync as readFileSync3,
|
|
5
5
|
rmSync,
|
|
6
|
-
writeFileSync as
|
|
6
|
+
writeFileSync as writeFileSync3
|
|
7
7
|
} from "fs";
|
|
8
8
|
import PATH2 from "path";
|
|
9
|
-
import
|
|
9
|
+
import chalk3 from "chalk";
|
|
10
10
|
|
|
11
11
|
// src/actions/packman/rewriteScripts.ts
|
|
12
12
|
function rewriteYarnToPnpm(script) {
|
|
@@ -56,14 +56,71 @@ function rewriteScriptsInPackageJson(pkg, direction) {
|
|
|
56
56
|
return { ...pkg, scripts: rewritten };
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
// src/actions/packman/
|
|
59
|
+
// src/actions/packman/rewriteSourceImports.ts
|
|
60
60
|
import {
|
|
61
61
|
existsSync,
|
|
62
62
|
readFileSync,
|
|
63
63
|
writeFileSync
|
|
64
64
|
} from "fs";
|
|
65
|
-
import PATH from "path";
|
|
66
65
|
import chalk from "chalk";
|
|
66
|
+
import { globSync } from "glob";
|
|
67
|
+
var IMPORT_SWAP_MAP = {
|
|
68
|
+
"yarn-to-pnpm": [
|
|
69
|
+
["@xylabs/ts-scripts-yarn3", "@xylabs/ts-scripts-pnpm"],
|
|
70
|
+
["@xylabs/ts-scripts-react-yarn3", "@xylabs/ts-scripts-react-pnpm"]
|
|
71
|
+
],
|
|
72
|
+
"pnpm-to-yarn": [
|
|
73
|
+
["@xylabs/ts-scripts-pnpm", "@xylabs/ts-scripts-yarn3"],
|
|
74
|
+
["@xylabs/ts-scripts-react-pnpm", "@xylabs/ts-scripts-react-yarn3"]
|
|
75
|
+
]
|
|
76
|
+
};
|
|
77
|
+
var SOURCE_GLOBS = [
|
|
78
|
+
"**/*.ts",
|
|
79
|
+
"**/*.tsx",
|
|
80
|
+
"**/*.mts",
|
|
81
|
+
"**/*.cts",
|
|
82
|
+
"**/*.js",
|
|
83
|
+
"**/*.mjs"
|
|
84
|
+
];
|
|
85
|
+
var IGNORE_PATTERNS = [
|
|
86
|
+
"**/node_modules/**",
|
|
87
|
+
"**/dist/**",
|
|
88
|
+
"**/build/**",
|
|
89
|
+
"**/.yarn/**"
|
|
90
|
+
];
|
|
91
|
+
function rewriteSourceImports(cwd, direction) {
|
|
92
|
+
const swaps = IMPORT_SWAP_MAP[direction];
|
|
93
|
+
const files = globSync(SOURCE_GLOBS, {
|
|
94
|
+
cwd,
|
|
95
|
+
absolute: true,
|
|
96
|
+
ignore: IGNORE_PATTERNS
|
|
97
|
+
});
|
|
98
|
+
let count = 0;
|
|
99
|
+
for (const file of files) {
|
|
100
|
+
if (!existsSync(file)) continue;
|
|
101
|
+
const original = readFileSync(file, "utf8");
|
|
102
|
+
let content = original;
|
|
103
|
+
for (const [from, to] of swaps) {
|
|
104
|
+
content = content.replaceAll(from, to);
|
|
105
|
+
}
|
|
106
|
+
if (content !== original) {
|
|
107
|
+
writeFileSync(file, content, "utf8");
|
|
108
|
+
count++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (count > 0) {
|
|
112
|
+
console.log(chalk.green(` Rewrote ts-scripts imports in ${count} source file(s)`));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// src/actions/packman/swapTsScriptsDependency.ts
|
|
117
|
+
import {
|
|
118
|
+
existsSync as existsSync2,
|
|
119
|
+
readFileSync as readFileSync2,
|
|
120
|
+
writeFileSync as writeFileSync2
|
|
121
|
+
} from "fs";
|
|
122
|
+
import PATH from "path";
|
|
123
|
+
import chalk2 from "chalk";
|
|
67
124
|
var SWAP_MAP = {
|
|
68
125
|
"yarn-to-pnpm": [
|
|
69
126
|
["@xylabs/ts-scripts-yarn3", "@xylabs/ts-scripts-pnpm"]
|
|
@@ -73,8 +130,8 @@ var SWAP_MAP = {
|
|
|
73
130
|
]
|
|
74
131
|
};
|
|
75
132
|
function swapInPackageJson(pkgPath, direction) {
|
|
76
|
-
if (!
|
|
77
|
-
const raw =
|
|
133
|
+
if (!existsSync2(pkgPath)) return false;
|
|
134
|
+
const raw = readFileSync2(pkgPath, "utf8");
|
|
78
135
|
const pkg = JSON.parse(raw);
|
|
79
136
|
let changed = false;
|
|
80
137
|
for (const depField of ["dependencies", "devDependencies"]) {
|
|
@@ -89,7 +146,7 @@ function swapInPackageJson(pkgPath, direction) {
|
|
|
89
146
|
}
|
|
90
147
|
}
|
|
91
148
|
if (changed) {
|
|
92
|
-
|
|
149
|
+
writeFileSync2(pkgPath, JSON.stringify(pkg, null, 2) + "\n", "utf8");
|
|
93
150
|
}
|
|
94
151
|
return changed;
|
|
95
152
|
}
|
|
@@ -106,7 +163,7 @@ function swapTsScriptsDependency(cwd, workspacePackageJsonPaths, direction) {
|
|
|
106
163
|
}
|
|
107
164
|
if (count > 0) {
|
|
108
165
|
const target = direction === "yarn-to-pnpm" ? "@xylabs/ts-scripts-pnpm" : "@xylabs/ts-scripts-yarn3";
|
|
109
|
-
console.log(
|
|
166
|
+
console.log(chalk2.green(` Swapped ts-scripts dependency to ${target} in ${count} package(s)`));
|
|
110
167
|
}
|
|
111
168
|
}
|
|
112
169
|
|
|
@@ -133,8 +190,8 @@ var YARN_GITIGNORE_ENTRIES = `
|
|
|
133
190
|
`;
|
|
134
191
|
function readPnpmWorkspacePatterns(cwd) {
|
|
135
192
|
const wsPath = PATH2.join(cwd, "pnpm-workspace.yaml");
|
|
136
|
-
if (!
|
|
137
|
-
const content =
|
|
193
|
+
if (!existsSync3(wsPath)) return [];
|
|
194
|
+
const content = readFileSync3(wsPath, "utf8");
|
|
138
195
|
const patterns = [];
|
|
139
196
|
const lines = content.split("\n");
|
|
140
197
|
let inPackages = false;
|
|
@@ -154,81 +211,82 @@ function readPnpmWorkspacePatterns(cwd) {
|
|
|
154
211
|
}
|
|
155
212
|
function updateRootPackageJson(cwd, workspacePatterns) {
|
|
156
213
|
const pkgPath = PATH2.join(cwd, "package.json");
|
|
157
|
-
const pkg = JSON.parse(
|
|
214
|
+
const pkg = JSON.parse(readFileSync3(pkgPath, "utf8"));
|
|
158
215
|
pkg.workspaces = workspacePatterns;
|
|
159
216
|
pkg.packageManager = `yarn@${YARN_VERSION}`;
|
|
160
217
|
const updated = rewriteScriptsInPackageJson(pkg, "pnpm-to-yarn");
|
|
161
|
-
|
|
162
|
-
console.log(
|
|
218
|
+
writeFileSync3(pkgPath, JSON.stringify(updated, null, 2) + "\n", "utf8");
|
|
219
|
+
console.log(chalk3.green(" Updated root package.json"));
|
|
163
220
|
}
|
|
164
221
|
function updateGitignore(cwd) {
|
|
165
222
|
const gitignorePath = PATH2.join(cwd, ".gitignore");
|
|
166
|
-
let content =
|
|
223
|
+
let content = existsSync3(gitignorePath) ? readFileSync3(gitignorePath, "utf8") : "";
|
|
167
224
|
if (!content.includes(".yarn/*")) {
|
|
168
225
|
content = content.trimEnd() + "\n" + YARN_GITIGNORE_ENTRIES;
|
|
169
226
|
}
|
|
170
|
-
|
|
171
|
-
console.log(
|
|
227
|
+
writeFileSync3(gitignorePath, content, "utf8");
|
|
228
|
+
console.log(chalk3.green(" Updated .gitignore"));
|
|
172
229
|
}
|
|
173
230
|
function deletePnpmArtifacts(cwd) {
|
|
174
231
|
const lockfile = PATH2.join(cwd, "pnpm-lock.yaml");
|
|
175
232
|
const workspaceYaml = PATH2.join(cwd, "pnpm-workspace.yaml");
|
|
176
233
|
const npmrc = PATH2.join(cwd, ".npmrc");
|
|
177
|
-
if (
|
|
234
|
+
if (existsSync3(lockfile)) {
|
|
178
235
|
rmSync(lockfile);
|
|
179
|
-
console.log(
|
|
236
|
+
console.log(chalk3.gray(" Deleted pnpm-lock.yaml"));
|
|
180
237
|
}
|
|
181
|
-
if (
|
|
238
|
+
if (existsSync3(workspaceYaml)) {
|
|
182
239
|
rmSync(workspaceYaml);
|
|
183
|
-
console.log(
|
|
240
|
+
console.log(chalk3.gray(" Deleted pnpm-workspace.yaml"));
|
|
184
241
|
}
|
|
185
|
-
if (
|
|
186
|
-
const content =
|
|
242
|
+
if (existsSync3(npmrc)) {
|
|
243
|
+
const content = readFileSync3(npmrc, "utf8");
|
|
187
244
|
if (content.trim() === "" || content.includes("shamefully-hoist") || content.includes("node-linker")) {
|
|
188
245
|
rmSync(npmrc);
|
|
189
|
-
console.log(
|
|
246
|
+
console.log(chalk3.gray(" Deleted .npmrc"));
|
|
190
247
|
}
|
|
191
248
|
}
|
|
192
249
|
}
|
|
193
250
|
function createYarnrc(cwd) {
|
|
194
251
|
const yarnrcPath = PATH2.join(cwd, ".yarnrc.yml");
|
|
195
|
-
if (
|
|
196
|
-
|
|
197
|
-
console.log(
|
|
252
|
+
if (existsSync3(yarnrcPath)) return;
|
|
253
|
+
writeFileSync3(yarnrcPath, YARNRC_TEMPLATE, "utf8");
|
|
254
|
+
console.log(chalk3.green(" Created .yarnrc.yml"));
|
|
198
255
|
}
|
|
199
256
|
function readWorkspacePatternsFromPackageJson(cwd) {
|
|
200
257
|
const pkgPath = PATH2.join(cwd, "package.json");
|
|
201
|
-
if (!
|
|
202
|
-
const pkg = JSON.parse(
|
|
258
|
+
if (!existsSync3(pkgPath)) return [];
|
|
259
|
+
const pkg = JSON.parse(readFileSync3(pkgPath, "utf8"));
|
|
203
260
|
return pkg.workspaces ?? [];
|
|
204
261
|
}
|
|
205
262
|
function convertToYarn(cwd, workspacePackageJsonPaths) {
|
|
206
|
-
console.log(
|
|
263
|
+
console.log(chalk3.blue("\nConverting to yarn...\n"));
|
|
207
264
|
const workspacePatterns = readPnpmWorkspacePatterns(cwd);
|
|
208
265
|
if (workspacePatterns.length === 0) {
|
|
209
266
|
const fromPkg = readWorkspacePatternsFromPackageJson(cwd);
|
|
210
267
|
if (fromPkg.length > 0) {
|
|
211
268
|
workspacePatterns.push(...fromPkg);
|
|
212
269
|
} else {
|
|
213
|
-
console.warn(
|
|
270
|
+
console.warn(chalk3.yellow(" No workspace patterns found"));
|
|
214
271
|
}
|
|
215
272
|
}
|
|
216
273
|
updateRootPackageJson(cwd, workspacePatterns);
|
|
217
274
|
for (const pkgPath of workspacePackageJsonPaths) {
|
|
218
275
|
const fullPath = PATH2.resolve(cwd, pkgPath, "package.json");
|
|
219
|
-
if (!
|
|
220
|
-
const pkg = JSON.parse(
|
|
276
|
+
if (!existsSync3(fullPath)) continue;
|
|
277
|
+
const pkg = JSON.parse(readFileSync3(fullPath, "utf8"));
|
|
221
278
|
const updated = rewriteScriptsInPackageJson(pkg, "pnpm-to-yarn");
|
|
222
279
|
if (JSON.stringify(pkg) !== JSON.stringify(updated)) {
|
|
223
|
-
|
|
280
|
+
writeFileSync3(fullPath, JSON.stringify(updated, null, 2) + "\n", "utf8");
|
|
224
281
|
}
|
|
225
282
|
}
|
|
226
|
-
console.log(
|
|
283
|
+
console.log(chalk3.green(` Rewrote scripts in ${workspacePackageJsonPaths.length} workspace package(s)`));
|
|
227
284
|
updateGitignore(cwd);
|
|
228
285
|
createYarnrc(cwd);
|
|
229
286
|
swapTsScriptsDependency(cwd, workspacePackageJsonPaths, "pnpm-to-yarn");
|
|
287
|
+
rewriteSourceImports(cwd, "pnpm-to-yarn");
|
|
230
288
|
deletePnpmArtifacts(cwd);
|
|
231
|
-
console.log(
|
|
289
|
+
console.log(chalk3.blue("\nConversion complete. Run `corepack enable yarn && yarn set version stable && yarn install` to finish setup.\n"));
|
|
232
290
|
return 0;
|
|
233
291
|
}
|
|
234
292
|
export {
|