@bjornpagen/bumbledb 0.6.0 → 0.7.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/COOKBOOK.md +45 -6
- package/README.md +15 -2
- package/dist/closed.d.ts +7 -5
- package/dist/closed.d.ts.map +1 -1
- package/dist/closed.js +4 -1
- package/dist/closed.js.map +1 -1
- package/dist/count.js +1 -1
- package/dist/count.js.map +1 -1
- package/dist/db.d.ts +110 -73
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +170 -114
- package/dist/db.js.map +1 -1
- package/dist/exhume.d.ts +22 -10
- package/dist/exhume.d.ts.map +1 -1
- package/dist/exhume.js +42 -9
- package/dist/exhume.js.map +1 -1
- package/dist/face.d.ts +10 -6
- package/dist/face.d.ts.map +1 -1
- package/dist/face.js.map +1 -1
- package/dist/fields.d.ts +38 -16
- package/dist/fields.d.ts.map +1 -1
- package/dist/fields.js +33 -8
- package/dist/fields.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lower.d.ts +9 -9
- package/dist/lower.d.ts.map +1 -1
- package/dist/lower.js +17 -12
- package/dist/lower.js.map +1 -1
- package/dist/marshal.d.ts +17 -7
- package/dist/marshal.d.ts.map +1 -1
- package/dist/marshal.js +32 -10
- package/dist/marshal.js.map +1 -1
- package/dist/native.d.ts +60 -9
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js.map +1 -1
- package/dist/query/atom.d.ts +72 -7
- package/dist/query/atom.d.ts.map +1 -1
- package/dist/query/atom.js +12 -9
- package/dist/query/atom.js.map +1 -1
- package/dist/query/lower.d.ts +8 -0
- package/dist/query/lower.d.ts.map +1 -1
- package/dist/query/lower.js +80 -13
- package/dist/query/lower.js.map +1 -1
- package/dist/query/run.d.ts +5 -5
- package/dist/query/run.d.ts.map +1 -1
- package/dist/query/run.js +7 -12
- package/dist/query/run.js.map +1 -1
- package/dist/query/scope.d.ts +15 -5
- package/dist/query/scope.d.ts.map +1 -1
- package/dist/query/scope.js.map +1 -1
- package/dist/relation.d.ts.map +1 -1
- package/dist/relation.js +3 -1
- package/dist/relation.js.map +1 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +12 -2
- package/dist/schema.js.map +1 -1
- package/dist/spec.d.ts +20 -10
- package/dist/spec.d.ts.map +1 -1
- package/dist/spec.js.map +1 -1
- package/dist/statements.d.ts +22 -2
- package/dist/statements.d.ts.map +1 -1
- package/dist/statements.js +26 -5
- package/dist/statements.js.map +1 -1
- package/package.json +3 -3
- package/src/closed.ts +13 -7
- package/src/count.ts +1 -1
- package/src/db.ts +289 -173
- package/src/exhume.ts +48 -11
- package/src/face.ts +13 -6
- package/src/fields.ts +51 -15
- package/src/index.ts +1 -1
- package/src/lower.ts +17 -12
- package/src/marshal.ts +38 -13
- package/src/native.ts +59 -8
- package/src/query/atom.ts +119 -15
- package/src/query/lower.ts +117 -15
- package/src/query/run.ts +7 -12
- package/src/query/scope.ts +15 -6
- package/src/relation.ts +3 -1
- package/src/schema.ts +14 -2
- package/src/spec.ts +21 -9
- package/src/statements.ts +30 -6
package/src/statements.ts
CHANGED
|
@@ -74,9 +74,33 @@ interface WindowData<Tgt extends FaceData = FaceData, Src extends FaceData = Fac
|
|
|
74
74
|
/** One statement's runtime description, tagged by form. */
|
|
75
75
|
type StatementData = KeyData<AnyRelation, readonly string[]> | ContainmentData | WindowData
|
|
76
76
|
|
|
77
|
-
/**
|
|
77
|
+
/**
|
|
78
|
+
* The admission brand — a module-private symbol, deliberately unexported
|
|
79
|
+
* (the `count.ts` pattern): `Statement` is a public structural type, so
|
|
80
|
+
* without this brand a forged plain object of the right shape would walk
|
|
81
|
+
* past the construction-time arity and roster walls into `schema()` — and
|
|
82
|
+
* the roster wall is the one the engine cannot backstop (the wire carries
|
|
83
|
+
* plain u64s, no rosters). The symbol makes the four constructors the ONLY
|
|
84
|
+
* mints, so a statement that skipped the walls is unspellable.
|
|
85
|
+
*/
|
|
86
|
+
const admitted: unique symbol = Symbol("bumbledb.statement.admitted")
|
|
87
|
+
|
|
88
|
+
/** An opaque statement value — what `schema()` assembles into a theory. Only the four constructors produce one. */
|
|
78
89
|
interface Statement {
|
|
79
90
|
readonly data: StatementData
|
|
91
|
+
readonly [admitted]: true
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Narrows any value to an admitted statement — the probe is the
|
|
96
|
+
* module-private {@link admitted} brand only the four constructors set, so
|
|
97
|
+
* no host-built value (fact cells are structurally OPEN — an interval with
|
|
98
|
+
* an excess `kind` property is a legal cell) can ever be misread as one.
|
|
99
|
+
* The keyed-get selector dispatch and `schema()`'s admission both judge
|
|
100
|
+
* through here.
|
|
101
|
+
*/
|
|
102
|
+
function isStatement(value: unknown): value is Statement {
|
|
103
|
+
return typeof value === "object" && value !== null && admitted in value
|
|
80
104
|
}
|
|
81
105
|
|
|
82
106
|
/**
|
|
@@ -188,7 +212,7 @@ function key<
|
|
|
188
212
|
owner: relation,
|
|
189
213
|
projection: Object.freeze(fields)
|
|
190
214
|
})
|
|
191
|
-
return Object.freeze({ data })
|
|
215
|
+
return Object.freeze({ data, [admitted]: true as const })
|
|
192
216
|
}
|
|
193
217
|
|
|
194
218
|
/**
|
|
@@ -210,7 +234,7 @@ function contained<A extends AnyFace, B extends AnyFace>(
|
|
|
210
234
|
target: target.data,
|
|
211
235
|
bidirectional: false
|
|
212
236
|
})
|
|
213
|
-
const statement = Object.freeze({ data })
|
|
237
|
+
const statement = Object.freeze({ data, [admitted]: true as const })
|
|
214
238
|
assertArityAgreement(data.source, data.target, statement)
|
|
215
239
|
assertRosterAgreement(data.source, data.target, statement)
|
|
216
240
|
return statement
|
|
@@ -235,7 +259,7 @@ function mirrors<A extends AnyFace, B extends AnyFace>(
|
|
|
235
259
|
target: target.data,
|
|
236
260
|
bidirectional: true
|
|
237
261
|
})
|
|
238
|
-
const statement = Object.freeze({ data })
|
|
262
|
+
const statement = Object.freeze({ data, [admitted]: true as const })
|
|
239
263
|
assertArityAgreement(data.source, data.target, statement)
|
|
240
264
|
assertRosterAgreement(data.source, data.target, statement)
|
|
241
265
|
return statement
|
|
@@ -262,7 +286,7 @@ function window<B extends AnyFace, A extends AnyFace>(
|
|
|
262
286
|
window: count.window,
|
|
263
287
|
source: source.data
|
|
264
288
|
})
|
|
265
|
-
const statement = Object.freeze({ data })
|
|
289
|
+
const statement = Object.freeze({ data, [admitted]: true as const })
|
|
266
290
|
assertArityAgreement(data.source, data.target, statement)
|
|
267
291
|
assertRosterAgreement(data.source, data.target, statement)
|
|
268
292
|
return statement
|
|
@@ -302,4 +326,4 @@ export type {
|
|
|
302
326
|
WindowData,
|
|
303
327
|
WindowStatement
|
|
304
328
|
}
|
|
305
|
-
export { contained, key, mirrors, renderStatement, window }
|
|
329
|
+
export { contained, isStatement, key, mirrors, renderStatement, window }
|