@livestore/common 0.0.48-dev.0 → 0.0.48-dev.2
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/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/fixture.d.ts +8 -2
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/derived-mutations.d.ts +22 -26
- package/dist/derived-mutations.d.ts.map +1 -1
- package/dist/derived-mutations.js +5 -4
- package/dist/derived-mutations.js.map +1 -1
- package/dist/schema/index.d.ts +1 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +2 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/mutations.d.ts +12 -1
- package/dist/schema/mutations.d.ts.map +1 -1
- package/dist/schema/mutations.js +2 -1
- package/dist/schema/mutations.js.map +1 -1
- package/dist/schema/system-tables.d.ts +207 -232
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/system-tables.js +1 -1
- package/dist/schema/system-tables.js.map +1 -1
- package/dist/schema/table-def.d.ts +41 -7
- package/dist/schema/table-def.d.ts.map +1 -1
- package/dist/schema/table-def.js +8 -2
- package/dist/schema/table-def.js.map +1 -1
- package/dist/schema-management/common.d.ts +8 -0
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/migrations.d.ts +3 -0
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +24 -3
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-mutation-defs.d.ts +1 -11
- package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
- package/dist/schema-management/validate-mutation-defs.js +0 -26
- package/dist/schema-management/validate-mutation-defs.js.map +1 -1
- package/dist/sync/sync.d.ts +4 -0
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +6 -2
- package/dist/sync/sync.js.map +1 -1
- package/package.json +3 -3
- package/src/derived-mutations.ts +55 -15
- package/src/schema/index.ts +2 -2
- package/src/schema/mutations.ts +13 -0
- package/src/schema/system-tables.ts +1 -1
- package/src/schema/table-def.ts +44 -8
- package/src/schema-management/common.ts +11 -0
- package/src/schema-management/migrations.ts +42 -4
- package/src/schema-management/validate-mutation-defs.ts +1 -49
- package/src/sync/sync.ts +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-def.js","sourceRoot":"","sources":["../../src/schema/table-def.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEtE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAG5C,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAA;AAEzE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"table-def.js","sourceRoot":"","sources":["../../src/schema/table-def.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,4 +2,12 @@ import type { InMemoryDatabase } from '../adapter-types.js';
|
|
|
2
2
|
import type { ParamsObject } from '../util.js';
|
|
3
3
|
export declare const dbExecute: (db: InMemoryDatabase, queryStr: string, bindValues?: ParamsObject) => void;
|
|
4
4
|
export declare const dbSelect: <T>(db: InMemoryDatabase, queryStr: string, bindValues?: ParamsObject) => readonly T[];
|
|
5
|
+
export interface SchemaManager {
|
|
6
|
+
getMutationDefInfos: () => ReadonlyArray<MutationDefInfo>;
|
|
7
|
+
setMutationDefInfo: (mutationDefInfo: MutationDefInfo) => void;
|
|
8
|
+
}
|
|
9
|
+
export type MutationDefInfo = {
|
|
10
|
+
mutationName: string;
|
|
11
|
+
schemaHash: number;
|
|
12
|
+
};
|
|
5
13
|
//# sourceMappingURL=common.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schema-management/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9C,eAAO,MAAM,SAAS,OAAQ,gBAAgB,YAAY,MAAM,eAAe,YAAY,SAU1F,CAAA;AAED,eAAO,MAAM,QAAQ,UAAW,gBAAgB,YAAY,MAAM,eAAe,YAAY,iBAQ5F,CAAA"}
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schema-management/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9C,eAAO,MAAM,SAAS,OAAQ,gBAAgB,YAAY,MAAM,eAAe,YAAY,SAU1F,CAAA;AAED,eAAO,MAAM,QAAQ,UAAW,gBAAgB,YAAY,MAAM,eAAe,YAAY,iBAQ5F,CAAA;AAED,MAAM,WAAW,aAAa;IAC5B,mBAAmB,EAAE,MAAM,aAAa,CAAC,eAAe,CAAC,CAAA;IAEzD,kBAAkB,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,CAAA;CAC/D;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA"}
|
|
@@ -2,6 +2,8 @@ import * as otel from '@opentelemetry/api';
|
|
|
2
2
|
import { SqliteAst } from 'effect-db-schema';
|
|
3
3
|
import type { InMemoryDatabase } from '../adapter-types.js';
|
|
4
4
|
import type { LiveStoreSchema } from '../schema/index.js';
|
|
5
|
+
import type { SchemaManager } from './common.js';
|
|
6
|
+
export declare const makeSchemaManager: (db: InMemoryDatabase) => SchemaManager;
|
|
5
7
|
export declare const migrateDb: ({ db, otelContext, schema, }: {
|
|
6
8
|
db: InMemoryDatabase;
|
|
7
9
|
otelContext?: otel.Context;
|
|
@@ -15,4 +17,5 @@ export declare const migrateTable: ({ db, tableAst, schemaHash, behaviour, skipM
|
|
|
15
17
|
behaviour: 'drop-and-recreate' | 'create-if-not-exists';
|
|
16
18
|
skipMetaTable?: boolean;
|
|
17
19
|
}) => void;
|
|
20
|
+
export declare const makeColumnSpec: (tableAst: SqliteAst.Table) => string;
|
|
18
21
|
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/schema-management/migrations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAa,MAAM,kBAAkB,CAAA;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAUzD,eAAO,MAAM,SAAS,iCAInB;IACD,EAAE,EAAE,gBAAgB,CAAA;IACpB,WAAW,CAAC,EAAE,KAAK,OAAO,CAAA;IAC1B,MAAM,EAAE,eAAe,CAAA;CACxB,SAsCA,CAAA;AAED,eAAO,MAAM,YAAY,4DAOtB;IACD,EAAE,EAAE,gBAAgB,CAAA;IACpB,QAAQ,EAAE,UAAU,KAAK,CAAA;IACzB,WAAW,CAAC,EAAE,KAAK,OAAO,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,mBAAmB,GAAG,sBAAsB,CAAA;IACvD,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,SA6BA,CAAA"}
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/schema-management/migrations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAa,MAAM,kBAAkB,CAAA;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAUzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,eAAO,MAAM,iBAAiB,OAAQ,gBAAgB,KAAG,aA6BxD,CAAA;AAGD,eAAO,MAAM,SAAS,iCAInB;IACD,EAAE,EAAE,gBAAgB,CAAA;IACpB,WAAW,CAAC,EAAE,KAAK,OAAO,CAAA;IAC1B,MAAM,EAAE,eAAe,CAAA;CACxB,SAsCA,CAAA;AAED,eAAO,MAAM,YAAY,4DAOtB;IACD,EAAE,EAAE,gBAAgB,CAAA;IACpB,QAAQ,EAAE,UAAU,KAAK,CAAA;IACzB,WAAW,CAAC,EAAE,KAAK,OAAO,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,mBAAmB,GAAG,sBAAsB,CAAA;IACvD,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,SA6BA,CAAA;AAOD,eAAO,MAAM,cAAc,aAAc,UAAU,KAAK,WAQvD,CAAA"}
|
|
@@ -2,11 +2,32 @@ import { memoizeByStringifyArgs } from '@livestore/utils';
|
|
|
2
2
|
import { Schema as EffectSchema } from '@livestore/utils/effect';
|
|
3
3
|
import * as otel from '@opentelemetry/api';
|
|
4
4
|
import { SqliteAst, SqliteDsl } from 'effect-db-schema';
|
|
5
|
-
import { SCHEMA_META_TABLE, schemaMetaTable, systemTables } from '../schema/system-tables.js';
|
|
5
|
+
import { SCHEMA_META_TABLE, SCHEMA_MUTATIONS_META_TABLE, schemaMetaTable, schemaMutationsMetaTable, systemTables, } from '../schema/system-tables.js';
|
|
6
6
|
import { sql } from '../util.js';
|
|
7
7
|
import { dbExecute, dbSelect } from './common.js';
|
|
8
|
-
import {
|
|
8
|
+
import { validateSchema } from './validate-mutation-defs.js';
|
|
9
9
|
const getMemoizedTimestamp = memoizeByStringifyArgs(() => new Date().toISOString());
|
|
10
|
+
export const makeSchemaManager = (db) => {
|
|
11
|
+
migrateTable({
|
|
12
|
+
db,
|
|
13
|
+
otelContext: otel.context.active(),
|
|
14
|
+
tableAst: schemaMutationsMetaTable.sqliteDef.ast,
|
|
15
|
+
behaviour: 'create-if-not-exists',
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
getMutationDefInfos: () => {
|
|
19
|
+
const schemaMutationsMetaRows = dbSelect(db, sql `SELECT * FROM ${SCHEMA_MUTATIONS_META_TABLE}`);
|
|
20
|
+
return schemaMutationsMetaRows;
|
|
21
|
+
},
|
|
22
|
+
setMutationDefInfo: (info) => {
|
|
23
|
+
dbExecute(db, sql `INSERT OR REPLACE INTO ${SCHEMA_MUTATIONS_META_TABLE} (mutationName, schemaHash, updatedAt) VALUES ($mutationName, $schemaHash, $updatedAt)`, {
|
|
24
|
+
mutationName: info.mutationName,
|
|
25
|
+
schemaHash: info.schemaHash,
|
|
26
|
+
updatedAt: new Date().toISOString(),
|
|
27
|
+
});
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
};
|
|
10
31
|
// TODO more graceful DB migration (e.g. backup DB before destructive migrations)
|
|
11
32
|
export const migrateDb = ({ db, otelContext = otel.context.active(), schema, }) => {
|
|
12
33
|
migrateTable({
|
|
@@ -64,7 +85,7 @@ const createIndexFromDefinition = (tableName, index) => {
|
|
|
64
85
|
const uniqueStr = index.unique ? 'UNIQUE' : '';
|
|
65
86
|
return sql `create ${uniqueStr} index ${index.name} on ${tableName} (${index.columns.join(', ')})`;
|
|
66
87
|
};
|
|
67
|
-
const makeColumnSpec = (tableAst) => {
|
|
88
|
+
export const makeColumnSpec = (tableAst) => {
|
|
68
89
|
const primaryKeys = tableAst.columns.filter((_) => _.primaryKey).map((_) => _.name);
|
|
69
90
|
const columnDefStrs = tableAst.columns.map(toSqliteColumnSpec);
|
|
70
91
|
if (primaryKeys.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/schema-management/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAKvD,OAAO,
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/schema-management/migrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,6 @@
|
|
|
1
|
-
import type { InMemoryDatabase } from '../adapter-types.js';
|
|
2
1
|
import type { LiveStoreSchema } from '../schema/index.js';
|
|
3
2
|
import type { MutationDef } from '../schema/mutations.js';
|
|
3
|
+
import type { MutationDefInfo, SchemaManager } from './common.js';
|
|
4
4
|
export declare const validateSchema: (schema: LiveStoreSchema, schemaManager: SchemaManager) => void;
|
|
5
5
|
export declare const validateMutationDef: (mutationDef: MutationDef.Any, schemaManager: SchemaManager, registeredMutationDefInfo: MutationDefInfo | undefined) => void;
|
|
6
|
-
interface SchemaManager {
|
|
7
|
-
getMutationDefInfos: () => ReadonlyArray<MutationDefInfo>;
|
|
8
|
-
setMutationDefInfo: (mutationDefInfo: MutationDefInfo) => void;
|
|
9
|
-
}
|
|
10
|
-
type MutationDefInfo = {
|
|
11
|
-
mutationName: string;
|
|
12
|
-
schemaHash: number;
|
|
13
|
-
};
|
|
14
|
-
export declare const makeSchemaManager: (db: InMemoryDatabase) => SchemaManager;
|
|
15
|
-
export {};
|
|
16
6
|
//# sourceMappingURL=validate-mutation-defs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-mutation-defs.d.ts","sourceRoot":"","sources":["../../src/schema-management/validate-mutation-defs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate-mutation-defs.d.ts","sourceRoot":"","sources":["../../src/schema-management/validate-mutation-defs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEjE,eAAO,MAAM,cAAc,WAAY,eAAe,iBAAiB,aAAa,SAqBnF,CAAA;AAED,eAAO,MAAM,mBAAmB,gBACjB,YAAY,GAAG,iBACb,aAAa,6BACD,eAAe,GAAG,SAAS,SA0BvD,CAAA"}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import { shouldNeverHappen } from '@livestore/utils';
|
|
2
2
|
import { Schema } from '@livestore/utils/effect';
|
|
3
|
-
import * as otel from '@opentelemetry/api';
|
|
4
|
-
import { SCHEMA_MUTATIONS_META_TABLE, schemaMutationsMetaTable } from '../schema/system-tables.js';
|
|
5
|
-
import { sql } from '../util.js';
|
|
6
|
-
import { dbExecute, dbSelect } from './common.js';
|
|
7
|
-
import { migrateTable } from './migrations.js';
|
|
8
3
|
export const validateSchema = (schema, schemaManager) => {
|
|
9
4
|
// Validate mutation definitions
|
|
10
5
|
const registeredMutationDefInfos = schemaManager.getMutationDefInfos();
|
|
@@ -39,25 +34,4 @@ export const validateMutationDef = (mutationDef, schemaManager, registeredMutati
|
|
|
39
34
|
mutationName: mutationDef.name,
|
|
40
35
|
});
|
|
41
36
|
};
|
|
42
|
-
export const makeSchemaManager = (db) => {
|
|
43
|
-
migrateTable({
|
|
44
|
-
db,
|
|
45
|
-
otelContext: otel.context.active(),
|
|
46
|
-
tableAst: schemaMutationsMetaTable.sqliteDef.ast,
|
|
47
|
-
behaviour: 'create-if-not-exists',
|
|
48
|
-
});
|
|
49
|
-
return {
|
|
50
|
-
getMutationDefInfos: () => {
|
|
51
|
-
const schemaMutationsMetaRows = dbSelect(db, sql `SELECT * FROM ${SCHEMA_MUTATIONS_META_TABLE}`);
|
|
52
|
-
return schemaMutationsMetaRows;
|
|
53
|
-
},
|
|
54
|
-
setMutationDefInfo: (info) => {
|
|
55
|
-
dbExecute(db, sql `INSERT OR REPLACE INTO ${SCHEMA_MUTATIONS_META_TABLE} (mutationName, schemaHash, updatedAt) VALUES ($mutationName, $schemaHash, $updatedAt)`, {
|
|
56
|
-
mutationName: info.mutationName,
|
|
57
|
-
schemaHash: info.schemaHash,
|
|
58
|
-
updatedAt: new Date().toISOString(),
|
|
59
|
-
});
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
};
|
|
63
37
|
//# sourceMappingURL=validate-mutation-defs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-mutation-defs.js","sourceRoot":"","sources":["../../src/schema-management/validate-mutation-defs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"validate-mutation-defs.js","sourceRoot":"","sources":["../../src/schema-management/validate-mutation-defs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAMhD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAuB,EAAE,aAA4B,EAAE,EAAE;IACtF,gCAAgC;IAChC,MAAM,0BAA0B,GAAG,aAAa,CAAC,mBAAmB,EAAE,CAAA;IAEtE,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,MAAM,CAC3D,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAC7F,CAAA;IAED,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,iBAAiB,CACf,iCAAiC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnG,CAAA;IACH,CAAC;IAED,KAAK,MAAM,CAAC,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,yBAAyB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,WAAW,CAAC,IAAI,CAAC,CAAA;QAEnH,mBAAmB,CAAC,WAAW,EAAE,aAAa,EAAE,yBAAyB,CAAC,CAAA;IAC5E,CAAC;IAED,yBAAyB;AAC3B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,WAA4B,EAC5B,aAA4B,EAC5B,yBAAsD,EACtD,EAAE;IACF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IAElD,IAAI,yBAAyB,KAAK,SAAS,EAAE,CAAC;QAC5C,aAAa,CAAC,kBAAkB,CAAC;YAC/B,UAAU;YACV,YAAY,EAAE,WAAW,CAAC,IAAI;SAC/B,CAAC,CAAA;QAEF,OAAM;IACR,CAAC;IAED,IAAI,UAAU,KAAK,yBAAyB,CAAC,UAAU;QAAE,OAAM;IAE/D,mHAAmH;IACnH,8GAA8G;IAE9G,6CAA6C;IAC7C,oGAAoG;IACpG,IAAI;IAEJ,aAAa,CAAC,kBAAkB,CAAC;QAC/B,UAAU;QACV,YAAY,EAAE,WAAW,CAAC,IAAI;KAC/B,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
package/dist/sync/sync.d.ts
CHANGED
|
@@ -13,11 +13,15 @@ export declare class IsOfflineError extends IsOfflineError_base {
|
|
|
13
13
|
}
|
|
14
14
|
declare const InvalidPushError_base: Schema.TaggedErrorClass<InvalidPushError, "InvalidPushError", {
|
|
15
15
|
readonly _tag: Schema.PropertySignature<":", "InvalidPushError", never, ":", "InvalidPushError", true, never>;
|
|
16
|
+
} & {
|
|
17
|
+
message: typeof Schema.String;
|
|
16
18
|
}>;
|
|
17
19
|
export declare class InvalidPushError extends InvalidPushError_base {
|
|
18
20
|
}
|
|
19
21
|
declare const InvalidPullError_base: Schema.TaggedErrorClass<InvalidPullError, "InvalidPullError", {
|
|
20
22
|
readonly _tag: Schema.PropertySignature<":", "InvalidPullError", never, ":", "InvalidPullError", true, never>;
|
|
23
|
+
} & {
|
|
24
|
+
message: typeof Schema.String;
|
|
21
25
|
}>;
|
|
22
26
|
export declare class InvalidPullError extends InvalidPullError_base {
|
|
23
27
|
}
|
package/dist/sync/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEhG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,cAAc,GAAG,gBAAgB,CAAC,CAAA;IAChH,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,CAAC,CAAA;IACzG,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;IAC/C,WAAW,EAAE,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;CACtD,CAAA;;;;AAED,qBAAa,cAAe,SAAQ,mBAA0D;CAAG
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEhG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,cAAc,GAAG,gBAAgB,CAAC,CAAA;IAChH,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,CAAC,CAAA;IACzG,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;IAC/C,WAAW,EAAE,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;CACtD,CAAA;;;;AAED,qBAAa,cAAe,SAAQ,mBAA0D;CAAG;;;;;;AACjG,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG;;;;;;AACL,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG"}
|
package/dist/sync/sync.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { Schema } from '@livestore/utils/effect';
|
|
2
2
|
export class IsOfflineError extends Schema.TaggedError()('IsOfflineError', {}) {
|
|
3
3
|
}
|
|
4
|
-
export class InvalidPushError extends Schema.TaggedError()('InvalidPushError', {
|
|
4
|
+
export class InvalidPushError extends Schema.TaggedError()('InvalidPushError', {
|
|
5
|
+
message: Schema.String,
|
|
6
|
+
}) {
|
|
5
7
|
}
|
|
6
|
-
export class InvalidPullError extends Schema.TaggedError()('InvalidPullError', {
|
|
8
|
+
export class InvalidPullError extends Schema.TaggedError()('InvalidPullError', {
|
|
9
|
+
message: Schema.String,
|
|
10
|
+
}) {
|
|
7
11
|
}
|
|
8
12
|
//# sourceMappingURL=sync.js.map
|
package/dist/sync/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,EAAqC,MAAM,yBAAyB,CAAA;AAWhG,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,WAAW,EAAkB,CAAC,gBAAgB,EAAE,EAAE,CAAC;CAAG;AACjG,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE,EAAE,CAAC;CAAG;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,EAAqC,MAAM,yBAAyB,CAAA;AAWhG,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,WAAW,EAAkB,CAAC,gBAAgB,EAAE,EAAE,CAAC;CAAG;AACjG,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AACL,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/common",
|
|
3
|
-
"version": "0.0.48-dev.
|
|
3
|
+
"version": "0.0.48-dev.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@opentelemetry/api": "^1.9.0",
|
|
32
|
-
"@livestore/utils": "0.0.48-dev.
|
|
33
|
-
"effect-db-schema": "0.0.48-dev.
|
|
32
|
+
"@livestore/utils": "0.0.48-dev.2",
|
|
33
|
+
"effect-db-schema": "0.0.48-dev.2"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"vitest": "^1.6.0"
|
package/src/derived-mutations.ts
CHANGED
|
@@ -2,18 +2,35 @@ import type { GetValForKey } from '@livestore/utils'
|
|
|
2
2
|
import { ReadonlyRecord, Schema } from '@livestore/utils/effect'
|
|
3
3
|
import type { SqliteDsl } from 'effect-db-schema'
|
|
4
4
|
|
|
5
|
-
import type { MutationEvent } from './schema/
|
|
6
|
-
import {
|
|
5
|
+
import type { MutationEvent } from './schema/mutations.js'
|
|
6
|
+
import { defineMutation } from './schema/mutations.js'
|
|
7
7
|
import type { TableOptions } from './schema/table-def.js'
|
|
8
|
+
import * as DbSchema from './schema/table-def.js'
|
|
8
9
|
import { deleteRows, insertRow, updateRows } from './sql-queries/sql-queries.js'
|
|
9
10
|
|
|
10
|
-
export const makeDerivedMutationDefsForTable = <
|
|
11
|
+
export const makeDerivedMutationDefsForTable = <
|
|
12
|
+
TTableDef extends DbSchema.TableDef<
|
|
13
|
+
DbSchema.DefaultSqliteTableDefConstrained,
|
|
14
|
+
boolean,
|
|
15
|
+
DbSchema.TableOptions & { deriveMutations: { enabled: true } }
|
|
16
|
+
>,
|
|
17
|
+
>(
|
|
18
|
+
table: TTableDef,
|
|
19
|
+
) => ({
|
|
11
20
|
insert: deriveCreateMutationDef(table),
|
|
12
21
|
update: deriveUpdateMutationDef(table),
|
|
13
22
|
delete: deriveDeleteMutationDef(table),
|
|
14
23
|
})
|
|
15
24
|
|
|
16
|
-
export const deriveCreateMutationDef = <
|
|
25
|
+
export const deriveCreateMutationDef = <
|
|
26
|
+
TTableDef extends DbSchema.TableDef<
|
|
27
|
+
DbSchema.DefaultSqliteTableDefConstrained,
|
|
28
|
+
boolean,
|
|
29
|
+
DbSchema.TableOptions & { deriveMutations: { enabled: true } }
|
|
30
|
+
>,
|
|
31
|
+
>(
|
|
32
|
+
table: TTableDef,
|
|
33
|
+
) => {
|
|
17
34
|
const tableName = table.sqliteDef.name
|
|
18
35
|
|
|
19
36
|
const [optionalFields, requiredColumns] = ReadonlyRecord.partition(
|
|
@@ -25,20 +42,33 @@ export const deriveCreateMutationDef = <TTableDef extends DbSchema.TableDef>(tab
|
|
|
25
42
|
Schema.extend(Schema.partial(Schema.Struct(ReadonlyRecord.map(optionalFields, (col) => col.schema)))),
|
|
26
43
|
)
|
|
27
44
|
|
|
28
|
-
return defineMutation(
|
|
29
|
-
|
|
45
|
+
return defineMutation(
|
|
46
|
+
`_Derived_Create_${tableName}`,
|
|
47
|
+
insertSchema,
|
|
48
|
+
({ id, ...explicitDefaultValues }) => {
|
|
49
|
+
const defaultValues = DbSchema.getDefaultValuesDecoded(table, explicitDefaultValues)
|
|
30
50
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
51
|
+
const [sql, bindValues] = insertRow({
|
|
52
|
+
tableName: table.sqliteDef.name,
|
|
53
|
+
columns: table.sqliteDef.columns,
|
|
54
|
+
values: { ...defaultValues, id },
|
|
55
|
+
})
|
|
36
56
|
|
|
37
|
-
|
|
38
|
-
|
|
57
|
+
return { sql, bindValues, writeTables: new Set([tableName]) }
|
|
58
|
+
},
|
|
59
|
+
{ localOnly: table.options.deriveMutations.localOnly },
|
|
60
|
+
)
|
|
39
61
|
}
|
|
40
62
|
|
|
41
|
-
export const deriveUpdateMutationDef = <
|
|
63
|
+
export const deriveUpdateMutationDef = <
|
|
64
|
+
TTableDef extends DbSchema.TableDef<
|
|
65
|
+
DbSchema.DefaultSqliteTableDefConstrained,
|
|
66
|
+
boolean,
|
|
67
|
+
DbSchema.TableOptions & { deriveMutations: { enabled: true } }
|
|
68
|
+
>,
|
|
69
|
+
>(
|
|
70
|
+
table: TTableDef,
|
|
71
|
+
) => {
|
|
42
72
|
const tableName = table.sqliteDef.name
|
|
43
73
|
|
|
44
74
|
return defineMutation(
|
|
@@ -57,10 +87,19 @@ export const deriveUpdateMutationDef = <TTableDef extends DbSchema.TableDef>(tab
|
|
|
57
87
|
|
|
58
88
|
return { sql, bindValues, writeTables: new Set([tableName]) }
|
|
59
89
|
},
|
|
90
|
+
{ localOnly: table.options.deriveMutations.localOnly },
|
|
60
91
|
)
|
|
61
92
|
}
|
|
62
93
|
|
|
63
|
-
export const deriveDeleteMutationDef = <
|
|
94
|
+
export const deriveDeleteMutationDef = <
|
|
95
|
+
TTableDef extends DbSchema.TableDef<
|
|
96
|
+
DbSchema.DefaultSqliteTableDefConstrained,
|
|
97
|
+
boolean,
|
|
98
|
+
DbSchema.TableOptions & { deriveMutations: { enabled: true } }
|
|
99
|
+
>,
|
|
100
|
+
>(
|
|
101
|
+
table: TTableDef,
|
|
102
|
+
) => {
|
|
64
103
|
const tableName = table.sqliteDef.name
|
|
65
104
|
|
|
66
105
|
return defineMutation(
|
|
@@ -77,6 +116,7 @@ export const deriveDeleteMutationDef = <TTableDef extends DbSchema.TableDef>(tab
|
|
|
77
116
|
|
|
78
117
|
return { sql, bindValues, writeTables: new Set([tableName]) }
|
|
79
118
|
},
|
|
119
|
+
{ localOnly: table.options.deriveMutations.localOnly },
|
|
80
120
|
)
|
|
81
121
|
}
|
|
82
122
|
|
package/src/schema/index.ts
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
rawSqlMutation,
|
|
13
13
|
} from './mutations.js'
|
|
14
14
|
import { systemTables } from './system-tables.js'
|
|
15
|
-
import type
|
|
15
|
+
import { type TableDef, tableHasDerivedMutations } from './table-def.js'
|
|
16
16
|
|
|
17
17
|
export * from './system-tables.js'
|
|
18
18
|
export * as DbSchema from './table-def.js'
|
|
@@ -84,7 +84,7 @@ export const makeSchema = <TInputSchema extends InputSchema>(
|
|
|
84
84
|
mutations.set(rawSqlMutation.name, rawSqlMutation)
|
|
85
85
|
|
|
86
86
|
for (const tableDef of tables.values()) {
|
|
87
|
-
if (tableDef
|
|
87
|
+
if (tableHasDerivedMutations(tableDef)) {
|
|
88
88
|
const derivedMutationDefs = makeDerivedMutationDefsForTable(tableDef)
|
|
89
89
|
mutations.set(derivedMutationDefs.insert.name, derivedMutationDefs.insert)
|
|
90
90
|
mutations.set(derivedMutationDefs.update.name, derivedMutationDefs.update)
|
package/src/schema/mutations.ts
CHANGED
|
@@ -35,6 +35,12 @@ export type MutationDef<TName extends string, TFrom, TTo> = {
|
|
|
35
35
|
name: TName
|
|
36
36
|
schema: Schema.Schema<TTo, TFrom>
|
|
37
37
|
sql: MutationDefSqlResult<TTo>
|
|
38
|
+
options: {
|
|
39
|
+
/**
|
|
40
|
+
* When set to true, the mutation won't be synced over the network
|
|
41
|
+
*/
|
|
42
|
+
localOnly: boolean
|
|
43
|
+
}
|
|
38
44
|
|
|
39
45
|
/** Helper function to construct mutation event */
|
|
40
46
|
(args: TTo): { mutation: TName; args: TTo; id: string }
|
|
@@ -49,12 +55,19 @@ export const defineMutation = <TName extends string, TFrom, TTo>(
|
|
|
49
55
|
name: TName,
|
|
50
56
|
schema: Schema.Schema<TTo, TFrom>,
|
|
51
57
|
sql: MutationDefSqlResult<TTo>,
|
|
58
|
+
options?: {
|
|
59
|
+
/**
|
|
60
|
+
* When set to true, the mutation won't be synced over the network
|
|
61
|
+
*/
|
|
62
|
+
localOnly?: boolean
|
|
63
|
+
},
|
|
52
64
|
): MutationDef<TName, TFrom, TTo> => {
|
|
53
65
|
const makeEvent = (args: TTo) => ({ mutation: name, args, id: cuid() })
|
|
54
66
|
|
|
55
67
|
Object.defineProperty(makeEvent, 'name', { value: name })
|
|
56
68
|
Object.defineProperty(makeEvent, 'schema', { value: schema })
|
|
57
69
|
Object.defineProperty(makeEvent, 'sql', { value: sql })
|
|
70
|
+
Object.defineProperty(makeEvent, 'options', { value: { localOnly: options?.localOnly ?? false } })
|
|
58
71
|
|
|
59
72
|
return makeEvent as MutationDef<TName, TFrom, TTo>
|
|
60
73
|
}
|
|
@@ -40,7 +40,7 @@ export const systemTables = [schemaMetaTable, schemaMutationsMetaTable]
|
|
|
40
40
|
|
|
41
41
|
/// Mutation log DB
|
|
42
42
|
|
|
43
|
-
export const SyncStatus = Schema.Literal('synced', 'pending', 'error')
|
|
43
|
+
export const SyncStatus = Schema.Literal('synced', 'pending', 'error', 'localOnly')
|
|
44
44
|
export type SyncStatus = typeof SyncStatus.Type
|
|
45
45
|
|
|
46
46
|
export const MUTATION_LOG_META_TABLE = 'mutation_log'
|
package/src/schema/table-def.ts
CHANGED
|
@@ -60,9 +60,21 @@ export type TableDef<
|
|
|
60
60
|
isSingleColumn: TIsSingleColumn
|
|
61
61
|
options: TOptions
|
|
62
62
|
schema: TSchema
|
|
63
|
-
} & (TOptions['deriveMutations']
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
} & (TOptions['deriveMutations']['enabled'] extends true
|
|
64
|
+
? DerivedMutationHelperFns<TSqliteDef['columns'], TOptions>
|
|
65
|
+
: {})
|
|
66
|
+
|
|
67
|
+
export type TableOptionsInput = Partial<
|
|
68
|
+
Omit<TableOptions, 'isSingleColumn' | 'deriveMutations'> & {
|
|
69
|
+
indexes: SqliteDsl.Index[]
|
|
70
|
+
deriveMutations:
|
|
71
|
+
| boolean
|
|
72
|
+
| {
|
|
73
|
+
enabled: true
|
|
74
|
+
localOnly?: boolean
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
>
|
|
66
78
|
|
|
67
79
|
export type TableOptions = {
|
|
68
80
|
/**
|
|
@@ -89,7 +101,15 @@ export type TableOptions = {
|
|
|
89
101
|
*
|
|
90
102
|
* Important: When using this option, make sure you're following the "Rules of mutations" for the table schema.
|
|
91
103
|
*/
|
|
92
|
-
deriveMutations:
|
|
104
|
+
deriveMutations:
|
|
105
|
+
| { enabled: false }
|
|
106
|
+
| {
|
|
107
|
+
enabled: true
|
|
108
|
+
/**
|
|
109
|
+
* When set to true, the mutations won't be synced over the network
|
|
110
|
+
*/
|
|
111
|
+
localOnly: boolean
|
|
112
|
+
}
|
|
93
113
|
/** Derived based on whether the table definition has one or more columns (besides the `id` column) */
|
|
94
114
|
isSingleColumn: boolean
|
|
95
115
|
}
|
|
@@ -121,7 +141,14 @@ export const table = <
|
|
|
121
141
|
isSingleton: options?.isSingleton ?? false,
|
|
122
142
|
dynamicRegistration: options?.dynamicRegistration ?? false,
|
|
123
143
|
disableAutomaticIdColumn: options?.disableAutomaticIdColumn ?? false,
|
|
124
|
-
deriveMutations:
|
|
144
|
+
deriveMutations:
|
|
145
|
+
options?.deriveMutations === true
|
|
146
|
+
? { enabled: true as const, localOnly: false }
|
|
147
|
+
: options?.deriveMutations === false
|
|
148
|
+
? { enabled: false as const }
|
|
149
|
+
: options?.deriveMutations === undefined
|
|
150
|
+
? { enabled: false as const }
|
|
151
|
+
: { enabled: true as const, localOnly: options.deriveMutations.localOnly ?? false },
|
|
125
152
|
isSingleColumn: SqliteDsl.isColumnDefinition(columnOrColumns) === true,
|
|
126
153
|
}
|
|
127
154
|
|
|
@@ -189,9 +216,9 @@ export const table = <
|
|
|
189
216
|
export const tableHasDerivedMutations = <TTableDef extends TableDef>(
|
|
190
217
|
tableDef: TTableDef,
|
|
191
218
|
): tableDef is TTableDef & {
|
|
192
|
-
options: { deriveMutations: true }
|
|
219
|
+
options: { deriveMutations: { enabled: true; localOnly: boolean } }
|
|
193
220
|
} & DerivedMutationHelperFns<TTableDef['sqliteDef']['columns'], TTableDef['options']> =>
|
|
194
|
-
tableDef.options.deriveMutations === true
|
|
221
|
+
tableDef.options.deriveMutations.enabled === true
|
|
195
222
|
|
|
196
223
|
export const tableIsSingleton = <TTableDef extends TableDef>(
|
|
197
224
|
tableDef: TTableDef,
|
|
@@ -258,7 +285,16 @@ type WithDefaults<TOptionsInput extends TableOptionsInput, TIsSingleColumn exten
|
|
|
258
285
|
isSingleton: TOptionsInput['isSingleton'] extends true ? true : false
|
|
259
286
|
dynamicRegistration: TOptionsInput['dynamicRegistration'] extends true ? true : false
|
|
260
287
|
disableAutomaticIdColumn: TOptionsInput['disableAutomaticIdColumn'] extends true ? true : false
|
|
261
|
-
deriveMutations: TOptionsInput['deriveMutations'] extends true
|
|
288
|
+
deriveMutations: TOptionsInput['deriveMutations'] extends true
|
|
289
|
+
? { enabled: true; localOnly: boolean }
|
|
290
|
+
: TOptionsInput['deriveMutations'] extends false
|
|
291
|
+
? { enabled: false }
|
|
292
|
+
: TOptionsInput['deriveMutations'] extends { enabled: true; localOnly?: boolean }
|
|
293
|
+
? {
|
|
294
|
+
enabled: true
|
|
295
|
+
localOnly: TOptionsInput['deriveMutations']['localOnly'] extends true ? true : false
|
|
296
|
+
}
|
|
297
|
+
: never
|
|
262
298
|
isSingleColumn: TIsSingleColumn
|
|
263
299
|
}
|
|
264
300
|
|
|
@@ -27,3 +27,14 @@ export const dbSelect = <T>(db: InMemoryDatabase, queryStr: string, bindValues?:
|
|
|
27
27
|
|
|
28
28
|
return stmt.select<T>(bindValues ? prepareBindValues(bindValues, queryStr) : undefined)
|
|
29
29
|
}
|
|
30
|
+
|
|
31
|
+
export interface SchemaManager {
|
|
32
|
+
getMutationDefInfos: () => ReadonlyArray<MutationDefInfo>
|
|
33
|
+
|
|
34
|
+
setMutationDefInfo: (mutationDefInfo: MutationDefInfo) => void
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type MutationDefInfo = {
|
|
38
|
+
mutationName: string
|
|
39
|
+
schemaHash: number
|
|
40
|
+
}
|
|
@@ -5,14 +5,52 @@ import { SqliteAst, SqliteDsl } from 'effect-db-schema'
|
|
|
5
5
|
|
|
6
6
|
import type { InMemoryDatabase } from '../adapter-types.js'
|
|
7
7
|
import type { LiveStoreSchema } from '../schema/index.js'
|
|
8
|
-
import type { SchemaMetaRow } from '../schema/system-tables.js'
|
|
9
|
-
import {
|
|
8
|
+
import type { SchemaMetaRow, SchemaMutationsMetaRow } from '../schema/system-tables.js'
|
|
9
|
+
import {
|
|
10
|
+
SCHEMA_META_TABLE,
|
|
11
|
+
SCHEMA_MUTATIONS_META_TABLE,
|
|
12
|
+
schemaMetaTable,
|
|
13
|
+
schemaMutationsMetaTable,
|
|
14
|
+
systemTables,
|
|
15
|
+
} from '../schema/system-tables.js'
|
|
10
16
|
import { sql } from '../util.js'
|
|
17
|
+
import type { SchemaManager } from './common.js'
|
|
11
18
|
import { dbExecute, dbSelect } from './common.js'
|
|
12
|
-
import {
|
|
19
|
+
import { validateSchema } from './validate-mutation-defs.js'
|
|
13
20
|
|
|
14
21
|
const getMemoizedTimestamp = memoizeByStringifyArgs(() => new Date().toISOString())
|
|
15
22
|
|
|
23
|
+
export const makeSchemaManager = (db: InMemoryDatabase): SchemaManager => {
|
|
24
|
+
migrateTable({
|
|
25
|
+
db,
|
|
26
|
+
otelContext: otel.context.active(),
|
|
27
|
+
tableAst: schemaMutationsMetaTable.sqliteDef.ast,
|
|
28
|
+
behaviour: 'create-if-not-exists',
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
getMutationDefInfos: () => {
|
|
33
|
+
const schemaMutationsMetaRows = dbSelect<SchemaMutationsMetaRow>(
|
|
34
|
+
db,
|
|
35
|
+
sql`SELECT * FROM ${SCHEMA_MUTATIONS_META_TABLE}`,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
return schemaMutationsMetaRows
|
|
39
|
+
},
|
|
40
|
+
setMutationDefInfo: (info) => {
|
|
41
|
+
dbExecute(
|
|
42
|
+
db,
|
|
43
|
+
sql`INSERT OR REPLACE INTO ${SCHEMA_MUTATIONS_META_TABLE} (mutationName, schemaHash, updatedAt) VALUES ($mutationName, $schemaHash, $updatedAt)`,
|
|
44
|
+
{
|
|
45
|
+
mutationName: info.mutationName,
|
|
46
|
+
schemaHash: info.schemaHash,
|
|
47
|
+
updatedAt: new Date().toISOString(),
|
|
48
|
+
},
|
|
49
|
+
)
|
|
50
|
+
},
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
16
54
|
// TODO more graceful DB migration (e.g. backup DB before destructive migrations)
|
|
17
55
|
export const migrateDb = ({
|
|
18
56
|
db,
|
|
@@ -112,7 +150,7 @@ const createIndexFromDefinition = (tableName: string, index: SqliteAst.Index) =>
|
|
|
112
150
|
return sql`create ${uniqueStr} index ${index.name} on ${tableName} (${index.columns.join(', ')})`
|
|
113
151
|
}
|
|
114
152
|
|
|
115
|
-
const makeColumnSpec = (tableAst: SqliteAst.Table) => {
|
|
153
|
+
export const makeColumnSpec = (tableAst: SqliteAst.Table) => {
|
|
116
154
|
const primaryKeys = tableAst.columns.filter((_) => _.primaryKey).map((_) => _.name)
|
|
117
155
|
const columnDefStrs = tableAst.columns.map(toSqliteColumnSpec)
|
|
118
156
|
if (primaryKeys.length > 0) {
|