@bjornpagen/bumbledb 1.3.0 → 2.0.0-rc.1
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 +224 -95
- package/README.md +114 -45
- package/dist/alternatives.d.ts +5 -6
- package/dist/alternatives.d.ts.map +1 -1
- package/dist/alternatives.js +5 -6
- package/dist/alternatives.js.map +1 -1
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +85 -0
- package/dist/bin.js.map +1 -0
- package/dist/capacity.d.ts +14 -17
- package/dist/capacity.d.ts.map +1 -1
- package/dist/capacity.js +7 -7
- package/dist/capacity.js.map +1 -1
- package/dist/changes.d.ts +32 -41
- package/dist/changes.d.ts.map +1 -1
- package/dist/changes.js +86 -110
- package/dist/changes.js.map +1 -1
- package/dist/closed.d.ts +2 -2
- package/dist/closed.d.ts.map +1 -1
- package/dist/closed.js +5 -5
- package/dist/closed.js.map +1 -1
- package/dist/codec.d.ts +20 -27
- package/dist/codec.d.ts.map +1 -1
- package/dist/codec.js +48 -22
- package/dist/codec.js.map +1 -1
- package/dist/compile.d.ts +26 -50
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +75 -64
- package/dist/compile.js.map +1 -1
- package/dist/database/database.d.ts +98 -0
- package/dist/database/database.d.ts.map +1 -0
- package/dist/database/database.js +249 -0
- package/dist/database/database.js.map +1 -0
- package/dist/database/driver.d.ts +40 -0
- package/dist/database/driver.d.ts.map +1 -0
- package/dist/database/driver.js +68 -0
- package/dist/database/driver.js.map +1 -0
- package/dist/database/fs.d.ts +12 -0
- package/dist/database/fs.d.ts.map +1 -0
- package/dist/database/fs.js +120 -0
- package/dist/database/fs.js.map +1 -0
- package/dist/database/generate.d.ts +26 -0
- package/dist/database/generate.d.ts.map +1 -0
- package/dist/database/generate.js +102 -0
- package/dist/database/generate.js.map +1 -0
- package/dist/database/hosted.d.ts +32 -0
- package/dist/database/hosted.d.ts.map +1 -0
- package/dist/database/hosted.js +44 -0
- package/dist/database/hosted.js.map +1 -0
- package/dist/database/io.d.ts +94 -0
- package/dist/database/io.d.ts.map +1 -0
- package/dist/database/io.js +35 -0
- package/dist/database/io.js.map +1 -0
- package/dist/database/mem.d.ts +26 -0
- package/dist/database/mem.d.ts.map +1 -0
- package/dist/database/mem.js +67 -0
- package/dist/database/mem.js.map +1 -0
- package/dist/database/migration.d.ts +55 -0
- package/dist/database/migration.d.ts.map +1 -0
- package/dist/database/migration.js +46 -0
- package/dist/database/migration.js.map +1 -0
- package/dist/database/s3.d.ts +36 -0
- package/dist/database/s3.d.ts.map +1 -0
- package/dist/database/s3.js +141 -0
- package/dist/database/s3.js.map +1 -0
- package/dist/db.d.ts +44 -128
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +163 -287
- package/dist/db.js.map +1 -1
- package/dist/engine.d.ts +7 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +2 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts +152 -46
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +107 -19
- package/dist/errors.js.map +1 -1
- package/dist/face.d.ts +5 -5
- package/dist/face.d.ts.map +1 -1
- package/dist/face.js +6 -6
- package/dist/face.js.map +1 -1
- package/dist/fields.d.ts +4 -5
- package/dist/fields.d.ts.map +1 -1
- package/dist/fields.js +3 -3
- package/dist/fields.js.map +1 -1
- package/dist/index.d.ts +60 -58
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -29
- package/dist/index.js.map +1 -1
- package/dist/judgment.d.ts +1 -1
- package/dist/judgment.js +1 -1
- package/dist/law.d.ts +16 -68
- package/dist/law.d.ts.map +1 -1
- package/dist/law.js +3 -3
- package/dist/law.js.map +1 -1
- package/dist/lower.d.ts +3 -3
- package/dist/lower.d.ts.map +1 -1
- package/dist/lower.js +35 -39
- package/dist/lower.js.map +1 -1
- package/dist/native/addon.d.ts +23 -0
- package/dist/native/addon.d.ts.map +1 -0
- package/dist/native/addon.js +15 -0
- package/dist/native/addon.js.map +1 -0
- package/dist/native/binding.d.ts +996 -0
- package/dist/native/json.d.ts +14 -0
- package/dist/native/json.d.ts.map +1 -0
- package/dist/native/json.js +73 -0
- package/dist/native/json.js.map +1 -0
- package/dist/native/load.d.ts +9 -0
- package/dist/native/load.d.ts.map +1 -0
- package/dist/native/load.js +30 -0
- package/dist/native/load.js.map +1 -0
- package/dist/native/op.d.ts +29 -0
- package/dist/native/op.d.ts.map +1 -0
- package/dist/native/op.js +50 -0
- package/dist/native/op.js.map +1 -0
- package/dist/query/atom.d.ts +13 -14
- package/dist/query/atom.d.ts.map +1 -1
- package/dist/query/atom.js +2 -2
- package/dist/query/atom.js.map +1 -1
- package/dist/query/compute.d.ts +7 -7
- package/dist/query/compute.d.ts.map +1 -1
- package/dist/query/compute.js +7 -16
- package/dist/query/compute.js.map +1 -1
- package/dist/query/find.d.ts +8 -8
- package/dist/query/find.d.ts.map +1 -1
- package/dist/query/find.js +1 -1
- package/dist/query/lower.d.ts +31 -17
- package/dist/query/lower.d.ts.map +1 -1
- package/dist/query/lower.js +260 -368
- 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 +32 -15
- package/dist/query/run.js.map +1 -1
- package/dist/query/scope.d.ts +20 -28
- package/dist/query/scope.d.ts.map +1 -1
- package/dist/query/scope.js +13 -8
- package/dist/query/scope.js.map +1 -1
- package/dist/query/segments.d.ts +2 -2
- package/dist/query/segments.d.ts.map +1 -1
- package/dist/query/segments.js +3 -3
- package/dist/query/segments.js.map +1 -1
- package/dist/relation.d.ts +1 -1
- package/dist/relation.d.ts.map +1 -1
- package/dist/relation.js +4 -4
- package/dist/relation.js.map +1 -1
- package/dist/result.d.ts +15 -22
- package/dist/result.d.ts.map +1 -1
- package/dist/result.js +30 -39
- package/dist/result.js.map +1 -1
- package/dist/rows.d.ts +9 -33
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +8 -12
- package/dist/rows.js.map +1 -1
- package/dist/runtime.d.ts +17 -43
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +41 -241
- package/dist/runtime.js.map +1 -1
- package/dist/scalar.d.ts +36 -106
- package/dist/scalar.d.ts.map +1 -1
- package/dist/scalar.js +36 -185
- package/dist/scalar.js.map +1 -1
- package/dist/schema.d.ts +7 -18
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +18 -228
- package/dist/schema.js.map +1 -1
- package/dist/selection.d.ts +4 -4
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +5 -5
- package/dist/selection.js.map +1 -1
- package/dist/shape.d.ts +5 -5
- package/dist/shape.d.ts.map +1 -1
- package/dist/spec.d.ts +7 -79
- package/dist/spec.d.ts.map +1 -1
- package/dist/spec.js.map +1 -1
- package/dist/statements.d.ts +3 -3
- package/dist/statements.d.ts.map +1 -1
- package/dist/statements.js +10 -10
- package/dist/statements.js.map +1 -1
- package/dist/uuid.d.ts +1 -1
- package/dist/uuid.d.ts.map +1 -1
- package/dist/uuid.js +1 -1
- package/dist/uuid.js.map +1 -1
- package/dist/values.d.ts +2 -2
- package/dist/values.d.ts.map +1 -1
- package/dist/values.js +2 -2
- package/dist/values.js.map +1 -1
- package/package.json +18 -18
- package/src/alternatives.ts +7 -8
- package/src/bin.ts +82 -0
- package/src/capacity.ts +20 -23
- package/src/changes.ts +134 -197
- package/src/closed.ts +5 -5
- package/src/codec.ts +77 -51
- package/src/compile.ts +91 -113
- package/src/database/database.ts +413 -0
- package/src/database/driver.ts +134 -0
- package/src/database/fs.ts +119 -0
- package/src/database/generate.ts +116 -0
- package/src/database/hosted.ts +102 -0
- package/src/database/io.ts +134 -0
- package/src/database/mem.ts +113 -0
- package/src/database/migration.ts +107 -0
- package/src/database/s3.ts +231 -0
- package/src/db.ts +290 -547
- package/src/engine.ts +14 -0
- package/src/errors.ts +118 -39
- package/src/face.ts +9 -9
- package/src/fields.ts +6 -7
- package/src/index.ts +102 -109
- package/src/judgment.ts +1 -1
- package/src/law.ts +18 -70
- package/src/lower.ts +61 -72
- package/src/native/addon.ts +54 -0
- package/src/native/binding.d.ts +996 -0
- package/src/native/json.ts +100 -0
- package/src/native/load.ts +31 -0
- package/src/native/op.ts +73 -0
- package/src/query/atom.ts +15 -16
- package/src/query/compute.ts +13 -22
- package/src/query/find.ts +8 -8
- package/src/query/lower.ts +323 -414
- package/src/query/run.ts +42 -21
- package/src/query/scope.ts +37 -38
- package/src/query/segments.ts +4 -4
- package/src/relation.ts +4 -4
- package/src/result.ts +53 -80
- package/src/rows.ts +18 -46
- package/src/runtime.ts +50 -346
- package/src/scalar.ts +76 -336
- package/src/schema.ts +23 -284
- package/src/selection.ts +6 -6
- package/src/shape.ts +5 -5
- package/src/spec.ts +7 -85
- package/src/statements.ts +11 -11
- package/src/uuid.ts +1 -1
- package/src/values.ts +4 -4
- package/dist/close.d.ts +0 -24
- package/dist/close.d.ts.map +0 -1
- package/dist/close.js +0 -34
- package/dist/close.js.map +0 -1
- package/dist/db-native.d.ts +0 -196
- package/dist/db-native.d.ts.map +0 -1
- package/dist/db-native.js +0 -13
- package/dist/db-native.js.map +0 -1
- package/dist/internal/log.d.ts +0 -26
- package/dist/internal/log.d.ts.map +0 -1
- package/dist/internal/log.js +0 -12
- package/dist/internal/log.js.map +0 -1
- package/dist/migration.d.ts +0 -31
- package/dist/migration.d.ts.map +0 -1
- package/dist/migration.js +0 -47
- package/dist/migration.js.map +0 -1
- package/dist/native.d.ts +0 -562
- package/dist/native.d.ts.map +0 -1
- package/dist/native.js +0 -123
- package/dist/native.js.map +0 -1
- package/dist/query/description.d.ts +0 -41
- package/dist/query/description.d.ts.map +0 -1
- package/dist/query/description.js +0 -311
- package/dist/query/description.js.map +0 -1
- package/dist/query/parse-ir.d.ts +0 -10
- package/dist/query/parse-ir.d.ts.map +0 -1
- package/dist/query/parse-ir.js +0 -280
- package/dist/query/parse-ir.js.map +0 -1
- package/dist/runtime-codes.d.ts +0 -2
- package/dist/runtime-codes.d.ts.map +0 -1
- package/dist/runtime-codes.js +0 -18
- package/dist/runtime-codes.js.map +0 -1
- package/dist/runtime-errors.d.ts +0 -118
- package/dist/runtime-errors.d.ts.map +0 -1
- package/dist/runtime-errors.js +0 -98
- package/dist/runtime-errors.js.map +0 -1
- package/dist/runtime-native.d.ts +0 -141
- package/dist/runtime-native.d.ts.map +0 -1
- package/dist/runtime-native.js +0 -5
- package/dist/runtime-native.js.map +0 -1
- package/pack-provenance.json +0 -7
- package/src/close.ts +0 -53
- package/src/db-native.ts +0 -243
- package/src/internal/log.ts +0 -48
- package/src/migration.ts +0 -61
- package/src/native.ts +0 -736
- package/src/query/description.ts +0 -424
- package/src/query/parse-ir.ts +0 -291
- package/src/runtime-codes.ts +0 -17
- package/src/runtime-errors.ts +0 -109
- package/src/runtime-native.ts +0 -189
package/README.md
CHANGED
|
@@ -8,10 +8,10 @@ the native engine.
|
|
|
8
8
|
|
|
9
9
|
The API is **Effect-native**: every database operation constructs a lazy
|
|
10
10
|
[`Effect`](https://effect.website) and every native resource is scoped.
|
|
11
|
-
There is no Promise, synchronous, or disposal twin.
|
|
12
|
-
construction
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
There is no Promise, synchronous, or disposal twin. Schema, query and scalar
|
|
12
|
+
construction stay ordinary synchronous expressions; a schema or query is
|
|
13
|
+
validated by the engine when it is defined. The package requires Effect
|
|
14
|
+
`^4.0.2` as a peer dependency.
|
|
15
15
|
|
|
16
16
|
Relation declarations describe their fields, and the statements passed to
|
|
17
17
|
`schema()` connect those fields into typed keys and references. Values remain
|
|
@@ -24,28 +24,41 @@ structural descriptions. Schema construction owns copies of declarations.
|
|
|
24
24
|
Independently constructed equivalent declarations work in queries, codecs,
|
|
25
25
|
writes, and key lookups; ordered fields and enum handles must agree.
|
|
26
26
|
|
|
27
|
+
Individual fields expose the same validation and JSON codecs as rows:
|
|
28
|
+
`fieldSchema(field)` returns a host-value Effect Schema,
|
|
29
|
+
`decodeBoundaryField(field, input)` decodes strict JSON-boundary data, and
|
|
30
|
+
`encodeBoundaryField(field, value)` encodes it. Both boundary operations return
|
|
31
|
+
`Result`; their value type is `Infer<typeof field>`. Compose field schemas into
|
|
32
|
+
ordinary Effect Schema records for application inputs.
|
|
33
|
+
|
|
27
34
|
## Platform support
|
|
28
35
|
|
|
29
36
|
The TypeScript package ships native binaries for **darwin-arm64**
|
|
30
37
|
(macOS on Apple Silicon), **linux-arm64**, and **linux-x64**.
|
|
31
38
|
The matching `@bjornpagen/bumbledb-<platform>` package is selected
|
|
32
|
-
automatically during installation.
|
|
33
|
-
the
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
automatically during installation. Defining a schema or a query loads the
|
|
40
|
+
addon and validates the definition in the engine, so an invalid definition
|
|
41
|
+
throws `AuthoringError` where it is written. On an unsupported platform the
|
|
42
|
+
first definition fails with a diagnostic naming the running platform and the
|
|
43
|
+
available binaries. Node 26 or newer is required; Edge and browser runtimes
|
|
44
|
+
are unsupported.
|
|
36
45
|
Linux artifacts target Amazon Linux 2023 / glibc 2.34 or newer. Their
|
|
37
46
|
correctness CI is distinct from the Apple Silicon performance measurements.
|
|
38
47
|
|
|
39
48
|
## Install
|
|
40
49
|
|
|
41
|
-
This guide follows the 1.3.0 source API. Use the guide from the Git tag matching
|
|
42
|
-
your installed package. GitHub release tarballs and npm publication are separate;
|
|
43
|
-
the npm command below applies once that version is published.
|
|
44
|
-
|
|
45
50
|
```sh
|
|
46
|
-
pnpm add @bjornpagen/bumbledb
|
|
51
|
+
pnpm add @bjornpagen/bumbledb effect
|
|
47
52
|
```
|
|
48
53
|
|
|
54
|
+
`@aws-sdk/client-s3` is an optional peer dependency, needed only for `S3Store`.
|
|
55
|
+
|
|
56
|
+
The package has two entry points and one binary. `@bjornpagen/bumbledb`
|
|
57
|
+
holds authoring (relations, schemas, queries, change sets), the `Bumble`
|
|
58
|
+
runtime layer and the durable `Database`. `@bjornpagen/bumbledb/engine` is
|
|
59
|
+
the embedded `Db` for single-process use, tests and benchmarks. The
|
|
60
|
+
`bumbledb` binary generates, checks and applies migrations.
|
|
61
|
+
|
|
49
62
|
## Quick start
|
|
50
63
|
|
|
51
64
|
Declare relations, connect their fields with keys and references, build a
|
|
@@ -59,13 +72,12 @@ import {
|
|
|
59
72
|
capacity,
|
|
60
73
|
ChangeSet,
|
|
61
74
|
contained,
|
|
62
|
-
Db,
|
|
63
75
|
f64,
|
|
64
76
|
i64,
|
|
65
77
|
uuid,
|
|
66
78
|
interval,
|
|
67
79
|
key,
|
|
68
|
-
|
|
80
|
+
Bumble,
|
|
69
81
|
on,
|
|
70
82
|
query,
|
|
71
83
|
ref,
|
|
@@ -77,6 +89,7 @@ import {
|
|
|
77
89
|
weigh,
|
|
78
90
|
within
|
|
79
91
|
} from "@bjornpagen/bumbledb"
|
|
92
|
+
import { Db } from "@bjornpagen/bumbledb/engine"
|
|
80
93
|
|
|
81
94
|
// Relations describe stored records. Identity fields are ordinary
|
|
82
95
|
// application-owned Uuid values — the database issues no identity.
|
|
@@ -128,8 +141,8 @@ const program = Effect.scoped(
|
|
|
128
141
|
])
|
|
129
142
|
const changes = yield* draft.finish()
|
|
130
143
|
|
|
131
|
-
const outcome = yield* db.apply(changes
|
|
132
|
-
if (outcome.
|
|
144
|
+
const outcome = yield* db.apply(changes)
|
|
145
|
+
if (outcome._tag !== "Committed") {
|
|
133
146
|
return outcome
|
|
134
147
|
}
|
|
135
148
|
const snapshot = yield* db.snapshot()
|
|
@@ -145,12 +158,86 @@ const program = Effect.scoped(
|
|
|
145
158
|
|
|
146
159
|
// One boundary for this script; an Effect app supplies the layer in its
|
|
147
160
|
// own application graph instead.
|
|
148
|
-
void Effect.runPromise(program.pipe(Effect.provide(
|
|
161
|
+
void Effect.runPromise(program.pipe(Effect.provide(Bumble.layer())))
|
|
149
162
|
```
|
|
150
163
|
|
|
151
164
|
Every `ts` fence in this README is extracted and type-checked against the
|
|
152
165
|
real surface by `test/readme.test.ts` — the examples cannot drift.
|
|
153
166
|
|
|
167
|
+
## Durable databases
|
|
168
|
+
|
|
169
|
+
`Database` keeps a database as an immutable log in an object store and reads
|
|
170
|
+
it through a local cache that is only a cache. The store is `S3Store` (the log
|
|
171
|
+
in an S3 Express directory bucket, checkpoints in a Standard bucket, through the
|
|
172
|
+
app's `S3Client`), `FsStore` (a durable local directory) or `MemStore` (tests).
|
|
173
|
+
A cold open fetches up to 32 log objects at once, and every new connection
|
|
174
|
+
resolves DNS on one of libuv's 4 threads. Where lookups are slow, start Node
|
|
175
|
+
with `UV_THREADPOOL_SIZE=64` or give the `S3Client` an agent that caches
|
|
176
|
+
lookups.
|
|
177
|
+
|
|
178
|
+
Migrations are bundled with the code. `bumbledb generate --schema
|
|
179
|
+
src/schema.ts#App --name <name>` writes `migrations/NNNN_<name>/` and
|
|
180
|
+
`migrations/index.ts`; add a `populate` step to a generated `migration.ts`
|
|
181
|
+
when rows must be computed. Relations that keep their name and fields are
|
|
182
|
+
copied unchanged. `bumbledb check --schema src/schema.ts#App` fails when the
|
|
183
|
+
schema has an ungenerated change or a migration was edited.
|
|
184
|
+
`onOpen: "migrate"` creates the database and runs pending migrations;
|
|
185
|
+
`onOpen: "verify"` refuses to open while any is pending, so production runs
|
|
186
|
+
`bumbledb migrate --config <file>` from the deploy pipeline first.
|
|
187
|
+
|
|
188
|
+
```ts
|
|
189
|
+
import { Effect, Option } from "effect"
|
|
190
|
+
import { Bumble, ChangeSet, Database, FsStore, key, type Migrations, query, relation, schema, str, uuid, v } from "@bjornpagen/bumbledb"
|
|
191
|
+
|
|
192
|
+
const Note = relation("Note", { id: uuid, text: str })
|
|
193
|
+
const App = schema("App", { Note }, [key(Note, ["id"])])
|
|
194
|
+
const notes = query(App).rule((r) => {
|
|
195
|
+
const { id, text } = v(Note)
|
|
196
|
+
return r.match(Note, { id, text }).find({ id, text })
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
// Generated by `bumbledb generate`: `import { migrations } from "./migrations/index.ts"`.
|
|
200
|
+
declare const migrations: Migrations
|
|
201
|
+
|
|
202
|
+
const program = Effect.scoped(
|
|
203
|
+
Effect.gen(function* () {
|
|
204
|
+
const db = yield* Database.make({
|
|
205
|
+
schema: App,
|
|
206
|
+
migrations,
|
|
207
|
+
store: FsStore.make("data/log"),
|
|
208
|
+
cache: { directory: "data/cache" },
|
|
209
|
+
onOpen: "migrate"
|
|
210
|
+
})
|
|
211
|
+
// One request id per intent: a retry submits the same command and is decided once.
|
|
212
|
+
const requestId = Database.requestId()
|
|
213
|
+
const draft = yield* ChangeSet.builder(App)
|
|
214
|
+
yield* draft.insert(Note, [{ id: yield* Effect.sync(() => crypto.randomUUID()), text: "hello" }])
|
|
215
|
+
const outcome = yield* db.submit(yield* draft.finish(), { requestId })
|
|
216
|
+
if (outcome._tag === "Refused" && outcome.refusal._tag === "Unknown") {
|
|
217
|
+
// The submit may or may not have been decided; its receipt says which.
|
|
218
|
+
const receipt = yield* db.resolve(requestId)
|
|
219
|
+
return Option.isSome(receipt) ? receipt.value.outcome._tag : "NotDecided"
|
|
220
|
+
}
|
|
221
|
+
const reader = yield* db.read("latest")
|
|
222
|
+
const rows = yield* (yield* reader.execute(notes, {})).collect()
|
|
223
|
+
return `${rows.length} notes at revision ${reader.revision}`
|
|
224
|
+
})
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
void Effect.runPromise(program.pipe(Effect.provide(Bumble.layer())))
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
`submit` returns `Decided` with a receipt (`Committed`, `NoChange`,
|
|
231
|
+
`PreconditionFailed` or `InvariantRejected`) or `Refused` with the reason;
|
|
232
|
+
every refusal but `Unknown` proves the log does not decide the command. A
|
|
233
|
+
submit with `precondition: reader.revision` is decided only if nothing
|
|
234
|
+
committed after that read. `read` takes `"cached"`, `"latest"` or
|
|
235
|
+
`{ atLeast: seq }`.
|
|
236
|
+
`Database.layer(Database.tag<typeof App>("App/Database"), options)` provides
|
|
237
|
+
one database to an app graph, and `Database.pool({ ...options, store:
|
|
238
|
+
(tenant) => ..., cache: (tenant) => ... })` opens one per tenant on demand and
|
|
239
|
+
closes it when idle.
|
|
240
|
+
|
|
154
241
|
## Surface
|
|
155
242
|
|
|
156
243
|
The SDK translates TypeScript values directly into the engine's shared schema
|
|
@@ -174,16 +261,17 @@ and query representations.
|
|
|
174
261
|
measurement range, and `weigh` chooses a numeric field or interval
|
|
175
262
|
duration. Harmless equivalent window spellings lower to one canonical
|
|
176
263
|
law; genuinely different meanings still refuse.
|
|
177
|
-
- `
|
|
264
|
+
- `Bumble.layer()` owns the shared native runtime with sensible defaults;
|
|
178
265
|
provide it once in the app graph. `Db.create` and `Db.open` are scoped
|
|
179
266
|
Effects over that runtime; `open` never creates and `create` refuses
|
|
180
|
-
existing authority. `db.apply(changes,
|
|
181
|
-
|
|
182
|
-
`
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
judging.
|
|
267
|
+
existing authority. `db.apply(changes, expected?)` judges one immutable
|
|
268
|
+
final-state change: `Committed` (with the generation, and `changed: false`
|
|
269
|
+
when the state already held it), `Rejected` (complete statement
|
|
270
|
+
diagnostics), or `Moved` when `expected`, a snapshot's opaque `witness`, is
|
|
271
|
+
no longer current. `db.judge(changes, expected?)` uses the same admission
|
|
272
|
+
path and stores nothing: `Admitted` with net additions and removals,
|
|
273
|
+
`Rejected`, or `Moved` without judging. A judgment never guarantees a later
|
|
274
|
+
apply.
|
|
187
275
|
- `ChangeSet.builder(schema)` acquires a scoped database-free draft;
|
|
188
276
|
`insert`/`delete` are lazy bounded ingestion effects, `finish()` seals the
|
|
189
277
|
immutable `ChangeSet`. It exposes `schemaId`, `counts`, and `byteLength`.
|
|
@@ -210,25 +298,6 @@ and query representations.
|
|
|
210
298
|
`f64` are deterministic with one final rounding), named intermediate
|
|
211
299
|
results, nonrecursive composition of query templates, and linear
|
|
212
300
|
recursive reachability.
|
|
213
|
-
- `describeQuery(q)` returns owned logical IR, result names, intermediate
|
|
214
|
-
table names, and parameter names. `queryFromDescription(S, description,
|
|
215
|
-
resultFields)` checks a generated description through the same rule builder,
|
|
216
|
-
scalar grammar, lowering, and execution paths. The result-field record is
|
|
217
|
-
checked against the derived head and infers the returned row type; it is
|
|
218
|
-
not an unchecked cast. Generated parameters are validated by their uses at
|
|
219
|
-
execution. Ordinals refer to the supplied schema's ordered declarations;
|
|
220
|
-
variable ordinals are local to each rule. Native preparation still checks
|
|
221
|
-
engine semantics. The description contains plain values, including bigint
|
|
222
|
-
and byte arrays, rather than native resources or a JSON encoding.
|
|
223
|
-
Query `data` and `schema`, and compiled-schema inspection properties,
|
|
224
|
-
return detached snapshots: editing their byte buffers cannot change the
|
|
225
|
-
query or compilation. Checked immutable branches may be shared. Structural
|
|
226
|
-
declarations with byte payloads are copied when consumed; JavaScript byte
|
|
227
|
-
buffers themselves are mutable and are never treated as immutable cache keys.
|
|
228
|
-
- `Scalar.field("units")` is an unresolved source-field leaf.
|
|
229
|
-
`Scalar.add(Scalar.field("units"), Scalar.u64(1n))` authors synchronously
|
|
230
|
-
without native loading. Native schema binding typechecks it, including
|
|
231
|
-
on zero rows. There is no `field<T>` assertion and no JS evaluator.
|
|
232
301
|
- Operational failure is the one `DbError` tagged-reason class in the
|
|
233
302
|
Effect error channel; interruption and finalizer problems stay in
|
|
234
303
|
`Cause`. Resource owners are scoped and report honest `CloseReport`s;
|
package/dist/alternatives.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { type AnyClosed } from "./closed.
|
|
2
|
-
import type { Face, SameArity, SameShapes } from "./face.
|
|
3
|
-
import { type ClosedIdField } from "./fields.
|
|
4
|
-
import type { RelationFields } from "./relation.
|
|
5
|
-
import { type ContainmentStatement, type KeyStatement, type MirrorsStatement } from "./statements.
|
|
1
|
+
import { type AnyClosed } from "./closed.ts";
|
|
2
|
+
import type { Face, SameArity, SameShapes } from "./face.ts";
|
|
3
|
+
import { type ClosedIdField } from "./fields.ts";
|
|
4
|
+
import type { RelationFields } from "./relation.ts";
|
|
5
|
+
import { type ContainmentStatement, type KeyStatement, type MirrorsStatement } from "./statements.ts";
|
|
6
6
|
type KeyFace<K extends KeyStatement> = Face<K["owner"], K["projection"]>;
|
|
7
7
|
type ScalarKey<K extends KeyStatement> = Extract<RelationFields<K["owner"]>[K["projection"][number]], {
|
|
8
8
|
readonly kind: "interval";
|
|
@@ -16,7 +16,6 @@ type Discriminator<P extends KeyStatement, C extends AnyClosed> = {
|
|
|
16
16
|
* Exhaustive closed alternatives, expanded into ordinary laws. Declare the
|
|
17
17
|
* supplied keys in the schema once; this helper emits only the discriminator
|
|
18
18
|
* containment followed by one mirrors statement per handle in roster order.
|
|
19
|
-
* No new statement kind or assembled payload representation is introduced.
|
|
20
19
|
*/
|
|
21
20
|
declare function alternatives<P extends KeyStatement, C extends AnyClosed, const Arms extends Record<C["handles"][number], KeyStatement>>(parent: P & ScalarKey<P>, discriminator: Discriminator<NoInfer<P>, NoInfer<C>>, roster: C, arms: Arms & Record<Exclude<keyof Arms, C["handles"][number]>, never> & {
|
|
22
21
|
readonly [H in C["handles"][number]]: ScalarKey<Arms[H]> & SameArity<KeyFace<P>, KeyFace<Arms[H]>> & SameShapes<KeyFace<P>, KeyFace<Arms[H]>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alternatives.d.ts","sourceRoot":"","sources":["../src/alternatives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAA6C,MAAM,
|
|
1
|
+
{"version":3,"file":"alternatives.d.ts","sourceRoot":"","sources":["../src/alternatives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAA6C,MAAM,aAAa,CAAA;AAEvF,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,KAAK,aAAa,EAAmB,MAAM,aAAa,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,MAAM,iBAAiB,CAAA;AAGxB,KAAK,OAAO,CAAC,CAAC,SAAS,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;AACxE,KAAK,SAAS,CAAC,CAAC,SAAS,YAAY,IACpC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,SAAS,KAAK,GACtG,OAAO,GACP;IAAE,QAAQ,CAAC,0CAA0C,EAAE,KAAK,CAAA;CAAE,CAAA;AAClE,KAAK,aAAa,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,SAAS,IAAI;KAChE,CAAC,IAAI,MAAM,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,GAClH,CAAC,GACD,KAAK;CACR,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAClC,MAAM,CAAA;AAcP;;;;GAIG;AACH,iBAAS,YAAY,CACpB,CAAC,SAAS,YAAY,EACtB,CAAC,SAAS,SAAS,EACnB,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,EAE7D,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EACxB,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EACpD,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,IAAI,GACT,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG;IAC1D,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GACvD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GACvC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;CACzC,GACA,SAAS,CAAC,oBAAoB,GAAG,gBAAgB,CAAC,EAAE,CAmCtD;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
package/dist/alternatives.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { closedDescriptor, closedId, sealedFieldOf } from "
|
|
2
|
-
import { AuthoringError } from "
|
|
3
|
-
import { signaturesAgree } from "
|
|
4
|
-
import { statementDescriptor } from "
|
|
5
|
-
import { recordValue } from "
|
|
1
|
+
import { closedDescriptor, closedId, sealedFieldOf } from "./closed.js";
|
|
2
|
+
import { AuthoringError } from "./errors.js";
|
|
3
|
+
import { signaturesAgree } from "./fields.js";
|
|
4
|
+
import { statementDescriptor } from "./statements.js";
|
|
5
|
+
import { recordValue } from "./values.js";
|
|
6
6
|
function scalarKey(input) {
|
|
7
7
|
const checked = statementDescriptor(input);
|
|
8
8
|
if (checked.kind !== "key")
|
|
@@ -19,7 +19,6 @@ function scalarKey(input) {
|
|
|
19
19
|
* Exhaustive closed alternatives, expanded into ordinary laws. Declare the
|
|
20
20
|
* supplied keys in the schema once; this helper emits only the discriminator
|
|
21
21
|
* containment followed by one mirrors statement per handle in roster order.
|
|
22
|
-
* No new statement kind or assembled payload representation is introduced.
|
|
23
22
|
*/
|
|
24
23
|
function alternatives(parent, discriminator, roster, arms) {
|
|
25
24
|
const primary = scalarKey(parent);
|
package/dist/alternatives.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alternatives.js","sourceRoot":"","sources":["../src/alternatives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"alternatives.js","sourceRoot":"","sources":["../src/alternatives.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
3
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
4
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
5
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
return path;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* `bumbledb generate --schema <file>#<export> --name <name> [--migrations <dir>]`
|
|
12
|
+
* `bumbledb check --schema <file>#<export> [--migrations <dir>]`
|
|
13
|
+
* `bumbledb migrate --config <file>`: the file's default export is the app's `Database` options;
|
|
14
|
+
* the database is opened with `onOpen: "migrate"` and closed, running every pending migration.
|
|
15
|
+
*/
|
|
16
|
+
import * as path from "node:path";
|
|
17
|
+
import { pathToFileURL } from "node:url";
|
|
18
|
+
import { parseArgs } from "node:util";
|
|
19
|
+
import { Cause, Effect, Exit, Layer } from "effect";
|
|
20
|
+
import { Database } from "./database/database.js";
|
|
21
|
+
import { check, generate } from "./database/generate.js";
|
|
22
|
+
import { Bumble } from "./runtime.js";
|
|
23
|
+
async function load(specifier) {
|
|
24
|
+
return (await import(__rewriteRelativeImportExtension(pathToFileURL(path.resolve(specifier)).href)));
|
|
25
|
+
}
|
|
26
|
+
async function schemaOf(reference) {
|
|
27
|
+
const [file, name = "default"] = reference.split("#");
|
|
28
|
+
if (file === undefined || file === "")
|
|
29
|
+
throw new Error("--schema is <file>#<export>");
|
|
30
|
+
const value = (await load(file))[name];
|
|
31
|
+
if (value === undefined)
|
|
32
|
+
throw new Error(`${file} has no export ${name}`);
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
async function main(argv) {
|
|
36
|
+
const [command, ...rest] = argv;
|
|
37
|
+
const { values } = parseArgs({
|
|
38
|
+
args: rest,
|
|
39
|
+
options: {
|
|
40
|
+
schema: { type: "string" },
|
|
41
|
+
name: { type: "string" },
|
|
42
|
+
migrations: { type: "string", default: "migrations" },
|
|
43
|
+
config: { type: "string" }
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
const migrations = values.migrations ?? "migrations";
|
|
47
|
+
switch (command) {
|
|
48
|
+
case "generate": {
|
|
49
|
+
if (values.schema === undefined || values.name === undefined)
|
|
50
|
+
throw new Error("generate needs --schema and --name");
|
|
51
|
+
const generated = generate(migrations, await schemaOf(values.schema), values.name);
|
|
52
|
+
console.log(generated._tag === "Created" ? `created ${migrations}/${generated.id}` : "schema unchanged");
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
case "check": {
|
|
56
|
+
if (values.schema === undefined)
|
|
57
|
+
throw new Error("check needs --schema");
|
|
58
|
+
const bundled = (await load(path.join(migrations, "index.ts"))).migrations;
|
|
59
|
+
const problems = check(migrations, await schemaOf(values.schema), bundled);
|
|
60
|
+
for (const problem of problems)
|
|
61
|
+
console.error(problem);
|
|
62
|
+
return problems.length === 0 ? 0 : 1;
|
|
63
|
+
}
|
|
64
|
+
case "migrate": {
|
|
65
|
+
if (values.config === undefined)
|
|
66
|
+
throw new Error("migrate needs --config");
|
|
67
|
+
const options = (await load(values.config)).default;
|
|
68
|
+
const exit = await Effect.runPromiseExit(Effect.scoped(Database.make({ ...options, onOpen: "migrate" })).pipe(Effect.provide(Layer.fresh(Bumble.layer()))));
|
|
69
|
+
if (Exit.isFailure(exit)) {
|
|
70
|
+
console.error(Cause.pretty(exit.cause));
|
|
71
|
+
return 1;
|
|
72
|
+
}
|
|
73
|
+
console.log("migrated");
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
default:
|
|
77
|
+
console.error("usage: bumbledb generate | check | migrate");
|
|
78
|
+
return 2;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
process.exitCode = await main(process.argv.slice(2)).catch((error) => {
|
|
82
|
+
console.error(error instanceof Error ? error.message : error);
|
|
83
|
+
return 2;
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
package/dist/capacity.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/** Structural capacity measures and windows. Constructors and generated
|
|
2
2
|
* descriptions share the same checked representation. Bounds are u64;
|
|
3
3
|
* dependent bounds read the target row, measures read the source row. */
|
|
4
|
-
import type { AnyFace, FaceFields, FaceSource, ProjectedShape } from "./face.
|
|
5
|
-
import type { CapacityWindowSpec, WeightSpec } from "./spec.
|
|
4
|
+
import type { AnyFace, FaceFields, FaceSource, ProjectedShape } from "./face.ts";
|
|
5
|
+
import type { CapacityWindowSpec, WeightSpec } from "./spec.ts";
|
|
6
6
|
type CapacityWindow<S extends CapacityWindowSpec = CapacityWindowSpec> = S;
|
|
7
7
|
type CapacityWeight<S extends WeightSpec = WeightSpec> = S;
|
|
8
8
|
interface FieldRef<F extends string = string> {
|
|
@@ -17,9 +17,8 @@ interface BannedWindow<Canonical extends string> {
|
|
|
17
17
|
readonly "banned window spelling — the canonical-utterance law names the one legal form": Canonical;
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
* The path-weight refusal
|
|
21
|
-
*
|
|
22
|
-
* expansion and the spec resolver carry.
|
|
20
|
+
* The path-weight refusal: it names the pinned-column idiom, the same
|
|
21
|
+
* diagnostic the macro expansion and the spec resolver carry.
|
|
23
22
|
*/
|
|
24
23
|
interface RefusedPath<Idiom extends string> {
|
|
25
24
|
readonly "path spelling refused — the vocabulary is closed at the row": Idiom;
|
|
@@ -27,24 +26,22 @@ interface RefusedPath<Idiom extends string> {
|
|
|
27
26
|
type IsNegative<N extends bigint> = `${N}` extends `-${string}` ? true : false;
|
|
28
27
|
/**
|
|
29
28
|
* The dotted-name ban, both mints: a `a.b` spelling is a typed refusal
|
|
30
|
-
*
|
|
29
|
+
* naming the composition idiom — pin the column with a
|
|
31
30
|
* two-column containment (`Device(model, watts) <= Model(id, watts)`) and
|
|
32
31
|
* name the local field.
|
|
33
32
|
*/
|
|
34
33
|
type PathBan<F extends string> = string extends F ? unknown : F extends `${string}.${string}` ? RefusedPath<"pin the column — a two-column containment (Source(ref, f) <= Catalog(id, f)) proves the local copy, then name the local field"> : unknown;
|
|
35
34
|
type NegativeBan<N extends bigint> = bigint extends N ? unknown : IsNegative<N> extends true ? BannedWindow<"capacity bounds are u64 — a negative bound is out of domain"> : unknown;
|
|
36
35
|
/**
|
|
37
|
-
* The
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* the mint. Genuinely different semantics still refuse: negative bounds
|
|
41
|
-
* (out of the u64 domain) and inverted literal bounds.
|
|
36
|
+
* The floor-slot refusals. `{n..n}`, `{0..0}`, unit floors `{1..*}`/`{N..*}` and the vacuous
|
|
37
|
+
* `{0..*}` are harmless equivalent spellings that lower to the one canonical `(lo, hi)` law at the
|
|
38
|
+
* mint; negative bounds (out of the u64 domain) and inverted literal bounds refuse.
|
|
42
39
|
*/
|
|
43
40
|
type FloorBan<N extends bigint> = NegativeBan<N>;
|
|
44
41
|
type RangeBan<Lo extends bigint, Hi extends bigint> = bigint extends Lo ? unknown : bigint extends Hi ? unknown : IsNegative<Lo> extends true ? BannedWindow<"capacity bounds are u64 — a negative bound is out of domain"> : IsNegative<Hi> extends true ? BannedWindow<"capacity bounds are u64 — a negative bound is out of domain"> : unknown;
|
|
45
42
|
/**
|
|
46
|
-
* The
|
|
47
|
-
* `CapacityDimensionMixing` twin
|
|
43
|
+
* The dimension gate's ban row, unit instance (the engine's
|
|
44
|
+
* `CapacityDimensionMixing` twin): a unit (count)
|
|
48
45
|
* window against a `duration` bound counts facts against a span of
|
|
49
46
|
* interval coordinates — a dimension error. Judged on the `capacity`
|
|
50
47
|
* UNIT overload only. Explicit scalar and Duration measures may use
|
|
@@ -55,7 +52,7 @@ type UnitDimensionBan<W extends CapacityWindow> = W extends {
|
|
|
55
52
|
readonly hi: {
|
|
56
53
|
readonly kind: "durationField";
|
|
57
54
|
};
|
|
58
|
-
} ? BannedWindow<"a count of facts bounded by a span of time mixes dimensions
|
|
55
|
+
} ? BannedWindow<"a count of facts bounded by a span of time mixes dimensions — weigh the source with weigh(duration(field)), or bound by a u64 field or literal"> : unknown;
|
|
59
56
|
type KindAt<S extends FaceSource, K extends string> = ProjectedShape<S, K> extends readonly [infer Kind, ...unknown[]] ? Kind : undefined;
|
|
60
57
|
interface BoundOffTargetRoster<K, Roster> {
|
|
61
58
|
readonly "dependent bound must name a field of the TARGET's own row — bound names resolve against the target's full roster": readonly [
|
|
@@ -118,7 +115,7 @@ declare function within<const Lo extends bigint>(lo: Lo & FloorBan<Lo>, hi: "*")
|
|
|
118
115
|
}>;
|
|
119
116
|
/**
|
|
120
117
|
* `{lo..field}` / `{lo..Duration(field)}` — the dependent ceiling, read
|
|
121
|
-
* from the TARGET row per group (
|
|
118
|
+
* from the TARGET row per group (hi slot only). The ref carries no
|
|
122
119
|
* value, so no inversion judgment exists at construction — a per-row
|
|
123
120
|
* inverted window is the judge's typed refusal.
|
|
124
121
|
*/
|
|
@@ -150,7 +147,7 @@ declare function within<const Lo extends bigint, const Hi extends bigint>(lo: Lo
|
|
|
150
147
|
/**
|
|
151
148
|
* `[field]` — the measure: a u64-encoded field of the SOURCE row summed
|
|
152
149
|
* per target group. A dotted path is the typed refusal naming the
|
|
153
|
-
* pinned-column idiom
|
|
150
|
+
* pinned-column idiom; `weigh(duration(field))` is the
|
|
154
151
|
* interval-measure weight — calendar capacity as one statement.
|
|
155
152
|
*/
|
|
156
153
|
declare function weigh<const F extends string>(field: F & PathBan<F>): CapacityWeight<{
|
|
@@ -168,7 +165,7 @@ declare function ref<const F extends string>(field: F & PathBan<F>): FieldRef<F>
|
|
|
168
165
|
* in `within`'s hi slot it is the TARGET row's interval-measure bound
|
|
169
166
|
* in the interval element's unit, not necessarily a clock unit.
|
|
170
167
|
* Explicit u64 measures/bounds may carry that same unit; an unweighted
|
|
171
|
-
* row count cannot be bounded by an interval measure
|
|
168
|
+
* row count cannot be bounded by an interval measure.
|
|
172
169
|
*/
|
|
173
170
|
declare function duration<const F extends string>(field: F & PathBan<F>): DurationRef<F>;
|
|
174
171
|
export type { BoundsOnTarget, CapacityWeight, CapacityWindow, DurationRef, FieldRef, UnitDimensionBan, WeightOnSource };
|
package/dist/capacity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capacity.d.ts","sourceRoot":"","sources":["../src/capacity.ts"],"names":[],"mappings":"AACA;;yEAEyE;AAEzE,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"capacity.d.ts","sourceRoot":"","sources":["../src/capacity.ts"],"names":[],"mappings":"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"}
|
package/dist/capacity.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { AuthoringError } from "
|
|
2
|
-
import { integerValue, recordValue } from "
|
|
1
|
+
import { AuthoringError } from "./errors.js";
|
|
2
|
+
import { integerValue, recordValue } from "./values.js";
|
|
3
3
|
const unitWeight = Object.freeze({ kind: "unit" });
|
|
4
4
|
function assertRowLocal(field, role) {
|
|
5
5
|
if (typeof field !== "string" || !field.isWellFormed())
|
|
6
6
|
throw new AuthoringError({ message: `${role}: expected a well-formed field name` });
|
|
7
7
|
if (field.includes(".")) {
|
|
8
8
|
throw new AuthoringError({
|
|
9
|
-
message: `${role} \`${field}\` walks a reference — the vocabulary is closed at the row
|
|
9
|
+
message: `${role} \`${field}\` walks a reference — the vocabulary is closed at the row: pin the column with a two-column containment (Source(ref, f) <= Catalog(id, f)) and name the local field`
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
return field;
|
|
@@ -31,9 +31,9 @@ function within(lo, hi) {
|
|
|
31
31
|
return admitWindow({ kind: "exact", n: lit(lo) });
|
|
32
32
|
}
|
|
33
33
|
if (hi === "*") {
|
|
34
|
-
// `{0..*}` (vacuous) and `{N..*}` floors are
|
|
35
|
-
//
|
|
36
|
-
//
|
|
34
|
+
// `{0..*}` (vacuous) and `{N..*}` floors are accepted canonical laws:
|
|
35
|
+
// normalization preserves authored statement attribution instead of
|
|
36
|
+
// policing the spelling.
|
|
37
37
|
return admitWindow({ kind: "floor", lo: lit(lo) });
|
|
38
38
|
}
|
|
39
39
|
if (typeof hi === "bigint") {
|
|
@@ -76,7 +76,7 @@ function ref(field) {
|
|
|
76
76
|
* in `within`'s hi slot it is the TARGET row's interval-measure bound
|
|
77
77
|
* in the interval element's unit, not necessarily a clock unit.
|
|
78
78
|
* Explicit u64 measures/bounds may carry that same unit; an unweighted
|
|
79
|
-
* row count cannot be bounded by an interval measure
|
|
79
|
+
* row count cannot be bounded by an interval measure.
|
|
80
80
|
*/
|
|
81
81
|
function duration(field) {
|
|
82
82
|
return Object.freeze({ kind: "durationField", field: assertRowLocal(field, "Duration measure") });
|
package/dist/capacity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capacity.js","sourceRoot":"","sources":["../src/capacity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"capacity.js","sourceRoot":"","sources":["../src/capacity.ts"],"names":[],"mappings":"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"}
|