create-flow-os 0.0.62 → 0.0.63-dev.1772065004
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 +3 -2
- package/src/init/scaffold.ts +49 -10
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-flow-os",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.63-dev.1772065004",
|
|
4
4
|
"license": "PolyForm-Shield-1.0.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@flow-os/client": "^0.0.
|
|
7
|
+
"@flow-os/client": "^0.0.63",
|
|
8
|
+
"tar": "^7.4.3"
|
|
8
9
|
},
|
|
9
10
|
"bin": {
|
|
10
11
|
"create-flow-os": "./src/index.ts"
|
package/src/init/scaffold.ts
CHANGED
|
@@ -43,7 +43,7 @@ function mergeTemplateInto(combined: Map<string, TemplateEntry>, pkgFiles: Map<s
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
/** Scrive combined
|
|
46
|
+
/** Scrive combined (config merge di tutte le lib) in cwd. Merge con folder utente: never overwrite (file con contenuto → mantieni). Se coincide con superseded → usa nuovo template. */
|
|
47
47
|
async function writeMergedWithUser(
|
|
48
48
|
combined: Map<string, TemplateEntry>,
|
|
49
49
|
cwd: string,
|
|
@@ -130,26 +130,63 @@ export async function fetchFlowClientVersion(): Promise<string | undefined> {
|
|
|
130
130
|
return fetchFlowPackageVersion("@flow-os/client");
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
/**
|
|
133
|
+
/** Bun.Archive richiede Bun >= 1.3.6. Fallback con pacchetto tar per versioni precedenti. */
|
|
134
|
+
const hasBunArchive = typeof (globalThis as { Bun?: { Archive?: unknown } }).Bun?.Archive === "function";
|
|
135
|
+
|
|
136
|
+
/** Scarica config da npm (sempre fresh, no cache). Se version fallisce, riprova con latest. */
|
|
134
137
|
async function fetchConfigFromNpm(
|
|
135
138
|
pkgName: string,
|
|
136
139
|
version: string,
|
|
137
|
-
tmpDirs: string[]
|
|
140
|
+
tmpDirs: string[],
|
|
141
|
+
fallbackLatest?: string
|
|
138
142
|
): Promise<{ files: Map<string, string>; configDir: string; tmpDir: string } | null> {
|
|
139
143
|
const shortName = pkgName.replace(/^@flow-os\//, "");
|
|
140
144
|
const { tmpdir } = await import("os");
|
|
141
|
-
const
|
|
142
|
-
|
|
145
|
+
const { writeFileSync } = await import("fs");
|
|
146
|
+
|
|
147
|
+
async function tryFetch(v: string): Promise<{ files: Map<string, string>; configDir: string; tmpDir: string } | null> {
|
|
148
|
+
const url = `${NPM_REGISTRY}/${pkgName}/-/${shortName}-${v}.tgz`;
|
|
143
149
|
const res = await fetch(url, { headers: { "Cache-Control": "no-cache", "Pragma": "no-cache" } });
|
|
144
150
|
if (!res.ok) return null;
|
|
145
|
-
const
|
|
146
|
-
const
|
|
147
|
-
|
|
151
|
+
const tmpDir = join(tmpdir(), `flow-os-${shortName}-${v}-${Date.now()}`);
|
|
152
|
+
const tgzPath = join(tmpDir, "pkg.tgz");
|
|
153
|
+
|
|
154
|
+
if (hasBunArchive) {
|
|
155
|
+
const Archive = (globalThis as { Bun?: { Archive: new (data: Blob) => { extract: (dir: string, opts?: { glob?: string[] }) => Promise<number> } } }).Bun!.Archive;
|
|
156
|
+
const archive = new Archive(await res.blob());
|
|
157
|
+
mkdirSync(tmpDir, { recursive: true });
|
|
158
|
+
await archive.extract(tmpDir, { glob: ["package/config/**", "package/package.json"] });
|
|
159
|
+
} else {
|
|
160
|
+
mkdirSync(tmpDir, { recursive: true });
|
|
161
|
+
const buf = Buffer.from(await res.arrayBuffer());
|
|
162
|
+
writeFileSync(tgzPath, buf);
|
|
163
|
+
const tar = await import("tar");
|
|
164
|
+
await tar.x({ file: tgzPath, cwd: tmpDir });
|
|
165
|
+
}
|
|
166
|
+
|
|
148
167
|
const extractedConfigDir = join(tmpDir, "package", "config");
|
|
149
168
|
if (!existsSync(extractedConfigDir)) return null;
|
|
150
169
|
const files = collectConfigFiles(extractedConfigDir);
|
|
151
170
|
tmpDirs.push(tmpDir);
|
|
152
171
|
return { files, configDir: extractedConfigDir, tmpDir };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
try {
|
|
175
|
+
let result = await tryFetch(version);
|
|
176
|
+
if (!result && fallbackLatest && fallbackLatest !== version) {
|
|
177
|
+
result = await tryFetch(fallbackLatest);
|
|
178
|
+
}
|
|
179
|
+
if (!result && isCreateFlowOsDev()) {
|
|
180
|
+
try {
|
|
181
|
+
const r = await fetch(`${NPM_REGISTRY}/${pkgName}`, { headers: { Accept: "application/json" } });
|
|
182
|
+
if (r.ok) {
|
|
183
|
+
const d = (await r.json()) as { "dist-tags"?: Record<string, string> };
|
|
184
|
+
const latest = d["dist-tags"]?.["latest"];
|
|
185
|
+
if (latest && latest !== version) result = await tryFetch(latest);
|
|
186
|
+
}
|
|
187
|
+
} catch {}
|
|
188
|
+
}
|
|
189
|
+
return result;
|
|
153
190
|
} catch {
|
|
154
191
|
return null;
|
|
155
192
|
}
|
|
@@ -329,7 +366,7 @@ function flowDepsFromPkg(pkgPath: string): string[] {
|
|
|
329
366
|
}
|
|
330
367
|
}
|
|
331
368
|
|
|
332
|
-
/** Fase 1:
|
|
369
|
+
/** Fase 1: per ogni lib prende config/ (da npm o repo locale), merge tutti i config insieme in combined */
|
|
333
370
|
async function collectAllTemplates(
|
|
334
371
|
libs: string[],
|
|
335
372
|
combined: Map<string, TemplateEntry>,
|
|
@@ -411,7 +448,9 @@ async function collectAllTemplates(
|
|
|
411
448
|
|
|
412
449
|
export type InitProgressStep = "fetch" | "templates" | "write" | "install";
|
|
413
450
|
|
|
414
|
-
/** Init: 1) fetch versioni npm, 2)
|
|
451
|
+
/** Init: 1) fetch versioni npm (dev/latest), 2) raccoglie config/ di ogni lib e li merge insieme,
|
|
452
|
+
* 3) mergePkg (package.json), 4) merge con folder utente (never overwrite), 5) bun install.
|
|
453
|
+
* Fuori repo: scarica config da npm. Dentro repo: usa workspace + config locali. */
|
|
415
454
|
export async function initLib(
|
|
416
455
|
libs: string[],
|
|
417
456
|
cwd: string,
|