@primate/core 0.4.6 → 0.6.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 (556) hide show
  1. package/lib/private/App.d.ts +771 -6
  2. package/lib/private/App.js +49 -16
  3. package/lib/private/Binder.d.ts +2 -2
  4. package/lib/private/Flags.d.ts +8 -4
  5. package/lib/private/Module.d.ts +4 -16
  6. package/lib/private/Module.js +1 -17
  7. package/lib/private/app/EnvSchema.d.ts +5 -0
  8. package/lib/private/app/EnvSchema.js +2 -0
  9. package/lib/private/app/Facade.browser.d.ts +11 -0
  10. package/lib/private/app/Facade.browser.js +19 -0
  11. package/lib/private/app/Facade.d.ts +811 -0
  12. package/lib/private/app/Facade.js +56 -0
  13. package/lib/private/asset/Asset.d.ts +1 -1
  14. package/lib/private/build/App.d.ts +2 -2
  15. package/lib/private/build/App.js +0 -2
  16. package/lib/private/build/client/index.js +19 -10
  17. package/lib/private/build/client/plugin/app-request.d.ts +4 -0
  18. package/lib/private/build/client/plugin/app-request.js +19 -0
  19. package/lib/private/build/client/plugin/view.d.ts +4 -0
  20. package/lib/private/build/client/plugin/view.js +13 -0
  21. package/lib/private/build/hook.d.ts +1 -2
  22. package/lib/private/build/hook.js +25 -19
  23. package/lib/private/build/index.d.ts +2 -1
  24. package/lib/private/build/index.js +27 -27
  25. package/lib/private/build/presets.d.ts +10 -0
  26. package/lib/private/build/presets.js +39 -0
  27. package/lib/private/build/server/index.js +10 -14
  28. package/lib/private/build/server/plugin/app-request.d.ts +4 -0
  29. package/lib/private/build/server/plugin/app-request.js +19 -0
  30. package/lib/private/build/server/plugin/assets.js +9 -7
  31. package/lib/private/build/server/plugin/config.js +11 -4
  32. package/lib/private/build/server/plugin/frontend.js +4 -2
  33. package/lib/private/build/server/plugin/live-reload.d.ts +4 -0
  34. package/lib/private/build/server/plugin/{hot-reload.js → live-reload.js} +12 -12
  35. package/lib/private/build/server/plugin/native-addons.js +10 -11
  36. package/lib/private/build/server/plugin/node-imports.js +2 -2
  37. package/lib/private/build/server/plugin/route.js +4 -4
  38. package/lib/private/build/server/plugin/store.js +11 -33
  39. package/lib/private/build/server/plugin/stores.js +12 -9
  40. package/lib/private/build/server/plugin/view.js +5 -5
  41. package/lib/private/build/server/plugin/views.js +4 -4
  42. package/lib/private/build/server/plugin/virtual-pages.js +8 -8
  43. package/lib/private/build/server/plugin/virtual-routes.js +8 -13
  44. package/lib/private/build/server/plugin/wasm.js +2 -3
  45. package/lib/private/build/shared/plugin/app-request.d.ts +4 -0
  46. package/lib/private/build/shared/plugin/app-request.js +19 -0
  47. package/lib/private/bye.js +2 -3
  48. package/lib/private/client/Data.d.ts +3 -2
  49. package/lib/private/client/Render.d.ts +8 -0
  50. package/lib/private/{frontend → client}/ServerData.d.ts +1 -1
  51. package/lib/private/client/ServerView.d.ts +4 -0
  52. package/lib/private/client/ValidateInit.d.ts +1 -3
  53. package/lib/private/client/ValidationError.d.ts +1 -1
  54. package/lib/private/{frontend → client}/View.d.ts +1 -1
  55. package/lib/private/{frontend → client}/ViewOptions.d.ts +1 -1
  56. package/lib/private/{frontend → client}/ViewResponse.d.ts +2 -2
  57. package/lib/private/client/app.js +3 -3
  58. package/lib/private/client/boot.d.ts +5 -0
  59. package/lib/private/client/boot.js +64 -0
  60. package/lib/private/client/create-form.d.ts +32 -0
  61. package/lib/private/client/create-form.js +123 -0
  62. package/lib/private/client/extract-issues.d.ts +4 -0
  63. package/lib/private/client/extract-issues.js +21 -0
  64. package/lib/private/client/http.d.ts +13 -0
  65. package/lib/private/client/http.js +57 -0
  66. package/lib/private/client/index.d.ts +23 -0
  67. package/lib/private/client/index.js +16 -0
  68. package/lib/private/client/navigate.d.ts +13 -0
  69. package/lib/private/client/navigate.js +67 -0
  70. package/lib/private/client/root.d.ts +9 -0
  71. package/lib/private/client/root.js +11 -0
  72. package/lib/private/client/submit.d.ts +2 -0
  73. package/lib/private/client/submit.js +41 -0
  74. package/lib/private/client/{toValidated.d.ts → to-validated.d.ts} +2 -4
  75. package/lib/private/client/{toValidated.js → to-validated.js} +1 -1
  76. package/lib/private/client/validate-field.d.ts +3 -0
  77. package/lib/private/client/validate-field.js +41 -0
  78. package/lib/private/config/index.d.ts +7 -21
  79. package/lib/private/config/index.js +4 -1
  80. package/lib/private/config/schema.d.ts +82 -22
  81. package/lib/private/config/schema.js +25 -7
  82. package/lib/private/cookie.d.ts +12 -6
  83. package/lib/private/cookie.js +10 -14
  84. package/lib/private/db/As.d.ts +10 -0
  85. package/lib/private/db/DB.d.ts +49 -0
  86. package/lib/private/db/DB.js +3 -0
  87. package/lib/private/db/DataDict.d.ts +5 -0
  88. package/lib/private/db/DataKey.d.ts +4 -0
  89. package/lib/private/db/DataValue.d.ts +17 -0
  90. package/lib/private/db/MemoryDB.d.ts +33 -0
  91. package/lib/private/db/MemoryDB.js +335 -0
  92. package/lib/private/db/PK.d.ts +3 -0
  93. package/lib/private/db/PK.js +2 -0
  94. package/lib/private/{database → db}/Query.d.ts +2 -2
  95. package/lib/private/{database → db}/QueryBuilder.d.ts +2 -3
  96. package/lib/private/db/ReadArgs.d.ts +9 -0
  97. package/lib/private/db/ReadArgs.js +2 -0
  98. package/lib/private/db/ReadRelationsArgs.d.ts +6 -0
  99. package/lib/private/db/ReadRelationsArgs.js +2 -0
  100. package/lib/private/{database → db}/Schema.d.ts +1 -2
  101. package/lib/private/db/Sort.d.ts +4 -0
  102. package/lib/private/{database → db}/TypeMap.d.ts +2 -3
  103. package/lib/private/{database → db}/Types.d.ts +1 -1
  104. package/lib/private/db/With.d.ts +16 -0
  105. package/lib/private/db/With.js +2 -0
  106. package/lib/private/db/common.d.ts +25 -0
  107. package/lib/private/db/common.js +67 -0
  108. package/lib/private/db/errors.d.ts +104 -0
  109. package/lib/private/db/errors.js +237 -0
  110. package/lib/private/db/migrate/apply.d.ts +2 -0
  111. package/lib/private/db/migrate/apply.js +32 -0
  112. package/lib/private/db/migrate/bundle.d.ts +3 -0
  113. package/lib/private/db/migrate/bundle.js +22 -0
  114. package/lib/private/db/migrate/create.d.ts +2 -0
  115. package/lib/private/db/migrate/create.js +154 -0
  116. package/lib/private/db/migrate/index.d.ts +10 -0
  117. package/lib/private/db/migrate/index.js +6 -0
  118. package/lib/private/db/migrate/status.d.ts +2 -0
  119. package/lib/private/db/migrate/status.js +38 -0
  120. package/lib/private/db/migrate/store.d.ts +5 -0
  121. package/lib/private/db/migrate/store.js +33 -0
  122. package/lib/private/db/sql.d.ts +28 -0
  123. package/lib/private/db/sql.js +177 -0
  124. package/lib/private/db/storage.d.ts +3 -0
  125. package/lib/private/db/storage.js +3 -0
  126. package/lib/private/db/symbol.js +2 -0
  127. package/lib/private/db/test.d.ts +4 -0
  128. package/lib/private/db/test.js +1750 -0
  129. package/lib/private/errors.d.ts +88 -0
  130. package/lib/private/errors.js +211 -0
  131. package/lib/private/frontend.d.ts +72 -0
  132. package/lib/private/frontend.js +245 -0
  133. package/lib/private/hash.js +0 -1
  134. package/lib/private/i18n/Catalog.d.ts +5 -2
  135. package/lib/private/i18n/Formatter.js +21 -9
  136. package/lib/private/i18n/errors.d.ts +16 -0
  137. package/lib/private/i18n/errors.js +27 -0
  138. package/lib/private/i18n/format.d.ts +4 -0
  139. package/lib/private/i18n/format.js +95 -0
  140. package/lib/private/i18n/index/client.d.ts +9 -0
  141. package/lib/private/i18n/index/client.js +152 -0
  142. package/lib/private/i18n/index/server.d.ts +9 -0
  143. package/lib/private/i18n/index/server.js +57 -0
  144. package/lib/private/i18n/index/types.d.ts +33 -0
  145. package/lib/private/i18n/index/types.js +2 -0
  146. package/lib/private/i18n/locale.d.ts +9 -3
  147. package/lib/private/i18n/module.d.ts +3 -0
  148. package/lib/private/i18n/module.js +115 -0
  149. package/lib/private/i18n/ordinals.d.ts +1 -1
  150. package/lib/private/i18n/resolve.d.ts +7 -0
  151. package/lib/private/i18n/resolve.js +30 -0
  152. package/lib/private/i18n/schema.d.ts +10 -5
  153. package/lib/private/i18n/schema.js +6 -10
  154. package/lib/private/i18n/storage.d.ts +3 -0
  155. package/lib/private/i18n/storage.js +5 -0
  156. package/lib/private/i18n/validate.d.ts +2 -0
  157. package/lib/private/i18n/validate.js +19 -0
  158. package/lib/private/index.d.ts +14 -0
  159. package/lib/private/index.js +2 -0
  160. package/lib/private/log.d.ts +1 -0
  161. package/lib/private/log.js +15 -14
  162. package/lib/private/module/Hook.d.ts +1 -1
  163. package/lib/private/module/Next.d.ts +1 -1
  164. package/lib/private/module/Setup.d.ts +21 -0
  165. package/lib/private/module/Setup.js +2 -0
  166. package/lib/private/module/create.d.ts +16 -0
  167. package/lib/private/module/create.js +28 -0
  168. package/lib/private/orm/ExtractSchema.d.ts +9 -0
  169. package/lib/private/orm/ExtractSchema.js +2 -0
  170. package/lib/private/orm/ForeignKey.d.ts +14 -0
  171. package/lib/private/orm/ForeignKey.js +25 -0
  172. package/lib/private/orm/PrimaryKey.d.ts +17 -0
  173. package/lib/private/orm/PrimaryKey.js +38 -0
  174. package/lib/private/orm/StoreInput.d.ts +10 -0
  175. package/lib/private/orm/StoreInput.js +2 -0
  176. package/lib/private/orm/key.d.ts +8 -0
  177. package/lib/private/orm/key.js +8 -0
  178. package/lib/private/orm/parse.d.ts +13 -0
  179. package/lib/private/orm/parse.js +29 -0
  180. package/lib/private/orm/relation.d.ts +43 -0
  181. package/lib/private/orm/relation.js +26 -0
  182. package/lib/private/orm/store.d.ts +187 -0
  183. package/lib/private/orm/store.js +542 -0
  184. package/lib/private/paths.d.ts +2 -2
  185. package/lib/private/paths.js +3 -3
  186. package/lib/private/request/RequestBag.d.ts +5 -1
  187. package/lib/private/request/RequestBag.js +16 -9
  188. package/lib/private/request/RequestBody.d.ts +6 -11
  189. package/lib/private/request/RequestBody.js +51 -59
  190. package/lib/private/request/RequestContext.d.ts +12 -0
  191. package/lib/private/request/RequestContext.js +31 -0
  192. package/lib/private/request/RequestFacade.d.ts +11 -6
  193. package/lib/private/request/RequestPublic.d.ts +9 -0
  194. package/lib/private/request/RequestPublic.js +2 -0
  195. package/lib/private/request/RequestView.d.ts +11 -0
  196. package/lib/private/request/RequestView.js +3 -0
  197. package/lib/private/request/handle.d.ts +4 -0
  198. package/lib/private/request/handle.js +18 -0
  199. package/lib/private/request/parse.d.ts +2 -2
  200. package/lib/private/request/parse.js +55 -16
  201. package/lib/private/request/route.js +37 -22
  202. package/lib/private/request/router.d.ts +1 -1
  203. package/lib/private/request/router.js +22 -50
  204. package/lib/private/{database/symbol/wrap.d.ts → request/sContext.d.ts} +1 -1
  205. package/lib/private/request/sContext.js +2 -0
  206. package/lib/private/request/storage.d.ts +4 -0
  207. package/lib/private/request/storage.js +5 -0
  208. package/lib/private/response/ResponseFunction.d.ts +2 -3
  209. package/lib/private/response/ResponseLike.d.ts +1 -1
  210. package/lib/private/response/binary.d.ts +1 -1
  211. package/lib/private/response/binary.js +4 -3
  212. package/lib/private/response/error.d.ts +1 -1
  213. package/lib/private/response/error.js +1 -1
  214. package/lib/private/response/json.d.ts +1 -1
  215. package/lib/private/response/json.js +2 -2
  216. package/lib/private/response/redirect.d.ts +5 -5
  217. package/lib/private/response/redirect.js +9 -10
  218. package/lib/private/response/respond.js +16 -17
  219. package/lib/private/response/sse.d.ts +1 -1
  220. package/lib/private/response/sse.js +2 -2
  221. package/lib/private/response/text.d.ts +1 -1
  222. package/lib/private/response/text.js +3 -3
  223. package/lib/private/response/view.d.ts +3 -3
  224. package/lib/private/response/view.js +7 -14
  225. package/lib/private/response/ws.d.ts +1 -1
  226. package/lib/private/response.d.ts +1 -1
  227. package/lib/private/route/Handler.d.ts +1 -1
  228. package/lib/private/route/hook.d.ts +6 -0
  229. package/lib/private/route/hook.js +5 -0
  230. package/lib/private/route/router.d.ts +6 -2
  231. package/lib/private/route/router.js +32 -18
  232. package/lib/private/route/wrap.js +2 -2
  233. package/lib/private/serve/App.d.ts +11 -25
  234. package/lib/private/serve/App.js +138 -120
  235. package/lib/private/serve/Init.d.ts +5 -5
  236. package/lib/private/serve/dev-module.d.ts +2 -0
  237. package/lib/private/serve/dev-module.js +34 -0
  238. package/lib/private/serve/hook.d.ts +1 -2
  239. package/lib/private/serve/hook.js +2 -9
  240. package/lib/private/serve/index.d.ts +1 -1
  241. package/lib/private/serve/index.js +36 -2
  242. package/lib/private/server/TAG.d.ts +3 -0
  243. package/lib/private/server/TAG.js +2 -0
  244. package/lib/private/server/index.d.ts +5 -0
  245. package/lib/private/server/index.js +6 -0
  246. package/lib/private/session/Data.d.ts +1 -2
  247. package/lib/private/session/SessionHandle.d.ts +1 -1
  248. package/lib/private/session/SessionHandle.js +11 -9
  249. package/lib/private/session/index.d.ts +3 -4
  250. package/lib/private/session/module.d.ts +3 -0
  251. package/lib/private/session/module.js +114 -0
  252. package/lib/private/session/schema.d.ts +17 -9
  253. package/lib/private/session/schema.js +11 -6
  254. package/lib/private/session/storage.d.ts +1 -2
  255. package/lib/private/session/storage.js +2 -2
  256. package/lib/private/tags.js +2 -2
  257. package/lib/private/target/Manager.js +6 -12
  258. package/lib/private/target/Target.d.ts +1 -1
  259. package/lib/public/AppFacade.d.ts +2 -0
  260. package/lib/public/AppFacade.js +2 -0
  261. package/lib/public/build/presets.d.ts +2 -0
  262. package/lib/public/build/presets.js +2 -0
  263. package/lib/public/build/transform.d.ts +2 -0
  264. package/lib/public/build/transform.js +2 -0
  265. package/lib/public/client.d.ts +3 -0
  266. package/lib/public/client.js +2 -0
  267. package/lib/public/db/MemoryDB.d.ts +2 -0
  268. package/lib/public/db/MemoryDB.js +2 -0
  269. package/lib/public/db/errors.d.ts +2 -0
  270. package/lib/public/db/errors.js +2 -0
  271. package/lib/public/db/migrate.d.ts +2 -0
  272. package/lib/public/db/migrate.js +2 -0
  273. package/lib/public/db/sql.d.ts +2 -0
  274. package/lib/public/db/sql.js +2 -0
  275. package/lib/public/db/test.d.ts +2 -0
  276. package/lib/public/db/test.js +2 -0
  277. package/lib/public/db.d.ts +12 -0
  278. package/lib/public/db.js +2 -0
  279. package/lib/public/frontend.d.ts +3 -0
  280. package/lib/public/frontend.js +2 -0
  281. package/lib/public/index.d.ts +2 -0
  282. package/lib/public/index.js +2 -0
  283. package/lib/public/orm/key.d.ts +2 -0
  284. package/lib/public/orm/key.js +2 -0
  285. package/lib/public/orm/relation.d.ts +2 -0
  286. package/lib/public/orm/relation.js +2 -0
  287. package/lib/public/orm/store.d.ts +2 -0
  288. package/lib/public/orm/store.js +2 -0
  289. package/lib/public/request/server.d.ts +5 -0
  290. package/lib/public/request/server.js +7 -0
  291. package/lib/public/response.d.ts +22 -0
  292. package/lib/public/response.js +19 -0
  293. package/lib/public/route/hook.d.ts +2 -0
  294. package/lib/public/route/hook.js +2 -0
  295. package/lib/public/server.d.ts +3 -0
  296. package/lib/public/server.js +2 -0
  297. package/package.json +40 -30
  298. package/lib/private/AppError.d.ts +0 -4
  299. package/lib/private/AppError.js +0 -8
  300. package/lib/private/backend/Module.d.ts +0 -18
  301. package/lib/private/backend/Module.js +0 -22
  302. package/lib/private/backend/TAG.d.ts +0 -3
  303. package/lib/private/backend/TAG.js +0 -2
  304. package/lib/private/build/client/reload.d.ts +0 -7
  305. package/lib/private/build/client/reload.js +0 -6
  306. package/lib/private/build/server/plugin/database-default.d.ts +0 -4
  307. package/lib/private/build/server/plugin/database-default.js +0 -48
  308. package/lib/private/build/server/plugin/hot-reload.d.ts +0 -4
  309. package/lib/private/build/server/plugin/store-wrap.d.ts +0 -4
  310. package/lib/private/build/server/plugin/store-wrap.js +0 -33
  311. package/lib/private/client/spa/index.d.ts +0 -6
  312. package/lib/private/client/spa/index.js +0 -201
  313. package/lib/private/client/validate.d.ts +0 -3
  314. package/lib/private/client/validate.js +0 -54
  315. package/lib/private/database/As.d.ts +0 -7
  316. package/lib/private/database/Binds.d.ts +0 -4
  317. package/lib/private/database/Binds.js +0 -2
  318. package/lib/private/database/Changes.d.ts +0 -11
  319. package/lib/private/database/Changes.js +0 -2
  320. package/lib/private/database/ColumnTypes.d.ts +0 -11
  321. package/lib/private/database/ColumnTypes.js +0 -2
  322. package/lib/private/database/DataDict.d.ts +0 -5
  323. package/lib/private/database/DataKey.d.ts +0 -4
  324. package/lib/private/database/DataValue.d.ts +0 -5
  325. package/lib/private/database/Database.d.ts +0 -56
  326. package/lib/private/database/Database.js +0 -153
  327. package/lib/private/database/InMemoryDatabase.d.ts +0 -37
  328. package/lib/private/database/InMemoryDatabase.js +0 -181
  329. package/lib/private/database/Sort.d.ts +0 -4
  330. package/lib/private/database/Store.d.ts +0 -172
  331. package/lib/private/database/Store.js +0 -261
  332. package/lib/private/database/storage.d.ts +0 -4
  333. package/lib/private/database/storage.js +0 -3
  334. package/lib/private/database/symbol/wrap.js +0 -2
  335. package/lib/private/database/symbol.js +0 -2
  336. package/lib/private/database/test.d.ts +0 -4
  337. package/lib/private/database/test.js +0 -678
  338. package/lib/private/database/wrap.d.ts +0 -5
  339. package/lib/private/database/wrap.js +0 -5
  340. package/lib/private/fail.d.ts +0 -3
  341. package/lib/private/fail.js +0 -5
  342. package/lib/private/frontend/Module.d.ts +0 -62
  343. package/lib/private/frontend/Module.js +0 -250
  344. package/lib/private/frontend/Render.d.ts +0 -9
  345. package/lib/private/frontend/ServerView.d.ts +0 -5
  346. package/lib/private/i18n/Module.d.ts +0 -16
  347. package/lib/private/i18n/Module.js +0 -122
  348. package/lib/private/i18n/index.d.ts +0 -28
  349. package/lib/private/i18n/index.js +0 -236
  350. package/lib/private/module/BuildHook.d.ts +0 -5
  351. package/lib/private/module/BuildHook.js +0 -2
  352. package/lib/private/module/NextBuild.d.ts +0 -5
  353. package/lib/private/module/NextBuild.js +0 -2
  354. package/lib/private/module/NextServe.d.ts +0 -5
  355. package/lib/private/module/NextServe.js +0 -2
  356. package/lib/private/reducer.d.ts +0 -24
  357. package/lib/private/reducer.js +0 -10
  358. package/lib/private/route/guard.d.ts +0 -4
  359. package/lib/private/route/guard.js +0 -22
  360. package/lib/private/serve/module/Dev.d.ts +0 -11
  361. package/lib/private/serve/module/Dev.js +0 -28
  362. package/lib/private/serve/module/Handle.d.ts +0 -10
  363. package/lib/private/serve/module/Handle.js +0 -15
  364. package/lib/private/session/SessionModule.d.ts +0 -14
  365. package/lib/private/session/SessionModule.js +0 -122
  366. package/lib/private/wasm/API.d.ts +0 -7
  367. package/lib/private/wasm/API.js +0 -2
  368. package/lib/private/wasm/BufferViewSource.d.ts +0 -4
  369. package/lib/private/wasm/BufferViewSource.js +0 -2
  370. package/lib/private/wasm/Exports.d.ts +0 -23
  371. package/lib/private/wasm/Exports.js +0 -2
  372. package/lib/private/wasm/I32.d.ts +0 -5
  373. package/lib/private/wasm/I32.js +0 -2
  374. package/lib/private/wasm/I32_SIZE.d.ts +0 -3
  375. package/lib/private/wasm/I32_SIZE.js +0 -2
  376. package/lib/private/wasm/Instantiation.d.ts +0 -12
  377. package/lib/private/wasm/Instantiation.js +0 -2
  378. package/lib/private/wasm/Tagged.d.ts +0 -7
  379. package/lib/private/wasm/Tagged.js +0 -2
  380. package/lib/private/wasm/buffersize.d.ts +0 -2
  381. package/lib/private/wasm/buffersize.js +0 -5
  382. package/lib/private/wasm/decode-bytes.d.ts +0 -3
  383. package/lib/private/wasm/decode-bytes.js +0 -5
  384. package/lib/private/wasm/decode-json.d.ts +0 -7
  385. package/lib/private/wasm/decode-json.js +0 -11
  386. package/lib/private/wasm/decode-option.d.ts +0 -5
  387. package/lib/private/wasm/decode-option.js +0 -10
  388. package/lib/private/wasm/decode-response.d.ts +0 -19
  389. package/lib/private/wasm/decode-response.js +0 -90
  390. package/lib/private/wasm/decode-string.d.ts +0 -3
  391. package/lib/private/wasm/decode-string.js +0 -5
  392. package/lib/private/wasm/decode-websocket-close.d.ts +0 -5
  393. package/lib/private/wasm/decode-websocket-close.js +0 -6
  394. package/lib/private/wasm/decode-websocket-send.d.ts +0 -6
  395. package/lib/private/wasm/decode-websocket-send.js +0 -19
  396. package/lib/private/wasm/encode-buffer.d.ts +0 -3
  397. package/lib/private/wasm/encode-buffer.js +0 -6
  398. package/lib/private/wasm/encode-request.d.ts +0 -9
  399. package/lib/private/wasm/encode-request.js +0 -195
  400. package/lib/private/wasm/encode-session.d.ts +0 -3
  401. package/lib/private/wasm/encode-session.js +0 -25
  402. package/lib/private/wasm/encode-string-map.d.ts +0 -5
  403. package/lib/private/wasm/encode-string-map.js +0 -14
  404. package/lib/private/wasm/encode-string.d.ts +0 -13
  405. package/lib/private/wasm/encode-string.js +0 -17
  406. package/lib/private/wasm/encode-url.d.ts +0 -11
  407. package/lib/private/wasm/encode-url.js +0 -14
  408. package/lib/private/wasm/encode-websocket-close.d.ts +0 -2
  409. package/lib/private/wasm/encode-websocket-close.js +0 -7
  410. package/lib/private/wasm/encode-websocket-message.d.ts +0 -4
  411. package/lib/private/wasm/encode-websocket-message.js +0 -30
  412. package/lib/private/wasm/encode-websocket-open.d.ts +0 -2
  413. package/lib/private/wasm/encode-websocket-open.js +0 -7
  414. package/lib/private/wasm/filesize.d.ts +0 -2
  415. package/lib/private/wasm/filesize.js +0 -8
  416. package/lib/private/wasm/instantiate.d.ts +0 -37
  417. package/lib/private/wasm/instantiate.js +0 -408
  418. package/lib/private/wasm/open-websocket.d.ts +0 -4
  419. package/lib/private/wasm/open-websocket.js +0 -26
  420. package/lib/private/wasm/stringsize.d.ts +0 -3
  421. package/lib/private/wasm/stringsize.js +0 -5
  422. package/lib/private/wasm/urlsize.d.ts +0 -2
  423. package/lib/private/wasm/urlsize.js +0 -5
  424. package/lib/public/App.d.ts +0 -2
  425. package/lib/public/App.js +0 -2
  426. package/lib/public/AppError.d.ts +0 -2
  427. package/lib/public/AppError.js +0 -2
  428. package/lib/public/BuildApp.d.ts +0 -2
  429. package/lib/public/BuildApp.js +0 -2
  430. package/lib/public/BuildHook.d.ts +0 -2
  431. package/lib/public/BuildHook.js +0 -2
  432. package/lib/public/Database.d.ts +0 -2
  433. package/lib/public/Database.js +0 -2
  434. package/lib/public/Mode.d.ts +0 -2
  435. package/lib/public/Mode.js +0 -2
  436. package/lib/public/Module.d.ts +0 -2
  437. package/lib/public/Module.js +0 -2
  438. package/lib/public/Next.d.ts +0 -2
  439. package/lib/public/Next.js +0 -2
  440. package/lib/public/NextBuild.d.ts +0 -2
  441. package/lib/public/NextBuild.js +0 -2
  442. package/lib/public/NextHandle.d.ts +0 -2
  443. package/lib/public/NextHandle.js +0 -2
  444. package/lib/public/NextRoute.d.ts +0 -3
  445. package/lib/public/NextRoute.js +0 -2
  446. package/lib/public/NextServe.d.ts +0 -2
  447. package/lib/public/NextServe.js +0 -2
  448. package/lib/public/ServeApp.d.ts +0 -2
  449. package/lib/public/ServeApp.js +0 -2
  450. package/lib/public/Target.d.ts +0 -2
  451. package/lib/public/Target.js +0 -2
  452. package/lib/public/backend/Module.d.ts +0 -2
  453. package/lib/public/backend/Module.js +0 -2
  454. package/lib/public/backend/TAG.d.ts +0 -2
  455. package/lib/public/backend/TAG.js +0 -2
  456. package/lib/public/client/Data.d.ts +0 -2
  457. package/lib/public/client/Data.js +0 -2
  458. package/lib/public/client/ValidateInit.d.ts +0 -2
  459. package/lib/public/client/ValidateInit.js +0 -2
  460. package/lib/public/client/ValidateUpdater.d.ts +0 -2
  461. package/lib/public/client/ValidateUpdater.js +0 -2
  462. package/lib/public/client/ValidationError.d.ts +0 -2
  463. package/lib/public/client/ValidationError.js +0 -2
  464. package/lib/public/client/spa.d.ts +0 -2
  465. package/lib/public/client/spa.js +0 -2
  466. package/lib/public/client/toValidated.d.ts +0 -2
  467. package/lib/public/client/toValidated.js +0 -2
  468. package/lib/public/client/validate.d.ts +0 -2
  469. package/lib/public/client/validate.js +0 -2
  470. package/lib/public/database/As.d.ts +0 -2
  471. package/lib/public/database/As.js +0 -2
  472. package/lib/public/database/DataDict.d.ts +0 -2
  473. package/lib/public/database/DataDict.js +0 -2
  474. package/lib/public/database/InMemoryDatabase.d.ts +0 -2
  475. package/lib/public/database/InMemoryDatabase.js +0 -2
  476. package/lib/public/database/Sort.d.ts +0 -2
  477. package/lib/public/database/Sort.js +0 -2
  478. package/lib/public/database/Store.d.ts +0 -2
  479. package/lib/public/database/Store.js +0 -2
  480. package/lib/public/database/TypeMap.d.ts +0 -2
  481. package/lib/public/database/TypeMap.js +0 -2
  482. package/lib/public/database/Types.d.ts +0 -2
  483. package/lib/public/database/Types.js +0 -2
  484. package/lib/public/database/test.d.ts +0 -2
  485. package/lib/public/database/test.js +0 -2
  486. package/lib/public/database/wrap.d.ts +0 -2
  487. package/lib/public/database/wrap.js +0 -2
  488. package/lib/public/fail.d.ts +0 -2
  489. package/lib/public/fail.js +0 -2
  490. package/lib/public/frontend/Module.d.ts +0 -2
  491. package/lib/public/frontend/Module.js +0 -2
  492. package/lib/public/frontend/Publish.d.ts +0 -2
  493. package/lib/public/frontend/Publish.js +0 -2
  494. package/lib/public/frontend/Render.d.ts +0 -2
  495. package/lib/public/frontend/Render.js +0 -2
  496. package/lib/public/frontend/ViewResponse.d.ts +0 -2
  497. package/lib/public/frontend/ViewResponse.js +0 -2
  498. package/lib/public/request/RequestBody.d.ts +0 -2
  499. package/lib/public/request/RequestBody.js +0 -2
  500. package/lib/public/request/RequestFacade.d.ts +0 -2
  501. package/lib/public/request/RequestFacade.js +0 -2
  502. package/lib/public/request/Verb.d.ts +0 -2
  503. package/lib/public/request/Verb.js +0 -2
  504. package/lib/public/response/ResponseFunction.d.ts +0 -2
  505. package/lib/public/response/ResponseFunction.js +0 -2
  506. package/lib/public/response/ResponseLike.d.ts +0 -2
  507. package/lib/public/response/ResponseLike.js +0 -2
  508. package/lib/public/response/binary.d.ts +0 -2
  509. package/lib/public/response/binary.js +0 -2
  510. package/lib/public/response/error.d.ts +0 -2
  511. package/lib/public/response/error.js +0 -2
  512. package/lib/public/response/json.d.ts +0 -2
  513. package/lib/public/response/json.js +0 -2
  514. package/lib/public/response/redirect.d.ts +0 -2
  515. package/lib/public/response/redirect.js +0 -2
  516. package/lib/public/response/sse.d.ts +0 -2
  517. package/lib/public/response/sse.js +0 -2
  518. package/lib/public/response/text.d.ts +0 -2
  519. package/lib/public/response/text.js +0 -2
  520. package/lib/public/response/view.d.ts +0 -2
  521. package/lib/public/response/view.js +0 -2
  522. package/lib/public/response/ws.d.ts +0 -2
  523. package/lib/public/response/ws.js +0 -2
  524. package/lib/public/wasm/decode-json.d.ts +0 -5
  525. package/lib/public/wasm/decode-json.js +0 -3
  526. package/lib/public/wasm/decode-response.d.ts +0 -3
  527. package/lib/public/wasm/decode-response.js +0 -3
  528. package/lib/public/wasm/encode-request.d.ts +0 -3
  529. package/lib/public/wasm/encode-request.js +0 -3
  530. package/lib/public/wasm/encode-session.d.ts +0 -3
  531. package/lib/public/wasm/encode-session.js +0 -3
  532. package/lib/public/wasm/instantiate.d.ts +0 -4
  533. package/lib/public/wasm/instantiate.js +0 -3
  534. /package/lib/private/{frontend → client}/Publish.d.ts +0 -0
  535. /package/lib/private/{frontend → client}/Publish.js +0 -0
  536. /package/lib/private/{frontend → client}/Render.js +0 -0
  537. /package/lib/private/{frontend → client}/ServerData.js +0 -0
  538. /package/lib/private/{frontend → client}/ServerView.js +0 -0
  539. /package/lib/private/{frontend → client}/View.js +0 -0
  540. /package/lib/private/{frontend → client}/ViewOptions.js +0 -0
  541. /package/lib/private/{frontend → client}/ViewResponse.js +0 -0
  542. /package/lib/private/client/{spa/storage.d.ts → storage.d.ts} +0 -0
  543. /package/lib/private/client/{spa/storage.js → storage.js} +0 -0
  544. /package/lib/private/{database → db}/As.js +0 -0
  545. /package/lib/private/{database → db}/DataDict.js +0 -0
  546. /package/lib/private/{database → db}/DataKey.js +0 -0
  547. /package/lib/private/{database → db}/DataValue.js +0 -0
  548. /package/lib/private/{database → db}/Query.js +0 -0
  549. /package/lib/private/{database → db}/QueryBuilder.js +0 -0
  550. /package/lib/private/{database → db}/Schema.js +0 -0
  551. /package/lib/private/{database → db}/Sort.js +0 -0
  552. /package/lib/private/{database → db}/TypeMap.js +0 -0
  553. /package/lib/private/{database → db}/Types.js +0 -0
  554. /package/lib/private/{database → db}/primary.d.ts +0 -0
  555. /package/lib/private/{database → db}/primary.js +0 -0
  556. /package/lib/private/{database → db}/symbol.d.ts +0 -0
