@xylabs/toolchain 7.10.2 → 7.10.3

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.
@@ -1,12 +1,28 @@
1
1
  // src/lib/deprecationMigrate.ts
2
+ import { spawnSync } from "child_process";
2
3
  import {
3
- existsSync,
4
+ existsSync as existsSync2,
4
5
  readFileSync,
5
6
  writeFileSync
6
7
  } from "fs";
7
8
  import PATH from "path";
8
9
  import { createInterface } from "readline";
9
10
  import chalk from "chalk";
11
+
12
+ // src/pm/detectPackageManager.ts
13
+ import { existsSync } from "fs";
14
+ function detectPackageManager() {
15
+ if (existsSync("pnpm-lock.yaml") || existsSync("pnpm-workspace.yaml")) return "pnpm";
16
+ return "yarn";
17
+ }
18
+
19
+ // src/lib/deprecationMigrate.ts
20
+ var DEPRECATED_PACKAGES = [
21
+ "@xylabs/ts-scripts-common",
22
+ "@xylabs/ts-scripts-yarn3",
23
+ "@xylabs/ts-scripts-pnpm",
24
+ "@xylabs/ts-scripts-react-yarn3"
25
+ ];
10
26
  function findProjectRoot() {
11
27
  return process.env.INIT_CWD ?? process.cwd();
12
28
  }
@@ -19,79 +35,98 @@ function askYesNo(question) {
19
35
  });
20
36
  });
21
37
  }
