@nexus_js/server 0.7.2 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/actions.d.ts +14 -2
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +235 -25
  4. package/dist/actions.js.map +1 -1
  5. package/dist/constants.d.ts +6 -0
  6. package/dist/constants.d.ts.map +1 -0
  7. package/dist/constants.js +6 -0
  8. package/dist/constants.js.map +1 -0
  9. package/dist/context.d.ts +13 -2
  10. package/dist/context.d.ts.map +1 -1
  11. package/dist/context.js +7 -3
  12. package/dist/context.js.map +1 -1
  13. package/dist/csrf.d.ts.map +1 -1
  14. package/dist/csrf.js +20 -18
  15. package/dist/csrf.js.map +1 -1
  16. package/dist/dev-assets.d.ts +1 -1
  17. package/dist/dev-assets.d.ts.map +1 -1
  18. package/dist/dev-assets.js +7 -3
  19. package/dist/dev-assets.js.map +1 -1
  20. package/dist/dev-error-html.d.ts +19 -0
  21. package/dist/dev-error-html.d.ts.map +1 -0
  22. package/dist/dev-error-html.js +101 -0
  23. package/dist/dev-error-html.js.map +1 -0
  24. package/dist/dev-hot.d.ts +8 -0
  25. package/dist/dev-hot.d.ts.map +1 -0
  26. package/dist/dev-hot.js +30 -0
  27. package/dist/dev-hot.js.map +1 -0
  28. package/dist/dev-vault.d.ts +7 -0
  29. package/dist/dev-vault.d.ts.map +1 -0
  30. package/dist/dev-vault.js +66 -0
  31. package/dist/dev-vault.js.map +1 -0
  32. package/dist/devradar.d.ts +96 -0
  33. package/dist/devradar.d.ts.map +1 -0
  34. package/dist/devradar.js +69 -0
  35. package/dist/devradar.js.map +1 -0
  36. package/dist/handler.d.ts +7 -0
  37. package/dist/handler.d.ts.map +1 -0
  38. package/dist/handler.js +7 -0
  39. package/dist/handler.js.map +1 -0
  40. package/dist/index.d.ts +21 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +187 -27
  43. package/dist/index.js.map +1 -1
  44. package/dist/inspector.d.ts +9 -0
  45. package/dist/inspector.d.ts.map +1 -0
  46. package/dist/inspector.js +8 -0
  47. package/dist/inspector.js.map +1 -0
  48. package/dist/load-module.d.ts +4 -3
  49. package/dist/load-module.d.ts.map +1 -1
  50. package/dist/load-module.js +66 -51
  51. package/dist/load-module.js.map +1 -1
  52. package/dist/logger.d.ts +0 -11
  53. package/dist/logger.d.ts.map +1 -1
  54. package/dist/logger.js +2 -1
  55. package/dist/logger.js.map +1 -1
  56. package/dist/navigate.d.ts.map +1 -1
  57. package/dist/navigate.js +73 -12
  58. package/dist/navigate.js.map +1 -1
  59. package/dist/renderer.d.ts +32 -1
  60. package/dist/renderer.d.ts.map +1 -1
  61. package/dist/renderer.js +268 -46
  62. package/dist/renderer.js.map +1 -1
  63. package/dist/shield-runtime.d.ts +7 -0
  64. package/dist/shield-runtime.d.ts.map +1 -0
  65. package/dist/shield-runtime.js +34 -0
  66. package/dist/shield-runtime.js.map +1 -0
  67. package/dist/streaming.d.ts +14 -3
  68. package/dist/streaming.d.ts.map +1 -1
  69. package/dist/streaming.js +26 -9
  70. package/dist/streaming.js.map +1 -1
  71. package/dist/streaming.test.d.ts +2 -0
  72. package/dist/streaming.test.d.ts.map +1 -0
  73. package/dist/streaming.test.js +63 -0
  74. package/dist/streaming.test.js.map +1 -0
  75. package/package.json +32 -7
package/dist/csrf.js CHANGED
@@ -21,11 +21,14 @@ import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
21
21
  /** Token lifetime — 15 minutes. Matches typical form interaction time. */
22
22
  const ACTION_TOKEN_TTL_MS = 15 * 60 * 1_000;
