@minnowdb/core 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +27 -1
- package/dist/block-format/block.d.ts +46 -0
- package/dist/block-format/block.d.ts.map +1 -0
- package/dist/block-format/block.js +244 -0
- package/dist/block-format/block.js.map +1 -0
- package/dist/block-format/checksum.d.ts +7 -0
- package/dist/block-format/checksum.d.ts.map +1 -0
- package/dist/block-format/checksum.js +56 -0
- package/dist/block-format/checksum.js.map +1 -0
- package/dist/block-format/codecs.d.ts +24 -0
- package/dist/block-format/codecs.d.ts.map +1 -0
- package/dist/block-format/codecs.js +102 -0
- package/dist/block-format/codecs.js.map +1 -0
- package/dist/block-format/column.d.ts +8 -0
- package/dist/block-format/column.d.ts.map +1 -0
- package/dist/block-format/column.js +166 -0
- package/dist/block-format/column.js.map +1 -0
- package/dist/block-format/index.d.ts +7 -0
- package/dist/block-format/index.d.ts.map +1 -0
- package/dist/block-format/index.js +7 -0
- package/dist/block-format/index.js.map +1 -0
- package/dist/block-format/physical.d.ts +20 -0
- package/dist/block-format/physical.d.ts.map +1 -0
- package/dist/block-format/physical.js +439 -0
- package/dist/block-format/physical.js.map +1 -0
- package/dist/block-format/types.d.ts +93 -0
- package/dist/block-format/types.d.ts.map +1 -0
- package/dist/block-format/types.js +2 -0
- package/dist/block-format/types.js.map +1 -0
- package/dist/engine/artifact-cache.d.ts +22 -0
- package/dist/engine/artifact-cache.d.ts.map +1 -0
- package/dist/engine/artifact-cache.js +68 -0
- package/dist/engine/artifact-cache.js.map +1 -0
- package/dist/engine/batch.d.ts +28 -0
- package/dist/engine/batch.d.ts.map +1 -0
- package/dist/engine/batch.js +38 -0
- package/dist/engine/batch.js.map +1 -0
- package/dist/engine/buffered-writer.d.ts +43 -0
- package/dist/engine/buffered-writer.d.ts.map +1 -0
- package/dist/engine/buffered-writer.js +158 -0
- package/dist/engine/buffered-writer.js.map +1 -0
- package/dist/engine/catalog.d.ts +82 -0
- package/dist/engine/catalog.d.ts.map +1 -0
- package/dist/engine/catalog.js +47 -0
- package/dist/engine/catalog.js.map +1 -0
- package/dist/engine/client.d.ts +211 -0
- package/dist/engine/client.d.ts.map +1 -0
- package/dist/engine/client.js +538 -0
- package/dist/engine/client.js.map +1 -0
- package/dist/engine/coordinator.d.ts +17 -0
- package/dist/engine/coordinator.d.ts.map +1 -0
- package/dist/engine/coordinator.js +60 -0
- package/dist/engine/coordinator.js.map +1 -0
- package/dist/engine/database.d.ts +661 -0
- package/dist/engine/database.d.ts.map +1 -0
- package/dist/engine/database.js +10313 -0
- package/dist/engine/database.js.map +1 -0
- package/dist/engine/defaults.d.ts +33 -0
- package/dist/engine/defaults.d.ts.map +1 -0
- package/dist/engine/defaults.js +87 -0
- package/dist/engine/defaults.js.map +1 -0
- package/dist/engine/dsl/db.d.ts +137 -0
- package/dist/engine/dsl/db.d.ts.map +1 -0
- package/dist/engine/dsl/db.js +161 -0
- package/dist/engine/dsl/db.js.map +1 -0
- package/dist/engine/dsl/expression.d.ts +172 -0
- package/dist/engine/dsl/expression.d.ts.map +1 -0
- package/dist/engine/dsl/expression.js +397 -0
- package/dist/engine/dsl/expression.js.map +1 -0
- package/dist/engine/dsl/index.d.ts +8 -0
- package/dist/engine/dsl/index.d.ts.map +1 -0
- package/dist/engine/dsl/index.js +7 -0
- package/dist/engine/dsl/index.js.map +1 -0
- package/dist/engine/dsl/live-query.d.ts +45 -0
- package/dist/engine/dsl/live-query.d.ts.map +1 -0
- package/dist/engine/dsl/live-query.js +116 -0
- package/dist/engine/dsl/live-query.js.map +1 -0
- package/dist/engine/dsl/mutations.d.ts +123 -0
- package/dist/engine/dsl/mutations.d.ts.map +1 -0
- package/dist/engine/dsl/mutations.js +241 -0
- package/dist/engine/dsl/mutations.js.map +1 -0
- package/dist/engine/dsl/select-query-builder.d.ts +148 -0
- package/dist/engine/dsl/select-query-builder.d.ts.map +1 -0
- package/dist/engine/dsl/select-query-builder.js +377 -0
- package/dist/engine/dsl/select-query-builder.js.map +1 -0
- package/dist/engine/dsl/sql-tag.d.ts +46 -0
- package/dist/engine/dsl/sql-tag.d.ts.map +1 -0
- package/dist/engine/dsl/sql-tag.js +85 -0
- package/dist/engine/dsl/sql-tag.js.map +1 -0
- package/dist/engine/dsl/types.d.ts +133 -0
- package/dist/engine/dsl/types.d.ts.map +1 -0
- package/dist/engine/dsl/types.js +9 -0
- package/dist/engine/dsl/types.js.map +1 -0
- package/dist/engine/errors.d.ts +55 -0
- package/dist/engine/errors.d.ts.map +1 -0
- package/dist/engine/errors.js +81 -0
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/fts.d.ts +93 -0
- package/dist/engine/fts.d.ts.map +1 -0
- package/dist/engine/fts.js +273 -0
- package/dist/engine/fts.js.map +1 -0
- package/dist/engine/group-index.d.ts +32 -0
- package/dist/engine/group-index.d.ts.map +1 -0
- package/dist/engine/group-index.js +366 -0
- package/dist/engine/group-index.js.map +1 -0
- package/dist/engine/index.d.ts +13 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +12 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/join-index.d.ts +12 -0
- package/dist/engine/join-index.d.ts.map +1 -0
- package/dist/engine/join-index.js +217 -0
- package/dist/engine/join-index.js.map +1 -0
- package/dist/engine/live.d.ts +86 -0
- package/dist/engine/live.d.ts.map +1 -0
- package/dist/engine/live.js +289 -0
- package/dist/engine/live.js.map +1 -0
- package/dist/engine/memory.d.ts +37 -0
- package/dist/engine/memory.d.ts.map +1 -0
- package/dist/engine/memory.js +119 -0
- package/dist/engine/memory.js.map +1 -0
- package/dist/engine/optimizer.d.ts +20 -0
- package/dist/engine/optimizer.d.ts.map +1 -0
- package/dist/engine/optimizer.js +1170 -0
- package/dist/engine/optimizer.js.map +1 -0
- package/dist/engine/query-cache.d.ts +10 -0
- package/dist/engine/query-cache.d.ts.map +1 -0
- package/dist/engine/query-cache.js +58 -0
- package/dist/engine/query-cache.js.map +1 -0
- package/dist/engine/query.d.ts +844 -0
- package/dist/engine/query.d.ts.map +1 -0
- package/dist/engine/query.js +7450 -0
- package/dist/engine/query.js.map +1 -0
- package/dist/engine/schema-wire.d.ts +92 -0
- package/dist/engine/schema-wire.d.ts.map +1 -0
- package/dist/engine/schema-wire.js +115 -0
- package/dist/engine/schema-wire.js.map +1 -0
- package/dist/engine/schema.d.ts +394 -0
- package/dist/engine/schema.d.ts.map +1 -0
- package/dist/engine/schema.js +709 -0
- package/dist/engine/schema.js.map +1 -0
- package/dist/engine/sort-keys.d.ts +36 -0
- package/dist/engine/sort-keys.d.ts.map +1 -0
- package/dist/engine/sort-keys.js +60 -0
- package/dist/engine/sort-keys.js.map +1 -0
- package/dist/engine/sql-json.d.ts +30 -0
- package/dist/engine/sql-json.d.ts.map +1 -0
- package/dist/engine/sql-json.js +120 -0
- package/dist/engine/sql-json.js.map +1 -0
- package/dist/engine/sql-semantics.d.ts +31 -0
- package/dist/engine/sql-semantics.d.ts.map +1 -0
- package/dist/engine/sql-semantics.js +121 -0
- package/dist/engine/sql-semantics.js.map +1 -0
- package/dist/engine/vector.d.ts +87 -0
- package/dist/engine/vector.d.ts.map +1 -0
- package/dist/engine/vector.js +4227 -0
- package/dist/engine/vector.js.map +1 -0
- package/dist/engine/worker-host.d.ts +48 -0
- package/dist/engine/worker-host.d.ts.map +1 -0
- package/dist/engine/worker-host.js +501 -0
- package/dist/engine/worker-host.js.map +1 -0
- package/dist/engine/worker.d.ts +2 -0
- package/dist/engine/worker.d.ts.map +1 -0
- package/dist/engine/worker.js +14 -0
- package/dist/engine/worker.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/plan/index.d.ts +17 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +17 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/storage/fixture-shape.d.ts +42 -0
- package/dist/storage/fixture-shape.d.ts.map +1 -0
- package/dist/storage/fixture-shape.js +146 -0
- package/dist/storage/fixture-shape.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/indexeddb.d.ts +139 -0
- package/dist/storage/indexeddb.d.ts.map +1 -0
- package/dist/storage/indexeddb.js +3161 -0
- package/dist/storage/indexeddb.js.map +1 -0
- package/dist/storage/memory.d.ts +121 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +1455 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/snapshot.d.ts +108 -0
- package/dist/storage/snapshot.d.ts.map +1 -0
- package/dist/storage/snapshot.js +276 -0
- package/dist/storage/snapshot.js.map +1 -0
- package/dist/storage/types.d.ts +895 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +1549 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/testing/index.d.ts +76 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +233 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/seeds.d.ts +11 -0
- package/dist/testing/seeds.d.ts.map +1 -0
- package/dist/testing/seeds.js +50 -0
- package/dist/testing/seeds.js.map +1 -0
- package/dist/transactions/index.d.ts +148 -0
- package/dist/transactions/index.d.ts.map +1 -0
- package/dist/transactions/index.js +662 -0
- package/dist/transactions/index.js.map +1 -0
- package/dist/worker-protocol/index.d.ts +84 -0
- package/dist/worker-protocol/index.d.ts.map +1 -0
- package/dist/worker-protocol/index.js +117 -0
- package/dist/worker-protocol/index.js.map +1 -0
- package/package.json +66 -16
- package/sql-feature-matrix.json +1275 -0
- package/index.d.ts +0 -1
- package/index.js +0 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { ColumnDefault } from "../storage/index.js";
|
|
2
|
+
import { type AnyTable, type MigrationStep, type ReferentialAction, type SchemaColumnType, type SchemaDefinition, type TableCheck } from "./schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* Structured-clone-safe mirror of the schema DSL. Column builders and table validators carry
|
|
5
|
+
* methods, so a schema cannot cross a postMessage boundary as-is; these types keep only the data
|
|
6
|
+
* fields `planMigration` reads, and the worker host rebuilds real builders from them.
|
|
7
|
+
*/
|
|
8
|
+
export interface WireColumn {
|
|
9
|
+
readonly type: SchemaColumnType;
|
|
10
|
+
readonly isNullable: boolean;
|
|
11
|
+
readonly isUnique: boolean;
|
|
12
|
+
readonly defaultSpec?: ColumnDefault;
|
|
13
|
+
readonly renamedFromName?: string;
|
|
14
|
+
readonly reference?: {
|
|
15
|
+
table: string;
|
|
16
|
+
column: string;
|
|
17
|
+
onDelete: ReferentialAction;
|
|
18
|
+
};
|
|
19
|
+
readonly enumValues?: readonly string[];
|
|
20
|
+
/** Already frozen by planning, so the wire carries a value and never a generator. */
|
|
21
|
+
readonly backfillValue?: boolean | number | string | Date;
|
|
22
|
+
}
|
|
23
|
+
export interface WireTable {
|
|
24
|
+
readonly name: string;
|
|
25
|
+
readonly columns: Record<string, WireColumn>;
|
|
26
|
+
/** Absent rather than empty so a frame written without the field stays readable. */
|
|
27
|
+
readonly checks?: readonly TableCheck[];
|
|
28
|
+
}
|
|
29
|
+
export interface WireView {
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly sql: string;
|
|
32
|
+
readonly columns: Record<string, WireColumn>;
|
|
33
|
+
}
|
|
34
|
+
export interface WireSchema {
|
|
35
|
+
readonly tables: readonly WireTable[];
|
|
36
|
+
/** Absent rather than empty so a frame written without the field stays readable. */
|
|
37
|
+
readonly views?: readonly WireView[];
|
|
38
|
+
}
|
|
39
|
+
export type WireMigrationStep = {
|
|
40
|
+
kind: "create-table";
|
|
41
|
+
table: WireTable;
|
|
42
|
+
} | {
|
|
43
|
+
kind: "add-column";
|
|
44
|
+
tableName: string;
|
|
45
|
+
columnName: string;
|
|
46
|
+
definition: WireColumn;
|
|
47
|
+
} | {
|
|
48
|
+
kind: "rename-column";
|
|
49
|
+
tableName: string;
|
|
50
|
+
from: string;
|
|
51
|
+
to: string;
|
|
52
|
+
} | {
|
|
53
|
+
kind: "widen-nullable";
|
|
54
|
+
tableName: string;
|
|
55
|
+
columnName: string;
|
|
56
|
+
} | {
|
|
57
|
+
kind: "tighten-nullable";
|
|
58
|
+
tableName: string;
|
|
59
|
+
columnName: string;
|
|
60
|
+
} | {
|
|
61
|
+
kind: "drop-column";
|
|
62
|
+
tableName: string;
|
|
63
|
+
columnName: string;
|
|
64
|
+
} | {
|
|
65
|
+
kind: "drop-table";
|
|
66
|
+
tableName: string;
|
|
67
|
+
} | {
|
|
68
|
+
kind: "set-auto-increment";
|
|
69
|
+
tableName: string;
|
|
70
|
+
columnName: string;
|
|
71
|
+
enabled: boolean;
|
|
72
|
+
} | {
|
|
73
|
+
kind: "widen-enum";
|
|
74
|
+
tableName: string;
|
|
75
|
+
columnName: string;
|
|
76
|
+
enumValues: string[] | null;
|
|
77
|
+
} | {
|
|
78
|
+
kind: "alter-default";
|
|
79
|
+
tableName: string;
|
|
80
|
+
columnName: string;
|
|
81
|
+
defaultValue: ColumnDefault | null;
|
|
82
|
+
} | {
|
|
83
|
+
kind: "replace-view";
|
|
84
|
+
view: WireView;
|
|
85
|
+
} | {
|
|
86
|
+
kind: "drop-view";
|
|
87
|
+
viewName: string;
|
|
88
|
+
};
|
|
89
|
+
export declare function serializeSchema(definition: SchemaDefinition<readonly AnyTable[]>): WireSchema;
|
|
90
|
+
export declare function serializeMigrationSteps(steps: readonly MigrationStep[]): WireMigrationStep[];
|
|
91
|
+
export declare function deserializeSchema(wire: WireSchema): SchemaDefinition<readonly AnyTable[]>;
|
|
92
|
+
//# sourceMappingURL=schema-wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-wire.d.ts","sourceRoot":"","sources":["../../src/engine/schema-wire.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { column, columnWithDefaultSpec, schema, table, view, } from "./schema.js";
|
|
2
|
+
function serializeColumn(definition) {
|
|
3
|
+
return {
|
|
4
|
+
type: definition.type,
|
|
5
|
+
isNullable: definition.isNullable,
|
|
6
|
+
isUnique: definition.isUnique,
|
|
7
|
+
...(definition.defaultSpec === undefined ? {} : { defaultSpec: { ...definition.defaultSpec } }),
|
|
8
|
+
...(definition.renamedFromName === undefined
|
|
9
|
+
? {}
|
|
10
|
+
: { renamedFromName: definition.renamedFromName }),
|
|
11
|
+
...(definition.reference === undefined ? {} : { reference: { ...definition.reference } }),
|
|
12
|
+
...(definition.enumValues === undefined ? {} : { enumValues: [...definition.enumValues] }),
|
|
13
|
+
...(definition.backfillValue === undefined
|
|
14
|
+
? {}
|
|
15
|
+
: {
|
|
16
|
+
backfillValue: typeof definition.backfillValue === "function"
|
|
17
|
+
? definition.backfillValue()
|
|
18
|
+
: definition.backfillValue,
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function serializeTable(definition) {
|
|
23
|
+
return {
|
|
24
|
+
name: definition.name,
|
|
25
|
+
columns: Object.fromEntries(Object.entries(definition.columns).map(([name, columnDefinition]) => [
|
|
26
|
+
name,
|
|
27
|
+
serializeColumn(columnDefinition),
|
|
28
|
+
])),
|
|
29
|
+
...(definition.checks.length === 0
|
|
30
|
+
? {}
|
|
31
|
+
: { checks: definition.checks.map((check) => ({ ...check })) }),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function serializeView(definition) {
|
|
35
|
+
return {
|
|
36
|
+
name: definition.name,
|
|
37
|
+
sql: definition.sql,
|
|
38
|
+
columns: Object.fromEntries(Object.entries(definition.columns).map(([name, columnDefinition]) => [
|
|
39
|
+
name,
|
|
40
|
+
serializeColumn(columnDefinition),
|
|
41
|
+
])),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function deserializeView(wire) {
|
|
45
|
+
return view(wire.name, {
|
|
46
|
+
sql: wire.sql,
|
|
47
|
+
columns: Object.fromEntries(Object.entries(wire.columns).map(([name, columnDefinition]) => [
|
|
48
|
+
name,
|
|
49
|
+
deserializeColumn(columnDefinition),
|
|
50
|
+
])),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export function serializeSchema(definition) {
|
|
54
|
+
return {
|
|
55
|
+
tables: definition.tables.map(serializeTable),
|
|
56
|
+
...(definition.views.length === 0 ? {} : { views: definition.views.map(serializeView) }),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function serializeMigrationSteps(steps) {
|
|
60
|
+
return steps.map((step) => {
|
|
61
|
+
switch (step.kind) {
|
|
62
|
+
case "create-table":
|
|
63
|
+
return { kind: "create-table", table: serializeTable(step.table) };
|
|
64
|
+
case "add-column":
|
|
65
|
+
return {
|
|
66
|
+
kind: "add-column",
|
|
67
|
+
tableName: step.tableName,
|
|
68
|
+
columnName: step.columnName,
|
|
69
|
+
definition: serializeColumn(step.definition),
|
|
70
|
+
};
|
|
71
|
+
case "replace-view":
|
|
72
|
+
return { kind: "replace-view", view: serializeView(step.view) };
|
|
73
|
+
default:
|
|
74
|
+
return step;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function deserializeColumn(wire) {
|
|
79
|
+
if (wire.enumValues !== undefined && wire.type !== "string") {
|
|
80
|
+
throw new TypeError(`Enum values require a string column, got ${wire.type}`);
|
|
81
|
+
}
|
|
82
|
+
let builder = wire.enumValues === undefined
|
|
83
|
+
? column[wire.type]()
|
|
84
|
+
: column.enum(wire.enumValues);
|
|
85
|
+
if (wire.isNullable)
|
|
86
|
+
builder = builder.nullable();
|
|
87
|
+
if (wire.isUnique)
|
|
88
|
+
builder = builder.unique();
|
|
89
|
+
if (wire.renamedFromName !== undefined)
|
|
90
|
+
builder = builder.renamedFrom(wire.renamedFromName);
|
|
91
|
+
if (wire.backfillValue !== undefined)
|
|
92
|
+
builder = builder.backfill(wire.backfillValue);
|
|
93
|
+
if (wire.reference !== undefined) {
|
|
94
|
+
builder = builder.references(wire.reference.table, wire.reference.column, {
|
|
95
|
+
onDelete: wire.reference.onDelete,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// Rebuilt from the spec directly rather than through .default(), which would re-interpret the
|
|
99
|
+
// reserved generator names.
|
|
100
|
+
if (wire.defaultSpec !== undefined)
|
|
101
|
+
builder = columnWithDefaultSpec(builder, wire.defaultSpec);
|
|
102
|
+
return builder;
|
|
103
|
+
}
|
|
104
|
+
function deserializeTable(wire) {
|
|
105
|
+
return table(wire.name, Object.fromEntries(Object.entries(wire.columns).map(([name, columnDefinition]) => [
|
|
106
|
+
name,
|
|
107
|
+
deserializeColumn(columnDefinition),
|
|
108
|
+
])), wire.checks === undefined ? {} : { checks: wire.checks.map((check) => ({ ...check })) });
|
|
109
|
+
}
|
|
110
|
+
export function deserializeSchema(wire) {
|
|
111
|
+
return schema(wire.tables.map(deserializeTable), {
|
|
112
|
+
views: (wire.views ?? []).map(deserializeView),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=schema-wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-wire.js","sourceRoot":"","sources":["../../src/engine/schema-wire.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
import { type ColumnDefault, type TableColumnRecord, type TableRecord } from "../storage/index.js";
|
|
2
|
+
import { type Catalog } from "./catalog.js";
|
|
3
|
+
import { type BatchRow } from "./batch.js";
|
|
4
|
+
/**
|
|
5
|
+
* Typed schema DSL and catalog migration planning. Column builders carry compile-time value and
|
|
6
|
+
* nullability types; `planMigration` diffs a schema against the live catalog into metadata-only
|
|
7
|
+
* steps and rejects everything it cannot prove safe. Physical rewrites never happen here: adding
|
|
8
|
+
* a nullable column, renaming a column through its stable ID, and widening nullability are
|
|
9
|
+
* catalog-only, and older segments read the new column as NULL.
|
|
10
|
+
*/
|
|
11
|
+
export type SchemaColumnType = "boolean" | "number" | "string" | "datetime";
|
|
12
|
+
/** What a FOREIGN KEY does to child rows when the parent row is deleted (E141-04). */
|
|
13
|
+
export type ReferentialAction = "restrict" | "cascade" | "set null";
|
|
14
|
+
/** A declared relation. `onDelete` defaults to "restrict", matching SQL's own default. */
|
|
15
|
+
export interface ColumnReferenceSpec {
|
|
16
|
+
readonly table: string;
|
|
17
|
+
readonly column: string;
|
|
18
|
+
readonly onDelete: ReferentialAction;
|
|
19
|
+
}
|
|
20
|
+
/** A row condition every write must satisfy (E141-06); `sql` is a boolean expression. */
|
|
21
|
+
export interface TableCheck {
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly sql: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The constraint name `migrate()` gives a declared relation. It matches the name the SQL parser
|
|
27
|
+
* derives for an unnamed inline REFERENCES, so a table built either way has the same catalog.
|
|
28
|
+
*/
|
|
29
|
+
export declare function foreignKeyName(tableName: string, columnName: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* A flavored value: a column whose slot the engine can fill, so inserts may omit it. The brand
|
|
32
|
+
* is an optional phantom property — plain values stay assignable in both directions.
|
|
33
|
+
*/
|
|
34
|
+
export type HasDefault<TValue> = TValue & {
|
|
35
|
+
readonly __minnowHasDefault?: true;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* The public name for the flavor, for hand-declared `DB` interfaces (the Kysely convention).
|
|
39
|
+
* `InferDatabase` applies it automatically from the schema; write it yourself only when you
|
|
40
|
+
* declare the row types by hand and want generated columns to stay omissible on insert:
|
|
41
|
+
*
|
|
42
|
+
* ```ts
|
|
43
|
+
* interface DB {
|
|
44
|
+
* notes: { id: Generated<number>; slug: Generated<string>; body: string };
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export type Generated<TValue> = HasDefault<TValue>;
|
|
49
|
+
export interface ColumnBuilder<TValue, TNullable extends boolean, TUnique extends boolean = false, THasDefault extends boolean = false> {
|
|
50
|
+
readonly kind: "column";
|
|
51
|
+
readonly type: SchemaColumnType;
|
|
52
|
+
readonly isNullable: TNullable;
|
|
53
|
+
readonly isUnique: TUnique;
|
|
54
|
+
readonly hasDefault: THasDefault;
|
|
55
|
+
readonly defaultSpec?: ColumnDefault;
|
|
56
|
+
/**
|
|
57
|
+
* A userland default generator. Never persisted and never sent to the engine — the typed
|
|
58
|
+
* facade (`insertInto`, `typedTable`) calls it for omitted-or-null slots before the batch
|
|
59
|
+
* crosses the boundary, so untyped write paths (raw batches, SQL) do not see it.
|
|
60
|
+
*/
|
|
61
|
+
readonly defaultFn?: () => TValue;
|
|
62
|
+
/** Present on `column.enum()` builders: the closed set of values writes must draw from. */
|
|
63
|
+
readonly enumValues?: readonly string[];
|
|
64
|
+
/** What rows written before this column existed read as; see `.backfill()`. */
|
|
65
|
+
readonly backfillValue?: TValue | (() => TValue);
|
|
66
|
+
readonly renamedFromName?: string;
|
|
67
|
+
readonly reference?: ColumnReferenceSpec;
|
|
68
|
+
/** Marks the column nullable; inserts may omit it and reads may return null. */
|
|
69
|
+
nullable(): ColumnBuilder<TValue, true, TUnique, THasDefault>;
|
|
70
|
+
/** Marks the table's unique key; exactly one non-nullable column may carry it. */
|
|
71
|
+
unique(): ColumnBuilder<TValue, TNullable, true, THasDefault>;
|
|
72
|
+
/** Declares this column as the rename target of an existing catalog column. */
|
|
73
|
+
renamedFrom(name: string): ColumnBuilder<TValue, TNullable, TUnique, THasDefault>;
|
|
74
|
+
/**
|
|
75
|
+
* What rows written before this column existed read as, instead of NULL. Giving one is what
|
|
76
|
+
* makes adding a non-nullable column possible: no stored byte is rewritten, and reads
|
|
77
|
+
* substitute the value wherever the column has no data.
|
|
78
|
+
*
|
|
79
|
+
* A function runs once, when the migration adds the column, and its result is frozen into the
|
|
80
|
+
* catalog — so it can derive a value (a timestamp, a version stamp) without readers ever
|
|
81
|
+
* disagreeing. It cannot derive from other columns; that would need a value per row.
|
|
82
|
+
*/
|
|
83
|
+
backfill(value: TValue | (() => TValue)): ColumnBuilder<TValue, TNullable, TUnique, THasDefault>;
|
|
84
|
+
/**
|
|
85
|
+
* Declares a FOREIGN KEY onto another table's unique key. `migrate()` creates it as a real
|
|
86
|
+
* constraint, so a write naming a parent row that does not exist is rejected — the same
|
|
87
|
+
* behaviour as declaring `REFERENCES` in SQL DDL.
|
|
88
|
+
*
|
|
89
|
+
* `onDelete` defaults to `"restrict"`. `"set null"` requires a nullable column.
|
|
90
|
+
*/
|
|
91
|
+
references(table: string, column: string, options?: {
|
|
92
|
+
onDelete?: ReferentialAction;
|
|
93
|
+
}): ColumnBuilder<TValue, TNullable, TUnique, THasDefault>;
|
|
94
|
+
/**
|
|
95
|
+
* Fills null-or-absent slots at insert time. Requires a non-nullable column.
|
|
96
|
+
*
|
|
97
|
+
* A plain value persists in the catalog and fills inside the engine, so every write path
|
|
98
|
+
* gets it — raw batches, SQL statements, other tabs. Datetime columns accept only "now",
|
|
99
|
+
* which stamps one consistent timestamp per batch.
|
|
100
|
+
*
|
|
101
|
+
* A function is a userland generator (`() => ulid()`): the typed facade calls it just
|
|
102
|
+
* before the batch is sent, so it never persists and never crosses the worker boundary —
|
|
103
|
+
* and write paths that don't go through the facade don't see it.
|
|
104
|
+
*/
|
|
105
|
+
default(value: (TValue extends Date ? "now" : TValue) | (() => TValue)): ColumnBuilder<TValue, TNullable, TUnique, true>;
|
|
106
|
+
/**
|
|
107
|
+
* Generates monotonically increasing integers for null-or-absent slots from a persistent
|
|
108
|
+
* per-table counter that is atomic across tabs. Explicit values are allowed and bump the
|
|
109
|
+
* counter past their maximum. Number unique-key columns only.
|
|
110
|
+
*/
|
|
111
|
+
autoIncrement: TValue extends number ? () => ColumnBuilder<TValue, TNullable, TUnique, true> : never;
|
|
112
|
+
}
|
|
113
|
+
type AnyColumn = ColumnBuilder<boolean | number | string | Date, boolean, boolean, boolean>;
|
|
114
|
+
/**
|
|
115
|
+
* Rebuilds a column carrying an exact default spec — the wire layer's escape hatch, since the
|
|
116
|
+
* public `.default()` interprets "now" on datetime columns and cannot express auto-increment.
|
|
117
|
+
*/
|
|
118
|
+
export declare function columnWithDefaultSpec(base: Pick<AnyColumn, "type" | "isNullable" | "isUnique" | "renamedFromName" | "reference" | "enumValues">, spec: ColumnDefault): AnyColumn;
|
|
119
|
+
export declare const column: {
|
|
120
|
+
boolean: () => ColumnBuilder<boolean, false, false, false>;
|
|
121
|
+
number: () => ColumnBuilder<number, false, false, false>;
|
|
122
|
+
string: () => ColumnBuilder<string, false, false, false>;
|
|
123
|
+
datetime: () => ColumnBuilder<Date, false, false, false>;
|
|
124
|
+
/**
|
|
125
|
+
* A string column restricted to a closed set of values, typed as their literal union:
|
|
126
|
+
*
|
|
127
|
+
* ```ts
|
|
128
|
+
* status: column.enum(["draft", "published", "archived"]).default("draft")
|
|
129
|
+
* ```
|
|
130
|
+
*
|
|
131
|
+
* Selects return `"draft" | "published" | "archived"` and inserts accept nothing else; every
|
|
132
|
+
* write path also validates membership at runtime. Physically the column is a plain string
|
|
133
|
+
* column, so migrations may add values or relax the column to `column.string()`, but never
|
|
134
|
+
* remove values — existing rows could already hold them.
|
|
135
|
+
*/
|
|
136
|
+
enum: <const TValues extends readonly [string, ...string[]]>(values: TValues) => ColumnBuilder<TValues[number], false>;
|
|
137
|
+
};
|
|
138
|
+
export interface TableSchema<TColumns extends Record<string, AnyColumn>, TName extends string = string> {
|
|
139
|
+
readonly kind: "table";
|
|
140
|
+
readonly name: TName;
|
|
141
|
+
readonly columns: TColumns;
|
|
142
|
+
/** Row conditions every write must satisfy; empty when none were declared. */
|
|
143
|
+
readonly checks: readonly TableCheck[];
|
|
144
|
+
/** Standard Schema-compatible runtime validator for one insert row. */
|
|
145
|
+
readonly "~standard": {
|
|
146
|
+
readonly version: 1;
|
|
147
|
+
readonly vendor: "minnow";
|
|
148
|
+
validate(value: unknown): {
|
|
149
|
+
value: Record<string, unknown>;
|
|
150
|
+
} | {
|
|
151
|
+
issues: Array<{
|
|
152
|
+
message: string;
|
|
153
|
+
path: Array<string | number>;
|
|
154
|
+
}>;
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export type AnyTable = TableSchema<Record<string, AnyColumn>>;
|
|
159
|
+
export interface TableOptions {
|
|
160
|
+
/**
|
|
161
|
+
* Row conditions every write must satisfy (E141-06), each a boolean SQL expression over this
|
|
162
|
+
* table's own columns — the declarative form of `CONSTRAINT name CHECK (sql)`. The engine
|
|
163
|
+
* compiles each one when the table is created, so an expression it cannot evaluate is refused
|
|
164
|
+
* at migration time rather than on the first write.
|
|
165
|
+
*/
|
|
166
|
+
readonly checks?: readonly TableCheck[];
|
|
167
|
+
}
|
|
168
|
+
export declare function table<const TName extends string, TColumns extends Record<string, AnyColumn>>(name: TName, columns: TColumns, options?: TableOptions): TableSchema<TColumns, TName>;
|
|
169
|
+
/**
|
|
170
|
+
* The FOREIGN KEY constraints a table declares, in column order. This is the single derivation
|
|
171
|
+
* of "what relations does this table have" — `planMigration` diffs against it and `migrate()`
|
|
172
|
+
* creates from it, so the two can never disagree.
|
|
173
|
+
*/
|
|
174
|
+
export declare function declaredForeignKeys(definition: AnyTable): Array<{
|
|
175
|
+
name: string;
|
|
176
|
+
column: string;
|
|
177
|
+
parentTable: string;
|
|
178
|
+
parentColumn: string;
|
|
179
|
+
onDelete: ReferentialAction;
|
|
180
|
+
}>;
|
|
181
|
+
/**
|
|
182
|
+
* A view declared in the schema: the query it stands for, plus the column shape the author
|
|
183
|
+
* expects it to produce.
|
|
184
|
+
*
|
|
185
|
+
* The shape is declared rather than inferred from a builder because the query builder compiles to
|
|
186
|
+
* a plan, not to SQL text, and `CREATE VIEW` needs text. Declaring it is not a downgrade: the
|
|
187
|
+
* engine infers the real output schema when it creates the view and `migrate()` compares the two,
|
|
188
|
+
* so a body that drifts from its declaration fails at migration time rather than at read time.
|
|
189
|
+
*/
|
|
190
|
+
export interface ViewSchema<TColumns extends Record<string, AnyColumn>, TName extends string = string> {
|
|
191
|
+
readonly kind: "view";
|
|
192
|
+
readonly name: TName;
|
|
193
|
+
readonly sql: string;
|
|
194
|
+
readonly columns: TColumns;
|
|
195
|
+
}
|
|
196
|
+
export type AnyView = ViewSchema<Record<string, AnyColumn>>;
|
|
197
|
+
/**
|
|
198
|
+
* Declares a view. Its columns use the same builders tables use, so a view row types exactly like
|
|
199
|
+
* a table row — but a view is read-only, and the typed facade will not let a write name one.
|
|
200
|
+
*
|
|
201
|
+
* ```ts
|
|
202
|
+
* const activeCustomers = view("active_customers", {
|
|
203
|
+
* sql: `SELECT customer_id, name FROM customers WHERE status = 'active'`,
|
|
204
|
+
* columns: { customer_id: column.number(), name: column.string() },
|
|
205
|
+
* });
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
208
|
+
export declare function view<const TName extends string, TColumns extends Record<string, AnyColumn>>(name: TName, definition: {
|
|
209
|
+
sql: string;
|
|
210
|
+
columns: TColumns;
|
|
211
|
+
}): ViewSchema<TColumns, TName>;
|
|
212
|
+
export interface SchemaDefinition<TTables extends readonly AnyTable[], TViews extends readonly AnyView[] = readonly AnyView[]> {
|
|
213
|
+
readonly kind: "schema";
|
|
214
|
+
readonly tables: TTables;
|
|
215
|
+
readonly views: TViews;
|
|
216
|
+
}
|
|
217
|
+
export declare function schema<TTables extends readonly AnyTable[], TViews extends readonly AnyView[] = []>(tables: TTables, options?: {
|
|
218
|
+
views?: TViews;
|
|
219
|
+
}): SchemaDefinition<TTables, TViews>;
|
|
220
|
+
type ColumnValue<TColumn> = TColumn extends ColumnBuilder<infer TValue, infer TNullable, boolean, infer THasDefault> ? THasDefault extends true ? HasDefault<TNullable extends true ? TValue | null : TValue> : TNullable extends true ? TValue | null : TValue : never;
|
|
221
|
+
/** The complete row shape a read returns. */
|
|
222
|
+
export type InferRow<TTable extends AnyTable> = {
|
|
223
|
+
[K in keyof TTable["columns"]]: ColumnValue<TTable["columns"][K]>;
|
|
224
|
+
};
|
|
225
|
+
/**
|
|
226
|
+
* A view's row shape. Views are read-only and their columns carry no keys or defaults, so this is
|
|
227
|
+
* the only row type a view has — there is no insert or update counterpart.
|
|
228
|
+
*/
|
|
229
|
+
export type InferViewRow<TView extends AnyView> = {
|
|
230
|
+
[K in keyof TView["columns"]]: ColumnValue<TView["columns"][K]>;
|
|
231
|
+
};
|
|
232
|
+
type NullableKeys<TTable extends AnyTable> = {
|
|
233
|
+
[K in keyof TTable["columns"]]: TTable["columns"][K]["isNullable"] extends true ? K : never;
|
|
234
|
+
}[keyof TTable["columns"]];
|
|
235
|
+
type DefaultKeys<TTable extends AnyTable> = {
|
|
236
|
+
[K in keyof TTable["columns"]]: TTable["columns"][K]["hasDefault"] extends true ? K : never;
|
|
237
|
+
}[keyof TTable["columns"]];
|
|
238
|
+
type OptionalInsertKeys<TTable extends AnyTable> = NullableKeys<TTable> | DefaultKeys<TTable>;
|
|
239
|
+
/** Insert rows require every non-nullable column and may omit nullable or default-bearing ones. */
|
|
240
|
+
export type InferInsertRow<TTable extends AnyTable> = Omit<InferRow<TTable>, OptionalInsertKeys<TTable>> & {
|
|
241
|
+
[K in OptionalInsertKeys<TTable>]?: ColumnValue<TTable["columns"][K]>;
|
|
242
|
+
};
|
|
243
|
+
/**
|
|
244
|
+
* Update changes may cover any column except the unique key. An explicit `undefined` entry is
|
|
245
|
+
* allowed and means "leave this column untouched", so a spread-patch built from optional fields
|
|
246
|
+
* stays assignable under `exactOptionalPropertyTypes`.
|
|
247
|
+
*/
|
|
248
|
+
export type InferUpdateChanges<TTable extends AnyTable> = {
|
|
249
|
+
[K in keyof TTable["columns"] as TTable["columns"][K]["isUnique"] extends true ? never : K]?: ColumnValue<TTable["columns"][K]> | undefined;
|
|
250
|
+
};
|
|
251
|
+
export type MigrationStep = {
|
|
252
|
+
kind: "create-table";
|
|
253
|
+
table: AnyTable;
|
|
254
|
+
} | {
|
|
255
|
+
kind: "add-column";
|
|
256
|
+
tableName: string;
|
|
257
|
+
columnName: string;
|
|
258
|
+
definition: AnyColumn;
|
|
259
|
+
/** Frozen here: a generator runs once, so every reader of a given row agrees. */
|
|
260
|
+
backfill?: boolean | number | string | Date;
|
|
261
|
+
} | {
|
|
262
|
+
kind: "rename-column";
|
|
263
|
+
tableName: string;
|
|
264
|
+
from: string;
|
|
265
|
+
to: string;
|
|
266
|
+
} | {
|
|
267
|
+
kind: "widen-nullable";
|
|
268
|
+
tableName: string;
|
|
269
|
+
columnName: string;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* NULL -> NOT NULL. Only provable, never assumed: `migrate()` verifies from block headers that
|
|
273
|
+
* no visible row holds NULL before applying it, and refuses the migration when one does.
|
|
274
|
+
*/
|
|
275
|
+
| {
|
|
276
|
+
kind: "tighten-nullable";
|
|
277
|
+
tableName: string;
|
|
278
|
+
columnName: string;
|
|
279
|
+
}
|
|
280
|
+
/** Adopting or dropping the persistent counter; neither touches a stored row. */
|
|
281
|
+
| {
|
|
282
|
+
kind: "set-auto-increment";
|
|
283
|
+
tableName: string;
|
|
284
|
+
columnName: string;
|
|
285
|
+
enabled: boolean;
|
|
286
|
+
}
|
|
287
|
+
/** Grows an enum's value set, or drops the restriction entirely (`enumValues: null`). */
|
|
288
|
+
| {
|
|
289
|
+
kind: "widen-enum";
|
|
290
|
+
tableName: string;
|
|
291
|
+
columnName: string;
|
|
292
|
+
enumValues: string[] | null;
|
|
293
|
+
} | {
|
|
294
|
+
kind: "alter-default";
|
|
295
|
+
tableName: string;
|
|
296
|
+
columnName: string;
|
|
297
|
+
defaultValue: ColumnDefault | null;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* A view is derived and disposable: nothing is stored under it, so replacing its body loses no
|
|
301
|
+
* data and needs none of the proofs a table alteration needs. `replace` covers both creating a
|
|
302
|
+
* missing view and redefining an existing one.
|
|
303
|
+
*
|
|
304
|
+
* `drop-view` removes a view a previous migration created and this schema no longer declares.
|
|
305
|
+
* It never names a view the schema did not make — see `planViewSteps`.
|
|
306
|
+
*/
|
|
307
|
+
/** Destructive: the column stops being readable. See `isDestructiveStep`. */
|
|
308
|
+
| {
|
|
309
|
+
kind: "drop-column";
|
|
310
|
+
tableName: string;
|
|
311
|
+
columnName: string;
|
|
312
|
+
}
|
|
313
|
+
/** Destructive: the table and its rows stop being readable. See `isDestructiveStep`. */
|
|
314
|
+
| {
|
|
315
|
+
kind: "drop-table";
|
|
316
|
+
tableName: string;
|
|
317
|
+
} | {
|
|
318
|
+
kind: "replace-view";
|
|
319
|
+
view: AnyView;
|
|
320
|
+
} | {
|
|
321
|
+
kind: "drop-view";
|
|
322
|
+
viewName: string;
|
|
323
|
+
};
|
|
324
|
+
export interface MigrationPlan {
|
|
325
|
+
steps: MigrationStep[];
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Whether a step destroys data a reader could still see. These are the steps `migrate()` refuses
|
|
329
|
+
* to apply unless the caller opts in, so that a schema file drifting out of sync cannot delete
|
|
330
|
+
* rows the next time an application opens.
|
|
331
|
+
*/
|
|
332
|
+
export declare function isDestructiveStep(step: MigrationStep): step is Extract<MigrationStep, {
|
|
333
|
+
kind: "drop-column" | "drop-table";
|
|
334
|
+
}>;
|
|
335
|
+
/**
|
|
336
|
+
* Diffs the live catalog against a schema into metadata-only steps, in a deterministic order.
|
|
337
|
+
* Anything unprovable fails explicitly: type changes, dropped columns, unique-key changes,
|
|
338
|
+
* nullable-to-non-null tightening, non-nullable additions, and rename sources that are missing
|
|
339
|
+
* or still defined.
|
|
340
|
+
*/
|
|
341
|
+
export interface PlanMigrationOptions {
|
|
342
|
+
/**
|
|
343
|
+
* Treats the schema as the whole database, so a managed table it no longer declares is planned
|
|
344
|
+
* for dropping.
|
|
345
|
+
*
|
|
346
|
+
* Off by default, because a schema is not necessarily complete: an application may migrate
|
|
347
|
+
* feature by feature, each call declaring only its own tables. Assuming otherwise would turn
|
|
348
|
+
* that into "drop everything the others made". A column is different — its table is right
|
|
349
|
+
* there in the declaration, so a column missing from it is missing on purpose.
|
|
350
|
+
*/
|
|
351
|
+
readonly schemaOwnsDatabase?: boolean;
|
|
352
|
+
}
|
|
353
|
+
export declare function planMigration(catalog: Catalog, definition: SchemaDefinition<readonly AnyTable[]>, options?: PlanMigrationOptions): MigrationPlan;
|
|
354
|
+
type UniqueKeyValue<TTable extends AnyTable> = {
|
|
355
|
+
[K in keyof TTable["columns"]]: TTable["columns"][K]["isUnique"] extends true ? ColumnValue<TTable["columns"][K]> : never;
|
|
356
|
+
}[keyof TTable["columns"]];
|
|
357
|
+
type ColumnArrays<TShape> = {
|
|
358
|
+
[K in keyof TShape]: ReadonlyArray<TShape[K]>;
|
|
359
|
+
};
|
|
360
|
+
interface TypedTableDatabase {
|
|
361
|
+
insertBatch(tableName: string, rows: readonly BatchRow[]): Promise<unknown>;
|
|
362
|
+
upsertBatch(tableName: string, rows: readonly BatchRow[]): Promise<unknown>;
|
|
363
|
+
updateBatch(tableName: string, input: {
|
|
364
|
+
keys: readonly unknown[];
|
|
365
|
+
changes: Readonly<Record<string, readonly unknown[]>>;
|
|
366
|
+
}): Promise<unknown>;
|
|
367
|
+
deleteBatch(tableName: string, input: {
|
|
368
|
+
keys: readonly unknown[];
|
|
369
|
+
}): Promise<unknown>;
|
|
370
|
+
readTable(tableName: string, options?: {
|
|
371
|
+
columns?: readonly string[];
|
|
372
|
+
}): Promise<Array<Record<string, unknown>>>;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* A thin, fully typed handle over the existing batch APIs: inserts require every non-nullable
|
|
376
|
+
* column, updates exclude the unique key, and reads return the complete inferred row shape.
|
|
377
|
+
*/
|
|
378
|
+
export declare function typedTable<TTable extends AnyTable>(database: TypedTableDatabase, definition: TTable): {
|
|
379
|
+
definition: TTable;
|
|
380
|
+
insert(rows: ReadonlyArray<InferInsertRow<TTable>>): Promise<unknown>;
|
|
381
|
+
upsert(rows: ReadonlyArray<InferInsertRow<TTable>>): Promise<unknown>;
|
|
382
|
+
update(input: {
|
|
383
|
+
keys: ReadonlyArray<UniqueKeyValue<TTable>>;
|
|
384
|
+
changes: Partial<ColumnArrays<InferUpdateChanges<TTable>>>;
|
|
385
|
+
}): Promise<unknown>;
|
|
386
|
+
delete(input: {
|
|
387
|
+
keys: ReadonlyArray<UniqueKeyValue<TTable>>;
|
|
388
|
+
}): Promise<unknown>;
|
|
389
|
+
rows(): Promise<Array<InferRow<TTable>>>;
|
|
390
|
+
};
|
|
391
|
+
/** Applies one table's alteration steps onto its current column records. */
|
|
392
|
+
export declare function applyColumnSteps(record: TableRecord, steps: readonly MigrationStep[], createId: () => string): TableColumnRecord[];
|
|
393
|
+
export {};
|
|
394
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/engine/schema.ts"],"names":[],"mappings":"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"}
|