@ketvietlab/ketjs 0.1.2 → 0.1.5

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 (307) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +8 -2
  3. package/dist/agent/capabilities.d.ts +1 -3
  4. package/dist/agent/capabilities.d.ts.map +1 -1
  5. package/dist/agent/capabilities.js +10 -1
  6. package/dist/agent/capabilities.js.map +1 -1
  7. package/dist/agent/permissions.d.ts +43 -1
  8. package/dist/agent/permissions.d.ts.map +1 -1
  9. package/dist/agent/permissions.js +50 -2
  10. package/dist/agent/permissions.js.map +1 -1
  11. package/dist/cli.js +246 -97
  12. package/dist/cli.js.map +1 -1
  13. package/dist/codegen/dts.d.ts.map +1 -1
  14. package/dist/codegen/dts.js +1 -0
  15. package/dist/codegen/dts.js.map +1 -1
  16. package/dist/data/changeset.d.ts +12 -0
  17. package/dist/data/changeset.d.ts.map +1 -1
  18. package/dist/data/changeset.js +73 -17
  19. package/dist/data/changeset.js.map +1 -1
  20. package/dist/data/expr.d.ts +25 -1
  21. package/dist/data/expr.d.ts.map +1 -1
  22. package/dist/data/expr.js +47 -6
  23. package/dist/data/expr.js.map +1 -1
  24. package/dist/data/fleet.d.ts +41 -1
  25. package/dist/data/fleet.d.ts.map +1 -1
  26. package/dist/data/fleet.js +100 -11
  27. package/dist/data/fleet.js.map +1 -1
  28. package/dist/data/migrate.d.ts +20 -0
  29. package/dist/data/migrate.d.ts.map +1 -1
  30. package/dist/data/migrate.js +86 -3
  31. package/dist/data/migrate.js.map +1 -1
  32. package/dist/data/physical.d.ts +5 -0
  33. package/dist/data/physical.d.ts.map +1 -0
  34. package/dist/data/physical.js +196 -0
  35. package/dist/data/physical.js.map +1 -0
  36. package/dist/data/pool.d.ts +2 -1
  37. package/dist/data/pool.d.ts.map +1 -1
  38. package/dist/data/pool.js +159 -31
  39. package/dist/data/pool.js.map +1 -1
  40. package/dist/data/query.d.ts +10 -1
  41. package/dist/data/query.d.ts.map +1 -1
  42. package/dist/data/query.js +136 -27
  43. package/dist/data/query.js.map +1 -1
  44. package/dist/data/sqlite.d.ts.map +1 -1
  45. package/dist/data/sqlite.js +350 -52
  46. package/dist/data/sqlite.js.map +1 -1
  47. package/dist/data/time.d.ts +13 -0
  48. package/dist/data/time.d.ts.map +1 -1
  49. package/dist/data/time.js +61 -17
  50. package/dist/data/time.js.map +1 -1
  51. package/dist/index.d.ts +45 -24
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +34 -18
  54. package/dist/index.js.map +1 -1
  55. package/dist/kernel/audit.d.ts +27 -0
  56. package/dist/kernel/audit.d.ts.map +1 -0
  57. package/dist/kernel/audit.js +67 -0
  58. package/dist/kernel/audit.js.map +1 -0
  59. package/dist/kernel/classification.d.ts +26 -0
  60. package/dist/kernel/classification.d.ts.map +1 -0
  61. package/dist/kernel/classification.js +73 -0
  62. package/dist/kernel/classification.js.map +1 -0
  63. package/dist/kernel/compose.d.ts +6 -2
  64. package/dist/kernel/compose.d.ts.map +1 -1
  65. package/dist/kernel/compose.js +269 -15
  66. package/dist/kernel/compose.js.map +1 -1
  67. package/dist/kernel/define.d.ts +2 -3
  68. package/dist/kernel/define.d.ts.map +1 -1
  69. package/dist/kernel/define.js +22 -12
  70. package/dist/kernel/define.js.map +1 -1
  71. package/dist/kernel/diff.d.ts.map +1 -1
  72. package/dist/kernel/diff.js +28 -4
  73. package/dist/kernel/diff.js.map +1 -1
  74. package/dist/kernel/graph.js +1 -1
  75. package/dist/kernel/graph.js.map +1 -1
  76. package/dist/kernel/i18n.d.ts +10 -1
  77. package/dist/kernel/i18n.d.ts.map +1 -1
  78. package/dist/kernel/i18n.js +34 -1
  79. package/dist/kernel/i18n.js.map +1 -1
  80. package/dist/kernel/layout.d.ts +97 -0
  81. package/dist/kernel/layout.d.ts.map +1 -1
  82. package/dist/kernel/layout.js +294 -12
  83. package/dist/kernel/layout.js.map +1 -1
  84. package/dist/kernel/menu.d.ts +33 -2
  85. package/dist/kernel/menu.d.ts.map +1 -1
  86. package/dist/kernel/menu.js +99 -7
  87. package/dist/kernel/menu.js.map +1 -1
  88. package/dist/kernel/modules.d.ts +3 -3
  89. package/dist/kernel/modules.d.ts.map +1 -1
  90. package/dist/kernel/modules.js +21 -21
  91. package/dist/kernel/modules.js.map +1 -1
  92. package/dist/kernel/permissions.d.ts +10 -0
  93. package/dist/kernel/permissions.d.ts.map +1 -0
  94. package/dist/kernel/permissions.js +365 -0
  95. package/dist/kernel/permissions.js.map +1 -0
  96. package/dist/kernel/schedule.d.ts +23 -0
  97. package/dist/kernel/schedule.d.ts.map +1 -0
  98. package/dist/kernel/schedule.js +83 -0
  99. package/dist/kernel/schedule.js.map +1 -0
  100. package/dist/kernel/types.d.ts.map +1 -1
  101. package/dist/kernel/types.js +5 -4
  102. package/dist/kernel/types.js.map +1 -1
  103. package/dist/kernel/workspace.d.ts +92 -14
  104. package/dist/kernel/workspace.d.ts.map +1 -1
  105. package/dist/kernel/workspace.js +128 -49
  106. package/dist/kernel/workspace.js.map +1 -1
  107. package/dist/pdf/assets/Inter-Bold.ttf +0 -0
  108. package/dist/pdf/assets/Inter-Regular.ttf +0 -0
  109. package/dist/pdf/assets/Inter-SemiBold.ttf +0 -0
  110. package/dist/pdf/assets/LICENSE.txt +92 -0
  111. package/dist/pdf/font.d.ts +10 -0
  112. package/dist/pdf/font.d.ts.map +1 -0
  113. package/dist/pdf/font.js +83 -0
  114. package/dist/pdf/font.js.map +1 -0
  115. package/dist/pdf/image.d.ts +8 -0
  116. package/dist/pdf/image.d.ts.map +1 -0
  117. package/dist/pdf/image.js +94 -0
  118. package/dist/pdf/image.js.map +1 -0
  119. package/dist/pdf/index.d.ts +15 -0
  120. package/dist/pdf/index.d.ts.map +1 -0
  121. package/dist/pdf/index.js +17 -0
  122. package/dist/pdf/index.js.map +1 -0
  123. package/dist/pdf/markup.d.ts +19 -0
  124. package/dist/pdf/markup.d.ts.map +1 -0
  125. package/dist/pdf/markup.js +146 -0
  126. package/dist/pdf/markup.js.map +1 -0
  127. package/dist/pdf/render.d.ts +14 -0
  128. package/dist/pdf/render.d.ts.map +1 -0
  129. package/dist/pdf/render.js +387 -0
  130. package/dist/pdf/render.js.map +1 -0
  131. package/dist/scaffold/index.js +6 -6
  132. package/dist/scaffold/index.js.map +1 -1
  133. package/dist/scaffold/templates/{app.test.ts.tmpl → deployment.test.ts.tmpl} +3 -3
  134. package/dist/scaffold/templates/ket.workspace.ts.tmpl +4 -6
  135. package/dist/scaffold/templates/module.ts.tmpl +1 -4
  136. package/dist/server/assets.d.ts +23 -0
  137. package/dist/server/assets.d.ts.map +1 -0
  138. package/dist/server/assets.js +97 -0
  139. package/dist/server/assets.js.map +1 -0
  140. package/dist/server/boot.d.ts +174 -38
  141. package/dist/server/boot.d.ts.map +1 -1
  142. package/dist/server/boot.js +399 -140
  143. package/dist/server/boot.js.map +1 -1
  144. package/dist/server/config.d.ts +30 -10
  145. package/dist/server/config.d.ts.map +1 -1
  146. package/dist/server/config.js +73 -17
  147. package/dist/server/config.js.map +1 -1
  148. package/dist/server/ctx.d.ts +10 -0
  149. package/dist/server/ctx.d.ts.map +1 -1
  150. package/dist/server/ctx.js +284 -48
  151. package/dist/server/ctx.js.map +1 -1
  152. package/dist/server/development.d.ts +10 -0
  153. package/dist/server/development.d.ts.map +1 -0
  154. package/dist/server/development.js +15 -0
  155. package/dist/server/development.js.map +1 -0
  156. package/dist/server/fn.d.ts +22 -3
  157. package/dist/server/fn.d.ts.map +1 -1
  158. package/dist/server/fn.js +116 -32
  159. package/dist/server/fn.js.map +1 -1
  160. package/dist/server/form.d.ts +33 -0
  161. package/dist/server/form.d.ts.map +1 -0
  162. package/dist/server/form.js +47 -0
  163. package/dist/server/form.js.map +1 -0
  164. package/dist/server/http.d.ts +82 -3
  165. package/dist/server/http.d.ts.map +1 -1
  166. package/dist/server/http.js +373 -37
  167. package/dist/server/http.js.map +1 -1
  168. package/dist/server/idem.d.ts +3 -2
  169. package/dist/server/idem.d.ts.map +1 -1
  170. package/dist/server/idem.js +12 -4
  171. package/dist/server/idem.js.map +1 -1
  172. package/dist/server/jobs.js +1 -1
  173. package/dist/server/jobs.js.map +1 -1
  174. package/dist/server/log/combinators.d.ts +42 -0
  175. package/dist/server/log/combinators.d.ts.map +1 -0
  176. package/dist/server/log/combinators.js +270 -0
  177. package/dist/server/log/combinators.js.map +1 -0
  178. package/dist/server/log/console.d.ts +12 -0
  179. package/dist/server/log/console.d.ts.map +1 -0
  180. package/dist/server/log/console.js +96 -0
  181. package/dist/server/log/console.js.map +1 -0
  182. package/dist/server/log/file.d.ts +11 -0
  183. package/dist/server/log/file.d.ts.map +1 -0
  184. package/dist/server/log/file.js +61 -0
  185. package/dist/server/log/file.js.map +1 -0
  186. package/dist/server/log/index.d.ts +23 -0
  187. package/dist/server/log/index.d.ts.map +1 -0
  188. package/dist/server/log/index.js +45 -0
  189. package/dist/server/log/index.js.map +1 -0
  190. package/dist/server/log/logger.d.ts +53 -0
  191. package/dist/server/log/logger.d.ts.map +1 -0
  192. package/dist/server/log/logger.js +94 -0
  193. package/dist/server/log/logger.js.map +1 -0
  194. package/dist/server/log/memory.d.ts +11 -0
  195. package/dist/server/log/memory.d.ts.map +1 -0
  196. package/dist/server/log/memory.js +25 -0
  197. package/dist/server/log/memory.js.map +1 -0
  198. package/dist/server/log/types.d.ts +112 -0
  199. package/dist/server/log/types.d.ts.map +1 -0
  200. package/dist/server/log/types.js +58 -0
  201. package/dist/server/log/types.js.map +1 -0
  202. package/dist/server/policy.d.ts +29 -0
  203. package/dist/server/policy.d.ts.map +1 -0
  204. package/dist/server/policy.js +29 -0
  205. package/dist/server/policy.js.map +1 -0
  206. package/dist/server/queue.d.ts +1 -1
  207. package/dist/server/queue.d.ts.map +1 -1
  208. package/dist/server/queue.js.map +1 -1
  209. package/dist/server/ratelimit.d.ts +48 -0
  210. package/dist/server/ratelimit.d.ts.map +1 -0
  211. package/dist/server/ratelimit.js +102 -0
  212. package/dist/server/ratelimit.js.map +1 -0
  213. package/dist/server/respond.d.ts.map +1 -1
  214. package/dist/server/respond.js +16 -1
  215. package/dist/server/respond.js.map +1 -1
  216. package/dist/server/runtime.d.ts +18 -3
  217. package/dist/server/runtime.d.ts.map +1 -1
  218. package/dist/server/runtime.js +32 -2
  219. package/dist/server/runtime.js.map +1 -1
  220. package/dist/server/schedule.d.ts +18 -0
  221. package/dist/server/schedule.d.ts.map +1 -0
  222. package/dist/server/schedule.js +70 -0
  223. package/dist/server/schedule.js.map +1 -0
  224. package/dist/server/sequence.d.ts +42 -0
  225. package/dist/server/sequence.d.ts.map +1 -0
  226. package/dist/server/sequence.js +97 -0
  227. package/dist/server/sequence.js.map +1 -0
  228. package/dist/server/session.d.ts +21 -0
  229. package/dist/server/session.d.ts.map +1 -1
  230. package/dist/server/session.js +84 -10
  231. package/dist/server/session.js.map +1 -1
  232. package/dist/server/sessionstore.d.ts +3 -1
  233. package/dist/server/sessionstore.d.ts.map +1 -1
  234. package/dist/server/sessionstore.js +7 -3
  235. package/dist/server/sessionstore.js.map +1 -1
  236. package/dist/server/storage/index.d.ts +1 -1
  237. package/dist/server/storage/index.d.ts.map +1 -1
  238. package/dist/server/storage/index.js +61 -1
  239. package/dist/server/storage/index.js.map +1 -1
  240. package/dist/server/storage/types.d.ts +8 -0
  241. package/dist/server/storage/types.d.ts.map +1 -1
  242. package/dist/server/storage/types.js +58 -0
  243. package/dist/server/storage/types.js.map +1 -1
  244. package/dist/server/stream.d.ts +8 -2
  245. package/dist/server/stream.d.ts.map +1 -1
  246. package/dist/server/stream.js +44 -4
  247. package/dist/server/stream.js.map +1 -1
  248. package/dist/server/streamstore.d.ts +10 -0
  249. package/dist/server/streamstore.d.ts.map +1 -1
  250. package/dist/server/streamstore.js +72 -6
  251. package/dist/server/streamstore.js.map +1 -1
  252. package/dist/server/tenants.d.ts +20 -18
  253. package/dist/server/tenants.d.ts.map +1 -1
  254. package/dist/server/tenants.js +133 -84
  255. package/dist/server/tenants.js.map +1 -1
  256. package/dist/server/transport/types.js +2 -2
  257. package/dist/server/transport/types.js.map +1 -1
  258. package/dist/server/worker.d.ts +19 -3
  259. package/dist/server/worker.d.ts.map +1 -1
  260. package/dist/server/worker.js +168 -21
  261. package/dist/server/worker.js.map +1 -1
  262. package/dist/testing.d.ts +26 -10
  263. package/dist/testing.d.ts.map +1 -1
  264. package/dist/testing.js +41 -14
  265. package/dist/testing.js.map +1 -1
  266. package/dist/theme/contracts.d.ts +14 -1
  267. package/dist/theme/contracts.d.ts.map +1 -1
  268. package/dist/theme/contracts.js +35 -6
  269. package/dist/theme/contracts.js.map +1 -1
  270. package/dist/theme/index.d.ts +1 -1
  271. package/dist/theme/index.d.ts.map +1 -1
  272. package/dist/theme/index.js +1 -1
  273. package/dist/theme/index.js.map +1 -1
  274. package/dist/theme/joint-runtime.d.ts +33 -0
  275. package/dist/theme/joint-runtime.d.ts.map +1 -0
  276. package/dist/theme/joint-runtime.js +121 -0
  277. package/dist/theme/joint-runtime.js.map +1 -0
  278. package/dist/theme/joints.d.ts.map +1 -1
  279. package/dist/theme/joints.js +15 -97
  280. package/dist/theme/joints.js.map +1 -1
  281. package/dist/theme/ktl/compile.d.ts +4 -0
  282. package/dist/theme/ktl/compile.d.ts.map +1 -1
  283. package/dist/theme/ktl/compile.js +54 -1
  284. package/dist/theme/ktl/compile.js.map +1 -1
  285. package/dist/theme/ktl/parser.d.ts +4 -0
  286. package/dist/theme/ktl/parser.d.ts.map +1 -1
  287. package/dist/theme/ktl/parser.js +8 -0
  288. package/dist/theme/ktl/parser.js.map +1 -1
  289. package/dist/theme/render.d.ts +8 -0
  290. package/dist/theme/render.d.ts.map +1 -1
  291. package/dist/theme/render.js +88 -118
  292. package/dist/theme/render.js.map +1 -1
  293. package/dist/theme/tokens.d.ts +18 -0
  294. package/dist/theme/tokens.d.ts.map +1 -1
  295. package/dist/theme/tokens.js +33 -0
  296. package/dist/theme/tokens.js.map +1 -1
  297. package/dist/theme/viewmodel.d.ts +24 -0
  298. package/dist/theme/viewmodel.d.ts.map +1 -1
  299. package/dist/theme/viewmodel.js +75 -6
  300. package/dist/theme/viewmodel.js.map +1 -1
  301. package/dist/types.d.ts +320 -56
  302. package/dist/types.d.ts.map +1 -1
  303. package/package.json +6 -2
  304. package/dist/kernel/apps.d.ts +0 -43
  305. package/dist/kernel/apps.d.ts.map +0 -1
  306. package/dist/kernel/apps.js +0 -234
  307. package/dist/kernel/apps.js.map +0 -1