23
23
  /**
24
- * In-memory set of consumed tokens. In a multi-process / serverless deployment
25
- * this should be backed by Redis or a distributed cache. For single-process
26
- * (Node.js server) this is sufficient.
24
+ * In-memory store of consumed tokens mapped to their expiry time.
25
+ * Map<token, expiresAtMs> tokens are evicted when they expire so the
26
+ * store stays bounded without needing a count-based heuristic.
27
+ *
28
+ * In a multi-process / serverless deployment this should be backed by Redis
29
+ * or a distributed cache. For single-process (Node.js server) this is sufficient.
27
30
  */
28
- const USED_TOKENS = new Set();
31
+ const USED_TOKENS = new Map();
29
32
  /** Request header name for the action token. */
30
33
  export const ACTION_TOKEN_HEADER = 'x-nexus-action-token';
31
34
  // ── Token generation ──────────────────────────────────────────────────────────
@@ -91,8 +94,9 @@ export function validateActionToken(token, sessionId, actionName, secret) {
91
94
  if (Date.now() - issuedAt > ACTION_TOKEN_TTL_MS) {
92
95
  return { valid: false, reason: `Token expired (issued ${Math.round((Date.now() - issuedAt) / 60_000)}m ago)` };
93
96
  }
94
- // 7. Consume (burn) the token — prevents replay
95
- USED_TOKENS.add(token);
97
+ // 7. Consume (burn) the token — prevents replay.
98
+ // Store with expiry so pruning is time-based (no false eviction of valid tokens).
99
+ USED_TOKENS.set(token, Date.now() + ACTION_TOKEN_TTL_MS);
96
100
  pruneUsedTokens();
97
101
  return { valid: true };
98
102
  }
@@ -109,20 +113,18 @@ function safeEqual(a, b) {
109
113
  }
110
114
  }
111
115
  /**
112
- * Prune the used-token set to prevent unbounded memory growth.
113
- * Tokens older than TTL are safe to forget they'd fail the expiry check.
116
+ * Prune the used-token map by evicting expired entries.
117
+ * Only tokens within the TTL window can be replayed, so expired tokens are
118
+ * safe to remove — they'd fail the expiry check even if re-presented.
119
+ * This is called after every `validateActionToken` call (O(n) worst-case
120
+ * but amortized O(1) per request under normal traffic).
114
121
  */
