create-flow-os 0.0.47-dev.1772043683 → 0.0.47-dev.1772043814
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/package.json +1 -1
- package/src/init/index.ts +2 -2
- package/src/init/scaffold.ts +64 -14
package/package.json
CHANGED
package/src/init/index.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as readline from "readline";
|
|
|
6
6
|
import { join, dirname } from "path";
|
|
7
7
|
import { fileURLToPath } from "url";
|
|
8
8
|
import { libsWithConfig, toShortName, toPkgName } from "./lib";
|
|
9
|
-
import { initLib, fetchFlowPackageVersions } from "./scaffold";
|
|
9
|
+
import { initLib, fetchFlowPackageVersions, shouldUseWorkspace } from "./scaffold";
|
|
10
10
|
import { bannerBox, withLoading, colors } from "./ui";
|
|
11
11
|
|
|
12
12
|
const { V, V_LIGHT, Y, E, R, B } = colors;
|
|
@@ -43,7 +43,7 @@ if (!toInit.length) {
|
|
|
43
43
|
// ───────────────────────────────────────────────────────────────────────────────
|
|
44
44
|
const pkgNames = toInit.map(toPkgName);
|
|
45
45
|
await withLoading(async (onStep) => {
|
|
46
|
-
const versions = await fetchFlowPackageVersions(pkgNames);
|
|
46
|
+
const versions = shouldUseWorkspace(cwd) ? new Map<string, string>() : await fetchFlowPackageVersions(pkgNames);
|
|
47
47
|
await initLib(toInit, cwd, versions, onStep);
|
|
48
48
|
});
|
|
49
49
|
|
package/src/init/scaffold.ts
CHANGED
|
@@ -79,6 +79,29 @@ function isCreateFlowOsDev(): boolean {
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
/** Trova la root del repo flow-os salendo da cwd (contiene packages/client) */
|
|
83
|
+
export function findFlowOsRepoRoot(cwd: string): string | null {
|
|
84
|
+
let d = cwd;
|
|
85
|
+
while (true) {
|
|
86
|
+
const pkgClient = join(d, "packages", "client", "package.json");
|
|
87
|
+
if (existsSync(pkgClient)) {
|
|
88
|
+
try {
|
|
89
|
+
const pkg = JSON.parse(readFileSync(pkgClient, "utf-8")) as { name?: string };
|
|
90
|
+
if (pkg?.name === "@flow-os/client") return d;
|
|
91
|
+
} catch {}
|
|
92
|
+
}
|
|
93
|
+
const parent = dirname(d);
|
|
94
|
+
if (parent === d) break;
|
|
95
|
+
d = parent;
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** True se usare workspace:* (cwd dentro repo flow-os) */
|
|
101
|
+
export function shouldUseWorkspace(cwd: string): boolean {
|
|
102
|
+
return !!findFlowOsRepoRoot(cwd);
|
|
103
|
+
}
|
|
104
|
+
|
|
82
105
|
/** Recupera versione di un pacchetto @flow-os/* dal registry npm (con cache 5 min) */
|
|
83
106
|
async function fetchFlowPackageVersion(pkgName: string): Promise<string | undefined> {
|
|
84
107
|
const tag = isCreateFlowOsDev() ? "dev" : "latest";
|
|
@@ -170,10 +193,17 @@ async function fetchConfigFromNpm(
|
|
|
170
193
|
function resolveFlowDeps(
|
|
171
194
|
deps: Record<string, string> | undefined,
|
|
172
195
|
configDir: string,
|
|
173
|
-
versionsFromNpm: Map<string, string
|
|
196
|
+
versionsFromNpm: Map<string, string>,
|
|
197
|
+
useWorkspace: boolean
|
|
174
198
|
): Record<string, string> {
|
|
175
199
|
if (!deps) return {};
|
|
176
200
|
const resolved = { ...deps };
|
|
201
|
+
if (useWorkspace) {
|
|
202
|
+
for (const k of Object.keys(resolved)) {
|
|
203
|
+
if (k.startsWith("@flow-os/")) resolved[k] = "workspace:*";
|
|
204
|
+
}
|
|
205
|
+
return resolved;
|
|
206
|
+
}
|
|
177
207
|
const ownerPkgPath = join(configDir, "..", "package.json");
|
|
178
208
|
let ownerVersion: string | undefined;
|
|
179
209
|
if (existsSync(ownerPkgPath)) {
|
|
@@ -205,7 +235,7 @@ function resolveFlowDeps(
|
|
|
205
235
|
return resolved;
|
|
206
236
|
}
|
|
207
237
|
|
|
208
|
-
function mergePkg(configDir: string, cwd: string, versionsFromNpm: Map<string, string
|
|
238
|
+
function mergePkg(configDir: string, cwd: string, versionsFromNpm: Map<string, string>, useWorkspace: boolean): void {
|
|
209
239
|
const configPkg = join(configDir, "package.json");
|
|
210
240
|
if (!existsSync(configPkg)) return;
|
|
211
241
|
const targetPath = join(cwd, "package.json");
|
|
@@ -215,9 +245,9 @@ function mergePkg(configDir: string, cwd: string, versionsFromNpm: Map<string, s
|
|
|
215
245
|
: { ...config, name: basename(cwd) || "flow-app" };
|
|
216
246
|
target.dependencies = { ...target.dependencies, ...config.dependencies };
|
|
217
247
|
target.devDependencies = { ...target.devDependencies, ...config.devDependencies };
|
|
218
|
-
for (const [k, v] of Object.entries(resolveFlowDeps(config.dependencies, configDir, versionsFromNpm)))
|
|
248
|
+
for (const [k, v] of Object.entries(resolveFlowDeps(config.dependencies, configDir, versionsFromNpm, useWorkspace)))
|
|
219
249
|
target.dependencies[k] = v;
|
|
220
|
-
for (const [k, v] of Object.entries(resolveFlowDeps(config.devDependencies, configDir, versionsFromNpm)))
|
|
250
|
+
for (const [k, v] of Object.entries(resolveFlowDeps(config.devDependencies, configDir, versionsFromNpm, useWorkspace)))
|
|
221
251
|
target.devDependencies[k] = v;
|
|
222
252
|
target.scripts = { ...target.scripts, ...config.scripts };
|
|
223
253
|
writeFileSync(targetPath, JSON.stringify(target, null, 2));
|
|
@@ -251,12 +281,17 @@ async function collectAllTemplates(
|
|
|
251
281
|
done: Set<string>,
|
|
252
282
|
order: string[],
|
|
253
283
|
versionsFromNpm: Map<string, string>,
|
|
254
|
-
tmpDirs: string[]
|
|
284
|
+
tmpDirs: string[],
|
|
285
|
+
flowOsRepoRoot: string | null
|
|
255
286
|
): Promise<void> {
|
|
256
287
|
for (const lib of libs) {
|
|
257
288
|
const pkgName = toPkgName(lib);
|
|
258
289
|
if (done.has(pkgName)) continue;
|
|
259
290
|
|
|
291
|
+
const shortName = toShortName(pkgName);
|
|
292
|
+
const localFromRepo = flowOsRepoRoot ? join(flowOsRepoRoot, "packages", shortName) : "";
|
|
293
|
+
const localConfigFromRepo = localFromRepo ? join(localFromRepo, "config") : "";
|
|
294
|
+
|
|
260
295
|
let root: string;
|
|
261
296
|
let configDir: string;
|
|
262
297
|
try {
|
|
@@ -266,12 +301,22 @@ async function collectAllTemplates(
|
|
|
266
301
|
root = "";
|
|
267
302
|
configDir = "";
|
|
268
303
|
}
|
|
304
|
+
const hasLocalFromRepo = !!localConfigFromRepo && existsSync(localConfigFromRepo);
|
|
269
305
|
const hasLocal = existsSync(configDir);
|
|
270
306
|
|
|
271
307
|
let pkgFiles: Map<string, string>;
|
|
272
308
|
let configDirForPkg: string;
|
|
309
|
+
const useLocalRepo = hasLocalFromRepo && flowOsRepoRoot;
|
|
273
310
|
const npmVer = versionsFromNpm.get(pkgName);
|
|
274
|
-
|
|
311
|
+
|
|
312
|
+
if (useLocalRepo) {
|
|
313
|
+
configDirForPkg = localConfigFromRepo;
|
|
314
|
+
pkgFiles = collectConfigFiles(configDirForPkg);
|
|
315
|
+
const subDeps = flowDepsFromPkg(join(configDirForPkg, ".."));
|
|
316
|
+
for (const sub of subDeps) {
|
|
317
|
+
await collectAllTemplates([toShortName(sub)], combined, done, order, versionsFromNpm, tmpDirs, flowOsRepoRoot);
|
|
318
|
+
}
|
|
319
|
+
} else if (npmVer) {
|
|
275
320
|
const fetched = await fetchConfigFromNpm(pkgName, npmVer, tmpDirs);
|
|
276
321
|
if (fetched) {
|
|
277
322
|
pkgFiles = fetched.files;
|
|
@@ -279,13 +324,13 @@ async function collectAllTemplates(
|
|
|
279
324
|
const subDeps = flowDepsFromPkg(join(configDirForPkg, ".."));
|
|
280
325
|
await ensureVersions(versionsFromNpm, subDeps);
|
|
281
326
|
for (const sub of subDeps) {
|
|
282
|
-
await collectAllTemplates([toShortName(sub)], combined, done, order, versionsFromNpm, tmpDirs);
|
|
327
|
+
await collectAllTemplates([toShortName(sub)], combined, done, order, versionsFromNpm, tmpDirs, flowOsRepoRoot);
|
|
283
328
|
}
|
|
284
329
|
} else if (hasLocal) {
|
|
285
330
|
const subDeps = flowDeps(root);
|
|
286
331
|
await ensureVersions(versionsFromNpm, subDeps);
|
|
287
332
|
for (const sub of subDeps) {
|
|
288
|
-
await collectAllTemplates([toShortName(sub)], combined, done, order, versionsFromNpm, tmpDirs);
|
|
333
|
+
await collectAllTemplates([toShortName(sub)], combined, done, order, versionsFromNpm, tmpDirs, flowOsRepoRoot);
|
|
289
334
|
}
|
|
290
335
|
pkgFiles = collectConfigFiles(configDir);
|
|
291
336
|
configDirForPkg = configDir;
|
|
@@ -296,7 +341,7 @@ async function collectAllTemplates(
|
|
|
296
341
|
const subDeps = flowDeps(root);
|
|
297
342
|
await ensureVersions(versionsFromNpm, subDeps);
|
|
298
343
|
for (const sub of subDeps) {
|
|
299
|
-
await collectAllTemplates([toShortName(sub)], combined, done, order, versionsFromNpm, tmpDirs);
|
|
344
|
+
await collectAllTemplates([toShortName(sub)], combined, done, order, versionsFromNpm, tmpDirs, flowOsRepoRoot);
|
|
300
345
|
}
|
|
301
346
|
pkgFiles = collectConfigFiles(configDir);
|
|
302
347
|
configDirForPkg = configDir;
|
|
@@ -319,28 +364,33 @@ export async function initLib(
|
|
|
319
364
|
onProgress?: (step: InitProgressStep) => void
|
|
320
365
|
): Promise<void> {
|
|
321
366
|
const pkgNames = libs.map(toPkgName);
|
|
367
|
+
const flowOsRepoRoot = findFlowOsRepoRoot(cwd);
|
|
368
|
+
const useWorkspace = !!flowOsRepoRoot;
|
|
322
369
|
const versions = versionsFromNpm ?? new Map<string, string>();
|
|
323
370
|
|
|
324
371
|
onProgress?.("fetch");
|
|
325
|
-
|
|
326
|
-
|
|
372
|
+
if (!useWorkspace) {
|
|
373
|
+
const fetched = await fetchFlowPackageVersions(pkgNames);
|
|
374
|
+
for (const [k, v] of fetched) versions.set(k, v);
|
|
375
|
+
}
|
|
327
376
|
|
|
328
377
|
onProgress?.("templates");
|
|
329
378
|
const combined = new Map<string, string>();
|
|
330
379
|
const done = new Set<string>();
|
|
331
380
|
const order: string[] = [];
|
|
332
381
|
const tmpDirs: string[] = [];
|
|
333
|
-
await collectAllTemplates(libs, combined, done, order, versions, tmpDirs);
|
|
382
|
+
await collectAllTemplates(libs, combined, done, order, versions, tmpDirs, flowOsRepoRoot);
|
|
334
383
|
|
|
335
384
|
for (const configDir of order) {
|
|
336
|
-
mergePkg(configDir, cwd, versions);
|
|
385
|
+
mergePkg(configDir, cwd, versions, useWorkspace);
|
|
337
386
|
}
|
|
338
387
|
|
|
339
388
|
onProgress?.("write");
|
|
340
389
|
await writeMergedWithUser(combined, cwd, (path, conflicts) => resolveConflicts(conflicts, path));
|
|
341
390
|
|
|
342
391
|
onProgress?.("install");
|
|
343
|
-
const
|
|
392
|
+
const installCwd = useWorkspace && flowOsRepoRoot ? flowOsRepoRoot : cwd;
|
|
393
|
+
const proc = Bun.spawn(["bun", "install"], { cwd: installCwd, stdout: "inherit", stderr: "inherit" });
|
|
344
394
|
const exitCode = await proc.exited;
|
|
345
395
|
if (exitCode !== 0) {
|
|
346
396
|
throw new Error(`bun install exited with code ${exitCode}`);
|