@bjornpagen/bumbledb-log 1.2.1 → 1.3.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/README.md +152 -63
- package/dist/admin.d.ts +1 -1
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +13 -0
- package/dist/bin.js.map +1 -0
- package/dist/codes.d.ts +1 -1
- package/dist/codes.d.ts.map +1 -1
- package/dist/codes.js +1 -8
- package/dist/codes.js.map +1 -1
- package/dist/errors.d.ts +7 -21
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +11 -45
- package/dist/errors.js.map +1 -1
- package/dist/identity.d.ts +0 -8
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -5
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/machine.d.ts +4 -28
- package/dist/machine.d.ts.map +1 -1
- package/dist/machine.js +183 -246
- package/dist/machine.js.map +1 -1
- package/dist/native.d.ts +59 -154
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js.map +1 -1
- package/dist/options.d.ts +2 -11
- package/dist/options.d.ts.map +1 -1
- package/dist/outcome.d.ts +1 -85
- package/dist/outcome.d.ts.map +1 -1
- package/dist/schema-files.d.ts +16 -0
- package/dist/schema-files.d.ts.map +1 -0
- package/dist/schema-files.js +77 -0
- package/dist/schema-files.js.map +1 -0
- package/dist/schema.d.ts +6 -9
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +8 -8
- package/dist/schema.js.map +1 -1
- package/dist/transition.d.ts +75 -0
- package/dist/transition.d.ts.map +1 -0
- package/dist/transition.js +3 -0
- package/dist/transition.js.map +1 -0
- package/pack-provenance.json +4 -4
- package/package.json +4 -8
- package/dist/migration-ops.d.ts +0 -20
- package/dist/migration-ops.d.ts.map +0 -1
- package/dist/migration-ops.js +0 -7
- package/dist/migration-ops.js.map +0 -1
- package/dist/migrations/bin.d.ts.map +0 -1
- package/dist/migrations/bin.js +0 -30
- package/dist/migrations/bin.js.map +0 -1
- package/dist/migrations/canonical.d.ts +0 -40
- package/dist/migrations/canonical.d.ts.map +0 -1
- package/dist/migrations/canonical.js +0 -156
- package/dist/migrations/canonical.js.map +0 -1
- package/dist/migrations/cli.d.ts +0 -29
- package/dist/migrations/cli.d.ts.map +0 -1
- package/dist/migrations/cli.js +0 -124
- package/dist/migrations/cli.js.map +0 -1
- package/dist/migrations/codec.d.ts +0 -74
- package/dist/migrations/codec.d.ts.map +0 -1
- package/dist/migrations/codec.js +0 -2
- package/dist/migrations/codec.js.map +0 -1
- package/dist/migrations/decode.d.ts +0 -16
- package/dist/migrations/decode.d.ts.map +0 -1
- package/dist/migrations/decode.js +0 -302
- package/dist/migrations/decode.js.map +0 -1
- package/dist/migrations/diff.d.ts +0 -39
- package/dist/migrations/diff.d.ts.map +0 -1
- package/dist/migrations/diff.js +0 -385
- package/dist/migrations/diff.js.map +0 -1
- package/dist/migrations/expr.d.ts +0 -22
- package/dist/migrations/expr.d.ts.map +0 -1
- package/dist/migrations/expr.js +0 -219
- package/dist/migrations/expr.js.map +0 -1
- package/dist/migrations/fail.d.ts +0 -22
- package/dist/migrations/fail.d.ts.map +0 -1
- package/dist/migrations/fail.js +0 -52
- package/dist/migrations/fail.js.map +0 -1
- package/dist/migrations/fsops.d.ts +0 -37
- package/dist/migrations/fsops.d.ts.map +0 -1
- package/dist/migrations/fsops.js +0 -222
- package/dist/migrations/fsops.js.map +0 -1
- package/dist/migrations/generate.d.ts +0 -11
- package/dist/migrations/generate.d.ts.map +0 -1
- package/dist/migrations/generate.js +0 -455
- package/dist/migrations/generate.js.map +0 -1
- package/dist/migrations/index.d.ts +0 -23
- package/dist/migrations/index.d.ts.map +0 -1
- package/dist/migrations/index.js +0 -6
- package/dist/migrations/index.js.map +0 -1
- package/dist/migrations/intent.d.ts +0 -86
- package/dist/migrations/intent.d.ts.map +0 -1
- package/dist/migrations/intent.js +0 -97
- package/dist/migrations/intent.js.map +0 -1
- package/dist/migrations/lock.d.ts +0 -27
- package/dist/migrations/lock.d.ts.map +0 -1
- package/dist/migrations/lock.js +0 -14
- package/dist/migrations/lock.js.map +0 -1
- package/dist/migrations/native.d.ts +0 -26
- package/dist/migrations/native.d.ts.map +0 -1
- package/dist/migrations/native.js +0 -124
- package/dist/migrations/native.js.map +0 -1
- package/dist/migrations/repo.d.ts +0 -38
- package/dist/migrations/repo.d.ts.map +0 -1
- package/dist/migrations/repo.js +0 -191
- package/dist/migrations/repo.js.map +0 -1
- package/dist/migrations/theory.d.ts +0 -21
- package/dist/migrations/theory.d.ts.map +0 -1
- package/dist/migrations/theory.js +0 -107
- package/dist/migrations/theory.js.map +0 -1
- package/dist/migrations/types.d.ts +0 -242
- package/dist/migrations/types.d.ts.map +0 -1
- package/dist/migrations/types.js +0 -2
- package/dist/migrations/types.js.map +0 -1
- package/dist/migrations/workflow.d.ts +0 -11
- package/dist/migrations/workflow.d.ts.map +0 -1
- package/dist/migrations/workflow.js +0 -14
- package/dist/migrations/workflow.js.map +0 -1
- /package/dist/{migrations/bin.d.ts → bin.d.ts} +0 -0
|
@@ -1,455 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `makeGenerator(codec, exclusion)` — the Drizzle-shaped repo-local generation workflow
|
|
3
|
-
* (chapter 33, C11): `generateMigrations` / `checkMigrations`. Generation
|
|
4
|
-
* evaluates the ordinary typed schema value, compares its NATIVE canonical
|
|
5
|
-
* identity/snapshot against the recorded chain, applies declared typed intent
|
|
6
|
-
* through the pure diff, ingests bounded declarative seed rows, and asks the
|
|
7
|
-
* native codec to validate + render + digest the new plan and manifest. Files
|
|
8
|
-
* are written with atomic per-file commits and the manifest last, so an
|
|
9
|
-
* interruption leaves either the old recorded chain or the new one. `check`
|
|
10
|
-
* repeats the same computation in memory and writes NOTHING.
|
|
11
|
-
*
|
|
12
|
-
* The user never writes a migration file: ambiguous rename/drop/backfill/
|
|
13
|
-
* type/data intent is either declared as typed metadata or generation
|
|
14
|
-
* refuses with the complete finite requirement list.
|
|
15
|
-
*
|
|
16
|
-
* The codec and repository-exclusion seams are the injected boundaries: the
|
|
17
|
-
* production binding uses the native codec and kernel lock; authored language
|
|
18
|
-
* tests may script the codec. Acceptance of exclusion/compile uses the native
|
|
19
|
-
* stamped lock (no TS ownership table) and the full compiled chain. Core
|
|
20
|
-
* schema lowering and the core row-cell codec are imported literally.
|
|
21
|
-
*/
|
|
22
|
-
import * as path from "node:path";
|
|
23
|
-
import { Uuid } from "@bjornpagen/bumbledb";
|
|
24
|
-
import { factCellsOf, lower, schemasAgree } from "@bjornpagen/bumbledb/internal/log";
|
|
25
|
-
import { Effect } from "effect";
|
|
26
|
-
import { bytesHex, f64Bits, planJson, renderContract, renderIndex, renderSnapshots } from "#migrations/canonical.ts";
|
|
27
|
-
import { diffSchemas } from "#migrations/diff.ts";
|
|
28
|
-
import { drift, intentRequired, unsupported } from "#migrations/fail.ts";
|
|
29
|
-
import { ensureDirectory, joinPendingIo, readBounded, removeFile, writeDerived, writeImmutable, writeManifest } from "#migrations/fsops.ts";
|
|
30
|
-
import { baseSnapshotPath, contractPath, indexPath, latestSnapshot, manifestPath, planId, planPath, readRepository, snapshotPath, snapshotsSidecarPath } from "#migrations/repo.ts";
|
|
31
|
-
import { parseTheory } from "#migrations/theory.ts";
|
|
32
|
-
const EMPTY_SPEC = { relations: [], statements: [] };
|
|
33
|
-
const MAX_SEQUENCE = 9999;
|
|
34
|
-
const MAX_LABEL = 59; // full id `NNNN-<label>` stays within the native 64 cap
|
|
35
|
-
const SEED_CHUNK = 512;
|
|
36
|
-
const MAX_DERIVED_BYTES = 16 * 1024 * 1024;
|
|
37
|
-
function validLabel(label) {
|
|
38
|
-
if (label.length === 0 || label.length > MAX_LABEL) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
for (const ch of label) {
|
|
42
|
-
if (!((ch >= "a" && ch <= "z") || (ch >= "0" && ch <= "9") || ch === "-")) {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
function deriveLabel(tokens) {
|
|
49
|
-
const joined = tokens
|
|
50
|
-
.filter((token) => token.length > 0)
|
|
51
|
-
.slice(0, 3)
|
|
52
|
-
.join("-");
|
|
53
|
-
const label = joined.length === 0 ? "changes" : joined.slice(0, MAX_LABEL);
|
|
54
|
-
return label.endsWith("-") ? label.slice(0, -1) : label;
|
|
55
|
-
}
|
|
56
|
-
// ---------------------------------------------------------------------------
|
|
57
|
-
// Read caller iterables once, yielding between bounded processing steps.
|
|
58
|
-
// The generated document owns the lowered rows; no second chunk array is
|
|
59
|
-
// necessary. This is incremental ingestion, not a streaming document codec.
|
|
60
|
-
// Values lower through the core's exact row-shape and cell codec.
|
|
61
|
-
// ---------------------------------------------------------------------------
|
|
62
|
-
function planValueOfCell(context, field, cell) {
|
|
63
|
-
switch (field.kind) {
|
|
64
|
-
case "bool":
|
|
65
|
-
return { bool: cell === true };
|
|
66
|
-
case "u64":
|
|
67
|
-
return { u64: String(cell) };
|
|
68
|
-
case "i64":
|
|
69
|
-
return { i64: String(cell) };
|
|
70
|
-
case "f64":
|
|
71
|
-
return { $f64: f64Bits(typeof cell === "number" ? cell : Number.NaN) };
|
|
72
|
-
case "uuid": {
|
|
73
|
-
// The core row-cell codec lowers uuid to its canonical
|
|
74
|
-
// canonical hyphenated UUID string — already the plan wire
|
|
75
|
-
// spelling.
|
|
76
|
-
if (!Uuid.isUuid(cell)) {
|
|
77
|
-
throw new Error(`${context}: uuid cell did not lower to canonical hex`);
|
|
78
|
-
}
|
|
79
|
-
return { uuid: cell };
|
|
80
|
-
}
|
|
81
|
-
case "str":
|
|
82
|
-
return { string: String(cell) };
|
|
83
|
-
case "bytes": {
|
|
84
|
-
if (!(cell instanceof Uint8Array)) {
|
|
85
|
-
throw new Error(`${context}: bytes cell did not lower to bytes`);
|
|
86
|
-
}
|
|
87
|
-
return { fixedBytes: bytesHex(cell) };
|
|
88
|
-
}
|
|
89
|
-
case "interval": {
|
|
90
|
-
if (typeof cell !== "object" || cell === null || !("start" in cell) || !("end" in cell)) {
|
|
91
|
-
throw new Error(`${context}: interval cell did not lower to endpoints`);
|
|
92
|
-
}
|
|
93
|
-
if (field.element === "f64") {
|
|
94
|
-
return { intervalF64: [f64Bits(Number(cell.start)), f64Bits(Number(cell.end))] };
|
|
95
|
-
}
|
|
96
|
-
if (field.element === "i64") {
|
|
97
|
-
return { intervalI64: [String(cell.start), String(cell.end)] };
|
|
98
|
-
}
|
|
99
|
-
return { intervalU64: [String(cell.start), String(cell.end)] };
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
const lowerSeeds = Effect.fn("bumbledb-log.migrations.lowerSeeds")(function* (relations, intents, seedRelations) {
|
|
104
|
-
const operation = "migrations.generate";
|
|
105
|
-
const seedOps = [];
|
|
106
|
-
for (const relationName of seedRelations) {
|
|
107
|
-
const member = relations[relationName];
|
|
108
|
-
if (member?.kind !== "relation") {
|
|
109
|
-
return yield* Effect.fail(unsupported(operation, `seed target ${relationName} is not an ordinary relation value`));
|
|
110
|
-
}
|
|
111
|
-
const fields = Object.entries(member.fields);
|
|
112
|
-
const rows = [];
|
|
113
|
-
for (const intent of intents) {
|
|
114
|
-
if (intent.kind !== "seed" || intent.relation !== relationName) {
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
const refused = (cause) => unsupported(operation, `seed ${relationName}: ${cause instanceof Error ? cause.message : "row refused by the core cell codec"}`);
|
|
118
|
-
yield* Effect.acquireUseRelease(Effect.try({
|
|
119
|
-
try: () => ({ iterator: intent.rows[Symbol.iterator](), done: false }),
|
|
120
|
-
catch: refused
|
|
121
|
-
}), (state) => Effect.gen(function* () {
|
|
122
|
-
while (!state.done) {
|
|
123
|
-
yield* Effect.try({
|
|
124
|
-
try: () => {
|
|
125
|
-
for (let index = 0; index < SEED_CHUNK; index += 1) {
|
|
126
|
-
const next = state.iterator.next();
|
|
127
|
-
if (next.done === true) {
|
|
128
|
-
state.done = true;
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
const fact = next.value;
|
|
132
|
-
const cells = factCellsOf(member, fact);
|
|
133
|
-
rows.push(fields.map(([name, field], ordinal) => planValueOfCell(`seed ${relationName}.${name}`, field, cells[ordinal])));
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
catch: refused
|
|
137
|
-
});
|
|
138
|
-
if (!state.done)
|
|
139
|
-
yield* Effect.yieldNow;
|
|
140
|
-
}
|
|
141
|
-
}), (state) => Effect.sync(() => {
|
|
142
|
-
if (!state.done)
|
|
143
|
-
state.iterator.return?.();
|
|
144
|
-
}));
|
|
145
|
-
}
|
|
146
|
-
seedOps.push({ kind: "seed", target: relationName, rows });
|
|
147
|
-
}
|
|
148
|
-
return seedOps;
|
|
149
|
-
});
|
|
150
|
-
function parseTree(operation, label, text) {
|
|
151
|
-
return Effect.try({
|
|
152
|
-
try: () => JSON.parse(text),
|
|
153
|
-
catch: () => drift(operation, `${label} is not JSON`)
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
export function makeGenerator(codec, exclusion) {
|
|
157
|
-
const analyze = Effect.fn("bumbledb-log.migrations.analyze")(function* (options) {
|
|
158
|
-
const operation = "migrations.analyze";
|
|
159
|
-
if (options.intent !== undefined && !schemasAgree(options.intent.schema, options.schema)) {
|
|
160
|
-
return yield* Effect.fail(unsupported(operation, "the migration intent was declared for a different logical schema than the one being generated"));
|
|
161
|
-
}
|
|
162
|
-
const repoState = yield* readRepository(options.repository);
|
|
163
|
-
// Recorded texts become parsed trees for the bridge; identity is judged
|
|
164
|
-
// from canonical frames natively, never from this formatting.
|
|
165
|
-
const manifestTree = repoState.manifestText === null ? null : yield* parseTree(operation, "manifest.json", repoState.manifestText);
|
|
166
|
-
const snapshotTrees = [];
|
|
167
|
-
for (const [index, text] of repoState.snapshotTexts.entries()) {
|
|
168
|
-
snapshotTrees.push(yield* parseTree(operation, `snapshot ${index}`, text));
|
|
169
|
-
}
|
|
170
|
-
const planTrees = [];
|
|
171
|
-
for (const [index, text] of repoState.planTexts.entries()) {
|
|
172
|
-
planTrees.push(yield* parseTree(operation, `plan ${index}`, text));
|
|
173
|
-
}
|
|
174
|
-
const currentSpec = lower(options.schema);
|
|
175
|
-
const identity = yield* codec.schemaIdentity(currentSpec);
|
|
176
|
-
// Empty-base snapshot is always compiled — empty source is not a shortcut.
|
|
177
|
-
const emptyIdentity = yield* codec.schemaIdentity(EMPTY_SPEC);
|
|
178
|
-
const baseSchemaId = repoState.manifest === null ? emptyIdentity.schemaId : repoState.manifest.baseSchemaId;
|
|
179
|
-
const emptySnapshotTree = yield* parseTree(operation, "empty-base snapshot", emptyIdentity.snapshot);
|
|
180
|
-
const snapshotChain = snapshotTrees.length > 0 ? snapshotTrees : [emptySnapshotTree];
|
|
181
|
-
const chain = yield* codec.verifyChain({
|
|
182
|
-
manifest: manifestTree,
|
|
183
|
-
baseSchemaId: manifestTree === null ? baseSchemaId : null,
|
|
184
|
-
snapshots: snapshotChain,
|
|
185
|
-
plans: planTrees,
|
|
186
|
-
append: null,
|
|
187
|
-
planSet: null
|
|
188
|
-
});
|
|
189
|
-
const previousText = latestSnapshot(repoState);
|
|
190
|
-
const prevSource = previousText === null ? emptyIdentity.snapshot : previousText;
|
|
191
|
-
const parsedPrev = parseTheory(prevSource);
|
|
192
|
-
if (!parsedPrev.ok) {
|
|
193
|
-
return yield* Effect.fail(drift(operation, previousText === null
|
|
194
|
-
? `empty-base snapshot is not the canonical theory grammar: ${parsedPrev.detail}`
|
|
195
|
-
: `recorded snapshot is not the canonical theory grammar: ${parsedPrev.detail}`));
|
|
196
|
-
}
|
|
197
|
-
const prevTheory = parsedPrev.snapshot;
|
|
198
|
-
const currentParsed = parseTheory(identity.snapshot);
|
|
199
|
-
if (!currentParsed.ok) {
|
|
200
|
-
return yield* Effect.fail(drift(operation, `native snapshot is not the canonical theory grammar: ${currentParsed.detail}`));
|
|
201
|
-
}
|
|
202
|
-
const intents = options.intent === undefined ? [] : options.intent.entries;
|
|
203
|
-
const diff = diffSchemas(prevTheory, currentParsed.snapshot, intents);
|
|
204
|
-
const entries = repoState.manifest === null ? [] : repoState.manifest.entries;
|
|
205
|
-
const prevSchemaId = entries.length === 0 ? baseSchemaId : (entries[entries.length - 1]?.toSchemaId ?? baseSchemaId);
|
|
206
|
-
const analysis = {
|
|
207
|
-
manifestTree,
|
|
208
|
-
entries,
|
|
209
|
-
planTrees,
|
|
210
|
-
snapshotTrees,
|
|
211
|
-
planTexts: repoState.planTexts,
|
|
212
|
-
snapshotTexts: repoState.snapshotTexts,
|
|
213
|
-
emptySnapshot: emptyIdentity.snapshot,
|
|
214
|
-
baseSchemaId,
|
|
215
|
-
headPrefixDigest: chain.headPrefixDigest,
|
|
216
|
-
currentSchemaId: identity.schemaId,
|
|
217
|
-
currentSnapshot: identity.snapshot,
|
|
218
|
-
prevSchemaId,
|
|
219
|
-
diff,
|
|
220
|
-
changed: prevSchemaId !== identity.schemaId || !diff.identity,
|
|
221
|
-
hasSeeds: diff.seedRelations.length > 0,
|
|
222
|
-
seedIntents: intents,
|
|
223
|
-
staleDrafts: repoState.staleDrafts,
|
|
224
|
-
snapshotChain
|
|
225
|
-
};
|
|
226
|
-
return analysis;
|
|
227
|
-
});
|
|
228
|
-
function contractOf(analysis, appended) {
|
|
229
|
-
if (appended !== null) {
|
|
230
|
-
return {
|
|
231
|
-
contractVersion: 1,
|
|
232
|
-
schemaId: appended.entry.toSchemaId,
|
|
233
|
-
appliedPrefixDigest: appended.entry.prefixDigest,
|
|
234
|
-
steps: (analysis.entries.length + 1).toString(10)
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
return {
|
|
238
|
-
contractVersion: 1,
|
|
239
|
-
schemaId: analysis.prevSchemaId,
|
|
240
|
-
appliedPrefixDigest: analysis.headPrefixDigest,
|
|
241
|
-
steps: analysis.entries.length.toString(10)
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
// -------------------------------------------------------------------------
|
|
245
|
-
// generateMigrations
|
|
246
|
-
// -------------------------------------------------------------------------
|
|
247
|
-
function exclusive(operation, directory, body) {
|
|
248
|
-
return Effect.uninterruptibleMask((restore) => Effect.scoped(Effect.gen(function* () {
|
|
249
|
-
// L16 `internalAcquireRepositoryLock` registers
|
|
250
|
-
// `RepositoryLock.release` (`logRepositoryLockRelease`)
|
|
251
|
-
// before its interruptible mint. After the lease exists,
|
|
252
|
-
// cancel/defect/success must join host I/O first; Scope
|
|
253
|
-
// then runs that release. Do not call `lock.release`
|
|
254
|
-
// here — L16 does not consume the slot on explicit
|
|
255
|
-
// release (request: clear `slot.owner` after
|
|
256
|
-
// `joinLockRelease` so `joinPendingIo.andThen(lock.release)`
|
|
257
|
-
// is the one close).
|
|
258
|
-
yield* restore(exclusion.acquire(operation, directory));
|
|
259
|
-
return yield* restore(body).pipe(Effect.ensuring(joinPendingIo));
|
|
260
|
-
})));
|
|
261
|
-
}
|
|
262
|
-
const generateMigrations = Effect.fn("bumbledb-log.generateMigrations")(function* (options) {
|
|
263
|
-
const operation = "migrations.generate";
|
|
264
|
-
const directory = options.repository.directory;
|
|
265
|
-
return yield* exclusive(operation, directory, Effect.gen(function* () {
|
|
266
|
-
yield* ensureDirectory(operation, directory);
|
|
267
|
-
if (options.label !== undefined && !validLabel(options.label)) {
|
|
268
|
-
return yield* Effect.fail(unsupported(operation, `label must be 1..${MAX_LABEL} characters of [a-z0-9-]`));
|
|
269
|
-
}
|
|
270
|
-
const analysis = yield* analyze(options);
|
|
271
|
-
if (analysis.diff.requirements.length > 0) {
|
|
272
|
-
return yield* Effect.fail(intentRequired(operation, analysis.diff.requirements));
|
|
273
|
-
}
|
|
274
|
-
if (!analysis.changed && !analysis.hasSeeds) {
|
|
275
|
-
// Nothing to record. Remove interrupted-generation leftovers and repair
|
|
276
|
-
// derived files only when they drifted from the recorded chain (never
|
|
277
|
-
// touch recorded history).
|
|
278
|
-
const removed = [];
|
|
279
|
-
for (const draft of analysis.staleDrafts) {
|
|
280
|
-
yield* removeFile(operation, path.join(directory, draft));
|
|
281
|
-
removed.push(draft);
|
|
282
|
-
}
|
|
283
|
-
const contract = contractOf(analysis, null);
|
|
284
|
-
const files = [];
|
|
285
|
-
if (analysis.entries.length > 0) {
|
|
286
|
-
const wantIndex = renderIndex(analysis.entries);
|
|
287
|
-
const haveIndex = yield* readBounded(operation, indexPath(directory), MAX_DERIVED_BYTES);
|
|
288
|
-
if (haveIndex !== wantIndex) {
|
|
289
|
-
yield* writeDerived(operation, indexPath(directory), wantIndex);
|
|
290
|
-
files.push("index.ts");
|
|
291
|
-
}
|
|
292
|
-
const wantSnapshots = renderSnapshots(analysis.snapshotTexts);
|
|
293
|
-
const haveSnapshots = yield* readBounded(operation, snapshotsSidecarPath(directory), MAX_DERIVED_BYTES);
|
|
294
|
-
if (haveSnapshots !== wantSnapshots) {
|
|
295
|
-
yield* writeDerived(operation, snapshotsSidecarPath(directory), wantSnapshots);
|
|
296
|
-
files.push("snapshots.json");
|
|
297
|
-
}
|
|
298
|
-
const wantContract = renderContract(contract);
|
|
299
|
-
const haveContract = yield* readBounded(operation, contractPath(options.repository), MAX_DERIVED_BYTES);
|
|
300
|
-
if (haveContract !== wantContract) {
|
|
301
|
-
yield* writeDerived(operation, contractPath(options.repository), wantContract);
|
|
302
|
-
files.push(path.basename(contractPath(options.repository)));
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
const report = { status: "unchanged", planId: null, contract, files, removed };
|
|
306
|
-
return report;
|
|
307
|
-
}
|
|
308
|
-
const sequence = analysis.entries.length;
|
|
309
|
-
if (sequence > MAX_SEQUENCE) {
|
|
310
|
-
return yield* Effect.fail(unsupported(operation, `the manifest already records ${MAX_SEQUENCE + 1} plans`));
|
|
311
|
-
}
|
|
312
|
-
const label = options.label ?? deriveLabel(analysis.diff.labelTokens);
|
|
313
|
-
const id = planId(sequence, label);
|
|
314
|
-
// Seeds are ingested exactly once, bounded, at generation time.
|
|
315
|
-
const seedOps = yield* lowerSeeds(options.schema.relations, analysis.seedIntents, analysis.diff.seedRelations);
|
|
316
|
-
const operations = [
|
|
317
|
-
...analysis.diff.operations,
|
|
318
|
-
...seedOps,
|
|
319
|
-
{ kind: "validate-schema", schemaId: analysis.currentSchemaId }
|
|
320
|
-
];
|
|
321
|
-
const plan = {
|
|
322
|
-
planVersion: 1,
|
|
323
|
-
sequence: sequence.toString(10),
|
|
324
|
-
id,
|
|
325
|
-
fromSchemaId: analysis.prevSchemaId,
|
|
326
|
-
toSchemaId: analysis.currentSchemaId,
|
|
327
|
-
operations,
|
|
328
|
-
destructive: analysis.diff.destructive
|
|
329
|
-
};
|
|
330
|
-
// Native validation + canonical rendering + digest + manifest append.
|
|
331
|
-
const currentTree = yield* parseTree(operation, "current snapshot", analysis.currentSnapshot);
|
|
332
|
-
const chain = yield* codec.verifyChain({
|
|
333
|
-
manifest: analysis.manifestTree,
|
|
334
|
-
baseSchemaId: analysis.manifestTree === null ? analysis.baseSchemaId : null,
|
|
335
|
-
snapshots: [...analysis.snapshotChain, currentTree],
|
|
336
|
-
plans: analysis.planTrees,
|
|
337
|
-
append: planJson(plan),
|
|
338
|
-
planSet: null
|
|
339
|
-
});
|
|
340
|
-
if (chain.appended === null) {
|
|
341
|
-
return yield* Effect.fail(drift(operation, "the native chain pass did not append the validated plan"));
|
|
342
|
-
}
|
|
343
|
-
const contract = contractOf(analysis, chain.appended);
|
|
344
|
-
// Write order is the interruption-safety contract: snapshot and plan are
|
|
345
|
-
// inert until the manifest (the commit point) records them; index and
|
|
346
|
-
// contract are derived and rewritten deterministically. Leftovers of a
|
|
347
|
-
// previously interrupted generation under a different derived label are
|
|
348
|
-
// removed first — they were never recorded, and leaving them would read
|
|
349
|
-
// as drift once the manifest advances past their sequence.
|
|
350
|
-
yield* ensureDirectory(operation, path.join(directory, "meta"));
|
|
351
|
-
const written = new Set([
|
|
352
|
-
`${id}.plan.json`,
|
|
353
|
-
`meta/${sequence.toString(10).padStart(4, "0")}.schema.json`,
|
|
354
|
-
"meta/base.schema.json"
|
|
355
|
-
]);
|
|
356
|
-
const removed = [];
|
|
357
|
-
for (const draft of analysis.staleDrafts) {
|
|
358
|
-
if (written.has(draft)) {
|
|
359
|
-
continue;
|
|
360
|
-
}
|
|
361
|
-
yield* removeFile(operation, path.join(directory, draft));
|
|
362
|
-
removed.push(draft);
|
|
363
|
-
}
|
|
364
|
-
const uniqueSnapshots = analysis.snapshotTexts.length > 0
|
|
365
|
-
? [...analysis.snapshotTexts, analysis.currentSnapshot]
|
|
366
|
-
: [analysis.emptySnapshot, analysis.currentSnapshot];
|
|
367
|
-
yield* writeImmutable(operation, baseSnapshotPath(directory), analysis.emptySnapshot);
|
|
368
|
-
yield* writeImmutable(operation, snapshotPath(directory, sequence), analysis.currentSnapshot);
|
|
369
|
-
yield* writeImmutable(operation, planPath(directory, id), chain.appended.planText);
|
|
370
|
-
yield* writeManifest(operation, manifestPath(directory), chain.appended.manifestText);
|
|
371
|
-
yield* writeDerived(operation, indexPath(directory), renderIndex([...analysis.entries, chain.appended.entry]));
|
|
372
|
-
yield* writeDerived(operation, snapshotsSidecarPath(directory), renderSnapshots(uniqueSnapshots));
|
|
373
|
-
yield* writeDerived(operation, contractPath(options.repository), renderContract(contract));
|
|
374
|
-
const report = {
|
|
375
|
-
status: "generated",
|
|
376
|
-
planId: id,
|
|
377
|
-
contract,
|
|
378
|
-
files: [
|
|
379
|
-
"meta/base.schema.json",
|
|
380
|
-
`meta/${sequence.toString(10).padStart(4, "0")}.schema.json`,
|
|
381
|
-
`${id}.plan.json`,
|
|
382
|
-
"manifest.json",
|
|
383
|
-
"index.ts",
|
|
384
|
-
"snapshots.json",
|
|
385
|
-
path.basename(contractPath(options.repository))
|
|
386
|
-
],
|
|
387
|
-
removed
|
|
388
|
-
};
|
|
389
|
-
return report;
|
|
390
|
-
}));
|
|
391
|
-
});
|
|
392
|
-
// -------------------------------------------------------------------------
|
|
393
|
-
// checkMigrations — the same computation, writing nothing.
|
|
394
|
-
// -------------------------------------------------------------------------
|
|
395
|
-
const checkMigrations = Effect.fn("bumbledb-log.checkMigrations")(function* (options) {
|
|
396
|
-
const operation = "migrations.check";
|
|
397
|
-
const directory = options.repository.directory;
|
|
398
|
-
return yield* exclusive(operation, directory, Effect.gen(function* () {
|
|
399
|
-
const analysis = yield* analyze(options);
|
|
400
|
-
if (analysis.diff.requirements.length > 0) {
|
|
401
|
-
return yield* Effect.fail(intentRequired(operation, analysis.diff.requirements));
|
|
402
|
-
}
|
|
403
|
-
const contract = contractOf(analysis, null);
|
|
404
|
-
if (analysis.changed || analysis.hasSeeds) {
|
|
405
|
-
let detail = "declared seed data has no recorded plan";
|
|
406
|
-
if (analysis.changed && analysis.hasSeeds) {
|
|
407
|
-
detail = "the schema and declared seed data have changes with no recorded plan";
|
|
408
|
-
}
|
|
409
|
-
else if (analysis.prevSchemaId !== analysis.currentSchemaId) {
|
|
410
|
-
detail = "the schema differs from the latest recorded snapshot";
|
|
411
|
-
}
|
|
412
|
-
else if (analysis.changed) {
|
|
413
|
-
detail = "declared field conversions have no recorded plan";
|
|
414
|
-
}
|
|
415
|
-
const report = {
|
|
416
|
-
status: "generation-required",
|
|
417
|
-
detail,
|
|
418
|
-
contract
|
|
419
|
-
};
|
|
420
|
-
return report;
|
|
421
|
-
}
|
|
422
|
-
if (analysis.staleDrafts.length > 0) {
|
|
423
|
-
const report = {
|
|
424
|
-
status: "generation-required",
|
|
425
|
-
detail: `interrupted generation leftovers exist (${analysis.staleDrafts.join(", ")}); rerun generate`,
|
|
426
|
-
contract
|
|
427
|
-
};
|
|
428
|
-
return report;
|
|
429
|
-
}
|
|
430
|
-
// Recorded chain verified natively in analyze; now hold the derived files
|
|
431
|
-
// and the latest snapshot to their recorded meaning, byte for byte.
|
|
432
|
-
if (analysis.entries.length > 0) {
|
|
433
|
-
const wantIndex = renderIndex(analysis.entries);
|
|
434
|
-
const haveIndex = yield* readBounded(operation, indexPath(directory), MAX_DERIVED_BYTES);
|
|
435
|
-
if (haveIndex !== wantIndex) {
|
|
436
|
-
return yield* Effect.fail(drift(operation, "index.ts does not match the recorded manifest"));
|
|
437
|
-
}
|
|
438
|
-
const wantSnapshots = renderSnapshots(analysis.snapshotTexts);
|
|
439
|
-
const haveSnapshots = yield* readBounded(operation, snapshotsSidecarPath(directory), MAX_DERIVED_BYTES);
|
|
440
|
-
if (haveSnapshots !== wantSnapshots) {
|
|
441
|
-
return yield* Effect.fail(drift(operation, "snapshots.json does not match the recorded snapshot chain"));
|
|
442
|
-
}
|
|
443
|
-
const wantContract = renderContract(contract);
|
|
444
|
-
const haveContract = yield* readBounded(operation, contractPath(options.repository), MAX_DERIVED_BYTES);
|
|
445
|
-
if (haveContract !== wantContract) {
|
|
446
|
-
return yield* Effect.fail(drift(operation, "runtime-contract.json does not match the recorded chain head"));
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
const report = { status: "clean", detail: "recorded chain verified; schema unchanged", contract };
|
|
450
|
-
return report;
|
|
451
|
-
}));
|
|
452
|
-
});
|
|
453
|
-
return { generateMigrations, checkMigrations };
|
|
454
|
-
}
|
|
455
|
-
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/migrations/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `@bjornpagen/bumbledb-log/migrations` — generation, checking and the
|
|
3
|
-
* explicit admin workflow over generated inert plan data. Pure intent
|
|
4
|
-
* constructors live in `@bjornpagen/bumbledb-log/schema`.
|
|
5
|
-
*
|
|
6
|
-
* The runner operations (`migrationStatus`, `initialize`, `migrate`,
|
|
7
|
-
* `activateMigration`, `abortMigration`) are re-exported from
|
|
8
|
-
* `#migration-ops.ts`; their outcomes come from `#outcome.ts`. Generation
|
|
9
|
-
* and checking use the same native migration codec as execution.
|
|
10
|
-
*/
|
|
11
|
-
export type { AdminIdentityOptions } from "../machine.js";
|
|
12
|
-
export { abortMigration, activateMigration, initialize, migrate, migrationStatus } from "../migration-ops.js";
|
|
13
|
-
export type { DecodeResult } from "./decode.js";
|
|
14
|
-
export { decodeActivationRef, decodeGeneratedMigrations, decodeManifestData, decodePlanData, decodeReadyToSwitchActivation, decodeRuntimeContract } from "./decode.js";
|
|
15
|
-
export type { MigrationIntent, MigrationIntentEntry } from "./intent.js";
|
|
16
|
-
export { backfill, convert, dropField, dropRelation, migrationIntent, renameField, renameRelation, seed } from "./intent.js";
|
|
17
|
-
export type { HeldRepositoryLock, RepositoryExclusion } from "./lock.js";
|
|
18
|
-
export type { TheoryResult } from "./theory.js";
|
|
19
|
-
export { EMPTY_THEORY, parseTheory } from "./theory.js";
|
|
20
|
-
export type { ActivationRef, CheckOptions, CheckReport, GeneratedMigrations, GenerateOptions, GenerationReport, ManifestEntry, MigrationManifest, MigrationPlan, MigrationRepository, PlanExpression, PlanFieldMap, PlanLoss, PlanOperation, PlanValue, RuntimeContract, TheoryField, TheoryRelation, TheorySnapshot } from "./types.js";
|
|
21
|
-
export { checkMigrations, generateMigrations } from "./workflow.js";
|
|
22
|
-
export type { AbortReport, ActivationReport, AdminOutcome, InitializeValue, MigrateValue, MigrationRef, MigrationStatus } from "../outcome.js";
|
|
23
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC3G,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EACN,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,cAAc,EACd,6BAA6B,EAC7B,qBAAqB,EACrB,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EACN,QAAQ,EACR,OAAO,EACP,SAAS,EACT,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,IAAI,EACJ,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAClF,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACjE,YAAY,EACX,aAAa,EACb,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,eAAe,EACf,WAAW,EACX,cAAc,EACd,cAAc,EACd,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC7E,YAAY,EACX,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,MAAM,aAAa,CAAA"}
|
package/dist/migrations/index.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { abortMigration, activateMigration, initialize, migrate, migrationStatus } from "#migration-ops.ts";
|
|
2
|
-
export { decodeActivationRef, decodeGeneratedMigrations, decodeManifestData, decodePlanData, decodeReadyToSwitchActivation, decodeRuntimeContract } from "#migrations/decode.ts";
|
|
3
|
-
export { backfill, convert, dropField, dropRelation, migrationIntent, renameField, renameRelation, seed } from "#migrations/intent.ts";
|
|
4
|
-
export { EMPTY_THEORY, parseTheory } from "#migrations/theory.ts";
|
|
5
|
-
export { checkMigrations, generateMigrations } from "#migrations/workflow.ts";
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE3G,OAAO,EACN,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,cAAc,EACd,6BAA6B,EAC7B,qBAAqB,EACrB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACN,QAAQ,EACR,OAAO,EACP,SAAS,EACT,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,IAAI,EACJ,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAsBjE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA"}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure declarative schema-evolution intent. These constructors build inert
|
|
3
|
-
* authoring metadata: no rows are consumed, no schema is lowered, hashed or
|
|
4
|
-
* admitted, and no I/O happens here. Ambiguous rename/drop/backfill/convert
|
|
5
|
-
* and business seed data are typed inputs to bounded generation, never
|
|
6
|
-
* imperative migration files under another name. Expressions are the core's
|
|
7
|
-
* own `ScalarExpr` values — the generator serializes them into
|
|
8
|
-
* canonical plan data and the native executor evaluates them; there is no
|
|
9
|
-
* migration-only expression interpreter.
|
|
10
|
-
*/
|
|
11
|
-
import type { AnyRelation, Fact, RelationFields, ScalarExpr, ScalarKind, Schema, SchemaRelations } from "@bjornpagen/bumbledb";
|
|
12
|
-
export type MigrationIntentEntry = {
|
|
13
|
-
readonly kind: "rename-relation";
|
|
14
|
-
readonly from: string;
|
|
15
|
-
readonly to: string;
|
|
16
|
-
} | {
|
|
17
|
-
readonly kind: "rename-field";
|
|
18
|
-
readonly relation: string;
|
|
19
|
-
readonly from: string;
|
|
20
|
-
readonly to: string;
|
|
21
|
-
} | {
|
|
22
|
-
readonly kind: "drop-relation";
|
|
23
|
-
readonly relation: string;
|
|
24
|
-
} | {
|
|
25
|
-
readonly kind: "drop-field";
|
|
26
|
-
readonly relation: string;
|
|
27
|
-
readonly field: string;
|
|
28
|
-
} | {
|
|
29
|
-
readonly kind: "backfill";
|
|
30
|
-
readonly relation: string;
|
|
31
|
-
readonly field: string;
|
|
32
|
-
readonly expression: ScalarExpr;
|
|
33
|
-
} | {
|
|
34
|
-
readonly kind: "convert";
|
|
35
|
-
readonly relation: string;
|
|
36
|
-
readonly field: string;
|
|
37
|
-
readonly expression: ScalarExpr;
|
|
38
|
-
} | {
|
|
39
|
-
readonly kind: "seed";
|
|
40
|
-
readonly relation: string;
|
|
41
|
-
readonly rows: Iterable<Readonly<Record<string, unknown>>>;
|
|
42
|
-
};
|
|
43
|
-
/**
|
|
44
|
-
* Inert authoring metadata: the schema value plus its evolution entries.
|
|
45
|
-
* Seed iterables are retained caller-owned and are consumed exactly once,
|
|
46
|
-
* inside bounded generation — constructing this value ingests nothing.
|
|
47
|
-
*/
|
|
48
|
-
export interface MigrationIntent<Rels extends SchemaRelations> {
|
|
49
|
-
readonly schema: Schema<Rels>;
|
|
50
|
-
readonly entries: readonly MigrationIntentEntry[];
|
|
51
|
-
}
|
|
52
|
-
/** Known expression kinds must match the target descriptor, not its host primitive. */
|
|
53
|
-
type TargetKind<R extends AnyRelation, K extends keyof RelationFields<R>> = RelationFields<R>[K] extends {
|
|
54
|
-
readonly closed: unknown;
|
|
55
|
-
} ? never : Extract<RelationFields<R>[K]["kind"], ScalarKind>;
|
|
56
|
-
export declare function migrationIntent<Rels extends SchemaRelations>(schema: Schema<Rels>, entries: readonly MigrationIntentEntry[]): MigrationIntent<Rels>;
|
|
57
|
-
/** Identity intent: the relation previously named `from` is now `to`. */
|
|
58
|
-
export declare function renameRelation(from: string, to: AnyRelation): MigrationIntentEntry;
|
|
59
|
-
/** Identity intent: `relation`'s field previously named `from` is now `to`. */
|
|
60
|
-
export declare function renameField<R extends AnyRelation, K extends keyof Fact<R> & string>(relation: R, from: string, to: K): MigrationIntentEntry;
|
|
61
|
-
/** The explicit whole-relation data-loss acknowledgement IS this constructor. */
|
|
62
|
-
export declare function dropRelation(relation: string): MigrationIntentEntry;
|
|
63
|
-
/** The explicit field data-loss acknowledgement. `relation` is the surviving relation. */
|
|
64
|
-
export declare function dropField(relation: AnyRelation | string, field: string): MigrationIntentEntry;
|
|
65
|
-
/**
|
|
66
|
-
* A value for a NEW required field, as a core `ScalarExpr` over the source
|
|
67
|
-
* row's old fields — including unresolved field arithmetic. Native compile
|
|
68
|
-
* binds kinds; this constructor does not require a resolved result. No
|
|
69
|
-
* fabricated zero/null and no callback.
|
|
70
|
-
*/
|
|
71
|
-
export declare function backfill<R extends AnyRelation, K extends keyof Fact<R> & string>(relation: R, field: K, expression: ScalarExpr<NoInfer<TargetKind<R, K>> | "unresolved">): MigrationIntentEntry;
|
|
72
|
-
/**
|
|
73
|
-
* An explicit conversion for an EXISTING field whose type or meaning
|
|
74
|
-
* changes, as a core `ScalarExpr` over the source row's old fields —
|
|
75
|
-
* including unresolved field arithmetic (`Scalar.add(Scalar.field("units"),
|
|
76
|
-
* Scalar.u64(1n))`). Same-schema convert is a recorded plan, not a no-op.
|
|
77
|
-
*/
|
|
78
|
-
export declare function convert<R extends AnyRelation, K extends keyof Fact<R> & string>(relation: R, field: K, expression: ScalarExpr<NoInfer<TargetKind<R, K>> | "unresolved">): MigrationIntentEntry;
|
|
79
|
-
/**
|
|
80
|
-
* Declarative fixed seed facts with explicitly supplied application IDs.
|
|
81
|
-
* The iterable stays caller-owned and stable until generation settles; it is
|
|
82
|
-
* read once in cooperative batches, with native validation before publication.
|
|
83
|
-
*/
|
|
84
|
-
export declare function seed<R extends AnyRelation>(relation: R, rows: Iterable<Fact<R>>): MigrationIntentEntry;
|
|
85
|
-
export {};
|
|
86
|
-
//# sourceMappingURL=intent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/migrations/intent.ts"],"names":[],"mappings":"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"}
|