@primate/core 0.6.3 → 0.7.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 (185) hide show
  1. package/lib/private/App.d.ts +76 -149
  2. package/lib/private/App.js +22 -6
  3. package/lib/private/Flags.d.ts +5 -3
  4. package/lib/private/Flags.js +4 -2
  5. package/lib/private/app/Facade.d.ts +77 -156
  6. package/lib/private/app/Facade.js +4 -1
  7. package/lib/private/build/App.d.ts +4 -2
  8. package/lib/private/build/App.js +13 -4
  9. package/lib/private/build/client/index.js +24 -10
  10. package/lib/private/build/client/plugin/routes.d.ts +4 -0
  11. package/lib/private/build/client/plugin/routes.js +74 -0
  12. package/lib/private/build/hook.js +14 -6
  13. package/lib/private/build/index.d.ts +3 -2
  14. package/lib/private/build/index.js +9 -15
  15. package/lib/private/build/preclient/index.d.ts +3 -0
  16. package/lib/private/build/preclient/index.js +69 -0
  17. package/lib/private/build/preclient/plugin/routes.d.ts +4 -0
  18. package/lib/private/build/preclient/plugin/routes.js +44 -0
  19. package/lib/private/build/server/index.js +8 -5
  20. package/lib/private/build/server/plugin/assets.js +3 -3
  21. package/lib/private/build/server/plugin/native-addons.js +6 -8
  22. package/lib/private/build/server/plugin/node-imports.js +5 -7
  23. package/lib/private/build/server/plugin/route-client.d.ts +4 -0
  24. package/lib/private/build/server/plugin/route-client.js +110 -0
  25. package/lib/private/build/server/plugin/route.js +3 -10
  26. package/lib/private/build/server/plugin/virtual-pages.js +3 -3
  27. package/lib/private/build/server/plugin/virtual-routes.d.ts +2 -1
  28. package/lib/private/build/server/plugin/virtual-routes.js +27 -8
  29. package/lib/private/build/server/plugin/wasm.js +3 -2
  30. package/lib/private/client/Data.d.ts +1 -1
  31. package/lib/private/client/boot.js +2 -2
  32. package/lib/private/client/create-form.d.ts +11 -1
  33. package/lib/private/client/create-form.js +21 -3
  34. package/lib/private/client/index.d.ts +2 -2
  35. package/lib/private/client/navigate.d.ts +1 -0
  36. package/lib/private/client/navigate.js +7 -6
  37. package/lib/private/client/submit.d.ts +2 -1
  38. package/lib/private/client/submit.js +8 -7
  39. package/lib/private/client/{http.d.ts → transport.d.ts} +3 -3
  40. package/lib/private/client/{http.js → transport.js} +7 -9
  41. package/lib/private/config/schema.d.ts +5 -13
  42. package/lib/private/config/schema.js +1 -5
  43. package/lib/private/db/DB.d.ts +3 -1
  44. package/lib/private/db/MemoryDB.d.ts +5 -2
  45. package/lib/private/db/MemoryDB.js +33 -19
  46. package/lib/private/db/SQLDB.d.ts +23 -0
  47. package/lib/private/db/SQLDB.js +2 -0
  48. package/lib/private/db/errors.d.ts +74 -7
  49. package/lib/private/db/errors.js +31 -7
  50. package/lib/private/db/migrate/apply.js +8 -9
  51. package/lib/private/db/migrate/bundle.js +2 -2
  52. package/lib/private/db/migrate/create.js +18 -20
  53. package/lib/private/db/migrate/status.js +9 -10
  54. package/lib/private/db/migrate/store.d.ts +3 -3
  55. package/lib/private/db/migrate/store.js +5 -5
  56. package/lib/private/db/test.js +256 -115
  57. package/lib/private/db/testSQL.d.ts +50 -0
  58. package/lib/private/db/testSQL.js +196 -0
  59. package/lib/private/errors.d.ts +66 -9
  60. package/lib/private/errors.js +37 -16
  61. package/lib/private/frontend.d.ts +4 -4
  62. package/lib/private/frontend.js +11 -8
  63. package/lib/private/i18n/errors.d.ts +7 -1
  64. package/lib/private/i18n/errors.js +1 -1
  65. package/lib/private/i18n/index/types.d.ts +1 -1
  66. package/lib/private/i18n/locale.d.ts +1 -1
  67. package/lib/private/i18n/module.js +6 -5
  68. package/lib/private/index.d.ts +10 -2
  69. package/lib/private/index.js +13 -1
  70. package/lib/private/logger.d.ts +24 -0
  71. package/lib/private/logger.js +66 -0
  72. package/lib/private/module/Setup.d.ts +3 -0
  73. package/lib/private/module/create.d.ts +2 -1
  74. package/lib/private/module/create.js +4 -0
  75. package/lib/private/paths.d.ts +2 -3
  76. package/lib/private/paths.js +6 -12
  77. package/lib/private/request/ContentType.d.ts +3 -0
  78. package/lib/private/request/ContentType.js +2 -0
  79. package/lib/private/request/RequestBag.d.ts +2 -18
  80. package/lib/private/request/RequestBag.js +4 -16
  81. package/lib/private/request/RequestBody.d.ts +20 -28
  82. package/lib/private/request/RequestBody.js +63 -86
  83. package/lib/private/request/RequestFacade.d.ts +2 -2
  84. package/lib/private/request/handle.js +2 -2
  85. package/lib/private/request/parse.js +2 -4
  86. package/lib/private/request/route.js +15 -8
  87. package/lib/private/response/binary.d.ts +2 -2
  88. package/lib/private/response/binary.js +6 -6
  89. package/lib/private/response/error.js +6 -2
  90. package/lib/private/response/json.js +2 -2
  91. package/lib/private/response/null.d.ts +3 -0
  92. package/lib/private/response/null.js +6 -0
  93. package/lib/private/response/redirect.js +4 -3
  94. package/lib/private/response/respond.js +4 -4
  95. package/lib/private/response/sse.js +2 -2
  96. package/lib/private/response/text.js +2 -2
  97. package/lib/private/route/ContentTypeMap.d.ts +10 -0
  98. package/lib/private/route/ContentTypeMap.js +2 -0
  99. package/lib/private/route/Handler.d.ts +3 -2
  100. package/lib/private/route/NarrowedRequest.d.ts +23 -0
  101. package/lib/private/route/NarrowedRequest.js +2 -0
  102. package/lib/private/route/Options.d.ts +6 -1
  103. package/lib/private/route/Path.d.ts +2 -2
  104. package/lib/private/route/hook.d.ts +3 -1
  105. package/lib/private/route/hook.js +1 -2
  106. package/lib/private/route/router.d.ts +7 -11
  107. package/lib/private/route/router.js +13 -20
  108. package/lib/private/route.client.d.ts +36 -0
  109. package/lib/private/route.client.js +8 -0
  110. package/lib/private/route.d.ts +21 -5
  111. package/lib/private/route.js +21 -5
  112. package/lib/private/serve/App.d.ts +1 -2
  113. package/lib/private/serve/App.js +64 -58
  114. package/lib/private/serve/Init.d.ts +2 -0
  115. package/lib/private/serve/dev-module.js +2 -3
  116. package/lib/private/serve/index.js +5 -6
  117. package/lib/private/server/TAG.d.ts +1 -1
  118. package/lib/private/server/TAG.js +1 -1
  119. package/lib/private/session/index.d.ts +1 -1
  120. package/lib/private/session/index.js +3 -2
  121. package/lib/private/session/module.js +3 -3
  122. package/lib/private/session/schema.d.ts +3 -3
  123. package/lib/private/session/schema.js +4 -3
  124. package/lib/private/store/ExtractRelation.d.ts +7 -0
  125. package/lib/private/store/ExtractRelation.js +2 -0
  126. package/lib/private/store/ExtractSchema.d.ts +10 -0
  127. package/lib/private/{orm → store}/ForeignKey.d.ts +1 -1
  128. package/lib/private/store/Init.d.ts +13 -0
  129. package/lib/private/store/Init.js +2 -0
  130. package/lib/private/{orm/store.d.ts → store/Store.d.ts} +50 -50
  131. package/lib/private/{orm/store.js → store/Store.js} +163 -107
  132. package/lib/private/store/StoreInput.d.ts +11 -0
  133. package/lib/private/store/key.d.ts +8 -0
  134. package/lib/private/store/key.js +8 -0
  135. package/lib/private/{orm → store}/parse.d.ts +3 -3
  136. package/lib/private/{orm → store}/parse.js +7 -2
  137. package/lib/private/store/relation.d.ts +29 -0
  138. package/lib/private/store/relation.js +26 -0
  139. package/lib/private/store.d.ts +24 -0
  140. package/lib/private/store.js +10 -0
  141. package/lib/public/db/errors.d.ts +1 -1
  142. package/lib/public/db/errors.js +1 -1
  143. package/lib/public/db/testSQL.d.ts +2 -0
  144. package/lib/public/db/testSQL.js +2 -0
  145. package/lib/public/db.d.ts +1 -0
  146. package/lib/public/index.d.ts +1 -0
  147. package/lib/public/index.js +1 -1
  148. package/lib/public/response.d.ts +6 -6
  149. package/lib/public/response.js +4 -1
  150. package/lib/public/route.client.d.ts +2 -0
  151. package/lib/public/route.client.js +2 -0
  152. package/lib/public/store.d.ts +2 -0
  153. package/lib/public/store.js +2 -0
  154. package/package.json +24 -17
  155. package/lib/private/bye.d.ts +0 -3
  156. package/lib/private/bye.js +0 -4
  157. package/lib/private/log.d.ts +0 -20
  158. package/lib/private/log.js +0 -47
  159. package/lib/private/orm/ExtractSchema.d.ts +0 -9
  160. package/lib/private/orm/StoreInput.d.ts +0 -10
  161. package/lib/private/orm/key.d.ts +0 -8
  162. package/lib/private/orm/key.js +0 -8
  163. package/lib/private/orm/relation.d.ts +0 -43
  164. package/lib/private/orm/relation.js +0 -26
  165. package/lib/private/request/Verb.d.ts +0 -4
  166. package/lib/private/request/Verb.js +0 -2
  167. package/lib/private/request/verbs.d.ts +0 -3
  168. package/lib/private/request/verbs.js +0 -12
  169. package/lib/private/route/wrap.d.ts +0 -2
  170. package/lib/private/route/wrap.js +0 -12
  171. package/lib/public/log.d.ts +0 -2
  172. package/lib/public/log.js +0 -2
  173. package/lib/public/orm/key.d.ts +0 -2
  174. package/lib/public/orm/key.js +0 -2
  175. package/lib/public/orm/relation.d.ts +0 -2
  176. package/lib/public/orm/relation.js +0 -2
  177. package/lib/public/orm/store.d.ts +0 -2
  178. package/lib/public/orm/store.js +0 -2
  179. package/lib/public/request/verbs.d.ts +0 -2
  180. package/lib/public/request/verbs.js +0 -2
  181. /package/lib/private/{orm → store}/ExtractSchema.js +0 -0
  182. /package/lib/private/{orm → store}/ForeignKey.js +0 -0
  183. /package/lib/private/{orm → store}/PrimaryKey.d.ts +0 -0
  184. /package/lib/private/{orm → store}/PrimaryKey.js +0 -0
  185. /package/lib/private/{orm → store}/StoreInput.js +0 -0
