@lovrozagar/oat 0.9.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/README.md +26 -1936
  2. package/dist/cli.js +326 -60
  3. package/dist/config/define-config.d.ts +15 -1
  4. package/dist/config/define-config.d.ts.map +1 -1
  5. package/dist/config/define-config.js.map +1 -1
  6. package/dist/config/validate.d.ts +12 -0
  7. package/dist/config/validate.d.ts.map +1 -0
  8. package/dist/config/validate.js +86 -0
  9. package/dist/config/validate.js.map +1 -0
  10. package/dist/conformance/effects.d.ts +9 -0
  11. package/dist/conformance/effects.d.ts.map +1 -0
  12. package/dist/conformance/effects.js +276 -0
  13. package/dist/conformance/effects.js.map +1 -0
  14. package/dist/conformance/expected-failures.d.ts +18 -0
  15. package/dist/conformance/expected-failures.d.ts.map +1 -0
  16. package/dist/conformance/expected-failures.js +48 -0
  17. package/dist/conformance/expected-failures.js.map +1 -0
  18. package/dist/conformance/feature-gate.d.ts +7 -0
  19. package/dist/conformance/feature-gate.d.ts.map +1 -0
  20. package/dist/conformance/feature-gate.js +428 -0
  21. package/dist/conformance/feature-gate.js.map +1 -0
  22. package/dist/conformance/fuzz.d.ts +108 -0
  23. package/dist/conformance/fuzz.d.ts.map +1 -0
  24. package/dist/conformance/fuzz.js +246 -0
  25. package/dist/conformance/fuzz.js.map +1 -0
  26. package/dist/conformance/leaks.d.ts +10 -0
  27. package/dist/conformance/leaks.d.ts.map +1 -0
  28. package/dist/conformance/leaks.js +23 -0
  29. package/dist/conformance/leaks.js.map +1 -0
  30. package/dist/conformance/pool.d.ts +49 -0
  31. package/dist/conformance/pool.d.ts.map +1 -0
  32. package/dist/conformance/pool.js +75 -0
  33. package/dist/conformance/pool.js.map +1 -0
  34. package/dist/conformance/rate-limit.d.ts +7 -0
  35. package/dist/conformance/rate-limit.d.ts.map +1 -0
  36. package/dist/conformance/rate-limit.js +372 -0
  37. package/dist/conformance/rate-limit.js.map +1 -0
  38. package/dist/conformance/scope.d.ts +15 -0
  39. package/dist/conformance/scope.d.ts.map +1 -0
  40. package/dist/conformance/scope.js +78 -0
  41. package/dist/conformance/scope.js.map +1 -0
  42. package/dist/conformance/seed-contract.d.ts +11 -0
  43. package/dist/conformance/seed-contract.d.ts.map +1 -0
  44. package/dist/conformance/seed-contract.js +680 -0
  45. package/dist/conformance/seed-contract.js.map +1 -0
  46. package/dist/conformance/shapes.d.ts +35 -0
  47. package/dist/conformance/shapes.d.ts.map +1 -0
  48. package/dist/conformance/shapes.js +162 -0
  49. package/dist/conformance/shapes.js.map +1 -0
  50. package/dist/conformance/specs.d.ts +21 -0
  51. package/dist/conformance/specs.d.ts.map +1 -0
  52. package/dist/conformance/specs.js +306 -0
  53. package/dist/conformance/specs.js.map +1 -0
  54. package/dist/conformance/suite.d.ts +209 -0
  55. package/dist/conformance/suite.d.ts.map +1 -0
  56. package/dist/conformance/suite.js +1538 -0
  57. package/dist/conformance/suite.js.map +1 -0
  58. package/dist/conformance/unique.d.ts +7 -0
  59. package/dist/conformance/unique.d.ts.map +1 -0
  60. package/dist/conformance/unique.js +586 -0
  61. package/dist/conformance/unique.js.map +1 -0
  62. package/dist/conformance/worker.d.ts +3 -0
  63. package/dist/conformance/worker.d.ts.map +1 -0
  64. package/dist/conformance/worker.js +27 -0
  65. package/dist/conformance/worker.js.map +1 -0
  66. package/dist/index.d.ts +10 -3
  67. package/dist/index.js +6 -2
  68. package/dist/reference/defects.d.ts +71 -1
  69. package/dist/reference/defects.d.ts.map +1 -1
  70. package/dist/reference/defects.js +74 -8
  71. package/dist/reference/defects.js.map +1 -1
  72. package/dist/reference/dialect.d.ts +6 -4
  73. package/dist/reference/dialect.d.ts.map +1 -1
  74. package/dist/reference/dialect.js +1 -0
  75. package/dist/reference/dialect.js.map +1 -1
  76. package/dist/reference/http.d.ts +17 -25
  77. package/dist/reference/http.d.ts.map +1 -1
  78. package/dist/reference/http.js +574 -224
  79. package/dist/reference/http.js.map +1 -1
  80. package/dist/reference/listing.d.ts +51 -0
  81. package/dist/reference/listing.d.ts.map +1 -0
  82. package/dist/reference/listing.js +256 -0
  83. package/dist/reference/listing.js.map +1 -0
  84. package/dist/reference/model.d.ts +35 -1
  85. package/dist/reference/model.d.ts.map +1 -1
  86. package/dist/reference/model.js +42 -0
  87. package/dist/reference/model.js.map +1 -1
  88. package/dist/reference/query.d.ts +132 -43
  89. package/dist/reference/query.d.ts.map +1 -1
  90. package/dist/reference/query.js +397 -315
  91. package/dist/reference/query.js.map +1 -1
  92. package/dist/reference/shapes.d.ts +60 -0
  93. package/dist/reference/shapes.d.ts.map +1 -0
  94. package/dist/reference/shapes.js +142 -0
  95. package/dist/reference/shapes.js.map +1 -0
  96. package/dist/reference/spec.d.ts +9 -2
  97. package/dist/reference/spec.d.ts.map +1 -1
  98. package/dist/reference/spec.js +291 -71
  99. package/dist/reference/spec.js.map +1 -1
  100. package/dist/reference/store-api.d.ts +14 -43
  101. package/dist/reference/store-api.d.ts.map +1 -1
  102. package/dist/reference/store-api.js +8 -58
  103. package/dist/reference/store-api.js.map +1 -1
  104. package/dist/reference/stores/memory.d.ts +12 -15
  105. package/dist/reference/stores/memory.d.ts.map +1 -1
  106. package/dist/reference/stores/memory.js +22 -70
  107. package/dist/reference/stores/memory.js.map +1 -1
  108. package/dist/reference/stores/postgres.d.ts +11 -23
  109. package/dist/reference/stores/postgres.d.ts.map +1 -1
  110. package/dist/reference/stores/postgres.js +53 -334
  111. package/dist/reference/stores/postgres.js.map +1 -1
  112. package/dist/reference/stores/sql-compile.d.ts +36 -0
  113. package/dist/reference/stores/sql-compile.d.ts.map +1 -0
  114. package/dist/reference/stores/sql-compile.js +95 -0
  115. package/dist/reference/stores/sql-compile.js.map +1 -0
  116. package/dist/reference/stores/sqlite.d.ts +12 -27
  117. package/dist/reference/stores/sqlite.d.ts.map +1 -1
  118. package/dist/reference/stores/sqlite.js +54 -355
  119. package/dist/reference/stores/sqlite.js.map +1 -1
  120. package/dist/report/console.d.ts +2 -1
  121. package/dist/report/console.d.ts.map +1 -1
  122. package/dist/report/console.js +56 -10
  123. package/dist/report/console.js.map +1 -1
  124. package/dist/report/matrix.d.ts +10 -13
  125. package/dist/report/matrix.d.ts.map +1 -1
  126. package/dist/report/matrix.js +82 -18
  127. package/dist/report/matrix.js.map +1 -1
  128. package/dist/report/render.d.ts +18 -1
  129. package/dist/report/render.d.ts.map +1 -1
  130. package/dist/report/render.js +169 -14
  131. package/dist/report/render.js.map +1 -1
  132. package/dist/runtime/async.d.ts +16 -3
  133. package/dist/runtime/async.d.ts.map +1 -1
  134. package/dist/runtime/async.js +24 -19
  135. package/dist/runtime/async.js.map +1 -1
  136. package/dist/runtime/auth.d.ts +2 -9
  137. package/dist/runtime/auth.d.ts.map +1 -1
  138. package/dist/runtime/auth.js +38 -62
  139. package/dist/runtime/auth.js.map +1 -1
  140. package/dist/runtime/body.d.ts +15 -3
  141. package/dist/runtime/body.d.ts.map +1 -1
  142. package/dist/runtime/body.js +61 -12
  143. package/dist/runtime/body.js.map +1 -1
  144. package/dist/runtime/check-costs.d.ts +15 -0
  145. package/dist/runtime/check-costs.d.ts.map +1 -0
  146. package/dist/runtime/check-costs.js +114 -0
  147. package/dist/runtime/check-costs.js.map +1 -0
  148. package/dist/runtime/check-ids.d.ts +15 -0
  149. package/dist/runtime/check-ids.d.ts.map +1 -0
  150. package/dist/runtime/check-ids.js +140 -0
  151. package/dist/runtime/check-ids.js.map +1 -0
  152. package/dist/runtime/checks.d.ts +122 -18
  153. package/dist/runtime/checks.d.ts.map +1 -1
  154. package/dist/runtime/checks.js +3437 -1933
  155. package/dist/runtime/checks.js.map +1 -1
  156. package/dist/runtime/client.d.ts +112 -0
  157. package/dist/runtime/client.d.ts.map +1 -1
  158. package/dist/runtime/client.js +271 -39
  159. package/dist/runtime/client.js.map +1 -1
  160. package/dist/runtime/cookies.d.ts +16 -2
  161. package/dist/runtime/cookies.d.ts.map +1 -1
  162. package/dist/runtime/cookies.js +83 -22
  163. package/dist/runtime/cookies.js.map +1 -1
  164. package/dist/runtime/exchanges.d.ts +4 -5
  165. package/dist/runtime/exchanges.d.ts.map +1 -1
  166. package/dist/runtime/exchanges.js +33 -55
  167. package/dist/runtime/exchanges.js.map +1 -1
  168. package/dist/runtime/exit.d.ts +40 -0
  169. package/dist/runtime/exit.d.ts.map +1 -0
  170. package/dist/runtime/exit.js +48 -0
  171. package/dist/runtime/exit.js.map +1 -0
  172. package/dist/runtime/feature-gate.d.ts +0 -9
  173. package/dist/runtime/feature-gate.d.ts.map +1 -1
  174. package/dist/runtime/feature-gate.js +0 -21
  175. package/dist/runtime/feature-gate.js.map +1 -1
  176. package/dist/runtime/finding.d.ts +61 -7
  177. package/dist/runtime/finding.d.ts.map +1 -1
  178. package/dist/runtime/finding.js +74 -12
  179. package/dist/runtime/finding.js.map +1 -1
  180. package/dist/runtime/fixture.d.ts +35 -28
  181. package/dist/runtime/fixture.d.ts.map +1 -1
  182. package/dist/runtime/fixture.js +92 -731
  183. package/dist/runtime/fixture.js.map +1 -1
  184. package/dist/runtime/generate.d.ts +63 -0
  185. package/dist/runtime/generate.d.ts.map +1 -0
  186. package/dist/runtime/generate.js +635 -0
  187. package/dist/runtime/generate.js.map +1 -0
  188. package/dist/runtime/headers.d.ts +6 -0
  189. package/dist/runtime/headers.d.ts.map +1 -0
  190. package/dist/runtime/headers.js +16 -0
  191. package/dist/runtime/headers.js.map +1 -0
  192. package/dist/runtime/path.d.ts +7 -0
  193. package/dist/runtime/path.d.ts.map +1 -0
  194. package/dist/runtime/path.js +44 -0
  195. package/dist/runtime/path.js.map +1 -0
  196. package/dist/runtime/payloads.d.ts +2 -0
  197. package/dist/runtime/payloads.d.ts.map +1 -1
  198. package/dist/runtime/payloads.js +2 -1
  199. package/dist/runtime/payloads.js.map +1 -1
  200. package/dist/runtime/rate-limit.d.ts +6 -4
  201. package/dist/runtime/rate-limit.d.ts.map +1 -1
  202. package/dist/runtime/rate-limit.js +22 -33
  203. package/dist/runtime/rate-limit.js.map +1 -1
  204. package/dist/runtime/redact.d.ts +24 -0
  205. package/dist/runtime/redact.d.ts.map +1 -0
  206. package/dist/runtime/redact.js +98 -0
  207. package/dist/runtime/redact.js.map +1 -0
  208. package/dist/runtime/run.d.ts +51 -2
  209. package/dist/runtime/run.d.ts.map +1 -1
  210. package/dist/runtime/run.js +463 -195
  211. package/dist/runtime/run.js.map +1 -1
  212. package/dist/runtime/runs.d.ts +5 -0
  213. package/dist/runtime/runs.d.ts.map +1 -1
  214. package/dist/runtime/runs.js +7 -1
  215. package/dist/runtime/runs.js.map +1 -1
  216. package/dist/runtime/scope.d.ts +163 -0
  217. package/dist/runtime/scope.d.ts.map +1 -0
  218. package/dist/runtime/scope.js +423 -0
  219. package/dist/runtime/scope.js.map +1 -0
  220. package/dist/runtime/teardown.d.ts +17 -4
  221. package/dist/runtime/teardown.d.ts.map +1 -1
  222. package/dist/runtime/teardown.js +49 -16
  223. package/dist/runtime/teardown.js.map +1 -1
  224. package/dist/runtime/transcript.d.ts +34 -2
  225. package/dist/runtime/transcript.d.ts.map +1 -1
  226. package/dist/runtime/transcript.js +119 -24
  227. package/dist/runtime/transcript.js.map +1 -1
  228. package/dist/runtime/unique.d.ts +2 -11
  229. package/dist/runtime/unique.d.ts.map +1 -1
  230. package/dist/runtime/unique.js +27 -53
  231. package/dist/runtime/unique.js.map +1 -1
  232. package/dist/runtime/validate.d.ts +13 -2
  233. package/dist/runtime/validate.d.ts.map +1 -1
  234. package/dist/runtime/validate.js +51 -31
  235. package/dist/runtime/validate.js.map +1 -1
  236. package/dist/runtime/wait.d.ts +2 -1
  237. package/dist/runtime/wait.d.ts.map +1 -1
  238. package/dist/runtime/wait.js +2 -36
  239. package/dist/runtime/wait.js.map +1 -1
  240. package/dist/runtime/world.d.ts +31 -3
  241. package/dist/runtime/world.d.ts.map +1 -1
  242. package/dist/runtime/world.js +113 -32
  243. package/dist/runtime/world.js.map +1 -1
  244. package/dist/spec/collection.d.ts +8 -2
  245. package/dist/spec/collection.d.ts.map +1 -1
  246. package/dist/spec/collection.js +47 -7
  247. package/dist/spec/collection.js.map +1 -1
  248. package/dist/spec/extensions.d.ts +5 -1
  249. package/dist/spec/extensions.d.ts.map +1 -1
  250. package/dist/spec/extensions.js +9 -2
  251. package/dist/spec/extensions.js.map +1 -1
  252. package/dist/spec/graph.d.ts +46 -0
  253. package/dist/spec/graph.d.ts.map +1 -1
  254. package/dist/spec/graph.js +175 -11
  255. package/dist/spec/graph.js.map +1 -1
  256. package/dist/spec/load.d.ts +25 -5
  257. package/dist/spec/load.d.ts.map +1 -1
  258. package/dist/spec/load.js +160 -59
  259. package/dist/spec/load.js.map +1 -1
  260. package/dist/spec/query-capabilities.d.ts +4 -0
  261. package/dist/spec/query-capabilities.d.ts.map +1 -1
  262. package/dist/spec/query-capabilities.js +6 -0
  263. package/dist/spec/query-capabilities.js.map +1 -1
  264. package/dist/spec/schema.d.ts +20 -0
  265. package/dist/spec/schema.d.ts.map +1 -0
  266. package/dist/spec/schema.js +118 -0
  267. package/dist/spec/schema.js.map +1 -0
  268. package/dist/spec/tag-schema.d.ts +12 -0
  269. package/dist/spec/tag-schema.d.ts.map +1 -0
  270. package/dist/spec/tag-schema.js +143 -0
  271. package/dist/spec/tag-schema.js.map +1 -0
  272. package/dist/spec/types.js +17 -1
  273. package/dist/spec/types.js.map +1 -1
  274. package/docs/api.md +59 -0
  275. package/docs/assumptions.md +99 -0
  276. package/docs/checks.md +183 -0
  277. package/docs/commands.md +214 -0
  278. package/docs/configuration.md +650 -0
  279. package/docs/model.md +184 -0
  280. package/docs/reference-defects.md +94 -0
  281. package/docs/reports.md +211 -0
  282. package/docs/tags.md +400 -0
  283. package/package.json +3 -1
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Compiles the query AST to SQL for both SQL stores.
3
+ *
4
+ * One compiler, so SQLite and Postgres receive the same predicate. What differs is spelled by an
5
+ * `SqlFlavour`: placeholders, how a value is cast to text, how a case-sensitive pattern match is
6
+ * written, and which collation means "binary". Those are real engine differences; the meaning of
7
+ * the predicate is not.
8
+ */
9
+ function isText(entity, field) {
10
+ return entity.fields.find((f) => f.name === field)?.type === "string";
11
+ }
12
+ function value(flavour, scalar, asText) {
13
+ if (asText)
14
+ return String(scalar);
15
+ if (typeof scalar === "boolean")
16
+ return flavour.bool(scalar);
17
+ return scalar;
18
+ }
19
+ export function compileWhere(node, entity, flavour, args) {
20
+ switch (node.kind) {
21
+ case "const":
22
+ return node.value ? "1 = 1" : "1 = 0";
23
+ case "and":
24
+ case "or":
25
+ return `(${node.children.map((child) => compileWhere(child, entity, flavour, args)).join(node.kind === "and" ? " AND " : " OR ")})`;
26
+ case "isnull":
27
+ return `${flavour.column(entity, node.field)} IS ${node.negate ? "NOT " : ""}NULL`;
28
+ case "cmp": {
29
+ const column = flavour.column(entity, node.field);
30
+ /* Text compares binary, whatever the database default collation is. */
31
+ const ref = node.asText ? flavour.toText(column) : isText(entity, node.field) ? flavour.binary(column) : column;
32
+ const op = { eq: "=", gt: ">", gte: ">=", lt: "<", lte: "<=", neq: "<>" }[node.op];
33
+ const sql = `${ref} ${op} ${flavour.bind(args, value(flavour, node.value, node.asText))}`;
34
+ return node.nullsMatch ? `(${sql} OR ${column} IS NULL)` : sql;
35
+ }
36
+ case "in": {
37
+ const column = flavour.column(entity, node.field);
38
+ if (node.values.length === 0)
39
+ return node.negate ? "1 = 1" : "1 = 0";
40
+ const ref = node.asText ? flavour.toText(column) : column;
41
+ const holes = node.values.map((member) => flavour.bind(args, value(flavour, member, node.asText))).join(", ");
42
+ return node.negate ? `(${ref} NOT IN (${holes}) OR ${column} IS NULL)` : `${ref} IN (${holes})`;
43
+ }
44
+ case "like":
45
+ return flavour.like(flavour.column(entity, node.field), node.pattern, node.insensitive, args);
46
+ case "contains": {
47
+ const column = flavour.column(entity, node.field);
48
+ /* The defect matches the serialised array as text, so "red" also matches "redwood". */
49
+ return node.substring
50
+ ? `${flavour.position(column, node.value, true, args)} > 0`
51
+ : flavour.hasElement(column, node.value, args);
52
+ }
53
+ case "search":
54
+ return `(${node.fields
55
+ .map((field) => searchClause(flavour, flavour.toText(flavour.column(entity, field)), node, args))
56
+ .join(" OR ")})`;
57
+ }
58
+ }
59
+ function searchClause(flavour, expr, node, args) {
60
+ const at = flavour.position(expr, node.token, node.caseSensitive, args);
61
+ return node.mode === "prefix" ? `${at} = 1` : `${at} > 0`;
62
+ }
63
+ export function compileOrder(order, collation, shuffleTies, entity, flavour) {
64
+ const terms = [];
65
+ for (const term of order) {
66
+ const column = flavour.column(entity, term.field);
67
+ /* Null placement is written out rather than left to the engine, because the engines
68
+ * disagree: SQLite sorts nulls first ascending, Postgres last. */
69
+ terms.push(`${column} IS NULL ${term.nullsFirst ? "DESC" : "ASC"}`);
70
+ const ref = term.asText
71
+ ? flavour.toText(column)
72
+ : isText(entity, term.field)
73
+ ? collation === "insensitive"
74
+ ? `LOWER(${column})`
75
+ : flavour.binary(column)
76
+ : column;
77
+ terms.push(`${ref} ${term.descending ? "DESC" : "ASC"}`);
78
+ }
79
+ if (shuffleTies)
80
+ terms.push(flavour.random);
81
+ return terms.length === 0 ? "" : ` ORDER BY ${terms.join(", ")}`;
82
+ }
83
+ /** A LIKE pattern with `\` escaping, for engines whose LIKE honours ESCAPE. */
84
+ export function likeText(segments) {
85
+ return segments
86
+ .map((segment) => segment.kind === "any" ? "%" : segment.kind === "one" ? "_" : segment.text.replace(/[\\%_]/g, (ch) => `\\${ch}`))
87
+ .join("");
88
+ }
89
+ /** A GLOB pattern — SQLite's case-sensitive matcher, which needs no pragma. */
90
+ export function globText(segments) {
91
+ return segments
92
+ .map((segment) => segment.kind === "any" ? "*" : segment.kind === "one" ? "?" : segment.text.replace(/[*?[]/g, (ch) => `[${ch}]`))
93
+ .join("");
94
+ }
95
+ //# sourceMappingURL=sql-compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-compile.js","sourceRoot":"","sources":["../../../src/reference/stores/sql-compile.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * SQLite-backed storage for the reference backend.
3
3
  *
4
- * The in-memory store executes the query grammar in JavaScript, which quietly sidesteps the
5
- * behaviours that break real APIs: NULL ordering, collation, LIKE escaping, type affinity, and
6
- * result order when a sort has no total order. Those are exactly the semantics oat's checks
7
- * reason about, so a reference backend that never touches SQL can only prove so much.
4
+ * The in-memory store evaluates the query AST in JavaScript, which quietly sidesteps what breaks
5
+ * real APIs: collation, type affinity, and result order when a sort has no total order. Running
6
+ * the same predicates through a real engine is what makes a check that passes here mean something.
8
7
  *
9
8
  * The engine is supplied as a driver, so the same SQL runs in-process via `node:sqlite` and
10
9
  * remotely against Cloudflare D1. That second target is not redundancy: D1 is a different build
@@ -13,25 +12,23 @@
13
12
  */
14
13
  import type { DefectSet } from "../defects.ts";
15
14
  import type { EntityDef } from "../model.ts";
16
- import { type QueryOptions, type QueryParams, type QueryResult, type Row, SqlError, type Store } from "../store-api.ts";
15
+ import type { SelectPlan } from "../query.ts";
16
+ import type { Row, Store } from "../store-api.ts";
17
17
  import type { SqliteDriver } from "./sqlite-driver.ts";
18
- export { SqlError };
19
- export type { QueryParams, QueryResult, Row };
20
18
  export declare class SqlStore implements Store {
21
19
  private readonly defects;
22
20
  private readonly db;
23
21
  private readonly prefix;
24
- private sequence;
22
+ private readonly entities;
23
+ private readonly flavour;
25
24
  private constructor();
26
25
  /**
27
26
  * Schema creation is a set of round trips on a networked engine, so it cannot live in a
28
27
  * constructor. `prefix` isolates one run's tables from another's on a shared database.
29
28
  */
30
- static create(defects: DefectSet, driver: SqliteDriver, prefix?: string): Promise<SqlStore>;
29
+ static create(defects: DefectSet, driver: SqliteDriver, prefix?: string, entities?: readonly EntityDef[]): Promise<SqlStore>;
31
30
  close(): Promise<void>;
32
31
  private ddl;
33
- nextId(prefix: string): string;
34
- now(): number;
35
32
  /** The stored column for a field — diverges from the declared name only under the defect. */
36
33
  private physical;
37
34
  insert(entity: EntityDef, record: Row): Promise<Row>;
@@ -43,26 +40,14 @@ export declare class SqlStore implements Store {
43
40
  * the literal 'name' rather than an error. See COLUMN_NAME_MISMATCH.
44
41
  */
45
42
  private selectList;
46
- byId(entity: EntityDef, id: string): Promise<Row | null>;
47
- update(entity: EntityDef, id: string, patch: Row): Promise<Row | null>;
48
- /**
49
- * Reads the row, yields, then writes every column back — the `save(entity)` pattern.
50
- *
51
- * A synchronous driver does not prevent this: the lost update comes from the *handler*
52
- * holding state across an await, not from engine-level locking, so it reproduces here
53
- * exactly as it does on a networked database.
54
- */
55
- private readModifyWrite;
56
- remove(entity: EntityDef, id: string): Promise<void>;
43
+ byId(entity: EntityDef, id: string | number): Promise<Row | null>;
44
+ update(entity: EntityDef, id: string | number, patch: Row): Promise<Row | null>;
45
+ remove(entity: EntityDef, id: string | number): Promise<void>;
46
+ select(entity: EntityDef, plan: SelectPlan): Promise<Row[]>;
57
47
  /**
58
48
  * Converts stored values back to their declared shape. SQLite has no boolean type, so a
59
49
  * field declared boolean comes back as 0/1 and would fail its own response schema.
60
50
  */
61
51
  private decode;
62
- query(entity: EntityDef, scope: Record<string, string>, params: QueryParams, options: QueryOptions): Promise<QueryResult>;
63
- private compileFilter;
64
- /** Set by compileOrder when the descending-drops-nulls defect applies to this query. */
65
- private dropNullsFor;
66
- private compileOrder;
67
52
  }
68
53
  //# sourceMappingURL=sqlite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/reference/stores/sqlite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,aAAa,CAAA;AAEtD,OAAO,EAIN,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,QAAQ,EAGR,KAAK,KAAK,EACV,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,oBAAoB,CAAA;AAEhE,OAAO,EAAE,QAAQ,EAAE,CAAA;AACnB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,CAAA;AAyC7C,qBAAa,QAAS,YAAW,KAAK;IAIpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALxB,OAAO,CAAC,QAAQ,CAAI;IAEpB,OAAO;IAMP;;;OAGG;WACU,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,SAAK,GAAG,OAAO,CAAC,QAAQ,CAAC;IAQvF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,OAAO,CAAC,GAAG;IAaX,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAK9B,GAAG,IAAI,MAAM;IAMb,6FAA6F;IAC7F,OAAO,CAAC,QAAQ;IAIV,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAgB1D;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAqBZ,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IASxD,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAc5E;;;;;;OAMG;YACW,eAAe;IAcvB,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D;;;OAGG;IACH,OAAO,CAAC,MAAM;IAeR,KAAK,CACV,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC,WAAW,CAAC;IAmIvB,OAAO,CAAC,aAAa;IA4HrB,wFAAwF;IACxF,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO,CAAC,YAAY;CAuDpB"}
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/reference/stores/sqlite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,aAAa,CAAA;AAEtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,oBAAoB,CAAA;AAmChE,qBAAa,QAAS,YAAW,KAAK;IAIpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAN1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IAEpC,OAAO;IAkCP;;;OAGG;WACU,MAAM,CAClB,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,YAAY,EACpB,MAAM,SAAK,EACX,QAAQ,GAAE,SAAS,SAAS,EAAa,GACvC,OAAO,CAAC,QAAQ,CAAC;IAQd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,OAAO,CAAC,GAAG;IAaX,6FAA6F;IAC7F,OAAO,CAAC,QAAQ;IAIV,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAgB1D;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAqBZ,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IASjE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAa/E,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAWjE;;;OAGG;IACH,OAAO,CAAC,MAAM;CAiBd"}