@interchained/portal-cli 0.1.6 → 0.1.7

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.
@@ -0,0 +1,16 @@
1
+ /**
2
+ * portal compress [dir] — pre-compress build output to disk.
3
+ *
4
+ * Writes a .br (Brotli q11) and .gz (gzip q9) sibling next to every
5
+ * compressible asset, so a reverse proxy (nginx brotli_static / gzip_static,
6
+ * Caddy, etc.) can serve the precompressed bytes with zero CPU at request time.
7
+ *
8
+ * Pairs with `portal build`:
9
+ * portal build && portal compress dist
10
+ *
11
+ * Then in nginx:
12
+ * brotli_static on;
13
+ * gzip_static on;
14
+ */
15
+ export declare function compressCommand(dir?: string): Promise<void>;
16
+ //# sourceMappingURL=compress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress.d.ts","sourceRoot":"","sources":["../../src/commands/compress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA8BH,wBAAsB,eAAe,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAkGjE"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * portal compress [dir] — pre-compress build output to disk.
3
+ *
4
+ * Writes a .br (Brotli q11) and .gz (gzip q9) sibling next to every
5
+ * compressible asset, so a reverse proxy (nginx brotli_static / gzip_static,
6
+ * Caddy, etc.) can serve the precompressed bytes with zero CPU at request time.
7
+ *
8
+ * Pairs with `portal build`:
9
+ * portal build && portal compress dist
10
+ *
11
+ * Then in nginx:
12
+ * brotli_static on;
13
+ * gzip_static on;
14
+ */
15
+ import { readdir, readFile, writeFile, stat } from "node:fs/promises";
16
+ import { join, relative, extname, sep } from "node:path";
17
+ import { brotliCompressSync, gzipSync, constants as zc } from "node:zlib";
18
+ import pc from "picocolors";
19
+ import { banner, header, success, info, step, blank, icon } from "../utils/print.js";
20
+ const COMPRESSIBLE_EXT = new Set([
21
+ ".html", ".js", ".mjs", ".css", ".json", ".map",
22
+ ".svg", ".txt", ".xml", ".webmanifest", ".wasm",
23
+ ]);
24
+ function fmtBytes(n) {
25
+ if (n < 1024)
26
+ return `${n} B`;
27
+ if (n < 1024 * 1024)
28
+ return `${(n / 1024).toFixed(1)} KB`;
29
+ return `${(n / 1024 / 1024).toFixed(2)} MB`;
30
+ }
31
+ async function walk(dir) {
32
+ const out = [];
33
+ const entries = await readdir(dir, { withFileTypes: true });
34
+ for (const e of entries) {
35
+ const full = join(dir, e.name);
36
+ if (e.isDirectory())
37
+ out.push(...(await walk(full)));
38
+ else if (e.isFile())
39
+ out.push(full);
40
+ }
41
+ return out;
42
+ }
43
+ export async function compressCommand(dir = "dist") {
44
+ banner();
45
+ header("Portal Compress");
46
+ const root = process.cwd();
47
+ const target = join(root, dir);
48
+ try {
49
+ const st = await stat(target);
50
+ if (!st.isDirectory())
51
+ throw new Error();
52
+ }
53
+ catch {
54
+ blank();
55
+ console.log(`${icon.fail} ${pc.red(`No directory at ${pc.bold(dir)}`)}`);
56
+ console.log(pc.dim(" Run portal build first."));
57
+ blank();
58
+ process.exit(1);
59
+ }
60
+ blank();
61
+ step(`Compressing ${pc.bold(dir)}/ …`);
62
+ blank();
63
+ const files = (await walk(target)).filter((f) => !f.endsWith(".br") &&
64
+ !f.endsWith(".gz") &&
65
+ COMPRESSIBLE_EXT.has(extname(f).toLowerCase()));
66
+ let rawTotal = 0;
67
+ let brTotal = 0;
68
+ let gzTotal = 0;
69
+ let written = 0;
70
+ let skipped = 0;
71
+ for (const file of files) {
72
+ const raw = await readFile(file);
73
+ if (raw.length < 256) {
74
+ skipped++;
75
+ continue;
76
+ }
77
+ const br = brotliCompressSync(raw, {
78
+ params: {
79
+ [zc.BROTLI_PARAM_QUALITY]: 11,
80
+ [zc.BROTLI_PARAM_SIZE_HINT]: raw.length,
81
+ },
82
+ });
83
+ const gz = gzipSync(raw, { level: 9 });
84
+ let wroteAny = false;
85
+ if (br.length < raw.length * 0.98) {
86
+ await writeFile(file + ".br", br);
87
+ brTotal += br.length;
88
+ wroteAny = true;
89
+ }
90
+ else {
91
+ brTotal += raw.length;
92
+ }
93
+ if (gz.length < raw.length * 0.98) {
94
+ await writeFile(file + ".gz", gz);
95
+ gzTotal += gz.length;
96
+ wroteAny = true;
97
+ }
98
+ else {
99
+ gzTotal += raw.length;
100
+ }
101
+ rawTotal += raw.length;
102
+ if (wroteAny) {
103
+ written++;
104
+ const rel = relative(target, file).split(sep).join("/");
105
+ const pct = ((1 - br.length / raw.length) * 100).toFixed(0);
106
+ console.log(` ${icon.pass} ${rel.padEnd(40).slice(0, 40)} ` +
107
+ pc.dim(fmtBytes(raw.length).padStart(9)) +
108
+ pc.dim(" → ") +
109
+ pc.green(fmtBytes(br.length).padStart(9)) +
110
+ pc.yellow(` −${pct}%`));
111
+ }
112
+ else {
113
+ skipped++;
114
+ }
115
+ }
116
+ const brPct = rawTotal ? ((1 - brTotal / rawTotal) * 100).toFixed(1) : "0";
117
+ const gzPct = rawTotal ? ((1 - gzTotal / rawTotal) * 100).toFixed(1) : "0";
118
+ blank();
119
+ success(`Compressed ${written} file${written === 1 ? "" : "s"}${skipped ? pc.dim(` (${skipped} skipped)`) : ""}`);
120
+ console.log(pc.dim(" raw ") + pc.white(fmtBytes(rawTotal).padStart(10)));
121
+ console.log(pc.dim(" gzip ") + pc.green(fmtBytes(gzTotal).padStart(10)) + pc.dim(` −${gzPct}%`));
122
+ console.log(pc.dim(" brotli ") + pc.green(fmtBytes(brTotal).padStart(10)) + pc.dim(` −${brPct}%`) +
123
+ pc.yellow(` ${icon.spark} ${fmtBytes(rawTotal - brTotal)} smaller`));
124
+ blank();
125
+ info("Enable in nginx with: brotli_static on; gzip_static on;");
126
+ blank();
127
+ }
128
+ //# sourceMappingURL=compress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress.js","sourceRoot":"","sources":["../../src/commands/compress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * portal serve — hardened, in-memory production server.
3
+ *
4
+ * ── Novel optimizations ──────────────────────────────────────────────────────
5
+ * 1. Boot-time asset pipeline. Every file in the build dir is read, hashed,
6
+ * and (if compressible) Brotli(11) + gzip(9) compressed ONCE at startup and
7
+ * held in memory. There is zero disk I/O on the hot path — every response
8
+ * is a buffer slice.
9
+ * 2. HTTP 103 Early Hints. index.html is parsed a single time at boot; its
10
+ * critical modulepreload / stylesheet / preload links are streamed to the
11
+ * browser as a 103 response BEFORE the 200 body. The browser starts
12
+ * fetching JS/CSS during the server's think-time and the TLS round-trips
13
+ * it would otherwise spend idle. Most static servers cannot do this.
14
+ * 3. Content-hash strong ETags → instant 304 Not Modified. Fingerprinted
15
+ * assets get immutable year-long caching; HTML is always revalidated.
16
+ * 4. Per-request content negotiation: br > gzip > identity from Accept-Encoding.
17
+ *
18
+ * ── Hardening ────────────────────────────────────────────────────────────────
19
+ * - Full security header suite (CSP, HSTS, COOP, CORP, frame/sniff/referrer,
20
+ * permissions policy).
21
+ * - Path-traversal proof (decoded, normalized, scoped to the build dir).
22
+ * - Method allowlist (GET / HEAD only).
23
+ * - Range requests for media streaming.
24
+ * - Graceful shutdown (drains in-flight requests on SIGTERM / SIGINT).
25
+ * - Liveness (/__health) + readiness (/__ready) endpoints.
26
+ */
27
+ export interface ServeOptions {
28
+ port?: number;
29
+ host?: string;
30
+ dir?: string;
31
+ csp?: boolean;
32
+ hsts?: boolean;
33
+ earlyHints?: boolean;
34
+ cors?: boolean;
35
+ }
36
+ export declare function serveCommand(opts?: ServeOptions): Promise<void>;
37
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAuRH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0PzE"}
@@ -0,0 +1,488 @@
1
+ /**
2
+ * portal serve — hardened, in-memory production server.
3
+ *
4
+ * ── Novel optimizations ──────────────────────────────────────────────────────
5
+ * 1. Boot-time asset pipeline. Every file in the build dir is read, hashed,
6
+ * and (if compressible) Brotli(11) + gzip(9) compressed ONCE at startup and
7
+ * held in memory. There is zero disk I/O on the hot path — every response
8
+ * is a buffer slice.
9
+ * 2. HTTP 103 Early Hints. index.html is parsed a single time at boot; its
10
+ * critical modulepreload / stylesheet / preload links are streamed to the
11
+ * browser as a 103 response BEFORE the 200 body. The browser starts
12
+ * fetching JS/CSS during the server's think-time and the TLS round-trips
13
+ * it would otherwise spend idle. Most static servers cannot do this.
14
+ * 3. Content-hash strong ETags → instant 304 Not Modified. Fingerprinted
15
+ * assets get immutable year-long caching; HTML is always revalidated.
16
+ * 4. Per-request content negotiation: br > gzip > identity from Accept-Encoding.
17
+ *
18
+ * ── Hardening ────────────────────────────────────────────────────────────────
19
+ * - Full security header suite (CSP, HSTS, COOP, CORP, frame/sniff/referrer,
20
+ * permissions policy).
21
+ * - Path-traversal proof (decoded, normalized, scoped to the build dir).
22
+ * - Method allowlist (GET / HEAD only).
23
+ * - Range requests for media streaming.
24
+ * - Graceful shutdown (drains in-flight requests on SIGTERM / SIGINT).
25
+ * - Liveness (/__health) + readiness (/__ready) endpoints.
26
+ */
27
+ import { createServer } from "node:http";
28
+ import { readdir, readFile, stat } from "node:fs/promises";
29
+ import { join, resolve, relative, extname, sep, posix } from "node:path";
30
+ import { createHash } from "node:crypto";
31
+ import { brotliCompressSync, gzipSync, constants as zc, } from "node:zlib";
32
+ import pc from "picocolors";
33
+ import { banner, header, success, info, step, blank, icon } from "../utils/print.js";
34
+ // ── MIME types ────────────────────────────────────────────────────────────────
35
+ const MIME = {
36
+ ".html": "text/html; charset=utf-8",
37
+ ".js": "application/javascript; charset=utf-8",
38
+ ".mjs": "application/javascript; charset=utf-8",
39
+ ".css": "text/css; charset=utf-8",
40
+ ".json": "application/json; charset=utf-8",
41
+ ".map": "application/json; charset=utf-8",
42
+ ".svg": "image/svg+xml",
43
+ ".ico": "image/x-icon",
44
+ ".png": "image/png",
45
+ ".jpg": "image/jpeg",
46
+ ".jpeg": "image/jpeg",
47
+ ".gif": "image/gif",
48
+ ".webp": "image/webp",
49
+ ".avif": "image/avif",
50
+ ".woff": "font/woff",
51
+ ".woff2": "font/woff2",
52
+ ".ttf": "font/ttf",
53
+ ".otf": "font/otf",
54
+ ".eot": "application/vnd.ms-fontobject",
55
+ ".wasm": "application/wasm",
56
+ ".txt": "text/plain; charset=utf-8",
57
+ ".xml": "application/xml; charset=utf-8",
58
+ ".webmanifest": "application/manifest+json",
59
+ ".mp4": "video/mp4",
60
+ ".webm": "video/webm",
61
+ ".mp3": "audio/mpeg",
62
+ ".pdf": "application/pdf",
63
+ };
64
+ const COMPRESSIBLE = new Set([
65
+ "text/html",
66
+ "application/javascript",
67
+ "text/css",
68
+ "application/json",
69
+ "image/svg+xml",
70
+ "text/plain",
71
+ "application/xml",
72
+ "application/manifest+json",
73
+ ]);
74
+ function mimeFor(path) {
75
+ return MIME[extname(path).toLowerCase()] ?? "application/octet-stream";
76
+ }
77
+ function isCompressible(mime) {
78
+ const base = mime.split(";")[0].trim();
79
+ return COMPRESSIBLE.has(base);
80
+ }
81
+ /** Vite/webpack fingerprints look like name.a1b2c3d4.js — safe to cache forever. */
82
+ function isFingerprinted(path) {
83
+ return /\.[a-f0-9]{8,}\.[a-z0-9]+$/i.test(path);
84
+ }
85
+ // ── Boot-time pipeline ────────────────────────────────────────────────────────
86
+ async function walk(dir) {
87
+ const out = [];
88
+ const entries = await readdir(dir, { withFileTypes: true });
89
+ for (const e of entries) {
90
+ const full = join(dir, e.name);
91
+ if (e.isDirectory())
92
+ out.push(...(await walk(full)));
93
+ else if (e.isFile())
94
+ out.push(full);
95
+ }
96
+ return out;
97
+ }
98
+ async function buildAssetMap(distDir) {
99
+ const files = await walk(distDir);
100
+ const assets = new Map();
101
+ const report = {
102
+ files: 0,
103
+ rawBytes: 0,
104
+ brBytes: 0,
105
+ gzBytes: 0,
106
+ compressedFiles: 0,
107
+ };
108
+ for (const file of files) {
109
+ // Never serve the precompressed siblings directly.
110
+ if (file.endsWith(".br") || file.endsWith(".gz"))
111
+ continue;
112
+ const raw = await readFile(file);
113
+ const st = await stat(file);
114
+ const rel = relative(distDir, file).split(sep).join(posix.sep);
115
+ const urlPath = "/" + rel;
116
+ const mime = mimeFor(file);
117
+ const hash = createHash("sha256").update(raw).digest("hex").slice(0, 16);
118
+ const cacheControl = mime.startsWith("text/html")
119
+ ? "no-cache"
120
+ : isFingerprinted(file)
121
+ ? "public, max-age=31536000, immutable"
122
+ : "public, max-age=3600, must-revalidate";
123
+ const asset = {
124
+ urlPath,
125
+ mime,
126
+ etag: `"${hash}"`,
127
+ cacheControl,
128
+ raw,
129
+ lastModified: st.mtime.toUTCString(),
130
+ };
131
+ // Compress once, in memory, at max quality — only keep it if it actually wins.
132
+ if (isCompressible(mime) && raw.length >= 256) {
133
+ const br = brotliCompressSync(raw, {
134
+ params: {
135
+ [zc.BROTLI_PARAM_QUALITY]: 11,
136
+ [zc.BROTLI_PARAM_SIZE_HINT]: raw.length,
137
+ },
138
+ });
139
+ const gz = gzipSync(raw, { level: 9 });
140
+ if (br.length < raw.length * 0.98)
141
+ asset.br = br;
142
+ if (gz.length < raw.length * 0.98)
143
+ asset.gz = gz;
144
+ if (asset.br || asset.gz)
145
+ report.compressedFiles++;
146
+ }
147
+ assets.set(urlPath, asset);
148
+ report.files++;
149
+ report.rawBytes += raw.length;
150
+ report.brBytes += (asset.br ?? raw).length;
151
+ report.gzBytes += (asset.gz ?? raw).length;
152
+ }
153
+ return { assets, report };
154
+ }
155
+ function extractEarlyHints(html) {
156
+ const hints = [];
157
+ const seen = new Set();
158
+ const push = (href, as, rel) => {
159
+ if (!href || href.startsWith("http") || href.startsWith("//"))
160
+ return;
161
+ const key = rel + "|" + href;
162
+ if (seen.has(key))
163
+ return;
164
+ seen.add(key);
165
+ hints.push({ href, as, rel });
166
+ };
167
+ // <link rel="modulepreload" href="...">
168
+ for (const m of html.matchAll(/<link\b[^>]*rel=["']modulepreload["'][^>]*>/gi)) {
169
+ const href = /href=["']([^"']+)["']/i.exec(m[0])?.[1];
170
+ if (href)
171
+ push(href, "script", "modulepreload");
172
+ }
173
+ // <link rel="stylesheet" href="...">
174
+ for (const m of html.matchAll(/<link\b[^>]*rel=["']stylesheet["'][^>]*>/gi)) {
175
+ const href = /href=["']([^"']+)["']/i.exec(m[0])?.[1];
176
+ if (href)
177
+ push(href, "style", "preload");
178
+ }
179
+ // <link rel="preload" as="..." href="...">
180
+ for (const m of html.matchAll(/<link\b[^>]*rel=["']preload["'][^>]*>/gi)) {
181
+ const href = /href=["']([^"']+)["']/i.exec(m[0])?.[1];
182
+ const as = /as=["']([^"']+)["']/i.exec(m[0])?.[1] ?? "fetch";
183
+ if (href)
184
+ push(href, as, "preload");
185
+ }
186
+ // <script type="module" src="..."> — the entry chunk
187
+ for (const m of html.matchAll(/<script\b[^>]*type=["']module["'][^>]*>/gi)) {
188
+ const src = /src=["']([^"']+)["']/i.exec(m[0])?.[1];
189
+ if (src)
190
+ push(src, "script", "modulepreload");
191
+ }
192
+ return hints.map((h) => h.rel === "modulepreload"
193
+ ? `<${h.href}>; rel=modulepreload`
194
+ : `<${h.href}>; rel=${h.rel}; as=${h.as}` +
195
+ (h.as === "font" ? "; crossorigin" : ""));
196
+ }
197
+ // ── Security headers ──────────────────────────────────────────────────────────
198
+ function securityHeaders(opts) {
199
+ const h = {
200
+ "X-Content-Type-Options": "nosniff",
201
+ "X-Frame-Options": "DENY",
202
+ "Referrer-Policy": "strict-origin-when-cross-origin",
203
+ "Permissions-Policy": "camera=(), microphone=(), geolocation=(), browsing-topics=()",
204
+ "Cross-Origin-Opener-Policy": "same-origin",
205
+ "Cross-Origin-Resource-Policy": "same-origin",
206
+ "X-DNS-Prefetch-Control": "off",
207
+ };
208
+ if (opts.hsts) {
209
+ h["Strict-Transport-Security"] = "max-age=63072000; includeSubDomains; preload";
210
+ }
211
+ if (opts.csp) {
212
+ h["Content-Security-Policy"] = [
213
+ "default-src 'self'",
214
+ "script-src 'self'",
215
+ "style-src 'self' 'unsafe-inline'",
216
+ "img-src 'self' data: blob: https:",
217
+ "font-src 'self' data:",
218
+ "connect-src 'self' https: wss:",
219
+ "media-src 'self' https: data: blob:",
220
+ "object-src 'none'",
221
+ "base-uri 'self'",
222
+ "form-action 'self'",
223
+ "frame-ancestors 'none'",
224
+ "upgrade-insecure-requests",
225
+ ].join("; ");
226
+ }
227
+ return h;
228
+ }
229
+ // ── Helpers ───────────────────────────────────────────────────────────────────
230
+ function pickEncoding(accept, asset) {
231
+ if (!accept)
232
+ return null;
233
+ const a = accept.toLowerCase();
234
+ if (asset.br && a.includes("br"))
235
+ return "br";
236
+ if (asset.gz && a.includes("gzip"))
237
+ return "gzip";
238
+ return null;
239
+ }
240
+ function fmtBytes(n) {
241
+ if (n < 1024)
242
+ return `${n} B`;
243
+ if (n < 1024 * 1024)
244
+ return `${(n / 1024).toFixed(1)} KB`;
245
+ return `${(n / 1024 / 1024).toFixed(2)} MB`;
246
+ }
247
+ function parseRange(header, size) {
248
+ const m = /^bytes=(\d*)-(\d*)$/.exec(header.trim());
249
+ if (!m)
250
+ return null;
251
+ let start = m[1] === "" ? NaN : parseInt(m[1], 10);
252
+ let end = m[2] === "" ? NaN : parseInt(m[2], 10);
253
+ if (Number.isNaN(start) && Number.isNaN(end))
254
+ return null;
255
+ if (Number.isNaN(start)) {
256
+ start = size - end;
257
+ end = size - 1;
258
+ }
259
+ else if (Number.isNaN(end)) {
260
+ end = size - 1;
261
+ }
262
+ if (start > end || start < 0 || end >= size)
263
+ return null;
264
+ return { start, end };
265
+ }
266
+ export async function serveCommand(opts = {}) {
267
+ banner();
268
+ header("Portal Serve");
269
+ const root = process.cwd();
270
+ const distDir = resolve(root, opts.dir ?? "dist");
271
+ const port = opts.port ?? Number(process.env["PORT"] ?? 4173);
272
+ const host = opts.host ?? "0.0.0.0";
273
+ const useCsp = opts.csp !== false;
274
+ const useHsts = opts.hsts !== false;
275
+ const useHints = opts.earlyHints !== false;
276
+ // Verify build output exists
277
+ try {
278
+ const st = await stat(distDir);
279
+ if (!st.isDirectory())
280
+ throw new Error("not a directory");
281
+ }
282
+ catch {
283
+ blank();
284
+ console.log(`${icon.fail} ${pc.red(`No build found at ${pc.bold(relative(root, distDir) || ".")}`)}`);
285
+ console.log(pc.dim(" Run portal build first."));
286
+ blank();
287
+ process.exit(1);
288
+ }
289
+ blank();
290
+ step("Building in-memory asset pipeline…");
291
+ const t0 = Date.now();
292
+ const { assets, report } = await buildAssetMap(distDir);
293
+ const buildMs = Date.now() - t0;
294
+ if (report.files === 0) {
295
+ console.log(`${icon.fail} ${pc.red("Build directory is empty.")}`);
296
+ process.exit(1);
297
+ }
298
+ // SPA fallback document + its Early Hints, computed once.
299
+ const indexAsset = assets.get("/index.html");
300
+ const earlyHintLinks = useHints && indexAsset
301
+ ? extractEarlyHints(indexAsset.raw.toString("utf-8"))
302
+ : [];
303
+ const secHeaders = securityHeaders({ csp: useCsp, hsts: useHsts });
304
+ // ── Compression report ──────────────────────────────────────────────────────
305
+ const brSaved = report.rawBytes - report.brBytes;
306
+ const brPct = report.rawBytes ? (brSaved / report.rawBytes) * 100 : 0;
307
+ const gzSaved = report.rawBytes - report.gzBytes;
308
+ const gzPct = report.rawBytes ? (gzSaved / report.rawBytes) * 100 : 0;
309
+ blank();
310
+ success(`Pipeline ready in ${pc.bold(buildMs + "ms")}`);
311
+ console.log(pc.dim(" ") +
312
+ `${report.files} files ${icon.dot} ${report.compressedFiles} compressed ${icon.dot} ${earlyHintLinks.length} early hints`);
313
+ blank();
314
+ console.log(pc.bold(" Compression"));
315
+ console.log(pc.dim(" raw ") + pc.white(fmtBytes(report.rawBytes).padStart(10)));
316
+ console.log(pc.dim(" gzip ") +
317
+ pc.green(fmtBytes(report.gzBytes).padStart(10)) +
318
+ pc.dim(` −${gzPct.toFixed(1)}%`));
319
+ console.log(pc.dim(" brotli ") +
320
+ pc.green(fmtBytes(report.brBytes).padStart(10)) +
321
+ pc.dim(` −${brPct.toFixed(1)}%`) +
322
+ pc.yellow(` ${icon.spark} saves ${fmtBytes(brSaved)} per full load`));
323
+ blank();
324
+ // ── Request handler ─────────────────────────────────────────────────────────
325
+ let inFlight = 0;
326
+ let ready = true;
327
+ const server = createServer((req, res) => {
328
+ inFlight++;
329
+ const started = Date.now();
330
+ res.on("finish", () => {
331
+ inFlight--;
332
+ const ms = Date.now() - started;
333
+ const code = res.statusCode;
334
+ const color = code >= 500 ? pc.red : code >= 400 ? pc.yellow : code >= 300 ? pc.cyan : pc.green;
335
+ console.log(pc.dim(new Date().toISOString().slice(11, 19)) + " " +
336
+ color(String(code)) + " " +
337
+ pc.dim((req.method ?? "?").padEnd(4)) +
338
+ (req.url ?? "") + " " +
339
+ pc.dim(`${ms}ms`));
340
+ });
341
+ // Method allowlist
342
+ if (req.method !== "GET" && req.method !== "HEAD") {
343
+ res.writeHead(405, { "Allow": "GET, HEAD", ...secHeaders });
344
+ res.end("Method Not Allowed");
345
+ return;
346
+ }
347
+ // Health / readiness
348
+ const rawUrl = req.url ?? "/";
349
+ if (rawUrl === "/__health") {
350
+ res.writeHead(200, { "Content-Type": "application/json", "Cache-Control": "no-store" });
351
+ res.end(JSON.stringify({ status: "ok", uptime: process.uptime() }));
352
+ return;
353
+ }
354
+ if (rawUrl === "/__ready") {
355
+ res.writeHead(ready ? 200 : 503, { "Content-Type": "application/json", "Cache-Control": "no-store" });
356
+ res.end(JSON.stringify({ ready }));
357
+ return;
358
+ }
359
+ // Resolve + sanitize path
360
+ let pathname;
361
+ try {
362
+ pathname = decodeURIComponent(new URL(rawUrl, "http://localhost").pathname);
363
+ }
364
+ catch {
365
+ res.writeHead(400, secHeaders);
366
+ res.end("Bad Request");
367
+ return;
368
+ }
369
+ // Normalize and reject traversal
370
+ const norm = posix.normalize(pathname);
371
+ if (norm.includes("\0") || norm.startsWith("../")) {
372
+ res.writeHead(403, secHeaders);
373
+ res.end("Forbidden");
374
+ return;
375
+ }
376
+ // Lookup: exact → directory index → SPA fallback
377
+ let asset = assets.get(norm) ??
378
+ (norm.endsWith("/") ? assets.get(norm + "index.html") : undefined);
379
+ let isFallback = false;
380
+ if (!asset) {
381
+ // Static asset miss (has an extension) → 404
382
+ if (extname(norm)) {
383
+ res.writeHead(404, { "Content-Type": "text/plain", ...secHeaders });
384
+ res.end("Not Found");
385
+ return;
386
+ }
387
+ // Otherwise serve the SPA shell
388
+ asset = indexAsset;
389
+ isFallback = true;
390
+ }
391
+ if (!asset) {
392
+ res.writeHead(404, { "Content-Type": "text/plain", ...secHeaders });
393
+ res.end("Not Found");
394
+ return;
395
+ }
396
+ // Conditional request → 304
397
+ const inm = req.headers["if-none-match"];
398
+ if (inm && inm === asset.etag) {
399
+ res.writeHead(304, {
400
+ "ETag": asset.etag,
401
+ "Cache-Control": asset.cacheControl,
402
+ ...secHeaders,
403
+ });
404
+ res.end();
405
+ return;
406
+ }
407
+ const baseHeaders = {
408
+ "Content-Type": asset.mime,
409
+ "ETag": asset.etag,
410
+ "Last-Modified": asset.lastModified,
411
+ "Cache-Control": asset.cacheControl,
412
+ "Vary": "Accept-Encoding",
413
+ ...secHeaders,
414
+ };
415
+ if (opts.cors)
416
+ baseHeaders["Access-Control-Allow-Origin"] = "*";
417
+ // Range requests (only on identity, for media)
418
+ const range = req.headers["range"];
419
+ if (range && !isFallback) {
420
+ const parsed = parseRange(range, asset.raw.length);
421
+ if (parsed) {
422
+ const { start, end } = parsed;
423
+ res.writeHead(206, {
424
+ ...baseHeaders,
425
+ "Content-Range": `bytes ${start}-${end}/${asset.raw.length}`,
426
+ "Accept-Ranges": "bytes",
427
+ "Content-Length": String(end - start + 1),
428
+ });
429
+ res.end(req.method === "HEAD" ? undefined : asset.raw.subarray(start, end + 1));
430
+ return;
431
+ }
432
+ }
433
+ // 🚀 Early Hints — push critical preloads before the HTML body.
434
+ // Fires for the shell document however it was reached: "/", "/index.html",
435
+ // or a deep SPA-fallback route.
436
+ if (asset === indexAsset && earlyHintLinks.length > 0 && typeof res.writeEarlyHints === "function") {
437
+ try {
438
+ res.writeEarlyHints({ link: earlyHintLinks });
439
+ }
440
+ catch { /* proxy may not forward 1xx — harmless */ }
441
+ }
442
+ // Content negotiation
443
+ const enc = pickEncoding(req.headers["accept-encoding"], asset);
444
+ let body = asset.raw;
445
+ if (enc === "br" && asset.br) {
446
+ body = asset.br;
447
+ baseHeaders["Content-Encoding"] = "br";
448
+ }
449
+ else if (enc === "gzip" && asset.gz) {
450
+ body = asset.gz;
451
+ baseHeaders["Content-Encoding"] = "gzip";
452
+ }
453
+ baseHeaders["Content-Length"] = String(body.length);
454
+ if (asset.raw.length && (asset.mime.startsWith("video/") || asset.mime.startsWith("audio/"))) {
455
+ baseHeaders["Accept-Ranges"] = "bytes";
456
+ }
457
+ res.writeHead(200, baseHeaders);
458
+ res.end(req.method === "HEAD" ? undefined : body);
459
+ });
460
+ // ── Graceful shutdown ─────────────────────────────────────────────────────
461
+ let shuttingDown = false;
462
+ const shutdown = (sig) => {
463
+ if (shuttingDown)
464
+ return;
465
+ shuttingDown = true;
466
+ ready = false;
467
+ blank();
468
+ info(`${sig} received — draining ${inFlight} in-flight request${inFlight === 1 ? "" : "s"}…`);
469
+ server.close(() => {
470
+ success("Server closed cleanly.");
471
+ process.exit(0);
472
+ });
473
+ // Hard cap so we never hang a deploy
474
+ setTimeout(() => process.exit(0), 10_000).unref();
475
+ };
476
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
477
+ process.on("SIGINT", () => shutdown("SIGINT"));
478
+ server.listen(port, host, () => {
479
+ success(`Serving ${pc.bold(relative(root, distDir) || ".")} on ${pc.cyan(`http://${host}:${port}`)}`);
480
+ console.log(pc.dim(" security: ") +
481
+ [useCsp && "CSP", useHsts && "HSTS", "COOP", "nosniff", "frame-deny"].filter(Boolean).join(", "));
482
+ console.log(pc.dim(" health: /__health · readiness: /__ready"));
483
+ blank();
484
+ console.log(pc.dim(" Press Ctrl+C to stop."));
485
+ blank();
486
+ });
487
+ }
488
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -10,6 +10,8 @@ import { fileURLToPath } from "node:url";
10
10
  import { devCommand } from "./commands/dev.js";
11
11
  import { buildCommand } from "./commands/build.js";
12
12
  import { previewCommand } from "./commands/preview.js";
13
+ import { serveCommand } from "./commands/serve.js";
14
+ import { compressCommand } from "./commands/compress.js";
13
15
  import { doctorCommand } from "./commands/doctor.js";
14
16
  import { auditCommand } from "./commands/audit.js";
15
17
  import { explainCommand } from "./commands/explain.js";
@@ -50,6 +52,29 @@ program
50
52
  .description("Run the production build locally")
51
53
  .option("-p, --port <number>", "Port", parseInt)
52
54
  .action((opts) => previewCommand(opts));
55
+ program
56
+ .command("serve")
57
+ .description("Hardened in-memory production server (Early Hints, Brotli, security headers)")
58
+ .option("-p, --port <number>", "Port (default 4173 or $PORT)", parseInt)
59
+ .option("-H, --host <host>", "Host to bind (default 0.0.0.0)")
60
+ .option("-d, --dir <dir>", "Build directory to serve", "dist")
61
+ .option("--no-csp", "Disable Content-Security-Policy header")
62
+ .option("--no-hsts", "Disable Strict-Transport-Security header")
63
+ .option("--no-early-hints", "Disable HTTP 103 Early Hints")
64
+ .option("--cors", "Send Access-Control-Allow-Origin: *")
65
+ .action((opts) => serveCommand({
66
+ port: opts.port,
67
+ host: opts.host,
68
+ dir: opts.dir,
69
+ csp: opts.csp,
70
+ hsts: opts.hsts,
71
+ earlyHints: opts.earlyHints,
72
+ cors: opts.cors,
73
+ }));
74
+ program
75
+ .command("compress [dir]")
76
+ .description("Pre-compress build output to disk (.br + .gz) for nginx/Caddy")
77
+ .action((dir) => compressCommand(dir ?? "dist"));
53
78
  // ── Health & docs ─────────────────────────────────────────────────────────────
54
79
  program
55
80
  .command("doctor")
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@interchained/portal-cli",
3
- "version": "0.1.6",
4
- "description": "Portal CLI — dev, build, audit, improve, generate, guard",
3
+ "version": "0.1.7",
4
+ "description": "Portal CLI — dev, build, serve, compress, audit, improve, generate, guard",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "author": "Interchained <dev@interchained.org>",
7
7
  "type": "module",