22
- function replaceInFile(filePath, oldStr, newStr) {
23
- if (!existsSync(filePath)) return false;
24
- const content = readFileSync(filePath, "utf8");
25
- if (!content.includes(oldStr)) return false;
26
- writeFileSync(filePath, content.replaceAll(oldStr, newStr), "utf8");
27
- return true;
28
- }
29
- function migrateRootPackageJson(pkg, pkgPath, oldPackage, depField) {
30
- const version = pkg[depField][oldPackage];
31
- delete pkg[depField][oldPackage];
32
- pkg[depField]["@xylabs/toolchain"] = version;
33
- writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}
34
- `, "utf8");
35
- console.warn(chalk.green(` \u2713 Replaced ${oldPackage} \u2192 @xylabs/toolchain in ${depField}`));
38
+ function replaceAllOldPackagesInFile(filePath) {
39
+ if (!existsSync2(filePath)) return false;
40
+ let content = readFileSync(filePath, "utf8");
41
+ let changed = false;
42
+ for (const oldPkg of DEPRECATED_PACKAGES) {
43
+ if (content.includes(oldPkg)) {
44
+ content = content.replaceAll(oldPkg, "@xylabs/toolchain");
45
+ changed = true;
46
+ }
47
+ }
48
+ if (changed) {
49
+ writeFileSync(filePath, content, "utf8");
50
+ }
51
+ return changed;
36
52
  }
37
- function migrateWorkspacePackageJson(wsPkgPath, dir, oldPackage) {
38
- if (!existsSync(wsPkgPath)) return;
39
- const wsPkg = JSON.parse(readFileSync(wsPkgPath, "utf8"));
53
+ function migratePackageJson(pkgPath, label) {
54
+ if (!existsSync2(pkgPath)) return false;
55
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
40
56
  let changed = false;
41
57
  for (const field of ["dependencies", "devDependencies", "peerDependencies"]) {
42
- if (wsPkg[field]?.[oldPackage]) {
43
- const ver = wsPkg[field][oldPackage];
44
- delete wsPkg[field][oldPackage];
45
- wsPkg[field]["@xylabs/toolchain"] = ver;
46
- changed = true;
58
+ for (const oldPkg of DEPRECATED_PACKAGES) {
59
+ if (pkg[field]?.[oldPkg]) {
60
+ const ver = pkg[field][oldPkg];
61
+ delete pkg[field][oldPkg];
62
+ if (!pkg[field]["@xylabs/toolchain"]) {
63
+ pkg[field]["@xylabs/toolchain"] = ver;
64
+ }
65
+ changed = true;
66
+ }
47
67
  }
48
68
  }
49
69
  if (changed) {
50
- writeFileSync(wsPkgPath, `${JSON.stringify(wsPkg, null, 2)}
70
+ writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}
51
71
  `, "utf8");
52
- console.warn(chalk.green(` \u2713 Updated ${dir}/package.json`));
72
+ console.warn(chalk.green(` \u2713 Updated ${label}`));
53
73
  }
74
+ return changed;
54
75
  }
55
- async function migrateWorkspaces(root, workspacesGlob, oldPackage) {
56
- if (!Array.isArray(workspacesGlob)) return;
76
+ async function migrateWorkspaces(root) {
57
77
  const { globSync } = await import("glob");
58
- for (const pattern of workspacesGlob) {
59
- const dirs = globSync(pattern, { cwd: root });
60
- for (const dir of dirs) {
61
- if (replaceInFile(PATH.join(root, dir, "xy.config.ts"), oldPackage, "@xylabs/toolchain")) {
62
- console.warn(chalk.green(` \u2713 Updated ${dir}/xy.config.ts imports`));
63
- }
64
- migrateWorkspacePackageJson(PATH.join(root, dir, "package.json"), dir, oldPackage);
78
+ const packageJsonFiles = globSync("**/package.json", {
79
+ cwd: root,
80
+ ignore: ["node_modules/**", "**/node_modules/**", "dist/**", "**/dist/**"]
81
+ });
82
+ for (const relPath of packageJsonFiles) {
83
+ if (relPath === "package.json") continue;
84
+ const dir = PATH.dirname(relPath);
85
+ migratePackageJson(PATH.join(root, relPath), relPath);
86
+ const xyConfigPath = PATH.join(root, dir, "xy.config.ts");
87
+ if (replaceAllOldPackagesInFile(xyConfigPath)) {
88
+ console.warn(chalk.green(` \u2713 Updated ${dir}/xy.config.ts`));
65
89
  }
66
90
  }
67
91
  }
68
- function printManualInstructions(oldPackage) {
92
+ function printManualInstructions() {
69
93
  console.warn(chalk.gray(" Skipped. To migrate manually:\n"));
70
- console.warn(chalk.gray(` 1. Replace "${oldPackage}" with "@xylabs/toolchain" in package.json`));
71
- console.warn(chalk.gray(" 2. Update xy.config.ts imports"));
94
+ console.warn(chalk.gray(" 1. Replace all @xylabs/ts-scripts-* deps with @xylabs/toolchain in package.json"));
95
+ console.warn(chalk.gray(" 2. Update imports in xy.config.ts files"));
72
96
  console.warn(chalk.gray(" 3. Run your package manager install\n"));
73
97
  }
74
98
  async function deprecationMigrate(oldPackage) {
75
99
  const root = findProjectRoot();
76
100
  const pkgPath = PATH.join(root, "package.json");
77
- if (!existsSync(pkgPath)) return;
101
+ if (!existsSync2(pkgPath)) return;
78
102
  const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
79
- const depField = pkg.dependencies?.[oldPackage] ? "dependencies" : pkg.devDependencies?.[oldPackage] ? "devDependencies" : void 0;
80
- if (!depField) return;
103
+ const hasOldDep = DEPRECATED_PACKAGES.some((dep) => pkg.dependencies?.[dep] || pkg.devDependencies?.[dep]);
104
+ if (!hasOldDep) return;
81
105
  console.warn(chalk.yellow(`
82
106
  \u26A0 ${oldPackage} is deprecated. Use @xylabs/toolchain instead.
