@demiurgejs/core 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +75 -2
  3. package/dist/adapter/index.d.ts +20 -0
  4. package/dist/adapter/index.d.ts.map +1 -0
  5. package/dist/browser/file-router.d.ts +30 -0
  6. package/dist/browser/file-router.d.ts.map +1 -0
  7. package/dist/browser/index.d.ts +3 -0
  8. package/dist/browser/index.d.ts.map +1 -0
  9. package/dist/chunks/index-BnX9Qxbm.js +44 -0
  10. package/dist/chunks/index-BnX9Qxbm.js.map +1 -0
  11. package/dist/chunks/ssr-O3d7Q73U.js +273 -0
  12. package/dist/chunks/ssr-O3d7Q73U.js.map +1 -0
  13. package/dist/chunks/streaming-27pwhjGC.js +343 -0
  14. package/dist/chunks/streaming-27pwhjGC.js.map +1 -0
  15. package/dist/chunks/testing-BBnJ5WUR.js +2871 -0
  16. package/dist/chunks/testing-BBnJ5WUR.js.map +1 -0
  17. package/dist/data/cache.d.ts +95 -0
  18. package/dist/data/cache.d.ts.map +1 -0
  19. package/dist/data/idempotency.d.ts +24 -0
  20. package/dist/data/idempotency.d.ts.map +1 -0
  21. package/dist/data/index.d.ts +5 -0
  22. package/dist/data/index.d.ts.map +1 -0
  23. package/dist/data/testing.d.ts +7 -0
  24. package/dist/data/testing.d.ts.map +1 -0
  25. package/dist/data/testing.js +134 -0
  26. package/dist/data/testing.js.map +1 -0
  27. package/dist/document/hydration.d.ts +13 -0
  28. package/dist/document/hydration.d.ts.map +1 -0
  29. package/dist/document/index.d.ts +13 -0
  30. package/dist/document/index.d.ts.map +1 -0
  31. package/dist/document/links.d.ts +17 -0
  32. package/dist/document/links.d.ts.map +1 -0
  33. package/dist/document/metadata.d.ts +62 -0
  34. package/dist/document/metadata.d.ts.map +1 -0
  35. package/dist/document/render.d.ts +28 -0
  36. package/dist/document/render.d.ts.map +1 -0
  37. package/dist/document/scripts.d.ts +24 -0
  38. package/dist/document/scripts.d.ts.map +1 -0
  39. package/dist/document/seo.d.ts +42 -0
  40. package/dist/document/seo.d.ts.map +1 -0
  41. package/dist/index.d.ts +23 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +1318 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/internal/testing.d.ts +3 -0
  46. package/dist/internal/testing.d.ts.map +1 -0
  47. package/dist/internal/testing.js +22 -0
  48. package/dist/internal/testing.js.map +1 -0
  49. package/dist/node/http.d.ts +28 -0
  50. package/dist/node/http.d.ts.map +1 -0
  51. package/dist/node/index.d.ts +45 -0
  52. package/dist/node/index.d.ts.map +1 -0
  53. package/dist/node/index.js +385 -0
  54. package/dist/node/index.js.map +1 -0
  55. package/dist/node/static.d.ts +9 -0
  56. package/dist/node/static.d.ts.map +1 -0
  57. package/dist/node/streaming.d.ts +5 -0
  58. package/dist/node/streaming.d.ts.map +1 -0
  59. package/dist/package-name.d.ts +2 -0
  60. package/dist/package-name.d.ts.map +1 -0
  61. package/dist/platform/analytics.d.ts +20 -0
  62. package/dist/platform/analytics.d.ts.map +1 -0
  63. package/dist/platform/fonts.d.ts +35 -0
  64. package/dist/platform/fonts.d.ts.map +1 -0
  65. package/dist/platform/images.d.ts +49 -0
  66. package/dist/platform/images.d.ts.map +1 -0
  67. package/dist/platform/index.d.ts +9 -0
  68. package/dist/platform/index.d.ts.map +1 -0
  69. package/dist/platform/observability.d.ts +60 -0
  70. package/dist/platform/observability.d.ts.map +1 -0
  71. package/dist/route/action.d.ts +33 -0
  72. package/dist/route/action.d.ts.map +1 -0
  73. package/dist/route/http-error.d.ts +24 -0
  74. package/dist/route/http-error.d.ts.map +1 -0
  75. package/dist/route/index.d.ts +10 -0
  76. package/dist/route/index.d.ts.map +1 -0
  77. package/dist/route/page.d.ts +5 -0
  78. package/dist/route/page.d.ts.map +1 -0
  79. package/dist/route/response.d.ts +100 -0
  80. package/dist/route/response.d.ts.map +1 -0
  81. package/dist/route/types.d.ts +186 -0
  82. package/dist/route/types.d.ts.map +1 -0
  83. package/dist/route/webhook.d.ts +25 -0
  84. package/dist/route/webhook.d.ts.map +1 -0
  85. package/dist/router/index.d.ts +5 -0
  86. package/dist/router/index.d.ts.map +1 -0
  87. package/dist/router/manifest.d.ts +117 -0
  88. package/dist/router/manifest.d.ts.map +1 -0
  89. package/dist/router/navigation-data.d.ts +9 -0
  90. package/dist/router/navigation-data.d.ts.map +1 -0
  91. package/dist/routing/generate.d.ts +14 -0
  92. package/dist/routing/generate.d.ts.map +1 -0
  93. package/dist/routing/index.d.ts +3 -0
  94. package/dist/routing/index.d.ts.map +1 -0
  95. package/dist/routing/types.d.ts +38 -0
  96. package/dist/routing/types.d.ts.map +1 -0
  97. package/dist/security/audit.d.ts +16 -0
  98. package/dist/security/audit.d.ts.map +1 -0
  99. package/dist/security/cors.d.ts +7 -0
  100. package/dist/security/cors.d.ts.map +1 -0
  101. package/dist/security/csrf.d.ts +15 -0
  102. package/dist/security/csrf.d.ts.map +1 -0
  103. package/dist/security/env.d.ts +69 -0
  104. package/dist/security/env.d.ts.map +1 -0
  105. package/dist/security/index.d.ts +17 -0
  106. package/dist/security/index.d.ts.map +1 -0
  107. package/dist/security/policy.d.ts +18 -0
  108. package/dist/security/policy.d.ts.map +1 -0
  109. package/dist/security/rate-limit.d.ts +6 -0
  110. package/dist/security/rate-limit.d.ts.map +1 -0
  111. package/dist/security/report.d.ts +13 -0
  112. package/dist/security/report.d.ts.map +1 -0
  113. package/dist/security/request.d.ts +11 -0
  114. package/dist/security/request.d.ts.map +1 -0
  115. package/dist/security/types.d.ts +137 -0
  116. package/dist/security/types.d.ts.map +1 -0
  117. package/dist/security/upload.d.ts +23 -0
  118. package/dist/security/upload.d.ts.map +1 -0
  119. package/dist/security/websocket.d.ts +13 -0
  120. package/dist/security/websocket.d.ts.map +1 -0
  121. package/dist/server/errors.d.ts +13 -0
  122. package/dist/server/errors.d.ts.map +1 -0
  123. package/dist/server/failure-site.d.ts +2 -0
  124. package/dist/server/failure-site.d.ts.map +1 -0
  125. package/dist/server/fallbacks.d.ts +10 -0
  126. package/dist/server/fallbacks.d.ts.map +1 -0
  127. package/dist/server/index.d.ts +14 -0
  128. package/dist/server/index.d.ts.map +1 -0
  129. package/dist/server/negotiate.d.ts +3 -0
  130. package/dist/server/negotiate.d.ts.map +1 -0
  131. package/dist/server/not-found.d.ts +11 -0
  132. package/dist/server/not-found.d.ts.map +1 -0
  133. package/dist/server/problem.d.ts +18 -0
  134. package/dist/server/problem.d.ts.map +1 -0
  135. package/dist/server/render-tree.d.ts +4 -0
  136. package/dist/server/render-tree.d.ts.map +1 -0
  137. package/dist/server/request-handler.d.ts +40 -0
  138. package/dist/server/request-handler.d.ts.map +1 -0
  139. package/dist/server/request-metadata.d.ts +7 -0
  140. package/dist/server/request-metadata.d.ts.map +1 -0
  141. package/dist/server/ssr.d.ts +17 -0
  142. package/dist/server/ssr.d.ts.map +1 -0
  143. package/dist/static/index.d.ts +23 -0
  144. package/dist/static/index.d.ts.map +1 -0
  145. package/dist/static/index.js +256 -0
  146. package/dist/static/index.js.map +1 -0
  147. package/dist/vite/index.d.ts +4 -0
  148. package/dist/vite/index.d.ts.map +1 -0
  149. package/dist/vite/index.js +580 -0
  150. package/dist/vite/index.js.map +1 -0
  151. package/dist/vite/plugin.d.ts +37 -0
  152. package/dist/vite/plugin.d.ts.map +1 -0
  153. package/package.json +90 -4
