@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.
- package/lib/private/App.d.ts +263 -26
- package/lib/private/App.js +42 -14
- package/lib/private/Flags.d.ts +8 -4
- package/lib/private/Module.d.ts +4 -16
- package/lib/private/Module.js +1 -17
- package/lib/private/app/EnvSchema.d.ts +5 -0
- package/lib/private/app/EnvSchema.js +2 -0
- package/lib/private/app/Facade.browser.d.ts +11 -0
- package/lib/private/app/Facade.browser.js +19 -0
- package/lib/private/app/Facade.d.ts +272 -27
- package/lib/private/app/Facade.js +23 -0
- package/lib/private/build/client/index.js +8 -3
- package/lib/private/build/client/plugin/app-request.d.ts +4 -0
- package/lib/private/build/client/plugin/app-request.js +19 -0
- package/lib/private/build/client/plugin/view.d.ts +4 -0
- package/lib/private/build/client/plugin/view.js +13 -0
- package/lib/private/build/hook.d.ts +1 -2
- package/lib/private/build/hook.js +21 -16
- package/lib/private/build/index.d.ts +2 -1
- package/lib/private/build/index.js +20 -21
- package/lib/private/build/server/index.js +7 -9
- package/lib/private/build/server/plugin/app-request.d.ts +4 -0
- package/lib/private/build/server/plugin/app-request.js +19 -0
- package/lib/private/build/server/plugin/assets.js +1 -1
- package/lib/private/build/server/plugin/live-reload.js +9 -9
- package/lib/private/build/server/plugin/native-addons.js +4 -7
- package/lib/private/build/server/plugin/route.js +2 -2
- package/lib/private/build/server/plugin/store.js +9 -31
- package/lib/private/build/server/plugin/stores.js +11 -7
- package/lib/private/build/server/plugin/view.js +1 -1
- package/lib/private/build/shared/plugin/app-request.d.ts +4 -0
- package/lib/private/build/shared/plugin/app-request.js +19 -0
- package/lib/private/client/Data.d.ts +3 -2
- package/lib/private/{frontend → client}/Render.d.ts +1 -1
- package/lib/private/{frontend → client}/ViewResponse.d.ts +1 -1
- package/lib/private/client/app.js +1 -2
- package/lib/private/client/boot.d.ts +5 -0
- package/lib/private/client/boot.js +64 -0
- package/lib/private/client/create-form.d.ts +1 -0
- package/lib/private/client/create-form.js +19 -20
- package/lib/private/client/extract-issues.js +2 -1
- package/lib/private/client/http.d.ts +13 -0
- package/lib/private/client/http.js +57 -0
- package/lib/private/client/index.d.ts +23 -0
- package/lib/private/client/index.js +16 -0
- package/lib/private/client/navigate.d.ts +13 -0
- package/lib/private/client/navigate.js +67 -0
- package/lib/private/client/root.d.ts +9 -0
- package/lib/private/client/root.js +11 -0
- package/lib/private/client/submit.d.ts +2 -0
- package/lib/private/client/submit.js +41 -0
- package/lib/private/config/index.d.ts +7 -2
- package/lib/private/config/index.js +3 -2
- package/lib/private/config/schema.d.ts +82 -26
- package/lib/private/config/schema.js +17 -4
- package/lib/private/cookie.d.ts +12 -6
- package/lib/private/db/DB.d.ts +21 -5
- package/lib/private/db/DB.js +1 -0
- package/lib/private/db/MemoryDB.d.ts +2 -4
- package/lib/private/db/MemoryDB.js +40 -22
- package/lib/private/db/common.d.ts +7 -0
- package/lib/private/db/common.js +31 -0
- package/lib/private/db/errors.d.ts +104 -0
- package/lib/private/db/errors.js +237 -0
- package/lib/private/db/migrate/apply.d.ts +2 -0
- package/lib/private/db/migrate/apply.js +32 -0
- package/lib/private/db/migrate/bundle.d.ts +3 -0
- package/lib/private/db/migrate/bundle.js +22 -0
- package/lib/private/db/migrate/create.d.ts +2 -0
- package/lib/private/db/migrate/create.js +154 -0
- package/lib/private/db/migrate/index.d.ts +10 -0
- package/lib/private/db/migrate/index.js +6 -0
- package/lib/private/db/migrate/status.d.ts +2 -0
- package/lib/private/db/migrate/status.js +38 -0
- package/lib/private/db/migrate/store.d.ts +5 -0
- package/lib/private/db/migrate/store.js +33 -0
- package/lib/private/db/sql.js +3 -3
- package/lib/private/db/test.js +461 -95
- package/lib/private/errors.d.ts +88 -0
- package/lib/private/errors.js +211 -0
- package/lib/private/frontend.d.ts +72 -0
- package/lib/private/frontend.js +245 -0
- package/lib/private/i18n/Formatter.js +2 -2
- package/lib/private/i18n/errors.d.ts +16 -0
- package/lib/private/i18n/errors.js +27 -0
- package/lib/private/i18n/module.d.ts +3 -0
- package/lib/private/i18n/module.js +115 -0
- package/lib/private/i18n/schema.d.ts +10 -5
- package/lib/private/i18n/validate.js +5 -7
- package/lib/private/index.d.ts +14 -0
- package/lib/private/index.js +2 -0
- package/lib/private/log.js +6 -5
- package/lib/private/module/Setup.d.ts +21 -0
- package/lib/private/module/Setup.js +2 -0
- package/lib/private/module/create.d.ts +16 -0
- package/lib/private/module/create.js +28 -0
- package/lib/private/orm/ExtractSchema.d.ts +9 -0
- package/lib/private/orm/ExtractSchema.js +2 -0
- package/lib/private/orm/ForeignKey.d.ts +5 -2
- package/lib/private/orm/ForeignKey.js +3 -0
- package/lib/private/orm/PrimaryKey.d.ts +5 -3
- package/lib/private/orm/PrimaryKey.js +9 -6
- package/lib/private/orm/StoreInput.d.ts +10 -0
- package/lib/private/orm/StoreInput.js +2 -0
- package/lib/private/orm/key.d.ts +6 -6
- package/lib/private/orm/key.js +7 -3
- package/lib/private/orm/parse.d.ts +5 -4
- package/lib/private/orm/parse.js +2 -2
- package/lib/private/orm/relation.d.ts +2 -2
- package/lib/private/orm/{Store.d.ts → store.d.ts} +33 -17
- package/lib/private/orm/{Store.js → store.js} +91 -67
- package/lib/private/paths.js +3 -3
- package/lib/private/request/RequestBag.d.ts +4 -0
- package/lib/private/request/RequestBag.js +5 -2
- package/lib/private/request/RequestBody.d.ts +6 -9
- package/lib/private/request/RequestBody.js +49 -54
- package/lib/private/request/RequestFacade.d.ts +3 -8
- package/lib/private/request/RequestPublic.d.ts +9 -0
- package/lib/private/request/RequestPublic.js +2 -0
- package/lib/private/request/RequestView.d.ts +11 -0
- package/lib/private/request/RequestView.js +3 -0
- package/lib/private/request/handle.d.ts +4 -0
- package/lib/private/request/handle.js +18 -0
- package/lib/private/request/parse.js +1 -0
- package/lib/private/request/route.js +8 -9
- package/lib/private/request/router.js +21 -49
- package/lib/private/request/storage.d.ts +4 -0
- package/lib/private/request/storage.js +5 -0
- package/lib/private/response/ResponseFunction.d.ts +1 -1
- package/lib/private/response/binary.js +1 -1
- package/lib/private/response/error.d.ts +1 -1
- package/lib/private/response/error.js +1 -1
- package/lib/private/response/json.d.ts +1 -1
- package/lib/private/response/json.js +1 -1
- package/lib/private/response/redirect.d.ts +5 -5
- package/lib/private/response/redirect.js +8 -9
- package/lib/private/response/respond.js +9 -7
- package/lib/private/response/sse.d.ts +1 -1
- package/lib/private/response/sse.js +1 -1
- package/lib/private/response/text.d.ts +1 -1
- package/lib/private/response/text.js +1 -1
- package/lib/private/response/view.d.ts +1 -1
- package/lib/private/response/view.js +6 -13
- package/lib/private/response/ws.d.ts +1 -1
- package/lib/private/route/router.d.ts +3 -3
- package/lib/private/route/router.js +7 -10
- package/lib/private/serve/App.d.ts +6 -7
- package/lib/private/serve/App.js +52 -43
- package/lib/private/serve/Init.d.ts +2 -2
- package/lib/private/serve/dev-module.d.ts +2 -0
- package/lib/private/serve/dev-module.js +34 -0
- package/lib/private/serve/hook.d.ts +1 -2
- package/lib/private/serve/hook.js +2 -3
- package/lib/private/serve/index.d.ts +1 -1
- package/lib/private/serve/index.js +32 -2
- package/lib/private/server/TAG.d.ts +3 -0
- package/lib/private/server/TAG.js +2 -0
- package/lib/private/server/index.d.ts +5 -0
- package/lib/private/server/index.js +6 -0
- package/lib/private/session/SessionHandle.js +2 -1
- package/lib/private/session/index.d.ts +1 -1
- package/lib/private/session/module.d.ts +3 -0
- package/lib/private/session/module.js +114 -0
- package/lib/private/session/schema.d.ts +17 -9
- package/lib/private/session/schema.js +9 -5
- package/lib/private/target/Manager.js +6 -12
- package/lib/public/client.d.ts +2 -13
- package/lib/public/client.js +1 -9
- package/lib/public/db/errors.d.ts +2 -0
- package/lib/public/db/errors.js +2 -0
- package/lib/public/db/migrate.d.ts +2 -0
- package/lib/public/db/migrate.js +2 -0
- package/lib/public/db.d.ts +3 -3
- package/lib/public/frontend.d.ts +3 -0
- package/lib/public/frontend.js +2 -0
- package/lib/public/index.d.ts +2 -0
- package/lib/public/index.js +2 -0
- package/lib/public/orm/store.d.ts +2 -0
- package/lib/public/orm/store.js +2 -0
- package/lib/public/request/server.d.ts +5 -0
- package/lib/public/request/server.js +7 -0
- package/lib/public/response.d.ts +4 -4
- package/lib/public/server.d.ts +3 -0
- package/lib/public/server.js +2 -0
- package/package.json +30 -25
- package/lib/private/AppError.d.ts +0 -4
- package/lib/private/AppError.js +0 -8
- package/lib/private/backend/Module.d.ts +0 -18
- package/lib/private/backend/Module.js +0 -19
- package/lib/private/backend/TAG.d.ts +0 -3
- package/lib/private/backend/TAG.js +0 -2
- package/lib/private/build/server/plugin/db-default.d.ts +0 -4
- package/lib/private/build/server/plugin/db-default.js +0 -45
- package/lib/private/build/server/plugin/store-wrap.d.ts +0 -4
- package/lib/private/build/server/plugin/store-wrap.js +0 -33
- package/lib/private/client/spa/index.d.ts +0 -6
- package/lib/private/client/spa/index.js +0 -200
- package/lib/private/db/error.d.ts +0 -81
- package/lib/private/db/error.js +0 -199
- package/lib/private/db/symbol/wrap.d.ts +0 -3
- package/lib/private/db/symbol/wrap.js +0 -2
- package/lib/private/fail.d.ts +0 -3
- package/lib/private/fail.js +0 -5
- package/lib/private/frontend/Module.d.ts +0 -62
- package/lib/private/frontend/Module.js +0 -255
- package/lib/private/i18n/Module.d.ts +0 -16
- package/lib/private/i18n/Module.js +0 -133
- package/lib/private/module/BuildHook.d.ts +0 -5
- package/lib/private/module/BuildHook.js +0 -2
- package/lib/private/module/NextBuild.d.ts +0 -5
- package/lib/private/module/NextBuild.js +0 -2
- package/lib/private/module/NextServe.d.ts +0 -5
- package/lib/private/module/NextServe.js +0 -2
- package/lib/private/orm/Set.d.ts +0 -11
- package/lib/private/orm/Set.js +0 -2
- package/lib/private/orm/foreign.d.ts +0 -4
- package/lib/private/orm/foreign.js +0 -5
- package/lib/private/orm/primary.d.ts +0 -5
- package/lib/private/orm/primary.js +0 -5
- package/lib/private/orm/types.d.ts +0 -18
- package/lib/private/orm/types.js +0 -2
- package/lib/private/orm/wrap.d.ts +0 -5
- package/lib/private/orm/wrap.js +0 -5
- package/lib/private/reducer.d.ts +0 -24
- package/lib/private/reducer.js +0 -10
- package/lib/private/serve/module/Dev.d.ts +0 -11
- package/lib/private/serve/module/Dev.js +0 -32
- package/lib/private/serve/module/Handle.d.ts +0 -10
- package/lib/private/serve/module/Handle.js +0 -15
- package/lib/private/session/SessionModule.d.ts +0 -14
- package/lib/private/session/SessionModule.js +0 -122
- package/lib/public/App.d.ts +0 -2
- package/lib/public/App.js +0 -2
- package/lib/public/AppError.d.ts +0 -2
- package/lib/public/AppError.js +0 -2
- package/lib/public/BuildApp.d.ts +0 -2
- package/lib/public/BuildApp.js +0 -2
- package/lib/public/BuildHook.d.ts +0 -2
- package/lib/public/BuildHook.js +0 -2
- package/lib/public/Mode.d.ts +0 -2
- package/lib/public/Mode.js +0 -2
- package/lib/public/Module.d.ts +0 -2
- package/lib/public/Module.js +0 -2
- package/lib/public/Next.d.ts +0 -2
- package/lib/public/Next.js +0 -2
- package/lib/public/NextBuild.d.ts +0 -2
- package/lib/public/NextBuild.js +0 -2
- package/lib/public/NextHandle.d.ts +0 -2
- package/lib/public/NextHandle.js +0 -2
- package/lib/public/NextRoute.d.ts +0 -3
- package/lib/public/NextRoute.js +0 -2
- package/lib/public/NextServe.d.ts +0 -2
- package/lib/public/NextServe.js +0 -2
- package/lib/public/ServeApp.d.ts +0 -2
- package/lib/public/ServeApp.js +0 -2
- package/lib/public/Target.d.ts +0 -2
- package/lib/public/Target.js +0 -2
- package/lib/public/backend/Module.d.ts +0 -2
- package/lib/public/backend/Module.js +0 -2
- package/lib/public/backend/TAG.d.ts +0 -2
- package/lib/public/backend/TAG.js +0 -2
- package/lib/public/client/Data.d.ts +0 -2
- package/lib/public/client/Data.js +0 -2
- package/lib/public/client/spa.d.ts +0 -2
- package/lib/public/client/spa.js +0 -2
- package/lib/public/db/error.d.ts +0 -2
- package/lib/public/db/error.js +0 -2
- package/lib/public/fail.d.ts +0 -2
- package/lib/public/fail.js +0 -2
- package/lib/public/frontend/Module.d.ts +0 -2
- package/lib/public/frontend/Module.js +0 -2
- package/lib/public/frontend/Publish.d.ts +0 -2
- package/lib/public/frontend/Publish.js +0 -2
- package/lib/public/frontend/Render.d.ts +0 -2
- package/lib/public/frontend/Render.js +0 -2
- package/lib/public/frontend/ViewResponse.d.ts +0 -2
- package/lib/public/frontend/ViewResponse.js +0 -2
- package/lib/public/orm/Store.d.ts +0 -2
- package/lib/public/orm/Store.js +0 -2
- package/lib/public/orm/wrap.d.ts +0 -2
- package/lib/public/orm/wrap.js +0 -2
- package/lib/public/request.d.ts +0 -4
- package/lib/public/request.js +0 -2
- /package/lib/private/{frontend → client}/Publish.d.ts +0 -0
- /package/lib/private/{frontend → client}/Publish.js +0 -0
- /package/lib/private/{frontend → client}/Render.js +0 -0
- /package/lib/private/{frontend → client}/ServerData.d.ts +0 -0
- /package/lib/private/{frontend → client}/ServerData.js +0 -0
- /package/lib/private/{frontend → client}/ServerView.d.ts +0 -0
- /package/lib/private/{frontend → client}/ServerView.js +0 -0
- /package/lib/private/{frontend → client}/View.d.ts +0 -0
- /package/lib/private/{frontend → client}/View.js +0 -0
- /package/lib/private/{frontend → client}/ViewOptions.d.ts +0 -0
- /package/lib/private/{frontend → client}/ViewOptions.js +0 -0
- /package/lib/private/{frontend → client}/ViewResponse.js +0 -0
- /package/lib/private/client/{spa/storage.d.ts → storage.d.ts} +0 -0
- /package/lib/private/client/{spa/storage.js → storage.js} +0 -0
|
@@ -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
|
-
|
|
13
|
-
|
|
14
|
-
throw
|
|
15
|
-
|
|
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
|
package/lib/private/log.js
CHANGED
|
@@ -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
|
|
38
|
-
|
|
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,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
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
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;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Storable } from "pema";
|
|
2
2
|
export type Options = {
|
|
3
3
|
generate?: boolean;
|
|
4
4
|
};
|
|
5
|
-
export
|
|
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():
|
|
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
|
|
2
|
-
const
|
|
3
|
-
"
|
|
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 (!
|
|
13
|
-
|
|
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
|
package/lib/private/orm/key.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
declare const
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
7
|
+
export default key;
|
|
8
8
|
//# sourceMappingURL=key.d.ts.map
|
package/lib/private/orm/key.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
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 {
|
|
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<
|
|
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
|
package/lib/private/orm/parse.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
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
|
|
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,16 +1,19 @@
|
|
|
1
1
|
import type DB from "#db/DB";
|
|
2
|
-
import
|
|
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
|
|
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 "
|
|
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
|
|
69
|
-
|
|
70
|
-
|
|
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
|
|
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(
|
|
85
|
-
|
|
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
|
-
|
|
171
|
-
|
|
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
|