@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.
Files changed (283) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/dist/agent/capabilities.d.ts +62 -0
  4. package/dist/agent/capabilities.d.ts.map +1 -0
  5. package/dist/agent/capabilities.js +89 -0
  6. package/dist/agent/capabilities.js.map +1 -0
  7. package/dist/agent/permissions.d.ts +56 -0
  8. package/dist/agent/permissions.d.ts.map +1 -0
  9. package/dist/agent/permissions.js +209 -0
  10. package/dist/agent/permissions.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +698 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/codegen/dts.d.ts +3 -0
  16. package/dist/codegen/dts.d.ts.map +1 -0
  17. package/dist/codegen/dts.js +94 -0
  18. package/dist/codegen/dts.js.map +1 -0
  19. package/dist/data/adapter.d.ts +4 -0
  20. package/dist/data/adapter.d.ts.map +1 -0
  21. package/dist/data/adapter.js +18 -0
  22. package/dist/data/adapter.js.map +1 -0
  23. package/dist/data/changeset.d.ts +49 -0
  24. package/dist/data/changeset.d.ts.map +1 -0
  25. package/dist/data/changeset.js +206 -0
  26. package/dist/data/changeset.js.map +1 -0
  27. package/dist/data/expr.d.ts +59 -0
  28. package/dist/data/expr.d.ts.map +1 -0
  29. package/dist/data/expr.js +61 -0
  30. package/dist/data/expr.js.map +1 -0
  31. package/dist/data/fleet.d.ts +28 -0
  32. package/dist/data/fleet.d.ts.map +1 -0
  33. package/dist/data/fleet.js +82 -0
  34. package/dist/data/fleet.js.map +1 -0
  35. package/dist/data/list-search.d.ts +93 -0
  36. package/dist/data/list-search.d.ts.map +1 -0
  37. package/dist/data/list-search.js +268 -0
  38. package/dist/data/list-search.js.map +1 -0
  39. package/dist/data/migrate.d.ts +75 -0
  40. package/dist/data/migrate.d.ts.map +1 -0
  41. package/dist/data/migrate.js +136 -0
  42. package/dist/data/migrate.js.map +1 -0
  43. package/dist/data/pool.d.ts +20 -0
  44. package/dist/data/pool.d.ts.map +1 -0
  45. package/dist/data/pool.js +92 -0
  46. package/dist/data/pool.js.map +1 -0
  47. package/dist/data/query.d.ts +111 -0
  48. package/dist/data/query.d.ts.map +1 -0
  49. package/dist/data/query.js +268 -0
  50. package/dist/data/query.js.map +1 -0
  51. package/dist/data/sqlite.d.ts +3 -0
  52. package/dist/data/sqlite.d.ts.map +1 -0
  53. package/dist/data/sqlite.js +107 -0
  54. package/dist/data/sqlite.js.map +1 -0
  55. package/dist/data/time.d.ts +9 -0
  56. package/dist/data/time.d.ts.map +1 -0
  57. package/dist/data/time.js +107 -0
  58. package/dist/data/time.js.map +1 -0
  59. package/dist/index.d.ts +79 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +51 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/kernel/apps.d.ts +43 -0
  64. package/dist/kernel/apps.d.ts.map +1 -0
  65. package/dist/kernel/apps.js +234 -0
  66. package/dist/kernel/apps.js.map +1 -0
  67. package/dist/kernel/compose.d.ts +6 -0
  68. package/dist/kernel/compose.d.ts.map +1 -0
  69. package/dist/kernel/compose.js +976 -0
  70. package/dist/kernel/compose.js.map +1 -0
  71. package/dist/kernel/define.d.ts +9 -0
  72. package/dist/kernel/define.d.ts.map +1 -0
  73. package/dist/kernel/define.js +140 -0
  74. package/dist/kernel/define.js.map +1 -0
  75. package/dist/kernel/diff.d.ts +11 -0
  76. package/dist/kernel/diff.d.ts.map +1 -0
  77. package/dist/kernel/diff.js +106 -0
  78. package/dist/kernel/diff.js.map +1 -0
  79. package/dist/kernel/errors.d.ts +17 -0
  80. package/dist/kernel/errors.d.ts.map +1 -0
  81. package/dist/kernel/errors.js +43 -0
  82. package/dist/kernel/errors.js.map +1 -0
  83. package/dist/kernel/graph.d.ts +3 -0
  84. package/dist/kernel/graph.d.ts.map +1 -0
  85. package/dist/kernel/graph.js +56 -0
  86. package/dist/kernel/graph.js.map +1 -0
  87. package/dist/kernel/i18n.d.ts +43 -0
  88. package/dist/kernel/i18n.d.ts.map +1 -0
  89. package/dist/kernel/i18n.js +79 -0
  90. package/dist/kernel/i18n.js.map +1 -0
  91. package/dist/kernel/index.d.ts +7 -0
  92. package/dist/kernel/index.d.ts.map +1 -0
  93. package/dist/kernel/index.js +7 -0
  94. package/dist/kernel/index.js.map +1 -0
  95. package/dist/kernel/layout.d.ts +17 -0
  96. package/dist/kernel/layout.d.ts.map +1 -0
  97. package/dist/kernel/layout.js +77 -0
  98. package/dist/kernel/layout.js.map +1 -0
  99. package/dist/kernel/menu.d.ts +27 -0
  100. package/dist/kernel/menu.d.ts.map +1 -0
  101. package/dist/kernel/menu.js +65 -0
  102. package/dist/kernel/menu.js.map +1 -0
  103. package/dist/kernel/modules.d.ts +31 -0
  104. package/dist/kernel/modules.d.ts.map +1 -0
  105. package/dist/kernel/modules.js +322 -0
  106. package/dist/kernel/modules.js.map +1 -0
  107. package/dist/kernel/routes.d.ts +24 -0
  108. package/dist/kernel/routes.d.ts.map +1 -0
  109. package/dist/kernel/routes.js +98 -0
  110. package/dist/kernel/routes.js.map +1 -0
  111. package/dist/kernel/types.d.ts +8 -0
  112. package/dist/kernel/types.d.ts.map +1 -0
  113. package/dist/kernel/types.js +67 -0
  114. package/dist/kernel/types.js.map +1 -0
  115. package/dist/kernel/workspace.d.ts +62 -0
  116. package/dist/kernel/workspace.d.ts.map +1 -0
  117. package/dist/kernel/workspace.js +156 -0
  118. package/dist/kernel/workspace.js.map +1 -0
  119. package/dist/scaffold/index.d.ts +2 -0
  120. package/dist/scaffold/index.d.ts.map +1 -0
  121. package/dist/scaffold/index.js +49 -0
  122. package/dist/scaffold/index.js.map +1 -0
  123. package/dist/scaffold/templates/app.test.ts.tmpl +17 -0
  124. package/dist/scaffold/templates/biome.json.tmpl +30 -0
  125. package/dist/scaffold/templates/dev.mjs.tmpl +16 -0
  126. package/dist/scaffold/templates/gitignore.tmpl +24 -0
  127. package/dist/scaffold/templates/ket.workspace.ts.tmpl +18 -0
  128. package/dist/scaffold/templates/module.ts.tmpl +27 -0
  129. package/dist/scaffold/templates/package.json.tmpl +25 -0
  130. package/dist/scaffold/templates/tsconfig.json.tmpl +15 -0
  131. package/dist/server/boot.d.ts +173 -0
  132. package/dist/server/boot.d.ts.map +1 -0
  133. package/dist/server/boot.js +659 -0
  134. package/dist/server/boot.js.map +1 -0
  135. package/dist/server/config.d.ts +48 -0
  136. package/dist/server/config.d.ts.map +1 -0
  137. package/dist/server/config.js +82 -0
  138. package/dist/server/config.js.map +1 -0
  139. package/dist/server/ctx.d.ts +13 -0
  140. package/dist/server/ctx.d.ts.map +1 -0
  141. package/dist/server/ctx.js +496 -0
  142. package/dist/server/ctx.js.map +1 -0
  143. package/dist/server/fn.d.ts +34 -0
  144. package/dist/server/fn.d.ts.map +1 -0
  145. package/dist/server/fn.js +170 -0
  146. package/dist/server/fn.js.map +1 -0
  147. package/dist/server/http.d.ts +79 -0
  148. package/dist/server/http.d.ts.map +1 -0
  149. package/dist/server/http.js +459 -0
  150. package/dist/server/http.js.map +1 -0
  151. package/dist/server/idem.d.ts +31 -0
  152. package/dist/server/idem.d.ts.map +1 -0
  153. package/dist/server/idem.js +68 -0
  154. package/dist/server/idem.js.map +1 -0
  155. package/dist/server/jobs.d.ts +5 -0
  156. package/dist/server/jobs.d.ts.map +1 -0
  157. package/dist/server/jobs.js +24 -0
  158. package/dist/server/jobs.js.map +1 -0
  159. package/dist/server/multipart.d.ts +18 -0
  160. package/dist/server/multipart.d.ts.map +1 -0
  161. package/dist/server/multipart.js +183 -0
  162. package/dist/server/multipart.js.map +1 -0
  163. package/dist/server/project.d.ts +9 -0
  164. package/dist/server/project.d.ts.map +1 -0
  165. package/dist/server/project.js +67 -0
  166. package/dist/server/project.js.map +1 -0
  167. package/dist/server/queue.d.ts +80 -0
  168. package/dist/server/queue.d.ts.map +1 -0
  169. package/dist/server/queue.js +494 -0
  170. package/dist/server/queue.js.map +1 -0
  171. package/dist/server/respond.d.ts +91 -0
  172. package/dist/server/respond.d.ts.map +1 -0
  173. package/dist/server/respond.js +99 -0
  174. package/dist/server/respond.js.map +1 -0
  175. package/dist/server/runtime.d.ts +14 -0
  176. package/dist/server/runtime.d.ts.map +1 -0
  177. package/dist/server/runtime.js +25 -0
  178. package/dist/server/runtime.js.map +1 -0
  179. package/dist/server/session.d.ts +55 -0
  180. package/dist/server/session.d.ts.map +1 -0
  181. package/dist/server/session.js +172 -0
  182. package/dist/server/session.js.map +1 -0
  183. package/dist/server/sessionstore.d.ts +54 -0
  184. package/dist/server/sessionstore.d.ts.map +1 -0
  185. package/dist/server/sessionstore.js +232 -0
  186. package/dist/server/sessionstore.js.map +1 -0
  187. package/dist/server/storage/index.d.ts +11 -0
  188. package/dist/server/storage/index.d.ts.map +1 -0
  189. package/dist/server/storage/index.js +31 -0
  190. package/dist/server/storage/index.js.map +1 -0
  191. package/dist/server/storage/local.d.ts +5 -0
  192. package/dist/server/storage/local.d.ts.map +1 -0
  193. package/dist/server/storage/local.js +165 -0
  194. package/dist/server/storage/local.js.map +1 -0
  195. package/dist/server/storage/s3.d.ts +11 -0
  196. package/dist/server/storage/s3.d.ts.map +1 -0
  197. package/dist/server/storage/s3.js +133 -0
  198. package/dist/server/storage/s3.js.map +1 -0
  199. package/dist/server/storage/sigv4.d.ts +23 -0
  200. package/dist/server/storage/sigv4.d.ts.map +1 -0
  201. package/dist/server/storage/sigv4.js +79 -0
  202. package/dist/server/storage/sigv4.js.map +1 -0
  203. package/dist/server/storage/types.d.ts +37 -0
  204. package/dist/server/storage/types.d.ts.map +1 -0
  205. package/dist/server/storage/types.js +82 -0
  206. package/dist/server/storage/types.js.map +1 -0
  207. package/dist/server/stream.d.ts +43 -0
  208. package/dist/server/stream.d.ts.map +1 -0
  209. package/dist/server/stream.js +117 -0
  210. package/dist/server/stream.js.map +1 -0
  211. package/dist/server/streamstore.d.ts +29 -0
  212. package/dist/server/streamstore.d.ts.map +1 -0
  213. package/dist/server/streamstore.js +140 -0
  214. package/dist/server/streamstore.js.map +1 -0
  215. package/dist/server/tenants.d.ts +108 -0
  216. package/dist/server/tenants.d.ts.map +1 -0
  217. package/dist/server/tenants.js +172 -0
  218. package/dist/server/tenants.js.map +1 -0
  219. package/dist/server/transport/index.d.ts +5 -0
  220. package/dist/server/transport/index.d.ts.map +1 -0
  221. package/dist/server/transport/index.js +3 -0
  222. package/dist/server/transport/index.js.map +1 -0
  223. package/dist/server/transport/memory.d.ts +14 -0
  224. package/dist/server/transport/memory.d.ts.map +1 -0
  225. package/dist/server/transport/memory.js +36 -0
  226. package/dist/server/transport/memory.js.map +1 -0
  227. package/dist/server/transport/types.d.ts +44 -0
  228. package/dist/server/transport/types.d.ts.map +1 -0
  229. package/dist/server/transport/types.js +79 -0
  230. package/dist/server/transport/types.js.map +1 -0
  231. package/dist/server/worker.d.ts +33 -0
  232. package/dist/server/worker.d.ts.map +1 -0
  233. package/dist/server/worker.js +428 -0
  234. package/dist/server/worker.js.map +1 -0
  235. package/dist/testing.d.ts +146 -0
  236. package/dist/testing.d.ts.map +1 -0
  237. package/dist/testing.js +406 -0
  238. package/dist/testing.js.map +1 -0
  239. package/dist/theme/contracts.d.ts +4 -0
  240. package/dist/theme/contracts.d.ts.map +1 -0
  241. package/dist/theme/contracts.js +87 -0
  242. package/dist/theme/contracts.js.map +1 -0
  243. package/dist/theme/index.d.ts +8 -0
  244. package/dist/theme/index.d.ts.map +1 -0
  245. package/dist/theme/index.js +7 -0
  246. package/dist/theme/index.js.map +1 -0
  247. package/dist/theme/joints.d.ts +19 -0
  248. package/dist/theme/joints.d.ts.map +1 -0
  249. package/dist/theme/joints.js +126 -0
  250. package/dist/theme/joints.js.map +1 -0
  251. package/dist/theme/ktl/compile.d.ts +26 -0
  252. package/dist/theme/ktl/compile.d.ts.map +1 -0
  253. package/dist/theme/ktl/compile.js +226 -0
  254. package/dist/theme/ktl/compile.js.map +1 -0
  255. package/dist/theme/ktl/lexer.d.ts +20 -0
  256. package/dist/theme/ktl/lexer.d.ts.map +1 -0
  257. package/dist/theme/ktl/lexer.js +56 -0
  258. package/dist/theme/ktl/lexer.js.map +1 -0
  259. package/dist/theme/ktl/parser.d.ts +64 -0
  260. package/dist/theme/ktl/parser.d.ts.map +1 -0
  261. package/dist/theme/ktl/parser.js +220 -0
  262. package/dist/theme/ktl/parser.js.map +1 -0
  263. package/dist/theme/render.d.ts +19 -0
  264. package/dist/theme/render.d.ts.map +1 -0
  265. package/dist/theme/render.js +246 -0
  266. package/dist/theme/render.js.map +1 -0
  267. package/dist/theme/templates.d.ts +2 -0
  268. package/dist/theme/templates.d.ts.map +1 -0
  269. package/dist/theme/templates.js +40 -0
  270. package/dist/theme/templates.js.map +1 -0
  271. package/dist/theme/tokens.d.ts +4 -0
  272. package/dist/theme/tokens.d.ts.map +1 -0
  273. package/dist/theme/tokens.js +15 -0
  274. package/dist/theme/tokens.js.map +1 -0
  275. package/dist/theme/viewmodel.d.ts +6 -0
  276. package/dist/theme/viewmodel.d.ts.map +1 -0
  277. package/dist/theme/viewmodel.js +40 -0
  278. package/dist/theme/viewmodel.js.map +1 -0
  279. package/dist/types.d.ts +614 -0
  280. package/dist/types.d.ts.map +1 -0
  281. package/dist/types.js +3 -0
  282. package/dist/types.js.map +1 -0
  283. 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":"AAAA,8CAA8C;AAC9C,EAAE;AACF,oFAAoF;AACpF,oFAAoF;AACpF,8EAA8E;AAC9E,8EAA8E;AAC9E,sEAAsE;AAEtE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAK3E,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;CAM5B,CAAA;AACD,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;CAM/B,CAAA;AAID,KAAK,UAAU,WAAW,CAAC,OAAgB;IACzC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,KAAK,UAAU,CAAA;IACtC,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;IACzD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;IAC/E,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,OAAO,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAY,CAAC,CAAC,CAAC,IAAI,CAAA;AAC5D,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAgB,EAAE,MAAc,EAAE,GAAW;IACvE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,KAAK,UAAU,CAAA;IACtC,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B,qCAAqC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,eAAe,EAC9E,CAAC,IAAI,EAAE,GAAG,CAAC,CACZ,CAAA;IACD,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;YACnG,IAAI;YACJ,GAAG;SACJ,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAgB,EAChB,QAAkB,EAClB,CAAC,GAAyE,EAAE;IAE5E,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,IAAI,KAAK,EAAE,CAAC,CAAA;IAC7F,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,GAAG,CAAA;IACxB,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC;QAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClE,MAAM,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IAClF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAiB,EACjB,UAAoB,EACpB,QAAkB,EAClB,CAAC,GAAyE,EAAE;IAE5E,MAAM,GAAG,GAAsB,EAAE,CAAA;IACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;YACrF,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;QAClD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAA0B;IACpD,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,CAAC,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/E,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAA;QAC9E,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,kBAAkB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;IAC/G,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC"}
@@ -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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"}