everything-dev 1.16.3 → 1.17.0
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/init.cjs +50 -51
- package/dist/cli/init.cjs.map +1 -1
- package/dist/cli/init.d.cts.map +1 -1
- package/dist/cli/init.d.mts.map +1 -1
- package/dist/cli/init.mjs +50 -51
- package/dist/cli/init.mjs.map +1 -1
- package/dist/cli/sync.cjs +3 -5
- package/dist/cli/sync.cjs.map +1 -1
- package/dist/cli/sync.mjs +3 -5
- package/dist/cli/sync.mjs.map +1 -1
- package/dist/cli/upgrade.cjs +149 -2
- package/dist/cli/upgrade.cjs.map +1 -1
- package/dist/cli/upgrade.mjs +149 -2
- package/dist/cli/upgrade.mjs.map +1 -1
- package/dist/config.cjs +125 -74
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +9 -2
- package/dist/config.d.cts.map +1 -1
- package/dist/config.d.mts +9 -2
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +126 -76
- package/dist/config.mjs.map +1 -1
- package/dist/contract.d.cts +34 -10
- package/dist/contract.d.cts.map +1 -1
- package/dist/contract.d.mts +34 -10
- package/dist/contract.d.mts.map +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +3 -3
- package/dist/merge.cjs +1 -0
- package/dist/merge.mjs +1 -1
- package/dist/plugin.cjs +11 -13
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +34 -10
- package/dist/plugin.d.mts +34 -10
- package/dist/plugin.mjs +11 -13
- package/dist/plugin.mjs.map +1 -1
- package/dist/sidebar.cjs +6 -14
- package/dist/sidebar.cjs.map +1 -1
- package/dist/sidebar.d.cts +3 -3
- package/dist/sidebar.d.cts.map +1 -1
- package/dist/sidebar.d.mts +3 -3
- package/dist/sidebar.d.mts.map +1 -1
- package/dist/sidebar.mjs +6 -14
- package/dist/sidebar.mjs.map +1 -1
- package/dist/types.cjs +10 -16
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +54 -10
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +54 -10
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +10 -17
- package/dist/types.mjs.map +1 -1
- package/package.json +1 -1
- package/src/cli/init.ts +95 -63
- package/src/cli/sync.ts +5 -8
- package/src/cli/upgrade.ts +209 -2
- package/src/config.ts +250 -107
- package/src/plugin.ts +22 -16
- package/src/sidebar.ts +9 -31
- package/src/types.ts +10 -15
package/dist/cli/upgrade.cjs
CHANGED
|
@@ -61,6 +61,144 @@ function parseBosRef(ref) {
|
|
|
61
61
|
gateway: match[2]
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
|
+
function parseTargetedRef(ref) {
|
|
65
|
+
const hashIndex = ref.indexOf("#");
|
|
66
|
+
if (hashIndex === -1) return { configRef: ref };
|
|
67
|
+
return {
|
|
68
|
+
configRef: ref.slice(0, hashIndex),
|
|
69
|
+
targetPath: ref.slice(hashIndex + 1) || void 0
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function ensureTargetedRef(ref, targetPath) {
|
|
73
|
+
const parsed = parseTargetedRef(ref);
|
|
74
|
+
if (parsed.targetPath) return ref;
|
|
75
|
+
return `${parsed.configRef}#${targetPath}`;
|
|
76
|
+
}
|
|
77
|
+
function rewriteExtendsTarget(entry, targetPath) {
|
|
78
|
+
if (!entry?.extends) return false;
|
|
79
|
+
if (typeof entry.extends === "string") {
|
|
80
|
+
const next = ensureTargetedRef(entry.extends, targetPath);
|
|
81
|
+
if (next === entry.extends) return false;
|
|
82
|
+
entry.extends = next;
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
if (typeof entry.extends === "object") {
|
|
86
|
+
let changed = false;
|
|
87
|
+
for (const [key, value] of Object.entries(entry.extends)) {
|
|
88
|
+
if (typeof value !== "string") continue;
|
|
89
|
+
const next = ensureTargetedRef(value, targetPath);
|
|
90
|
+
if (next !== value) {
|
|
91
|
+
entry.extends[key] = next;
|
|
92
|
+
changed = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return changed;
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
function migrateRootConfigTargets(config) {
|
|
100
|
+
let changed = false;
|
|
101
|
+
const app = config.app && typeof config.app === "object" ? config.app : void 0;
|
|
102
|
+
if (app?.api && typeof app.api === "object") changed = rewriteExtendsTarget(app.api, "app.api") || changed;
|
|
103
|
+
if (app?.auth && typeof app.auth === "object") changed = rewriteExtendsTarget(app.auth, "app.auth") || changed;
|
|
104
|
+
if (config.plugins && typeof config.plugins === "object") for (const [pluginKey, pluginValue] of Object.entries(config.plugins)) {
|
|
105
|
+
if (typeof pluginValue === "string") {
|
|
106
|
+
const next = ensureTargetedRef(pluginValue, `plugins.${pluginKey}`);
|
|
107
|
+
if (next !== pluginValue) {
|
|
108
|
+
config.plugins[pluginKey] = next;
|
|
109
|
+
changed = true;
|
|
110
|
+
}
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (!pluginValue || typeof pluginValue !== "object") continue;
|
|
114
|
+
changed = rewriteExtendsTarget(pluginValue, `plugins.${pluginKey}`) || changed;
|
|
115
|
+
}
|
|
116
|
+
return changed;
|
|
117
|
+
}
|
|
118
|
+
function migratePluginProviderConfig(config, pluginKey) {
|
|
119
|
+
let changed = false;
|
|
120
|
+
if (!config.plugins || typeof config.plugins !== "object") {
|
|
121
|
+
config.plugins = {};
|
|
122
|
+
changed = true;
|
|
123
|
+
}
|
|
124
|
+
const plugins = config.plugins;
|
|
125
|
+
if (!plugins[pluginKey] || typeof plugins[pluginKey] !== "object") {
|
|
126
|
+
plugins[pluginKey] = { name: pluginKey };
|
|
127
|
+
changed = true;
|
|
128
|
+
}
|
|
129
|
+
const pluginEntry = plugins[pluginKey];
|
|
130
|
+
if (typeof pluginEntry.name !== "string" || pluginEntry.name.length === 0) {
|
|
131
|
+
pluginEntry.name = pluginKey;
|
|
132
|
+
changed = true;
|
|
133
|
+
}
|
|
134
|
+
const app = config.app && typeof config.app === "object" ? config.app : void 0;
|
|
135
|
+
const apiEntry = app?.api && typeof app.api === "object" ? app.api : void 0;
|
|
136
|
+
if (apiEntry) {
|
|
137
|
+
for (const key of [
|
|
138
|
+
"extends",
|
|
139
|
+
"name",
|
|
140
|
+
"development",
|
|
141
|
+
"production",
|
|
142
|
+
"integrity",
|
|
143
|
+
"proxy",
|
|
144
|
+
"variables",
|
|
145
|
+
"secrets",
|
|
146
|
+
"sidebar",
|
|
147
|
+
"routes"
|
|
148
|
+
]) if (pluginEntry[key] === void 0 && apiEntry[key] !== void 0) {
|
|
149
|
+
pluginEntry[key] = apiEntry[key];
|
|
150
|
+
changed = true;
|
|
151
|
+
}
|
|
152
|
+
delete app.api;
|
|
153
|
+
changed = true;
|
|
154
|
+
if (Object.keys(app).length === 0) delete config.app;
|
|
155
|
+
}
|
|
156
|
+
if (config.sidebar !== void 0 && pluginEntry.sidebar === void 0) {
|
|
157
|
+
pluginEntry.sidebar = config.sidebar;
|
|
158
|
+
changed = true;
|
|
159
|
+
}
|
|
160
|
+
if (config.routes !== void 0 && pluginEntry.routes === void 0) {
|
|
161
|
+
pluginEntry.routes = config.routes;
|
|
162
|
+
changed = true;
|
|
163
|
+
}
|
|
164
|
+
if (config.sidebar !== void 0) {
|
|
165
|
+
delete config.sidebar;
|
|
166
|
+
changed = true;
|
|
167
|
+
}
|
|
168
|
+
if (config.routes !== void 0) {
|
|
169
|
+
delete config.routes;
|
|
170
|
+
changed = true;
|
|
171
|
+
}
|
|
172
|
+
changed = rewriteExtendsTarget(pluginEntry, `plugins.${pluginKey}`) || changed;
|
|
173
|
+
return changed;
|
|
174
|
+
}
|
|
175
|
+
async function migrateBosConfigFiles(projectDir) {
|
|
176
|
+
const migrated = [];
|
|
177
|
+
const rootConfigPath = (0, node_path.join)(projectDir, "bos.config.json");
|
|
178
|
+
if ((0, node_fs.existsSync)(rootConfigPath)) {
|
|
179
|
+
const rootConfig = JSON.parse((0, node_fs.readFileSync)(rootConfigPath, "utf-8"));
|
|
180
|
+
if (migrateRootConfigTargets(rootConfig)) {
|
|
181
|
+
await require_save_config.saveBosConfig(projectDir, rootConfig);
|
|
182
|
+
migrated.push("bos.config.json");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const pluginConfigPaths = await (0, glob.glob)("plugins/*/bos.config.json", {
|
|
186
|
+
cwd: projectDir,
|
|
187
|
+
nodir: true,
|
|
188
|
+
dot: false,
|
|
189
|
+
absolute: false
|
|
190
|
+
});
|
|
191
|
+
for (const relativePath of pluginConfigPaths) {
|
|
192
|
+
const pluginKey = relativePath.match(/^plugins\/([^/]+)\/bos\.config\.json$/)?.[1];
|
|
193
|
+
if (!pluginKey) continue;
|
|
194
|
+
const filePath = (0, node_path.join)(projectDir, relativePath);
|
|
195
|
+
const pluginConfig = JSON.parse((0, node_fs.readFileSync)(filePath, "utf-8"));
|
|
196
|
+
if (!migratePluginProviderConfig(pluginConfig, pluginKey)) continue;
|
|
197
|
+
(0, node_fs.writeFileSync)(filePath, `${JSON.stringify(pluginConfig, null, 2)}\n`);
|
|
198
|
+
migrated.push(relativePath);
|
|
199
|
+
}
|
|
200
|
+
return migrated;
|
|
201
|
+
}
|
|
64
202
|
async function loadParentPluginOptions(projectDir) {
|
|
65
203
|
const configPath = (0, node_path.join)(projectDir, "bos.config.json");
|
|
66
204
|
if (!(0, node_fs.existsSync)(configPath)) return null;
|
|
@@ -99,7 +237,15 @@ async function addSelectedParentPlugins(projectDir) {
|
|
|
99
237
|
const selected = selectedValue;
|
|
100
238
|
if (selected.length === 0) return [];
|
|
101
239
|
const nextPlugins = { ...pluginOptions.localConfig.plugins && typeof pluginOptions.localConfig.plugins === "object" ? pluginOptions.localConfig.plugins : {} };
|
|
102
|
-
for (const key of selected)
|
|
240
|
+
for (const key of selected) {
|
|
241
|
+
const parentPlugin = pluginOptions.parentPlugins[key];
|
|
242
|
+
if (parentPlugin && typeof parentPlugin === "object") {
|
|
243
|
+
const nextPlugin = structuredClone(parentPlugin);
|
|
244
|
+
rewriteExtendsTarget(nextPlugin, `plugins.${key}`);
|
|
245
|
+
nextPlugins[key] = nextPlugin;
|
|
246
|
+
} else if (typeof parentPlugin === "string") nextPlugins[key] = ensureTargetedRef(parentPlugin, `plugins.${key}`);
|
|
247
|
+
else nextPlugins[key] = parentPlugin;
|
|
248
|
+
}
|
|
103
249
|
pluginOptions.localConfig.plugins = nextPlugins;
|
|
104
250
|
await require_save_config.saveBosConfig(projectDir, pluginOptions.localConfig);
|
|
105
251
|
return selected;
|
|
@@ -318,6 +464,7 @@ async function upgradeTemplate(projectDir, options) {
|
|
|
318
464
|
for (const update of catalogVersionUpdates) updateWorkspacePackageRefInFile(pkgPath, update.name);
|
|
319
465
|
}
|
|
320
466
|
});
|
|
467
|
+
const migratedBosConfigs = await require_timing.timePhase(timings, "migrate bos configs", () => migrateBosConfigFiles(projectDir));
|
|
321
468
|
let syncResult;
|
|
322
469
|
let addedPlugins = [];
|
|
323
470
|
if (!options.noSync) {
|
|
@@ -336,7 +483,7 @@ async function upgradeTemplate(projectDir, options) {
|
|
|
336
483
|
await require_timing.timePhase(timings, "generate types", () => require_cli_init.runTypesGen(projectDir));
|
|
337
484
|
}
|
|
338
485
|
const migratedFiles = await require_timing.timePhase(timings, "clean obsolete files", async () => {
|
|
339
|
-
const nextMigratedFiles = await rewriteLegacyUiImports(projectDir);
|
|
486
|
+
const nextMigratedFiles = [...migratedBosConfigs, ...await rewriteLegacyUiImports(projectDir)];
|
|
340
487
|
for (const file of OBSOLETE_FILES) {
|
|
341
488
|
const filePath = (0, node_path.join)(projectDir, file);
|
|
342
489
|
if ((0, node_fs.existsSync)(filePath)) {
|
package/dist/cli/upgrade.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.cjs","names":["resolveExtendsRef","fetchParentConfig","process","p","saveBosConfig","readInstalledFrameworkVersion","timePhase","syncTemplate","runBunInstall","runTypesGen"],"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, runBunInstall, 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 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];\n\ninterface NpmPackageInfo {\n version: string;\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\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 nextPlugins[key] = pluginOptions.parentPlugins[key];\n }\n\n pluginOptions.localConfig.plugins = nextPlugins;\n await saveBosConfig(projectDir, pluginOptions.localConfig);\n\n return selected;\n}\n\nasync function fetchLatestNpmVersion(packageName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) return null;\n const data = (await response.json()) as NpmPackageInfo;\n return data.version;\n } catch {\n return null;\n }\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 { 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 = await fetchLatestNpmVersion(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 latest = await fetchLatestNpmVersion(name);\n if (!latest) continue;\n if (installed === latest) continue;\n nextCatalogVersionUpdates.push({ name, from: installed, to: latest });\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 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\", () => runBunInstall(projectDir));\n await timePhase(timings, \"generate types\", () => runTypesGen(projectDir));\n }\n\n const migratedFiles = await timePhase(timings, \"clean obsolete files\", async () => {\n const nextMigratedFiles = await rewriteLegacyUiImports(projectDir);\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.cjs","names":["resolveExtendsRef","saveBosConfig","fetchParentConfig","process","p","readInstalledFrameworkVersion","timePhase","syncTemplate","runBunInstall","runTypesGen"],"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, runBunInstall, 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 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];\n\ninterface NpmPackageInfo {\n version: string;\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 config.plugins = {};\n changed = true;\n }\n\n const plugins = config.plugins as Record<string, unknown>;\n if (!plugins[pluginKey] || typeof plugins[pluginKey] !== \"object\") {\n plugins[pluginKey] = { name: pluginKey };\n changed = true;\n }\n\n const pluginEntry = plugins[pluginKey] as Record<string, unknown>;\n if (typeof pluginEntry.name !== \"string\" || pluginEntry.name.length === 0) {\n pluginEntry.name = pluginKey;\n changed = true;\n }\n\n const app =\n config.app && typeof config.app === \"object\"\n ? (config.app as Record<string, unknown>)\n : undefined;\n const apiEntry =\n app?.api && typeof app.api === \"object\" ? (app.api as Record<string, unknown>) : undefined;\n\n if (apiEntry) {\n for (const key of [\n \"extends\",\n \"name\",\n \"development\",\n \"production\",\n \"integrity\",\n \"proxy\",\n \"variables\",\n \"secrets\",\n \"sidebar\",\n \"routes\",\n ] as const) {\n if (pluginEntry[key] === undefined && apiEntry[key] !== undefined) {\n pluginEntry[key] = apiEntry[key];\n changed = true;\n }\n }\n\n delete app!.api;\n changed = true;\n if (Object.keys(app!).length === 0) {\n delete config.app;\n }\n }\n\n if (config.sidebar !== undefined && pluginEntry.sidebar === undefined) {\n pluginEntry.sidebar = config.sidebar;\n changed = true;\n }\n if (config.routes !== undefined && pluginEntry.routes === undefined) {\n pluginEntry.routes = config.routes;\n changed = true;\n }\n if (config.sidebar !== undefined) {\n delete config.sidebar;\n changed = true;\n }\n if (config.routes !== undefined) {\n delete config.routes;\n changed = true;\n }\n\n changed = rewriteExtendsTarget(pluginEntry, `plugins.${pluginKey}`) || changed;\n\n return changed;\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 if (migrateRootConfigTargets(rootConfig)) {\n await saveBosConfig(projectDir, rootConfig);\n migrated.push(\"bos.config.json\");\n }\n }\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 const pluginConfig = JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, unknown>;\n if (!migratePluginProviderConfig(pluginConfig, pluginKey)) continue;\n\n writeFileSync(filePath, `${JSON.stringify(pluginConfig, null, 2)}\\n`);\n migrated.push(relativePath);\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\nasync function fetchLatestNpmVersion(packageName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) return null;\n const data = (await response.json()) as NpmPackageInfo;\n return data.version;\n } catch {\n return null;\n }\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 { 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 = await fetchLatestNpmVersion(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 latest = await fetchLatestNpmVersion(name);\n if (!latest) continue;\n if (installed === latest) continue;\n nextCatalogVersionUpdates.push({ name, from: installed, to: latest });\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\", () => runBunInstall(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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"}
|
package/dist/cli/upgrade.mjs
CHANGED
|
@@ -58,6 +58,144 @@ function parseBosRef(ref) {
|
|
|
58
58
|
gateway: match[2]
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
|
+
function parseTargetedRef(ref) {
|
|
62
|
+
const hashIndex = ref.indexOf("#");
|
|
63
|
+
if (hashIndex === -1) return { configRef: ref };
|
|
64
|
+
return {
|
|
65
|
+
configRef: ref.slice(0, hashIndex),
|
|
66
|
+
targetPath: ref.slice(hashIndex + 1) || void 0
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function ensureTargetedRef(ref, targetPath) {
|
|
70
|
+
const parsed = parseTargetedRef(ref);
|
|
71
|
+
if (parsed.targetPath) return ref;
|
|
72
|
+
return `${parsed.configRef}#${targetPath}`;
|
|
73
|
+
}
|
|
74
|
+
function rewriteExtendsTarget(entry, targetPath) {
|
|
75
|
+
if (!entry?.extends) return false;
|
|
76
|
+
if (typeof entry.extends === "string") {
|
|
77
|
+
const next = ensureTargetedRef(entry.extends, targetPath);
|
|
78
|
+
if (next === entry.extends) return false;
|
|
79
|
+
entry.extends = next;
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (typeof entry.extends === "object") {
|
|
83
|
+
let changed = false;
|
|
84
|
+
for (const [key, value] of Object.entries(entry.extends)) {
|
|
85
|
+
if (typeof value !== "string") continue;
|
|
86
|
+
const next = ensureTargetedRef(value, targetPath);
|
|
87
|
+
if (next !== value) {
|
|
88
|
+
entry.extends[key] = next;
|
|
89
|
+
changed = true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return changed;
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
function migrateRootConfigTargets(config) {
|
|
97
|
+
let changed = false;
|
|
98
|
+
const app = config.app && typeof config.app === "object" ? config.app : void 0;
|
|
99
|
+
if (app?.api && typeof app.api === "object") changed = rewriteExtendsTarget(app.api, "app.api") || changed;
|
|
100
|
+
if (app?.auth && typeof app.auth === "object") changed = rewriteExtendsTarget(app.auth, "app.auth") || changed;
|
|
101
|
+
if (config.plugins && typeof config.plugins === "object") for (const [pluginKey, pluginValue] of Object.entries(config.plugins)) {
|
|
102
|
+
if (typeof pluginValue === "string") {
|
|
103
|
+
const next = ensureTargetedRef(pluginValue, `plugins.${pluginKey}`);
|
|
104
|
+
if (next !== pluginValue) {
|
|
105
|
+
config.plugins[pluginKey] = next;
|
|
106
|
+
changed = true;
|
|
107
|
+
}
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (!pluginValue || typeof pluginValue !== "object") continue;
|
|
111
|
+
changed = rewriteExtendsTarget(pluginValue, `plugins.${pluginKey}`) || changed;
|
|
112
|
+
}
|
|
113
|
+
return changed;
|
|
114
|
+
}
|
|
115
|
+
function migratePluginProviderConfig(config, pluginKey) {
|
|
116
|
+
let changed = false;
|
|
117
|
+
if (!config.plugins || typeof config.plugins !== "object") {
|
|
118
|
+
config.plugins = {};
|
|
119
|
+
changed = true;
|
|
120
|
+
}
|
|
121
|
+
const plugins = config.plugins;
|
|
122
|
+
if (!plugins[pluginKey] || typeof plugins[pluginKey] !== "object") {
|
|
123
|
+
plugins[pluginKey] = { name: pluginKey };
|
|
124
|
+
changed = true;
|
|
125
|
+
}
|
|
126
|
+
const pluginEntry = plugins[pluginKey];
|
|
127
|
+
if (typeof pluginEntry.name !== "string" || pluginEntry.name.length === 0) {
|
|
128
|
+
pluginEntry.name = pluginKey;
|
|
129
|
+
changed = true;
|
|
130
|
+
}
|
|
131
|
+
const app = config.app && typeof config.app === "object" ? config.app : void 0;
|
|
132
|
+
const apiEntry = app?.api && typeof app.api === "object" ? app.api : void 0;
|
|
133
|
+
if (apiEntry) {
|
|
134
|
+
for (const key of [
|
|
135
|
+
"extends",
|
|
136
|
+
"name",
|
|
137
|
+
"development",
|
|
138
|
+
"production",
|
|
139
|
+
"integrity",
|
|
140
|
+
"proxy",
|
|
141
|
+
"variables",
|
|
142
|
+
"secrets",
|
|
143
|
+
"sidebar",
|
|
144
|
+
"routes"
|
|
145
|
+
]) if (pluginEntry[key] === void 0 && apiEntry[key] !== void 0) {
|
|
146
|
+
pluginEntry[key] = apiEntry[key];
|
|
147
|
+
changed = true;
|
|
148
|
+
}
|
|
149
|
+
delete app.api;
|
|
150
|
+
changed = true;
|
|
151
|
+
if (Object.keys(app).length === 0) delete config.app;
|
|
152
|
+
}
|
|
153
|
+
if (config.sidebar !== void 0 && pluginEntry.sidebar === void 0) {
|
|
154
|
+
pluginEntry.sidebar = config.sidebar;
|
|
155
|
+
changed = true;
|
|
156
|
+
}
|
|
157
|
+
if (config.routes !== void 0 && pluginEntry.routes === void 0) {
|
|
158
|
+
pluginEntry.routes = config.routes;
|
|
159
|
+
changed = true;
|
|
160
|
+
}
|
|
161
|
+
if (config.sidebar !== void 0) {
|
|
162
|
+
delete config.sidebar;
|
|
163
|
+
changed = true;
|
|
164
|
+
}
|
|
165
|
+
if (config.routes !== void 0) {
|
|
166
|
+
delete config.routes;
|
|
167
|
+
changed = true;
|
|
168
|
+
}
|
|
169
|
+
changed = rewriteExtendsTarget(pluginEntry, `plugins.${pluginKey}`) || changed;
|
|
170
|
+
return changed;
|
|
171
|
+
}
|
|
172
|
+
async function migrateBosConfigFiles(projectDir) {
|
|
173
|
+
const migrated = [];
|
|
174
|
+
const rootConfigPath = join(projectDir, "bos.config.json");
|
|
175
|
+
if (existsSync(rootConfigPath)) {
|
|
176
|
+
const rootConfig = JSON.parse(readFileSync(rootConfigPath, "utf-8"));
|
|
177
|
+
if (migrateRootConfigTargets(rootConfig)) {
|
|
178
|
+
await saveBosConfig(projectDir, rootConfig);
|
|
179
|
+
migrated.push("bos.config.json");
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const pluginConfigPaths = await glob("plugins/*/bos.config.json", {
|
|
183
|
+
cwd: projectDir,
|
|
184
|
+
nodir: true,
|
|
185
|
+
dot: false,
|
|
186
|
+
absolute: false
|
|
187
|
+
});
|
|
188
|
+
for (const relativePath of pluginConfigPaths) {
|
|
189
|
+
const pluginKey = relativePath.match(/^plugins\/([^/]+)\/bos\.config\.json$/)?.[1];
|
|
190
|
+
if (!pluginKey) continue;
|
|
191
|
+
const filePath = join(projectDir, relativePath);
|
|
192
|
+
const pluginConfig = JSON.parse(readFileSync(filePath, "utf-8"));
|
|
193
|
+
if (!migratePluginProviderConfig(pluginConfig, pluginKey)) continue;
|
|
194
|
+
writeFileSync(filePath, `${JSON.stringify(pluginConfig, null, 2)}\n`);
|
|
195
|
+
migrated.push(relativePath);
|
|
196
|
+
}
|
|
197
|
+
return migrated;
|
|
198
|
+
}
|
|
61
199
|
async function loadParentPluginOptions(projectDir) {
|
|
62
200
|
const configPath = join(projectDir, "bos.config.json");
|
|
63
201
|
if (!existsSync(configPath)) return null;
|
|
@@ -96,7 +234,15 @@ async function addSelectedParentPlugins(projectDir) {
|
|
|
96
234
|
const selected = selectedValue;
|
|
97
235
|
if (selected.length === 0) return [];
|
|
98
236
|
const nextPlugins = { ...pluginOptions.localConfig.plugins && typeof pluginOptions.localConfig.plugins === "object" ? pluginOptions.localConfig.plugins : {} };
|
|
99
|
-
for (const key of selected)
|
|
237
|
+
for (const key of selected) {
|
|
238
|
+
const parentPlugin = pluginOptions.parentPlugins[key];
|
|
239
|
+
if (parentPlugin && typeof parentPlugin === "object") {
|
|
240
|
+
const nextPlugin = structuredClone(parentPlugin);
|
|
241
|
+
rewriteExtendsTarget(nextPlugin, `plugins.${key}`);
|
|
242
|
+
nextPlugins[key] = nextPlugin;
|
|
243
|
+
} else if (typeof parentPlugin === "string") nextPlugins[key] = ensureTargetedRef(parentPlugin, `plugins.${key}`);
|
|
244
|
+
else nextPlugins[key] = parentPlugin;
|
|
245
|
+
}
|
|
100
246
|
pluginOptions.localConfig.plugins = nextPlugins;
|
|
101
247
|
await saveBosConfig(projectDir, pluginOptions.localConfig);
|
|
102
248
|
return selected;
|
|
@@ -315,6 +461,7 @@ async function upgradeTemplate(projectDir, options) {
|
|
|
315
461
|
for (const update of catalogVersionUpdates) updateWorkspacePackageRefInFile(pkgPath, update.name);
|
|
316
462
|
}
|
|
317
463
|
});
|
|
464
|
+
const migratedBosConfigs = await timePhase(timings, "migrate bos configs", () => migrateBosConfigFiles(projectDir));
|
|
318
465
|
let syncResult;
|
|
319
466
|
let addedPlugins = [];
|
|
320
467
|
if (!options.noSync) {
|
|
@@ -333,7 +480,7 @@ async function upgradeTemplate(projectDir, options) {
|
|
|
333
480
|
await timePhase(timings, "generate types", () => runTypesGen(projectDir));
|
|
334
481
|
}
|
|
335
482
|
const migratedFiles = await timePhase(timings, "clean obsolete files", async () => {
|
|
336
|
-
const nextMigratedFiles = await rewriteLegacyUiImports(projectDir);
|
|
483
|
+
const nextMigratedFiles = [...migratedBosConfigs, ...await rewriteLegacyUiImports(projectDir)];
|
|
337
484
|
for (const file of OBSOLETE_FILES) {
|
|
338
485
|
const filePath = join(projectDir, file);
|
|
339
486
|
if (existsSync(filePath)) {
|