@bjornpagen/bumbledb 0.19.1 → 0.19.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/COOKBOOK.md +2 -0
- package/README.md +1 -0
- package/dist/closed.d.ts +9 -9
- package/dist/closed.d.ts.map +1 -1
- package/dist/closed.js +27 -18
- package/dist/closed.js.map +1 -1
- package/dist/face.d.ts +18 -23
- package/dist/face.d.ts.map +1 -1
- package/dist/face.js.map +1 -1
- package/dist/fields.d.ts +54 -8
- package/dist/fields.d.ts.map +1 -1
- package/dist/fields.js +28 -1
- package/dist/fields.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/judgment.d.ts +13 -0
- package/dist/judgment.d.ts.map +1 -0
- package/dist/judgment.js +11 -0
- package/dist/judgment.js.map +1 -0
- package/dist/law.d.ts +2 -1
- package/dist/law.d.ts.map +1 -1
- package/dist/law.js.map +1 -1
- package/dist/marshal.d.ts +2 -2
- package/dist/marshal.d.ts.map +1 -1
- package/dist/marshal.js.map +1 -1
- package/dist/query/atom.d.ts +8 -4
- package/dist/query/atom.d.ts.map +1 -1
- package/dist/query/lower.d.ts.map +1 -1
- package/dist/query/lower.js.map +1 -1
- package/dist/query/scope.d.ts +32 -36
- package/dist/query/scope.d.ts.map +1 -1
- package/dist/query/scope.js +8 -13
- package/dist/query/scope.js.map +1 -1
- package/dist/statements.js +2 -2
- package/dist/statements.js.map +1 -1
- package/package.json +3 -3
- package/src/closed.ts +85 -51
- package/src/face.ts +18 -24
- package/src/fields.ts +85 -7
- package/src/index.ts +5 -0
- package/src/judgment.ts +25 -0
- package/src/law.ts +2 -1
- package/src/marshal.ts +3 -3
- package/src/query/atom.ts +4 -4
- package/src/query/lower.ts +3 -3
- package/src/query/scope.ts +55 -60
- package/src/statements.ts +3 -3
package/dist/query/scope.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AnyClosed } from "../closed.js";
|
|
2
|
-
import type { AnyField, Infer } from "../fields.js";
|
|
2
|
+
import type { AnyField, Infer, SignatureOf } from "../fields.js";
|
|
3
|
+
import type { Same, SameLen } from "../judgment.js";
|
|
3
4
|
import type { ClassLookup, ClassRecordOf, SchemaClasses } from "../law.js";
|
|
4
5
|
import type { QueryParam } from "../native.js";
|
|
5
6
|
import type { AnyRelation, RelationFields } from "../relation.js";
|
|
@@ -9,7 +10,7 @@ type MatchOwner = AnyRelation | AnyClosed;
|
|
|
9
10
|
type MatchFields<R extends MatchOwner> = R extends AnyClosed ? {
|
|
10
11
|
readonly id: R["id"];
|
|
11
12
|
} & R["columns"] : R extends AnyRelation ? RelationFields<R> : never;
|
|
12
|
-
interface Var<F extends AnyField
|
|
13
|
+
interface Var<F extends AnyField, RN extends string, K extends string> {
|
|
13
14
|
readonly [term]: "var";
|
|
14
15
|
readonly owner: MatchOwner & {
|
|
15
16
|
readonly name: RN;
|
|
@@ -18,16 +19,16 @@ interface Var<F extends AnyField = AnyField, RN extends string = string, K exten
|
|
|
18
19
|
readonly field: F;
|
|
19
20
|
readonly label: string;
|
|
20
21
|
}
|
|
21
|
-
type AnyVar = Var
|
|
22
|
-
interface Param<Name extends string
|
|
22
|
+
type AnyVar = Var<AnyField, string, string>;
|
|
23
|
+
interface Param<Name extends string> {
|
|
23
24
|
readonly [term]: "param";
|
|
24
25
|
readonly name: Name;
|
|
25
26
|
}
|
|
26
|
-
interface SetParam<Name extends string
|
|
27
|
+
interface SetParam<Name extends string> {
|
|
27
28
|
readonly [term]: "setParam";
|
|
28
29
|
readonly name: Name;
|
|
29
30
|
}
|
|
30
|
-
type AnyTerm =
|
|
31
|
+
type AnyTerm = AnyVar | Param<string> | SetParam<string>;
|
|
31
32
|
declare function isTerm(value: unknown): value is AnyTerm;
|
|
32
33
|
type VarsOf<R extends MatchOwner> = {
|
|
33
34
|
readonly [K in keyof MatchFields<R> & string]: Var<MatchFields<R>[K], R["name"], K>;
|
|
@@ -81,41 +82,36 @@ type Flatten<T> = {
|
|
|
81
82
|
};
|
|
82
83
|
type UnionToIntersection<U> = (U extends unknown ? (member: U) => void : never) extends (member: infer I) => void ? I : never;
|
|
83
84
|
type ShapeOf<U> = [U] extends [never] ? Record<never, never> : Flatten<UnionToIntersection<U>>;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
type
|
|
91
|
-
readonly closed: {
|
|
92
|
-
readonly name: infer N extends string;
|
|
93
|
-
readonly handles: readonly (infer H extends string)[];
|
|
94
|
-
};
|
|
95
|
-
} ? readonly [N, H] : undefined;
|
|
96
|
-
type JoinOk<A extends ClassedField, B extends ClassedField> = [
|
|
97
|
-
A["field"]["kind"],
|
|
98
|
-
A["class"],
|
|
99
|
-
WidthOf<A["field"]>,
|
|
100
|
-
ElementOf<A["field"]>,
|
|
101
|
-
RosterOf<A["field"]>
|
|
102
|
-
] extends [B["field"]["kind"], B["class"], WidthOf<B["field"]>, ElementOf<B["field"]>, RosterOf<B["field"]>] ? [B["field"]["kind"], B["class"], WidthOf<B["field"]>, ElementOf<B["field"]>, RosterOf<B["field"]>] extends [
|
|
103
|
-
A["field"]["kind"],
|
|
104
|
-
A["class"],
|
|
105
|
-
WidthOf<A["field"]>,
|
|
106
|
-
ElementOf<A["field"]>,
|
|
107
|
-
RosterOf<A["field"]>
|
|
108
|
-
] ? true : false : false;
|
|
85
|
+
/**
|
|
86
|
+
* A slot's identity for the positive-join judgment: the field's structural
|
|
87
|
+
* signature ({@link SignatureOf} — the ONE interpreter, shared with the
|
|
88
|
+
* face pairing wall) plus the slot's law class.
|
|
89
|
+
*/
|
|
90
|
+
type SlotSignature<S extends ClassedField> = readonly [SignatureOf<S["field"]>, S["class"]];
|
|
91
|
+
type JoinOk<A extends ClassedField, B extends ClassedField> = Same<SlotSignature<A>, SlotSignature<B>>;
|
|
109
92
|
type U64Wire<F extends AnyField> = F extends {
|
|
110
93
|
readonly kind: "u64";
|
|
111
|
-
} ?
|
|
94
|
+
} ? F extends {
|
|
95
|
+
readonly closed: unknown;
|
|
96
|
+
} ? false : true : false;
|
|
97
|
+
type ClosedHandles<F extends AnyField> = F extends {
|
|
98
|
+
readonly closed: {
|
|
99
|
+
readonly handles: infer H extends readonly string[];
|
|
100
|
+
};
|
|
101
|
+
} ? H : never;
|
|
102
|
+
/**
|
|
103
|
+
* Two closed ids anti-join when their handle vectors carry the same Peano
|
|
104
|
+
* length ({@link SameLen}: zero equals zero, successor recurses on
|
|
105
|
+
* successor). A bare field has no vector and proves nothing.
|
|
106
|
+
*/
|
|
107
|
+
type ClosedIdOk<A extends AnyField, B extends AnyField> = [ClosedHandles<A>] extends [never] ? false : [ClosedHandles<B>] extends [never] ? false : SameLen<ClosedHandles<A>, ClosedHandles<B>>;
|
|
112
108
|
/**
|
|
113
109
|
* Anti-join class safety: class-equal slots, plus same-identity u64
|
|
114
|
-
* (fresh mint, foreign-key copy, or bare u64) when one side is bare
|
|
115
|
-
*
|
|
116
|
-
*
|
|
110
|
+
* (fresh mint, foreign-key copy, or bare u64) when one side is bare,
|
|
111
|
+
* plus two closed-id fields whose handle tuples have the same length.
|
|
112
|
+
* Two distinct generators stay refused.
|
|
117
113
|
*/
|
|
118
|
-
type AntiJoinOk<A extends ClassedField, B extends ClassedField> = JoinOk<A, B> extends true ? true : U64Wire<A["field"]> extends true ? U64Wire<B["field"]> extends true ? [A["class"]] extends [undefined] ? true : [B["class"]] extends [undefined] ? true : false : false : false;
|
|
114
|
+
type AntiJoinOk<A extends ClassedField, B extends ClassedField> = JoinOk<A, B> extends true ? true : ClosedIdOk<A["field"], B["field"]> extends true ? true : U64Wire<A["field"]> extends true ? U64Wire<B["field"]> extends true ? [A["class"]] extends [undefined] ? true : [B["class"]] extends [undefined] ? true : false : false : false;
|
|
119
115
|
declare function fieldJoins(a: ClassedField, b: ClassedField): boolean;
|
|
120
116
|
declare function fieldAntiJoins(a: ClassedField, b: ClassedField): boolean;
|
|
121
117
|
declare function renderFieldKind(slot: ClassedField): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/query/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/query/scope.ts"],"names":[],"mappings":"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"}
|
package/dist/query/scope.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as errors from "@superbuilders/errors";
|
|
2
2
|
import { sealedFieldsOf } from "#closed.ts";
|
|
3
|
-
import { rosterOf } from "#fields.ts";
|
|
3
|
+
import { rosterOf, signaturesAgree } from "#fields.ts";
|
|
4
4
|
const term = Symbol("bumbledb.query.term");
|
|
5
5
|
const inferred = Symbol("bumbledb.query.inferred");
|
|
6
6
|
function isTerm(value) {
|
|
@@ -56,23 +56,18 @@ function makeSetParam(name) {
|
|
|
56
56
|
return Object.freeze(value);
|
|
57
57
|
}
|
|
58
58
|
function fieldJoins(a, b) {
|
|
59
|
-
|
|
60
|
-
const widthB = "width" in b.field ? b.field.width : undefined;
|
|
61
|
-
const elementA = "element" in a.field ? a.field.element : undefined;
|
|
62
|
-
const elementB = "element" in b.field ? b.field.element : undefined;
|
|
63
|
-
const rosterA = rosterOf(a.field);
|
|
64
|
-
const rosterB = rosterOf(b.field);
|
|
65
|
-
return (a.field.kind === b.field.kind &&
|
|
66
|
-
a.class === b.class &&
|
|
67
|
-
widthA === widthB &&
|
|
68
|
-
elementA === elementB &&
|
|
69
|
-
rosterA === rosterB);
|
|
59
|
+
return a.class === b.class && signaturesAgree(a.field, b.field);
|
|
70
60
|
}
|
|
71
61
|
function u64Wire(field) {
|
|
72
62
|
return field.kind === "u64" && rosterOf(field) === undefined;
|
|
73
63
|
}
|
|
64
|
+
function closedIdAntiJoins(a, b) {
|
|
65
|
+
const rosterA = rosterOf(a);
|
|
66
|
+
const rosterB = rosterOf(b);
|
|
67
|
+
return rosterA !== undefined && rosterB !== undefined && rosterA.handles.length === rosterB.handles.length;
|
|
68
|
+
}
|
|
74
69
|
function fieldAntiJoins(a, b) {
|
|
75
|
-
if (fieldJoins(a, b)) {
|
|
70
|
+
if (fieldJoins(a, b) || closedIdAntiJoins(a.field, b.field)) {
|
|
76
71
|
return true;
|
|
77
72
|
}
|
|
78
73
|
return u64Wire(a.field) && u64Wire(b.field) && (a.class === undefined || b.class === undefined);
|
package/dist/query/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/query/scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAA;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/query/scope.ts"],"names":[],"mappings":"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"}
|
package/dist/statements.js
CHANGED
|
@@ -2,7 +2,7 @@ import * as errors from "@superbuilders/errors";
|
|
|
2
2
|
import { isCapacityWeight, isCapacityWindow, unitWeight } from "#capacity.ts";
|
|
3
3
|
import { isClosedMember, sealedFieldOf } from "#closed.ts";
|
|
4
4
|
import { renderFace } from "#face.ts";
|
|
5
|
-
import { rosterOf } from "#fields.ts";
|
|
5
|
+
import { rosterOf, rostersAgree } from "#fields.ts";
|
|
6
6
|
import { renderCapacityWindow, renderWeight } from "#spec.ts";
|
|
7
7
|
const admitted = Symbol("bumbledb.statement.admitted");
|
|
8
8
|
function isStatement(value) {
|
|
@@ -33,7 +33,7 @@ function assertRosterAgreement(source, target, statement) {
|
|
|
33
33
|
}
|
|
34
34
|
const sourceRoster = rosterOf(sealedFieldOf(source.owner, fieldName));
|
|
35
35
|
const targetRoster = rosterOf(sealedFieldOf(target.owner, targetField));
|
|
36
|
-
if (sourceRoster
|
|
36
|
+
if (!rostersAgree(sourceRoster, targetRoster)) {
|
|
37
37
|
throw errors.new(`${source.owner.name}.${fieldName} is ${renderRosterSide(sourceRoster)} but ${target.owner.name}.${targetField} is ${renderRosterSide(targetRoster)} — closedness rides the descriptor: a closed reference is spelled with the vocabulary's own id descriptor (one meaning, one spelling), so faces pair closed-with-closed through one roster or bare-with-bare, never across — ${renderStatement(statement)}`);
|
|
38
38
|
}
|
|
39
39
|
});
|
package/dist/statements.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../src/statements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAIN,gBAAgB,EAChB,gBAAgB,EAGhB,UAAU,EAEV,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,EAA+B,UAAU,EAAmC,MAAM,UAAU,CAAA;AACnG,OAAO,
|
|
1
|
+
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../src/statements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAIN,gBAAgB,EAChB,gBAAgB,EAGhB,UAAU,EAEV,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,EAA+B,UAAU,EAAmC,MAAM,UAAU,CAAA;AACnG,OAAO,EAAwB,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzE,OAAO,EAA2B,oBAAoB,EAAE,YAAY,EAAmB,MAAM,UAAU,CAAA;AA8BvG,MAAM,QAAQ,GAAkB,MAAM,CAAC,6BAA6B,CAAC,CAAA;AAOrE,SAAS,WAAW,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,IAAI,KAAK,CAAA;AACxE,CAAC;AAcD,SAAS,gBAAgB,CAAC,MAAmC;IAC5D,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,YAAY,CAAA;AAC7E,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,oBAAoB,CAAC,MAAgB,EAAE,MAAgB,EAAE,SAAoB;IACrF,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC3D,MAAM,MAAM,CAAC,GAAG,CACf,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,UAAU,CAAC,MAAM,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,8EAA8E,eAAe,CAAC,SAAS,CAAC,EAAE,CAC5R,CAAA;IACF,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAgB,EAAE,MAAgB,EAAE,SAAoB;IACtF,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,OAAO,CAAC,SAAS,EAAE,QAAQ;QAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC/C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAM;QACP,CAAC;QACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAA;QACrE,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAA;QACvE,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC;YAC/C,MAAM,MAAM,CAAC,GAAG,CACf,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,OAAO,gBAAgB,CAAC,YAAY,CAAC,QAAQ,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,OAAO,gBAAgB,CAAC,YAAY,CAAC,gOAAgO,eAAe,CAAC,SAAS,CAAC,EAAE,CAC/Y,CAAA;QACF,CAAC;IACF,CAAC,CAAC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,GAAG,CAGV,QAAW,EAAE,MAAkB;IAChC,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,CAAC,GAAG,CACf,OAAO,QAAQ,CAAC,IAAI,2CAA2C,QAAQ,CAAC,IAAI,WAAW,QAAQ,CAAC,IAAI,oEAAoE,CACxK,CAAA;IACF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACzB,MAAM,MAAM,CAAC,GAAG,CACf,OAAO,QAAQ,CAAC,IAAI,iCAAiC,SAAS,iFAAiF,CAC/I,CAAA;QACF,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACpB,CAAC;IACD,MAAM,IAAI,GAA2B,MAAM,CAAC,MAAM,CAAC;QAClD,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;KACjC,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAa,EAAE,CAAC,CAAA;AAC1D,CAAC;AAED,SAAS,SAAS,CACjB,MAAS,EACT,MAA8C;IAE9C,MAAM,IAAI,GAA0C,MAAM,CAAC,MAAM,CAAC;QACjE,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,MAAM,EAAE,MAAM,CAAC,IAAI;KACnB,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAa,EAAE,CAAC,CAAA;IACpE,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACzD,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1D,OAAO,SAAS,CAAA;AACjB,CAAC;AAED,SAAS,OAAO,CACf,MAAS,EACT,MAA8C;IAE9C,MAAM,IAAI,GAAsC,MAAM,CAAC,MAAM,CAAC;QAC7D,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,MAAM,EAAE,MAAM,CAAC,IAAI;KACnB,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAa,EAAE,CAAC,CAAA;IACpE,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACzD,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1D,OAAO,SAAS,CAAA;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAkB,EAAE,MAAgB,EAAE,SAAoB;IACvF,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAM;IACP,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,MAAM,CAAC,GAAG,CACf,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,iBAAiB,MAAM,CAAC,KAAK,oGAAoG,eAAe,CAAC,SAAS,CAAC,EAAE,CACjL,CAAA;IACF,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACrD,MAAM,MAAM,CAAC,GAAG,CACf,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,IAAI,2HAA2H,eAAe,CAAC,SAAS,CAAC,EAAE,CAC5M,CAAA;IACF,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAClE,MAAM,MAAM,CAAC,GAAG,CACf,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,IAAI,0EAA0E,eAAe,CAAC,SAAS,CAAC,EAAE,CAC3J,CAAA;IACF,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB,CAAC,MAA0B,EAAE,MAAgB,EAAE,SAAoB;IAC/F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAClH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,SAAQ;QACT,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QACtD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,MAAM,CAAC,GAAG,CACf,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,iBAAiB,KAAK,CAAC,KAAK,uHAAuH,eAAe,CAAC,SAAS,CAAC,EAAE,CACnM,CAAA;QACF,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACpD,MAAM,MAAM,CAAC,GAAG,CACf,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,IAAI,wHAAwH,eAAe,CAAC,SAAS,CAAC,EAAE,CACxM,CAAA;QACF,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACjE,MAAM,MAAM,CAAC,GAAG,CACf,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,IAAI,6EAA6E,eAAe,CAAC,SAAS,CAAC,EAAE,CAC7J,CAAA;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAaD,SAAS,QAAQ,CAChB,MAAe,EACf,MAAe,EACf,KAAc,EACd,MAAgB;IAEhB,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAA;IACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,KAAiB,CAAA;IACrD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,CAAC,GAAG,CACf,uHAAuH,CACvH,CAAA;IACF,CAAC;IACD,IAAI,MAAM,GAAe,UAAU,CAAA;IACnC,IAAI,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,CAAC,GAAG,CACf,oGAAoG,CACpG,CAAA;QACF,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IACvB,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAA;IACjC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;QAC7G,MAAM,MAAM,CAAC,GAAG,CACf,mJAAmJ,CACnJ,CAAA;IACF,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACvD,MAAM,MAAM,CAAC,GAAG,CACf,+HAA+H,CAC/H,CAAA;IACF,CAAC;IAED,qEAAqE;IAErE,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAC7F,MAAM,MAAM,CAAC,GAAG,CACf,yDAAyD,MAAM,CAAC,EAAE,CAAC,KAAK,4GAA4G,CACpL,CAAA;IACF,CAAC;IACD,MAAM,IAAI,GAAiB,MAAM,CAAC,MAAM,CAAC;QACxC,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,MAAM;QACN,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,IAAI;KACnB,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAa,EAAE,CAAC,CAAA;IACpE,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACzD,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1D,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACpD,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACpD,OAAO,SAAS,CAAA;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,SAAoB;IAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAA;IAC3B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,KAAK;YACT,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QACjF,KAAK,aAAa;YACjB,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;QAClE,KAAK,SAAS;YACb,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;QAClE,KAAK,UAAU;YACd,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;IACnI,CAAC;AACF,CAAC;AAaD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bjornpagen/bumbledb",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.2",
|
|
4
4
|
"description": "Embedded relational database for TypeScript with typed schemas, queries, and commit-time constraints",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -55,8 +55,8 @@
|
|
|
55
55
|
},
|
|
56
56
|
"private": false,
|
|
57
57
|
"optionalDependencies": {
|
|
58
|
-
"@bjornpagen/bumbledb-darwin-arm64": "0.19.
|
|
59
|
-
"@bjornpagen/bumbledb-linux-arm64": "0.19.
|
|
58
|
+
"@bjornpagen/bumbledb-darwin-arm64": "0.19.2",
|
|
59
|
+
"@bjornpagen/bumbledb-linux-arm64": "0.19.2"
|
|
60
60
|
},
|
|
61
61
|
"scripts": {
|
|
62
62
|
"build": "node scripts/build.ts",
|
package/src/closed.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as errors from "@superbuilders/errors"
|
|
2
2
|
import {
|
|
3
|
+
type AnyClosedIdField,
|
|
3
4
|
type AnyField,
|
|
4
5
|
assertDeclarationOrderKey,
|
|
5
6
|
assertDeclarationRecord,
|
|
7
|
+
type ClosedHandleTuple,
|
|
6
8
|
type ClosedIdField,
|
|
7
9
|
type ClosedRoster,
|
|
8
10
|
type Infer,
|
|
@@ -39,20 +41,28 @@ type Axioms<Handles extends string, Cols extends Record<string, PayloadField>> =
|
|
|
39
41
|
readonly [H in Handles]: AxiomRow<Cols>
|
|
40
42
|
}
|
|
41
43
|
|
|
42
|
-
interface ClosedCore<
|
|
44
|
+
interface ClosedCore<
|
|
45
|
+
Name extends string,
|
|
46
|
+
Handles extends ClosedHandleTuple,
|
|
47
|
+
Cols extends Record<string, PayloadField>
|
|
48
|
+
> {
|
|
43
49
|
readonly name: Name
|
|
44
50
|
|
|
45
51
|
readonly id: ClosedIdField<Name, Handles>
|
|
46
52
|
readonly data: ClosedData
|
|
47
53
|
|
|
48
|
-
readonly axioms: Axioms<Handles, Cols>
|
|
54
|
+
readonly axioms: Axioms<Handles[number], Cols>
|
|
49
55
|
|
|
50
56
|
readonly columns: Cols
|
|
51
57
|
}
|
|
52
58
|
|
|
53
59
|
type ClosedSelectionInput<Cols extends Record<string, PayloadField>> = SelectionInput<Cols>
|
|
54
60
|
|
|
55
|
-
interface SelectedClosed<
|
|
61
|
+
interface SelectedClosed<
|
|
62
|
+
Name extends string,
|
|
63
|
+
Handles extends ClosedHandleTuple,
|
|
64
|
+
Cols extends Record<string, PayloadField>
|
|
65
|
+
> {
|
|
56
66
|
readonly relation: Closed<Name, Handles, Cols>
|
|
57
67
|
readonly selection: readonly SelectionBinding[]
|
|
58
68
|
}
|
|
@@ -62,11 +72,15 @@ interface AnySelectedClosed {
|
|
|
62
72
|
readonly selection: readonly SelectionBinding[]
|
|
63
73
|
}
|
|
64
74
|
|
|
65
|
-
interface ClosedSelectable<
|
|
75
|
+
interface ClosedSelectable<
|
|
76
|
+
Name extends string,
|
|
77
|
+
Handles extends ClosedHandleTuple,
|
|
78
|
+
Cols extends Record<string, PayloadField>
|
|
79
|
+
> {
|
|
66
80
|
where(selection: ClosedSelectionInput<Cols>): SelectedClosed<Name, Handles, Cols>
|
|
67
81
|
}
|
|
68
82
|
|
|
69
|
-
type Closed<Name extends string, Handles extends
|
|
83
|
+
type Closed<Name extends string, Handles extends ClosedHandleTuple, Cols extends Record<string, PayloadField>> = [
|
|
70
84
|
keyof Cols
|
|
71
85
|
] extends [never]
|
|
72
86
|
? ClosedCore<Name, Handles, Cols>
|
|
@@ -74,7 +88,7 @@ type Closed<Name extends string, Handles extends string, Cols extends Record<str
|
|
|
74
88
|
|
|
75
89
|
interface AnyClosed {
|
|
76
90
|
readonly name: string
|
|
77
|
-
readonly id:
|
|
91
|
+
readonly id: AnyClosedIdField
|
|
78
92
|
readonly data: ClosedData
|
|
79
93
|
readonly axioms: Readonly<Record<string, object>>
|
|
80
94
|
readonly columns: Readonly<Record<string, PayloadField>>
|
|
@@ -98,25 +112,34 @@ function sealedFieldOf(member: AnyRelation | AnyClosed, fieldName: string): AnyF
|
|
|
98
112
|
return declared?.field
|
|
99
113
|
}
|
|
100
114
|
|
|
101
|
-
function isHandleTuple(
|
|
102
|
-
|
|
103
|
-
)
|
|
104
|
-
|
|
115
|
+
function isHandleTuple(shape: unknown): shape is ClosedHandleTuple {
|
|
116
|
+
return (
|
|
117
|
+
Array.isArray(shape) &&
|
|
118
|
+
shape.length > 0 &&
|
|
119
|
+
shape.every(function stringHandle(handle) {
|
|
120
|
+
return typeof handle === "string"
|
|
121
|
+
})
|
|
122
|
+
)
|
|
105
123
|
}
|
|
106
124
|
|
|
107
125
|
/**
|
|
108
|
-
* The trusted seam of the payload tier
|
|
109
|
-
* record
|
|
110
|
-
*
|
|
111
|
-
* that checkable fact before the key list is admitted at the handle type.
|
|
126
|
+
* The trusted seam of the payload tier: the handle tuple and the axioms
|
|
127
|
+
* record are the same finite set — every tuple name is an own key, and
|
|
128
|
+
* every own key is in the tuple.
|
|
112
129
|
*/
|
|
113
130
|
function handleKeysOwn<Handles extends string>(
|
|
114
131
|
axioms: { readonly [H in Handles]: object },
|
|
115
|
-
names: readonly
|
|
116
|
-
):
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
132
|
+
names: readonly Handles[]
|
|
133
|
+
): boolean {
|
|
134
|
+
const listed = new Set<string>(names)
|
|
135
|
+
return (
|
|
136
|
+
names.every(function ownHandle(name) {
|
|
137
|
+
return Object.hasOwn(axioms, name)
|
|
138
|
+
}) &&
|
|
139
|
+
Object.keys(axioms).every(function listedHandle(name) {
|
|
140
|
+
return listed.has(name)
|
|
141
|
+
})
|
|
142
|
+
)
|
|
120
143
|
}
|
|
121
144
|
|
|
122
145
|
/**
|
|
@@ -160,40 +183,50 @@ function mintAxioms<Handles extends string, Cols extends Record<string, PayloadF
|
|
|
160
183
|
return out
|
|
161
184
|
}
|
|
162
185
|
|
|
163
|
-
function closed<const Name extends string, const Handles extends
|
|
186
|
+
function closed<const Name extends string, const Handles extends ClosedHandleTuple>(
|
|
164
187
|
name: Name,
|
|
165
188
|
handles: Handles
|
|
166
|
-
): Closed<Name, Handles
|
|
189
|
+
): Closed<Name, Handles, Record<never, never>>
|
|
167
190
|
|
|
168
|
-
function closed<const Name extends string, const
|
|
191
|
+
function closed<const Name extends string, const Handles extends ClosedHandleTuple, const Cols extends PayloadColumns>(
|
|
169
192
|
name: Name,
|
|
193
|
+
handles: Handles,
|
|
170
194
|
columns: Cols,
|
|
171
|
-
axioms: Axioms<Handles, Cols>
|
|
195
|
+
axioms: Axioms<Handles[number], Cols>
|
|
172
196
|
): Closed<Name, Handles, Cols>
|
|
173
197
|
|
|
174
|
-
function closed<
|
|
198
|
+
function closed<Name extends string, Handles extends ClosedHandleTuple, Cols extends PayloadColumns>(
|
|
175
199
|
name: Name,
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
200
|
+
handles: Handles,
|
|
201
|
+
columns?: Cols,
|
|
202
|
+
axioms?: Axioms<Handles[number], Cols>
|
|
203
|
+
): Closed<Name, Handles, Record<never, never>> | Closed<Name, Handles, Cols> {
|
|
204
|
+
if (!Array.isArray(handles)) {
|
|
205
|
+
throw errors.new(
|
|
206
|
+
`closed relation ${name}: payload columns declared without ground axioms — the payload tier is spelled closed(name, handles, columns, axioms)`
|
|
207
|
+
)
|
|
208
|
+
}
|
|
209
|
+
if (!isHandleTuple(handles)) {
|
|
210
|
+
throw errors.new(`closed relation ${name}: at least one handle is required (an empty vocabulary declares nothing)`)
|
|
211
|
+
}
|
|
212
|
+
if (columns === undefined) {
|
|
180
213
|
if (axioms !== undefined) {
|
|
181
214
|
throw errors.new(`closed relation ${name}: the bare tier declares no columns, so ground axioms are inadmissible`)
|
|
182
215
|
}
|
|
183
|
-
return closedBare(name,
|
|
216
|
+
return closedBare(name, handles)
|
|
184
217
|
}
|
|
185
218
|
if (axioms === undefined) {
|
|
186
219
|
throw errors.new(
|
|
187
|
-
`closed relation ${name}: payload columns declared without ground axioms — the payload tier is spelled closed(name, columns, axioms)
|
|
220
|
+
`closed relation ${name}: payload columns declared without ground axioms — the payload tier is spelled closed(name, handles, columns, axioms)`
|
|
188
221
|
)
|
|
189
222
|
}
|
|
190
|
-
return closedPayload(name,
|
|
223
|
+
return closedPayload(name, handles, columns, axioms)
|
|
191
224
|
}
|
|
192
225
|
|
|
193
|
-
function closedBare<Name extends string,
|
|
226
|
+
function closedBare<Name extends string, const Hs extends ClosedHandleTuple>(
|
|
194
227
|
name: Name,
|
|
195
|
-
handles:
|
|
196
|
-
): Closed<Name,
|
|
228
|
+
handles: Hs
|
|
229
|
+
): Closed<Name, Hs, Record<never, never>> {
|
|
197
230
|
const empty: Record<string, object> = {}
|
|
198
231
|
for (const handle of handles) {
|
|
199
232
|
/** A duplicated name mints one row; the roster's own duplicate refusal in {@link mintClosed} stays the judge. */
|
|
@@ -202,33 +235,37 @@ function closedBare<Name extends string, Handles extends string>(
|
|
|
202
235
|
}
|
|
203
236
|
}
|
|
204
237
|
Object.freeze(empty)
|
|
205
|
-
if (!axiomsMinted<
|
|
238
|
+
if (!axiomsMinted<Hs[number], Record<never, never>>(empty, handles, [])) {
|
|
206
239
|
throw errors.new(`closed relation ${name}: bare-tier axiom-row minting incomplete`)
|
|
207
240
|
}
|
|
208
|
-
return mintClosed
|
|
241
|
+
return mintClosed(name, handles, {}, empty)
|
|
209
242
|
}
|
|
210
243
|
|
|
211
|
-
function closedPayload<Name extends string, Handles extends
|
|
244
|
+
function closedPayload<Name extends string, Handles extends ClosedHandleTuple, Cols extends PayloadColumns>(
|
|
212
245
|
name: Name,
|
|
246
|
+
handles: Handles,
|
|
213
247
|
columns: Cols,
|
|
214
|
-
axioms: Axioms<Handles, Cols>
|
|
248
|
+
axioms: Axioms<Handles[number], Cols>
|
|
215
249
|
): Closed<Name, Handles, Cols> {
|
|
216
250
|
assertDeclarationRecord(`closed relation ${name} columns`, columns)
|
|
217
251
|
for (const columnName of Object.keys(columns)) {
|
|
218
252
|
assertDeclarationOrderKey(`closed relation ${name} column`, columnName)
|
|
219
253
|
}
|
|
220
254
|
assertDeclarationRecord(`closed relation ${name} axioms`, axioms)
|
|
221
|
-
const handles = Object.keys(axioms)
|
|
222
255
|
for (const handle of handles) {
|
|
223
256
|
assertDeclarationOrderKey(`closed relation ${name} handle`, handle)
|
|
224
257
|
}
|
|
225
258
|
if (!handleKeysOwn(axioms, handles)) {
|
|
226
259
|
throw errors.new(`closed relation ${name}: handle enumeration incomplete`)
|
|
227
260
|
}
|
|
228
|
-
return mintClosed
|
|
261
|
+
return mintClosed(name, handles, columns, axioms)
|
|
229
262
|
}
|
|
230
263
|
|
|
231
|
-
function surfaceMinted<
|
|
264
|
+
function surfaceMinted<
|
|
265
|
+
Name extends string,
|
|
266
|
+
Handles extends ClosedHandleTuple,
|
|
267
|
+
Cols extends Record<string, PayloadField>
|
|
268
|
+
>(
|
|
232
269
|
value: ClosedCore<Name, Handles, Cols>,
|
|
233
270
|
cols: readonly ClosedColumn[]
|
|
234
271
|
): value is ClosedCore<Name, Handles, Cols> & Closed<Name, Handles, Cols> {
|
|
@@ -236,16 +273,13 @@ function surfaceMinted<Name extends string, Handles extends string, Cols extends
|
|
|
236
273
|
return cols.length > 0 ? selectable : !selectable
|
|
237
274
|
}
|
|
238
275
|
|
|
239
|
-
function mintClosed<Name extends string, Handles extends
|
|
276
|
+
function mintClosed<Name extends string, Handles extends ClosedHandleTuple, Cols extends Record<string, PayloadField>>(
|
|
240
277
|
name: Name,
|
|
241
|
-
handles:
|
|
278
|
+
handles: Handles,
|
|
242
279
|
columns: Cols,
|
|
243
|
-
axioms: Axioms<Handles, Cols>
|
|
280
|
+
axioms: Axioms<Handles[number], Cols>
|
|
244
281
|
): Closed<Name, Handles, Cols> {
|
|
245
282
|
assertDeclarationOrderKey("closed relation", name)
|
|
246
|
-
if (handles.length === 0) {
|
|
247
|
-
throw errors.new(`closed relation ${name}: at least one handle is required (an empty vocabulary declares nothing)`)
|
|
248
|
-
}
|
|
249
283
|
const seen = new Set<string>()
|
|
250
284
|
for (const handle of handles) {
|
|
251
285
|
if (seen.has(handle)) {
|
|
@@ -253,7 +287,7 @@ function mintClosed<Name extends string, Handles extends string, Cols extends Re
|
|
|
253
287
|
}
|
|
254
288
|
seen.add(handle)
|
|
255
289
|
}
|
|
256
|
-
const handleList
|
|
290
|
+
const handleList = Object.freeze(handles)
|
|
257
291
|
const roster: ClosedRoster<Name, Handles> = Object.freeze({ name, handles: handleList })
|
|
258
292
|
const cols: ClosedColumn[] = []
|
|
259
293
|
for (const [columnName, field] of Object.entries(columns)) {
|
|
@@ -266,7 +300,7 @@ function mintClosed<Name extends string, Handles extends string, Cols extends Re
|
|
|
266
300
|
cols.push(Object.freeze({ name: columnName, field }))
|
|
267
301
|
}
|
|
268
302
|
Object.freeze(cols)
|
|
269
|
-
const rows: ClosedRow[] = handleList.map(function lowerRow(handle) {
|
|
303
|
+
const rows: ClosedRow[] = handleList.map(function lowerRow(handle: Handles[number]) {
|
|
270
304
|
const row: Readonly<Record<string, unknown>> = axioms[handle]
|
|
271
305
|
const values = cols.map(function lowerAxiomLiteral(column) {
|
|
272
306
|
return Object.freeze(literalOf(column.field, row[column.name]))
|
|
@@ -281,7 +315,7 @@ function mintClosed<Name extends string, Handles extends string, Cols extends Re
|
|
|
281
315
|
})
|
|
282
316
|
const id: ClosedIdField<Name, Handles> = Object.freeze({ kind: "u64", closed: roster })
|
|
283
317
|
|
|
284
|
-
const axiomsOut = mintAxioms<Handles, Cols>(name, handleList, cols, axioms)
|
|
318
|
+
const axiomsOut = mintAxioms<Handles[number], Cols>(name, handleList, cols, axioms)
|
|
285
319
|
const columnsOut: Cols = { ...columns }
|
|
286
320
|
Object.freeze(columnsOut)
|
|
287
321
|
const holder: { value: Closed<Name, Handles, Cols> | undefined } = { value: undefined }
|
|
@@ -299,7 +333,7 @@ function mintClosed<Name extends string, Handles extends string, Cols extends Re
|
|
|
299
333
|
const core = { name, id, data, axioms: axiomsOut, columns: columnsOut }
|
|
300
334
|
const value: ClosedCore<Name, Handles, Cols> =
|
|
301
335
|
cols.length > 0 ? Object.freeze({ ...core, where }) : Object.freeze(core)
|
|
302
|
-
if (!surfaceMinted
|
|
336
|
+
if (!surfaceMinted(value, cols)) {
|
|
303
337
|
throw errors.new(`closed relation ${name}: ergonomic-surface minting incomplete`)
|
|
304
338
|
}
|
|
305
339
|
holder.value = value
|