@atria/server 0.0.10 → 0.0.13

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 (124) hide show
  1. package/README.md +26 -10
  2. package/dist/auth/cookies.d.ts +11 -0
  3. package/dist/auth/cookies.js +38 -0
  4. package/dist/auth/cookies.js.map +1 -0
  5. package/dist/auth/hash.d.ts +2 -0
  6. package/dist/auth/hash.js +36 -0
  7. package/dist/auth/hash.js.map +1 -0
  8. package/dist/auth/oauth.d.ts +5 -0
  9. package/dist/auth/oauth.js +215 -0
  10. package/dist/auth/oauth.js.map +1 -0
  11. package/dist/auth/runtime.d.ts +28 -0
  12. package/dist/auth/runtime.js +539 -0
  13. package/dist/auth/runtime.js.map +1 -0
  14. package/dist/auth/store.d.ts +43 -0
  15. package/dist/auth/store.js +68 -0
  16. package/dist/auth/store.js.map +1 -0
  17. package/dist/auth/types.d.ts +40 -0
  18. package/dist/auth/types.js +2 -0
  19. package/dist/auth/types.js.map +1 -0
  20. package/dist/auth/validation.d.ts +21 -0
  21. package/dist/auth/validation.js +97 -0
  22. package/dist/auth/validation.js.map +1 -0
  23. package/dist/dev/admin/assets.d.ts +2 -0
  24. package/dist/dev/admin/assets.js +30 -0
  25. package/dist/dev/admin/assets.js.map +1 -0
  26. package/dist/dev/admin/i18n.d.ts +2 -0
  27. package/dist/dev/admin/i18n.js +63 -0
  28. package/dist/dev/admin/i18n.js.map +1 -0
  29. package/dist/dev/admin/index.d.ts +3 -0
  30. package/dist/dev/admin/index.js +4 -0
  31. package/dist/dev/admin/index.js.map +1 -0
  32. package/dist/dev/admin/request.d.ts +14 -0
  33. package/dist/dev/admin/request.js +77 -0
  34. package/dist/dev/admin/request.js.map +1 -0
  35. package/dist/dev/admin/routing.d.ts +5 -0
  36. package/dist/dev/admin/routing.js +31 -0
  37. package/dist/dev/admin/routing.js.map +1 -0
  38. package/dist/dev/admin-assets.d.ts +2 -0
  39. package/dist/dev/admin-assets.js +30 -0
  40. package/dist/dev/admin-assets.js.map +1 -0
  41. package/dist/dev/admin.d.ts +2 -0
  42. package/dist/dev/admin.js +30 -0
  43. package/dist/dev/admin.js.map +1 -0
  44. package/dist/dev/constants.d.ts +12 -0
  45. package/dist/dev/constants.js +23 -0
  46. package/dist/dev/constants.js.map +1 -0
  47. package/dist/dev/health/index.d.ts +2 -0
  48. package/dist/dev/health/index.js +3 -0
  49. package/dist/dev/health/index.js.map +1 -0
  50. package/dist/dev/health/request.d.ts +14 -0
  51. package/dist/dev/health/request.js +22 -0
  52. package/dist/dev/health/request.js.map +1 -0
  53. package/dist/dev/health/state.d.ts +9 -0
  54. package/dist/dev/health/state.js +52 -0
  55. package/dist/dev/health/state.js.map +1 -0
  56. package/dist/dev/health.d.ts +9 -0
  57. package/dist/dev/health.js +52 -0
  58. package/dist/dev/health.js.map +1 -0
  59. package/dist/dev/http/errors.d.ts +3 -0
  60. package/dist/dev/http/errors.js +10 -0
  61. package/dist/dev/http/errors.js.map +1 -0
  62. package/dist/dev/http/routing.d.ts +3 -0
  63. package/dist/dev/http/routing.js +26 -0
  64. package/dist/dev/http/routing.js.map +1 -0
  65. package/dist/dev/i18n.d.ts +2 -0
  66. package/dist/dev/i18n.js +63 -0
  67. package/dist/dev/i18n.js.map +1 -0
  68. package/dist/dev/lifecycle.d.ts +2 -0
  69. package/dist/dev/lifecycle.js +10 -0
  70. package/dist/dev/lifecycle.js.map +1 -0
  71. package/dist/dev/public/index.d.ts +1 -0
  72. package/dist/dev/public/index.js +2 -0
  73. package/dist/dev/public/index.js.map +1 -0
  74. package/dist/dev/public/request.d.ts +9 -0
  75. package/dist/dev/public/request.js +29 -0
  76. package/dist/dev/public/request.js.map +1 -0
  77. package/dist/dev/public/responses.d.ts +3 -0
  78. package/dist/dev/public/responses.js +25 -0
  79. package/dist/dev/public/responses.js.map +1 -0
  80. package/dist/dev/public/routing.d.ts +1 -0
  81. package/dist/dev/public/routing.js +5 -0
  82. package/dist/dev/public/routing.js.map +1 -0
  83. package/dist/dev/responses.d.ts +2 -0
  84. package/dist/dev/responses.js +3 -0
  85. package/dist/dev/responses.js.map +1 -0
  86. package/dist/dev/routing.d.ts +3 -0
  87. package/dist/dev/routing.js +4 -0
  88. package/dist/dev/routing.js.map +1 -0
  89. package/dist/dev/setup/index.d.ts +2 -0
  90. package/dist/dev/setup/index.js +2 -0
  91. package/dist/dev/setup/index.js.map +1 -0
  92. package/dist/dev/setup/request.d.ts +5 -0
  93. package/dist/dev/setup/request.js +20 -0
  94. package/dist/dev/setup/request.js.map +1 -0
  95. package/dist/dev/setup/types.d.ts +5 -0
  96. package/dist/dev/setup/types.js +2 -0
  97. package/dist/dev/setup/types.js.map +1 -0
  98. package/dist/dev/static/files.d.ts +6 -0
  99. package/dist/dev/static/files.js +74 -0
  100. package/dist/dev/static/files.js.map +1 -0
  101. package/dist/dev/static/index.d.ts +4 -0
  102. package/dist/dev/static/index.js +5 -0
  103. package/dist/dev/static/index.js.map +1 -0
  104. package/dist/dev/static/paths.d.ts +1 -0
  105. package/dist/dev/static/paths.js +6 -0
  106. package/dist/dev/static/paths.js.map +1 -0
  107. package/dist/dev/static/publish.d.ts +1 -0
  108. package/dist/dev/static/publish.js +13 -0
  109. package/dist/dev/static/publish.js.map +1 -0
  110. package/dist/dev/static/resolver.d.ts +2 -0
  111. package/dist/dev/static/resolver.js +53 -0
  112. package/dist/dev/static/resolver.js.map +1 -0
  113. package/dist/dev/static/sender.d.ts +2 -0
  114. package/dist/dev/static/sender.js +26 -0
  115. package/dist/dev/static/sender.js.map +1 -0
  116. package/dist/dev/static-files.d.ts +6 -0
  117. package/dist/dev/static-files.js +74 -0
  118. package/dist/dev/static-files.js.map +1 -0
  119. package/dist/dev/types.d.ts +10 -0
  120. package/dist/dev/types.js +2 -0
  121. package/dist/dev/types.js.map +1 -0
  122. package/dist/server.js +74 -191
  123. package/dist/server.js.map +1 -1
  124. package/package.json +4 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/dev/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAC3C,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAElD,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AACnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEjD,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,yBAAyB;IACjC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,2BAA2B;IACnC,MAAM,EAAE,iCAAiC;CAC1C,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,wCAAwC,CAAC;AAC/E,MAAM,CAAC,MAAM,+BAA+B,GAAG,+CAA+C,CAAC;AAC/F,MAAM,CAAC,MAAM,kCAAkC,GAAG,6BAA6B,CAAC;AAChF,8FAA8F;AAC9F,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAEnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { handleHealthRequest, isHealthRequest } from "./request.js";
