behavior-contracts 0.1.3 → 0.2.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.
- package/README.md +8 -2
- package/dist/authoring.d.ts +202 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.js +787 -0
- package/dist/authoring.js.map +1 -0
- package/dist/behavior.d.ts +201 -0
- package/dist/behavior.d.ts.map +1 -0
- package/dist/behavior.js +373 -0
- package/dist/behavior.js.map +1 -0
- package/dist/builder.d.ts +154 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +574 -0
- package/dist/builder.js.map +1 -0
- package/dist/generator/core.d.ts +89 -0
- package/dist/generator/core.d.ts.map +1 -0
- package/dist/generator/core.js +124 -0
- package/dist/generator/core.js.map +1 -0
- package/dist/generator/emit-go.d.ts +19 -0
- package/dist/generator/emit-go.d.ts.map +1 -0
- package/dist/generator/emit-go.js +79 -0
- package/dist/generator/emit-go.js.map +1 -0
- package/dist/generator/emit-php.d.ts +20 -0
- package/dist/generator/emit-php.d.ts.map +1 -0
- package/dist/generator/emit-php.js +76 -0
- package/dist/generator/emit-php.js.map +1 -0
- package/dist/generator/emit-python.d.ts +10 -0
- package/dist/generator/emit-python.d.ts.map +1 -0
- package/dist/generator/emit-python.js +75 -0
- package/dist/generator/emit-python.js.map +1 -0
- package/dist/generator/emit-rust.d.ts +25 -0
- package/dist/generator/emit-rust.d.ts.map +1 -0
- package/dist/generator/emit-rust.js +125 -0
- package/dist/generator/emit-rust.js.map +1 -0
- package/dist/generator/emit-typescript.d.ts +11 -0
- package/dist/generator/emit-typescript.d.ts.map +1 -0
- package/dist/generator/emit-typescript.js +68 -0
- package/dist/generator/emit-typescript.js.map +1 -0
- package/dist/generator/fingerprint.d.ts +14 -0
- package/dist/generator/fingerprint.d.ts.map +1 -0
- package/dist/generator/fingerprint.js +74 -0
- package/dist/generator/fingerprint.js.map +1 -0
- package/dist/generator/index.d.ts +9 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +25 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/literal.d.ts +8 -0
- package/dist/generator/literal.d.ts.map +1 -0
- package/dist/generator/literal.js +191 -0
- package/dist/generator/literal.js.map +1 -0
- package/dist/guard.d.ts +18 -0
- package/dist/guard.d.ts.map +1 -1
- package/dist/guard.js +130 -0
- package/dist/guard.js.map +1 -1
- package/dist/index.d.ts +14 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/plan.d.ts +36 -0
- package/dist/plan.d.ts.map +1 -1
- package/dist/plan.js +152 -14
- package/dist/plan.js.map +1 -1
- package/package.json +4 -1
package/dist/builder.js
ADDED
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
import { cmpCodePoints, FORBIDDEN_OBJECT_KEY } from "./expr-eval.js";
|
|
2
|
+
import { SPEC_VERSIONS } from "./index.js";
|
|
3
|
+
import { assertPortableComponentGraph } from "./guard.js";
|
|
4
|
+
export class BuilderFailure extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(code, message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = "BuilderFailure";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function bfail(code, message) {
|
|
13
|
+
throw new BuilderFailure(code, message);
|
|
14
|
+
}
|
|
15
|
+
/** `portableToIR: false` のエントリは可搬 IR に載せられない(両経路共通の先頭検査)。 */
|
|
16
|
+
export function checkPortableEntry(name, entry, fail) {
|
|
17
|
+
if (entry.portableToIR === false)
|
|
18
|
+
fail("NOT_PORTABLE_COMPONENT", `component '${name}' is declared portableToIR: false and cannot be referenced from portable IR`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* port 名の catalog 照合(両経路共通):
|
|
22
|
+
* - 未宣言 port はエントリが `additionalPorts: true` を宣言しない限り fail-closed で拒否
|
|
23
|
+
* (動的 port 群 — `item.<field>` 等 — を持つ write 系エントリだけが opt-in する)。
|
|
24
|
+
* - required 宣言 port の欠落は additionalPorts に関わらず拒否。
|
|
25
|
+
*/
|
|
26
|
+
export function checkPortNames(name, entry, portNames, fail) {
|
|
27
|
+
const schema = entry.inputPorts ?? {};
|
|
28
|
+
if (entry.additionalPorts !== true) {
|
|
29
|
+
for (const k of portNames)
|
|
30
|
+
if (!Object.hasOwn(schema, k))
|
|
31
|
+
fail("UNKNOWN_PORT", `component '${name}': unknown port '${k}' (catalog schema is the contract; declare it or opt in with additionalPorts: true)`);
|
|
32
|
+
}
|
|
33
|
+
for (const [k, s] of Object.entries(schema))
|
|
34
|
+
if (s.required === true && !portNames.includes(k))
|
|
35
|
+
fail("MISSING_PORT", `component '${name}': required port '${k}' is missing`);
|
|
36
|
+
}
|
|
37
|
+
/** 宣言 port の型名 → 静的に検査できるスカラ種(それ以外の型名は検査対象外)。 */
|
|
38
|
+
const SCALAR_TYPE_KINDS = {
|
|
39
|
+
string: "string",
|
|
40
|
+
number: "number",
|
|
41
|
+
int: "number",
|
|
42
|
+
float: "number",
|
|
43
|
+
boolean: "boolean",
|
|
44
|
+
bool: "boolean",
|
|
45
|
+
};
|
|
46
|
+
/** lower 済み port 値が静的スカラリテラルならその種を返す(式は null = 検査不能)。 */
|
|
47
|
+
function literalKind(v) {
|
|
48
|
+
if (typeof v === "string")
|
|
49
|
+
return "string";
|
|
50
|
+
if (typeof v === "number")
|
|
51
|
+
return "number";
|
|
52
|
+
if (typeof v === "boolean")
|
|
53
|
+
return "boolean";
|
|
54
|
+
if (v !== null && typeof v === "object" && !Array.isArray(v)) {
|
|
55
|
+
const keys = Object.keys(v);
|
|
56
|
+
if (keys.length === 1 && (keys[0] === "int" || keys[0] === "float"))
|
|
57
|
+
return "number";
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 宣言 port のスカラリテラル型検査(両経路共通・additionalPorts に関わらず適用):
|
|
63
|
+
* 宣言型がスカラ(string/number/boolean 系)で、配線値が**静的スカラリテラル**のとき
|
|
64
|
+
* のみ照合する(`{ref}` / `{concat}` 等の式は実行時型のため検査対象外)。
|
|
65
|
+
*/
|
|
66
|
+
export function checkDeclaredPortTypes(name, entry, ports, fail) {
|
|
67
|
+
for (const [k, s] of Object.entries(entry.inputPorts ?? {})) {
|
|
68
|
+
if (!Object.hasOwn(ports, k))
|
|
69
|
+
continue;
|
|
70
|
+
const want = SCALAR_TYPE_KINDS[s.type];
|
|
71
|
+
if (want === undefined)
|
|
72
|
+
continue;
|
|
73
|
+
const got = literalKind(ports[k]);
|
|
74
|
+
if (got !== null && got !== want)
|
|
75
|
+
fail("PORT_TYPE_MISMATCH", `component '${name}': port '${k}' is declared '${s.type}' but is wired a ${got} literal (declared ports are type-checked)`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ── 依存収集(recorder 経路と共有)────────────────────────────────────────────────
|
|
79
|
+
/**
|
|
80
|
+
* IR ノードを走査し、`ids` に含まれる id を root に持つ ref/refOpt の root を出現順に集める
|
|
81
|
+
* (recorder の Wire 選択・両経路の plan 導出が使う共通プリミティブ)。
|
|
82
|
+
*/
|
|
83
|
+
export function collectNodeIdRefs(node, ids, out = []) {
|
|
84
|
+
if (Array.isArray(node)) {
|
|
85
|
+
for (const e of node)
|
|
86
|
+
collectNodeIdRefs(e, ids, out);
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
if (node && typeof node === "object") {
|
|
90
|
+
const keys = Object.keys(node);
|
|
91
|
+
if (keys.length === 1 && (keys[0] === "ref" || keys[0] === "refOpt")) {
|
|
92
|
+
const path = node[keys[0]];
|
|
93
|
+
if (Array.isArray(path) && typeof path[0] === "string" && ids.has(path[0]) && !out.includes(path[0]))
|
|
94
|
+
out.push(path[0]);
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
97
|
+
for (const k of keys)
|
|
98
|
+
collectNodeIdRefs(node[k], ids, out);
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
/** body ノードの依存 id 集合(ports/over/when/cond 式の ref root + parent。`ids` 内のみ)。 */
|
|
103
|
+
function bodyNodeDeps(n, ids) {
|
|
104
|
+
const deps = [];
|
|
105
|
+
if ("map" in n) {
|
|
106
|
+
collectNodeIdRefs(n.map.over, ids, deps);
|
|
107
|
+
collectNodeIdRefs(n.map.ports, ids, deps);
|
|
108
|
+
if (n.map.when !== undefined)
|
|
109
|
+
collectNodeIdRefs(n.map.when, ids, deps);
|
|
110
|
+
if (n.map.parent !== undefined && ids.has(n.map.parent) && !deps.includes(n.map.parent))
|
|
111
|
+
deps.push(n.map.parent);
|
|
112
|
+
}
|
|
113
|
+
else if ("cond" in n) {
|
|
114
|
+
collectNodeIdRefs(n.cond.if, ids, deps);
|
|
115
|
+
collectNodeIdRefs(n.cond.then, ids, deps);
|
|
116
|
+
collectNodeIdRefs(n.cond.else, ids, deps);
|
|
117
|
+
if (n.cond.parent !== undefined && ids.has(n.cond.parent) && !deps.includes(n.cond.parent))
|
|
118
|
+
deps.push(n.cond.parent);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
collectNodeIdRefs(n.ports, ids, deps);
|
|
122
|
+
if (n.parent !== undefined && ids.has(n.parent) && !deps.includes(n.parent))
|
|
123
|
+
deps.push(n.parent);
|
|
124
|
+
}
|
|
125
|
+
return deps;
|
|
126
|
+
}
|
|
127
|
+
// ── plan 導出(依存 → stage groups。recorder 経路と共有)──────────────────────────
|
|
128
|
+
export const DEFAULT_PLAN_CONCURRENCY = 16;
|
|
129
|
+
/**
|
|
130
|
+
* 依存グラフから Execution Plan(`{groups, concurrency}`, execution-plan.md)を導出する。
|
|
131
|
+
* stage = 依存深さ(Kahn levels)。record 順が topological な recorder 経路では現行実装と
|
|
132
|
+
* 同一の結果になり、順序が任意のデータ登録経路では worklist で収束させ、循環は
|
|
133
|
+
* `DEPENDENCY_CYCLE` で fail-closed に拒否する。
|
|
134
|
+
*/
|
|
135
|
+
function derivePlanFromDeps(nodes, depsByIndex, concurrency) {
|
|
136
|
+
if (nodes.length === 0)
|
|
137
|
+
return undefined;
|
|
138
|
+
const level = new Map();
|
|
139
|
+
let pending = nodes.length;
|
|
140
|
+
while (pending > 0) {
|
|
141
|
+
let progress = false;
|
|
142
|
+
nodes.forEach((n, i) => {
|
|
143
|
+
if (level.has(n.id))
|
|
144
|
+
return;
|
|
145
|
+
let l = 0;
|
|
146
|
+
for (const d of depsByIndex[i]) {
|
|
147
|
+
const dl = d === n.id ? undefined : level.get(d);
|
|
148
|
+
if (dl === undefined) {
|
|
149
|
+
l = -1;
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
l = Math.max(l, dl + 1);
|
|
153
|
+
}
|
|
154
|
+
if (l < 0)
|
|
155
|
+
return;
|
|
156
|
+
level.set(n.id, l);
|
|
157
|
+
pending--;
|
|
158
|
+
progress = true;
|
|
159
|
+
});
|
|
160
|
+
if (!progress) {
|
|
161
|
+
const stuck = nodes.filter((n) => !level.has(n.id)).map((n) => `'${n.id}'`);
|
|
162
|
+
bfail("DEPENDENCY_CYCLE", `component body has a dependency cycle among nodes [${stuck.join(", ")}]`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const groups = [];
|
|
166
|
+
nodes.forEach((n, i) => {
|
|
167
|
+
const l = level.get(n.id);
|
|
168
|
+
(groups[l] ??= []).push(i);
|
|
169
|
+
});
|
|
170
|
+
return { groups, concurrency };
|
|
171
|
+
}
|
|
172
|
+
// ── 決定的正規化(キーソート再構築)────────────────────────────────────────────────
|
|
173
|
+
/**
|
|
174
|
+
* 全 object のキーを code-point 順(canonical-serialization.md と同じ `cmpCodePoints`)に
|
|
175
|
+
* ソートして再構築する(配列順序・値は保持。入力は変異しない)。これにより
|
|
176
|
+
* **構造的に同じ入力データ → byte 同一の出力**(`JSON.stringify` 安定)が成立する。
|
|
177
|
+
*/
|
|
178
|
+
function canonicalizeDeep(v) {
|
|
179
|
+
if (Array.isArray(v))
|
|
180
|
+
return v.map(canonicalizeDeep);
|
|
181
|
+
if (v !== null && typeof v === "object") {
|
|
182
|
+
const src = v;
|
|
183
|
+
const out = {};
|
|
184
|
+
for (const k of Object.keys(src).sort(cmpCodePoints))
|
|
185
|
+
out[k] = canonicalizeDeep(src[k]);
|
|
186
|
+
return out;
|
|
187
|
+
}
|
|
188
|
+
return v;
|
|
189
|
+
}
|
|
190
|
+
// ── 内部: 構造検証ヘルパ ───────────────────────────────────────────────────────────
|
|
191
|
+
const DEFINITION_KEYS = /* @__PURE__ */ new Set(["name", "inputPorts", "body", "output", "plan"]);
|
|
192
|
+
const REF_NODE_KEYS = /* @__PURE__ */ new Set(["id", "component", "ports", "parent", "bindField", "relationKind", "policy"]);
|
|
193
|
+
const MAP_NODE_KEYS = /* @__PURE__ */ new Set(["id", "map"]);
|
|
194
|
+
const MAP_KEYS = /* @__PURE__ */ new Set(["over", "as", "component", "ports", "when", "into", "batched", "parent", "relationKind", "policy"]);
|
|
195
|
+
const COND_NODE_KEYS = /* @__PURE__ */ new Set(["id", "cond"]);
|
|
196
|
+
const COND_KEYS = /* @__PURE__ */ new Set(["if", "then", "else", "parent"]);
|
|
197
|
+
const SCHEMA_KEYS = /* @__PURE__ */ new Set(["type", "required"]);
|
|
198
|
+
const PLAN_KEYS = /* @__PURE__ */ new Set(["groups", "concurrency"]);
|
|
199
|
+
const RELATION_KINDS = /* @__PURE__ */ new Set(["single", "connection"]);
|
|
200
|
+
const POLICY_KINDS = /* @__PURE__ */ new Set(["fail", "retry", "continue"]);
|
|
201
|
+
function isPlainObject(v) {
|
|
202
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
203
|
+
}
|
|
204
|
+
function checkAllowedKeys(rec, allowed, code, at) {
|
|
205
|
+
for (const k of Object.keys(rec))
|
|
206
|
+
if (!allowed.has(k))
|
|
207
|
+
bfail(code, `${at}: unknown key '${k}' (fail-closed)`);
|
|
208
|
+
}
|
|
209
|
+
/** runBehavior の scope / 結果 object のキーになる名前は "__proto__" を禁止(fail-closed)。 */
|
|
210
|
+
function checkScopeKeyName(name, what, at) {
|
|
211
|
+
if (typeof name !== "string" || name === "")
|
|
212
|
+
bfail("INVALID_NODE", `${at}: ${what} must be a non-empty string`);
|
|
213
|
+
if (name === FORBIDDEN_OBJECT_KEY)
|
|
214
|
+
bfail("INVALID_NODE", `${at}: ${what} "${FORBIDDEN_OBJECT_KEY}" is forbidden (fail-closed)`);
|
|
215
|
+
return name;
|
|
216
|
+
}
|
|
217
|
+
/** parent / relationKind / policy の共通検証(値は正規化ノードへ写す)。 */
|
|
218
|
+
function checkNodeWire(rec, ids, at) {
|
|
219
|
+
const out = {};
|
|
220
|
+
if (rec.parent !== undefined) {
|
|
221
|
+
if (typeof rec.parent !== "string")
|
|
222
|
+
bfail("INVALID_NODE", `${at}: 'parent' must be a node id string`);
|
|
223
|
+
if (!ids.has(rec.parent))
|
|
224
|
+
bfail("UNKNOWN_PARENT", `${at}: parent '${rec.parent}' is not a body node id`);
|
|
225
|
+
out.parent = rec.parent;
|
|
226
|
+
}
|
|
227
|
+
if (rec.relationKind !== undefined) {
|
|
228
|
+
if (typeof rec.relationKind !== "string" || !RELATION_KINDS.has(rec.relationKind))
|
|
229
|
+
bfail("INVALID_NODE", `${at}: 'relationKind' must be "single" or "connection"`);
|
|
230
|
+
out.relationKind = rec.relationKind;
|
|
231
|
+
}
|
|
232
|
+
if (rec.policy !== undefined) {
|
|
233
|
+
if (typeof rec.policy !== "string" || !POLICY_KINDS.has(rec.policy))
|
|
234
|
+
bfail("INVALID_NODE", `${at}: 'policy' must be "fail", "retry" or "continue"`);
|
|
235
|
+
out.policy = rec.policy;
|
|
236
|
+
}
|
|
237
|
+
return out;
|
|
238
|
+
}
|
|
239
|
+
function checkPortsShape(ports, at) {
|
|
240
|
+
if (!isPlainObject(ports))
|
|
241
|
+
bfail("INVALID_NODE", `${at}: 'ports' must be a plain object`);
|
|
242
|
+
for (const k of Object.keys(ports))
|
|
243
|
+
if (k === FORBIDDEN_OBJECT_KEY)
|
|
244
|
+
bfail("INVALID_NODE", `${at}: port name "${FORBIDDEN_OBJECT_KEY}" is forbidden (fail-closed)`);
|
|
245
|
+
return ports;
|
|
246
|
+
}
|
|
247
|
+
/** 1 body ノードを構造検証し、既知キーだけの正規化コピーを返す(undefined 値の optional は落とす)。 */
|
|
248
|
+
function normalizeNode(raw, ids, at) {
|
|
249
|
+
const rec = raw; // pass 1 で plain object / id は検証済み
|
|
250
|
+
const id = rec.id;
|
|
251
|
+
if (rec.map !== undefined) {
|
|
252
|
+
checkAllowedKeys(rec, MAP_NODE_KEYS, "INVALID_NODE", at);
|
|
253
|
+
if (!isPlainObject(rec.map))
|
|
254
|
+
bfail("INVALID_NODE", `${at}: 'map' must be a plain object`);
|
|
255
|
+
const m = rec.map;
|
|
256
|
+
checkAllowedKeys(m, MAP_KEYS, "INVALID_NODE", `${at}.map`);
|
|
257
|
+
if (m.over === undefined)
|
|
258
|
+
bfail("INVALID_NODE", `${at}.map: 'over' is required`);
|
|
259
|
+
const as = checkScopeKeyName(m.as, "'as'", `${at}.map`);
|
|
260
|
+
if (!as.startsWith("$") || as.length < 2)
|
|
261
|
+
bfail("INVALID_NODE", `${at}.map: 'as' must be a "$"-prefixed element binding (e.g. "$el"), got '${as}'`);
|
|
262
|
+
if (ids.has(as))
|
|
263
|
+
bfail("INVALID_NODE", `${at}.map: 'as' binding '${as}' collides with a body node id`);
|
|
264
|
+
if (typeof m.component !== "string" || m.component === "")
|
|
265
|
+
bfail("INVALID_NODE", `${at}.map: 'component' must be a non-empty catalog name string`);
|
|
266
|
+
const ports = checkPortsShape(m.ports, `${at}.map`);
|
|
267
|
+
const node = { id, map: { over: m.over, as, component: m.component, ports } };
|
|
268
|
+
if (m.when !== undefined)
|
|
269
|
+
node.map.when = m.when;
|
|
270
|
+
if (m.into !== undefined)
|
|
271
|
+
node.map.into = checkScopeKeyName(m.into, "'into'", `${at}.map`);
|
|
272
|
+
if (m.batched !== undefined) {
|
|
273
|
+
if (typeof m.batched !== "boolean")
|
|
274
|
+
bfail("INVALID_NODE", `${at}.map: 'batched' must be a boolean`);
|
|
275
|
+
node.map.batched = m.batched;
|
|
276
|
+
}
|
|
277
|
+
const wire = checkNodeWire(m, ids, `${at}.map`);
|
|
278
|
+
if (wire.parent !== undefined)
|
|
279
|
+
node.map.parent = wire.parent;
|
|
280
|
+
if (wire.relationKind !== undefined)
|
|
281
|
+
node.map.relationKind = wire.relationKind;
|
|
282
|
+
if (wire.policy !== undefined)
|
|
283
|
+
node.map.policy = wire.policy;
|
|
284
|
+
return node;
|
|
285
|
+
}
|
|
286
|
+
if (rec.cond !== undefined) {
|
|
287
|
+
checkAllowedKeys(rec, COND_NODE_KEYS, "INVALID_NODE", at);
|
|
288
|
+
if (!isPlainObject(rec.cond))
|
|
289
|
+
bfail("INVALID_NODE", `${at}: 'cond' must be a plain object`);
|
|
290
|
+
const c = rec.cond;
|
|
291
|
+
checkAllowedKeys(c, COND_KEYS, "INVALID_NODE", `${at}.cond`);
|
|
292
|
+
if (c.if === undefined)
|
|
293
|
+
bfail("INVALID_NODE", `${at}.cond: 'if' is required`);
|
|
294
|
+
if (c.then === undefined)
|
|
295
|
+
bfail("INVALID_NODE", `${at}.cond: 'then' is required (use null for an empty branch)`);
|
|
296
|
+
if (c.else === undefined)
|
|
297
|
+
bfail("INVALID_NODE", `${at}.cond: 'else' is required (use null for an empty branch)`);
|
|
298
|
+
const node = { id, cond: { if: c.if, then: c.then, else: c.else } };
|
|
299
|
+
// relationKind / policy は COND_KEYS に無い(cond ノードには適用されない — 上の
|
|
300
|
+
// checkAllowedKeys が拒否済み)。ここで検証するのは parent のみ。
|
|
301
|
+
const wire = checkNodeWire(c, ids, `${at}.cond`);
|
|
302
|
+
if (wire.parent !== undefined)
|
|
303
|
+
node.cond.parent = wire.parent;
|
|
304
|
+
return node;
|
|
305
|
+
}
|
|
306
|
+
if (rec.component !== undefined) {
|
|
307
|
+
checkAllowedKeys(rec, REF_NODE_KEYS, "INVALID_NODE", at);
|
|
308
|
+
if (typeof rec.component !== "string" || rec.component === "")
|
|
309
|
+
bfail("INVALID_NODE", `${at}: 'component' must be a non-empty catalog name string`);
|
|
310
|
+
const ports = checkPortsShape(rec.ports, at);
|
|
311
|
+
const node = { id, component: rec.component, ports };
|
|
312
|
+
const wire = checkNodeWire(rec, ids, at);
|
|
313
|
+
if (wire.parent !== undefined)
|
|
314
|
+
node.parent = wire.parent;
|
|
315
|
+
if (rec.bindField !== undefined) {
|
|
316
|
+
if (typeof rec.bindField !== "string" || rec.bindField === "")
|
|
317
|
+
bfail("INVALID_NODE", `${at}: 'bindField' must be a non-empty string`);
|
|
318
|
+
node.bindField = rec.bindField;
|
|
319
|
+
}
|
|
320
|
+
if (wire.relationKind !== undefined)
|
|
321
|
+
node.relationKind = wire.relationKind;
|
|
322
|
+
if (wire.policy !== undefined)
|
|
323
|
+
node.policy = wire.policy;
|
|
324
|
+
return node;
|
|
325
|
+
}
|
|
326
|
+
bfail("INVALID_NODE", `${at}: body node must be componentRef ('component'), 'map' or 'cond'`);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Expression IR を走査し、`ref`/`refOpt` の root が「body ノード id / 宣言 input port /
|
|
330
|
+
* `binding`(その map 自身の `as`)」のいずれかであることを検証する(fail-closed
|
|
331
|
+
* `UNKNOWN_REF`)。node id root は依存として収集する(plan 導出・供給 plan 検証に使う)。
|
|
332
|
+
*/
|
|
333
|
+
function walkRefs(node, binding, ctx, at) {
|
|
334
|
+
if (node === null || typeof node !== "object")
|
|
335
|
+
return;
|
|
336
|
+
if (Array.isArray(node)) {
|
|
337
|
+
node.forEach((e, i) => walkRefs(e, binding, ctx, `${at}[${i}]`));
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const rec = node;
|
|
341
|
+
const keys = Object.keys(rec);
|
|
342
|
+
if (keys.length === 1) {
|
|
343
|
+
const op = keys[0];
|
|
344
|
+
const arg = rec[op];
|
|
345
|
+
if (op === "ref" || op === "refOpt") {
|
|
346
|
+
if (!Array.isArray(arg) || arg.length === 0 || arg.some((s) => typeof s !== "string"))
|
|
347
|
+
bfail("UNKNOWN_REF", `${at}: '${op}' path must be a non-empty array of strings`);
|
|
348
|
+
const root = arg[0];
|
|
349
|
+
if (ctx.ids.has(root)) {
|
|
350
|
+
ctx.addDep(root);
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
if (ctx.inputs.has(root) || (binding !== null && root === binding))
|
|
354
|
+
return;
|
|
355
|
+
bfail("UNKNOWN_REF", `${at}: reference root '${root}' is not a body node id, a declared input port${binding !== null ? `, or the map binding '${binding}'` : ""} (fail-closed)`);
|
|
356
|
+
}
|
|
357
|
+
if (op === "obj") {
|
|
358
|
+
// obj の arg キーは operator ではなく data — 値だけを式として再帰(guard と同じ規約)。
|
|
359
|
+
if (isPlainObject(arg))
|
|
360
|
+
for (const [k, v] of Object.entries(arg))
|
|
361
|
+
walkRefs(v, binding, ctx, `${at}.obj.${k}`);
|
|
362
|
+
return; // 不正な obj arg は guard が拒否する
|
|
363
|
+
}
|
|
364
|
+
if (op === "int" || op === "float")
|
|
365
|
+
return; // リテラルラッパ
|
|
366
|
+
walkRefs(arg, binding, ctx, `${at}.${op}`);
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
for (const [k, v] of Object.entries(rec))
|
|
370
|
+
walkRefs(v, binding, ctx, `${at}.${k}`);
|
|
371
|
+
}
|
|
372
|
+
/** 1 body ノードの全式位置を検証し、依存 id(ref root + parent)を返す。 */
|
|
373
|
+
function nodeRefsAndDeps(n, ids, inputs, at) {
|
|
374
|
+
const deps = [];
|
|
375
|
+
const ctx = {
|
|
376
|
+
ids,
|
|
377
|
+
inputs,
|
|
378
|
+
addDep: (d) => {
|
|
379
|
+
if (!deps.includes(d))
|
|
380
|
+
deps.push(d);
|
|
381
|
+
},
|
|
382
|
+
};
|
|
383
|
+
if ("map" in n) {
|
|
384
|
+
walkRefs(n.map.over, null, ctx, `${at}.map.over`); // over は束縛の外で評価される
|
|
385
|
+
walkRefs(n.map.ports, n.map.as, ctx, `${at}.map.ports`);
|
|
386
|
+
if (n.map.when !== undefined)
|
|
387
|
+
walkRefs(n.map.when, n.map.as, ctx, `${at}.map.when`);
|
|
388
|
+
if (n.map.parent !== undefined && !deps.includes(n.map.parent))
|
|
389
|
+
deps.push(n.map.parent);
|
|
390
|
+
}
|
|
391
|
+
else if ("cond" in n) {
|
|
392
|
+
walkRefs(n.cond.if, null, ctx, `${at}.cond.if`);
|
|
393
|
+
walkRefs(n.cond.then, null, ctx, `${at}.cond.then`);
|
|
394
|
+
walkRefs(n.cond.else, null, ctx, `${at}.cond.else`);
|
|
395
|
+
if (n.cond.parent !== undefined && !deps.includes(n.cond.parent))
|
|
396
|
+
deps.push(n.cond.parent);
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
walkRefs(n.ports, null, ctx, `${at}.ports`);
|
|
400
|
+
if (n.parent !== undefined && !deps.includes(n.parent))
|
|
401
|
+
deps.push(n.parent);
|
|
402
|
+
}
|
|
403
|
+
return deps;
|
|
404
|
+
}
|
|
405
|
+
// ── 内部: 供給 plan の検証 ───────────────────────────────────────────────────────────
|
|
406
|
+
function validateSuppliedPlan(raw, body, depsByIndex) {
|
|
407
|
+
if (!isPlainObject(raw))
|
|
408
|
+
bfail("INVALID_PLAN", "'plan' must be an object, null (no plan) or omitted (derived)");
|
|
409
|
+
checkAllowedKeys(raw, PLAN_KEYS, "INVALID_PLAN", "plan");
|
|
410
|
+
const { groups, concurrency } = raw;
|
|
411
|
+
if (typeof concurrency !== "number" || !Number.isSafeInteger(concurrency) || concurrency < 1)
|
|
412
|
+
bfail("INVALID_PLAN", "plan.concurrency must be a positive integer");
|
|
413
|
+
if (!Array.isArray(groups))
|
|
414
|
+
bfail("INVALID_PLAN", "plan.groups must be an array of stages");
|
|
415
|
+
const n = body.length;
|
|
416
|
+
const stageOf = new Array(n);
|
|
417
|
+
const seen = new Set();
|
|
418
|
+
groups.forEach((stage, s) => {
|
|
419
|
+
if (!Array.isArray(stage))
|
|
420
|
+
bfail("INVALID_PLAN", `plan.groups[${s}] must be an array of body indexes`);
|
|
421
|
+
for (const i of stage) {
|
|
422
|
+
if (typeof i !== "number" || !Number.isSafeInteger(i) || i < 0 || i >= n)
|
|
423
|
+
bfail("INVALID_PLAN", `plan.groups[${s}]: index ${String(i)} out of range [0,${n})`);
|
|
424
|
+
if (seen.has(i))
|
|
425
|
+
bfail("INVALID_PLAN", `plan: body index ${i} appears in more than one stage`);
|
|
426
|
+
seen.add(i);
|
|
427
|
+
stageOf[i] = s;
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
if (seen.size !== n)
|
|
431
|
+
bfail("INVALID_PLAN", `plan does not cover all ${n} body nodes (covered ${seen.size})`);
|
|
432
|
+
const idToIndex = new Map(body.map((node, i) => [node.id, i]));
|
|
433
|
+
body.forEach((node, i) => {
|
|
434
|
+
for (const d of depsByIndex[i]) {
|
|
435
|
+
const di = idToIndex.get(d);
|
|
436
|
+
if (stageOf[di] >= stageOf[i])
|
|
437
|
+
bfail("INVALID_PLAN", `plan: node '${node.id}' (stage ${stageOf[i]}) depends on '${d}' (stage ${stageOf[di]}) — dependencies must be staged earlier`);
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
return { groups: groups.map((stage) => [...stage]), concurrency };
|
|
441
|
+
}
|
|
442
|
+
// ── core(recorder 経路と共有される単一実装 — B-3)────────────────────────────────────
|
|
443
|
+
/**
|
|
444
|
+
* buildComponentCore — 検証・plan 導出・正規化・Guard の単一実装。
|
|
445
|
+
* `buildComponentDefinition`(データ登録 IF、catalog 必須)と `compileBehaviors`
|
|
446
|
+
* (recorder 経路 — catalog port 照合は record 時に共有関数で済ませているため
|
|
447
|
+
* `catalog` なし)の両方がこの core を通る。
|
|
448
|
+
*/
|
|
449
|
+
export function buildComponentCore(data, opts) {
|
|
450
|
+
if (!isPlainObject(data))
|
|
451
|
+
bfail("INVALID_DEFINITION", "component definition must be a plain object");
|
|
452
|
+
const rec = data;
|
|
453
|
+
checkAllowedKeys(rec, DEFINITION_KEYS, "INVALID_DEFINITION", "definition");
|
|
454
|
+
if (typeof rec.name !== "string" || rec.name === "")
|
|
455
|
+
bfail("INVALID_DEFINITION", "component 'name' must be a non-empty string");
|
|
456
|
+
const name = rec.name;
|
|
457
|
+
if (rec.output === undefined)
|
|
458
|
+
bfail("INVALID_DEFINITION", `component '${name}': 'output' is required (use null for no output)`);
|
|
459
|
+
// inputPorts(省略時 {}。PortSchema を既知キーだけで正規化コピー)。
|
|
460
|
+
const inputPorts = {};
|
|
461
|
+
if (rec.inputPorts !== undefined) {
|
|
462
|
+
if (!isPlainObject(rec.inputPorts))
|
|
463
|
+
bfail("INVALID_DEFINITION", `component '${name}': 'inputPorts' must be an object`);
|
|
464
|
+
for (const [k, s] of Object.entries(rec.inputPorts)) {
|
|
465
|
+
if (k === FORBIDDEN_OBJECT_KEY)
|
|
466
|
+
bfail("INVALID_DEFINITION", `component '${name}': input port name "${FORBIDDEN_OBJECT_KEY}" is forbidden (fail-closed)`);
|
|
467
|
+
if (!isPlainObject(s))
|
|
468
|
+
bfail("INVALID_DEFINITION", `component '${name}': inputPorts['${k}'] must be an object`);
|
|
469
|
+
checkAllowedKeys(s, SCHEMA_KEYS, "INVALID_DEFINITION", `component '${name}': inputPorts['${k}']`);
|
|
470
|
+
if (typeof s.type !== "string")
|
|
471
|
+
bfail("INVALID_DEFINITION", `component '${name}': inputPorts['${k}'].type must be a string`);
|
|
472
|
+
if (s.required !== undefined && typeof s.required !== "boolean")
|
|
473
|
+
bfail("INVALID_DEFINITION", `component '${name}': inputPorts['${k}'].required must be a boolean`);
|
|
474
|
+
inputPorts[k] = s.required !== undefined ? { type: s.type, required: s.required } : { type: s.type };
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
// body — pass 1: id の一意性と scope 衝突(runBehavior の flat scope は input と node 結果を
|
|
478
|
+
// 同居させるため、id と input port 名の衝突は黙った shadowing になる — fail-closed で拒否)。
|
|
479
|
+
if (!Array.isArray(rec.body))
|
|
480
|
+
bfail("INVALID_DEFINITION", `component '${name}': 'body' must be an array`);
|
|
481
|
+
const ids = new Set();
|
|
482
|
+
rec.body.forEach((raw, i) => {
|
|
483
|
+
if (!isPlainObject(raw))
|
|
484
|
+
bfail("INVALID_NODE", `body[${i}]: node must be a plain object`);
|
|
485
|
+
const id = checkScopeKeyName(raw.id, "node 'id'", `body[${i}]`);
|
|
486
|
+
if (ids.has(id))
|
|
487
|
+
bfail("DUPLICATE_NODE_ID", `body[${i}]: duplicate node id '${id}'`);
|
|
488
|
+
if (Object.hasOwn(inputPorts, id))
|
|
489
|
+
bfail("INVALID_NODE", `body[${i}]: node id '${id}' collides with an input port name (the runBehavior scope would be ambiguous)`);
|
|
490
|
+
ids.add(id);
|
|
491
|
+
});
|
|
492
|
+
// body — pass 2: ノード構造の正規化コピー。
|
|
493
|
+
const body = rec.body.map((raw, i) => normalizeNode(raw, ids, `body[${i}]`));
|
|
494
|
+
// catalog 照合(データ登録経路。recorder 経路は record 時に同じ共有関数で照合済み)。
|
|
495
|
+
if (opts.catalog !== undefined) {
|
|
496
|
+
const catalog = opts.catalog;
|
|
497
|
+
body.forEach((n, i) => {
|
|
498
|
+
const cname = "map" in n ? n.map.component : "cond" in n ? null : n.component;
|
|
499
|
+
if (cname === null)
|
|
500
|
+
return;
|
|
501
|
+
const ports = "map" in n ? n.map.ports : n.ports;
|
|
502
|
+
if (!Object.hasOwn(catalog, cname))
|
|
503
|
+
bfail("UNKNOWN_COMPONENT", `body[${i}]: component '${cname}' is not in the catalog (fail-closed)`);
|
|
504
|
+
const entry = catalog[cname];
|
|
505
|
+
checkPortableEntry(cname, entry, bfail);
|
|
506
|
+
checkPortNames(cname, entry, Object.keys(ports), bfail);
|
|
507
|
+
checkDeclaredPortTypes(cname, entry, ports, bfail);
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
// 参照 root の実在検証 + 依存収集(ports/over/when/cond/output の全式位置)。
|
|
511
|
+
const inputs = new Set(Object.keys(inputPorts));
|
|
512
|
+
const depsByIndex = body.map((n, i) => nodeRefsAndDeps(n, ids, inputs, `body[${i}]`));
|
|
513
|
+
walkRefs(rec.output, null, { ids, inputs, addDep: () => { } }, "output");
|
|
514
|
+
// plan: 供給値を検証 / 省略時は依存から導出 / null は plan なし。
|
|
515
|
+
let plan;
|
|
516
|
+
if (rec.plan === null)
|
|
517
|
+
plan = undefined;
|
|
518
|
+
else if (rec.plan === undefined)
|
|
519
|
+
plan = derivePlanFromDeps(body, depsByIndex, opts.concurrency);
|
|
520
|
+
else
|
|
521
|
+
plan = validateSuppliedPlan(rec.plan, body, depsByIndex);
|
|
522
|
+
// 決定的正規化(全 object キーを code-point 順に再構築)→ Guard 自己検査。
|
|
523
|
+
const assembled = { name, inputPorts, body, output: rec.output };
|
|
524
|
+
if (plan !== undefined)
|
|
525
|
+
assembled.plan = plan;
|
|
526
|
+
const component = canonicalizeDeep(assembled);
|
|
527
|
+
assertPortableComponentGraph({ irVersion: 1, exprVersion: SPEC_VERSIONS.expression, components: [component] });
|
|
528
|
+
return component;
|
|
529
|
+
}
|
|
530
|
+
// ── データ登録 IF(B-1)──────────────────────────────────────────────────────────────
|
|
531
|
+
/**
|
|
532
|
+
* buildComponentDefinition — 事前合成されたグラフ**データ**を受け取り、検証済み・正準化
|
|
533
|
+
* 済みの `Component`(`components[]` エントリ)を返す(bc#26 のデータ登録 IF)。
|
|
534
|
+
*
|
|
535
|
+
* evaluation-mode recorder(`compileBehaviors`)とは独立: source scan は適用されず、
|
|
536
|
+
* 抽出ロジック(model → グラフ導出)は consumer 側に残る。検証・正規化の規則は
|
|
537
|
+
* モジュール docstring(B-2)を参照。
|
|
538
|
+
*
|
|
539
|
+
* ```ts
|
|
540
|
+
* const component = buildComponentDefinition(
|
|
541
|
+
* {
|
|
542
|
+
* name: "ArticleWithTagsRead__get",
|
|
543
|
+
* inputPorts: { articleId: { type: "string", required: true } },
|
|
544
|
+
* body: [
|
|
545
|
+
* { id: "root", component: "GetItem",
|
|
546
|
+
* ports: { table: "T", PK: { concat: ["ARTICLE#", { ref: ["articleId"] }] }, SK: "META" } },
|
|
547
|
+
* { id: "tags.items",
|
|
548
|
+
* map: { over: { ref: ["root", "tagRefs"] }, as: "$tagId", component: "BatchGetItem",
|
|
549
|
+
* ports: { table: "T", PK: { concat: ["TAG#", { ref: ["$tagId", "tagId"] }] } },
|
|
550
|
+
* parent: "root", relationKind: "connection", batched: true } },
|
|
551
|
+
* ],
|
|
552
|
+
* output: { obj: { root: { ref: ["root"] }, tags: { ref: ["tags.items"] } } },
|
|
553
|
+
* plan: { groups: [[0], [1]], concurrency: 16 },
|
|
554
|
+
* },
|
|
555
|
+
* { catalog },
|
|
556
|
+
* );
|
|
557
|
+
* // 実行: runBehavior({ irVersion: 1, exprVersion: SPEC_VERSIONS.expression,
|
|
558
|
+
* // components: [component] }, handlers, input)
|
|
559
|
+
* ```
|
|
560
|
+
*
|
|
561
|
+
* @throws {BuilderFailure} 検証違反(コードは {@link BuilderFailureCode})。
|
|
562
|
+
* @throws {PortabilityError} Guard 自己検査(`assertPortableComponentGraph`)の違反。
|
|
563
|
+
*/
|
|
564
|
+
export function buildComponentDefinition(data, options) {
|
|
565
|
+
if (!isPlainObject(options) || !isPlainObject(options.catalog))
|
|
566
|
+
bfail("INVALID_DEFINITION", "buildComponentDefinition requires options.catalog (fail-closed: component references cannot be validated without a catalog)");
|
|
567
|
+
if (options.concurrency !== undefined && (!Number.isSafeInteger(options.concurrency) || options.concurrency < 1))
|
|
568
|
+
bfail("INVALID_DEFINITION", "options.concurrency must be a positive integer");
|
|
569
|
+
return buildComponentCore(data, {
|
|
570
|
+
catalog: options.catalog,
|
|
571
|
+
concurrency: options.concurrency ?? DEFAULT_PLAN_CONCURRENCY,
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
|