@bjornpagen/bumbledb 1.3.1 → 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 (290) hide show
  1. package/COOKBOOK.md +153 -77
  2. package/README.md +107 -41
  3. package/dist/alternatives.d.ts +5 -6
  4. package/dist/alternatives.d.ts.map +1 -1
  5. package/dist/alternatives.js +5 -6
  6. package/dist/alternatives.js.map +1 -1
  7. package/dist/bin.d.ts +3 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +85 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/capacity.d.ts +14 -17
  12. package/dist/capacity.d.ts.map +1 -1
  13. package/dist/capacity.js +7 -7
  14. package/dist/capacity.js.map +1 -1
  15. package/dist/changes.d.ts +32 -40
  16. package/dist/changes.d.ts.map +1 -1
  17. package/dist/changes.js +86 -104
  18. package/dist/changes.js.map +1 -1
  19. package/dist/closed.d.ts +2 -2
  20. package/dist/closed.d.ts.map +1 -1
  21. package/dist/closed.js +5 -5
  22. package/dist/closed.js.map +1 -1
  23. package/dist/codec.d.ts +13 -27
  24. package/dist/codec.d.ts.map +1 -1
  25. package/dist/codec.js +20 -21
  26. package/dist/codec.js.map +1 -1
  27. package/dist/compile.d.ts +26 -50
  28. package/dist/compile.d.ts.map +1 -1
  29. package/dist/compile.js +75 -64
  30. package/dist/compile.js.map +1 -1
  31. package/dist/database/database.d.ts +98 -0
  32. package/dist/database/database.d.ts.map +1 -0
  33. package/dist/database/database.js +249 -0
  34. package/dist/database/database.js.map +1 -0
  35. package/dist/database/driver.d.ts +40 -0
  36. package/dist/database/driver.d.ts.map +1 -0
  37. package/dist/database/driver.js +68 -0
  38. package/dist/database/driver.js.map +1 -0
  39. package/dist/database/fs.d.ts +12 -0
  40. package/dist/database/fs.d.ts.map +1 -0
  41. package/dist/database/fs.js +120 -0
  42. package/dist/database/fs.js.map +1 -0
  43. package/dist/database/generate.d.ts +26 -0
  44. package/dist/database/generate.d.ts.map +1 -0
  45. package/dist/database/generate.js +102 -0
  46. package/dist/database/generate.js.map +1 -0
  47. package/dist/database/hosted.d.ts +32 -0
  48. package/dist/database/hosted.d.ts.map +1 -0
  49. package/dist/database/hosted.js +44 -0
  50. package/dist/database/hosted.js.map +1 -0
  51. package/dist/database/io.d.ts +94 -0
  52. package/dist/database/io.d.ts.map +1 -0
  53. package/dist/database/io.js +35 -0
  54. package/dist/database/io.js.map +1 -0
  55. package/dist/database/mem.d.ts +26 -0
  56. package/dist/database/mem.d.ts.map +1 -0
  57. package/dist/database/mem.js +67 -0
  58. package/dist/database/mem.js.map +1 -0
  59. package/dist/database/migration.d.ts +55 -0
  60. package/dist/database/migration.d.ts.map +1 -0
  61. package/dist/database/migration.js +46 -0
  62. package/dist/database/migration.js.map +1 -0
  63. package/dist/database/s3.d.ts +36 -0
  64. package/dist/database/s3.d.ts.map +1 -0
  65. package/dist/database/s3.js +141 -0
  66. package/dist/database/s3.js.map +1 -0
  67. package/dist/db.d.ts +44 -128
  68. package/dist/db.d.ts.map +1 -1
  69. package/dist/db.js +163 -287
  70. package/dist/db.js.map +1 -1
  71. package/dist/engine.d.ts +7 -0
  72. package/dist/engine.d.ts.map +1 -0
  73. package/dist/engine.js +2 -0
  74. package/dist/engine.js.map +1 -0
  75. package/dist/errors.d.ts +152 -46
  76. package/dist/errors.d.ts.map +1 -1
  77. package/dist/errors.js +107 -19
  78. package/dist/errors.js.map +1 -1
  79. package/dist/face.d.ts +5 -5
  80. package/dist/face.d.ts.map +1 -1
  81. package/dist/face.js +6 -6
  82. package/dist/face.js.map +1 -1
  83. package/dist/fields.d.ts +4 -5
  84. package/dist/fields.d.ts.map +1 -1
  85. package/dist/fields.js +3 -3
  86. package/dist/fields.js.map +1 -1
  87. package/dist/index.d.ts +60 -57
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +27 -28
  90. package/dist/index.js.map +1 -1
  91. package/dist/judgment.d.ts +1 -1
  92. package/dist/judgment.js +1 -1
  93. package/dist/law.d.ts +16 -68
  94. package/dist/law.d.ts.map +1 -1
  95. package/dist/law.js +3 -3
  96. package/dist/law.js.map +1 -1
  97. package/dist/lower.d.ts +3 -3
  98. package/dist/lower.d.ts.map +1 -1
  99. package/dist/lower.js +35 -39
  100. package/dist/lower.js.map +1 -1
  101. package/dist/native/addon.d.ts +23 -0
  102. package/dist/native/addon.d.ts.map +1 -0
  103. package/dist/native/addon.js +15 -0
  104. package/dist/native/addon.js.map +1 -0
  105. package/dist/native/binding.d.ts +996 -0
  106. package/dist/native/json.d.ts +14 -0
  107. package/dist/native/json.d.ts.map +1 -0
  108. package/dist/native/json.js +73 -0
  109. package/dist/native/json.js.map +1 -0
  110. package/dist/native/load.d.ts +9 -0
  111. package/dist/native/load.d.ts.map +1 -0
  112. package/dist/native/load.js +30 -0
  113. package/dist/native/load.js.map +1 -0
  114. package/dist/native/op.d.ts +29 -0
  115. package/dist/native/op.d.ts.map +1 -0
  116. package/dist/native/op.js +50 -0
  117. package/dist/native/op.js.map +1 -0
  118. package/dist/query/atom.d.ts +13 -14
  119. package/dist/query/atom.d.ts.map +1 -1
  120. package/dist/query/atom.js +2 -2
  121. package/dist/query/atom.js.map +1 -1
  122. package/dist/query/compute.d.ts +4 -4
  123. package/dist/query/compute.d.ts.map +1 -1
  124. package/dist/query/compute.js +4 -4
  125. package/dist/query/compute.js.map +1 -1
  126. package/dist/query/find.d.ts +8 -8
  127. package/dist/query/find.d.ts.map +1 -1
  128. package/dist/query/find.js +1 -1
  129. package/dist/query/lower.d.ts +22 -17
  130. package/dist/query/lower.d.ts.map +1 -1
  131. package/dist/query/lower.js +230 -343
  132. package/dist/query/lower.js.map +1 -1
  133. package/dist/query/run.d.ts +5 -5
  134. package/dist/query/run.d.ts.map +1 -1
  135. package/dist/query/run.js +32 -15
  136. package/dist/query/run.js.map +1 -1
  137. package/dist/query/scope.d.ts +20 -28
  138. package/dist/query/scope.d.ts.map +1 -1
  139. package/dist/query/scope.js +7 -7
  140. package/dist/query/scope.js.map +1 -1
  141. package/dist/query/segments.d.ts +2 -2
  142. package/dist/query/segments.d.ts.map +1 -1
  143. package/dist/query/segments.js +3 -3
  144. package/dist/query/segments.js.map +1 -1
  145. package/dist/relation.d.ts +1 -1
  146. package/dist/relation.d.ts.map +1 -1
  147. package/dist/relation.js +4 -4
  148. package/dist/relation.js.map +1 -1
  149. package/dist/result.d.ts +15 -22
  150. package/dist/result.d.ts.map +1 -1
  151. package/dist/result.js +30 -39
  152. package/dist/result.js.map +1 -1
  153. package/dist/rows.d.ts +9 -33
  154. package/dist/rows.d.ts.map +1 -1
  155. package/dist/rows.js +8 -12
  156. package/dist/rows.js.map +1 -1
  157. package/dist/runtime.d.ts +17 -20
  158. package/dist/runtime.d.ts.map +1 -1
  159. package/dist/runtime.js +41 -205
  160. package/dist/runtime.js.map +1 -1
  161. package/dist/scalar.d.ts +4 -4
  162. package/dist/scalar.d.ts.map +1 -1
  163. package/dist/scalar.js +24 -8
  164. package/dist/scalar.js.map +1 -1
  165. package/dist/schema.d.ts +7 -18
  166. package/dist/schema.d.ts.map +1 -1
  167. package/dist/schema.js +18 -228
  168. package/dist/schema.js.map +1 -1
  169. package/dist/selection.d.ts +4 -4
  170. package/dist/selection.d.ts.map +1 -1
  171. package/dist/selection.js +5 -5
  172. package/dist/selection.js.map +1 -1
  173. package/dist/shape.d.ts +5 -5
  174. package/dist/shape.d.ts.map +1 -1
  175. package/dist/spec.d.ts +7 -79
  176. package/dist/spec.d.ts.map +1 -1
  177. package/dist/spec.js.map +1 -1
  178. package/dist/statements.d.ts +3 -3
  179. package/dist/statements.d.ts.map +1 -1
  180. package/dist/statements.js +10 -10
  181. package/dist/statements.js.map +1 -1
  182. package/dist/uuid.d.ts +1 -1
  183. package/dist/uuid.d.ts.map +1 -1
  184. package/dist/uuid.js +1 -1
  185. package/dist/uuid.js.map +1 -1
  186. package/dist/values.d.ts +2 -2
  187. package/dist/values.d.ts.map +1 -1
  188. package/dist/values.js +2 -2
  189. package/dist/values.js.map +1 -1
  190. package/package.json +18 -18
  191. package/src/alternatives.ts +7 -8
  192. package/src/bin.ts +82 -0
  193. package/src/capacity.ts +20 -23
  194. package/src/changes.ts +134 -191
  195. package/src/closed.ts +5 -5
  196. package/src/codec.ts +35 -49
  197. package/src/compile.ts +91 -113
  198. package/src/database/database.ts +413 -0
  199. package/src/database/driver.ts +134 -0
  200. package/src/database/fs.ts +119 -0
  201. package/src/database/generate.ts +116 -0
  202. package/src/database/hosted.ts +102 -0
  203. package/src/database/io.ts +134 -0
  204. package/src/database/mem.ts +113 -0
  205. package/src/database/migration.ts +107 -0
  206. package/src/database/s3.ts +231 -0
  207. package/src/db.ts +290 -547
  208. package/src/engine.ts +14 -0
  209. package/src/errors.ts +118 -39
  210. package/src/face.ts +9 -9
  211. package/src/fields.ts +6 -7
  212. package/src/index.ts +92 -105
  213. package/src/judgment.ts +1 -1
  214. package/src/law.ts +18 -70
  215. package/src/lower.ts +61 -72
  216. package/src/native/addon.ts +54 -0
  217. package/src/native/binding.d.ts +996 -0
  218. package/src/native/json.ts +100 -0
  219. package/src/native/load.ts +31 -0
  220. package/src/native/op.ts +73 -0
  221. package/src/query/atom.ts +15 -16
  222. package/src/query/compute.ts +7 -7
  223. package/src/query/find.ts +8 -8
  224. package/src/query/lower.ts +270 -392
  225. package/src/query/run.ts +42 -21
  226. package/src/query/scope.ts +29 -37
  227. package/src/query/segments.ts +4 -4
  228. package/src/relation.ts +4 -4
  229. package/src/result.ts +53 -80
  230. package/src/rows.ts +18 -46
  231. package/src/runtime.ts +50 -277
  232. package/src/scalar.ts +32 -12
  233. package/src/schema.ts +23 -284
  234. package/src/selection.ts +6 -6
  235. package/src/shape.ts +5 -5
  236. package/src/spec.ts +7 -85
  237. package/src/statements.ts +11 -11
  238. package/src/uuid.ts +1 -1
  239. package/src/values.ts +4 -4
  240. package/dist/close.d.ts +0 -24
  241. package/dist/close.d.ts.map +0 -1
  242. package/dist/close.js +0 -34
  243. package/dist/close.js.map +0 -1
  244. package/dist/db-native.d.ts +0 -189
  245. package/dist/db-native.d.ts.map +0 -1
  246. package/dist/db-native.js +0 -13
  247. package/dist/db-native.js.map +0 -1
  248. package/dist/internal/log.d.ts +0 -26
  249. package/dist/internal/log.d.ts.map +0 -1
  250. package/dist/internal/log.js +0 -12
  251. package/dist/internal/log.js.map +0 -1
  252. package/dist/native.d.ts +0 -562
  253. package/dist/native.d.ts.map +0 -1
  254. package/dist/native.js +0 -123
  255. package/dist/native.js.map +0 -1
  256. package/dist/query/description.d.ts +0 -41
  257. package/dist/query/description.d.ts.map +0 -1
  258. package/dist/query/description.js +0 -311
  259. package/dist/query/description.js.map +0 -1
  260. package/dist/query/parse-ir.d.ts +0 -10
  261. package/dist/query/parse-ir.d.ts.map +0 -1
  262. package/dist/query/parse-ir.js +0 -280
  263. package/dist/query/parse-ir.js.map +0 -1
  264. package/dist/runtime-codes.d.ts +0 -2
  265. package/dist/runtime-codes.d.ts.map +0 -1
  266. package/dist/runtime-codes.js +0 -19
  267. package/dist/runtime-codes.js.map +0 -1
  268. package/dist/runtime-errors.d.ts +0 -138
  269. package/dist/runtime-errors.d.ts.map +0 -1
  270. package/dist/runtime-errors.js +0 -111
  271. package/dist/runtime-errors.js.map +0 -1
  272. package/dist/runtime-native.d.ts +0 -136
  273. package/dist/runtime-native.d.ts.map +0 -1
  274. package/dist/runtime-native.js +0 -5
  275. package/dist/runtime-native.js.map +0 -1
  276. package/dist/schema-file.d.ts +0 -7
  277. package/dist/schema-file.d.ts.map +0 -1
  278. package/dist/schema-file.js +0 -24
  279. package/dist/schema-file.js.map +0 -1
  280. package/pack-provenance.json +0 -7
  281. package/src/close.ts +0 -53
  282. package/src/db-native.ts +0 -235
  283. package/src/internal/log.ts +0 -46
  284. package/src/native.ts +0 -736
  285. package/src/query/description.ts +0 -424
  286. package/src/query/parse-ir.ts +0 -293
  287. package/src/runtime-codes.ts +0 -18
  288. package/src/runtime-errors.ts +0 -122
  289. package/src/runtime-native.ts +0 -181
  290. package/src/schema-file.ts +0 -38
