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
package/dist/memory.js ADDED
@@ -0,0 +1,157 @@
1
+ import { feedFields, feedIds } from './adapter.js';
2
+ import { Draft } from './memory-draft.js';
3
+ import { clone } from './memory-read.js';
4
+ /** The reads of the draft `get` gives, each a tick later, as a database's. */
5
+ function readsOf(get) {
6
+ const later = async (read) => {
7
+ await Promise.resolve();
8
+ return read(get());
9
+ };
10
+ return {
11
+ find: async (read) => later((draft) => draft.find(read)),
12
+ count: async (read) => later((draft) => draft.count(read)),
13
+ aggregate: async (read) => later((draft) => draft.aggregate(read)),
14
+ };
15
+ }
16
+ /**
17
+ * `changes` as the feed gives them: one entry for the same rows' changes,
18
+ * without the lists past its limits (D-154).
19
+ */
20
+ function fed(changes) {
21
+ const entries = new Map();
22
+ for (const change of changes) {
23
+ const linked = 'field' in change;
24
+ const key = JSON.stringify([
25
+ change.kind,
26
+ change.model,
27
+ linked ? change.field : change.fields,
28
+ ]);
29
+ const entry = entries.get(key) ?? { change, ids: [], pairs: [] };
30
+ if (linked)
31
+ entry.pairs.push(...(change.pairs ?? []));
32
+ else
33
+ entry.ids.push(...(change.ids ?? []));
34
+ entries.set(key, entry);
35
+ }
36
+ return [...entries.values()].map(({ change, ids, pairs }) => {
37
+ if ('field' in change) {
38
+ const { kind, model, field } = change;
39
+ const listed = pairs.length > feedIds ? {} : { pairs };
40
+ return { kind, model, field, ...listed };
41
+ }
42
+ const { kind, model, fields } = change;
43
+ const listed = ids.length > feedIds ? {} : { ids };
44
+ const some = fields !== undefined && JSON.stringify(fields).length <= feedFields;
45
+ return { kind, model, ...listed, ...(some ? { fields } : {}) };
46
+ });
47
+ }
48
+ /** The in-memory adapter (D-02); its state lives as long as the value. */
49
+ export function memory() {
50
+ let schema;
51
+ let fields = new Map();
52
+ let store = { tables: new Map(), joins: new Map() };
53
+ let lock = Promise.resolve();
54
+ let feed;
55
+ // After the commit, as a database's notifications come.
56
+ const deliver = (changes) => {
57
+ const to = feed;
58
+ if (to === undefined || changes.length === 0)
59
+ return;
60
+ setImmediate(() => to.changed(fed(changes)));
61
+ };
62
+ const draft = (from) => {
63
+ if (schema === undefined)
64
+ throw new Error('memory() is not started.');
65
+ return new Draft(from, fields, schema);
66
+ };
67
+ // Writes queue behind each other and behind an open transaction.
68
+ const acquire = async () => {
69
+ const previous = lock;
70
+ const { promise, resolve } = Promise.withResolvers();
71
+ lock = promise;
72
+ await previous;
73
+ return resolve;
74
+ };
75
+ return {
76
+ start: async (started, _logger, given) => {
77
+ schema = started;
78
+ feed = given;
79
+ fields = new Map(started.models.map((model) => [
80
+ model.name,
81
+ new Map(model.fields.map((field) => [field.name, field])),
82
+ ]));
83
+ store = {
84
+ tables: new Map(started.models.map((model) => [
85
+ model.name,
86
+ new Map(),
87
+ ])),
88
+ joins: new Map(),
89
+ };
90
+ await Promise.resolve();
91
+ },
92
+ stop: async () => {
93
+ await lock;
94
+ },
95
+ ...readsOf(() => draft(store)),
96
+ write: async (write) => {
97
+ const release = await acquire();
98
+ try {
99
+ const next = clone(store);
100
+ const writing = draft(next);
101
+ const rows = writing.write(write);
102
+ store = next;
103
+ deliver(writing.changed);
104
+ return rows;
105
+ }
106
+ finally {
107
+ release();
108
+ }
109
+ },
110
+ begin: async () => {
111
+ const release = await acquire();
112
+ const next = clone(store);
113
+ const changed = [];
114
+ let open = true;
115
+ const active = () => {
116
+ if (!open)
117
+ throw new Error('The transaction has ended.');
118
+ return draft(next);
119
+ };
120
+ const end = () => {
121
+ open = false;
122
+ release();
123
+ };
124
+ return {
125
+ ...readsOf(active),
126
+ write: async (write) => {
127
+ await Promise.resolve();
128
+ active();
129
+ // A failed write leaves the transaction as it was.
130
+ const attempt = clone(next);
131
+ const writing = draft(attempt);
132
+ const rows = writing.write(write);
133
+ changed.push(...writing.changed);
134
+ next.tables.clear();
135
+ next.joins.clear();
136
+ for (const [name, table] of attempt.tables)
137
+ next.tables.set(name, table);
138
+ for (const [name, side] of attempt.joins)
139
+ next.joins.set(name, side);
140
+ return rows;
141
+ },
142
+ commit: async () => {
143
+ active();
144
+ store = next;
145
+ end();
146
+ deliver(changed);
147
+ await Promise.resolve();
148
+ },
149
+ rollback: async () => {
150
+ active();
151
+ end();
152
+ await Promise.resolve();
153
+ },
154
+ };
155
+ },
156
+ };
157
+ }
@@ -0,0 +1,22 @@
1
+ import type { Adapter, Migrations, Schema, Statement } from './adapter.ts';
2
+ import type { Logger } from './app-options.ts';
3
+ /** The SHA-256 of a snapshot's canonical JSON. */
4
+ export declare function hashOf(snapshot: unknown): string;
5
+ /** The database's `migrations`, or a refusal naming what has none. */
6
+ export declare function migrationsOf(database: Adapter): Migrations;
7
+ /** What to do about a table another session held too long. */
8
+ export declare const held = "End that session's open transaction, in a database tool perhaps, then try again.";
9
+ /**
10
+ * Brings a development database to the models, refusing what loses data
11
+ * unless `force`, and logs what changed. Returns the statements it ran, or
12
+ * none when the database already matched.
13
+ */
14
+ export declare function synced(database: Adapter, schema: Schema, logger: Logger, force: boolean): Promise<readonly Statement[] | undefined>;
15
+ /**
16
+ * Refuses a production database whose snapshot is not the models', unless
17
+ * a deploy applied migrations after them: the code was rolled back.
18
+ */
19
+ export declare function checked(database: Adapter, schema: Schema, logger: Logger): Promise<void>;
20
+ /** What a database whose migrations follow the models' says. */
21
+ export declare const ahead: (later: readonly string[]) => string;
22
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAa9C,kDAAkD;AAClD,wBAAgB,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAIhD;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,CAO1D;AAoBD,8DAA8D;AAC9D,eAAO,MAAM,IAAI,qFACkE,CAAA;AAyBnF;;;;GAIG;AACH,wBAAsB,MAAM,CAC3B,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACZ,OAAO,CAAC,SAAS,SAAS,EAAE,GAAG,SAAS,CAAC,CA+B3C;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC5B,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,gEAAgE;AAChE,eAAO,MAAM,KAAK,UAAW,SAAS,MAAM,EAAE,KAAG,MACqE,CAAA"}
@@ -0,0 +1,131 @@
1
+ // Development sync and the production check (D-105): the models' snapshot
2
+ // against the database's, through the adapter's `migrations`.
3
+ import { createHash } from 'node:crypto';
4
+ import { MigrationFailed } from './adapter.js';
5
+ import { Refused } from './errors.js';
6
+ /** The value with its keys sorted, so equal snapshots serialize alike. */
7
+ function canonical(value) {
8
+ if (Array.isArray(value))
9
+ return value.map(canonical);
10
+ if (typeof value !== 'object' || value === null)
11
+ return value;
12
+ const keys = Object.keys(value).toSorted();
13
+ return Object.fromEntries(keys.map((key) => [key, canonical(Reflect.get(value, key))]));
14
+ }
15
+ /** The SHA-256 of a snapshot's canonical JSON. */
16
+ export function hashOf(snapshot) {
17
+ return createHash('sha256')
18
+ .update(JSON.stringify(canonical(snapshot)))
19
+ .digest('hex');
20
+ }
21
+ /** The database's `migrations`, or a refusal naming what has none. */
22
+ export function migrationsOf(database) {
23
+ if (database.migrations === undefined) {
24
+ throw new Refused('This database starts empty every time: it has no tables to migrate.');
25
+ }
26
+ return database.migrations;
27
+ }
28
+ function refusal(losing) {
29
+ const models = [...new Set(losing.map((statement) => statement.model))];
30
+ const why = losing.map((statement) => statement.loses).join('; ');
31
+ return [
32
+ `UltimaBase did not sync ${models.join(', ')}: ${why}.`,
33
+ ...losing.flatMap(({ sql, rename }) => [
34
+ ...(rename === undefined
35
+ ? []
36
+ : [
37
+ ` -- a rename? keep its data: give ${rename.to} dbName: '${rename.dbName}'.`,
38
+ ]),
39
+ ` ${sql};`,
40
+ ]),
41
+ 'Run `npx ultimabase sync --force` to apply it to this development database,',
42
+ 'or `npx ultimabase migrate create <name>` to write it as a migration.',
43
+ ].join('\n');
44
+ }
45
+ /** What to do about a table another session held too long. */
46
+ export const held = "End that session's open transaction, in a database tool perhaps, then try again.";
47
+ /** Why a tried statement failed, and how to fix the rows. */
48
+ function failure(statements, { at, reason, locked }) {
49
+ const statement = statements.find((given) => given.sql === at);
50
+ const model = statement?.model ?? 'the models';
51
+ const why = locked
52
+ ? 'another session held its table'
53
+ : (statement?.tries ?? 'the database refused it');
54
+ return [
55
+ `UltimaBase did not sync ${model}: ${why}.`,
56
+ ` ${at};`,
57
+ ` -- ${reason}`,
58
+ ...(locked
59
+ ? [held]
60
+ : [
61
+ 'Fix those rows in this development database, or rebuild it from the migrations with `npx ultimabase reset`.',
62
+ 'In production, a migration fixes them: write it with `npx ultimabase migrate create <name>`.',
63
+ ]),
64
+ ].join('\n');
65
+ }
66
+ /**
67
+ * Brings a development database to the models, refusing what loses data
68
+ * unless `force`, and logs what changed. Returns the statements it ran, or
69
+ * none when the database already matched.
70
+ */
71
+ export async function synced(database, schema, logger, force) {
72
+ const migrations = database.migrations;
73
+ if (migrations === undefined)
74
+ return undefined;
75
+ const stored = await migrations.stored();
76
+ const from = stored?.snapshot;
77
+ const to = migrations.snapshot(schema);
78
+ if (from !== undefined && hashOf(from) === hashOf(to))
79
+ return undefined;
80
+ const statements = migrations.plan(from, schema);
81
+ const losing = statements.filter((statement) => statement.loses !== undefined);
82
+ if (losing.length > 0 && !force)
83
+ throw new Refused(refusal(losing));
84
+ try {
85
+ await migrations.apply({ kind: 'sync', from, statements, to });
86
+ }
87
+ catch (error) {
88
+ if (error instanceof MigrationFailed) {
89
+ throw new Refused(failure(statements, error));
90
+ }
91
+ throw error;
92
+ }
93
+ if (from === undefined) {
94
+ logger.info("Created the database's tables.");
95
+ return statements;
96
+ }
97
+ if (statements.length === 0) {
98
+ logger.info("Synced the models' names: no table changed.");
99
+ }
100
+ const changes = Map.groupBy(statements, (statement) => statement.model);
101
+ for (const [model, made] of changes) {
102
+ const does = made.map((statement) => statement.does).join(', ');
103
+ logger.info(`Synced ${model}: ${does}.`);
104
+ }
105
+ return statements;
106
+ }
107
+ /**
108
+ * Refuses a production database whose snapshot is not the models', unless
109
+ * a deploy applied migrations after them: the code was rolled back.
110
+ */
111
+ export async function checked(database, schema, logger) {
112
+ const migrations = database.migrations;
113
+ if (migrations === undefined)
114
+ return;
115
+ const stored = await migrations.stored();
116
+ const deploy = 'run `npx ultimabase migrate deploy`, then start again.';
117
+ if (stored?.snapshot === undefined) {
118
+ throw new Refused(`The database has no UltimaBase schema: ${deploy}`);
119
+ }
120
+ const hash = hashOf(migrations.snapshot(schema));
121
+ if (hashOf(stored.snapshot) === hash)
122
+ return;
123
+ const at = stored.applied.findIndex((file) => file.schema === hash);
124
+ const later = stored.applied.slice(at + 1).map((file) => file.name);
125
+ if (at === -1 || later.length === 0) {
126
+ throw new Refused(`The database's tables are not the models': ${deploy}`);
127
+ }
128
+ logger.warn(ahead(later));
129
+ }
130
+ /** What a database whose migrations follow the models' says. */
131
+ export const ahead = (later) => `The database is ahead of the models: ${later.join(', ')} ${later.length === 1 ? 'was' : 'were'} applied after them.`;
@@ -0,0 +1,239 @@
1
+ import type { Nullable } from './function.ts';
2
+ import type { FindWhere, Queries, Where } from './query.ts';
3
+ import type { CreateData, RecordOf, StoredRecord, TargetFields, UpdateData } from './record.ts';
4
+ import type { Caller } from './rules.ts';
5
+ import type { VirtualRules } from './virtual.ts';
6
+ import type { declaredRecord, fieldType, modelFields, readFilter } from './symbols.ts';
7
+ type ReadFacts = {
8
+ readonly caller: Caller;
9
+ readonly operation: 'read';
10
+ };
11
+ type CreateFacts<F, N extends string> = {
12
+ readonly caller: Caller;
13
+ readonly operation: 'create';
14
+ readonly value: CreateData<F, N>;
15
+ };
16
+ type UpdateFacts<F, N extends string> = {
17
+ readonly caller: Caller;
18
+ readonly operation: 'update';
19
+ readonly record: StoredRecord<F, N>;
20
+ readonly value: UpdateData<F, N, false>;
21
+ };
22
+ type DeleteFacts<F, N extends string> = {
23
+ readonly caller: Caller;
24
+ readonly operation: 'delete';
25
+ readonly record: StoredRecord<F, N>;
26
+ };
27
+ /** A read filter; only the `where` a read rule receives builds one (D-10). */
28
+ type ReadFilter = {
29
+ readonly [readFilter]: true;
30
+ };
31
+ /**
32
+ * A model read rule cannot see the record: it may return a filter (D-10).
33
+ * TypeScript never checks a returned object for unknown keys, but it checks
34
+ * an argument: `where({ ... })` refuses a misspelled key on its line.
35
+ */
36
+ type ReadRule<F> = (facts: ReadFacts & {
37
+ readonly where: (filter: Where<F>) => ReadFilter;
38
+ }) => boolean | ReadFilter;
39
+ /** One rule, or one rule per operation; `write` covers the three writes. */
40
+ export type ModelAccess<F, N extends string> = ((facts: ReadFacts | CreateFacts<F, N> | UpdateFacts<F, N> | DeleteFacts<F, N>) => boolean) | {
41
+ readonly read?: ReadRule<F>;
42
+ readonly create?: (facts: CreateFacts<F, N>) => boolean;
43
+ readonly update?: (facts: UpdateFacts<F, N>) => boolean;
44
+ readonly delete?: (facts: DeleteFacts<F, N>) => boolean;
45
+ readonly write?: (facts: CreateFacts<F, N> | UpdateFacts<F, N> | DeleteFacts<F, N>) => boolean;
46
+ };
47
+ type Hook<Facts> = (facts: Facts & {
48
+ readonly caller: Caller;
49
+ }) => void | Promise<void>;
50
+ type RecordHook<F, N extends string> = Hook<{
51
+ readonly record: StoredRecord<F, N>;
52
+ }>;
53
+ type UpdatedHook<F, N extends string> = Hook<{
54
+ readonly record: StoredRecord<F, N>;
55
+ readonly previous: StoredRecord<F, N>;
56
+ }>;
57
+ /** The data a `before*` hook changes in place (D-71). */
58
+ type Draft<D> = {
59
+ -readonly [K in keyof D]: D[K];
60
+ };
61
+ /**
62
+ * What the rows a `beforeFind` narrows are for: an update or a delete of the
63
+ * rows a write targets, a read everywhere else (D-124).
64
+ */
65
+ export type FindOperation = 'read' | 'update' | 'delete';
66
+ /** The fixed hooks of D-15, written by the application (D-43, D-71). */
67
+ export type ModelHooks<F, N extends string = string> = {
68
+ /**
69
+ * Narrows every read of the model, at every level, Master included;
70
+ * `operation` says whether the rows are read or written (D-124).
71
+ */
72
+ readonly beforeFind?: (facts: {
73
+ readonly caller: Caller;
74
+ readonly operation: FindOperation;
75
+ readonly where: (filter: FindWhere<F>) => ReadFilter;
76
+ }) => ReadFilter | void | Promise<ReadFilter | void>;
77
+ readonly beforeCreate?: Hook<{
78
+ readonly data: Draft<CreateData<F, N>>;
79
+ }>;
80
+ readonly beforeUpdate?: Hook<{
81
+ readonly record: StoredRecord<F, N>;
82
+ readonly data: Draft<UpdateData<F, N, false>>;
83
+ }>;
84
+ readonly beforeDelete?: RecordHook<F, N>;
85
+ readonly afterCreate?: RecordHook<F, N>;
86
+ readonly afterUpdate?: UpdatedHook<F, N>;
87
+ readonly afterDelete?: RecordHook<F, N>;
88
+ readonly afterCreateCommit?: RecordHook<F, N>;
89
+ readonly afterUpdateCommit?: UpdatedHook<F, N>;
90
+ readonly afterDeleteCommit?: RecordHook<F, N>;
91
+ };
92
+ /**
93
+ * What a `many` relation's reads see, Master's too (D-151): a function
94
+ * shaped like a read rule, typed from the target.
95
+ */
96
+ type RelationFilter<T> = {
97
+ readonly where: (facts: {
98
+ readonly caller: Caller;
99
+ readonly where: (filter: Where<T>) => ReadFilter;
100
+ }) => boolean | ReadFilter;
101
+ };
102
+ /** A filter for each `many` relation that has one (D-151). */
103
+ export type RelationFilters<F> = {
104
+ readonly [K in keyof F as F[K] extends {
105
+ readonly [fieldType]: {
106
+ readonly kind: 'many';
107
+ };
108
+ } ? K : never]?: F[K] extends {
109
+ readonly [fieldType]: {
110
+ readonly target: infer T;
111
+ };
112
+ } ? RelationFilter<TargetFields<T>> : never;
113
+ };
114
+ /** The kernel's keys; `W` holds one key per plugin (D-42, D-151). */
115
+ export type ModelWith<F, W, N extends string> = {
116
+ readonly access?: ModelAccess<F, N>;
117
+ readonly hooks?: ModelHooks<F, N>;
118
+ readonly relations?: RelationFilters<F>;
119
+ readonly virtuals?: VirtualRules<F>;
120
+ } & W;
121
+ /** `X` lists the fields of each unique index (D-52). */
122
+ export interface Model<N extends string, F, P, W, X = never> extends Queries<F, X, N> {
123
+ readonly name: N;
124
+ readonly [modelFields]: F;
125
+ /** The plugins it uses, checked against the application's (D-24). */
126
+ readonly plugins?: P;
127
+ with(rules: ModelWith<F, W, N>): this;
128
+ /** The model, or `null`, as a function's output (D-109). */
129
+ nullable(): Nullable<this>;
130
+ }
131
+ export type FieldShape = {
132
+ readonly [fieldType]: {
133
+ readonly kind: 'scalar' | 'one' | 'many' | 'virtual';
134
+ readonly options: object;
135
+ };
136
+ };
137
+ type Same<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => (T extends B ? 1 : 2) ? true : false;
138
+ type Exact<V> = (value: V) => V;
139
+ type Expected<D, F> = {
140
+ readonly [P in keyof D]-?: P extends keyof RecordOf<F> ? Same<D[P], Exact<RecordOf<F>[P]>> extends true ? D[P] : D[P] extends Exact<RecordOf<F>[P]> ? `'${P & string}' does not have the model's exact type` : Exact<RecordOf<F>[P]> : `'${P & string}' is not a scalar field of the model`;
141
+ };
142
+ export type RecordCheck<F> = {
143
+ readonly [K in keyof F]: F[K] extends {
144
+ readonly [declaredRecord]: infer D;
145
+ } ? {
146
+ readonly [declaredRecord]: Expected<D, F>;
147
+ } : unknown;
148
+ };
149
+ /**
150
+ * The plugins that provide the model's field types (D-32). Without
151
+ * `exactOptionalPropertyTypes`, a field no plugin provides reads `undefined`.
152
+ */
153
+ export type FieldTypePlugins<F> = {
154
+ [K in keyof F]: F[K] extends {
155
+ readonly [fieldType]: {
156
+ readonly plugin?: infer P;
157
+ };
158
+ } ? P extends string ? P : never : never;
159
+ }[keyof F];
160
+ /** An index of `defineModel`, over one or several fields (D-52). */
161
+ export type IndexShape = {
162
+ readonly fields: readonly string[];
163
+ readonly unique?: boolean;
164
+ /** A trigram index, for `contains` and `mode: 'insensitive'` (D-141). */
165
+ readonly contains?: true;
166
+ };
167
+ /** The fields of each unique index. */
168
+ export type UniqueIndexFields<X> = X extends readonly (infer I)[] ? I extends {
169
+ readonly unique: true;
170
+ readonly fields: infer K;
171
+ } ? K : never : never;
172
+ type IndexableKeys<F> = {
173
+ [K in keyof F]: F[K] extends {
174
+ readonly [fieldType]: {
175
+ readonly kind: 'scalar' | 'one';
176
+ };
177
+ } ? K : never;
178
+ }[keyof F];
179
+ type TextKeys<F> = {
180
+ [K in keyof F]: F[K] extends {
181
+ readonly [fieldType]: {
182
+ readonly kind: 'scalar';
183
+ readonly value: infer V;
184
+ };
185
+ } ? [V] extends [string] ? string extends V ? K : never : never : never;
186
+ }[keyof F];
187
+ type ContainsCheck<I, F> = I extends {
188
+ readonly contains: true;
189
+ } ? I extends {
190
+ readonly fields: readonly [TextKeys<F>];
191
+ readonly unique?: false | undefined;
192
+ } ? unknown : {
193
+ readonly contains: 'a contains index covers one string field that is not a list, and is not unique';
194
+ } : unknown;
195
+ type NotIndexable<I, F> = I extends {
196
+ readonly fields: readonly (infer K)[];
197
+ } ? Exclude<K, IndexableKeys<F>> : never;
198
+ /**
199
+ * Each index names fields of the model. TypeScript first checks the call
200
+ * before reading `fields`, while `F` is still any field name: the check
201
+ * waits for the real fields.
202
+ */
203
+ export type IndexCheck<X, F> = string extends keyof F ? unknown : {
204
+ readonly [I in keyof X]: ([NotIndexable<X[I], F>] extends [never] ? unknown : {
205
+ readonly fields: `'${NotIndexable<X[I], F> & string}' is not a scalar field or a one relation of the model`;
206
+ }) & ContainsCheck<X[I], F>;
207
+ };
208
+ export type ModelShape = {
209
+ readonly name: string;
210
+ readonly [modelFields]: object;
211
+ };
212
+ type InverseErrors<N extends string, F> = {
213
+ [K in keyof F]: F[K] extends {
214
+ readonly [fieldType]: {
215
+ readonly target: infer T;
216
+ readonly options: {
217
+ readonly inverse: infer I extends string;
218
+ };
219
+ };
220
+ } ? I extends keyof TargetFields<T> ? never : `${N}.${K & string}: inverse '${I}' is not a field of the target` : never;
221
+ }[keyof F];
222
+ type AppInverseErrors<M> = {
223
+ [I in keyof M]: M[I] extends {
224
+ readonly name: infer N extends string;
225
+ readonly [modelFields]: infer F;
226
+ } ? InverseErrors<N, F> : never;
227
+ }[number & keyof M];
228
+ /** Checked on the whole options object, as `ModelCheck` is. */
229
+ export type InverseCheck<M> = [AppInverseErrors<M>] extends [never] ? unknown : {
230
+ readonly inverseError: AppInverseErrors<M>;
231
+ };
232
+ /** The application `defineApp` returns (D-24, D-59). */
233
+ export interface App<M> {
234
+ readonly models: M;
235
+ start(): Promise<void>;
236
+ stop(): Promise<void>;
237
+ }
238
+ export {};
239
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
package/dist/model.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,64 @@
1
+ import type { Row } from './adapter.ts';
2
+ import type { FieldInfo, ModelInfo } from './schema.ts';
3
+ import type { QueryScope } from './scope.ts';
4
+ import type { Draft } from './write-data.ts';
5
+ import type { Reads } from './write-plan.ts';
6
+ type At = readonly (string | number)[];
7
+ /** The row whose relation is written, and where its data sits (D-128). */
8
+ export type Resolving = {
9
+ readonly scope: QueryScope;
10
+ readonly reads: Reads;
11
+ readonly model: ModelInfo;
12
+ readonly id: string;
13
+ readonly creating: boolean;
14
+ /** A default's or a hook's value, which skips access rules (D-67). */
15
+ readonly trusted: boolean;
16
+ readonly at: At;
17
+ };
18
+ /** A `one` relation write, resolved. */
19
+ export type One = {
20
+ readonly kind: 'connect';
21
+ readonly id: string;
22
+ } | {
23
+ readonly kind: 'create';
24
+ readonly data: Draft;
25
+ readonly at: At;
26
+ } | {
27
+ readonly kind: 'update';
28
+ readonly data: Draft;
29
+ readonly row: Row;
30
+ } | {
31
+ readonly kind: 'delete';
32
+ readonly row: Row;
33
+ } | {
34
+ readonly kind: 'disconnect';
35
+ };
36
+ /** A `many` relation write, resolved. */
37
+ export type Many = {
38
+ readonly connect: readonly string[];
39
+ readonly disconnect: readonly string[];
40
+ readonly create: readonly {
41
+ readonly data: Draft;
42
+ readonly at: At;
43
+ }[];
44
+ readonly update: readonly {
45
+ readonly data: Draft;
46
+ readonly row: Row;
47
+ }[];
48
+ readonly delete: readonly {
49
+ readonly row: Row;
50
+ readonly path: string;
51
+ }[];
52
+ };
53
+ /** Whether a relation value of `draft` needs resolving or reaches a row. */
54
+ export declare const nests: (model: ModelInfo, draft: Draft) => boolean;
55
+ export declare function resolveOne(r: Resolving, field: Extract<FieldInfo, {
56
+ readonly kind: 'one';
57
+ }>, value: unknown): Promise<One>;
58
+ export declare function resolveMany(r: Resolving, field: Extract<FieldInfo, {
59
+ readonly kind: 'many';
60
+ }>, value: unknown): Promise<Many>;
61
+ /** Resolves each relation value of `draft` in place, before the rules. */
62
+ export declare function resolveData(r: Resolving, draft: Draft): Promise<void>;
63
+ export {};
64
+ //# sourceMappingURL=nested-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nested-write.d.ts","sourceRoot":"","sources":["../src/nested-write.ts"],"names":[],"mappings":"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"}