litedbmodel 1.2.9 → 2.0.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.
Files changed (88) hide show
  1. package/README.md +1 -1
  2. package/dist/DBModel.d.ts.map +1 -1
  3. package/dist/DBModel.js +6 -0
  4. package/dist/DBModel.js.map +1 -1
  5. package/dist/scp/authoring-sql.d.ts +56 -0
  6. package/dist/scp/authoring-sql.d.ts.map +1 -0
  7. package/dist/scp/authoring-sql.js +83 -0
  8. package/dist/scp/authoring-sql.js.map +1 -0
  9. package/dist/scp/authoring.d.ts +155 -0
  10. package/dist/scp/authoring.d.ts.map +1 -0
  11. package/dist/scp/authoring.js +162 -0
  12. package/dist/scp/authoring.js.map +1 -0
  13. package/dist/scp/bridge.d.ts +64 -0
  14. package/dist/scp/bridge.d.ts.map +1 -0
  15. package/dist/scp/bridge.js +329 -0
  16. package/dist/scp/bridge.js.map +1 -0
  17. package/dist/scp/catalog.d.ts +91 -0
  18. package/dist/scp/catalog.d.ts.map +1 -0
  19. package/dist/scp/catalog.js +203 -0
  20. package/dist/scp/catalog.js.map +1 -0
  21. package/dist/scp/codegen.d.ts +131 -0
  22. package/dist/scp/codegen.d.ts.map +1 -0
  23. package/dist/scp/codegen.js +137 -0
  24. package/dist/scp/codegen.js.map +1 -0
  25. package/dist/scp/compile-dialect.d.ts +39 -0
  26. package/dist/scp/compile-dialect.d.ts.map +1 -0
  27. package/dist/scp/compile-dialect.js +62 -0
  28. package/dist/scp/compile-dialect.js.map +1 -0
  29. package/dist/scp/compile-sqlite.d.ts +114 -0
  30. package/dist/scp/compile-sqlite.d.ts.map +1 -0
  31. package/dist/scp/compile-sqlite.js +149 -0
  32. package/dist/scp/compile-sqlite.js.map +1 -0
  33. package/dist/scp/dialect.d.ts +141 -0
  34. package/dist/scp/dialect.d.ts.map +1 -0
  35. package/dist/scp/dialect.js +194 -0
  36. package/dist/scp/dialect.js.map +1 -0
  37. package/dist/scp/errors.d.ts +36 -0
  38. package/dist/scp/errors.d.ts.map +1 -0
  39. package/dist/scp/errors.js +72 -0
  40. package/dist/scp/errors.js.map +1 -0
  41. package/dist/scp/guard.d.ts +47 -0
  42. package/dist/scp/guard.d.ts.map +1 -0
  43. package/dist/scp/guard.js +137 -0
  44. package/dist/scp/guard.js.map +1 -0
  45. package/dist/scp/index.cjs +4744 -0
  46. package/dist/scp/index.d.ts +49 -0
  47. package/dist/scp/index.d.ts.map +1 -0
  48. package/dist/scp/index.js +164 -0
  49. package/dist/scp/index.js.map +1 -0
  50. package/dist/scp/index.mjs +2000 -0
  51. package/dist/scp/ir.d.ts +92 -0
  52. package/dist/scp/ir.d.ts.map +1 -0
  53. package/dist/scp/ir.js +28 -0
  54. package/dist/scp/ir.js.map +1 -0
  55. package/dist/scp/relation.d.ts +136 -0
  56. package/dist/scp/relation.d.ts.map +1 -0
  57. package/dist/scp/relation.js +191 -0
  58. package/dist/scp/relation.js.map +1 -0
  59. package/dist/scp/render.d.ts +40 -0
  60. package/dist/scp/render.d.ts.map +1 -0
  61. package/dist/scp/render.js +170 -0
  62. package/dist/scp/render.js.map +1 -0
  63. package/dist/scp/runtime.d.ts +295 -0
  64. package/dist/scp/runtime.d.ts.map +1 -0
  65. package/dist/scp/runtime.js +665 -0
  66. package/dist/scp/runtime.js.map +1 -0
  67. package/dist/scp/typed-object.d.ts +88 -0
  68. package/dist/scp/typed-object.d.ts.map +1 -0
  69. package/dist/scp/typed-object.js +163 -0
  70. package/dist/scp/typed-object.js.map +1 -0
  71. package/dist/scp/write-plan.d.ts +161 -0
  72. package/dist/scp/write-plan.d.ts.map +1 -0
  73. package/dist/scp/write-plan.js +528 -0
  74. package/dist/scp/write-plan.js.map +1 -0
  75. package/dist/scp/write-runtime.d.ts +80 -0
  76. package/dist/scp/write-runtime.d.ts.map +1 -0
  77. package/dist/scp/write-runtime.js +167 -0
  78. package/dist/scp/write-runtime.js.map +1 -0
  79. package/dist/scp/writes.d.ts +251 -0
  80. package/dist/scp/writes.d.ts.map +1 -0
  81. package/dist/scp/writes.js +176 -0
  82. package/dist/scp/writes.js.map +1 -0
  83. package/docs/proposal/contracts-architecture-feasibility.md +328 -0
  84. package/docs/proposal/contracts-architecture.md +579 -0
  85. package/docs/proposal/litedbmodel-v2-scp-architecture.md +382 -0
  86. package/docs/proposal/sql-dynamic-expansion-spec.md +175 -0
  87. package/package.json +27 -5
  88. package/docs/README_REVIEW.md +0 -23
