@scriptc/compiler 0.0.6 → 0.0.8
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/dist/backend/emission/emit-exprs.js +47 -1
- package/dist/backend/emission/emit-exprs.js.map +1 -1
- package/dist/backend/emission/emit-island.js +9 -1
- package/dist/backend/emission/emit-island.js.map +1 -1
- package/dist/backend/emission/emit-stmts.js +3 -1
- package/dist/backend/emission/emit-stmts.js.map +1 -1
- package/dist/backend/emission/emit-walkers.js +22 -8
- package/dist/backend/emission/emit-walkers.js.map +1 -1
- package/dist/backend/emission/emitter.js +12 -1
- package/dist/backend/emission/emitter.js.map +1 -1
- package/dist/backend/emission/may-throw.js +4 -3
- package/dist/backend/emission/may-throw.js.map +1 -1
- package/dist/backend/llvm/emitter.js +105 -9
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +49 -1
- package/dist/diagnostics/diagnostic.js +119 -5
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/frontend/lib-contract.d.ts +114 -0
- package/dist/frontend/lib-contract.js +372 -0
- package/dist/frontend/lib-contract.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.js +16 -1
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +47 -7
- package/dist/frontend/lowering/lower-calls.js +560 -36
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +14 -1
- package/dist/frontend/lowering/lower-classes.js +85 -15
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.js +43 -1
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-emitter.js +1 -1
- package/dist/frontend/lowering/lower-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +26 -3
- package/dist/frontend/lowering/lower-exprs.js +474 -44
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +7 -0
- package/dist/frontend/lowering/lower-island.js +71 -10
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.d.ts +1 -1
- package/dist/frontend/lowering/lower-mixins.js +1 -1
- package/dist/frontend/lowering/lower-modules.js +95 -4
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +430 -44
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +19 -3
- package/dist/frontend/lowering/lowerer.js +188 -11
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/types.d.ts +28 -1
- package/dist/frontend/types.js +300 -8
- package/dist/frontend/types.js.map +1 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.js +96 -7
- package/dist/index.js.map +1 -1
- package/dist/ir/nodes.d.ts +48 -2
- package/dist/ir/nodes.js +103 -3
- package/dist/ir/nodes.js.map +1 -1
- package/dist/ir/validate.js +35 -6
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/profile.d.ts +53 -3
- package/dist/library/profile.js +143 -12
- package/dist/library/profile.js.map +1 -1
- package/dist/library/sidecar-validate.d.ts +4 -0
- package/dist/library/sidecar-validate.js +506 -0
- package/dist/library/sidecar-validate.js.map +1 -0
- package/dist/library/sidecar.d.ts +191 -0
- package/dist/library/sidecar.js +687 -0
- package/dist/library/sidecar.js.map +1 -0
- package/dist/library/trap-teaching.d.ts +11 -0
- package/dist/library/trap-teaching.js +49 -0
- package/dist/library/trap-teaching.js.map +1 -0
- package/dist/library/wyhash.d.ts +12 -0
- package/dist/library/wyhash.js +116 -0
- package/dist/library/wyhash.js.map +1 -0
- package/package.json +2 -2
- package/surface-manifest.json +37 -2
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
/* The sidecar schema's validation rules (§11, V1–V14) as an emitter
|
|
2
|
+
* self-check and a test-side conformance oracle. Everything checkable
|
|
3
|
+
* from the document alone is checked here; the rules needing external
|
|
4
|
+
* facts stay with their owners and are exercised by the harness instead:
|
|
5
|
+
* V11's symbol comparison (nm over the archive), V12's getter comparison
|
|
6
|
+
* (the probe prints the exported u64), V13's byte-identical re-run (two
|
|
7
|
+
* independent compiles), V14's attestation honesty (the emitter computes
|
|
8
|
+
* both attestations from the module graph; this module cannot re-derive
|
|
9
|
+
* them from the document).
|
|
10
|
+
*
|
|
11
|
+
* The checks key on the RULES, never on any example's specific field
|
|
12
|
+
* lists — the schema's worked example is illustrative and its record
|
|
13
|
+
* shapes may drift; a conforming document of any shape passes. */
|
|
14
|
+
const TOP_LEVEL_ORDER = [
|
|
15
|
+
"format",
|
|
16
|
+
"wire_version",
|
|
17
|
+
"abi_version",
|
|
18
|
+
"compiler_version",
|
|
19
|
+
"entry",
|
|
20
|
+
"source_hash",
|
|
21
|
+
"build_id",
|
|
22
|
+
"types",
|
|
23
|
+
"model",
|
|
24
|
+
"model_helpers",
|
|
25
|
+
"model_unbound",
|
|
26
|
+
"msg",
|
|
27
|
+
"init_returns_cmd",
|
|
28
|
+
"update_returns_cmd",
|
|
29
|
+
"has_subscriptions",
|
|
30
|
+
"channels",
|
|
31
|
+
"abi",
|
|
32
|
+
"integer_slots",
|
|
33
|
+
"deterministic",
|
|
34
|
+
"async_free",
|
|
35
|
+
];
|
|
36
|
+
const HASH_RE = /^[0-9a-f]{16}$/;
|
|
37
|
+
const TYPEREF_KINDS = new Set(["bool", "f64", "i64", "bytes", "void", "optional", "slice", "node", "value", "enum", "union"]);
|
|
38
|
+
const FUNCTION_CHANNELS = ["command_msg", "frame_msg", "key_msg", "pinch_msg"];
|
|
39
|
+
function isDict(v) {
|
|
40
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
41
|
+
}
|
|
42
|
+
/** Validate a parsed sidecar document against the doc-internal halves of
|
|
43
|
+
* V1–V10 (plus V11's shape checks). Returns rule-tagged violation
|
|
44
|
+
* messages; empty = conforming. */
|
|
45
|
+
export function validateSidecar(doc) {
|
|
46
|
+
const out = [];
|
|
47
|
+
const bad = (rule, msg) => {
|
|
48
|
+
out.push(`${rule}: ${msg}`);
|
|
49
|
+
};
|
|
50
|
+
if (!isDict(doc))
|
|
51
|
+
return ["V1: the sidecar is not a JSON object"];
|
|
52
|
+
/* ── V1: required fields, format, top-level key order ─────────────── */
|
|
53
|
+
const keys = Object.keys(doc);
|
|
54
|
+
for (const k of TOP_LEVEL_ORDER) {
|
|
55
|
+
if (!(k in doc))
|
|
56
|
+
bad("V1", `required field '${k}' is missing`);
|
|
57
|
+
}
|
|
58
|
+
for (const k of keys) {
|
|
59
|
+
if (!TOP_LEVEL_ORDER.includes(k))
|
|
60
|
+
bad("V1", `unknown top-level field '${k}' (emit only format-1 fields)`);
|
|
61
|
+
}
|
|
62
|
+
const present = TOP_LEVEL_ORDER.filter((k) => k in doc);
|
|
63
|
+
const actual = keys.filter((k) => TOP_LEVEL_ORDER.includes(k));
|
|
64
|
+
if (present.join(",") !== actual.join(",")) {
|
|
65
|
+
bad("V1", "top-level keys are not emitted in the schema's §1 order");
|
|
66
|
+
}
|
|
67
|
+
if (doc["format"] !== 1)
|
|
68
|
+
bad("V1", `format must be 1, found ${JSON.stringify(doc["format"])}`);
|
|
69
|
+
for (const k of ["wire_version", "abi_version"]) {
|
|
70
|
+
if (typeof doc[k] !== "number" || !Number.isInteger(doc[k]))
|
|
71
|
+
bad("V1", `'${k}' must be an integer`);
|
|
72
|
+
}
|
|
73
|
+
for (const k of ["compiler_version", "entry", "model"]) {
|
|
74
|
+
if (typeof doc[k] !== "string" || doc[k] === "")
|
|
75
|
+
bad("V1", `'${k}' must be a non-empty string`);
|
|
76
|
+
}
|
|
77
|
+
for (const k of ["init_returns_cmd", "update_returns_cmd", "has_subscriptions", "deterministic", "async_free"]) {
|
|
78
|
+
if (typeof doc[k] !== "boolean")
|
|
79
|
+
bad("V1", `'${k}' must be a boolean`);
|
|
80
|
+
}
|
|
81
|
+
if (typeof doc["entry"] === "string" && (doc["entry"].includes("\\") || doc["entry"].startsWith("/"))) {
|
|
82
|
+
bad("V1", "'entry' must be a compilation-root-relative POSIX path");
|
|
83
|
+
}
|
|
84
|
+
/* ── V2: hash encodings ───────────────────────────────────────────── */
|
|
85
|
+
for (const k of ["source_hash", "build_id"]) {
|
|
86
|
+
if (typeof doc[k] !== "string" || !HASH_RE.test(doc[k])) {
|
|
87
|
+
bad("V2", `'${k}' must be exactly 16 lowercase hex digits`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/* ── the type table (shape first — later rules walk it) ───────────── */
|
|
91
|
+
const types = doc["types"];
|
|
92
|
+
if (!isDict(types) || !Array.isArray(types["structs"]) || !Array.isArray(types["enums"]) || !Array.isArray(types["unions"])) {
|
|
93
|
+
bad("V1", "'types' must carry the three arrays structs/enums/unions");
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
const structs = new Map();
|
|
97
|
+
const enums = new Map();
|
|
98
|
+
const unions = new Map();
|
|
99
|
+
const claimName = (name, where) => {
|
|
100
|
+
if (typeof name !== "string" || name === "") {
|
|
101
|
+
bad("V1", `${where} entry has no name`);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
if (structs.has(name) || enums.has(name) || unions.has(name)) {
|
|
105
|
+
bad("V3", `type name '${name}' appears twice — structs, enums, and unions share one namespace`);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return name;
|
|
109
|
+
};
|
|
110
|
+
for (const s of types["structs"]) {
|
|
111
|
+
if (!isDict(s))
|
|
112
|
+
continue;
|
|
113
|
+
const name = claimName(s["name"], "structs");
|
|
114
|
+
if (name !== null)
|
|
115
|
+
structs.set(name, s);
|
|
116
|
+
}
|
|
117
|
+
for (const e of types["enums"]) {
|
|
118
|
+
if (!isDict(e))
|
|
119
|
+
continue;
|
|
120
|
+
const name = claimName(e["name"], "enums");
|
|
121
|
+
if (name !== null)
|
|
122
|
+
enums.set(name, e);
|
|
123
|
+
}
|
|
124
|
+
for (const u of types["unions"]) {
|
|
125
|
+
if (!isDict(u))
|
|
126
|
+
continue;
|
|
127
|
+
const name = claimName(u["name"], "unions");
|
|
128
|
+
if (name !== null)
|
|
129
|
+
unions.set(name, u);
|
|
130
|
+
}
|
|
131
|
+
/* ── V4/V7 walkers: TypeRef structure + reference resolution ──────── */
|
|
132
|
+
const reachable = new Set();
|
|
133
|
+
const edges = new Map(); // for V5
|
|
134
|
+
const i64Slots = []; // for V10 (slice elements exempt)
|
|
135
|
+
const walkRef = (ref, where, owner, slotPath) => {
|
|
136
|
+
if (!isDict(ref) || typeof ref["kind"] !== "string") {
|
|
137
|
+
bad("V4", `${where} is not a TypeRef object`);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const kind = ref["kind"];
|
|
141
|
+
if (!TYPEREF_KINDS.has(kind)) {
|
|
142
|
+
bad("V4", `${where} carries unknown TypeRef kind '${kind}'`);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
switch (kind) {
|
|
146
|
+
case "i64":
|
|
147
|
+
if (slotPath !== null)
|
|
148
|
+
i64Slots.push(slotPath);
|
|
149
|
+
return;
|
|
150
|
+
case "optional":
|
|
151
|
+
walkRef(ref["inner"], `${where}.inner`, owner, slotPath);
|
|
152
|
+
return;
|
|
153
|
+
case "slice":
|
|
154
|
+
// Slice elements are exempt from the V10 bijection: the format-1
|
|
155
|
+
// slot grammar has no slice-element form (§9 clarification).
|
|
156
|
+
walkRef(ref["elem"], `${where}.elem`, owner, null);
|
|
157
|
+
return;
|
|
158
|
+
case "node":
|
|
159
|
+
case "value":
|
|
160
|
+
case "enum":
|
|
161
|
+
case "union": {
|
|
162
|
+
const name = ref["name"];
|
|
163
|
+
if (typeof name !== "string") {
|
|
164
|
+
bad("V4", `${where} names no type`);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const table = kind === "enum" ? enums : kind === "union" ? unions : structs;
|
|
168
|
+
if (!table.has(name)) {
|
|
169
|
+
bad("V4", `${where} references '${name}', which is not a ${kind === "node" || kind === "value" ? "struct" : kind} in the type table`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
reachable.add(name);
|
|
173
|
+
if (owner !== null) {
|
|
174
|
+
let set = edges.get(owner);
|
|
175
|
+
if (set === undefined) {
|
|
176
|
+
set = new Set();
|
|
177
|
+
edges.set(owner, set);
|
|
178
|
+
}
|
|
179
|
+
set.add(name);
|
|
180
|
+
}
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
default:
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
/* ── V3 (inner uniqueness) + table entry shapes ───────────────────── */
|
|
188
|
+
for (const [name, s] of structs) {
|
|
189
|
+
const fields = s["fields"];
|
|
190
|
+
if (!Array.isArray(fields)) {
|
|
191
|
+
bad("V1", `struct '${name}' has no fields array`);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const seen = new Set();
|
|
195
|
+
for (const f of fields) {
|
|
196
|
+
if (!isDict(f) || typeof f["name"] !== "string") {
|
|
197
|
+
bad("V1", `struct '${name}' carries a malformed field`);
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (seen.has(f["name"]))
|
|
201
|
+
bad("V3", `struct '${name}' repeats field '${f["name"]}'`);
|
|
202
|
+
seen.add(f["name"]);
|
|
203
|
+
walkRef(f["type"], `struct '${name}' field '${f["name"]}'`, name, `${name}.${f["name"]}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
for (const [name, e] of enums) {
|
|
207
|
+
const members = e["members"];
|
|
208
|
+
if (!Array.isArray(members) || members.some((m) => typeof m !== "string")) {
|
|
209
|
+
bad("V1", `enum '${name}' has no string member array`);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (new Set(members).size !== members.length)
|
|
213
|
+
bad("V3", `enum '${name}' repeats a member`);
|
|
214
|
+
}
|
|
215
|
+
for (const [name, u] of unions) {
|
|
216
|
+
const arms = u["arms"];
|
|
217
|
+
if (!Array.isArray(arms)) {
|
|
218
|
+
bad("V1", `union '${name}' has no arms array`);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const seen = new Set();
|
|
222
|
+
for (const a of arms) {
|
|
223
|
+
if (!isDict(a) || typeof a["name"] !== "string") {
|
|
224
|
+
bad("V1", `union '${name}' carries a malformed arm`);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (seen.has(a["name"]))
|
|
228
|
+
bad("V3", `union '${name}' repeats arm '${a["name"]}'`);
|
|
229
|
+
seen.add(a["name"]);
|
|
230
|
+
walkRef(a["payload"], `union '${name}' arm '${a["name"]}'`, name, `${name}.${a["name"]}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/* ── model / helpers / msg ────────────────────────────────────────── */
|
|
234
|
+
const model = doc["model"];
|
|
235
|
+
const modelFields = new Set();
|
|
236
|
+
if (typeof model === "string") {
|
|
237
|
+
const entry = structs.get(model);
|
|
238
|
+
if (entry === undefined) {
|
|
239
|
+
bad("V4", `'model' names '${model}', which is not a struct in the type table`);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
reachable.add(model);
|
|
243
|
+
for (const f of entry["fields"] ?? []) {
|
|
244
|
+
if (isDict(f) && typeof f["name"] === "string")
|
|
245
|
+
modelFields.add(f["name"]);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const helpers = doc["model_helpers"];
|
|
250
|
+
const helperNames = new Set();
|
|
251
|
+
if (!Array.isArray(helpers)) {
|
|
252
|
+
bad("V1", "'model_helpers' must be an array");
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
helpers.forEach((h, i) => {
|
|
256
|
+
if (!isDict(h) || typeof h["name"] !== "string" || typeof h["arena"] !== "boolean" || !Array.isArray(h["params"])) {
|
|
257
|
+
bad("V1", `model_helpers[${i}] is malformed (name/params/returns/arena)`);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const name = h["name"];
|
|
261
|
+
if (helperNames.has(name))
|
|
262
|
+
bad("V3", `helper '${name}' appears twice`);
|
|
263
|
+
helperNames.add(name);
|
|
264
|
+
h["params"].forEach((p, j) => {
|
|
265
|
+
walkRef(p, `helper '${name}' params[${j}]`, null, `helpers.${name}.params[${j}]`);
|
|
266
|
+
});
|
|
267
|
+
walkRef(h["returns"], `helper '${name}' returns`, null, `helpers.${name}.return`);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
const msg = doc["msg"];
|
|
271
|
+
const armDescriptors = new Map();
|
|
272
|
+
let msgName = "Msg";
|
|
273
|
+
if (!isDict(msg) || typeof msg["name"] !== "string" || !Array.isArray(msg["arms"]) || !Array.isArray(msg["unbound"])) {
|
|
274
|
+
bad("V1", "'msg' must carry name, arms, and unbound");
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
msgName = msg["name"];
|
|
278
|
+
const arms = msg["arms"];
|
|
279
|
+
if (arms.length > 256)
|
|
280
|
+
bad("V6", `msg declares ${arms.length} arms — tags ride a u8, so at most 256 are permitted`);
|
|
281
|
+
for (const a of arms) {
|
|
282
|
+
if (!isDict(a) || typeof a["name"] !== "string" || !isDict(a["payload"])) {
|
|
283
|
+
bad("V1", "msg carries a malformed arm");
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
const armName = a["name"];
|
|
287
|
+
if (armDescriptors.has(armName))
|
|
288
|
+
bad("V3", `msg repeats arm '${armName}'`);
|
|
289
|
+
const d = a["payload"];
|
|
290
|
+
armDescriptors.set(armName, d);
|
|
291
|
+
switch (d["kind"]) {
|
|
292
|
+
case "void":
|
|
293
|
+
case "bytes":
|
|
294
|
+
break;
|
|
295
|
+
case "number":
|
|
296
|
+
if (d["class"] !== "f64" && d["class"] !== "i64") {
|
|
297
|
+
bad("V7", `msg arm '${armName}': number class must be "f64" or "i64"`);
|
|
298
|
+
}
|
|
299
|
+
else if (d["class"] === "i64") {
|
|
300
|
+
i64Slots.push(`${msgName}.${armName}`);
|
|
301
|
+
}
|
|
302
|
+
break;
|
|
303
|
+
case "number_bytes": {
|
|
304
|
+
const nf = d["number_field"];
|
|
305
|
+
const bf = d["bytes_field"];
|
|
306
|
+
if (typeof nf !== "string" || typeof bf !== "string" || nf === "" || bf === "" || nf === bf) {
|
|
307
|
+
bad("V7", `msg arm '${armName}': number_bytes needs distinct, non-empty number_field and bytes_field`);
|
|
308
|
+
}
|
|
309
|
+
if (d["number_class"] !== "f64" && d["number_class"] !== "i64") {
|
|
310
|
+
bad("V7", `msg arm '${armName}': number_bytes class must be "f64" or "i64"`);
|
|
311
|
+
}
|
|
312
|
+
else if (d["number_class"] === "i64" && typeof nf === "string") {
|
|
313
|
+
i64Slots.push(`${msgName}.${armName}.${nf}`);
|
|
314
|
+
}
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
case "record":
|
|
318
|
+
case "union":
|
|
319
|
+
case "enum": {
|
|
320
|
+
const name = d["name"];
|
|
321
|
+
const table = d["kind"] === "record" ? structs : d["kind"] === "union" ? unions : enums;
|
|
322
|
+
if (typeof name !== "string" || !table.has(name)) {
|
|
323
|
+
bad("V4", `msg arm '${armName}': ${String(d["kind"])} payload does not resolve to a matching table entry`);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
reachable.add(name);
|
|
327
|
+
}
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
case "scalar": {
|
|
331
|
+
const t = d["type"];
|
|
332
|
+
walkRef(t, `msg arm '${armName}' scalar payload`, null, null);
|
|
333
|
+
if (isDict(t) && (t["kind"] === "node" || t["kind"] === "value" || t["kind"] === "void")) {
|
|
334
|
+
bad("V7", `msg arm '${armName}': scalar descriptors carry a non-record, non-void TypeRef`);
|
|
335
|
+
}
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
default:
|
|
339
|
+
bad("V7", `msg arm '${armName}' carries unknown payload descriptor kind '${String(d["kind"])}'`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/* ── V5: acyclicity of the named-reference graph ──────────────────── */
|
|
344
|
+
{
|
|
345
|
+
const visiting = new Set();
|
|
346
|
+
const done = new Set();
|
|
347
|
+
const visit = (name, path) => {
|
|
348
|
+
if (done.has(name))
|
|
349
|
+
return;
|
|
350
|
+
if (visiting.has(name)) {
|
|
351
|
+
bad("V5", `the type reference graph is cyclic: ${[...path, name].join(" -> ")}`);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
visiting.add(name);
|
|
355
|
+
for (const next of edges.get(name) ?? [])
|
|
356
|
+
visit(next, [...path, name]);
|
|
357
|
+
visiting.delete(name);
|
|
358
|
+
done.add(name);
|
|
359
|
+
};
|
|
360
|
+
for (const name of edges.keys())
|
|
361
|
+
visit(name, []);
|
|
362
|
+
}
|
|
363
|
+
/* ── V8: unbound lists ────────────────────────────────────────────── */
|
|
364
|
+
const modelUnbound = doc["model_unbound"];
|
|
365
|
+
if (!Array.isArray(modelUnbound) || modelUnbound.some((x) => typeof x !== "string")) {
|
|
366
|
+
bad("V1", "'model_unbound' must be an array of strings");
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
for (const name of modelUnbound) {
|
|
370
|
+
if (!modelFields.has(name) && !helperNames.has(name)) {
|
|
371
|
+
bad("V8", `model_unbound names '${name}', which is neither a model field nor a helper entry`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
if (isDict(msg) && Array.isArray(msg["unbound"])) {
|
|
376
|
+
for (const name of msg["unbound"]) {
|
|
377
|
+
if (typeof name !== "string" || !armDescriptors.has(name)) {
|
|
378
|
+
bad("V8", `msg.unbound names '${String(name)}', which is not an arm of msg`);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/* ── abi shape (V11's document half) ──────────────────────────────── */
|
|
383
|
+
const abi = doc["abi"];
|
|
384
|
+
const exportSet = new Set();
|
|
385
|
+
if (!isDict(abi) || typeof abi["prefix"] !== "string" || !Array.isArray(abi["exports"]) || typeof abi["snapshot_format"] !== "number") {
|
|
386
|
+
bad("V1", "'abi' must carry prefix, exports, and snapshot_format");
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
for (const s of abi["exports"]) {
|
|
390
|
+
if (typeof s !== "string" || s === "") {
|
|
391
|
+
bad("V11", "abi.exports carries a non-string suffix");
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
if (exportSet.has(s))
|
|
395
|
+
bad("V11", `abi.exports repeats suffix '${s}'`);
|
|
396
|
+
exportSet.add(s);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/* ── V9: channel wiring ───────────────────────────────────────────── */
|
|
400
|
+
const channels = doc["channels"];
|
|
401
|
+
if (!isDict(channels)) {
|
|
402
|
+
bad("V1", "'channels' must be an object");
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
for (const ch of FUNCTION_CHANNELS) {
|
|
406
|
+
const v = channels[ch];
|
|
407
|
+
if (typeof v !== "boolean") {
|
|
408
|
+
bad("V1", `channels.${ch} must be a boolean`);
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
if (v !== exportSet.has(ch)) {
|
|
412
|
+
bad("V9", `channels.${ch} is ${v} but the suffix '${ch}' is ${v ? "absent from" : "present in"} abi.exports`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
for (const ch of ["appearance_msg", "chrome_msg"]) {
|
|
416
|
+
const v = channels[ch];
|
|
417
|
+
if (v === null)
|
|
418
|
+
continue;
|
|
419
|
+
if (typeof v !== "string") {
|
|
420
|
+
bad("V1", `channels.${ch} must be null or an arm name`);
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
const d = armDescriptors.get(v);
|
|
424
|
+
if (d === undefined) {
|
|
425
|
+
bad("V9", `channels.${ch} names '${v}', which is not an arm of msg`);
|
|
426
|
+
}
|
|
427
|
+
else if (d["kind"] !== "record" && d["kind"] !== "union" && d["kind"] !== "enum" && d["kind"] !== "scalar") {
|
|
428
|
+
bad("V9", `channels.${ch} names arm '${v}', whose descriptor is not of the named-type family`);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
const envMsgs = channels["env_msgs"];
|
|
432
|
+
if (!Array.isArray(envMsgs)) {
|
|
433
|
+
bad("V1", "channels.env_msgs must be an array");
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
const seenEnv = new Set();
|
|
437
|
+
for (const e of envMsgs) {
|
|
438
|
+
if (!isDict(e) || typeof e["env"] !== "string" || typeof e["msg"] !== "string") {
|
|
439
|
+
bad("V1", "channels.env_msgs carries a malformed entry");
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
if (seenEnv.has(e["env"]))
|
|
443
|
+
bad("V9", `channels.env_msgs repeats environment variable '${e["env"]}'`);
|
|
444
|
+
seenEnv.add(e["env"]);
|
|
445
|
+
const d = armDescriptors.get(e["msg"]);
|
|
446
|
+
if (d === undefined) {
|
|
447
|
+
bad("V9", `channels.env_msgs targets '${e["msg"]}', which is not an arm of msg`);
|
|
448
|
+
}
|
|
449
|
+
else if (d["kind"] !== "bytes") {
|
|
450
|
+
bad("V9", `channels.env_msgs targets arm '${e["msg"]}', whose descriptor is not {"kind": "bytes"}`);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
/* ── V4's exactness: no table entry unreachable ───────────────────── */
|
|
456
|
+
{
|
|
457
|
+
// Close reachability over the edges (walkRef marked direct hits and
|
|
458
|
+
// recorded owner edges; entries reached only through other entries
|
|
459
|
+
// close here).
|
|
460
|
+
let grew = true;
|
|
461
|
+
while (grew) {
|
|
462
|
+
grew = false;
|
|
463
|
+
for (const name of [...reachable]) {
|
|
464
|
+
for (const next of edges.get(name) ?? []) {
|
|
465
|
+
if (!reachable.has(next)) {
|
|
466
|
+
reachable.add(next);
|
|
467
|
+
grew = true;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
for (const name of [...structs.keys(), ...enums.keys(), ...unions.keys()]) {
|
|
473
|
+
if (!reachable.has(name)) {
|
|
474
|
+
bad("V4", `table entry '${name}' is unreachable from model, msg, model_helpers, and channels`);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/* ── V10: the integer-slot bijection (slice elements exempt) ──────── */
|
|
479
|
+
const integerSlots = doc["integer_slots"];
|
|
480
|
+
if (!Array.isArray(integerSlots)) {
|
|
481
|
+
bad("V1", "'integer_slots' must be an array (empty when no slot is integer-classed)");
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
const declared = new Set();
|
|
485
|
+
for (const e of integerSlots) {
|
|
486
|
+
if (!isDict(e) || typeof e["slot"] !== "string" || e["class"] !== "i64") {
|
|
487
|
+
bad("V1", "integer_slots carries a malformed entry");
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
if (declared.has(e["slot"]))
|
|
491
|
+
bad("V10", `integer_slots repeats slot '${e["slot"]}'`);
|
|
492
|
+
declared.add(e["slot"]);
|
|
493
|
+
}
|
|
494
|
+
const spelled = new Set(i64Slots);
|
|
495
|
+
for (const slot of spelled) {
|
|
496
|
+
if (!declared.has(slot))
|
|
497
|
+
bad("V10", `'${slot}' is spelled i64 but has no integer_slots entry`);
|
|
498
|
+
}
|
|
499
|
+
for (const slot of declared) {
|
|
500
|
+
if (!spelled.has(slot))
|
|
501
|
+
bad("V10", `integer_slots entry '${slot}' resolves to no slot spelled i64`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return out;
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=sidecar-validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidecar-validate.js","sourceRoot":"","sources":["../../src/library/sidecar-validate.ts"],"names":[],"mappings":"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"}
|