@@ -4,12 +4,11 @@ import E from "#errors";
4
4
  import hash from "#hash";
5
5
  import i18n_module from "#i18n/module";
6
6
  import location from "#location";
7
- import log from "#log";
8
7
  import create from "#module/create";
9
8
  import handle from "#request/handle";
10
9
  import parse from "#request/parse";
11
10
  import RequestBag from "#request/RequestBag";
12
- import RequestBody from "#request/RequestBody";
11
+ import { BodyPatch } from "#request/RequestBody";
13
12
  import route from "#request/route";
14
13
  import request_storage from "#request/storage";
15
14
  import router from "#route/router";
@@ -19,7 +18,7 @@ import tags from "#tags";
19
18
  import assert from "@rcompat/assert";
20
19
  import fs from "@rcompat/fs";
21
20
  import FileRouter from "@rcompat/fs/FileRouter";
22
- import { MIME, Status } from "@rcompat/http";
21
+ import http from "@rcompat/http";
23
22
  import serve from "@rcompat/http/serve";
24
23
  import is from "@rcompat/is";
25
24
  import utf8 from "@rcompat/string/utf8";
@@ -50,6 +49,13 @@ const render_head = (assets, head) => {
50
49
  : tags.script({ code, inline, integrity, src, type })).join("\n")).concat("\n", head ?? "");
