@telorun/cli 0.59.0 → 0.61.0

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.
@@ -1,97 +0,0 @@
1
- import { defaultTransportRegistry, cachePathForCanonical } from "@telorun/kernel";
2
- import { IntegrityError } from "@telorun/analyzer";
3
- import { existsSync } from "fs";
4
- import * as fs from "fs/promises";
5
- import * as path from "path";
6
- /** Marker written into a module's cache dir after a successful extraction.
7
- * Registry versions are immutable, so its presence means the bundle is
8
- * already on disk and the fetch can be skipped (the marker is written last,
9
- * so a partial extraction leaves no marker and re-runs). */
10
- const EXTRACTED_MARKER = ".telo-bundle";
11
- /** True when the module's owner Application/Library doc declares a non-empty
12
- * `files:` list — i.e. it ships a payload worth fetching. Reads the graph's
13
- * already-parsed manifest so a payload-less module triggers no network at all. */
14
- function declaresFiles(module) {
15
- const doc = module.owner.manifests.find((m) => m?.kind === "Telo.Application" || m?.kind === "Telo.Library");
16
- return Array.isArray(doc?.files) && doc.files.length > 0;
17
- }
18
- /** A module fetched from the registry / an HTTP URL — its assets live in a
19
- * bundle, not on the local disk. file:// (local dev) and memory:// are
20
- * skipped: their assets are already where Http.Static resolves them. */
21
- function isRemoteSource(source) {
22
- if (source.startsWith("file://") || source.startsWith("memory://"))
23
- return false;
24
- if (source.startsWith("http://") || source.startsWith("https://"))
25
- return true;
26
- // Registry ref form: namespace/name@version
27
- return source.includes("@") && source.includes("/");
28
- }
29
- /**
30
- * For every module in `graph` that ships a `files:` payload from a remote
31
- * transport, fetch its full artifact through the transport its ref selects and
32
- * extract the payload into the module's cache directory (next to the cached
33
- * `telo.yaml`), so a relative `Http.Static` root / bundled controller `path:`
34
- * resolves on disk exactly as it does in dev.
35
- *
36
- * The fetch keys off each module's **pinned** `requestedUrl` (the import ref
37
- * with its `#sha256-...`), so the transport verifies the manifest against the
38
- * inline hash and the payload against that manifest's `filesIntegrity` — the
39
- * Merkle chain stays anchored to the importer's pin.
40
- *
41
- * Runs after `writeManifestCache`. Best-effort per module for transient fetch
42
- * failures (reported and skipped — the manifest itself is still cached), but an
43
- * integrity failure (`IntegrityError`) or a tar entry escaping the module
44
- * directory is a hard error (tamper / path-traversal guard).
45
- *
46
- * Returns the number of bundles extracted.
47
- */
48
- export async function extractModuleBundles(graph, entryDir, registryUrl, manifestsDir, onWarn) {
49
- let count = 0;
50
- const seen = new Set();
51
- const transports = defaultTransportRegistry(registryUrl);
52
- for (const [, module] of graph.modules) {
53
- const file = module.owner;
54
- if (seen.has(file.source))
55
- continue;
56
- seen.add(file.source);
57
- if (!isRemoteSource(file.source))
58
- continue;
59
- if (!declaresFiles(module))
60
- continue;
61
- const manifestCachePath = cachePathForCanonical(file.source, entryDir, registryUrl, manifestsDir);
62
- if (!manifestCachePath)
63
- continue;
64
- const moduleDir = path.dirname(manifestCachePath);
65
- // Extract-once: a pinned registry version is immutable, so once its bundle
66
- // is on disk there is nothing to re-fetch.
67
- if (existsSync(path.join(moduleDir, EXTRACTED_MARKER)))
68
- continue;
69
- let files;
70
- try {
71
- ({ files } = await transports.fetchArtifact(file.requestedUrl));
72
- }
73
- catch (err) {
74
- // A tamper failure must never be swallowed; a transient fetch failure is
75
- // best-effort (the manifest is still cached, runtime surfaces a clear
76
- // error if the payload is actually needed).
77
- if (err instanceof IntegrityError)
78
- throw err;
79
- onWarn(`could not fetch bundle for ${file.requestedUrl}: ` +
80
- (err instanceof Error ? err.message : String(err)));
81
- continue;
82
- }
83
- const realModuleDir = path.resolve(moduleDir) + path.sep;
84
- for (const entry of files) {
85
- const dest = path.resolve(moduleDir, entry.name);
86
- if (!dest.startsWith(realModuleDir)) {
87
- throw new Error(`bundle for ${file.requestedUrl} contains entry '${entry.name}' that resolves outside the module cache directory.`);
88
- }
89
- await fs.mkdir(path.dirname(dest), { recursive: true });
90
- await fs.writeFile(dest, entry.content);
91
- }
92
- await fs.writeFile(path.join(moduleDir, EXTRACTED_MARKER), "");
93
- count++;
94
- }
95
- return count;
96
- }
97
- //# sourceMappingURL=extract.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/bundle/extract.ts"],"names":[],"mappings":"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"}