@ketvietlab/ketjs 0.1.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/LICENSE +21 -0
- package/README.md +36 -0
- package/dist/agent/capabilities.d.ts +62 -0
- package/dist/agent/capabilities.d.ts.map +1 -0
- package/dist/agent/capabilities.js +89 -0
- package/dist/agent/capabilities.js.map +1 -0
- package/dist/agent/permissions.d.ts +56 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +209 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +698 -0
- package/dist/cli.js.map +1 -0
- package/dist/codegen/dts.d.ts +3 -0
- package/dist/codegen/dts.d.ts.map +1 -0
- package/dist/codegen/dts.js +94 -0
- package/dist/codegen/dts.js.map +1 -0
- package/dist/data/adapter.d.ts +4 -0
- package/dist/data/adapter.d.ts.map +1 -0
- package/dist/data/adapter.js +18 -0
- package/dist/data/adapter.js.map +1 -0
- package/dist/data/changeset.d.ts +49 -0
- package/dist/data/changeset.d.ts.map +1 -0
- package/dist/data/changeset.js +206 -0
- package/dist/data/changeset.js.map +1 -0
- package/dist/data/expr.d.ts +59 -0
- package/dist/data/expr.d.ts.map +1 -0
- package/dist/data/expr.js +61 -0
- package/dist/data/expr.js.map +1 -0
- package/dist/data/fleet.d.ts +28 -0
- package/dist/data/fleet.d.ts.map +1 -0
- package/dist/data/fleet.js +82 -0
- package/dist/data/fleet.js.map +1 -0
- package/dist/data/list-search.d.ts +93 -0
- package/dist/data/list-search.d.ts.map +1 -0
- package/dist/data/list-search.js +268 -0
- package/dist/data/list-search.js.map +1 -0
- package/dist/data/migrate.d.ts +75 -0
- package/dist/data/migrate.d.ts.map +1 -0
- package/dist/data/migrate.js +136 -0
- package/dist/data/migrate.js.map +1 -0
- package/dist/data/pool.d.ts +20 -0
- package/dist/data/pool.d.ts.map +1 -0
- package/dist/data/pool.js +92 -0
- package/dist/data/pool.js.map +1 -0
- package/dist/data/query.d.ts +111 -0
- package/dist/data/query.d.ts.map +1 -0
- package/dist/data/query.js +268 -0
- package/dist/data/query.js.map +1 -0
- package/dist/data/sqlite.d.ts +3 -0
- package/dist/data/sqlite.d.ts.map +1 -0
- package/dist/data/sqlite.js +107 -0
- package/dist/data/sqlite.js.map +1 -0
- package/dist/data/time.d.ts +9 -0
- package/dist/data/time.d.ts.map +1 -0
- package/dist/data/time.js +107 -0
- package/dist/data/time.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/apps.d.ts +43 -0
- package/dist/kernel/apps.d.ts.map +1 -0
- package/dist/kernel/apps.js +234 -0
- package/dist/kernel/apps.js.map +1 -0
- package/dist/kernel/compose.d.ts +6 -0
- package/dist/kernel/compose.d.ts.map +1 -0
- package/dist/kernel/compose.js +976 -0
- package/dist/kernel/compose.js.map +1 -0
- package/dist/kernel/define.d.ts +9 -0
- package/dist/kernel/define.d.ts.map +1 -0
- package/dist/kernel/define.js +140 -0
- package/dist/kernel/define.js.map +1 -0
- package/dist/kernel/diff.d.ts +11 -0
- package/dist/kernel/diff.d.ts.map +1 -0
- package/dist/kernel/diff.js +106 -0
- package/dist/kernel/diff.js.map +1 -0
- package/dist/kernel/errors.d.ts +17 -0
- package/dist/kernel/errors.d.ts.map +1 -0
- package/dist/kernel/errors.js +43 -0
- package/dist/kernel/errors.js.map +1 -0
- package/dist/kernel/graph.d.ts +3 -0
- package/dist/kernel/graph.d.ts.map +1 -0
- package/dist/kernel/graph.js +56 -0
- package/dist/kernel/graph.js.map +1 -0
- package/dist/kernel/i18n.d.ts +43 -0
- package/dist/kernel/i18n.d.ts.map +1 -0
- package/dist/kernel/i18n.js +79 -0
- package/dist/kernel/i18n.js.map +1 -0
- package/dist/kernel/index.d.ts +7 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +7 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/layout.d.ts +17 -0
- package/dist/kernel/layout.d.ts.map +1 -0
- package/dist/kernel/layout.js +77 -0
- package/dist/kernel/layout.js.map +1 -0
- package/dist/kernel/menu.d.ts +27 -0
- package/dist/kernel/menu.d.ts.map +1 -0
- package/dist/kernel/menu.js +65 -0
- package/dist/kernel/menu.js.map +1 -0
- package/dist/kernel/modules.d.ts +31 -0
- package/dist/kernel/modules.d.ts.map +1 -0
- package/dist/kernel/modules.js +322 -0
- package/dist/kernel/modules.js.map +1 -0
- package/dist/kernel/routes.d.ts +24 -0
- package/dist/kernel/routes.d.ts.map +1 -0
- package/dist/kernel/routes.js +98 -0
- package/dist/kernel/routes.js.map +1 -0
- package/dist/kernel/types.d.ts +8 -0
- package/dist/kernel/types.d.ts.map +1 -0
- package/dist/kernel/types.js +67 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/kernel/workspace.d.ts +62 -0
- package/dist/kernel/workspace.d.ts.map +1 -0
- package/dist/kernel/workspace.js +156 -0
- package/dist/kernel/workspace.js.map +1 -0
- package/dist/scaffold/index.d.ts +2 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +49 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/templates/app.test.ts.tmpl +17 -0
- package/dist/scaffold/templates/biome.json.tmpl +30 -0
- package/dist/scaffold/templates/dev.mjs.tmpl +16 -0
- package/dist/scaffold/templates/gitignore.tmpl +24 -0
- package/dist/scaffold/templates/ket.workspace.ts.tmpl +18 -0
- package/dist/scaffold/templates/module.ts.tmpl +27 -0
- package/dist/scaffold/templates/package.json.tmpl +25 -0
- package/dist/scaffold/templates/tsconfig.json.tmpl +15 -0
- package/dist/server/boot.d.ts +173 -0
- package/dist/server/boot.d.ts.map +1 -0
- package/dist/server/boot.js +659 -0
- package/dist/server/boot.js.map +1 -0
- package/dist/server/config.d.ts +48 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +82 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/ctx.d.ts +13 -0
- package/dist/server/ctx.d.ts.map +1 -0
- package/dist/server/ctx.js +496 -0
- package/dist/server/ctx.js.map +1 -0
- package/dist/server/fn.d.ts +34 -0
- package/dist/server/fn.d.ts.map +1 -0
- package/dist/server/fn.js +170 -0
- package/dist/server/fn.js.map +1 -0
- package/dist/server/http.d.ts +79 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +459 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/idem.d.ts +31 -0
- package/dist/server/idem.d.ts.map +1 -0
- package/dist/server/idem.js +68 -0
- package/dist/server/idem.js.map +1 -0
- package/dist/server/jobs.d.ts +5 -0
- package/dist/server/jobs.d.ts.map +1 -0
- package/dist/server/jobs.js +24 -0
- package/dist/server/jobs.js.map +1 -0
- package/dist/server/multipart.d.ts +18 -0
- package/dist/server/multipart.d.ts.map +1 -0
- package/dist/server/multipart.js +183 -0
- package/dist/server/multipart.js.map +1 -0
- package/dist/server/project.d.ts +9 -0
- package/dist/server/project.d.ts.map +1 -0
- package/dist/server/project.js +67 -0
- package/dist/server/project.js.map +1 -0
- package/dist/server/queue.d.ts +80 -0
- package/dist/server/queue.d.ts.map +1 -0
- package/dist/server/queue.js +494 -0
- package/dist/server/queue.js.map +1 -0
- package/dist/server/respond.d.ts +91 -0
- package/dist/server/respond.d.ts.map +1 -0
- package/dist/server/respond.js +99 -0
- package/dist/server/respond.js.map +1 -0
- package/dist/server/runtime.d.ts +14 -0
- package/dist/server/runtime.d.ts.map +1 -0
- package/dist/server/runtime.js +25 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/session.d.ts +55 -0
- package/dist/server/session.d.ts.map +1 -0
- package/dist/server/session.js +172 -0
- package/dist/server/session.js.map +1 -0
- package/dist/server/sessionstore.d.ts +54 -0
- package/dist/server/sessionstore.d.ts.map +1 -0
- package/dist/server/sessionstore.js +232 -0
- package/dist/server/sessionstore.js.map +1 -0
- package/dist/server/storage/index.d.ts +11 -0
- package/dist/server/storage/index.d.ts.map +1 -0
- package/dist/server/storage/index.js +31 -0
- package/dist/server/storage/index.js.map +1 -0
- package/dist/server/storage/local.d.ts +5 -0
- package/dist/server/storage/local.d.ts.map +1 -0
- package/dist/server/storage/local.js +165 -0
- package/dist/server/storage/local.js.map +1 -0
- package/dist/server/storage/s3.d.ts +11 -0
- package/dist/server/storage/s3.d.ts.map +1 -0
- package/dist/server/storage/s3.js +133 -0
- package/dist/server/storage/s3.js.map +1 -0
- package/dist/server/storage/sigv4.d.ts +23 -0
- package/dist/server/storage/sigv4.d.ts.map +1 -0
- package/dist/server/storage/sigv4.js +79 -0
- package/dist/server/storage/sigv4.js.map +1 -0
- package/dist/server/storage/types.d.ts +37 -0
- package/dist/server/storage/types.d.ts.map +1 -0
- package/dist/server/storage/types.js +82 -0
- package/dist/server/storage/types.js.map +1 -0
- package/dist/server/stream.d.ts +43 -0
- package/dist/server/stream.d.ts.map +1 -0
- package/dist/server/stream.js +117 -0
- package/dist/server/stream.js.map +1 -0
- package/dist/server/streamstore.d.ts +29 -0
- package/dist/server/streamstore.d.ts.map +1 -0
- package/dist/server/streamstore.js +140 -0
- package/dist/server/streamstore.js.map +1 -0
- package/dist/server/tenants.d.ts +108 -0
- package/dist/server/tenants.d.ts.map +1 -0
- package/dist/server/tenants.js +172 -0
- package/dist/server/tenants.js.map +1 -0
- package/dist/server/transport/index.d.ts +5 -0
- package/dist/server/transport/index.d.ts.map +1 -0
- package/dist/server/transport/index.js +3 -0
- package/dist/server/transport/index.js.map +1 -0
- package/dist/server/transport/memory.d.ts +14 -0
- package/dist/server/transport/memory.d.ts.map +1 -0
- package/dist/server/transport/memory.js +36 -0
- package/dist/server/transport/memory.js.map +1 -0
- package/dist/server/transport/types.d.ts +44 -0
- package/dist/server/transport/types.d.ts.map +1 -0
- package/dist/server/transport/types.js +79 -0
- package/dist/server/transport/types.js.map +1 -0
- package/dist/server/worker.d.ts +33 -0
- package/dist/server/worker.d.ts.map +1 -0
- package/dist/server/worker.js +428 -0
- package/dist/server/worker.js.map +1 -0
- package/dist/testing.d.ts +146 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +406 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme/contracts.d.ts +4 -0
- package/dist/theme/contracts.d.ts.map +1 -0
- package/dist/theme/contracts.js +87 -0
- package/dist/theme/contracts.js.map +1 -0
- package/dist/theme/index.d.ts +8 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +7 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/joints.d.ts +19 -0
- package/dist/theme/joints.d.ts.map +1 -0
- package/dist/theme/joints.js +126 -0
- package/dist/theme/joints.js.map +1 -0
- package/dist/theme/ktl/compile.d.ts +26 -0
- package/dist/theme/ktl/compile.d.ts.map +1 -0
- package/dist/theme/ktl/compile.js +226 -0
- package/dist/theme/ktl/compile.js.map +1 -0
- package/dist/theme/ktl/lexer.d.ts +20 -0
- package/dist/theme/ktl/lexer.d.ts.map +1 -0
- package/dist/theme/ktl/lexer.js +56 -0
- package/dist/theme/ktl/lexer.js.map +1 -0
- package/dist/theme/ktl/parser.d.ts +64 -0
- package/dist/theme/ktl/parser.d.ts.map +1 -0
- package/dist/theme/ktl/parser.js +220 -0
- package/dist/theme/ktl/parser.js.map +1 -0
- package/dist/theme/render.d.ts +19 -0
- package/dist/theme/render.d.ts.map +1 -0
- package/dist/theme/render.js +246 -0
- package/dist/theme/render.js.map +1 -0
- package/dist/theme/templates.d.ts +2 -0
- package/dist/theme/templates.d.ts.map +1 -0
- package/dist/theme/templates.js +40 -0
- package/dist/theme/templates.js.map +1 -0
- package/dist/theme/tokens.d.ts +4 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +15 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/theme/viewmodel.d.ts +6 -0
- package/dist/theme/viewmodel.d.ts.map +1 -0
- package/dist/theme/viewmodel.js +40 -0
- package/dist/theme/viewmodel.js.map +1 -0
- package/dist/types.d.ts +614 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { MigrationOp } from './migrate.ts';
|
|
2
|
+
import type { AdapterPool } from './pool.ts';
|
|
3
|
+
import type { Adapter, Manifest } from '../types.ts';
|
|
4
|
+
export declare const MIGRATION_DDL = "\nCREATE TABLE IF NOT EXISTS ket_migration (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n schema TEXT NOT NULL,\n applied_at TEXT NOT NULL\n);\n";
|
|
5
|
+
export declare const MIGRATION_DDL_PG = "\nCREATE TABLE IF NOT EXISTS ket_migration (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n schema TEXT NOT NULL,\n applied_at TIMESTAMPTZ NOT NULL\n);\n";
|
|
6
|
+
export type MigrationResult = {
|
|
7
|
+
datastore: string;
|
|
8
|
+
ops: MigrationOp[];
|
|
9
|
+
applied: boolean;
|
|
10
|
+
error?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function migrateOne(adapter: Adapter, manifest: Manifest, o?: {
|
|
13
|
+
allowDestructive?: boolean;
|
|
14
|
+
dryRun?: boolean;
|
|
15
|
+
now?: () => string;
|
|
16
|
+
}): Promise<MigrationOp[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Migrate every named database. One failure does not stop the fleet — the result
|
|
19
|
+
* says exactly which databases moved and which did not, because a half-migrated
|
|
20
|
+
* fleet you cannot see is worse than one you can.
|
|
21
|
+
*/
|
|
22
|
+
export declare function migrateFleet(pool: AdapterPool, datastores: string[], manifest: Manifest, o?: {
|
|
23
|
+
allowDestructive?: boolean;
|
|
24
|
+
dryRun?: boolean;
|
|
25
|
+
now?: () => string;
|
|
26
|
+
}): Promise<MigrationResult[]>;
|
|
27
|
+
export declare function formatFleet(results: MigrationResult[]): string;
|
|
28
|
+
//# sourceMappingURL=fleet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/data/fleet.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAU,WAAW,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEpD,eAAO,MAAM,aAAa,kKAMzB,CAAA;AACD,eAAO,MAAM,gBAAgB,gLAM5B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AA0BzG,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,CAAC,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GAC3E,OAAO,CAAC,WAAW,EAAE,CAAC,CAQxB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,QAAQ,EAClB,CAAC,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GAC3E,OAAO,CAAC,eAAe,EAAE,CAAC,CAW5B;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAQ9D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// Migrating many databases from one manifest.
|
|
2
|
+
//
|
|
3
|
+
// Odoo lets each database install a different set of modules, so there is no single
|
|
4
|
+
// schema to reason about and every fleet upgrade is N unknown migrations. Ket takes
|
|
5
|
+
// the opposite position: one manifest, many databases, the same target schema
|
|
6
|
+
// everywhere. Each database records the schema it is actually on, so a tenant
|
|
7
|
+
// created last year and one created today converge on the same shape.
|
|
8
|
+
import { schemaFromManifest, planMigration, renderSql } from './migrate.js';
|
|
9
|
+
export const MIGRATION_DDL = `
|
|
10
|
+
CREATE TABLE IF NOT EXISTS ket_migration (
|
|
11
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
12
|
+
schema TEXT NOT NULL,
|
|
13
|
+
applied_at TEXT NOT NULL
|
|
14
|
+
);
|
|
15
|
+
`;
|
|
16
|
+
export const MIGRATION_DDL_PG = `
|
|
17
|
+
CREATE TABLE IF NOT EXISTS ket_migration (
|
|
18
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
19
|
+
schema TEXT NOT NULL,
|
|
20
|
+
applied_at TIMESTAMPTZ NOT NULL
|
|
21
|
+
);
|
|
22
|
+
`;
|
|
23
|
+
async function readApplied(adapter) {
|
|
24
|
+
const pg = adapter.name === 'postgres';
|
|
25
|
+
await adapter.exec(pg ? MIGRATION_DDL_PG : MIGRATION_DDL);
|
|
26
|
+
const rows = await adapter.all(`SELECT schema FROM ket_migration WHERE id = 1`);
|
|
27
|
+
const r = rows[0];
|
|
28
|
+
return r ? JSON.parse(String(r.schema)) : null;
|
|
29
|
+
}
|
|
30
|
+
async function writeApplied(adapter, schema, now) {
|
|
31
|
+
const pg = adapter.name === 'postgres';
|
|
32
|
+
const p = (n) => (pg ? `$${n}` : '?');
|
|
33
|
+
const json = JSON.stringify(schema);
|
|
34
|
+
const upd = await adapter.run(`UPDATE ket_migration SET schema = ${p(1)}, applied_at = ${p(2)} WHERE id = 1`, [json, now]);
|
|
35
|
+
if (upd.changes === 0) {
|
|
36
|
+
await adapter.run(`INSERT INTO ket_migration (id, schema, applied_at) VALUES (1, ${p(1)}, ${p(2)})`, [
|
|
37
|
+
json,
|
|
38
|
+
now,
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function migrateOne(adapter, manifest, o = {}) {
|
|
43
|
+
const target = schemaFromManifest(manifest);
|
|
44
|
+
const applied = await readApplied(adapter);
|
|
45
|
+
const ops = planMigration(applied, target, { allowDestructive: o.allowDestructive ?? false });
|
|
46
|
+
if (o.dryRun)
|
|
47
|
+
return ops;
|
|
48
|
+
for (const sql of renderSql(ops, adapter))
|
|
49
|
+
await adapter.exec(sql);
|
|
50
|
+
await writeApplied(adapter, target, (o.now ?? (() => new Date().toISOString()))());
|
|
51
|
+
return ops;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Migrate every named database. One failure does not stop the fleet — the result
|
|
55
|
+
* says exactly which databases moved and which did not, because a half-migrated
|
|
56
|
+
* fleet you cannot see is worse than one you can.
|
|
57
|
+
*/
|
|
58
|
+
export async function migrateFleet(pool, datastores, manifest, o = {}) {
|
|
59
|
+
const out = [];
|
|
60
|
+
for (const datastore of datastores) {
|
|
61
|
+
try {
|
|
62
|
+
const ops = await pool.with(datastore, (adapter) => migrateOne(adapter, manifest, o));
|
|
63
|
+
out.push({ datastore, ops, applied: !o.dryRun });
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
out.push({ datastore, ops: [], applied: false, error: e.message });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
export function formatFleet(results) {
|
|
72
|
+
return results
|
|
73
|
+
.map((r) => {
|
|
74
|
+
if (r.error)
|
|
75
|
+
return `FAIL ${r.datastore.padEnd(24)} ${r.error.split('\n')[0]}`;
|
|
76
|
+
if (!r.ops.length)
|
|
77
|
+
return `ok ${r.datastore.padEnd(24)} already up to date`;
|
|
78
|
+
return `ok ${r.datastore.padEnd(24)} ${r.ops.length} operation(s): ${r.ops.map((op) => op.op).join(', ')}`;
|
|
79
|
+
})
|
|
80
|
+
.join('\n');
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=fleet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/data/fleet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Col, Expr } from './expr.ts';
|
|
2
|
+
import type { GroupInterval } from './time.ts';
|
|
3
|
+
export type ListFieldType = 'text' | 'number' | 'boolean' | 'selection' | 'reference' | 'date' | 'datetime';
|
|
4
|
+
export type FilterOperator = 'contains' | 'notContains' | 'equals' | 'notEquals' | 'startsWith' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'anyOf' | 'isTrue' | 'isFalse' | 'isSet' | 'isNotSet';
|
|
5
|
+
export type FilterRule = {
|
|
6
|
+
kind: 'rule';
|
|
7
|
+
field: string;
|
|
8
|
+
operator: FilterOperator;
|
|
9
|
+
value?: unknown;
|
|
10
|
+
};
|
|
11
|
+
export type FilterGroup = {
|
|
12
|
+
kind: 'group';
|
|
13
|
+
op: 'and' | 'or';
|
|
14
|
+
children: FilterNode[];
|
|
15
|
+
};
|
|
16
|
+
export type FilterNode = FilterRule | FilterGroup;
|
|
17
|
+
export type SearchFieldSpec = {
|
|
18
|
+
key: string;
|
|
19
|
+
col: Col;
|
|
20
|
+
};
|
|
21
|
+
export type FilterFieldSpec = {
|
|
22
|
+
key: string;
|
|
23
|
+
label: string;
|
|
24
|
+
col: Col;
|
|
25
|
+
type: ListFieldType;
|
|
26
|
+
operators?: readonly FilterOperator[];
|
|
27
|
+
choices?: readonly string[];
|
|
28
|
+
};
|
|
29
|
+
export type GroupFieldSpec = {
|
|
30
|
+
key: string;
|
|
31
|
+
label: string;
|
|
32
|
+
col: Col;
|
|
33
|
+
intervals?: readonly GroupInterval[];
|
|
34
|
+
};
|
|
35
|
+
export type SortFieldSpec = {
|
|
36
|
+
key: string;
|
|
37
|
+
label: string;
|
|
38
|
+
col: Col;
|
|
39
|
+
};
|
|
40
|
+
export type PresetFilterSpec = {
|
|
41
|
+
key: string;
|
|
42
|
+
label: string;
|
|
43
|
+
group: string;
|
|
44
|
+
expr: Expr;
|
|
45
|
+
};
|
|
46
|
+
export type ListSearchSpec = {
|
|
47
|
+
key: string;
|
|
48
|
+
searchable?: readonly SearchFieldSpec[];
|
|
49
|
+
filterable?: readonly FilterFieldSpec[];
|
|
50
|
+
groupable?: readonly GroupFieldSpec[];
|
|
51
|
+
sortable?: readonly SortFieldSpec[];
|
|
52
|
+
presets?: readonly PresetFilterSpec[];
|
|
53
|
+
defaultSort?: readonly ListSort[];
|
|
54
|
+
limits?: Partial<ListSearchLimits>;
|
|
55
|
+
};
|
|
56
|
+
export type ListGroup = {
|
|
57
|
+
key: string;
|
|
58
|
+
interval?: GroupInterval;
|
|
59
|
+
};
|
|
60
|
+
export type ListSort = {
|
|
61
|
+
key: string;
|
|
62
|
+
dir: 'asc' | 'desc';
|
|
63
|
+
};
|
|
64
|
+
export type ListState = {
|
|
65
|
+
q?: string;
|
|
66
|
+
presets: string[];
|
|
67
|
+
filters: FilterNode[];
|
|
68
|
+
groupBy: ListGroup[];
|
|
69
|
+
sort: ListSort[];
|
|
70
|
+
openGroups: unknown[][];
|
|
71
|
+
groupPages: Record<string, number>;
|
|
72
|
+
page: number;
|
|
73
|
+
includeArchived: boolean;
|
|
74
|
+
favoriteId?: string;
|
|
75
|
+
};
|
|
76
|
+
export type ParsedListState = {
|
|
77
|
+
state: ListState;
|
|
78
|
+
warnings: string[];
|
|
79
|
+
};
|
|
80
|
+
export type ListSearchLimits = {
|
|
81
|
+
maxDepth: number;
|
|
82
|
+
maxRules: number;
|
|
83
|
+
maxGroups: number;
|
|
84
|
+
maxOpenGroups: number;
|
|
85
|
+
};
|
|
86
|
+
export declare const defineListSearch: <T extends ListSearchSpec>(spec: T) => T;
|
|
87
|
+
export declare function parseListState(spec: ListSearchSpec, url: URL): ParsedListState;
|
|
88
|
+
export declare function encodeListState(state: ListState, base: URL | string): string;
|
|
89
|
+
export declare function validateListState(spec: ListSearchSpec, state: ListState): void;
|
|
90
|
+
export declare function compileListFilter(spec: ListSearchSpec, state: ListState, options?: {
|
|
91
|
+
timezone?: string;
|
|
92
|
+
}): Expr | null;
|
|
93
|
+
//# sourceMappingURL=list-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-search.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/data/list-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { KetError } from '../kernel/errors.js';
|
|
2
|
+
import { and, eq, gt, gte, ilike, inArray, isNotNull, isNull, lt, lte, ne, not, numericCompare, or, } from './expr.js';
|
|
3
|
+
import { localDateTimeToUtc, localDayRange } from './time.js';
|
|
4
|
+
const DEFAULT_LIMITS = { maxDepth: 4, maxRules: 25, maxGroups: 3, maxOpenGroups: 10 };
|
|
5
|
+
const token = (value) => Buffer.from(JSON.stringify(value)).toString('base64url');
|
|
6
|
+
const untoken = (value) => JSON.parse(Buffer.from(value, 'base64url').toString('utf8'));
|
|
7
|
+
export const defineListSearch = (spec) => {
|
|
8
|
+
if (!/^[a-z][a-z0-9_.-]*$/.test(spec.key))
|
|
9
|
+
throw new KetError({ code: 'E_LIST_SPEC', message: `invalid list key "${spec.key}"` });
|
|
10
|
+
for (const collection of [spec.searchable, spec.filterable, spec.groupable, spec.sortable]) {
|
|
11
|
+
const keys = (collection ?? []).map((field) => field.key);
|
|
12
|
+
if (new Set(keys).size !== keys.length)
|
|
13
|
+
throw new KetError({ code: 'E_LIST_SPEC', message: `duplicate field key in ${spec.key}` });
|
|
14
|
+
}
|
|
15
|
+
return Object.freeze(spec);
|
|
16
|
+
};
|
|
17
|
+
const positiveInt = (value, fallback = 1) => {
|
|
18
|
+
const parsed = Number(value);
|
|
19
|
+
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : fallback;
|
|
20
|
+
};
|
|
21
|
+
export function parseListState(spec, url) {
|
|
22
|
+
const warnings = [];
|
|
23
|
+
const limits = { ...DEFAULT_LIMITS, ...spec.limits };
|
|
24
|
+
const presetKeys = new Set((spec.presets ?? []).map((item) => item.key));
|
|
25
|
+
const groupFields = new Map((spec.groupable ?? []).map((field) => [field.key, field]));
|
|
26
|
+
const sortKeys = new Set((spec.sortable ?? []).map((field) => field.key));
|
|
27
|
+
const presets = url.searchParams.getAll('preset').filter((key) => {
|
|
28
|
+
if (presetKeys.has(key))
|
|
29
|
+
return true;
|
|
30
|
+
warnings.push(`unknown preset: ${key}`);
|
|
31
|
+
return false;
|
|
32
|
+
});
|
|
33
|
+
const filterCandidates = [];
|
|
34
|
+
for (const raw of url.searchParams.getAll('filter')) {
|
|
35
|
+
try {
|
|
36
|
+
filterCandidates.push(untoken(raw));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
warnings.push('invalid filter token');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const groupBy = [];
|
|
43
|
+
for (const raw of url.searchParams.getAll('group').slice(0, limits.maxGroups)) {
|
|
44
|
+
const [key, interval] = raw.split(':');
|
|
45
|
+
const field = groupFields.get(key ?? '');
|
|
46
|
+
if (!field || (interval && !field.intervals?.includes(interval))) {
|
|
47
|
+
warnings.push(`invalid group: ${raw}`);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
groupBy.push({ key: key, ...(interval ? { interval: interval } : {}) });
|
|
51
|
+
}
|
|
52
|
+
const sort = [];
|
|
53
|
+
for (const raw of url.searchParams.getAll('sort')) {
|
|
54
|
+
const [key, dir = 'asc'] = raw.split(':');
|
|
55
|
+
if (!sortKeys.has(key ?? '') || (dir !== 'asc' && dir !== 'desc')) {
|
|
56
|
+
warnings.push(`invalid sort: ${raw}`);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
sort.push({ key: key, dir });
|
|
60
|
+
}
|
|
61
|
+
const openGroups = [];
|
|
62
|
+
for (const raw of url.searchParams.getAll('open').slice(0, limits.maxOpenGroups)) {
|
|
63
|
+
try {
|
|
64
|
+
const path = untoken(raw);
|
|
65
|
+
if (Array.isArray(path))
|
|
66
|
+
openGroups.push(path);
|
|
67
|
+
else
|
|
68
|
+
warnings.push('invalid open group');
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
warnings.push('invalid open group token');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const groupPages = {};
|
|
75
|
+
for (const raw of url.searchParams.getAll('groupPage')) {
|
|
76
|
+
const split = raw.lastIndexOf(':');
|
|
77
|
+
if (split > 0)
|
|
78
|
+
groupPages[raw.slice(0, split)] = positiveInt(raw.slice(split + 1));
|
|
79
|
+
}
|
|
80
|
+
const state = {
|
|
81
|
+
...(url.searchParams.get('q')?.trim() ? { q: url.searchParams.get('q').trim() } : {}),
|
|
82
|
+
presets: [...new Set(presets)],
|
|
83
|
+
filters: [],
|
|
84
|
+
groupBy,
|
|
85
|
+
sort: sort.length ? sort : [...(spec.defaultSort ?? [])],
|
|
86
|
+
openGroups,
|
|
87
|
+
groupPages,
|
|
88
|
+
page: positiveInt(url.searchParams.get('page')),
|
|
89
|
+
includeArchived: url.searchParams.get('archived') === '1',
|
|
90
|
+
...(url.searchParams.get('favorite') ? { favoriteId: url.searchParams.get('favorite') } : {}),
|
|
91
|
+
};
|
|
92
|
+
for (const filter of filterCandidates) {
|
|
93
|
+
try {
|
|
94
|
+
validateListState(spec, { ...state, filters: [filter] });
|
|
95
|
+
state.filters.push(filter);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
warnings.push('invalid filter');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
validateListState(spec, state);
|
|
102
|
+
return { state, warnings };
|
|
103
|
+
}
|
|
104
|
+
export function encodeListState(state, base) {
|
|
105
|
+
const url = new URL(typeof base === 'string' ? base : base.href, 'http://ket.local');
|
|
106
|
+
for (const key of [
|
|
107
|
+
'q',
|
|
108
|
+
'preset',
|
|
109
|
+
'filter',
|
|
110
|
+
'group',
|
|
111
|
+
'sort',
|
|
112
|
+
'open',
|
|
113
|
+
'groupPage',
|
|
114
|
+
'page',
|
|
115
|
+
'archived',
|
|
116
|
+
'favorite',
|
|
117
|
+
])
|
|
118
|
+
url.searchParams.delete(key);
|
|
119
|
+
if (state.q)
|
|
120
|
+
url.searchParams.set('q', state.q);
|
|
121
|
+
for (const preset of state.presets)
|
|
122
|
+
url.searchParams.append('preset', preset);
|
|
123
|
+
for (const filter of state.filters)
|
|
124
|
+
url.searchParams.append('filter', token(filter));
|
|
125
|
+
for (const group of state.groupBy)
|
|
126
|
+
url.searchParams.append('group', `${group.key}${group.interval ? `:${group.interval}` : ''}`);
|
|
127
|
+
for (const sort of state.sort)
|
|
128
|
+
url.searchParams.append('sort', `${sort.key}:${sort.dir}`);
|
|
129
|
+
for (const path of state.openGroups)
|
|
130
|
+
url.searchParams.append('open', token(path));
|
|
131
|
+
for (const [path, page] of Object.entries(state.groupPages))
|
|
132
|
+
url.searchParams.append('groupPage', `${path}:${page}`);
|
|
133
|
+
if (state.page > 1)
|
|
134
|
+
url.searchParams.set('page', String(state.page));
|
|
135
|
+
if (state.includeArchived)
|
|
136
|
+
url.searchParams.set('archived', '1');
|
|
137
|
+
if (state.favoriteId)
|
|
138
|
+
url.searchParams.set('favorite', state.favoriteId);
|
|
139
|
+
return `${url.pathname}${url.search}`;
|
|
140
|
+
}
|
|
141
|
+
const defaultOperators = {
|
|
142
|
+
text: ['contains', 'notContains', 'equals', 'notEquals', 'startsWith', 'isSet', 'isNotSet'],
|
|
143
|
+
number: ['equals', 'notEquals', 'gt', 'gte', 'lt', 'lte', 'between', 'isSet', 'isNotSet'],
|
|
144
|
+
boolean: ['isTrue', 'isFalse'],
|
|
145
|
+
selection: ['equals', 'notEquals', 'anyOf', 'isSet', 'isNotSet'],
|
|
146
|
+
reference: ['equals', 'notEquals', 'anyOf', 'isSet', 'isNotSet'],
|
|
147
|
+
date: ['equals', 'notEquals', 'gt', 'gte', 'lt', 'lte', 'between', 'isSet', 'isNotSet'],
|
|
148
|
+
datetime: ['equals', 'notEquals', 'gt', 'gte', 'lt', 'lte', 'between', 'isSet', 'isNotSet'],
|
|
149
|
+
};
|
|
150
|
+
const countTree = (node, depth = 1) => {
|
|
151
|
+
if (node.kind === 'rule')
|
|
152
|
+
return { depth, rules: 1 };
|
|
153
|
+
return node.children.reduce((total, child) => {
|
|
154
|
+
const next = countTree(child, depth + 1);
|
|
155
|
+
return { depth: Math.max(total.depth, next.depth), rules: total.rules + next.rules };
|
|
156
|
+
}, { depth, rules: 0 });
|
|
157
|
+
};
|
|
158
|
+
export function validateListState(spec, state) {
|
|
159
|
+
const limits = { ...DEFAULT_LIMITS, ...spec.limits };
|
|
160
|
+
const fields = new Map((spec.filterable ?? []).map((field) => [field.key, field]));
|
|
161
|
+
let totalRules = 0;
|
|
162
|
+
for (const node of state.filters) {
|
|
163
|
+
const size = countTree(node);
|
|
164
|
+
totalRules += size.rules;
|
|
165
|
+
if (size.depth > limits.maxDepth)
|
|
166
|
+
throw new KetError({ code: 'E_LIST_FILTER', message: `filter exceeds depth ${limits.maxDepth}` });
|
|
167
|
+
const visit = (part) => {
|
|
168
|
+
if (part.kind === 'group') {
|
|
169
|
+
for (const child of part.children)
|
|
170
|
+
visit(child);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const field = fields.get(part.field);
|
|
174
|
+
if (!field || !(field.operators ?? defaultOperators[field.type]).includes(part.operator))
|
|
175
|
+
throw new KetError({
|
|
176
|
+
code: 'E_LIST_FILTER',
|
|
177
|
+
message: `invalid filter ${part.field}.${part.operator}`,
|
|
178
|
+
});
|
|
179
|
+
if (field.choices && part.value != null) {
|
|
180
|
+
const values = Array.isArray(part.value) ? part.value : [part.value];
|
|
181
|
+
if (values.some((value) => !field.choices.includes(String(value))))
|
|
182
|
+
throw new KetError({ code: 'E_LIST_FILTER', message: `invalid value for ${part.field}` });
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
visit(node);
|
|
186
|
+
}
|
|
187
|
+
if (totalRules > limits.maxRules)
|
|
188
|
+
throw new KetError({ code: 'E_LIST_FILTER', message: `filter exceeds ${limits.maxRules} rules` });
|
|
189
|
+
if (state.groupBy.length > limits.maxGroups || state.openGroups.length > limits.maxOpenGroups)
|
|
190
|
+
throw new KetError({ code: 'E_LIST_FILTER', message: 'group state exceeds its limit' });
|
|
191
|
+
}
|
|
192
|
+
const wildcard = (value) => String(value ?? '').replace(/[\\%_]/g, '\\$&');
|
|
193
|
+
const ruleExpr = (field, rule, timezone) => {
|
|
194
|
+
const value = rule.value;
|
|
195
|
+
if (rule.operator === 'contains')
|
|
196
|
+
return ilike(field.col, `%${wildcard(value)}%`, true);
|
|
197
|
+
if (rule.operator === 'notContains')
|
|
198
|
+
return not(ilike(field.col, `%${wildcard(value)}%`, true));
|
|
199
|
+
if (rule.operator === 'startsWith')
|
|
200
|
+
return ilike(field.col, `${wildcard(value)}%`, true);
|
|
201
|
+
if (field.type === 'number' && ['equals', 'notEquals', 'gt', 'gte', 'lt', 'lte'].includes(rule.operator)) {
|
|
202
|
+
const comparison = { equals: '=', notEquals: '<>', gt: '>', gte: '>=', lt: '<', lte: '<=' };
|
|
203
|
+
return numericCompare(field.col, comparison[rule.operator], value);
|
|
204
|
+
}
|
|
205
|
+
if (field.type === 'datetime' && rule.operator === 'equals' && typeof value === 'string') {
|
|
206
|
+
const [start, end] = /^\d{4}-\d{2}-\d{2}$/.test(value)
|
|
207
|
+
? localDayRange(value, timezone)
|
|
208
|
+
: [localDateTimeToUtc(value, timezone), localDateTimeToUtc(value, timezone)];
|
|
209
|
+
return end === start ? eq(field.col, start) : and(gte(field.col, start), lt(field.col, end));
|
|
210
|
+
}
|
|
211
|
+
if (rule.operator === 'equals')
|
|
212
|
+
return eq(field.col, value);
|
|
213
|
+
if (rule.operator === 'notEquals')
|
|
214
|
+
return ne(field.col, value);
|
|
215
|
+
if (rule.operator === 'gt')
|
|
216
|
+
return gt(field.col, value);
|
|
217
|
+
if (rule.operator === 'gte')
|
|
218
|
+
return gte(field.col, value);
|
|
219
|
+
if (rule.operator === 'lt')
|
|
220
|
+
return lt(field.col, value);
|
|
221
|
+
if (rule.operator === 'lte')
|
|
222
|
+
return lte(field.col, value);
|
|
223
|
+
if (rule.operator === 'anyOf')
|
|
224
|
+
return inArray(field.col, Array.isArray(value) ? value : [value]);
|
|
225
|
+
if (rule.operator === 'isTrue')
|
|
226
|
+
return eq(field.col, true);
|
|
227
|
+
if (rule.operator === 'isFalse')
|
|
228
|
+
return eq(field.col, false);
|
|
229
|
+
if (rule.operator === 'isSet')
|
|
230
|
+
return isNotNull(field.col);
|
|
231
|
+
if (rule.operator === 'isNotSet')
|
|
232
|
+
return isNull(field.col);
|
|
233
|
+
if (rule.operator === 'between' && Array.isArray(value) && value.length === 2) {
|
|
234
|
+
if (field.type === 'datetime' && value.every((part) => typeof part === 'string'))
|
|
235
|
+
return and(gte(field.col, localDateTimeToUtc(String(value[0]), timezone)), lt(field.col, localDateTimeToUtc(String(value[1]), timezone)));
|
|
236
|
+
return field.type === 'number'
|
|
237
|
+
? and(numericCompare(field.col, '>=', value[0]), numericCompare(field.col, '<', value[1]))
|
|
238
|
+
: and(gte(field.col, value[0]), lt(field.col, value[1]));
|
|
239
|
+
}
|
|
240
|
+
throw new KetError({ code: 'E_LIST_FILTER', message: `invalid value for ${field.key}.${rule.operator}` });
|
|
241
|
+
};
|
|
242
|
+
export function compileListFilter(spec, state, options = {}) {
|
|
243
|
+
validateListState(spec, state);
|
|
244
|
+
const fields = new Map((spec.filterable ?? []).map((field) => [field.key, field]));
|
|
245
|
+
const compileNode = (node) => node.kind === 'rule'
|
|
246
|
+
? ruleExpr(fields.get(node.field), node, options.timezone ?? 'UTC')
|
|
247
|
+
: node.op === 'and'
|
|
248
|
+
? and(...node.children.map(compileNode))
|
|
249
|
+
: or(...node.children.map(compileNode));
|
|
250
|
+
const parts = [];
|
|
251
|
+
if (state.q && spec.searchable?.length)
|
|
252
|
+
parts.push(or(...spec.searchable.map((field) => ilike(field.col, `%${wildcard(state.q)}%`, true))));
|
|
253
|
+
const presets = new Map((spec.presets ?? []).map((preset) => [preset.key, preset]));
|
|
254
|
+
const grouped = new Map();
|
|
255
|
+
for (const key of state.presets) {
|
|
256
|
+
const preset = presets.get(key);
|
|
257
|
+
if (!preset)
|
|
258
|
+
continue;
|
|
259
|
+
const list = grouped.get(preset.group) ?? [];
|
|
260
|
+
list.push(preset.expr);
|
|
261
|
+
grouped.set(preset.group, list);
|
|
262
|
+
}
|
|
263
|
+
for (const expressions of grouped.values())
|
|
264
|
+
parts.push(or(...expressions));
|
|
265
|
+
parts.push(...state.filters.map(compileNode));
|
|
266
|
+
return parts.length ? and(...parts) : null;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=list-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-search.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/data/list-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Adapter, Manifest, FieldBase } from '../types.ts';
|
|
2
|
+
export type Column = {
|
|
3
|
+
sql: string;
|
|
4
|
+
base: FieldBase;
|
|
5
|
+
optional: boolean;
|
|
6
|
+
by: string;
|
|
7
|
+
target: string | null;
|
|
8
|
+
};
|
|
9
|
+
export type Index = {
|
|
10
|
+
fields: string[];
|
|
11
|
+
unique: boolean;
|
|
12
|
+
by: string;
|
|
13
|
+
};
|
|
14
|
+
export type Table = {
|
|
15
|
+
model: string;
|
|
16
|
+
owner: string;
|
|
17
|
+
columns: Record<string, Column>;
|
|
18
|
+
indexes: Record<string, Index>;
|
|
19
|
+
};
|
|
20
|
+
export type Schema = {
|
|
21
|
+
version: number;
|
|
22
|
+
tables: Record<string, Table>;
|
|
23
|
+
};
|
|
24
|
+
export type MigrationOp = {
|
|
25
|
+
op: 'CREATE_TABLE';
|
|
26
|
+
table: string;
|
|
27
|
+
columns: Record<string, Column>;
|
|
28
|
+
destructive: false;
|
|
29
|
+
} | {
|
|
30
|
+
op: 'ADD_COLUMN';
|
|
31
|
+
table: string;
|
|
32
|
+
column: string;
|
|
33
|
+
def: Column;
|
|
34
|
+
destructive: false;
|
|
35
|
+
} | {
|
|
36
|
+
op: 'CREATE_INDEX';
|
|
37
|
+
table: string;
|
|
38
|
+
name: string;
|
|
39
|
+
def: Index;
|
|
40
|
+
destructive: false;
|
|
41
|
+
} | {
|
|
42
|
+
op: 'DROP_INDEX';
|
|
43
|
+
table: string;
|
|
44
|
+
name: string;
|
|
45
|
+
destructive: true;
|
|
46
|
+
} | {
|
|
47
|
+
op: 'DROP_COLUMN';
|
|
48
|
+
table: string;
|
|
49
|
+
column: string;
|
|
50
|
+
by: string;
|
|
51
|
+
destructive: true;
|
|
52
|
+
} | {
|
|
53
|
+
op: 'ALTER_COLUMN_TYPE';
|
|
54
|
+
table: string;
|
|
55
|
+
column: string;
|
|
56
|
+
from: string;
|
|
57
|
+
to: string;
|
|
58
|
+
destructive: true;
|
|
59
|
+
} | {
|
|
60
|
+
op: 'DROP_TABLE';
|
|
61
|
+
table: string;
|
|
62
|
+
destructive: true;
|
|
63
|
+
};
|
|
64
|
+
export declare const tableNameFor: (modelKey: string) => string;
|
|
65
|
+
export declare function schemaFromManifest(manifest: Manifest): Schema;
|
|
66
|
+
export declare class DestructiveMigrationError extends Error {
|
|
67
|
+
code: string;
|
|
68
|
+
ops: MigrationOp[];
|
|
69
|
+
constructor(message: string, ops: MigrationOp[]);
|
|
70
|
+
}
|
|
71
|
+
export declare function planMigration(prev: Schema | null, next: Schema, opts?: {
|
|
72
|
+
allowDestructive?: boolean;
|
|
73
|
+
}): MigrationOp[];
|
|
74
|
+
export declare function renderSql(ops: MigrationOp[], adapter: Adapter): string[];
|
|
75
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/data/migrate.ts"],"names":[],"mappings":"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"}
|