83
107
  `));
84
108
  const shouldMigrate = await askYesNo(chalk.cyan(" Auto-migrate to @xylabs/toolchain? [y/N] "));
85
109
  if (!shouldMigrate) {
86
- printManualInstructions(oldPackage);
110
+ printManualInstructions();
87
111
  return;
88
112
  }
89
- migrateRootPackageJson(pkg, pkgPath, oldPackage, depField);
90
- if (replaceInFile(PATH.join(root, "xy.config.ts"), oldPackage, "@xylabs/toolchain")) {
91
- console.warn(chalk.green(" \u2713 Updated xy.config.ts imports"));
113
+ migratePackageJson(pkgPath, "package.json");
114
+ if (replaceAllOldPackagesInFile(PATH.join(root, "xy.config.ts"))) {
115
+ console.warn(chalk.green(" \u2713 Updated xy.config.ts"));
116
+ }
117
+ await migrateWorkspaces(root);
118
+ const pm = detectPackageManager();
119
+ console.warn(chalk.cyan(`
120
+ Running ${pm} install...
121
+ `));
122
+ const result = spawnSync(pm, ["install"], { cwd: root, stdio: "inherit" });
123
+ if (result.status === 0) {
124
+ console.warn(chalk.green(" \u2713 Migration complete. Re-run your command.\n"));
125
+ } else {
126
+ console.warn(chalk.red(` Install failed (exit ${result.status}). Run "${pm} install" manually.
127
+ `));
92
128
  }
93
- await migrateWorkspaces(root, pkg.workspaces, oldPackage);
94
- console.warn(chalk.yellow("\n Run your package manager install to complete the migration.\n"));
129
+ process.exit(result.status ?? 1);
95
130
  }
96
131
  export {
97
132
  deprecationMigrate
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/deprecationMigrate.ts"],"sourcesContent":["import {\n existsSync, readFileSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\nimport { createInterface } from 'node:readline'\n\nimport chalk from 'chalk'\n\nfunction findProjectRoot(): string {\n return process.env.INIT_CWD ?? process.cwd()\n}\n\nfunction askYesNo(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stderr })\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close()\n resolve(answer.trim().toLowerCase().startsWith('y'))\n })\n })\n}\n\nfunction replaceInFile(filePath: string, oldStr: string, newStr: string): boolean {\n if (!existsSync(filePath)) return false\n const content = readFileSync(filePath, 'utf8')\n if (!content.includes(oldStr)) return false\n writeFileSync(filePath, content.replaceAll(oldStr, newStr), 'utf8')\n return true\n}\n\nfunction migrateRootPackageJson(\n pkg: Record<string, Record<string, string>>,\n pkgPath: string,\n oldPackage: string,\n depField: string,\n): void {\n const version = pkg[depField][oldPackage]\n delete pkg[depField][oldPackage]\n pkg[depField]['@xylabs/toolchain'] = version\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\n console.warn(chalk.green(` Replaced ${oldPackage} → @xylabs/toolchain in ${depField}`))\n}\n\nfunction migrateWorkspacePackageJson(wsPkgPath: string, dir: string, oldPackage: string): void {\n if (!existsSync(wsPkgPath)) return\n const wsPkg = JSON.parse(readFileSync(wsPkgPath, 'utf8')) as Record<string, Record<string, string>>\n let changed = false\n for (const field of ['dependencies', 'devDependencies', 'peerDependencies'] as const) {\n if (wsPkg[field]?.[oldPackage]) {\n const ver = wsPkg[field][oldPackage]\n delete wsPkg[field][oldPackage]\n wsPkg[field]['@xylabs/toolchain'] = ver\n changed = true\n }\n }\n if (changed) {\n writeFileSync(wsPkgPath, `${JSON.stringify(wsPkg, null, 2)}\\n`, 'utf8')\n console.warn(chalk.green(` ✓ Updated ${dir}/package.json`))\n }\n}\n\nasync function migrateWorkspaces(root: string, workspacesGlob: unknown, oldPackage: string): Promise<void> {\n if (!Array.isArray(workspacesGlob)) return\n const { globSync } = await import('glob')\n for (const pattern of workspacesGlob) {\n const dirs = globSync(pattern as string, { cwd: root })\n for (const dir of dirs) {\n if (replaceInFile(PATH.join(root, dir, 'xy.config.ts'), oldPackage, '@xylabs/toolchain')) {\n console.warn(chalk.green(` ✓ Updated ${dir}/xy.config.ts imports`))\n }\n migrateWorkspacePackageJson(PATH.join(root, dir, 'package.json'), dir, oldPackage)\n }\n }\n}\n\nfunction printManualInstructions(oldPackage: string): void {\n console.warn(chalk.gray(' Skipped. To migrate manually:\\n'))\n console.warn(chalk.gray(` 1. Replace \"${oldPackage}\" with \"@xylabs/toolchain\" in package.json`))\n console.warn(chalk.gray(' 2. Update xy.config.ts imports'))\n console.warn(chalk.gray(' 3. Run your package manager install\\n'))\n}\n\nexport async function deprecationMigrate(oldPackage: string): Promise<void> {\n const root = findProjectRoot()\n const pkgPath = PATH.join(root, 'package.json')\n\n if (!existsSync(pkgPath)) return\n\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, Record<string, string>>\n const depField = pkg.dependencies?.[oldPackage]\n ? 'dependencies'\n : pkg.devDependencies?.[oldPackage]\n ? 'devDependencies'\n : undefined\n\n if (!depField) return\n\n console.warn(chalk.yellow(`\\n⚠ ${oldPackage} is deprecated. Use @xylabs/toolchain instead.\\n`))\n\n const shouldMigrate = await askYesNo(chalk.cyan(' Auto-migrate to @xylabs/toolchain? [y/N] '))\n\n if (!shouldMigrate) {\n printManualInstructions(oldPackage)\n return\n }\n\n migrateRootPackageJson(pkg, pkgPath, oldPackage, depField)\n\n if (replaceInFile(PATH.join(root, 'xy.config.ts'), oldPackage, '@xylabs/toolchain')) {\n console.warn(chalk.green(' ✓ Updated xy.config.ts imports'))\n }\n\n await migrateWorkspaces(root, pkg.workspaces, oldPackage)\n\n console.warn(chalk.yellow('\\n Run your package manager install to complete the migration.\\n'))\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/lib/deprecationMigrate.ts","../../src/pm/detectPackageManager.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process'\nimport {\n existsSync, readFileSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\nimport { createInterface } from 'node:readline'\n\nimport chalk from 'chalk'\n\nimport { detectPackageManager } from '../pm/index.ts'\n\nconst DEPRECATED_PACKAGES = [\n '@xylabs/ts-scripts-common',\n '@xylabs/ts-scripts-yarn3',\n '@xylabs/ts-scripts-pnpm',\n '@xylabs/ts-scripts-react-yarn3',\n]\n\nfunction findProjectRoot(): string {\n return process.env.INIT_CWD ?? process.cwd()\n}\n\nfunction askYesNo(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stderr })\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close()\n resolve(answer.trim().toLowerCase().startsWith('y'))\n })\n })\n}\n\nfunction replaceAllOldPackagesInFile(filePath: string): boolean {\n if (!existsSync(filePath)) return false\n let content = readFileSync(filePath, 'utf8')\n let changed = false\n for (const oldPkg of DEPRECATED_PACKAGES) {\n if (content.includes(oldPkg)) {\n content = content.replaceAll(oldPkg, '@xylabs/toolchain')\n changed = true\n }\n }\n if (changed) {\n writeFileSync(filePath, content, 'utf8')\n }\n return changed\n}\n\nfunction migratePackageJson(pkgPath: string, label: string): boolean {\n if (!existsSync(pkgPath)) return false\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, Record<string, string>>\n let changed = false\n\n for (const field of ['dependencies', 'devDependencies', 'peerDependencies'] as const) {\n for (const oldPkg of DEPRECATED_PACKAGES) {\n if (pkg[field]?.[oldPkg]) {\n const ver = pkg[field][oldPkg]\n delete pkg[field][oldPkg]\n // Only add toolchain if not already present in this field\n if (!pkg[field]['@xylabs/toolchain']) {\n pkg[field]['@xylabs/toolchain'] = ver\n }\n changed = true\n }\n }\n }\n\n if (changed) {\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\n console.warn(chalk.green(` ✓ Updated ${label}`))\n }\n return changed\n}\n\nasync function migrateWorkspaces(root: string): Promise<void> {\n const { globSync } = await import('glob')\n const packageJsonFiles = globSync('**/package.json', {\n cwd: root,\n ignore: ['node_modules/**', '**/node_modules/**', 'dist/**', '**/dist/**'],\n })\n\n for (const relPath of packageJsonFiles) {\n // Skip root package.json (already handled)\n if (relPath === 'package.json') continue\n\n const dir = PATH.dirname(relPath)\n migratePackageJson(PATH.join(root, relPath), relPath)\n\n const xyConfigPath = PATH.join(root, dir, 'xy.config.ts')\n if (replaceAllOldPackagesInFile(xyConfigPath)) {\n console.warn(chalk.green(` ✓ Updated ${dir}/xy.config.ts`))\n }\n }\n}\n\nfunction printManualInstructions(): void {\n console.warn(chalk.gray(' Skipped. To migrate manually:\\n'))\n console.warn(chalk.gray(' 1. Replace all @xylabs/ts-scripts-* deps with @xylabs/toolchain in package.json'))\n console.warn(chalk.gray(' 2. Update imports in xy.config.ts files'))\n console.warn(chalk.gray(' 3. Run your package manager install\\n'))\n}\n\nexport async function deprecationMigrate(oldPackage: string): Promise<void> {\n const root = findProjectRoot()\n const pkgPath = PATH.join(root, 'package.json')\n\n if (!existsSync(pkgPath)) return\n\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, Record<string, string>>\n\n // Check if any deprecated package is present\n const hasOldDep = DEPRECATED_PACKAGES.some(dep =>\n pkg.dependencies?.[dep] || pkg.devDependencies?.[dep])\n if (!hasOldDep) return\n\n console.warn(chalk.yellow(`\\n⚠ ${oldPackage} is deprecated. Use @xylabs/toolchain instead.\\n`))\n\n const shouldMigrate = await askYesNo(chalk.cyan(' Auto-migrate to @xylabs/toolchain? [y/N] '))\n\n if (!shouldMigrate) {\n printManualInstructions()\n return\n }\n\n // Migrate root package.json (all old packages at once)\n migratePackageJson(pkgPath, 'package.json')\n\n // Migrate root xy.config.ts\n if (replaceAllOldPackagesInFile(PATH.join(root, 'xy.config.ts'))) {\n console.warn(chalk.green(' ✓ Updated xy.config.ts'))\n }\n\n // Migrate all workspace files\n await migrateWorkspaces(root)\n\n // Run install to resolve the new dependency\n const pm = detectPackageManager()\n console.warn(chalk.cyan(`\\n Running ${pm} install...\\n`))\n const result = spawnSync(pm, ['install'], { cwd: root, stdio: 'inherit' })\n\n if (result.status === 0) {\n console.warn(chalk.green(' Migration complete. Re-run your command.\\n'))\n } else {\n console.warn(chalk.red(` Install failed (exit ${result.status}). Run \"${pm} install\" manually.\\n`))\n }\n\n process.exit(result.status ?? 1)\n}\n","import { existsSync } from 'node:fs'\n\nexport type PackageManagerName = 'pnpm' | 'yarn'\n\nexport function detectPackageManager(): PackageManagerName {\n if (existsSync('pnpm-lock.yaml') || existsSync('pnpm-workspace.yaml')) return 'pnpm'\n return 'yarn'\n}\n"],"mappings":"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","names":["existsSync","existsSync"]}
@@ -484,6 +484,7 @@ function printWorkspaceCycles(cycles) {
484
484
  }
