@nifrajs/cli 4.0.2 → 5.0.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 (323) hide show
  1. package/README.md +3 -0
  2. package/dist/agent-files.d.ts +107 -0
  3. package/dist/agent-files.d.ts.map +1 -0
  4. package/dist/agent-files.js +162 -0
  5. package/dist/agent-files.js.map +1 -0
  6. package/dist/app-files.d.ts +6 -0
  7. package/dist/app-files.d.ts.map +1 -1
  8. package/dist/app-files.js +27 -2
  9. package/dist/app-files.js.map +1 -1
  10. package/dist/assure-hydration.d.ts.map +1 -1
  11. package/dist/assure-hydration.js +7 -2
  12. package/dist/assure-hydration.js.map +1 -1
  13. package/dist/capabilities-tool.d.ts.map +1 -1
  14. package/dist/capabilities-tool.js +13 -3
  15. package/dist/capabilities-tool.js.map +1 -1
  16. package/dist/check-diagnostics.d.ts +20 -2
  17. package/dist/check-diagnostics.d.ts.map +1 -1
  18. package/dist/check-diagnostics.js +54 -7
  19. package/dist/check-diagnostics.js.map +1 -1
  20. package/dist/check-scan.d.ts +75 -22
  21. package/dist/check-scan.d.ts.map +1 -1
  22. package/dist/check-scan.js +1475 -310
  23. package/dist/check-scan.js.map +1 -1
  24. package/dist/check.d.ts +2 -2
  25. package/dist/check.d.ts.map +1 -1
  26. package/dist/check.js +192 -65
  27. package/dist/check.js.map +1 -1
  28. package/dist/cli.d.ts +7 -0
  29. package/dist/cli.d.ts.map +1 -1
  30. package/dist/cli.js +112 -5
  31. package/dist/cli.js.map +1 -1
  32. package/dist/client-module.d.ts +18 -0
  33. package/dist/client-module.d.ts.map +1 -0
  34. package/dist/client-module.js +49 -0
  35. package/dist/client-module.js.map +1 -0
  36. package/dist/command-catalog.d.ts +16 -5
  37. package/dist/command-catalog.d.ts.map +1 -1
  38. package/dist/command-catalog.js +133 -29
  39. package/dist/command-catalog.js.map +1 -1
  40. package/dist/component-check.d.ts +13 -0
  41. package/dist/component-check.d.ts.map +1 -0
  42. package/dist/component-check.js +59 -0
  43. package/dist/component-check.js.map +1 -0
  44. package/dist/contract-proof.d.ts +1 -1
  45. package/dist/contract-proof.d.ts.map +1 -1
  46. package/dist/contract-proof.js +2 -24
  47. package/dist/contract-proof.js.map +1 -1
  48. package/dist/contracts.d.ts +19 -0
  49. package/dist/contracts.d.ts.map +1 -1
  50. package/dist/contracts.js +50 -3
  51. package/dist/contracts.js.map +1 -1
  52. package/dist/db-tool.d.ts.map +1 -1
  53. package/dist/db-tool.js +4 -3
  54. package/dist/db-tool.js.map +1 -1
  55. package/dist/dev-bun-config.d.ts +5 -1
  56. package/dist/dev-bun-config.d.ts.map +1 -1
  57. package/dist/dev-bun-config.js +44 -11
  58. package/dist/dev-bun-config.js.map +1 -1
  59. package/dist/diagnostics.d.ts +3 -0
  60. package/dist/diagnostics.d.ts.map +1 -1
  61. package/dist/diagnostics.js.map +1 -1
  62. package/dist/diff-tool.d.ts +9 -8
  63. package/dist/diff-tool.d.ts.map +1 -1
  64. package/dist/diff-tool.js +28 -24
  65. package/dist/diff-tool.js.map +1 -1
  66. package/dist/doctor.d.ts +13 -0
  67. package/dist/doctor.d.ts.map +1 -1
  68. package/dist/doctor.js +23 -15
  69. package/dist/doctor.js.map +1 -1
  70. package/dist/env-file.d.ts +6 -0
  71. package/dist/env-file.d.ts.map +1 -1
  72. package/dist/env-file.js +6 -0
  73. package/dist/env-file.js.map +1 -1
  74. package/dist/fix-recipes.d.ts.map +1 -1
  75. package/dist/fix-recipes.js +21 -2
  76. package/dist/fix-recipes.js.map +1 -1
  77. package/dist/hand-built-manifest.d.ts +27 -0
  78. package/dist/hand-built-manifest.d.ts.map +1 -0
  79. package/dist/hand-built-manifest.js +124 -0
  80. package/dist/hand-built-manifest.js.map +1 -0
  81. package/dist/hooks-report.d.ts +23 -0
  82. package/dist/hooks-report.d.ts.map +1 -0
  83. package/dist/hooks-report.js +104 -0
  84. package/dist/hooks-report.js.map +1 -0
  85. package/dist/init-agents.d.ts +2 -2
  86. package/dist/init-agents.d.ts.map +1 -1
  87. package/dist/init-agents.js +17 -11
  88. package/dist/init-agents.js.map +1 -1
  89. package/dist/internal/nifra-project.d.ts +41 -0
  90. package/dist/internal/nifra-project.d.ts.map +1 -0
  91. package/dist/internal/nifra-project.js +183 -0
  92. package/dist/internal/nifra-project.js.map +1 -0
  93. package/dist/internal/project-specifiers.d.ts +16 -0
  94. package/dist/internal/project-specifiers.d.ts.map +1 -0
  95. package/dist/internal/project-specifiers.js +396 -0
  96. package/dist/internal/project-specifiers.js.map +1 -0
  97. package/dist/internal/script-kind.d.ts.map +1 -1
  98. package/dist/internal/script-kind.js +2 -1
  99. package/dist/internal/script-kind.js.map +1 -1
  100. package/dist/internal/source-facts.d.ts +2 -0
  101. package/dist/internal/source-facts.d.ts.map +1 -1
  102. package/dist/internal/source-facts.js +11 -0
  103. package/dist/internal/source-facts.js.map +1 -1
  104. package/dist/internal/typescript-import.d.ts +1 -1
  105. package/dist/internal/typescript-import.d.ts.map +1 -1
  106. package/dist/internal/typescript-import.js +5 -3
  107. package/dist/internal/typescript-import.js.map +1 -1
  108. package/dist/introspect.d.ts +6 -6
  109. package/dist/introspect.d.ts.map +1 -1
  110. package/dist/introspect.js +55 -24
  111. package/dist/introspect.js.map +1 -1
  112. package/dist/levels-tool.d.ts.map +1 -1
  113. package/dist/levels-tool.js +93 -15
  114. package/dist/levels-tool.js.map +1 -1
  115. package/dist/load.d.ts +31 -8
  116. package/dist/load.d.ts.map +1 -1
  117. package/dist/load.js +37 -7
  118. package/dist/load.js.map +1 -1
  119. package/dist/mcp-context.d.ts +5 -5
  120. package/dist/mcp-context.d.ts.map +1 -1
  121. package/dist/mcp-context.js +2 -2
  122. package/dist/mcp-context.js.map +1 -1
  123. package/dist/mcp-exec.d.ts +12 -4
  124. package/dist/mcp-exec.d.ts.map +1 -1
  125. package/dist/mcp-exec.js +50 -13
  126. package/dist/mcp-exec.js.map +1 -1
  127. package/dist/mcp-http.js +1 -1
  128. package/dist/mcp-io.d.ts +17 -0
  129. package/dist/mcp-io.d.ts.map +1 -1
  130. package/dist/mcp-io.js +40 -0
  131. package/dist/mcp-io.js.map +1 -1
  132. package/dist/mcp-isolate.d.ts.map +1 -1
  133. package/dist/mcp-isolate.js +3 -2
  134. package/dist/mcp-isolate.js.map +1 -1
  135. package/dist/mcp-project-child.js +1 -1
  136. package/dist/mcp-project-child.js.map +1 -1
  137. package/dist/mcp-root.d.ts.map +1 -1
  138. package/dist/mcp-root.js +50 -10
  139. package/dist/mcp-root.js.map +1 -1
  140. package/dist/mcp-ws.d.ts.map +1 -1
  141. package/dist/mcp-ws.js +3 -1
  142. package/dist/mcp-ws.js.map +1 -1
  143. package/dist/mcp.d.ts.map +1 -1
  144. package/dist/mcp.js +8 -2
  145. package/dist/mcp.js.map +1 -1
  146. package/dist/migrate-layout.d.ts +7 -0
  147. package/dist/migrate-layout.d.ts.map +1 -1
  148. package/dist/migrate-layout.js +778 -64
  149. package/dist/migrate-layout.js.map +1 -1
  150. package/dist/output-schemas.d.ts +94 -0
  151. package/dist/output-schemas.d.ts.map +1 -0
  152. package/dist/output-schemas.js +864 -0
  153. package/dist/output-schemas.js.map +1 -0
  154. package/dist/port.d.ts.map +1 -1
  155. package/dist/port.js +3 -2
  156. package/dist/port.js.map +1 -1
  157. package/dist/project-facts.d.ts +15 -4
  158. package/dist/project-facts.d.ts.map +1 -1
  159. package/dist/project-facts.js +1 -0
  160. package/dist/project-facts.js.map +1 -1
  161. package/dist/recipes/5.0.0.d.ts +11 -0
  162. package/dist/recipes/5.0.0.d.ts.map +1 -0
  163. package/dist/recipes/5.0.0.js +34 -0
  164. package/dist/recipes/5.0.0.js.map +1 -0
  165. package/dist/recipes/index.d.ts +7 -0
  166. package/dist/recipes/index.d.ts.map +1 -1
  167. package/dist/recipes/index.js +2 -0
  168. package/dist/recipes/index.js.map +1 -1
  169. package/dist/replay.d.ts.map +1 -1
  170. package/dist/replay.js +12 -3
  171. package/dist/replay.js.map +1 -1
  172. package/dist/review.d.ts +3 -1
  173. package/dist/review.d.ts.map +1 -1
  174. package/dist/review.js +38 -7
  175. package/dist/review.js.map +1 -1
  176. package/dist/rules/codes.d.ts +10 -0
  177. package/dist/rules/codes.d.ts.map +1 -1
  178. package/dist/rules/codes.js +10 -0
  179. package/dist/rules/codes.js.map +1 -1
  180. package/dist/rules/comment-markers.d.ts +16 -7
  181. package/dist/rules/comment-markers.d.ts.map +1 -1
  182. package/dist/rules/comment-markers.js +58 -19
  183. package/dist/rules/comment-markers.js.map +1 -1
  184. package/dist/rules/contract-visibility.d.ts +3 -0
  185. package/dist/rules/contract-visibility.d.ts.map +1 -0
  186. package/dist/rules/contract-visibility.js +337 -0
  187. package/dist/rules/contract-visibility.js.map +1 -0
  188. package/dist/rules/data-guard.d.ts +7 -0
  189. package/dist/rules/data-guard.d.ts.map +1 -1
  190. package/dist/rules/data-guard.js +319 -37
  191. package/dist/rules/data-guard.js.map +1 -1
  192. package/dist/rules/layout.d.ts +4 -0
  193. package/dist/rules/layout.d.ts.map +1 -0
  194. package/dist/rules/layout.js +19 -0
  195. package/dist/rules/layout.js.map +1 -0
  196. package/dist/rules/legacy.d.ts.map +1 -1
  197. package/dist/rules/legacy.js +158 -43
  198. package/dist/rules/legacy.js.map +1 -1
  199. package/dist/rules/pages.d.ts +24 -0
  200. package/dist/rules/pages.d.ts.map +1 -1
  201. package/dist/rules/pages.js +221 -3
  202. package/dist/rules/pages.js.map +1 -1
  203. package/dist/rules/routes.d.ts +6 -0
  204. package/dist/rules/routes.d.ts.map +1 -1
  205. package/dist/rules/routes.js +111 -16
  206. package/dist/rules/routes.js.map +1 -1
  207. package/dist/rules/secrets.js +2 -2
  208. package/dist/rules/secrets.js.map +1 -1
  209. package/dist/rules/security.d.ts +12 -1
  210. package/dist/rules/security.d.ts.map +1 -1
  211. package/dist/rules/security.js +281 -68
  212. package/dist/rules/security.js.map +1 -1
  213. package/dist/rules/zones.d.ts +13 -0
  214. package/dist/rules/zones.d.ts.map +1 -1
  215. package/dist/rules/zones.js +192 -40
  216. package/dist/rules/zones.js.map +1 -1
  217. package/dist/scaffold.d.ts.map +1 -1
  218. package/dist/scaffold.js +6 -4
  219. package/dist/scaffold.js.map +1 -1
  220. package/dist/sdk.d.ts.map +1 -1
  221. package/dist/sdk.js +14 -5
  222. package/dist/sdk.js.map +1 -1
  223. package/dist/stylex-migrate.d.ts.map +1 -1
  224. package/dist/stylex-migrate.js +163 -7
  225. package/dist/stylex-migrate.js.map +1 -1
  226. package/dist/test-tool.d.ts.map +1 -1
  227. package/dist/test-tool.js +12 -3
  228. package/dist/test-tool.js.map +1 -1
  229. package/dist/typecheck-coverage.d.ts +20 -0
  230. package/dist/typecheck-coverage.d.ts.map +1 -0
  231. package/dist/typecheck-coverage.js +129 -0
  232. package/dist/typecheck-coverage.js.map +1 -0
  233. package/dist/upgrade.d.ts +69 -0
  234. package/dist/upgrade.d.ts.map +1 -1
  235. package/dist/upgrade.js +420 -77
  236. package/dist/upgrade.js.map +1 -1
  237. package/dist/verification-plan.d.ts.map +1 -1
  238. package/dist/verification-plan.js +11 -0
  239. package/dist/verification-plan.js.map +1 -1
  240. package/dist/version-drift.d.ts +22 -0
  241. package/dist/version-drift.d.ts.map +1 -0
  242. package/dist/version-drift.js +42 -0
  243. package/dist/version-drift.js.map +1 -0
  244. package/dist/web-app-options.d.ts +1 -1
  245. package/dist/web-app-options.d.ts.map +1 -1
  246. package/dist/web-app-options.js +1 -1
  247. package/dist/web-app-options.js.map +1 -1
  248. package/dist/work-graph.d.ts.map +1 -1
  249. package/dist/work-graph.js +20 -8
  250. package/dist/work-graph.js.map +1 -1
  251. package/docs/examples.json +54 -6
  252. package/docs/llms-full.txt +1539 -138
  253. package/docs/types.json +1456 -206
  254. package/package.json +11 -12
  255. package/src/agent-files.ts +203 -0
  256. package/src/app-files.ts +34 -4
  257. package/src/assure-hydration.ts +15 -2
  258. package/src/capabilities-tool.ts +15 -3
  259. package/src/check-diagnostics.ts +73 -9
  260. package/src/check-scan.ts +1773 -381
  261. package/src/check.ts +237 -76
  262. package/src/cli.ts +141 -5
  263. package/src/client-module.ts +61 -0
  264. package/src/command-catalog.ts +166 -37
  265. package/src/component-check.ts +79 -0
  266. package/src/contract-proof.ts +3 -25
  267. package/src/contracts.ts +60 -3
  268. package/src/db-tool.ts +5 -2
  269. package/src/dev-bun-config.ts +51 -10
  270. package/src/diagnostics.ts +3 -0
  271. package/src/diff-tool.ts +33 -26
  272. package/src/doctor.ts +43 -21
  273. package/src/env-file.ts +7 -0
  274. package/src/fix-recipes.ts +25 -2
  275. package/src/hand-built-manifest.ts +144 -0
  276. package/src/hooks-report.ts +135 -0
  277. package/src/init-agents.ts +17 -11
  278. package/src/internal/nifra-project.ts +191 -0
  279. package/src/internal/project-specifiers.ts +424 -0
  280. package/src/internal/script-kind.ts +2 -1
  281. package/src/internal/source-facts.ts +25 -0
  282. package/src/internal/typescript-import.ts +10 -3
  283. package/src/introspect.ts +65 -27
  284. package/src/levels-tool.ts +117 -20
  285. package/src/load.ts +78 -14
  286. package/src/mcp-context.ts +7 -7
  287. package/src/mcp-exec.ts +60 -17
  288. package/src/mcp-http.ts +1 -1
  289. package/src/mcp-io.ts +41 -0
  290. package/src/mcp-isolate.ts +9 -2
  291. package/src/mcp-project-child.ts +1 -1
  292. package/src/mcp-root.ts +58 -8
  293. package/src/mcp-ws.ts +4 -2
  294. package/src/mcp.ts +8 -3
  295. package/src/migrate-layout.ts +885 -63
  296. package/src/output-schemas.ts +1084 -0
  297. package/src/port.ts +3 -2
  298. package/src/project-facts.ts +17 -3
  299. package/src/recipes/5.0.0.ts +35 -0
  300. package/src/recipes/index.ts +10 -0
  301. package/src/replay.ts +14 -3
  302. package/src/review.ts +39 -10
  303. package/src/rules/codes.ts +10 -0
  304. package/src/rules/comment-markers.ts +57 -21
  305. package/src/rules/contract-visibility.ts +383 -0
  306. package/src/rules/data-guard.ts +351 -42
  307. package/src/rules/layout.ts +22 -0
  308. package/src/rules/legacy.ts +184 -51
  309. package/src/rules/pages.ts +238 -3
  310. package/src/rules/routes.ts +124 -16
  311. package/src/rules/secrets.ts +2 -2
  312. package/src/rules/security.ts +352 -71
  313. package/src/rules/zones.ts +205 -38
  314. package/src/scaffold.ts +6 -4
  315. package/src/sdk.ts +14 -5
  316. package/src/stylex-migrate.ts +134 -7
  317. package/src/test-tool.ts +18 -3
  318. package/src/typecheck-coverage.ts +134 -0
  319. package/src/upgrade.ts +487 -71
  320. package/src/verification-plan.ts +24 -0
  321. package/src/version-drift.ts +67 -0
  322. package/src/web-app-options.ts +2 -2
  323. package/src/work-graph.ts +17 -12
