@demiurgejs/core 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/file-router.d.ts +5 -0
- package/dist/browser/file-router.d.ts.map +1 -1
- package/dist/chunks/{ssr-O3d7Q73U.js → ssr-BJejKlkZ.js} +57 -55
- package/dist/chunks/ssr-BJejKlkZ.js.map +1 -0
- package/dist/chunks/static-files-DUjHw-4H.js +11 -0
- package/dist/chunks/static-files-DUjHw-4H.js.map +1 -0
- package/dist/chunks/{streaming-27pwhjGC.js → streaming-DN1DnbRE.js} +2 -2
- package/dist/chunks/{streaming-27pwhjGC.js.map → streaming-DN1DnbRE.js.map} +1 -1
- package/dist/chunks/{testing-BBnJ5WUR.js → testing-DR3eQAvY.js} +127 -126
- package/dist/chunks/testing-DR3eQAvY.js.map +1 -0
- package/dist/document/render.d.ts +1 -0
- package/dist/document/render.d.ts.map +1 -1
- package/dist/index.js +284 -274
- package/dist/index.js.map +1 -1
- package/dist/internal/testing.js +1 -1
- package/dist/node/index.js +86 -85
- package/dist/node/index.js.map +1 -1
- package/dist/node/static.d.ts.map +1 -1
- package/dist/router/manifest.d.ts +3 -1
- package/dist/router/manifest.d.ts.map +1 -1
- package/dist/static/index.d.ts +5 -0
- package/dist/static/index.d.ts.map +1 -1
- package/dist/static/index.js +245 -124
- package/dist/static/index.js.map +1 -1
- package/dist/static-files.d.ts +5 -0
- package/dist/static-files.d.ts.map +1 -0
- package/dist/vite/index.js +445 -279
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugin.d.ts.map +1 -1
- package/package.json +4 -1
- package/dist/chunks/ssr-O3d7Q73U.js.map +0 -1
- package/dist/chunks/testing-BBnJ5WUR.js.map +0 -1
package/dist/node/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createServer as I } from "node:http";
|
|
2
|
-
import { d as
|
|
3
|
-
import { v as O, t as
|
|
4
|
-
import { r as
|
|
5
|
-
import { constants as
|
|
6
|
-
import { realpath as
|
|
7
|
-
import { resolve as
|
|
2
|
+
import { d as v } from "../chunks/index-BnX9Qxbm.js";
|
|
3
|
+
import { v as O, t as M, U as A, w as L, a as H, b as k } from "../chunks/streaming-DN1DnbRE.js";
|
|
4
|
+
import { r as ve, c as Oe, d as Me } from "../chunks/streaming-DN1DnbRE.js";
|
|
5
|
+
import { constants as S } from "node:fs";
|
|
6
|
+
import { realpath as T, open as j, lstat as F } from "node:fs/promises";
|
|
7
|
+
import { resolve as x, sep as w, extname as P, relative as W, join as $ } from "node:path";
|
|
8
8
|
import { Readable as N } from "node:stream";
|
|
9
|
-
|
|
9
|
+
import { I as _, R as D, i as U } from "../chunks/static-files-DUjHw-4H.js";
|
|
10
|
+
const z = {
|
|
10
11
|
".avif": "image/avif",
|
|
11
12
|
".css": "text/css; charset=utf-8",
|
|
12
13
|
".gif": "image/gif",
|
|
@@ -24,35 +25,35 @@ const D = {
|
|
|
24
25
|
".webp": "image/webp",
|
|
25
26
|
".woff": "font/woff",
|
|
26
27
|
".woff2": "font/woff2"
|
|
27
|
-
},
|
|
28
|
-
function
|
|
29
|
-
const t =
|
|
28
|
+
}, G = /* @__PURE__ */ new Set(["demiurge-manifest.json", "index.html"]);
|
|
29
|
+
function V(e) {
|
|
30
|
+
const t = x(e.root), n = T(t), r = te(e.prefix), o = e.exclude ?? re, i = e.immutable ?? ne;
|
|
30
31
|
return async function(s) {
|
|
31
32
|
if (s.method !== "GET" && s.method !== "HEAD")
|
|
32
33
|
return null;
|
|
33
|
-
const m =
|
|
34
|
+
const m = K(
|
|
34
35
|
t,
|
|
35
36
|
r,
|
|
36
37
|
new URL(s.url).pathname
|
|
37
38
|
);
|
|
38
|
-
if (!m || o(
|
|
39
|
+
if (!m || o(oe(t, m)))
|
|
39
40
|
return null;
|
|
40
|
-
const g = await
|
|
41
|
+
const g = await X(t, await Q(n), m);
|
|
41
42
|
if (!g)
|
|
42
43
|
return null;
|
|
43
|
-
const { file: h, stats: a } = g, l =
|
|
44
|
+
const { file: h, stats: a } = g, l = q(a.size, a.mtimeMs), f = a.mtime.toUTCString(), c = new Headers({
|
|
44
45
|
"accept-ranges": "bytes",
|
|
45
|
-
"cache-control": i(
|
|
46
|
+
"cache-control": i(ie(m)) ? _ : D,
|
|
46
47
|
"content-length": String(a.size),
|
|
47
|
-
"content-type":
|
|
48
|
+
"content-type": ae(m),
|
|
48
49
|
"cross-origin-resource-policy": "same-origin",
|
|
49
50
|
etag: l,
|
|
50
51
|
"last-modified": f,
|
|
51
52
|
"x-content-type-options": "nosniff"
|
|
52
53
|
});
|
|
53
|
-
if (
|
|
54
|
+
if (B(s, l, a.mtimeMs))
|
|
54
55
|
return await h.close(), c.delete("content-length"), c.delete("content-type"), new Response(null, { headers: c, status: 304 });
|
|
55
|
-
const d =
|
|
56
|
+
const d = J(s, a.mtimeMs) ? Y(s.headers.get("range"), a.size) : null;
|
|
56
57
|
if (d === "unsatisfiable")
|
|
57
58
|
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
59
|
if (d) {
|
|
@@ -70,14 +71,14 @@ function z(e) {
|
|
|
70
71
|
);
|
|
71
72
|
};
|
|
72
73
|
}
|
|
73
|
-
function
|
|
74
|
+
function q(e, t) {
|
|
74
75
|
return `W/"${e.toString(16)}-${Math.trunc(t).toString(16)}"`;
|
|
75
76
|
}
|
|
76
|
-
function
|
|
77
|
+
function B(e, t, n) {
|
|
77
78
|
const r = e.headers.get("if-none-match");
|
|
78
79
|
if (r !== null)
|
|
79
80
|
return r.trim() === "*" || r.split(",").some(
|
|
80
|
-
(u) =>
|
|
81
|
+
(u) => E(u) === E(t)
|
|
81
82
|
);
|
|
82
83
|
const o = e.headers.get("if-modified-since");
|
|
83
84
|
if (o === null)
|
|
@@ -85,10 +86,10 @@ function q(e, t, n) {
|
|
|
85
86
|
const i = Date.parse(o);
|
|
86
87
|
return Number.isFinite(i) && Math.floor(n / 1e3) * 1e3 <= i;
|
|
87
88
|
}
|
|
88
|
-
function
|
|
89
|
+
function E(e) {
|
|
89
90
|
return e.trim().replace(/^W\//i, "");
|
|
90
91
|
}
|
|
91
|
-
function
|
|
92
|
+
function Y(e, t) {
|
|
92
93
|
if (e === null)
|
|
93
94
|
return null;
|
|
94
95
|
const n = /^bytes=(\d*)-(\d*)$/.exec(e.trim());
|
|
@@ -103,7 +104,7 @@ function V(e, t) {
|
|
|
103
104
|
const r = Number(n[1]), o = n[2] ? Number(n[2]) : t - 1;
|
|
104
105
|
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
|
}
|
|
106
|
-
function
|
|
107
|
+
function J(e, t) {
|
|
107
108
|
const n = e.headers.get("if-range");
|
|
108
109
|
if (n === null)
|
|
109
110
|
return !0;
|
|
@@ -112,7 +113,7 @@ function Z(e, t) {
|
|
|
112
113
|
const r = Date.parse(n);
|
|
113
114
|
return Number.isFinite(r) && Math.floor(t / 1e3) * 1e3 <= r;
|
|
114
115
|
}
|
|
115
|
-
function
|
|
116
|
+
function K(e, t, n) {
|
|
116
117
|
let r;
|
|
117
118
|
try {
|
|
118
119
|
r = decodeURIComponent(n);
|
|
@@ -128,31 +129,31 @@ function B(e, t, n) {
|
|
|
128
129
|
}
|
|
129
130
|
if (r.endsWith("/"))
|
|
130
131
|
return null;
|
|
131
|
-
const o =
|
|
132
|
+
const o = x(e, `.${r}`);
|
|
132
133
|
return o.startsWith(`${e}${w}`) ? o : null;
|
|
133
134
|
}
|
|
134
|
-
async function
|
|
135
|
+
async function Q(e) {
|
|
135
136
|
try {
|
|
136
137
|
return await e;
|
|
137
138
|
} catch {
|
|
138
139
|
return null;
|
|
139
140
|
}
|
|
140
141
|
}
|
|
141
|
-
async function
|
|
142
|
-
if (!t || !await
|
|
142
|
+
async function X(e, t, n) {
|
|
143
|
+
if (!t || !await Z(e, n))
|
|
143
144
|
return null;
|
|
144
145
|
let r;
|
|
145
146
|
try {
|
|
146
|
-
r = await
|
|
147
|
+
r = await T(n);
|
|
147
148
|
} catch {
|
|
148
149
|
return null;
|
|
149
150
|
}
|
|
150
|
-
if (!
|
|
151
|
+
if (!ee(t, r))
|
|
151
152
|
return null;
|
|
152
|
-
const o = typeof
|
|
153
|
+
const o = typeof S.O_NOFOLLOW == "number" ? S.O_NOFOLLOW : 0;
|
|
153
154
|
let i;
|
|
154
155
|
try {
|
|
155
|
-
i = await
|
|
156
|
+
i = await j(n, S.O_RDONLY | o);
|
|
156
157
|
} catch {
|
|
157
158
|
return null;
|
|
158
159
|
}
|
|
@@ -163,40 +164,40 @@ async function J(e, t, n) {
|
|
|
163
164
|
return await i.close(), null;
|
|
164
165
|
}
|
|
165
166
|
}
|
|
166
|
-
async function
|
|
167
|
-
const n =
|
|
167
|
+
async function Z(e, t) {
|
|
168
|
+
const n = W(e, t).split(w);
|
|
168
169
|
let r = e;
|
|
169
170
|
try {
|
|
170
171
|
for (const o of n)
|
|
171
|
-
if (r =
|
|
172
|
+
if (r = $(r, o), (await F(r)).isSymbolicLink())
|
|
172
173
|
return !1;
|
|
173
174
|
} catch {
|
|
174
175
|
return !1;
|
|
175
176
|
}
|
|
176
177
|
return !0;
|
|
177
178
|
}
|
|
178
|
-
function
|
|
179
|
+
function ee(e, t) {
|
|
179
180
|
return t.startsWith(`${e}${w}`);
|
|
180
181
|
}
|
|
181
|
-
function
|
|
182
|
+
function te(e) {
|
|
182
183
|
return !e || e === "/" ? "" : `/${e.replace(/^\/|\/$/g, "")}/`;
|
|
183
184
|
}
|
|
184
|
-
function
|
|
185
|
-
return U
|
|
185
|
+
function ne(e) {
|
|
186
|
+
return U(e);
|
|
186
187
|
}
|
|
187
|
-
function
|
|
188
|
-
return
|
|
188
|
+
function re(e) {
|
|
189
|
+
return G.has(e);
|
|
189
190
|
}
|
|
190
|
-
function
|
|
191
|
+
function oe(e, t) {
|
|
191
192
|
return t.slice(e.length + 1).split(w).join("/");
|
|
192
193
|
}
|
|
193
|
-
function
|
|
194
|
+
function ie(e) {
|
|
194
195
|
return e.slice(e.lastIndexOf(w) + 1);
|
|
195
196
|
}
|
|
196
|
-
function
|
|
197
|
-
return
|
|
197
|
+
function ae(e) {
|
|
198
|
+
return z[P(e).toLowerCase()] ?? "application/octet-stream";
|
|
198
199
|
}
|
|
199
|
-
const
|
|
200
|
+
const Te = v({
|
|
200
201
|
name: "node",
|
|
201
202
|
capabilities: {
|
|
202
203
|
backgroundLifetime: !0,
|
|
@@ -204,47 +205,47 @@ const Re = M({
|
|
|
204
205
|
nonceInjection: !0,
|
|
205
206
|
streaming: !0
|
|
206
207
|
}
|
|
207
|
-
}),
|
|
208
|
+
}), se = {
|
|
208
209
|
headersTimeout: 66e3,
|
|
209
210
|
keepAliveTimeout: 65e3,
|
|
210
211
|
requestTimeout: 3e5
|
|
211
|
-
},
|
|
212
|
-
function
|
|
212
|
+
}, ce = 3e4;
|
|
213
|
+
function le(e) {
|
|
213
214
|
O(e);
|
|
214
|
-
const t =
|
|
215
|
+
const t = ge(e.static), n = e.onError ?? b;
|
|
215
216
|
return function(i, u) {
|
|
216
|
-
const s =
|
|
217
|
+
const s = ue(i, u);
|
|
217
218
|
r(i, u, s.signal).catch((m) => {
|
|
218
|
-
s.signal.aborted || (n(m, i),
|
|
219
|
+
s.signal.aborted || (n(m, i), he(u));
|
|
219
220
|
}).finally(s.cleanup);
|
|
220
221
|
};
|
|
221
222
|
async function r(o, i, u) {
|
|
222
223
|
let s;
|
|
223
224
|
try {
|
|
224
|
-
s =
|
|
225
|
+
s = M(o, {
|
|
225
226
|
allowedHosts: e.allowedHosts,
|
|
226
227
|
signal: u,
|
|
227
228
|
trustProxy: e.trustProxy
|
|
228
229
|
});
|
|
229
230
|
} catch (g) {
|
|
230
231
|
if (g instanceof A) {
|
|
231
|
-
|
|
232
|
+
L(i);
|
|
232
233
|
return;
|
|
233
234
|
}
|
|
234
|
-
if (g instanceof
|
|
235
|
-
|
|
235
|
+
if (g instanceof H) {
|
|
236
|
+
fe(i);
|
|
236
237
|
return;
|
|
237
238
|
}
|
|
238
239
|
throw g;
|
|
239
240
|
}
|
|
240
241
|
const m = await t?.(s);
|
|
241
|
-
await
|
|
242
|
+
await k(
|
|
242
243
|
i,
|
|
243
244
|
m ?? await e.handler(s)
|
|
244
245
|
);
|
|
245
246
|
}
|
|
246
247
|
}
|
|
247
|
-
function
|
|
248
|
+
function ue(e, t) {
|
|
248
249
|
const n = new AbortController(), r = () => {
|
|
249
250
|
n.signal.aborted || n.abort(new DOMException("Client disconnected.", "AbortError"));
|
|
250
251
|
}, o = () => {
|
|
@@ -257,16 +258,16 @@ function ce(e, t) {
|
|
|
257
258
|
signal: n.signal
|
|
258
259
|
};
|
|
259
260
|
}
|
|
260
|
-
function
|
|
261
|
+
function fe(e) {
|
|
261
262
|
e.statusCode = 421, e.setHeader("content-type", "text/plain; charset=utf-8"), e.end("Misdirected Request");
|
|
262
263
|
}
|
|
263
|
-
function
|
|
264
|
-
const t =
|
|
265
|
-
return n.keepAliveTimeout = t.keepAliveTimeout, n.headersTimeout = t.headersTimeout, n.requestTimeout = t.requestTimeout,
|
|
264
|
+
function xe(e) {
|
|
265
|
+
const t = de(e.timeouts), n = I(le(e));
|
|
266
|
+
return n.keepAliveTimeout = t.keepAliveTimeout, n.headersTimeout = t.headersTimeout, n.requestTimeout = t.requestTimeout, me(n, e.shutdown);
|
|
266
267
|
}
|
|
267
|
-
function
|
|
268
|
+
function de(e) {
|
|
268
269
|
const t = {
|
|
269
|
-
...
|
|
270
|
+
...se,
|
|
270
271
|
...e
|
|
271
272
|
};
|
|
272
273
|
for (const [n, r] of Object.entries(t))
|
|
@@ -280,8 +281,8 @@ function ue(e) {
|
|
|
280
281
|
);
|
|
281
282
|
return t;
|
|
282
283
|
}
|
|
283
|
-
function
|
|
284
|
-
const n = t?.gracePeriod ??
|
|
284
|
+
function me(e, t) {
|
|
285
|
+
const n = t?.gracePeriod ?? ce;
|
|
285
286
|
if (!Number.isSafeInteger(n) || n < 0)
|
|
286
287
|
throw new Error(
|
|
287
288
|
"Demiurge Node shutdown gracePeriod must be a non-negative integer in milliseconds."
|
|
@@ -318,17 +319,17 @@ function fe(e, t) {
|
|
|
318
319
|
m.add(l);
|
|
319
320
|
}, e.shutdown = () => o || (r = !0, t?.onStateChange?.("draining"), o = new Promise((a, l) => {
|
|
320
321
|
let f, c = !1, d = !1, p = !1;
|
|
321
|
-
const
|
|
322
|
+
const C = setTimeout(() => {
|
|
322
323
|
c = !0, e.closeAllConnections(), y();
|
|
323
324
|
}, n);
|
|
324
|
-
e.close((
|
|
325
|
-
|
|
325
|
+
e.close((R) => {
|
|
326
|
+
R && R.code !== "ERR_SERVER_NOT_RUNNING" && (f = R), d = !0, y();
|
|
326
327
|
}), e.closeIdleConnections(), h(), setImmediate(() => {
|
|
327
328
|
e.closeIdleConnections(), h();
|
|
328
329
|
}), i = y;
|
|
329
330
|
function y() {
|
|
330
331
|
if (!(p || !d || !c && m.size > 0)) {
|
|
331
|
-
if (p = !0, i = void 0, clearTimeout(
|
|
332
|
+
if (p = !0, i = void 0, clearTimeout(C), g(), t?.onStateChange?.("stopped"), f) {
|
|
332
333
|
l(f);
|
|
333
334
|
return;
|
|
334
335
|
}
|
|
@@ -353,14 +354,14 @@ function fe(e, t) {
|
|
|
353
354
|
l === 0 && a.destroy();
|
|
354
355
|
}
|
|
355
356
|
}
|
|
356
|
-
function
|
|
357
|
+
function ge(e) {
|
|
357
358
|
if (e)
|
|
358
|
-
return typeof e == "function" ? e :
|
|
359
|
+
return typeof e == "function" ? e : V(e);
|
|
359
360
|
}
|
|
360
361
|
function b(e) {
|
|
361
362
|
console.error(e);
|
|
362
363
|
}
|
|
363
|
-
function
|
|
364
|
+
function he(e) {
|
|
364
365
|
if (e.headersSent) {
|
|
365
366
|
e.destroy();
|
|
366
367
|
return;
|
|
@@ -369,17 +370,17 @@ function me(e) {
|
|
|
369
370
|
}
|
|
370
371
|
export {
|
|
371
372
|
A as UnsupportedMethodError,
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
373
|
+
H as UntrustedHostError,
|
|
374
|
+
le as createNodeRequestListener,
|
|
375
|
+
xe as createNodeServer,
|
|
376
|
+
V as createStaticFileHandler,
|
|
377
|
+
se as defaultNodeServerTimeouts,
|
|
378
|
+
Te as nodeAdapter,
|
|
379
|
+
ve as renderNodePageResponse,
|
|
380
|
+
Oe as renderStreamingPageResponse,
|
|
381
|
+
Me as toHeaders,
|
|
382
|
+
M as toWebRequest,
|
|
382
383
|
O as validateNodeOriginPolicy,
|
|
383
|
-
|
|
384
|
+
k as writeWebResponse
|
|
384
385
|
};
|
|
385
386
|
//# sourceMappingURL=index.js.map
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +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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"}
|
|
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\";\nimport {\n IMMUTABLE_FILE_CACHE_CONTROL,\n isContentHashedFileName,\n REVALIDATED_FILE_CACHE_CONTROL,\n} from \"../static-files\";\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\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 ? IMMUTABLE_FILE_CACHE_CONTROL\n : REVALIDATED_FILE_CACHE_CONTROL,\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 isContentHashedFileName(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","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","IMMUTABLE_FILE_CACHE_CONTROL","REVALIDATED_FILE_CACHE_CONTROL","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","isContentHashedFileName","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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/node/static.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/node/static.ts"],"names":[],"mappings":"AAUA,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;AAgCF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,wBAAwB,GAChC,iBAAiB,CA8FnB"}
|
|
@@ -86,7 +86,9 @@ export declare function createRouteManifest(routes: Record<string, RouteImporter
|
|
|
86
86
|
export declare function loadPageRoute(manifest: RouteManifest, pathname: string, request?: Request, initialData?: InitialRouteData, cache?: Cache, options?: {
|
|
87
87
|
documentContributions?: boolean;
|
|
88
88
|
}): Promise<PendingRouteMatch>;
|
|
89
|
-
export declare function collectStaticRoutePaths(manifest: RouteManifest
|
|
89
|
+
export declare function collectStaticRoutePaths(manifest: RouteManifest, options?: {
|
|
90
|
+
includeResources?: boolean;
|
|
91
|
+
}): Promise<StaticRoutePath[]>;
|
|
90
92
|
export declare function loadLoadingFallback(manifest: RouteManifest, pathname: string): Promise<ComponentType | undefined>;
|
|
91
93
|
export declare function loadErrorFallback(manifest: RouteManifest, pathname: string): Promise<ComponentType<RouteErrorProps> | undefined>;
|
|
92
94
|
export declare function loadNotFoundMatch(manifest: RouteManifest, pathname: string, options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/router/manifest.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/router/manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/static/index.d.ts
CHANGED
|
@@ -10,8 +10,13 @@ export type StaticOutputEntry = {
|
|
|
10
10
|
export type StaticOutputManifest = {
|
|
11
11
|
adapter: "static";
|
|
12
12
|
entries: StaticOutputEntry[];
|
|
13
|
+
fileHeaderRules: StaticOutputFileHeaderRule[];
|
|
13
14
|
version: 1;
|
|
14
15
|
};
|
|
16
|
+
export type StaticOutputFileHeaderRule = {
|
|
17
|
+
headers: Record<string, string>;
|
|
18
|
+
pattern: string;
|
|
19
|
+
};
|
|
15
20
|
export type GenerateStaticOutputOptions = {
|
|
16
21
|
onError?: RequestErrorReporter;
|
|
17
22
|
origin?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/static/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/static/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAmB,aAAa,EAAe,MAAM,UAAU,CAAC;AAC5E,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AAUnB,eAAO,MAAM,aAAa,sBAKxB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,QAAQ,CAAC;IAClB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,eAAe,EAAE,0BAA0B,EAAE,CAAC;IAC9C,OAAO,EAAE,CAAC,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB,CAAC;AAcF,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,oBAAoB,CAAC,CAuE/B"}
|