@nifrajs/cli 2.10.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/README.md +7 -1
  2. package/dist/assure-hydration.d.ts +14 -0
  3. package/dist/assure-hydration.d.ts.map +1 -0
  4. package/dist/assure-hydration.js +483 -0
  5. package/dist/assure-hydration.js.map +1 -0
  6. package/dist/assure.d.ts +35 -0
  7. package/dist/assure.d.ts.map +1 -1
  8. package/dist/assure.js +222 -1
  9. package/dist/assure.js.map +1 -1
  10. package/dist/capabilities-tool.d.ts +13 -0
  11. package/dist/capabilities-tool.d.ts.map +1 -1
  12. package/dist/capabilities-tool.js +64 -1
  13. package/dist/capabilities-tool.js.map +1 -1
  14. package/dist/check.d.ts +133 -10
  15. package/dist/check.d.ts.map +1 -1
  16. package/dist/check.js +741 -148
  17. package/dist/check.js.map +1 -1
  18. package/dist/cli.d.ts +21 -14
  19. package/dist/cli.d.ts.map +1 -1
  20. package/dist/cli.js +288 -73
  21. package/dist/cli.js.map +1 -1
  22. package/dist/contract-proof.d.ts +49 -0
  23. package/dist/contract-proof.d.ts.map +1 -0
  24. package/dist/contract-proof.js +128 -0
  25. package/dist/contract-proof.js.map +1 -0
  26. package/dist/contracts.d.ts +22 -0
  27. package/dist/contracts.d.ts.map +1 -0
  28. package/dist/contracts.js +134 -0
  29. package/dist/contracts.js.map +1 -0
  30. package/dist/dev-bun-config.d.ts +17 -6
  31. package/dist/dev-bun-config.d.ts.map +1 -1
  32. package/dist/dev-bun-config.js +51 -14
  33. package/dist/dev-bun-config.js.map +1 -1
  34. package/dist/diagnostics.d.ts +23 -0
  35. package/dist/diagnostics.d.ts.map +1 -0
  36. package/dist/diagnostics.js +9 -0
  37. package/dist/diagnostics.js.map +1 -0
  38. package/dist/diff-tool.d.ts +2 -0
  39. package/dist/diff-tool.d.ts.map +1 -1
  40. package/dist/diff-tool.js +1 -1
  41. package/dist/diff-tool.js.map +1 -1
  42. package/dist/docs-search.d.ts +8 -3
  43. package/dist/docs-search.d.ts.map +1 -1
  44. package/dist/docs-search.js +36 -15
  45. package/dist/docs-search.js.map +1 -1
  46. package/dist/doctor.d.ts +38 -2
  47. package/dist/doctor.d.ts.map +1 -1
  48. package/dist/doctor.js +189 -7
  49. package/dist/doctor.js.map +1 -1
  50. package/dist/examples.d.ts +1 -2
  51. package/dist/examples.d.ts.map +1 -1
  52. package/dist/examples.js +37 -16
  53. package/dist/examples.js.map +1 -1
  54. package/dist/fix-recipes.d.ts +12 -0
  55. package/dist/fix-recipes.d.ts.map +1 -0
  56. package/dist/fix-recipes.js +106 -0
  57. package/dist/fix-recipes.js.map +1 -0
  58. package/dist/init-agents.d.ts.map +1 -1
  59. package/dist/init-agents.js +60 -4
  60. package/dist/init-agents.js.map +1 -1
  61. package/dist/internal/source-facts.d.ts +15 -0
  62. package/dist/internal/source-facts.d.ts.map +1 -0
  63. package/dist/internal/source-facts.js +82 -0
  64. package/dist/internal/source-facts.js.map +1 -0
  65. package/dist/internal/typescript-import.d.ts +9 -0
  66. package/dist/internal/typescript-import.d.ts.map +1 -1
  67. package/dist/internal/typescript-import.js +38 -0
  68. package/dist/internal/typescript-import.js.map +1 -1
  69. package/dist/introspect.d.ts +6 -2
  70. package/dist/introspect.d.ts.map +1 -1
  71. package/dist/introspect.js +60 -5
  72. package/dist/introspect.js.map +1 -1
  73. package/dist/load.d.ts +10 -0
  74. package/dist/load.d.ts.map +1 -1
  75. package/dist/load.js +1 -0
  76. package/dist/load.js.map +1 -1
  77. package/dist/manifest-tool.d.ts.map +1 -1
  78. package/dist/manifest-tool.js +14 -9
  79. package/dist/manifest-tool.js.map +1 -1
  80. package/dist/mcp-docs-tools.d.ts.map +1 -1
  81. package/dist/mcp-docs-tools.js +3 -0
  82. package/dist/mcp-docs-tools.js.map +1 -1
  83. package/dist/mcp-http.js +1 -1
  84. package/dist/mcp-root.d.ts +83 -0
  85. package/dist/mcp-root.d.ts.map +1 -0
  86. package/dist/mcp-root.js +221 -0
  87. package/dist/mcp-root.js.map +1 -0
  88. package/dist/mcp-run.d.ts.map +1 -1
  89. package/dist/mcp-run.js +18 -4
  90. package/dist/mcp-run.js.map +1 -1
  91. package/dist/mcp.d.ts +27 -4
  92. package/dist/mcp.d.ts.map +1 -1
  93. package/dist/mcp.js +360 -27
  94. package/dist/mcp.js.map +1 -1
  95. package/dist/pipeline-guard.d.ts +25 -10
  96. package/dist/pipeline-guard.d.ts.map +1 -1
  97. package/dist/pipeline-guard.js +35 -15
  98. package/dist/pipeline-guard.js.map +1 -1
  99. package/dist/pipeline-report.d.ts +34 -0
  100. package/dist/pipeline-report.d.ts.map +1 -0
  101. package/dist/pipeline-report.js +282 -0
  102. package/dist/pipeline-report.js.map +1 -0
  103. package/dist/project-path.d.ts +3 -0
  104. package/dist/project-path.d.ts.map +1 -0
  105. package/dist/project-path.js +36 -0
  106. package/dist/project-path.js.map +1 -0
  107. package/dist/replay.d.ts +12 -0
  108. package/dist/replay.d.ts.map +1 -0
  109. package/dist/replay.js +36 -0
  110. package/dist/replay.js.map +1 -0
  111. package/dist/rules/codes.d.ts +42 -0
  112. package/dist/rules/codes.d.ts.map +1 -0
  113. package/dist/rules/codes.js +52 -0
  114. package/dist/rules/codes.js.map +1 -0
  115. package/dist/rules/comment-markers.d.ts +10 -0
  116. package/dist/rules/comment-markers.d.ts.map +1 -0
  117. package/dist/rules/comment-markers.js +24 -0
  118. package/dist/rules/comment-markers.js.map +1 -0
  119. package/dist/rules/index.d.ts +31 -0
  120. package/dist/rules/index.d.ts.map +1 -0
  121. package/dist/rules/index.js +133 -0
  122. package/dist/rules/index.js.map +1 -0
  123. package/dist/rules/legacy.d.ts +7 -0
  124. package/dist/rules/legacy.d.ts.map +1 -0
  125. package/dist/rules/legacy.js +85 -0
  126. package/dist/rules/legacy.js.map +1 -0
  127. package/dist/rules/routes.d.ts +12 -0
  128. package/dist/rules/routes.d.ts.map +1 -0
  129. package/dist/rules/routes.js +142 -0
  130. package/dist/rules/routes.js.map +1 -0
  131. package/dist/rules/security.d.ts +10 -0
  132. package/dist/rules/security.d.ts.map +1 -0
  133. package/dist/rules/security.js +471 -0
  134. package/dist/rules/security.js.map +1 -0
  135. package/dist/search-terms.d.ts +2 -0
  136. package/dist/search-terms.d.ts.map +1 -1
  137. package/dist/search-terms.js +5 -1
  138. package/dist/search-terms.js.map +1 -1
  139. package/dist/types-search.d.ts +1 -2
  140. package/dist/types-search.d.ts.map +1 -1
  141. package/dist/types-search.js +33 -16
  142. package/dist/types-search.js.map +1 -1
  143. package/dist/verification.d.ts +9 -0
  144. package/dist/verification.d.ts.map +1 -1
  145. package/dist/verification.js +17 -1
  146. package/dist/verification.js.map +1 -1
  147. package/dist/work-graph.d.ts +123 -0
  148. package/dist/work-graph.d.ts.map +1 -0
  149. package/dist/work-graph.js +465 -0
  150. package/dist/work-graph.js.map +1 -0
  151. package/docs/examples.json +32 -2
  152. package/docs/llms-full.txt +1105 -27
  153. package/docs/types.json +1772 -137
  154. package/package.json +34 -9
  155. package/src/assure-hydration.ts +606 -0
  156. package/src/assure.ts +316 -2
  157. package/src/capabilities-tool.ts +80 -1
  158. package/src/check.ts +923 -169
  159. package/src/cli.ts +297 -76
  160. package/src/contract-proof.ts +194 -0
  161. package/src/contracts.ts +157 -0
  162. package/src/dev-bun-config.ts +57 -14
  163. package/src/diagnostics.ts +32 -0
  164. package/src/diff-tool.ts +1 -1
  165. package/src/docs-search.ts +45 -15
  166. package/src/doctor.ts +286 -8
  167. package/src/examples.ts +43 -15
  168. package/src/fix-recipes.ts +126 -0
  169. package/src/init-agents.ts +61 -4
  170. package/src/internal/source-facts.ts +133 -0
  171. package/src/internal/typescript-import.ts +29 -0
  172. package/src/introspect.ts +81 -6
  173. package/src/load.ts +11 -0
  174. package/src/manifest-tool.ts +16 -10
  175. package/src/mcp-docs-tools.ts +3 -0
  176. package/src/mcp-http.ts +1 -1
  177. package/src/mcp-root.ts +271 -0
  178. package/src/mcp-run.ts +19 -4
  179. package/src/mcp.ts +440 -34
  180. package/src/pipeline-guard.ts +44 -14
  181. package/src/pipeline-report.ts +341 -0
  182. package/src/project-path.ts +36 -0
  183. package/src/replay.ts +44 -0
  184. package/src/rules/codes.ts +57 -0
  185. package/src/rules/comment-markers.ts +26 -0
  186. package/src/rules/index.ts +175 -0
  187. package/src/rules/legacy.ts +93 -0
  188. package/src/rules/routes.ts +157 -0
  189. package/src/rules/security.ts +505 -0
  190. package/src/search-terms.ts +9 -4
  191. package/src/types-search.ts +39 -15
  192. package/src/verification.ts +18 -1
  193. package/src/work-graph.ts +613 -0
