@nifrajs/cli 4.0.2 → 5.1.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 (364) hide show
  1. package/README.md +10 -2
  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 +9 -2
  12. package/dist/assure-hydration.js.map +1 -1
  13. package/dist/assure.d.ts +12 -2
  14. package/dist/assure.d.ts.map +1 -1
  15. package/dist/assure.js +59 -8
  16. package/dist/assure.js.map +1 -1
  17. package/dist/capabilities-tool.d.ts.map +1 -1
  18. package/dist/capabilities-tool.js +36 -9
  19. package/dist/capabilities-tool.js.map +1 -1
  20. package/dist/check-diagnostics.d.ts +22 -2
  21. package/dist/check-diagnostics.d.ts.map +1 -1
  22. package/dist/check-diagnostics.js +54 -7
  23. package/dist/check-diagnostics.js.map +1 -1
  24. package/dist/check-scan.d.ts +83 -24
  25. package/dist/check-scan.d.ts.map +1 -1
  26. package/dist/check-scan.js +1516 -318
  27. package/dist/check-scan.js.map +1 -1
  28. package/dist/check.d.ts +2 -2
  29. package/dist/check.d.ts.map +1 -1
  30. package/dist/check.js +203 -70
  31. package/dist/check.js.map +1 -1
  32. package/dist/cli.d.ts +9 -0
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +215 -50
  35. package/dist/cli.js.map +1 -1
  36. package/dist/client-module.d.ts +20 -0
  37. package/dist/client-module.d.ts.map +1 -0
  38. package/dist/client-module.js +73 -0
  39. package/dist/client-module.js.map +1 -0
  40. package/dist/command-catalog.d.ts +24 -5
  41. package/dist/command-catalog.d.ts.map +1 -1
  42. package/dist/command-catalog.js +194 -45
  43. package/dist/command-catalog.js.map +1 -1
  44. package/dist/component-check.d.ts +13 -0
  45. package/dist/component-check.d.ts.map +1 -0
  46. package/dist/component-check.js +59 -0
  47. package/dist/component-check.js.map +1 -0
  48. package/dist/contract-proof.d.ts +1 -1
  49. package/dist/contract-proof.d.ts.map +1 -1
  50. package/dist/contract-proof.js +2 -24
  51. package/dist/contract-proof.js.map +1 -1
  52. package/dist/contracts.d.ts +19 -0
  53. package/dist/contracts.d.ts.map +1 -1
  54. package/dist/contracts.js +50 -3
  55. package/dist/contracts.js.map +1 -1
  56. package/dist/db-tool.d.ts.map +1 -1
  57. package/dist/db-tool.js +4 -3
  58. package/dist/db-tool.js.map +1 -1
  59. package/dist/dev-bun-config.d.ts +5 -1
  60. package/dist/dev-bun-config.d.ts.map +1 -1
  61. package/dist/dev-bun-config.js +44 -11
  62. package/dist/dev-bun-config.js.map +1 -1
  63. package/dist/dev-feed-tool.d.ts +18 -1
  64. package/dist/dev-feed-tool.d.ts.map +1 -1
  65. package/dist/dev-feed-tool.js +93 -0
  66. package/dist/dev-feed-tool.js.map +1 -1
  67. package/dist/diagnostics.d.ts +3 -0
  68. package/dist/diagnostics.d.ts.map +1 -1
  69. package/dist/diagnostics.js.map +1 -1
  70. package/dist/diff-tool.d.ts +9 -8
  71. package/dist/diff-tool.d.ts.map +1 -1
  72. package/dist/diff-tool.js +28 -24
  73. package/dist/diff-tool.js.map +1 -1
  74. package/dist/doctor.d.ts +13 -0
  75. package/dist/doctor.d.ts.map +1 -1
  76. package/dist/doctor.js +23 -15
  77. package/dist/doctor.js.map +1 -1
  78. package/dist/env-file.d.ts +6 -0
  79. package/dist/env-file.d.ts.map +1 -1
  80. package/dist/env-file.js +6 -0
  81. package/dist/env-file.js.map +1 -1
  82. package/dist/fix-recipes.d.ts +2 -0
  83. package/dist/fix-recipes.d.ts.map +1 -1
  84. package/dist/fix-recipes.js +102 -2
  85. package/dist/fix-recipes.js.map +1 -1
  86. package/dist/hand-built-manifest.d.ts +27 -0
  87. package/dist/hand-built-manifest.d.ts.map +1 -0
  88. package/dist/hand-built-manifest.js +124 -0
  89. package/dist/hand-built-manifest.js.map +1 -0
  90. package/dist/hooks-report.d.ts +23 -0
  91. package/dist/hooks-report.d.ts.map +1 -0
  92. package/dist/hooks-report.js +104 -0
  93. package/dist/hooks-report.js.map +1 -0
  94. package/dist/init-agents.d.ts +18 -2
  95. package/dist/init-agents.d.ts.map +1 -1
  96. package/dist/init-agents.js +20 -13
  97. package/dist/init-agents.js.map +1 -1
  98. package/dist/internal/config-paths.d.ts +16 -0
  99. package/dist/internal/config-paths.d.ts.map +1 -0
  100. package/dist/internal/config-paths.js +124 -0
  101. package/dist/internal/config-paths.js.map +1 -0
  102. package/dist/internal/installed-package.d.ts +4 -0
  103. package/dist/internal/installed-package.d.ts.map +1 -0
  104. package/dist/internal/installed-package.js +17 -0
  105. package/dist/internal/installed-package.js.map +1 -0
  106. package/dist/internal/nifra-project.d.ts +41 -0
  107. package/dist/internal/nifra-project.d.ts.map +1 -0
  108. package/dist/internal/nifra-project.js +183 -0
  109. package/dist/internal/nifra-project.js.map +1 -0
  110. package/dist/internal/project-specifiers.d.ts +29 -0
  111. package/dist/internal/project-specifiers.d.ts.map +1 -0
  112. package/dist/internal/project-specifiers.js +435 -0
  113. package/dist/internal/project-specifiers.js.map +1 -0
  114. package/dist/internal/script-kind.d.ts.map +1 -1
  115. package/dist/internal/script-kind.js +2 -1
  116. package/dist/internal/script-kind.js.map +1 -1
  117. package/dist/internal/source-facts.d.ts +8 -1
  118. package/dist/internal/source-facts.d.ts.map +1 -1
  119. package/dist/internal/source-facts.js +22 -5
  120. package/dist/internal/source-facts.js.map +1 -1
  121. package/dist/internal/typescript-import.d.ts +1 -1
  122. package/dist/internal/typescript-import.d.ts.map +1 -1
  123. package/dist/internal/typescript-import.js +10 -6
  124. package/dist/internal/typescript-import.js.map +1 -1
  125. package/dist/introspect.d.ts +15 -6
  126. package/dist/introspect.d.ts.map +1 -1
  127. package/dist/introspect.js +87 -25
  128. package/dist/introspect.js.map +1 -1
  129. package/dist/levels-tool.d.ts.map +1 -1
  130. package/dist/levels-tool.js +98 -23
  131. package/dist/levels-tool.js.map +1 -1
  132. package/dist/load.d.ts +33 -10
  133. package/dist/load.d.ts.map +1 -1
  134. package/dist/load.js +60 -10
  135. package/dist/load.js.map +1 -1
  136. package/dist/mcp-context.d.ts +5 -5
  137. package/dist/mcp-context.d.ts.map +1 -1
  138. package/dist/mcp-context.js +8 -23
  139. package/dist/mcp-context.js.map +1 -1
  140. package/dist/mcp-delegate.d.ts +2 -2
  141. package/dist/mcp-delegate.d.ts.map +1 -1
  142. package/dist/mcp-delegate.js +19 -7
  143. package/dist/mcp-delegate.js.map +1 -1
  144. package/dist/mcp-exec.d.ts +13 -4
  145. package/dist/mcp-exec.d.ts.map +1 -1
  146. package/dist/mcp-exec.js +56 -14
  147. package/dist/mcp-exec.js.map +1 -1
  148. package/dist/mcp-http.js +1 -1
  149. package/dist/mcp-io.d.ts +30 -0
  150. package/dist/mcp-io.d.ts.map +1 -1
  151. package/dist/mcp-io.js +63 -0
  152. package/dist/mcp-io.js.map +1 -1
  153. package/dist/mcp-isolate.d.ts.map +1 -1
  154. package/dist/mcp-isolate.js +3 -2
  155. package/dist/mcp-isolate.js.map +1 -1
  156. package/dist/mcp-path.d.ts +2 -1
  157. package/dist/mcp-path.d.ts.map +1 -1
  158. package/dist/mcp-path.js +9 -24
  159. package/dist/mcp-path.js.map +1 -1
  160. package/dist/mcp-project-child.js +1 -1
  161. package/dist/mcp-project-child.js.map +1 -1
  162. package/dist/mcp-root.d.ts.map +1 -1
  163. package/dist/mcp-root.js +50 -10
  164. package/dist/mcp-root.js.map +1 -1
  165. package/dist/mcp-ws.d.ts.map +1 -1
  166. package/dist/mcp-ws.js +3 -1
  167. package/dist/mcp-ws.js.map +1 -1
  168. package/dist/mcp.d.ts.map +1 -1
  169. package/dist/mcp.js +48 -19
  170. package/dist/mcp.js.map +1 -1
  171. package/dist/migrate-layout.d.ts +47 -1
  172. package/dist/migrate-layout.d.ts.map +1 -1
  173. package/dist/migrate-layout.js +1972 -170
  174. package/dist/migrate-layout.js.map +1 -1
  175. package/dist/output-schemas.d.ts +128 -0
  176. package/dist/output-schemas.d.ts.map +1 -0
  177. package/dist/output-schemas.js +975 -0
  178. package/dist/output-schemas.js.map +1 -0
  179. package/dist/port.d.ts.map +1 -1
  180. package/dist/port.js +3 -2
  181. package/dist/port.js.map +1 -1
  182. package/dist/project-facts.d.ts +15 -4
  183. package/dist/project-facts.d.ts.map +1 -1
  184. package/dist/project-facts.js +1 -0
  185. package/dist/project-facts.js.map +1 -1
  186. package/dist/project-path.d.ts +6 -0
  187. package/dist/project-path.d.ts.map +1 -1
  188. package/dist/project-path.js +48 -14
  189. package/dist/project-path.js.map +1 -1
  190. package/dist/recipes/5.0.0.d.ts +11 -0
  191. package/dist/recipes/5.0.0.d.ts.map +1 -0
  192. package/dist/recipes/5.0.0.js +34 -0
  193. package/dist/recipes/5.0.0.js.map +1 -0
  194. package/dist/recipes/index.d.ts +7 -0
  195. package/dist/recipes/index.d.ts.map +1 -1
  196. package/dist/recipes/index.js +2 -0
  197. package/dist/recipes/index.js.map +1 -1
  198. package/dist/release-verification.d.ts +5 -0
  199. package/dist/release-verification.d.ts.map +1 -1
  200. package/dist/release-verification.js +14 -0
  201. package/dist/release-verification.js.map +1 -1
  202. package/dist/replay.d.ts.map +1 -1
  203. package/dist/replay.js +12 -3
  204. package/dist/replay.js.map +1 -1
  205. package/dist/review.d.ts +3 -1
  206. package/dist/review.d.ts.map +1 -1
  207. package/dist/review.js +43 -7
  208. package/dist/review.js.map +1 -1
  209. package/dist/rules/codes.d.ts +12 -0
  210. package/dist/rules/codes.d.ts.map +1 -1
  211. package/dist/rules/codes.js +12 -0
  212. package/dist/rules/codes.js.map +1 -1
  213. package/dist/rules/comment-markers.d.ts +16 -7
  214. package/dist/rules/comment-markers.d.ts.map +1 -1
  215. package/dist/rules/comment-markers.js +58 -19
  216. package/dist/rules/comment-markers.js.map +1 -1
  217. package/dist/rules/contract-visibility.d.ts +3 -0
  218. package/dist/rules/contract-visibility.d.ts.map +1 -0
  219. package/dist/rules/contract-visibility.js +337 -0
  220. package/dist/rules/contract-visibility.js.map +1 -0
  221. package/dist/rules/data-guard.d.ts +13 -0
  222. package/dist/rules/data-guard.d.ts.map +1 -1
  223. package/dist/rules/data-guard.js +356 -37
  224. package/dist/rules/data-guard.js.map +1 -1
  225. package/dist/rules/layout.d.ts +4 -0
  226. package/dist/rules/layout.d.ts.map +1 -0
  227. package/dist/rules/layout.js +19 -0
  228. package/dist/rules/layout.js.map +1 -0
  229. package/dist/rules/legacy.d.ts.map +1 -1
  230. package/dist/rules/legacy.js +178 -44
  231. package/dist/rules/legacy.js.map +1 -1
  232. package/dist/rules/pages.d.ts +50 -0
  233. package/dist/rules/pages.d.ts.map +1 -1
  234. package/dist/rules/pages.js +436 -4
  235. package/dist/rules/pages.js.map +1 -1
  236. package/dist/rules/routes.d.ts +6 -0
  237. package/dist/rules/routes.d.ts.map +1 -1
  238. package/dist/rules/routes.js +111 -16
  239. package/dist/rules/routes.js.map +1 -1
  240. package/dist/rules/secrets.js +2 -2
  241. package/dist/rules/secrets.js.map +1 -1
  242. package/dist/rules/security.d.ts +13 -1
  243. package/dist/rules/security.d.ts.map +1 -1
  244. package/dist/rules/security.js +313 -69
  245. package/dist/rules/security.js.map +1 -1
  246. package/dist/rules/zones.d.ts +13 -0
  247. package/dist/rules/zones.d.ts.map +1 -1
  248. package/dist/rules/zones.js +218 -44
  249. package/dist/rules/zones.js.map +1 -1
  250. package/dist/scaffold.d.ts.map +1 -1
  251. package/dist/scaffold.js +6 -4
  252. package/dist/scaffold.js.map +1 -1
  253. package/dist/sdk.d.ts.map +1 -1
  254. package/dist/sdk.js +14 -5
  255. package/dist/sdk.js.map +1 -1
  256. package/dist/stylex-migrate.d.ts.map +1 -1
  257. package/dist/stylex-migrate.js +290 -24
  258. package/dist/stylex-migrate.js.map +1 -1
  259. package/dist/test-tool.d.ts.map +1 -1
  260. package/dist/test-tool.js +6 -3
  261. package/dist/test-tool.js.map +1 -1
  262. package/dist/typecheck-coverage.d.ts +20 -0
  263. package/dist/typecheck-coverage.d.ts.map +1 -0
  264. package/dist/typecheck-coverage.js +129 -0
  265. package/dist/typecheck-coverage.js.map +1 -0
  266. package/dist/upgrade.d.ts +84 -0
  267. package/dist/upgrade.d.ts.map +1 -1
  268. package/dist/upgrade.js +498 -78
  269. package/dist/upgrade.js.map +1 -1
  270. package/dist/verification-plan.d.ts.map +1 -1
  271. package/dist/verification-plan.js +16 -2
  272. package/dist/verification-plan.js.map +1 -1
  273. package/dist/version-drift.d.ts +22 -0
  274. package/dist/version-drift.d.ts.map +1 -0
  275. package/dist/version-drift.js +94 -0
  276. package/dist/version-drift.js.map +1 -0
  277. package/dist/web-app-options.d.ts +1 -1
  278. package/dist/web-app-options.d.ts.map +1 -1
  279. package/dist/web-app-options.js +1 -1
  280. package/dist/web-app-options.js.map +1 -1
  281. package/dist/work-graph.d.ts.map +1 -1
  282. package/dist/work-graph.js +20 -8
  283. package/dist/work-graph.js.map +1 -1
  284. package/docs/examples.json +55 -7
  285. package/docs/llms-full.txt +2043 -222
  286. package/docs/types.json +1573 -246
  287. package/package.json +11 -12
  288. package/src/agent-files.ts +203 -0
  289. package/src/app-files.ts +34 -4
  290. package/src/assure-hydration.ts +18 -2
  291. package/src/assure.ts +88 -10
  292. package/src/capabilities-tool.ts +47 -9
  293. package/src/check-diagnostics.ts +75 -9
  294. package/src/check-scan.ts +1816 -377
  295. package/src/check.ts +258 -81
  296. package/src/cli.ts +242 -37
  297. package/src/client-module.ts +97 -0
  298. package/src/command-catalog.ts +237 -52
  299. package/src/component-check.ts +79 -0
  300. package/src/contract-proof.ts +3 -25
  301. package/src/contracts.ts +60 -3
  302. package/src/db-tool.ts +5 -2
  303. package/src/dev-bun-config.ts +51 -10
  304. package/src/dev-feed-tool.ts +112 -1
  305. package/src/diagnostics.ts +3 -0
  306. package/src/diff-tool.ts +33 -26
  307. package/src/doctor.ts +43 -21
  308. package/src/env-file.ts +7 -0
  309. package/src/fix-recipes.ts +116 -2
  310. package/src/hand-built-manifest.ts +144 -0
  311. package/src/hooks-report.ts +135 -0
  312. package/src/init-agents.ts +21 -14
  313. package/src/internal/config-paths.ts +154 -0
  314. package/src/internal/installed-package.ts +15 -0
  315. package/src/internal/nifra-project.ts +191 -0
  316. package/src/internal/project-specifiers.ts +477 -0
  317. package/src/internal/script-kind.ts +2 -1
  318. package/src/internal/source-facts.ts +48 -5
  319. package/src/internal/typescript-import.ts +15 -6
  320. package/src/introspect.ts +104 -28
  321. package/src/levels-tool.ts +124 -29
  322. package/src/load.ts +107 -17
  323. package/src/mcp-context.ts +12 -25
  324. package/src/mcp-delegate.ts +22 -10
  325. package/src/mcp-exec.ts +68 -18
  326. package/src/mcp-http.ts +1 -1
  327. package/src/mcp-io.ts +74 -0
  328. package/src/mcp-isolate.ts +9 -2
  329. package/src/mcp-path.ts +8 -22
  330. package/src/mcp-project-child.ts +1 -1
  331. package/src/mcp-root.ts +58 -8
  332. package/src/mcp-ws.ts +4 -2
  333. package/src/mcp.ts +56 -22
  334. package/src/migrate-layout.ts +2257 -176
  335. package/src/output-schemas.ts +1240 -0
  336. package/src/port.ts +3 -2
  337. package/src/project-facts.ts +17 -3
  338. package/src/project-path.ts +44 -13
  339. package/src/recipes/5.0.0.ts +35 -0
  340. package/src/recipes/index.ts +10 -0
  341. package/src/release-verification.ts +20 -0
  342. package/src/replay.ts +14 -3
  343. package/src/review.ts +44 -10
  344. package/src/rules/codes.ts +12 -0
  345. package/src/rules/comment-markers.ts +57 -21
  346. package/src/rules/contract-visibility.ts +383 -0
  347. package/src/rules/data-guard.ts +391 -42
  348. package/src/rules/layout.ts +22 -0
  349. package/src/rules/legacy.ts +206 -52
  350. package/src/rules/pages.ts +481 -4
  351. package/src/rules/routes.ts +124 -16
  352. package/src/rules/secrets.ts +2 -2
  353. package/src/rules/security.ts +391 -72
  354. package/src/rules/zones.ts +232 -42
  355. package/src/scaffold.ts +6 -4
  356. package/src/sdk.ts +14 -5
  357. package/src/stylex-migrate.ts +251 -24
  358. package/src/test-tool.ts +12 -3
  359. package/src/typecheck-coverage.ts +134 -0
  360. package/src/upgrade.ts +576 -72
  361. package/src/verification-plan.ts +33 -2
  362. package/src/version-drift.ts +118 -0
  363. package/src/web-app-options.ts +2 -2
  364. package/src/work-graph.ts +17 -12
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * NF-C027: a page file whose URL sits under the backend's mount path.
3
3
  *