@@ -1,7 +1,9 @@
1
1
  // SQLite adapter on node:sqlite. Zero dependencies - this ships inside Node.
2
2
  import { DatabaseSync } from 'node:sqlite';
3
+ import { AsyncLocalStorage } from 'node:async_hooks';
3
4
  import { assertAdapter } from './adapter.js';
4
5
  import { dateBucket } from './time.js';
6
+ import { canonicalDecimal, DECIMAL_MAX_CHARS, decimalText } from './changeset.js';
5
7
  // Binding rules belong to the adapter, not to the layers above it: SQLite has no
6
8
  // boolean and no JSON, Postgres has both. Normalising here means every call path —
7
9
  // query builder, changeset, raw run — is covered once.
@@ -26,80 +28,376 @@ const SQL = {
26
28
  datetime: 'TEXT',
27
29
  ref: 'TEXT',
28
30
  };
31
+ const PLAIN_DECIMAL = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/;
32
+ /**
33
+ * Exact scientific parts without ever passing through a binary float.
34
+ *
35
+ * `exponent` is the number of integer digits in the normalized value and
36
+ * `digits` has neither leading nor trailing zeroes. Together they let SQLite
37
+ * compare arbitrarily large or finely scaled decimal text exactly while the
38
+ * selected column itself remains TEXT and therefore decodes byte for byte.
39
+ */
40
+ const decimalParts = (value) => {
41
+ if (value == null)
42
+ return null;
43
+ if (typeof value !== 'string' && typeof value !== 'number')
44
+ return null;
45
+ let held = typeof value === 'number' ? decimalText(value) : String(value).trim();
46
+ if (held.length > DECIMAL_MAX_CHARS)
47
+ return null;
48
+ if (!PLAIN_DECIMAL.test(held))
49
+ return null;
50
+ const negative = held.startsWith('-');
51
+ held = held.replace(/^[+-]/, '');
52
+ const [rawWhole = '', fraction = ''] = held.split('.');
53
+ const whole = rawWhole || '0';
54
+ const combined = whole + fraction;
55
+ const first = combined.search(/[1-9]/);
56
+ if (first < 0)
57
+ return { sign: 0, exponent: 0, digits: '' };
58
+ let last = combined.length - 1;
59
+ while (combined[last] === '0')
60
+ last--;
61
+ return {
62
+ sign: negative ? -1 : 1,
63
+ exponent: whole.length - first,
64
+ digits: combined.slice(first, last + 1),
65
+ };
66
+ };
67
+ const compareDecimals = (left, right) => {
68
+ const a = decimalParts(left);
69
+ const b = decimalParts(right);
70
+ if (!a || !b)
71
+ return null;
72
+ if (a.sign !== b.sign)
73
+ return a.sign < b.sign ? -1 : 1;
74
+ if (a.sign === 0)
75
+ return 0;
76
+ let magnitude = 0;
77
+ if (a.exponent !== b.exponent)
78
+ magnitude = a.exponent < b.exponent ? -1 : 1;
79
+ else if (a.digits !== b.digits)
80
+ magnitude = a.digits < b.digits ? -1 : 1;
81
+ return a.sign === -1 ? -magnitude : magnitude;
82
+ };
83
+ /** One canonical spelling for SQL equality/grouping without losing precision. */
84
+ const decimalKey = canonicalDecimal;
85
+ const scaledDecimal = (value) => {
86
+ const parts = decimalParts(value);
87
+ if (!parts)
88
+ return null;
89
+ if (parts.sign === 0)
90
+ return { coefficient: 0n, scale: 0 };
91
+ const coefficient = BigInt(parts.digits) * BigInt(parts.sign);
92
+ return { coefficient, scale: parts.digits.length - parts.exponent };
93
+ };
94
+ const renderScaledDecimal = ({ coefficient, scale }) => {
95
+ if (coefficient === 0n)
96
+ return '0';
97
+ while (coefficient % 10n === 0n) {
98
+ coefficient /= 10n;
99
+ scale--;
100
+ }
101
+ const sign = coefficient < 0n ? '-' : '';
102
+ const digits = (coefficient < 0n ? -coefficient : coefficient).toString();
103
+ const exponent = digits.length - scale;
104
+ if (exponent <= 0)
105
+ return `${sign}0.${'0'.repeat(-exponent)}${digits}`;
106
+ if (exponent >= digits.length)
107
+ return `${sign}${digits}${'0'.repeat(exponent - digits.length)}`;
108
+ return `${sign}${digits.slice(0, exponent)}.${digits.slice(exponent)}`;
109
+ };
110
+ const addDecimals = (left, right) => {
111
+ const a = scaledDecimal(left);
112
+ const b = scaledDecimal(right);
113
+ if (!a || !b)
114
+ return null;
115
+ const scale = Math.max(a.scale, b.scale);
116
+ const coefficient = a.coefficient * 10n ** BigInt(scale - a.scale) + b.coefficient * 10n ** BigInt(scale - b.scale);
117
+ return renderScaledDecimal({ coefficient, scale });
118
+ };
119
+ /** Exact division with PostgreSQL NUMERIC's tie-breaking rule. */
120
+ const averageDecimal = (held, count, requestedScale) => {
121
+ const divisor = count;
122
+ const scale = Number(requestedScale);
123
+ if (!Number.isSafeInteger(scale) || scale < 0 || scale > DECIMAL_MAX_CHARS)
124
+ throw new Error(`decimal average scale must be an integer from 0 to ${DECIMAL_MAX_CHARS}`);
125
+ if (divisor === 0n)
126
+ return null;
127
+ if (divisor < 0n)
128
+ throw new Error('decimal average count must not be negative');
129
+ let numerator = held.coefficient;
130
+ let denominator = divisor;
131
+ const shift = scale - held.scale;
132
+ if (shift >= 0)
133
+ numerator *= 10n ** BigInt(shift);
134
+ else
135
+ denominator *= 10n ** BigInt(-shift);
136
+ let rounded = numerator / denominator;
137
+ const remainder = numerator % denominator;
138
+ const magnitude = remainder < 0n ? -remainder : remainder;
139
+ if (magnitude * 2n >= denominator)
140
+ rounded += numerator < 0n ? -1n : 1n;
141
+ const result = renderScaledDecimal({ coefficient: rounded, scale });
142
+ if (result.length > DECIMAL_MAX_CHARS)
143
+ throw new Error('decimal average exceeds the decimal character limit');
144
+ return result;
145
+ };
146
+ const decodeDecimalAverageState = (value) => {
147
+ const held = String(value ?? '');
148
+ if (!held)
149
+ return { coefficient: 0n, sumScale: 0, count: 0n, requestedScale: null };
150
+ const first = held.indexOf('|');
151
+ const second = held.indexOf('|', first + 1);
152
+ const third = held.indexOf('|', second + 1);
153
+ if (first < 0 || second < 0 || third < 0)
154
+ throw new Error('invalid decimal average state');
155
+ return {
156
+ requestedScale: Number(held.slice(0, first)),
157
+ count: BigInt(held.slice(first + 1, second)),
158
+ sumScale: Number(held.slice(second + 1, third)),
159
+ coefficient: BigInt(held.slice(third + 1)),
160
+ };
161
+ };
162
+ const encodeDecimalAverageState = (state) => `${String(state.requestedScale)}|${state.count}|${state.sumScale}|${state.coefficient}`;
29
163
  export function sqliteAdapter(path = ':memory:') {
30
164
  let db = null;
31
- let inTransaction = false;
165
+ // node:sqlite has one synchronous connection. Promise-shaped adapter methods can
166
+ // still interleave while a transaction body awaits, so every root operation joins
167
+ // this queue. The adapter handed to tx() bypasses it on purpose: those calls are
168
+ // already inside the queue slot owned by that transaction.
169
+ let operationTail = Promise.resolve();
170
+ const transactionContext = new AsyncLocalStorage();
32
171
  const need = () => {
33
172
  if (!db)
34
173
  throw new Error('adapter is not open()');
35
174
  return db;
36
175
  };
176
+ const serialize = (work) => {
177
+ // Calling the root adapter from its own transaction callback would otherwise
178
+ // enqueue work behind the callback that is currently awaiting it. Refuse the
179
+ // misuse immediately and point callers at the scoped adapter/ctx passed to the
180
+ // callback; outside work still queues normally behind the transaction.
181
+ if (transactionContext.getStore()?.active)
182
+ return Promise.reject(new Error('root SQLite adapter used inside its transaction; use the transaction-scoped adapter'));
183
+ const result = operationTail.then(work);
184
+ operationTail = result.then(() => undefined, () => undefined);
185
+ return result;
186
+ };
187
+ const quoteIdent = (name) => `"${String(name).replace(/"/g, '""')}"`;
188
+ const columnSql = (column) => SQL[column.base] ?? 'TEXT';
189
+ const execDirect = (sql) => need().exec(sql);
190
+ const allDirect = (sql, params = []) => need()
191
+ .prepare(sql)
192
+ .all(...params.map(bind));
193
+ const runDirect = (sql, params = []) => {
194
+ const result = need()
195
+ .prepare(sql)
196
+ .run(...params.map(bind));
197
+ return { changes: Number(result.changes) };
198
+ };
199
+ const introspectDirect = () => {
200
+ const tables = {};
201
+ const names = need()
202
+ .prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'`)
203
+ .all();
204
+ for (const table of names) {
205
+ tables[table.name] = {};
206
+ const columns = need()
207
+ .prepare(`PRAGMA table_info(${quoteIdent(table.name)})`)
208
+ .all();
209
+ for (const column of columns)
210
+ tables[table.name][column.name] = column.type;
211
+ }
212
+ return tables;
213
+ };
214
+ const scopedTransactionAdapter = () => {
215
+ let active = true;
216
+ const within = (work) => {
217
+ if (!active)
218
+ throw new Error('transaction-scoped adapter used after its transaction ended');
219
+ return work();
220
+ };
221
+ return {
222
+ adapter: {
223
+ name: 'sqlite',
224
+ transaction: true,
225
+ async open() {
226
+ throw new Error('a transaction-scoped adapter is already open');
227
+ },
228
+ async close() {
229
+ throw new Error('a transaction-scoped adapter cannot close its root connection');
230
+ },
231
+ async exec(sql) {
232
+ within(() => execDirect(sql));
233
+ },
234
+ async all(sql, params = []) {
235
+ return within(() => allDirect(sql, params));
236
+ },
237
+ async run(sql, params = []) {
238
+ return within(() => runDirect(sql, params));
239
+ },
240
+ async tx() {
241
+ throw new Error('nested transactions are not supported');
242
+ },
243
+ quoteIdent,
244
+ columnSql,
245
+ async introspect() {
246
+ return within(introspectDirect);
247
+ },
248
+ },
249
+ deactivate: () => {
250
+ active = false;
251
+ },
252
+ };
253
+ };
37
254
  const a = {
38
255
  name: 'sqlite',
39
- get transaction() {
40
- return inTransaction;
41
- },
42
256
  async open() {
43
- db = new DatabaseSync(path);
44
- db.function('ket_date_bucket', (value, interval, timezone) => dateBucket(value, String(interval), String(timezone)));
45
- db.exec('PRAGMA journal_mode = WAL');
46
- db.exec('PRAGMA foreign_keys = ON');
257
+ await serialize(() => {
258
+ db = new DatabaseSync(path);
259
+ db.function('ket_date_bucket', (value, interval, timezone) => dateBucket(value, String(interval), String(timezone)));
260
+ db.function('ket_decimal_cmp', compareDecimals);
261
+ db.function('ket_decimal_key', decimalKey);
262
+ db.function('ket_decimal_sign', (value) => decimalParts(value)?.sign ?? null);
263
+ db.function('ket_decimal_exponent', (value) => decimalParts(value)?.exponent ?? null);
264
+ db.function('ket_decimal_digits', (value) => decimalParts(value)?.digits ?? null);
265
+ db.aggregate('ket_decimal_avg', {
266
+ start: '',
267
+ step: (encoded, value, scale) => {
268
+ const state = decodeDecimalAverageState(encoded);
269
+ const requestedScale = Number(scale);
270
+ if (state.requestedScale !== null && state.requestedScale !== requestedScale)
271
+ throw new Error('decimal average scale changed within one aggregate');
272
+ if (value == null)
273
+ return encodeDecimalAverageState({ ...state, requestedScale });
274
+ const next = scaledDecimal(value);
275
+ if (!next)
276
+ throw new Error('invalid or over-budget decimal value');
277
+ if (state.count === 0n)
278
+ return encodeDecimalAverageState({
279
+ coefficient: next.coefficient,
280
+ sumScale: next.scale,
281
+ count: 1n,
282
+ requestedScale,
283
+ });
284
+ const sumScale = Math.max(state.sumScale, next.scale);
285
+ const coefficient = state.coefficient * 10n ** BigInt(sumScale - state.sumScale) +
286
+ next.coefficient * 10n ** BigInt(sumScale - next.scale);
287
+ return encodeDecimalAverageState({
288
+ coefficient,
289
+ sumScale,
290
+ count: state.count + 1n,
291
+ requestedScale,
292
+ });
293
+ },
294
+ result: (encoded) => {
295
+ const state = decodeDecimalAverageState(encoded);
296
+ return state.count === 0n || state.requestedScale === null
297
+ ? null
298
+ : averageDecimal({ coefficient: state.coefficient, scale: state.sumScale }, state.count, state.requestedScale);
299
+ },
300
+ });
301
+ db.aggregate('ket_decimal_sum', {
302
+ start: '',
303
+ step: (sum, value) => {
304
+ if (value == null)
305
+ return String(sum);
306
+ const next = decimalKey(value);
307
+ if (next == null)
308
+ throw new Error('invalid or over-budget decimal value');
309
+ if (sum === '')
310
+ return next;
311
+ const added = addDecimals(sum, next);
312
+ if (added == null)
313
+ throw new Error('invalid decimal aggregate state');
314
+ return added;
315
+ },
316
+ result: (sum) => (sum === '' ? null : String(sum)),
317
+ });
318
+ db.aggregate('ket_decimal_min', {
319
+ start: '',
320
+ step: (minimum, value) => {
321
+ if (value == null)
322
+ return String(minimum);
323
+ const next = decimalKey(value);
324
+ if (next == null)
325
+ throw new Error('invalid or over-budget decimal value');
326
+ if (minimum === '')
327
+ return next;
328
+ return (compareDecimals(next, minimum) ?? 0) < 0 ? next : String(minimum);
329
+ },
330
+ result: (minimum) => (minimum === '' ? null : String(minimum)),
331
+ });
332
+ db.aggregate('ket_decimal_max', {
333
+ start: '',
334
+ step: (maximum, value) => {
335
+ if (value == null)
336
+ return String(maximum);
337
+ const next = decimalKey(value);
338
+ if (next == null)
339
+ throw new Error('invalid or over-budget decimal value');
340
+ if (maximum === '')
341
+ return next;
342
+ return (compareDecimals(next, maximum) ?? 0) > 0 ? next : String(maximum);
343
+ },
344
+ result: (maximum) => (maximum === '' ? null : String(maximum)),
345
+ });
346
+ db.exec('PRAGMA journal_mode = WAL');
347
+ db.exec('PRAGMA foreign_keys = ON');
348
+ });
47
349
  },
48
350
  async close() {
49
- db?.close();
50
- db = null;
351
+ await serialize(() => {
352
+ db?.close();
353
+ db = null;
354
+ });
51
355
  },
52
356
  async exec(sql) {
53
- need().exec(sql);
357
+ await serialize(() => execDirect(sql));
54
358
  },
55
359
  async all(sql, params = []) {
56
- return need()
57
- .prepare(sql)
58
- .all(...params.map(bind));
360
+ return serialize(() => allDirect(sql, params));
59
361
  },
60
362
  async run(sql, params = []) {
61
- const r = need()
62
- .prepare(sql)
63
- .run(...params.map(bind));
64
- return { changes: Number(r.changes) };
363
+ return serialize(() => runDirect(sql, params));
65
364
  },
66
365
  async tx(fn) {
67
- const d = need();
68
- d.exec('BEGIN');
69
- inTransaction = true;
70
- try {
71
- const r = await fn(a);
72
- d.exec('COMMIT');
73
- return r;
74
- }
75
- catch (e) {
76
- d.exec('ROLLBACK');
77
- throw e;
78
- }
79
- finally {
80
- inTransaction = false;
81
- }
82
- },
83
- quoteIdent(n) {
84
- return `"${String(n).replace(/"/g, '""')}"`;
85
- },
86
- columnSql(c) {
87
- return SQL[c.base] ?? 'TEXT';
366
+ return serialize(async () => {
367
+ const connection = need();
368
+ let began = false;
369
+ let deactivate = () => { };
370
+ const marker = { active: true };
371
+ try {
372
+ connection.exec('BEGIN');
373
+ began = true;
374
+ const scoped = scopedTransactionAdapter();
375
+ deactivate = scoped.deactivate;
376
+ const result = await transactionContext.run(marker, () => fn(scoped.adapter));
377
+ connection.exec('COMMIT');
378
+ return result;
379
+ }
380
+ catch (error) {
381
+ if (began) {
382
+ try {
383
+ connection.exec('ROLLBACK');
384
+ }
385
+ catch {
386
+ // Preserve the failure from the body or COMMIT; it is the actionable one.
387
+ }
388
+ }
389
+ throw error;
390
+ }
391
+ finally {
392
+ marker.active = false;
393
+ deactivate();
394
+ }
395
+ });
88
396
  },
397
+ quoteIdent,
398
+ columnSql,
89
399
  async introspect() {
90
- const tables = {};
91
- const names = need()
92
- .prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'`)
93
- .all();
94
- for (const t of names) {
95
- tables[t.name] = {};
96
- const cols = need()
97
- .prepare(`PRAGMA table_info(${a.quoteIdent(t.name)})`)
98
- .all();
99
- for (const c of cols)
100
- tables[t.name][c.name] = c.type;
101
- }
102
- return tables;
400
+ return serialize(introspectDirect);
103
401
  },
104
402
  };
105
403
  return assertAdapter(a);
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/data/sqlite.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/data/sqlite.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,17 @@
1
1
  export type GroupInterval = 'day' | 'week' | 'month' | 'quarter' | 'year';
2
+ /**
3
+ * The closed set of bucketing intervals.
4
+ *
5
+ * `GroupInterval` is only a compile-time type: a value that arrives as JSON — a
6
+ * `listState.groupBy[].interval` an agent or a form sends — has never been checked
7
+ * against it by the time it reaches the query builder. The Postgres dialect
8
+ * interpolates the interval into `DATE_TRUNC('<interval>', …)` (SQLite binds it),
9
+ * so an unchecked string there is SQL, not data. This is the guard that keeps the
10
+ * type's promise at runtime, at the one boundary where being wrong is an injection.
11
+ */
12
+ export declare const GROUP_INTERVALS: readonly GroupInterval[];
13
+ export declare const isGroupInterval: (value: unknown) => value is GroupInterval;
14
+ export declare const assertGroupInterval: (value: unknown) => GroupInterval;
2
15
  export declare const isTimezone: (value: string) => boolean;
3
16
  export declare const assertTimezone: (value: string) => string;
4
17
  /** Stable local-calendar bucket key shared by SQLite and application tests. */
@@ -1 +1 @@
1
- {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/data/time.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAEzE,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,OAO1C,CAAA;AAED,eAAO,MAAM,cAAc,UAAW,MAAM,KAAG,MAI9C,CAAA;AAqBD,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,SAAQ,GAAG,MAAM,GAAG,IAAI,CAWnG;AAwBD,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,MAAM,CA4B1E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAM/E"}
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/data/time.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAEzE;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAAgD,CAAA;AAEpG,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,KAAK,IAAI,aAC2B,CAAA;AAErF,eAAO,MAAM,mBAAmB,UAAW,OAAO,KAAG,aAQpD,CAAA;AAMD,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,OAS1C,CAAA;AAED,eAAO,MAAM,cAAc,UAAW,MAAM,KAAG,MAI9C,CAAA;AA8CD,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,SAAQ,GAAG,MAAM,GAAG,IAAI,CAWnG;AAeD,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,MAAM,CA4B1E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAM/E"}
package/dist/data/time.js CHANGED
@@ -1,7 +1,35 @@
1
1
  import { KetError } from '../kernel/errors.js';
2
+ import { dateTimeFormatter } from '../kernel/i18n.js';
3
+ /**
4
+ * The closed set of bucketing intervals.
5
+ *
6
+ * `GroupInterval` is only a compile-time type: a value that arrives as JSON — a
7
+ * `listState.groupBy[].interval` an agent or a form sends — has never been checked
8
+ * against it by the time it reaches the query builder. The Postgres dialect
9
+ * interpolates the interval into `DATE_TRUNC('<interval>', …)` (SQLite binds it),
10
+ * so an unchecked string there is SQL, not data. This is the guard that keeps the
11
+ * type's promise at runtime, at the one boundary where being wrong is an injection.
12
+ */
13
+ export const GROUP_INTERVALS = ['day', 'week', 'month', 'quarter', 'year'];
14
+ export const isGroupInterval = (value) => typeof value === 'string' && GROUP_INTERVALS.includes(value);
15
+ export const assertGroupInterval = (value) => {
16
+ if (!isGroupInterval(value))
17
+ throw new KetError({
18
+ code: 'E_GROUP_INTERVAL',
19
+ message: `invalid group interval ${JSON.stringify(value)}`,
20
+ hint: `interval must be one of ${GROUP_INTERVALS.join(', ')}`,
21
+ });
22
+ return value;
23
+ };
24
+ const validTimezones = new Set();
25
+ const datePartFormatters = new Map();
26
+ const localPartFormatters = new Map();
2
27
  export const isTimezone = (value) => {
28
+ if (validTimezones.has(value))
29
+ return true;
3
30
  try {
4
- new Intl.DateTimeFormat('en', { timeZone: value }).format();
31
+ dateTimeFormatter('en', { timeZone: value });
32
+ validTimezones.add(value);
5
33
  return true;
6
34
  }
7
35
  catch {
@@ -13,6 +41,36 @@ export const assertTimezone = (value) => {
13
41
  throw new KetError({ code: 'E_TIMEZONE', message: `invalid IANA timezone "${value}"` });
14
42
  return value;
15
43
  };
44
+ const datePartFormatter = (timezone) => {
45
+ const held = datePartFormatters.get(timezone);
46
+ if (held)
47
+ return held;
48
+ const formatter = dateTimeFormatter('en-CA', {
49
+ timeZone: assertTimezone(timezone),
50
+ year: 'numeric',
51
+ month: '2-digit',
52
+ day: '2-digit',
53
+ });
54
+ datePartFormatters.set(timezone, formatter);
55
+ return formatter;
56
+ };
57
+ const localPartFormatter = (timezone) => {
58
+ const held = localPartFormatters.get(timezone);
59
+ if (held)
60
+ return held;
61
+ const formatter = dateTimeFormatter('en-CA', {
62
+ timeZone: assertTimezone(timezone),
63
+ year: 'numeric',
64
+ month: '2-digit',
65
+ day: '2-digit',
66
+ hour: '2-digit',
67
+ minute: '2-digit',
68
+ second: '2-digit',
69
+ hourCycle: 'h23',
70
+ });
71
+ localPartFormatters.set(timezone, formatter);
72
+ return formatter;
73
+ };
16
74
  const partsIn = (value, timezone) => {
17
75
  if (value == null)
18
76
  return null;
@@ -22,12 +80,7 @@ const partsIn = (value, timezone) => {
22
80
  const date = new Date(String(value));
23
81
  if (Number.isNaN(date.getTime()))
24
82
  return null;
25
- const parts = new Intl.DateTimeFormat('en-CA', {
26
- timeZone: assertTimezone(timezone),
27
- year: 'numeric',
28
- month: '2-digit',
29
- day: '2-digit',
30
- }).formatToParts(date);
83
+ const parts = datePartFormatter(timezone).formatToParts(date);
31
84
  const get = (type) => Number(parts.find((p) => p.type === type)?.value);
32
85
  return { year: get('year'), month: get('month'), day: get('day') };
33
86
  };
@@ -51,16 +104,7 @@ export function dateBucket(value, interval, timezone = 'UTC') {
51
104
  return ymd(at.getUTCFullYear(), at.getUTCMonth() + 1, at.getUTCDate());
52
105
  }
53
106
  const localPartsAt = (instant, timezone) => {
54
- const parts = new Intl.DateTimeFormat('en-CA', {
55
- timeZone: assertTimezone(timezone),
56
- year: 'numeric',
57
- month: '2-digit',
58
- day: '2-digit',
59
- hour: '2-digit',
60
- minute: '2-digit',
61
- second: '2-digit',
62
- hourCycle: 'h23',
63
- }).formatToParts(new Date(instant));
107
+ const parts = localPartFormatter(timezone).formatToParts(new Date(instant));
64
108
  const get = (type) => Number(parts.find((part) => part.type === type)?.value);
65
109
  return {
66
110
  year: get('year'),
@@ -1 +1 @@
1
- {"version":3,"file":"time.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/data/time.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/data/time.ts"],"names":[],"mappings":"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"}