@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.
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 +528 -0
  13. package/dist/auth/runtime.js.map +1 -0
  14. package/dist/auth/store.d.ts +33 -0
  15. package/dist/auth/store.js +49 -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 +11 -0
  45. package/dist/dev/constants.js +22 -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 +2 -0
  60. package/dist/dev/http/errors.js +6 -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 +11 -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 +65 -190
  123. package/dist/server.js.map +1 -1
  124. 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,2 @@
1
+ import type { ServerResponse } from "node:http";
2
+ export declare const respondWithDefaultNotFound: (response: ServerResponse) => void;
@@ -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,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":"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"}
@@ -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>;
@@ -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":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,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;AAEF,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;AAEF,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAe,EAAiC,EAAE;IACpF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,OAAe,EACf,WAAmB,EACnB,IAAwB,EACO,EAAE;IACjC,MAAM,cAAc,GAAG,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAEpD,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7D,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;gBACpD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YAC/B,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,mBAAmB,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC9D,IAAI,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC;oBACjC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;gBACxD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;YAED,OAAO,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QACzF,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACpC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,IAAI,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7D,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,QAAwB,EAAE,QAAgB,EAAiB,EAAE;IAClG,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,0BAA0B,CAAC;IAExE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACzD,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { isInsideDirectory } from "./paths.js";
2
+ export { isPublicOutputPublished } from "./publish.js";
3
+ export { resolveRequestFile } from "./resolver.js";
4
+ export { sendFileResponse } from "./sender.js";
@@ -0,0 +1,5 @@
1
+ export { isInsideDirectory } from "./paths.js";
2
+ export { isPublicOutputPublished } from "./publish.js";
3
+ export { resolveRequestFile } from "./resolver.js";
4
+ export { sendFileResponse } from "./sender.js";
5
+ //# sourceMappingURL=index.js.map
@@ -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"}