2
+ export { readDatabaseHealthState, type DatabaseHealthState } from "./state.js";
@@ -0,0 +1,3 @@
1
+ export { handleHealthRequest, isHealthRequest } from "./request.js";
2
+ export { readDatabaseHealthState } from "./state.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dev/health/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAA4B,MAAM,YAAY,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ServerResponse } from "node:http";
2
+ import type { SiteTarget } from "../types.js";
3
+ import type { OwnerSetupState } from "../setup/types.js";
4
+ import type { DatabaseHealthState } from "./state.js";
5
+ interface HandleHealthRequestOptions {
6
+ response: ServerResponse;
7
+ siteTarget: SiteTarget;
8
+ publicOutputPublished: boolean;
9
+ ownerSetupState: OwnerSetupState;
10
+ databaseHealthState: DatabaseHealthState;
11
+ }
12
+ export declare const isHealthRequest: (requestUrl: URL) => boolean;
13
+ export declare const handleHealthRequest: (options: HandleHealthRequestOptions) => void;
14
+ export {};
@@ -0,0 +1,22 @@
1
+ import { MIME_TYPES } from "../constants.js";
2
+ const HEALTH_PATH = "/api/health";
3
+ export const isHealthRequest = (requestUrl) => requestUrl.pathname === HEALTH_PATH;
4
+ export const handleHealthRequest = (options) => {
5
+ const { response, siteTarget, publicOutputPublished, ownerSetupState, databaseHealthState } = options;
6
+ response.writeHead(200, { "content-type": MIME_TYPES[".json"] });
7
+ response.end(JSON.stringify({
8
+ ok: databaseHealthState.reachable,
9
+ status: databaseHealthState.reachable ? "operational" : "degraded",
10
+ site: siteTarget,
11
+ publicOutputPublished,
12
+ ownerSetupPending: ownerSetupState.pending,
13
+ database: {
14
+ driver: databaseHealthState.driver,
15
+ source: databaseHealthState.source,
16
+ usesFallback: databaseHealthState.usesFallback,
17
+ reachable: databaseHealthState.reachable,
18
+ error: databaseHealthState.error
19
+ }
20
+ }));
21
+ };
22
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/dev/health/request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7C,MAAM,WAAW,GAAG,aAAa,CAAC;AAUlC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAe,EAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,WAAW,CAAC;AAEjG,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAmC,EAAQ,EAAE;IAC/E,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,qBAAqB,EAAE,eAAe,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC;IAEtG,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,EAAE,EAAE,mBAAmB,CAAC,SAAS;QACjC,MAAM,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU;QAClE,IAAI,EAAE,UAAU;QAChB,qBAAqB;QACrB,iBAAiB,EAAE,eAAe,CAAC,OAAO;QAC1C,QAAQ,EAAE;YACR,MAAM,EAAE,mBAAmB,CAAC,MAAM;YAClC,MAAM,EAAE,mBAAmB,CAAC,MAAM;YAClC,YAAY,EAAE,mBAAmB,CAAC,YAAY;YAC9C,SAAS,EAAE,mBAAmB,CAAC,SAAS;YACxC,KAAK,EAAE,mBAAmB,CAAC,KAAK;SACjC;KACF,CAAC,CACH,CAAC;AACJ,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=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,3 @@
1
+ import type { ServerResponse } from "node:http";
2
+ export declare const respondWithDefaultNotFound: (response: ServerResponse) => void;
3
+ export declare const respondWithInternalServerError: (response: ServerResponse) => void;
@@ -0,0 +1,10 @@
1
+ import { DEFAULT_INTERNAL_SERVER_ERROR_TEXT, 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
+ export const respondWithInternalServerError = (response) => {
7
+ response.writeHead(500, { "content-type": MIME_TYPES[".txt"] });
8
+ response.end(DEFAULT_INTERNAL_SERVER_ERROR_TEXT);
9
+ };
10
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/dev/http/errors.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,UAAU,EACX,MAAM,iBAAiB,CAAC;AAEzB,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;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,QAAwB,EAAQ,EAAE;IAC/E,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;AACnD,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SiteTarget } from "../types.js";
2
+ export declare const parseRequestHostname: (hostHeader: string | undefined) => string | null;
3
+ export declare const resolveSiteTarget: (hostname: string | null) => SiteTarget | null;
@@ -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"}
@@ -0,0 +1,2 @@
1
+ import type { ServerResponse } from "node:http";
2
+ export declare const handleI18nRequest: (requestUrl: URL, response: ServerResponse, adminDistDir: string) => Promise<boolean>;
@@ -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,2 @@
1
+ import type { Server } from "node:http";
2
+ export declare const closeServer: (server: Server) => Promise<void>;
@@ -0,0 +1,10 @@
1
+ export const closeServer = async (server) => new Promise((resolve, reject) => {
2
+ server.close((error) => {
3
+ if (error) {
4
+ reject(error);
5
+ return;
6
+ }
7
+ resolve();
8
+ });
9
+ });
10
+ //# sourceMappingURL=lifecycle.js.map
@@ -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,2 @@
1
+ export { handlePublicRequest } from "./request.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ import type { ServerResponse } from "node:http";
2
+ export declare const respondWithPublicNotFound: (response: ServerResponse, publicDir: string) => Promise<void>;
3
+ export declare const respondWithPublicUnavailable: (response: ServerResponse) => void;
@@ -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,5 @@
1
+ export const isRootPublicPath = (requestPath) => {
2
+ const normalizedPath = requestPath.replace(/\/+$/, "");
3
+ return normalizedPath.length === 0 || normalizedPath === "/index.html";
4
+ };
5
+ //# sourceMappingURL=routing.js.map
@@ -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,2 @@
1
+ export { respondWithDefaultNotFound } from "./http/errors.js";
2
+ export { respondWithPublicNotFound, respondWithPublicUnavailable } from "./public/responses.js";
@@ -0,0 +1,3 @@
1
+ export { respondWithDefaultNotFound } from "./http/errors.js";
2
+ export { respondWithPublicNotFound, respondWithPublicUnavailable } from "./public/responses.js";
3
+ //# sourceMappingURL=responses.js.map
@@ -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,3 @@
1
+ export { buildAuthLocation, shouldRedirectAdminToAuth } from "./admin/routing.js";
2
+ export { isRootPublicPath } from "./public/routing.js";
3
+ export { parseRequestHostname, resolveSiteTarget } from "./http/routing.js";
@@ -0,0 +1,4 @@
1
+ export { buildAuthLocation, shouldRedirectAdminToAuth } from "./admin/routing.js";
2
+ export { isRootPublicPath } from "./public/routing.js";
3
+ export { parseRequestHostname, resolveSiteTarget } from "./http/routing.js";
4
+ //# sourceMappingURL=routing.js.map
@@ -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,2 @@
1
+ export { handleSetupStatusRequest, isSetupStatusRequest } from "./request.js";
2
+ export type { OwnerSetupState } from "./types.js";
@@ -0,0 +1,2 @@
1
+ export { handleSetupStatusRequest, isSetupStatusRequest } from "./request.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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,5 @@
1
+ import type { AuthMethod } from "@atria/shared";
2
+ export interface OwnerSetupState {
3
+ pending: boolean;
4
+ preferredAuthMethod: AuthMethod | null;
5
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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>;