ultimabase 0.0.0-stage → 0.1.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 (411) hide show
  1. package/CHANGELOG.md +7 -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 +16 -0
  37. package/dist/cli-main.d.ts.map +1 -0
  38. package/dist/cli-main.js +151 -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 +165 -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,66 @@
1
+ import { InvalidQuery } from './errors.js';
2
+ import { clean, cleanText, entries, isJson, isObject, unknownKey, } from './query-values.js';
3
+ const json = (operand, at) => {
4
+ if (isJson(operand))
5
+ return operand;
6
+ throw new InvalidQuery(at, `${at} must be a JSON value.`);
7
+ };
8
+ const operands = {
9
+ equals: json,
10
+ not: json,
11
+ ...Object.fromEntries(['lt', 'lte', 'gt', 'gte'].map((operator) => [
12
+ operator,
13
+ (operand, at) => {
14
+ if (typeof operand === 'string' && clean(operand))
15
+ return operand;
16
+ if (typeof operand === 'number' && Number.isFinite(operand)) {
17
+ return operand;
18
+ }
19
+ throw new InvalidQuery(at, `${at} must be a number or a string.`);
20
+ },
21
+ ])),
22
+ ...Object.fromEntries(['stringContains', 'stringStartsWith', 'stringEndsWith'].map((operator) => [
23
+ operator,
24
+ cleanText,
25
+ ])),
26
+ mode: (operand, at) => {
27
+ if (operand === 'insensitive')
28
+ return operand;
29
+ throw new InvalidQuery(at, `${at} must be 'insensitive'.`);
30
+ },
31
+ // A value is a list of one, as in Prisma.
32
+ arrayContains: (operand, at) => {
33
+ const value = json(operand, at);
34
+ if (!Array.isArray(value))
35
+ return [value];
36
+ const items = value;
37
+ return items;
38
+ },
39
+ arrayStartsWith: json,
40
+ arrayEndsWith: json,
41
+ };
42
+ /** Whether a json field's filter is a path filter, which names `path`. */
43
+ export const isPathFilter = (value) => isObject(value) && value['path'] !== undefined;
44
+ /**
45
+ * A path filter of `model`'s json field, `undefined` when it has no operator,
46
+ * as `mode` alone (D-140).
47
+ */
48
+ export function jsonCondition(model, value, path) {
49
+ const condition = {};
50
+ for (const [operator, operand] of entries(value, path)) {
51
+ const at = `${path}.${operator}`;
52
+ if (operator === 'path') {
53
+ if (!Array.isArray(operand)) {
54
+ throw new InvalidQuery(at, `${at} must be a list of keys.`);
55
+ }
56
+ condition['path'] = operand.map((key, index) => cleanText(key, `${at}.${index}`));
57
+ continue;
58
+ }
59
+ const check = operands[operator];
60
+ if (check === undefined)
61
+ throw unknownKey(at, model);
62
+ condition[operator] = check(operand, at);
63
+ }
64
+ const tested = Object.keys(condition).filter((operator) => operator !== 'path' && operator !== 'mode');
65
+ return tested.length === 0 ? undefined : condition;
66
+ }
@@ -0,0 +1,15 @@
1
+ import type { Order, Sort } from './adapter.ts';
2
+ import type { ModelInfo } from './schema.ts';
3
+ import type { Models, Scope } from './query-where.ts';
4
+ export declare function direction(value: unknown, path: string): 'asc' | 'desc';
5
+ /**
6
+ * A sort key's value: a direction, or on an optional field `{ sort, nulls }`
7
+ * (D-149).
8
+ */
9
+ export declare function sortOf(value: unknown, path: string, optional: boolean): Sort;
10
+ /**
11
+ * A read's sort keys, ending with `id` so the order is total; `search` is
12
+ * the text of its where's `_search`.
13
+ */
14
+ export declare function orderBy(models: Models, model: ModelInfo, value: unknown, path: string, scope: Scope | undefined, search?: string): Order[];
15
+ //# sourceMappingURL=query-order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-order.d.ts","sourceRoot":"","sources":["../src/query-order.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAQ,MAAM,cAAc,CAAA;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AASrD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAKtE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAuB5E;AAiFD;;;GAGG;AACH,wBAAgB,OAAO,CACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,GAAG,SAAS,EACxB,MAAM,CAAC,EAAE,MAAM,GACb,KAAK,EAAE,CAeT"}
@@ -0,0 +1,115 @@
1
+ import { InvalidQuery } from './errors.js';
2
+ import { searchedFields } from './query-search.js';
3
+ import { entries, isObject, modelOf, systemFields, unknownKey, } from './query-where.js';
4
+ export function direction(value, path) {
5
+ if (value !== 'asc' && value !== 'desc') {
6
+ throw new InvalidQuery(path, `${path} must be 'asc' or 'desc'.`);
7
+ }
8
+ return value;
9
+ }
10
+ /**
11
+ * A sort key's value: a direction, or on an optional field `{ sort, nulls }`
12
+ * (D-149).
13
+ */
14
+ export function sortOf(value, path, optional) {
15
+ if (!isObject(value))
16
+ return { direction: direction(value, path) };
17
+ if (!optional) {
18
+ throw new InvalidQuery(path, `${path} is required: it sorts by 'asc' or 'desc'.`);
19
+ }
20
+ const { sort, nulls, ...rest } = value;
21
+ const [extra] = Object.keys(rest);
22
+ if (extra !== undefined) {
23
+ throw new InvalidQuery(`${path}.${extra}`, `${path} takes sort and nulls only.`);
24
+ }
25
+ const sorted = direction(sort, `${path}.sort`);
26
+ if (nulls === undefined)
27
+ return { direction: sorted };
28
+ if (nulls !== 'first' && nulls !== 'last') {
29
+ const at = `${path}.nulls`;
30
+ throw new InvalidQuery(at, `${at} must be 'first' or 'last'.`);
31
+ }
32
+ return { direction: sorted, nulls };
33
+ }
34
+ /** A scalar field that sorts: no json, no list, no plugin field (D-94). */
35
+ function sortable(model, field, path) {
36
+ const known = model.fields.get(field);
37
+ if (known === undefined) {
38
+ if (!systemFields.includes(field))
39
+ throw unknownKey(path, model.name);
40
+ return;
41
+ }
42
+ if (known.kind !== 'scalar')
43
+ return;
44
+ if (known.type !== 'json' && !known.list && known.codec === undefined) {
45
+ return;
46
+ }
47
+ const kind = known.codec !== undefined
48
+ ? `a ${known.codec.plugin} field`
49
+ : known.type === 'json'
50
+ ? 'a json field'
51
+ : 'a list';
52
+ throw new InvalidQuery(path, `${path} is ${kind}, which cannot be sorted.`);
53
+ }
54
+ /** The sort keys of one object of `orderBy`, in its keys' order. */
55
+ function keys(models, model, part, at, scope, through, search) {
56
+ const order = [];
57
+ const path = through.length === 0 ? {} : { through };
58
+ const searched = searchedFields(model.fields.values()).length > 0;
59
+ for (const [field, value] of entries(part, at)) {
60
+ const where = `${at}.${field}`;
61
+ if (field === '_relevance' && through.length === 0 && searched) {
62
+ if (search === undefined) {
63
+ throw new InvalidQuery(where, `${where} sorts by the _search at the top of the read's where, which has none.`);
64
+ }
65
+ order.push({
66
+ field,
67
+ direction: direction(value, where),
68
+ relevance: search,
69
+ });
70
+ continue;
71
+ }
72
+ sortable(model, field, where);
73
+ scope?.check(model, field, where, 'sorts');
74
+ const known = model.fields.get(field);
75
+ if (known === undefined || known.kind === 'scalar') {
76
+ const optional = known?.optional === true;
77
+ order.push({ field, ...sortOf(value, where, optional), ...path });
78
+ continue;
79
+ }
80
+ const target = modelOf(models, known.target);
81
+ if (known.kind === 'one') {
82
+ const readable = scope?.readable(target.name);
83
+ const step = { relation: field, ...(readable && { where: readable }) };
84
+ const next = [...through, step];
85
+ order.push(...keys(models, target, value, where, scope, next, search));
86
+ continue;
87
+ }
88
+ const [only, ...rest] = isObject(value) ? Object.entries(value) : [];
89
+ if (only?.[0] !== '_count' || rest.length > 0) {
90
+ throw new InvalidQuery(where, `${where} is a many relation, sorted by { _count: 'asc' | 'desc' }.`);
91
+ }
92
+ const sorted = direction(only[1], `${where}._count`);
93
+ const count = scope?.related(model, known) ?? {};
94
+ order.push({ field, direction: sorted, ...path, count });
95
+ }
96
+ return order;
97
+ }
98
+ /**
99
+ * A read's sort keys, ending with `id` so the order is total; `search` is
100
+ * the text of its where's `_search`.
101
+ */
102
+ export function orderBy(models, model, value, path, scope, search) {
103
+ const parts = Array.isArray(value) ? value : [value];
104
+ const order = parts.flatMap((part, index) => {
105
+ const at = Array.isArray(value) ? `${path}.${index}` : path;
106
+ return keys(models, model, part, at, scope, [], search);
107
+ });
108
+ // The order is total, so a cursor and a page are exact.
109
+ const total = order.some((each) => each.field === 'id' &&
110
+ each.through === undefined &&
111
+ each.count === undefined);
112
+ if (!total)
113
+ order.push({ field: 'id', direction: 'asc' });
114
+ return order;
115
+ }
@@ -0,0 +1,15 @@
1
+ import type { Shape } from './query-args.ts';
2
+ import type { ModelInfo } from './schema.ts';
3
+ /** The fields of a row its field read rules hide (D-44). */
4
+ export type Hidden = (model: ModelInfo, row: {
5
+ readonly [field: string]: unknown;
6
+ }, fields: Iterable<string>) => ReadonlySet<string>;
7
+ /** The values of each row's virtuals, as a read computed them (D-151). */
8
+ export type Computed = WeakMap<object, Map<string, unknown>>;
9
+ /** The virtuals of `shape` a field read rule hides, its own or a need's. */
10
+ export declare function unseenVirtuals(shape: Shape, row: {
11
+ readonly [field: string]: unknown;
12
+ }, hidden: Hidden | undefined): ReadonlySet<string>;
13
+ /** A row as the query returns it, through the shape, without hidden fields. */
14
+ export declare function project(row: unknown, shape: Shape, hidden?: Hidden, computed?: Computed): unknown;
15
+ //# sourceMappingURL=query-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-project.d.ts","sourceRoot":"","sources":["../src/query-project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAG5C,4DAA4D;AAC5D,MAAM,MAAM,MAAM,GAAG,CACpB,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE;IAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,KACpB,WAAW,CAAC,MAAM,CAAC,CAAA;AAExB,0EAA0E;AAC1E,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAE5D,4EAA4E;AAC5E,wBAAgB,cAAc,CAC7B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE;IAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAC1C,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB,WAAW,CAAC,MAAM,CAAC,CASrB;AAED,+EAA+E;AAC/E,wBAAgB,OAAO,CACtB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAiCT"}
@@ -0,0 +1,45 @@
1
+ import { isObject } from './query-where.js';
2
+ /** The virtuals of `shape` a field read rule hides, its own or a need's. */
3
+ export function unseenVirtuals(shape, row, hidden) {
4
+ const reads = [...shape.virtuals.values()].map(({ info }) => info);
5
+ const names = reads.flatMap((info) => [info.name, ...info.needs]);
6
+ const unseen = hidden?.(shape.model, row, names);
7
+ return new Set(reads
8
+ .filter((info) => [info.name, ...info.needs].some((n) => unseen?.has(n)))
9
+ .map((info) => info.name));
10
+ }
11
+ /** A row as the query returns it, through the shape, without hidden fields. */
12
+ export function project(row, shape, hidden, computed) {
13
+ if (Array.isArray(row)) {
14
+ return row.map((item) => project(item, shape, hidden, computed));
15
+ }
16
+ if (!isObject(row))
17
+ return null;
18
+ const names = [...shape.fields, ...shape.relations.keys(), ...shape.counts];
19
+ const unseen = hidden?.(shape.model, row, names);
20
+ const result = {};
21
+ for (const field of shape.fields) {
22
+ if (!unseen?.has(field))
23
+ result[field] = row[field] ?? null;
24
+ }
25
+ for (const [name, nested] of shape.relations) {
26
+ if (!unseen?.has(name)) {
27
+ result[name] = project(row[name], nested, hidden, computed);
28
+ }
29
+ }
30
+ const values = computed?.get(row);
31
+ const unseenVirtual = shape.virtuals.size > 0 ? unseenVirtuals(shape, row, hidden) : new Set();
32
+ for (const name of shape.virtuals.keys()) {
33
+ if (!unseenVirtual.has(name))
34
+ result[name] = values?.get(name) ?? null;
35
+ }
36
+ if (shape.counts.length > 0) {
37
+ const counts = isObject(row['_count'])
38
+ ? row['_count']
39
+ : {};
40
+ result['_count'] = Object.fromEntries(shape.counts
41
+ .filter((name) => !unseen?.has(name))
42
+ .map((name) => [name, counts[name] ?? 0]));
43
+ }
44
+ return result;
45
+ }
@@ -0,0 +1,24 @@
1
+ import type { SchemaField } from './adapter.ts';
2
+ import type { fieldType } from './symbols.ts';
3
+ /** The fields of `F` built with `search: true`. */
4
+ type Searched<F> = {
5
+ [K in keyof F]: F[K] extends {
6
+ readonly [fieldType]: {
7
+ readonly options: {
8
+ readonly search: true;
9
+ };
10
+ };
11
+ } ? K : never;
12
+ }[keyof F];
13
+ /** A model with a searched field takes `_search` in its `where`. */
14
+ export type SearchWhere<F> = [Searched<F>] extends [never] ? unknown : {
15
+ readonly _search?: string | undefined;
16
+ };
17
+ /** And `_relevance` at the top of its `orderBy`. */
18
+ export type Relevance<F> = [Searched<F>] extends [never] ? unknown : {
19
+ readonly _relevance?: 'asc' | 'desc' | undefined;
20
+ };
21
+ /** The names of a model's searched fields, in declaration order. */
22
+ export declare const searchedFields: (fields: Iterable<SchemaField>) => readonly string[];
23
+ export {};
24
+ //# sourceMappingURL=query-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-search.d.ts","sourceRoot":"","sources":["../src/query-search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,mDAAmD;AACnD,KAAK,QAAQ,CAAC,CAAC,IAAI;KACjB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5B,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE;YAAE,QAAQ,CAAC,OAAO,EAAE;gBAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;aAAE,CAAA;SAAE,CAAA;KACrE,GACE,CAAC,GACD,KAAK;CACR,CAAC,MAAM,CAAC,CAAC,CAAA;AAEV,oEAAoE;AACpE,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACvD,OAAO,GACP;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAE5C,oDAAoD;AACpD,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACrD,OAAO,GACP;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAEvD,oEAAoE;AACpE,eAAO,MAAM,cAAc,WAClB,QAAQ,CAAC,WAAW,CAAC,KAC3B,SAAS,MAAM,EAGhB,CAAA"}
@@ -0,0 +1,2 @@
1
+ /** The names of a model's searched fields, in declaration order. */
2
+ export const searchedFields = (fields) => [...fields].flatMap((field) => field.kind === 'scalar' && field.search === true ? [field.name] : []);
@@ -0,0 +1,28 @@
1
+ import { InvalidQuery } from './errors.ts';
2
+ import type { FieldInfo } from './schema.ts';
3
+ export type Scalar = Extract<FieldInfo, {
4
+ readonly kind: 'scalar';
5
+ }>;
6
+ /** What a scalar value is checked against (D-139). */
7
+ export type ScalarCheck = Pick<Scalar, 'type' | 'list' | 'integer' | 'values' | 'precision' | 'scale'>;
8
+ /** An integer field's values (D-132). */
9
+ export declare const isInteger: (value: unknown) => boolean;
10
+ export declare function isObject(value: unknown): value is {
11
+ readonly [key: string]: unknown;
12
+ };
13
+ /** The entries of an argument object, without `undefined` (D-84). */
14
+ export declare function entries(value: unknown, path: string): [string, unknown][];
15
+ /** A string PostgreSQL stores as written: no NUL, no lone surrogate (D-94). */
16
+ export declare const clean: (value: string) => boolean;
17
+ export declare const cleanText: (value: unknown, at: string) => string;
18
+ /** A date of years 1 to 9999 in UTC, which PostgreSQL reads back (D-94). */
19
+ export declare const storedDate: (value: unknown) => value is Date;
20
+ /** A real day of years 1 to 9999, written `'2026-07-31'` (D-150). */
21
+ export declare function isDay(value: unknown): boolean;
22
+ /** JSON data whose strings and keys are clean (D-94). */
23
+ export declare function isJson(value: unknown): boolean;
24
+ export declare function unknownKey(path: string, model: string): InvalidQuery;
25
+ export declare const integerRange = "from -2,147,483,648 to 2,147,483,647";
26
+ /** The message of a value that does not fit `field`, if it does not. */
27
+ export declare const misfit: (value: unknown, field: ScalarCheck) => string | undefined;
28
+ //# sourceMappingURL=query-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-values.d.ts","sourceRoot":"","sources":["../src/query-values.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAA;AAEpE,sDAAsD;AACtD,MAAM,MAAM,WAAW,GAAG,IAAI,CAC7B,MAAM,EACN,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAC9D,CAAA;AAED,yCAAyC;AACzC,eAAO,MAAM,SAAS,UAAW,OAAO,KAAG,OAGZ,CAAA;AAE/B,wBAAgB,QAAQ,CACvB,KAAK,EAAE,OAAO,GACZ,KAAK,IAAI;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAO9C;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAIzE;AAED,+EAA+E;AAC/E,eAAO,MAAM,KAAK,UAAW,MAAM,KAAG,OACQ,CAAA;AAE9C,eAAO,MAAM,SAAS,UAAW,OAAO,MAAM,MAAM,KAAG,MAGtD,CAAA;AAED,4EAA4E;AAC5E,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,KAAK,IAAI,IAGpD,CAAA;AAED,qEAAqE;AACrE,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAS7C;AAED,yDAAyD;AACzD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAEpE;AAED,eAAO,MAAM,YAAY,yCAAyC,CAAA;AA0ClE,wEAAwE;AACxE,eAAO,MAAM,MAAM,UACX,OAAO,SACP,WAAW,KAChB,MAAM,GAAG,SAA8C,CAAA"}
@@ -0,0 +1,91 @@
1
+ import { decimalIssue } from './decimal.js';
2
+ import { InvalidQuery } from './errors.js';
3
+ /** An integer field's values (D-132). */
4
+ export const isInteger = (value) => Number.isInteger(value) &&
5
+ Number(value) >= -2_147_483_648 &&
6
+ Number(value) <= 2_147_483_647;
7
+ export function isObject(value) {
8
+ return (typeof value === 'object' &&
9
+ value !== null &&
10
+ !Array.isArray(value) &&
11
+ !(value instanceof Date));
12
+ }
13
+ /** The entries of an argument object, without `undefined` (D-84). */
14
+ export function entries(value, path) {
15
+ if (!isObject(value))
16
+ throw new InvalidQuery(path, `${path} must be an object.`);
17
+ return Object.entries(value).filter(([, item]) => item !== undefined);
18
+ }
19
+ /** A string PostgreSQL stores as written: no NUL, no lone surrogate (D-94). */
20
+ export const clean = (value) => value.isWellFormed() && !value.includes('\0');
21
+ export const cleanText = (value, at) => {
22
+ if (typeof value === 'string' && clean(value))
23
+ return value;
24
+ throw new InvalidQuery(at, `${at} must be a clean string.`);
25
+ };
26
+ /** A date of years 1 to 9999 in UTC, which PostgreSQL reads back (D-94). */
27
+ export const storedDate = (value) => {
28
+ const year = value instanceof Date ? value.getUTCFullYear() : Number.NaN;
29
+ return year >= 1 && year <= 9999;
30
+ };
31
+ /** A real day of years 1 to 9999, written `'2026-07-31'` (D-150). */
32
+ export function isDay(value) {
33
+ const match = typeof value === 'string' && /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
34
+ if (!match)
35
+ return false;
36
+ const [year = 0, month = 0, day = 0] = match.slice(1).map(Number);
37
+ const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
38
+ const days = month === 2 ? (leap ? 29 : 28) : [4, 6, 9, 11].includes(month) ? 30 : 31;
39
+ return year >= 1 && month >= 1 && month <= 12 && day >= 1 && day <= days;
40
+ }
41
+ /** JSON data whose strings and keys are clean (D-94). */
42
+ export function isJson(value) {
43
+ if (value === null || typeof value === 'boolean')
44
+ return true;
45
+ if (typeof value === 'string')
46
+ return clean(value);
47
+ if (typeof value === 'number')
48
+ return Number.isFinite(value);
49
+ if (Array.isArray(value))
50
+ return value.every(isJson);
51
+ if (!isObject(value) || Object.getPrototypeOf(value) !== Object.prototype) {
52
+ return false;
53
+ }
54
+ return Object.entries(value).every(([key, item]) => clean(key) && isJson(item));
55
+ }
56
+ export function unknownKey(path, model) {
57
+ return new InvalidQuery(path, `Unknown key '${path}' on ${model}.`);
58
+ }
59
+ export const integerRange = 'from -2,147,483,648 to 2,147,483,647';
60
+ /** Each scalar type's check, and its message when a value does not fit. */
61
+ const misfits = {
62
+ string: (value) => {
63
+ if (typeof value !== 'string')
64
+ return 'Expected a string.';
65
+ return clean(value)
66
+ ? undefined
67
+ : 'Expected a string without a NUL or a lone surrogate.';
68
+ },
69
+ number: (value, field) => {
70
+ if (field.integer !== true) {
71
+ return typeof value === 'number' && Number.isFinite(value)
72
+ ? undefined
73
+ : 'Expected a finite number.';
74
+ }
75
+ return isInteger(value)
76
+ ? undefined
77
+ : `Expected a whole number ${integerRange}.`;
78
+ },
79
+ decimal: decimalIssue,
80
+ boolean: (value) => typeof value === 'boolean' ? undefined : 'Expected a boolean.',
81
+ dateTime: (value) => storedDate(value) ? undefined : 'Expected a Date of years 1 to 9999.',
82
+ date: (value) => isDay(value) ? undefined : "Expected a day written '2026-07-31'.",
83
+ json: (value) => isJson(value)
84
+ ? undefined
85
+ : 'Expected JSON data, its strings without a NUL or a lone surrogate.',
86
+ enum: (value, field) => typeof value === 'string' && (field.values ?? []).includes(value)
87
+ ? undefined
88
+ : `Expected one of ${(field.values ?? []).join(', ')}.`,
89
+ };
90
+ /** The message of a value that does not fit `field`, if it does not. */
91
+ export const misfit = (value, field) => misfits[field.type](value, field);
@@ -0,0 +1,46 @@
1
+ import type { Condition, Filter, ScalarType } from './adapter.ts';
2
+ import type { FieldInfo, ModelInfo } from './schema.ts';
3
+ export type { Scalar, ScalarCheck } from './query-values.ts';
4
+ export { clean, entries, integerRange, isInteger, isJson, isObject, misfit, storedDate, unknownKey, } from './query-values.ts';
5
+ export type Models = ReadonlyMap<string, ModelInfo>;
6
+ /** The model, or the table, of `name`; another name is a kernel bug. */
7
+ export declare function modelOf<T>(models: ReadonlyMap<string, T>, name: string): T;
8
+ export declare const byId: (id: string) => Filter;
9
+ export declare const byIds: (ids: readonly string[]) => Filter;
10
+ /** What a query does with a field: a read rule refuses each (D-44, D-143, D-147). */
11
+ export type Verb = 'filters' | 'sorts' | 'aggregates' | 'compares';
12
+ /** What a caller other than Master may filter on and see (D-86). */
13
+ export type Scope = {
14
+ /** Fails on a field with a read rule (D-44). */
15
+ readonly check: (model: ModelInfo, field: string, path: string, verb: Verb) => void;
16
+ /** Whether the caller runs a field read rule on it (D-44). */
17
+ readonly ruled: (model: ModelInfo, field: string) => boolean;
18
+ /** A model's read filter; `undefined` when every row passes. */
19
+ readonly readable: (model: string) => Filter | undefined;
20
+ /**
21
+ * The rows a `many` relation reads: its filter (D-151) and its target's
22
+ * read filter; `undefined` when every row passes.
23
+ */
24
+ readonly related: (model: ModelInfo, field: Extract<FieldInfo, {
25
+ readonly kind: 'many';
26
+ }>) => Filter | undefined;
27
+ };
28
+ export declare const systemFields: readonly string[];
29
+ /**
30
+ * The operands of a value other than the field's, as an aggregate's in a
31
+ * `having` (D-149): their type, and their check, which stores each.
32
+ */
33
+ export type Operand = {
34
+ readonly type: ScalarType;
35
+ readonly check: (item: unknown, at: string) => unknown;
36
+ };
37
+ /** A scalar field's condition, or with `operand` another value's of it. */
38
+ export declare function fieldCondition(model: ModelInfo, name: string, value: unknown, path: string, operand?: Operand): Condition | undefined;
39
+ /**
40
+ * A `where` of `model`, normalized; `path` names it in errors. With a
41
+ * `scope`, relation filters see readable rows only (D-86). Only a
42
+ * `beforeFind`'s, `stored`, filters a plugin field, in its stored form
43
+ * (D-122).
44
+ */
45
+ export declare function normalizeWhere(models: Models, model: ModelInfo, where: unknown, path: string, scope?: Scope, stored?: boolean): Filter;
46
+ //# sourceMappingURL=query-where.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-where.d.ts","sourceRoot":"","sources":["../src/query-where.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGjE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAcvD,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EACN,KAAK,EACL,OAAO,EACP,YAAY,EACZ,SAAS,EACT,MAAM,EACN,QAAQ,EACR,MAAM,EACN,UAAU,EACV,UAAU,GACV,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAEnD,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAI1E;AAED,eAAO,MAAM,IAAI,OAAQ,MAAM,KAAG,MAAkC,CAAA;AACpE,eAAO,MAAM,KAAK,QAAS,SAAS,MAAM,EAAE,KAAG,MAA+B,CAAA;AAE9E,qFAAqF;AACrF,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,CAAA;AAElE,oEAAoE;AACpE,MAAM,MAAM,KAAK,GAAG;IACnB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,CACf,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,KACN,IAAI,CAAA;IACT,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IAC5D,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IACxD;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,CACjB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,KAChD,MAAM,GAAG,SAAS,CAAA;CACvB,CAAA;AAQD,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAAuB,CAAA;AAkCjE;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAA;CACtD,CAAA;AAqDD,2EAA2E;AAC3E,wBAAgB,cAAc,CAC7B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,OAAO,GACf,SAAS,GAAG,SAAS,CAIvB;AAuED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC7B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,KAAK,EACb,MAAM,UAAQ,GACZ,MAAM,CAmDR"}