115
122
  function pruneUsedTokens() {
116
- if (USED_TOKENS.size < 50_000)
117
- return;
118
- // Tokens are not stored with timestamps — simplest safe eviction is to
119
- // clear the oldest ~10% (insertion-order Set).
120
- const deleteCount = Math.floor(USED_TOKENS.size * 0.1);
121
- const iter = USED_TOKENS.values();
122
- for (let i = 0; i < deleteCount; i++) {
123
- const v = iter.next().value;
124
- if (v !== undefined)
125
- USED_TOKENS.delete(v);
123
+ const now = Date.now();
124
+ for (const [token, expiresAt] of USED_TOKENS) {
125
+ if (now >= expiresAt) {
126
+ USED_TOKENS.delete(token);
127
+ }
126
128
  }
127
129
  }
128
130
  // ── Middleware helper ─────────────────────────────────────────────────────────
package/dist/csrf.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"csrf.js","sourceRoot":"","sources":["../src/csrf.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"csrf.js","sourceRoot":"","sources":["../src/csrf.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ export declare function resolveRuntimeDistDir(appRoot: string): string | null;
10
10
  * Locate `@nexus_js/serialize/dist` — served to the browser at `/_nexus/rt/serialize.js`.
11
11
  */
12
12
  export declare function resolveSerializeDistFile(appRoot: string): string | null;
13
- /** Safe basename-only files under runtime dist (no ..). */
13
+ /** Safe basename-only files under runtime dist (no ..). Allows .js and .map (source maps). */
14
14
  export declare function runtimeModulePath(runtimeDist: string, pathname: string): string | null;
15
15
  /**
16
16
  * Concatenate scoped CSS from every .nx under src/ (routes + components).
@@ -1 +1 @@
1
- {"version":3,"file":"dev-assets.d.ts","sourceRoot":"","sources":["../src/dev-assets.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAepE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWvE;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKtF;AAyBD;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBlF;AAID;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,GAAG,GACP,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA0D3C;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA2BvD"}
1
+ {"version":3,"file":"dev-assets.d.ts","sourceRoot":"","sources":["../src/dev-assets.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAepE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWvE;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKtF;AAyBD;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBlF;AAID;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,GAAG,GACP,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA0D3C;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA+BvD"}
@@ -47,12 +47,12 @@ export function resolveSerializeDistFile(appRoot) {
47
47
  }
48
48
  return null;
49
49
  }
50
- /** Safe basename-only files under runtime dist (no ..). */
50
+ /** Safe basename-only files under runtime dist (no ..). Allows .js and .map (source maps). */
51
51
  export function runtimeModulePath(runtimeDist, pathname) {
52
52
  if (!pathname.startsWith(RT_PREFIX))
53
53
  return null;
54
54
  const name = pathname.slice(RT_PREFIX.length);
55
- if (!/^[\w.-]+\.js$/.test(name) || name.includes('..'))
55
+ if (!/^[\w.-]+\.(js|map)$/.test(name) || name.includes('..'))
56
56
  return null;
57
57
  return join(runtimeDist, name);
58
58
  }
@@ -197,7 +197,11 @@ export async function tryServeRuntimeAsset(pathname, appRoot) {
197
197
  if (!s.isFile())
198
198
  return null;
199
199
  const body = await readFile(file);
200
- return { body, contentType: 'application/javascript; charset=utf-8' };
200
+ const name = pathname.slice(RT_PREFIX.length);
201
+ const contentType = name.endsWith('.map')
202
+ ? 'application/json; charset=utf-8'
203
+ : 'application/javascript; charset=utf-8';
204
+ return { body, contentType };
201
205
  }
202
206
  catch {
203
207
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"dev-assets.js","sourceRoot":"","sources":["../src/dev-assets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev-assets.js","sourceRoot":"","sources":["../src/dev-assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Rich HTML error pages for `dev` mode (stack, Error.cause chain, non-Error serialization).
3
+ */
4
+ /** Message, stack, optional cause chain, and JSON for plain objects. */
5
+ export declare function collectErrorDetails(err: unknown): {
6
+ message: string;
7
+ stack: string;
8
+ causes: string[];
9
+ plain: string;
10
+ };
11
+ /**
12
+ * Full diagnostic page in dev; minimal safe page when `dev` is false.
13
+ */
14
+ export declare function devErrorHtmlPage(opts: {
15
+ context: string;
16
+ err: unknown;
17
+ dev: boolean;
18
+ }): string;
19
+ //# sourceMappingURL=dev-error-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-error-html.d.ts","sourceRoot":"","sources":["../src/dev-error-html.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAwCA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAiD9F"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Rich HTML error pages for `dev` mode (stack, Error.cause chain, non-Error serialization).
3
+ */
4
+ const DOCTYPE = '<!DOCTYPE html>';
5
+ function escapeHtml(s) {
6
+ return s
7
+ .replace(/&/g, '&amp;')
8
+ .replace(/</g, '&lt;')
9
+ .replace(/>/g, '&gt;')
10
+ .replace(/"/g, '&quot;');
11
+ }
12
+ /** Message, stack, optional cause chain, and JSON for plain objects. */
13
+ export function collectErrorDetails(err) {
14
+ const causes = [];
15
+ let stack = '';
16
+ let message = '';
17
+ if (err instanceof Error) {
18
+ message = err.message;
19
+ stack = err.stack ?? '';
20
+ let cur = err.cause;
21
+ let depth = 0;
22
+ while (cur != null && depth < 10) {
23
+ if (cur instanceof Error) {
24
+ causes.push(`${cur.name}: ${cur.message}`);
25
+ cur = cur.cause;
26
+ }
27
+ else {
28
+ causes.push(String(cur));
29
+ break;
30
+ }
31
+ depth++;
32
+ }
33
+ }
34
+ else if (err !== null && typeof err === 'object') {
35
+ try {
36
+ message = JSON.stringify(err);
37
+ }
38
+ catch {
39
+ message = String(err);
40
+ }
41
+ }
42
+ else {
43
+ message = String(err);
44
+ }
45
+ let plain = '';
46
+ if (err !== null && typeof err === 'object' && !(err instanceof Error)) {
47
+ try {
48
+ plain = JSON.stringify(err, null, 2);
49
+ }
50
+ catch {
51
+ plain = String(err);
52
+ }
53
+ }
54
+ return { message, stack, causes, plain };
55
+ }
56
+ /**
57
+ * Full diagnostic page in dev; minimal safe page when `dev` is false.
58
+ */
59
+ export function devErrorHtmlPage(opts) {
60
+ if (!opts.dev) {
61
+ const msg = opts.err instanceof Error ? opts.err.message : String(opts.err);
62
+ return (`${DOCTYPE}<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"></head>` +
63
+ `<body style="font-family:system-ui,sans-serif;padding:2rem;background:#fafafa;color:#111">` +
64
+ `<h1 style="font-size:1.25rem">Something went wrong</h1>` +
65
+ `<p>${escapeHtml(msg)}</p>` +
66
+ `</body></html>`);
67
+ }
68
+ const d = collectErrorDetails(opts.err);
69
+ const causeBlock = d.causes.length > 0
70
+ ? `<section style="margin:0 0 1rem">
71
+ <h2 style="font-size:0.75rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:0.06em;margin:0 0 0.5rem">Cause chain</h2>
72
+ <ol style="margin:0;padding-left:1.2rem;color:#cbd5e1;font-size:0.85rem">${d.causes.map((c) => `<li style="margin:0.25rem 0">${escapeHtml(c)}</li>`).join('')}</ol>
73
+ </section>`
74
+ : '';
75
+ const stackBlock = d.stack
76
+ ? `<details open style="margin:0 0 1rem">
77
+ <summary style="cursor:pointer;color:#64748b;font-size:0.85rem;font-weight:600">Stack trace</summary>
78
+ <pre style="font-size:0.72rem;color:#94a3b8;overflow:auto;max-height:min(52vh,28rem);white-space:pre-wrap;line-height:1.4;margin:0.5rem 0 0;padding:0.75rem;background:#0d0d1a;border-radius:8px;border:1px solid #1e293b">${escapeHtml(d.stack)}</pre>
79
+ </details>`
80
+ : '';
81
+ const plainBlock = d.plain
82
+ ? `<details style="margin:0 0 1rem">
83
+ <summary style="cursor:pointer;color:#64748b;font-size:0.85rem;font-weight:600">Serialized value</summary>
84
+ <pre style="font-size:0.72rem;color:#94a3b8;overflow:auto;max-height:min(28vh,16rem);white-space:pre-wrap;margin:0.5rem 0 0;padding:0.75rem;background:#0d0d1a;border-radius:8px;border:1px solid #1e293b">${escapeHtml(d.plain)}</pre>
85
+ </details>`
86
+ : '';
87
+ return `${DOCTYPE}<html lang="en"><head>
88
+ <meta charset="utf-8">
89
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
90
+ <title>Nexus — ${escapeHtml(opts.context)}</title>
91
+ </head>
92
+ <body style="font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;padding:1.25rem 1.5rem;max-width:56rem;margin:0 auto;background:#0a0a0f;color:#e8e8f0;line-height:1.45">
93
+ <h1 style="margin:0 0 0.5rem;font-size:1.05rem;font-weight:600;color:#f87171">◆ Nexus — ${escapeHtml(opts.context)}</h1>
94
+ <p style="color:#fca5a5;font-size:0.92rem;margin:0 0 1rem;white-space:pre-wrap;border-left:3px solid #f43f5e;padding-left:0.75rem">${escapeHtml(d.message)}</p>
95
+ ${causeBlock}
96
+ ${stackBlock}
97
+ ${plainBlock}
98
+ <p style="margin-top:1rem;font-size:0.72rem;color:#475569">Development mode: full diagnostics. Production responses omit stack traces.</p>
99
+ </body></html>`;
100
+ }
101
+ //# sourceMappingURL=dev-error-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-error-html.js","sourceRoot":"","sources":["../src/dev-error-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Dev hot-reload — Server-Sent Events so the browser refreshes after `server.reload()`.
3
+ */
4
+ import type { IncomingMessage, ServerResponse } from 'node:http';
5
+ export declare function subscribeDevHotClient(req: IncomingMessage, res: ServerResponse): void;
6
+ /** Notify every open tab to reload (after route manifest / caches refresh). */
7
+ export declare function broadcastDevHotReload(): void;
8
+ //# sourceMappingURL=dev-hot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-hot.d.ts","sourceRoot":"","sources":["../src/dev-hot.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAerF;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,IAAI,IAAI,CAS5C"}
@@ -0,0 +1,30 @@
1
+ const clients = new Set();
2
+ export function subscribeDevHotClient(req, res) {
3
+ req.socket.setTimeout(0);
4
+ res.writeHead(200, {
5
+ 'content-type': 'text/event-stream; charset=utf-8',
6
+ 'cache-control': 'no-cache, no-transform',
7
+ connection: 'keep-alive',
8
+ 'x-accel-buffering': 'no',
9
+ });
10
+ res.write(': nexus dev hot\n\n');
11
+ clients.add(res);
12
+ const done = () => {
13
+ clients.delete(res);
14
+ };
15
+ res.on('close', done);
16
+ req.on('close', done);
17
+ }
18
+ /** Notify every open tab to reload (after route manifest / caches refresh). */
19
+ export function broadcastDevHotReload() {
20
+ const chunk = 'event: reload\ndata: {}\n\n';
21
+ for (const res of [...clients]) {
22
+ try {
23
+ res.write(chunk);
24
+ }
25
+ catch {
26
+ clients.delete(res);
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=dev-hot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-hot.js","sourceRoot":"","sources":["../src/dev-hot.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE1C,MAAM,UAAU,qBAAqB,CAAC,GAAoB,EAAE,GAAmB;IAC7E,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAS,kCAAkC;QACzD,eAAe,EAAQ,wBAAwB;QAC/C,UAAU,EAAa,YAAY;QACnC,mBAAmB,EAAI,IAAI;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACtB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,qBAAqB;IACnC,MAAM,KAAK,GAAG,6BAA6B,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Dev-only HTTP API to patch Vault-lite without restarting the server.
3
+ * POST /_nexus/dev/vault — body: `{ patch: Record<string,string>, replace?: boolean }`
4
+ * Optional auth: `NEXUS_DEV_VAULT_TOKEN` → require `Authorization: Bearer …` or `x-nexus-dev-vault-token`.
5
+ */
6
+ export declare function handleDevVaultPost(request: Request): Promise<Response>;
7
+ //# sourceMappingURL=dev-vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-vault.d.ts","sourceRoot":"","sources":["../src/dev-vault.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgE5E"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Dev-only HTTP API to patch Vault-lite without restarting the server.
3
+ * POST /_nexus/dev/vault — body: `{ patch: Record<string,string>, replace?: boolean }`
4
+ * Optional auth: `NEXUS_DEV_VAULT_TOKEN` → require `Authorization: Bearer …` or `x-nexus-dev-vault-token`.
5
+ */
6
+ import { nexusVault } from '@nexus_js/security';
7
+ import { emitDevRadar } from './devradar.js';
8
+ export async function handleDevVaultPost(request) {
9
+ const token = process.env['NEXUS_DEV_VAULT_TOKEN'];
10
+ if (token !== undefined && token !== '') {
11
+ const auth = request.headers.get('authorization');
12
+ const hdr = request.headers.get('x-nexus-dev-vault-token');
13
+ const ok = auth === `Bearer ${token}` || hdr === token;
14
+ if (!ok) {
15
+ return new Response(JSON.stringify({ error: 'Unauthorized', status: 401 }), {
16
+ status: 401,
17
+ headers: { 'content-type': 'application/json' },
18
+ });
19
+ }
20
+ }
21
+ let body;
22
+ try {
23
+ body = await request.json();
24
+ }
25
+ catch {
26
+ return new Response(JSON.stringify({ error: 'Invalid JSON', status: 400 }), {
27
+ status: 400,
28
+ headers: { 'content-type': 'application/json' },
29
+ });
30
+ }
31
+ if (typeof body !== 'object' || body === null || !('patch' in body)) {
32
+ return new Response(JSON.stringify({ error: 'Expected { patch: Record<string,string>, replace?: boolean }', status: 400 }), { status: 400, headers: { 'content-type': 'application/json' } });
33
+ }
34
+ const rawPatch = body.patch;
35
+ if (typeof rawPatch !== 'object' || rawPatch === null) {
36
+ return new Response(JSON.stringify({ error: 'patch must be an object', status: 400 }), {
37
+ status: 400,
38
+ headers: { 'content-type': 'application/json' },
39
+ });
40
+ }
41
+ const replace = body.replace === true;
42
+ const entries = {};
43
+ for (const [k, v] of Object.entries(rawPatch)) {
44
+ if (typeof v === 'string')
45
+ entries[k] = v;
46
+ else if (v === null || v === undefined)
47
+ entries[k] = '';
48
+ else
49
+ entries[k] = String(v);
50
+ }
51
+ if (replace)
52
+ nexusVault.replaceAll(entries);
53
+ else
54
+ nexusVault.patch(entries);
55
+ emitDevRadar({
56
+ type: 'security:audit',
57
+ payload: {
58
+ kind: 'vault_updated',
59
+ message: replace
60
+ ? `Vault replaced (${Object.keys(entries).length} keys)`
61
+ : `Vault patched (${Object.keys(entries).length} keys)`,
62
+ },
63
+ });
64
+ return new Response(JSON.stringify({ ok: true, keys: Object.keys(entries).length, replace }), { status: 200, headers: { 'content-type': 'application/json' } });
65
+ }
66
+ //# sourceMappingURL=dev-vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-vault.js","sourceRoot":"","sources":["../src/dev-vault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Nexus DevRadar — introspection sink for the Studio WebSocket (dev only).
3
+ *
4
+ * The CLI registers a sink (`registerDevRadarSink`) that forwards to `broadcast()`.
5
+ * When no sink is registered, all emits are no-ops (production / `nexus start`).
6
+ */
7
+ /** v1 wire protocol — keep in sync with `packages/cli/src/studio.ts` `StudioEvent` (incl. security:report). */
8
+ export type DevRadarEvent = {
9
+ type: 'action:call';
10
+ payload: ActionCallPayload;
11
+ } | {
12
+ type: 'action:result';
13
+ payload: ActionResultPayload;
14
+ } | {
15
+ type: 'action:redirect';
16
+ payload: ActionRedirectPayload;
17
+ } | {
18
+ type: 'action:error';
19
+ payload: ActionErrorPayload;
20
+ } | {
21
+ type: 'devtools:pretext';
22
+ payload: PretextProfilePayload;
23
+ } | {
24
+ type: 'security:audit';
25
+ payload: SecurityAuditPayload;
26
+ } | {
27
+ type: 'security:report';
28
+ payload: SecurityReportPayload;
29
+ } | {
30
+ type: 'rune:telemetry';
31
+ payload: RuneTelemetryPayload;
32
+ };
33
+ export interface ActionCallPayload {
34
+ id: string;
35
+ name: string;
36
+ islandId?: string;
37
+ input: unknown;
38
+ timestamp: number;
39
+ idempotencyKey?: string;
40
+ }
41
+ export interface ActionResultPayload {
42
+ id: string;
43
+ name: string;
44
+ output: unknown;
45
+ duration: number;
46
+ cached: boolean;
47
+ }
48
+ export interface ActionRedirectPayload {
49
+ id: string;
50
+ name: string;
51
+ location: string;
52
+ status: number;
53
+ duration: number;
54
+ }
55
+ export interface ActionErrorPayload {
56
+ id: string;
57
+ name: string;
58
+ error: string;
59
+ code?: string;
60
+ duration: number;
61
+ }
62
+ export interface PretextProfilePayload {
63
+ /** Route pattern, e.g. `/news/[slug]` */
64
+ pattern: string;
65
+ durationMs: number;
66
+ /** Layout + page modules that ran nxPretext in parallel */
67
+ parallelCount: number;
68
+ }
69
+ export interface SecurityAuditPayload {
70
+ kind: 'csrf_blocked' | 'rate_limited' | 'replay' | 'ghost_wall' | 'shield_action' | 'vault_updated' | 'custom';
71
+ message: string;
72
+ action?: string;
73
+ }
74
+ /** Studio "Security Report" checklist (snapshot when `nexus dev` connects DevRadar). */
75
+ export interface SecurityReportCheck {
76
+ id: string;
77
+ label: string;
78
+ status: 'pass' | 'warn' | 'info';
79
+ }
80
+ export interface SecurityReportPayload {
81
+ hardened: boolean;
82
+ checks: SecurityReportCheck[];
83
+ }
84
+ /** Placeholder for client-originated rune stats (future: bridge from runtime). */
85
+ export interface RuneTelemetryPayload {
86
+ runeId: string;
87
+ updatesPerSecond: number;
88
+ label?: string;
89
+ }
90
+ /** Register the Studio broadcast function (called once from `nexus dev`). */
91
+ export declare function registerDevRadarSink(fn: (event: DevRadarEvent) => void): () => void;
92
+ export declare function emitDevRadar(event: DevRadarEvent): void;
93
+ /** Deep-clone-ish sanitizer for telemetry (arguments / results). */
94
+ export declare function sanitizeTelemetryValue(value: unknown, depth?: number): unknown;
95
+ export declare function newTraceId(): string;
96
+ //# sourceMappingURL=devradar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devradar.d.ts","sourceRoot":"","sources":["../src/devradar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Nexus DevRadar — introspection sink for the Studio WebSocket (dev only).
3
+ *
4
+ * The CLI registers a sink (`registerDevRadarSink`) that forwards to `broadcast()`.
5
+ * When no sink is registered, all emits are no-ops (production / `nexus start`).
6
+ */
7
+ import { randomUUID } from 'node:crypto';
8
+ let sink = null;
9
+ /** Register the Studio broadcast function (called once from `nexus dev`). */
10
+ export function registerDevRadarSink(fn) {
11
+ sink = fn;
12
+ return () => {
13
+ sink = null;
14
+ };
15
+ }
16
+ export function emitDevRadar(event) {
17
+ if (!sink)
18
+ return;
19
+ try {
20
+ sink(event);
21
+ }
22
+ catch {
23
+ /* ignore dashboard errors */
24
+ }
25
+ }
26
+ const SECRET_KEY = /secret|password|token|authorization|cookie|apikey|api_key|bearer|private_key/i;
27
+ /** Deep-clone-ish sanitizer for telemetry (arguments / results). */
28
+ export function sanitizeTelemetryValue(value, depth = 0) {
29
+ if (depth > 8)
30
+ return '[max depth]';
31
+ if (value === null || value === undefined)
32
+ return value;
33
+ const t = typeof value;
34
+ if (t === 'string') {
35
+ const s = value;
36
+ return s.length > 512 ? `${s.slice(0, 512)}…` : s;
37
+ }
38
+ if (t === 'number' || t === 'boolean')
39
+ return value;
40
+ if (t === 'bigint')
41
+ return `${value}n`;
42
+ if (value instanceof Date)
43
+ return value.toISOString();
44
+ if (Array.isArray(value)) {
45
+ const cap = value.slice(0, 64);
46
+ return cap.map((v) => sanitizeTelemetryValue(v, depth + 1));
47
+ }
48
+ if (t === 'object') {
49
+ const o = value;
50
+ const out = {};
51
+ let n = 0;
52
+ for (const [k, v] of Object.entries(o)) {
53
+ if (n++ > 64) {
54
+ out['…'] = `${Object.keys(o).length - 64} more keys`;
55
+ break;
56
+ }
57
+ if (SECRET_KEY.test(k))
58
+ out[k] = '[redacted]';
59
+ else
60
+ out[k] = sanitizeTelemetryValue(v, depth + 1);
61
+ }
62
+ return out;
63
+ }
64
+ return String(value);
65
+ }
66
+ export function newTraceId() {
67
+ return randomUUID();
68
+ }
69
+ //# sourceMappingURL=devradar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devradar.js","sourceRoot":"","sources":["../src/devradar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsFzC,IAAI,IAAI,GAA4C,IAAI,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,UAAU,oBAAoB,CAAC,EAAkC;IACrE,IAAI,GAAG,EAAE,CAAC;IACV,OAAO,GAAG,EAAE;QACV,IAAI,GAAG,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,+EAA+E,CAAC;AAEnG,oEAAoE;AACpE,MAAM,UAAU,sBAAsB,CAAC,KAAc,EAAE,KAAK,GAAG,CAAC;IAC9D,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,aAAa,CAAC;IACpC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,CAAC,GAAG,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,KAAe,CAAC;QAC1B,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACvC,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;gBACb,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,YAAY,CAAC;gBACrD,MAAM;YACR,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;;gBACzC,GAAG,CAAC,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Nexus handler instrumentation surface (DevRadar / Inspector).
3
+ *
4
+ * Server Action taps live in `actions.ts`; pretext profiling in `renderer.ts` (`mergeRoutePretext`).
5
+ */
6
+ export * from './inspector.js';
7
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Nexus handler instrumentation surface (DevRadar / Inspector).
3
+ *
4
+ * Server Action taps live in `actions.ts`; pretext profiling in `renderer.ts` (`mergeRoutePretext`).
5
+ */
6
+ export * from './inspector.js';
7
+ //# sourceMappingURL=handler.js.map