package/README.md CHANGED
@@ -5,7 +5,7 @@ The `nifra` CLI - zero-config dev/build/start for a nifra app, plus the agent su
5
5
  `routes/`).
6
6
 
7
7
  ```
8
- nifra dev [--port <n>] [--poll] True-HMR dev server (Vite + nifra SSR).
8
+ nifra dev [--port <n>] [--poll] True-HMR dev server (Bun + nifra SSR; Vite for a Vite-only app).
9
9
  nifra build [--out <dir>] [--target <t>] Complete deploy directory; target defaults to Bun.
10
10
  nifra start [--port <n>] [--out <dir>] Run the generated Bun server at <out>/server.js.
11
11
  nifra context Print this project's API + page routes + conventions.
@@ -143,6 +143,12 @@ Claude Code:
143
143
  claude mcp add nifra -- nifra mcp
144
144
  ```
145
145
 
146
+ ## Structured verification
147
+
148
+ `nifra check --json` returns stable diagnostic codes and machine-actionable evidence. `nifra assure --json --strict` returns one versioned bundle with explicit pass, fail, and skip gate results plus a `green` or `red` verdict. Use `nifra fix --code NF-...` for a registered fix recipe, and `nifra contracts snapshot` to opt into route contract drift detection.
149
+
150
+ Assurance configs may append application-supplied rule packs. Pack codes must not use the reserved `NF-` prefix. Rules are pure source scans and run after the built-in rules.
151
+
146
152
  Run the client from (or point it at) your project root. The protocol is hand-rolled
