@atria/server 0.0.9 → 0.0.12
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/README.md +26 -10
- package/dist/auth/cookies.d.ts +11 -0
- package/dist/auth/cookies.js +38 -0
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/hash.d.ts +2 -0
- package/dist/auth/hash.js +36 -0
- package/dist/auth/hash.js.map +1 -0
- package/dist/auth/oauth.d.ts +5 -0
- package/dist/auth/oauth.js +215 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/runtime.d.ts +28 -0
- package/dist/auth/runtime.js +528 -0
- package/dist/auth/runtime.js.map +1 -0
- package/dist/auth/store.d.ts +33 -0
- package/dist/auth/store.js +49 -0
- package/dist/auth/store.js.map +1 -0
- package/dist/auth/types.d.ts +40 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/validation.d.ts +21 -0
- package/dist/auth/validation.js +97 -0
- package/dist/auth/validation.js.map +1 -0
- package/dist/dev/admin/assets.d.ts +2 -0
- package/dist/dev/admin/assets.js +30 -0
- package/dist/dev/admin/assets.js.map +1 -0
- package/dist/dev/admin/i18n.d.ts +2 -0
- package/dist/dev/admin/i18n.js +63 -0
- package/dist/dev/admin/i18n.js.map +1 -0
- package/dist/dev/admin/index.d.ts +3 -0
- package/dist/dev/admin/index.js +4 -0
- package/dist/dev/admin/index.js.map +1 -0
- package/dist/dev/admin/request.d.ts +14 -0
- package/dist/dev/admin/request.js +77 -0
- package/dist/dev/admin/request.js.map +1 -0
- package/dist/dev/admin/routing.d.ts +5 -0
- package/dist/dev/admin/routing.js +31 -0
- package/dist/dev/admin/routing.js.map +1 -0
- package/dist/dev/admin-assets.d.ts +2 -0
- package/dist/dev/admin-assets.js +30 -0
- package/dist/dev/admin-assets.js.map +1 -0
- package/dist/dev/admin.d.ts +2 -0
- package/dist/dev/admin.js +30 -0
- package/dist/dev/admin.js.map +1 -0
- package/dist/dev/constants.d.ts +11 -0
- package/dist/dev/constants.js +22 -0
- package/dist/dev/constants.js.map +1 -0
- package/dist/dev/health/index.d.ts +2 -0
- package/dist/dev/health/index.js +3 -0
- package/dist/dev/health/index.js.map +1 -0
- package/dist/dev/health/request.d.ts +14 -0
- package/dist/dev/health/request.js +22 -0
- package/dist/dev/health/request.js.map +1 -0
- package/dist/dev/health/state.d.ts +9 -0
- package/dist/dev/health/state.js +52 -0
- package/dist/dev/health/state.js.map +1 -0
- package/dist/dev/health.d.ts +9 -0
- package/dist/dev/health.js +52 -0
- package/dist/dev/health.js.map +1 -0
- package/dist/dev/http/errors.d.ts +2 -0
- package/dist/dev/http/errors.js +6 -0
- package/dist/dev/http/errors.js.map +1 -0
- package/dist/dev/http/routing.d.ts +3 -0
- package/dist/dev/http/routing.js +26 -0
- package/dist/dev/http/routing.js.map +1 -0
- package/dist/dev/i18n.d.ts +2 -0
- package/dist/dev/i18n.js +63 -0
- package/dist/dev/i18n.js.map +1 -0
- package/dist/dev/lifecycle.d.ts +2 -0
- package/dist/dev/lifecycle.js +10 -0
- package/dist/dev/lifecycle.js.map +1 -0
- package/dist/dev/public/index.d.ts +1 -0
- package/dist/dev/public/index.js +2 -0
- package/dist/dev/public/index.js.map +1 -0
- package/dist/dev/public/request.d.ts +9 -0
- package/dist/dev/public/request.js +29 -0
- package/dist/dev/public/request.js.map +1 -0
- package/dist/dev/public/responses.d.ts +3 -0
- package/dist/dev/public/responses.js +25 -0
- package/dist/dev/public/responses.js.map +1 -0
- package/dist/dev/public/routing.d.ts +1 -0
- package/dist/dev/public/routing.js +5 -0
- package/dist/dev/public/routing.js.map +1 -0
- package/dist/dev/responses.d.ts +2 -0
- package/dist/dev/responses.js +3 -0
- package/dist/dev/responses.js.map +1 -0
- package/dist/dev/routing.d.ts +3 -0
- package/dist/dev/routing.js +4 -0
- package/dist/dev/routing.js.map +1 -0
- package/dist/dev/setup/index.d.ts +2 -0
- package/dist/dev/setup/index.js +2 -0
- package/dist/dev/setup/index.js.map +1 -0
- package/dist/dev/setup/request.d.ts +5 -0
- package/dist/dev/setup/request.js +20 -0
- package/dist/dev/setup/request.js.map +1 -0
- package/dist/dev/setup/types.d.ts +5 -0
- package/dist/dev/setup/types.js +2 -0
- package/dist/dev/setup/types.js.map +1 -0
- package/dist/dev/static/files.d.ts +6 -0
- package/dist/dev/static/files.js +74 -0
- package/dist/dev/static/files.js.map +1 -0
- package/dist/dev/static/index.d.ts +4 -0
- package/dist/dev/static/index.js +5 -0
- package/dist/dev/static/index.js.map +1 -0
- package/dist/dev/static/paths.d.ts +1 -0
- package/dist/dev/static/paths.js +6 -0
- package/dist/dev/static/paths.js.map +1 -0
- package/dist/dev/static/publish.d.ts +1 -0
- package/dist/dev/static/publish.js +13 -0
- package/dist/dev/static/publish.js.map +1 -0
- package/dist/dev/static/resolver.d.ts +2 -0
- package/dist/dev/static/resolver.js +53 -0
- package/dist/dev/static/resolver.js.map +1 -0
- package/dist/dev/static/sender.d.ts +2 -0
- package/dist/dev/static/sender.js +11 -0
- package/dist/dev/static/sender.js.map +1 -0
- package/dist/dev/static-files.d.ts +6 -0
- package/dist/dev/static-files.js +74 -0
- package/dist/dev/static-files.js.map +1 -0
- package/dist/dev/types.d.ts +10 -0
- package/dist/dev/types.js +2 -0
- package/dist/dev/types.js.map +1 -0
- package/dist/server.js +65 -190
- package/dist/server.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { openAtriaDatabase, resolveDatabaseConnection } from "@atria/db";
|
|
2
|
+
const toHealthErrorMessage = (error) => {
|
|
3
|
+
if (error instanceof AggregateError) {
|
|
4
|
+
const nested = error.errors
|
|
5
|
+
.map((entry) => (entry instanceof Error && entry.message ? entry.message : String(entry)))
|
|
6
|
+
.map((entry) => entry.trim())
|
|
7
|
+
.filter((entry) => entry.length > 0);
|
|
8
|
+
if (nested.length > 0) {
|
|
9
|
+
return nested.join(" | ");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
if (error instanceof Error && error.message.trim().length > 0) {
|
|
13
|
+
return error.message.trim();
|
|
14
|
+
}
|
|
15
|
+
if (typeof error === "object" && error !== null && "code" in error) {
|
|
16
|
+
const code = error.code;
|
|
17
|
+
if (typeof code === "string" && code.trim().length > 0) {
|
|
18
|
+
return code.trim();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return String(error).trim();
|
|
22
|
+
};
|
|
23
|
+
export const readDatabaseHealthState = async (projectRoot) => {
|
|
24
|
+
const connection = resolveDatabaseConnection(projectRoot);
|
|
25
|
+
const baseState = {
|
|
26
|
+
driver: connection.driver,
|
|
27
|
+
source: connection.source,
|
|
28
|
+
usesFallback: connection.usesFallback
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
const database = openAtriaDatabase(projectRoot);
|
|
32
|
+
try {
|
|
33
|
+
await database.hasUsers();
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await database.close();
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
...baseState,
|
|
40
|
+
reachable: true,
|
|
41
|
+
error: null
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return {
|
|
46
|
+
...baseState,
|
|
47
|
+
reachable: false,
|
|
48
|
+
error: toHealthErrorMessage(error)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/dev/health/state.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EAG1B,MAAM,WAAW,CAAC;AAUnB,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAU,EAAE;IACtD,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;aACxB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aACzF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;aAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;QAChD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,WAAmB,EAAgC,EAAE;IACjG,MAAM,UAAU,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG;QAChB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,YAAY,EAAE,UAAU,CAAC,YAAY;KACtC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QAED,OAAO;YACL,GAAG,SAAS;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,GAAG,SAAS;YACZ,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC;SACnC,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type DatabaseDriver, type DatabaseSource } from "@atria/db";
|
|
2
|
+
export interface DatabaseHealthState {
|
|
3
|
+
driver: DatabaseDriver;
|
|
4
|
+
source: DatabaseSource;
|
|
5
|
+
usesFallback: boolean;
|
|
6
|
+
reachable: boolean;
|
|
7
|
+
error: string | null;
|
|
8
|
+
}
|
|
9
|
+
export declare const readDatabaseHealthState: (projectRoot: string) => Promise<DatabaseHealthState>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { openAtriaDatabase, resolveDatabaseConnection } from "@atria/db";
|
|
2
|
+
const toHealthErrorMessage = (error) => {
|
|
3
|
+
if (error instanceof AggregateError) {
|
|
4
|
+
const nested = error.errors
|
|
5
|
+
.map((entry) => (entry instanceof Error && entry.message ? entry.message : String(entry)))
|
|
6
|
+
.map((entry) => entry.trim())
|
|
7
|
+
.filter((entry) => entry.length > 0);
|
|
8
|
+
if (nested.length > 0) {
|
|
9
|
+
return nested.join(" | ");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
if (error instanceof Error && error.message.trim().length > 0) {
|
|
13
|
+
return error.message.trim();
|
|
14
|
+
}
|
|
15
|
+
if (typeof error === "object" && error !== null && "code" in error) {
|
|
16
|
+
const code = error.code;
|
|
17
|
+
if (typeof code === "string" && code.trim().length > 0) {
|
|
18
|
+
return code.trim();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return String(error).trim();
|
|
22
|
+
};
|
|
23
|
+
export const readDatabaseHealthState = async (projectRoot) => {
|
|
24
|
+
const connection = resolveDatabaseConnection(projectRoot);
|
|
25
|
+
const baseState = {
|
|
26
|
+
driver: connection.driver,
|
|
27
|
+
source: connection.source,
|
|
28
|
+
usesFallback: connection.usesFallback
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
const database = openAtriaDatabase(projectRoot);
|
|
32
|
+
try {
|
|
33
|
+
await database.hasUsers();
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await database.close();
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
...baseState,
|
|
40
|
+
reachable: true,
|
|
41
|
+
error: null
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return {
|
|
46
|
+
...baseState,
|
|
47
|
+
reachable: false,
|
|
48
|
+
error: toHealthErrorMessage(error)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/dev/health.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EAG1B,MAAM,WAAW,CAAC;AAUnB,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAU,EAAE;IACtD,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;aACxB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aACzF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;aAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;QAChD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,WAAmB,EAAgC,EAAE;IACjG,MAAM,UAAU,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG;QAChB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,YAAY,EAAE,UAAU,CAAC,YAAY;KACtC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QAED,OAAO;YACL,GAAG,SAAS;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,GAAG,SAAS;YACZ,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC;SACnC,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DEFAULT_NOT_FOUND_TEXT, MIME_TYPES } from "../constants.js";
|
|
2
|
+
export const respondWithDefaultNotFound = (response) => {
|
|
3
|
+
response.writeHead(404, { "content-type": MIME_TYPES[".txt"] });
|
|
4
|
+
response.end(DEFAULT_NOT_FOUND_TEXT);
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/dev/http/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAwB,EAAQ,EAAE;IAC3E,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACvC,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { PUBLIC_HOST_ALIASES, STUDIO_HOST_ALIASES } from "../constants.js";
|
|
2
|
+
export const parseRequestHostname = (hostHeader) => {
|
|
3
|
+
if (!hostHeader) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
const firstHost = hostHeader.split(",")[0]?.trim();
|
|
7
|
+
if (!firstHost) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
return new URL(`http://${firstHost}`).hostname.toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return firstHost.replace(/:\d+$/, "").toLowerCase();
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
export const resolveSiteTarget = (hostname) => {
|
|
18
|
+
if (hostname === null || PUBLIC_HOST_ALIASES.has(hostname)) {
|
|
19
|
+
return "public";
|
|
20
|
+
}
|
|
21
|
+
if (STUDIO_HOST_ALIASES.has(hostname)) {
|
|
22
|
+
return "admin";
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/dev/http/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAA8B,EAAiB,EAAE;IACpF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAuB,EAAqB,EAAE;IAC9E,IAAI,QAAQ,KAAK,IAAI,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
|
package/dist/dev/i18n.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { I18N_API_PREFIX, MIME_TYPES } from "./constants.js";
|
|
4
|
+
import { isInsideDirectory } from "./static/index.js";
|
|
5
|
+
const isValidLocaleId = (value) => /^[a-zA-Z0-9_-]+$/.test(value);
|
|
6
|
+
const listLocales = async (adminDistDir) => {
|
|
7
|
+
const localesDir = path.join(adminDistDir, "locales");
|
|
8
|
+
try {
|
|
9
|
+
const entries = await fs.readdir(localesDir, { withFileTypes: true });
|
|
10
|
+
return entries
|
|
11
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".json"))
|
|
12
|
+
.map((entry) => entry.name.replace(/\.json$/, ""))
|
|
13
|
+
.sort((left, right) => left.localeCompare(right));
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export const handleI18nRequest = async (requestUrl, response, adminDistDir) => {
|
|
20
|
+
if (!requestUrl.pathname.startsWith(I18N_API_PREFIX)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
const suffix = requestUrl.pathname.slice(I18N_API_PREFIX.length).replace(/^\/+/, "");
|
|
24
|
+
if (suffix.length === 0) {
|
|
25
|
+
const locales = await listLocales(adminDistDir);
|
|
26
|
+
response.writeHead(200, { "content-type": MIME_TYPES[".json"] });
|
|
27
|
+
response.end(JSON.stringify({
|
|
28
|
+
ok: true,
|
|
29
|
+
locales
|
|
30
|
+
}));
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
const localeId = suffix.split("/")[0] ?? "";
|
|
34
|
+
if (!isValidLocaleId(localeId)) {
|
|
35
|
+
response.writeHead(400, { "content-type": MIME_TYPES[".json"] });
|
|
36
|
+
response.end(JSON.stringify({
|
|
37
|
+
ok: false,
|
|
38
|
+
error: "Invalid locale id."
|
|
39
|
+
}));
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
const localesDir = path.join(adminDistDir, "locales");
|
|
43
|
+
const localeFilePath = path.join(localesDir, `${localeId}.json`);
|
|
44
|
+
if (!isInsideDirectory(localesDir, localeFilePath)) {
|
|
45
|
+
response.writeHead(403, { "content-type": MIME_TYPES[".txt"] });
|
|
46
|
+
response.end("Forbidden");
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const localeBuffer = await fs.readFile(localeFilePath);
|
|
51
|
+
response.writeHead(200, { "content-type": MIME_TYPES[".json"] });
|
|
52
|
+
response.end(localeBuffer);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
response.writeHead(404, { "content-type": MIME_TYPES[".json"] });
|
|
56
|
+
response.end(JSON.stringify({
|
|
57
|
+
ok: false,
|
|
58
|
+
error: "Locale not found."
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/dev/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,eAAe,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAEnF,MAAM,WAAW,GAAG,KAAK,EAAE,YAAoB,EAAqB,EAAE;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACjE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;aACjD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,UAAe,EACf,QAAwB,EACxB,YAAoB,EACF,EAAE;IACpB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;QAChD,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjE,QAAQ,CAAC,GAAG,CACV,IAAI,CAAC,SAAS,CAAC;YACb,EAAE,EAAE,IAAI;YACR,OAAO;SACR,CAAC,CACH,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjE,QAAQ,CAAC,GAAG,CACV,IAAI,CAAC,SAAS,CAAC;YACb,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,oBAAoB;SAC5B,CAAC,CACH,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;IAEjE,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,CAAC;QACnD,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChE,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACvD,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjE,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjE,QAAQ,CAAC,GAAG,CACV,IAAI,CAAC,SAAS,CAAC;YACb,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,mBAAmB;SAC3B,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/dev/lifecycle.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE,CACjE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,CAAC;YACd,OAAO;QACT,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { handlePublicRequest } from "./request.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dev/public/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ServerResponse } from "node:http";
|
|
2
|
+
interface HandlePublicRequestOptions {
|
|
3
|
+
requestUrl: URL;
|
|
4
|
+
response: ServerResponse;
|
|
5
|
+
publicDir: string;
|
|
6
|
+
publicOutputPublished: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const handlePublicRequest: (options: HandlePublicRequestOptions) => Promise<void>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { MIME_TYPES } from "../constants.js";
|
|
2
|
+
import { respondWithDefaultNotFound } from "../http/errors.js";
|
|
3
|
+
import { isRootPublicPath } from "./routing.js";
|
|
4
|
+
import { respondWithPublicNotFound, respondWithPublicUnavailable } from "./responses.js";
|
|
5
|
+
import { resolveRequestFile, sendFileResponse } from "../static/index.js";
|
|
6
|
+
export const handlePublicRequest = async (options) => {
|
|
7
|
+
const { requestUrl, response, publicDir, publicOutputPublished } = options;
|
|
8
|
+
if (!publicOutputPublished) {
|
|
9
|
+
if (isRootPublicPath(requestUrl.pathname)) {
|
|
10
|
+
respondWithPublicUnavailable(response);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
respondWithDefaultNotFound(response);
|
|
14
|
+
}
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const targetFile = await resolveRequestFile(publicDir, decodeURIComponent(requestUrl.pathname), "strict");
|
|
18
|
+
if (targetFile.type === "forbidden") {
|
|
19
|
+
response.writeHead(403, { "content-type": MIME_TYPES[".txt"] });
|
|
20
|
+
response.end("Forbidden");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (targetFile.type === "not-found") {
|
|
24
|
+
await respondWithPublicNotFound(response, publicDir);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
await sendFileResponse(response, targetFile.filePath);
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/dev/public/request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAS1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAmC,EAAiB,EAAE;IAC9F,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAE3E,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,IAAI,gBAAgB,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,kBAAkB,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE1G,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACpC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChE,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACpC,MAAM,yBAAyB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;AACxD,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { DEFAULT_NOT_FOUND_TEXT, DEFAULT_PUBLIC_UNAVAILABLE_TEXT, MIME_TYPES } from "../constants.js";
|
|
4
|
+
export const respondWithPublicNotFound = async (response, publicDir) => {
|
|
5
|
+
const notFoundPagePath = path.join(publicDir, "404.html");
|
|
6
|
+
try {
|
|
7
|
+
const notFoundPage = await fs.readFile(notFoundPagePath);
|
|
8
|
+
response.writeHead(404, { "content-type": MIME_TYPES[".html"] });
|
|
9
|
+
response.end(notFoundPage);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// Fall back to plain text when production/public/404.html is unavailable.
|
|
14
|
+
}
|
|
15
|
+
response.writeHead(404, { "content-type": MIME_TYPES[".txt"] });
|
|
16
|
+
response.end(DEFAULT_NOT_FOUND_TEXT);
|
|
17
|
+
};
|
|
18
|
+
export const respondWithPublicUnavailable = (response) => {
|
|
19
|
+
response.writeHead(503, {
|
|
20
|
+
"content-type": MIME_TYPES[".txt"],
|
|
21
|
+
"retry-after": "60"
|
|
22
|
+
});
|
|
23
|
+
response.end(DEFAULT_PUBLIC_UNAVAILABLE_TEXT);
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=responses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/dev/public/responses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,sBAAsB,EACtB,+BAA+B,EAC/B,UAAU,EACX,MAAM,iBAAiB,CAAC;AAEzB,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAC5C,QAAwB,EACxB,SAAiB,EACF,EAAE;IACjB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACzD,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjE,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;IAED,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,QAAwB,EAAQ,EAAE;IAC7E,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE;QACtB,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC;QAClC,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAChD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isRootPublicPath: (requestPath: string) => boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/dev/public/routing.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAW,EAAE;IAC/D,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,OAAO,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,KAAK,aAAa,CAAC;AACzE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/dev/responses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/dev/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dev/setup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ServerResponse } from "node:http";
|
|
2
|
+
import type { SiteTarget } from "../types.js";
|
|
3
|
+
import type { OwnerSetupState } from "./types.js";
|
|
4
|
+
export declare const isSetupStatusRequest: (requestUrl: URL) => boolean;
|
|
5
|
+
export declare const handleSetupStatusRequest: (requestUrl: URL, response: ServerResponse, siteTarget: SiteTarget, ownerSetupState: OwnerSetupState) => boolean;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { MIME_TYPES } from "../constants.js";
|
|
2
|
+
import { respondWithDefaultNotFound } from "../http/errors.js";
|
|
3
|
+
const SETUP_STATUS_PATH = "/api/setup/status";
|
|
4
|
+
export const isSetupStatusRequest = (requestUrl) => requestUrl.pathname === SETUP_STATUS_PATH;
|
|
5
|
+
export const handleSetupStatusRequest = (requestUrl, response, siteTarget, ownerSetupState) => {
|
|
6
|
+
if (!isSetupStatusRequest(requestUrl)) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
if (siteTarget !== "admin") {
|
|
10
|
+
respondWithDefaultNotFound(response);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
response.writeHead(200, { "content-type": MIME_TYPES[".json"] });
|
|
14
|
+
response.end(JSON.stringify({
|
|
15
|
+
pending: ownerSetupState.pending,
|
|
16
|
+
preferredAuthMethod: ownerSetupState.preferredAuthMethod
|
|
17
|
+
}));
|
|
18
|
+
return true;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/dev/setup/request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAG/D,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAAe,EAAW,EAAE,CAC/D,UAAU,CAAC,QAAQ,KAAK,iBAAiB,CAAC;AAE5C,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,UAAe,EACf,QAAwB,EACxB,UAAsB,EACtB,eAAgC,EACvB,EAAE;IACX,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjE,QAAQ,CAAC,GAAG,CACV,IAAI,CAAC,SAAS,CAAC;QACb,OAAO,EAAE,eAAe,CAAC,OAAO;QAChC,mBAAmB,EAAE,eAAe,CAAC,mBAAmB;KACzD,CAAC,CACH,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/dev/setup/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ServerResponse } from "node:http";
|
|
2
|
+
import type { ResolveRequestMode, ResolveRequestResult } from "../types.js";
|
|
3
|
+
export declare const isInsideDirectory: (basePath: string, targetPath: string) => boolean;
|
|
4
|
+
export declare const isPublicOutputPublished: (publicDir: string) => Promise<boolean>;
|
|
5
|
+
export declare const resolveRequestFile: (rootDir: string, requestPath: string, mode: ResolveRequestMode) => Promise<ResolveRequestResult>;
|
|
6
|
+
export declare const sendFileResponse: (response: ServerResponse, filePath: string) => Promise<void>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { MIME_TYPES } from "../constants.js";
|
|
4
|
+
export const isInsideDirectory = (basePath, targetPath) => {
|
|
5
|
+
const relativePath = path.relative(basePath, targetPath);
|
|
6
|
+
return relativePath !== "" && !relativePath.startsWith("..") && !path.isAbsolute(relativePath);
|
|
7
|
+
};
|
|
8
|
+
export const isPublicOutputPublished = async (publicDir) => {
|
|
9
|
+
const publicIndexPath = path.join(publicDir, "index.html");
|
|
10
|
+
try {
|
|
11
|
+
const indexStats = await fs.stat(publicIndexPath);
|
|
12
|
+
return indexStats.isFile() || indexStats.isSymbolicLink();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const resolveRootIndexFile = async (rootDir) => {
|
|
19
|
+
const rootIndexPath = path.join(rootDir, "index.html");
|
|
20
|
+
try {
|
|
21
|
+
const rootIndexStats = await fs.stat(rootIndexPath);
|
|
22
|
+
if (rootIndexStats.isFile()) {
|
|
23
|
+
return { type: "file", filePath: rootIndexPath };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// fall through to not found
|
|
28
|
+
}
|
|
29
|
+
return { type: "not-found" };
|
|
30
|
+
};
|
|
31
|
+
export const resolveRequestFile = async (rootDir, requestPath, mode) => {
|
|
32
|
+
const normalizedPath = requestPath === "/" ? "index.html" : requestPath.replace(/^\/+/, "");
|
|
33
|
+
const filePath = path.join(rootDir, normalizedPath);
|
|
34
|
+
if (!isInsideDirectory(rootDir, filePath)) {
|
|
35
|
+
return { type: "forbidden" };
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const fileStats = await fs.stat(filePath);
|
|
39
|
+
if (fileStats.isDirectory()) {
|
|
40
|
+
const directoryIndexPath = path.join(filePath, "index.html");
|
|
41
|
+
if (!isInsideDirectory(rootDir, directoryIndexPath)) {
|
|
42
|
+
return { type: "forbidden" };
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const directoryIndexStats = await fs.stat(directoryIndexPath);
|
|
46
|
+
if (directoryIndexStats.isFile()) {
|
|
47
|
+
return { type: "file", filePath: directoryIndexPath };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// fall through to not found/fallback response
|
|
52
|
+
}
|
|
53
|
+
return mode === "spa-fallback" ? resolveRootIndexFile(rootDir) : { type: "not-found" };
|
|
54
|
+
}
|
|
55
|
+
if (fileStats.isFile()) {
|
|
56
|
+
return { type: "file", filePath };
|
|
57
|
+
}
|
|
58
|
+
return { type: "not-found" };
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
if (mode === "spa-fallback" && !path.extname(normalizedPath)) {
|
|
62
|
+
return resolveRootIndexFile(rootDir);
|
|
63
|
+
}
|
|
64
|
+
return { type: "not-found" };
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
export const sendFileResponse = async (response, filePath) => {
|
|
68
|
+
const fileBuffer = await fs.readFile(filePath);
|
|
69
|
+
const extension = path.extname(filePath);
|
|
70
|
+
const contentType = MIME_TYPES[extension] ?? "application/octet-stream";
|
|
71
|
+
response.writeHead(200, { "content-type": contentType });
|
|
72
|
+
response.end(fileBuffer);
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/dev/static/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dev/static/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isInsideDirectory: (basePath: string, targetPath: string) => boolean;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
export const isInsideDirectory = (basePath, targetPath) => {
|
|
3
|
+
const relativePath = path.relative(basePath, targetPath);
|
|
4
|
+
return relativePath !== "" && !relativePath.startsWith("..") && !path.isAbsolute(relativePath);
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/dev/static/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,UAAkB,EAAW,EAAE;IACjF,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzD,OAAO,YAAY,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjG,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isPublicOutputPublished: (publicDir: string) => Promise<boolean>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const isPublicOutputPublished = async (publicDir) => {
|
|
4
|
+
const publicIndexPath = path.join(publicDir, "index.html");
|
|
5
|
+
try {
|
|
6
|
+
const indexStats = await fs.stat(publicIndexPath);
|
|
7
|
+
return indexStats.isFile() || indexStats.isSymbolicLink();
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/dev/static/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,SAAiB,EAAoB,EAAE;IACnF,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClD,OAAO,UAAU,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC"}
|