@@ -0,0 +1,385 @@
1
+ import { createServer as I } from "node:http";
2
+ import { d as M } from "../chunks/index-BnX9Qxbm.js";
3
+ import { v as O, t as k, U as A, w as C, a as j, b as P } from "../chunks/streaming-27pwhjGC.js";
4
+ import { r as Te, c as ve, d as Ie } from "../chunks/streaming-27pwhjGC.js";
5
+ import { constants as R } from "node:fs";
6
+ import { realpath as E, open as $, lstat as H } from "node:fs/promises";
7
+ import { resolve as T, sep as w, extname as W, relative as F, join as L } from "node:path";
8
+ import { Readable as N } from "node:stream";
9
+ const D = {
10
+ ".avif": "image/avif",
11
+ ".css": "text/css; charset=utf-8",
12
+ ".gif": "image/gif",
13
+ ".html": "text/html; charset=utf-8",
14
+ ".ico": "image/x-icon",
15
+ ".jpeg": "image/jpeg",
16
+ ".jpg": "image/jpeg",
17
+ ".js": "text/javascript; charset=utf-8",
18
+ ".json": "application/json; charset=utf-8",
19
+ ".mjs": "text/javascript; charset=utf-8",
20
+ ".png": "image/png",
21
+ ".svg": "image/svg+xml",
22
+ ".txt": "text/plain; charset=utf-8",
23
+ ".webmanifest": "application/manifest+json",
24
+ ".webp": "image/webp",
25
+ ".woff": "font/woff",
26
+ ".woff2": "font/woff2"
27
+ }, U = /-[A-Za-z0-9_-]{8,}\.[A-Za-z0-9]+$/, _ = /* @__PURE__ */ new Set(["demiurge-manifest.json", "index.html"]);
28
+ function z(e) {
29
+ const t = T(e.root), n = E(t), r = X(e.prefix), o = e.exclude ?? te, i = e.immutable ?? ee;
30
+ return async function(s) {
31
+ if (s.method !== "GET" && s.method !== "HEAD")
32
+ return null;
33
+ const m = B(
34
+ t,
35
+ r,
36
+ new URL(s.url).pathname
37
+ );
38
+ if (!m || o(ne(t, m)))
39
+ return null;
40
+ const g = await J(t, await Y(n), m);
41
+ if (!g)
42
+ return null;
43
+ const { file: h, stats: a } = g, l = G(a.size, a.mtimeMs), f = a.mtime.toUTCString(), c = new Headers({
44
+ "accept-ranges": "bytes",
45
+ "cache-control": i(re(m)) ? "public, max-age=31536000, immutable" : "public, max-age=0, must-revalidate",
46
+ "content-length": String(a.size),
47
+ "content-type": oe(m),
48
+ "cross-origin-resource-policy": "same-origin",
49
+ etag: l,
50
+ "last-modified": f,
51
+ "x-content-type-options": "nosniff"
52
+ });
53
+ if (q(s, l, a.mtimeMs))
54
+ return await h.close(), c.delete("content-length"), c.delete("content-type"), new Response(null, { headers: c, status: 304 });
55
+ const d = Z(s, a.mtimeMs) ? V(s.headers.get("range"), a.size) : null;
56
+ if (d === "unsatisfiable")
57
+ return await h.close(), c.delete("content-length"), c.delete("content-type"), c.set("content-range", `bytes */${a.size}`), new Response(null, { headers: c, status: 416 });
58
+ if (d) {
59
+ const p = d.end - d.start + 1;
60
+ return c.set("content-length", String(p)), c.set("content-range", `bytes ${d.start}-${d.end}/${a.size}`), s.method === "HEAD" ? (await h.close(), new Response(null, { headers: c, status: 206 })) : new Response(
61
+ N.toWeb(
62
+ h.createReadStream({ end: d.end, start: d.start })
63
+ ),
64
+ { headers: c, status: 206 }
65
+ );
66
+ }
67
+ return s.method === "HEAD" ? (await h.close(), new Response(null, { headers: c })) : new Response(
68
+ N.toWeb(h.createReadStream()),
69
+ { headers: c }
70
+ );
71
+ };
72
+ }
73
+ function G(e, t) {
74
+ return `W/"${e.toString(16)}-${Math.trunc(t).toString(16)}"`;
75
+ }
76
+ function q(e, t, n) {
77
+ const r = e.headers.get("if-none-match");
78
+ if (r !== null)
79
+ return r.trim() === "*" || r.split(",").some(
80
+ (u) => x(u) === x(t)
81
+ );
82
+ const o = e.headers.get("if-modified-since");
83
+ if (o === null)
84
+ return !1;
85
+ const i = Date.parse(o);
86
+ return Number.isFinite(i) && Math.floor(n / 1e3) * 1e3 <= i;
87
+ }
88
+ function x(e) {
89
+ return e.trim().replace(/^W\//i, "");
90
+ }
91
+ function V(e, t) {
92
+ if (e === null)
93
+ return null;
94
+ const n = /^bytes=(\d*)-(\d*)$/.exec(e.trim());
95
+ if (!n || !n[1] && !n[2])
96
+ return null;
97
+ if (t === 0)
98
+ return "unsatisfiable";
99
+ if (!n[1]) {
100
+ const i = Number(n[2]);
101
+ return !Number.isSafeInteger(i) || i <= 0 ? null : { start: Math.max(0, t - i), end: t - 1 };
102
+ }
103
+ const r = Number(n[1]), o = n[2] ? Number(n[2]) : t - 1;
104
+ return !Number.isSafeInteger(r) || !Number.isSafeInteger(o) ? null : r >= t ? "unsatisfiable" : n[2] && o < r ? null : { start: r, end: Math.min(o, t - 1) };
105
+ }
106
+ function Z(e, t) {
107
+ const n = e.headers.get("if-range");
108
+ if (n === null)
109
+ return !0;
110
+ if (n.trim().startsWith('"') || /^W\//i.test(n.trim()))
111
+ return !1;
112
+ const r = Date.parse(n);
113
+ return Number.isFinite(r) && Math.floor(t / 1e3) * 1e3 <= r;
114
+ }
115
+ function B(e, t, n) {
116
+ let r;
117
+ try {
118
+ r = decodeURIComponent(n);
119
+ } catch {
120
+ return null;
121
+ }
122
+ if (r.includes("\0"))
123
+ return null;
124
+ if (t) {
125
+ if (!r.startsWith(t))
126
+ return null;
127
+ r = r.slice(t.length - 1);
128
+ }
129
+ if (r.endsWith("/"))
130
+ return null;
131
+ const o = T(e, `.${r}`);
132
+ return o.startsWith(`${e}${w}`) ? o : null;
133
+ }
134
+ async function Y(e) {
135
+ try {
136
+ return await e;
137
+ } catch {
138
+ return null;
139
+ }
140
+ }
141
+ async function J(e, t, n) {
142
+ if (!t || !await K(e, n))
143
+ return null;
144
+ let r;
145
+ try {
146
+ r = await E(n);
147
+ } catch {
148
+ return null;
149
+ }
150
+ if (!Q(t, r))
151
+ return null;
152
+ const o = typeof R.O_NOFOLLOW == "number" ? R.O_NOFOLLOW : 0;
153
+ let i;
154
+ try {
155
+ i = await $(n, R.O_RDONLY | o);
156
+ } catch {
157
+ return null;
158
+ }
159
+ try {
160
+ const u = await i.stat();
161
+ return u.isFile() ? { file: i, stats: u } : (await i.close(), null);
162
+ } catch {
163
+ return await i.close(), null;
164
+ }
165
+ }
166
+ async function K(e, t) {
167
+ const n = F(e, t).split(w);
168
+ let r = e;
169
+ try {
170
+ for (const o of n)
171
+ if (r = L(r, o), (await H(r)).isSymbolicLink())
172
+ return !1;
173
+ } catch {
174
+ return !1;
175
+ }
176
+ return !0;
177
+ }
178
+ function Q(e, t) {
179
+ return t.startsWith(`${e}${w}`);
180
+ }
181
+ function X(e) {
182
+ return !e || e === "/" ? "" : `/${e.replace(/^\/|\/$/g, "")}/`;
183
+ }
184
+ function ee(e) {
185
+ return U.test(e);
186
+ }
187
+ function te(e) {
188
+ return _.has(e);
189
+ }
190
+ function ne(e, t) {
191
+ return t.slice(e.length + 1).split(w).join("/");
192
+ }
193
+ function re(e) {
194
+ return e.slice(e.lastIndexOf(w) + 1);
195
+ }
196
+ function oe(e) {
197
+ return D[W(e).toLowerCase()] ?? "application/octet-stream";
198
+ }
199
+ const Re = M({
200
+ name: "node",
201
+ capabilities: {
202
+ backgroundLifetime: !0,
203
+ crossOriginIsolationHeaders: !0,
204
+ nonceInjection: !0,
205
+ streaming: !0
206
+ }
207
+ }), ie = {
208
+ headersTimeout: 66e3,
209
+ keepAliveTimeout: 65e3,
210
+ requestTimeout: 3e5
211
+ }, ae = 3e4;
212
+ function se(e) {
213
+ O(e);
214
+ const t = de(e.static), n = e.onError ?? b;
215
+ return function(i, u) {
216
+ const s = ce(i, u);
217
+ r(i, u, s.signal).catch((m) => {
218
+ s.signal.aborted || (n(m, i), me(u));
219
+ }).finally(s.cleanup);
220
+ };
221
+ async function r(o, i, u) {
222
+ let s;
223
+ try {
224
+ s = k(o, {
225
+ allowedHosts: e.allowedHosts,
226
+ signal: u,
227
+ trustProxy: e.trustProxy
228
+ });
229
+ } catch (g) {
230
+ if (g instanceof A) {
231
+ C(i);
232
+ return;
233
+ }
234
+ if (g instanceof j) {
235
+ le(i);
236
+ return;
237
+ }
238
+ throw g;
239
+ }
240
+ const m = await t?.(s);
241
+ await P(
242
+ i,
243
+ m ?? await e.handler(s)
244
+ );
245
+ }
246
+ }
247
+ function ce(e, t) {
248
+ const n = new AbortController(), r = () => {
249
+ n.signal.aborted || n.abort(new DOMException("Client disconnected.", "AbortError"));
250
+ }, o = () => {
251
+ t.writableFinished || r();
252
+ };
253
+ return e.once("aborted", r), t.once("close", o), {
254
+ cleanup() {
255
+ e.off("aborted", r), t.off("close", o);
256
+ },
257
+ signal: n.signal
258
+ };
259
+ }
260
+ function le(e) {
261
+ e.statusCode = 421, e.setHeader("content-type", "text/plain; charset=utf-8"), e.end("Misdirected Request");
262
+ }
263
+ function Ne(e) {
264
+ const t = ue(e.timeouts), n = I(se(e));
265
+ return n.keepAliveTimeout = t.keepAliveTimeout, n.headersTimeout = t.headersTimeout, n.requestTimeout = t.requestTimeout, fe(n, e.shutdown);
266
+ }
267
+ function ue(e) {
268
+ const t = {
269
+ ...ie,
270
+ ...e
271
+ };
272
+ for (const [n, r] of Object.entries(t))
273
+ if (!Number.isSafeInteger(r) || r <= 0)
274
+ throw new Error(
275
+ `Demiurge Node ${n} must be a positive integer in milliseconds.`
276
+ );
277
+ if (t.headersTimeout <= t.keepAliveTimeout)
278
+ throw new Error(
279
+ "Demiurge Node headersTimeout must be greater than keepAliveTimeout."
280
+ );
281
+ return t;
282
+ }
283
+ function fe(e, t) {
284
+ const n = t?.gracePeriod ?? ae;
285
+ if (!Number.isSafeInteger(n) || n < 0)
286
+ throw new Error(
287
+ "Demiurge Node shutdown gracePeriod must be a non-negative integer in milliseconds."
288
+ );
289
+ let r = !1, o, i;
290
+ const u = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Set();
291
+ e.on("connection", (a) => {
292
+ s.set(a, 0), a.once("close", () => s.delete(a));
293
+ }), e.on("request", (a, l) => {
294
+ const f = l.socket;
295
+ if (!f)
296
+ return;
297
+ s.set(f, (s.get(f) ?? 0) + 1);
298
+ let c = !1;
299
+ const d = () => {
300
+ if (c)
301
+ return;
302
+ c = !0;
303
+ const p = Math.max(0, (s.get(f) ?? 1) - 1);
304
+ s.set(f, p), r && p === 0 && f.destroy();
305
+ };
306
+ l.once("finish", d), l.once("close", d);
307
+ }), e.isReady = () => e.listening && !r, e.waitUntil = (a) => {
308
+ const l = Promise.resolve(a).catch((f) => {
309
+ try {
310
+ (t?.onBackgroundError ?? b)(f);
311
+ } catch (c) {
312
+ b(c);
313
+ }
314
+ }).then(() => {
315
+ }).finally(() => {
316
+ m.delete(l), i?.();
317
+ });
318
+ m.add(l);
319
+ }, e.shutdown = () => o || (r = !0, t?.onStateChange?.("draining"), o = new Promise((a, l) => {
320
+ let f, c = !1, d = !1, p = !1;
321
+ const v = setTimeout(() => {
322
+ c = !0, e.closeAllConnections(), y();
323
+ }, n);
324
+ e.close((S) => {
325
+ S && S.code !== "ERR_SERVER_NOT_RUNNING" && (f = S), d = !0, y();
326
+ }), e.closeIdleConnections(), h(), setImmediate(() => {
327
+ e.closeIdleConnections(), h();
328
+ }), i = y;
329
+ function y() {
330
+ if (!(p || !d || !c && m.size > 0)) {
331
+ if (p = !0, i = void 0, clearTimeout(v), g(), t?.onStateChange?.("stopped"), f) {
332
+ l(f);
333
+ return;
334
+ }
335
+ a();
336
+ }
337
+ }
338
+ }), o), e.on("listening", () => t?.onStateChange?.("ready"));
339
+ for (const a of new Set(t?.signals ?? [])) {
340
+ const l = () => {
341
+ e.shutdown().catch(b);
342
+ };
343
+ u.set(a, l), process.once(a, l);
344
+ }
345
+ return e.once("close", g), e;
346
+ function g() {
347
+ for (const [a, l] of u)
348
+ process.off(a, l);
349
+ u.clear();
350
+ }
351
+ function h() {
352
+ for (const [a, l] of s)
353
+ l === 0 && a.destroy();
354
+ }
355
+ }
356
+ function de(e) {
357
+ if (e)
358
+ return typeof e == "function" ? e : z(e);
359
+ }
360
+ function b(e) {
361
+ console.error(e);
362
+ }
363
+ function me(e) {
364
+ if (e.headersSent) {
365
+ e.destroy();
366
+ return;
367
+ }
368
+ e.statusCode = 500, e.setHeader("content-type", "text/plain; charset=utf-8"), e.end("Internal Server Error");
369
+ }
370
+ export {
371
+ A as UnsupportedMethodError,
372
+ j as UntrustedHostError,
373
+ se as createNodeRequestListener,
374
+ Ne as createNodeServer,
375
+ z as createStaticFileHandler,
376
+ ie as defaultNodeServerTimeouts,
377
+ Re as nodeAdapter,
378
+ Te as renderNodePageResponse,
379
+ ve as renderStreamingPageResponse,
380
+ Ie as toHeaders,
381
+ k as toWebRequest,
382
+ O as validateNodeOriginPolicy,
383
+ P as writeWebResponse
384
+ };
385
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/node/static.ts","../../src/node/index.ts"],"sourcesContent":["import { constants } from \"node:fs\";\nimport { lstat, open, realpath } from \"node:fs/promises\";\nimport { extname, join, relative, resolve, sep } from \"node:path\";\nimport { Readable } from \"node:stream\";\n\nexport type StaticFileHandler = (request: Request) => Promise<Response | null>;\n\nexport type StaticFileHandlerOptions = {\n // Receives the file's path relative to `root`, always \"/\"-separated, so a\n // predicate can distinguish `index.html` from `docs/index.html`.\n exclude?: (path: string) => boolean;\n immutable?: (fileName: string) => boolean;\n prefix?: string;\n root: string;\n};\n\n// A null result keeps the handler composable. It means that the request does not\n// identify an owned file. The route pipeline owns all other responses, including\n// the 404 body and security headers. A traversal attempt gives the same result.\nconst contentTypes: Record<string, string> = {\n \".avif\": \"image/avif\",\n \".css\": \"text/css; charset=utf-8\",\n \".gif\": \"image/gif\",\n \".html\": \"text/html; charset=utf-8\",\n \".ico\": \"image/x-icon\",\n \".jpeg\": \"image/jpeg\",\n \".jpg\": \"image/jpeg\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".mjs\": \"text/javascript; charset=utf-8\",\n \".png\": \"image/png\",\n \".svg\": \"image/svg+xml\",\n \".txt\": \"text/plain; charset=utf-8\",\n \".webmanifest\": \"application/manifest+json\",\n \".webp\": \"image/webp\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n};\n\nconst hashedFileName = /-[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9]+$/;\n\n// Plain static requests must not access the framework build output. The output\n// includes the SPA shell and the Node configuration manifest. The route pipeline\n// serves the shell and applies the `@policy.ts` headers. The server never serves\n// `demiurge-manifest.json` publicly. This exclusion applies only to the two root\n// files. An application can serve a nested file such as `docs/index.html`.\nconst defaultExcludedPaths = new Set([\"demiurge-manifest.json\", \"index.html\"]);\n\nexport function createStaticFileHandler(\n options: StaticFileHandlerOptions,\n): StaticFileHandler {\n const root = resolve(options.root);\n const realRoot = realpath(root);\n const prefix = normalizePrefix(options.prefix);\n const isExcluded = options.exclude ?? defaultExcluded;\n const isImmutable = options.immutable ?? defaultImmutable;\n\n return async function handleStaticFile(request) {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return null;\n }\n\n const filePath = resolveFilePath(\n root,\n prefix,\n new URL(request.url).pathname,\n );\n\n if (!filePath || isExcluded(toRelativePath(root, filePath))) {\n return null;\n }\n\n const opened = await openStaticFile(root, await safeRealRoot(realRoot), filePath);\n\n if (!opened) {\n return null;\n }\n\n const { file, stats } = opened;\n\n const etag = createWeakEtag(stats.size, stats.mtimeMs);\n const lastModified = stats.mtime.toUTCString();\n const headers = new Headers({\n \"accept-ranges\": \"bytes\",\n \"cache-control\": isImmutable(fileNameOf(filePath))\n ? \"public, max-age=31536000, immutable\"\n : \"public, max-age=0, must-revalidate\",\n \"content-length\": String(stats.size),\n \"content-type\": contentTypeOf(filePath),\n \"cross-origin-resource-policy\": \"same-origin\",\n etag,\n \"last-modified\": lastModified,\n \"x-content-type-options\": \"nosniff\",\n });\n\n if (isNotModified(request, etag, stats.mtimeMs)) {\n await file.close();\n headers.delete(\"content-length\");\n headers.delete(\"content-type\");\n\n return new Response(null, { headers, status: 304 });\n }\n\n const range = canApplyRange(request, stats.mtimeMs)\n ? parseRange(request.headers.get(\"range\"), stats.size)\n : null;\n\n if (range === \"unsatisfiable\") {\n await file.close();\n headers.delete(\"content-length\");\n headers.delete(\"content-type\");\n headers.set(\"content-range\", `bytes */${stats.size}`);\n\n return new Response(null, { headers, status: 416 });\n }\n\n if (range) {\n const contentLength = range.end - range.start + 1;\n headers.set(\"content-length\", String(contentLength));\n headers.set(\"content-range\", `bytes ${range.start}-${range.end}/${stats.size}`);\n\n if (request.method === \"HEAD\") {\n await file.close();\n return new Response(null, { headers, status: 206 });\n }\n\n return new Response(\n Readable.toWeb(\n file.createReadStream({ end: range.end, start: range.start }),\n ) as ReadableStream,\n { headers, status: 206 },\n );\n }\n\n if (request.method === \"HEAD\") {\n await file.close();\n return new Response(null, { headers });\n }\n\n return new Response(\n Readable.toWeb(file.createReadStream()) as ReadableStream,\n { headers },\n );\n };\n}\n\nfunction createWeakEtag(size: number, mtimeMs: number) {\n return `W/\"${size.toString(16)}-${Math.trunc(mtimeMs).toString(16)}\"`;\n}\n\nfunction isNotModified(request: Request, etag: string, mtimeMs: number) {\n const ifNoneMatch = request.headers.get(\"if-none-match\");\n\n // If-None-Match takes precedence over If-Modified-Since. Weak comparison is\n // correct for GET/HEAD cache validation, so W/ is removed from both sides.\n if (ifNoneMatch !== null) {\n return ifNoneMatch.trim() === \"*\" || ifNoneMatch.split(\",\").some(\n (candidate) => weakEtagValue(candidate) === weakEtagValue(etag),\n );\n }\n\n const ifModifiedSince = request.headers.get(\"if-modified-since\");\n\n if (ifModifiedSince === null) {\n return false;\n }\n\n const since = Date.parse(ifModifiedSince);\n\n // HTTP dates have one-second precision. Compare the file timestamp at the\n // same precision rather than making a freshly-written file look newer.\n return Number.isFinite(since) && Math.floor(mtimeMs / 1000) * 1000 <= since;\n}\n\nfunction weakEtagValue(value: string) {\n return value.trim().replace(/^W\\//i, \"\");\n}\n\ntype ByteRange = { end: number; start: number };\n\nfunction parseRange(\n header: string | null,\n size: number,\n): ByteRange | \"unsatisfiable\" | null {\n if (header === null) {\n return null;\n }\n\n const match = /^bytes=(\\d*)-(\\d*)$/.exec(header.trim());\n\n // A server that does not support the requested unit, syntax, or multiple\n // ranges ignores Range and returns the complete representation. A 416 is\n // reserved for a valid byte-range set that cannot select this resource.\n if (!match || (!match[1] && !match[2])) {\n return null;\n }\n\n if (size === 0) {\n return \"unsatisfiable\";\n }\n\n if (!match[1]) {\n const suffixLength = Number(match[2]);\n\n if (!Number.isSafeInteger(suffixLength) || suffixLength <= 0) {\n return null;\n }\n\n return { start: Math.max(0, size - suffixLength), end: size - 1 };\n }\n\n const start = Number(match[1]);\n const requestedEnd = match[2] ? Number(match[2]) : size - 1;\n\n if (!Number.isSafeInteger(start) || !Number.isSafeInteger(requestedEnd)) {\n return null;\n }\n\n if (start >= size) {\n return \"unsatisfiable\";\n }\n\n if (match[2] && requestedEnd < start) {\n return null;\n }\n\n return { start, end: Math.min(requestedEnd, size - 1) };\n}\n\nfunction canApplyRange(request: Request, mtimeMs: number) {\n const ifRange = request.headers.get(\"if-range\");\n\n if (ifRange === null) {\n return true;\n }\n\n // If-Range requires strong comparison for an entity-tag. This handler's\n // stat-derived validator is intentionally weak, so only an HTTP date can\n // authorize a partial response.\n if (ifRange.trim().startsWith('\"') || /^W\\//i.test(ifRange.trim())) {\n return false;\n }\n\n const date = Date.parse(ifRange);\n return Number.isFinite(date) && Math.floor(mtimeMs / 1000) * 1000 <= date;\n}\n\nfunction resolveFilePath(root: string, prefix: string, pathname: string) {\n let decoded: string;\n\n try {\n decoded = decodeURIComponent(pathname);\n } catch {\n return null;\n }\n\n // A null byte truncates the path for some system calls. A name such as\n // \"app.js\\0.txt\" could read a file that differs from the checked file.\n if (decoded.includes(\"\\0\")) {\n return null;\n }\n\n if (prefix) {\n if (!decoded.startsWith(prefix)) {\n return null;\n }\n\n decoded = decoded.slice(prefix.length - 1);\n }\n\n if (decoded.endsWith(\"/\")) {\n return null;\n }\n\n const candidate = resolve(root, `.${decoded}`);\n\n return candidate.startsWith(`${root}${sep}`) ? candidate : null;\n}\n\nasync function safeRealRoot(root: Promise<string>) {\n try {\n return await root;\n } catch {\n return null;\n }\n}\n\nasync function openStaticFile(\n root: string,\n realRoot: string | null,\n filePath: string,\n) {\n if (!realRoot || !(await hasNoSymlinkComponents(root, filePath))) {\n return null;\n }\n\n let resolvedTarget: string;\n\n try {\n resolvedTarget = await realpath(filePath);\n } catch {\n return null;\n }\n\n if (!isPathInside(realRoot, resolvedTarget)) {\n return null;\n }\n\n const noFollow =\n typeof constants.O_NOFOLLOW === \"number\" ? constants.O_NOFOLLOW : 0;\n let file: Awaited<ReturnType<typeof open>>;\n\n try {\n // O_NOFOLLOW closes the final-component race on platforms that expose it.\n // The component walk and realpath containment check cover directory links.\n file = await open(filePath, constants.O_RDONLY | noFollow);\n } catch {\n return null;\n }\n\n try {\n const stats = await file.stat();\n\n if (!stats.isFile()) {\n await file.close();\n return null;\n }\n\n return { file, stats };\n } catch {\n await file.close();\n return null;\n }\n}\n\nasync function hasNoSymlinkComponents(root: string, filePath: string) {\n const parts = relative(root, filePath).split(sep);\n let current = root;\n\n try {\n for (const part of parts) {\n current = join(current, part);\n\n if ((await lstat(current)).isSymbolicLink()) {\n return false;\n }\n }\n } catch {\n return false;\n }\n\n return true;\n}\n\nfunction isPathInside(root: string, candidate: string) {\n return candidate.startsWith(`${root}${sep}`);\n}\n\nfunction normalizePrefix(prefix: string | undefined) {\n if (!prefix || prefix === \"/\") {\n return \"\";\n }\n\n return `/${prefix.replace(/^\\/|\\/$/g, \"\")}/`;\n}\n\nfunction defaultImmutable(fileName: string) {\n return hashedFileName.test(fileName);\n}\n\nfunction defaultExcluded(path: string) {\n return defaultExcludedPaths.has(path);\n}\n\nfunction toRelativePath(root: string, filePath: string) {\n return filePath.slice(root.length + 1).split(sep).join(\"/\");\n}\n\nfunction fileNameOf(filePath: string) {\n return filePath.slice(filePath.lastIndexOf(sep) + 1);\n}\n\nfunction contentTypeOf(filePath: string) {\n return (\n contentTypes[extname(filePath).toLowerCase()] ?? \"application/octet-stream\"\n );\n}\n","import { createServer } from \"node:http\";\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { defineAdapter } from \"../adapter\";\nimport type { RequestHandler } from \"../server\";\nimport {\n UntrustedHostError,\n UnsupportedMethodError,\n toWebRequest,\n validateNodeOriginPolicy,\n writeNotImplemented,\n writeWebResponse,\n} from \"./http\";\nimport { createStaticFileHandler } from \"./static\";\nimport type { StaticFileHandler, StaticFileHandlerOptions } from \"./static\";\n\nexport {\n UntrustedHostError,\n UnsupportedMethodError,\n toHeaders,\n toWebRequest,\n validateNodeOriginPolicy,\n writeWebResponse,\n} from \"./http\";\nexport { createStaticFileHandler } from \"./static\";\nexport {\n renderNodePageResponse,\n renderStreamingPageResponse,\n} from \"./streaming\";\nexport type {\n HttpScheme,\n NodeOriginPolicy,\n ToWebRequestOptions,\n TrustProxy,\n} from \"./http\";\nexport type { StaticFileHandler, StaticFileHandlerOptions } from \"./static\";\n\nexport const nodeAdapter = defineAdapter({\n name: \"node\",\n capabilities: {\n backgroundLifetime: true,\n crossOriginIsolationHeaders: true,\n nonceInjection: true,\n streaming: true,\n },\n});\n\nexport type NodeRequestListener = (\n request: IncomingMessage,\n response: ServerResponse,\n) => void;\n\nexport type NodeRequestListenerOptions = import(\"./http\").NodeOriginPolicy & {\n handler: RequestHandler;\n onError?: (error: unknown, request: IncomingMessage) => void;\n static?: StaticFileHandler | StaticFileHandlerOptions;\n};\n\nexport type NodeServerTimeouts = {\n headersTimeout: number;\n keepAliveTimeout: number;\n requestTimeout: number;\n};\n\nexport type NodeShutdownSignal = \"SIGINT\" | \"SIGTERM\";\nexport type NodeServerState = \"draining\" | \"ready\" | \"stopped\";\n\nexport type NodeGracefulShutdownOptions = {\n gracePeriod?: number;\n onBackgroundError?: (error: unknown) => void;\n onStateChange?: (state: NodeServerState) => void;\n signals?: readonly NodeShutdownSignal[];\n};\n\nexport type NodeServerOptions = NodeRequestListenerOptions & {\n shutdown?: NodeGracefulShutdownOptions;\n timeouts?: Partial<NodeServerTimeouts>;\n};\n\nexport type NodeServer = Server & {\n isReady: () => boolean;\n shutdown: () => Promise<void>;\n waitUntil: (promise: Promise<unknown>) => void;\n};\n\nexport const defaultNodeServerTimeouts = {\n headersTimeout: 66_000,\n keepAliveTimeout: 65_000,\n requestTimeout: 300_000,\n} as const satisfies NodeServerTimeouts;\n\nconst defaultShutdownGracePeriod = 30_000;\n\nexport function createNodeRequestListener(\n options: NodeRequestListenerOptions,\n): NodeRequestListener {\n validateNodeOriginPolicy(options);\n const serveStaticFile = toStaticFileHandler(options.static);\n const onError = options.onError ?? defaultOnError;\n\n return function handleNodeRequest(request, response) {\n const connection = createRequestAbort(request, response);\n\n void respond(request, response, connection.signal)\n .catch((error: unknown) => {\n if (connection.signal.aborted) {\n return;\n }\n\n onError(error, request);\n writeServerError(response);\n })\n .finally(connection.cleanup);\n };\n\n async function respond(\n request: IncomingMessage,\n response: ServerResponse,\n signal: AbortSignal,\n ) {\n let webRequest: Request;\n\n try {\n webRequest = toWebRequest(request, {\n allowedHosts: options.allowedHosts,\n signal,\n trustProxy: options.trustProxy,\n });\n } catch (error) {\n if (error instanceof UnsupportedMethodError) {\n writeNotImplemented(response);\n return;\n }\n\n if (error instanceof UntrustedHostError) {\n writeMisdirectedRequest(response);\n return;\n }\n\n throw error;\n }\n\n const staticResponse = await serveStaticFile?.(webRequest);\n\n await writeWebResponse(\n response,\n staticResponse ?? (await options.handler(webRequest)),\n );\n }\n}\n\nfunction createRequestAbort(\n request: IncomingMessage,\n response: ServerResponse,\n) {\n const controller = new AbortController();\n const abort = () => {\n if (!controller.signal.aborted) {\n controller.abort(new DOMException(\"Client disconnected.\", \"AbortError\"));\n }\n };\n const abortPrematureResponse = () => {\n if (!response.writableFinished) {\n abort();\n }\n };\n\n request.once(\"aborted\", abort);\n response.once(\"close\", abortPrematureResponse);\n\n return {\n cleanup() {\n request.off(\"aborted\", abort);\n response.off(\"close\", abortPrematureResponse);\n },\n signal: controller.signal,\n };\n}\n\nfunction writeMisdirectedRequest(response: ServerResponse) {\n response.statusCode = 421;\n response.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n response.end(\"Misdirected Request\");\n}\n\nexport function createNodeServer(\n options: NodeServerOptions,\n): NodeServer {\n const timeouts = normalizeNodeServerTimeouts(options.timeouts);\n const server = createServer(createNodeRequestListener(options)) as NodeServer;\n server.keepAliveTimeout = timeouts.keepAliveTimeout;\n server.headersTimeout = timeouts.headersTimeout;\n server.requestTimeout = timeouts.requestTimeout;\n\n return attachNodeServerLifecycle(server, options.shutdown);\n}\n\nfunction normalizeNodeServerTimeouts(\n configured: Partial<NodeServerTimeouts> | undefined,\n) {\n const timeouts = {\n ...defaultNodeServerTimeouts,\n ...configured,\n } satisfies NodeServerTimeouts;\n\n for (const [name, value] of Object.entries(timeouts)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(\n `Demiurge Node ${name} must be a positive integer in milliseconds.`,\n );\n }\n }\n\n if (timeouts.headersTimeout <= timeouts.keepAliveTimeout) {\n throw new Error(\n \"Demiurge Node headersTimeout must be greater than keepAliveTimeout.\",\n );\n }\n\n return timeouts;\n}\n\nfunction attachNodeServerLifecycle(\n server: NodeServer,\n options: NodeGracefulShutdownOptions | undefined,\n) {\n const gracePeriod = options?.gracePeriod ?? defaultShutdownGracePeriod;\n\n if (!Number.isSafeInteger(gracePeriod) || gracePeriod < 0) {\n throw new Error(\n \"Demiurge Node shutdown gracePeriod must be a non-negative integer in milliseconds.\",\n );\n }\n\n let draining = false;\n let shutdownPromise: Promise<void> | undefined;\n let checkShutdownCompletion: (() => void) | undefined;\n const signalHandlers = new Map<NodeShutdownSignal, () => void>();\n const activeResponses = new Map<Socket, number>();\n const backgroundTasks = new Set<Promise<void>>();\n\n server.on(\"connection\", (socket) => {\n activeResponses.set(socket, 0);\n socket.once(\"close\", () => activeResponses.delete(socket));\n });\n server.on(\"request\", (_request, response) => {\n const socket = response.socket;\n\n if (!socket) {\n return;\n }\n\n activeResponses.set(socket, (activeResponses.get(socket) ?? 0) + 1);\n let settled = false;\n const settle = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n const remaining = Math.max(0, (activeResponses.get(socket) ?? 1) - 1);\n activeResponses.set(socket, remaining);\n\n if (draining && remaining === 0) {\n socket.destroy();\n }\n };\n response.once(\"finish\", settle);\n response.once(\"close\", settle);\n });\n\n server.isReady = () => server.listening && !draining;\n server.waitUntil = (promise) => {\n const tracked = Promise.resolve(promise)\n .catch((error: unknown) => {\n try {\n (options?.onBackgroundError ?? defaultOnError)(error);\n } catch (reportingError) {\n defaultOnError(reportingError);\n }\n })\n .then(() => undefined)\n .finally(() => {\n backgroundTasks.delete(tracked);\n checkShutdownCompletion?.();\n });\n backgroundTasks.add(tracked);\n };\n server.shutdown = () => {\n if (shutdownPromise) {\n return shutdownPromise;\n }\n\n draining = true;\n options?.onStateChange?.(\"draining\");\n shutdownPromise = new Promise<void>((resolveShutdown, rejectShutdown) => {\n let closeError: Error | undefined;\n let deadlineReached = false;\n let serverClosed = false;\n let settled = false;\n const forceTimer = setTimeout(() => {\n deadlineReached = true;\n server.closeAllConnections();\n completeShutdown();\n }, gracePeriod);\n\n server.close((error) => {\n if (error && (error as NodeJS.ErrnoException).code !== \"ERR_SERVER_NOT_RUNNING\") {\n closeError = error;\n }\n\n serverClosed = true;\n completeShutdown();\n });\n server.closeIdleConnections();\n closeTrackedIdleConnections();\n // A response can finish in the same turn shutdown begins and transition\n // from active to idle just after the first sweep.\n setImmediate(() => {\n server.closeIdleConnections();\n closeTrackedIdleConnections();\n });\n\n checkShutdownCompletion = completeShutdown;\n\n function completeShutdown() {\n if (\n settled ||\n !serverClosed ||\n (!deadlineReached && backgroundTasks.size > 0)\n ) {\n return;\n }\n\n settled = true;\n checkShutdownCompletion = undefined;\n clearTimeout(forceTimer);\n removeSignalHandlers();\n options?.onStateChange?.(\"stopped\");\n\n if (closeError) {\n rejectShutdown(closeError);\n return;\n }\n\n resolveShutdown();\n }\n });\n\n return shutdownPromise;\n };\n\n server.on(\"listening\", () => options?.onStateChange?.(\"ready\"));\n\n for (const signal of new Set(options?.signals ?? [])) {\n const handler = () => {\n void server.shutdown().catch(defaultOnError);\n };\n signalHandlers.set(signal, handler);\n process.once(signal, handler);\n }\n\n server.once(\"close\", removeSignalHandlers);\n\n return server;\n\n function removeSignalHandlers() {\n for (const [signal, handler] of signalHandlers) {\n process.off(signal, handler);\n }\n\n signalHandlers.clear();\n }\n\n function closeTrackedIdleConnections() {\n for (const [socket, count] of activeResponses) {\n if (count === 0) {\n socket.destroy();\n }\n }\n }\n}\n\nfunction toStaticFileHandler(\n value: StaticFileHandler | StaticFileHandlerOptions | undefined,\n) {\n if (!value) {\n return undefined;\n }\n\n return typeof value === \"function\" ? value : createStaticFileHandler(value);\n}\n\nfunction defaultOnError(error: unknown) {\n console.error(error);\n}\n\n// The body stays generic on purpose. A stack trace here would hand an attacker\n// file paths and framework internals for free.\nfunction writeServerError(response: ServerResponse) {\n if (response.headersSent) {\n response.destroy();\n return;\n }\n\n response.statusCode = 500;\n response.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n response.end(\"Internal Server Error\");\n}\n"],"names":["contentTypes","hashedFileName","defaultExcludedPaths","createStaticFileHandler","options","root","resolve","realRoot","realpath","prefix","normalizePrefix","isExcluded","defaultExcluded","isImmutable","defaultImmutable","request","filePath","resolveFilePath","toRelativePath","opened","openStaticFile","safeRealRoot","file","stats","etag","createWeakEtag","lastModified","headers","fileNameOf","contentTypeOf","isNotModified","range","canApplyRange","parseRange","contentLength","Readable","size","mtimeMs","ifNoneMatch","candidate","weakEtagValue","ifModifiedSince","since","value","header","match","suffixLength","start","requestedEnd","ifRange","date","pathname","decoded","sep","hasNoSymlinkComponents","resolvedTarget","isPathInside","noFollow","constants","open","parts","relative","current","part","join","lstat","fileName","path","extname","nodeAdapter","defineAdapter","defaultNodeServerTimeouts","defaultShutdownGracePeriod","createNodeRequestListener","validateNodeOriginPolicy","serveStaticFile","toStaticFileHandler","onError","defaultOnError","response","connection","createRequestAbort","respond","error","writeServerError","signal","webRequest","toWebRequest","UnsupportedMethodError","writeNotImplemented","UntrustedHostError","writeMisdirectedRequest","staticResponse","writeWebResponse","controller","abort","abortPrematureResponse","createNodeServer","timeouts","normalizeNodeServerTimeouts","server","createServer","attachNodeServerLifecycle","configured","name","gracePeriod","draining","shutdownPromise","checkShutdownCompletion","signalHandlers","activeResponses","backgroundTasks","socket","_request","settled","settle","remaining","promise","tracked","reportingError","resolveShutdown","rejectShutdown","closeError","deadlineReached","serverClosed","forceTimer","completeShutdown","closeTrackedIdleConnections","removeSignalHandlers","handler","count"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type StaticFileHandler = (request: Request) => Promise<Response | null>;
2
+ export type StaticFileHandlerOptions = {
3
+ exclude?: (path: string) => boolean;
4
+ immutable?: (fileName: string) => boolean;
5
+ prefix?: string;
6
+ root: string;
7
+ };
8
+ export declare function createStaticFileHandler(options: StaticFileHandlerOptions): StaticFileHandler;
9
+ //# sourceMappingURL=static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/node/static.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AAE/E,MAAM,MAAM,wBAAwB,GAAG;IAGrC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAkCF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,wBAAwB,GAChC,iBAAiB,CA8FnB"}
@@ -0,0 +1,5 @@
1
+ import type { LoadedRouteMatch } from "../router";
2
+ import { type SsrRenderOptions } from "../server/ssr";
3
+ export declare function renderNodePageResponse(match: LoadedRouteMatch, options?: SsrRenderOptions): Response | Promise<Response>;
4
+ export declare function renderStreamingPageResponse(match: LoadedRouteMatch, options?: SsrRenderOptions): Promise<Response>;
5
+ //# sourceMappingURL=streaming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/node/streaming.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAIvB,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,gBAAqB,gCAK/B;AAED,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,gBAAqB,qBAwE/B"}
@@ -0,0 +1,2 @@
1
+ export declare const PACKAGE_NAME = "@demiurgejs/core";
2
+ //# sourceMappingURL=package-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-name.d.ts","sourceRoot":"","sources":["../src/package-name.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,YAAY,qBAAqB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type ScriptTag } from "../document";
2
+ export type AnalyticsConsent = boolean | "required";
3
+ export type PlausibleAnalyticsOptions = {
4
+ consent?: AnalyticsConsent;
5
+ domain: string;
6
+ endpoint?: string;
7
+ strategy?: ScriptTag["strategy"];
8
+ };
9
+ export type PlausibleAnalytics = {
10
+ connectSrc: string;
11
+ consent: AnalyticsConsent;
12
+ domain: string;
13
+ kind: "analytics";
14
+ provider: "plausible";
15
+ script: ScriptTag;
16
+ };
17
+ export declare const analytics: {
18
+ plausible(options: PlausibleAnalyticsOptions): PlausibleAnalytics;
19
+ };
20
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/platform/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,CAAC;AAEpD,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,SAAS;uBACD,yBAAyB,GAAG,kBAAkB;CAmBlE,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { LinkTag } from "../document";
2
+ export type FontStyle = "normal" | "italic" | "oblique";
3
+ export type FontDefinition = {
4
+ display: "auto" | "block" | "fallback" | "optional" | "swap";
5
+ family: string;
6
+ kind: "font";
7
+ source: "google" | "local";
8
+ src?: string;
9
+ style: FontStyle;
10
+ weight: number | `${number} ${number}`;
11
+ };
12
+ export type LocalFontOptions = {
13
+ display?: FontDefinition["display"];
14
+ name: string;
15
+ src: string;
16
+ style?: FontStyle;
17
+ weight?: FontDefinition["weight"];
18
+ };
19
+ export type GoogleFontOptions = {
20
+ display?: FontDefinition["display"];
21
+ family: string;
22
+ selfHost?: boolean;
23
+ src?: string;
24
+ style?: FontStyle;
25
+ weight?: FontDefinition["weight"];
26
+ };
27
+ export type FontContribution = readonly FontDefinition[];
28
+ export declare const font: {
29
+ google(options: GoogleFontOptions): FontDefinition;
30
+ local(options: LocalFontOptions): FontDefinition;
31
+ };
32
+ export declare function defineFonts(fonts: FontContribution): FontContribution;
33
+ export declare function fontPreloadLinks(fonts: FontContribution): LinkTag[];
34
+ export declare function renderFontFaceCss(fonts: FontContribution): string;
35
+ //# sourceMappingURL=fonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../../src/platform/fonts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,SAAS,cAAc,EAAE,CAAC;AAEzD,eAAO,MAAM,IAAI;oBACC,iBAAiB,GAAG,cAAc;mBAWnC,gBAAgB,GAAG,cAAc;CAejD,CAAC;AAEF,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAErE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,EAAE,CAWnE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAiBjE"}
@@ -0,0 +1,49 @@
1
+ export type ImageFormat = "auto" | "avif" | "webp" | "jpeg" | "png";
2
+ export type RemoteImagePattern = {
3
+ hostname: string;
4
+ pathname?: string;
5
+ port?: string;
6
+ protocol?: "http:" | "https:";
7
+ };
8
+ export type ImagePolicy = {
9
+ local?: boolean;
10
+ optimizerPath?: string;
11
+ remote?: readonly (string | RemoteImagePattern)[];
12
+ };
13
+ export type ImageTransformOptions = {
14
+ alt: string;
15
+ format?: ImageFormat;
16
+ height: number;
17
+ priority?: boolean;
18
+ quality?: number;
19
+ sizes?: string;
20
+ src: string;
21
+ width: number;
22
+ widths?: readonly number[];
23
+ };
24
+ export type ImageVariant = {
25
+ format: ImageFormat;
26
+ height: number;
27
+ src: string;
28
+ width: number;
29
+ };
30
+ export type ImageTransformPlan = {
31
+ alt: string;
32
+ decoding: "async";
33
+ fetchPriority?: "high";
34
+ height: number;
35
+ loading: "eager" | "lazy";
36
+ sizes?: string;
37
+ source: {
38
+ kind: "local" | "remote";
39
+ src: string;
40
+ };
41
+ src: string;
42
+ srcSet: string;
43
+ variants: ImageVariant[];
44
+ width: number;
45
+ };
46
+ export declare function defineImages(policy: ImagePolicy): ImagePolicy;
47
+ export declare function isAllowedImageSource(src: string, policy?: ImagePolicy): boolean;
48
+ export declare function planImageTransform(options: ImageTransformOptions, policy?: ImagePolicy): ImageTransformPlan;
49
+ //# sourceMappingURL=images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/platform/images.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEpE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,kBAAkB,CAAC,EAAE,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;QACzB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAIF,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,WAAgB,WAEzE;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,qBAAqB,EAC9B,MAAM,GAAE,WAAgB,GACvB,kBAAkB,CA8CpB"}
@@ -0,0 +1,9 @@
1
+ export { defineImages, isAllowedImageSource, planImageTransform, } from "./images";
2
+ export type { ImageFormat, ImagePolicy, ImageTransformOptions, ImageTransformPlan, ImageVariant, RemoteImagePattern, } from "./images";
3
+ export { defineFonts, font, fontPreloadLinks, renderFontFaceCss } from "./fonts";
4
+ export type { FontContribution, FontDefinition, FontStyle, GoogleFontOptions, LocalFontOptions, } from "./fonts";
5
+ export { analytics } from "./analytics";
6
+ export type { AnalyticsConsent, PlausibleAnalytics, PlausibleAnalyticsOptions, } from "./analytics";
7
+ export { defineInstrumentation } from "./observability";
8
+ export type { Instrumentation, InstrumentationEvent, InstrumentationHandler, InstrumentationOptions, ObservabilityValue, RequestSignal, ServerStartSignal, TraceSignal, WebVitalName, WebVitalSignal, } from "./observability";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjF,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,iBAAiB,CAAC"}