4
- * `backend/app.ts`'s backend is mounted at `apiPrefix` (default `/api`) ahead of page routing, and
4
+ * `backend/app.ts`'s backend is mounted at `apiPrefix`, when one is set, ahead of page routing, and
5
5
  * its 404 is final, so `routes/api/report.tsx` never renders - every request for it gets the
6
6
  * backend's 404. `createWebApp` refuses such an app at startup and `nifra build` refuses to build
7
7
  * it; this reports it earlier, without running app code (check's pre-`loadApp` invariant): the
@@ -14,10 +14,14 @@
14
14
  import { existsSync, readFileSync } from "node:fs";
15
15
  import { join } from "node:path";
16
16
  import { discoverRoutes } from "@nifrajs/web/fs";
17
- import { shadowedPages } from "@nifrajs/web/route-manifest";
17
+ import { BACKEND_ROUTE_EXPORTS, shadowedPages } from "@nifrajs/web/route-manifest";
18
18
  import { BACKEND_APP_FILE, CONFIG_FILE, FRAMEWORK_FILE } from "../app-files.js";
19
19
  import { stripComments } from "../check-scan.js";
20
20
  import { diagnostic } from "../diagnostics.js";
21
+ import { codeUnitOrder } from "../internal/code-unit-order.js";
22
+ import { hasWebConfig } from "../internal/nifra-project.js";
23
+ import { scriptKindOf } from "../internal/script-kind.js";
24
+ import { loadRuleTypeScript } from "./typescript.js";
21
25
  const LITERAL_EXPORT = /\bexport\s+const\s+apiPrefix\s*(?::\s*string\s*)?=\s*(?:"([^"\\\r\n]*)"|'([^'\\\r\n]*)')\s*(?:as\s+const\s*)?(?:;|\r?\n|$)/;
