@nifrajs/cli 3.3.0 → 4.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 (425) hide show
  1. package/README.md +42 -3
  2. package/dist/app-files.d.ts +11 -0
  3. package/dist/app-files.d.ts.map +1 -0
  4. package/dist/app-files.js +34 -0
  5. package/dist/app-files.js.map +1 -0
  6. package/dist/assure-hydration.d.ts +7 -1
  7. package/dist/assure-hydration.d.ts.map +1 -1
  8. package/dist/assure-hydration.js +128 -43
  9. package/dist/assure-hydration.js.map +1 -1
  10. package/dist/assure.d.ts.map +1 -1
  11. package/dist/assure.js +16 -2
  12. package/dist/assure.js.map +1 -1
  13. package/dist/capabilities-tool.d.ts +5 -1
  14. package/dist/capabilities-tool.d.ts.map +1 -1
  15. package/dist/capabilities-tool.js +32 -10
  16. package/dist/capabilities-tool.js.map +1 -1
  17. package/dist/cdn-check.d.ts +41 -0
  18. package/dist/cdn-check.d.ts.map +1 -0
  19. package/dist/cdn-check.js +207 -0
  20. package/dist/cdn-check.js.map +1 -0
  21. package/dist/check-diagnostics.d.ts +7 -15
  22. package/dist/check-diagnostics.d.ts.map +1 -1
  23. package/dist/check-diagnostics.js +162 -713
  24. package/dist/check-diagnostics.js.map +1 -1
  25. package/dist/check-scan.d.ts +58 -7
  26. package/dist/check-scan.d.ts.map +1 -1
  27. package/dist/check-scan.js +323 -62
  28. package/dist/check-scan.js.map +1 -1
  29. package/dist/check.d.ts +1 -0
  30. package/dist/check.d.ts.map +1 -1
  31. package/dist/check.js +145 -54
  32. package/dist/check.js.map +1 -1
  33. package/dist/cli.d.ts +42 -16
  34. package/dist/cli.d.ts.map +1 -1
  35. package/dist/cli.js +306 -87
  36. package/dist/cli.js.map +1 -1
  37. package/dist/command-catalog.d.ts +60 -5
  38. package/dist/command-catalog.d.ts.map +1 -1
  39. package/dist/command-catalog.js +298 -33
  40. package/dist/command-catalog.js.map +1 -1
  41. package/dist/config-target.d.ts +8 -0
  42. package/dist/config-target.d.ts.map +1 -0
  43. package/dist/config-target.js +45 -0
  44. package/dist/config-target.js.map +1 -0
  45. package/dist/contracts.d.ts +3 -2
  46. package/dist/contracts.d.ts.map +1 -1
  47. package/dist/contracts.js +56 -16
  48. package/dist/contracts.js.map +1 -1
  49. package/dist/db-audit.d.ts +37 -0
  50. package/dist/db-audit.d.ts.map +1 -0
  51. package/dist/db-audit.js +99 -0
  52. package/dist/db-audit.js.map +1 -0
  53. package/dist/db-child.d.ts +64 -0
  54. package/dist/db-child.d.ts.map +1 -0
  55. package/dist/db-child.js +213 -0
  56. package/dist/db-child.js.map +1 -0
  57. package/dist/db-config.d.ts +60 -0
  58. package/dist/db-config.d.ts.map +1 -0
  59. package/dist/db-config.js +176 -0
  60. package/dist/db-config.js.map +1 -0
  61. package/dist/db-tool.d.ts +84 -0
  62. package/dist/db-tool.d.ts.map +1 -0
  63. package/dist/db-tool.js +537 -0
  64. package/dist/db-tool.js.map +1 -0
  65. package/dist/dev-bun-config.d.ts +20 -13
  66. package/dist/dev-bun-config.d.ts.map +1 -1
  67. package/dist/dev-bun-config.js +98 -41
  68. package/dist/dev-bun-config.js.map +1 -1
  69. package/dist/dev-feed-tool.d.ts +106 -0
  70. package/dist/dev-feed-tool.d.ts.map +1 -0
  71. package/dist/dev-feed-tool.js +713 -0
  72. package/dist/dev-feed-tool.js.map +1 -0
  73. package/dist/dev-server-client.d.ts +67 -0
  74. package/dist/dev-server-client.d.ts.map +1 -0
  75. package/dist/dev-server-client.js +195 -0
  76. package/dist/dev-server-client.js.map +1 -0
  77. package/dist/diagnostics.d.ts +86 -0
  78. package/dist/diagnostics.d.ts.map +1 -1
  79. package/dist/diagnostics.js +85 -0
  80. package/dist/diagnostics.js.map +1 -1
  81. package/dist/diff-tool.d.ts +3 -3
  82. package/dist/diff-tool.d.ts.map +1 -1
  83. package/dist/diff-tool.js +6 -5
  84. package/dist/diff-tool.js.map +1 -1
  85. package/dist/docs-search.d.ts.map +1 -1
  86. package/dist/docs-search.js +12 -4
  87. package/dist/docs-search.js.map +1 -1
  88. package/dist/doctor.d.ts +17 -0
  89. package/dist/doctor.d.ts.map +1 -1
  90. package/dist/doctor.js +76 -15
  91. package/dist/doctor.js.map +1 -1
  92. package/dist/env-file.d.ts +15 -0
  93. package/dist/env-file.d.ts.map +1 -1
  94. package/dist/env-file.js +73 -1
  95. package/dist/env-file.js.map +1 -1
  96. package/dist/fix-recipes.d.ts.map +1 -1
  97. package/dist/fix-recipes.js +41 -21
  98. package/dist/fix-recipes.js.map +1 -1
  99. package/dist/frontend-guidance.js +5 -5
  100. package/dist/frontend-guidance.js.map +1 -1
  101. package/dist/i18n-check.d.ts +16 -0
  102. package/dist/i18n-check.d.ts.map +1 -0
  103. package/dist/i18n-check.js +154 -0
  104. package/dist/i18n-check.js.map +1 -0
  105. package/dist/init-agents.d.ts +49 -13
  106. package/dist/init-agents.d.ts.map +1 -1
  107. package/dist/init-agents.js +239 -34
  108. package/dist/init-agents.js.map +1 -1
  109. package/dist/internal/code-unit-order.d.ts +4 -0
  110. package/dist/internal/code-unit-order.d.ts.map +1 -0
  111. package/dist/internal/code-unit-order.js +6 -0
  112. package/dist/internal/code-unit-order.js.map +1 -0
  113. package/dist/internal/script-kind.d.ts +7 -0
  114. package/dist/internal/script-kind.d.ts.map +1 -0
  115. package/dist/internal/script-kind.js +12 -0
  116. package/dist/internal/script-kind.js.map +1 -0
  117. package/dist/internal/source-facts.d.ts +5 -0
  118. package/dist/internal/source-facts.d.ts.map +1 -1
  119. package/dist/internal/source-facts.js +61 -5
  120. package/dist/internal/source-facts.js.map +1 -1
  121. package/dist/internal/typescript-import.d.ts +49 -24
  122. package/dist/internal/typescript-import.d.ts.map +1 -1
  123. package/dist/internal/typescript-import.js +507 -67
  124. package/dist/internal/typescript-import.js.map +1 -1
  125. package/dist/introspect.d.ts +6 -4
  126. package/dist/introspect.d.ts.map +1 -1
  127. package/dist/introspect.js +93 -74
  128. package/dist/introspect.js.map +1 -1
  129. package/dist/learn.js +3 -3
  130. package/dist/learn.js.map +1 -1
  131. package/dist/levels-tool.d.ts +10 -0
  132. package/dist/levels-tool.d.ts.map +1 -1
  133. package/dist/levels-tool.js +33 -3
  134. package/dist/levels-tool.js.map +1 -1
  135. package/dist/load.d.ts +71 -16
  136. package/dist/load.d.ts.map +1 -1
  137. package/dist/load.js +78 -18
  138. package/dist/load.js.map +1 -1
  139. package/dist/manifest-tool.d.ts.map +1 -1
  140. package/dist/manifest-tool.js +3 -2
  141. package/dist/manifest-tool.js.map +1 -1
  142. package/dist/mcp-app-tool.d.ts.map +1 -1
  143. package/dist/mcp-app-tool.js +2 -0
  144. package/dist/mcp-app-tool.js.map +1 -1
  145. package/dist/mcp-context.d.ts.map +1 -1
  146. package/dist/mcp-context.js +5 -6
  147. package/dist/mcp-context.js.map +1 -1
  148. package/dist/mcp-delegate.d.ts +57 -0
  149. package/dist/mcp-delegate.d.ts.map +1 -0
  150. package/dist/mcp-delegate.js +130 -0
  151. package/dist/mcp-delegate.js.map +1 -0
  152. package/dist/mcp-docs-tools.d.ts.map +1 -1
  153. package/dist/mcp-docs-tools.js +23 -5
  154. package/dist/mcp-docs-tools.js.map +1 -1
  155. package/dist/mcp-exec.d.ts +3 -0
  156. package/dist/mcp-exec.d.ts.map +1 -1
  157. package/dist/mcp-exec.js +263 -131
  158. package/dist/mcp-exec.js.map +1 -1
  159. package/dist/mcp-http.d.ts.map +1 -1
  160. package/dist/mcp-http.js +20 -5
  161. package/dist/mcp-http.js.map +1 -1
  162. package/dist/mcp-io.d.ts +26 -0
  163. package/dist/mcp-io.d.ts.map +1 -1
  164. package/dist/mcp-io.js +113 -0
  165. package/dist/mcp-io.js.map +1 -1
  166. package/dist/mcp-isolate.d.ts +48 -0
  167. package/dist/mcp-isolate.d.ts.map +1 -0
  168. package/dist/mcp-isolate.js +222 -0
  169. package/dist/mcp-isolate.js.map +1 -0
  170. package/dist/mcp-path.d.ts +10 -0
  171. package/dist/mcp-path.d.ts.map +1 -0
  172. package/dist/mcp-path.js +51 -0
  173. package/dist/mcp-path.js.map +1 -0
  174. package/dist/mcp-project-child.d.ts +74 -0
  175. package/dist/mcp-project-child.d.ts.map +1 -0
  176. package/dist/mcp-project-child.js +130 -0
  177. package/dist/mcp-project-child.js.map +1 -0
  178. package/dist/mcp-reflect.d.ts.map +1 -1
  179. package/dist/mcp-reflect.js +2 -2
  180. package/dist/mcp-reflect.js.map +1 -1
  181. package/dist/mcp-render.d.ts.map +1 -1
  182. package/dist/mcp-render.js +64 -45
  183. package/dist/mcp-render.js.map +1 -1
  184. package/dist/mcp-root.d.ts +37 -9
  185. package/dist/mcp-root.d.ts.map +1 -1
  186. package/dist/mcp-root.js +124 -25
  187. package/dist/mcp-root.js.map +1 -1
  188. package/dist/mcp-run.d.ts +18 -1
  189. package/dist/mcp-run.d.ts.map +1 -1
  190. package/dist/mcp-run.js +159 -55
  191. package/dist/mcp-run.js.map +1 -1
  192. package/dist/mcp-ws.js +4 -1
  193. package/dist/mcp-ws.js.map +1 -1
  194. package/dist/mcp.d.ts +18 -5
  195. package/dist/mcp.d.ts.map +1 -1
  196. package/dist/mcp.js +165 -82
  197. package/dist/mcp.js.map +1 -1
  198. package/dist/migrate-layout.d.ts +44 -0
  199. package/dist/migrate-layout.d.ts.map +1 -0
  200. package/dist/migrate-layout.js +982 -0
  201. package/dist/migrate-layout.js.map +1 -0
  202. package/dist/openapi-tool.d.ts +2 -2
  203. package/dist/openapi-tool.d.ts.map +1 -1
  204. package/dist/openapi-tool.js.map +1 -1
  205. package/dist/openapi-types.d.ts +2 -1
  206. package/dist/openapi-types.d.ts.map +1 -1
  207. package/dist/openapi-types.js +240 -12
  208. package/dist/openapi-types.js.map +1 -1
  209. package/dist/pipeline-report.d.ts +3 -2
  210. package/dist/pipeline-report.d.ts.map +1 -1
  211. package/dist/pipeline-report.js +19 -16
  212. package/dist/pipeline-report.js.map +1 -1
  213. package/dist/port.d.ts +5 -4
  214. package/dist/port.d.ts.map +1 -1
  215. package/dist/port.js +46 -29
  216. package/dist/port.js.map +1 -1
  217. package/dist/project-facts.d.ts +28 -4
  218. package/dist/project-facts.d.ts.map +1 -1
  219. package/dist/project-facts.js +12 -2
  220. package/dist/project-facts.js.map +1 -1
  221. package/dist/recipes/4.0.0.d.ts +9 -0
  222. package/dist/recipes/4.0.0.d.ts.map +1 -0
  223. package/dist/recipes/4.0.0.js +34 -0
  224. package/dist/recipes/4.0.0.js.map +1 -0
  225. package/dist/recipes/index.d.ts.map +1 -1
  226. package/dist/recipes/index.js +2 -0
  227. package/dist/recipes/index.js.map +1 -1
  228. package/dist/release-verification.d.ts +11 -1
  229. package/dist/release-verification.d.ts.map +1 -1
  230. package/dist/release-verification.js +47 -4
  231. package/dist/release-verification.js.map +1 -1
  232. package/dist/review.d.ts +21 -0
  233. package/dist/review.d.ts.map +1 -0
  234. package/dist/review.js +823 -0
  235. package/dist/review.js.map +1 -0
  236. package/dist/route-types.d.ts +28 -0
  237. package/dist/route-types.d.ts.map +1 -0
  238. package/dist/route-types.js +106 -0
  239. package/dist/route-types.js.map +1 -0
  240. package/dist/rules/codes.d.ts +9 -0
  241. package/dist/rules/codes.d.ts.map +1 -1
  242. package/dist/rules/codes.js +9 -0
  243. package/dist/rules/codes.js.map +1 -1
  244. package/dist/rules/data-guard.d.ts +12 -0
  245. package/dist/rules/data-guard.d.ts.map +1 -0
  246. package/dist/rules/data-guard.js +213 -0
  247. package/dist/rules/data-guard.js.map +1 -0
  248. package/dist/rules/index.d.ts +3 -0
  249. package/dist/rules/index.d.ts.map +1 -1
  250. package/dist/rules/index.js +17 -5
  251. package/dist/rules/index.js.map +1 -1
  252. package/dist/rules/islands.d.ts.map +1 -1
  253. package/dist/rules/islands.js +7 -4
  254. package/dist/rules/islands.js.map +1 -1
  255. package/dist/rules/legacy.d.ts +3 -1
  256. package/dist/rules/legacy.d.ts.map +1 -1
  257. package/dist/rules/legacy.js +829 -34
  258. package/dist/rules/legacy.js.map +1 -1
  259. package/dist/rules/nano.d.ts.map +1 -1
  260. package/dist/rules/nano.js +15 -6
  261. package/dist/rules/nano.js.map +1 -1
  262. package/dist/rules/pages.d.ts +15 -0
  263. package/dist/rules/pages.d.ts.map +1 -0
  264. package/dist/rules/pages.js +88 -0
  265. package/dist/rules/pages.js.map +1 -0
  266. package/dist/rules/routes.d.ts +11 -0
  267. package/dist/rules/routes.d.ts.map +1 -1
  268. package/dist/rules/routes.js +180 -2
  269. package/dist/rules/routes.js.map +1 -1
  270. package/dist/rules/secrets.d.ts +10 -0
  271. package/dist/rules/secrets.d.ts.map +1 -0
  272. package/dist/rules/secrets.js +169 -0
  273. package/dist/rules/secrets.js.map +1 -0
  274. package/dist/rules/security.d.ts +7 -0
  275. package/dist/rules/security.d.ts.map +1 -1
  276. package/dist/rules/security.js +171 -65
  277. package/dist/rules/security.js.map +1 -1
  278. package/dist/rules/typescript.d.ts +16 -0
  279. package/dist/rules/typescript.d.ts.map +1 -0
  280. package/dist/rules/typescript.js +59 -0
  281. package/dist/rules/typescript.js.map +1 -0
  282. package/dist/rules/zones.d.ts +17 -0
  283. package/dist/rules/zones.d.ts.map +1 -0
  284. package/dist/rules/zones.js +174 -0
  285. package/dist/rules/zones.js.map +1 -0
  286. package/dist/scaffold.d.ts +25 -12
  287. package/dist/scaffold.d.ts.map +1 -1
  288. package/dist/scaffold.js +154 -90
  289. package/dist/scaffold.js.map +1 -1
  290. package/dist/sdk.d.ts +17 -3
  291. package/dist/sdk.d.ts.map +1 -1
  292. package/dist/sdk.js +941 -153
  293. package/dist/sdk.js.map +1 -1
  294. package/dist/search-terms.d.ts +2 -0
  295. package/dist/search-terms.d.ts.map +1 -1
  296. package/dist/search-terms.js +23 -8
  297. package/dist/search-terms.js.map +1 -1
  298. package/dist/smoke.d.ts +79 -0
  299. package/dist/smoke.d.ts.map +1 -0
  300. package/dist/smoke.js +494 -0
  301. package/dist/smoke.js.map +1 -0
  302. package/dist/sync-manifest.d.ts.map +1 -1
  303. package/dist/sync-manifest.js +2 -1
  304. package/dist/sync-manifest.js.map +1 -1
  305. package/dist/sync-routes.d.ts +4 -3
  306. package/dist/sync-routes.d.ts.map +1 -1
  307. package/dist/sync-routes.js +4 -3
  308. package/dist/sync-routes.js.map +1 -1
  309. package/dist/test-tool.d.ts.map +1 -1
  310. package/dist/test-tool.js +30 -11
  311. package/dist/test-tool.js.map +1 -1
  312. package/dist/types-search.d.ts.map +1 -1
  313. package/dist/types-search.js +11 -5
  314. package/dist/types-search.js.map +1 -1
  315. package/dist/upgrade.d.ts +36 -6
  316. package/dist/upgrade.d.ts.map +1 -1
  317. package/dist/upgrade.js +167 -29
  318. package/dist/upgrade.js.map +1 -1
  319. package/dist/verification-plan.d.ts.map +1 -1
  320. package/dist/verification-plan.js +8 -0
  321. package/dist/verification-plan.js.map +1 -1
  322. package/dist/verification.d.ts.map +1 -1
  323. package/dist/verification.js +45 -12
  324. package/dist/verification.js.map +1 -1
  325. package/dist/web-app-options.d.ts +19 -0
  326. package/dist/web-app-options.d.ts.map +1 -0
  327. package/dist/web-app-options.js +49 -0
  328. package/dist/web-app-options.js.map +1 -0
  329. package/dist/work-graph.d.ts +3 -0
  330. package/dist/work-graph.d.ts.map +1 -1
  331. package/dist/work-graph.js +33 -16
  332. package/dist/work-graph.js.map +1 -1
  333. package/docs/examples.json +185 -29
  334. package/docs/llms-full.txt +4123 -548
  335. package/docs/types.json +14391 -10060
  336. package/package.json +19 -11
  337. package/src/app-files.ts +40 -0
  338. package/src/assure-hydration.ts +139 -46
  339. package/src/assure.ts +17 -2
  340. package/src/capabilities-tool.ts +35 -9
  341. package/src/cdn-check.ts +268 -0
  342. package/src/check-diagnostics.ts +199 -797
  343. package/src/check-scan.ts +394 -63
  344. package/src/check.ts +146 -58
  345. package/src/cli.ts +347 -92
  346. package/src/command-catalog.ts +407 -45
  347. package/src/config-target.ts +47 -0
  348. package/src/contracts.ts +66 -15
  349. package/src/db-audit.ts +128 -0
  350. package/src/db-child.ts +285 -0
  351. package/src/db-config.ts +224 -0
  352. package/src/db-tool.ts +690 -0
  353. package/src/dev-bun-config.ts +116 -40
  354. package/src/dev-feed-tool.ts +912 -0
  355. package/src/dev-server-client.ts +267 -0
  356. package/src/diagnostics.ts +179 -0
  357. package/src/diff-tool.ts +6 -5
  358. package/src/docs-search.ts +10 -3
  359. package/src/doctor.ts +98 -15
  360. package/src/env-file.ts +78 -1
  361. package/src/fix-recipes.ts +44 -31
  362. package/src/frontend-guidance.ts +5 -5
  363. package/src/i18n-check.ts +179 -0
  364. package/src/init-agents.ts +301 -38
  365. package/src/internal/code-unit-order.ts +5 -0
  366. package/src/internal/script-kind.ts +11 -0
  367. package/src/internal/source-facts.ts +96 -22
  368. package/src/internal/typescript-import.ts +663 -68
  369. package/src/introspect.ts +93 -82
  370. package/src/learn.ts +3 -3
  371. package/src/levels-tool.ts +47 -2
  372. package/src/load.ts +144 -32
  373. package/src/manifest-tool.ts +3 -2
  374. package/src/mcp-app-tool.ts +2 -0
  375. package/src/mcp-context.ts +5 -7
  376. package/src/mcp-delegate.ts +162 -0
  377. package/src/mcp-docs-tools.ts +23 -5
  378. package/src/mcp-exec.ts +301 -161
  379. package/src/mcp-http.ts +22 -5
  380. package/src/mcp-io.ts +130 -0
  381. package/src/mcp-isolate.ts +287 -0
  382. package/src/mcp-path.ts +50 -0
  383. package/src/mcp-project-child.ts +182 -0
  384. package/src/mcp-reflect.ts +3 -2
  385. package/src/mcp-render.ts +72 -42
  386. package/src/mcp-root.ts +130 -24
  387. package/src/mcp-run.ts +190 -56
  388. package/src/mcp-ws.ts +4 -1
  389. package/src/mcp.ts +193 -91
  390. package/src/migrate-layout.ts +1121 -0
  391. package/src/openapi-tool.ts +7 -3
  392. package/src/openapi-types.ts +315 -13
  393. package/src/pipeline-report.ts +22 -18
  394. package/src/port.ts +53 -30
  395. package/src/project-facts.ts +42 -8
  396. package/src/recipes/4.0.0.ts +35 -0
  397. package/src/recipes/index.ts +2 -0
  398. package/src/release-verification.ts +74 -5
  399. package/src/review.ts +988 -0
  400. package/src/route-types.ts +133 -0
  401. package/src/rules/codes.ts +9 -0
  402. package/src/rules/data-guard.ts +230 -0
  403. package/src/rules/index.ts +18 -5
  404. package/src/rules/islands.ts +12 -4
  405. package/src/rules/legacy.ts +947 -35
  406. package/src/rules/nano.ts +18 -6
  407. package/src/rules/pages.ts +99 -0
  408. package/src/rules/routes.ts +181 -2
  409. package/src/rules/secrets.ts +174 -0
  410. package/src/rules/security.ts +198 -70
  411. package/src/rules/typescript.ts +77 -0
  412. package/src/rules/zones.ts +195 -0
  413. package/src/scaffold.ts +175 -98
  414. package/src/sdk.ts +1215 -158
  415. package/src/search-terms.ts +24 -7
  416. package/src/smoke.ts +607 -0
  417. package/src/sync-manifest.ts +2 -1
  418. package/src/sync-routes.ts +4 -3
  419. package/src/test-tool.ts +32 -11
  420. package/src/types-search.ts +11 -4
  421. package/src/upgrade.ts +205 -25
  422. package/src/verification-plan.ts +27 -0
  423. package/src/verification.ts +50 -12
  424. package/src/web-app-options.ts +57 -0
  425. package/src/work-graph.ts +40 -16
