@interchained/portal-cli 0.1.5 → 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.5",
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",
@@ -21,9 +21,9 @@
21
21
  "prepublishOnly": "npm run typecheck && npm run build"
22
22
  },
23
23
  "dependencies": {
24
- "@interchained/portal-contract": "workspace:*",
25
- "@interchained/portal-agent": "workspace:*",
26
- "@interchained/portal-core": "workspace:*",
24
+ "@interchained/portal-contract": "^0.1.0",
25
+ "@interchained/portal-agent": "^0.1.6",
26
+ "@interchained/portal-core": "^0.1.2",
27
27
  "commander": "^12.0.0",
28
28
  "picocolors": "^1.0.1",
29
29
  "ora": "^8.0.1",