everything-dev 1.28.1 → 1.28.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.
- package/dist/cli/infra.cjs +11 -0
- package/dist/cli/infra.cjs.map +1 -1
- package/dist/cli/infra.mjs +11 -1
- package/dist/cli/infra.mjs.map +1 -1
- package/dist/cli/sync.cjs +1 -1
- package/dist/cli/sync.cjs.map +1 -1
- package/dist/cli/sync.mjs +1 -1
- package/dist/cli/sync.mjs.map +1 -1
- package/dist/cli/upgrade.cjs +167 -134
- package/dist/cli/upgrade.cjs.map +1 -1
- package/dist/cli/upgrade.mjs +168 -135
- package/dist/cli/upgrade.mjs.map +1 -1
- package/dist/cli.cjs +6 -1
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +6 -1
- package/dist/cli.mjs.map +1 -1
- package/dist/config.cjs +111 -20
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +16 -2
- package/dist/config.d.cts.map +1 -1
- package/dist/config.d.mts +16 -2
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +106 -21
- package/dist/config.mjs.map +1 -1
- package/dist/index.cjs +6 -0
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/plugin.cjs +14 -2
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts.map +1 -1
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +16 -4
- package/dist/plugin.mjs.map +1 -1
- package/package.json +2 -1
package/dist/cli/upgrade.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveExtendsRef } from "../merge.mjs";
|
|
2
2
|
import { saveBosConfig } from "../utils/save-config.mjs";
|
|
3
3
|
import { fetchParentConfig, resolveSourceDir, runBunInstallForUpgrade, runTypesGen } from "./init.mjs";
|
|
4
4
|
import { readInstalledFrameworkVersion } from "./framework-version.mjs";
|
|
@@ -12,24 +12,6 @@ import { glob } from "glob";
|
|
|
12
12
|
|
|
13
13
|
//#region src/cli/upgrade.ts
|
|
14
14
|
const FRAMEWORK_PACKAGES = ["everything-dev", "every-plugin"];
|
|
15
|
-
const CATALOG_TOOL_PACKAGES = [
|
|
16
|
-
"@rspack/core",
|
|
17
|
-
"@rspack/cli",
|
|
18
|
-
"@rsbuild/core",
|
|
19
|
-
"@rsbuild/plugin-react",
|
|
20
|
-
"@module-federation/enhanced",
|
|
21
|
-
"@module-federation/node",
|
|
22
|
-
"@module-federation/rsbuild-plugin",
|
|
23
|
-
"@module-federation/runtime-core",
|
|
24
|
-
"@module-federation/sdk",
|
|
25
|
-
"@module-federation/dts-plugin"
|
|
26
|
-
];
|
|
27
|
-
const PINNED_CATALOG_TOOL_VERSIONS = {
|
|
28
|
-
"@rspack/core": "1.7.11",
|
|
29
|
-
"@rspack/cli": "1.7.11",
|
|
30
|
-
"@rsbuild/core": "1.7.5",
|
|
31
|
-
"@rsbuild/plugin-react": "1.4.6"
|
|
32
|
-
};
|
|
33
15
|
const LEGACY_UI_IMPORT_REWRITES = [
|
|
34
16
|
["from \"@/auth\"", "from \"@/app\""],
|
|
35
17
|
["from '@/auth'", "from '@/app'"],
|
|
@@ -50,31 +32,162 @@ const OBSOLETE_FILES = [
|
|
|
50
32
|
"ui/scripts/generate-metadata.ts",
|
|
51
33
|
".github/dependabot.yml",
|
|
52
34
|
".github/templates/dependabot.yml",
|
|
35
|
+
".github/workflows/release-sync.yml",
|
|
53
36
|
"packages/everything-dev/cli.js",
|
|
54
37
|
".templatekeep",
|
|
55
38
|
".templatesync-exclude"
|
|
56
39
|
];
|
|
57
|
-
function
|
|
40
|
+
function extractSemver(value) {
|
|
58
41
|
if (!value) return null;
|
|
59
42
|
return value.match(/\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?/)?.[0] ?? null;
|
|
60
43
|
}
|
|
61
|
-
|
|
44
|
+
function readJsonFile(filePath) {
|
|
45
|
+
return JSON.parse(readFileSync(filePath, "utf-8"));
|
|
46
|
+
}
|
|
47
|
+
function readRootPackageJson(projectDir) {
|
|
48
|
+
return readJsonFile(join(projectDir, "package.json"));
|
|
49
|
+
}
|
|
50
|
+
function readRootCatalogEntry(projectDir, packageName) {
|
|
51
|
+
return readRootPackageJson(projectDir).workspaces?.catalog?.[packageName];
|
|
52
|
+
}
|
|
53
|
+
function readCurrentPackageSpecifier(projectDir, packageName) {
|
|
54
|
+
const pkg = readRootPackageJson(projectDir);
|
|
55
|
+
for (const fieldName of [
|
|
56
|
+
"dependencies",
|
|
57
|
+
"devDependencies",
|
|
58
|
+
"peerDependencies"
|
|
59
|
+
]) {
|
|
60
|
+
const value = pkg[fieldName]?.[packageName];
|
|
61
|
+
if (!value) continue;
|
|
62
|
+
if (value === "catalog:") return readRootCatalogEntry(projectDir, packageName) ?? readInstalledVersion(projectDir, packageName);
|
|
63
|
+
if (value.startsWith("workspace:") || value.startsWith("file:")) return readInstalledVersion(projectDir, packageName);
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
return readRootCatalogEntry(projectDir, packageName) ?? readInstalledVersion(projectDir, packageName);
|
|
67
|
+
}
|
|
68
|
+
function setCatalogRefs(field, packageNames) {
|
|
69
|
+
if (!field) return false;
|
|
70
|
+
let modified = false;
|
|
71
|
+
for (const packageName of packageNames) if (setCatalogRef(field, packageName)) modified = true;
|
|
72
|
+
return modified;
|
|
73
|
+
}
|
|
74
|
+
function syncPackageObjectCatalogRefs(pkg, packageNames) {
|
|
75
|
+
let modified = false;
|
|
76
|
+
for (const fieldName of [
|
|
77
|
+
"dependencies",
|
|
78
|
+
"devDependencies",
|
|
79
|
+
"peerDependencies"
|
|
80
|
+
]) {
|
|
81
|
+
const field = pkg[fieldName];
|
|
82
|
+
if (setCatalogRefs(field, packageNames)) modified = true;
|
|
83
|
+
}
|
|
84
|
+
return modified;
|
|
85
|
+
}
|
|
86
|
+
function packageObjectNeedsCatalogRefs(pkg, packageNames) {
|
|
87
|
+
for (const fieldName of [
|
|
88
|
+
"dependencies",
|
|
89
|
+
"devDependencies",
|
|
90
|
+
"peerDependencies"
|
|
91
|
+
]) {
|
|
92
|
+
const field = pkg[fieldName];
|
|
93
|
+
if (!field) continue;
|
|
94
|
+
for (const packageName of packageNames) {
|
|
95
|
+
const value = field[packageName];
|
|
96
|
+
if (!value) continue;
|
|
97
|
+
if (value !== "catalog:" && !value.startsWith("file:")) return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
function packageFileNeedsCatalogRefs(filePath, packageNames) {
|
|
103
|
+
return packageObjectNeedsCatalogRefs(readJsonFile(filePath), packageNames);
|
|
104
|
+
}
|
|
105
|
+
function updatePackageFileCatalogRefs(filePath, packageNames) {
|
|
106
|
+
const pkg = readJsonFile(filePath);
|
|
107
|
+
const modified = syncPackageObjectCatalogRefs(pkg, packageNames);
|
|
108
|
+
if (modified) writeFileSync(filePath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
109
|
+
return modified;
|
|
110
|
+
}
|
|
111
|
+
function syncRootCatalogWithParent(projectDir, parentCatalog) {
|
|
112
|
+
const pkgPath = join(projectDir, "package.json");
|
|
113
|
+
const pkg = readJsonFile(pkgPath);
|
|
114
|
+
let modified = syncPackageObjectCatalogRefs(pkg, Object.keys(parentCatalog));
|
|
115
|
+
if (!pkg.workspaces || typeof pkg.workspaces !== "object") {
|
|
116
|
+
pkg.workspaces = {
|
|
117
|
+
packages: [],
|
|
118
|
+
catalog: {}
|
|
119
|
+
};
|
|
120
|
+
modified = true;
|
|
121
|
+
}
|
|
122
|
+
const workspaces = pkg.workspaces;
|
|
123
|
+
if (!workspaces.catalog || typeof workspaces.catalog !== "object") {
|
|
124
|
+
workspaces.catalog = {};
|
|
125
|
+
modified = true;
|
|
126
|
+
}
|
|
127
|
+
for (const [packageName, version] of Object.entries(parentCatalog)) if (workspaces.catalog[packageName] !== version) {
|
|
128
|
+
workspaces.catalog[packageName] = version;
|
|
129
|
+
modified = true;
|
|
130
|
+
}
|
|
131
|
+
if (modified) writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
132
|
+
return modified;
|
|
133
|
+
}
|
|
134
|
+
async function readExtendedRootSource(projectDir) {
|
|
62
135
|
const configPath = join(projectDir, "bos.config.json");
|
|
63
|
-
if (!existsSync(configPath)) return {
|
|
136
|
+
if (!existsSync(configPath)) return {
|
|
137
|
+
catalog: {},
|
|
138
|
+
extendsChain: []
|
|
139
|
+
};
|
|
64
140
|
const localConfig = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
65
|
-
let extendsRef;
|
|
66
|
-
if (
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
141
|
+
let extendsRef = getExtendsRef(localConfig);
|
|
142
|
+
if (!extendsRef?.startsWith("bos://")) return {
|
|
143
|
+
catalog: {},
|
|
144
|
+
repository: typeof localConfig.repository === "string" ? localConfig.repository : void 0,
|
|
145
|
+
extendsChain: []
|
|
146
|
+
};
|
|
147
|
+
const extendsChain = [];
|
|
148
|
+
const visited = /* @__PURE__ */ new Set();
|
|
149
|
+
let repository = typeof localConfig.repository === "string" ? localConfig.repository : void 0;
|
|
150
|
+
let rootRef = extendsRef;
|
|
151
|
+
while (extendsRef?.startsWith("bos://")) {
|
|
152
|
+
if (visited.has(extendsRef)) throw new Error(`Circular extends detected while resolving upgrade source: ${extendsRef}`);
|
|
153
|
+
visited.add(extendsRef);
|
|
154
|
+
extendsChain.push(extendsRef);
|
|
155
|
+
const parsed = parseBosRef(extendsRef);
|
|
156
|
+
if (!parsed) break;
|
|
157
|
+
rootRef = extendsRef;
|
|
158
|
+
let parentConfig;
|
|
159
|
+
try {
|
|
160
|
+
parentConfig = await fetchParentConfig(parsed.account, parsed.gateway);
|
|
161
|
+
} catch {
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
if (typeof parentConfig.repository === "string") repository = parentConfig.repository;
|
|
165
|
+
const nextExtendsRef = getExtendsRef(parentConfig);
|
|
166
|
+
if (!nextExtendsRef?.startsWith("bos://")) break;
|
|
167
|
+
extendsRef = nextExtendsRef;
|
|
168
|
+
}
|
|
169
|
+
const parsed = parseBosRef(rootRef);
|
|
170
|
+
if (!parsed) return {
|
|
171
|
+
catalog: {},
|
|
172
|
+
repository,
|
|
173
|
+
extendsChain
|
|
174
|
+
};
|
|
70
175
|
const { sourceDir, cleanup } = await resolveSourceDir({
|
|
71
176
|
extendsAccount: parsed.account,
|
|
72
177
|
extendsGateway: parsed.gateway
|
|
73
178
|
});
|
|
74
179
|
try {
|
|
75
180
|
const sourcePkgPath = join(sourceDir, "package.json");
|
|
76
|
-
if (!existsSync(sourcePkgPath)) return {
|
|
77
|
-
|
|
181
|
+
if (!existsSync(sourcePkgPath)) return {
|
|
182
|
+
catalog: {},
|
|
183
|
+
repository,
|
|
184
|
+
extendsChain
|
|
185
|
+
};
|
|
186
|
+
return {
|
|
187
|
+
catalog: { ...JSON.parse(readFileSync(sourcePkgPath, "utf-8")).workspaces?.catalog ?? {} },
|
|
188
|
+
repository,
|
|
189
|
+
extendsChain
|
|
190
|
+
};
|
|
78
191
|
} finally {
|
|
79
192
|
await cleanup();
|
|
80
193
|
}
|
|
@@ -354,67 +467,6 @@ function setCatalogRef(field, packageName) {
|
|
|
354
467
|
field[packageName] = "catalog:";
|
|
355
468
|
return true;
|
|
356
469
|
}
|
|
357
|
-
function updateWorkspacePackageRefInFile(filePath, packageName) {
|
|
358
|
-
const pkg = JSON.parse(readFileSync(filePath, "utf-8"));
|
|
359
|
-
let modified = false;
|
|
360
|
-
for (const fieldName of [
|
|
361
|
-
"dependencies",
|
|
362
|
-
"devDependencies",
|
|
363
|
-
"peerDependencies"
|
|
364
|
-
]) {
|
|
365
|
-
const field = pkg[fieldName];
|
|
366
|
-
if (setCatalogRef(field, packageName)) modified = true;
|
|
367
|
-
}
|
|
368
|
-
if (modified) writeFileSync(filePath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
369
|
-
return modified;
|
|
370
|
-
}
|
|
371
|
-
function updateRootPackageVersion(projectDir, packageName, newVersion) {
|
|
372
|
-
const pkgPath = join(projectDir, "package.json");
|
|
373
|
-
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
374
|
-
let modified = false;
|
|
375
|
-
for (const fieldName of [
|
|
376
|
-
"dependencies",
|
|
377
|
-
"devDependencies",
|
|
378
|
-
"peerDependencies"
|
|
379
|
-
]) {
|
|
380
|
-
const field = pkg[fieldName];
|
|
381
|
-
if (setCatalogRef(field, packageName)) modified = true;
|
|
382
|
-
}
|
|
383
|
-
if (!pkg.workspaces || typeof pkg.workspaces !== "object") {
|
|
384
|
-
pkg.workspaces = {
|
|
385
|
-
packages: [],
|
|
386
|
-
catalog: {}
|
|
387
|
-
};
|
|
388
|
-
modified = true;
|
|
389
|
-
}
|
|
390
|
-
const workspaces = pkg.workspaces;
|
|
391
|
-
if (!workspaces.catalog || typeof workspaces.catalog !== "object") {
|
|
392
|
-
workspaces.catalog = {};
|
|
393
|
-
modified = true;
|
|
394
|
-
}
|
|
395
|
-
const nextVersion = newVersion;
|
|
396
|
-
if (workspaces.catalog[packageName] !== nextVersion) {
|
|
397
|
-
workspaces.catalog[packageName] = nextVersion;
|
|
398
|
-
modified = true;
|
|
399
|
-
}
|
|
400
|
-
if (modified) writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
401
|
-
return modified;
|
|
402
|
-
}
|
|
403
|
-
function updateRootCatalogVersion(projectDir, packageName, newVersion) {
|
|
404
|
-
const pkgPath = join(projectDir, "package.json");
|
|
405
|
-
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
406
|
-
if (!pkg.workspaces || typeof pkg.workspaces !== "object") pkg.workspaces = {
|
|
407
|
-
packages: [],
|
|
408
|
-
catalog: {}
|
|
409
|
-
};
|
|
410
|
-
const workspaces = pkg.workspaces;
|
|
411
|
-
if (!workspaces.catalog || typeof workspaces.catalog !== "object") workspaces.catalog = {};
|
|
412
|
-
const nextVersion = newVersion;
|
|
413
|
-
if (workspaces.catalog[packageName] === nextVersion) return false;
|
|
414
|
-
workspaces.catalog[packageName] = nextVersion;
|
|
415
|
-
writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
416
|
-
return true;
|
|
417
|
-
}
|
|
418
470
|
async function findWorkspacePackageJsons(projectDir) {
|
|
419
471
|
const rootPkgPath = join(projectDir, "package.json");
|
|
420
472
|
if (!existsSync(rootPkgPath)) return [];
|
|
@@ -437,14 +489,16 @@ async function findWorkspacePackageJsons(projectDir) {
|
|
|
437
489
|
}
|
|
438
490
|
return [...new Set(pkgPaths)];
|
|
439
491
|
}
|
|
440
|
-
function buildChangelogUrl(oldVersion, newVersion,
|
|
441
|
-
|
|
442
|
-
const
|
|
492
|
+
function buildChangelogUrl(oldVersion, newVersion, repository) {
|
|
493
|
+
const fromVersion = extractSemver(oldVersion);
|
|
494
|
+
const toVersion = extractSemver(newVersion);
|
|
495
|
+
if (!fromVersion || !toVersion || fromVersion === toVersion) return void 0;
|
|
496
|
+
const repoUrl = repository;
|
|
443
497
|
if (!repoUrl) return void 0;
|
|
444
498
|
const githubMatch = repoUrl.match(/^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/);
|
|
445
499
|
if (!githubMatch) return void 0;
|
|
446
500
|
const [, owner, repo] = githubMatch;
|
|
447
|
-
return `https://github.com/${owner}/${repo}/compare/v${
|
|
501
|
+
return `https://github.com/${owner}/${repo}/compare/v${fromVersion}...v${toVersion}`;
|
|
448
502
|
}
|
|
449
503
|
async function rewriteLegacyUiImports(projectDir) {
|
|
450
504
|
const files = await glob("ui/src/**/*.{ts,tsx}", {
|
|
@@ -474,35 +528,31 @@ async function upgradeTemplate(projectDir, options) {
|
|
|
474
528
|
timings,
|
|
475
529
|
error: "No package.json found in current directory"
|
|
476
530
|
};
|
|
477
|
-
const
|
|
531
|
+
const parentSource = await readExtendedRootSource(projectDir);
|
|
532
|
+
const sourceRootCatalog = parentSource.catalog;
|
|
533
|
+
const inheritedCatalogPackageNames = Object.keys(sourceRootCatalog);
|
|
534
|
+
const currentCatalogEntries = readRootPackageJson(projectDir).workspaces?.catalog ?? {};
|
|
535
|
+
const workspacePkgPaths = await findWorkspacePackageJsons(projectDir);
|
|
536
|
+
const hasCatalogRefRewrites = inheritedCatalogPackageNames.length > 0 && (packageObjectNeedsCatalogRefs(readRootPackageJson(projectDir), inheritedCatalogPackageNames) || workspacePkgPaths.some((pkgPath) => packageFileNeedsCatalogRefs(pkgPath, inheritedCatalogPackageNames)));
|
|
478
537
|
const { packages, catalogVersionUpdates } = await timePhase(timings, "check package versions", async () => {
|
|
479
538
|
const nextPackages = [];
|
|
480
539
|
for (const name of FRAMEWORK_PACKAGES) {
|
|
481
|
-
const
|
|
482
|
-
const
|
|
483
|
-
if (!latest) {
|
|
484
|
-
nextPackages.push({
|
|
485
|
-
name,
|
|
486
|
-
from: installed,
|
|
487
|
-
to: installed ?? "unknown"
|
|
488
|
-
});
|
|
489
|
-
continue;
|
|
490
|
-
}
|
|
540
|
+
const current = readCurrentPackageSpecifier(projectDir, name);
|
|
541
|
+
const target = sourceRootCatalog[name] ?? current ?? "unknown";
|
|
491
542
|
nextPackages.push({
|
|
492
543
|
name,
|
|
493
|
-
from:
|
|
494
|
-
to:
|
|
544
|
+
from: current,
|
|
545
|
+
to: target
|
|
495
546
|
});
|
|
496
547
|
}
|
|
497
548
|
const nextCatalogVersionUpdates = [];
|
|
498
|
-
for (const name of
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
if (installed === targetVersion) continue;
|
|
549
|
+
for (const [name, targetVersion] of Object.entries(sourceRootCatalog)) {
|
|
550
|
+
if (FRAMEWORK_PACKAGES.includes(name)) continue;
|
|
551
|
+
const currentVersion = currentCatalogEntries[name];
|
|
552
|
+
if (currentVersion === targetVersion) continue;
|
|
503
553
|
nextCatalogVersionUpdates.push({
|
|
504
554
|
name,
|
|
505
|
-
from:
|
|
555
|
+
from: currentVersion,
|
|
506
556
|
to: targetVersion
|
|
507
557
|
});
|
|
508
558
|
}
|
|
@@ -513,18 +563,13 @@ async function upgradeTemplate(projectDir, options) {
|
|
|
513
563
|
});
|
|
514
564
|
const hasFrameworkUpdates = packages.some((p) => p.from !== p.to && p.from !== void 0);
|
|
515
565
|
const hasCatalogUpdates = catalogVersionUpdates.length > 0;
|
|
516
|
-
const hasUpdates = hasFrameworkUpdates || hasCatalogUpdates;
|
|
566
|
+
const hasUpdates = hasFrameworkUpdates || hasCatalogUpdates || hasCatalogRefRewrites;
|
|
517
567
|
if (options.dryRun) {
|
|
518
568
|
let changelogUrl;
|
|
519
569
|
const pluginOptions = options.noSync ? null : await timePhase(timings, "discover parent plugins", () => loadParentPluginOptions(projectDir));
|
|
520
570
|
if (hasUpdates) {
|
|
521
|
-
const configPath = join(projectDir, "bos.config.json");
|
|
522
|
-
let parentConfig = null;
|
|
523
|
-
if (existsSync(configPath)) try {
|
|
524
|
-
parentConfig = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
525
|
-
} catch {}
|
|
526
571
|
const mainPkg = packages.find((p) => p.name === "everything-dev");
|
|
527
|
-
if (mainPkg?.from && mainPkg.from !== mainPkg.to) changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to,
|
|
572
|
+
if (mainPkg?.from && mainPkg.from !== mainPkg.to) changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository);
|
|
528
573
|
}
|
|
529
574
|
return {
|
|
530
575
|
status: "dry-run",
|
|
@@ -539,13 +584,8 @@ async function upgradeTemplate(projectDir, options) {
|
|
|
539
584
|
};
|
|
540
585
|
}
|
|
541
586
|
await timePhase(timings, "apply package updates", async () => {
|
|
542
|
-
|
|
543
|
-
for (const
|
|
544
|
-
const workspacePkgPaths = await findWorkspacePackageJsons(projectDir);
|
|
545
|
-
for (const pkgPath of workspacePkgPaths) {
|
|
546
|
-
for (const pkg of packages) if (pkg.from !== void 0 && pkg.from !== pkg.to) updateWorkspacePackageRefInFile(pkgPath, pkg.name);
|
|
547
|
-
for (const update of catalogVersionUpdates) updateWorkspacePackageRefInFile(pkgPath, update.name);
|
|
548
|
-
}
|
|
587
|
+
if (inheritedCatalogPackageNames.length > 0) syncRootCatalogWithParent(projectDir, sourceRootCatalog);
|
|
588
|
+
if (inheritedCatalogPackageNames.length > 0) for (const pkgPath of workspacePkgPaths) updatePackageFileCatalogRefs(pkgPath, inheritedCatalogPackageNames);
|
|
549
589
|
});
|
|
550
590
|
const migratedBosConfigs = await timePhase(timings, "migrate bos configs", () => migrateBosConfigFiles(projectDir));
|
|
551
591
|
let syncResult;
|
|
@@ -578,14 +618,7 @@ async function upgradeTemplate(projectDir, options) {
|
|
|
578
618
|
});
|
|
579
619
|
let changelogUrl;
|
|
580
620
|
const mainPkg = packages.find((p) => p.name === "everything-dev");
|
|
581
|
-
if (mainPkg?.from && mainPkg.from !== mainPkg.to)
|
|
582
|
-
const configPath = join(projectDir, "bos.config.json");
|
|
583
|
-
let parentConfig = null;
|
|
584
|
-
if (existsSync(configPath)) try {
|
|
585
|
-
parentConfig = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
586
|
-
} catch {}
|
|
587
|
-
changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);
|
|
588
|
-
}
|
|
621
|
+
if (mainPkg?.from && mainPkg.from !== mainPkg.to) changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository);
|
|
589
622
|
return {
|
|
590
623
|
status: "upgraded",
|
|
591
624
|
packages: [...packages, ...catalogVersionUpdates.map((u) => ({
|
package/dist/cli/upgrade.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.mjs","names":["isPlainObjectFromMerge"],"sources":["../../src/cli/upgrade.ts"],"sourcesContent":["import { existsSync, readFileSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport { glob } from \"glob\";\nimport type { PhaseTiming, UpgradeOptions, UpgradeResult } from \"../contract\";\nimport { isPlainObject as isPlainObjectFromMerge, resolveExtendsRef } from \"../merge\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { readInstalledFrameworkVersion } from \"./framework-version\";\nimport { fetchParentConfig, resolveSourceDir, runBunInstallForUpgrade, runTypesGen } from \"./init\";\nimport { syncTemplate } from \"./sync\";\nimport { timePhase } from \"./timing\";\n\nconst FRAMEWORK_PACKAGES = [\"everything-dev\", \"every-plugin\"];\n\nconst CATALOG_TOOL_PACKAGES = [\n \"@rspack/core\",\n \"@rspack/cli\",\n \"@rsbuild/core\",\n \"@rsbuild/plugin-react\",\n \"@module-federation/enhanced\",\n \"@module-federation/node\",\n \"@module-federation/rsbuild-plugin\",\n \"@module-federation/runtime-core\",\n \"@module-federation/sdk\",\n \"@module-federation/dts-plugin\",\n] as const;\nconst PINNED_CATALOG_TOOL_VERSIONS: Partial<\n Record<(typeof CATALOG_TOOL_PACKAGES)[number], string>\n> = {\n \"@rspack/core\": \"1.7.11\",\n \"@rspack/cli\": \"1.7.11\",\n \"@rsbuild/core\": \"1.7.5\",\n \"@rsbuild/plugin-react\": \"1.4.6\",\n};\nconst LEGACY_UI_IMPORT_REWRITES = [\n ['from \"@/auth\"', 'from \"@/app\"'],\n [\"from '@/auth'\", \"from '@/app'\"],\n ['from \"@/lib/use-api-client\"', 'from \"@/app\"'],\n [\"from '@/lib/use-api-client'\", \"from '@/app'\"],\n ['from \"@/lib/api-client\"', 'from \"@/app\"'],\n [\"from '@/lib/api-client'\", \"from '@/app'\"],\n] as const;\nconst OBSOLETE_FILES = [\n \"ui/src/auth.ts\",\n \"ui/src/auth-types.gen.ts\",\n \"ui/src/lib/api-client.ts\",\n \"ui/src/lib/use-api-client.ts\",\n \"ui/src/api-contract.ts\",\n \"ui/src/api-contract.gen.ts\",\n \"ui/src/lib/auth-client.ts\",\n \"ui/src/lib/session.ts\",\n \"ui/scripts/generate-metadata.ts\",\n \".github/dependabot.yml\",\n \".github/templates/dependabot.yml\",\n \"packages/everything-dev/cli.js\",\n \".templatekeep\",\n \".templatesync-exclude\",\n];\n\nfunction extractVersion(value: string | undefined): string | null {\n if (!value) return null;\n const match = value.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match?.[0] ?? null;\n}\n\nasync function readExtendedRootCatalog(projectDir: string): Promise<Record<string, string>> {\n const configPath = join(projectDir, \"bos.config.json\");\n if (!existsSync(configPath)) {\n return {};\n }\n\n const localConfig = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n let extendsRef: string | undefined;\n if (typeof localConfig.extends === \"string\") {\n extendsRef = localConfig.extends;\n } else if (isPlainObjectFromMerge(localConfig.extends)) {\n extendsRef = resolveExtendsRef(localConfig.extends as Record<string, string>, \"production\");\n }\n\n const parsed = extendsRef ? parseBosRef(extendsRef) : null;\n if (!parsed) {\n return {};\n }\n\n const { sourceDir, cleanup } = await resolveSourceDir({\n extendsAccount: parsed.account,\n extendsGateway: parsed.gateway,\n });\n\n try {\n const sourcePkgPath = join(sourceDir, \"package.json\");\n if (!existsSync(sourcePkgPath)) {\n return {};\n }\n\n const sourcePkg = JSON.parse(readFileSync(sourcePkgPath, \"utf-8\")) as {\n workspaces?: { catalog?: Record<string, string> };\n };\n return { ...(sourcePkg.workspaces?.catalog ?? {}) };\n } finally {\n await cleanup();\n }\n}\n\nfunction getExtendsRef(config: Record<string, unknown>): string | undefined {\n if (typeof config.extends === \"string\") {\n return config.extends;\n }\n\n if (config.extends && typeof config.extends === \"object\") {\n return resolveExtendsRef(config.extends as Record<string, string>, \"production\");\n }\n\n return undefined;\n}\n\nfunction parseBosRef(ref: string): { account: string; gateway: string } | null {\n const match = ref.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (!match?.[1] || !match[2]) return null;\n return { account: match[1], gateway: match[2] };\n}\n\nfunction parseTargetedRef(ref: string): { configRef: string; targetPath?: string } {\n const hashIndex = ref.indexOf(\"#\");\n if (hashIndex === -1) {\n return { configRef: ref };\n }\n return {\n configRef: ref.slice(0, hashIndex),\n targetPath: ref.slice(hashIndex + 1) || undefined,\n };\n}\n\nfunction ensureTargetedRef(ref: string, targetPath: string): string {\n const parsed = parseTargetedRef(ref);\n if (parsed.targetPath) return ref;\n return `${parsed.configRef}#${targetPath}`;\n}\n\nfunction rewriteExtendsTarget(\n entry: Record<string, unknown> | undefined,\n targetPath: string,\n): boolean {\n if (!entry?.extends) return false;\n\n if (typeof entry.extends === \"string\") {\n const next = ensureTargetedRef(entry.extends, targetPath);\n if (next === entry.extends) return false;\n entry.extends = next;\n return true;\n }\n\n if (typeof entry.extends === \"object\") {\n let changed = false;\n for (const [key, value] of Object.entries(entry.extends as Record<string, unknown>)) {\n if (typeof value !== \"string\") continue;\n const next = ensureTargetedRef(value, targetPath);\n if (next !== value) {\n (entry.extends as Record<string, unknown>)[key] = next;\n changed = true;\n }\n }\n return changed;\n }\n\n return false;\n}\n\nfunction migrateRootConfigTargets(config: Record<string, unknown>): boolean {\n let changed = false;\n const app =\n config.app && typeof config.app === \"object\"\n ? (config.app as Record<string, unknown>)\n : undefined;\n\n if (app?.api && typeof app.api === \"object\") {\n changed = rewriteExtendsTarget(app.api as Record<string, unknown>, \"app.api\") || changed;\n }\n if (app?.auth && typeof app.auth === \"object\") {\n changed = rewriteExtendsTarget(app.auth as Record<string, unknown>, \"app.auth\") || changed;\n }\n\n if (config.plugins && typeof config.plugins === \"object\") {\n for (const [pluginKey, pluginValue] of Object.entries(\n config.plugins as Record<string, unknown>,\n )) {\n if (typeof pluginValue === \"string\") {\n const next = ensureTargetedRef(pluginValue, `plugins.${pluginKey}`);\n if (next !== pluginValue) {\n (config.plugins as Record<string, unknown>)[pluginKey] = next;\n changed = true;\n }\n continue;\n }\n if (!pluginValue || typeof pluginValue !== \"object\") continue;\n changed =\n rewriteExtendsTarget(pluginValue as Record<string, unknown>, `plugins.${pluginKey}`) ||\n changed;\n }\n }\n\n return changed;\n}\n\nfunction migratePluginProviderConfig(config: Record<string, unknown>, pluginKey: string): boolean {\n let changed = false;\n if (!config.plugins || typeof config.plugins !== \"object\") {\n return false;\n }\n\n const plugins = config.plugins as Record<string, unknown>;\n const entry = plugins[pluginKey];\n if (!entry || typeof entry !== \"object\") return false;\n\n const pluginEntry = entry as Record<string, unknown>;\n\n if (\"name\" in pluginEntry) {\n delete pluginEntry.name;\n changed = true;\n }\n\n if (typeof pluginEntry.development === \"string\" && pluginEntry.development.startsWith(\"local:\")) {\n if (\"extends\" in pluginEntry) {\n delete pluginEntry.extends;\n changed = true;\n }\n }\n\n changed = rewriteExtendsTarget(pluginEntry, `plugins.${pluginKey}`) || changed;\n\n return changed;\n}\n\nfunction mergePluginConfigIntoRoot(\n rootConfig: Record<string, unknown>,\n pluginKey: string,\n pluginConfig: Record<string, unknown>,\n): boolean {\n let changed = false;\n\n if (!rootConfig.plugins || typeof rootConfig.plugins !== \"object\") {\n rootConfig.plugins = {};\n changed = true;\n }\n const plugins = rootConfig.plugins as Record<string, unknown>;\n if (!plugins[pluginKey] || typeof plugins[pluginKey] !== \"object\") {\n plugins[pluginKey] = {};\n changed = true;\n }\n\n const entry = plugins[pluginKey] as Record<string, unknown>;\n\n const pluginData = extractPluginEntry(pluginConfig, pluginKey);\n\n const apiData = getApiEntry(pluginConfig);\n\n if (pluginData) {\n for (const key of [\n \"secrets\",\n \"variables\",\n \"routes\",\n \"sidebar\",\n \"production\",\n \"integrity\",\n \"proxy\",\n ] as const) {\n if (pluginData[key] !== undefined && entry[key] === undefined) {\n entry[key] = pluginData[key];\n changed = true;\n }\n }\n\n if (typeof pluginData.development === \"string\" && pluginData.development.startsWith(\"local:\")) {\n pluginData.development = `local:plugins/${pluginKey}`;\n }\n if (entry.development === undefined && pluginData.development !== undefined) {\n entry.development = pluginData.development;\n changed = true;\n }\n }\n\n if (apiData) {\n for (const key of [\n \"production\",\n \"integrity\",\n \"proxy\",\n \"variables\",\n \"secrets\",\n \"sidebar\",\n \"routes\",\n ] as const) {\n if (apiData[key] !== undefined && entry[key] === undefined) {\n entry[key] = apiData[key];\n changed = true;\n }\n }\n }\n\n if (\"extends\" in entry) {\n const extendsStr = typeof entry.extends === \"string\" ? entry.extends : undefined;\n if (!extendsStr || extendsStr.includes(`#plugins.${pluginKey}`)) {\n delete entry.extends;\n changed = true;\n }\n }\n\n if (\"name\" in entry) {\n delete entry.name;\n changed = true;\n }\n\n if (configHasTopLevelFields(pluginConfig, pluginKey)) {\n if (entry.routes === undefined && Array.isArray(pluginConfig.routes)) {\n entry.routes = pluginConfig.routes;\n changed = true;\n }\n if (entry.sidebar === undefined && Array.isArray(pluginConfig.sidebar)) {\n entry.sidebar = pluginConfig.sidebar;\n changed = true;\n }\n const api = getApiEntry(pluginConfig);\n if (api) {\n if (entry.routes === undefined && Array.isArray(api.routes)) {\n entry.routes = api.routes;\n changed = true;\n }\n if (entry.sidebar === undefined && Array.isArray(api.sidebar)) {\n entry.sidebar = api.sidebar;\n changed = true;\n }\n }\n }\n\n return changed;\n}\n\nfunction extractPluginEntry(\n pluginConfig: Record<string, unknown>,\n pluginKey: string,\n): Record<string, unknown> | null {\n if (\n pluginConfig.plugins &&\n typeof pluginConfig.plugins === \"object\" &&\n (pluginConfig.plugins as Record<string, unknown>)[pluginKey] &&\n typeof (pluginConfig.plugins as Record<string, unknown>)[pluginKey] === \"object\"\n ) {\n return (pluginConfig.plugins as Record<string, unknown>)[pluginKey] as Record<string, unknown>;\n }\n\n const fallback: Record<string, unknown> = {};\n if (pluginConfig.sidebar !== undefined) {\n fallback.sidebar = pluginConfig.sidebar;\n }\n if (pluginConfig.routes !== undefined) {\n fallback.routes = pluginConfig.routes;\n }\n if (Object.keys(fallback).length > 0) {\n return fallback;\n }\n\n return null;\n}\n\nfunction configHasTopLevelFields(\n pluginConfig: Record<string, unknown>,\n _pluginKey: string,\n): boolean {\n return (\n (pluginConfig.routes !== undefined && Array.isArray(pluginConfig.routes)) ||\n (pluginConfig.sidebar !== undefined && Array.isArray(pluginConfig.sidebar)) ||\n getApiEntry(pluginConfig) !== null\n );\n}\n\nfunction getApiEntry(pluginConfig: Record<string, unknown>): Record<string, unknown> | null {\n if (!pluginConfig.app || typeof pluginConfig.app !== \"object\") return null;\n const app = pluginConfig.app as Record<string, unknown>;\n if (!app.api || typeof app.api !== \"object\") return null;\n return app.api as Record<string, unknown>;\n}\n\nexport async function migrateBosConfigFiles(projectDir: string): Promise<string[]> {\n const migrated: string[] = [];\n const rootConfigPath = join(projectDir, \"bos.config.json\");\n\n if (existsSync(rootConfigPath)) {\n const rootConfig = JSON.parse(readFileSync(rootConfigPath, \"utf-8\")) as Record<string, unknown>;\n let rootChanged = migrateRootConfigTargets(rootConfig);\n\n const pluginConfigPaths = await glob(\"plugins/*/bos.config.json\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n\n for (const relativePath of pluginConfigPaths) {\n const match = relativePath.match(/^plugins\\/([^/]+)\\/bos\\.config\\.json$/);\n const pluginKey = match?.[1];\n if (!pluginKey) continue;\n\n const filePath = join(projectDir, relativePath);\n try {\n const pluginConfig = JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, unknown>;\n rootChanged = mergePluginConfigIntoRoot(rootConfig, pluginKey, pluginConfig) || rootChanged;\n } catch {}\n\n try {\n rmSync(filePath);\n migrated.push(relativePath);\n } catch {}\n }\n\n if (rootConfig.plugins && typeof rootConfig.plugins === \"object\") {\n for (const pluginKey of Object.keys(rootConfig.plugins as Record<string, unknown>)) {\n rootChanged = migratePluginProviderConfig(rootConfig, pluginKey) || rootChanged;\n }\n }\n\n if (rootChanged || migrated.length > 0) {\n await saveBosConfig(projectDir, rootConfig);\n if (!migrated.includes(\"bos.config.json\")) {\n migrated.push(\"bos.config.json\");\n }\n }\n }\n\n return migrated;\n}\n\nasync function loadParentPluginOptions(projectDir: string): Promise<{\n localConfig: Record<string, unknown>;\n parentPlugins: Record<string, unknown>;\n newPluginKeys: string[];\n} | null> {\n const configPath = join(projectDir, \"bos.config.json\");\n if (!existsSync(configPath)) {\n return null;\n }\n\n const localConfig = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n const extendsRef = getExtendsRef(localConfig);\n if (!extendsRef?.startsWith(\"bos://\")) {\n return null;\n }\n\n const parsed = parseBosRef(extendsRef);\n if (!parsed) {\n return null;\n }\n\n let parentConfig: Record<string, unknown>;\n try {\n parentConfig = await fetchParentConfig(parsed.account, parsed.gateway);\n } catch {\n return null;\n }\n\n const parentPlugins =\n parentConfig.plugins && typeof parentConfig.plugins === \"object\"\n ? (parentConfig.plugins as Record<string, unknown>)\n : {};\n const localPlugins =\n localConfig.plugins && typeof localConfig.plugins === \"object\"\n ? (localConfig.plugins as Record<string, unknown>)\n : {};\n\n const newPluginKeys = Object.keys(parentPlugins).filter((key) => !(key in localPlugins));\n return { localConfig, parentPlugins, newPluginKeys };\n}\n\nasync function addSelectedParentPlugins(projectDir: string): Promise<string[]> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n return [];\n }\n\n const pluginOptions = await loadParentPluginOptions(projectDir);\n if (!pluginOptions || pluginOptions.newPluginKeys.length === 0) {\n return [];\n }\n\n const selectedValue = await p.multiselect({\n message: \"Select new plugins from parent:\",\n options: pluginOptions.newPluginKeys.map((key) => ({ value: key, label: key })),\n required: false,\n });\n\n if (p.isCancel(selectedValue)) {\n process.exit(0);\n }\n\n const selected = selectedValue as string[];\n if (selected.length === 0) {\n return [];\n }\n\n const localPlugins =\n pluginOptions.localConfig.plugins && typeof pluginOptions.localConfig.plugins === \"object\"\n ? (pluginOptions.localConfig.plugins as Record<string, unknown>)\n : {};\n const nextPlugins = { ...localPlugins };\n for (const key of selected) {\n const parentPlugin = pluginOptions.parentPlugins[key];\n if (parentPlugin && typeof parentPlugin === \"object\") {\n const nextPlugin = structuredClone(parentPlugin as Record<string, unknown>);\n rewriteExtendsTarget(nextPlugin, `plugins.${key}`);\n nextPlugins[key] = nextPlugin;\n } else if (typeof parentPlugin === \"string\") {\n nextPlugins[key] = ensureTargetedRef(parentPlugin, `plugins.${key}`);\n } else {\n nextPlugins[key] = parentPlugin;\n }\n }\n\n pluginOptions.localConfig.plugins = nextPlugins;\n await saveBosConfig(projectDir, pluginOptions.localConfig);\n\n return selected;\n}\n\nfunction readInstalledVersion(projectDir: string, packageName: string): string | undefined {\n return readInstalledFrameworkVersion(projectDir, packageName);\n}\n\nfunction setCatalogRef(field: Record<string, string> | undefined, packageName: string): boolean {\n if (!field || !(packageName in field)) return false;\n if (field[packageName] === \"catalog:\" || field[packageName].startsWith(\"file:\")) return false;\n field[packageName] = \"catalog:\";\n return true;\n}\n\nfunction updateWorkspacePackageRefInFile(filePath: string, packageName: string): boolean {\n const pkg = JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, unknown>;\n let modified = false;\n\n for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const field = pkg[fieldName] as Record<string, string> | undefined;\n if (setCatalogRef(field, packageName)) {\n modified = true;\n }\n }\n\n if (modified) {\n writeFileSync(filePath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n return modified;\n}\n\nfunction updateRootPackageVersion(\n projectDir: string,\n packageName: string,\n newVersion: string,\n): boolean {\n const pkgPath = join(projectDir, \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n let modified = false;\n\n for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const field = pkg[fieldName] as Record<string, string> | undefined;\n if (setCatalogRef(field, packageName)) {\n modified = true;\n }\n }\n\n if (!pkg.workspaces || typeof pkg.workspaces !== \"object\") {\n pkg.workspaces = { packages: [], catalog: {} };\n modified = true;\n }\n\n const workspaces = pkg.workspaces as { packages?: string[]; catalog?: Record<string, string> };\n if (!workspaces.catalog || typeof workspaces.catalog !== \"object\") {\n workspaces.catalog = {};\n modified = true;\n }\n\n const nextVersion = newVersion;\n if (workspaces.catalog[packageName] !== nextVersion) {\n workspaces.catalog[packageName] = nextVersion;\n modified = true;\n }\n\n if (modified) {\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n return modified;\n}\n\nfunction updateRootCatalogVersion(\n projectDir: string,\n packageName: string,\n newVersion: string,\n): boolean {\n const pkgPath = join(projectDir, \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n\n if (!pkg.workspaces || typeof pkg.workspaces !== \"object\") {\n pkg.workspaces = { packages: [], catalog: {} };\n }\n const workspaces = pkg.workspaces as { packages?: string[]; catalog?: Record<string, string> };\n if (!workspaces.catalog || typeof workspaces.catalog !== \"object\") {\n workspaces.catalog = {};\n }\n\n const nextVersion = newVersion;\n if (workspaces.catalog[packageName] === nextVersion) return false;\n\n workspaces.catalog[packageName] = nextVersion;\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n return true;\n}\n\nasync function findWorkspacePackageJsons(projectDir: string): Promise<string[]> {\n const rootPkgPath = join(projectDir, \"package.json\");\n if (!existsSync(rootPkgPath)) return [];\n\n const rootPkg = JSON.parse(readFileSync(rootPkgPath, \"utf-8\")) as Record<string, unknown>;\n const workspaceConfig = rootPkg.workspaces as { packages?: string[] } | string[] | undefined;\n\n const patterns: string[] = [];\n if (Array.isArray(workspaceConfig)) {\n patterns.push(...workspaceConfig);\n } else if (workspaceConfig?.packages && Array.isArray(workspaceConfig.packages)) {\n patterns.push(...workspaceConfig.packages);\n }\n\n if (patterns.length === 0) return [];\n\n const pkgPaths: string[] = [];\n for (const pattern of patterns) {\n const matches = await glob(pattern, { cwd: projectDir, dot: false, absolute: false });\n for (const match of matches) {\n const pkgPath = join(projectDir, match, \"package.json\");\n if (existsSync(pkgPath) && statSync(pkgPath).isFile()) {\n pkgPaths.push(pkgPath);\n }\n }\n }\n\n return [...new Set(pkgPaths)];\n}\n\nfunction buildChangelogUrl(\n oldVersion: string | undefined,\n newVersion: string,\n parentConfig: Record<string, unknown> | null,\n): string | undefined {\n if (!oldVersion || oldVersion === newVersion) return undefined;\n const repoUrl = parentConfig?.repository as string | undefined;\n if (!repoUrl) return undefined;\n\n const githubMatch = repoUrl.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (!githubMatch) return undefined;\n\n const [, owner, repo] = githubMatch;\n return `https://github.com/${owner}/${repo}/compare/v${oldVersion}...v${newVersion}`;\n}\n\nasync function rewriteLegacyUiImports(projectDir: string): Promise<string[]> {\n const files = await glob(\"ui/src/**/*.{ts,tsx}\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n const migrated: string[] = [];\n\n for (const file of files) {\n const filePath = join(projectDir, file);\n const original = readFileSync(filePath, \"utf-8\");\n let next = original;\n\n for (const [from, to] of LEGACY_UI_IMPORT_REWRITES) {\n next = next.replaceAll(from, to);\n }\n\n if (next !== original) {\n writeFileSync(filePath, next);\n migrated.push(file);\n }\n }\n\n return migrated;\n}\n\nexport async function upgradeTemplate(\n projectDir: string,\n options: UpgradeOptions,\n): Promise<UpgradeResult> {\n const timings: PhaseTiming[] = [];\n const pkgPath = join(projectDir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {\n status: \"error\",\n packages: [],\n timings,\n error: \"No package.json found in current directory\",\n };\n }\n\n const sourceRootCatalog = await readExtendedRootCatalog(projectDir);\n\n const { packages, catalogVersionUpdates } = await timePhase(\n timings,\n \"check package versions\",\n async () => {\n const nextPackages: UpgradeResult[\"packages\"] = [];\n\n for (const name of FRAMEWORK_PACKAGES) {\n const installed = readInstalledVersion(projectDir, name);\n const latest = extractVersion(sourceRootCatalog[name]);\n\n if (!latest) {\n nextPackages.push({ name, from: installed, to: installed ?? \"unknown\" });\n continue;\n }\n\n nextPackages.push({ name, from: installed, to: latest });\n }\n\n const nextCatalogVersionUpdates: Array<{\n name: string;\n from: string | undefined;\n to: string;\n }> = [];\n for (const name of CATALOG_TOOL_PACKAGES) {\n const installed = readInstalledVersion(projectDir, name);\n if (!installed) continue;\n const targetVersion =\n PINNED_CATALOG_TOOL_VERSIONS[name] ??\n extractVersion(sourceRootCatalog[name]) ??\n installed;\n if (installed === targetVersion) continue;\n nextCatalogVersionUpdates.push({ name, from: installed, to: targetVersion });\n }\n\n return { packages: nextPackages, catalogVersionUpdates: nextCatalogVersionUpdates };\n },\n );\n\n const hasFrameworkUpdates = packages.some((p) => p.from !== p.to && p.from !== undefined);\n const hasCatalogUpdates = catalogVersionUpdates.length > 0;\n const hasUpdates = hasFrameworkUpdates || hasCatalogUpdates;\n\n if (options.dryRun) {\n let changelogUrl: string | undefined;\n const pluginOptions = options.noSync\n ? null\n : await timePhase(timings, \"discover parent plugins\", () =>\n loadParentPluginOptions(projectDir),\n );\n if (hasUpdates) {\n const configPath = join(projectDir, \"bos.config.json\");\n let parentConfig: Record<string, unknown> | null = null;\n if (existsSync(configPath)) {\n try {\n parentConfig = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {}\n }\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);\n }\n }\n\n return {\n status: \"dry-run\",\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n availablePlugins: pluginOptions?.newPluginKeys,\n timings,\n changelogUrl,\n };\n }\n\n await timePhase(timings, \"apply package updates\", async () => {\n for (const pkg of packages) {\n if (pkg.from !== undefined && pkg.from !== pkg.to) {\n updateRootPackageVersion(projectDir, pkg.name, pkg.to);\n }\n }\n\n for (const update of catalogVersionUpdates) {\n updateRootCatalogVersion(projectDir, update.name, update.to);\n }\n\n const workspacePkgPaths = await findWorkspacePackageJsons(projectDir);\n for (const pkgPath of workspacePkgPaths) {\n for (const pkg of packages) {\n if (pkg.from !== undefined && pkg.from !== pkg.to) {\n updateWorkspacePackageRefInFile(pkgPath, pkg.name);\n }\n }\n for (const update of catalogVersionUpdates) {\n updateWorkspacePackageRefInFile(pkgPath, update.name);\n }\n }\n });\n\n const migratedBosConfigs = await timePhase(timings, \"migrate bos configs\", () =>\n migrateBosConfigFiles(projectDir),\n );\n\n let syncResult: UpgradeResult[\"sync\"];\n let addedPlugins: string[] = [];\n if (!options.noSync) {\n addedPlugins = await timePhase(timings, \"discover parent plugins\", async () => {\n if (options.dryRun) return [];\n return addSelectedParentPlugins(projectDir);\n });\n\n syncResult = await timePhase(timings, \"sync template\", () =>\n syncTemplate(projectDir, {\n dryRun: false,\n force: options.force,\n noInstall: true,\n }),\n );\n }\n\n if ((hasUpdates || addedPlugins.length > 0) && !options.noInstall) {\n await timePhase(timings, \"install dependencies\", () => runBunInstallForUpgrade(projectDir));\n await timePhase(timings, \"generate types\", () => runTypesGen(projectDir));\n }\n\n const migratedFiles = await timePhase(timings, \"clean obsolete files\", async () => {\n const nextMigratedFiles = [\n ...migratedBosConfigs,\n ...(await rewriteLegacyUiImports(projectDir)),\n ];\n for (const file of OBSOLETE_FILES) {\n const filePath = join(projectDir, file);\n if (existsSync(filePath)) {\n rmSync(filePath);\n nextMigratedFiles.push(file);\n }\n }\n return nextMigratedFiles;\n });\n\n let changelogUrl: string | undefined;\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n const configPath = join(projectDir, \"bos.config.json\");\n let parentConfig: Record<string, unknown> | null = null;\n if (existsSync(configPath)) {\n try {\n parentConfig = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {}\n }\n changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);\n }\n\n return {\n status: \"upgraded\",\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n sync: syncResult,\n migrated: migratedFiles.length > 0 ? migratedFiles : undefined,\n selectedPlugins: addedPlugins.length > 0 ? addedPlugins : undefined,\n timings,\n changelogUrl,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"upgrade.mjs","names":[],"sources":["../../src/cli/upgrade.ts"],"sourcesContent":["import { existsSync, readFileSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport { glob } from \"glob\";\nimport type { PhaseTiming, UpgradeOptions, UpgradeResult } from \"../contract\";\nimport { resolveExtendsRef } from \"../merge\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { readInstalledFrameworkVersion } from \"./framework-version\";\nimport { fetchParentConfig, resolveSourceDir, runBunInstallForUpgrade, runTypesGen } from \"./init\";\nimport { syncTemplate } from \"./sync\";\nimport { timePhase } from \"./timing\";\n\nconst FRAMEWORK_PACKAGES = [\"everything-dev\", \"every-plugin\"];\nconst LEGACY_UI_IMPORT_REWRITES = [\n ['from \"@/auth\"', 'from \"@/app\"'],\n [\"from '@/auth'\", \"from '@/app'\"],\n ['from \"@/lib/use-api-client\"', 'from \"@/app\"'],\n [\"from '@/lib/use-api-client'\", \"from '@/app'\"],\n ['from \"@/lib/api-client\"', 'from \"@/app\"'],\n [\"from '@/lib/api-client'\", \"from '@/app'\"],\n] as const;\nconst OBSOLETE_FILES = [\n \"ui/src/auth.ts\",\n \"ui/src/auth-types.gen.ts\",\n \"ui/src/lib/api-client.ts\",\n \"ui/src/lib/use-api-client.ts\",\n \"ui/src/api-contract.ts\",\n \"ui/src/api-contract.gen.ts\",\n \"ui/src/lib/auth-client.ts\",\n \"ui/src/lib/session.ts\",\n \"ui/scripts/generate-metadata.ts\",\n \".github/dependabot.yml\",\n \".github/templates/dependabot.yml\",\n \".github/workflows/release-sync.yml\",\n \"packages/everything-dev/cli.js\",\n \".templatekeep\",\n \".templatesync-exclude\",\n];\n\ninterface ExtendedRootSource {\n catalog: Record<string, string>;\n repository?: string;\n extendsChain: string[];\n}\n\nfunction extractSemver(value: string | undefined): string | null {\n if (!value) return null;\n const match = value.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match?.[0] ?? null;\n}\n\nfunction readJsonFile<T>(filePath: string): T {\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as T;\n}\n\nfunction readRootPackageJson(projectDir: string): Record<string, unknown> {\n return readJsonFile<Record<string, unknown>>(join(projectDir, \"package.json\"));\n}\n\nfunction readRootCatalogEntry(projectDir: string, packageName: string): string | undefined {\n const pkg = readRootPackageJson(projectDir) as {\n workspaces?: { catalog?: Record<string, string> };\n };\n return pkg.workspaces?.catalog?.[packageName];\n}\n\nfunction readCurrentPackageSpecifier(projectDir: string, packageName: string): string | undefined {\n const pkg = readRootPackageJson(projectDir);\n\n for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const field = pkg[fieldName] as Record<string, string> | undefined;\n const value = field?.[packageName];\n if (!value) continue;\n\n if (value === \"catalog:\") {\n return (\n readRootCatalogEntry(projectDir, packageName) ??\n readInstalledVersion(projectDir, packageName)\n );\n }\n\n if (value.startsWith(\"workspace:\") || value.startsWith(\"file:\")) {\n return readInstalledVersion(projectDir, packageName);\n }\n\n return value;\n }\n\n return (\n readRootCatalogEntry(projectDir, packageName) ?? readInstalledVersion(projectDir, packageName)\n );\n}\n\nfunction setCatalogRefs(\n field: Record<string, string> | undefined,\n packageNames: ReadonlyArray<string>,\n): boolean {\n if (!field) return false;\n\n let modified = false;\n for (const packageName of packageNames) {\n if (setCatalogRef(field, packageName)) {\n modified = true;\n }\n }\n\n return modified;\n}\n\nfunction syncPackageObjectCatalogRefs(\n pkg: Record<string, unknown>,\n packageNames: ReadonlyArray<string>,\n): boolean {\n let modified = false;\n\n for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const field = pkg[fieldName] as Record<string, string> | undefined;\n if (setCatalogRefs(field, packageNames)) {\n modified = true;\n }\n }\n\n return modified;\n}\n\nfunction packageObjectNeedsCatalogRefs(\n pkg: Record<string, unknown>,\n packageNames: ReadonlyArray<string>,\n): boolean {\n for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const field = pkg[fieldName] as Record<string, string> | undefined;\n if (!field) continue;\n\n for (const packageName of packageNames) {\n const value = field[packageName];\n if (!value) continue;\n if (value !== \"catalog:\" && !value.startsWith(\"file:\")) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction packageFileNeedsCatalogRefs(\n filePath: string,\n packageNames: ReadonlyArray<string>,\n): boolean {\n return packageObjectNeedsCatalogRefs(\n readJsonFile<Record<string, unknown>>(filePath),\n packageNames,\n );\n}\n\nfunction updatePackageFileCatalogRefs(\n filePath: string,\n packageNames: ReadonlyArray<string>,\n): boolean {\n const pkg = readJsonFile<Record<string, unknown>>(filePath);\n const modified = syncPackageObjectCatalogRefs(pkg, packageNames);\n\n if (modified) {\n writeFileSync(filePath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n return modified;\n}\n\nfunction syncRootCatalogWithParent(\n projectDir: string,\n parentCatalog: Record<string, string>,\n): boolean {\n const pkgPath = join(projectDir, \"package.json\");\n const pkg = readJsonFile<Record<string, unknown>>(pkgPath);\n let modified = syncPackageObjectCatalogRefs(pkg, Object.keys(parentCatalog));\n\n if (!pkg.workspaces || typeof pkg.workspaces !== \"object\") {\n pkg.workspaces = { packages: [], catalog: {} };\n modified = true;\n }\n\n const workspaces = pkg.workspaces as { packages?: string[]; catalog?: Record<string, string> };\n if (!workspaces.catalog || typeof workspaces.catalog !== \"object\") {\n workspaces.catalog = {};\n modified = true;\n }\n\n for (const [packageName, version] of Object.entries(parentCatalog)) {\n if (workspaces.catalog[packageName] !== version) {\n workspaces.catalog[packageName] = version;\n modified = true;\n }\n }\n\n if (modified) {\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n return modified;\n}\n\nasync function readExtendedRootSource(projectDir: string): Promise<ExtendedRootSource> {\n const configPath = join(projectDir, \"bos.config.json\");\n if (!existsSync(configPath)) {\n return { catalog: {}, extendsChain: [] };\n }\n\n const localConfig = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n let extendsRef = getExtendsRef(localConfig);\n if (!extendsRef?.startsWith(\"bos://\")) {\n return {\n catalog: {},\n repository: typeof localConfig.repository === \"string\" ? localConfig.repository : undefined,\n extendsChain: [],\n };\n }\n\n const extendsChain: string[] = [];\n const visited = new Set<string>();\n let repository = typeof localConfig.repository === \"string\" ? localConfig.repository : undefined;\n let rootRef = extendsRef;\n\n while (extendsRef?.startsWith(\"bos://\")) {\n if (visited.has(extendsRef)) {\n throw new Error(`Circular extends detected while resolving upgrade source: ${extendsRef}`);\n }\n visited.add(extendsRef);\n extendsChain.push(extendsRef);\n\n const parsed = parseBosRef(extendsRef);\n if (!parsed) {\n break;\n }\n\n rootRef = extendsRef;\n\n let parentConfig: Record<string, unknown>;\n try {\n parentConfig = (await fetchParentConfig(parsed.account, parsed.gateway)) as Record<\n string,\n unknown\n >;\n } catch {\n break;\n }\n\n if (typeof parentConfig.repository === \"string\") {\n repository = parentConfig.repository;\n }\n\n const nextExtendsRef = getExtendsRef(parentConfig);\n if (!nextExtendsRef?.startsWith(\"bos://\")) {\n break;\n }\n\n extendsRef = nextExtendsRef;\n }\n\n const parsed = parseBosRef(rootRef);\n if (!parsed) {\n return { catalog: {}, repository, extendsChain };\n }\n\n const { sourceDir, cleanup } = await resolveSourceDir({\n extendsAccount: parsed.account,\n extendsGateway: parsed.gateway,\n });\n\n try {\n const sourcePkgPath = join(sourceDir, \"package.json\");\n if (!existsSync(sourcePkgPath)) {\n return { catalog: {}, repository, extendsChain };\n }\n\n const sourcePkg = JSON.parse(readFileSync(sourcePkgPath, \"utf-8\")) as {\n workspaces?: { catalog?: Record<string, string> };\n };\n return {\n catalog: { ...(sourcePkg.workspaces?.catalog ?? {}) },\n repository,\n extendsChain,\n };\n } finally {\n await cleanup();\n }\n}\n\nfunction getExtendsRef(config: Record<string, unknown>): string | undefined {\n if (typeof config.extends === \"string\") {\n return config.extends;\n }\n\n if (config.extends && typeof config.extends === \"object\") {\n return resolveExtendsRef(config.extends as Record<string, string>, \"production\");\n }\n\n return undefined;\n}\n\nfunction parseBosRef(ref: string): { account: string; gateway: string } | null {\n const match = ref.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (!match?.[1] || !match[2]) return null;\n return { account: match[1], gateway: match[2] };\n}\n\nfunction parseTargetedRef(ref: string): { configRef: string; targetPath?: string } {\n const hashIndex = ref.indexOf(\"#\");\n if (hashIndex === -1) {\n return { configRef: ref };\n }\n return {\n configRef: ref.slice(0, hashIndex),\n targetPath: ref.slice(hashIndex + 1) || undefined,\n };\n}\n\nfunction ensureTargetedRef(ref: string, targetPath: string): string {\n const parsed = parseTargetedRef(ref);\n if (parsed.targetPath) return ref;\n return `${parsed.configRef}#${targetPath}`;\n}\n\nfunction rewriteExtendsTarget(\n entry: Record<string, unknown> | undefined,\n targetPath: string,\n): boolean {\n if (!entry?.extends) return false;\n\n if (typeof entry.extends === \"string\") {\n const next = ensureTargetedRef(entry.extends, targetPath);\n if (next === entry.extends) return false;\n entry.extends = next;\n return true;\n }\n\n if (typeof entry.extends === \"object\") {\n let changed = false;\n for (const [key, value] of Object.entries(entry.extends as Record<string, unknown>)) {\n if (typeof value !== \"string\") continue;\n const next = ensureTargetedRef(value, targetPath);\n if (next !== value) {\n (entry.extends as Record<string, unknown>)[key] = next;\n changed = true;\n }\n }\n return changed;\n }\n\n return false;\n}\n\nfunction migrateRootConfigTargets(config: Record<string, unknown>): boolean {\n let changed = false;\n const app =\n config.app && typeof config.app === \"object\"\n ? (config.app as Record<string, unknown>)\n : undefined;\n\n if (app?.api && typeof app.api === \"object\") {\n changed = rewriteExtendsTarget(app.api as Record<string, unknown>, \"app.api\") || changed;\n }\n if (app?.auth && typeof app.auth === \"object\") {\n changed = rewriteExtendsTarget(app.auth as Record<string, unknown>, \"app.auth\") || changed;\n }\n\n if (config.plugins && typeof config.plugins === \"object\") {\n for (const [pluginKey, pluginValue] of Object.entries(\n config.plugins as Record<string, unknown>,\n )) {\n if (typeof pluginValue === \"string\") {\n const next = ensureTargetedRef(pluginValue, `plugins.${pluginKey}`);\n if (next !== pluginValue) {\n (config.plugins as Record<string, unknown>)[pluginKey] = next;\n changed = true;\n }\n continue;\n }\n if (!pluginValue || typeof pluginValue !== \"object\") continue;\n changed =\n rewriteExtendsTarget(pluginValue as Record<string, unknown>, `plugins.${pluginKey}`) ||\n changed;\n }\n }\n\n return changed;\n}\n\nfunction migratePluginProviderConfig(config: Record<string, unknown>, pluginKey: string): boolean {\n let changed = false;\n if (!config.plugins || typeof config.plugins !== \"object\") {\n return false;\n }\n\n const plugins = config.plugins as Record<string, unknown>;\n const entry = plugins[pluginKey];\n if (!entry || typeof entry !== \"object\") return false;\n\n const pluginEntry = entry as Record<string, unknown>;\n\n if (\"name\" in pluginEntry) {\n delete pluginEntry.name;\n changed = true;\n }\n\n if (typeof pluginEntry.development === \"string\" && pluginEntry.development.startsWith(\"local:\")) {\n if (\"extends\" in pluginEntry) {\n delete pluginEntry.extends;\n changed = true;\n }\n }\n\n changed = rewriteExtendsTarget(pluginEntry, `plugins.${pluginKey}`) || changed;\n\n return changed;\n}\n\nfunction mergePluginConfigIntoRoot(\n rootConfig: Record<string, unknown>,\n pluginKey: string,\n pluginConfig: Record<string, unknown>,\n): boolean {\n let changed = false;\n\n if (!rootConfig.plugins || typeof rootConfig.plugins !== \"object\") {\n rootConfig.plugins = {};\n changed = true;\n }\n const plugins = rootConfig.plugins as Record<string, unknown>;\n if (!plugins[pluginKey] || typeof plugins[pluginKey] !== \"object\") {\n plugins[pluginKey] = {};\n changed = true;\n }\n\n const entry = plugins[pluginKey] as Record<string, unknown>;\n\n const pluginData = extractPluginEntry(pluginConfig, pluginKey);\n\n const apiData = getApiEntry(pluginConfig);\n\n if (pluginData) {\n for (const key of [\n \"secrets\",\n \"variables\",\n \"routes\",\n \"sidebar\",\n \"production\",\n \"integrity\",\n \"proxy\",\n ] as const) {\n if (pluginData[key] !== undefined && entry[key] === undefined) {\n entry[key] = pluginData[key];\n changed = true;\n }\n }\n\n if (typeof pluginData.development === \"string\" && pluginData.development.startsWith(\"local:\")) {\n pluginData.development = `local:plugins/${pluginKey}`;\n }\n if (entry.development === undefined && pluginData.development !== undefined) {\n entry.development = pluginData.development;\n changed = true;\n }\n }\n\n if (apiData) {\n for (const key of [\n \"production\",\n \"integrity\",\n \"proxy\",\n \"variables\",\n \"secrets\",\n \"sidebar\",\n \"routes\",\n ] as const) {\n if (apiData[key] !== undefined && entry[key] === undefined) {\n entry[key] = apiData[key];\n changed = true;\n }\n }\n }\n\n if (\"extends\" in entry) {\n const extendsStr = typeof entry.extends === \"string\" ? entry.extends : undefined;\n if (!extendsStr || extendsStr.includes(`#plugins.${pluginKey}`)) {\n delete entry.extends;\n changed = true;\n }\n }\n\n if (\"name\" in entry) {\n delete entry.name;\n changed = true;\n }\n\n if (configHasTopLevelFields(pluginConfig, pluginKey)) {\n if (entry.routes === undefined && Array.isArray(pluginConfig.routes)) {\n entry.routes = pluginConfig.routes;\n changed = true;\n }\n if (entry.sidebar === undefined && Array.isArray(pluginConfig.sidebar)) {\n entry.sidebar = pluginConfig.sidebar;\n changed = true;\n }\n const api = getApiEntry(pluginConfig);\n if (api) {\n if (entry.routes === undefined && Array.isArray(api.routes)) {\n entry.routes = api.routes;\n changed = true;\n }\n if (entry.sidebar === undefined && Array.isArray(api.sidebar)) {\n entry.sidebar = api.sidebar;\n changed = true;\n }\n }\n }\n\n return changed;\n}\n\nfunction extractPluginEntry(\n pluginConfig: Record<string, unknown>,\n pluginKey: string,\n): Record<string, unknown> | null {\n if (\n pluginConfig.plugins &&\n typeof pluginConfig.plugins === \"object\" &&\n (pluginConfig.plugins as Record<string, unknown>)[pluginKey] &&\n typeof (pluginConfig.plugins as Record<string, unknown>)[pluginKey] === \"object\"\n ) {\n return (pluginConfig.plugins as Record<string, unknown>)[pluginKey] as Record<string, unknown>;\n }\n\n const fallback: Record<string, unknown> = {};\n if (pluginConfig.sidebar !== undefined) {\n fallback.sidebar = pluginConfig.sidebar;\n }\n if (pluginConfig.routes !== undefined) {\n fallback.routes = pluginConfig.routes;\n }\n if (Object.keys(fallback).length > 0) {\n return fallback;\n }\n\n return null;\n}\n\nfunction configHasTopLevelFields(\n pluginConfig: Record<string, unknown>,\n _pluginKey: string,\n): boolean {\n return (\n (pluginConfig.routes !== undefined && Array.isArray(pluginConfig.routes)) ||\n (pluginConfig.sidebar !== undefined && Array.isArray(pluginConfig.sidebar)) ||\n getApiEntry(pluginConfig) !== null\n );\n}\n\nfunction getApiEntry(pluginConfig: Record<string, unknown>): Record<string, unknown> | null {\n if (!pluginConfig.app || typeof pluginConfig.app !== \"object\") return null;\n const app = pluginConfig.app as Record<string, unknown>;\n if (!app.api || typeof app.api !== \"object\") return null;\n return app.api as Record<string, unknown>;\n}\n\nexport async function migrateBosConfigFiles(projectDir: string): Promise<string[]> {\n const migrated: string[] = [];\n const rootConfigPath = join(projectDir, \"bos.config.json\");\n\n if (existsSync(rootConfigPath)) {\n const rootConfig = JSON.parse(readFileSync(rootConfigPath, \"utf-8\")) as Record<string, unknown>;\n let rootChanged = migrateRootConfigTargets(rootConfig);\n\n const pluginConfigPaths = await glob(\"plugins/*/bos.config.json\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n\n for (const relativePath of pluginConfigPaths) {\n const match = relativePath.match(/^plugins\\/([^/]+)\\/bos\\.config\\.json$/);\n const pluginKey = match?.[1];\n if (!pluginKey) continue;\n\n const filePath = join(projectDir, relativePath);\n try {\n const pluginConfig = JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, unknown>;\n rootChanged = mergePluginConfigIntoRoot(rootConfig, pluginKey, pluginConfig) || rootChanged;\n } catch {}\n\n try {\n rmSync(filePath);\n migrated.push(relativePath);\n } catch {}\n }\n\n if (rootConfig.plugins && typeof rootConfig.plugins === \"object\") {\n for (const pluginKey of Object.keys(rootConfig.plugins as Record<string, unknown>)) {\n rootChanged = migratePluginProviderConfig(rootConfig, pluginKey) || rootChanged;\n }\n }\n\n if (rootChanged || migrated.length > 0) {\n await saveBosConfig(projectDir, rootConfig);\n if (!migrated.includes(\"bos.config.json\")) {\n migrated.push(\"bos.config.json\");\n }\n }\n }\n\n return migrated;\n}\n\nasync function loadParentPluginOptions(projectDir: string): Promise<{\n localConfig: Record<string, unknown>;\n parentPlugins: Record<string, unknown>;\n newPluginKeys: string[];\n} | null> {\n const configPath = join(projectDir, \"bos.config.json\");\n if (!existsSync(configPath)) {\n return null;\n }\n\n const localConfig = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n const extendsRef = getExtendsRef(localConfig);\n if (!extendsRef?.startsWith(\"bos://\")) {\n return null;\n }\n\n const parsed = parseBosRef(extendsRef);\n if (!parsed) {\n return null;\n }\n\n let parentConfig: Record<string, unknown>;\n try {\n parentConfig = await fetchParentConfig(parsed.account, parsed.gateway);\n } catch {\n return null;\n }\n\n const parentPlugins =\n parentConfig.plugins && typeof parentConfig.plugins === \"object\"\n ? (parentConfig.plugins as Record<string, unknown>)\n : {};\n const localPlugins =\n localConfig.plugins && typeof localConfig.plugins === \"object\"\n ? (localConfig.plugins as Record<string, unknown>)\n : {};\n\n const newPluginKeys = Object.keys(parentPlugins).filter((key) => !(key in localPlugins));\n return { localConfig, parentPlugins, newPluginKeys };\n}\n\nasync function addSelectedParentPlugins(projectDir: string): Promise<string[]> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n return [];\n }\n\n const pluginOptions = await loadParentPluginOptions(projectDir);\n if (!pluginOptions || pluginOptions.newPluginKeys.length === 0) {\n return [];\n }\n\n const selectedValue = await p.multiselect({\n message: \"Select new plugins from parent:\",\n options: pluginOptions.newPluginKeys.map((key) => ({ value: key, label: key })),\n required: false,\n });\n\n if (p.isCancel(selectedValue)) {\n process.exit(0);\n }\n\n const selected = selectedValue as string[];\n if (selected.length === 0) {\n return [];\n }\n\n const localPlugins =\n pluginOptions.localConfig.plugins && typeof pluginOptions.localConfig.plugins === \"object\"\n ? (pluginOptions.localConfig.plugins as Record<string, unknown>)\n : {};\n const nextPlugins = { ...localPlugins };\n for (const key of selected) {\n const parentPlugin = pluginOptions.parentPlugins[key];\n if (parentPlugin && typeof parentPlugin === \"object\") {\n const nextPlugin = structuredClone(parentPlugin as Record<string, unknown>);\n rewriteExtendsTarget(nextPlugin, `plugins.${key}`);\n nextPlugins[key] = nextPlugin;\n } else if (typeof parentPlugin === \"string\") {\n nextPlugins[key] = ensureTargetedRef(parentPlugin, `plugins.${key}`);\n } else {\n nextPlugins[key] = parentPlugin;\n }\n }\n\n pluginOptions.localConfig.plugins = nextPlugins;\n await saveBosConfig(projectDir, pluginOptions.localConfig);\n\n return selected;\n}\n\nfunction readInstalledVersion(projectDir: string, packageName: string): string | undefined {\n return readInstalledFrameworkVersion(projectDir, packageName);\n}\n\nfunction setCatalogRef(field: Record<string, string> | undefined, packageName: string): boolean {\n if (!field || !(packageName in field)) return false;\n if (field[packageName] === \"catalog:\" || field[packageName].startsWith(\"file:\")) return false;\n field[packageName] = \"catalog:\";\n return true;\n}\n\nasync function findWorkspacePackageJsons(projectDir: string): Promise<string[]> {\n const rootPkgPath = join(projectDir, \"package.json\");\n if (!existsSync(rootPkgPath)) return [];\n\n const rootPkg = JSON.parse(readFileSync(rootPkgPath, \"utf-8\")) as Record<string, unknown>;\n const workspaceConfig = rootPkg.workspaces as { packages?: string[] } | string[] | undefined;\n\n const patterns: string[] = [];\n if (Array.isArray(workspaceConfig)) {\n patterns.push(...workspaceConfig);\n } else if (workspaceConfig?.packages && Array.isArray(workspaceConfig.packages)) {\n patterns.push(...workspaceConfig.packages);\n }\n\n if (patterns.length === 0) return [];\n\n const pkgPaths: string[] = [];\n for (const pattern of patterns) {\n const matches = await glob(pattern, { cwd: projectDir, dot: false, absolute: false });\n for (const match of matches) {\n const pkgPath = join(projectDir, match, \"package.json\");\n if (existsSync(pkgPath) && statSync(pkgPath).isFile()) {\n pkgPaths.push(pkgPath);\n }\n }\n }\n\n return [...new Set(pkgPaths)];\n}\n\nfunction buildChangelogUrl(\n oldVersion: string | undefined,\n newVersion: string,\n repository: string | undefined,\n): string | undefined {\n const fromVersion = extractSemver(oldVersion);\n const toVersion = extractSemver(newVersion);\n if (!fromVersion || !toVersion || fromVersion === toVersion) return undefined;\n\n const repoUrl = repository;\n if (!repoUrl) return undefined;\n\n const githubMatch = repoUrl.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (!githubMatch) return undefined;\n\n const [, owner, repo] = githubMatch;\n return `https://github.com/${owner}/${repo}/compare/v${fromVersion}...v${toVersion}`;\n}\n\nasync function rewriteLegacyUiImports(projectDir: string): Promise<string[]> {\n const files = await glob(\"ui/src/**/*.{ts,tsx}\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n const migrated: string[] = [];\n\n for (const file of files) {\n const filePath = join(projectDir, file);\n const original = readFileSync(filePath, \"utf-8\");\n let next = original;\n\n for (const [from, to] of LEGACY_UI_IMPORT_REWRITES) {\n next = next.replaceAll(from, to);\n }\n\n if (next !== original) {\n writeFileSync(filePath, next);\n migrated.push(file);\n }\n }\n\n return migrated;\n}\n\nexport async function upgradeTemplate(\n projectDir: string,\n options: UpgradeOptions,\n): Promise<UpgradeResult> {\n const timings: PhaseTiming[] = [];\n const pkgPath = join(projectDir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {\n status: \"error\",\n packages: [],\n timings,\n error: \"No package.json found in current directory\",\n };\n }\n\n const parentSource = await readExtendedRootSource(projectDir);\n const sourceRootCatalog = parentSource.catalog;\n const inheritedCatalogPackageNames = Object.keys(sourceRootCatalog);\n const currentRootCatalog = readRootPackageJson(projectDir) as {\n workspaces?: { catalog?: Record<string, string> };\n };\n const currentCatalogEntries = currentRootCatalog.workspaces?.catalog ?? {};\n const workspacePkgPaths = await findWorkspacePackageJsons(projectDir);\n const hasCatalogRefRewrites =\n inheritedCatalogPackageNames.length > 0 &&\n (packageObjectNeedsCatalogRefs(readRootPackageJson(projectDir), inheritedCatalogPackageNames) ||\n workspacePkgPaths.some((pkgPath) =>\n packageFileNeedsCatalogRefs(pkgPath, inheritedCatalogPackageNames),\n ));\n\n const { packages, catalogVersionUpdates } = await timePhase(\n timings,\n \"check package versions\",\n async () => {\n const nextPackages: UpgradeResult[\"packages\"] = [];\n\n for (const name of FRAMEWORK_PACKAGES) {\n const current = readCurrentPackageSpecifier(projectDir, name);\n const target = sourceRootCatalog[name] ?? current ?? \"unknown\";\n\n nextPackages.push({ name, from: current, to: target });\n }\n\n const nextCatalogVersionUpdates: Array<{\n name: string;\n from: string | undefined;\n to: string;\n }> = [];\n for (const [name, targetVersion] of Object.entries(sourceRootCatalog)) {\n if (FRAMEWORK_PACKAGES.includes(name)) continue;\n\n const currentVersion = currentCatalogEntries[name];\n if (currentVersion === targetVersion) continue;\n nextCatalogVersionUpdates.push({ name, from: currentVersion, to: targetVersion });\n }\n\n return { packages: nextPackages, catalogVersionUpdates: nextCatalogVersionUpdates };\n },\n );\n\n const hasFrameworkUpdates = packages.some((p) => p.from !== p.to && p.from !== undefined);\n const hasCatalogUpdates = catalogVersionUpdates.length > 0;\n const hasUpdates = hasFrameworkUpdates || hasCatalogUpdates || hasCatalogRefRewrites;\n\n if (options.dryRun) {\n let changelogUrl: string | undefined;\n const pluginOptions = options.noSync\n ? null\n : await timePhase(timings, \"discover parent plugins\", () =>\n loadParentPluginOptions(projectDir),\n );\n if (hasUpdates) {\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository);\n }\n }\n\n return {\n status: \"dry-run\",\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n availablePlugins: pluginOptions?.newPluginKeys,\n timings,\n changelogUrl,\n };\n }\n\n await timePhase(timings, \"apply package updates\", async () => {\n if (inheritedCatalogPackageNames.length > 0) {\n syncRootCatalogWithParent(projectDir, sourceRootCatalog);\n }\n\n if (inheritedCatalogPackageNames.length > 0) {\n for (const pkgPath of workspacePkgPaths) {\n updatePackageFileCatalogRefs(pkgPath, inheritedCatalogPackageNames);\n }\n }\n });\n\n const migratedBosConfigs = await timePhase(timings, \"migrate bos configs\", () =>\n migrateBosConfigFiles(projectDir),\n );\n\n let syncResult: UpgradeResult[\"sync\"];\n let addedPlugins: string[] = [];\n if (!options.noSync) {\n addedPlugins = await timePhase(timings, \"discover parent plugins\", async () => {\n if (options.dryRun) return [];\n return addSelectedParentPlugins(projectDir);\n });\n\n syncResult = await timePhase(timings, \"sync template\", () =>\n syncTemplate(projectDir, {\n dryRun: false,\n force: options.force,\n noInstall: true,\n }),\n );\n }\n\n if ((hasUpdates || addedPlugins.length > 0) && !options.noInstall) {\n await timePhase(timings, \"install dependencies\", () => runBunInstallForUpgrade(projectDir));\n await timePhase(timings, \"generate types\", () => runTypesGen(projectDir));\n }\n\n const migratedFiles = await timePhase(timings, \"clean obsolete files\", async () => {\n const nextMigratedFiles = [\n ...migratedBosConfigs,\n ...(await rewriteLegacyUiImports(projectDir)),\n ];\n for (const file of OBSOLETE_FILES) {\n const filePath = join(projectDir, file);\n if (existsSync(filePath)) {\n rmSync(filePath);\n nextMigratedFiles.push(file);\n }\n }\n return nextMigratedFiles;\n });\n\n let changelogUrl: string | undefined;\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository);\n }\n\n return {\n status: \"upgraded\",\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n sync: syncResult,\n migrated: migratedFiles.length > 0 ? migratedFiles : undefined,\n selectedPlugins: addedPlugins.length > 0 ? addedPlugins : undefined,\n timings,\n changelogUrl,\n };\n}\n"],"mappings":"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"}
|
package/dist/cli.cjs
CHANGED
|
@@ -64,6 +64,10 @@ function printStartSummary(summary) {
|
|
|
64
64
|
}
|
|
65
65
|
console.log();
|
|
66
66
|
}
|
|
67
|
+
function clearSpinnerStopLine() {
|
|
68
|
+
if (!process.stdout.isTTY) return;
|
|
69
|
+
process.stdout.write("\x1B[1A\x1B[2K\x1B[1G");
|
|
70
|
+
}
|
|
67
71
|
async function warnIfOutdated(client, command) {
|
|
68
72
|
if (![
|
|
69
73
|
"dev",
|
|
@@ -136,7 +140,8 @@ async function main() {
|
|
|
136
140
|
console.error(`[CLI] ${result.description}`);
|
|
137
141
|
process.exit(1);
|
|
138
142
|
}
|
|
139
|
-
devSpinner.stop(
|
|
143
|
+
devSpinner.stop();
|
|
144
|
+
clearSpinnerStopLine();
|
|
140
145
|
const session = require_plugin.consumeDevSession();
|
|
141
146
|
if (session) {
|
|
142
147
|
const { devApp } = await Promise.resolve().then(() => require("./dev-session.cjs"));
|