create-flow-os 0.0.63 → 0.0.64-dev.1772065021

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,10 +1,11 @@
1
1
  {
2
2
  "name": "create-flow-os",
3
- "version": "0.0.63",
3
+ "version": "0.0.64-dev.1772065021",
4
4
  "license": "PolyForm-Shield-1.0.0",
5
5
  "type": "module",
6
6
  "dependencies": {
7
- "@flow-os/client": "^0.0.63"
7
+ "@flow-os/client": "^0.0.64",
8
+ "tar": "^7.4.3"
8
9
  },
9
10
  "bin": {
10
11
  "create-flow-os": "./src/index.ts"
@@ -130,26 +130,63 @@ export async function fetchFlowClientVersion(): Promise<string | undefined> {
130
130
  return fetchFlowPackageVersion("@flow-os/client");
131
131
  }
132
132
 
133
- /** Scarica config da npm (sempre fresh, no cache) */
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 url = `${NPM_REGISTRY}/${pkgName}/-/${shortName}-${version}.tgz`;
142
- try {
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 archive = new Bun.Archive(await res.blob());
146
- const tmpDir = join(tmpdir(), `flow-os-${shortName}-${version}-${Date.now()}`);
147
- await archive.extract(tmpDir, { glob: ["package/config/**", "package/package.json"] });
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
  }