@@ -0,0 +1,542 @@
1
+ import E from "#db/errors";
2
+ import parse from "#orm/parse";
3
+ import assert from "@rcompat/assert";
4
+ import is from "@rcompat/is";
5
+ import StoreType from "pema/StoreType";
6
+ const NUMBER_KEYS = [
7
+ "u8", "u16", "u32",
8
+ "i8", "i16", "i32",
9
+ "f32", "f64"
10
+ ];
11
+ const BIGINT_KEYS = ["u64", "u128", "i64", "i128"];
12
+ const is_number_key = (d) => NUMBER_KEYS.includes(d);
13
+ const is_bigint_key = (d) => BIGINT_KEYS.includes(d);
14
+ const VALID_IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
15
+ function guard_options(options, allowed) {
16
+ if (options === undefined)
17
+ return;
18
+ const allowed_set = new Set(allowed);
19
+ for (const k of Object.keys(options)) {
20
+ if (!allowed_set.has(k))
21
+ throw E.option_unknown(k);
22
+ }
23
+ }
24
+ const INT_LIMITS = {
25
+ u8: [0, 255],
26
+ u16: [0, 65535],
27
+ u32: [0, 4294967295],
28
+ i8: [-128, 127],
29
+ i16: [-32768, 32767],
30
+ i32: [-2147483648, 2147483647],
31
+ };
32
+ const BIGINT_LIMITS = {
33
+ u64: [0n, (1n << 64n) - 1n],
34
+ i64: [-(1n << 63n), (1n << 63n) - 1n],
35
+ u128: [0n, (1n << 128n) - 1n],
36
+ i128: [-(1n << 127n), (1n << 127n) - 1n],
37
+ };
38
+ function assert_number_value(key, datatype, value) {
39
+ if (!is.finite(value))
40
+ throw E.where_invalid_value(key, value);
41
+ if (datatype in INT_LIMITS) {
42
+ if (!is.safeint(value))
43
+ throw E.where_invalid_value(key, value);
44
+ const [min, max] = INT_LIMITS[datatype];
45
+ if (value < min || value > max)
46
+ throw E.where_invalid_value(key, value);
47
+ }
48
+ }
49
+ function assert_bigint_value(key, datatype, value) {
50
+ const [min, max] = BIGINT_LIMITS[datatype];
51
+ if (value < min || value > max)
52
+ throw E.where_invalid_value(key, value);
53
+ }
54
+ const registry = new Map();
55
+ const STRING_OPS = ["$like", "$ilike"];
56
+ const NUMBER_OPS = ["$gt", "$gte", "$lt", "$lte", "$ne"];
57
+ const BIGINT_OPS = ["$gt", "$gte", "$lt", "$lte", "$ne"];
58
+ const DATE_OPS = ["$before", "$after", "$ne"];
59
+ /**
60
+ * Database-backed store.
61
+ *
62
+ * A `Store` exposes a typed, validated interface over a relational or
63
+ * document database table/collection. It pairs a Pema schema with a uniform
64
+ * CRUD/query API.
65
+ */
66
+ export class Store {
67
+ #schema;
68
+ #type;
69
+ #types;
70
+ #nullables;
71
+ #name;
72
+ #db;
73
+ #pk;
74
+ #generate_pk;
75
+ #fks;
76
+ #relations;
77
+ #migrate;
78
+ constructor(init) {
79
+ const { pk, generate_pk, fks, schema } = parse(init.schema);
80
+ const { name, db, migrate } = init;
81
+ if (name === undefined)
82
+ throw E.store_name_required();
83
+ assert.string(name);
84
+ if (!VALID_IDENTIFIER.test(name))
85
+ throw E.identifier_invalid(name);
86
+ assert.defined(db, E.db_missing);
87
+ assert.dict(schema);
88
+ assert.maybe.boolean(migrate);
89
+ assert.maybe.dict(init.extend);
90
+ this.#schema = schema;
91
+ this.#type = new StoreType(schema, pk);
92
+ this.#types = Object.fromEntries(Object.entries(schema).map(([key, value]) => [key, value.datatype]));
93
+ this.#name = name;
94
+ this.#db = db;
95
+ this.#pk = pk;
96
+ this.#generate_pk = generate_pk;
97
+ this.#fks = fks;
98
+ this.#relations = init.relations ?? {};
99
+ this.#migrate = migrate ?? true;
100
+ for (const relation of Object.keys(this.#relations)) {
101
+ if (relation in schema)
102
+ throw E.relation_conflicts_with_field(relation);
103
+ }
104
+ this.#nullables = new Set(Object.entries(this.#type.properties)
105
+ .filter(([, v]) => v.nullable)
106
+ .map(([k]) => k));
107
+ if (init.extend !== undefined) {
108
+ for (const [k, v] of Object.entries(init.extend)) {
109
+ if (k in this)
110
+ throw E.key_duplicate(k);
111
+ this[k] = v;
112
+ }
113
+ }
114
+ registry.set(init.schema, this);
115
+ }
116
+ get #as() {
117
+ return {
118
+ table: this.name,
119
+ pk: this.#pk,
120
+ generate_pk: this.#generate_pk,
121
+ types: this.#types,
122
+ };
123
+ }
124
+ get table() {
125
+ const db = this.db;
126
+ const pk = {
127
+ name: this.#pk,
128
+ generate: this.#generate_pk,
129
+ };
130
+ return {
131
+ create: () => db.schema.create(this.#name, pk, this.#types),
132
+ delete: () => db.schema.delete(this.#name),
133
+ };
134
+ }
135
+ get infer() {
136
+ return undefined;
137
+ }
138
+ get schema() {
139
+ return this.#schema;
140
+ }
141
+ get type() {
142
+ return this.#type;
143
+ }
144
+ get migrate() {
145
+ return this.#migrate;
146
+ }
147
+ get name() {
148
+ return this.#name;
149
+ }
150
+ get pk() {
151
+ return this.#pk;
152
+ }
153
+ get db() {
154
+ return this.#db;
155
+ }
156
+ get types() {
157
+ return this.#types;
158
+ }
159
+ #parse_pk(pkv) {
160
+ const pk = this.#pk;
161
+ if (pk === null)
162
+ throw E.pk_undefined(this.name);
163
+ try {
164
+ this.#schema[pk].parse(pkv);
165
+ }
166
+ catch {
167
+ throw E.pk_invalid(pkv);
168
+ }
169
+ return pk;
170
+ }
171
+ #parse_query(query, types) {
172
+ const { where, select, sort, limit } = query;
173
+ if (where !== undefined)
174
+ this.#parse_where(where, types);
175
+ if (select !== undefined)
176
+ this.#parse_select(select, types);
177
+ if (sort !== undefined)
178
+ this.#parse_sort(sort, types);
179
+ if (limit !== undefined && !is.uint(limit))
180
+ throw E.limit_invalid();
181
+ }
182
+ #with(options) {
183
+ if (options === undefined)
184
+ return undefined;
185
+ const plan = {};
186
+ for (const [name, query] of Object.entries(options)) {
187
+ if (query === undefined)
188
+ continue;
189
+ const relation = this.#relations[name];
190
+ if (relation === undefined)
191
+ throw E.relation_unknown(name);
192
+ const store = registry.get(relation.schema);
193
+ if (store === undefined)
194
+ throw E.unregistered_schema();
195
+ const { pk: target_pk } = parse(relation.schema);
196
+ const target_types = store.types;
197
+ const base = {
198
+ as: {
199
+ table: store.name,
200
+ pk: target_pk,
201
+ types: target_types,
202
+ },
203
+ kind: relation.type,
204
+ fk: relation.fk,
205
+ reverse: "reverse" in relation && relation.reverse === true,
206
+ };
207
+ if (query === true) {
208
+ plan[name] = { ...base, where: {} };
209
+ continue;
210
+ }
211
+ this.#parse_query(query, target_types);
212
+ plan[name] = {
213
+ ...base,
214
+ where: query.where ?? {},
215
+ fields: query.select ? [...query.select] : undefined,
216
+ sort: query.sort,
217
+ limit: query.limit,
218
+ };
219
+ }
220
+ return plan;
221
+ }
222
+ #parse_where(where, types) {
223
+ if (!is.dict(where))
224
+ throw E.where_invalid();
225
+ for (const [k, value] of Object.entries(where)) {
226
+ if (!VALID_IDENTIFIER.test(k))
227
+ throw E.identifier_invalid(k);
228
+ if (!(k in types))
229
+ throw E.field_unknown(k, "where");
230
+ if (value === undefined)
231
+ throw E.field_undefined(k, "where");
232
+ const datatype = types[k];
233
+ // null criteria (IS NULL semantics)
234
+ if (value === null)
235
+ continue;
236
+ // arrays are always invalid
237
+ if (is.array(value))
238
+ throw E.where_invalid_value(k, value);
239
+ if (is.dict(value)) {
240
+ const ops = Object.entries(value);
241
+ if (ops.length === 0)
242
+ throw E.operator_empty(k);
243
+ for (const [op, op_val] of ops) {
244
+ if (op_val === undefined)
245
+ throw E.field_undefined(k, "where");
246
+ if (datatype === "string" || datatype === "time") {
247
+ if (!STRING_OPS.includes(op))
248
+ throw E.operator_unknown(k, op);
249
+ if (!is.string(op_val))
250
+ throw E.wrong_type("string", k, op_val, op);
251
+ continue;
252
+ }
253
+ if (is_number_key(datatype)) {
254
+ if (!NUMBER_OPS.includes(op))
255
+ throw E.operator_unknown(k, op);
256
+ if (!is.number(op_val))
257
+ throw E.wrong_type("number", k, op_val, op);
258
+ assert_number_value(k, datatype, op_val);
259
+ continue;
260
+ }
261
+ if (is_bigint_key(datatype)) {
262
+ if (!BIGINT_OPS.includes(op))
263
+ throw E.operator_unknown(k, op);
264
+ if (!is.bigint(op_val))
265
+ throw E.wrong_type("bigint", k, op_val, op);
266
+ assert_bigint_value(k, datatype, op_val);
267
+ continue;
268
+ }
269
+ if (datatype === "datetime") {
270
+ if (!DATE_OPS.includes(op))
271
+ throw E.operator_unknown(k, op);
272
+ if (!is.date(op_val))
273
+ throw E.wrong_type("date", k, op_val, op);
274
+ continue;
275
+ }
276
+ // url/boolean/blob: no operator objects
277
+ throw E.operator_unknown(k, op);
278
+ }
279
+ continue;
280
+ }
281
+ switch (datatype) {
282
+ case "string":
283
+ case "time":
284
+ if (!is.string(value))
285
+ throw E.wrong_type("string", k, value);
286
+ continue;
287
+ case "u8":
288
+ case "u16":
289
+ case "u32":
290
+ case "i8":
291
+ case "i16":
292
+ case "i32":
293
+ case "f32":
294
+ case "f64":
295
+ if (!is.number(value))
296
+ throw E.wrong_type("number", k, value);
297
+ assert_number_value(k, datatype, value);
298
+ continue;
299
+ case "u64":
300
+ case "u128":
301
+ case "i64":
302
+ case "i128":
303
+ if (!is.bigint(value))
304
+ throw E.wrong_type("bigint", k, value);
305
+ assert_bigint_value(k, datatype, value);
306
+ continue;
307
+ case "datetime":
308
+ if (!is.date(value))
309
+ throw E.wrong_type("date", k, value);
310
+ continue;
311
+ case "boolean":
312
+ if (!is.boolean(value))
313
+ throw E.wrong_type("boolean", k, value);
314
+ continue;
315
+ case "url":
316
+ if (!is.url(value))
317
+ throw E.wrong_type("url", k, value);
318
+ continue;
319
+ case "blob":
320
+ if (!is.blob(value))
321
+ throw E.wrong_type("blob", k, value);
322
+ continue;
323
+ case "uuid":
324
+ case "uuid_v4":
325
+ case "uuid_v7":
326
+ if (!is.string(value))
327
+ throw E.wrong_type("string", k, value);
328
+ continue;
329
+ default:
330
+ throw E.where_invalid_value(k, value);
331
+ }
332
+ }
333
+ }
334
+ #parse_select(select, types) {
335
+ if (!is.array(select))
336
+ throw E.select_invalid();
337
+ if (select.length === 0)
338
+ throw E.select_empty();
339
+ const seen = new Set();
340
+ for (const [i, v] of select.entries()) {
341
+ if (!is.string(v))
342
+ throw E.select_invalid_value(i, v);
343
+ if (!VALID_IDENTIFIER.test(v))
344
+ throw E.identifier_invalid(v);
345
+ if (!(v in types))
346
+ throw E.field_unknown(v, "select");
347
+ // duplicate isn't harmful, but usually a thought error
348
+ if (seen.has(v))
349
+ throw E.field_duplicate(v, "select");
350
+ seen.add(v);
351
+ }
352
+ }
353
+ #parse_sort(sort, types) {
354
+ if (!is.dict(sort))
355
+ throw E.sort_invalid();
356
+ const keys = Object.keys(sort);
357
+ if (keys.length === 0)
358
+ throw E.sort_empty();
359
+ for (const [k, direction] of Object.entries(sort)) {
360
+ if (!is.string(direction))
361
+ throw E.sort_invalid_value(k, direction);
362
+ if (!(k in types))
363
+ throw E.field_unknown(k, "sort");
364
+ const l = direction.toLowerCase();
365
+ if (l !== "asc" && l !== "desc")
366
+ throw E.sort_invalid_value(k, direction);
367
+ }
368
+ }
369
+ #parse_insert(record) {
370
+ for (const [k, v] of Object.entries(record)) {
371
+ if (!(k in this.#types))
372
+ throw E.field_unknown(k, "insert");
373
+ if (v === undefined)
374
+ throw E.field_undefined(k, "insert");
375
+ if (v === null)
376
+ throw E.null_not_allowed(k);
377
+ }
378
+ }
379
+ /**
380
+ * Count records
381
+ */
382
+ async count(options) {
383
+ this.#parse_query(options ?? {}, this.#types);
384
+ if (is.defined(options) && "with" in options)
385
+ throw E.count_with_invalid();
386
+ return await this.db.read(this.#as, {
387
+ count: true,
388
+ where: (options?.where ?? {}),
389
+ });
390
+ }
391
+ /**
392
+ * Check whether a record with the given primary key exists.
393
+ */
394
+ async has(pkv) {
395
+ const pk = this.#parse_pk(pkv);
396
+ return (await this.count({ where: { [pk]: pkv } })) === 1;
397
+ }
398
+ async get(pkv, options) {
399
+ const pk = this.#parse_pk(pkv);
400
+ guard_options(options, ["select", "with"]);
401
+ this.#parse_query(options ?? {}, this.#types);
402
+ const $with = this.#with(options?.with);
403
+ const records = await this.db.read(this.#as, {
404
+ where: { [pk]: pkv },
405
+ fields: options?.select ? [...options.select] : undefined,
406
+ with: $with,
407
+ });
408
+ const n = records.length;
409
+ assert.true(n <= 1, E.record_number_invalid(n, "get"));
410
+ if (n === 0) {
411
+ const err = E.record_not_found(pk, pkv);
412
+ err.not_found = true;
413
+ throw err;
414
+ }
415
+ const raw = records[0];
416
+ // if projected, keep it as-is (no parse)
417
+ if (options?.select)
418
+ return raw;
419
+ // parse *only* base fields (exclude relation keys)
420
+ const base_only = Object.fromEntries(Object.entries(raw)
421
+ .filter(([k]) => k in this.#types));
422
+ const parsed = this.#type.parse(base_only);
423
+ if ($with === undefined)
424
+ return parsed;
425
+ return {
426
+ ...parsed,
427
+ ...Object.fromEntries(Object.keys($with).map(k => [k, raw[k]])),
428
+ };
429
+ }
430
+ async try(pkv, options) {
431
+ try {
432
+ return await this.get(pkv, options);
433
+ }
434
+ catch (error) {
435
+ if (error?.not_found === true)
436
+ return undefined;
437
+ throw error;
438
+ }
439
+ }
440
+ /**
441
+ * Insert a single record.
442
+ */
443
+ async insert(record) {
444
+ assert.dict(record);
445
+ this.#parse_insert(record);
446
+ const entries = Object.entries(record);
447
+ const to_parse = Object.fromEntries(entries.filter(([k, v]) => !(v === null && this.#nullables.has(k))));
448
+ return this.db.create(this.#as, this.#type.parse(to_parse));
449
+ }
450
+ async update(arg0, options) {
451
+ const by_pk = options !== undefined;
452
+ const set = by_pk
453
+ ? options.set
454
+ : arg0.set;
455
+ if (!is.dict(set) || is.empty(set))
456
+ throw E.set_empty();
457
+ const pk = this.#pk;
458
+ if (pk !== null && pk in set)
459
+ throw E.pk_immutable(pk);
460
+ for (const [k, v] of Object.entries(set)) {
461
+ if (!(k in this.#types))
462
+ throw E.field_unknown(k, "set");
463
+ if (v === null && !this.#nullables.has(k))
464
+ throw E.null_not_allowed(k);
465
+ }
466
+ const entries = Object.entries(set);
467
+ const to_parse = Object.fromEntries(entries
468
+ .filter(([key, value]) => value !== null || !this.#nullables.has(key)));
469
+ const nulls = Object.fromEntries(entries
470
+ .filter(([key, value]) => value === null && this.#nullables.has(key)));
471
+ const parsed = {
472
+ ...this.#type.partial().parse(to_parse),
473
+ ...nulls,
474
+ };
475
+ if (by_pk)
476
+ return this.#update_1(arg0, parsed);
477
+ const where = arg0.where;
478
+ if (where !== undefined)
479
+ this.#parse_where(where, this.#types);
480
+ return this.#update_n((where ?? {}), parsed);
481
+ }
482
+ async #update_1(pkv, set) {
483
+ const pk = this.#parse_pk(pkv);
484
+ const n = await this.db.update(this.#as, { set, where: { [pk]: pkv } });
485
+ assert.true(n === 1, E.record_number_invalid(n, "update"));
486
+ }
487
+ async #update_n(where, set) {
488
+ return await this.db.update(this.#as, { set, where });
489
+ }
490
+ async delete(pkv_or_options) {
491
+ if (is.dict(pkv_or_options)) {
492
+ const where = pkv_or_options.where;
493
+ if (!is.dict(where) || is.empty(where))
494
+ throw E.where_required();
495
+ this.#parse_where(where, this.#types);
496
+ return this.#delete_n(where);
497
+ }
498
+ return this.#delete_1(pkv_or_options);
499
+ }
500
+ async #delete_1(pkv) {
501
+ const pk = this.#parse_pk(pkv);
502
+ const n = await this.db.delete(this.#as, { where: { [pk]: pkv } });
503
+ assert.true(n === 1, E.record_number_invalid(n, "delete"));
504
+ }
505
+ async #delete_n(where) {
506
+ return await this.db.delete(this.#as, { where: where });
507
+ }
508
+ /**
509
+ * Find matching records
510
+ *
511
+ */
512
+ async find(options) {
513
+ guard_options(options, ["where", "select", "sort", "limit", "with"]);
514
+ this.#parse_query(options ?? {}, this.#types);
515
+ const result = await this.db.read(this.#as, {
516
+ where: options?.where ?? {},
517
+ fields: options?.select !== undefined ? [...options.select] : undefined,
518
+ limit: options?.limit,
519
+ sort: options?.sort,
520
+ with: this.#with(options?.with),
521
+ });
522
+ return result;
523
+ }
524
+ toJSON() {
525
+ return this.#type.toJSON();
526
+ }
527
+ extend(extensor) {
528
+ return new Store({
529
+ name: this.name,
530
+ db: this.db,
531
+ schema: this.#schema,
532
+ relations: this.#relations,
533
+ migrate: false,
534
+ extend: extensor(this),
535
+ });
536
+ }
537
+ }
538
+ function store(init) {
539
+ return new Store(init);
540
+ }
541
+ export default store;
542
+ //# sourceMappingURL=store.js.map
@@ -1,5 +1,5 @@
1
- import type FileRef from "@rcompat/fs/FileRef";
2
- import type Dict from "@rcompat/type/Dict";
1
+ import type { FileRef } from "@rcompat/fs";
2
+ import type { Dict } from "@rcompat/type";
3
3
  declare function resolve(root: FileRef, config_paths?: Dict<string[]>): Promise<any>;
4
4
  export default resolve;
5
5
  //# sourceMappingURL=paths.d.ts.map
@@ -1,4 +1,4 @@
1
- import fail from "#fail";
1
+ import E from "#errors";
2
2
  import log from "#log";
3
3
  async function resolve(root, config_paths) {
4
4
  const tsconfig_path = root.join("tsconfig.json");
@@ -13,13 +13,13 @@ async function resolve(root, config_paths) {
13
13
  const config = JSON.parse(text);
14
14
  const ts_paths = config.compilerOptions?.paths ?? {};
15
15
  if (config_paths !== undefined && Object.keys(ts_paths).length > 0) {
16
- return fail("tsconfig.json exists with paths, remove config paths");
16
+ return E.config_tsconfig_has_paths();
17
17
  }
18
18
  // merge with defaults (user paths override)
19
19
  return { ...ts_paths };
20
20
  }
21
21
  catch {
22
- log.warn("Failed to parse tsconfig.json, falling back to config");
22
+ log.warn("failed to parse tsconfig.json, falling back to config");
23
23
  }
24
24
  }
25
25
  if (config_paths !== undefined)
@@ -1,9 +1,12 @@
1
- import type PartialDict from "@rcompat/type/PartialDict";
1
+ import type { PartialDict } from "@rcompat/type";
2
2
  type Contents = PartialDict<string>;
3
3
  type Normalize = (key: string) => string;
4
4
  interface Schema<T> {
5
5
  parse(input: unknown): T;
6
6
  }
7
+ interface CoercibleSchema<T> extends Schema<T> {
8
+ coerce(input: unknown): T;
9
+ }
7
10
  type Options = {
8
11
  normalize?: Normalize;
9
12
  raw?: string;
@@ -67,6 +70,7 @@ export default class RequestBag {
67
70
  * @throws Whatever the schema throws.
68
71
  */
69
72
  parse<T>(schema: Schema<T>): T;
73
+ coerce<T>(schema: CoercibleSchema<T>): T;
70
74
  /** Returns {@link raw}. Useful in template strings. */
71
75
  toString(): string;
72
76
  /**
@@ -1,5 +1,6 @@
1
- import fail from "#fail";
2
- import is from "@rcompat/assert/is";
1
+ import E from "#errors";
2
+ import assert from "@rcompat/assert";
3
+ import fn from "@rcompat/fn";
3
4
  export default class RequestBag {
4
5
  #contents;
5
6
  #name;
@@ -12,16 +13,19 @@ export default class RequestBag {
12
13
  * @param name - Human-readable bag name used in error messages.
13
14
  * @param options - Optional `normalize` function and `raw` string.
14
15
  */
15
- constructor(input, name, options = {}) {
16
- is(input).object();
16
+ constructor(input, name, options) {
17
+ assert.dict(input);
18
+ assert.string(name);
19
+ assert.maybe.dict(options);
20
+ assert.maybe.function(options?.normalize);
21
+ assert.maybe.string(options?.raw);
17
22
  this.#name = name;
18
- this.#normalize = options.normalize ?? (k => k);
19
- this.#raw = options.raw ?? "";
23
+ this.#normalize = options?.normalize ?? fn.identity;
24
+ this.#raw = options?.raw ?? "";
20
25
  const contents = Object.create(null);
21
26
  for (const key of Object.keys(input)) {
22
- const normalized = this.#normalize(key);
23
27
  // last-wins semantics if only case differs
24
- contents[normalized] = input[key];
28
+ contents[this.#normalize(key)] = input[key];
25
29
  }
26
30
  this.#contents = contents;
27
31
  }
@@ -68,7 +72,7 @@ export default class RequestBag {
68
72
  if (v !== undefined)
69
73
  return v;
70
74
  }
71
- throw fail("{0} has no key {1}", this.#name, key);
75
+ throw E.request_bag_missing_key(this.#name, key);
72
76
  }
73
77
  /**
74
78
  * Try to get a value by key.
@@ -103,6 +107,9 @@ export default class RequestBag {
103
107
  parse(schema) {
104
108
  return schema.parse(this.#contents);
105
109
  }
110
+ coerce(schema) {
111
+ return schema.coerce(this.#contents);
112
+ }
106
113
  /** Returns {@link raw}. Useful in template strings. */
107
114
  toString() {
108
115
  return this.raw;
@@ -1,6 +1,4 @@
1
- import type Dict from "@rcompat/type/Dict";
2
- import type JSONValue from "@rcompat/type/JSONValue";
3
- import type Schema from "@rcompat/type/Schema";
1
+ import type { Dict, JSONValue } from "@rcompat/type";
4
2
  type Form = Dict<string>;
5
3
  type Parsed = {
6
4
  type: "binary";
@@ -18,19 +16,16 @@ type Parsed = {
18
16
  type: "text";
19
17
  value: string;
20
18
  };
21
- type ParseReturn<S> = S extends {
22
- parse: (v: unknown) => infer R;
23
- } ? R : never;
19
+ declare function parse(request: Request, url: URL): Promise<RequestBody>;
20
+ declare function none(): RequestBody;
24
21
  export default class RequestBody {
25
22
  #private;
26
- static parse(request: Request, url: URL): Promise<RequestBody>;
27
- static none(): RequestBody;
23
+ static parse: typeof parse;
24
+ static none: typeof none;
28
25
  constructor(parsed: Parsed, files?: Dict<File>);
29
- get type(): "binary" | "form" | "json" | "none" | "text";
26
+ get type(): "json" | "binary" | "text" | "none" | "form";
30
27
  json(): JSONValue;
31
- json<S extends Schema<unknown>>(schema: S): ParseReturn<S>;
32
28
  form(): Form;
33
- form<S extends Schema<unknown>>(schema: S): ParseReturn<S>;
34
29
  files(): Dict<File>;
35
30
  text(): string;
36
31
  binary(): Blob;