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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-flow-os",
3
- "version": "0.0.47-dev.1772043993",
3
+ "version": "0.0.47-dev.1772045775",
4
4
  "license": "PolyForm-Shield-1.0.0",
5
5
  "type": "module",
6
6
  "dependencies": {
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 available = libsWithConfig(cliRoot).map(toShortName);
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
- export function libsWithConfig(cliRoot: string): string[] {
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")));
@@ -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
- configDir: string,
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(configDir, "..", "package.json");
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
- for (const [k, v] of Object.entries(resolveFlowDeps(config.dependencies, configDir, versionsFromNpm, useWorkspace)))
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, configDir, versionsFromNpm, useWorkspace)))
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
- mergePkg(configDir, cwd, versions, useWorkspace);
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: "inherit", stderr: "inherit" });
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}`);