ultimabase 0.0.0-stage → 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 (411) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +4 -2
  3. package/dist/access.d.ts +62 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +258 -0
  6. package/dist/adapter-errors.d.ts +43 -0
  7. package/dist/adapter-errors.d.ts.map +1 -0
  8. package/dist/adapter-errors.js +72 -0
  9. package/dist/adapter-json.d.ts +20 -0
  10. package/dist/adapter-json.d.ts.map +1 -0
  11. package/dist/adapter-json.js +2 -0
  12. package/dist/adapter-migrations.d.ts +90 -0
  13. package/dist/adapter-migrations.d.ts.map +1 -0
  14. package/dist/adapter-migrations.js +1 -0
  15. package/dist/adapter.d.ts +333 -0
  16. package/dist/adapter.d.ts.map +1 -0
  17. package/dist/adapter.js +5 -0
  18. package/dist/aggregate.d.ts +31 -0
  19. package/dist/aggregate.d.ts.map +1 -0
  20. package/dist/aggregate.js +99 -0
  21. package/dist/app-internals.d.ts +10 -0
  22. package/dist/app-internals.d.ts.map +1 -0
  23. package/dist/app-internals.js +12 -0
  24. package/dist/app-options.d.ts +22 -0
  25. package/dist/app-options.d.ts.map +1 -0
  26. package/dist/app-options.js +3 -0
  27. package/dist/cascade.d.ts +47 -0
  28. package/dist/cascade.d.ts.map +1 -0
  29. package/dist/cascade.js +209 -0
  30. package/dist/cli-config.d.ts +6 -0
  31. package/dist/cli-config.d.ts.map +1 -0
  32. package/dist/cli-config.js +45 -0
  33. package/dist/cli-deploy.d.ts +14 -0
  34. package/dist/cli-deploy.d.ts.map +1 -0
  35. package/dist/cli-deploy.js +193 -0
  36. package/dist/cli-main.d.ts +15 -0
  37. package/dist/cli-main.d.ts.map +1 -0
  38. package/dist/cli-main.js +155 -0
  39. package/dist/cli-migrate.d.ts +20 -0
  40. package/dist/cli-migrate.d.ts.map +1 -0
  41. package/dist/cli-migrate.js +105 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +4 -0
  45. package/dist/complete.d.ts +13 -0
  46. package/dist/complete.d.ts.map +1 -0
  47. package/dist/complete.js +60 -0
  48. package/dist/console-logger.d.ts +3 -0
  49. package/dist/console-logger.d.ts.map +1 -0
  50. package/dist/console-logger.js +62 -0
  51. package/dist/create-many.d.ts +7 -0
  52. package/dist/create-many.d.ts.map +1 -0
  53. package/dist/create-many.js +88 -0
  54. package/dist/decimal.d.ts +23 -0
  55. package/dist/decimal.d.ts.map +1 -0
  56. package/dist/decimal.js +50 -0
  57. package/dist/define-app.d.ts +59 -0
  58. package/dist/define-app.d.ts.map +1 -0
  59. package/dist/define-app.js +5 -0
  60. package/dist/define-enum.d.ts +6 -0
  61. package/dist/define-enum.d.ts.map +1 -0
  62. package/dist/define-enum.js +18 -0
  63. package/dist/define-function.d.ts +25 -0
  64. package/dist/define-function.d.ts.map +1 -0
  65. package/dist/define-function.js +111 -0
  66. package/dist/define-model.d.ts +48 -0
  67. package/dist/define-model.d.ts.map +1 -0
  68. package/dist/define-model.js +85 -0
  69. package/dist/definition.d.ts +179 -0
  70. package/dist/definition.d.ts.map +1 -0
  71. package/dist/definition.js +165 -0
  72. package/dist/delete-many.d.ts +13 -0
  73. package/dist/delete-many.d.ts.map +1 -0
  74. package/dist/delete-many.js +58 -0
  75. package/dist/engine.d.ts +16 -0
  76. package/dist/engine.d.ts.map +1 -0
  77. package/dist/engine.js +174 -0
  78. package/dist/errors.d.ts +50 -0
  79. package/dist/errors.d.ts.map +1 -0
  80. package/dist/errors.js +43 -0
  81. package/dist/exact.d.ts +20 -0
  82. package/dist/exact.d.ts.map +1 -0
  83. package/dist/exact.js +1 -0
  84. package/dist/feed.d.ts +6 -0
  85. package/dist/feed.d.ts.map +1 -0
  86. package/dist/feed.js +33 -0
  87. package/dist/field-codec.d.ts +11 -0
  88. package/dist/field-codec.d.ts.map +1 -0
  89. package/dist/field-codec.js +48 -0
  90. package/dist/field-rules.d.ts +57 -0
  91. package/dist/field-rules.d.ts.map +1 -0
  92. package/dist/field-rules.js +1 -0
  93. package/dist/field-type.d.ts +51 -0
  94. package/dist/field-type.d.ts.map +1 -0
  95. package/dist/field-type.js +106 -0
  96. package/dist/fields.d.ts +295 -0
  97. package/dist/fields.d.ts.map +1 -0
  98. package/dist/fields.js +1 -0
  99. package/dist/function.d.ts +126 -0
  100. package/dist/function.d.ts.map +1 -0
  101. package/dist/function.js +1 -0
  102. package/dist/functions.d.ts +18 -0
  103. package/dist/functions.d.ts.map +1 -0
  104. package/dist/functions.js +99 -0
  105. package/dist/group-by.d.ts +10 -0
  106. package/dist/group-by.d.ts.map +1 -0
  107. package/dist/group-by.js +145 -0
  108. package/dist/group-having.d.ts +8 -0
  109. package/dist/group-having.d.ts.map +1 -0
  110. package/dist/group-having.js +97 -0
  111. package/dist/hooks.d.ts +41 -0
  112. package/dist/hooks.d.ts.map +1 -0
  113. package/dist/hooks.js +149 -0
  114. package/dist/hosts.d.ts +3 -0
  115. package/dist/hosts.d.ts.map +1 -0
  116. package/dist/hosts.js +8 -0
  117. package/dist/identify.d.ts +15 -0
  118. package/dist/identify.d.ts.map +1 -0
  119. package/dist/identify.js +71 -0
  120. package/dist/index.d.ts +25 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +12 -0
  123. package/dist/internal.d.ts +28 -0
  124. package/dist/internal.d.ts.map +1 -0
  125. package/dist/internal.js +39 -0
  126. package/dist/lifecycle.d.ts +21 -0
  127. package/dist/lifecycle.d.ts.map +1 -0
  128. package/dist/lifecycle.js +149 -0
  129. package/dist/list-update.d.ts +12 -0
  130. package/dist/list-update.d.ts.map +1 -0
  131. package/dist/list-update.js +52 -0
  132. package/dist/live.d.ts +37 -0
  133. package/dist/live.d.ts.map +1 -0
  134. package/dist/live.js +139 -0
  135. package/dist/manifest.d.ts +11 -0
  136. package/dist/manifest.d.ts.map +1 -0
  137. package/dist/manifest.js +60 -0
  138. package/dist/memory-aggregate.d.ts +7 -0
  139. package/dist/memory-aggregate.d.ts.map +1 -0
  140. package/dist/memory-aggregate.js +107 -0
  141. package/dist/memory-conditions.d.ts +8 -0
  142. package/dist/memory-conditions.d.ts.map +1 -0
  143. package/dist/memory-conditions.js +82 -0
  144. package/dist/memory-draft.d.ts +34 -0
  145. package/dist/memory-draft.d.ts.map +1 -0
  146. package/dist/memory-draft.js +255 -0
  147. package/dist/memory-json.d.ts +6 -0
  148. package/dist/memory-json.d.ts.map +1 -0
  149. package/dist/memory-json.js +86 -0
  150. package/dist/memory-read.d.ts +45 -0
  151. package/dist/memory-read.d.ts.map +1 -0
  152. package/dist/memory-read.js +244 -0
  153. package/dist/memory-search.d.ts +16 -0
  154. package/dist/memory-search.d.ts.map +1 -0
  155. package/dist/memory-search.js +110 -0
  156. package/dist/memory-values.d.ts +23 -0
  157. package/dist/memory-values.d.ts.map +1 -0
  158. package/dist/memory-values.js +82 -0
  159. package/dist/memory.d.ts +4 -0
  160. package/dist/memory.d.ts.map +1 -0
  161. package/dist/memory.js +157 -0
  162. package/dist/migrate.d.ts +22 -0
  163. package/dist/migrate.d.ts.map +1 -0
  164. package/dist/migrate.js +131 -0
  165. package/dist/model.d.ts +239 -0
  166. package/dist/model.d.ts.map +1 -0
  167. package/dist/model.js +1 -0
  168. package/dist/nested-write.d.ts +64 -0
  169. package/dist/nested-write.d.ts.map +1 -0
  170. package/dist/nested-write.js +274 -0
  171. package/dist/number-update.d.ts +18 -0
  172. package/dist/number-update.d.ts.map +1 -0
  173. package/dist/number-update.js +96 -0
  174. package/dist/plugin-app.d.ts +48 -0
  175. package/dist/plugin-app.d.ts.map +1 -0
  176. package/dist/plugin-app.js +230 -0
  177. package/dist/plugin-code.d.ts +17 -0
  178. package/dist/plugin-code.d.ts.map +1 -0
  179. package/dist/plugin-code.js +125 -0
  180. package/dist/plugin-use.d.ts +22 -0
  181. package/dist/plugin-use.d.ts.map +1 -0
  182. package/dist/plugin-use.js +161 -0
  183. package/dist/plugin.d.ts +357 -0
  184. package/dist/plugin.d.ts.map +1 -0
  185. package/dist/plugin.js +17 -0
  186. package/dist/query-aggregate.d.ts +82 -0
  187. package/dist/query-aggregate.d.ts.map +1 -0
  188. package/dist/query-aggregate.js +1 -0
  189. package/dist/query-args.d.ts +41 -0
  190. package/dist/query-args.d.ts.map +1 -0
  191. package/dist/query-args.js +263 -0
  192. package/dist/query-bulk.d.ts +35 -0
  193. package/dist/query-bulk.d.ts.map +1 -0
  194. package/dist/query-bulk.js +1 -0
  195. package/dist/query-conditions.d.ts +9 -0
  196. package/dist/query-conditions.d.ts.map +1 -0
  197. package/dist/query-conditions.js +46 -0
  198. package/dist/query-context.d.ts +32 -0
  199. package/dist/query-context.d.ts.map +1 -0
  200. package/dist/query-context.js +55 -0
  201. package/dist/query-filter.d.ts +46 -0
  202. package/dist/query-filter.d.ts.map +1 -0
  203. package/dist/query-filter.js +1 -0
  204. package/dist/query-group.d.ts +82 -0
  205. package/dist/query-group.d.ts.map +1 -0
  206. package/dist/query-group.js +1 -0
  207. package/dist/query-json.d.ts +9 -0
  208. package/dist/query-json.d.ts.map +1 -0
  209. package/dist/query-json.js +66 -0
  210. package/dist/query-order.d.ts +15 -0
  211. package/dist/query-order.d.ts.map +1 -0
  212. package/dist/query-order.js +115 -0
  213. package/dist/query-project.d.ts +15 -0
  214. package/dist/query-project.d.ts.map +1 -0
  215. package/dist/query-project.js +45 -0
  216. package/dist/query-search.d.ts +24 -0
  217. package/dist/query-search.d.ts.map +1 -0
  218. package/dist/query-search.js +2 -0
  219. package/dist/query-values.d.ts +28 -0
  220. package/dist/query-values.d.ts.map +1 -0
  221. package/dist/query-values.js +91 -0
  222. package/dist/query-where.d.ts +46 -0
  223. package/dist/query-where.d.ts.map +1 -0
  224. package/dist/query-where.js +200 -0
  225. package/dist/query-write.d.ts +14 -0
  226. package/dist/query-write.d.ts.map +1 -0
  227. package/dist/query-write.js +260 -0
  228. package/dist/query.d.ts +254 -0
  229. package/dist/query.d.ts.map +1 -0
  230. package/dist/query.js +1 -0
  231. package/dist/record.d.ts +257 -0
  232. package/dist/record.d.ts.map +1 -0
  233. package/dist/record.js +1 -0
  234. package/dist/recorder.d.ts +32 -0
  235. package/dist/recorder.d.ts.map +1 -0
  236. package/dist/recorder.js +152 -0
  237. package/dist/relation-write.d.ts +41 -0
  238. package/dist/relation-write.d.ts.map +1 -0
  239. package/dist/relation-write.js +112 -0
  240. package/dist/relations.d.ts +42 -0
  241. package/dist/relations.d.ts.map +1 -0
  242. package/dist/relations.js +119 -0
  243. package/dist/rules.d.ts +97 -0
  244. package/dist/rules.d.ts.map +1 -0
  245. package/dist/rules.js +71 -0
  246. package/dist/running.d.ts +29 -0
  247. package/dist/running.d.ts.map +1 -0
  248. package/dist/running.js +39 -0
  249. package/dist/schema-indexes.d.ts +11 -0
  250. package/dist/schema-indexes.d.ts.map +1 -0
  251. package/dist/schema-indexes.js +59 -0
  252. package/dist/schema-virtuals.d.ts +19 -0
  253. package/dist/schema-virtuals.d.ts.map +1 -0
  254. package/dist/schema-virtuals.js +100 -0
  255. package/dist/schema.d.ts +35 -0
  256. package/dist/schema.d.ts.map +1 -0
  257. package/dist/schema.js +267 -0
  258. package/dist/scope.d.ts +46 -0
  259. package/dist/scope.d.ts.map +1 -0
  260. package/dist/scope.js +82 -0
  261. package/dist/scratch.d.ts +14 -0
  262. package/dist/scratch.d.ts.map +1 -0
  263. package/dist/scratch.js +10 -0
  264. package/dist/serve.d.ts +2 -0
  265. package/dist/serve.d.ts.map +1 -0
  266. package/dist/serve.js +4 -0
  267. package/dist/symbols.d.ts +10 -0
  268. package/dist/symbols.d.ts.map +1 -0
  269. package/dist/symbols.js +1 -0
  270. package/dist/transaction.d.ts +28 -0
  271. package/dist/transaction.d.ts.map +1 -0
  272. package/dist/transaction.js +156 -0
  273. package/dist/types.d.ts +58 -0
  274. package/dist/types.d.ts.map +1 -0
  275. package/dist/types.js +1 -0
  276. package/dist/update-many.d.ts +7 -0
  277. package/dist/update-many.d.ts.map +1 -0
  278. package/dist/update-many.js +182 -0
  279. package/dist/uuid.d.ts +7 -0
  280. package/dist/uuid.d.ts.map +1 -0
  281. package/dist/uuid.js +48 -0
  282. package/dist/validation.d.ts +24 -0
  283. package/dist/validation.d.ts.map +1 -0
  284. package/dist/validation.js +72 -0
  285. package/dist/virtual-read.d.ts +9 -0
  286. package/dist/virtual-read.d.ts.map +1 -0
  287. package/dist/virtual-read.js +145 -0
  288. package/dist/virtual.d.ts +142 -0
  289. package/dist/virtual.d.ts.map +1 -0
  290. package/dist/virtual.js +1 -0
  291. package/dist/write-context.d.ts +46 -0
  292. package/dist/write-context.d.ts.map +1 -0
  293. package/dist/write-context.js +102 -0
  294. package/dist/write-data.d.ts +26 -0
  295. package/dist/write-data.d.ts.map +1 -0
  296. package/dist/write-data.js +144 -0
  297. package/dist/write-plan.d.ts +107 -0
  298. package/dist/write-plan.d.ts.map +1 -0
  299. package/dist/write-plan.js +170 -0
  300. package/dist/write-target.d.ts +17 -0
  301. package/dist/write-target.d.ts.map +1 -0
  302. package/dist/write-target.js +59 -0
  303. package/dist/writes.d.ts +23 -0
  304. package/dist/writes.d.ts.map +1 -0
  305. package/dist/writes.js +246 -0
  306. package/dist/writing.d.ts +10 -0
  307. package/dist/writing.d.ts.map +1 -0
  308. package/dist/writing.js +66 -0
  309. package/package.json +42 -3
  310. package/src/access.ts +329 -0
  311. package/src/adapter-errors.ts +89 -0
  312. package/src/adapter-json.ts +21 -0
  313. package/src/adapter-migrations.ts +98 -0
  314. package/src/adapter.ts +363 -0
  315. package/src/aggregate.ts +136 -0
  316. package/src/app-internals.ts +26 -0
  317. package/src/app-options.ts +24 -0
  318. package/src/cascade.ts +297 -0
  319. package/src/cli-config.ts +45 -0
  320. package/src/cli-deploy.ts +235 -0
  321. package/src/cli-main.ts +166 -0
  322. package/src/cli-migrate.ts +143 -0
  323. package/src/cli.ts +5 -0
  324. package/src/complete.ts +73 -0
  325. package/src/console-logger.ts +87 -0
  326. package/src/create-many.ts +126 -0
  327. package/src/decimal.ts +74 -0
  328. package/src/define-app.ts +108 -0
  329. package/src/define-enum.ts +26 -0
  330. package/src/define-function.ts +188 -0
  331. package/src/define-model.ts +220 -0
  332. package/src/definition.ts +352 -0
  333. package/src/delete-many.ts +76 -0
  334. package/src/engine.ts +281 -0
  335. package/src/errors.ts +97 -0
  336. package/src/exact.ts +49 -0
  337. package/src/feed.ts +39 -0
  338. package/src/field-codec.ts +72 -0
  339. package/src/field-rules.ts +77 -0
  340. package/src/field-type.ts +219 -0
  341. package/src/fields.ts +383 -0
  342. package/src/function.ts +143 -0
  343. package/src/functions.ts +154 -0
  344. package/src/group-by.ts +186 -0
  345. package/src/group-having.ts +143 -0
  346. package/src/hooks.ts +215 -0
  347. package/src/hosts.ts +11 -0
  348. package/src/identify.ts +95 -0
  349. package/src/index.ts +125 -0
  350. package/src/internal.ts +68 -0
  351. package/src/lifecycle.ts +214 -0
  352. package/src/list-update.ts +71 -0
  353. package/src/live.ts +199 -0
  354. package/src/manifest.ts +71 -0
  355. package/src/memory-aggregate.ts +162 -0
  356. package/src/memory-conditions.ts +88 -0
  357. package/src/memory-draft.ts +319 -0
  358. package/src/memory-json.ts +91 -0
  359. package/src/memory-read.ts +311 -0
  360. package/src/memory-search.ts +149 -0
  361. package/src/memory-values.ts +106 -0
  362. package/src/memory.ts +173 -0
  363. package/src/migrate.ts +152 -0
  364. package/src/model.ts +312 -0
  365. package/src/nested-write.ts +390 -0
  366. package/src/number-update.ts +142 -0
  367. package/src/plugin-app.ts +308 -0
  368. package/src/plugin-code.ts +158 -0
  369. package/src/plugin-use.ts +217 -0
  370. package/src/plugin.ts +400 -0
  371. package/src/query-aggregate.ts +96 -0
  372. package/src/query-args.ts +375 -0
  373. package/src/query-bulk.ts +53 -0
  374. package/src/query-conditions.ts +53 -0
  375. package/src/query-context.ts +104 -0
  376. package/src/query-filter.ts +54 -0
  377. package/src/query-group.ts +137 -0
  378. package/src/query-json.ts +90 -0
  379. package/src/query-order.ts +158 -0
  380. package/src/query-project.ts +73 -0
  381. package/src/query-search.ts +31 -0
  382. package/src/query-values.ts +131 -0
  383. package/src/query-where.ts +318 -0
  384. package/src/query-write.ts +360 -0
  385. package/src/query.ts +400 -0
  386. package/src/record.ts +379 -0
  387. package/src/recorder.ts +212 -0
  388. package/src/relation-write.ts +176 -0
  389. package/src/relations.ts +165 -0
  390. package/src/rules.ts +188 -0
  391. package/src/running.ts +62 -0
  392. package/src/schema-indexes.ts +88 -0
  393. package/src/schema-virtuals.ts +134 -0
  394. package/src/schema.ts +367 -0
  395. package/src/scope.ts +123 -0
  396. package/src/scratch.ts +28 -0
  397. package/src/serve.ts +5 -0
  398. package/src/symbols.ts +11 -0
  399. package/src/transaction.ts +211 -0
  400. package/src/types.ts +79 -0
  401. package/src/update-many.ts +268 -0
  402. package/src/uuid.ts +51 -0
  403. package/src/validation.ts +107 -0
  404. package/src/virtual-read.ts +198 -0
  405. package/src/virtual.ts +187 -0
  406. package/src/write-context.ts +170 -0
  407. package/src/write-data.ts +188 -0
  408. package/src/write-plan.ts +273 -0
  409. package/src/write-target.ts +92 -0
  410. package/src/writes.ts +361 -0
  411. package/src/writing.ts +93 -0