51
50
  };
52
51
  const s_http = Symbol("s_http");
52
+ const content_type_method = {
53
+ "application/json": "json",
54
+ "text/plain": "text",
55
+ "application/x-www-form-urlencoded": "form",
56
+ "multipart/form-data": "multipart",
57
+ "application/octet-stream": "blob",
58
+ };
53
59
  ;
54
60
  export default class ServeApp extends App {
55
61
  #init;
@@ -68,21 +74,22 @@ export default class ServeApp extends App {
68
74
  super(dir, init.facade[s_config], {
69
75
  mode: init.mode,
70
76
  target: init.target,
71
- dir: dir.path,
77
+ outdir: dir.path,
78
+ log: init.log,
72
79
  });
73
80
  this.#init = init;
74
81
  this.#views = Object.fromEntries(init.views ?? []);
75
82
  this.#stores = Object.fromEntries((init.stores?.map(([k, s]) => [k, s.default])) ?? []);
76
83
  this.#serve_assets = init.assets;
77
84
  this.#pages = init.pages;
78
- const http = this.#init.facade[s_config].http;
85
+ const http_config = this.#init.facade[s_config].http;
79
86
  this.#i18n_config = init.i18n;
80
87
  this.set(s_http, {
81
- host: http.host,
82
- port: http.port,
88
+ host: http_config.host,
89
+ port: http_config.port,
83
90
  ssl: this.secure ? {
84
- cert: this.root.join(http.ssl.cert),
85
- key: this.root.join(http.ssl.key),
91
+ cert: this.root.join(http_config.ssl.cert),
92
+ key: this.root.join(http_config.ssl.key),
86
93
  } : {},
87
94
  });
88
95
  this.#router = FileRouter.init({
@@ -123,19 +130,9 @@ export default class ServeApp extends App {
123
130
  },
124
131
  }));
