@primate/core 0.5.0 → 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 (297) hide show
  1. package/lib/private/App.d.ts +263 -26
  2. package/lib/private/App.js +42 -14
  3. package/lib/private/Flags.d.ts +8 -4
  4. package/lib/private/Module.d.ts +4 -16
  5. package/lib/private/Module.js +1 -17
  6. package/lib/private/app/EnvSchema.d.ts +5 -0
  7. package/lib/private/app/EnvSchema.js +2 -0
  8. package/lib/private/app/Facade.browser.d.ts +11 -0
  9. package/lib/private/app/Facade.browser.js +19 -0
  10. package/lib/private/app/Facade.d.ts +272 -27
  11. package/lib/private/app/Facade.js +23 -0
  12. package/lib/private/build/client/index.js +8 -3
  13. package/lib/private/build/client/plugin/app-request.d.ts +4 -0
  14. package/lib/private/build/client/plugin/app-request.js +19 -0
  15. package/lib/private/build/client/plugin/view.d.ts +4 -0
  16. package/lib/private/build/client/plugin/view.js +13 -0
  17. package/lib/private/build/hook.d.ts +1 -2
  18. package/lib/private/build/hook.js +21 -16
  19. package/lib/private/build/index.d.ts +2 -1
  20. package/lib/private/build/index.js +20 -21
  21. package/lib/private/build/server/index.js +7 -9
  22. package/lib/private/build/server/plugin/app-request.d.ts +4 -0
  23. package/lib/private/build/server/plugin/app-request.js +19 -0
  24. package/lib/private/build/server/plugin/assets.js +1 -1
  25. package/lib/private/build/server/plugin/live-reload.js +9 -9
  26. package/lib/private/build/server/plugin/native-addons.js +4 -7
  27. package/lib/private/build/server/plugin/route.js +2 -2
  28. package/lib/private/build/server/plugin/store.js +9 -31
  29. package/lib/private/build/server/plugin/stores.js +11 -7
  30. package/lib/private/build/server/plugin/view.js +1 -1
  31. package/lib/private/build/shared/plugin/app-request.d.ts +4 -0
  32. package/lib/private/build/shared/plugin/app-request.js +19 -0
  33. package/lib/private/client/Data.d.ts +3 -2
  34. package/lib/private/{frontend → client}/Render.d.ts +1 -1
  35. package/lib/private/{frontend → client}/ViewResponse.d.ts +1 -1
  36. package/lib/private/client/app.js +1 -2
  37. package/lib/private/client/boot.d.ts +5 -0
  38. package/lib/private/client/boot.js +64 -0
  39. package/lib/private/client/create-form.d.ts +1 -0
  40. package/lib/private/client/create-form.js +19 -20
  41. package/lib/private/client/extract-issues.js +2 -1
  42. package/lib/private/client/http.d.ts +13 -0
  43. package/lib/private/client/http.js +57 -0
  44. package/lib/private/client/index.d.ts +23 -0
  45. package/lib/private/client/index.js +16 -0
  46. package/lib/private/client/navigate.d.ts +13 -0
  47. package/lib/private/client/navigate.js +67 -0
  48. package/lib/private/client/root.d.ts +9 -0
  49. package/lib/private/client/root.js +11 -0
  50. package/lib/private/client/submit.d.ts +2 -0
  51. package/lib/private/client/submit.js +41 -0
  52. package/lib/private/config/index.d.ts +7 -2
  53. package/lib/private/config/index.js +3 -2
  54. package/lib/private/config/schema.d.ts +82 -26
  55. package/lib/private/config/schema.js +17 -4
  56. package/lib/private/cookie.d.ts +12 -6
  57. package/lib/private/db/DB.d.ts +21 -5
  58. package/lib/private/db/DB.js +1 -0
  59. package/lib/private/db/MemoryDB.d.ts +2 -4
  60. package/lib/private/db/MemoryDB.js +40 -22
  61. package/lib/private/db/common.d.ts +7 -0
  62. package/lib/private/db/common.js +31 -0
  63. package/lib/private/db/errors.d.ts +104 -0
  64. package/lib/private/db/errors.js +237 -0
  65. package/lib/private/db/migrate/apply.d.ts +2 -0
  66. package/lib/private/db/migrate/apply.js +32 -0
  67. package/lib/private/db/migrate/bundle.d.ts +3 -0
  68. package/lib/private/db/migrate/bundle.js +22 -0
  69. package/lib/private/db/migrate/create.d.ts +2 -0
  70. package/lib/private/db/migrate/create.js +154 -0
  71. package/lib/private/db/migrate/index.d.ts +10 -0
  72. package/lib/private/db/migrate/index.js +6 -0
  73. package/lib/private/db/migrate/status.d.ts +2 -0
  74. package/lib/private/db/migrate/status.js +38 -0
  75. package/lib/private/db/migrate/store.d.ts +5 -0
  76. package/lib/private/db/migrate/store.js +33 -0
  77. package/lib/private/db/sql.js +3 -3
  78. package/lib/private/db/test.js +461 -95
  79. package/lib/private/errors.d.ts +88 -0
  80. package/lib/private/errors.js +211 -0
  81. package/lib/private/frontend.d.ts +72 -0
  82. package/lib/private/frontend.js +245 -0
  83. package/lib/private/i18n/Formatter.js +2 -2
  84. package/lib/private/i18n/errors.d.ts +16 -0
  85. package/lib/private/i18n/errors.js +27 -0
  86. package/lib/private/i18n/module.d.ts +3 -0
  87. package/lib/private/i18n/module.js +115 -0
  88. package/lib/private/i18n/schema.d.ts +10 -5
  89. package/lib/private/i18n/validate.js +5 -7
  90. package/lib/private/index.d.ts +14 -0
  91. package/lib/private/index.js +2 -0
  92. package/lib/private/log.js +6 -5
  93. package/lib/private/module/Setup.d.ts +21 -0
  94. package/lib/private/module/Setup.js +2 -0
  95. package/lib/private/module/create.d.ts +16 -0
  96. package/lib/private/module/create.js +28 -0
  97. package/lib/private/orm/ExtractSchema.d.ts +9 -0
  98. package/lib/private/orm/ExtractSchema.js +2 -0
  99. package/lib/private/orm/ForeignKey.d.ts +5 -2
  100. package/lib/private/orm/ForeignKey.js +3 -0
  101. package/lib/private/orm/PrimaryKey.d.ts +5 -3
  102. package/lib/private/orm/PrimaryKey.js +9 -6
  103. package/lib/private/orm/StoreInput.d.ts +10 -0
  104. package/lib/private/orm/StoreInput.js +2 -0
  105. package/lib/private/orm/key.d.ts +6 -6
  106. package/lib/private/orm/key.js +7 -3
  107. package/lib/private/orm/parse.d.ts +5 -4
  108. package/lib/private/orm/parse.js +2 -2
  109. package/lib/private/orm/relation.d.ts +2 -2
  110. package/lib/private/orm/{Store.d.ts → store.d.ts} +33 -17
  111. package/lib/private/orm/{Store.js → store.js} +91 -67
  112. package/lib/private/paths.js +3 -3
  113. package/lib/private/request/RequestBag.d.ts +4 -0
  114. package/lib/private/request/RequestBag.js +5 -2
  115. package/lib/private/request/RequestBody.d.ts +6 -9
  116. package/lib/private/request/RequestBody.js +49 -54
  117. package/lib/private/request/RequestFacade.d.ts +3 -8
  118. package/lib/private/request/RequestPublic.d.ts +9 -0
  119. package/lib/private/request/RequestPublic.js +2 -0
  120. package/lib/private/request/RequestView.d.ts +11 -0
  121. package/lib/private/request/RequestView.js +3 -0
  122. package/lib/private/request/handle.d.ts +4 -0
  123. package/lib/private/request/handle.js +18 -0
  124. package/lib/private/request/parse.js +1 -0
  125. package/lib/private/request/route.js +8 -9
  126. package/lib/private/request/router.js +21 -49
  127. package/lib/private/request/storage.d.ts +4 -0
  128. package/lib/private/request/storage.js +5 -0
  129. package/lib/private/response/ResponseFunction.d.ts +1 -1
  130. package/lib/private/response/binary.js +1 -1
  131. package/lib/private/response/error.d.ts +1 -1
  132. package/lib/private/response/error.js +1 -1
  133. package/lib/private/response/json.d.ts +1 -1
  134. package/lib/private/response/json.js +1 -1
  135. package/lib/private/response/redirect.d.ts +5 -5
  136. package/lib/private/response/redirect.js +8 -9
  137. package/lib/private/response/respond.js +9 -7
  138. package/lib/private/response/sse.d.ts +1 -1
  139. package/lib/private/response/sse.js +1 -1
  140. package/lib/private/response/text.d.ts +1 -1
  141. package/lib/private/response/text.js +1 -1
  142. package/lib/private/response/view.d.ts +1 -1
  143. package/lib/private/response/view.js +6 -13
  144. package/lib/private/response/ws.d.ts +1 -1
  145. package/lib/private/route/router.d.ts +3 -3
  146. package/lib/private/route/router.js +7 -10
  147. package/lib/private/serve/App.d.ts +6 -7
  148. package/lib/private/serve/App.js +52 -43
  149. package/lib/private/serve/Init.d.ts +2 -2
  150. package/lib/private/serve/dev-module.d.ts +2 -0
  151. package/lib/private/serve/dev-module.js +34 -0
  152. package/lib/private/serve/hook.d.ts +1 -2
  153. package/lib/private/serve/hook.js +2 -3
  154. package/lib/private/serve/index.d.ts +1 -1
  155. package/lib/private/serve/index.js +32 -2
  156. package/lib/private/server/TAG.d.ts +3 -0
  157. package/lib/private/server/TAG.js +2 -0
  158. package/lib/private/server/index.d.ts +5 -0
  159. package/lib/private/server/index.js +6 -0
  160. package/lib/private/session/SessionHandle.js +2 -1
  161. package/lib/private/session/index.d.ts +1 -1
  162. package/lib/private/session/module.d.ts +3 -0
  163. package/lib/private/session/module.js +114 -0
  164. package/lib/private/session/schema.d.ts +17 -9
  165. package/lib/private/session/schema.js +9 -5
  166. package/lib/private/target/Manager.js +6 -12
  167. package/lib/public/client.d.ts +2 -13
  168. package/lib/public/client.js +1 -9
  169. package/lib/public/db/errors.d.ts +2 -0
  170. package/lib/public/db/errors.js +2 -0
  171. package/lib/public/db/migrate.d.ts +2 -0
  172. package/lib/public/db/migrate.js +2 -0
  173. package/lib/public/db.d.ts +3 -3
  174. package/lib/public/frontend.d.ts +3 -0
  175. package/lib/public/frontend.js +2 -0
  176. package/lib/public/index.d.ts +2 -0
  177. package/lib/public/index.js +2 -0
  178. package/lib/public/orm/store.d.ts +2 -0
  179. package/lib/public/orm/store.js +2 -0
  180. package/lib/public/request/server.d.ts +5 -0
  181. package/lib/public/request/server.js +7 -0
  182. package/lib/public/response.d.ts +4 -4
  183. package/lib/public/server.d.ts +3 -0
  184. package/lib/public/server.js +2 -0
  185. package/package.json +30 -25
  186. package/lib/private/AppError.d.ts +0 -4
  187. package/lib/private/AppError.js +0 -8
  188. package/lib/private/backend/Module.d.ts +0 -18
  189. package/lib/private/backend/Module.js +0 -19
  190. package/lib/private/backend/TAG.d.ts +0 -3
  191. package/lib/private/backend/TAG.js +0 -2
  192. package/lib/private/build/server/plugin/db-default.d.ts +0 -4
  193. package/lib/private/build/server/plugin/db-default.js +0 -45
  194. package/lib/private/build/server/plugin/store-wrap.d.ts +0 -4
  195. package/lib/private/build/server/plugin/store-wrap.js +0 -33
  196. package/lib/private/client/spa/index.d.ts +0 -6
  197. package/lib/private/client/spa/index.js +0 -200
  198. package/lib/private/db/error.d.ts +0 -81
  199. package/lib/private/db/error.js +0 -199
  200. package/lib/private/db/symbol/wrap.d.ts +0 -3
  201. package/lib/private/db/symbol/wrap.js +0 -2
  202. package/lib/private/fail.d.ts +0 -3
  203. package/lib/private/fail.js +0 -5
  204. package/lib/private/frontend/Module.d.ts +0 -62
  205. package/lib/private/frontend/Module.js +0 -255
  206. package/lib/private/i18n/Module.d.ts +0 -16
  207. package/lib/private/i18n/Module.js +0 -133
  208. package/lib/private/module/BuildHook.d.ts +0 -5
  209. package/lib/private/module/BuildHook.js +0 -2
  210. package/lib/private/module/NextBuild.d.ts +0 -5
  211. package/lib/private/module/NextBuild.js +0 -2
  212. package/lib/private/module/NextServe.d.ts +0 -5
  213. package/lib/private/module/NextServe.js +0 -2
  214. package/lib/private/orm/Set.d.ts +0 -11
  215. package/lib/private/orm/Set.js +0 -2
  216. package/lib/private/orm/foreign.d.ts +0 -4
  217. package/lib/private/orm/foreign.js +0 -5
  218. package/lib/private/orm/primary.d.ts +0 -5
  219. package/lib/private/orm/primary.js +0 -5
  220. package/lib/private/orm/types.d.ts +0 -18
  221. package/lib/private/orm/types.js +0 -2
  222. package/lib/private/orm/wrap.d.ts +0 -5
  223. package/lib/private/orm/wrap.js +0 -5
  224. package/lib/private/reducer.d.ts +0 -24
  225. package/lib/private/reducer.js +0 -10
  226. package/lib/private/serve/module/Dev.d.ts +0 -11
  227. package/lib/private/serve/module/Dev.js +0 -32
  228. package/lib/private/serve/module/Handle.d.ts +0 -10
  229. package/lib/private/serve/module/Handle.js +0 -15
  230. package/lib/private/session/SessionModule.d.ts +0 -14
  231. package/lib/private/session/SessionModule.js +0 -122
  232. package/lib/public/App.d.ts +0 -2
  233. package/lib/public/App.js +0 -2
  234. package/lib/public/AppError.d.ts +0 -2
  235. package/lib/public/AppError.js +0 -2
  236. package/lib/public/BuildApp.d.ts +0 -2
  237. package/lib/public/BuildApp.js +0 -2
  238. package/lib/public/BuildHook.d.ts +0 -2
  239. package/lib/public/BuildHook.js +0 -2
  240. package/lib/public/Mode.d.ts +0 -2
  241. package/lib/public/Mode.js +0 -2
  242. package/lib/public/Module.d.ts +0 -2
  243. package/lib/public/Module.js +0 -2
  244. package/lib/public/Next.d.ts +0 -2
  245. package/lib/public/Next.js +0 -2
  246. package/lib/public/NextBuild.d.ts +0 -2
  247. package/lib/public/NextBuild.js +0 -2
  248. package/lib/public/NextHandle.d.ts +0 -2
  249. package/lib/public/NextHandle.js +0 -2
  250. package/lib/public/NextRoute.d.ts +0 -3
  251. package/lib/public/NextRoute.js +0 -2
  252. package/lib/public/NextServe.d.ts +0 -2
  253. package/lib/public/NextServe.js +0 -2
  254. package/lib/public/ServeApp.d.ts +0 -2
  255. package/lib/public/ServeApp.js +0 -2
  256. package/lib/public/Target.d.ts +0 -2
  257. package/lib/public/Target.js +0 -2
  258. package/lib/public/backend/Module.d.ts +0 -2
  259. package/lib/public/backend/Module.js +0 -2
  260. package/lib/public/backend/TAG.d.ts +0 -2
  261. package/lib/public/backend/TAG.js +0 -2
  262. package/lib/public/client/Data.d.ts +0 -2
  263. package/lib/public/client/Data.js +0 -2
  264. package/lib/public/client/spa.d.ts +0 -2
  265. package/lib/public/client/spa.js +0 -2
  266. package/lib/public/db/error.d.ts +0 -2
  267. package/lib/public/db/error.js +0 -2
  268. package/lib/public/fail.d.ts +0 -2
  269. package/lib/public/fail.js +0 -2
  270. package/lib/public/frontend/Module.d.ts +0 -2
  271. package/lib/public/frontend/Module.js +0 -2
  272. package/lib/public/frontend/Publish.d.ts +0 -2
  273. package/lib/public/frontend/Publish.js +0 -2
  274. package/lib/public/frontend/Render.d.ts +0 -2
  275. package/lib/public/frontend/Render.js +0 -2
  276. package/lib/public/frontend/ViewResponse.d.ts +0 -2
  277. package/lib/public/frontend/ViewResponse.js +0 -2
  278. package/lib/public/orm/Store.d.ts +0 -2
  279. package/lib/public/orm/Store.js +0 -2
  280. package/lib/public/orm/wrap.d.ts +0 -2
  281. package/lib/public/orm/wrap.js +0 -2
  282. package/lib/public/request.d.ts +0 -4
  283. package/lib/public/request.js +0 -2
  284. /package/lib/private/{frontend → client}/Publish.d.ts +0 -0
  285. /package/lib/private/{frontend → client}/Publish.js +0 -0
  286. /package/lib/private/{frontend → client}/Render.js +0 -0
  287. /package/lib/private/{frontend → client}/ServerData.d.ts +0 -0
  288. /package/lib/private/{frontend → client}/ServerData.js +0 -0
  289. /package/lib/private/{frontend → client}/ServerView.d.ts +0 -0
  290. /package/lib/private/{frontend → client}/ServerView.js +0 -0
  291. /package/lib/private/{frontend → client}/View.d.ts +0 -0
  292. /package/lib/private/{frontend → client}/View.js +0 -0
  293. /package/lib/private/{frontend → client}/ViewOptions.d.ts +0 -0
  294. /package/lib/private/{frontend → client}/ViewOptions.js +0 -0
  295. /package/lib/private/{frontend → client}/ViewResponse.js +0 -0
  296. /package/lib/private/client/{spa/storage.d.ts → storage.d.ts} +0 -0
  297. /package/lib/private/client/{spa/storage.js → storage.js} +0 -0