package/src/lower.ts CHANGED
@@ -1,122 +1,111 @@
1
- import { AuthoringError } from "#errors.ts"
2
1
  /**
3
- * Descriptor lowering: SDK values down to the PRD-01 `SchemaSpec` plain
4
- * data (`#spec.ts`), which the napi bridge marshals verbatim. Lowering is
5
- * TOTAL on well-typed inputs — no validation lives here beyond what the
6
- * types and the construction boundaries already guarantee — and it is the
7
- * only place statement internals are read for the wire. In particular,
8
- * lowering never emits an engine-refused containment target: it accepts
9
- * only `schema` outputs, and `schema`'s target-key wall already
10
- * refused any non-key target projection (60-containment-parity —
11
- * totality INHERITED, not re-checked). Ordering is declaration order
12
- * throughout, and every output object is built with one fixed key order,
13
- * so serialization is deterministic (byte-stable).
2
+ * Lowers a schema to the addon's `SchemaSpecIn`, in declaration order with a fixed key order, so
3
+ * the JSON is byte-stable. Lowering judges nothing: the engine compiles and judges the spec.
14
4
  */
15
-
16
- import type { AnyClosed } from "#closed.ts"
17
- import { isClosedMember } from "#closed.ts"
18
- import type { AnyFace } from "#face.ts"
19
- import { type AnyField, literalOf } from "#fields.ts"
20
- import type { RelationClasses } from "#law.ts"
21
- import { type AnyRelation, relationFields } from "#relation.ts"
22
- import type { AnySchema } from "#schema.ts"
5
+ import type { AnyClosed } from "./closed.ts"
6
+ import { isClosedMember } from "./closed.ts"
7
+ import { AuthoringError } from "./errors.ts"
8
+ import type { AnyFace } from "./face.ts"
9
+ import { type AnyField, literalOf } from "./fields.ts"
10
+ import type { RelationClasses } from "./law.ts"
23
11
  import type {
24
- FieldSpec,
25
- LiteralSetSpec,
26
- RelationSpec,
27
- SchemaSpec,
28
- SideSpec,
29
- StatementSpec,
30
- ValueTypeSpec
31
- } from "#spec.ts"
32
- import type { Statement } from "#statements.ts"
12
+ FieldSpecIn,
13
+ RelationSpecIn,
14
+ SchemaSpecIn,
15
+ SideSpecIn,
16
+ StatementSpecIn,
17
+ ValueTypeIn
18
+ } from "./native/binding.d.ts"
19
+ import { literalIn, literalSetIn, weightIn, windowIn } from "./native/json.ts"
20
+ import { type AnyRelation, relationFields } from "./relation.ts"
21
+ import type { AnySchema } from "./schema.ts"
22
+ import type { Statement } from "./statements.ts"
23
+
24
+ const ELEMENT = { u64: "U64", i64: "I64", f64: "F64" } as const
33
25
 