485
485
 
486
486
  // src/lib/deprecationMigrate.ts
487
+ import { spawnSync as spawnSync3 } from "child_process";
487
488
  import {
488
489
  existsSync as existsSync2,
489
490
  readFileSync as readFileSync4,
@@ -492,6 +493,12 @@ import {
492
493
  import PATH3 from "path";
493
494
  import { createInterface } from "readline";
494
495
  import chalk5 from "chalk";
496
+ var DEPRECATED_PACKAGES = [
497
+ "@xylabs/ts-scripts-common",
498
+ "@xylabs/ts-scripts-yarn3",
499
+ "@xylabs/ts-scripts-pnpm",
500
+ "@xylabs/ts-scripts-react-yarn3"
501
+ ];
495
502
  function findProjectRoot() {
496
503
  return process.env.INIT_CWD ?? process.cwd();
497
504
  }
@@ -504,56 +511,64 @@ function askYesNo(question) {
504
511
  });
505
512
  });
506
513
  }
507
- function replaceInFile(filePath, oldStr, newStr) {
514
+ function replaceAllOldPackagesInFile(filePath) {
508
515
  if (!existsSync2(filePath)) return false;
509
- const content = readFileSync4(filePath, "utf8");
510
- if (!content.includes(oldStr)) return false;
511
- writeFileSync(filePath, content.replaceAll(oldStr, newStr), "utf8");
512
- return true;
513
- }
514
- function migrateRootPackageJson(pkg, pkgPath, oldPackage, depField) {
515
- const version = pkg[depField][oldPackage];
516
- delete pkg[depField][oldPackage];
517
- pkg[depField]["@xylabs/toolchain"] = version;
518
- writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}
519
- `, "utf8");
520
- console.warn(chalk5.green(` \u2713 Replaced ${oldPackage} \u2192 @xylabs/toolchain in ${depField}`));
516
+ let content = readFileSync4(filePath, "utf8");
517
+ let changed = false;
518
+ for (const oldPkg of DEPRECATED_PACKAGES) {
519
+ if (content.includes(oldPkg)) {
520
+ content = content.replaceAll(oldPkg, "@xylabs/toolchain");
521
+ changed = true;
522
+ }
523
+ }
524
+ if (changed) {
525
+ writeFileSync(filePath, content, "utf8");
526
+ }
527
+ return changed;
521
528
  }
522
- function migrateWorkspacePackageJson(wsPkgPath, dir, oldPackage) {
523
- if (!existsSync2(wsPkgPath)) return;
524
- const wsPkg = JSON.parse(readFileSync4(wsPkgPath, "utf8"));
529
+ function migratePackageJson(pkgPath, label) {
530
+ if (!existsSync2(pkgPath)) return false;
531
+ const pkg = JSON.parse(readFileSync4(pkgPath, "utf8"));
525
532
  let changed = false;
526
533
  for (const field of ["dependencies", "devDependencies", "peerDependencies"]) {
527
- if (wsPkg[field]?.[oldPackage]) {
528
- const ver = wsPkg[field][oldPackage];
529
- delete wsPkg[field][oldPackage];
530
- wsPkg[field]["@xylabs/toolchain"] = ver;
531
- changed = true;
534
+ for (const oldPkg of DEPRECATED_PACKAGES) {
535
+ if (pkg[field]?.[oldPkg]) {
536
+ const ver = pkg[field][oldPkg];
537
+ delete pkg[field][oldPkg];
538
+ if (!pkg[field]["@xylabs/toolchain"]) {
539
+ pkg[field]["@xylabs/toolchain"] = ver;
540
+ }
541
+ changed = true;
542
+ }
532
543
  }
533
544
  }
534
545
  if (changed) {
535
- writeFileSync(wsPkgPath, `${JSON.stringify(wsPkg, null, 2)}
546
+ writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}
536
547
  `, "utf8");
537
- console.warn(chalk5.green(` \u2713 Updated ${dir}/package.json`));
548
+ console.warn(chalk5.green(` \u2713 Updated ${label}`));
538
549
  }
550
+ return changed;
539
551
  }
540
- async function migrateWorkspaces(root, workspacesGlob, oldPackage) {
541
- if (!Array.isArray(workspacesGlob)) return;
552
+ async function migrateWorkspaces(root) {
542
553
  const { globSync } = await import("glob");
543
- for (const pattern of workspacesGlob) {
544
- const dirs = globSync(pattern, { cwd: root });
545
- for (const dir of dirs) {
546
- if (replaceInFile(PATH3.join(root, dir, "xy.config.ts"), oldPackage, "@xylabs/toolchain")) {
547
- console.warn(chalk5.green(` \u2713 Updated ${dir}/xy.config.ts imports`));
548
- }
549
- migrateWorkspacePackageJson(PATH3.join(root, dir, "package.json"), dir, oldPackage);
554
+ const packageJsonFiles = globSync("**/package.json", {
555
+ cwd: root,
556
+ ignore: ["node_modules/**", "**/node_modules/**", "dist/**", "**/dist/**"]
557
+ });
558
+ for (const relPath of packageJsonFiles) {
559
+ if (relPath === "package.json") continue;
560
+ const dir = PATH3.dirname(relPath);
561
+ migratePackageJson(PATH3.join(root, relPath), relPath);
562
+ const xyConfigPath = PATH3.join(root, dir, "xy.config.ts");
563
+ if (replaceAllOldPackagesInFile(xyConfigPath)) {
564
+ console.warn(chalk5.green(` \u2713 Updated ${dir}/xy.config.ts`));
550
565
  }
551
566
  }
552
567
  }
553
- function printManualInstructions(oldPackage) {
568
+ function printManualInstructions() {
554
569
  console.warn(chalk5.gray(" Skipped. To migrate manually:\n"));
555
- console.warn(chalk5.gray(` 1. Replace "${oldPackage}" with "@xylabs/toolchain" in package.json`));
556
- console.warn(chalk5.gray(" 2. Update xy.config.ts imports"));
570
+ console.warn(chalk5.gray(" 1. Replace all @xylabs/ts-scripts-* deps with @xylabs/toolchain in package.json"));
571
+ console.warn(chalk5.gray(" 2. Update imports in xy.config.ts files"));
557
572
  console.warn(chalk5.gray(" 3. Run your package manager install\n"));
558
573
  }
559
574
  async function deprecationMigrate(oldPackage) {
@@ -561,22 +576,33 @@ async function deprecationMigrate(oldPackage) {
561
576
  const pkgPath = PATH3.join(root, "package.json");
562
577
  if (!existsSync2(pkgPath)) return;
563
578
  const pkg = JSON.parse(readFileSync4(pkgPath, "utf8"));
564
- const depField = pkg.dependencies?.[oldPackage] ? "dependencies" : pkg.devDependencies?.[oldPackage] ? "devDependencies" : void 0;
565
- if (!depField) return;
579
+ const hasOldDep = DEPRECATED_PACKAGES.some((dep) => pkg.dependencies?.[dep] || pkg.devDependencies?.[dep]);
580
+ if (!hasOldDep) return;
566
581
  console.warn(chalk5.yellow(`