125
132
  }
126
- ;
127
- get secure() {
128
- const ssl = this.config("http.ssl");
129
- return ssl.key !== undefined && ssl.cert !== undefined;
130
- }
131
133
  get assets() {
132
134
  return this.#assets;
133
135
  }
134
- get url() {
135
- const { host, port } = this.config("http");
136
- return `http${this.secure ? "s" : ""}://${host}:${port}`;
137
- }
138
- ;
139
136
  get router() {
140
137
  return this.#router;
141
138
  }
@@ -152,11 +149,11 @@ export default class ServeApp extends App {
152
149
  const f = fs.ref(name).path;
153
150
  const frontends = Object.keys(this.frontends);
154
151
  const extension = frontends.find(client => f.endsWith(client));
155
- const base = extension === undefined ? name : f.slice(0, -extension.length);
152
+ const base = is.undefined(extension) ? name : f.slice(0, -extension.length);
156
153
  const view = this.#views[base];
157
- if (view === undefined)
154
+ if (is.undefined(view))
158
155
  throw E.view_missing(name);
159
- if (view.default === undefined)
156
+ if (is.undefined(view.default))
160
157
  throw E.view_missing_default_export(name);
161
158
  return view.default;
162
159
  }
@@ -174,7 +171,7 @@ export default class ServeApp extends App {
174
171
  render(content) {
175
172
  const { body, head, page, partial, placeholders = {} } = content;
176
173
  ["body", "head"].forEach(key => assert.undefined(placeholders[key]));
177
- return partial ? body : Object.entries(placeholders)
174
+ return partial === true ? body : Object.entries(placeholders)
178
175
  // replace given placeholders, defaulting to ""
179
176
  .reduce((rendered, [key, value]) => rendered
180
177
  .replaceAll(`%${key}%`, value?.toString() ?? ""), this.page(page))
@@ -190,12 +187,12 @@ export default class ServeApp extends App {
190
187
  respond(body, init) {
191
188
  const { headers, status } = p({
192
189
  headers: p.dict(),
193
- status: p.uint.values(Status).default(Status.OK),
190
+ status: p.uint.values(http.Status).default(http.Status.OK),
194
191
  }).parse(init);
195
192
  const body_length = this.body_length(body);
196
193
  return new Response(body, {
197
194
  headers: {
198
- "Content-Type": MIME.TEXT_HTML,
195
+ "Content-Type": http.MIME.TEXT_HTML,
199
196
  ...this.headers(),
200
197
  ...body_length ? {
201
198
  ...headers, "Content-Length": String(body_length),
@@ -206,14 +203,14 @@ export default class ServeApp extends App {
206
203
  ;
207
204
  view(options) {
208
205
  // split render and respond options
209
- const { headers = {}, status = Status.OK, statusText, ...rest } = options;
206
+ const { headers = {}, status = http.Status.OK, statusText, ...rest } = options;
210
207
  return this.respond(this.render(rest), { headers, status });
211
208
  }
212
209
  ;
213
210
  media(content_type, response = {}) {
214
211
  return {
215
212
  headers: { ...response.headers, "Content-Type": content_type },
216
- status: response.status ?? Status.OK,
213
+ status: response.status ?? http.Status.OK,
217
214
  };
218
215
  }
219
216
  ;
@@ -251,13 +248,13 @@ export default class ServeApp extends App {
251
248
  return this.#pages[page_name];
252
249
  }
253
250
  async #try_serve(ref) {
254
- if (await ref.exists() && await ref.kind() === "file") {
251
+ if (await ref.exists() && await ref.type() === "file") {
255
252
  return new Response(ref.stream(), {
256
253
  headers: {
257
- "Content-Type": MIME.resolve(ref.name),
254
+ "Content-Type": http.toMIME(ref.name),
258
255
  "Content-Length": String(await ref.size()),
259
256
  },
260
- status: Status.OK,
257
+ status: http.Status.OK,
261
258
  });
262
259
  }
263
260
  }
@@ -278,7 +275,7 @@ export default class ServeApp extends App {
278
275
  }
279
276
  const assets = this.#serve_assets;
280
277
  const asset = assets.client[pathname] ?? assets.static[pathname];
281
- if (asset === undefined)
278
+ if (is.undefined(asset))
282
279
  return undefined;
283
280
  const binary = atob(asset.data);
284
281
  const bytes = new Uint8Array(binary.length);
@@ -290,7 +287,7 @@ export default class ServeApp extends App {
290
287
  "Content-Type": asset.mime,
291
288
  "Content-Length": String(bytes.length),
292
289
  },
293
- status: Status.OK,
290
+ status: http.Status.OK,
294
291
  });
295
292
  }
296
293
  async start() {
@@ -334,13 +331,13 @@ export default class ServeApp extends App {
334
331
  return await handle(this, parse(request));
335
332
  }
336
333
  catch (error) {
337
- log.error(error);
334
+ this.log.error(error);
338
335
  return new Response(null, {
339
336
  headers: {
340
337
  "Content-Length": String(0),
341
338
  "Cache-Control": "no-cache",
342
339
  },
343
- status: Status.INTERNAL_SERVER_ERROR,
340
+ status: http.Status.INTERNAL_SERVER_ERROR,
344
341
  });
345
342
  }
346
343
  }, {
@@ -350,55 +347,64 @@ export default class ServeApp extends App {
350
347
  function bright(x) {
351
348
  return `\x1b[38;2;0;200;255m${x}\x1b[0m`;
352
349
  }
353
- log.print(`» app url ${bright(this.url)}\n`);
350
+ this.log.print `» app url ${bright(this.url)}\n`;
354
351
  }
355
352
  ;
356
353
  stop() {
357
354
  this.#server.stop();
358
- log.system("stopped {0}", this.url);
355
+ this.log.system `stopped ${this.url}`;
359
356
  }
360
357
  ;
361
358
  upgrade(request, actions) {
362
359
  return this.#server.upgrade(request, actions);
363
360
  }
364
361
  async route(request) {
365
- const { original, url } = request;
366
- const pathname = normalize(url.pathname);
367
- const route = this.router.match(original);
368
- if (route === undefined) {
369
- log.info("no {0} route to {1}", original.method, pathname);
370
- return;
362
+ const pathname = normalize(request.url.pathname);
363
+ const matched = this.router.match(request.original);
364
+ if (is.undefined(matched)) {
365
+ this.log.trace `no ${request.method} route to ${pathname}`;
366
+ return undefined;
371
367
  }
372
- const verb = original.method.toLowerCase();
373
- const specials = route.specials;
368
+ const method = request.method.toLowerCase();
369
+ const specials = matched.specials;
374
370
  const errors = (specials.error ?? [])
375
- .map(v => router.get(v)[verb]?.handler)
371
+ .map(v => router.get(v)[method]?.handler)
376
372
  .filter(Boolean)
377
373
  .toReversed();
378
374
  const layouts = (specials.layout ?? [])
379
- .map(v => router.get(v)[verb]?.handler)
375
+ .map(v => router.get(v)[method]?.handler)
380
376
  .filter(Boolean)
381
377
  .toReversed();
382
378
  const hooks = (specials.hook ?? [])
383
379
  .toReversed()
384
380
  .flatMap(v => router.getHooks(v));
385
- const verbs = router.get(route.path);
386
- const route_path = verbs[verb];
387
- if (route_path === undefined)
388
- throw E.route_missing_verb(route.path, verb);
381
+ const methods = router.get(matched.path);
382
+ const is_head = method === "head";
383
+ const actual_method = is_head && is.undefined(methods.head) ? "get" : method;
384
+ const route_path = methods[actual_method];
385
+ if (is.undefined(route_path)) {
386
+ this.log.trace `${matched.path} has no method ${method}`;
387
+ return undefined;
388
+ }
389
389
  const handler = route_path.handler;
390
- const parse_body = route_path.options.parseBody;
391
- const body = parse_body ?? this.config("request.body.parse")
392
- ? await RequestBody.parse(original, url)
393
- : RequestBody.none();
390
+ const { contentType, body } = route_path.options;
391
+ if (contentType !== undefined) {
392
+ const raw = request.headers.try("content-type") ?? "";
393
+ const actual = raw.split(";")[0].trim().toLowerCase();
394
+ if (actual !== contentType) {
395
+ throw E.request_content_type_mismatch(contentType, actual);
396
+ }
397
+ }
394
398
  const refined = Object.assign(Object.create(request), {
395
- body,
396
- path: new RequestBag(route.params, "path", {
399
+ path: new RequestBag(matched.params, "path", {
397
400
  normalize: k => k.toLowerCase(),
398
- raw: url.pathname,
401
+ raw: request.url.pathname,
399
402
  }),
403
+ ...(body !== undefined && contentType !== undefined
404
+ ? { body: request.body[BodyPatch]({ contentType, schema: body }) }
405
+ : {}),
400
406
  });
401
- return { errors, hooks, layouts, handler, request: refined };
407
+ return { errors, hooks, layouts, handler, request: refined, is_head };
402
408
  }
403
409
  }
404
410
  //# sourceMappingURL=App.js.map
@@ -1,5 +1,6 @@
1
1
  import type AppFacade from "#app/Facade";
2
2
  import type I18NConfig from "#i18n/Config";
3
+ import type { Schema as LogSchema } from "#logger";
3
4
  import type Mode from "#Mode";
4
5
  import type SessionConfig from "#session/Config";
5
6
  import type { Dict } from "@rcompat/type";
@@ -25,6 +26,7 @@ type ServeInit = {
25
26
  }][];
26
27
  mode: Mode;
27
28
  target: string;
29
+ log: typeof LogSchema.infer;
28
30
  pages: Dict<string>;
29
31
  session?: SessionConfig;
30
32
  i18n?: I18NConfig;
@@ -1,6 +1,5 @@
1
- import log from "#log";
2
1
  import create from "#module/create";
3
- import c from "@rcompat/cli/color";
2
+ import cli from "@rcompat/cli";
4
3
  function pass(address, request) {
5
4
  return fetch(address, {
6
5
  body: request.body,
@@ -20,7 +19,7 @@ export default function dev() {
20
19
  const assets = app.assets.map(asset => asset.src);
21
20
  reload = `http://${host}:${port}`;
22
21
  paths = ["/esbuild"].concat(assets);
23
- log.print(`↻ live reload ${c.dim(reload)}\n`);
22
+ app.log.print `↻ live reload ${cli.fg.dim(reload)}\n`;
24
23
  });
25
24
  onHandle((request, next) => {
26
25
  const { pathname } = new URL(request.url);
@@ -1,8 +1,7 @@
1
1
  import { s_attach, s_config } from "#app/Facade";
2
2
  import E from "#db/errors";
3
- import log from "#log";
4
- import key from "#orm/key";
5
- import store from "#orm/store";
3
+ import key from "#store/key";
4
+ import store from "#store";
6
5
  import ServeApp from "#serve/App";
7
6
  import serve_hook from "#serve/hook";
8
7
  import p from "pema";
@@ -16,14 +15,14 @@ export default async (root, options) => {
16
15
  if (migrations !== undefined) {
17
16
  const { table, db } = migrations;
18
17
  const Migration = store({
19
- name: table,
18
+ table,
20
19
  db,
21
20
  schema: {
22
21
  id: key.primary(p.u16, { generate: false }),
23
22
  applied: p.date,
24
23
  },
25
24
  });
26
- await Migration.table.create();
25
+ await Migration.create();
27
26
  const last = await Migration.find({ limit: 1, sort: { id: "desc" } });
28
27
  const last_id = last.length === 0 ? 0 : last[0].id;
29
28
  const build_json = app.root.join("build.json");
@@ -34,7 +33,7 @@ export default async (root, options) => {
34
33
  return serve_hook(app);
35
34
  }
36
35
  catch (cause) {
37
- log.error(cause);
36
+ app.log.error(cause);
38
37
  }
39
38
  };
40
39
  //# sourceMappingURL=index.js.map
@@ -1,3 +1,3 @@
1
- declare const _default: "0.5";
1
+ declare const _default: "0.6";
2
2
  export default _default;
3
3
  //# sourceMappingURL=TAG.d.ts.map
@@ -1,2 +1,2 @@
1
- export default "0.5";
1
+ export default "0.6";
2
2
  //# sourceMappingURL=TAG.js.map
@@ -1,6 +1,6 @@
1
- import type { Store } from "#orm/store";
2
1
  import configSchema from "#session/schema";
3
2
  import type SessionFacade from "#session/SessionFacade";
3
+ import type Store from "#store/Store";
4
4
  import type { InferStore, StoreSchema } from "pema";
5
5
  type ConfigInput = typeof configSchema.input;
6
6
  type X<T> = {
@@ -1,3 +1,4 @@
1
+ import E from "#errors";
1
2
  import configSchema from "#session/schema";
2
3
  import local_storage from "#session/storage";
3
4
  import s_config from "#symbol/config";
@@ -8,8 +9,8 @@ export default function session(config) {
8
9
  const storage = local_storage();
9
10
  const current = () => {
10
11
  const s = storage.getStore();
11
- if (!s)
12
- throw new Error("Session handle not available in this context");
12
+ if (s === undefined)
13
+ throw E.session_handle_unavailable();
13
14
  return s;
14
15
  };
15
16
  const facade = {
@@ -20,7 +20,7 @@ function cookie(name, value, options) {
20
20
  export default function session_module(config) {
21
21
  let secure;
22
22
  const store = config.store;
23
- const props = store.type.properties;
23
+ const props = store.schema.properties;
24
24
  if (!("session_id" in props))
25
25
  throw E.session_missing_id();
26
26
  try {
@@ -34,7 +34,7 @@ export default function session_module(config) {
34
34
  setup({ onServe, onHandle }) {
35
35
  onServe(async (app) => {
36
36
  secure = app.secure;
37
- await store.table.create();
37
+ await store.create();
38
38
  });
39
39
  onHandle(async (request, next) => {
40
40
  const { name, ...cookie_config } = config.cookie;
@@ -52,7 +52,7 @@ export default function session_module(config) {
52
52
  data = rest;
53
53
  db_id = _id;
54
54
  }
55
- const session_type = p.omit(store.type, "id", "session_id");
55
+ const session_type = p.omit(store.schema, "id", "session_id");
56
56
  const session = new SessionHandle(sid, data, session_type);
57
57
  const response = await new Promise((resolve, reject) => {
58
58
  storage().run(session, async () => {
@@ -1,4 +1,4 @@
1
- import { Store } from "#orm/store";
1
+ import Store from "#store/Store";
2
2
  declare const _default: import("pema").ObjectType<import("pema").NormalizeSchemaObject<{
3
3
  readonly cookie: {
4
4
  readonly httpOnly: import("pema").DefaultType<import("pema").BooleanType, true>;
@@ -6,7 +6,7 @@ declare const _default: import("pema").ObjectType<import("pema").NormalizeSchema
6
6
  readonly path: import("pema").DefaultType<import("pema").StringType, "/">;
7
7
  readonly sameSite: import("pema").DefaultType<import("pema").UnionType<[import("pema").LiteralType<"Strict">, import("pema").LiteralType<"Lax">, import("pema").LiteralType<"None">]>, "Lax" | "None" | "Strict">;
8
8
  };
9
- readonly store: import("pema").DefaultType<import("pema").ConstructorType<typeof Store>, Store<import("../orm/StoreInput.js").default, import("@rcompat/type").Dict<import("../orm/relation.js").Relation>>>;
9
+ readonly store: import("pema").DefaultType<import("pema").ConstructorType<typeof Store>, Store<import("../store/StoreInput.js").default, string>>;
10
10
  }>, {
11
11
  cookie: {
12
12
  httpOnly: boolean;
@@ -14,7 +14,7 @@ declare const _default: import("pema").ObjectType<import("pema").NormalizeSchema
14
14
  path: string;
15
15
  sameSite: "Lax" | "None" | "Strict";
16
16
  };
17
- store: Store<import("../orm/StoreInput.js").default, import("@rcompat/type").Dict<import("../orm/relation.js").Relation>>;
17
+ store: Store<import("../store/StoreInput.js").default, string>;
18
18
  }>;
19
19
  export default _default;
20
20
  //# sourceMappingURL=schema.d.ts.map
@@ -1,6 +1,7 @@
1
1
  import MemoryDB from "#db/MemoryDB";
2
- import key from "#orm/key";
3
- import store, { Store } from "#orm/store";
2
+ import store from "#store";
3
+ import Store from "#store/Store";
4
+ import key from "#store/key";
4
5
  import p from "pema";
5
6
  export default p({
6
7
  cookie: {
@@ -16,7 +17,7 @@ export default p({
16
17
  session_id: p.uuid,
17
18
  },
18
19
  db: new MemoryDB(),
19
- name: "session",
20
+ table: "session",
20
21
  });
21
22
  }),
22
23
  });
@@ -0,0 +1,7 @@
1
+ import type StoreInput from "#store/StoreInput";
2
+ import type { ManyRelation, OneRelation } from "#store/relation";
3
+ type ExtractRelations<T extends StoreInput> = {
4
+ [K in keyof T as T[K] extends OneRelation<string, string> | ManyRelation<string, string> ? K : never]: T[K] extends OneRelation<string, string> | ManyRelation<string, string> ? T[K] : never;
5
+ };
6
+ export type { ExtractRelations as default };
7
+ //# sourceMappingURL=ExtractRelation.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ExtractRelation.js.map
@@ -0,0 +1,10 @@
1
+ import type ForeignKey from "#store/ForeignKey";
2
+ import type PrimaryKey from "#store/PrimaryKey";
3
+ import type { ManyRelation, OneRelation } from "#store/relation";
4
+ import type StoreInput from "#store/StoreInput";
5
+ import type { DataKey, Storable } from "pema";
6
+ type ExtractSchema<T extends StoreInput> = {
7
+ [K in keyof T as T[K] extends OneRelation<string, string> | ManyRelation<string, string> ? never : K]: T[K] extends PrimaryKey<infer P> ? P : T[K] extends ForeignKey<infer P> ? P : T[K] extends Storable<DataKey> ? T[K] : never;
8
+ };
9
+ export type { ExtractSchema as default };
10
+ //# sourceMappingURL=ExtractSchema.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { AllowedPKType } from "#orm/PrimaryKey";
1
+ import type { AllowedPKType } from "#store/PrimaryKey";
2
2
  import type { OptionalType } from "pema";
3
3
  export type AllowedFKType = AllowedPKType | OptionalType<AllowedPKType>;
4
4
  export default class ForeignKey<T extends AllowedFKType> {
@@ -0,0 +1,13 @@
1
+ import type DB from "#db/DB";
2
+ import type StoreInput from "#store/StoreInput";
3
+ import type { Dict } from "@rcompat/type";
4
+ type Init<S extends StoreInput, N extends string> = {
5
+ table: N;
6
+ db: DB;
7
+ id?: symbol;
8
+ schema: S;
9
+ migrate?: boolean;
10
+ extend?: Dict;
11
+ };
12
+ export type { Init as default };
13
+ //# sourceMappingURL=Init.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Init.js.map