34
- function valueTypeOf(field: AnyField): ValueTypeSpec {
26
+ function valueTypeOf(field: AnyField): ValueTypeIn {
35
27
  switch (field.kind) {
36
28
  case "bool":
37
- return { kind: "bool" }
29
+ return { kind: "Bool" }
38
30
  case "u64":
39
- return { kind: "u64" }
31
+ return { kind: "U64" }
40
32
  case "i64":
41
- return { kind: "i64" }
33
+ return { kind: "I64" }
42
34
  case "f64":
43
- return { kind: "f64" }
35
+ return { kind: "F64" }
44
36
  case "uuid":
45
- return { kind: "uuid" }
37
+ return { kind: "Uuid" }
46
38
  case "str":
47
- return { kind: "string" }
39
+ return { kind: "String" }
48
40
  case "bytes":
49
- return { kind: "fixedBytes", len: field.width }
41
+ return { kind: "FixedBytes", len: field.width }
50
42
  case "interval":
51
- return { kind: "interval", element: field.element, width: field.width }
43
+ if (field.width === undefined) return { kind: "Interval", element: ELEMENT[field.element] }
44
+ if (field.element === "f64")
45
+ throw new AuthoringError({ message: "a fixed-width interval needs an integer element" })
46
+ return { kind: "FixedInterval", element: ELEMENT[field.element], width: field.width.toString() }
52
47
  }
53
48
  }
54
49
 
55
- function lowerField(name: string, field: AnyField, newtype: string | undefined): FieldSpec {
56
- return {
57
- name,
58
- valueType: valueTypeOf(field),
59
- newtype
60
- }
50
+ function lowerField(name: string, field: AnyField, newtype: string | undefined): FieldSpecIn {
51
+ return newtype === undefined
52
+ ? { name, valueType: valueTypeOf(field) }
53
+ : { name, valueType: valueTypeOf(field), newtype }
61
54
  }
62
55
 
63
- function lowerFace(face: AnyFace): SideSpec {
56
+ function lowerFace(face: AnyFace): SideSpecIn {
64
57
  return {
65
58
  relation: face.owner.name,
66
59
  projection: [...face.projection],
67
- selection: face.selection.map(function lowerBinding(binding): readonly [string, LiteralSetSpec] {
68
- return [binding.field, binding.set]
69
- })
60
+ selection: face.selection.map((binding) => ({ field: binding.field, set: literalSetIn(binding.set) }))
70
61
  }
71
62
  }
72
63
 
73
- function lowerStatement(statement: Statement): StatementSpec {
64
+ function lowerStatement(statement: Statement): StatementSpecIn {
74
65
  const data = statement
75
66
  switch (data.kind) {
76
67
  case "key":
77
- return { kind: "fd", relation: data.owner.name, projection: [...data.projection] }
68
+ return { kind: "Fd", relation: data.owner.name, projection: [...data.projection] }
78
69
  case "containment":
79
70
  return {
80
- kind: "containment",
71
+ kind: "Containment",
81
72
  source: lowerFace(data.source),
82
73
  target: lowerFace(data.target),
83
74
  bidirectional: false
84
75
  }
85
76
  case "mirrors":
86
77
  return {
87
- kind: "containment",
78
+ kind: "Containment",
88
79
  source: lowerFace(data.source),
89
80
  target: lowerFace(data.target),
90
81
  bidirectional: true
91
82
  }
92
83
  case "capacity":
93
84
  return {
94
- kind: "capacity",
85
+ kind: "Capacity",
95
86
  target: lowerFace(data.target),
96
- weight: data.weight,
97
- window: data.window,
87
+ weight: weightIn(data.weight),
88
+ window: windowIn(data.window),
98
89
  source: lowerFace(data.source)
99
90
  }
100
91
  }
101
92
  }
102
93
 
103
- function lowerRelation(relation: AnyRelation, classes: RelationClasses): RelationSpec {
104
- const fields: FieldSpec[] = relationFields(relation).map(function lowerDeclared(declared) {
105
- return lowerField(declared.name, declared.field, classes[declared.name])
106
- })
107
- return { name: relation.name, fields, closed: undefined }
94
+ function lowerRelation(relation: AnyRelation, classes: RelationClasses): RelationSpecIn {
95
+ const fields = relationFields(relation).map((declared) =>
96
+ lowerField(declared.name, declared.field, classes[declared.name])
97
+ )
98
+ return { name: relation.name, fields }
108
99
  }
109
100
 
110
- function lowerClosed(member: AnyClosed, classes: RelationClasses): RelationSpec {
111
- const fields: FieldSpec[] = Object.entries(member.columns).map(function lowerColumn([name, field]) {
112
- return lowerField(name, field, classes[name])
113
- })
114
- const rows = member.handles.map(function lowerRow(handle) {
115
- return {
116
- handle,
117
- values: Object.entries(member.columns).map(([name, field]) => literalOf(field, member.axioms[handle]?.[name]))
118
- }
119
- })
101
+ function lowerClosed(member: AnyClosed, classes: RelationClasses): RelationSpecIn {
102
+ const fields = Object.entries(member.columns).map(([name, field]) => lowerField(name, field, classes[name]))
103
+ const rows = member.handles.map((handle) => ({
104
+ handle,
105
+ values: Object.entries(member.columns).map(([name, field]) =>
106
+ literalIn(literalOf(field, member.axioms[handle]?.[name]))
107
+ )
108
+ }))
120
109
  const newtype = classes.id
121
110
  if (newtype === undefined) {
122
111
  throw new AuthoringError({
@@ -128,8 +117,8 @@ function lowerClosed(member: AnyClosed, classes: RelationClasses): RelationSpec
128
117
 
129
118
  const noClasses: RelationClasses = Object.freeze({})
130
119
 
131
- function lower(theory: AnySchema): SchemaSpec {
132
- const relations: RelationSpec[] = Object.entries(theory.relations).map(function lowerMember([name, member]) {
120
+ function lower(theory: AnySchema): SchemaSpecIn {
121
+ const relations: RelationSpecIn[] = Object.entries(theory.relations).map(function lowerMember([name, member]) {
133
122
  const classes = theory.classes[name] ?? noClasses
134
123
  if (isClosedMember(member)) {
135
124
  return lowerClosed(member, classes)
@@ -0,0 +1,54 @@
1
+ import type * as Binding from "./binding.d.ts"
2
+ import { loadAddon } from "./load.ts"
3
+
4
+ /** The addon's exports, typed by the bridge's generated declarations. */
5
+ type Addon = typeof Binding
6
+
7
+ type External<T> = Binding.ExternalObject<T>
8
+ type RuntimeRef = External<Binding.RuntimeHandle>
9
+ type OperationRef = External<Binding.OperationHandle>
10
+ type DirectoryRef = External<Binding.DirectoryHandle>
11
+ type DbRef = External<Binding.DbHandle>
12
+ type SchemaRef = External<Binding.SchemaHandle>
13
+ type QueryRef = External<Binding.QueryHandle>
14
+ type SnapshotRef = External<Binding.SnapshotHandle>
15
+ type PreparedRef = External<Binding.PreparedHandle>
16
+ type ResultRef = External<Binding.ResultHandle>
17
+ type CursorRef = External<Binding.CursorHandle>
18
+ type DraftRef = External<Binding.DraftHandle>
19
+ type ChangesRef = External<Binding.ChangesHandle>
20
+ type ChangesCursorRef = External<Binding.ChangesCursorHandle>
21
+ type WitnessRef = External<Binding.WitnessHandle>
22
+
23
+ let loaded: Addon | undefined
24
+
25
+ /** The addon, loaded on first use rather than at import. */
26
+ const addon: Addon = new Proxy({} as Addon, {
27
+ get(_target, property) {
28
+ loaded ??= loadAddon<Addon>(process.platform, process.arch)
29
+ return Reflect.get(loaded, property)
30
+ },
31
+ set(_target, property, value) {
32
+ loaded ??= loadAddon<Addon>(process.platform, process.arch)
33
+ return Reflect.set(loaded, property, value)
34
+ }
35
+ })
36
+
37
+ export type {
38
+ Addon,
39
+ ChangesCursorRef,
40
+ ChangesRef,
41
+ CursorRef,
42
+ DbRef,
43
+ DirectoryRef,
44
+ DraftRef,
45
+ OperationRef,
46
+ PreparedRef,
47
+ QueryRef,
48
+ ResultRef,
49
+ RuntimeRef,
50
+ SchemaRef,
51
+ SnapshotRef,
52
+ WitnessRef
53
+ }
54
+ export { addon }