@@ -0,0 +1,3 @@
1
+ import type Config from "#i18n/Config";
2
+ export default function i18n_module(config: Config): import("#module/create").Created;
3
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1,115 @@
1
+ import cookie from "#cookie";
2
+ import COOKIE_NAME from "#i18n/constant/COOKIE_NAME";
3
+ import PERSIST_HEADER from "#i18n/constant/PERSIST_HEADER";
4
+ import E from "#i18n/errors";
5
+ import storage from "#i18n/storage";
6
+ import create from "#module/create";
7
+ import { Status } from "@rcompat/http";
8
+ function toLowerCase(string) {
9
+ return string.toLowerCase();
10
+ }
11
+ function pick(client, server) {
12
+ const lower = server.map(toLowerCase);
13
+ for (const raw of client.map(toLowerCase)) {
14
+ const locale = raw.trim();
15
+ if (!locale)
16
+ continue;
17
+ const exact = lower.indexOf(locale);
18
+ if (exact !== -1)
19
+ return server[exact];
20
+ const base = locale.split("-")[0];
21
+ const index = lower.findIndex(s => s === base || s.startsWith(`${base}-`));
22
+ if (index !== -1)
23
+ return server[index];
24
+ }
25
+ return undefined;
26
+ }
27
+ export default function i18n_module(config) {
28
+ const default_locale = config.defaultLocale;
29
+ const locales = Object.keys(config.locales);
30
+ const persist = config.persist ?? "cookie";
31
+ const currency = config.currency ?? "USD";
32
+ let secure = false;
33
+ if (locales.length < 1)
34
+ throw E.at_least_one_locale();
35
+ if (default_locale === undefined)
36
+ throw E.missing_default_locale(locales);
37
+ if (!locales.includes(default_locale)) {
38
+ throw E.unused_default_locale(default_locale, locales);
39
+ }
40
+ return create({
41
+ name: "builtin/i18n",
42
+ setup({ onServe, onHandle, onRoute }) {
43
+ onServe(app => {
44
+ secure = app.secure;
45
+ });
46
+ onHandle(async (request, next) => {
47
+ const requested = request.headers.try(PERSIST_HEADER);
48
+ if (requested === undefined) {
49
+ const locale = request.cookies.try(COOKIE_NAME);
50
+ if (locale === undefined)
51
+ return next(request);
52
+ // if has cookie, run route with i18n
53
+ return await new Promise((resolve, reject) => {
54
+ storage().run({ locale }, async () => {
55
+ try {
56
+ resolve(await next(request));
57
+ }
58
+ catch (e) {
59
+ reject(e);
60
+ }
61
+ });
62
+ });
63
+ }
64
+ // only cookie-persistance is server-supported
65
+ if (persist !== "cookie")
66
+ return new Response(null, {
67
+ headers: {
68
+ "Content-Length": String(0),
69
+ },
70
+ status: Status.NO_CONTENT,
71
+ });
72
+ // only accept existing locales
73
+ if (!locales.includes(requested))
74
+ return new Response(null, {
75
+ headers: {
76
+ "Content-Length": String(0),
77
+ },
78
+ status: Status.NO_CONTENT,
79
+ });
80
+ const header = cookie(COOKIE_NAME, requested, {
81
+ secure,
82
+ path: "/",
83
+ sameSite: "Strict",
84
+ });
85
+ return new Response(null, {
86
+ headers: {
87
+ "Set-Cookie": header,
88
+ "Content-Length": String(0),
89
+ },
90
+ status: Status.NO_CONTENT,
91
+ });
92
+ });
93
+ onRoute((request, next) => {
94
+ const accept_language = request.headers.try("Accept-Language") ?? "";
95
+ const client_locales = accept_language
96
+ .split(",")
97
+ .map(s => s.split(";")[0].trim())
98
+ .filter(Boolean);
99
+ const cookie_locale = persist === "cookie"
100
+ ? request.cookies.try(COOKIE_NAME)
101
+ : undefined;
102
+ const locale = cookie_locale ??
103
+ pick(client_locales, locales) ??
104
+ default_locale;
105
+ return next(request.set("i18n", {
106
+ currency,
107
+ mode: persist,
108
+ locale,
109
+ locales,
110
+ }));
111
+ });
112
+ },
113
+ });
114
+ }
115
+ //# sourceMappingURL=module.js.map
@@ -1,8 +1,13 @@
1
- declare const _default: import("pema").ObjectType<{
2
- defaultLocale: import("pema").StringType;
3
- locales: import("pema").RecordType<import("pema").StringType, import("pema").UnknownType>;
4
- currency: import("pema").DefaultType<import("pema").StringType, "USD">;
5
- persist: import("pema").DefaultType<import("pema").UnionType<[import("pema").LiteralType<"cookie">, import("pema").LiteralType<"localStorage">, import("pema").LiteralType<"sessionStorage">, import("pema").LiteralType<false>]>, false | "cookie" | "localStorage" | "sessionStorage">;
1
+ declare const _default: import("pema").ObjectType<import("pema").NormalizeSchemaObject<{
2
+ readonly defaultLocale: import("pema").StringType;
3
+ readonly locales: import("pema").RecordType<import("pema").StringType, import("pema").UnknownType>;
4
+ readonly currency: import("pema").DefaultType<import("pema").StringType, "USD">;
5
+ readonly persist: import("pema").DefaultType<import("pema").UnionType<[import("pema").LiteralType<"cookie">, import("pema").LiteralType<"localStorage">, import("pema").LiteralType<"sessionStorage">, import("pema").LiteralType<false>]>, false | "cookie" | "localStorage" | "sessionStorage">;
6
+ }>, {
7
+ defaultLocale: string;
8
+ locales: Record<string, unknown>;
9
+ currency: string;
10
+ persist: false | "cookie" | "localStorage" | "sessionStorage";
6
11
  }>;
7
12
  export default _default;
8
13
  //# sourceMappingURL=schema.d.ts.map
@@ -1,3 +1,4 @@
1
+ import E from "#i18n/errors";
1
2
  import is from "@rcompat/is";
2
3
  export default function validate(key, locale, path = "") {
3
4
  if (Array.isArray(key)) {
@@ -9,13 +10,10 @@ export default function validate(key, locale, path = "") {
9
10
  if (!is.dict(key))
10
11
  return;
11
12
  for (const [k, v] of Object.entries(key)) {
12
- if (k.includes(".")) {
13
- const at = path ? `${path}.${k}` : k;
14
- throw new Error("[i18n] Dots are not allowed in catalog key names. " +
15
- `Found "${k}" at "${at}" (locale "${locale}").`);
16
- }
17
- const next = path ? `${path}.${k}` : k;
18
- validate(v, locale, next);
13
+ const at = path ? `${path}.${k}` : k;
14
+ if (k.includes("."))
15
+ throw E.no_dots_catalog_keys(k, at, locale);
16
+ validate(v, locale, at);
19
17
  }
20
18
  }
21
19
  //# sourceMappingURL=validate.js.map
@@ -0,0 +1,14 @@
1
+ export type { default as App } from "#App";
2
+ export type { default as BuildApp } from "#build/App";
3
+ export type { default as Mode } from "#Mode";
4
+ export type { default as Module } from "#Module";
5
+ export type { BuildHook, HandleHook, InitHook, RouteHook, ServeHook, default as Setup } from "#module/Setup";
6
+ export type { default as RequestBag } from "#request/RequestBag";
7
+ export type { default as RequestBody } from "#request/RequestBody";
8
+ export type { default as RequestFacade } from "#request/RequestFacade";
9
+ export type { default as RequestPublic } from "#request/RequestPublic";
10
+ export type { default as RequestView } from "#request/RequestView";
11
+ export type { default as RequestVerb } from "#request/Verb";
12
+ export type { default as ServeApp } from "#serve/App";
13
+ export type { default as Target } from "#target/Target";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -1,8 +1,8 @@
1
- import AppError from "#AppError";
2
- import args from "@rcompat/args";
3
1
  import color from "@rcompat/cli/color";
4
2
  import mark from "@rcompat/cli/mark";
5
3
  import print from "@rcompat/cli/print";
4
+ import { CodeError } from "@rcompat/error";
5
+ import runtime from "@rcompat/runtime";
6
6
  import p from "pema";
7
7
  const levels = {
8
8
  error: 0,
@@ -10,7 +10,7 @@ const levels = {
10
10
  warn: 1,
11
11
  };
12
12
  const flag = "--log=";
13
- const n = args.find(arg => arg.startsWith(flag))?.slice(flag.length);
13
+ const n = runtime.args.find(arg => arg.startsWith(flag))?.slice(flag.length);
14
14
  const vn = p.union(...Object.keys(levels)).optional().parse(n);
15
15
  class Log {
16
16
  #level;
@@ -34,8 +34,9 @@ class Log {
34
34
  }
35
35
  }
36
36
  error(error) {
37
- if (error instanceof AppError) {
38
- print(color.red("[ERROR]"), error.message, "\n");
37
+ if (CodeError.is(error)) {
38
+ const message = error.strings.reduce((acc, str, i) => acc + (i > 0 ? color.bold(String(error.params[i - 1])) : "") + str, "");
39
+ print(color.red("[ERROR]"), message, "\n");
39
40
  }
40
41
  else {
41
42
  console.error(error);
@@ -0,0 +1,21 @@
1
+ import type App from "#App";
2
+ import type BuildApp from "#build/App";
3
+ import type NextHandle from "#module/NextHandle";
4
+ import type NextRoute from "#module/NextRoute";
5
+ import type RequestFacade from "#request/RequestFacade";
6
+ import type ResponseLike from "#response/ResponseLike";
7
+ import type ServeApp from "#serve/App";
8
+ import type { MaybePromise } from "@rcompat/type";
9
+ export type InitHook = (app: App) => MaybePromise<void>;
10
+ export type BuildHook = (app: BuildApp) => MaybePromise<void>;
11
+ export type ServeHook = (app: ServeApp) => MaybePromise<void>;
12
+ export type HandleHook = (request: RequestFacade, next: NextHandle) => MaybePromise<Response>;
13
+ export type RouteHook = (request: RequestFacade, next: NextRoute) => MaybePromise<ResponseLike>;
14
+ export default interface Setup {
15
+ onInit(hook: InitHook): void;
16
+ onBuild(hook: BuildHook): void;
17
+ onServe(hook: ServeHook): void;
18
+ onHandle(hook: HandleHook): void;
19
+ onRoute(hook: RouteHook): void;
20
+ }
21
+ //# sourceMappingURL=Setup.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Setup.js.map
@@ -0,0 +1,16 @@
1
+ import type Module from "#Module";
2
+ import type { BuildHook, HandleHook, InitHook, RouteHook, ServeHook } from "#module/Setup";
3
+ type Hooks = {
4
+ init: InitHook[];
5
+ build: BuildHook[];
6
+ serve: ServeHook[];
7
+ handle: HandleHook[];
8
+ route: RouteHook[];
9
+ };
10
+ type Created = {
11
+ name: string;
12
+ hooks: Hooks;
13
+ };
14
+ export type { Created, Hooks };
15
+ export default function create({ name, setup }: Module): Created;
16
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1,28 @@
1
+ export default function create({ name, setup }) {
2
+ const hooks = {
3
+ init: [],
4
+ build: [],
5
+ serve: [],
6
+ handle: [],
7
+ route: [],
8
+ };
9
+ setup({
10
+ onInit(hook) {
11
+ hooks.init.push(hook);
12
+ },
13
+ onBuild(hook) {
14
+ hooks.build.push(hook);
15
+ },
16
+ onServe(hook) {
17
+ hooks.serve.push(hook);
18
+ },
19
+ onHandle(hook) {
20
+ hooks.handle.push(hook);
21
+ },
22
+ onRoute(hook) {
23
+ hooks.route.push(hook);
24
+ },
25
+ });
26
+ return { name, hooks };
27
+ }
28
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1,9 @@
1
+ import type ForeignKey from "#orm/ForeignKey";
2
+ import type PrimaryKey from "#orm/PrimaryKey";
3
+ import type StoreInput from "#orm/StoreInput";
4
+ import type { DataKey, Storable } from "pema";
5
+ type ExtractSchema<T extends StoreInput> = {
6
+ [K in keyof T]: T[K] extends PrimaryKey<infer P> ? P : T[K] extends ForeignKey<infer P> ? P : T[K] extends Storable<DataKey> ? T[K] : never;
7
+ };
8
+ export type { ExtractSchema as default };
9
+ //# sourceMappingURL=ExtractSchema.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ExtractSchema.js.map
@@ -1,7 +1,10 @@
1
- import type { DataKey, Storable } from "pema";
2
- export default class ForeignKey<T extends Storable<DataKey>> {
1
+ import type { AllowedPKType } from "#orm/PrimaryKey";
2
+ import type { OptionalType } from "pema";
3
+ export type AllowedFKType = AllowedPKType | OptionalType<AllowedPKType>;
4
+ export default class ForeignKey<T extends AllowedFKType> {
3
5
  #private;
4
6
  constructor(type: T);
7
+ static new<T extends AllowedFKType>(type: T): ForeignKey<T>;
5
8
  get type(): T;
6
9
  get datatype(): keyof import("pema").DataType;
7
10
  get name(): string;
@@ -3,6 +3,9 @@ export default class ForeignKey {
3
3
  constructor(type) {
4
4
  this.#type = type;
5
5
  }
6
+ static new(type) {
7
+ return new ForeignKey(type);
8
+ }
6
9
  get type() {
7
10
  return this.#type;
8
11
  }
@@ -1,12 +1,14 @@
1
- import type { DataKey, Storable } from "pema";
1
+ import type { Storable } from "pema";
2
2
  export type Options = {
3
3
  generate?: boolean;
4
4
  };
5
- export default class PrimaryKey<T extends Storable<DataKey>> {
5
+ export type AllowedPKType = Storable<"uuid"> | Storable<"uuid_v4"> | Storable<"uuid_v7"> | Storable<"u8"> | Storable<"u16"> | Storable<"u32"> | Storable<"u64"> | Storable<"u128">;
6
+ export default class PrimaryKey<T extends AllowedPKType> {
6
7
  #private;
7
8
  constructor(type: T, options?: Options);
9
+ static new<T extends AllowedPKType>(type: T, options?: Options): PrimaryKey<T>;
8
10
  get type(): T;
9
- get datatype(): keyof import("pema").DataType;
11
+ get datatype(): "uuid" | "uuid_v4" | "uuid_v7" | "u128" | "u16" | "u32" | "u64" | "u8";
10
12
  get name(): string;
11
13
  get nullable(): boolean;
12
14
  get generate(): boolean;
@@ -1,6 +1,7 @@
1
- import log from "#log";
2
- const RECOMMENDED_TYPES = new Set([
3
- "string", "u16", "u32", "u64", "u128",
1
+ import E from "#db/errors";
2
+ const ALLOWED_TYPES = new Set([
3
+ "uuid", "uuid_v4", "uuid_v7",
4
+ "u8", "u16", "u32", "u64", "u128",
4
5
  ]);
5
6
  export default class PrimaryKey {
6
7
  #type;
@@ -9,9 +10,11 @@ export default class PrimaryKey {
9
10
  this.#type = type;
10
11
  this.#generate = options?.generate ?? true;
11
12
  const datatype = this.#type.datatype;
12
- if (!RECOMMENDED_TYPES.has(datatype)) {
13
- log.warn("key.primary: {0} is unusual for a primary key", datatype);
14
- }
13
+ if (!ALLOWED_TYPES.has(datatype))
14
+ throw E.pk_invalid_type(datatype);
15
+ }
16
+ static new(type, options) {
17
+ return new PrimaryKey(type, options);
15
18
  }
16
19
  get type() {
17
20
  return this.#type;
@@ -0,0 +1,10 @@
1
+ import type ForeignKey from "#orm/ForeignKey";
2
+ import type { AllowedFKType } from "#orm/ForeignKey";
3
+ import type PrimaryKey from "#orm/PrimaryKey";
4
+ import type { AllowedPKType } from "#orm/PrimaryKey";
5
+ import type { Dict } from "@rcompat/type";
6
+ import type { DataKey, Storable } from "pema";
7
+ type StoreField = Storable<DataKey> | PrimaryKey<AllowedPKType> | ForeignKey<AllowedFKType>;
8
+ type StoreInput = Dict<StoreField>;
9
+ export type { StoreInput as default };
10
+ //# sourceMappingURL=StoreInput.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=StoreInput.js.map
@@ -1,8 +1,8 @@
1
- import foreign from "#orm/foreign";
2
- import primary from "#orm/primary";
3
- declare const _default: {
4
- primary: typeof primary;
5
- foreign: typeof foreign;
1
+ import ForeignKey from "#orm/ForeignKey";
2
+ import PrimaryKey from "#orm/PrimaryKey";
3
+ declare const key: {
4
+ foreign: typeof ForeignKey.new;
5
+ primary: typeof PrimaryKey.new;
6
6
  };
7
- export default _default;
7
+ export default key;
8
8
  //# sourceMappingURL=key.d.ts.map
@@ -1,4 +1,8 @@
1
- import foreign from "#orm/foreign";
2
- import primary from "#orm/primary";
3
- export default { primary, foreign };
1
+ import ForeignKey from "#orm/ForeignKey";
2
+ import PrimaryKey from "#orm/PrimaryKey";
3
+ const key = {
4
+ foreign: ForeignKey.new,
5
+ primary: PrimaryKey.new,
6
+ };
7
+ export default key;
4
8
  //# sourceMappingURL=key.js.map
@@ -1,12 +1,13 @@
1
+ import type PK from "#db/PK";
1
2
  import ForeignKey from "#orm/ForeignKey";
2
- import type { StoreInput } from "#orm/types";
3
+ import type { AllowedFKType } from "#orm/ForeignKey";
4
+ import type StoreInput from "#orm/StoreInput";
3
5
  import type { Dict } from "@rcompat/type";
4
6
  import type { Storable } from "pema";
5
- import type PK from "#db/PK";
6
7
  export default function parse(input: StoreInput): {
7
8
  pk: PK;
8
9
  generate_pk: boolean;
9
- fks: Map<string, ForeignKey<Storable<keyof import("pema").DataType>>>;
10
- schema: Dict<Storable<keyof import("pema").DataType>>;
10
+ fks: Map<string, ForeignKey<AllowedFKType>>;
11
+ schema: Dict<Storable<keyof import("pema").DataType, unknown>>;
11
12
  };
12
13
  //# sourceMappingURL=parse.d.ts.map
@@ -1,4 +1,4 @@
1
- import fail from "#fail";
1
+ import E from "#db/errors";
2
2
  import ForeignKey from "#orm/ForeignKey";
3
3
  import PrimaryKey from "#orm/PrimaryKey";
4
4
  const is_pk = (x) => x instanceof PrimaryKey;
@@ -11,7 +11,7 @@ export default function parse(input) {
11
11
  for (const [key, value] of Object.entries(input)) {
12
12
  if (is_pk(value)) {
13
13
  if (pk !== null)
14
- throw fail("multiple primary keys: {0}, {1}", pk, key);
14
+ throw E.pk_multiple_pks(pk, key);
15
15
  pk = key;
16
16
  generate_pk = value.generate;
17
17
  schema[key] = value.type;
@@ -1,5 +1,5 @@
1
- import type Store from "#orm/Store";
2
- import type { StoreInput } from "#orm/types";
1
+ import type { Store } from "#orm/store";
2
+ import type StoreInput from "#orm/StoreInput";
3
3
  /**
4
4
  * extracts schema type from either a schema or a Store.
5
5
  */
@@ -1,16 +1,19 @@
1
1
  import type DB from "#db/DB";
2
- import wrap from "#db/symbol/wrap";
2
+ import type PK from "#db/PK";
3
3
  import type Types from "#db/Types";
4
+ import type ExtractSchema from "#orm/ExtractSchema";
4
5
  import type PrimaryKey from "#orm/PrimaryKey";
5
6
  import type { ManyRelation, OneRelation, Relation } from "#orm/relation";
6
- import type $Set from "#orm/Set";
7
- import type { ExtractSchema, InferRecord, Insertable, PrimaryKeyField, StoreInput } from "#orm/types";
7
+ import type StoreInput from "#orm/StoreInput";
8
8
  import type { Dict, EmptyObject, Serializable } from "@rcompat/type";
9
- import type { Storable } from "pema";
9
+ import type { DefaultType, InferStore, Storable } from "pema";
10
10
  import StoreType from "pema/StoreType";
11
11
  type X<T> = {
12
12
  [K in keyof T]: T[K];
13
13
  } & {};
14
+ type OrNull<T> = {
15
+ [P in keyof T]?: null | T[P];
16
+ };
14
17
  type StringOperators = {
15
18
  $like?: string;
16
19
  $ilike?: string;
@@ -35,19 +38,28 @@ type DateOperators = {
35
38
  $ne?: Date;
36
39
  };
37
40
  type QueryOperators<T> = T extends string ? (T | StringOperators | null) : T extends number ? (T | NumberOperators | null) : T extends bigint ? (T | BigIntOperators | null) : T extends Date ? (T | DateOperators | null) : (T | null);
41
+ type InferRecord<T extends StoreInput> = InferStore<ExtractSchema<T>>;
38
42
  type Schema<T extends StoreInput> = X<InferRecord<T>>;
39
43
  type Where<T extends StoreInput> = X<{
40
44
  [K in keyof Schema<T>]?: QueryOperators<Schema<T>[K]>;
41
45
  }>;
46
+ type $Set<T extends StoreInput> = X<OrNull<InferStore<ExtractSchema<T>>>>;
42
47
  type SelectKey<T> = Extract<keyof T, string>;
43
48
  type Select<T> = readonly SelectKey<T>[];
44
49
  type Sort<T> = Partial<Record<SelectKey<T>, "asc" | "desc">>;
45
50
  type Projected<T, S extends Select<T> | undefined> = S extends readonly (keyof T)[] ? X<Pick<T, S[number]>> : T;
51
+ type DefaultFields<T extends StoreInput> = {
52
+ [K in keyof InferRecord<T>]: T[K] extends DefaultType<any, any> ? K : never;
53
+ }[keyof InferRecord<T>];
54
+ type Insertable<T extends StoreInput> = Omit<InferRecord<T>, PrimaryKeyField<T> | DefaultFields<T>> & Partial<Pick<InferRecord<T>, PrimaryKeyField<T> | DefaultFields<T>>>;
55
+ type PrimaryKeyField<T extends StoreInput> = {
56
+ [K in keyof T]: T[K] extends PrimaryKey<any> ? K : never;
57
+ }[keyof T] & keyof InferRecord<T>;
46
58
  declare const NUMBER_KEYS: readonly ["u8", "u16", "u32", "i8", "i16", "i32", "f32", "f64"];
47
59
  declare const BIGINT_KEYS: readonly ["u64", "u128", "i64", "i128"];
48
60
  type NumberKey = typeof NUMBER_KEYS[number];
49
61
  type BigIntKey = typeof BIGINT_KEYS[number];
50
- type PKV<T extends StoreInput> = T[PrimaryKeyField<T>] extends PrimaryKey<infer P> ? P extends Storable<infer D> ? D extends "string" ? string : D extends NumberKey ? number : D extends BigIntKey ? bigint : string | number | bigint : string | number | bigint : string | number | bigint;
62
+ type PKV<T extends StoreInput> = T[PrimaryKeyField<T>] extends PrimaryKey<infer P> ? P extends Storable<infer D> ? D extends "uuid" | "uuid_v4" | "uuid_v7" ? string : D extends NumberKey ? number : D extends BigIntKey ? bigint : string | number | bigint : string | number | bigint : string | number | bigint;
51
63
  type WithQuery<T extends StoreInput> = true | {
52
64
  where?: Where<T>;
53
65
  select?: Select<Schema<T>>;
@@ -65,10 +77,13 @@ type RelationResult<Rel, Q> = Rel extends OneRelation<infer S, string> ? Q exten
65
77
  type WithRelations<Base, Relations extends Dict<Relation>, W extends With<Relations> | undefined> = W extends object ? X<Base & {
66
78
  [K in keyof W & keyof Relations]: RelationResult<Relations[K], W[K]>;
67
79
  }> : Base;
68
- type Config<R extends Dict<Relation>> = {
69
- db?: DB;
70
- name?: string;
80
+ type Init<S extends StoreInput, R extends Dict<Relation>> = {
81
+ name: string;
82
+ db: DB;
83
+ schema: S;
71
84
  relations?: R;
85
+ migrate?: boolean;
86
+ extend?: Dict;
72
87
  };
73
88
  /**
74
89
  * Database-backed store.
@@ -77,22 +92,22 @@ type Config<R extends Dict<Relation>> = {
77
92
  * document database table/collection. It pairs a Pema schema with a uniform
78
93
  * CRUD/query API.
79
94
  */
80
- export default class Store<T extends StoreInput, R extends Dict<Relation> = EmptyObject> implements Serializable {
95
+ export declare class Store<T extends StoreInput, R extends Dict<Relation> = EmptyObject> implements Serializable {
81
96
  #private;
82
- [wrap]: (name: string, db: DB) => this;
83
97
  readonly Schema: Schema<T>;
84
- constructor(input: T, config?: Config<R>);
85
- static new<T extends StoreInput, R extends Dict<Relation> = EmptyObject>(input: T, config?: Config<R>): Store<T, R>;
86
- get collection(): {
98
+ constructor(init: Init<T, R>);
99
+ get table(): {
87
100
  create: () => import("@rcompat/type").MaybePromise<void>;
88
101
  delete: () => import("@rcompat/type").MaybePromise<void>;
89
102
  };
90
103
  get infer(): InferRecord<T>;
91
- get schema(): Dict<Storable<keyof import("pema").DataType>>;
104
+ get schema(): Dict<Storable<keyof import("pema").DataType, unknown>>;
92
105
  get type(): StoreType<ExtractSchema<T>>;
106
+ get migrate(): boolean;
107
+ get name(): string;
108
+ get pk(): PK;
93
109
  get db(): DB;
94
110
  get types(): Types;
95
- get name(): string;
96
111
  /**
97
112
  * Count records
98
113
  */
@@ -167,5 +182,6 @@ export default class Store<T extends StoreInput, R extends Dict<Relation> = Empt
167
182
  };
168
183
  extend<A extends Dict>(extensor: (This: this) => A): this & A;
169
184
  }
170
- export {};
171
- //# sourceMappingURL=Store.d.ts.map
185
+ declare function store<T extends StoreInput, R extends Dict<Relation> = EmptyObject>(init: Init<T, R>): Store<T, R>;
186
+ export default store;
187
+ //# sourceMappingURL=store.d.ts.map