@scriptc/compiler 0.0.0 → 0.0.2
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/LICENSE +202 -0
- package/ambient/package.json +3 -0
- package/ambient/scriptc-node-fallback.d.ts +3001 -0
- package/ambient/scriptc-overrides.d.ts +95 -0
- package/ambient/scriptc.d.ts +74 -0
- package/dist/backend/cc.d.ts +169 -0
- package/dist/backend/cc.js +897 -0
- package/dist/backend/cc.js.map +1 -0
- package/dist/backend/emission/emit-async.d.ts +145 -0
- package/dist/backend/emission/emit-async.js +996 -0
- package/dist/backend/emission/emit-async.js.map +1 -0
- package/dist/backend/emission/emit-exprs.d.ts +3 -0
- package/dist/backend/emission/emit-exprs.js +5949 -0
- package/dist/backend/emission/emit-exprs.js.map +1 -0
- package/dist/backend/emission/emit-island.d.ts +45 -0
- package/dist/backend/emission/emit-island.js +271 -0
- package/dist/backend/emission/emit-island.js.map +1 -0
- package/dist/backend/emission/emit-shapes.d.ts +142 -0
- package/dist/backend/emission/emit-shapes.js +575 -0
- package/dist/backend/emission/emit-shapes.js.map +1 -0
- package/dist/backend/emission/emit-stmts.d.ts +78 -0
- package/dist/backend/emission/emit-stmts.js +960 -0
- package/dist/backend/emission/emit-stmts.js.map +1 -0
- package/dist/backend/emission/emit-types.d.ts +65 -0
- package/dist/backend/emission/emit-types.js +652 -0
- package/dist/backend/emission/emit-types.js.map +1 -0
- package/dist/backend/emission/emit-walkers.d.ts +154 -0
- package/dist/backend/emission/emit-walkers.js +1587 -0
- package/dist/backend/emission/emit-walkers.js.map +1 -0
- package/dist/backend/emission/emitter.d.ts +452 -0
- package/dist/backend/emission/emitter.js +1249 -0
- package/dist/backend/emission/emitter.js.map +1 -0
- package/dist/backend/emission/may-throw.d.ts +15 -0
- package/dist/backend/emission/may-throw.js +250 -0
- package/dist/backend/emission/may-throw.js.map +1 -0
- package/dist/backend/llvm/blocks.d.ts +21 -0
- package/dist/backend/llvm/blocks.js +68 -0
- package/dist/backend/llvm/blocks.js.map +1 -0
- package/dist/backend/llvm/classes.d.ts +84 -0
- package/dist/backend/llvm/classes.js +438 -0
- package/dist/backend/llvm/classes.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +123 -0
- package/dist/backend/llvm/dyn.js +2624 -0
- package/dist/backend/llvm/dyn.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +3 -0
- package/dist/backend/llvm/emitter.js +10102 -0
- package/dist/backend/llvm/emitter.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +78 -0
- package/dist/backend/llvm/shapes.js +754 -0
- package/dist/backend/llvm/shapes.js.map +1 -0
- package/dist/backend/llvm/unsupported.d.ts +6 -0
- package/dist/backend/llvm/unsupported.js +12 -0
- package/dist/backend/llvm/unsupported.js.map +1 -0
- package/dist/backend/llvm/walkers.d.ts +58 -0
- package/dist/backend/llvm/walkers.js +793 -0
- package/dist/backend/llvm/walkers.js.map +1 -0
- package/dist/backend/mangle.d.ts +124 -0
- package/dist/backend/mangle.js +232 -0
- package/dist/backend/mangle.js.map +1 -0
- package/dist/coverage/report.d.ts +65 -0
- package/dist/coverage/report.js +238 -0
- package/dist/coverage/report.js.map +1 -0
- package/dist/diagnostics/diagnostic.d.ts +140 -0
- package/dist/diagnostics/diagnostic.js +458 -0
- package/dist/diagnostics/diagnostic.js.map +1 -0
- package/dist/diagnostics/render.d.ts +11 -0
- package/dist/diagnostics/render.js +58 -0
- package/dist/diagnostics/render.js.map +1 -0
- package/dist/frontend/cjs-lexer.d.ts +20 -0
- package/dist/frontend/cjs-lexer.js +813 -0
- package/dist/frontend/cjs-lexer.js.map +1 -0
- package/dist/frontend/lowering/http2-constants.d.ts +1 -0
- package/dist/frontend/lowering/http2-constants.js +251 -0
- package/dist/frontend/lowering/http2-constants.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.d.ts +6 -0
- package/dist/frontend/lowering/lib-boundary.js +143 -0
- package/dist/frontend/lowering/lib-boundary.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.d.ts +18 -0
- package/dist/frontend/lowering/lower-assert.js +1269 -0
- package/dist/frontend/lowering/lower-assert.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +511 -0
- package/dist/frontend/lowering/lower-builtins.js +5249 -0
- package/dist/frontend/lowering/lower-builtins.js.map +1 -0
- package/dist/frontend/lowering/lower-calls.d.ts +581 -0
- package/dist/frontend/lowering/lower-calls.js +6286 -0
- package/dist/frontend/lowering/lower-calls.js.map +1 -0
- package/dist/frontend/lowering/lower-classes.d.ts +727 -0
- package/dist/frontend/lowering/lower-classes.js +4701 -0
- package/dist/frontend/lowering/lower-classes.js.map +1 -0
- package/dist/frontend/lowering/lower-comptime.d.ts +53 -0
- package/dist/frontend/lowering/lower-comptime.js +244 -0
- package/dist/frontend/lowering/lower-comptime.js.map +1 -0
- package/dist/frontend/lowering/lower-containers.d.ts +486 -0
- package/dist/frontend/lowering/lower-containers.js +6345 -0
- package/dist/frontend/lowering/lower-containers.js.map +1 -0
- package/dist/frontend/lowering/lower-dgram.d.ts +20 -0
- package/dist/frontend/lowering/lower-dgram.js +319 -0
- package/dist/frontend/lowering/lower-dgram.js.map +1 -0
- package/dist/frontend/lowering/lower-emitter.d.ts +10 -0
- package/dist/frontend/lowering/lower-emitter.js +688 -0
- package/dist/frontend/lowering/lower-emitter.js.map +1 -0
- package/dist/frontend/lowering/lower-enums.d.ts +22 -0
- package/dist/frontend/lowering/lower-enums.js +235 -0
- package/dist/frontend/lowering/lower-enums.js.map +1 -0
- package/dist/frontend/lowering/lower-expando.d.ts +35 -0
- package/dist/frontend/lowering/lower-expando.js +276 -0
- package/dist/frontend/lowering/lower-expando.js.map +1 -0
- package/dist/frontend/lowering/lower-exprs.d.ts +524 -0
- package/dist/frontend/lowering/lower-exprs.js +8111 -0
- package/dist/frontend/lowering/lower-exprs.js.map +1 -0
- package/dist/frontend/lowering/lower-generators.d.ts +50 -0
- package/dist/frontend/lowering/lower-generators.js +421 -0
- package/dist/frontend/lowering/lower-generators.js.map +1 -0
- package/dist/frontend/lowering/lower-inspect.d.ts +20 -0
- package/dist/frontend/lowering/lower-inspect.js +1074 -0
- package/dist/frontend/lowering/lower-inspect.js.map +1 -0
- package/dist/frontend/lowering/lower-island.d.ts +108 -0
- package/dist/frontend/lowering/lower-island.js +650 -0
- package/dist/frontend/lowering/lower-island.js.map +1 -0
- package/dist/frontend/lowering/lower-mixins.d.ts +96 -0
- package/dist/frontend/lowering/lower-mixins.js +534 -0
- package/dist/frontend/lowering/lower-mixins.js.map +1 -0
- package/dist/frontend/lowering/lower-modules.d.ts +135 -0
- package/dist/frontend/lowering/lower-modules.js +1613 -0
- package/dist/frontend/lowering/lower-modules.js.map +1 -0
- package/dist/frontend/lowering/lower-namespaces.d.ts +168 -0
- package/dist/frontend/lowering/lower-namespaces.js +706 -0
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -0
- package/dist/frontend/lowering/lower-server.d.ts +90 -0
- package/dist/frontend/lowering/lower-server.js +3471 -0
- package/dist/frontend/lowering/lower-server.js.map +1 -0
- package/dist/frontend/lowering/lower-stmts.d.ts +361 -0
- package/dist/frontend/lowering/lower-stmts.js +5341 -0
- package/dist/frontend/lowering/lower-stmts.js.map +1 -0
- package/dist/frontend/lowering/lower-stream.d.ts +88 -0
- package/dist/frontend/lowering/lower-stream.js +1533 -0
- package/dist/frontend/lowering/lower-stream.js.map +1 -0
- package/dist/frontend/lowering/lower-test.d.ts +27 -0
- package/dist/frontend/lowering/lower-test.js +353 -0
- package/dist/frontend/lowering/lower-test.js.map +1 -0
- package/dist/frontend/lowering/lowerer.d.ts +1748 -0
- package/dist/frontend/lowering/lowerer.js +6257 -0
- package/dist/frontend/lowering/lowerer.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +272 -0
- package/dist/frontend/lowering/surfaces.js +1096 -0
- package/dist/frontend/lowering/surfaces.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +55 -0
- package/dist/frontend/npm-static.js +300 -0
- package/dist/frontend/npm-static.js.map +1 -0
- package/dist/frontend/npm.d.ts +330 -0
- package/dist/frontend/npm.js +1259 -0
- package/dist/frontend/npm.js.map +1 -0
- package/dist/frontend/program.d.ts +186 -0
- package/dist/frontend/program.js +2255 -0
- package/dist/frontend/program.js.map +1 -0
- package/dist/frontend/provenance-registry.d.ts +48 -0
- package/dist/frontend/provenance-registry.js +87 -0
- package/dist/frontend/provenance-registry.js.map +1 -0
- package/dist/frontend/provenance.d.ts +6 -0
- package/dist/frontend/provenance.js +459 -0
- package/dist/frontend/provenance.js.map +1 -0
- package/dist/frontend/resolve.d.ts +56 -0
- package/dist/frontend/resolve.js +682 -0
- package/dist/frontend/resolve.js.map +1 -0
- package/dist/frontend/shared.d.ts +67 -0
- package/dist/frontend/shared.js +241 -0
- package/dist/frontend/shared.js.map +1 -0
- package/dist/frontend/ts7/adapter.d.ts +7 -0
- package/dist/frontend/ts7/adapter.js +54 -0
- package/dist/frontend/ts7/adapter.js.map +1 -0
- package/dist/frontend/ts7/ast.d.ts +50 -0
- package/dist/frontend/ts7/ast.js +211 -0
- package/dist/frontend/ts7/ast.js.map +1 -0
- package/dist/frontend/ts7/census-check.d.ts +1 -0
- package/dist/frontend/ts7/census-check.js +12 -0
- package/dist/frontend/ts7/census-check.js.map +1 -0
- package/dist/frontend/ts7/checker.d.ts +140 -0
- package/dist/frontend/ts7/checker.js +544 -0
- package/dist/frontend/ts7/checker.js.map +1 -0
- package/dist/frontend/ts7/enums.d.ts +18 -0
- package/dist/frontend/ts7/enums.js +43 -0
- package/dist/frontend/ts7/enums.js.map +1 -0
- package/dist/frontend/ts7/program.d.ts +99 -0
- package/dist/frontend/ts7/program.js +278 -0
- package/dist/frontend/ts7/program.js.map +1 -0
- package/dist/frontend/ts7/world-check.d.ts +3 -0
- package/dist/frontend/ts7/world-check.js +34 -0
- package/dist/frontend/ts7/world-check.js.map +1 -0
- package/dist/frontend/types.d.ts +205 -0
- package/dist/frontend/types.js +2485 -0
- package/dist/frontend/types.js.map +1 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.js +429 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/nodes.d.ts +4334 -0
- package/dist/ir/nodes.js +1906 -0
- package/dist/ir/nodes.js.map +1 -0
- package/dist/ir/serialize.d.ts +4 -0
- package/dist/ir/serialize.js +34 -0
- package/dist/ir/serialize.js.map +1 -0
- package/dist/ir/validate.d.ts +36 -0
- package/dist/ir/validate.js +4885 -0
- package/dist/ir/validate.js.map +1 -0
- package/package.json +30 -6
- package/README.md +0 -3
- package/index.js +0 -2
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
/* `--provenance-sources` — the provenance-assisted static compilation
|
|
2
|
+
* pipeline (EXPERIMENTAL prototype; the registry doc in
|
|
3
|
+
* provenance-registry.ts states the thesis).
|
|
4
|
+
*
|
|
5
|
+
* For every bare npm specifier the entry's module graph imports, this
|
|
6
|
+
* asks the npm registry for the package's PROVENANCE ATTESTATION
|
|
7
|
+
* (GET registry.npmjs.org/-/npm/v1/attestations/<pkg>@<version> — the
|
|
8
|
+
* SLSA predicate names the exact {repository, commit} the published dist
|
|
9
|
+
* was built from), fetches that source tree once (content-addressed cache
|
|
10
|
+
* under ~/.cache/scriptc/provenance/<gitCommit>), locates the package
|
|
11
|
+
* directory inside it (monorepos publish from subdirectories), and maps
|
|
12
|
+
* the published entry to its TypeScript source (dist/lib/build targets
|
|
13
|
+
* rewritten to their src twins). Mapped packages compile as ordinary
|
|
14
|
+
* program modules — real types, real statements, the static frontier —
|
|
15
|
+
* and everything that cannot be mapped FALLS BACK to the island path
|
|
16
|
+
* with a note; a fallback is never a build failure.
|
|
17
|
+
*
|
|
18
|
+
* PRODUCTION GAPS, deliberately unbuilt in the prototype: no sigstore
|
|
19
|
+
* bundle verification (the attestation is trusted as served), no
|
|
20
|
+
* dist-tarball ↔ source build reproduction (the behavior differential is
|
|
21
|
+
* the honest check today), source-entry mapping is heuristic (exports
|
|
22
|
+
* targets rewritten dist→src), and transitive dependency versions
|
|
23
|
+
* resolve from the DRIVER's installed tree rather than the package's own
|
|
24
|
+
* lockfile.
|
|
25
|
+
*
|
|
26
|
+
* Offline/test hook: SCRIPTC_PROVENANCE_MANIFEST=<path.json> pre-seeds
|
|
27
|
+
* {"packages": {"<name>": {"dir": "<source pkg dir>", "commit"?, "repo"?}}}
|
|
28
|
+
* — those packages skip the network entirely (harness fixtures ride
|
|
29
|
+
* this); unlisted packages still take the live pipeline. */
|
|
30
|
+
import { execFile } from "node:child_process";
|
|
31
|
+
import { readFileSync, statSync } from "node:fs";
|
|
32
|
+
import { mkdir, mkdtemp, rename, rm, writeFile } from "node:fs/promises";
|
|
33
|
+
import { builtinModules } from "node:module";
|
|
34
|
+
import { homedir, tmpdir } from "node:os";
|
|
35
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
36
|
+
import { promisify } from "node:util";
|
|
37
|
+
import ts from "typescript5";
|
|
38
|
+
import { resolveExports } from "./npm.js";
|
|
39
|
+
import { resolveRelativeModule } from "./resolve.js";
|
|
40
|
+
const execFileAsync = promisify(execFile);
|
|
41
|
+
const NODE_BUILTINS = new Set(builtinModules);
|
|
42
|
+
/** Hard cap on packages one compile will source-map (prototype guard). */
|
|
43
|
+
const MAX_PACKAGES = 16;
|
|
44
|
+
function isFile(path) {
|
|
45
|
+
try {
|
|
46
|
+
return statSync(path).isFile();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function isDirectory(path) {
|
|
53
|
+
try {
|
|
54
|
+
return statSync(path).isDirectory();
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function readJson(path) {
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function packageNameOf(specifier) {
|
|
69
|
+
const parts = specifier.split("/");
|
|
70
|
+
return specifier.startsWith("@") ? parts.slice(0, 2).join("/") : parts[0];
|
|
71
|
+
}
|
|
72
|
+
/* ── the bare-import prescan ─────────────────────────────────────────────
|
|
73
|
+
* The provenance pipeline runs BEFORE the program loads (tsgo needs the
|
|
74
|
+
* "paths" mapping at creation), so the bare specifiers come from a light
|
|
75
|
+
* parse walk of the entry's RELATIVE import closure — the same specifier
|
|
76
|
+
* collection shapes npm.ts scans embedded modules with, over the same
|
|
77
|
+
* sanctioned typescript5 island. */
|
|
78
|
+
function moduleSpecifiersLite(source, fileName) {
|
|
79
|
+
const sf = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, false, ts.ScriptKind.TS);
|
|
80
|
+
const out = [];
|
|
81
|
+
const visit = (n) => {
|
|
82
|
+
if ((ts.isImportDeclaration(n) || ts.isExportDeclaration(n)) &&
|
|
83
|
+
n.moduleSpecifier !== undefined &&
|
|
84
|
+
ts.isStringLiteral(n.moduleSpecifier)) {
|
|
85
|
+
const typeOnly = ts.isImportDeclaration(n)
|
|
86
|
+
? (n.importClause?.isTypeOnly ?? false)
|
|
87
|
+
: n.isTypeOnly;
|
|
88
|
+
out.push({ spec: n.moduleSpecifier.text, typeOnly });
|
|
89
|
+
}
|
|
90
|
+
else if (ts.isCallExpression(n)) {
|
|
91
|
+
const arg = n.arguments[0];
|
|
92
|
+
if (arg !== undefined &&
|
|
93
|
+
ts.isStringLiteralLike(arg) &&
|
|
94
|
+
(n.expression.kind === ts.SyntaxKind.ImportKeyword ||
|
|
95
|
+
(ts.isIdentifier(n.expression) && n.expression.text === "require" && n.arguments.length === 1))) {
|
|
96
|
+
out.push({ spec: arg.text, typeOnly: false });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
ts.forEachChild(n, visit);
|
|
100
|
+
};
|
|
101
|
+
visit(sf);
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
/** Every bare (non-relative, non-builtin, non-"#") VALUE specifier the
|
|
105
|
+
* relative closure of `roots` imports, in first-encounter order. */
|
|
106
|
+
function bareImportsOf(roots) {
|
|
107
|
+
const seenFiles = new Set();
|
|
108
|
+
const bare = [];
|
|
109
|
+
const bareSeen = new Set();
|
|
110
|
+
const queue = [...roots];
|
|
111
|
+
while (queue.length > 0) {
|
|
112
|
+
const file = resolve(queue.shift());
|
|
113
|
+
if (seenFiles.has(file))
|
|
114
|
+
continue;
|
|
115
|
+
seenFiles.add(file);
|
|
116
|
+
let text;
|
|
117
|
+
try {
|
|
118
|
+
text = readFileSync(file, "utf8");
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
for (const { spec, typeOnly } of moduleSpecifiersLite(text, file)) {
|
|
124
|
+
if (typeOnly)
|
|
125
|
+
continue;
|
|
126
|
+
if (spec.startsWith("./") || spec.startsWith("../")) {
|
|
127
|
+
const dep = resolveRelativeModule(file, spec);
|
|
128
|
+
if (dep !== null && !dep.endsWith(".json") && !dep.endsWith(".d.ts"))
|
|
129
|
+
queue.push(dep);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (spec.startsWith("#") || spec.startsWith("node:"))
|
|
133
|
+
continue;
|
|
134
|
+
if (NODE_BUILTINS.has(packageNameOf(spec)))
|
|
135
|
+
continue;
|
|
136
|
+
if (!bareSeen.has(spec)) {
|
|
137
|
+
bareSeen.add(spec);
|
|
138
|
+
bare.push(spec);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return bare;
|
|
143
|
+
}
|
|
144
|
+
/** node_modules/<name> walking up from `fromDir`, realpath-free (the
|
|
145
|
+
* published package.json is all this needs). */
|
|
146
|
+
function findInstalled(fromDir, name) {
|
|
147
|
+
for (let dir = fromDir;;) {
|
|
148
|
+
const candidate = join(dir, "node_modules", name);
|
|
149
|
+
const pkgJson = readJson(join(candidate, "package.json"));
|
|
150
|
+
if (pkgJson !== null && typeof pkgJson["version"] === "string") {
|
|
151
|
+
return {
|
|
152
|
+
dir: candidate,
|
|
153
|
+
name: typeof pkgJson["name"] === "string" ? pkgJson["name"] : name,
|
|
154
|
+
version: pkgJson["version"],
|
|
155
|
+
pkgJson,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const parent = dirname(dir);
|
|
159
|
+
if (parent === dir)
|
|
160
|
+
return null;
|
|
161
|
+
dir = parent;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** GET the npm attestation set and extract the SLSA provenance
|
|
165
|
+
* predicate's resolved source dependency. Throws with a one-line reason
|
|
166
|
+
* on every failure shape (no attestation, network, malformed). */
|
|
167
|
+
async function fetchAttestation(name, version) {
|
|
168
|
+
const url = `https://registry.npmjs.org/-/npm/v1/attestations/${encodeURIComponent(`${name}@${version}`).replace(/%40/g, "@").replace(/%2F/gi, "/")}`;
|
|
169
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(30_000) });
|
|
170
|
+
if (res.status === 404)
|
|
171
|
+
throw new Error("no provenance attestation published");
|
|
172
|
+
if (!res.ok)
|
|
173
|
+
throw new Error(`attestation fetch failed (HTTP ${res.status})`);
|
|
174
|
+
const body = (await res.json());
|
|
175
|
+
for (const att of body.attestations ?? []) {
|
|
176
|
+
if (!att.predicateType?.startsWith("https://slsa.dev/provenance"))
|
|
177
|
+
continue;
|
|
178
|
+
const payload = att.bundle?.dsseEnvelope?.payload;
|
|
179
|
+
if (payload === undefined)
|
|
180
|
+
continue;
|
|
181
|
+
const stmt = JSON.parse(Buffer.from(payload, "base64").toString("utf8"));
|
|
182
|
+
for (const dep of stmt.predicate?.buildDefinition?.resolvedDependencies ?? []) {
|
|
183
|
+
const commit = dep.digest?.gitCommit;
|
|
184
|
+
if (typeof commit === "string" && commit !== "" && typeof dep.uri === "string") {
|
|
185
|
+
return { repo: dep.uri, commit };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
throw new Error("attestation set carries no SLSA provenance predicate");
|
|
190
|
+
}
|
|
191
|
+
/* ── source fetch (content-addressed by the attested commit) ──────────── */
|
|
192
|
+
function cacheRoot() {
|
|
193
|
+
return process.env["SCRIPTC_PROVENANCE_CACHE"] ?? join(homedir(), ".cache", "scriptc", "provenance");
|
|
194
|
+
}
|
|
195
|
+
/** The cached source tree for an attested commit, fetching it once from
|
|
196
|
+
* codeload (github repos only in the prototype). Returns the tree root. */
|
|
197
|
+
async function fetchSourceTree(repo, commit) {
|
|
198
|
+
const dest = join(cacheRoot(), commit);
|
|
199
|
+
if (isDirectory(dest))
|
|
200
|
+
return dest;
|
|
201
|
+
const m = /github\.com\/([^/]+)\/([^/@#]+)/.exec(repo);
|
|
202
|
+
if (m === null)
|
|
203
|
+
throw new Error(`source repository is not a github URL (${repo})`);
|
|
204
|
+
const url = `https://codeload.github.com/${m[1]}/${m[2]}/tar.gz/${commit}`;
|
|
205
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(120_000) });
|
|
206
|
+
if (!res.ok)
|
|
207
|
+
throw new Error(`source fetch failed (HTTP ${res.status} for ${url})`);
|
|
208
|
+
const bytes = Buffer.from(await res.arrayBuffer());
|
|
209
|
+
await mkdir(cacheRoot(), { recursive: true });
|
|
210
|
+
const tmp = await mkdtemp(join(tmpdir(), "scriptc-provenance-"));
|
|
211
|
+
try {
|
|
212
|
+
const tarball = join(tmp, "src.tgz");
|
|
213
|
+
await writeFile(tarball, bytes);
|
|
214
|
+
const extractDir = join(tmp, "tree");
|
|
215
|
+
await mkdir(extractDir);
|
|
216
|
+
await execFileAsync("tar", ["-xzf", tarball, "-C", extractDir, "--strip-components=1"]);
|
|
217
|
+
try {
|
|
218
|
+
await rename(extractDir, dest);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// A parallel compile won the rename — its tree is the same content.
|
|
222
|
+
if (!isDirectory(dest))
|
|
223
|
+
throw new Error("source cache rename failed");
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
await rm(tmp, { recursive: true, force: true });
|
|
228
|
+
}
|
|
229
|
+
return dest;
|
|
230
|
+
}
|
|
231
|
+
/* ── package dir + source-entry mapping ────────────────────────────────── */
|
|
232
|
+
/** The directory inside `tree` whose package.json names `name`: the root,
|
|
233
|
+
* then the conventional monorepo layouts, then a bounded scan. */
|
|
234
|
+
function locatePackageDir(tree, name) {
|
|
235
|
+
const nameOf = (dir) => {
|
|
236
|
+
const pkg = readJson(join(dir, "package.json"));
|
|
237
|
+
return pkg !== null && typeof pkg["name"] === "string" ? pkg["name"] : null;
|
|
238
|
+
};
|
|
239
|
+
if (nameOf(tree) === name)
|
|
240
|
+
return tree;
|
|
241
|
+
const bare = name.startsWith("@") ? name.split("/")[1] : name;
|
|
242
|
+
const candidates = [
|
|
243
|
+
join(tree, "packages", bare),
|
|
244
|
+
join(tree, "packages", name),
|
|
245
|
+
join(tree, "packages", name.replace("@", "").replace("/", "-")),
|
|
246
|
+
join(tree, "packages", `babel-${bare}`),
|
|
247
|
+
];
|
|
248
|
+
for (const c of candidates) {
|
|
249
|
+
if (nameOf(c) === name)
|
|
250
|
+
return c;
|
|
251
|
+
}
|
|
252
|
+
// Bounded breadth-first scan (depth ≤ 3, node_modules/.git skipped).
|
|
253
|
+
const queue = [{ dir: tree, depth: 0 }];
|
|
254
|
+
while (queue.length > 0) {
|
|
255
|
+
const { dir, depth } = queue.shift();
|
|
256
|
+
if (depth > 0 && nameOf(dir) === name)
|
|
257
|
+
return dir;
|
|
258
|
+
if (depth >= 3)
|
|
259
|
+
continue;
|
|
260
|
+
let entries;
|
|
261
|
+
try {
|
|
262
|
+
entries = ts.sys.getDirectories(dir);
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
for (const e of entries) {
|
|
268
|
+
if (e === "node_modules" || e.startsWith("."))
|
|
269
|
+
continue;
|
|
270
|
+
queue.push({ dir: join(dir, e), depth: depth + 1 });
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
/** The published dist target for `subpath` — "exports" with the import
|
|
276
|
+
* condition, else module/main/types fields (root subpath only). */
|
|
277
|
+
function publishedTargetOf(pkgJson, subpath) {
|
|
278
|
+
if (pkgJson["exports"] !== undefined) {
|
|
279
|
+
return resolveExports(pkgJson["exports"], subpath, "import");
|
|
280
|
+
}
|
|
281
|
+
if (subpath !== ".")
|
|
282
|
+
return subpath;
|
|
283
|
+
for (const field of ["module", "main", "types"]) {
|
|
284
|
+
const v = pkgJson[field];
|
|
285
|
+
if (typeof v === "string" && v !== "")
|
|
286
|
+
return v;
|
|
287
|
+
}
|
|
288
|
+
return "index.js";
|
|
289
|
+
}
|
|
290
|
+
/** dist target → source file, heuristically: the built path's leading
|
|
291
|
+
* dist/lib/build segment rewrites to src (or drops), extensions rewrite
|
|
292
|
+
* to their TypeScript twins, and the root entry falls back to the
|
|
293
|
+
* conventional src/index.ts homes. First existing candidate wins. */
|
|
294
|
+
function mapEntryToSource(pkgDir, target, subpath) {
|
|
295
|
+
const rel = target.replace(/^\.\//, "");
|
|
296
|
+
const stems = new Set([rel]);
|
|
297
|
+
const distRe = /^(dist|lib|build|out|output|dist-node|dist-src)\//;
|
|
298
|
+
if (distRe.test(rel)) {
|
|
299
|
+
stems.add(rel.replace(distRe, "src/"));
|
|
300
|
+
stems.add(rel.replace(distRe, ""));
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
stems.add(`src/${rel}`);
|
|
304
|
+
}
|
|
305
|
+
const candidates = [];
|
|
306
|
+
for (const stem of stems) {
|
|
307
|
+
const base = stem.replace(/\.d\.(ts|mts|cts)$/, ".$1").replace(/\.(js|mjs|cjs)$/, "");
|
|
308
|
+
if (/\.(ts|tsx|mts|cts)$/.test(base))
|
|
309
|
+
candidates.push(base);
|
|
310
|
+
else {
|
|
311
|
+
candidates.push(`${base}.ts`, `${base}.mts`, `${base}.cts`, `${base}.tsx`);
|
|
312
|
+
candidates.push(join(base, "index.ts"));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (subpath === ".") {
|
|
316
|
+
candidates.push("src/index.ts", "src/index.mts", "index.ts", "src/index.tsx");
|
|
317
|
+
}
|
|
318
|
+
for (const c of candidates) {
|
|
319
|
+
const abs = join(pkgDir, c);
|
|
320
|
+
if (isFile(abs))
|
|
321
|
+
return abs;
|
|
322
|
+
}
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
function readManifest() {
|
|
326
|
+
const path = process.env["SCRIPTC_PROVENANCE_MANIFEST"];
|
|
327
|
+
const out = new Map();
|
|
328
|
+
if (path === undefined || path === "")
|
|
329
|
+
return out;
|
|
330
|
+
const manifest = readJson(resolve(path));
|
|
331
|
+
const packages = manifest?.["packages"];
|
|
332
|
+
if (packages === null || typeof packages !== "object")
|
|
333
|
+
return out;
|
|
334
|
+
for (const [name, raw] of Object.entries(packages)) {
|
|
335
|
+
if (raw === null || typeof raw !== "object")
|
|
336
|
+
continue;
|
|
337
|
+
const e = raw;
|
|
338
|
+
if (typeof e.dir !== "string")
|
|
339
|
+
continue;
|
|
340
|
+
const dir = isAbsolute(e.dir) ? e.dir : resolve(dirname(resolve(path)), e.dir);
|
|
341
|
+
out.set(name, {
|
|
342
|
+
dir,
|
|
343
|
+
...(typeof e.commit === "string" ? { commit: e.commit } : {}),
|
|
344
|
+
...(typeof e.repo === "string" ? { repo: e.repo } : {}),
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
return out;
|
|
348
|
+
}
|
|
349
|
+
/** Resolves provenance sources for everything the entry's module graph
|
|
350
|
+
* imports (one transitive round per newly-mapped tree: source imports of
|
|
351
|
+
* OTHER packages try the pipeline too). Never throws for a package
|
|
352
|
+
* failure — those become notes and the package keeps its island path. */
|
|
353
|
+
export async function resolveProvenanceSources(entryPath) {
|
|
354
|
+
const entry = resolve(entryPath);
|
|
355
|
+
const manifest = readManifest();
|
|
356
|
+
const packages = [];
|
|
357
|
+
const notes = [];
|
|
358
|
+
/** package name → mapped package (or null after a noted failure). */
|
|
359
|
+
const processed = new Map();
|
|
360
|
+
/** All specifiers seen so far, grouped by package name. */
|
|
361
|
+
const specifiersByPackage = new Map();
|
|
362
|
+
const enqueue = (specs) => {
|
|
363
|
+
const newNames = [];
|
|
364
|
+
for (const spec of specs) {
|
|
365
|
+
const name = packageNameOf(spec);
|
|
366
|
+
let set = specifiersByPackage.get(name);
|
|
367
|
+
if (set === undefined) {
|
|
368
|
+
specifiersByPackage.set(name, (set = new Set()));
|
|
369
|
+
newNames.push(name);
|
|
370
|
+
}
|
|
371
|
+
set.add(spec);
|
|
372
|
+
}
|
|
373
|
+
return newNames;
|
|
374
|
+
};
|
|
375
|
+
const mapOne = async (name) => {
|
|
376
|
+
if (processed.has(name))
|
|
377
|
+
return;
|
|
378
|
+
if (processed.size >= MAX_PACKAGES) {
|
|
379
|
+
processed.set(name, null);
|
|
380
|
+
notes.push(`${name}: skipped — provenance package limit (${MAX_PACKAGES}) reached; island path used`);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
processed.set(name, null); // claimed; overwritten on success
|
|
384
|
+
const installed = findInstalled(dirname(entry), name);
|
|
385
|
+
if (installed === null) {
|
|
386
|
+
notes.push(`${name}: not installed under the entry's node_modules; island path used`);
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
let dir;
|
|
390
|
+
let repo;
|
|
391
|
+
let commit;
|
|
392
|
+
const seeded = manifest.get(name);
|
|
393
|
+
try {
|
|
394
|
+
if (seeded !== undefined) {
|
|
395
|
+
dir = seeded.dir;
|
|
396
|
+
repo = seeded.repo ?? "(manifest)";
|
|
397
|
+
commit = seeded.commit ?? "(manifest)";
|
|
398
|
+
if (!isDirectory(dir))
|
|
399
|
+
throw new Error(`manifest dir does not exist (${dir})`);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
const attested = await fetchAttestation(installed.name, installed.version);
|
|
403
|
+
repo = attested.repo;
|
|
404
|
+
commit = attested.commit;
|
|
405
|
+
const tree = await fetchSourceTree(repo, commit);
|
|
406
|
+
const located = locatePackageDir(tree, installed.name);
|
|
407
|
+
if (located === null) {
|
|
408
|
+
throw new Error(`package directory not found inside the attested source tree (${tree})`);
|
|
409
|
+
}
|
|
410
|
+
dir = located;
|
|
411
|
+
}
|
|
412
|
+
const entries = {};
|
|
413
|
+
for (const spec of specifiersByPackage.get(name) ?? []) {
|
|
414
|
+
const parts = spec.split("/");
|
|
415
|
+
const nameLen = spec.startsWith("@") ? 2 : 1;
|
|
416
|
+
const subpath = parts.length === nameLen ? "." : `./${parts.slice(nameLen).join("/")}`;
|
|
417
|
+
const target = publishedTargetOf(installed.pkgJson, subpath);
|
|
418
|
+
const source = target === null ? null : mapEntryToSource(dir, target, subpath);
|
|
419
|
+
if (source === null) {
|
|
420
|
+
notes.push(`${name}@${installed.version}: no source mapping for '${spec}' (published target: ${target ?? "unexported"}); island path used`);
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
entries[spec] = source;
|
|
424
|
+
}
|
|
425
|
+
if (Object.keys(entries).length === 0)
|
|
426
|
+
return;
|
|
427
|
+
const srcPkg = readJson(join(dir, "package.json"));
|
|
428
|
+
const sourceVersion = typeof srcPkg?.["version"] === "string" ? srcPkg["version"] : undefined;
|
|
429
|
+
const pkg = {
|
|
430
|
+
name: installed.name,
|
|
431
|
+
version: installed.version,
|
|
432
|
+
...(sourceVersion !== undefined && sourceVersion !== installed.version ? { sourceVersion } : {}),
|
|
433
|
+
repo,
|
|
434
|
+
commit,
|
|
435
|
+
dir,
|
|
436
|
+
entries,
|
|
437
|
+
};
|
|
438
|
+
if (pkg.sourceVersion !== undefined) {
|
|
439
|
+
notes.push(`${name}: source tree's package.json says ${pkg.sourceVersion}, installed is ${installed.version} (release tooling that bumps at publish) — the behavior differential is the check`);
|
|
440
|
+
}
|
|
441
|
+
packages.push(pkg);
|
|
442
|
+
processed.set(name, pkg);
|
|
443
|
+
// One transitive round: the mapped source's own bare imports try
|
|
444
|
+
// the pipeline too (versions resolve from the DRIVER's tree — a
|
|
445
|
+
// prototype heuristic; production wants the package's lockfile).
|
|
446
|
+
const inner = enqueue(bareImportsOf(Object.values(entries)));
|
|
447
|
+
for (const n of inner)
|
|
448
|
+
await mapOne(n);
|
|
449
|
+
}
|
|
450
|
+
catch (e) {
|
|
451
|
+
notes.push(`${name}@${installed.version}: ${e instanceof Error ? e.message : String(e)}; island path used`);
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
for (const name of enqueue(bareImportsOf([entry]))) {
|
|
455
|
+
await mapOne(name);
|
|
456
|
+
}
|
|
457
|
+
return { packages, notes };
|
|
458
|
+
}
|
|
459
|
+
//# sourceMappingURL=provenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../src/frontend/provenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export declare function setProjectRealm(entryPath: string): void;
|
|
2
|
+
export declare function projectDtsRuntimeSibling(path: string): string | null;
|
|
3
|
+
/** Resolves a RELATIVE import specifier from `fromFile` the way 5.9.3's
|
|
4
|
+
* ts.resolveModuleName does under scriptc's options. Returns the resolved
|
|
5
|
+
* absolute path (not realpath'd — matching 5.9.3, which keeps in-project
|
|
6
|
+
* paths as spelled), or null. */
|
|
7
|
+
export declare function resolveRelativeModule(fromFile: string, specifier: string): string | null;
|
|
8
|
+
/** Absolute path of the nearest package.json at or above `fromFile`'s
|
|
9
|
+
* directory — the package scope Node's imports-field refusals name
|
|
10
|
+
* (ERR_PACKAGE_IMPORT_NOT_DEFINED carries it). Null outside any scope. */
|
|
11
|
+
export declare function nearestPkgJsonPath(fromFile: string): string | null;
|
|
12
|
+
/** Resolves a PROJECT-INTERNAL package.json-mediated specifier from
|
|
13
|
+
* `fromFile` — `#alias` (the imports field) or a self-name reference (the
|
|
14
|
+
* nearest package.json's own name through its exports) — to an absolute
|
|
15
|
+
* source path with the usual bundler extension substitution, or null.
|
|
16
|
+
* Relative specifiers, real node_modules packages, and builtins are other
|
|
17
|
+
* resolvers' business; callers try those first. */
|
|
18
|
+
export declare function resolveProjectImport(fromFile: string, specifier: string): string | null;
|
|
19
|
+
export interface BareResolution {
|
|
20
|
+
/** The resolved types file, realpath'd (5.9.3 resolves node_modules
|
|
21
|
+
* symlinks — pnpm stores — and answers the real location). */
|
|
22
|
+
typesFile: string;
|
|
23
|
+
/** package.json "name" when present (5.9.3's packageId.name), else the
|
|
24
|
+
* specifier's package prefix. For @types answers this is the @types
|
|
25
|
+
* package's own name ("@types/foo"). */
|
|
26
|
+
packageName: string;
|
|
27
|
+
/** package.json "version" (packageId is only formed when it exists). */
|
|
28
|
+
version?: string;
|
|
29
|
+
/** Set when the node_modules package directory is a SYMLINK whose real
|
|
30
|
+
* location lies outside every node_modules — a workspace-linked package
|
|
31
|
+
* (pnpm/npm/yarn/bun workspaces all install internal packages this way):
|
|
32
|
+
* the realpath of the package directory. The resolved typesFile then
|
|
33
|
+
* carries no node_modules segment, and callers must not read that as
|
|
34
|
+
* "not an npm package". */
|
|
35
|
+
workspaceDir?: string;
|
|
36
|
+
}
|
|
37
|
+
/** Resolves a BARE import specifier to its npm TYPES file the way 5.9.3's
|
|
38
|
+
* ts.resolveModuleName does under scriptc's options (bundler, types-only in
|
|
39
|
+
* node_modules), walking node_modules directories up from the importing
|
|
40
|
+
* file. Null when nothing resolves. */
|
|
41
|
+
export declare function resolveBareModule(fromFile: string, specifier: string,
|
|
42
|
+
/** "js-only" forces the runtime-JS resolution regardless of the active
|
|
43
|
+
* --npm-static set (the auto-detection probe); default follows the set. */
|
|
44
|
+
mode?: "js-only"): BareResolution | null;
|
|
45
|
+
/** Resolves a `/// <reference types="name" />`-style TYPE DIRECTIVE the way
|
|
46
|
+
* ts.resolveTypeReferenceDirective does with typeRoots emptied (the
|
|
47
|
+
* secondary lookup only): walking up from the anchor file, per directory
|
|
48
|
+
* node_modules/<name> then node_modules/@types/<name>, each via package.json
|
|
49
|
+
* types/typings then index.d.ts. Returns the realpath'd file or null. */
|
|
50
|
+
export declare function resolveTypeDirective(name: string, fromFile: string): string | null;
|
|
51
|
+
/** Test hook: the package.json cache holds across programs (fine within one
|
|
52
|
+
* compile; a long-lived test process editing fixtures must reset it). */
|
|
53
|
+
export declare function clearResolveCaches(): void;
|
|
54
|
+
/** True when `path` is under a node_modules directory (the
|
|
55
|
+
* isExternalLibraryImport test 5.9.3 answers on resolutions). */
|
|
56
|
+
export declare function isNodeModulesPath(path: string): boolean;
|