create-flow-os 0.0.47-dev.1772043993 → 0.0.47-dev.1772045775
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 +3 -4
- package/src/init/lib.ts +22 -2
- package/src/init/scaffold.ts +104 -6
package/package.json
CHANGED
package/src/init/index.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
// Clear subito per nascondere resolving/installing di Bun
|
|
3
|
-
process.stdout.write("\x1b[2J\x1b[H");
|
|
4
2
|
|
|
5
3
|
import * as readline from "readline";
|
|
6
4
|
import { join, dirname } from "path";
|
|
7
5
|
import { fileURLToPath } from "url";
|
|
8
6
|
import { libsWithConfig, toShortName, toPkgName } from "./lib";
|
|
9
|
-
import { initLib, fetchFlowPackageVersions, shouldUseWorkspace } from "./scaffold";
|
|
7
|
+
import { initLib, fetchFlowPackageVersions, shouldUseWorkspace, findFlowOsRepoRoot } from "./scaffold";
|
|
10
8
|
import { bannerBox, withLoading, colors } from "./ui";
|
|
11
9
|
|
|
12
10
|
const { V, V_LIGHT, Y, E, R, B } = colors;
|
|
@@ -16,7 +14,8 @@ const { V, V_LIGHT, Y, E, R, B } = colors;
|
|
|
16
14
|
// ───────────────────────────────────────────────────────────────────────────────
|
|
17
15
|
const cwd = process.cwd();
|
|
18
16
|
const cliRoot = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
19
|
-
const
|
|
17
|
+
const flowOsRepoRoot = findFlowOsRepoRoot(cwd);
|
|
18
|
+
const available = libsWithConfig(cliRoot, flowOsRepoRoot).map(toShortName);
|
|
20
19
|
|
|
21
20
|
let libs = [...new Set(process.argv.slice(3))];
|
|
22
21
|
|
package/src/init/lib.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "fs";
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
2
2
|
import { join, dirname } from "path";
|
|
3
3
|
import { fileURLToPath } from "url";
|
|
4
4
|
|
|
@@ -21,7 +21,27 @@ export function flowDeps(root: string): string[] {
|
|
|
21
21
|
return Object.keys(deps).filter((k) => k.startsWith(FLOW_PREFIX));
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
/** Scansiona packages/ per tutti gli @flow-os/* (con o senza config) */
|
|
25
|
+
function scanPackagesDir(packagesDir: string): string[] {
|
|
26
|
+
const found: string[] = [];
|
|
27
|
+
try {
|
|
28
|
+
for (const name of readdirSync(packagesDir, { withFileTypes: true })) {
|
|
29
|
+
if (!name.isDirectory()) continue;
|
|
30
|
+
const pkgPath = join(packagesDir, name.name, "package.json");
|
|
31
|
+
if (!existsSync(pkgPath)) continue;
|
|
32
|
+
try {
|
|
33
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8")) as { name?: string };
|
|
34
|
+
if (pkg?.name?.startsWith(FLOW_PREFIX)) found.push(pkg.name);
|
|
35
|
+
} catch {}
|
|
36
|
+
}
|
|
37
|
+
} catch {}
|
|
38
|
+
return found;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function libsWithConfig(cliRoot: string, flowOsRepoRoot?: string | null): string[] {
|
|
42
|
+
const packagesDir = flowOsRepoRoot ? join(flowOsRepoRoot, "packages") : join(cliRoot, "..");
|
|
43
|
+
const fromScan = scanPackagesDir(packagesDir);
|
|
44
|
+
if (fromScan.length > 0) return fromScan;
|
|
25
45
|
const pkg = JSON.parse(readFileSync(join(cliRoot, "package.json"), "utf-8"));
|
|
26
46
|
const deps = Object.keys(pkg.dependencies ?? {}).filter((k) => k.startsWith(FLOW_PREFIX));
|
|
27
47
|
return deps.filter((name) => existsSync(join(pkgRoot(name), "config")));
|
package/src/init/scaffold.ts
CHANGED
|
@@ -192,7 +192,7 @@ async function fetchConfigFromNpm(
|
|
|
192
192
|
/** Sostituisce workspace:* e 0.0.1 con versione concreta (workspace va bene solo dentro flow-os) */
|
|
193
193
|
function resolveFlowDeps(
|
|
194
194
|
deps: Record<string, string> | undefined,
|
|
195
|
-
|
|
195
|
+
pkgRootDir: string,
|
|
196
196
|
versionsFromNpm: Map<string, string>,
|
|
197
197
|
useWorkspace: boolean
|
|
198
198
|
): Record<string, string> {
|
|
@@ -204,7 +204,7 @@ function resolveFlowDeps(
|
|
|
204
204
|
}
|
|
205
205
|
return resolved;
|
|
206
206
|
}
|
|
207
|
-
const ownerPkgPath = join(
|
|
207
|
+
const ownerPkgPath = join(pkgRootDir, "package.json");
|
|
208
208
|
let ownerVersion: string | undefined;
|
|
209
209
|
if (existsSync(ownerPkgPath)) {
|
|
210
210
|
try {
|
|
@@ -245,14 +245,77 @@ function mergePkg(configDir: string, cwd: string, versionsFromNpm: Map<string, s
|
|
|
245
245
|
: { ...config, name: basename(cwd) || "flow-app" };
|
|
246
246
|
target.dependencies = { ...target.dependencies, ...config.dependencies };
|
|
247
247
|
target.devDependencies = { ...target.devDependencies, ...config.devDependencies };
|
|
248
|
-
|
|
248
|
+
const pkgRootDir = join(configDir, "..");
|
|
249
|
+
for (const [k, v] of Object.entries(resolveFlowDeps(config.dependencies, pkgRootDir, versionsFromNpm, useWorkspace)))
|
|
249
250
|
target.dependencies[k] = v;
|
|
250
|
-
for (const [k, v] of Object.entries(resolveFlowDeps(config.devDependencies,
|
|
251
|
+
for (const [k, v] of Object.entries(resolveFlowDeps(config.devDependencies, pkgRootDir, versionsFromNpm, useWorkspace)))
|
|
251
252
|
target.devDependencies[k] = v;
|
|
252
253
|
target.scripts = { ...target.scripts, ...config.scripts };
|
|
253
254
|
writeFileSync(targetPath, JSON.stringify(target, null, 2));
|
|
254
255
|
}
|
|
255
256
|
|
|
257
|
+
type FlowOsInit = { dependencies?: Record<string, string>; devDependencies?: Record<string, string>; scripts?: Record<string, string>; name?: string; version?: string; type?: string };
|
|
258
|
+
|
|
259
|
+
/** Merge da flow-os-init: root package.json (se in repo) oppure package (npm) */
|
|
260
|
+
function mergeFlowOsInit(
|
|
261
|
+
packageRoot: string,
|
|
262
|
+
pkgName: string,
|
|
263
|
+
cwd: string,
|
|
264
|
+
versionsFromNpm: Map<string, string>,
|
|
265
|
+
useWorkspace: boolean,
|
|
266
|
+
flowOsRepoRoot: string | null
|
|
267
|
+
): void {
|
|
268
|
+
let init: FlowOsInit | undefined;
|
|
269
|
+
if (flowOsRepoRoot) {
|
|
270
|
+
const rootPkgPath = join(flowOsRepoRoot, "package.json");
|
|
271
|
+
if (existsSync(rootPkgPath)) {
|
|
272
|
+
try {
|
|
273
|
+
const rootPkg = JSON.parse(readFileSync(rootPkgPath, "utf-8")) as { "flow-os-init"?: Record<string, FlowOsInit> };
|
|
274
|
+
init = rootPkg["flow-os-init"]?.[pkgName];
|
|
275
|
+
} catch {}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (!init) {
|
|
279
|
+
const pkgPath = join(packageRoot, "package.json");
|
|
280
|
+
if (!existsSync(pkgPath)) return;
|
|
281
|
+
try {
|
|
282
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8")) as { "flow-os-init"?: FlowOsInit };
|
|
283
|
+
init = pkg["flow-os-init"];
|
|
284
|
+
} catch {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (!init) return;
|
|
289
|
+
const targetPath = join(cwd, "package.json");
|
|
290
|
+
const target = existsSync(targetPath)
|
|
291
|
+
? JSON.parse(readFileSync(targetPath, "utf-8"))
|
|
292
|
+
: { name: init.name ?? (basename(cwd) || "flow-app"), version: init.version ?? "0.0.1", type: init.type ?? "module" };
|
|
293
|
+
target.dependencies = { ...target.dependencies, ...init.dependencies };
|
|
294
|
+
target.devDependencies = { ...target.devDependencies, ...init.devDependencies };
|
|
295
|
+
for (const [k, v] of Object.entries(resolveFlowDeps(init.dependencies, packageRoot, versionsFromNpm, useWorkspace)))
|
|
296
|
+
target.dependencies[k] = v;
|
|
297
|
+
for (const [k, v] of Object.entries(resolveFlowDeps(init.devDependencies, packageRoot, versionsFromNpm, useWorkspace)))
|
|
298
|
+
target.devDependencies[k] = v;
|
|
299
|
+
target.scripts = { ...target.scripts, ...init.scripts };
|
|
300
|
+
writeFileSync(targetPath, JSON.stringify(target, null, 2));
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/** Aggiunge dipendenza per pacchetti senza config (solo install) */
|
|
304
|
+
function addDependencyForPackage(
|
|
305
|
+
pkgName: string,
|
|
306
|
+
cwd: string,
|
|
307
|
+
versionsFromNpm: Map<string, string>,
|
|
308
|
+
useWorkspace: boolean
|
|
309
|
+
): void {
|
|
310
|
+
const targetPath = join(cwd, "package.json");
|
|
311
|
+
if (!existsSync(targetPath)) return;
|
|
312
|
+
const target = JSON.parse(readFileSync(targetPath, "utf-8"));
|
|
313
|
+
target.dependencies = target.dependencies ?? {};
|
|
314
|
+
const spec = useWorkspace ? "workspace:*" : (versionsFromNpm.get(pkgName) ? `^${versionsFromNpm.get(pkgName)}` : undefined);
|
|
315
|
+
if (spec) target.dependencies[pkgName] = spec;
|
|
316
|
+
writeFileSync(targetPath, JSON.stringify(target, null, 2));
|
|
317
|
+
}
|
|
318
|
+
|
|
256
319
|
/** Assicura che versions abbia le versioni per pkgNames (fetch lazy) */
|
|
257
320
|
async function ensureVersions(versions: Map<string, string>, pkgNames: string[]): Promise<void> {
|
|
258
321
|
const missing = pkgNames.filter((n) => !versions.has(n));
|
|
@@ -382,7 +445,42 @@ export async function initLib(
|
|
|
382
445
|
await collectAllTemplates(libs, combined, done, order, versions, tmpDirs, flowOsRepoRoot);
|
|
383
446
|
|
|
384
447
|
for (const configDir of order) {
|
|
385
|
-
|
|
448
|
+
const packageRoot = join(configDir, "..");
|
|
449
|
+
const pkgName = (() => {
|
|
450
|
+
try {
|
|
451
|
+
const p = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf-8")) as { name?: string };
|
|
452
|
+
return p?.name ?? "";
|
|
453
|
+
} catch {
|
|
454
|
+
return "";
|
|
455
|
+
}
|
|
456
|
+
})();
|
|
457
|
+
if (existsSync(join(configDir, "package.json"))) {
|
|
458
|
+
mergePkg(configDir, cwd, versions, useWorkspace);
|
|
459
|
+
} else {
|
|
460
|
+
mergeFlowOsInit(packageRoot, pkgName, cwd, versions, useWorkspace, flowOsRepoRoot);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
const targetPath = join(cwd, "package.json");
|
|
465
|
+
if (!existsSync(targetPath)) {
|
|
466
|
+
writeFileSync(
|
|
467
|
+
targetPath,
|
|
468
|
+
JSON.stringify({ name: basename(cwd) || "flow-app", version: "0.0.1", private: true, type: "module" }, null, 2)
|
|
469
|
+
);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const toAdd = new Set<string>(pkgNames);
|
|
473
|
+
for (const configDir of order) {
|
|
474
|
+
const packageRoot = join(configDir, "..");
|
|
475
|
+
for (const peer of flowDepsFromPkg(packageRoot)) toAdd.add(peer);
|
|
476
|
+
}
|
|
477
|
+
for (const pkgName of pkgNames) {
|
|
478
|
+
const packageRoot = flowOsRepoRoot ? join(flowOsRepoRoot, "packages", toShortName(pkgName)) : (() => { try { return pkgRoot(pkgName); } catch { return ""; } })();
|
|
479
|
+
if (packageRoot) for (const peer of flowDepsFromPkg(packageRoot)) toAdd.add(peer);
|
|
480
|
+
}
|
|
481
|
+
await ensureVersions(versions, [...toAdd]);
|
|
482
|
+
for (const pkgName of toAdd) {
|
|
483
|
+
addDependencyForPackage(pkgName, cwd, versions, useWorkspace);
|
|
386
484
|
}
|
|
387
485
|
|
|
388
486
|
onProgress?.("write");
|
|
@@ -390,7 +488,7 @@ export async function initLib(
|
|
|
390
488
|
|
|
391
489
|
onProgress?.("install");
|
|
392
490
|
const installCwd = useWorkspace && flowOsRepoRoot ? flowOsRepoRoot : cwd;
|
|
393
|
-
const proc = Bun.spawn(["bun", "install"], { cwd: installCwd, stdout: "
|
|
491
|
+
const proc = Bun.spawn(["bun", "install"], { cwd: installCwd, stdout: "pipe", stderr: "pipe" });
|
|
394
492
|
const exitCode = await proc.exited;
|
|
395
493
|
if (exitCode !== 0) {
|
|
396
494
|
throw new Error(`bun install exited with code ${exitCode}`);
|