567
582
  \u26A0 ${oldPackage} is deprecated. Use @xylabs/toolchain instead.
568
583
  `));
569
584
  const shouldMigrate = await askYesNo(chalk5.cyan(" Auto-migrate to @xylabs/toolchain? [y/N] "));
570
585
  if (!shouldMigrate) {
571
- printManualInstructions(oldPackage);
586
+ printManualInstructions();
572
587
  return;
573
588
  }
574
- migrateRootPackageJson(pkg, pkgPath, oldPackage, depField);
575
- if (replaceInFile(PATH3.join(root, "xy.config.ts"), oldPackage, "@xylabs/toolchain")) {
576
- console.warn(chalk5.green(" \u2713 Updated xy.config.ts imports"));
589
+ migratePackageJson(pkgPath, "package.json");
590
+ if (replaceAllOldPackagesInFile(PATH3.join(root, "xy.config.ts"))) {
591
+ console.warn(chalk5.green(" \u2713 Updated xy.config.ts"));
577
592
  }
578
- await migrateWorkspaces(root, pkg.workspaces, oldPackage);
579
- console.warn(chalk5.yellow("\n Run your package manager install to complete the migration.\n"));
593
+ await migrateWorkspaces(root);
594
+ const pm = detectPackageManager();
595
+ console.warn(chalk5.cyan(`
596
+ Running ${pm} install...
597
+ `));
598
+ const result = spawnSync3(pm, ["install"], { cwd: root, stdio: "inherit" });
599
+ if (result.status === 0) {
600
+ console.warn(chalk5.green(" \u2713 Migration complete. Re-run your command.\n"));
601
+ } else {
602
+ console.warn(chalk5.red(` Install failed (exit ${result.status}). Run "${pm} install" manually.
603
+ `));
604
+ }
605
+ process.exit(result.status ?? 1);
580
606
  }
581
607
 
582
608
  // src/lib/file/constants.ts
@@ -1044,12 +1070,12 @@ function listRepoTemplates() {
1044
1070
  }
1045
1071
 
1046
1072
  // src/lib/runInstall.ts
1047
- import { spawnSync as spawnSync3 } from "child_process";
1073
+ import { spawnSync as spawnSync4 } from "child_process";
1048
1074
  import chalk9 from "chalk";
1049
1075
  function runInstall(cwd) {
1050
1076
  const pm = detectPackageManager();
1051
1077
  console.log(chalk9.gray(`Running ${pm} install...`));
1052
- const result = spawnSync3(pm, ["install"], {
1078
+ const result = spawnSync4(pm, ["install"], {
1053
1079
  cwd,
1054
1080
  stdio: "inherit"
1055
1081
  });
@@ -1062,7 +1088,7 @@ function runInstall(cwd) {
1062
1088
  }
1063
1089
 
1064
1090
  // src/lib/runSteps.ts
1065
- import { spawnSync as spawnSync4 } from "child_process";
1091
+ import { spawnSync as spawnSync5 } from "child_process";
1066
1092
  import { existsSync as existsSync5 } from "fs";
1067
1093
  import chalk10 from "chalk";
1068
1094
  var runSteps = (name, steps, exitOnFail = true, messages) => {
@@ -1078,7 +1104,7 @@ var runSteps = (name, steps, exitOnFail = true, messages) => {
1078
1104
  if (command === "node" && !existsSync5(argList[0])) {
1079
1105
  throw new Error(`File not found [${argList[0]}]`);
1080
1106
  }
1081
- const status = spawnSync4(command, Array.isArray(args) ? args : args.split(" "), {
1107
+ const status = spawnSync5(command, Array.isArray(args) ? args : args.split(" "), {
1082
1108
  ...config2,
1083
1109
  encoding: "utf8",
1084
1110
  env: { FORCE_COLOR: "3", ...process.env },
@@ -1161,7 +1187,7 @@ var runXyWithWarning = (command) => {
1161
1187
  };
1162
1188
 
1163
1189
  // src/lib/tryRunLocalScript.ts
1164
- import { spawnSync as spawnSync5 } from "child_process";
1190
+ import { spawnSync as spawnSync6 } from "child_process";
1165
1191
  import { readFileSync as readFileSync12 } from "fs";
1166
1192
  import PATH7 from "path";
1167
1193
  import chalk13 from "chalk";
@@ -1178,7 +1204,7 @@ function tryRunLocalScript(commandName) {
1178
1204
  const extraArgs = process.argv.slice(process.argv.indexOf(commandName) + 1);
1179
1205
  console.log(chalk13.blue(`Delegating "${commandName}" to local script`));
1180
1206
  const pm = getPackageManager();
1181
- const result = spawnSync5(pm.command, ["run", commandName, ...extraArgs], {
1207
+ const result = spawnSync6(pm.command, ["run", commandName, ...extraArgs], {
1182
1208
  cwd: process.cwd(),
1183
1209
  encoding: "utf8",
1184
1210
  env: {