@noego/wood 0.0.1

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 (499) hide show
  1. package/README.md +107 -0
  2. package/bin/axe.js +202 -0
  3. package/bin/stick.js +96 -0
  4. package/bin/wood.js +572 -0
  5. package/dist/bridge/backend_bridge.cjs +186 -0
  6. package/dist/bridge/backend_bridge.cjs.map +1 -0
  7. package/dist/bridge/backend_bridge.d.cts +32 -0
  8. package/dist/bridge/backend_bridge.d.ts +32 -0
  9. package/dist/bridge/backend_bridge.js +152 -0
  10. package/dist/bridge/backend_bridge.js.map +1 -0
  11. package/dist/bridge/backend_entry.cjs +64 -0
  12. package/dist/bridge/backend_entry.cjs.map +1 -0
  13. package/dist/bridge/backend_entry.d.cts +14 -0
  14. package/dist/bridge/backend_entry.d.ts +14 -0
  15. package/dist/bridge/backend_entry.js +39 -0
  16. package/dist/bridge/backend_entry.js.map +1 -0
  17. package/dist/bridge/index.cjs +34 -0
  18. package/dist/bridge/index.cjs.map +1 -0
  19. package/dist/bridge/index.d.cts +2 -0
  20. package/dist/bridge/index.d.ts +2 -0
  21. package/dist/bridge/index.js +8 -0
  22. package/dist/bridge/index.js.map +1 -0
  23. package/dist/client/controller_contract.cjs +17 -0
  24. package/dist/client/controller_contract.cjs.map +1 -0
  25. package/dist/client/controller_contract.d.cts +15 -0
  26. package/dist/client/controller_contract.d.ts +15 -0
  27. package/dist/client/controller_contract.js +1 -0
  28. package/dist/client/controller_contract.js.map +1 -0
  29. package/dist/client/global_polyfill.cjs +6 -0
  30. package/dist/client/global_polyfill.cjs.map +1 -0
  31. package/dist/client/global_polyfill.d.cts +2 -0
  32. package/dist/client/global_polyfill.d.ts +2 -0
  33. package/dist/client/global_polyfill.js +5 -0
  34. package/dist/client/global_polyfill.js.map +1 -0
  35. package/dist/client/index.cjs +451 -0
  36. package/dist/client/index.cjs.map +1 -0
  37. package/dist/client/index.d.cts +75 -0
  38. package/dist/client/index.d.ts +75 -0
  39. package/dist/client/index.js +414 -0
  40. package/dist/client/index.js.map +1 -0
  41. package/dist/client/wood_controller.svelte.cjs +110 -0
  42. package/dist/client/wood_controller.svelte.cjs.map +1 -0
  43. package/dist/client/wood_controller.svelte.d.cts +30 -0
  44. package/dist/client/wood_controller.svelte.d.ts +30 -0
  45. package/dist/client/wood_controller.svelte.js +86 -0
  46. package/dist/client/wood_controller.svelte.js.map +1 -0
  47. package/dist/codegen/controller_registration_generator.cjs +138 -0
  48. package/dist/codegen/controller_registration_generator.cjs.map +1 -0
  49. package/dist/codegen/controller_registration_generator.d.cts +18 -0
  50. package/dist/codegen/controller_registration_generator.d.ts +18 -0
  51. package/dist/codegen/controller_registration_generator.js +104 -0
  52. package/dist/codegen/controller_registration_generator.js.map +1 -0
  53. package/dist/codegen/index.cjs +50 -0
  54. package/dist/codegen/index.cjs.map +1 -0
  55. package/dist/codegen/index.d.cts +10 -0
  56. package/dist/codegen/index.d.ts +10 -0
  57. package/dist/codegen/index.js +19 -0
  58. package/dist/codegen/index.js.map +1 -0
  59. package/dist/codegen/preload_generator.cjs +151 -0
  60. package/dist/codegen/preload_generator.cjs.map +1 -0
  61. package/dist/codegen/preload_generator.d.cts +8 -0
  62. package/dist/codegen/preload_generator.d.ts +8 -0
  63. package/dist/codegen/preload_generator.js +127 -0
  64. package/dist/codegen/preload_generator.js.map +1 -0
  65. package/dist/codegen/renderer_app_generator.cjs +397 -0
  66. package/dist/codegen/renderer_app_generator.cjs.map +1 -0
  67. package/dist/codegen/renderer_app_generator.d.cts +13 -0
  68. package/dist/codegen/renderer_app_generator.d.ts +13 -0
  69. package/dist/codegen/renderer_app_generator.js +363 -0
  70. package/dist/codegen/renderer_app_generator.js.map +1 -0
  71. package/dist/codegen/renderer_controller_registration_generator.cjs +122 -0
  72. package/dist/codegen/renderer_controller_registration_generator.cjs.map +1 -0
  73. package/dist/codegen/renderer_controller_registration_generator.d.cts +9 -0
  74. package/dist/codegen/renderer_controller_registration_generator.d.ts +9 -0
  75. package/dist/codegen/renderer_controller_registration_generator.js +88 -0
  76. package/dist/codegen/renderer_controller_registration_generator.js.map +1 -0
  77. package/dist/codegen/renderer_view_manifest_generator.cjs +126 -0
  78. package/dist/codegen/renderer_view_manifest_generator.cjs.map +1 -0
  79. package/dist/codegen/renderer_view_manifest_generator.d.cts +11 -0
  80. package/dist/codegen/renderer_view_manifest_generator.d.ts +11 -0
  81. package/dist/codegen/renderer_view_manifest_generator.js +92 -0
  82. package/dist/codegen/renderer_view_manifest_generator.js.map +1 -0
  83. package/dist/codegen/runtime_generator.cjs +156 -0
  84. package/dist/codegen/runtime_generator.cjs.map +1 -0
  85. package/dist/codegen/runtime_generator.d.cts +14 -0
  86. package/dist/codegen/runtime_generator.d.ts +14 -0
  87. package/dist/codegen/runtime_generator.js +122 -0
  88. package/dist/codegen/runtime_generator.js.map +1 -0
  89. package/dist/codegen/test_mock_generator.cjs +98 -0
  90. package/dist/codegen/test_mock_generator.cjs.map +1 -0
  91. package/dist/codegen/test_mock_generator.d.cts +5 -0
  92. package/dist/codegen/test_mock_generator.d.ts +5 -0
  93. package/dist/codegen/test_mock_generator.js +74 -0
  94. package/dist/codegen/test_mock_generator.js.map +1 -0
  95. package/dist/codegen/type_generator.cjs +203 -0
  96. package/dist/codegen/type_generator.cjs.map +1 -0
  97. package/dist/codegen/type_generator.d.cts +5 -0
  98. package/dist/codegen/type_generator.d.ts +5 -0
  99. package/dist/codegen/type_generator.js +179 -0
  100. package/dist/codegen/type_generator.js.map +1 -0
  101. package/dist/components/contextMenu.cjs +163 -0
  102. package/dist/components/contextMenu.cjs.map +1 -0
  103. package/dist/components/contextMenu.d.cts +43 -0
  104. package/dist/components/contextMenu.d.ts +43 -0
  105. package/dist/components/contextMenu.js +138 -0
  106. package/dist/components/contextMenu.js.map +1 -0
  107. package/dist/config/config_parser.cjs +176 -0
  108. package/dist/config/config_parser.cjs.map +1 -0
  109. package/dist/config/config_parser.d.cts +9 -0
  110. package/dist/config/config_parser.d.ts +9 -0
  111. package/dist/config/config_parser.js +142 -0
  112. package/dist/config/config_parser.js.map +1 -0
  113. package/dist/config/index.cjs +29 -0
  114. package/dist/config/index.cjs.map +1 -0
  115. package/dist/config/index.d.cts +2 -0
  116. package/dist/config/index.d.ts +2 -0
  117. package/dist/config/index.js +5 -0
  118. package/dist/config/index.js.map +1 -0
  119. package/dist/controller/__fixtures__/controllers/chat.cjs +32 -0
  120. package/dist/controller/__fixtures__/controllers/chat.cjs.map +1 -0
  121. package/dist/controller/__fixtures__/controllers/chat.d.cts +11 -0
  122. package/dist/controller/__fixtures__/controllers/chat.d.ts +11 -0
  123. package/dist/controller/__fixtures__/controllers/chat.js +12 -0
  124. package/dist/controller/__fixtures__/controllers/chat.js.map +1 -0
  125. package/dist/controller/__fixtures__/controllers/not_a_class.cjs +29 -0
  126. package/dist/controller/__fixtures__/controllers/not_a_class.cjs.map +1 -0
  127. package/dist/controller/__fixtures__/controllers/not_a_class.d.cts +3 -0
  128. package/dist/controller/__fixtures__/controllers/not_a_class.d.ts +3 -0
  129. package/dist/controller/__fixtures__/controllers/not_a_class.js +5 -0
  130. package/dist/controller/__fixtures__/controllers/not_a_class.js.map +1 -0
  131. package/dist/controller/__fixtures__/controllers/settings.controller.cjs +32 -0
  132. package/dist/controller/__fixtures__/controllers/settings.controller.cjs.map +1 -0
  133. package/dist/controller/__fixtures__/controllers/settings.controller.d.cts +12 -0
  134. package/dist/controller/__fixtures__/controllers/settings.controller.d.ts +12 -0
  135. package/dist/controller/__fixtures__/controllers/settings.controller.js +12 -0
  136. package/dist/controller/__fixtures__/controllers/settings.controller.js.map +1 -0
  137. package/dist/controller/__fixtures__/controllers/test.cjs +29 -0
  138. package/dist/controller/__fixtures__/controllers/test.cjs.map +1 -0
  139. package/dist/controller/__fixtures__/controllers/test.d.cts +7 -0
  140. package/dist/controller/__fixtures__/controllers/test.d.ts +7 -0
  141. package/dist/controller/__fixtures__/controllers/test.js +9 -0
  142. package/dist/controller/__fixtures__/controllers/test.js.map +1 -0
  143. package/dist/controller/controller_resolver.cjs +180 -0
  144. package/dist/controller/controller_resolver.cjs.map +1 -0
  145. package/dist/controller/controller_resolver.d.cts +51 -0
  146. package/dist/controller/controller_resolver.d.ts +51 -0
  147. package/dist/controller/controller_resolver.js +145 -0
  148. package/dist/controller/controller_resolver.js.map +1 -0
  149. package/dist/controller/index.cjs +31 -0
  150. package/dist/controller/index.cjs.map +1 -0
  151. package/dist/controller/index.d.cts +2 -0
  152. package/dist/controller/index.d.ts +2 -0
  153. package/dist/controller/index.js +6 -0
  154. package/dist/controller/index.js.map +1 -0
  155. package/dist/dev/backend_watcher.cjs +108 -0
  156. package/dist/dev/backend_watcher.cjs.map +1 -0
  157. package/dist/dev/backend_watcher.d.cts +22 -0
  158. package/dist/dev/backend_watcher.d.ts +22 -0
  159. package/dist/dev/backend_watcher.js +84 -0
  160. package/dist/dev/backend_watcher.js.map +1 -0
  161. package/dist/dev/dev_metadata.cjs +94 -0
  162. package/dist/dev/dev_metadata.cjs.map +1 -0
  163. package/dist/dev/dev_metadata.d.cts +20 -0
  164. package/dist/dev/dev_metadata.d.ts +20 -0
  165. package/dist/dev/dev_metadata.js +52 -0
  166. package/dist/dev/dev_metadata.js.map +1 -0
  167. package/dist/dev/esbuild_backend.cjs +124 -0
  168. package/dist/dev/esbuild_backend.cjs.map +1 -0
  169. package/dist/dev/esbuild_backend.d.cts +30 -0
  170. package/dist/dev/esbuild_backend.d.ts +30 -0
  171. package/dist/dev/esbuild_backend.js +90 -0
  172. package/dist/dev/esbuild_backend.js.map +1 -0
  173. package/dist/dev/index.cjs +57 -0
  174. package/dist/dev/index.cjs.map +1 -0
  175. package/dist/dev/index.d.cts +8 -0
  176. package/dist/dev/index.d.ts +8 -0
  177. package/dist/dev/index.js +31 -0
  178. package/dist/dev/index.js.map +1 -0
  179. package/dist/dev/wood_dev_server.cjs +220 -0
  180. package/dist/dev/wood_dev_server.cjs.map +1 -0
  181. package/dist/dev/wood_dev_server.d.cts +39 -0
  182. package/dist/dev/wood_dev_server.d.ts +39 -0
  183. package/dist/dev/wood_dev_server.js +186 -0
  184. package/dist/dev/wood_dev_server.js.map +1 -0
  185. package/dist/dev/yaml_watcher.cjs +142 -0
  186. package/dist/dev/yaml_watcher.cjs.map +1 -0
  187. package/dist/dev/yaml_watcher.d.cts +22 -0
  188. package/dist/dev/yaml_watcher.d.ts +22 -0
  189. package/dist/dev/yaml_watcher.js +108 -0
  190. package/dist/dev/yaml_watcher.js.map +1 -0
  191. package/dist/electron/index.cjs +176 -0
  192. package/dist/electron/index.cjs.map +1 -0
  193. package/dist/electron/index.d.cts +29 -0
  194. package/dist/electron/index.d.ts +29 -0
  195. package/dist/electron/index.js +140 -0
  196. package/dist/electron/index.js.map +1 -0
  197. package/dist/index.cjs +178 -0
  198. package/dist/index.cjs.map +1 -0
  199. package/dist/index.d.cts +41 -0
  200. package/dist/index.d.ts +41 -0
  201. package/dist/index.js +122 -0
  202. package/dist/index.js.map +1 -0
  203. package/dist/ipc/index.cjs +80 -0
  204. package/dist/ipc/index.cjs.map +1 -0
  205. package/dist/ipc/index.d.cts +12 -0
  206. package/dist/ipc/index.d.ts +12 -0
  207. package/dist/ipc/index.js +57 -0
  208. package/dist/ipc/index.js.map +1 -0
  209. package/dist/ipc/shared.cjs +50 -0
  210. package/dist/ipc/shared.cjs.map +1 -0
  211. package/dist/ipc/shared.d.cts +10 -0
  212. package/dist/ipc/shared.d.ts +10 -0
  213. package/dist/ipc/shared.js +23 -0
  214. package/dist/ipc/shared.js.map +1 -0
  215. package/dist/loader/__fixtures__/layouts/app.load.cjs +27 -0
  216. package/dist/loader/__fixtures__/layouts/app.load.cjs.map +1 -0
  217. package/dist/loader/__fixtures__/layouts/app.load.d.cts +5 -0
  218. package/dist/loader/__fixtures__/layouts/app.load.d.ts +5 -0
  219. package/dist/loader/__fixtures__/layouts/app.load.js +7 -0
  220. package/dist/loader/__fixtures__/layouts/app.load.js.map +1 -0
  221. package/dist/loader/__fixtures__/views/test/page.load.cjs +27 -0
  222. package/dist/loader/__fixtures__/views/test/page.load.cjs.map +1 -0
  223. package/dist/loader/__fixtures__/views/test/page.load.d.cts +6 -0
  224. package/dist/loader/__fixtures__/views/test/page.load.d.ts +6 -0
  225. package/dist/loader/__fixtures__/views/test/page.load.js +7 -0
  226. package/dist/loader/__fixtures__/views/test/page.load.js.map +1 -0
  227. package/dist/loader/index.cjs +29 -0
  228. package/dist/loader/index.cjs.map +1 -0
  229. package/dist/loader/index.d.cts +3 -0
  230. package/dist/loader/index.d.ts +3 -0
  231. package/dist/loader/index.js +5 -0
  232. package/dist/loader/index.js.map +1 -0
  233. package/dist/loader/loader_runner.cjs +109 -0
  234. package/dist/loader/loader_runner.cjs.map +1 -0
  235. package/dist/loader/loader_runner.d.cts +27 -0
  236. package/dist/loader/loader_runner.d.ts +27 -0
  237. package/dist/loader/loader_runner.js +75 -0
  238. package/dist/loader/loader_runner.js.map +1 -0
  239. package/dist/main/index.cjs +500 -0
  240. package/dist/main/index.cjs.map +1 -0
  241. package/dist/main/index.d.cts +98 -0
  242. package/dist/main/index.d.ts +98 -0
  243. package/dist/main/index.js +475 -0
  244. package/dist/main/index.js.map +1 -0
  245. package/dist/middleware/__fixtures__/middleware/auth.cjs +44 -0
  246. package/dist/middleware/__fixtures__/middleware/auth.cjs.map +1 -0
  247. package/dist/middleware/__fixtures__/middleware/auth.d.cts +6 -0
  248. package/dist/middleware/__fixtures__/middleware/auth.d.ts +6 -0
  249. package/dist/middleware/__fixtures__/middleware/auth.js +19 -0
  250. package/dist/middleware/__fixtures__/middleware/auth.js.map +1 -0
  251. package/dist/middleware/__fixtures__/middleware/sequence.cjs +47 -0
  252. package/dist/middleware/__fixtures__/middleware/sequence.cjs.map +1 -0
  253. package/dist/middleware/__fixtures__/middleware/sequence.d.cts +7 -0
  254. package/dist/middleware/__fixtures__/middleware/sequence.d.ts +7 -0
  255. package/dist/middleware/__fixtures__/middleware/sequence.js +21 -0
  256. package/dist/middleware/__fixtures__/middleware/sequence.js.map +1 -0
  257. package/dist/middleware/index.cjs +34 -0
  258. package/dist/middleware/index.cjs.map +1 -0
  259. package/dist/middleware/index.d.cts +3 -0
  260. package/dist/middleware/index.d.ts +3 -0
  261. package/dist/middleware/index.js +8 -0
  262. package/dist/middleware/index.js.map +1 -0
  263. package/dist/middleware/middleware_pipeline.cjs +55 -0
  264. package/dist/middleware/middleware_pipeline.cjs.map +1 -0
  265. package/dist/middleware/middleware_pipeline.d.cts +13 -0
  266. package/dist/middleware/middleware_pipeline.d.ts +13 -0
  267. package/dist/middleware/middleware_pipeline.js +30 -0
  268. package/dist/middleware/middleware_pipeline.js.map +1 -0
  269. package/dist/middleware/middleware_resolver.cjs +91 -0
  270. package/dist/middleware/middleware_resolver.cjs.map +1 -0
  271. package/dist/middleware/middleware_resolver.d.cts +19 -0
  272. package/dist/middleware/middleware_resolver.d.ts +19 -0
  273. package/dist/middleware/middleware_resolver.js +57 -0
  274. package/dist/middleware/middleware_resolver.js.map +1 -0
  275. package/dist/navigation/index.cjs +205 -0
  276. package/dist/navigation/index.cjs.map +1 -0
  277. package/dist/navigation/index.d.cts +34 -0
  278. package/dist/navigation/index.d.ts +34 -0
  279. package/dist/navigation/index.js +176 -0
  280. package/dist/navigation/index.js.map +1 -0
  281. package/dist/parser/index.cjs +36 -0
  282. package/dist/parser/index.cjs.map +1 -0
  283. package/dist/parser/index.d.cts +4 -0
  284. package/dist/parser/index.d.ts +4 -0
  285. package/dist/parser/index.js +9 -0
  286. package/dist/parser/index.js.map +1 -0
  287. package/dist/parser/operations_parser.cjs +94 -0
  288. package/dist/parser/operations_parser.cjs.map +1 -0
  289. package/dist/parser/operations_parser.d.cts +7 -0
  290. package/dist/parser/operations_parser.d.ts +7 -0
  291. package/dist/parser/operations_parser.js +59 -0
  292. package/dist/parser/operations_parser.js.map +1 -0
  293. package/dist/parser/views_parser.cjs +153 -0
  294. package/dist/parser/views_parser.cjs.map +1 -0
  295. package/dist/parser/views_parser.d.cts +11 -0
  296. package/dist/parser/views_parser.d.ts +11 -0
  297. package/dist/parser/views_parser.js +118 -0
  298. package/dist/parser/views_parser.js.map +1 -0
  299. package/dist/router/index.cjs +31 -0
  300. package/dist/router/index.cjs.map +1 -0
  301. package/dist/router/index.d.cts +2 -0
  302. package/dist/router/index.d.ts +2 -0
  303. package/dist/router/index.js +6 -0
  304. package/dist/router/index.js.map +1 -0
  305. package/dist/router/wood_router.cjs +246 -0
  306. package/dist/router/wood_router.cjs.map +1 -0
  307. package/dist/router/wood_router.d.cts +70 -0
  308. package/dist/router/wood_router.d.ts +70 -0
  309. package/dist/router/wood_router.js +221 -0
  310. package/dist/router/wood_router.js.map +1 -0
  311. package/dist/runtime/application_root.cjs +98 -0
  312. package/dist/runtime/application_root.cjs.map +1 -0
  313. package/dist/runtime/application_root.d.cts +5 -0
  314. package/dist/runtime/application_root.d.ts +5 -0
  315. package/dist/runtime/application_root.js +61 -0
  316. package/dist/runtime/application_root.js.map +1 -0
  317. package/dist/runtime/get_container.cjs +96 -0
  318. package/dist/runtime/get_container.cjs.map +1 -0
  319. package/dist/runtime/get_container.d.cts +16 -0
  320. package/dist/runtime/get_container.d.ts +16 -0
  321. package/dist/runtime/get_container.js +60 -0
  322. package/dist/runtime/get_container.js.map +1 -0
  323. package/dist/runtime/index.cjs +49 -0
  324. package/dist/runtime/index.cjs.map +1 -0
  325. package/dist/runtime/index.d.cts +8 -0
  326. package/dist/runtime/index.d.ts +8 -0
  327. package/dist/runtime/index.js +24 -0
  328. package/dist/runtime/index.js.map +1 -0
  329. package/dist/runtime/renderer_log_dispatcher.cjs +79 -0
  330. package/dist/runtime/renderer_log_dispatcher.cjs.map +1 -0
  331. package/dist/runtime/renderer_log_dispatcher.d.cts +27 -0
  332. package/dist/runtime/renderer_log_dispatcher.d.ts +27 -0
  333. package/dist/runtime/renderer_log_dispatcher.js +54 -0
  334. package/dist/runtime/renderer_log_dispatcher.js.map +1 -0
  335. package/dist/runtime/runtime.cjs +158 -0
  336. package/dist/runtime/runtime.cjs.map +1 -0
  337. package/dist/runtime/runtime.d.cts +35 -0
  338. package/dist/runtime/runtime.d.ts +35 -0
  339. package/dist/runtime/runtime.js +136 -0
  340. package/dist/runtime/runtime.js.map +1 -0
  341. package/dist/stick/allow_cli.cjs +39 -0
  342. package/dist/stick/allow_cli.cjs.map +1 -0
  343. package/dist/stick/allow_cli.d.cts +6 -0
  344. package/dist/stick/allow_cli.d.ts +6 -0
  345. package/dist/stick/allow_cli.js +15 -0
  346. package/dist/stick/allow_cli.js.map +1 -0
  347. package/dist/stick/index.cjs +276 -0
  348. package/dist/stick/index.cjs.map +1 -0
  349. package/dist/stick/index.d.cts +111 -0
  350. package/dist/stick/index.d.ts +111 -0
  351. package/dist/stick/index.js +237 -0
  352. package/dist/stick/index.js.map +1 -0
  353. package/dist/stick/static_renderer.cjs +144 -0
  354. package/dist/stick/static_renderer.cjs.map +1 -0
  355. package/dist/stick/static_renderer.d.cts +51 -0
  356. package/dist/stick/static_renderer.d.ts +51 -0
  357. package/dist/stick/static_renderer.js +119 -0
  358. package/dist/stick/static_renderer.js.map +1 -0
  359. package/dist/stick/template_resolver.cjs +156 -0
  360. package/dist/stick/template_resolver.cjs.map +1 -0
  361. package/dist/stick/template_resolver.d.cts +7 -0
  362. package/dist/stick/template_resolver.d.ts +7 -0
  363. package/dist/stick/template_resolver.js +122 -0
  364. package/dist/stick/template_resolver.js.map +1 -0
  365. package/dist/testing/create_controller_harness.cjs +175 -0
  366. package/dist/testing/create_controller_harness.cjs.map +1 -0
  367. package/dist/testing/create_controller_harness.d.cts +37 -0
  368. package/dist/testing/create_controller_harness.d.ts +37 -0
  369. package/dist/testing/create_controller_harness.js +162 -0
  370. package/dist/testing/create_controller_harness.js.map +1 -0
  371. package/dist/testing/create_router_bridge.cjs +103 -0
  372. package/dist/testing/create_router_bridge.cjs.map +1 -0
  373. package/dist/testing/create_router_bridge.d.cts +71 -0
  374. package/dist/testing/create_router_bridge.d.ts +71 -0
  375. package/dist/testing/create_router_bridge.js +78 -0
  376. package/dist/testing/create_router_bridge.js.map +1 -0
  377. package/dist/testing/create_test_container.cjs +72 -0
  378. package/dist/testing/create_test_container.cjs.map +1 -0
  379. package/dist/testing/create_test_container.d.cts +14 -0
  380. package/dist/testing/create_test_container.d.ts +14 -0
  381. package/dist/testing/create_test_container.js +48 -0
  382. package/dist/testing/create_test_container.js.map +1 -0
  383. package/dist/testing/create_test_router.cjs +57 -0
  384. package/dist/testing/create_test_router.cjs.map +1 -0
  385. package/dist/testing/create_test_router.d.cts +19 -0
  386. package/dist/testing/create_test_router.d.ts +19 -0
  387. package/dist/testing/create_test_router.js +33 -0
  388. package/dist/testing/create_test_router.js.map +1 -0
  389. package/dist/testing/index.cjs +48 -0
  390. package/dist/testing/index.cjs.map +1 -0
  391. package/dist/testing/index.d.cts +12 -0
  392. package/dist/testing/index.d.ts +12 -0
  393. package/dist/testing/index.js +22 -0
  394. package/dist/testing/index.js.map +1 -0
  395. package/dist/testing/mock_electron.cjs +100 -0
  396. package/dist/testing/mock_electron.cjs.map +1 -0
  397. package/dist/testing/mock_electron.d.cts +12 -0
  398. package/dist/testing/mock_electron.d.ts +12 -0
  399. package/dist/testing/mock_electron.js +75 -0
  400. package/dist/testing/mock_electron.js.map +1 -0
  401. package/dist/tracing/index.cjs +56 -0
  402. package/dist/tracing/index.cjs.map +1 -0
  403. package/dist/tracing/index.d.cts +4 -0
  404. package/dist/tracing/index.d.ts +4 -0
  405. package/dist/tracing/index.js +35 -0
  406. package/dist/tracing/index.js.map +1 -0
  407. package/dist/tracing/trace_hub.cjs +213 -0
  408. package/dist/tracing/trace_hub.cjs.map +1 -0
  409. package/dist/tracing/trace_hub.d.cts +47 -0
  410. package/dist/tracing/trace_hub.d.ts +47 -0
  411. package/dist/tracing/trace_hub.js +172 -0
  412. package/dist/tracing/trace_hub.js.map +1 -0
  413. package/dist/tracing/trace_provider.cjs +200 -0
  414. package/dist/tracing/trace_provider.cjs.map +1 -0
  415. package/dist/tracing/trace_provider.d.cts +69 -0
  416. package/dist/tracing/trace_provider.d.ts +69 -0
  417. package/dist/tracing/trace_provider.js +179 -0
  418. package/dist/tracing/trace_provider.js.map +1 -0
  419. package/dist/types/bridge.cjs +51 -0
  420. package/dist/types/bridge.cjs.map +1 -0
  421. package/dist/types/bridge.d.cts +56 -0
  422. package/dist/types/bridge.d.ts +56 -0
  423. package/dist/types/bridge.js +25 -0
  424. package/dist/types/bridge.js.map +1 -0
  425. package/dist/types/config.cjs +17 -0
  426. package/dist/types/config.cjs.map +1 -0
  427. package/dist/types/config.d.cts +74 -0
  428. package/dist/types/config.d.ts +74 -0
  429. package/dist/types/config.js +1 -0
  430. package/dist/types/config.js.map +1 -0
  431. package/dist/types/context.cjs +17 -0
  432. package/dist/types/context.cjs.map +1 -0
  433. package/dist/types/context.d.cts +61 -0
  434. package/dist/types/context.d.ts +61 -0
  435. package/dist/types/context.js +1 -0
  436. package/dist/types/context.js.map +1 -0
  437. package/dist/types/context_menu.cjs +17 -0
  438. package/dist/types/context_menu.cjs.map +1 -0
  439. package/dist/types/context_menu.d.cts +30 -0
  440. package/dist/types/context_menu.d.ts +30 -0
  441. package/dist/types/context_menu.js +1 -0
  442. package/dist/types/context_menu.js.map +1 -0
  443. package/dist/types/index.cjs +33 -0
  444. package/dist/types/index.cjs.map +1 -0
  445. package/dist/types/index.d.cts +6 -0
  446. package/dist/types/index.d.ts +6 -0
  447. package/dist/types/index.js +7 -0
  448. package/dist/types/index.js.map +1 -0
  449. package/dist/types/operations.cjs +17 -0
  450. package/dist/types/operations.cjs.map +1 -0
  451. package/dist/types/operations.d.cts +39 -0
  452. package/dist/types/operations.d.ts +39 -0
  453. package/dist/types/operations.js +1 -0
  454. package/dist/types/operations.js.map +1 -0
  455. package/dist/types/views.cjs +17 -0
  456. package/dist/types/views.cjs.map +1 -0
  457. package/dist/types/views.d.cts +44 -0
  458. package/dist/types/views.d.ts +44 -0
  459. package/dist/types/views.js +1 -0
  460. package/dist/types/views.js.map +1 -0
  461. package/dist/validation/index.cjs +29 -0
  462. package/dist/validation/index.cjs.map +1 -0
  463. package/dist/validation/index.d.cts +1 -0
  464. package/dist/validation/index.d.ts +1 -0
  465. package/dist/validation/index.js +5 -0
  466. package/dist/validation/index.js.map +1 -0
  467. package/dist/validation/schema_validator.cjs +86 -0
  468. package/dist/validation/schema_validator.cjs.map +1 -0
  469. package/dist/validation/schema_validator.d.cts +24 -0
  470. package/dist/validation/schema_validator.d.ts +24 -0
  471. package/dist/validation/schema_validator.js +52 -0
  472. package/dist/validation/schema_validator.js.map +1 -0
  473. package/dist/window/index.cjs +32 -0
  474. package/dist/window/index.cjs.map +1 -0
  475. package/dist/window/index.d.cts +4 -0
  476. package/dist/window/index.d.ts +4 -0
  477. package/dist/window/index.js +7 -0
  478. package/dist/window/index.js.map +1 -0
  479. package/dist/window/window_manager.cjs +354 -0
  480. package/dist/window/window_manager.cjs.map +1 -0
  481. package/dist/window/window_manager.d.cts +172 -0
  482. package/dist/window/window_manager.d.ts +172 -0
  483. package/dist/window/window_manager.js +330 -0
  484. package/dist/window/window_manager.js.map +1 -0
  485. package/dist/window/window_state_store.cjs +129 -0
  486. package/dist/window/window_state_store.cjs.map +1 -0
  487. package/dist/window/window_state_store.d.cts +39 -0
  488. package/dist/window/window_state_store.d.ts +39 -0
  489. package/dist/window/window_state_store.js +105 -0
  490. package/dist/window/window_state_store.js.map +1 -0
  491. package/loaders/loader.mjs +46 -0
  492. package/package.json +119 -0
  493. package/src/components/ContextMenuProvider.svelte +145 -0
  494. package/src/components/NavigationShell.svelte +204 -0
  495. package/src/components/WoodRecursiveRender.svelte +91 -0
  496. package/src/components/contextMenu.ts +228 -0
  497. package/src/components/index.d.ts +14 -0
  498. package/src/components/index.js +2 -0
  499. package/src/stick/WoodRecursiveRender.svelte +74 -0
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from2, except, desc) => {
11
+ if (from2 && typeof from2 === "object" || typeof from2 === "function") {
12
+ for (let key of __getOwnPropNames(from2))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var wood_controller_svelte_exports = {};
20
+ __export(wood_controller_svelte_exports, {
21
+ WoodController: () => WoodController
22
+ });
23
+ module.exports = __toCommonJS(wood_controller_svelte_exports);
24
+ var import_rxjs = require("rxjs");
25
+ var import_operators = require("rxjs/operators");
26
+ class WoodController {
27
+ constructor() {
28
+ this._state = null;
29
+ this._input = null;
30
+ this._events = null;
31
+ this.destroyed = false;
32
+ this.subscriptions = new import_rxjs.Subscription();
33
+ }
34
+ /**
35
+ * Controller state. Subclasses should define this as a class field
36
+ * (e.g. `readonly state = $state({...})`). The field shadows this getter.
37
+ *
38
+ * For backward compatibility, subclasses that implement `createState()`
39
+ * will have it called lazily via this getter.
40
+ */
41
+ get state() {
42
+ if (!this._state) {
43
+ if (typeof this.createState === "function") {
44
+ this._state = this.createState();
45
+ }
46
+ }
47
+ return this._state;
48
+ }
49
+ get input() {
50
+ if (!this._input) {
51
+ this._input = this.createInput();
52
+ }
53
+ return this._input;
54
+ }
55
+ get events() {
56
+ if (!this._events) {
57
+ this._events = this.createEvents();
58
+ }
59
+ return this._events;
60
+ }
61
+ get isDestroyed() {
62
+ return this.destroyed;
63
+ }
64
+ track(teardown) {
65
+ this.subscriptions.add(teardown);
66
+ }
67
+ createAction(actionName, strategy, handler) {
68
+ const subject = new import_rxjs.Subject();
69
+ let pipeline$;
70
+ if (strategy === "sync") {
71
+ pipeline$ = subject.pipe(
72
+ (0, import_operators.tap)((payload) => {
73
+ try {
74
+ handler(payload);
75
+ } catch (e) {
76
+ this.handleActionError(actionName, e);
77
+ }
78
+ })
79
+ );
80
+ } else {
81
+ const mapOp = strategy === "exhaust" ? import_operators.exhaustMap : strategy === "switch" ? import_operators.switchMap : strategy === "concat" ? import_operators.concatMap : import_operators.mergeMap;
82
+ pipeline$ = subject.pipe(
83
+ mapOp(
84
+ (payload) => (0, import_rxjs.from)((async () => {
85
+ await handler(payload);
86
+ })()).pipe(
87
+ (0, import_operators.catchError)((error) => {
88
+ this.handleActionError(actionName, error);
89
+ return import_rxjs.EMPTY;
90
+ })
91
+ )
92
+ )
93
+ );
94
+ }
95
+ this.track(pipeline$.subscribe());
96
+ return (payload) => subject.next(payload);
97
+ }
98
+ handleActionError(actionName, error) {
99
+ console.error(`[WoodController] Action '${actionName}' failed:`, error);
100
+ }
101
+ destroy() {
102
+ this.destroyed = true;
103
+ this.subscriptions.unsubscribe();
104
+ }
105
+ }
106
+ // Annotate the CommonJS export names for ESM import in node:
107
+ 0 && (module.exports = {
108
+ WoodController
109
+ });
110
+ //# sourceMappingURL=wood_controller.svelte.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/wood_controller.svelte.ts"],"sourcesContent":["import { Subject, Subscription, from, EMPTY, Observable, type Unsubscribable } from 'rxjs';\nimport { exhaustMap, concatMap, switchMap, mergeMap, tap, catchError } from 'rxjs/operators';\nimport type {\n ControllerEvents,\n ControllerInput,\n ControllerState,\n PageController,\n} from './controller_contract';\n\nexport type ActionConcurrency = \n | 'exhaust' \n | 'switch' \n | 'concat' \n | 'merge' \n | 'sync'; \n\nexport abstract class WoodController<\n S extends ControllerState,\n I extends ControllerInput,\n E extends ControllerEvents,\n> implements PageController<S, I, E> {\n private _state: S | null = null;\n private _input: I | null = null;\n private _events: E | null = null;\n private destroyed = false;\n protected readonly subscriptions = new Subscription();\n\n /**\n * Controller state. Subclasses should define this as a class field\n * (e.g. `readonly state = $state({...})`). The field shadows this getter.\n *\n * For backward compatibility, subclasses that implement `createState()`\n * will have it called lazily via this getter.\n */\n get state(): S {\n if (!this._state) {\n if (typeof (this as any).createState === 'function') {\n this._state = (this as any).createState();\n }\n }\n return this._state!;\n }\n\n get input(): I {\n if (!this._input) {\n this._input = this.createInput();\n }\n return this._input;\n }\n\n get events(): E {\n if (!this._events) {\n this._events = this.createEvents();\n }\n return this._events;\n }\n\n protected abstract createInput(): I;\n\n protected abstract createEvents(): E;\n\n protected get isDestroyed(): boolean {\n return this.destroyed;\n }\n\n protected track(teardown: Unsubscribable | (() => void)): void {\n this.subscriptions.add(teardown);\n }\n\n protected createAction<T = void>(\n actionName: string,\n strategy: ActionConcurrency,\n handler: (payload: T) => Promise<void> | void\n ): (payload: T) => void {\n const subject = new Subject<T>();\n let pipeline$: Observable<any>;\n\n if (strategy === 'sync') {\n pipeline$ = subject.pipe(\n tap((payload) => {\n try {\n handler(payload);\n } catch (e) {\n this.handleActionError(actionName, e);\n }\n })\n );\n } else {\n const mapOp = \n strategy === 'exhaust' ? exhaustMap :\n strategy === 'switch' ? switchMap :\n strategy === 'concat' ? concatMap :\n mergeMap;\n\n pipeline$ = subject.pipe(\n mapOp((payload) => \n from((async () => {\n await handler(payload);\n })()).pipe(\n catchError((error) => {\n this.handleActionError(actionName, error);\n return EMPTY; \n })\n )\n )\n );\n }\n\n this.track(pipeline$.subscribe());\n\n return (payload: T) => subject.next(payload);\n }\n\n protected handleActionError(actionName: string, error: unknown): void {\n console.error(`[WoodController] Action '${actionName}' failed:`, error);\n }\n\n destroy(): void {\n this.destroyed = true;\n this.subscriptions.unsubscribe();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAoF;AACpF,uBAA4E;AAerE,MAAe,eAIe;AAAA,EAJ9B;AAKL,SAAQ,SAAmB;AAC3B,SAAQ,SAAmB;AAC3B,SAAQ,UAAoB;AAC5B,SAAQ,YAAY;AACpB,SAAmB,gBAAgB,IAAI,yBAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpD,IAAI,QAAW;AACb,QAAI,CAAC,KAAK,QAAQ;AAChB,UAAI,OAAQ,KAAa,gBAAgB,YAAY;AACnD,aAAK,SAAU,KAAa,YAAY;AAAA,MAC1C;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,QAAW;AACb,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS,KAAK,YAAY;AAAA,IACjC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAY;AACd,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU,KAAK,aAAa;AAAA,IACnC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAMA,IAAc,cAAuB;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,MAAM,UAA+C;AAC7D,SAAK,cAAc,IAAI,QAAQ;AAAA,EACjC;AAAA,EAEU,aACR,YACA,UACA,SACsB;AACtB,UAAM,UAAU,IAAI,oBAAW;AAC/B,QAAI;AAEJ,QAAI,aAAa,QAAQ;AACvB,kBAAY,QAAQ;AAAA,YAClB,sBAAI,CAAC,YAAY;AACf,cAAI;AACD,oBAAQ,OAAO;AAAA,UAClB,SAAS,GAAG;AACT,iBAAK,kBAAkB,YAAY,CAAC;AAAA,UACvC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,YAAM,QACJ,aAAa,YAAY,8BACzB,aAAa,WAAW,6BACxB,aAAa,WAAW,6BACxB;AAEF,kBAAY,QAAQ;AAAA,QAClB;AAAA,UAAM,CAAC,gBACL,mBAAM,YAAY;AACf,kBAAM,QAAQ,OAAO;AAAA,UACxB,GAAG,CAAC,EAAE;AAAA,gBACJ,6BAAW,CAAC,UAAU;AACpB,mBAAK,kBAAkB,YAAY,KAAK;AACxC,qBAAO;AAAA,YACT,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,MAAM,UAAU,UAAU,CAAC;AAEhC,WAAO,CAAC,YAAe,QAAQ,KAAK,OAAO;AAAA,EAC7C;AAAA,EAEU,kBAAkB,YAAoB,OAAsB;AACpE,YAAQ,MAAM,4BAA4B,UAAU,aAAa,KAAK;AAAA,EACxE;AAAA,EAEA,UAAgB;AACd,SAAK,YAAY;AACjB,SAAK,cAAc,YAAY;AAAA,EACjC;AACF;","names":[]}
@@ -0,0 +1,30 @@
1
+ import { Subscription, Unsubscribable } from 'rxjs';
2
+ import { ControllerState, ControllerInput, ControllerEvents, PageController } from './controller_contract.cjs';
3
+
4
+ type ActionConcurrency = 'exhaust' | 'switch' | 'concat' | 'merge' | 'sync';
5
+ declare abstract class WoodController<S extends ControllerState, I extends ControllerInput, E extends ControllerEvents> implements PageController<S, I, E> {
6
+ private _state;
7
+ private _input;
8
+ private _events;
9
+ private destroyed;
10
+ protected readonly subscriptions: Subscription;
11
+ /**
12
+ * Controller state. Subclasses should define this as a class field
13
+ * (e.g. `readonly state = $state({...})`). The field shadows this getter.
14
+ *
15
+ * For backward compatibility, subclasses that implement `createState()`
16
+ * will have it called lazily via this getter.
17
+ */
18
+ get state(): S;
19
+ get input(): I;
20
+ get events(): E;
21
+ protected abstract createInput(): I;
22
+ protected abstract createEvents(): E;
23
+ protected get isDestroyed(): boolean;
24
+ protected track(teardown: Unsubscribable | (() => void)): void;
25
+ protected createAction<T = void>(actionName: string, strategy: ActionConcurrency, handler: (payload: T) => Promise<void> | void): (payload: T) => void;
26
+ protected handleActionError(actionName: string, error: unknown): void;
27
+ destroy(): void;
28
+ }
29
+
30
+ export { type ActionConcurrency, WoodController };
@@ -0,0 +1,30 @@
1
+ import { Subscription, Unsubscribable } from 'rxjs';
2
+ import { ControllerState, ControllerInput, ControllerEvents, PageController } from './controller_contract.js';
3
+
4
+ type ActionConcurrency = 'exhaust' | 'switch' | 'concat' | 'merge' | 'sync';
5
+ declare abstract class WoodController<S extends ControllerState, I extends ControllerInput, E extends ControllerEvents> implements PageController<S, I, E> {
6
+ private _state;
7
+ private _input;
8
+ private _events;
9
+ private destroyed;
10
+ protected readonly subscriptions: Subscription;
11
+ /**
12
+ * Controller state. Subclasses should define this as a class field
13
+ * (e.g. `readonly state = $state({...})`). The field shadows this getter.
14
+ *
15
+ * For backward compatibility, subclasses that implement `createState()`
16
+ * will have it called lazily via this getter.
17
+ */
18
+ get state(): S;
19
+ get input(): I;
20
+ get events(): E;
21
+ protected abstract createInput(): I;
22
+ protected abstract createEvents(): E;
23
+ protected get isDestroyed(): boolean;
24
+ protected track(teardown: Unsubscribable | (() => void)): void;
25
+ protected createAction<T = void>(actionName: string, strategy: ActionConcurrency, handler: (payload: T) => Promise<void> | void): (payload: T) => void;
26
+ protected handleActionError(actionName: string, error: unknown): void;
27
+ destroy(): void;
28
+ }
29
+
30
+ export { type ActionConcurrency, WoodController };
@@ -0,0 +1,86 @@
1
+ import { Subject, Subscription, from, EMPTY } from "rxjs";
2
+ import { exhaustMap, concatMap, switchMap, mergeMap, tap, catchError } from "rxjs/operators";
3
+ class WoodController {
4
+ constructor() {
5
+ this._state = null;
6
+ this._input = null;
7
+ this._events = null;
8
+ this.destroyed = false;
9
+ this.subscriptions = new Subscription();
10
+ }
11
+ /**
12
+ * Controller state. Subclasses should define this as a class field
13
+ * (e.g. `readonly state = $state({...})`). The field shadows this getter.
14
+ *
15
+ * For backward compatibility, subclasses that implement `createState()`
16
+ * will have it called lazily via this getter.
17
+ */
18
+ get state() {
19
+ if (!this._state) {
20
+ if (typeof this.createState === "function") {
21
+ this._state = this.createState();
22
+ }
23
+ }
24
+ return this._state;
25
+ }
26
+ get input() {
27
+ if (!this._input) {
28
+ this._input = this.createInput();
29
+ }
30
+ return this._input;
31
+ }
32
+ get events() {
33
+ if (!this._events) {
34
+ this._events = this.createEvents();
35
+ }
36
+ return this._events;
37
+ }
38
+ get isDestroyed() {
39
+ return this.destroyed;
40
+ }
41
+ track(teardown) {
42
+ this.subscriptions.add(teardown);
43
+ }
44
+ createAction(actionName, strategy, handler) {
45
+ const subject = new Subject();
46
+ let pipeline$;
47
+ if (strategy === "sync") {
48
+ pipeline$ = subject.pipe(
49
+ tap((payload) => {
50
+ try {
51
+ handler(payload);
52
+ } catch (e) {
53
+ this.handleActionError(actionName, e);
54
+ }
55
+ })
56
+ );
57
+ } else {
58
+ const mapOp = strategy === "exhaust" ? exhaustMap : strategy === "switch" ? switchMap : strategy === "concat" ? concatMap : mergeMap;
59
+ pipeline$ = subject.pipe(
60
+ mapOp(
61
+ (payload) => from((async () => {
62
+ await handler(payload);
63
+ })()).pipe(
64
+ catchError((error) => {
65
+ this.handleActionError(actionName, error);
66
+ return EMPTY;
67
+ })
68
+ )
69
+ )
70
+ );
71
+ }
72
+ this.track(pipeline$.subscribe());
73
+ return (payload) => subject.next(payload);
74
+ }
75
+ handleActionError(actionName, error) {
76
+ console.error(`[WoodController] Action '${actionName}' failed:`, error);
77
+ }
78
+ destroy() {
79
+ this.destroyed = true;
80
+ this.subscriptions.unsubscribe();
81
+ }
82
+ }
83
+ export {
84
+ WoodController
85
+ };
86
+ //# sourceMappingURL=wood_controller.svelte.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/wood_controller.svelte.ts"],"sourcesContent":["import { Subject, Subscription, from, EMPTY, Observable, type Unsubscribable } from 'rxjs';\nimport { exhaustMap, concatMap, switchMap, mergeMap, tap, catchError } from 'rxjs/operators';\nimport type {\n ControllerEvents,\n ControllerInput,\n ControllerState,\n PageController,\n} from './controller_contract';\n\nexport type ActionConcurrency = \n | 'exhaust' \n | 'switch' \n | 'concat' \n | 'merge' \n | 'sync'; \n\nexport abstract class WoodController<\n S extends ControllerState,\n I extends ControllerInput,\n E extends ControllerEvents,\n> implements PageController<S, I, E> {\n private _state: S | null = null;\n private _input: I | null = null;\n private _events: E | null = null;\n private destroyed = false;\n protected readonly subscriptions = new Subscription();\n\n /**\n * Controller state. Subclasses should define this as a class field\n * (e.g. `readonly state = $state({...})`). The field shadows this getter.\n *\n * For backward compatibility, subclasses that implement `createState()`\n * will have it called lazily via this getter.\n */\n get state(): S {\n if (!this._state) {\n if (typeof (this as any).createState === 'function') {\n this._state = (this as any).createState();\n }\n }\n return this._state!;\n }\n\n get input(): I {\n if (!this._input) {\n this._input = this.createInput();\n }\n return this._input;\n }\n\n get events(): E {\n if (!this._events) {\n this._events = this.createEvents();\n }\n return this._events;\n }\n\n protected abstract createInput(): I;\n\n protected abstract createEvents(): E;\n\n protected get isDestroyed(): boolean {\n return this.destroyed;\n }\n\n protected track(teardown: Unsubscribable | (() => void)): void {\n this.subscriptions.add(teardown);\n }\n\n protected createAction<T = void>(\n actionName: string,\n strategy: ActionConcurrency,\n handler: (payload: T) => Promise<void> | void\n ): (payload: T) => void {\n const subject = new Subject<T>();\n let pipeline$: Observable<any>;\n\n if (strategy === 'sync') {\n pipeline$ = subject.pipe(\n tap((payload) => {\n try {\n handler(payload);\n } catch (e) {\n this.handleActionError(actionName, e);\n }\n })\n );\n } else {\n const mapOp = \n strategy === 'exhaust' ? exhaustMap :\n strategy === 'switch' ? switchMap :\n strategy === 'concat' ? concatMap :\n mergeMap;\n\n pipeline$ = subject.pipe(\n mapOp((payload) => \n from((async () => {\n await handler(payload);\n })()).pipe(\n catchError((error) => {\n this.handleActionError(actionName, error);\n return EMPTY; \n })\n )\n )\n );\n }\n\n this.track(pipeline$.subscribe());\n\n return (payload: T) => subject.next(payload);\n }\n\n protected handleActionError(actionName: string, error: unknown): void {\n console.error(`[WoodController] Action '${actionName}' failed:`, error);\n }\n\n destroy(): void {\n this.destroyed = true;\n this.subscriptions.unsubscribe();\n }\n}\n"],"mappings":"AAAA,SAAS,SAAS,cAAc,MAAM,aAA8C;AACpF,SAAS,YAAY,WAAW,WAAW,UAAU,KAAK,kBAAkB;AAerE,MAAe,eAIe;AAAA,EAJ9B;AAKL,SAAQ,SAAmB;AAC3B,SAAQ,SAAmB;AAC3B,SAAQ,UAAoB;AAC5B,SAAQ,YAAY;AACpB,SAAmB,gBAAgB,IAAI,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpD,IAAI,QAAW;AACb,QAAI,CAAC,KAAK,QAAQ;AAChB,UAAI,OAAQ,KAAa,gBAAgB,YAAY;AACnD,aAAK,SAAU,KAAa,YAAY;AAAA,MAC1C;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,QAAW;AACb,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS,KAAK,YAAY;AAAA,IACjC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAY;AACd,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU,KAAK,aAAa;AAAA,IACnC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAMA,IAAc,cAAuB;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEU,MAAM,UAA+C;AAC7D,SAAK,cAAc,IAAI,QAAQ;AAAA,EACjC;AAAA,EAEU,aACR,YACA,UACA,SACsB;AACtB,UAAM,UAAU,IAAI,QAAW;AAC/B,QAAI;AAEJ,QAAI,aAAa,QAAQ;AACvB,kBAAY,QAAQ;AAAA,QAClB,IAAI,CAAC,YAAY;AACf,cAAI;AACD,oBAAQ,OAAO;AAAA,UAClB,SAAS,GAAG;AACT,iBAAK,kBAAkB,YAAY,CAAC;AAAA,UACvC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,YAAM,QACJ,aAAa,YAAY,aACzB,aAAa,WAAW,YACxB,aAAa,WAAW,YACxB;AAEF,kBAAY,QAAQ;AAAA,QAClB;AAAA,UAAM,CAAC,YACL,MAAM,YAAY;AACf,kBAAM,QAAQ,OAAO;AAAA,UACxB,GAAG,CAAC,EAAE;AAAA,YACJ,WAAW,CAAC,UAAU;AACpB,mBAAK,kBAAkB,YAAY,KAAK;AACxC,qBAAO;AAAA,YACT,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,MAAM,UAAU,UAAU,CAAC;AAEhC,WAAO,CAAC,YAAe,QAAQ,KAAK,OAAO;AAAA,EAC7C;AAAA,EAEU,kBAAkB,YAAoB,OAAsB;AACpE,YAAQ,MAAM,4BAA4B,UAAU,aAAa,KAAK;AAAA,EACxE;AAAA,EAEA,UAAgB;AACd,SAAK,YAAY;AACjB,SAAK,cAAc,YAAY;AAAA,EACjC;AACF;","names":[]}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var controller_registration_generator_exports = {};
30
+ __export(controller_registration_generator_exports, {
31
+ generateControllerRegistration: () => generateControllerRegistration
32
+ });
33
+ module.exports = __toCommonJS(controller_registration_generator_exports);
34
+ var import_fs = require("fs");
35
+ var import_path = __toESM(require("path"), 1);
36
+ const CANDIDATE_SUFFIXES = [
37
+ ".ts",
38
+ ".controller.ts",
39
+ ".js",
40
+ ".controller.js"
41
+ ];
42
+ const INDEX_CANDIDATES = [
43
+ "index.ts",
44
+ "index.js"
45
+ ];
46
+ function resolveControllerFile(controllerName, controllersDir) {
47
+ const basePath = import_path.default.resolve(controllersDir, controllerName);
48
+ for (const suffix of CANDIDATE_SUFFIXES) {
49
+ const candidate = basePath + suffix;
50
+ if ((0, import_fs.existsSync)(candidate)) return candidate;
51
+ }
52
+ for (const indexFile of INDEX_CANDIDATES) {
53
+ const candidate = import_path.default.resolve(controllersDir, controllerName, indexFile);
54
+ if ((0, import_fs.existsSync)(candidate)) return candidate;
55
+ }
56
+ return void 0;
57
+ }
58
+ function computeImportPath(fromDir, toFile) {
59
+ let rel = import_path.default.relative(fromDir, toFile);
60
+ if (!rel.startsWith(".")) {
61
+ rel = "./" + rel;
62
+ }
63
+ if (rel.endsWith(".ts")) {
64
+ rel = rel.slice(0, -3);
65
+ }
66
+ return rel.replace(/\\/g, "/");
67
+ }
68
+ function toControllerClassName(controllerName) {
69
+ const pascal = controllerName.split(/[_\-.]/).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join("");
70
+ return pascal + "Controller";
71
+ }
72
+ function extractControllerNames(operations) {
73
+ const names = /* @__PURE__ */ new Set();
74
+ operations.forEach((op) => {
75
+ names.add(op.controller);
76
+ });
77
+ return Array.from(names).sort();
78
+ }
79
+ function generateControllerRegistration(operations, options) {
80
+ const controllerNames = extractControllerNames(operations);
81
+ const outDirResolved = import_path.default.resolve(options.outDir);
82
+ const imports = [];
83
+ const registrations = [];
84
+ const unresolved = [];
85
+ for (const name of controllerNames) {
86
+ const filePath = resolveControllerFile(name, options.controllersDir);
87
+ if (!filePath) {
88
+ unresolved.push(name);
89
+ continue;
90
+ }
91
+ const importPath = computeImportPath(outDirResolved, filePath);
92
+ const className = toControllerClassName(name);
93
+ imports.push(`import ${className} from '${importPath}';`);
94
+ registrations.push(` router.registerController('${name}', ${className});`);
95
+ }
96
+ if (unresolved.length > 0 && !options.allowUnresolved) {
97
+ throw new Error(
98
+ `Controller registration codegen failed: ${unresolved.length} controller(s) not found on disk:
99
+ ` + unresolved.map((name) => ` - "${name}" (searched in ${options.controllersDir})`).join("\n") + `
100
+
101
+ Ensure each controller file exists with one of these suffixes: .ts, .controller.ts, .js, .controller.js`
102
+ );
103
+ }
104
+ const lines = [
105
+ "// AUTO-GENERATED by @noego/wood -- do not edit",
106
+ "//",
107
+ "// Static imports ensure all controllers are bundled and available at startup.",
108
+ "// registerController() puts each class directly in the router's cache."
109
+ ];
110
+ if (unresolved.length > 0) {
111
+ lines.push(
112
+ "",
113
+ "// WARNING: The following controllers could not be resolved on disk:",
114
+ ...unresolved.map((name) => `// - ${name}`)
115
+ );
116
+ }
117
+ lines.push("");
118
+ for (const imp of imports) {
119
+ lines.push(imp);
120
+ }
121
+ lines.push(
122
+ "",
123
+ "export function registerControllers(router: { registerController(name: string, cls: any): void }) {"
124
+ );
125
+ for (const reg of registrations) {
126
+ lines.push(reg);
127
+ }
128
+ lines.push(
129
+ "}",
130
+ ""
131
+ );
132
+ return lines.join("\n");
133
+ }
134
+ // Annotate the CommonJS export names for ESM import in node:
135
+ 0 && (module.exports = {
136
+ generateControllerRegistration
137
+ });
138
+ //# sourceMappingURL=controller_registration_generator.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/codegen/controller_registration_generator.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport path from 'path';\nimport type { OperationDef } from '../types/index.cjs';\n\n/**\n * Candidate file extensions to search when resolving a controller name to a file.\n * Matches the order used by ControllerResolver.resolveClass().\n */\nconst CANDIDATE_SUFFIXES = [\n '.ts',\n '.controller.ts',\n '.js',\n '.controller.js',\n] as const;\n\nconst INDEX_CANDIDATES = [\n 'index.ts',\n 'index.js',\n] as const;\n\n/**\n * Resolve a controller name to a file path on disk.\n * Returns the first candidate that exists, or undefined if none match.\n */\nfunction resolveControllerFile(controllerName: string, controllersDir: string): string | undefined {\n const basePath = path.resolve(controllersDir, controllerName);\n\n for (const suffix of CANDIDATE_SUFFIXES) {\n const candidate = basePath + suffix;\n if (existsSync(candidate)) return candidate;\n }\n\n for (const indexFile of INDEX_CANDIDATES) {\n const candidate = path.resolve(controllersDir, controllerName, indexFile);\n if (existsSync(candidate)) return candidate;\n }\n\n return undefined;\n}\n\n/**\n * Compute a relative import path from the generated file's directory to the\n * resolved controller file. Strips `.ts` extensions since TypeScript imports\n * should not include them.\n */\nfunction computeImportPath(fromDir: string, toFile: string): string {\n let rel = path.relative(fromDir, toFile);\n\n // Ensure the path starts with ./ or ../\n if (!rel.startsWith('.')) {\n rel = './' + rel;\n }\n\n // Strip .ts extension (TypeScript convention)\n if (rel.endsWith('.ts')) {\n rel = rel.slice(0, -3);\n }\n\n // Normalize path separators to forward slashes (Windows compat)\n return rel.replace(/\\\\/g, '/');\n}\n\n/**\n * Convert a controller name to a valid PascalCase identifier for the import.\n * e.g. \"chat\" -> \"ChatController\", \"multi_agent\" -> \"MultiAgentController\"\n */\nfunction toControllerClassName(controllerName: string): string {\n const pascal = controllerName\n .split(/[_\\-.]/)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join('');\n\n return pascal + 'Controller';\n}\n\n/**\n * Extract all unique controller names from a set of parsed operations.\n */\nfunction extractControllerNames(operations: Map<string, OperationDef>): string[] {\n const names = new Set<string>();\n\n operations.forEach((op) => {\n names.add(op.controller);\n });\n\n return Array.from(names).sort();\n}\n\nexport interface ControllerRegistrationOptions {\n /** Directory where controller source files live */\n controllersDir: string;\n /** Directory where the generated file will be written */\n outDir: string;\n /** If true, unresolved controllers emit a warning comment instead of throwing. Default: false. */\n allowUnresolved?: boolean;\n}\n\n/**\n * Generate a TypeScript registration file that statically imports every\n * controller referenced in operations and exports a function to register\n * them with a WoodRouter.\n */\nexport function generateControllerRegistration(\n operations: Map<string, OperationDef>,\n options: ControllerRegistrationOptions,\n): string {\n const controllerNames = extractControllerNames(operations);\n const outDirResolved = path.resolve(options.outDir);\n\n const imports: string[] = [];\n const registrations: string[] = [];\n const unresolved: string[] = [];\n\n for (const name of controllerNames) {\n const filePath = resolveControllerFile(name, options.controllersDir);\n\n if (!filePath) {\n unresolved.push(name);\n continue;\n }\n\n const importPath = computeImportPath(outDirResolved, filePath);\n const className = toControllerClassName(name);\n\n imports.push(`import ${className} from '${importPath}';`);\n registrations.push(` router.registerController('${name}', ${className});`);\n }\n\n // Fail by default when controllers cannot be resolved\n if (unresolved.length > 0 && !options.allowUnresolved) {\n throw new Error(\n `Controller registration codegen failed: ${unresolved.length} controller(s) not found on disk:\\n` +\n unresolved.map(name => ` - \"${name}\" (searched in ${options.controllersDir})`).join('\\n') +\n `\\n\\nEnsure each controller file exists with one of these suffixes: .ts, .controller.ts, .js, .controller.js`\n );\n }\n\n const lines: string[] = [\n '// AUTO-GENERATED by @noego/wood -- do not edit',\n '//',\n '// Static imports ensure all controllers are bundled and available at startup.',\n '// registerController() puts each class directly in the router\\'s cache.',\n ];\n\n if (unresolved.length > 0) {\n lines.push(\n '',\n '// WARNING: The following controllers could not be resolved on disk:',\n ...unresolved.map((name) => `// - ${name}`),\n );\n }\n\n // Static imports\n lines.push('');\n for (const imp of imports) {\n lines.push(imp);\n }\n\n // Registration function\n lines.push(\n '',\n 'export function registerControllers(router: { registerController(name: string, cls: any): void }) {',\n );\n for (const reg of registrations) {\n lines.push(reg);\n }\n lines.push(\n '}',\n '',\n );\n\n return lines.join('\\n');\n}\n"],"mappings":"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","names":["path"]}
@@ -0,0 +1,18 @@
1
+ import { OperationDef } from '../types/operations.cjs';
2
+
3
+ interface ControllerRegistrationOptions {
4
+ /** Directory where controller source files live */
5
+ controllersDir: string;
6
+ /** Directory where the generated file will be written */
7
+ outDir: string;
8
+ /** If true, unresolved controllers emit a warning comment instead of throwing. Default: false. */
9
+ allowUnresolved?: boolean;
10
+ }
11
+ /**
12
+ * Generate a TypeScript registration file that statically imports every
13
+ * controller referenced in operations and exports a function to register
14
+ * them with a WoodRouter.
15
+ */
16
+ declare function generateControllerRegistration(operations: Map<string, OperationDef>, options: ControllerRegistrationOptions): string;
17
+
18
+ export { type ControllerRegistrationOptions, generateControllerRegistration };
@@ -0,0 +1,18 @@
1
+ import { OperationDef } from '../types/operations.js';
2
+
3
+ interface ControllerRegistrationOptions {
4
+ /** Directory where controller source files live */
5
+ controllersDir: string;
6
+ /** Directory where the generated file will be written */
7
+ outDir: string;
8
+ /** If true, unresolved controllers emit a warning comment instead of throwing. Default: false. */
9
+ allowUnresolved?: boolean;
10
+ }
11
+ /**
12
+ * Generate a TypeScript registration file that statically imports every
13
+ * controller referenced in operations and exports a function to register
14
+ * them with a WoodRouter.
15
+ */
16
+ declare function generateControllerRegistration(operations: Map<string, OperationDef>, options: ControllerRegistrationOptions): string;
17
+
18
+ export { type ControllerRegistrationOptions, generateControllerRegistration };
@@ -0,0 +1,104 @@
1
+ import { existsSync } from "fs";
2
+ import path from "path";
3
+ const CANDIDATE_SUFFIXES = [
4
+ ".ts",
5
+ ".controller.ts",
6
+ ".js",
7
+ ".controller.js"
8
+ ];
9
+ const INDEX_CANDIDATES = [
10
+ "index.ts",
11
+ "index.js"
12
+ ];
13
+ function resolveControllerFile(controllerName, controllersDir) {
14
+ const basePath = path.resolve(controllersDir, controllerName);
15
+ for (const suffix of CANDIDATE_SUFFIXES) {
16
+ const candidate = basePath + suffix;
17
+ if (existsSync(candidate)) return candidate;
18
+ }
19
+ for (const indexFile of INDEX_CANDIDATES) {
20
+ const candidate = path.resolve(controllersDir, controllerName, indexFile);
21
+ if (existsSync(candidate)) return candidate;
22
+ }
23
+ return void 0;
24
+ }
25
+ function computeImportPath(fromDir, toFile) {
26
+ let rel = path.relative(fromDir, toFile);
27
+ if (!rel.startsWith(".")) {
28
+ rel = "./" + rel;
29
+ }
30
+ if (rel.endsWith(".ts")) {
31
+ rel = rel.slice(0, -3);
32
+ }
33
+ return rel.replace(/\\/g, "/");
34
+ }
35
+ function toControllerClassName(controllerName) {
36
+ const pascal = controllerName.split(/[_\-.]/).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join("");
37
+ return pascal + "Controller";
38
+ }
39
+ function extractControllerNames(operations) {
40
+ const names = /* @__PURE__ */ new Set();
41
+ operations.forEach((op) => {
42
+ names.add(op.controller);
43
+ });
44
+ return Array.from(names).sort();
45
+ }
46
+ function generateControllerRegistration(operations, options) {
47
+ const controllerNames = extractControllerNames(operations);
48
+ const outDirResolved = path.resolve(options.outDir);
49
+ const imports = [];
50
+ const registrations = [];
51
+ const unresolved = [];
52
+ for (const name of controllerNames) {
53
+ const filePath = resolveControllerFile(name, options.controllersDir);
54
+ if (!filePath) {
55
+ unresolved.push(name);
56
+ continue;
57
+ }
58
+ const importPath = computeImportPath(outDirResolved, filePath);
59
+ const className = toControllerClassName(name);
60
+ imports.push(`import ${className} from '${importPath}';`);
61
+ registrations.push(` router.registerController('${name}', ${className});`);
62
+ }
63
+ if (unresolved.length > 0 && !options.allowUnresolved) {
64
+ throw new Error(
65
+ `Controller registration codegen failed: ${unresolved.length} controller(s) not found on disk:
66
+ ` + unresolved.map((name) => ` - "${name}" (searched in ${options.controllersDir})`).join("\n") + `
67
+
68
+ Ensure each controller file exists with one of these suffixes: .ts, .controller.ts, .js, .controller.js`
69
+ );
70
+ }
71
+ const lines = [
72
+ "// AUTO-GENERATED by @noego/wood -- do not edit",
73
+ "//",
74
+ "// Static imports ensure all controllers are bundled and available at startup.",
75
+ "// registerController() puts each class directly in the router's cache."
76
+ ];
77
+ if (unresolved.length > 0) {
78
+ lines.push(
79
+ "",
80
+ "// WARNING: The following controllers could not be resolved on disk:",
81
+ ...unresolved.map((name) => `// - ${name}`)
82
+ );
83
+ }
84
+ lines.push("");
85
+ for (const imp of imports) {
86
+ lines.push(imp);
87
+ }
88
+ lines.push(
89
+ "",
90
+ "export function registerControllers(router: { registerController(name: string, cls: any): void }) {"
91
+ );
92
+ for (const reg of registrations) {
93
+ lines.push(reg);
94
+ }
95
+ lines.push(
96
+ "}",
97
+ ""
98
+ );
99
+ return lines.join("\n");
100
+ }
101
+ export {
102
+ generateControllerRegistration
103
+ };
104
+ //# sourceMappingURL=controller_registration_generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/codegen/controller_registration_generator.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport path from 'path';\nimport type { OperationDef } from '../types/index.js';\n\n/**\n * Candidate file extensions to search when resolving a controller name to a file.\n * Matches the order used by ControllerResolver.resolveClass().\n */\nconst CANDIDATE_SUFFIXES = [\n '.ts',\n '.controller.ts',\n '.js',\n '.controller.js',\n] as const;\n\nconst INDEX_CANDIDATES = [\n 'index.ts',\n 'index.js',\n] as const;\n\n/**\n * Resolve a controller name to a file path on disk.\n * Returns the first candidate that exists, or undefined if none match.\n */\nfunction resolveControllerFile(controllerName: string, controllersDir: string): string | undefined {\n const basePath = path.resolve(controllersDir, controllerName);\n\n for (const suffix of CANDIDATE_SUFFIXES) {\n const candidate = basePath + suffix;\n if (existsSync(candidate)) return candidate;\n }\n\n for (const indexFile of INDEX_CANDIDATES) {\n const candidate = path.resolve(controllersDir, controllerName, indexFile);\n if (existsSync(candidate)) return candidate;\n }\n\n return undefined;\n}\n\n/**\n * Compute a relative import path from the generated file's directory to the\n * resolved controller file. Strips `.ts` extensions since TypeScript imports\n * should not include them.\n */\nfunction computeImportPath(fromDir: string, toFile: string): string {\n let rel = path.relative(fromDir, toFile);\n\n // Ensure the path starts with ./ or ../\n if (!rel.startsWith('.')) {\n rel = './' + rel;\n }\n\n // Strip .ts extension (TypeScript convention)\n if (rel.endsWith('.ts')) {\n rel = rel.slice(0, -3);\n }\n\n // Normalize path separators to forward slashes (Windows compat)\n return rel.replace(/\\\\/g, '/');\n}\n\n/**\n * Convert a controller name to a valid PascalCase identifier for the import.\n * e.g. \"chat\" -> \"ChatController\", \"multi_agent\" -> \"MultiAgentController\"\n */\nfunction toControllerClassName(controllerName: string): string {\n const pascal = controllerName\n .split(/[_\\-.]/)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join('');\n\n return pascal + 'Controller';\n}\n\n/**\n * Extract all unique controller names from a set of parsed operations.\n */\nfunction extractControllerNames(operations: Map<string, OperationDef>): string[] {\n const names = new Set<string>();\n\n operations.forEach((op) => {\n names.add(op.controller);\n });\n\n return Array.from(names).sort();\n}\n\nexport interface ControllerRegistrationOptions {\n /** Directory where controller source files live */\n controllersDir: string;\n /** Directory where the generated file will be written */\n outDir: string;\n /** If true, unresolved controllers emit a warning comment instead of throwing. Default: false. */\n allowUnresolved?: boolean;\n}\n\n/**\n * Generate a TypeScript registration file that statically imports every\n * controller referenced in operations and exports a function to register\n * them with a WoodRouter.\n */\nexport function generateControllerRegistration(\n operations: Map<string, OperationDef>,\n options: ControllerRegistrationOptions,\n): string {\n const controllerNames = extractControllerNames(operations);\n const outDirResolved = path.resolve(options.outDir);\n\n const imports: string[] = [];\n const registrations: string[] = [];\n const unresolved: string[] = [];\n\n for (const name of controllerNames) {\n const filePath = resolveControllerFile(name, options.controllersDir);\n\n if (!filePath) {\n unresolved.push(name);\n continue;\n }\n\n const importPath = computeImportPath(outDirResolved, filePath);\n const className = toControllerClassName(name);\n\n imports.push(`import ${className} from '${importPath}';`);\n registrations.push(` router.registerController('${name}', ${className});`);\n }\n\n // Fail by default when controllers cannot be resolved\n if (unresolved.length > 0 && !options.allowUnresolved) {\n throw new Error(\n `Controller registration codegen failed: ${unresolved.length} controller(s) not found on disk:\\n` +\n unresolved.map(name => ` - \"${name}\" (searched in ${options.controllersDir})`).join('\\n') +\n `\\n\\nEnsure each controller file exists with one of these suffixes: .ts, .controller.ts, .js, .controller.js`\n );\n }\n\n const lines: string[] = [\n '// AUTO-GENERATED by @noego/wood -- do not edit',\n '//',\n '// Static imports ensure all controllers are bundled and available at startup.',\n '// registerController() puts each class directly in the router\\'s cache.',\n ];\n\n if (unresolved.length > 0) {\n lines.push(\n '',\n '// WARNING: The following controllers could not be resolved on disk:',\n ...unresolved.map((name) => `// - ${name}`),\n );\n }\n\n // Static imports\n lines.push('');\n for (const imp of imports) {\n lines.push(imp);\n }\n\n // Registration function\n lines.push(\n '',\n 'export function registerControllers(router: { registerController(name: string, cls: any): void }) {',\n );\n for (const reg of registrations) {\n lines.push(reg);\n }\n lines.push(\n '}',\n '',\n );\n\n return lines.join('\\n');\n}\n"],"mappings":"AAAA,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AAOjB,MAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AACF;AAMA,SAAS,sBAAsB,gBAAwB,gBAA4C;AACjG,QAAM,WAAW,KAAK,QAAQ,gBAAgB,cAAc;AAE5D,aAAW,UAAU,oBAAoB;AACvC,UAAM,YAAY,WAAW;AAC7B,QAAI,WAAW,SAAS,EAAG,QAAO;AAAA,EACpC;AAEA,aAAW,aAAa,kBAAkB;AACxC,UAAM,YAAY,KAAK,QAAQ,gBAAgB,gBAAgB,SAAS;AACxE,QAAI,WAAW,SAAS,EAAG,QAAO;AAAA,EACpC;AAEA,SAAO;AACT;AAOA,SAAS,kBAAkB,SAAiB,QAAwB;AAClE,MAAI,MAAM,KAAK,SAAS,SAAS,MAAM;AAGvC,MAAI,CAAC,IAAI,WAAW,GAAG,GAAG;AACxB,UAAM,OAAO;AAAA,EACf;AAGA,MAAI,IAAI,SAAS,KAAK,GAAG;AACvB,UAAM,IAAI,MAAM,GAAG,EAAE;AAAA,EACvB;AAGA,SAAO,IAAI,QAAQ,OAAO,GAAG;AAC/B;AAMA,SAAS,sBAAsB,gBAAgC;AAC7D,QAAM,SAAS,eACZ,MAAM,QAAQ,EACd,IAAI,CAAC,YAAY,QAAQ,OAAO,CAAC,EAAE,YAAY,IAAI,QAAQ,MAAM,CAAC,CAAC,EACnE,KAAK,EAAE;AAEV,SAAO,SAAS;AAClB;AAKA,SAAS,uBAAuB,YAAiD;AAC/E,QAAM,QAAQ,oBAAI,IAAY;AAE9B,aAAW,QAAQ,CAAC,OAAO;AACzB,UAAM,IAAI,GAAG,UAAU;AAAA,EACzB,CAAC;AAED,SAAO,MAAM,KAAK,KAAK,EAAE,KAAK;AAChC;AAgBO,SAAS,+BACd,YACA,SACQ;AACR,QAAM,kBAAkB,uBAAuB,UAAU;AACzD,QAAM,iBAAiB,KAAK,QAAQ,QAAQ,MAAM;AAElD,QAAM,UAAoB,CAAC;AAC3B,QAAM,gBAA0B,CAAC;AACjC,QAAM,aAAuB,CAAC;AAE9B,aAAW,QAAQ,iBAAiB;AAClC,UAAM,WAAW,sBAAsB,MAAM,QAAQ,cAAc;AAEnE,QAAI,CAAC,UAAU;AACb,iBAAW,KAAK,IAAI;AACpB;AAAA,IACF;AAEA,UAAM,aAAa,kBAAkB,gBAAgB,QAAQ;AAC7D,UAAM,YAAY,sBAAsB,IAAI;AAE5C,YAAQ,KAAK,UAAU,SAAS,UAAU,UAAU,IAAI;AACxD,kBAAc,KAAK,gCAAgC,IAAI,MAAM,SAAS,IAAI;AAAA,EAC5E;AAGA,MAAI,WAAW,SAAS,KAAK,CAAC,QAAQ,iBAAiB;AACrD,UAAM,IAAI;AAAA,MACR,2CAA2C,WAAW,MAAM;AAAA,IAC5D,WAAW,IAAI,UAAQ,QAAQ,IAAI,kBAAkB,QAAQ,cAAc,GAAG,EAAE,KAAK,IAAI,IACzF;AAAA;AAAA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAG,WAAW,IAAI,CAAC,SAAS,UAAU,IAAI,EAAE;AAAA,IAC9C;AAAA,EACF;AAGA,QAAM,KAAK,EAAE;AACb,aAAW,OAAO,SAAS;AACzB,UAAM,KAAK,GAAG;AAAA,EAChB;AAGA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF;AACA,aAAW,OAAO,eAAe;AAC/B,UAAM,KAAK,GAAG;AAAA,EAChB;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var codegen_exports = {};
20
+ __export(codegen_exports, {
21
+ generateControllerRegistration: () => import_controller_registration_generator.generateControllerRegistration,
22
+ generatePreload: () => import_preload_generator.generatePreload,
23
+ generateRendererApp: () => import_renderer_app_generator.generateRendererApp,
24
+ generateRendererControllerRegistration: () => import_renderer_controller_registration_generator.generateRendererControllerRegistration,
25
+ generateRendererViewManifest: () => import_renderer_view_manifest_generator.generateRendererViewManifest,
26
+ generateRuntime: () => import_runtime_generator.generateRuntime,
27
+ generateTestMock: () => import_test_mock_generator.generateTestMock,
28
+ generateTypes: () => import_type_generator.generateTypes
29
+ });
30
+ module.exports = __toCommonJS(codegen_exports);
31
+ var import_preload_generator = require("./preload_generator.cjs");
32
+ var import_type_generator = require("./type_generator.cjs");
33
+ var import_test_mock_generator = require("./test_mock_generator.cjs");
34
+ var import_controller_registration_generator = require("./controller_registration_generator.cjs");
35
+ var import_runtime_generator = require("./runtime_generator.cjs");
36
+ var import_renderer_view_manifest_generator = require("./renderer_view_manifest_generator.cjs");
37
+ var import_renderer_controller_registration_generator = require("./renderer_controller_registration_generator.cjs");
38
+ var import_renderer_app_generator = require("./renderer_app_generator.cjs");
39
+ // Annotate the CommonJS export names for ESM import in node:
40
+ 0 && (module.exports = {
41
+ generateControllerRegistration,
42
+ generatePreload,
43
+ generateRendererApp,
44
+ generateRendererControllerRegistration,
45
+ generateRendererViewManifest,
46
+ generateRuntime,
47
+ generateTestMock,
48
+ generateTypes
49
+ });
50
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/codegen/index.ts"],"sourcesContent":["export { generatePreload } from './preload_generator.cjs';\nexport { generateTypes } from './type_generator.cjs';\nexport { generateTestMock } from './test_mock_generator.cjs';\nexport { generateControllerRegistration } from './controller_registration_generator.cjs';\nexport type { ControllerRegistrationOptions } from './controller_registration_generator.cjs';\nexport { generateRuntime } from './runtime_generator.cjs';\nexport type { RuntimeGeneratorOptions } from './runtime_generator.cjs';\nexport { generateRendererViewManifest } from './renderer_view_manifest_generator.cjs';\nexport type { RendererViewManifestGeneratorOptions } from './renderer_view_manifest_generator.cjs';\nexport { generateRendererControllerRegistration } from './renderer_controller_registration_generator.cjs';\nexport type { RendererControllerRegistrationOptions } from './renderer_controller_registration_generator.cjs';\nexport { generateRendererApp } from './renderer_app_generator.cjs';\nexport type { RendererAppGeneratorOptions } from './renderer_app_generator.cjs';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAgC;AAChC,4BAA8B;AAC9B,iCAAiC;AACjC,+CAA+C;AAE/C,+BAAgC;AAEhC,8CAA6C;AAE7C,wDAAuD;AAEvD,oCAAoC;","names":[]}