@primate/core 0.1.9 → 0.2.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 (572) hide show
  1. package/lib/private/App.d.ts +54 -0
  2. package/lib/private/App.js +128 -0
  3. package/lib/private/AppError.d.ts +4 -0
  4. package/lib/private/AppError.js +8 -0
  5. package/lib/private/Binder.d.ts +13 -0
  6. package/lib/private/Binder.js +2 -0
  7. package/lib/private/BindingContext.d.ts +3 -0
  8. package/lib/private/BindingContext.js +2 -0
  9. package/lib/private/BuildApp.d.ts +23 -0
  10. package/lib/private/BuildApp.js +121 -0
  11. package/lib/private/CSP.d.ts +6 -0
  12. package/lib/private/CSP.js +2 -0
  13. package/lib/private/Loader.d.ts +17 -0
  14. package/lib/private/Loader.js +46 -0
  15. package/lib/private/Mode.d.ts +3 -0
  16. package/lib/private/Mode.js +2 -0
  17. package/lib/private/Module.d.ts +18 -0
  18. package/lib/private/Module.js +18 -0
  19. package/lib/private/ServeApp.d.ts +89 -0
  20. package/lib/private/ServeApp.js +305 -0
  21. package/lib/private/ServeInit.d.ts +29 -0
  22. package/lib/private/ServeInit.js +2 -0
  23. package/lib/private/asset/Asset.d.ts +11 -0
  24. package/lib/private/asset/Asset.js +2 -0
  25. package/lib/private/asset/Font.d.ts +8 -0
  26. package/lib/private/asset/Font.js +2 -0
  27. package/lib/private/asset/Script.d.ts +9 -0
  28. package/lib/private/asset/Script.js +2 -0
  29. package/lib/private/asset/Style.d.ts +6 -0
  30. package/lib/private/asset/Style.js +2 -0
  31. package/lib/private/backend/Module.d.ts +18 -0
  32. package/lib/private/backend/Module.js +22 -0
  33. package/lib/private/build.d.ts +4 -0
  34. package/lib/private/build.js +45 -0
  35. package/lib/private/builtin/DevModule.d.ts +11 -0
  36. package/lib/private/builtin/DevModule.js +32 -0
  37. package/lib/private/builtin/HandleModule.d.ts +10 -0
  38. package/lib/private/builtin/HandleModule.js +15 -0
  39. package/lib/private/bye.d.ts +3 -0
  40. package/{src → lib}/private/bye.js +2 -2
  41. package/lib/private/client/App.d.ts +4 -0
  42. package/lib/private/client/App.js +12 -0
  43. package/lib/private/client/Data.d.ts +9 -0
  44. package/lib/private/client/Data.js +2 -0
  45. package/lib/private/client/ValidateInit.d.ts +13 -0
  46. package/lib/private/client/ValidateInit.js +2 -0
  47. package/lib/private/client/ValidateUpdater.d.ts +3 -0
  48. package/lib/private/client/ValidateUpdater.js +2 -0
  49. package/lib/private/client/ValidationError.d.ts +6 -0
  50. package/lib/private/client/ValidationError.js +2 -0
  51. package/lib/private/client/spa/index.d.ts +6 -0
  52. package/lib/private/client/spa/index.js +192 -0
  53. package/lib/private/client/spa/storage.d.ts +12 -0
  54. package/lib/private/client/spa/storage.js +54 -0
  55. package/lib/private/client/toValidated.d.ts +17 -0
  56. package/lib/private/client/toValidated.js +21 -0
  57. package/lib/private/client/validate.d.ts +3 -0
  58. package/lib/private/client/validate.js +54 -0
  59. package/lib/private/config/Config.d.ts +4 -0
  60. package/lib/private/config/Config.js +2 -0
  61. package/lib/private/config/config/app.d.ts +3 -0
  62. package/lib/private/config/config/app.js +3 -0
  63. package/lib/private/config/config/database/index.d.ts +3 -0
  64. package/lib/private/config/config/database/index.js +3 -0
  65. package/lib/private/config/config/session.d.ts +3 -0
  66. package/lib/private/config/config/session.js +3 -0
  67. package/lib/private/config/index.d.ts +25 -0
  68. package/lib/private/config/index.js +3 -0
  69. package/lib/private/config/schema.d.ts +26 -0
  70. package/lib/private/config/schema.js +34 -0
  71. package/lib/private/cookie.d.ts +11 -0
  72. package/lib/private/cookie.js +30 -0
  73. package/lib/private/database/As.d.ts +7 -0
  74. package/lib/private/database/As.js +2 -0
  75. package/lib/private/database/Binds.d.ts +4 -0
  76. package/lib/private/database/Binds.js +2 -0
  77. package/lib/private/database/Changes.d.ts +11 -0
  78. package/lib/private/database/Changes.js +2 -0
  79. package/lib/private/database/ColumnTypes.d.ts +11 -0
  80. package/lib/private/database/ColumnTypes.js +2 -0
  81. package/lib/private/database/DataDict.d.ts +5 -0
  82. package/lib/private/database/DataDict.js +2 -0
  83. package/lib/private/database/DataKey.d.ts +4 -0
  84. package/lib/private/database/DataKey.js +2 -0
  85. package/lib/private/database/DataRecord.d.ts +8 -0
  86. package/lib/private/database/DataRecord.js +3 -0
  87. package/lib/private/database/DataValue.d.ts +5 -0
  88. package/lib/private/database/DataValue.js +2 -0
  89. package/lib/private/database/Database.d.ts +56 -0
  90. package/lib/private/database/Database.js +153 -0
  91. package/lib/private/database/InMemoryDatabase.d.ts +37 -0
  92. package/lib/private/database/InMemoryDatabase.js +181 -0
  93. package/lib/private/database/Query.d.ts +14 -0
  94. package/lib/private/database/Query.js +15 -0
  95. package/lib/private/database/QueryBuilder.d.ts +14 -0
  96. package/lib/private/database/QueryBuilder.js +3 -0
  97. package/lib/private/database/Sort.d.ts +4 -0
  98. package/lib/private/database/Sort.js +2 -0
  99. package/lib/private/database/Store.d.ts +169 -0
  100. package/lib/private/database/Store.js +255 -0
  101. package/lib/private/database/TypeMap.d.ts +14 -0
  102. package/lib/private/database/TypeMap.js +2 -0
  103. package/lib/private/database/Types.d.ts +6 -0
  104. package/lib/private/database/Types.js +2 -0
  105. package/lib/private/database/primary.d.ts +3 -0
  106. package/lib/private/database/primary.js +2 -0
  107. package/lib/private/database/storage.d.ts +4 -0
  108. package/lib/private/database/storage.js +3 -0
  109. package/lib/private/database/symbol/wrap.d.ts +3 -0
  110. package/lib/private/database/symbol/wrap.js +2 -0
  111. package/lib/private/database/symbol.d.ts +3 -0
  112. package/lib/private/database/symbol.js +2 -0
  113. package/lib/private/database/test.d.ts +4 -0
  114. package/lib/private/database/test.js +678 -0
  115. package/lib/private/database/wrap.d.ts +5 -0
  116. package/lib/private/database/wrap.js +5 -0
  117. package/lib/private/fail.d.ts +3 -0
  118. package/lib/private/fail.js +5 -0
  119. package/lib/private/frontend/Component.d.ts +8 -0
  120. package/lib/private/frontend/Component.js +2 -0
  121. package/lib/private/frontend/Module.d.ts +60 -0
  122. package/lib/private/frontend/Module.js +241 -0
  123. package/lib/private/frontend/Publish.d.ts +5 -0
  124. package/lib/private/frontend/Publish.js +2 -0
  125. package/lib/private/frontend/Render.d.ts +9 -0
  126. package/lib/private/frontend/Render.js +2 -0
  127. package/lib/private/frontend/ServerComponent.d.ts +5 -0
  128. package/lib/private/frontend/ServerComponent.js +2 -0
  129. package/lib/private/frontend/ServerData.d.ts +7 -0
  130. package/lib/private/frontend/ServerData.js +2 -0
  131. package/lib/private/frontend/ViewOptions.d.ts +12 -0
  132. package/lib/private/frontend/ViewOptions.js +3 -0
  133. package/lib/private/frontend/ViewResponse.d.ts +6 -0
  134. package/lib/private/frontend/ViewResponse.js +2 -0
  135. package/lib/private/frontend/bundle-server.d.ts +11 -0
  136. package/lib/private/frontend/bundle-server.js +48 -0
  137. package/lib/private/hash.d.ts +3 -0
  138. package/lib/private/hash.js +10 -0
  139. package/lib/private/hook/build.d.ts +4 -0
  140. package/lib/private/hook/build.js +245 -0
  141. package/lib/private/hook/serve.d.ts +4 -0
  142. package/lib/private/hook/serve.js +13 -0
  143. package/lib/private/i18n/API.d.ts +21 -0
  144. package/lib/private/i18n/API.js +2 -0
  145. package/lib/private/i18n/Catalog.d.ts +4 -0
  146. package/lib/private/i18n/Catalog.js +2 -0
  147. package/lib/private/i18n/Catalogs.d.ts +4 -0
  148. package/lib/private/i18n/Catalogs.js +2 -0
  149. package/lib/private/i18n/Config.d.ts +10 -0
  150. package/lib/private/i18n/Config.js +2 -0
  151. package/lib/private/i18n/ContextData.d.ts +6 -0
  152. package/lib/private/i18n/ContextData.js +2 -0
  153. package/lib/private/i18n/Formatter.d.ts +18 -0
  154. package/lib/private/i18n/Formatter.js +108 -0
  155. package/lib/private/i18n/Module.d.ts +16 -0
  156. package/lib/private/i18n/Module.js +109 -0
  157. package/lib/private/i18n/PersistMode.d.ts +3 -0
  158. package/lib/private/i18n/PersistMode.js +2 -0
  159. package/lib/private/i18n/TypeOf.d.ts +4 -0
  160. package/lib/private/i18n/TypeOf.js +2 -0
  161. package/lib/private/i18n/constant/COOKIE_NAME.d.ts +3 -0
  162. package/lib/private/i18n/constant/COOKIE_NAME.js +2 -0
  163. package/lib/private/i18n/constant/DEFAULT_LOCALE.d.ts +3 -0
  164. package/lib/private/i18n/constant/DEFAULT_LOCALE.js +2 -0
  165. package/lib/private/i18n/constant/DEFAULT_PERSIST_MODE.d.ts +3 -0
  166. package/lib/private/i18n/constant/DEFAULT_PERSIST_MODE.js +2 -0
  167. package/lib/private/i18n/constant/PERSIST_HEADER.d.ts +3 -0
  168. package/lib/private/i18n/constant/PERSIST_HEADER.js +2 -0
  169. package/lib/private/i18n/constant/PERSIST_METHOD.d.ts +3 -0
  170. package/lib/private/i18n/constant/PERSIST_METHOD.js +2 -0
  171. package/lib/private/i18n/constant/PERSIST_STORAGE_KEY.d.ts +3 -0
  172. package/lib/private/i18n/constant/PERSIST_STORAGE_KEY.js +2 -0
  173. package/lib/private/i18n/index.d.ts +28 -0
  174. package/lib/private/i18n/index.js +236 -0
  175. package/lib/private/i18n/locale.d.ts +5 -0
  176. package/lib/private/i18n/locale.js +4 -0
  177. package/lib/private/i18n/ordinals.d.ts +4 -0
  178. package/lib/private/i18n/ordinals.js +52 -0
  179. package/lib/private/i18n/schema.d.ts +8 -0
  180. package/lib/private/i18n/schema.js +13 -0
  181. package/lib/private/i18n/symbol/internal.d.ts +3 -0
  182. package/lib/private/i18n/symbol/internal.js +3 -0
  183. package/lib/private/i18n/toIntlUnit.d.ts +3 -0
  184. package/lib/private/i18n/toIntlUnit.js +125 -0
  185. package/lib/private/inline.d.ts +7 -0
  186. package/lib/private/inline.js +12 -0
  187. package/lib/private/location.d.ts +17 -0
  188. package/lib/private/location.js +29 -0
  189. package/lib/private/log.d.ts +19 -0
  190. package/lib/private/log.js +46 -0
  191. package/lib/private/module/BuildHook.d.ts +5 -0
  192. package/lib/private/module/BuildHook.js +2 -0
  193. package/lib/private/module/Hook.d.ts +5 -0
  194. package/lib/private/module/Hook.js +2 -0
  195. package/lib/private/module/Next.d.ts +4 -0
  196. package/lib/private/module/Next.js +2 -0
  197. package/lib/private/module/NextBuild.d.ts +5 -0
  198. package/lib/private/module/NextBuild.js +2 -0
  199. package/lib/private/module/NextHandle.d.ts +5 -0
  200. package/lib/private/module/NextHandle.js +2 -0
  201. package/lib/private/module/NextRoute.d.ts +6 -0
  202. package/lib/private/module/NextRoute.js +2 -0
  203. package/lib/private/module/NextServe.d.ts +5 -0
  204. package/lib/private/module/NextServe.js +2 -0
  205. package/lib/private/module/RequestHook.d.ts +6 -0
  206. package/lib/private/module/RequestHook.js +2 -0
  207. package/lib/private/reducer.d.ts +24 -0
  208. package/lib/private/reducer.js +10 -0
  209. package/lib/private/request/RequestBag.d.ts +80 -0
  210. package/lib/private/request/RequestBag.js +119 -0
  211. package/lib/private/request/RequestBody.d.ts +39 -0
  212. package/lib/private/request/RequestBody.js +91 -0
  213. package/lib/private/request/RequestFacade.d.ts +20 -0
  214. package/lib/private/request/RequestFacade.js +2 -0
  215. package/lib/private/request/Verb.d.ts +4 -0
  216. package/lib/private/request/Verb.js +2 -0
  217. package/lib/private/request/parse.d.ts +4 -0
  218. package/lib/private/request/parse.js +69 -0
  219. package/lib/private/request/route.d.ts +4 -0
  220. package/lib/private/request/route.js +61 -0
  221. package/lib/private/request/router.d.ts +5 -0
  222. package/lib/private/request/router.js +56 -0
  223. package/lib/private/request/verbs.d.ts +3 -0
  224. package/lib/private/request/verbs.js +12 -0
  225. package/lib/private/response/ResponseFunction.d.ts +8 -0
  226. package/lib/private/response/ResponseFunction.js +2 -0
  227. package/lib/private/response/ResponseLike.d.ts +6 -0
  228. package/lib/private/response/ResponseLike.js +2 -0
  229. package/lib/private/response/binary.d.ts +10 -0
  230. package/lib/private/response/binary.js +47 -0
  231. package/lib/private/response/error.d.ts +18 -0
  232. package/lib/private/response/error.js +18 -0
  233. package/lib/private/response/json.d.ts +9 -0
  234. package/lib/private/response/json.js +10 -0
  235. package/lib/private/response/redirect.d.ts +11 -0
  236. package/lib/private/response/redirect.js +62 -0
  237. package/lib/private/response/respond.d.ts +5 -0
  238. package/lib/private/response/respond.js +31 -0
  239. package/lib/private/response/sse.d.ts +15 -0
  240. package/lib/private/response/sse.js +25 -0
  241. package/lib/private/response/text.d.ts +9 -0
  242. package/lib/private/response/text.js +11 -0
  243. package/lib/private/response/view.d.ts +11 -0
  244. package/lib/private/response/view.js +41 -0
  245. package/lib/private/response/ws.d.ts +5 -0
  246. package/lib/private/response/ws.js +2 -0
  247. package/lib/private/response.d.ts +5 -0
  248. package/lib/private/response.js +2 -0
  249. package/lib/private/route/Handler.d.ts +6 -0
  250. package/lib/private/route/Handler.js +2 -0
  251. package/lib/private/route/Options.d.ts +5 -0
  252. package/lib/private/route/Options.js +2 -0
  253. package/lib/private/route/Path.d.ts +11 -0
  254. package/lib/private/route/Path.js +2 -0
  255. package/lib/private/route/guard.d.ts +4 -0
  256. package/lib/private/route/guard.js +22 -0
  257. package/lib/private/route/router.d.ts +51 -0
  258. package/lib/private/route/router.js +32 -0
  259. package/lib/private/route/wrap.d.ts +6 -0
  260. package/lib/private/route/wrap.js +17 -0
  261. package/lib/private/route.d.ts +9 -0
  262. package/lib/private/route.js +6 -0
  263. package/lib/private/serve.d.ts +5 -0
  264. package/lib/private/serve.js +8 -0
  265. package/lib/private/session/Config.d.ts +4 -0
  266. package/lib/private/session/Config.js +2 -0
  267. package/lib/private/session/Data.d.ts +5 -0
  268. package/lib/private/session/Data.js +2 -0
  269. package/lib/private/session/InMemoryManager.d.ts +9 -0
  270. package/lib/private/session/InMemoryManager.js +23 -0
  271. package/lib/private/session/Manager.d.ts +9 -0
  272. package/lib/private/session/Manager.js +4 -0
  273. package/lib/private/session/SessionFacade.d.ts +56 -0
  274. package/lib/private/session/SessionFacade.js +2 -0
  275. package/lib/private/session/SessionHandle.d.ts +20 -0
  276. package/lib/private/session/SessionHandle.js +67 -0
  277. package/lib/private/session/SessionModule.d.ts +13 -0
  278. package/lib/private/session/SessionModule.js +99 -0
  279. package/lib/private/session/index.d.ts +13 -0
  280. package/lib/private/session/index.js +41 -0
  281. package/lib/private/session/k-serialize.d.ts +3 -0
  282. package/lib/private/session/k-serialize.js +2 -0
  283. package/lib/private/session/schema.d.ts +14 -0
  284. package/lib/private/session/schema.js +20 -0
  285. package/lib/private/session/storage.d.ts +5 -0
  286. package/lib/private/session/storage.js +5 -0
  287. package/lib/private/symbol/config.d.ts +3 -0
  288. package/lib/private/symbol/config.js +2 -0
  289. package/lib/private/symbol/layout-depth.d.ts +3 -0
  290. package/lib/private/symbol/layout-depth.js +2 -0
  291. package/lib/private/tags.d.ts +10 -0
  292. package/lib/private/tags.js +29 -0
  293. package/lib/private/target/Manager.d.ts +14 -0
  294. package/lib/private/target/Manager.js +44 -0
  295. package/lib/private/target/Target.d.ts +8 -0
  296. package/lib/private/target/Target.js +3 -0
  297. package/lib/private/target/web.d.ts +4 -0
  298. package/lib/private/target/web.js +68 -0
  299. package/lib/private/wasm/API.d.ts +7 -0
  300. package/lib/private/wasm/API.js +2 -0
  301. package/lib/private/wasm/BufferViewSource.d.ts +4 -0
  302. package/lib/private/wasm/BufferViewSource.js +2 -0
  303. package/lib/private/wasm/Exports.d.ts +23 -0
  304. package/lib/private/wasm/Exports.js +2 -0
  305. package/lib/private/wasm/I32.d.ts +5 -0
  306. package/lib/private/wasm/I32.js +2 -0
  307. package/lib/private/wasm/I32_SIZE.d.ts +3 -0
  308. package/lib/private/wasm/I32_SIZE.js +2 -0
  309. package/lib/private/wasm/Instantiation.d.ts +12 -0
  310. package/lib/private/wasm/Instantiation.js +2 -0
  311. package/lib/private/wasm/Tagged.d.ts +7 -0
  312. package/lib/private/wasm/Tagged.js +2 -0
  313. package/lib/private/wasm/buffersize.d.ts +2 -0
  314. package/lib/private/wasm/buffersize.js +5 -0
  315. package/lib/private/wasm/decode-bytes.d.ts +3 -0
  316. package/lib/private/wasm/decode-bytes.js +5 -0
  317. package/lib/private/wasm/decode-json.d.ts +7 -0
  318. package/lib/private/wasm/decode-json.js +11 -0
  319. package/lib/private/wasm/decode-option.d.ts +5 -0
  320. package/lib/private/wasm/decode-option.js +10 -0
  321. package/lib/private/wasm/decode-response.d.ts +19 -0
  322. package/lib/private/wasm/decode-response.js +90 -0
  323. package/lib/private/wasm/decode-string.d.ts +3 -0
  324. package/lib/private/wasm/decode-string.js +5 -0
  325. package/lib/private/wasm/decode-websocket-close.d.ts +5 -0
  326. package/lib/private/wasm/decode-websocket-close.js +6 -0
  327. package/lib/private/wasm/decode-websocket-send.d.ts +6 -0
  328. package/lib/private/wasm/decode-websocket-send.js +19 -0
  329. package/lib/private/wasm/encode-buffer.d.ts +3 -0
  330. package/lib/private/wasm/encode-buffer.js +6 -0
  331. package/lib/private/wasm/encode-request.d.ts +9 -0
  332. package/lib/private/wasm/encode-request.js +198 -0
  333. package/lib/private/wasm/encode-session.d.ts +3 -0
  334. package/lib/private/wasm/encode-session.js +25 -0
  335. package/lib/private/wasm/encode-string-map.d.ts +5 -0
  336. package/lib/private/wasm/encode-string-map.js +14 -0
  337. package/lib/private/wasm/encode-string.d.ts +13 -0
  338. package/lib/private/wasm/encode-string.js +17 -0
  339. package/lib/private/wasm/encode-url.d.ts +11 -0
  340. package/lib/private/wasm/encode-url.js +14 -0
  341. package/lib/private/wasm/encode-websocket-close.d.ts +2 -0
  342. package/lib/private/wasm/encode-websocket-close.js +7 -0
  343. package/lib/private/wasm/encode-websocket-message.d.ts +4 -0
  344. package/lib/private/wasm/encode-websocket-message.js +30 -0
  345. package/lib/private/wasm/encode-websocket-open.d.ts +2 -0
  346. package/lib/private/wasm/encode-websocket-open.js +7 -0
  347. package/lib/private/wasm/filesize.d.ts +2 -0
  348. package/lib/private/wasm/filesize.js +8 -0
  349. package/lib/private/wasm/instantiate.d.ts +37 -0
  350. package/lib/private/wasm/instantiate.js +408 -0
  351. package/lib/private/wasm/open-websocket.d.ts +4 -0
  352. package/lib/private/wasm/open-websocket.js +26 -0
  353. package/lib/private/wasm/stringsize.d.ts +3 -0
  354. package/lib/private/wasm/stringsize.js +5 -0
  355. package/lib/private/wasm/urlsize.d.ts +2 -0
  356. package/lib/private/wasm/urlsize.js +5 -0
  357. package/lib/public/App.d.ts +2 -0
  358. package/lib/public/App.js +2 -0
  359. package/lib/public/AppError.d.ts +2 -0
  360. package/lib/public/AppError.js +2 -0
  361. package/lib/public/BuildApp.d.ts +2 -0
  362. package/lib/public/BuildApp.js +2 -0
  363. package/lib/public/BuildHook.d.ts +2 -0
  364. package/lib/public/BuildHook.js +2 -0
  365. package/lib/public/Database.d.ts +2 -0
  366. package/lib/public/Database.js +2 -0
  367. package/lib/public/Loader.d.ts +2 -0
  368. package/lib/public/Loader.js +2 -0
  369. package/lib/public/Mode.d.ts +2 -0
  370. package/lib/public/Mode.js +2 -0
  371. package/lib/public/Module.d.ts +2 -0
  372. package/lib/public/Module.js +2 -0
  373. package/lib/public/Next.d.ts +2 -0
  374. package/lib/public/Next.js +2 -0
  375. package/lib/public/NextBuild.d.ts +2 -0
  376. package/lib/public/NextBuild.js +2 -0
  377. package/lib/public/NextHandle.d.ts +2 -0
  378. package/lib/public/NextHandle.js +2 -0
  379. package/lib/public/NextRoute.d.ts +3 -0
  380. package/lib/public/NextRoute.js +2 -0
  381. package/lib/public/NextServe.d.ts +2 -0
  382. package/lib/public/NextServe.js +2 -0
  383. package/lib/public/ServeApp.d.ts +2 -0
  384. package/lib/public/ServeApp.js +2 -0
  385. package/lib/public/Target.d.ts +2 -0
  386. package/lib/public/Target.js +2 -0
  387. package/lib/public/backend/Module.d.ts +2 -0
  388. package/lib/public/backend/Module.js +2 -0
  389. package/lib/public/build.d.ts +2 -0
  390. package/lib/public/build.js +2 -0
  391. package/lib/public/client/App.d.ts +2 -0
  392. package/lib/public/client/App.js +2 -0
  393. package/lib/public/client/Data.d.ts +2 -0
  394. package/lib/public/client/Data.js +2 -0
  395. package/lib/public/client/ValidateInit.d.ts +2 -0
  396. package/lib/public/client/ValidateInit.js +2 -0
  397. package/lib/public/client/ValidateUpdater.d.ts +2 -0
  398. package/lib/public/client/ValidateUpdater.js +2 -0
  399. package/lib/public/client/ValidationError.d.ts +2 -0
  400. package/lib/public/client/ValidationError.js +2 -0
  401. package/lib/public/client/spa.d.ts +2 -0
  402. package/lib/public/client/spa.js +2 -0
  403. package/lib/public/client/toValidated.d.ts +2 -0
  404. package/lib/public/client/toValidated.js +2 -0
  405. package/lib/public/client/validate.d.ts +2 -0
  406. package/lib/public/client/validate.js +2 -0
  407. package/lib/public/config.d.ts +2 -0
  408. package/lib/public/config.js +2 -0
  409. package/lib/public/database/As.d.ts +2 -0
  410. package/lib/public/database/As.js +2 -0
  411. package/lib/public/database/DataDict.d.ts +2 -0
  412. package/lib/public/database/DataDict.js +2 -0
  413. package/lib/public/database/InMemoryDatabase.d.ts +2 -0
  414. package/lib/public/database/InMemoryDatabase.js +2 -0
  415. package/lib/public/database/Sort.d.ts +2 -0
  416. package/lib/public/database/Sort.js +2 -0
  417. package/lib/public/database/Store.d.ts +2 -0
  418. package/lib/public/database/Store.js +2 -0
  419. package/lib/public/database/TypeMap.d.ts +2 -0
  420. package/lib/public/database/TypeMap.js +2 -0
  421. package/lib/public/database/Types.d.ts +2 -0
  422. package/lib/public/database/Types.js +2 -0
  423. package/lib/public/database/test.d.ts +2 -0
  424. package/lib/public/database/test.js +2 -0
  425. package/lib/public/database/wrap.d.ts +2 -0
  426. package/lib/public/database/wrap.js +2 -0
  427. package/lib/public/frontend/Module.d.ts +2 -0
  428. package/lib/public/frontend/Module.js +2 -0
  429. package/lib/public/frontend/Publish.d.ts +2 -0
  430. package/lib/public/frontend/Publish.js +2 -0
  431. package/lib/public/frontend/Render.d.ts +2 -0
  432. package/lib/public/frontend/Render.js +2 -0
  433. package/lib/public/frontend/ViewResponse.d.ts +2 -0
  434. package/lib/public/frontend/ViewResponse.js +2 -0
  435. package/lib/public/i18n/API.d.ts +2 -0
  436. package/lib/public/i18n/API.js +2 -0
  437. package/lib/public/i18n/Catalogs.d.ts +2 -0
  438. package/lib/public/i18n/Catalogs.js +2 -0
  439. package/lib/public/i18n/ContextData.d.ts +2 -0
  440. package/lib/public/i18n/ContextData.js +2 -0
  441. package/lib/public/i18n/config.d.ts +2 -0
  442. package/lib/public/i18n/config.js +2 -0
  443. package/lib/public/i18n/locale.d.ts +2 -0
  444. package/lib/public/i18n/locale.js +2 -0
  445. package/lib/public/i18n/sInternal.d.ts +2 -0
  446. package/lib/public/i18n/sInternal.js +2 -0
  447. package/lib/public/inline.d.ts +2 -0
  448. package/lib/public/inline.js +2 -0
  449. package/lib/public/location.d.ts +2 -0
  450. package/lib/public/location.js +2 -0
  451. package/lib/public/log.d.ts +2 -0
  452. package/{src/log/index.js → lib/public/log.js} +1 -0
  453. package/lib/public/request/RequestBody.d.ts +2 -0
  454. package/lib/public/request/RequestBody.js +2 -0
  455. package/lib/public/request/RequestFacade.d.ts +2 -0
  456. package/lib/public/request/RequestFacade.js +2 -0
  457. package/lib/public/request/Verb.d.ts +2 -0
  458. package/lib/public/request/Verb.js +2 -0
  459. package/lib/public/request/verbs.d.ts +2 -0
  460. package/lib/public/request/verbs.js +2 -0
  461. package/lib/public/response/ResponseFunction.d.ts +2 -0
  462. package/lib/public/response/ResponseFunction.js +2 -0
  463. package/lib/public/response/ResponseLike.d.ts +2 -0
  464. package/lib/public/response/ResponseLike.js +2 -0
  465. package/lib/public/response/binary.d.ts +2 -0
  466. package/lib/public/response/binary.js +2 -0
  467. package/lib/public/response/error.d.ts +2 -0
  468. package/lib/public/response/error.js +2 -0
  469. package/lib/public/response/json.d.ts +2 -0
  470. package/lib/public/response/json.js +2 -0
  471. package/lib/public/response/redirect.d.ts +2 -0
  472. package/lib/public/response/redirect.js +2 -0
  473. package/lib/public/response/sse.d.ts +2 -0
  474. package/lib/public/response/sse.js +2 -0
  475. package/lib/public/response/text.d.ts +2 -0
  476. package/lib/public/response/text.js +2 -0
  477. package/lib/public/response/view.d.ts +2 -0
  478. package/lib/public/response/view.js +2 -0
  479. package/lib/public/response/ws.d.ts +2 -0
  480. package/lib/public/response/ws.js +2 -0
  481. package/lib/public/route/router.d.ts +2 -0
  482. package/lib/public/route/router.js +2 -0
  483. package/lib/public/route/wrap.d.ts +2 -0
  484. package/lib/public/route/wrap.js +2 -0
  485. package/lib/public/route.d.ts +2 -0
  486. package/lib/public/route.js +2 -0
  487. package/lib/public/serve.d.ts +2 -0
  488. package/lib/public/serve.js +2 -0
  489. package/lib/public/session/Manager.d.ts +2 -0
  490. package/lib/public/session/Manager.js +2 -0
  491. package/lib/public/session/config.d.ts +2 -0
  492. package/lib/public/session/config.js +2 -0
  493. package/lib/public/symbol/config.d.ts +2 -0
  494. package/lib/public/symbol/config.js +2 -0
  495. package/lib/public/wasm/decode-json.d.ts +5 -0
  496. package/lib/public/wasm/decode-json.js +3 -0
  497. package/lib/public/wasm/decode-response.d.ts +3 -0
  498. package/lib/public/wasm/decode-response.js +3 -0
  499. package/lib/public/wasm/encode-request.d.ts +3 -0
  500. package/lib/public/wasm/encode-request.js +3 -0
  501. package/lib/public/wasm/encode-session.d.ts +3 -0
  502. package/lib/public/wasm/encode-session.js +3 -0
  503. package/lib/public/wasm/instantiate.d.ts +4 -0
  504. package/lib/public/wasm/instantiate.js +3 -0
  505. package/package.json +41 -35
  506. package/src/build/app.js +0 -99
  507. package/src/build/hook/build.js +0 -188
  508. package/src/build/hook/copy_includes.js +0 -20
  509. package/src/build/hook/exports.js +0 -2
  510. package/src/build/hook/init.js +0 -3
  511. package/src/build/hook/router.js +0 -33
  512. package/src/build/index.js +0 -49
  513. package/src/build/module_loader.js +0 -30
  514. package/src/build/targets/exports.js +0 -1
  515. package/src/build/targets/web.js +0 -70
  516. package/src/dispatch/index.js +0 -1
  517. package/src/http/verbs.js +0 -11
  518. package/src/private/config-filename.js +0 -1
  519. package/src/private/config.js +0 -48
  520. package/src/private/depend.js +0 -20
  521. package/src/private/dispatch.js +0 -18
  522. package/src/private/error/bad-body.js +0 -6
  523. package/src/private/error/bad-default-export.js +0 -6
  524. package/src/private/error/bad-path.js +0 -6
  525. package/src/private/error/bad-type-export.js +0 -6
  526. package/src/private/error/bad-type-name.js +0 -6
  527. package/src/private/error/double-extension.js +0 -6
  528. package/src/private/error/double-module.js +0 -6
  529. package/src/private/error/double-path-parameter.js +0 -6
  530. package/src/private/error/double-route.js +0 -6
  531. package/src/private/error/empty-config-file.js +0 -6
  532. package/src/private/error/empty-directory.js +0 -6
  533. package/src/private/error/empty-path-parameter.js +0 -6
  534. package/src/private/error/empty-route-file.js +0 -6
  535. package/src/private/error/error-in-config-file.js +0 -6
  536. package/src/private/error/mismatched-body.js +0 -6
  537. package/src/private/error/mismatched-path.js +0 -6
  538. package/src/private/error/mismatched-type.js +0 -6
  539. package/src/private/error/module-no-name.js +0 -6
  540. package/src/private/error/modules-array.js +0 -6
  541. package/src/private/error/no-handler.js +0 -6
  542. package/src/private/error/no-route-to-path.js +0 -6
  543. package/src/private/error/optional-route.js +0 -6
  544. package/src/private/error/reserved-type-name.js +0 -6
  545. package/src/private/error/rest-route.js +0 -6
  546. package/src/private/error.js +0 -15
  547. package/src/private/log.js +0 -69
  548. package/src/private/loglevel.js +0 -9
  549. package/src/private/mark.js +0 -5
  550. package/src/private/validate.js +0 -11
  551. package/src/serve/app.js +0 -206
  552. package/src/serve/handler/error.js +0 -10
  553. package/src/serve/handler/json.js +0 -10
  554. package/src/serve/handler/redirect.js +0 -11
  555. package/src/serve/handler/shared/base.js +0 -4
  556. package/src/serve/handler/sse.js +0 -24
  557. package/src/serve/handler/stream.js +0 -4
  558. package/src/serve/handler/text.js +0 -10
  559. package/src/serve/handler/view.js +0 -15
  560. package/src/serve/handler/ws.js +0 -2
  561. package/src/serve/hook/exports.js +0 -5
  562. package/src/serve/hook/handle.js +0 -106
  563. package/src/serve/hook/init.js +0 -3
  564. package/src/serve/hook/parse.js +0 -17
  565. package/src/serve/hook/respond.js +0 -28
  566. package/src/serve/hook/route.js +0 -50
  567. package/src/serve/hook/serve.js +0 -53
  568. package/src/serve/index.js +0 -9
  569. package/src/serve/module_loader.js +0 -16
  570. package/src/serve/to_sorted.js +0 -1
  571. /package/{src/build → lib/private}/defaults/app.html +0 -0
  572. /package/{src/build → lib/private}/defaults/error.html +0 -0