@@ -0,0 +1,16 @@
1
+ import type { Diagnostic } from "../diagnostics.js";
2
+ import { type TypeScriptApi, type TypeScriptSession } from "../internal/typescript-import.js";
3
+ import type { RuleContext } from "./index.js";
4
+ interface RuleTypeScriptLoad {
5
+ readonly compiler: TypeScriptApi | undefined;
6
+ readonly session: TypeScriptSession | undefined;
7
+ readonly diagnostics: readonly Diagnostic[] | undefined;
8
+ }
9
+ /** Retain a direct rule-registry session until the whole registry run has completed. */
10
+ export declare function retainRuleTypeScript(ctx: RuleContext): void;
11
+ /** Release a direct rule-registry session and terminate its TypeScript 7 worker when unused. */
12
+ export declare function releaseRuleTypeScript(ctx: RuleContext): Promise<void>;
13
+ /** Keep every AST-backed rule on the same project compiler session. */
14
+ export declare function loadRuleTypeScript(ctx: RuleContext): Promise<RuleTypeScriptLoad>;
15
+ export {};
16
+ //# sourceMappingURL=typescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../src/rules/typescript.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAEvB,MAAM,kCAAkC,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAA;IAC/C,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,CAAA;CACxD;AAoBD,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAG3D;AAED,gGAAgG;AAChG,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3E;AAED,uEAAuE;AACvE,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqBtF"}
@@ -0,0 +1,59 @@
1
+ import { loadProjectTypeScript, unsupportedTypeScriptDiagnostic, } from "../internal/typescript-import.js";
2
+ const sessionCache = new WeakMap();
3
+ function cachedLoad(ctx) {
4
+ const cached = sessionCache.get(ctx.sources);
5
+ if (cached !== undefined)
6
+ return cached;
7
+ const entry = {
8
+ pending: loadProjectTypeScript(ctx.root, undefined, ctx.sources),
9
+ leases: 0,
10
+ };
11
+ sessionCache.set(ctx.sources, entry);
12
+ return entry;
13
+ }
14
+ /** Retain a direct rule-registry session until the whole registry run has completed. */
15
+ export function retainRuleTypeScript(ctx) {
16
+ const entry = cachedLoad(ctx);
17
+ entry.leases += 1;
18
+ }
19
+ /** Release a direct rule-registry session and terminate its TypeScript 7 worker when unused. */
20
+ export async function releaseRuleTypeScript(ctx) {
21
+ const entry = sessionCache.get(ctx.sources);
22
+ if (entry === undefined)
23
+ return;
24
+ entry.leases = Math.max(0, entry.leases - 1);
25
+ if (entry.leases !== 0)
26
+ return;
27
+ sessionCache.delete(ctx.sources);
28
+ try {
29
+ const loaded = await entry.pending;
30
+ await loaded.session?.close();
31
+ }
32
+ catch {
33
+ // The scanner that consumed the same pending load owns the diagnostic for load failures.
34
+ }
35
+ }
36
+ /** Keep every AST-backed rule on the same project compiler session. */
37
+ export async function loadRuleTypeScript(ctx) {
38
+ if (ctx.project.check.unsupportedTypeScriptVersion !== undefined) {
39
+ // The check-wide loader already supplied the single structured failure diagnostic.
40
+ return { compiler: undefined, session: undefined, diagnostics: [] };
41
+ }
42
+ if (ctx.typescriptSession !== undefined) {
43
+ return {
44
+ compiler: ctx.typescriptSession.compiler,
45
+ session: ctx.typescriptSession,
46
+ diagnostics: undefined,
47
+ };
48
+ }
49
+ const loaded = await cachedLoad(ctx).pending;
50
+ if (loaded.unsupported !== undefined) {
51
+ return {
52
+ compiler: undefined,
53
+ session: undefined,
54
+ diagnostics: [unsupportedTypeScriptDiagnostic(loaded.unsupported.version)],
55
+ };
56
+ }
57
+ return { compiler: loaded.compiler, session: loaded.session, diagnostics: undefined };
58
+ }
59
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../src/rules/typescript.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EAGrB,+BAA+B,GAChC,MAAM,kCAAkC,CAAA;AAczC,MAAM,YAAY,GAAG,IAAI,OAAO,EAA6C,CAAA;AAE7E,SAAS,UAAU,CAAC,GAAgB;IAClC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IACvC,MAAM,KAAK,GAAsB;QAC/B,OAAO,EAAE,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC;QAChE,MAAM,EAAE,CAAC;KACV,CAAA;IACD,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACpC,OAAO,KAAK,CAAA;AACd,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,oBAAoB,CAAC,GAAgB;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;IAC7B,KAAK,CAAC,MAAM,IAAI,CAAC,CAAA;AACnB,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAgB;IAC1D,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAM;IAC/B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAC9B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAA;QAClC,MAAM,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,yFAAyF;IAC3F,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAgB;IACvD,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,SAAS,EAAE,CAAC;QACjE,mFAAmF;QACnF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;IACrE,CAAC;IACD,IAAI,GAAG,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO;YACL,QAAQ,EAAE,GAAG,CAAC,iBAAiB,CAAC,QAAQ;YACxC,OAAO,EAAE,GAAG,CAAC,iBAAiB;YAC9B,WAAW,EAAE,SAAS;SACvB,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAA;IAC5C,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,CAAC,+BAA+B,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SAC3E,CAAA;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAA;AACvF,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type Classification, type ZoneClassifier } from "@nifrajs/web/zones";
2
+ import type { CheckRule, RuleContext } from "./index.js";
3
+ interface ZonedFile {
4
+ readonly file: string;
5
+ readonly app: string;
6
+ readonly classification: Classification;
7
+ }
8
+ /** Every scanned source file that belongs to an app, classified once per app classifier. */
9
+ export declare function zonedFiles(ctx: RuleContext): {
10
+ readonly files: readonly ZonedFile[];
11
+ readonly classifierFor: (app: string) => ZoneClassifier;
12
+ };
13
+ export declare const zoneImportRule: CheckRule;
14
+ export declare const privateEnvRule: CheckRule;
15
+ export declare const zoneRules: readonly CheckRule[];
16
+ export {};
17
+ //# sourceMappingURL=zones.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zones.d.ts","sourceRoot":"","sources":["../../src/rules/zones.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,KAAK,cAAc,EAMnB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAA;AAK3B,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAgBxD,UAAU,SAAS;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;CACxC;AAED,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG;IAC5C,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;IACpC,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,cAAc,CAAA;CACxD,CAsBA;AA4BD,eAAO,MAAM,cAAc,EAAE,SAyC5B,CAAA;AAgBD,eAAO,MAAM,cAAc,EAAE,SAmC5B,CAAA;AAED,eAAO,MAAM,SAAS,sBAAkD,CAAA"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * NF-C028 and NF-C029: the frontend/backend zone rules, checked from source.
3
+ *
4
+ * Every browser build and dev server enforces these already; this reports them without building,
5
+ * with the same classifier (`@nifrajs/web/zones`) so the three can never disagree. NF-C004 owns
6
+ * browser code reaching server code (with the chain); NF-C028 owns the other directions: a zoned
7
+ * file importing one in no zone, backend code importing frontend code, and shared code importing
8
+ * anything but shared code. NF-C029 owns private environment reads in browser code.
9
+ */
10
+ import { existsSync, readFileSync, realpathSync } from "node:fs";
11
+ import { dirname, isAbsolute, join, relative } from "node:path";
12
+ import { createZoneClassifier, importAllowed, importRuleMessage, privateEnvReads, privateEnvReason, } from "@nifrajs/web/zones";
13
+ import { CONFIG_FILE, FRAMEWORK_FILE } from "../app-files.js";
14
+ import { importSites, stripComments } from "../check-scan.js";
15
+ import { diagnostic } from "../diagnostics.js";
16
+ import { codeUnitOrder } from "../internal/code-unit-order.js";
17
+ const ZONE_FOLDER = new Set(["routes", "frontend", "backend", "shared"]);
18
+ const FRONTEND = new Set(["route-frontend", "frontend"]);
19
+ const SERVER = new Set(["backend", "route-backend", "fn"]);
20
+ const BACKEND = new Set(["backend", "route-backend"]);
21
+ const BROWSER_CODE = new Set(["route-frontend", "frontend", "shared"]);
22
+ const CODE_FILE = /\.(?:[cm]?[jt]sx?|svelte|vue|mdx)$/;
23
+ /** The app a project file belongs to: the path before its first zone folder, or `undefined`. */
24
+ function appOf(file) {
25
+ const parts = file.split("/");
26
+ const at = parts.findIndex((part, i) => i < parts.length - 1 && ZONE_FOLDER.has(part));
27
+ return at === -1 ? undefined : parts.slice(0, at).join("/");
28
+ }
29
+ /** Every scanned source file that belongs to an app, classified once per app classifier. */
30
+ export function zonedFiles(ctx) {
31
+ const classifiers = new Map();
32
+ const classifierFor = (app) => {
33
+ let classifier = classifiers.get(app);
34
+ if (classifier === undefined) {
35
+ const appRoot = join(ctx.root, app);
36
+ classifier = createZoneClassifier({
37
+ appRoot,
38
+ generatedFiles: [join(appRoot, "server-manifest.ts")],
39
+ });
40
+ classifiers.set(app, classifier);
41
+ }
42
+ return classifier;
43
+ };
44
+ const files = [];
45
+ for (const file of ctx.sources.files) {
46
+ if (!CODE_FILE.test(file))
47
+ continue;
48
+ const app = appOf(file);
49
+ if (app === undefined)
50
+ continue;
51
+ files.push({ file, app, classification: classifierFor(app).classify(join(ctx.root, file)) });
52
+ }
53
+ return { files, classifierFor };
54
+ }
55
+ const real = (path) => {
56
+ try {
57
+ return realpathSync(path);
58
+ }
59
+ catch {
60
+ return path;
61
+ }
62
+ };
63
+ /** Where a resolved import lands, as the project names it. Both sides are real paths: a checkout
64
+ * reached through a symlink (`/var` -> `/private/var` on macOS) still names files project-relative. */
65
+ function display(root, file) {
66
+ const rel = relative(real(root), real(file)).replaceAll("\\", "/");
67
+ return rel.startsWith("../") || isAbsolute(rel) ? file : rel;
68
+ }
69
+ /** A relative import resolved against the importing file, or `undefined` when it does not resolve. */
70
+ function resolveRelative(root, from, specifier) {
71
+ if (!specifier.startsWith("./") && !specifier.startsWith("../"))
72
+ return undefined;
73
+ try {
74
+ // Relative specifiers only: a bare one would let the resolver reach for a global install.
75
+ return Bun.resolveSync(specifier, dirname(join(root, from)));
76
+ }
77
+ catch {
78
+ return undefined;
79
+ }
80
+ }
81
+ export const zoneImportRule = {
82
+ code: "NF-C028",
83
+ title: "Zone import check",
84
+ async scan(ctx) {
85
+ const { files, classifierFor } = zonedFiles(ctx);
86
+ const findings = [];
87
+ for (const { file, app, classification: from } of files) {
88
+ if (from.zone === "error" || from.zone === "library" || from.zone === "generated")
89
+ continue;
90
+ const content = ctx.sources.read(file);
91
+ if (content === undefined)
92
+ continue;
93
+ for (const { specifier, line } of importSites(content, file)) {
94
+ const target = resolveRelative(ctx.root, file, specifier);
95
+ if (target === undefined)
96
+ continue;
97
+ const to = classifierFor(app).classify(target);
98
+ const targetName = display(ctx.root, target);
99
+ let message;
100
+ if (to.zone === "error")
101
+ message = `${file} imports ${targetName}: ${to.reason}`;
102
+ else if ((SERVER.has(from.zone) && FRONTEND.has(to.zone)) ||
103
+ // Shared code reaching backend code is NF-C004's, reported there with the chain.
104
+ (from.zone === "shared" && !importAllowed(from.zone, to.zone) && !BACKEND.has(to.zone))) {
105
+ message = importRuleMessage(file, from.zone, targetName, to.zone);
106
+ }
107
+ else
108
+ continue;
109
+ findings.push(diagnostic({
110
+ code: "NF-C028",
111
+ severity: "error",
112
+ file,
113
+ line,
114
+ message,
115
+ evidence: [`import: ${specifier}`, `from zone: ${from.zone}`, `to zone: ${to.zone}`],
116
+ verify: "nifra check",
117
+ }));
118
+ }
119
+ }
120
+ return findings.sort((a, b) => codeUnitOrder(a.file ?? "", b.file ?? "") || (a.line ?? 0) - (b.line ?? 0));
121
+ },
122
+ };
123
+ const PREFIX_EXPORT = /\bexport\s+const\s+publicEnvPrefix\s*(?::\s*string\s*)?=\s*(?:"([^"\\\r\n]*)"|'([^'\\\r\n]*)')/;
124
+ /** The app's public-env prefix when its config declares it as a string literal, else the default. */
125
+ function publicPrefix(root, app) {
126
+ for (const config of [FRAMEWORK_FILE, CONFIG_FILE]) {
127
+ const path = join(root, app, config);
128
+ if (!existsSync(path))
129
+ continue;
130
+ const match = PREFIX_EXPORT.exec(stripComments(readFileSync(path, "utf8")));
131
+ if (match !== null)
132
+ return match[1] ?? match[2] ?? "PUBLIC_";
133
+ }
134
+ return "PUBLIC_";
135
+ }
136
+ export const privateEnvRule = {
137
+ code: "NF-C029",
138
+ title: "Private environment read in browser code",
139
+ async scan(ctx) {
140
+ const { files } = zonedFiles(ctx);
141
+ const prefixes = new Map();
142
+ const findings = [];
143
+ for (const { file, app, classification } of files) {
144
+ if (!BROWSER_CODE.has(classification.zone))
145
+ continue;
146
+ const content = ctx.sources.read(file);
147
+ if (content === undefined)
148
+ continue;
149
+ let prefix = prefixes.get(app);
150
+ if (prefix === undefined) {
151
+ prefix = publicPrefix(ctx.root, app);
152
+ prefixes.set(app, prefix);
153
+ }
154
+ const reads = privateEnvReads(file, content, prefix);
155
+ if (reads.length === 0)
156
+ continue;
157
+ const first = reads[0] ?? "";
158
+ const name = /[.[(]["']?([A-Za-z_$][\w$]*)["']?[)\]]?$/.exec(first)?.[1];
159
+ const index = name === undefined ? -1 : content.indexOf(name);
160
+ findings.push(diagnostic({
161
+ code: "NF-C029",
162
+ severity: "error",
163
+ file,
164
+ ...(index === -1 ? {} : { line: content.slice(0, index).split("\n").length }),
165
+ message: `${file} ${privateEnvReason(reads, prefix)}`,
166
+ evidence: reads.map((read) => `read: ${read}`),
167
+ verify: "nifra check",
168
+ }));
169
+ }
170
+ return findings;
171
+ },
172
+ };
173
+ export const zoneRules = Object.freeze([zoneImportRule, privateEnvRule]);
174
+ //# sourceMappingURL=zones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zones.js","sourceRoot":"","sources":["../../src/rules/zones.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  /**
2
- * `nifra_scaffold` - turn a URL path into the correct `routes/` file (the convention an agent most often
3
- * gets wrong) + a minimal, contract-correct stub. The mapping is the inverse of @nifrajs/web's
4
- * `filePathToPatterns`: `:id`/`[id]` → `[id]`, `*rest`/`[...rest]` → `[...rest]`, `[[lang]]` optional,
5
- * `/` → `index`. The framework (→ file extension) comes from the project's `clientModule`.
2
+ * `nifra_scaffold` - turn a URL path into the correct `routes/` files (the convention an agent most often
3
+ * gets wrong) + a minimal, contract-correct route pair: the page, and its `.backend.ts` half holding the
4
+ * loader and its output schema. The mapping is the inverse of @nifrajs/web's `filePathToPatterns`:
5
+ * `:id`/`[id]` → `[id]`, `*rest`/`[...rest]` → `[...rest]`, `[[lang]]` optional, `/` → `index`. The
6
+ * framework (→ file extension) comes from the project's `clientModule`.
6
7
  *
7
8
  * Page stubs are emitted for the JSX family (react/preact/solid - one shared, verified shape) and
8
9
  * for vanilla (a zero-runtime `html` page carrying the golden island pattern); for vue/svelte we
9
- * return the correct PATH + the route-module contract and point at `nifra_example` for the body,
10
- * rather than hand-writing an SFC we can't typecheck here.
10
+ * return the correct PATHS, the backend half and the route contract, and point at `nifra_example` for
11
+ * the page body, rather than hand-writing an SFC we can't typecheck here.
11
12
  */
12
13
  export type Framework = "react" | "preact" | "solid" | "vue" | "svelte" | "vanilla";
13
14
  /** A scaffold flavour on top of the framework. `default` is the plain page stub; `stateful` only
@@ -20,22 +21,34 @@ export declare function frameworkFromClientModule(clientModule: string | undefin
20
21
  /** Map a URL path to its `routes/` file path (relative to `routes/`, without extension prefix dir).
21
22
  * `/` → `index`; `/users/:id` → `users/[id]`; `/blog/*slug` → `blog/[...slug]`. */
22
23
  export declare function routePathToFile(urlPath: string, ext: string): string;
24
+ /** `routes/users/[id].tsx` → `routes/users/[id].backend.ts`. */
25
+ export declare const backendFileOf: (file: string) => string;
23
26
  export interface ScaffoldResult {
27
+ /** The page file. */
24
28
  readonly file: string;
29
+ /** The page stub, when there is a verified one for the framework. */
25
30
  readonly content?: string;
31
+ /** The page's backend half - framework-independent, so always present. */
32
+ readonly backend: {
33
+ readonly file: string;
34
+ readonly content: string;
35
+ };
26
36
  readonly note: string;
27
37
  }
28
38
  export interface ScaffoldWriteResult extends ScaffoldResult {
29
39
  readonly written: boolean;
30
40
  readonly reason?: string;
31
41
  }
32
- /** Scaffold a page route for `urlPath` under the project's `framework`. Returns the correct file path
33
- * always; a ready-to-write stub for the JSX family, contract guidance otherwise. */
42
+ /** Scaffold a page route for `urlPath` under the project's `framework`. Returns the correct file paths
43
+ * and the backend half always; a ready-to-write page stub for the JSX family and vanilla, contract
44
+ * guidance otherwise. */
34
45
  export declare function scaffoldRoute(urlPath: string, framework: Framework, variant?: ScaffoldVariant): ScaffoldResult;
35
- /** Write a scaffolded route stub when the framework has a verified ready-to-write body. The write is
36
- * intentionally conservative: it refuses non-JSX stubs (where we only return contract guidance) and
37
- * uses `wx`, so an agent cannot overwrite user work by accident. */
46
+ /** Write a scaffolded route pair when the framework has a verified ready-to-write page body. The write
47
+ * is intentionally conservative: it refuses frameworks where we only return contract guidance (a
48
+ * backend half alone is a build error), refuses when either file exists, and uses `wx`, so an agent
49
+ * cannot overwrite user work by accident. It then generates the route's `./+types` module, so both
50
+ * halves typecheck at once. */
38
51
  export declare function writeScaffoldRoute(cwd: string, urlPath: string, framework: Framework, variant?: ScaffoldVariant): Promise<ScaffoldWriteResult>;
39
- /** Render the tool result as markdown - the file path, the stub (if any), and the contract note. */
52
+ /** Render the tool result as markdown - the file paths, the stubs (if any), and the contract note. */
40
53
  export declare function renderScaffold(urlPath: string, framework: Framework, variant?: ScaffoldVariant): string;
41
54
  //# sourceMappingURL=scaffold.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEnF;;;yFAGyF;AACzF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,UAAU,CAAA;AAWpD,sGAAsG;AACtG,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAGrF;AAWD;mFACmF;AACnF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAUpE;AAiKD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;oFACoF;AACpF,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,eAA2B,GACnC,cAAc,CA+BhB;AA0CD;;oEAEoE;AACpE,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,eAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,CAsB9B;AAED,oGAAoG;AACpG,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,eAA2B,GACnC,MAAM,CASR"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEnF;;;yFAGyF;AACzF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,UAAU,CAAA;AAWpD,sGAAsG;AACtG,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAGrF;AAwCD;mFACmF;AACnF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAWpE;AAuBD,gEAAgE;AAChE,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAkD,CAAA;AAwJ/F,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;yBAEyB;AACzB,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,eAA2B,GACnC,cAAc,CAuChB;AA2CD;;;;+BAI+B;AAC/B,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,eAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,CAmC9B;AAED,sGAAsG;AACtG,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,eAA2B,GACnC,MAAM,CAUR"}