22
26
  const MENTION = /\bapiPrefix\b/;
23
27
  const BACKEND_EXPORT = /\bexport\s+(?:const|let|var|function|class)\s+backend\b|\bexport\s*\{[^}]*\bbackend\b[^}]*\}/;
@@ -40,7 +44,7 @@ export const shadowedPageRule = {
40
44
  return [];
41
45
  if (!BACKEND_EXPORT.test(stripComments(readFileSync(backendFile, "utf8"))))
42
46
  return [];
43
- let apiPrefix = "/api";
47
+ let apiPrefix = "";
44
48
  // backend/framework.ts first: the generated server entry imports from it, and the build refuses
45
49
  // a nifra.config.ts whose forwarded fields differ from it.
46
50
  const configFile = CONFIG_FILES.find((file) => existsSync(join(ctx.root, file)));
@@ -84,5 +88,433 @@ export const shadowedPageRule = {
84
88
  return findings;
85
89
  },
86
90
  };
87
- export const pageRules = Object.freeze([shadowedPageRule]);
91
+ const IN_LAYOUTS = /\binLayouts\b/;
92
+ /** An import of the root layout from a page beside it, statically or dynamically. */
93
+ const importsRootLayout = (code, layoutFile) => {
94
+ const stem = layoutFile.replace(/\.[^./]+$/, "");
95
+ return [`"./${stem}`, `'./${stem}`].some((quoted) => [`${quoted}"`, `${quoted}'`, `${quoted}.`].some((opening) => {
96
+ for (let at = code.indexOf(opening); at !== -1; at = code.indexOf(opening, at + 1)) {
97
+ const before = code.slice(Math.max(0, at - 16), at);
98
+ if (/(?:\bfrom|\bimport)\s*\(?\s*$/.test(before))
99
+ return true;
100
+ }
101
+ return false;
102
+ }));
103
+ };
104
+ /**
105
+ * NF-C034: a root status page (`_404`, `_<status>`) beside a root `_layout` that imports that layout
106
+ * to wrap itself. Status pages render inside their layouts, so such a page renders the layout twice.
107
+ * A page that names `inLayouts` at all has decided, so it is not reported.
108
+ */
109
+ export const statusLayoutRule = {
110
+ code: "NF-C034",
111
+ title: "Root status page wraps the root layout itself",
112
+ async scan(ctx) {
113
+ const routesDir = join(ctx.root, "routes");
114
+ if (!existsSync(routesDir))
115
+ return [];
116
+ let manifest;
117
+ try {
118
+ manifest = discoverRoutes(routesDir);
119
+ }
120
+ catch {
121
+ return [];
122
+ }
123
+ const layout = manifest.layouts._layout;
124
+ if (layout === undefined)
125
+ return [];
126
+ const pages = [
127
+ ...(manifest.notFound === undefined ? [] : [manifest.notFound.file]),
128
+ ...Object.values(manifest.statusPages ?? {}).map((page) => page.file),
129
+ ];
130
+ const findings = [];
131
+ for (const file of pages.sort()) {
132
+ const source = stripComments(readFileSync(join(routesDir, file), "utf8"));
133
+ if (IN_LAYOUTS.test(source) || !importsRootLayout(source, layout.file))
134
+ continue;
135
+ findings.push(diagnostic({
136
+ code: "NF-C034",
137
+ severity: "warn",
138
+ file: `routes/${file}`,
139
+ message: `routes/${file} imports routes/${layout.file} to wrap itself, and status pages render inside their layouts, so it renders routes/${layout.file} twice. Remove the wrap, or add \`export const inLayouts = false\` to keep rendering the page alone.`,
140
+ evidence: [`layout: routes/${layout.file}`],
141
+ verify: "nifra check",
142
+ }));
143
+ }
144
+ return findings;
145
+ },
146
+ };
147
+ /** `apiPrefix` as the app runs it: nifra.config.ts's own, else backend/framework.ts's, which every
148
+ * command takes for an option nifra.config.ts leaves unset. */
149
+ function effectiveApiPrefix({ framework, config }) {
150
+ const own = config === undefined ? { kind: "default" } : readStaticApiPrefix(config);
151
+ return own.kind !== "default" || framework === undefined ? own : readStaticApiPrefix(framework);
152
+ }
153
+ /**
154
+ * NF-C035: `backend/app.ts` exports a backend that is not served over HTTP, so a browser call to `/api`
155
+ * reaches page routing. The framework config sets no `apiPrefix`; loader-only is a valid choice, and
156
+ * the finding asks for it to be stated. An unreadable `apiPrefix` is NF-C027's.
157
+ */
158
+ export const implicitApiMountRule = {
159
+ code: "NF-C035",
160
+ title: "Backend not served over HTTP",
161
+ async scan(ctx) {
162
+ const backendFile = join(ctx.root, BACKEND_APP_FILE);
163
+ // An API-only app serves its backend itself; there is no page routing to fall into.
164
+ if (!existsSync(backendFile) || !hasWebConfig(ctx.root, "."))
165
+ return [];
166
+ if (!BACKEND_EXPORT.test(stripComments(readFileSync(backendFile, "utf8"))))
167
+ return [];
168
+ const read = (file) => existsSync(join(ctx.root, file)) ? readFileSync(join(ctx.root, file), "utf8") : undefined;
169
+ const sources = { framework: read(FRAMEWORK_FILE), config: read(CONFIG_FILE) };
170
+ if (sources.framework === undefined && sources.config === undefined)
171
+ return [];
172
+ if (effectiveApiPrefix(sources).kind !== "default")
173
+ return [];
174
+ const file = sources.framework === undefined ? CONFIG_FILE : FRAMEWORK_FILE;
175
+ return [
176
+ diagnostic({
177
+ code: "NF-C035",
178
+ severity: "warn",
179
+ file,
180
+ message: `${BACKEND_APP_FILE}'s backend is not served over HTTP, because ${file} sets no apiPrefix: a browser call to /api reaches page routing instead. Add \`export const apiPrefix = "/api"\` to ${file} to serve it there, as 4.x did by default, or \`export const apiPrefix = ""\` to keep it loader-only.`,
181
+ fix: { recipe: "framework.api-prefix", command: "nifra fix --code NF-C035" },
182
+ verify: "nifra check",
183
+ }),
184
+ ];
185
+ },
186
+ };
187
+ const appendLine = (source, line) => source === "" ? line : `${source}${source.endsWith("\n") ? "" : "\n"}${line}`;
188
+ /** Append `export const apiPrefix = "/api"` to a framework config that sets none, creating it if needed. */
189
+ export function withDefaultApiPrefix(source) {
190
+ if (source !== undefined && readStaticApiPrefix(source).kind !== "default")
191
+ return undefined;
192
+ return appendLine(source ?? "", 'export const apiPrefix = "/api"\n');
193
+ }
194
+ /**
195
+ * The edit that serves the backend at `/api`: the mount in backend/framework.ts, where the server
196
+ * entry reads it, or in nifra.config.ts when it is the only config. A file that needs no edit comes
197
+ * back `undefined`; an `apiPrefix` either file sets is never replaced.
198
+ */
199
+ export function apiPrefixFix(sources) {
200
+ if (effectiveApiPrefix(sources).kind !== "default")
201
+ return { framework: undefined, config: undefined };
202
+ return sources.framework === undefined
203
+ ? { framework: undefined, config: withDefaultApiPrefix(sources.config) }
204
+ : { framework: withDefaultApiPrefix(sources.framework), config: undefined };
205
+ }
206
+ const LOADER_EXPORT = /\bexport\s+(?:async\s+)?(?:const|let|var|function\*?)\s+loader\b|\bexport\s*\{[^}]*\bloader\b[^}]*\}/;
207
+ const SCRIPT_LAYOUT = /\.[cm]?[jt]sx?$/;
208
+ // Read from the node, not `ts.getModifiers`: TypeScript 7's API has no getModifiers or canHaveModifiers.
209
+ const hasModifier = (node, kind) => node.modifiers?.some((m) => m.kind === kind) === true;
210
+ /** The function an exported `name` names: a declaration, or a const initialized with one. */
211
+ function exportedFunction(ts, tree, name) {
212
+ for (const statement of tree.statements) {
213
+ if (ts.isFunctionDeclaration(statement)) {
214
+ if (statement.name?.text === name && hasModifier(statement, ts.SyntaxKind.ExportKeyword))
215
+ return statement;
216
+ continue;
217
+ }
218
+ if (!ts.isVariableStatement(statement))
219
+ continue;
220
+ if (!hasModifier(statement, ts.SyntaxKind.ExportKeyword))
221
+ continue;
222
+ for (const declaration of statement.declarationList.declarations) {
223
+ if (!ts.isIdentifier(declaration.name) || declaration.name.text !== name)
224
+ continue;
225
+ let init = declaration.initializer;
226
+ while (init !== undefined &&
227
+ (ts.isParenthesizedExpression(init) ||
228
+ ts.isAsExpression(init) ||
229
+ ts.isSatisfiesExpression(init))) {
230
+ init = init.expression;
231
+ }
232
+ if (init !== undefined && (ts.isArrowFunction(init) || ts.isFunctionExpression(init)))
233
+ return init;
234
+ }
235
+ }
236
+ return undefined;
237
+ }
238
+ /** Where an exported function `meta` reads its args' `data`: a destructured `data`, or `args.data`. */
239
+ export function metaDataReads(ts, tree) {
240
+ const meta = exportedFunction(ts, tree, "meta");
241
+ const param = meta?.parameters[0];
242
+ if (param === undefined)
243
+ return [];
244
+ const lineOf = (node) => tree.getLineAndCharacterOfPosition(node.getStart(tree)).line + 1;
245
+ if (ts.isObjectBindingPattern(param.name)) {
246
+ return param.name.elements
247
+ .filter((element) => (element.propertyName ?? element.name).getText(tree) === "data")
248
+ .map(lineOf);
249
+ }
250
+ if (!ts.isIdentifier(param.name) || meta?.body === undefined)
251
+ return [];
252
+ const args = param.name.text;
253
+ const reads = [];
254
+ const visit = (node) => {
255
+ if (ts.isPropertyAccessExpression(node) &&
256
+ ts.isIdentifier(node.expression) &&
257
+ node.expression.text === args &&
258
+ node.name.text === "data") {
259
+ reads.push(lineOf(node));
260
+ }
261
+ ts.forEachChild(node, visit);
262
+ };
263
+ visit(meta.body);
264
+ return reads;
265
+ }
266
+ /**
267
+ * NF-C040: a layout whose function `meta` reads `data` and which has no loader. A layout's `meta`
268
+ * receives its own loader data, `null` without a loader, so `data` there is always `null`; the page's
269
+ * data is `pageData`. Until 5.0 a layout's `meta` received the page's data as `data`, which is what such
270
+ * a `meta` was written against. A layout with a loader reading `data` reads its own, so it is not reported.
271
+ */
272
+ export const layoutMetaDataRule = {
273
+ code: "NF-C040",
274
+ title: "Layout meta reads data its layout never loads",
275
+ async scan(ctx) {
276
+ const routesDir = join(ctx.root, "routes");
277
+ if (!existsSync(routesDir))
278
+ return [];
279
+ let manifest;
280
+ try {
281
+ manifest = discoverRoutes(routesDir);
282
+ }
283
+ catch {
284
+ return [];
285
+ }
286
+ const layouts = Object.values(manifest.layouts)
287
+ .filter((layout) => SCRIPT_LAYOUT.test(layout.file))
288
+ .sort((a, b) => codeUnitOrder(a.file, b.file));
289
+ if (layouts.length === 0)
290
+ return [];
291
+ const loaded = await loadRuleTypeScript(ctx);
292
+ const ts = loaded.compiler;
293
+ if (ts === undefined)
294
+ return [];
295
+ const findings = [];
296
+ for (const layout of layouts) {
297
+ const halves = [layout.file, ...(layout.backend === undefined ? [] : [layout.backend])];
298
+ const loads = halves.some((file) => LOADER_EXPORT.test(stripComments(readFileSync(join(routesDir, file), "utf8"))));
299
+ if (loads)
300
+ continue;
301
+ const text = readFileSync(join(routesDir, layout.file), "utf8");
302
+ const tree = ts.createSourceFile(layout.file, text, ts.ScriptTarget.Latest, true, scriptKindOf(ts, layout.file));
303
+ for (const line of metaDataReads(ts, tree)) {
304
+ findings.push(diagnostic({
305
+ code: "NF-C040",
306
+ severity: "warn",
307
+ file: `routes/${layout.file}`,
308
+ line,
309
+ message: `routes/${layout.file}'s meta reads \`data\`, which is this layout's own loader data, and the layout has no loader, so it is always null. Read the page's data from \`pageData\` instead.`,
310
+ evidence: [
311
+ "data: the layout's loader data (null without a loader)",
312
+ "pageData: the page's loader data",
313
+ ],
314
+ verify: "nifra check",
315
+ }));
316
+ }
317
+ }
318
+ return findings;
319
+ },
320
+ };
321
+ const GATE_EXPORT = /\bexport\s+const\s+gate\s*(?::\s*boolean\s*)?=\s*true\b/;
322
+ const MIDDLEWARE_EXPORT = /\bexport\s+(?:async\s+)?(?:const|let|var|function\*?)\s+middleware\b|\bexport\s*\{[^}]*\bmiddleware\b[^}]*\}/;
323
+ /** Lines where an exported `loader` refuses access: `redirect()`, `statusPage(401|403)`, `new Response()`. */
324
+ export function loaderRefusals(ts, tree) {
325
+ const loader = exportedFunction(ts, tree, "loader");
326
+ if (loader?.body === undefined)
327
+ return [];
328
+ const lines = [];
329
+ const lineOf = (node) => tree.getLineAndCharacterOfPosition(node.getStart(tree)).line + 1;
330
+ const visit = (node) => {
331
+ if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
332
+ const status = node.arguments[0];
333
+ if (node.expression.text === "redirect" ||
334
+ (node.expression.text === "statusPage" &&
335
+ status !== undefined &&
336
+ ts.isNumericLiteral(status) &&
337
+ (status.text === "401" || status.text === "403")))
338
+ lines.push(lineOf(node));
339
+ }
340
+ else if (ts.isNewExpression(node) &&
341
+ ts.isIdentifier(node.expression) &&
342
+ node.expression.text === "Response") {
343
+ lines.push(lineOf(node));
344
+ }
345
+ ts.forEachChild(node, visit);
346
+ };
347
+ visit(loader.body);
348
+ return lines;
349
+ }
350
+ /**
351
+ * NF-C042: a layout loader that refuses access - a redirect, a 401 or 403, a `Response` - in a layout
352
+ * that is not a gate and exports no middleware. A client navigation that keeps the layout skips that
353
+ * loader, and an action below it runs without it, so the check reads as a guard and is not one. A
354
+ * refusal inside a helper the loader calls is not seen; the development warning covers that.
355
+ */
356
+ export const ungatedLayoutRefusalRule = {
357
+ code: "NF-C042",
358
+ title: "Layout loader refuses access without a gate",
359
+ async scan(ctx) {
360
+ const routesDir = join(ctx.root, "routes");
361
+ if (!existsSync(routesDir))
362
+ return [];
363
+ let manifest;
364
+ try {
365
+ manifest = discoverRoutes(routesDir);
366
+ }
367
+ catch {
368
+ return [];
369
+ }
370
+ const layouts = Object.values(manifest.layouts)
371
+ .filter((layout) => SCRIPT_LAYOUT.test(layout.file))
372
+ .sort((a, b) => codeUnitOrder(a.file, b.file));
373
+ if (layouts.length === 0)
374
+ return [];
375
+ const sources = layouts.map((layout) => [layout.file, ...(layout.backend === undefined ? [] : [layout.backend])].map((file) => ({
376
+ file,
377
+ text: readFileSync(join(routesDir, file), "utf8"),
378
+ })));
379
+ if (!sources.flat().some((half) => LOADER_EXPORT.test(stripComments(half.text))))
380
+ return [];
381
+ const loaded = await loadRuleTypeScript(ctx);
382
+ const ts = loaded.compiler;
383
+ if (ts === undefined)
384
+ return [];
385
+ const findings = [];
386
+ for (const halves of sources) {
387
+ const code = halves.map((half) => stripComments(half.text));
388
+ if (code.some((text) => GATE_EXPORT.test(text) || MIDDLEWARE_EXPORT.test(text)))
389
+ continue;
390
+ for (const half of halves) {
391
+ if (!LOADER_EXPORT.test(stripComments(half.text)))
392
+ continue;
393
+ const tree = ts.createSourceFile(half.file, half.text, ts.ScriptTarget.Latest, true, scriptKindOf(ts, half.file));
394
+ const [line] = loaderRefusals(ts, tree);
395
+ if (line === undefined)
396
+ continue;
397
+ findings.push(diagnostic({
398
+ code: "NF-C042",
399
+ severity: "warn",
400
+ file: `routes/${half.file}`,
401
+ line,
402
+ message: `routes/${half.file}'s loader refuses access, but the layout is not a gate. A client navigation that keeps the layout skips this loader, and an action below it runs without it, so it does not protect the pages under it. Export \`gate = true\` from this file, or move the check into its \`middleware\`.`,
403
+ evidence: [
404
+ "gate = true: the loader runs on every request and before every action, ahead of the page loader",
405
+ "middleware: runs before every page and action below the directory",
406
+ ],
407
+ verify: "nifra check",
408
+ }));
409
+ }
410
+ }
411
+ return findings;
412
+ },
413
+ };
414
+ /** The names a module exports at runtime, each with its line: declarations and `export { ... }` lists.
415
+ * `export *` names nothing it can read, and type-only exports carry no value. */
416
+ function runtimeExports(ts, tree) {
417
+ const found = [];
418
+ const add = (name, node) => {
419
+ found.push({ name, line: tree.getLineAndCharacterOfPosition(node.getStart(tree)).line + 1 });
420
+ };
421
+ for (const statement of tree.statements) {
422
+ if (ts.isExportDeclaration(statement)) {
423
+ if (statement.isTypeOnly || statement.exportClause === undefined)
424
+ continue;
425
+ if (!ts.isNamedExports(statement.exportClause))
426
+ continue;
427
+ for (const element of statement.exportClause.elements) {
428
+ if (!element.isTypeOnly)
429
+ add(element.name.text, element);
430
+ }
431
+ continue;
432
+ }
433
+ if (!(ts.isVariableStatement(statement) ||
434
+ ts.isFunctionDeclaration(statement) ||
435
+ ts.isClassDeclaration(statement)) ||
436
+ !hasModifier(statement, ts.SyntaxKind.ExportKeyword) ||
437
+ hasModifier(statement, ts.SyntaxKind.DeclareKeyword))
438
+ continue;
439
+ if (ts.isVariableStatement(statement)) {
440
+ for (const declaration of statement.declarationList.declarations) {
441
+ if (ts.isIdentifier(declaration.name))
442
+ add(declaration.name.text, declaration);
443
+ }
444
+ }
445
+ else if (statement.name !== undefined) {
446
+ add(statement.name.text, statement);
447
+ }
448
+ }
449
+ return found;
450
+ }
451
+ /**
452
+ * NF-C041: a route's frontend file (`x.tsx`, a layout, a status or error page) exports a name only
453
+ * the server reads, such as `loader` or `action`. The frontend file ships to the browser whole, so
454
+ * `nifra build` and the server refuse it; this reports it before either runs.
455
+ */
456
+ export const frontendServerExportRule = {
457
+ code: "NF-C041",
458
+ title: "Server-only export in a route frontend file",
459
+ async scan(ctx) {
460
+ const routesDir = join(ctx.root, "routes");
461
+ if (!existsSync(routesDir))
462
+ return [];
463
+ let manifest;
464
+ try {
465
+ manifest = discoverRoutes(routesDir);
466
+ }
467
+ catch {
468
+ return [];
469
+ }
470
+ const files = new Set();
471
+ for (const entry of [
472
+ ...manifest.routes,
473
+ ...Object.values(manifest.layouts),
474
+ ...Object.values(manifest.errors ?? {}),
475
+ ...(manifest.notFound === undefined ? [] : [manifest.notFound]),
476
+ ...Object.values(manifest.notFounds ?? {}),
477
+ ...Object.values(manifest.statusPages ?? {}),
478
+ ...Object.values(manifest.loadings ?? {}),
479
+ ]) {
480
+ if (SCRIPT_LAYOUT.test(entry.file))
481
+ files.add(entry.file);
482
+ }
483
+ if (files.size === 0)
484
+ return [];
485
+ const loaded = await loadRuleTypeScript(ctx);
486
+ const ts = loaded.compiler;
487
+ if (ts === undefined)
488
+ return [];
489
+ const findings = [];
490
+ for (const file of [...files].sort(codeUnitOrder)) {
491
+ const text = readFileSync(join(routesDir, file), "utf8");
492
+ const tree = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, scriptKindOf(ts, file));
493
+ for (const { name, line } of runtimeExports(ts, tree)) {
494
+ if (!BACKEND_ROUTE_EXPORTS.has(name))
495
+ continue;
496
+ const backend = `routes/${file.replace(SCRIPT_LAYOUT, ".backend.ts")}`;
497
+ findings.push(diagnostic({
498
+ code: "NF-C041",
499
+ severity: "error",
500
+ file: `routes/${file}`,
501
+ line,
502
+ message: `routes/${file} exports "${name}", which runs on the server only, and a route's frontend file ships to the browser whole, so nifra build and the server refuse it. Move it to ${backend}.`,
503
+ evidence: [`export: ${name}`, `backend half: ${backend}`],
504
+ fix: { recipe: "route.split", command: "nifra fix --code NF-C041" },
505
+ verify: "nifra check",
506
+ }));
507
+ }
508
+ }
509
+ return findings;
510
+ },
511
+ };
512
+ export const pageRules = Object.freeze([
513
+ shadowedPageRule,
514
+ statusLayoutRule,
515
+ implicitApiMountRule,
516
+ layoutMetaDataRule,
517
+ frontendServerExportRule,
518
+ ungatedLayoutRefusalRule,
519
+ ]);
88
520
  //# sourceMappingURL=pages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/rules/pages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/rules/pages.ts"],"names":[],"mappings":"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"}