@@ -0,0 +1,56 @@
1
+ import type As from "#database/As";
2
+ import type Binds from "#database/Binds";
3
+ import type DataDict from "#database/DataDict";
4
+ import type DataKey from "#database/DataKey";
5
+ import type Sort from "#database/Sort";
6
+ import type TypeMap from "#database/TypeMap";
7
+ import type Types from "#database/Types";
8
+ import type Dict from "@rcompat/type/Dict";
9
+ import type MaybePromise from "@rcompat/type/MaybePromise";
10
+ import type StoreSchema from "pema/StoreSchema";
11
+ export default abstract class Database {
12
+ #private;
13
+ abstract close(): MaybePromise<void>;
14
+ constructor(bindPrefix?: string);
15
+ ident(name: string): string;
16
+ table(as: As): string;
17
+ toSelect(types: Types, columns?: string[]): string;
18
+ toSort(types: Types, sort?: Sort): string;
19
+ toLimit(limit?: number): string;
20
+ toWhere(types: Types, criteria: DataDict): string;
21
+ toSet(types: Types, changes: DataDict): Promise<{
22
+ set: string;
23
+ binds: Binds;
24
+ }>;
25
+ column(key: DataKey): string;
26
+ abstract get typemap(): TypeMap;
27
+ abstract schema: {
28
+ create(name: string, description: StoreSchema): MaybePromise<void>;
29
+ delete(name: string): MaybePromise<void>;
30
+ };
31
+ formatBinds(binds: Binds): Binds;
32
+ bind<In extends DataDict>(types: Types, object: In): Promise<Binds>;
33
+ bindCriteria(types: Types, criteria: DataDict): Promise<Binds>;
34
+ unbind(types: Types, object: Dict): Dict;
35
+ abstract create<O extends Dict>(as: As, args: {
36
+ record: Dict;
37
+ }): MaybePromise<O>;
38
+ abstract read(as: As, args: {
39
+ count: true;
40
+ criteria: Dict;
41
+ }): MaybePromise<number>;
42
+ abstract read(as: As, args: {
43
+ criteria: Dict;
44
+ fields?: string[];
45
+ limit?: number;
46
+ sort?: Sort;
47
+ }): MaybePromise<Dict[]>;
48
+ abstract update(as: As, args: {
49
+ changes: Dict;
50
+ criteria: Dict;
51
+ }): MaybePromise<number>;
52
+ abstract delete(as: As, args: {
53
+ criteria: Dict;
54
+ }): MaybePromise<number>;
55
+ }
56
+ //# sourceMappingURL=Database.d.ts.map
@@ -0,0 +1,153 @@
1
+ import fail from "#fail";
2
+ import maybe from "@rcompat/assert/maybe";
3
+ import entries from "@rcompat/record/entries";
4
+ function required(operation) {
5
+ fail("{0}: at least one column required", operation);
6
+ }
7
+ function normalizeSort(direction) {
8
+ if (typeof direction !== "string")
9
+ throw fail("invalid sort direction {0}", direction);
10
+ const lowered = direction.toLowerCase();
11
+ if (lowered !== "asc" && lowered !== "desc")
12
+ throw fail("invalid sort direction {0}", direction);
13
+ return lowered.toUpperCase();
14
+ }
15
+ export default class Database {
16
+ #bindPrefix;
17
+ constructor(bindPrefix) {
18
+ this.#bindPrefix = bindPrefix ?? "";
19
+ }
20
+ #assert(types, columns) {
21
+ const known = new Set(Object.keys(types));
22
+ const unknown = columns.filter(c => !known.has(c));
23
+ if (unknown.length > 0) {
24
+ throw fail("unknown column(s) {0}", unknown.join(", "));
25
+ }
26
+ }
27
+ #quote(name) {
28
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
29
+ throw fail("invalid identifier {0}", name);
30
+ }
31
+ return `\`${name}\``;
32
+ }
33
+ ident(name) {
34
+ return this.#quote(name);
35
+ }
36
+ table(as) {
37
+ return this.#quote(as.name);
38
+ }
39
+ toSelect(types, columns) {
40
+ maybe(columns).array();
41
+ if (!columns)
42
+ return "*";
43
+ if (columns.length === 0)
44
+ throw required("select");
45
+ this.#assert(types, columns);
46
+ return columns.map(this.#quote).join(", ");
47
+ }
48
+ toSort(types, sort) {
49
+ maybe(sort).record();
50
+ if (!sort)
51
+ return "";
52
+ const columns = Object.entries(sort);
53
+ if (columns.length === 0)
54
+ throw required("sort");
55
+ this.#assert(types, columns.map(([k]) => k));
56
+ const order = columns
57
+ .map(([k, direction]) => `${this.#quote(k)} ${normalizeSort(direction)}`)
58
+ .join(", ");
59
+ return ` ORDER BY ${order}`;
60
+ }
61
+ toLimit(limit) {
62
+ maybe(limit).usize();
63
+ return limit !== undefined ? ` LIMIT ${limit}` : "";
64
+ }
65
+ toWhere(types, criteria) {
66
+ const columns = Object.keys(criteria);
67
+ this.#assert(types, columns);
68
+ if (columns.length === 0)
69
+ return "";
70
+ const p = this.#bindPrefix; // "$" or ":"
71
+ const parts = columns.map(column => {
72
+ const value = criteria[column];
73
+ // null criteria
74
+ if (value === null)
75
+ return `${this.#quote(column)} IS NULL`;
76
+ if (typeof value === "object") {
77
+ if ("$like" in value) {
78
+ return `${this.#quote(column)} LIKE ${p}${column}`;
79
+ }
80
+ //if ("$gte" in value) return `${this.#quote(column)} >= ${p}${column}`;
81
+ throw fail("unsupported operator in field {0}", column);
82
+ }
83
+ return `${this.#quote(column)}=${p}${column}`;
84
+ });
85
+ return `WHERE ${parts.join(" AND ")}`;
86
+ }
87
+ async toSet(types, changes) {
88
+ const columns = Object.keys(changes);
89
+ this.#assert(types, columns);
90
+ if (columns.length === 0)
91
+ throw required("set");
92
+ const p = this.#bindPrefix; // "$" or ":"
93
+ const set = `SET ${columns.map(c => `${this.#quote(c)}=${p}s_${c}`).join(", ")}`;
94
+ const raw = Object.fromEntries(columns.map(c => [`s_${c}`, changes[c]]));
95
+ // bind original keys (e.g. { age: 35 } -> { $age: 35 })
96
+ const binds = await this.bind(types, raw);
97
+ return { set, binds };
98
+ }
99
+ #bind(key, value) {
100
+ return value === null
101
+ ? null
102
+ : this.typemap[key].bind(value);
103
+ }
104
+ #unbind(key, value) {
105
+ return this.typemap[key].unbind(value);
106
+ }
107
+ column(key) {
108
+ return this.typemap[key].column;
109
+ }
110
+ ;
111
+ // identity
112
+ formatBinds(binds) {
113
+ return binds;
114
+ }
115
+ async bind(types, object) {
116
+ const out = Object.fromEntries(await Promise.all(Object.entries(object).map(async ([key, value]) => {
117
+ // support "s_" pseudo-namespace for SET params
118
+ const base = key.startsWith("s_") ? key.slice(2) : key;
119
+ const bound = await this.#bind(types[base], value);
120
+ return [`${this.#bindPrefix}${key}`, bound];
121
+ })));
122
+ return this.formatBinds(out);
123
+ }
124
+ async bindCriteria(types, criteria) {
125
+ const filtered = {};
126
+ for (const [key, value] of Object.entries(criteria)) {
127
+ // null isn't bound
128
+ if (value === null)
129
+ continue;
130
+ if (typeof value === "object") {
131
+ // extract primitive value from operator object
132
+ if ("$like" in value) {
133
+ if (typeof value.$like !== "string") {
134
+ throw fail("$like operator requires string value, got {0}", typeof value.$like);
135
+ }
136
+ filtered[key] = value.$like;
137
+ }
138
+ }
139
+ else {
140
+ filtered[key] = value;
141
+ }
142
+ }
143
+ return this.bind(types, filtered);
144
+ }
145
+ unbind(types, object) {
146
+ return entries(object)
147
+ .filter(([, value]) => value !== null)
148
+ .map(([key, value]) => [key, this.#unbind(types[key], value)])
149
+ .get();
150
+ }
151
+ }
152
+ ;
153
+ //# sourceMappingURL=Database.js.map
@@ -0,0 +1,37 @@
1
+ import type As from "#database/As";
2
+ import Database from "#database/Database";
3
+ import type DataDict from "#database/DataDict";
4
+ import type Sort from "#database/Sort";
5
+ import type TypeMap from "#database/TypeMap";
6
+ import type Dict from "@rcompat/type/Dict";
7
+ import type MaybePromise from "@rcompat/type/MaybePromise";
8
+ export default class InMemoryDatabase extends Database {
9
+ #private;
10
+ get typemap(): TypeMap<Dict>;
11
+ get schema(): {
12
+ create: (name: string) => void;
13
+ delete: (name: string) => void;
14
+ };
15
+ close(): void;
16
+ create<O extends Dict>(as: As, args: {
17
+ record: Dict;
18
+ }): MaybePromise<O>;
19
+ read(as: As, args: {
20
+ count: true;
21
+ criteria: DataDict;
22
+ }): number;
23
+ read(as: As, args: {
24
+ criteria: DataDict;
25
+ fields?: string[];
26
+ limit?: number;
27
+ sort?: Sort;
28
+ }): Dict[];
29
+ update(as: As, args: {
30
+ changes: DataDict;
31
+ criteria: DataDict;
32
+ }): Promise<number>;
33
+ delete(as: As, args: {
34
+ criteria: DataDict;
35
+ }): number;
36
+ }
37
+ //# sourceMappingURL=InMemoryDatabase.d.ts.map
@@ -0,0 +1,181 @@
1
+ import Database from "#database/Database";
2
+ import fail from "#fail";
3
+ import assert from "@rcompat/assert";
4
+ import entries from "@rcompat/record/entries";
5
+ function match(record, criteria) {
6
+ return Object.entries(criteria).every(([k, v]) => {
7
+ const value = record[k];
8
+ // null criteria (IS NULL semantics)
9
+ if (v === null)
10
+ return !Object.hasOwn(record, k);
11
+ // handle operator objects
12
+ if (typeof v === "object") {
13
+ // $like operator
14
+ if ("$like" in v) {
15
+ // NULL values don't match LIKE patterns
16
+ if (value === null || value === undefined)
17
+ return false;
18
+ const $like = v.$like;
19
+ if (typeof $like !== "string")
20
+ throw fail("$like operator requires string, got {0}", typeof $like);
21
+ const regex = new RegExp("^" + $like.replace(/%/g, ".*").replace(/\?/g, ".") + "$");
22
+ return regex.test(String(value));
23
+ }
24
+ // future: number operators
25
+ // if ("$gte" in v) return recordValue >= v.$gte;
26
+ // if ("$gt" in v) return recordValue > v.$gt;
27
+ // if ("$lte" in v) return recordValue <= v.$lte;
28
+ // if ("$lt" in v) return recordValue < v.$lt;
29
+ return false; // unknown operator
30
+ }
31
+ // direct equality match
32
+ return value === v;
33
+ });
34
+ }
35
+ function filter(record, fields) {
36
+ return Object.fromEntries(Object.entries(record)
37
+ .filter(([key]) => fields.includes(key)));
38
+ }
39
+ function toSorted(d1, d2, sort) {
40
+ return [...entries(sort).valmap(([, value]) => value === "asc" ? 1 : -1)]
41
+ .reduce((sorting, [field, direction]) => {
42
+ const left = d1[field];
43
+ const right = d2[field];
44
+ // if sorting has been established, it stays fixed
45
+ if (sorting !== 0) {
46
+ return sorting;
47
+ }
48
+ // equal, sorting doesn't change
49
+ if (left === right) {
50
+ return sorting;
51
+ }
52
+ if (left < right) {
53
+ return -1 * direction;
54
+ }
55
+ return direction;
56
+ }, 0);
57
+ }
58
+ function ident(column) {
59
+ return {
60
+ bind: value => value,
61
+ column,
62
+ unbind: value => value,
63
+ };
64
+ }
65
+ const typemap = {
66
+ blob: ident("BLOB"),
67
+ boolean: ident("BOOLEAN"),
68
+ datetime: ident("DATE"),
69
+ f32: ident("NUMBER"),
70
+ f64: ident("NUMBER"),
71
+ i128: ident("BIGINT"),
72
+ i16: ident("NUMBER"),
73
+ i32: ident("NUMBER"),
74
+ i64: ident("BIGINT"),
75
+ i8: ident("NUMBER"),
76
+ primary: ident("STRING"),
77
+ string: ident("STRING"),
78
+ time: ident("STRING"),
79
+ u128: ident("BIGINT"),
80
+ u16: ident("NUMBER"),
81
+ u32: ident("NUMBER"),
82
+ u64: ident("BIGINT"),
83
+ u8: ident("NUMBER"),
84
+ url: ident("URL"),
85
+ };
86
+ export default class InMemoryDatabase extends Database {
87
+ #collections = {};
88
+ get typemap() {
89
+ return typemap;
90
+ }
91
+ #new(name) {
92
+ if (this.#collections[name] !== undefined) {
93
+ throw fail("collection {0} already exists", name);
94
+ }
95
+ this.#collections[name] = [];
96
+ }
97
+ #drop(name) {
98
+ if (this.#collections[name] === undefined) {
99
+ // do nothing
100
+ }
101
+ delete this.#collections[name];
102
+ }
103
+ #use(name) {
104
+ if (this.#collections[name] === undefined) {
105
+ this.#collections[name] = [];
106
+ }
107
+ return this.#collections[name];
108
+ }
109
+ get schema() {
110
+ return {
111
+ create: this.#new.bind(this),
112
+ delete: this.#drop.bind(this),
113
+ };
114
+ }
115
+ // noop
116
+ close() { }
117
+ create(as, args) {
118
+ const collection = this.#use(as.name);
119
+ const record = { ...args.record };
120
+ if (record.id === undefined) {
121
+ record.id = crypto.randomUUID();
122
+ }
123
+ ;
124
+ if (typeof record.id !== "string") {
125
+ throw fail("id must be string, got {0}", record.id);
126
+ }
127
+ if (collection.find(stored => stored.id === record.id)) {
128
+ throw fail("id {0} already exists in the database", record.id);
129
+ }
130
+ collection.push({ ...record });
131
+ return record;
132
+ }
133
+ read(as, args) {
134
+ this.toWhere(as.types, args.criteria);
135
+ if (args.fields !== undefined)
136
+ this.toSelect(as.types, args.fields);
137
+ if (args.sort !== undefined)
138
+ this.toSort(as.types, args.sort);
139
+ const collection = this.#use(as.name);
140
+ const matches = collection.filter(r => match(r, args.criteria));
141
+ if (args.count === true) {
142
+ return matches.length;
143
+ }
144
+ const sort = args.sort ?? {};
145
+ const sorted = Object.keys(sort).length === 0
146
+ ? matches
147
+ : matches.toSorted((a, b) => toSorted(a, b, sort));
148
+ const limit = args.limit ?? sorted.length;
149
+ const fields = args.fields ?? [];
150
+ return (fields.length === 0
151
+ ? sorted
152
+ : sorted.map(s => filter(s, fields))).slice(0, limit);
153
+ }
154
+ async update(as, args) {
155
+ assert(Object.keys(args.criteria).length > 0, "update: no criteria");
156
+ this.toWhere(as.types, args.criteria);
157
+ await this.toSet(as.types, args.changes);
158
+ const collection = this.#use(as.name);
159
+ const matched = collection.filter(record => match(record, args.criteria));
160
+ return matched.map(record => {
161
+ const changed = entries({ ...record, ...args.changes })
162
+ .filter(([, value]) => value !== null)
163
+ .get();
164
+ const index = collection.findIndex(stored => stored.id === record.id);
165
+ collection.splice(index, 1, changed);
166
+ return changed;
167
+ }).length;
168
+ }
169
+ delete(as, args) {
170
+ if (Object.keys(args.criteria).length === 0) {
171
+ throw fail("delete: no criteria");
172
+ }
173
+ this.toWhere(as.types, args.criteria);
174
+ const collection = this.#use(as.name);
175
+ const size_before = collection.length;
176
+ this.#collections[as.name] = collection
177
+ .filter(record => !match(record, args.criteria));
178
+ return size_before - this.#use(as.name).length;
179
+ }
180
+ }
181
+ //# sourceMappingURL=InMemoryDatabase.js.map
@@ -0,0 +1,14 @@
1
+ import type StoreSchema from "pema/StoreSchema";
2
+ import type DataRecord from "#database/DataRecord";
3
+ type X<T> = {
4
+ [K in keyof T]: T[K];
5
+ } & {};
6
+ type Filter<T, P extends keyof T> = X<Pick<T, Extract<P, keyof T>>>;
7
+ export default class Query<T extends StoreSchema, P extends keyof DataRecord<T> = keyof DataRecord<T>> {
8
+ #private;
9
+ constructor(schema: T);
10
+ select<K extends P>(...projection: K[]): Query<T, K>;
11
+ run(): Promise<Filter<DataRecord<T>, P>>;
12
+ }
13
+ export {};
14
+ //# sourceMappingURL=Query.d.ts.map
@@ -0,0 +1,15 @@
1
+ export default class Query {
2
+ #schema;
3
+ #projection;
4
+ constructor(schema) {
5
+ this.#schema = schema;
6
+ }
7
+ select(...projection) {
8
+ this.#projection = projection;
9
+ return this;
10
+ }
11
+ async run() {
12
+ return this.#schema.infer;
13
+ }
14
+ }
15
+ //# sourceMappingURL=Query.js.map
@@ -0,0 +1,14 @@
1
+ import type DataRecord from "#database/DataRecord";
2
+ import type InferStoreOut from "pema/InferStoreOut";
3
+ import type StoreSchema from "pema/StoreSchema";
4
+ type X<T> = {
5
+ [K in keyof T]: T[K];
6
+ } & {};
7
+ type Filter<T, P extends keyof T> = X<Pick<T, Extract<P, keyof T>>>;
8
+ export default abstract class QueryBuilder<T extends StoreSchema, P extends keyof DataRecord<T> = keyof DataRecord<T>> {
9
+ abstract where(criteria: any): QueryBuilder<T>;
10
+ abstract select<K extends P>(...fields: K[]): QueryBuilder<T, K>;
11
+ abstract run(): Promise<Filter<InferStoreOut<T>, P>>;
12
+ }
13
+ export {};
14
+ //# sourceMappingURL=QueryBuilder.d.ts.map
@@ -0,0 +1,3 @@
1
+ export default class QueryBuilder {
2
+ }
3
+ //# sourceMappingURL=QueryBuilder.js.map
@@ -0,0 +1,4 @@
1
+ import Dict from "@rcompat/type/Dict";
2
+ type Sort = Dict<"asc" | "desc">;
3
+ export type { Sort as default };
4
+ //# sourceMappingURL=Sort.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Sort.js.map
@@ -0,0 +1,169 @@
1
+ import type Changes from "#database/Changes";
2
+ import type Database from "#database/Database";
3
+ import type DataRecord from "#database/DataRecord";
4
+ import wrap from "#database/symbol/wrap";
5
+ import type Types from "#database/Types";
6
+ import type Dict from "@rcompat/type/Dict";
7
+ import type Serializable from "@rcompat/type/Serializable";
8
+ import type Id from "pema/Id";
9
+ import type InferStore from "pema/InferStore";
10
+ import type StoreId from "pema/StoreId";
11
+ import type StoreSchema from "pema/StoreSchema";
12
+ type X<T> = {
13
+ [K in keyof T]: T[K];
14
+ } & {};
15
+ type StringOperators = {
16
+ $like?: string;
17
+ };
18
+ type QueryOperators<T> = T extends string ? T | StringOperators | null : T | null;
19
+ type Criteria<T extends StoreSchema> = X<{
20
+ [K in keyof Omit<InferStore<T>, "id">]?: QueryOperators<InferStore<T>[K]>;
21
+ } & {
22
+ id?: StoreId<T> | null;
23
+ }>;
24
+ type Select<T> = {
25
+ [K in keyof T]?: true;
26
+ };
27
+ type Sort<T> = {
28
+ [K in keyof T]?: "asc" | "desc";
29
+ };
30
+ type Insertable<T extends StoreSchema> = Omit<InferStore<T>, "id"> & {
31
+ id?: StoreId<T>;
32
+ };
33
+ type Filter<A, B = undefined> = B extends undefined ? A : {
34
+ [K in keyof A as K extends keyof B ? B[K] extends true ? K : never : never]: A[K];
35
+ };
36
+ type Config = {
37
+ database?: Database;
38
+ name?: string;
39
+ };
40
+ /**
41
+ * Database-backed store.
42
+ *
43
+ * A `DatabaseStore` exposes a typed, validated interface over a relational or
44
+ * document database table/collection. It pairs a Pema schema with a uniform
45
+ * CRUD/query API.
46
+ *
47
+ */
48
+ export default class DatabaseStore<S extends StoreSchema> implements Serializable {
49
+ #private;
50
+ [wrap]: (name: string, database: Database) => this;
51
+ readonly R: DataRecord<S>;
52
+ constructor(schema: S, config?: Config);
53
+ static new<S extends StoreSchema>(schema: S, config?: Config): DatabaseStore<S>;
54
+ get schema(): {
55
+ create: () => import("@rcompat/type/MaybePromise").default<void>;
56
+ delete: () => import("@rcompat/type/MaybePromise").default<void>;
57
+ };
58
+ get infer(): InferStore<S>;
59
+ get database(): Database;
60
+ get types(): Types;
61
+ get name(): string;
62
+ /**
63
+ * Count records.
64
+ *
65
+ * @param criteria Criteria to limit which records are counted.
66
+ * @returns Number of matching records (or total if no criteria given).
67
+ */
68
+ count(criteria?: Criteria<S> | {
69
+ id: StoreId<S>;
70
+ }): Promise<number>;
71
+ /**
72
+ * Check whether a record with the given id exists.
73
+ *
74
+ * @param id Record id.
75
+ * @returns `true` if a record with the given id exists, otherwise `false`.
76
+ */
77
+ has(id: StoreId<S>): Promise<boolean>;
78
+ /**
79
+ * Get a record by id.
80
+ *
81
+ * @param id Record id.
82
+ * @throws If no record with the given id exists.
83
+ * @returns The record for the given id.
84
+ */
85
+ get(id: Id): Promise<DataRecord<S>>;
86
+ /**
87
+ * Try to get a record by id.
88
+ *
89
+ * @param id Record id.
90
+ * @returns The record if found, otherwise `undefined`.
91
+ */
92
+ try(id: Id): Promise<DataRecord<S> | undefined>;
93
+ /**
94
+ * Insert a single record.
95
+ *
96
+ * If `id` is omitted, the driver generates one. Input is validated
97
+ * according to the store schema.
98
+ *
99
+ * @param record Record to insert (id optional).
100
+ * @throws If a record with the same id already exists or validation fails.
101
+ * @returns The inserted record with id.
102
+ */
103
+ insert(record: Insertable<S>): Promise<DataRecord<S>>;
104
+ /**
105
+ * Update a single record.
106
+ *
107
+ * Change semantics:
108
+ * - missing / undefined -> leave field unchanged
109
+ * - null -> unset field (only for nullable fields, otherwise throw)
110
+ * - value -> set field to value
111
+ *
112
+ * Change input is validated according to the store schema.
113
+ *
114
+ * @param id Record id.
115
+ * @param changes Partial changes per the rules above.
116
+ * @throws If the id is missing, `.id` is present in `changes`, attempting to
117
+ * unset a non-nullable field, validation fails, or no record is updated.
118
+ */
119
+ update(id: Id, changes: Changes<S>): Promise<void>;
120
+ /**
121
+ * Update multiple records.
122
+ *
123
+ * Same change semantics as when updating a single record.
124
+ *
125
+ * @param criteria Criteria selecting which records to update.
126
+ * @param changes Partial changes per the rules above.
127
+ * @returns Number of updated records (may be 0).
128
+ */
129
+ update(criteria: Criteria<S>, changes: Changes<S>): Promise<number>;
130
+ /**
131
+ * Delete a single record.
132
+ *
133
+ * @param id Record id.
134
+ * @throws If no records with the given id exists.
135
+ */
136
+ delete(id: Id): Promise<void>;
137
+ /**
138
+ * Delete multiple records.
139
+ *
140
+ * @param criteria Criteria selecting which records to delete.
141
+ * @returns Number of records deleted (may be 0).
142
+ */
143
+ delete(criteria: Criteria<S>): Promise<number>;
144
+ /**
145
+ * Find matching records.
146
+ *
147
+ * @param criteria Criteria to match records by.
148
+ * @param options Query options.
149
+ * @returns Matching records, possibly projected/limited/sorted.
150
+ */
151
+ find(criteria: Criteria<S>): Promise<Filter<DataRecord<S>>[]>;
152
+ find(criteria: Criteria<S>, options: {
153
+ limit?: number;
154
+ select?: undefined;
155
+ sort?: Sort<DataRecord<S>>;
156
+ }): Promise<Filter<DataRecord<S>>[]>;
157
+ find<F extends Select<DataRecord<S>>>(criteria: Criteria<S>, options?: {
158
+ limit?: number;
159
+ select?: F;
160
+ sort?: Sort<DataRecord<S>>;
161
+ }): Promise<Filter<DataRecord<S>, F>[]>;
162
+ toJSON(): {
163
+ type: "object";
164
+ properties: Dict<import("pema/StoreType").Serialized>;
165
+ };
166
+ extend<A extends Dict>(extensor: (This: this) => A): this & A;
167
+ }
168
+ export {};
169
+ //# sourceMappingURL=Store.d.ts.map