@@ -4,16 +4,22 @@
4
4
  * The server enforces both at runtime, on every request: data a loader or action returns without an
5
5
  * output schema fails the request, and an output schema naming a sensitive field without
6
6
  * `t.declassified` fails the route when it loads. These report what source alone shows, before a
7
- * request ever does. NF-C030 is a warning because only running the loader proves it returns data.
7
+ * request ever does. NF-C030 is an error when the loader's own body returns a literal the runtime
8
+ * refuses (an object, array, string, number or boolean) and a warning otherwise, since only running
9
+ * the loader proves what an expression evaluates to.
8
10
  */
11
+ import { realpathSync } from "node:fs";
12
+ import { isAbsolute, join, relative } from "node:path";
9
13
  import { isSensitiveFieldName } from "@nifrajs/web/zones";
10
14
  import { codePositionMask } from "../check-scan.js";
11
15
  import { diagnostic } from "../diagnostics.js";
12
16
  import { codeUnitOrder } from "../internal/code-unit-order.js";
17
+ import { createSpecifierResolver } from "../internal/project-specifiers.js";
13
18
  import { zonedFiles } from "./zones.js";
14
19
  const lineAt = (text, index) => text.slice(0, index).split("\n").length;
15
20
  const byPlace = (a, b) => codeUnitOrder(a.file ?? "", b.file ?? "") || (a.line ?? 0) - (b.line ?? 0);