147
153
  (newline-delimited JSON-RPC 2.0) - no SDK dependency.
148
154
 
@@ -0,0 +1,14 @@
1
+ export interface HydrationResult {
2
+ readonly diagnostics: readonly import("./diagnostics.js").Diagnostic[];
3
+ readonly skipReason?: string;
4
+ /** Relative replay files, one for every route that produced a failure. */
5
+ readonly replays?: readonly string[];
6
+ }
7
+ export interface HydrationOptions {
8
+ readonly routes?: readonly string[];
9
+ readonly interact?: boolean;
10
+ readonly seed?: string;
11
+ }
12
+ /** Run hydration in a fresh process so the project's current client and framework modules are isolated. */
13
+ export declare function runHydrationAssurance(cwd: string, options?: HydrationOptions): Promise<HydrationResult>;
14
+ //# sourceMappingURL=assure-hydration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assure-hydration.d.ts","sourceRoot":"","sources":["../src/assure-hydration.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,OAAO,kBAAkB,EAAE,UAAU,EAAE,CAAA;IACtE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AA0gBD,2GAA2G;AAC3G,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CA4B1B"}
@@ -0,0 +1,483 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { existsSync, statSync } from "node:fs";
10
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
11
+ import { tmpdir } from "node:os";
12
+ import { basename, join, resolve } from "node:path";
13
+ import { fileURLToPath, pathToFileURL } from "node:url";
14
+ import { inProcessClient } from "@nifrajs/client";
15
+ import { defineReplayFile } from "@nifrajs/core/replay";
16
+ import { runApp } from "@nifrajs/runner";
17
+ import { createWebApp } from "@nifrajs/web";
18
+ import { buildClient } from "@nifrajs/web/build";
19
+ import { discoverRoutes } from "@nifrajs/web/fs";
20
+ import { collectDoctorResult } from "./doctor.js";
21
+ import { loadApp, resolvePlugins } from "./load.js";
22
+ const HYDRATION_ASSURANCE = Symbol.for("nifra.hydration.assurance");
23
+ const SOURCE_GLOB = "**/*.{ts,tsx,js,jsx,vue,svelte,mdx}";
24
+ const IGNORED = /(^|\/)(node_modules|dist|build|coverage|\.git|\.nifra)\//;
25
+ function seedNumber(seed) {
26
+ let value = 0x811c9dc5;
27
+ for (const character of seed) {
28
+ value ^= character.charCodeAt(0);
29
+ value = Math.imul(value, 0x01000193);
30
+ }
31
+ return value >>> 0;
32
+ }
33
+ /** Freeze the small nondeterministic surface that can make SSR and CSR disagree by luck. */
34
+ function installDeterministicRuntime(seed) {
35
+ let randomState = seedNumber(seed) || 1;
36
+ const epoch = 1_700_000_000_000 + (seedNumber(`${seed}:clock`) % 86_400_000);
37
+ Date.now = () => epoch;
38
+ Math.random = () => {
39
+ randomState = Math.imul(randomState, 1_664_525) + 1_013_904_223;
40
+ return (randomState >>> 0) / 4_294_967_296;
41
+ };
42
+ const realSetTimeout = globalThis.setTimeout.bind(globalThis);
43
+ const realSetInterval = globalThis.setInterval.bind(globalThis);
44
+ globalThis.setTimeout = ((handler, timeout, ...args) => realSetTimeout(handler, Number.isFinite(timeout) ? Math.max(0, timeout ?? 0) : 0, ...args));
45
+ globalThis.setInterval = ((handler, timeout, ...args) => realSetInterval(handler, Number.isFinite(timeout) ? Math.max(0, timeout ?? 0) : 0, ...args));
46
+ }
47
+ function diagnostic(code, message, file, evidence, severity = "error") {
48
+ return Object.freeze({
49
+ code,
50
+ severity,
51
+ message,
52
+ ...(file === undefined ? {} : { file }),
53
+ ...(evidence === undefined ? {} : { evidence }),
54
+ verify: "nifra assure --hydration --strict --json",
55
+ });
56
+ }
57
+ function frameworkName(clientModule) {
58
+ if (clientModule.includes("web-react"))
59
+ return "react";
60
+ if (clientModule.includes("web-vue"))
61
+ return "vue";
62
+ if (clientModule.includes("web-svelte"))
63
+ return "svelte";
64
+ if (clientModule.includes("web-solid"))
65
+ return "solid";
66
+ if (clientModule.includes("web-preact"))
67
+ return "preact";
68
+ return "custom";
69
+ }
70
+ function routePath(pattern) {
71
+ const path = pattern
72
+ .replace(/\[\.\.\.([^\]]+)\]/g, "probe")
73
+ .replace(/\[([^\]]+)\]/g, "probe")
74
+ .replace(/:([A-Za-z0-9_]+)/g, "probe")
75
+ .replace(/\*([A-Za-z0-9_]+)?/g, "probe");
76
+ return path === "" ? "/" : path.startsWith("/") ? path : `/${path}`;
77
+ }
78
+ async function digest(value) {
79
+ const bytes = new TextEncoder().encode(JSON.stringify(value));
80
+ const hash = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
81
+ return [...hash].map((item) => item.toString(16).padStart(2, "0")).join("");
82
+ }
83
+ async function writeReplay(cwd, route, seed, inputs) {
84
+ const inputsDigest = await digest(inputs);
85
+ const replay = defineReplayFile({
86
+ gate: "hydration",
87
+ case: route,
88
+ seed,
89
+ inputsDigest,
90
+ meta: inputs !== null &&
91
+ typeof inputs === "object" &&
92
+ typeof inputs.framework === "string"
93
+ ? { framework: inputs.framework }
94
+ : {},
95
+ });
96
+ const relative = `.nifra/replays/hydration-${inputsDigest.slice(0, 16)}.json`;
97
+ const path = resolve(cwd, relative);
98
+ await mkdir(join(cwd, ".nifra", "replays"), { recursive: true });
99
+ await writeFile(path, `${JSON.stringify(replay, null, 2)}\n`, "utf8");
100
+ return relative;
101
+ }
102
+ async function loadOptionalDom(cwd) {
103
+ try {
104
+ const entry = Bun.resolveSync("happy-dom", cwd);
105
+ const loaded = (await import(__rewriteRelativeImportExtension(pathToFileURL(entry).href)));
106
+ return loaded.Window === undefined ? undefined : { Window: loaded.Window };
107
+ }
108
+ catch {
109
+ return undefined;
110
+ }
111
+ }
112
+ async function buildHydrationApp(cwd) {
113
+ const loaded = await loadApp(cwd, "dist");
114
+ if (loaded.framework.clientModule.trim() === "")
115
+ return { skipReason: "no client bundle configured" };
116
+ const workDir = await mkdtemp(join(tmpdir(), "nifra-hydration-"));
117
+ try {
118
+ const clientOutput = join(workDir, "assets");
119
+ const plugins = await resolvePlugins(loaded.framework.clientPlugins);
120
+ const client = await buildClient({
121
+ routesDir: loaded.routesDir,
122
+ outDir: clientOutput,
123
+ clientModule: loaded.framework.clientModule,
124
+ ...(plugins.length === 0 ? {} : { plugins: plugins }),
125
+ ...(loaded.framework.conditions === undefined
126
+ ? {}
127
+ : { conditions: loaded.framework.conditions }),
128
+ ...(loaded.framework.define === undefined ? {} : { define: loaded.framework.define }),
129
+ publicDir: false,
130
+ ...(loaded.framework.publicEnvPrefix === undefined
131
+ ? {}
132
+ : { publicEnvPrefix: loaded.framework.publicEnvPrefix }),
133
+ });
134
+ if (client.entry.trim() === "" || client.assets.length === 0) {
135
+ await rm(workDir, { recursive: true, force: true });
136
+ return { skipReason: "client build emitted no browser assets" };
137
+ }
138
+ const serverPlugins = await resolvePlugins(loaded.framework.serverPlugins);
139
+ if (serverPlugins.length > 0) {
140
+ const { plugin } = await import("bun");
141
+ for (const item of serverPlugins)
142
+ plugin(item);
143
+ }
144
+ const webApp = createWebApp({
145
+ adapter: loaded.framework.adapter,
146
+ manifest: discoverRoutes(loaded.routesDir),
147
+ clientEntry: client.entry,
148
+ ...(loaded.backend === undefined ? {} : { api: inProcessClient(loaded.backend) }),
149
+ });
150
+ return {
151
+ app: webApp,
152
+ client,
153
+ outputDir: clientOutput,
154
+ framework: frameworkName(loaded.framework.clientModule),
155
+ };
156
+ }
157
+ catch (error) {
158
+ await rm(workDir, { recursive: true, force: true });
159
+ throw error;
160
+ }
161
+ }
162
+ function sourceBranch(content) {
163
+ return /typeof\s+window\s*!==?\s*["']undefined["']/.test(content);
164
+ }
165
+ async function sourceFiles(cwd) {
166
+ const files = [];
167
+ for await (const file of new Bun.Glob(SOURCE_GLOB).scan({ cwd, onlyFiles: true, dot: false })) {
168
+ if (IGNORED.test(file))
169
+ continue;
170
+ files.push({ file, content: await readFile(join(cwd, file), "utf8") });
171
+ }
172
+ return files;
173
+ }
174
+ function outputPath(outputDir, entry) {
175
+ return join(outputDir, basename(entry));
176
+ }
177
+ function globalValue(html, name) {
178
+ const expression = new RegExp(`window\\.${name}=([\\s\\S]*?)(?:</script>|;window\\.)`);
179
+ const value = expression.exec(html)?.[1]?.replace(/;$/, "");
180
+ if (value === undefined)
181
+ return undefined;
182
+ try {
183
+ return JSON.parse(value);
184
+ }
185
+ catch {
186
+ return undefined;
187
+ }
188
+ }
189
+ async function runDomHydration(cwd, built, html, path, interact) {
190
+ const domModule = await loadOptionalDom(cwd);
191
+ if (domModule === undefined)
192
+ return [];
193
+ const windowValue = new domModule.Window({ url: `http://nifra.test${path}` });
194
+ const documentValue = windowValue.document;
195
+ const globals = globalThis;
196
+ const globalRecord = globalThis;
197
+ const runtimeKey = Symbol.for("nifra.hydration.runtime");
198
+ const previous = new Map();
199
+ const names = [
200
+ "window",
201
+ "document",
202
+ "navigator",
203
+ "location",
204
+ "history",
205
+ "HTMLElement",
206
+ "Element",
207
+ "Node",
208
+ "Event",
209
+ "MouseEvent",
210
+ "requestAnimationFrame",
211
+ "cancelAnimationFrame",
212
+ ];
213
+ for (const name of names) {
214
+ previous.set(name, globals[name]);
215
+ if (name === "window")
216
+ globals[name] = windowValue;
217
+ else if (name === "document")
218
+ globals[name] = documentValue;
219
+ else if (name === "requestAnimationFrame")
220
+ globals[name] = (callback) => setTimeout(callback, 0);
221
+ else if (name === "cancelAnimationFrame")
222
+ globals[name] = (id) => clearTimeout(id);
223
+ else
224
+ globals[name] = windowValue[name];
225
+ }
226
+ const windowRecord = windowValue;
227
+ windowRecord.__NIFRA_ROUTE__ = globalValue(html, "__NIFRA_ROUTE__");
228
+ windowRecord.__NIFRA_DATA__ = globalValue(html, "__NIFRA_DATA__");
229
+ windowRecord.__NIFRA_LAYOUT_DATA__ = globalValue(html, "__NIFRA_LAYOUT_DATA__");
230
+ windowRecord.__NIFRA_ACTION__ = globalValue(html, "__NIFRA_ACTION__");
231
+ windowRecord.console = console;
232
+ const errors = [];
233
+ const recover = (error, info) => {
234
+ errors.push(`${String(error)}${info === undefined ? "" : ` ${String(info)}`}`);
235
+ };
236
+ const assuranceRecord = globalRecord[HYDRATION_ASSURANCE];
237
+ const runtimeRecord = globalRecord[runtimeKey];
238
+ globalRecord[HYDRATION_ASSURANCE] = { onRecoverableError: recover };
239
+ delete globalRecord[runtimeKey];
240
+ try {
241
+ const write = documentValue.write;
242
+ if (write === undefined)
243
+ throw new Error("DOM runner does not implement document.write");
244
+ write.call(documentValue, html);
245
+ const beforeRoot = documentValue.querySelector("#root");
246
+ const before = String(beforeRoot?.innerHTML ?? "");
247
+ const entry = outputPath(built.outputDir, built.client.entry);
248
+ const originalError = console.error;
249
+ const originalWarn = console.warn;
250
+ console.error = (...args) => {
251
+ const message = args.map(String).join(" ");
252
+ if (/hydr|mismatch|server|client|expected|recover/i.test(message))
253
+ errors.push(message);
254
+ originalError(...args);
255
+ };
256
+ console.warn = (...args) => {
257
+ const message = args.map(String).join(" ");
258
+ if (/hydr|mismatch|server|client|expected|recover/i.test(message))
259
+ errors.push(message);
260
+ originalWarn(...args);
261
+ };
262
+ try {
263
+ await import(__rewriteRelativeImportExtension(`${pathToFileURL(entry).href}?nifra-hydration=${encodeURIComponent(path)}`));
264
+ await new Promise((resolvePromise) => setTimeout(resolvePromise, 0));
265
+ }
266
+ finally {
267
+ console.error = originalError;
268
+ console.warn = originalWarn;
269
+ }
270
+ const afterRoot = documentValue.querySelector("#root");
271
+ const after = String(afterRoot?.innerHTML ?? "");
272
+ const diagnostics = [];
273
+ if (errors.length > 0 || before !== after) {
274
+ diagnostics.push(diagnostic("NF-H001", "client hydration reported a recoverable mismatch", undefined, [
275
+ built.framework,
276
+ ...errors.slice(0, 3),
277
+ ]));
278
+ }
279
+ const runtime = globalRecord[runtimeKey];
280
+ if (runtime !== undefined &&
281
+ Array.isArray(runtime.identities) &&
282
+ runtime.identities.length !== 1) {
283
+ diagnostics.push(diagnostic("NF-H002", "hydration loaded more than one framework runtime identity", undefined, [built.framework, `identities=${runtime.identities.length}`]));
284
+ }
285
+ if (interact) {
286
+ const probes = documentValue.querySelectorAll;
287
+ const elements = probes?.call(documentValue, "[data-nifra-hydration-probe]");
288
+ if (elements !== undefined && elements.length > 0) {
289
+ const first = elements[0];
290
+ if (first?.click !== undefined)
291
+ first.click();
292
+ const hydrated = documentValue.documentElement;
293
+ if (hydrated.hasAttribute?.("data-nifra-hydrated") !== true)
294
+ diagnostics.push(diagnostic("NF-H004", "hydration probe did not become interactive", undefined, [
295
+ built.framework,
296
+ ]));
297
+ }
298
+ }
299
+ return diagnostics;
300
+ }
301
+ finally {
302
+ if (assuranceRecord === undefined)
303
+ delete globalRecord[HYDRATION_ASSURANCE];
304
+ else
305
+ globalRecord[HYDRATION_ASSURANCE] = assuranceRecord;
306
+ if (runtimeRecord === undefined)
307
+ delete globalRecord[runtimeKey];
308
+ else
309
+ globalRecord[runtimeKey] = runtimeRecord;
310
+ for (const [name, value] of previous) {
311
+ if (value === undefined)
312
+ delete globals[name];
313
+ else
314
+ globals[name] = value;
315
+ }
316
+ }
317
+ }
318
+ async function runHydrationProof(cwd, options) {
319
+ const files = await sourceFiles(cwd);
320
+ const diagnostics = [];
321
+ const replays = [];
322
+ const seed = options.seed ?? "nifra-hydration-1";
323
+ installDeterministicRuntime(seed);
324
+ const existingDist = join(cwd, "dist");
325
+ const latestSource = Math.max(...files.map((file) => statSync(join(cwd, file.file)).mtimeMs), 0);
326
+ if (existsSync(existingDist) && latestSource > statSync(existingDist).mtimeMs) {
327
+ const replay = await writeReplay(cwd, "dist", seed, {
328
+ latestSource,
329
+ dist: statSync(existingDist).mtimeMs,
330
+ });
331
+ replays.push(replay);
332
+ diagnostics.push(diagnostic("NF-H003", "client build output is older than the route source; rebuild before hydrating", "dist", [replay]));
333
+ }
334
+ let built;
335
+ try {
336
+ built = await buildHydrationApp(cwd);
337
+ }
338
+ catch (error) {
339
+ const replay = await writeReplay(cwd, "build", seed, {
340
+ message: error instanceof Error ? error.message : String(error),
341
+ });
342
+ replays.push(replay);
343
+ return {
344
+ diagnostics: [
345
+ diagnostic("NF-H001", `hydration client build failed: ${error instanceof Error ? error.message : String(error)}`, undefined, [replay]),
346
+ ],
347
+ replays,
348
+ };
349
+ }
350
+ if ("skipReason" in built)
351
+ return {
352
+ diagnostics,
353
+ ...(diagnostics.length === 0 ? { skipReason: built.skipReason } : {}),
354
+ replays,
355
+ };
356
+ const framework = built.framework;
357
+ const cleanup = async () => {
358
+ await rm(resolve(built.outputDir, ".."), { recursive: true, force: true });
359
+ };
360
+ const doctor = await collectDoctorResult(cwd);
361
+ const duplicate = doctor.duplicateInstalls.filter((finding) => finding.package === framework);
362
+ if (duplicate.length > 0) {
363
+ const replay = await writeReplay(cwd, framework, seed, {
364
+ framework,
365
+ copies: duplicate.map((item) => item.copies.length),
366
+ });
367
+ replays.push(replay);
368
+ diagnostics.push(diagnostic("NF-H002", `multiple ${framework} runtime installations reached the client build`, undefined, [framework, replay]));
369
+ }
370
+ for (const file of files) {
371
+ if (!sourceBranch(file.content))
372
+ continue;
373
+ const replay = await writeReplay(cwd, file.file, seed, { framework, source: file.file });
374
+ replays.push(replay);
375
+ // Advisory only: `typeof window` guards are the standard SSR-safe idiom and most of them never
376
+ // touch render output. The DOM before/after comparison below is the authoritative mismatch proof.
377
+ diagnostics.push(diagnostic("NF-H001", "source branches on window state; confirm render output is identical before hydration", file.file, [framework, replay], "info"));
378
+ }
379
+ const manifest = discoverRoutes(join(cwd, "routes"));
380
+ const requested = options.routes?.length
381
+ ? [...options.routes]
382
+ : manifest.routes.slice(0, 20).map((route) => routePath(route.pattern));
383
+ const requests = requested.length === 0 ? [{ path: "/" }] : requested.map((path) => ({ path }));
384
+ const results = [];
385
+ for (const request of requests) {
386
+ installDeterministicRuntime(`${seed}:${request.path}`);
387
+ const [result] = await runApp(built.app, [request]);
388
+ results.push(result);
389
+ }
390
+ const domModule = await loadOptionalDom(cwd);
391
+ if (domModule === undefined) {
392
+ await cleanup();
393
+ return diagnostics.length === 0
394
+ ? {
395
+ diagnostics,
396
+ skipReason: "no happy-dom dependency configured for DOM hydration execution",
397
+ }
398
+ : { diagnostics, replays };
399
+ }
400
+ try {
401
+ for (let index = 0; index < results.length; index++) {
402
+ const result = results[index];
403
+ if (result.status !== 200 || typeof result.body !== "string")
404
+ continue;
405
+ const route = requested[index] ?? "/";
406
+ try {
407
+ // SSR and CSR for one route start from the same deterministic clock, random stream, and timer
408
+ // surface. A route that reads one of them therefore either matches exactly or reports NF-H001.
409
+ installDeterministicRuntime(`${seed}:${route}`);
410
+ const pageDiagnostics = await runDomHydration(cwd, built, result.body, route, options.interact === true);
411
+ if (pageDiagnostics.length > 0) {
412
+ const replay = await writeReplay(cwd, route, seed, {
413
+ framework,
414
+ route,
415
+ assets: built.client.assets,
416
+ });
417
+ replays.push(replay);
418
+ diagnostics.push(...pageDiagnostics.map((item) => ({
419
+ ...item,
420
+ evidence: [...(item.evidence ?? []), replay],
421
+ })));
422
+ }
423
+ }
424
+ catch (error) {
425
+ const replay = await writeReplay(cwd, route, seed, {
426
+ framework,
427
+ route,
428
+ assets: built.client.assets,
429
+ });
430
+ replays.push(replay);
431
+ diagnostics.push(diagnostic("NF-H001", `hydration execution failed: ${error instanceof Error ? error.message : String(error)}`, undefined, [framework, replay]));
432
+ }
433
+ }
434
+ return { diagnostics, ...(replays.length === 0 ? {} : { replays }) };
435
+ }
436
+ finally {
437
+ await cleanup();
438
+ }
439
+ }
440
+ /** Run hydration in a fresh process so the project's current client and framework modules are isolated. */
441
+ export async function runHydrationAssurance(cwd, options = {}) {
442
+ const root = resolve(cwd);
443
+ const entry = fileURLToPath(import.meta.url);
444
+ const proc = Bun.spawn([process.execPath, entry, root, "--nifra-hydration-child", JSON.stringify(options)], {
445
+ stdin: "ignore",
446
+ stdout: "pipe",
447
+ stderr: "pipe",
448
+ });
449
+ const [stdout, stderr] = await Promise.all([
450
+ new Response(proc.stdout).text(),
451
+ new Response(proc.stderr).text(),
452
+ ]);
453
+ await proc.exited;
454
+ try {
455
+ return JSON.parse(stdout);
456
+ }
457
+ catch {
458
+ return {
459
+ diagnostics: [
460
+ diagnostic("NF-H001", `hydration runner failed: ${stderr.trim() || stdout.trim() || "no result"}`),
461
+ ],
462
+ };
463
+ }
464
+ }
465
+ if (import.meta.main && process.argv.includes("--nifra-hydration-child")) {
466
+ const cwd = process.argv[2] ?? process.cwd();
467
+ const rawOptions = process.argv[4];
468
+ try {
469
+ process.chdir(cwd);
470
+ const options = rawOptions === undefined ? {} : JSON.parse(rawOptions);
471
+ const result = await runHydrationProof(cwd, options);
472
+ await Bun.write(Bun.stdout, JSON.stringify(result));
473
+ }
474
+ catch (error) {
475
+ await Bun.write(Bun.stdout, JSON.stringify({
476
+ diagnostics: [
477
+ diagnostic("NF-H001", error instanceof Error ? error.message : String(error)),
478
+ ],
479
+ }));
480
+ }
481
+ process.exit(0);
482
+ }
483
+ //# sourceMappingURL=assure-hydration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assure-hydration.js","sourceRoot":"","sources":["../src/assure-hydration.ts"],"names":[],"mappings":"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"}
package/dist/assure.d.ts CHANGED
@@ -1,5 +1,29 @@
1
1
  /** `nifra assure` - evaluate a project's reflected routes against `nifra.assurance.ts`. */
2
2
  import type { AssuranceConfig, AssuranceReport } from "@nifrajs/core/assurance";
3
+ import type { Diagnostic } from "./diagnostics.js";
4
+ export interface AssureSink {
5
+ record(bundle: AssureBundle): Promise<void>;
6
+ }
7
+ export interface GateResult {
8
+ readonly gate: "check" | "doctor" | "render" | "hydration" | "contracts" | "size" | "tests" | string;
9
+ readonly status: "pass" | "fail" | "skip";
10
+ readonly skipReason?: string;
11
+ readonly durationMs: number;
12
+ readonly diagnostics: readonly Diagnostic[];
13
+ readonly replay?: string;
14
+ }
15
+ export interface AssureBundle {
16
+ readonly version: 1;
17
+ readonly createdAt: string;
18
+ readonly commit: string;
19
+ readonly gates: readonly GateResult[];
20
+ readonly verdict: "green" | "red";
21
+ }
22
+ export interface MemoryAssureSink extends AssureSink {
23
+ readonly bundles: readonly AssureBundle[];
24
+ clear(): void;
25
+ }
26
+ export declare function createMemoryAssureSink(): MemoryAssureSink;
3
27
  export declare const DEFAULT_ASSURANCE_CONFIG = "nifra.assurance.ts";
4
28
  export declare function loadAssuranceConfig(cwd: string, configPath?: string): Promise<AssuranceConfig>;
5
29
  export declare function formatAssuranceReport(report: AssuranceReport): string;
@@ -7,5 +31,16 @@ export declare function collectAssuranceReport(cwd: string, configPath?: string)
7
31
  export declare function runAssurance(cwd: string, options?: {
8
32
  readonly json?: boolean;
9
33
  readonly config?: string;
34
+ readonly bundle?: boolean;
35
+ readonly strict?: boolean;
36
+ readonly out?: string;
37
+ readonly hydration?: boolean;
38
+ readonly interact?: boolean;
10
39
  }): Promise<boolean>;
40
+ export declare function collectAssureBundle(cwd: string, options?: {
41
+ readonly config?: string;
42
+ readonly strict?: boolean;
43
+ readonly hydration?: boolean;
44
+ readonly interact?: boolean;
45
+ }): Promise<AssureBundle>;
11
46
  //# sourceMappingURL=assure.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assure.d.ts","sourceRoot":"","sources":["../src/assure.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAK3F,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAE/E,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAY5D,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,UAAU,SAA2B,GACpC,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAYrE;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CAkB1B;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAClE,OAAO,CAAC,OAAO,CAAC,CAMlB"}
1
+ {"version":3,"file":"assure.d.ts","sourceRoot":"","sources":["../src/assure.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAK3F,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EACT,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,WAAW,GACX,MAAM,GACN,OAAO,GACP,MAAM,CAAA;IACV,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAA;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAA;CAClC;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAA;IACzC,KAAK,IAAI,IAAI,CAAA;CACd;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CAazD;AAED,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAY5D,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,UAAU,SAA2B,GACpC,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAYrE;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CAkB1B;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACvB,GACL,OAAO,CAAC,OAAO,CAAC,CAalB;AAiCD,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACvB,GACL,OAAO,CAAC,YAAY,CAAC,CAgNvB"}