@@ -0,0 +1,47 @@
1
+ /**
2
+ * litedbmodel v2 SCP — param/fragment portability guard (WS1, #21).
3
+ *
4
+ * Fail-closed enforcement of the hard rule: every Expression IR node this backend emits
5
+ * (param slots, fragment `when` guards) uses ONLY bc's closed operator set
6
+ * (`PORTABLE_EXPR_OPERATORS`). A single-key object whose key is not a known operator is
7
+ * an un-lowerable construct — it must go through the Raw SQL escape hatch (spec §13), NOT
8
+ * a fake opcode. This wraps bc's `assertPortable` (no functions/Date/Promise residue)
9
+ * plus the operator-set check.
10
+ */
11
+ import { type Component, type ComponentGraphIR } from 'behavior-contracts';
12
+ import type { CompiledOperation, ExprNode } from './ir';
13
+ /**
14
+ * Assert one Expression IR node is portable: no residue (functions/Date/…) and every
15
+ * operator-node key is in bc's closed set. Literals (number/string/bool/null) and arrays
16
+ * pass structurally.
17
+ *
18
+ * A single-key object is an OPERATOR node only when its key is a known operator
19
+ * (∈ {@link PORTABLE_EXPR_OPERATORS}); its value is then recursed as operator args. A
20
+ * single-key object whose key is NOT a known operator is a real portability violation and
21
+ * is rejected fail-closed (an un-lowerable pseudo-opcode → must use the Raw SQL escape
22
+ * hatch, spec §13). This mirrors bc's `assertPortableComponentGraph` operator-position
23
+ * semantics exactly — see {@link walkExpr} for the `obj` field-map special case.
24
+ */
25
+ export declare function assertExprPortable(node: ExprNode, path?: string): void;
26
+ /**
27
+ * Assert a whole compiled operation emits only portable Expression IR (static params +
28
+ * fragment tree). Throws {@link PortabilityError} on the first non-portable construct.
29
+ */
30
+ export declare function assertOperationPortable(op: CompiledOperation): void;
31
+ /**
32
+ * Assert every Expression IR node in ONE lowered component's port wiring is portable
33
+ * (WS2 AC). Walks every `componentRef`/`map` node's `ports` (and `map.over` / `map.when`)
34
+ * and every `cond` node's `if`/`then`/`else`, applying {@link assertExprPortable} — so any
35
+ * operator outside bc's closed set is rejected fail-closed at compile time. This is the
36
+ * litedbmodel-owned portability layer the authoring lower path auto-applies, over and
37
+ * above bc's own `assertPortableComponentGraph` self-check.
38
+ */
39
+ export declare function assertComponentPortable(component: Component): void;
40
+ /**
41
+ * Assert every component of a lowered Component-graph IR is portable (WS2 AC). The
42
+ * authoring lower path ({@link publishBehaviors} / {@link compileEager}) invokes this
43
+ * automatically so a non-portable opcode anywhere in the emitted IR is a fail-closed
44
+ * compile error. Throws {@link PortabilityError} on the first violation.
45
+ */
46
+ export declare function assertComponentGraphPortable(ir: ComponentGraphIR): void;
47
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/scp/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAmF,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5J,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAA0B,MAAM,MAAM,CAAC;AAEhF;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,SAAM,GAAG,IAAI,CAGnE;AAwDD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAGnE;AAID;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAgBlE;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAEvE"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ /**
3
+ * litedbmodel v2 SCP — param/fragment portability guard (WS1, #21).
4
+ *
5
+ * Fail-closed enforcement of the hard rule: every Expression IR node this backend emits
6
+ * (param slots, fragment `when` guards) uses ONLY bc's closed operator set
7
+ * (`PORTABLE_EXPR_OPERATORS`). A single-key object whose key is not a known operator is
8
+ * an un-lowerable construct — it must go through the Raw SQL escape hatch (spec §13), NOT
9
+ * a fake opcode. This wraps bc's `assertPortable` (no functions/Date/Promise residue)
10
+ * plus the operator-set check.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.assertExprPortable = assertExprPortable;
14
+ exports.assertOperationPortable = assertOperationPortable;
15
+ exports.assertComponentPortable = assertComponentPortable;
16
+ exports.assertComponentGraphPortable = assertComponentGraphPortable;
17
+ const behavior_contracts_1 = require("behavior-contracts");
18
+ /**
19
+ * Assert one Expression IR node is portable: no residue (functions/Date/…) and every
20
+ * operator-node key is in bc's closed set. Literals (number/string/bool/null) and arrays
21
+ * pass structurally.
22
+ *
23
+ * A single-key object is an OPERATOR node only when its key is a known operator
24
+ * (∈ {@link PORTABLE_EXPR_OPERATORS}); its value is then recursed as operator args. A
25
+ * single-key object whose key is NOT a known operator is a real portability violation and
26
+ * is rejected fail-closed (an un-lowerable pseudo-opcode → must use the Raw SQL escape
27
+ * hatch, spec §13). This mirrors bc's `assertPortableComponentGraph` operator-position
28
+ * semantics exactly — see {@link walkExpr} for the `obj` field-map special case.
29
+ */
30
+ function assertExprPortable(node, path = '$') {
31
+ (0, behavior_contracts_1.assertPortable)(node, path);
32
+ walkExpr(node, path);
33
+ }
34
+ function walkExpr(node, path) {
35
+ if (node === null || typeof node !== 'object')
36
+ return;
37
+ if (Array.isArray(node)) {
38
+ node.forEach((el, i) => walkExpr(el, `${path}[${i}]`));
39
+ return;
40
+ }
41
+ const keys = Object.keys(node);
42
+ if (keys.length === 1) {
43
+ // Single-key object = OPERATOR-position node. The key must be a known opcode
44
+ // (fail-closed on unknown opcodes — a real portability violation).
45
+ const op = keys[0];
46
+ if (!behavior_contracts_1.PORTABLE_EXPR_OPERATORS.has(op)) {
47
+ throw new behavior_contracts_1.PortabilityError(path, `Portability Guard: '${op}' is not a portable Expression IR operator (closed set: ${[...behavior_contracts_1.PORTABLE_EXPR_OPERATORS].join(', ')})`);
48
+ }
49
+ const arg = node[op];
50
+ // `obj` is the construction node: its arg is a FIELD MAP whose KEYS are data field
51
+ // names (NOT opcodes) and whose VALUES are ExprNodes. Recurse into the values ONLY —
52
+ // never apply the operator heuristic to the field map itself (aligns with bc's
53
+ // assertPortableExpr / evaluate() so a single-field {obj:{one:…}} is not misread as an
54
+ // unknown opcode). See behavior-contracts guard.ts `op === "obj"` branch.
55
+ if (op === 'obj') {
56
+ if (arg === null || typeof arg !== 'object' || Array.isArray(arg)) {
57
+ throw new behavior_contracts_1.PortabilityError(`${path}.obj`, `Portability Guard: {obj: ...} expects an object (at ${path}.obj)`);
58
+ }
59
+ for (const [k, v] of Object.entries(arg)) {
60
+ // Static fail-closed (defense-in-depth): own key "__proto__" is rejected here as it
61
+ // is by bc's guard/evaluator (prototype pollution / cross-language divergence).
62
+ if (k === behavior_contracts_1.FORBIDDEN_OBJECT_KEY) {
63
+ throw new behavior_contracts_1.PortabilityError(`${path}.obj`, `Portability Guard: object key "${behavior_contracts_1.FORBIDDEN_OBJECT_KEY}" is forbidden (fail-closed) at ${path}.obj`);
64
+ }
65
+ walkExpr(v, `${path}.obj.${k}`);
66
+ }
67
+ return;
68
+ }
69
+ // Any other operator: recurse its arg (array of args or a nested expr node).
70
+ walkExpr(arg, `${path}.${op}`);
71
+ return;
72
+ }
73
+ // Multi-key objects are not operator nodes (operator nodes are single-key). Recurse each
74
+ // value structurally so nested operator nodes are still checked (assertPortable above has
75
+ // already rejected any function/Date/Promise residue across the whole subtree).
76
+ for (const k of keys)
77
+ walkExpr(node[k], `${path}.${k}`);
78
+ }
79
+ /** Assert a fragment (and its slots + `when`) emits only portable Expression IR. */
80
+ function assertFragmentPortable(node, path) {
81
+ if ('connector' in node) {
82
+ node.fragments.forEach((f, i) => assertFragmentPortable(f, `${path}.fragments[${i}]`));
83
+ return;
84
+ }
85
+ if (node.when !== undefined)
86
+ assertExprPortable(node.when, `${path}.when`);
87
+ node.params.forEach((p, i) => assertExprPortable(p, `${path}.params[${i}]`));
88
+ }
89
+ /**
90
+ * Assert a whole compiled operation emits only portable Expression IR (static params +
91
+ * fragment tree). Throws {@link PortabilityError} on the first non-portable construct.
92
+ */
93
+ function assertOperationPortable(op) {
94
+ op.params.forEach((p, i) => assertExprPortable(p, `$.params[${i}]`));
95
+ if (op.where !== null)
96
+ assertFragmentPortable(op.where, '$.where');
97
+ }
98
+ // ── Authoring→IR lower guard (WS2, #22 — auto-applied on the single compile path) ─────
99
+ /**
100
+ * Assert every Expression IR node in ONE lowered component's port wiring is portable
101
+ * (WS2 AC). Walks every `componentRef`/`map` node's `ports` (and `map.over` / `map.when`)
102
+ * and every `cond` node's `if`/`then`/`else`, applying {@link assertExprPortable} — so any
103
+ * operator outside bc's closed set is rejected fail-closed at compile time. This is the
104
+ * litedbmodel-owned portability layer the authoring lower path auto-applies, over and
105
+ * above bc's own `assertPortableComponentGraph` self-check.
106
+ */
107
+ function assertComponentPortable(component) {
108
+ const at = `component '${component.name}'`;
109
+ for (const n of component.body) {
110
+ if ('map' in n) {
111
+ assertExprPortable(n.map.over, `${at}/${n.id}.map.over`);
112
+ assertExprPortable(n.map.ports, `${at}/${n.id}.map.ports`);
113
+ if (n.map.when !== undefined)
114
+ assertExprPortable(n.map.when, `${at}/${n.id}.map.when`);
115
+ }
116
+ else if ('cond' in n) {
117
+ assertExprPortable(n.cond.if, `${at}/${n.id}.cond.if`);
118
+ assertExprPortable(n.cond.then, `${at}/${n.id}.cond.then`);
119
+ assertExprPortable(n.cond.else, `${at}/${n.id}.cond.else`);
120
+ }
121
+ else {
122
+ assertExprPortable(n.ports, `${at}/${n.id}.ports`);
123
+ }
124
+ }
125
+ assertExprPortable(component.output, `${at}.output`);
126
+ }
127
+ /**
128
+ * Assert every component of a lowered Component-graph IR is portable (WS2 AC). The
129
+ * authoring lower path ({@link publishBehaviors} / {@link compileEager}) invokes this
130
+ * automatically so a non-portable opcode anywhere in the emitted IR is a fail-closed
131
+ * compile error. Throws {@link PortabilityError} on the first violation.
132
+ */
133
+ function assertComponentGraphPortable(ir) {
134
+ for (const c of ir.components)
135
+ assertComponentPortable(c);
136
+ }
137
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/scp/guard.ts"],"names":[],"mappings":"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"}