@@ -19,5 +19,11 @@ export declare const overlappingRouteRule: CheckRule;
19
19
  * (`/users/:id?/posts`, `/users/:id{int}`). Only a trailing `?` run and a valid `{...}` are syntax.
20
20
  */
21
21
  export declare const paramModifierRule: CheckRule;
22
+ /**
23
+ * NF-C036: a registration whose path the static scan cannot read. The route still serves; what it
24
+ * loses is every source-level analysis keyed by path - automatic capability provenance and the route
25
+ * lints above - so it is reported as information, naming the expression.
26
+ */
27
+ export declare const unresolvedRoutePathRule: CheckRule;
22
28
  export declare const routeRules: readonly CheckRule[];
23
29
  //# sourceMappingURL=routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/rules/routes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,YAAY,CAAA;AAyExD,eAAO,MAAM,mBAAmB,EAAE,SAoCjC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAsChC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAuFlC,CAAA;AAwBD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SA+B/B,CAAA;AAED,eAAO,MAAM,UAAU,sBAKrB,CAAA"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/rules/routes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,YAAY,CAAA;AA4ExD,eAAO,MAAM,mBAAmB,EAAE,SAqCjC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAsChC,CAAA;AAkDD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SA0GlC,CAAA;AAwBD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAgC/B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,SA4BrC,CAAA;AAED,eAAO,MAAM,UAAU,sBAMrB,CAAA"}