16
- const exported = (mask, name) => new RegExp(`\\bexport\\s+(?:(?:async\\s+)?function\\s*\\*?\\s*|(?:const|let|var)\\s+)${name}\\b|\\bexport\\s*\\{[^}]*\\b${name}\\b[^}]*\\}`).exec(mask);
21
+ /** The export statement of `name` in a code-position mask: a declaration or an `export { }` list. */
22
+ export const exported = (mask, name) => new RegExp(`\\bexport\\s+(?:(?:async\\s+)?function\\s*\\*?\\s*|(?:const|let|var)\\s+)${name}\\b|\\bexport\\s*\\{[^}]*\\b${name}\\b[^}]*\\}`).exec(mask);
17
23
  /** A return that hands the browser nothing: a bare return, a redirect, a status, a thrown signal. */
18
24
  const CONTROL_FLOW = /^(?:;|$|null\b|undefined\b|redirect\s*\(|notFound\s*\(|gone\s*\(|statusPage\s*\(|new\s+Response\s*\(|Response\s*\.)/;
19
25
  const closing = (mask, open) => {
@@ -30,42 +36,136 @@ const closing = (mask, open) => {
30
36
  }
31
37
  return mask.length;
32
38
  };
39
+ const opening = (mask, close) => {
40
+ let depth = 0;
41
+ for (let i = close; i >= 0; i--) {
42
+ const c = mask[i];
43
+ if (c === ")" || c === "}" || c === "]")
44
+ depth++;
45
+ else if (c === "(" || c === "{" || c === "[") {
46
+ depth--;
47
+ if (depth === 0)
48
+ return i;
49
+ }
50
+ }
51
+ return 0;
52
+ };
53
+ const CONTROL_HEAD = /(?:^|[^\w$.])(?:if|for(?:\s+await)?|while|catch|switch|with)\s*$/;
54
+ const BLOCK_WORD = /(?:^|[^\w$.])(?:else|try|finally|do)$/;
55
+ /**
56
+ * Whether the `{` at `open` starts a statement block of the enclosing function: after a control
57
+ * head, `else`/`try`/`finally`/`do`, or a statement boundary. A function, method, class, object or
58
+ * `case` body is not one, so a `return` inside it is never counted as the outer function's.
59
+ */
60
+ function isStatementBlock(mask, open) {
61
+ let p = open - 1;
62
+ while (p >= 0 && /\s/.test(mask[p] ?? ""))
63
+ p--;
64
+ const prev = mask[p];
65
+ if (prev === undefined || prev === ";" || prev === "{" || prev === "}")
66
+ return true;
67
+ if (prev === ")") {
68
+ const head = opening(mask, p);
69
+ return CONTROL_HEAD.test(mask.slice(Math.max(0, head - 16), head));
70
+ }
71
+ return BLOCK_WORD.test(mask.slice(Math.max(0, p - 8), p + 1));
72
+ }
73
+ /** Offsets of the `return`s that belong to the block at `open` itself, not to a nested function. */
74
+ function ownReturns(mask, open, close) {
75
+ const own = [];
76
+ const found = [];
77
+ for (let i = open; i < close; i++) {
78
+ const c = mask[i];
79
+ if (c === "{")
80
+ own.push(i === open || (own.at(-1) === true && isStatementBlock(mask, i)));
81
+ else if (c === "}")
82
+ own.pop();
83
+ else if (c === "r" &&
84
+ own.at(-1) === true &&
85
+ mask.startsWith("return", i) &&
86
+ !/[\w$.]/.test(mask[i - 1] ?? "") &&
87
+ !/[\w$]/.test(mask[i + 6] ?? "")) {
88
+ found.push(i);
89
+ }
90
+ }
91
+ return found;
92
+ }
93
+ const NUMBER = /^-?(?:0[xob][\da-f_]+|(?:\d[\d_]*\.?[\d_]*|\.\d[\d_]*)(?:e[+-]?\d+)?)n?$/i;
33
94
  /**
34
- * Whether the function exported as `name` may return data, read from its type-stripped source: an
35
- * arrow's expression body, or a `return <value>` that is not a redirect or a status.
95
+ * Whether the expression at `start` is one literal the runtime refuses without an output schema: an
96
+ * object, array, string, template, number or boolean, alone, not part of a larger expression.
36
97
  */
37
- function mayReturnData(js, name) {
98
+ function isDataLiteral(js, mask, start) {
99
+ let from = start;
100
+ let to = expressionEnd(mask, start);
101
+ for (;;) {
102
+ // Skip on the source: the mask blanks a string literal, quotes included.
103
+ while (from < to && /\s/.test(js[from] ?? ""))
104
+ from++;
105
+ while (to > from && /\s/.test(js[to - 1] ?? ""))
106
+ to--;
107
+ if (from >= to)
108
+ return false;
109
+ if (mask[from] !== "(" || closing(mask, from) !== to - 1)
110
+ break;
111
+ from++;
112
+ to--;
113
+ }
114
+ const first = mask[from];
115
+ if (first === "{" || first === "[")
116
+ return closing(mask, from) === to - 1;
117
+ const text = mask.slice(from, to);
118
+ if (text.trim() === "") {
119
+ const quote = js[from] ?? "";
120
+ return `"'\``.includes(quote) && js[to - 1] === quote;
121
+ }
122
+ return NUMBER.test(text) || text === "true" || text === "false";
123
+ }
124
+ /**
125
+ * What the function exported as `name` returns, read from its type-stripped source. `proven` when
126
+ * its expression body, or a `return` of its own body, is a data literal; `possible` when an
127
+ * expression body or some `return <value>` is not a redirect or a status; `none` otherwise.
128
+ */
129
+ function dataReturn(js, name) {
38
130
  const mask = codePositionMask(js);
39
131
  const found = exported(mask, name);
40
132
  if (found === null || found[0].startsWith("export {") || found[0].startsWith("export{")) {
41
- return true; // declared elsewhere in the file and re-exported: assume it does
133
+ return "possible"; // declared elsewhere in the file and re-exported: assume it does
42
134
  }
43
135
  const params = mask.indexOf("(", found.index + found[0].length);
44
136
  if (params === -1)
45
- return true;
137
+ return "possible";
46
138
  let at = closing(mask, params) + 1;
47
139
  while (/\s/.test(mask[at] ?? ""))
48
140
  at++;
49
141
  if (mask.startsWith("=>", at)) {
50
142
  at += 2;
51
- while (/\s/.test(mask[at] ?? ""))
143
+ while (/\s/.test(js[at] ?? ""))
52
144
  at++;
53
- if (mask[at] !== "{")
54
- return !CONTROL_FLOW.test(js.slice(at, at + 40));
145
+ if (mask[at] !== "{") {
146
+ if (CONTROL_FLOW.test(js.slice(at, at + 40)))
147
+ return "none";
148
+ return isDataLiteral(js, mask, at) ? "proven" : "possible";
149
+ }
55
150
  }
56
151
  if (mask[at] !== "{")
57
- return true;
58
- const body = mask.slice(at, closing(mask, at));
152
+ return "possible";
153
+ const end = closing(mask, at);
154
+ for (const index of ownReturns(mask, at, end)) {
155
+ if (isDataLiteral(js, mask, index + "return".length))
156
+ return "proven";
157
+ }
158
+ const body = mask.slice(at, end);
59
159
  for (const match of body.matchAll(/\breturn\b/g)) {
60
160
  const from = at + match.index + "return".length;
61
161
  const rest = js.slice(from, from + 40).replace(/^[ \t]+/, "");
62
162
  if (!CONTROL_FLOW.test(rest))
63
- return true;
163
+ return "possible";
64
164
  }
65
- return false;
165
+ return "none";
66
166
  }
67
167
  /** Where an expression starting at `start` ends: a `,`, `;` or closer at its own depth. */
68
- function expressionEnd(mask, start) {
168
+ export function expressionEnd(mask, start) {
69
169
  let depth = 0;
70
170
  for (let i = start; i < mask.length; i++) {
71
171
  const c = mask[i];
@@ -147,8 +247,10 @@ export function missingOutputSchemas(content) {
147
247
  catch {
148
248
  js = content;
149
249
  }
150
- if (mayReturnData(js, name))
151
- missing.push({ name, schema, line: lineAt(content, fn.index) });
250
+ const returns = dataReturn(js, name);
251
+ if (returns !== "none") {
252
+ missing.push({ name, schema, line: lineAt(content, fn.index), proven: returns === "proven" });
253
+ }
152
254
  }
153
255
  return missing;
154
256
  }
@@ -163,14 +265,21 @@ export const missingOutputRule = {
163
265
  const content = ctx.sources.read(file);
164
266
  if (content === undefined)
165
267
  continue;
166
- for (const { name, schema, line } of missingOutputSchemas(content)) {
268
+ for (const { name, schema, line, proven } of missingOutputSchemas(content)) {
269
+ const returns = proven
270
+ ? "It returns a data literal, so every request that reaches that return fails"
271
+ : "Data it returns fails the request";
167
272
  findings.push(diagnostic({
168
273
  code: "NF-C030",
169
- severity: "warn",
274
+ severity: proven ? "error" : "warn",
170
275
  file,
171
276
  line,
172
- message: `${file} exports a ${name} but no ${schema}. Data it returns fails the request: everything sent to the browser needs an output schema. Export one: export const ${schema} = t.object({ ... })`,
173
- evidence: [`export: ${name}`, `missing: ${schema}`],
277
+ message: `${file} exports a ${name} but no ${schema}. ${returns}: everything sent to the browser needs an output schema. Export one: export const ${schema} = t.object({ ... })`,
278
+ evidence: [
279
+ `export: ${name}`,
280
+ `missing: ${schema}`,
281
+ ...(proven ? ["returns: a data literal"] : []),
282
+ ],
174
283
  verify: "nifra check",
175
284
  }));
176
285
  }
@@ -179,35 +288,208 @@ export const missingOutputRule = {
179
288
  },
180
289
  };
181
290
  const OUTPUT_DECLARATION = /\bexport\s+(?:const|let|var)\s+(?:loaderOutput|actionOutput)\b[^=]*=|\boutput\s*:/g;
291
+ /** The initializer of the top-level `const`/`let`/`var` named `name`, as an offset just past its `=`. */
292
+ function declarationOf(mask, name) {
293
+ const declaration = new RegExp(`(?:^|\\n)(?:export\\s+)?(?:const|let|var)\\s+${name.replaceAll("$", "\\$")}(?![\\w$])[^=]*=`).exec(mask);
294
+ return declaration === null ? undefined : declaration.index + declaration[0].length;
295
+ }
296
+ /**
297
+ * Where the schema an output declaration names is written: the expression itself, or, when it is a
298
+ * bare name, the initializer of the top-level declaration of that name in the same file, followed
299
+ * through aliases.
300
+ */
301
+ function schemaExpression(mask, start) {
302
+ let range = { start, end: expressionEnd(mask, start) };
303
+ const seen = new Set();
304
+ for (;;) {
305
+ const name = mask.slice(range.start, range.end).trim();
306
+ if (!/^[A-Za-z_$][\w$]*$/.test(name) || seen.has(name))
307
+ return range;
308
+ seen.add(name);
309
+ const from = declarationOf(mask, name);
310
+ if (from === undefined)
311
+ return range;
312
+ range = { start: from, end: expressionEnd(mask, from) };
313
+ }
314
+ }
315
+ /** A name used as a value: not an object key, a member, a callee, or the object of a member. */
316
+ const VALUE_NAME = /(?<![\w$.])[A-Za-z_$][\w$]*(?![\w$])(?!\s*[:(.])/g;
317
+ /** The module `name` is imported from as a named import, and its name there. */
318
+ function importOf(source, name) {
319
+ // The mask blanks the specifier string, so it is read from the source past `from`.
320
+ for (const clause of source.mask.matchAll(/\bimport\s+(?:type\s+)?\{([^}]*)\}\s*from\b/g)) {
321
+ const quoted = /^\s*(["'])([^"']+)\1/.exec(source.content.slice(clause.index + clause[0].length));
322
+ if (quoted === null)
323
+ continue;
324
+ for (const element of (clause[1] ?? "").split(",")) {
325
+ const [imported, local = imported] = element
326
+ .trim()
327
+ .replace(/^type\s+/, "")
328
+ .split(/\s+as\s+/);
329
+ if (local === name && imported !== undefined)
330
+ return { specifier: quoted[2] ?? "", name: imported };
331
+ }
332
+ }
333
+ return undefined;
334
+ }
335
+ /**
336
+ * Every place an output schema is written: its own expression, then each schema it names inside it
337
+ * (`t.object({ user: userSchema })`), followed to this file's top-level declaration of that name or
338
+ * to the project file it is imported from. A schema under `declassified(...)` is not followed.
339
+ */
340
+ function schemaRanges(origin, start, load) {
341
+ const ranges = [{ source: origin, ...schemaExpression(origin.mask, start) }];
342
+ const seen = new Set();
343
+ // An array iterator reads the length each step, so ranges pushed below are walked too.
344
+ for (const { source, start: from, end } of ranges) {
345
+ const declassified = [];
346
+ for (const call of source.mask.slice(from, end).matchAll(/\bdeclassified\s*\(/g)) {
347
+ const open = from + call.index + call[0].length - 1;
348
+ declassified.push([open, closing(source.mask, open)]);
349
+ }
350
+ for (const reference of source.mask.slice(from, end).matchAll(VALUE_NAME)) {
351
+ const at = from + reference.index;
352
+ if (declassified.some(([open, close]) => at > open && at < close))
353
+ continue;
354
+ const name = reference[0];
355
+ if (seen.has(`${source.file}#${name}`))
356
+ continue;
357
+ seen.add(`${source.file}#${name}`);
358
+ const local = declarationOf(source.mask, name);
359
+ if (local !== undefined) {
360
+ ranges.push({ source, start: local, end: expressionEnd(source.mask, local) });
361
+ continue;
362
+ }
363
+ const imported = importOf(source, name);
364
+ const target = imported === undefined ? undefined : load(source.file, imported.specifier);
365
+ const there = target === undefined ? undefined : declarationOf(target.mask, imported?.name ?? "");
366
+ if (target !== undefined && there !== undefined) {
367
+ ranges.push({ source: target, start: there, end: expressionEnd(target.mask, there) });
368
+ }
369
+ }
370
+ }
371
+ return ranges;
372
+ }
182
373
  export const sensitiveOutputRule = {
183
374
  code: "NF-C031",
184
375
  title: "Sensitive field in an output schema",
185
376
  async scan(ctx) {
186
377
  const findings = [];
378
+ const resolve = createSpecifierResolver();
379
+ const realRoot = (() => {
380
+ try {
381
+ return realpathSync(ctx.root);
382
+ }
383
+ catch {
384
+ return ctx.root;
385
+ }
386
+ })();
387
+ const sources = new Map();
388
+ const sourceOf = (file) => {
389
+ if (!sources.has(file)) {
390
+ const content = ctx.sources.read(file);
391
+ sources.set(file, content === undefined ? undefined : { file, content, mask: codePositionMask(content) });
392
+ }
393
+ return sources.get(file);
394
+ };
395
+ // Only project source: an installed package's schemas are not the app's to rename.
396
+ const load = (from, specifier) => {
397
+ const target = resolve(join(ctx.root, from), specifier);
398
+ if (target === undefined)
399
+ return undefined;
400
+ const rel = relative(realRoot, target).replaceAll("\\", "/");
401
+ if (rel.startsWith("../") || isAbsolute(rel) || rel.split("/").includes("node_modules")) {
402
+ return undefined;
403
+ }
404
+ return sourceOf(rel);
405
+ };
406
+ // A schema several declarations name, or several routes import, is reported once.
407
+ const reported = new Set();
187
408
  for (const { file, classification } of zonedFiles(ctx).files) {
188
409
  if (classification.zone !== "route-backend" && classification.zone !== "fn")
189
410
  continue;
190
- const content = ctx.sources.read(file);
191
- if (content === undefined)
411
+ const origin = sourceOf(file);
412
+ if (origin === undefined)
192
413
  continue;
193
- const mask = codePositionMask(content);
194
- for (const declaration of mask.matchAll(OUTPUT_DECLARATION)) {
195
- const start = declaration.index + declaration[0].length;
196
- for (const { key, index } of sensitiveKeys(content, mask, start, expressionEnd(mask, start))) {
197
- findings.push(diagnostic({
198
- code: "NF-C031",
199
- severity: "error",
200
- file,
201
- line: lineAt(content, index),
202
- message: `${file} declares "${key}" in an output schema, a field name that usually holds a credential or personal identifier. Remove it, or wrap its schema in t.declassified("why it may reach the browser", ...)`,
203
- evidence: [`field: ${key}`],
204
- verify: "nifra check",
205
- }));
414
+ for (const declaration of origin.mask.matchAll(OUTPUT_DECLARATION)) {
415
+ const ranges = schemaRanges(origin, declaration.index + declaration[0].length, load);
416
+ for (const { source, start, end } of ranges) {
417
+ for (const { key, index } of sensitiveKeys(source.content, source.mask, start, end)) {
418
+ if (reported.has(`${source.file}:${index}`))
419
+ continue;
420
+ reported.add(`${source.file}:${index}`);
421
+ findings.push(diagnostic({
422
+ code: "NF-C031",
423
+ severity: "error",
424
+ file: source.file,
425
+ line: lineAt(source.content, index),
426
+ message: `${source.file} declares "${key}" in an output schema, a field name that usually holds a credential or personal identifier. Remove it, or wrap its schema in t.declassified("why it may reach the browser", ...)`,
427
+ evidence: [`field: ${key}`],
428
+ verify: "nifra check",
429
+ }));
430
+ }
206
431
  }
207
432
  }
208
433
  }
209
434
  return findings.sort(byPlace);
210
435
  },
211
436
  };
212
- export const dataGuardRules = Object.freeze([missingOutputRule, sensitiveOutputRule]);
437
+ export const staleGeneratedOutputRule = {
438
+ code: "NF-C033",
439
+ title: "Generated output schema out of date",
440
+ async scan(ctx) {
441
+ const files = zonedFiles(ctx)
442
+ .files.filter((entry) => entry.classification.zone === "route-backend")
443
+ .map((entry) => entry.file)
444
+ .filter((file) => ctx.sources.read(file)?.includes("nifra:generated") === true);
445
+ if (files.length === 0)
446
+ return [];
447
+ const { staleGeneratedSchemas } = await import("../output-schemas.js");
448
+ const { stale, unchecked, warnings } = await staleGeneratedSchemas(ctx.root, files, (file) => ctx.sources.read(file));
449
+ // A generated schema that could not be compared is reported, never passed silently.
450
+ const notChecked = [
451
+ ...warnings.map((warning) => diagnostic({
452
+ code: "NF-C033",
453
+ severity: "warn",
454
+ message: `${files.length} generated output schema(s) were not checked: ${warning}`,
455
+ evidence: files.map((file) => `file: ${file}`),
456
+ verify: "nifra schemas",
457
+ })),
458
+ ...unchecked.map((entry) => diagnostic({
459
+ code: "NF-C033",
460
+ severity: "warn",
461
+ file: entry.file,
462
+ line: entry.line,
463
+ message: `${entry.file}'s generated ${entry.schema} was not checked: ${entry.reason ?? "its type could not be read"}`,
464
+ evidence: [`schema: ${entry.schema}`],
465
+ verify: "nifra schemas",
466
+ })),
467
+ ];
468
+ return [
469
+ ...notChecked,
470
+ ...stale.map((entry) => {
471
+ const fn = entry.schema === "loaderOutput" ? "loader" : "action";
472
+ const change = entry.edited === true
473
+ ? "it was edited by hand since"
474
+ : entry.dropped.length > 0
475
+ ? `it now returns ${entry.dropped.join(", ")}, which the schema drops`
476
+ : "what it returns has changed";
477
+ return diagnostic({
478
+ code: "NF-C033",
479
+ severity: "error",
480
+ file: entry.file,
481
+ line: entry.line,
482
+ message: `${entry.file}'s ${entry.schema} was generated from the ${fn}'s return type, and ${change}. Run \`nifra schemas --write\` to regenerate it, or delete its "nifra:generated" line to own it by hand.`,
483
+ evidence: [`schema: ${entry.schema}`, ...entry.dropped.map((path) => `dropped: ${path}`)],
484
+ verify: "nifra schemas",
485
+ });
486
+ }),
487
+ ];
488
+ },
489
+ };
490
+ export const dataGuardRules = Object.freeze([
491
+ missingOutputRule,
492
+ sensitiveOutputRule,
493
+ staleGeneratedOutputRule,
494
+ ]);
213
495
  //# sourceMappingURL=data-guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-guard.js","sourceRoot":"","sources":["../../src/rules/data-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-guard.js","sourceRoot":"","sources":["../../src/rules/data-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CheckRule } from "./index.js";
2
+ /** Every gate that reads backend/app.ts sees nothing in a retired root file, so the check fails here. */
3
+ export declare const retiredLayoutRule: CheckRule;
4
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/rules/layout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,yGAAyG;AACzG,eAAO,MAAM,iBAAiB,EAAE,SAgB/B,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { retiredRootFiles } from "../app-files.js";
2
+ import { diagnostic } from "../diagnostics.js";
3
+ /** Every gate that reads backend/app.ts sees nothing in a retired root file, so the check fails here. */
4
+ export const retiredLayoutRule = {
5
+ code: "NF-C038",
6
+ title: "Retired root layout",
7
+ async scan(ctx) {
8
+ return retiredRootFiles(ctx.root).map(([from, to]) => diagnostic({
9
+ code: "NF-C038",
10
+ severity: "error",
11
+ file: from,
12
+ line: 1,
13
+ message: `${from} is the retired root layout; nifra reads it at ${to}. Until it moves, nifra check runs no contract gate on this app, and the commands that load it refuse it. \`nifra migrate layout\` shows the move; \`--write\` makes it`,
14
+ fix: { recipe: "layout.migrate", command: "nifra migrate layout --write" },
15
+ verify: "nifra check --lints-only",
16
+ }));
17
+ },
18
+ };
19
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/rules/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAG9C,yGAAyG;AACzG,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,qBAAqB;IAC5B,KAAK,CAAC,IAAI,CAAC,GAAG;QACZ,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CACnD,UAAU,CAAC;YACT,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,GAAG,IAAI,kDAAkD,EAAE,yKAAyK;YAC7O,GAAG,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,8BAA8B,EAAE;YAC1E,MAAM,EAAE,0BAA0B;SACnC,CAAC,CACH,CAAA;IACH,CAAC;CACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/rules/legacy.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,YAAY,CAAA;AAExD;yDACyD;AACzD,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB7D,CAAA;AAsBF,sGAAsG;AACtG,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAkB7C,CAAA;AAm4BF,qFAAqF;AACrF,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAgB1C,CAAA"}
1
+ {"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/rules/legacy.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,YAAY,CAAA;AAExD;yDACyD;AACzD,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB7D,CAAA;AAsBF,sGAAsG;AACtG,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAkB7C,CAAA;AAmgCF,qFAAqF;AACrF,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAiB1C,CAAA"}