@@ -0,0 +1,263 @@
1
+ import { and } from './access.js';
2
+ import { InvalidQuery } from './errors.js';
3
+ import { orderBy } from './query-order.js';
4
+ import { entries, isObject, modelOf, normalizeWhere, systemFields, unknownKey, } from './query-where.js';
5
+ /** Without `select`, scalar fields return and relations do not (D-20). */
6
+ function scalars(model) {
7
+ return [
8
+ ...systemFields,
9
+ ...[...model.fields.values()]
10
+ .filter((field) => field.kind === 'scalar')
11
+ .map((field) => field.name),
12
+ ];
13
+ }
14
+ export function integer(value, path, least) {
15
+ if (typeof value !== 'number' ||
16
+ !Number.isSafeInteger(value) ||
17
+ (least !== undefined && value < least)) {
18
+ const range = least === undefined ? '' : ` of at least ${least}`;
19
+ throw new InvalidQuery(path, `${path} must be an integer${range}.`);
20
+ }
21
+ return value;
22
+ }
23
+ /** `_count`: the `many` relations it names, each with its filter (D-134). */
24
+ function counted(models, model, value, path, scope) {
25
+ const filter = (field, where) => and(where, scope?.related(model, field)) ?? {};
26
+ const counts = new Map();
27
+ if (value === true) {
28
+ for (const field of model.fields.values()) {
29
+ if (field.kind === 'many')
30
+ counts.set(field.name, filter(field));
31
+ }
32
+ return counts;
33
+ }
34
+ const given = new Map(entries(value, path));
35
+ for (const key of given.keys()) {
36
+ if (key !== 'select')
37
+ throw unknownKey(`${path}.${key}`, model.name);
38
+ }
39
+ const select = `${path}.select`;
40
+ for (const [name, chosen] of entries(given.get('select'), select)) {
41
+ const at = `${select}.${name}`;
42
+ const field = model.fields.get(name);
43
+ if (field?.kind !== 'many')
44
+ throw unknownKey(at, model.name);
45
+ if (chosen === false)
46
+ continue;
47
+ if (chosen === true) {
48
+ counts.set(name, filter(field));
49
+ continue;
50
+ }
51
+ const args = new Map(entries(chosen, at));
52
+ for (const key of args.keys()) {
53
+ if (key !== 'where')
54
+ throw unknownKey(`${at}.${key}`, model.name);
55
+ }
56
+ const counting = modelOf(models, field.target);
57
+ const where = args.has('where')
58
+ ? normalizeWhere(models, counting, args.get('where'), `${at}.where`, scope)
59
+ : undefined;
60
+ counts.set(name, filter(field, where));
61
+ }
62
+ return counts;
63
+ }
64
+ /** A unique target (D-52): exactly `id`, a unique field or a unique index. */
65
+ export function uniqueWhere(models, model, where, path, scope) {
66
+ const given = entries(where, path);
67
+ const keys = given.map(([key]) => key).toSorted();
68
+ const matched = model.uniques.some((fields) => fields.length === keys.length &&
69
+ fields.toSorted().every((field, index) => field === keys[index]));
70
+ if (!matched) {
71
+ throw new InvalidQuery(path, `${path} must name exactly id, a unique field or a unique index of ${model.name}.`);
72
+ }
73
+ const filter = {};
74
+ for (const [key, value] of given) {
75
+ const at = `${path}.${key}`;
76
+ if (value === null || isObject(value)) {
77
+ throw new InvalidQuery(at, `${at} must be a value.`);
78
+ }
79
+ const field = model.fields.get(key);
80
+ filter[key] = field?.kind === 'one' ? { is: { id: value } } : value;
81
+ }
82
+ return normalizeWhere(models, model, filter, path, scope);
83
+ }
84
+ /** A read narrowed to the rows of a read filter, its cursor too (D-86). */
85
+ export function restrict(read, readable) {
86
+ if (readable === undefined)
87
+ return read;
88
+ return {
89
+ ...read,
90
+ where: and(read.where, readable),
91
+ ...(read.cursor === undefined
92
+ ? {}
93
+ : { cursor: and(read.cursor, readable) }),
94
+ };
95
+ }
96
+ /** A virtual's `true` or its input, with a model's `select`, `include`, `omit`. */
97
+ function virtualRead(models, info, value, path, scope) {
98
+ const { output } = info;
99
+ const target = output.kind === 'model' ? output.name : undefined;
100
+ const shaping = {};
101
+ const input = {};
102
+ for (const [key, given] of value === true ? [] : entries(value, path)) {
103
+ if (target !== undefined && oneKeys.has(key))
104
+ shaping[key] = given;
105
+ else if (info.input === undefined) {
106
+ throw unknownKey(`${path}.${key}`, info.model);
107
+ }
108
+ else
109
+ input[key] = given;
110
+ }
111
+ const nested = target === undefined
112
+ ? undefined
113
+ : plan(models, modelOf(models, target), shaping, path, 'one', oneKeys, scope);
114
+ return { info, input, path, plan: nested };
115
+ }
116
+ /**
117
+ * The arguments of a relation read, or of a top-level read when `path` is
118
+ * empty. A `scope` checks them and narrows each included relation (D-86).
119
+ */
120
+ export function plan(models, model, args, path, kind, keys, scope) {
121
+ const given = new Map(args === undefined ? [] : entries(args, path || 'args'));
122
+ const at = (key) => (path === '' ? key : `${path}.${key}`);
123
+ for (const key of given.keys()) {
124
+ if (!keys.has(key))
125
+ throw unknownKey(at(key), model.name);
126
+ }
127
+ const select = given.get('select');
128
+ const include = given.get('include');
129
+ if (select !== undefined && include !== undefined) {
130
+ throw new InvalidQuery(path, `${at('select')} and include cannot be used together.`);
131
+ }
132
+ if (select !== undefined && given.has('omit')) {
133
+ throw new InvalidQuery(path, `${at('select')} and omit cannot be used together.`);
134
+ }
135
+ const read = {};
136
+ const fields = select === undefined ? scalars(model) : [];
137
+ const relations = new Map();
138
+ const virtuals = new Map();
139
+ for (const info of select === undefined ? model.virtuals.values() : []) {
140
+ if (info.default)
141
+ virtuals.set(info.name, virtualRead(models, info, true, '', scope));
142
+ }
143
+ const nested = {};
144
+ let count = new Map();
145
+ const chosen = select ?? include;
146
+ if (chosen !== undefined) {
147
+ const base = select === undefined ? 'include' : 'select';
148
+ for (const [name, value] of entries(chosen, at(base))) {
149
+ const where = `${at(base)}.${name}`;
150
+ if (name === '_count') {
151
+ if (value === false)
152
+ continue;
153
+ count = counted(models, model, value, where, scope);
154
+ continue;
155
+ }
156
+ const virtual = model.virtuals.get(name);
157
+ if (virtual !== undefined) {
158
+ if (value === false)
159
+ virtuals.delete(name);
160
+ else
161
+ virtuals.set(name, virtualRead(models, virtual, value, where, scope));
162
+ continue;
163
+ }
164
+ const field = model.fields.get(name);
165
+ const scalar = field === undefined
166
+ ? systemFields.includes(name)
167
+ : field.kind === 'scalar';
168
+ if ((field === undefined && !scalar) || (base === 'include' && scalar)) {
169
+ throw unknownKey(where, model.name);
170
+ }
171
+ if (value === false)
172
+ continue;
173
+ if (scalar) {
174
+ if (value !== true) {
175
+ throw new InvalidQuery(where, `${where} must be a boolean.`);
176
+ }
177
+ fields.push(name);
178
+ continue;
179
+ }
180
+ if (field === undefined || field.kind === 'scalar')
181
+ continue;
182
+ const relation = plan(models, modelOf(models, field.target), value === true ? undefined : value, where, field.kind, field.kind === 'many' ? manyKeys : oneKeys, scope);
183
+ const readable = field.kind === 'one'
184
+ ? scope?.readable(field.target)
185
+ : scope?.related(model, field);
186
+ nested[name] = restrict(relation.read, readable);
187
+ relations.set(name, relation.shape);
188
+ }
189
+ }
190
+ if (Object.keys(nested).length > 0)
191
+ read.include = nested;
192
+ if (count.size > 0)
193
+ read.count = Object.fromEntries(count);
194
+ if (given.has('where')) {
195
+ read.where = normalizeWhere(models, model, given.get('where'), at('where'), scope);
196
+ }
197
+ if (kind === 'many') {
198
+ // `_relevance` ranks by the `_search` at the top of `where` (D-148).
199
+ const search = read.where?.['_search'];
200
+ read.orderBy = orderBy(models, model, given.get('orderBy') ?? [], at('orderBy'), scope, isObject(search) && typeof search['search'] === 'string'
201
+ ? search['search']
202
+ : undefined);
203
+ if (given.has('take'))
204
+ read.take = integer(given.get('take'), at('take'));
205
+ if (given.has('skip'))
206
+ read.skip = integer(given.get('skip'), at('skip'), 0);
207
+ if (given.has('cursor')) {
208
+ read.cursor = uniqueWhere(models, model, given.get('cursor'), at('cursor'), scope);
209
+ }
210
+ }
211
+ const hidden = omitted(model, given.get('omit'), at('omit'));
212
+ const shown = fields.filter((name) => !hidden.has(name));
213
+ for (const name of hidden)
214
+ virtuals.delete(name);
215
+ const needs = [...virtuals.values()].flatMap(({ info }) => info.needs);
216
+ // A field read rule may read any field of the row (D-136).
217
+ const names = [
218
+ ...shown,
219
+ ...relations.keys(),
220
+ ...count.keys(),
221
+ ...virtuals.keys(),
222
+ ];
223
+ if (!names.some((name) => scope?.ruled(model, name) === true)) {
224
+ read.fields = [...new Set(['id', ...shown, ...needs])];
225
+ }
226
+ const counts = [...count.keys()];
227
+ return { read, shape: { model, fields: shown, relations, counts, virtuals } };
228
+ }
229
+ /** The scalar and system fields `omit` leaves out of the rows (D-135). */
230
+ function omitted(model, omit, path) {
231
+ const names = new Set();
232
+ if (omit === undefined)
233
+ return names;
234
+ for (const [name, value] of entries(omit, path)) {
235
+ const where = `${path}.${name}`;
236
+ const field = model.fields.get(name);
237
+ const scalar = field === undefined
238
+ ? systemFields.includes(name) || model.virtuals.get(name)?.default
239
+ : field.kind === 'scalar';
240
+ if (scalar !== true)
241
+ throw unknownKey(where, model.name);
242
+ if (typeof value !== 'boolean') {
243
+ throw new InvalidQuery(where, `${where} must be a boolean.`);
244
+ }
245
+ if (value)
246
+ names.add(name);
247
+ }
248
+ return names;
249
+ }
250
+ /** The keys that shape a read's rows. */
251
+ export const oneKeys = new Set([
252
+ 'select',
253
+ 'include',
254
+ 'omit',
255
+ ]);
256
+ const manyKeys = new Set([
257
+ ...oneKeys,
258
+ 'where',
259
+ 'orderBy',
260
+ 'take',
261
+ 'skip',
262
+ 'cursor',
263
+ ]);
@@ -0,0 +1,35 @@
1
+ import type { Exact } from './exact.ts';
2
+ import type { Payload, QueryOptions, Shaping, Where } from './query.ts';
3
+ import type { CreateManyData, UpdateManyData } from './record.ts';
4
+ /** `createMany`: a row or a list, no nested writes, no rows back (D-135). */
5
+ export type CreateManyArgs<F> = {
6
+ readonly data: CreateManyData<F> | readonly CreateManyData<F>[];
7
+ };
8
+ /** `updateMany`: no relation writes, no returned rows (D-133). */
9
+ export type UpdateManyArgs<F> = {
10
+ readonly where?: Where<F> | undefined;
11
+ readonly data: UpdateManyData<F>;
12
+ };
13
+ export type CreateManyAndReturnArgs<F> = CreateManyArgs<F> & Shaping<F>;
14
+ export type UpdateManyAndReturnArgs<F> = UpdateManyArgs<F> & Shaping<F>;
15
+ export interface BulkQueries<F> {
16
+ /** A create of each row of `data`, all or nothing (D-135). */
17
+ createMany(this: void, args: CreateManyArgs<F>, options?: QueryOptions): Promise<{
18
+ readonly count: number;
19
+ }>;
20
+ /** An update of each row `where` selects, all or nothing (D-133). */
21
+ updateMany(this: void, args: UpdateManyArgs<F>, options?: QueryOptions): Promise<{
22
+ readonly count: number;
23
+ }>;
24
+ /** A delete of each row `where` selects, all or nothing (D-111). */
25
+ deleteMany(this: void, args?: {
26
+ readonly where?: Where<F> | undefined;
27
+ }, options?: QueryOptions): Promise<{
28
+ readonly count: number;
29
+ }>;
30
+ /** `createMany`'s rows, in `data`'s order, each as `create` returns it. */
31
+ createManyAndReturn<const A extends CreateManyAndReturnArgs<F>>(this: void, args: A & NoInfer<Exact<A, CreateManyAndReturnArgs<F>>>, options?: QueryOptions): Promise<Payload<F, A>[]>;
32
+ /** `updateMany`'s rows, in `id` order, each as `update` returns it. */
33
+ updateManyAndReturn<const A extends UpdateManyAndReturnArgs<F>>(this: void, args: A & NoInfer<Exact<A, UpdateManyAndReturnArgs<F>>>, options?: QueryOptions): Promise<Payload<F, A>[]>;
34
+ }
35
+ //# sourceMappingURL=query-bulk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-bulk.d.ts","sourceRoot":"","sources":["../src/query-bulk.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjE,6EAA6E;AAC7E,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC/B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;CAC/D,CAAA;AAED,kEAAkE;AAClE,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACvE,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAEvE,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,8DAA8D;IAC9D,UAAU,CACT,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,OAAO,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtC,qEAAqE;IACrE,UAAU,CACT,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,OAAO,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtC,oEAAoE;IACpE,UAAU,CACT,IAAI,EAAE,IAAI,EACV,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;KAAE,EAChD,OAAO,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtC,2EAA2E;IAC3E,mBAAmB,CAAC,KAAK,CAAC,CAAC,SAAS,uBAAuB,CAAC,CAAC,CAAC,EAC7D,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,EACvD,OAAO,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IAC3B,uEAAuE;IACvE,mBAAmB,CAAC,KAAK,CAAC,CAAC,SAAS,uBAAuB,CAAC,CAAC,CAAC,EAC7D,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,EACvD,OAAO,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;CAC3B"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import type { Condition } from './adapter.ts';
2
+ import type { ModelInfo } from './schema.ts';
3
+ import type { Scalar } from './query-values.ts';
4
+ /**
5
+ * A list's `has`, `hasSome` and `hasEvery`, which name its elements, and
6
+ * `isEmpty` (D-120, D-127, D-149).
7
+ */
8
+ export declare function listCondition(model: ModelInfo, field: Scalar, value: unknown, path: string): Condition | undefined;
9
+ //# sourceMappingURL=query-conditions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-conditions.d.ts","sourceRoot":"","sources":["../src/query-conditions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAY/C;;;GAGG;AACH,wBAAgB,aAAa,CAC5B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,GACV,SAAS,GAAG,SAAS,CA2BvB"}
@@ -0,0 +1,46 @@
1
+ import { InvalidQuery } from './errors.js';
2
+ import { entries, integerRange, misfit, unknownKey } from './query-values.js';
3
+ /** What an element of `field` must be, for a message. */
4
+ function kindOf(field) {
5
+ if (field.type === 'enum')
6
+ return `one of ${(field.values ?? []).join(', ')}`;
7
+ if (field.type !== 'number')
8
+ return 'a non-empty clean string';
9
+ return field.integer === true
10
+ ? `a whole number ${integerRange}`
11
+ : 'a finite number';
12
+ }
13
+ /**
14
+ * A list's `has`, `hasSome` and `hasEvery`, which name its elements, and
15
+ * `isEmpty` (D-120, D-127, D-149).
16
+ */
17
+ export function listCondition(model, field, value, path) {
18
+ const element = (item, at) => {
19
+ if (item === '' || misfit(item, field) !== undefined) {
20
+ throw new InvalidQuery(at, `${at} must be ${kindOf(field)}.`);
21
+ }
22
+ return item;
23
+ };
24
+ const condition = {};
25
+ for (const [operator, operand] of entries(value, path)) {
26
+ const at = `${path}.${operator}`;
27
+ if (operator === 'has')
28
+ condition[operator] = element(operand, at);
29
+ else if (operator === 'isEmpty') {
30
+ if (typeof operand !== 'boolean') {
31
+ throw new InvalidQuery(at, `${at} must be a boolean.`);
32
+ }
33
+ condition[operator] = operand;
34
+ }
35
+ else if (operator !== 'hasSome' && operator !== 'hasEvery') {
36
+ throw unknownKey(at, model.name);
37
+ }
38
+ else if (!Array.isArray(operand)) {
39
+ throw new InvalidQuery(at, `${at} must be a list.`);
40
+ }
41
+ else {
42
+ condition[operator] = operand.map((each, index) => element(each, `${at}.${index}`));
43
+ }
44
+ }
45
+ return Object.keys(condition).length === 0 ? undefined : condition;
46
+ }
@@ -0,0 +1,32 @@
1
+ import type { Access } from './access.ts';
2
+ import type { Filter, Row } from './adapter.ts';
3
+ import type { FindOperation } from './model.ts';
4
+ import type { Caller } from './rules.ts';
5
+ import type { Running } from './running.ts';
6
+ import type { ModelInfo } from './schema.ts';
7
+ import type { QueryScope } from './scope.ts';
8
+ import type { Shape } from './query-args.ts';
9
+ import type { Hidden } from './query-project.ts';
10
+ import type { Store } from './transaction.ts';
11
+ import type { Models } from './query-where.ts';
12
+ export type Context = {
13
+ readonly app: Running;
14
+ readonly models: Models;
15
+ readonly model: ModelInfo;
16
+ readonly caller: Caller;
17
+ readonly scope: QueryScope;
18
+ };
19
+ export declare function given(args: unknown, model: string, keys: readonly string[], required: readonly string[]): Map<string, unknown>;
20
+ /** `select` and `include` of a single-row operation. */
21
+ export declare function picked(found: ReadonlyMap<string, unknown>): object;
22
+ /**
23
+ * The rows a many-row operation's `where` selects that the caller reads, or
24
+ * deletes (D-124).
25
+ */
26
+ export declare function filtered(context: Context, found: ReadonlyMap<string, unknown>, operation: FindOperation): Promise<Filter | undefined>;
27
+ /** The fields the caller's field read rules hide (D-44). */
28
+ export declare function hiddenBy(access: Access | undefined): Hidden | undefined;
29
+ /** Each row, as `shape` shapes it (D-149), its virtuals computed (D-151). */
30
+ export declare function shapedRows(context: Context, store: Store, rows: readonly Row[], shape: Shape, access: Access | undefined): Promise<unknown[]>;
31
+ export declare function first(context: Context, store: Store, rows: readonly Row[], shape: Shape, access: Access | undefined): Promise<unknown>;
32
+ //# sourceMappingURL=query-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-context.d.ts","sourceRoot":"","sources":["../src/query-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,MAAM,MAAM,OAAO,GAAG;IACrB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAC1B,CAAA;AAED,wBAAgB,KAAK,CACpB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,EAAE,SAAS,MAAM,EAAE,GACzB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAStB;AAED,wDAAwD;AACxD,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMlE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC7B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,SAAS,EAAE,aAAa,GACtB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAU7B;AAED,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED,6EAA6E;AAC7E,wBAAsB,UAAU,CAC/B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC,OAAO,EAAE,CAAC,CAIpB;AAED,wBAAsB,KAAK,CAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC,OAAO,CAAC,CAKlB"}
@@ -0,0 +1,55 @@
1
+ import { and } from './access.js';
2
+ import { InvalidQuery } from './errors.js';
3
+ import { planned } from './scope.js';
4
+ import { oneKeys, plan } from './query-args.js';
5
+ import { project } from './query-project.js';
6
+ import { computeVirtuals } from './virtual-read.js';
7
+ import { entries, unknownKey } from './query-where.js';
8
+ export function given(args, model, keys, required) {
9
+ const found = new Map(args === undefined ? [] : entries(args, 'args'));
10
+ for (const key of found.keys()) {
11
+ if (!keys.includes(key))
12
+ throw unknownKey(key, model);
13
+ }
14
+ for (const key of required) {
15
+ if (!found.has(key))
16
+ throw new InvalidQuery(key, `${key} is required.`);
17
+ }
18
+ return found;
19
+ }
20
+ /** `select` and `include` of a single-row operation. */
21
+ export function picked(found) {
22
+ const args = {};
23
+ for (const key of oneKeys) {
24
+ if (found.has(key))
25
+ args[key] = found.get(key);
26
+ }
27
+ return args;
28
+ }
29
+ /**
30
+ * The rows a many-row operation's `where` selects that the caller reads, or
31
+ * deletes (D-124).
32
+ */
33
+ export async function filtered(context, found, operation) {
34
+ const { models, model, scope } = context;
35
+ const keys = new Set(['where']);
36
+ const args = { where: found.get('where') };
37
+ return planned(scope, () => and(plan(models, model, args, '', 'one', keys, scope).read.where, scope.readable(model.name, operation)));
38
+ }
39
+ /** The fields the caller's field read rules hide (D-44). */
40
+ export function hiddenBy(access) {
41
+ return access && ((model, row, fields) => access.hidden(model, row, fields));
42
+ }
43
+ /** Each row, as `shape` shapes it (D-149), its virtuals computed (D-151). */
44
+ export async function shapedRows(context, store, rows, shape, access) {
45
+ const hidden = hiddenBy(access);
46
+ const computed = await computeVirtuals(context, store, rows, shape, hidden);
47
+ return rows.map((row) => project(row, shape, hidden, computed));
48
+ }
49
+ export async function first(context, store, rows, shape, access) {
50
+ const [row] = rows;
51
+ if (row === undefined)
52
+ return null;
53
+ const [shaped] = await shapedRows(context, store, [row], shape, access);
54
+ return shaped;
55
+ }
@@ -0,0 +1,46 @@
1
+ import type { JsonValue } from './fields.ts';
2
+ export type ScalarFilter<V, Ordered = false> = {
3
+ readonly equals?: V | null | undefined;
4
+ readonly not?: V | null | undefined;
5
+ readonly in?: readonly V[] | undefined;
6
+ readonly notIn?: readonly V[] | undefined;
7
+ } & ([V, Ordered] extends [number | Date, unknown] | [unknown, true] ? {
8
+ readonly lt?: V | undefined;
9
+ readonly lte?: V | undefined;
10
+ readonly gt?: V | undefined;
11
+ readonly gte?: V | undefined;
12
+ } : [V] extends [string] ? {
13
+ readonly contains?: string | undefined;
14
+ readonly startsWith?: string | undefined;
15
+ readonly endsWith?: string | undefined;
16
+ } & (string extends V ? {
17
+ readonly mode?: 'insensitive' | undefined;
18
+ } : unknown) : unknown);
19
+ /** A list has no shorthand; `NOT` gives the opposite (D-120, D-127, D-149). */
20
+ export type ListFilter<E> = {
21
+ readonly has?: E | undefined;
22
+ readonly hasSome?: readonly E[] | undefined;
23
+ readonly hasEvery?: readonly E[] | undefined;
24
+ readonly isEmpty?: boolean | undefined;
25
+ };
26
+ /**
27
+ * A json field's filter at a path into its value (D-149): the operands are
28
+ * any JSON, whatever the field's schema, and the path is not checked.
29
+ */
30
+ export type JsonPathFilter = {
31
+ readonly path: readonly string[];
32
+ readonly equals?: JsonValue | undefined;
33
+ readonly not?: JsonValue | undefined;
34
+ readonly lt?: number | string | undefined;
35
+ readonly lte?: number | string | undefined;
36
+ readonly gt?: number | string | undefined;
37
+ readonly gte?: number | string | undefined;
38
+ readonly stringContains?: string | undefined;
39
+ readonly stringStartsWith?: string | undefined;
40
+ readonly stringEndsWith?: string | undefined;
41
+ readonly mode?: 'insensitive' | undefined;
42
+ readonly arrayContains?: JsonValue | undefined;
43
+ readonly arrayStartsWith?: JsonValue | undefined;
44
+ readonly arrayEndsWith?: JsonValue | undefined;
45
+ };
46
+ //# sourceMappingURL=query-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-filter.d.ts","sourceRoot":"","sources":["../src/query-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,82 @@
1
+ import type { Aggregated, AggregateArgs, Aggregates, DecimalKeys, IsOrdered, KeysWith, Summed, ValueOf } from './query-aggregate.ts';
2
+ import type { Exact } from './exact.ts';
3
+ import type { ScalarFilter } from './query-filter.ts';
4
+ import type { RecordOf, StoredRecord } from './record.ts';
5
+ type Direction = 'asc' | 'desc';
6
+ type Sorted<K extends PropertyKey> = {
7
+ readonly [P in K]?: Direction | undefined;
8
+ };
9
+ /** A value's sort: an optional one puts its `null`s first or last (D-149). */
10
+ export type SortOrder<V> = null extends V ? Direction | {
11
+ readonly sort: Direction;
12
+ readonly nulls?: 'first' | 'last' | undefined;
13
+ } : Direction;
14
+ /** The `one` relations the row stores (D-37). */
15
+ type StoredOnes<F, N> = Exclude<keyof StoredRecord<F, N & string>, keyof RecordOf<F>>;
16
+ /** What a group takes: a scalar an aggregate takes, or a stored relation. */
17
+ export type GroupField<F, N> = Aggregated<F> | StoredOnes<F, N>;
18
+ type GroupOrderBy<F, N, B extends PropertyKey> = {
19
+ readonly [K in B]?: SortOrder<GroupValue<F, N, K>> | undefined;
20
+ } & {
21
+ readonly _count?: Direction | ({
22
+ readonly _all?: Direction | undefined;
23
+ } & Sorted<Aggregated<F>>) | undefined;
24
+ readonly _sum?: Sorted<Summed<F>> | undefined;
25
+ readonly _avg?: Sorted<Summed<F>> | undefined;
26
+ readonly _min?: Sorted<KeysWith<F, number | string | Date>> | undefined;
27
+ readonly _max?: Sorted<KeysWith<F, number | string | Date>> | undefined;
28
+ };
29
+ /** A value's filter: an id's has no `mode`, a decimal's or a day's compares. */
30
+ type ValueFilter<F, K> = K extends 'id' ? Omit<ScalarFilter<string>, 'mode'> : ScalarFilter<ValueOf<F, K>, K extends keyof F ? IsOrdered<F[K]> : false>;
31
+ type Filtered<V, Ordered = false> = V | ScalarFilter<V, Ordered> | undefined;
32
+ /** Field `K`'s aggregates, each filtered as the value it gives (D-149). */
33
+ type AggregateFilters<F, K> = {
34
+ readonly _count?: Filtered<number>;
35
+ } & (K extends Summed<F> ? {
36
+ readonly _sum?: K extends DecimalKeys<F> ? Filtered<string, true> : Filtered<number>;
37
+ readonly _avg?: Filtered<number>;
38
+ } : unknown) & (K extends KeysWith<F, number | string | Date> ? {
39
+ readonly _min?: ValueOf<F, K> | ValueFilter<F, K> | undefined;
40
+ readonly _max?: ValueOf<F, K> | ValueFilter<F, K> | undefined;
41
+ } : unknown);
42
+ /** The groups kept: a field of `by` by its value, any field by its aggregates. */
43
+ type Having<F, N, B extends PropertyKey> = {
44
+ readonly [K in Aggregated<F>]?: (K extends B ? GroupValue<F, N, K> | (ValueFilter<F, K> & AggregateFilters<F, K>) : AggregateFilters<F, K>) | undefined;
45
+ } & {
46
+ readonly AND?: Having<F, N, B> | readonly Having<F, N, B>[] | undefined;
47
+ readonly OR?: readonly Having<F, N, B>[] | undefined;
48
+ readonly NOT?: Having<F, N, B> | readonly Having<F, N, B>[] | undefined;
49
+ };
50
+ export type GroupByArgs<F, N, B extends GroupField<F, N> = GroupField<F, N>> = AggregateArgs<F> & {
51
+ readonly by: readonly [B, ...B[]];
52
+ readonly having?: Having<F, N, B> | undefined;
53
+ readonly orderBy?: GroupOrderBy<F, N, B> | readonly GroupOrderBy<F, N, B>[] | undefined;
54
+ readonly skip?: number | undefined;
55
+ readonly take?: number | undefined;
56
+ };
57
+ /**
58
+ * Arguments `A`, checked against the fields of their `by`: no unknown key,
59
+ * and a `having` that fits them, which `Exact` does not check as it skips
60
+ * values: a value for a field outside `by` would pass.
61
+ */
62
+ export type GroupChecked<F, N, A extends {
63
+ readonly by: readonly unknown[];
64
+ }> = Exact<A, GroupByArgs<F, N, A['by'][number] & GroupField<F, N>>> & (A extends {
65
+ readonly having: infer H;
66
+ } ? [H] extends [Having<F, N, A['by'][number] & PropertyKey> | undefined] ? unknown : {
67
+ readonly having: {
68
+ readonly error: 'a field outside by takes aggregates only';
69
+ };
70
+ } : unknown);
71
+ /** A relation's target id, `null` when unset or unreadable (D-86). */
72
+ type GroupValue<F, N, K> = K extends StoredOnes<F, N> ? {
73
+ readonly id: string;
74
+ } | null : K extends keyof StoredRecord<F, N & string> ? StoredRecord<F, N & string>[K] : never;
75
+ /** What `groupBy` returns for the arguments `A`. */
76
+ export type Groups<F, N, A> = A extends {
77
+ readonly by: readonly (infer B)[];
78
+ } ? ({
79
+ readonly [K in B & PropertyKey]: GroupValue<F, N, K>;
80
+ } & Aggregates<F, A>)[] : never;
81
+ export {};
82
+ //# sourceMappingURL=query-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-group.d.ts","sourceRoot":"","sources":["../src/query-group.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import type { Condition } from './adapter.ts';
2
+ /** Whether a json field's filter is a path filter, which names `path`. */
3
+ export declare const isPathFilter: (value: unknown) => boolean;
4
+ /**
5
+ * A path filter of `model`'s json field, `undefined` when it has no operator,
6
+ * as `mode` alone (D-140).
7
+ */
8
+ export declare function jsonCondition(model: string, value: unknown, path: string): Condition | undefined;
9
+ //# sourceMappingURL=query-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-json.d.ts","sourceRoot":"","sources":["../src/query-json.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAsD7C,0EAA0E;AAC1E,eAAO,MAAM,YAAY,UAAW,OAAO,KAAG,OACC,CAAA;AAE/C;;;GAGG;AACH,wBAAgB,aAAa,CAC5B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,GACV,SAAS,GAAG,SAAS,CAqBvB"}