@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.
Files changed (83) hide show
  1. package/COOKBOOK.md +45 -6
  2. package/README.md +15 -2
  3. package/dist/closed.d.ts +7 -5
  4. package/dist/closed.d.ts.map +1 -1
  5. package/dist/closed.js +4 -1
  6. package/dist/closed.js.map +1 -1
  7. package/dist/count.js +1 -1
  8. package/dist/count.js.map +1 -1
  9. package/dist/db.d.ts +110 -73
  10. package/dist/db.d.ts.map +1 -1
  11. package/dist/db.js +170 -114
  12. package/dist/db.js.map +1 -1
  13. package/dist/exhume.d.ts +22 -10
  14. package/dist/exhume.d.ts.map +1 -1
  15. package/dist/exhume.js +42 -9
  16. package/dist/exhume.js.map +1 -1
  17. package/dist/face.d.ts +10 -6
  18. package/dist/face.d.ts.map +1 -1
  19. package/dist/face.js.map +1 -1
  20. package/dist/fields.d.ts +38 -16
  21. package/dist/fields.d.ts.map +1 -1
  22. package/dist/fields.js +33 -8
  23. package/dist/fields.js.map +1 -1
  24. package/dist/index.d.ts +1 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/lower.d.ts +9 -9
  27. package/dist/lower.d.ts.map +1 -1
  28. package/dist/lower.js +17 -12
  29. package/dist/lower.js.map +1 -1
  30. package/dist/marshal.d.ts +17 -7
  31. package/dist/marshal.d.ts.map +1 -1
  32. package/dist/marshal.js +32 -10
  33. package/dist/marshal.js.map +1 -1
  34. package/dist/native.d.ts +60 -9
  35. package/dist/native.d.ts.map +1 -1
  36. package/dist/native.js.map +1 -1
  37. package/dist/query/atom.d.ts +72 -7
  38. package/dist/query/atom.d.ts.map +1 -1
  39. package/dist/query/atom.js +12 -9
  40. package/dist/query/atom.js.map +1 -1
  41. package/dist/query/lower.d.ts +8 -0
  42. package/dist/query/lower.d.ts.map +1 -1
  43. package/dist/query/lower.js +80 -13
  44. package/dist/query/lower.js.map +1 -1
  45. package/dist/query/run.d.ts +5 -5
  46. package/dist/query/run.d.ts.map +1 -1
  47. package/dist/query/run.js +7 -12
  48. package/dist/query/run.js.map +1 -1
  49. package/dist/query/scope.d.ts +15 -5
  50. package/dist/query/scope.d.ts.map +1 -1
  51. package/dist/query/scope.js.map +1 -1
  52. package/dist/relation.d.ts.map +1 -1
  53. package/dist/relation.js +3 -1
  54. package/dist/relation.js.map +1 -1
  55. package/dist/schema.d.ts.map +1 -1
  56. package/dist/schema.js +12 -2
  57. package/dist/schema.js.map +1 -1
  58. package/dist/spec.d.ts +20 -10
  59. package/dist/spec.d.ts.map +1 -1
  60. package/dist/spec.js.map +1 -1
  61. package/dist/statements.d.ts +22 -2
  62. package/dist/statements.d.ts.map +1 -1
  63. package/dist/statements.js +26 -5
  64. package/dist/statements.js.map +1 -1
  65. package/package.json +3 -3
  66. package/src/closed.ts +13 -7
  67. package/src/count.ts +1 -1
  68. package/src/db.ts +289 -173
  69. package/src/exhume.ts +48 -11
  70. package/src/face.ts +13 -6
  71. package/src/fields.ts +51 -15
  72. package/src/index.ts +1 -1
  73. package/src/lower.ts +17 -12
  74. package/src/marshal.ts +38 -13
  75. package/src/native.ts +59 -8
  76. package/src/query/atom.ts +119 -15
  77. package/src/query/lower.ts +117 -15
  78. package/src/query/run.ts +7 -12
  79. package/src/query/scope.ts +15 -6
  80. package/src/relation.ts +3 -1
  81. package/src/schema.ts +14 -2
  82. package/src/spec.ts +21 -9
  83. 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
- /** An opaque statement value — what `schema()` assembles into a theory. */
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 }