@noego/wood 0.4.9 → 0.5.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 (493) hide show
  1. package/README.md +118 -42
  2. package/bin/axe.js +313 -98
  3. package/dist/{loader/__fixtures__/layouts/app.load.cjs → automation/actions.cjs} +3 -13
  4. package/dist/automation/actions.cjs.map +1 -0
  5. package/dist/automation/actions.d.cts +57 -0
  6. package/dist/automation/actions.d.ts +57 -0
  7. package/dist/automation/actions.js +1 -0
  8. package/dist/automation/actions.js.map +1 -0
  9. package/dist/automation/actions_executor.cjs +101 -0
  10. package/dist/automation/actions_executor.cjs.map +1 -0
  11. package/dist/automation/actions_executor.d.cts +16 -0
  12. package/dist/automation/actions_executor.d.ts +16 -0
  13. package/dist/automation/actions_executor.js +76 -0
  14. package/dist/automation/actions_executor.js.map +1 -0
  15. package/dist/automation/connection.cjs +86 -0
  16. package/dist/automation/connection.cjs.map +1 -0
  17. package/dist/automation/connection.d.cts +18 -0
  18. package/dist/automation/connection.d.ts +18 -0
  19. package/dist/automation/connection.js +51 -0
  20. package/dist/automation/connection.js.map +1 -0
  21. package/dist/{middleware/__fixtures__/middleware/sequence.cjs → automation/errors.cjs} +25 -22
  22. package/dist/automation/errors.cjs.map +1 -0
  23. package/dist/automation/errors.d.cts +31 -0
  24. package/dist/automation/errors.d.ts +31 -0
  25. package/dist/automation/errors.js +24 -0
  26. package/dist/automation/errors.js.map +1 -0
  27. package/dist/automation/index.cjs +49 -0
  28. package/dist/automation/index.cjs.map +1 -0
  29. package/dist/automation/index.d.cts +16 -0
  30. package/dist/automation/index.d.ts +16 -0
  31. package/dist/automation/index.js +15 -0
  32. package/dist/automation/index.js.map +1 -0
  33. package/dist/automation/introspection_reader.cjs +75 -0
  34. package/dist/automation/introspection_reader.cjs.map +1 -0
  35. package/dist/automation/introspection_reader.d.cts +20 -0
  36. package/dist/automation/introspection_reader.d.ts +20 -0
  37. package/dist/automation/introspection_reader.js +48 -0
  38. package/dist/automation/introspection_reader.js.map +1 -0
  39. package/dist/automation/locator.cjs +102 -0
  40. package/dist/automation/locator.cjs.map +1 -0
  41. package/dist/automation/locator.d.cts +51 -0
  42. package/dist/automation/locator.d.ts +51 -0
  43. package/dist/automation/locator.js +75 -0
  44. package/dist/automation/locator.js.map +1 -0
  45. package/dist/{loader/__fixtures__/views/test/page.load.cjs → automation/observation.cjs} +3 -13
  46. package/dist/automation/observation.cjs.map +1 -0
  47. package/dist/automation/observation.d.cts +44 -0
  48. package/dist/automation/observation.d.ts +44 -0
  49. package/dist/automation/observation.js +1 -0
  50. package/dist/automation/observation.js.map +1 -0
  51. package/dist/{controller/__fixtures__/controllers/test.cjs → automation/receipts.cjs} +3 -15
  52. package/dist/automation/receipts.cjs.map +1 -0
  53. package/dist/automation/receipts.d.cts +27 -0
  54. package/dist/automation/receipts.d.ts +27 -0
  55. package/dist/automation/receipts.js +1 -0
  56. package/dist/automation/receipts.js.map +1 -0
  57. package/dist/automation/scenario.cjs +696 -0
  58. package/dist/automation/scenario.cjs.map +1 -0
  59. package/dist/automation/scenario.d.cts +89 -0
  60. package/dist/automation/scenario.d.ts +89 -0
  61. package/dist/automation/scenario.js +660 -0
  62. package/dist/automation/scenario.js.map +1 -0
  63. package/dist/automation/scrolling.cjs +17 -0
  64. package/dist/automation/scrolling.cjs.map +1 -0
  65. package/dist/automation/scrolling.d.cts +51 -0
  66. package/dist/automation/scrolling.d.ts +51 -0
  67. package/dist/automation/scrolling.js +1 -0
  68. package/dist/automation/scrolling.js.map +1 -0
  69. package/dist/automation/scrolling_executor.cjs +109 -0
  70. package/dist/automation/scrolling_executor.cjs.map +1 -0
  71. package/dist/automation/scrolling_executor.d.cts +13 -0
  72. package/dist/automation/scrolling_executor.d.ts +13 -0
  73. package/dist/automation/scrolling_executor.js +84 -0
  74. package/dist/automation/scrolling_executor.js.map +1 -0
  75. package/dist/automation/target_identity.cjs +17 -0
  76. package/dist/automation/target_identity.cjs.map +1 -0
  77. package/dist/automation/target_identity.d.cts +28 -0
  78. package/dist/automation/target_identity.d.ts +28 -0
  79. package/dist/automation/target_identity.js +1 -0
  80. package/dist/automation/target_identity.js.map +1 -0
  81. package/dist/automation/target_registry.cjs +148 -0
  82. package/dist/automation/target_registry.cjs.map +1 -0
  83. package/dist/automation/target_registry.d.cts +32 -0
  84. package/dist/automation/target_registry.d.ts +32 -0
  85. package/dist/automation/target_registry.js +122 -0
  86. package/dist/automation/target_registry.js.map +1 -0
  87. package/dist/automation/waits.cjs +17 -0
  88. package/dist/automation/waits.cjs.map +1 -0
  89. package/dist/automation/waits.d.cts +44 -0
  90. package/dist/automation/waits.d.ts +44 -0
  91. package/dist/automation/waits.js +1 -0
  92. package/dist/automation/waits.js.map +1 -0
  93. package/dist/automation/waits_executor.cjs +104 -0
  94. package/dist/automation/waits_executor.cjs.map +1 -0
  95. package/dist/automation/waits_executor.d.cts +14 -0
  96. package/dist/automation/waits_executor.d.ts +14 -0
  97. package/dist/automation/waits_executor.js +79 -0
  98. package/dist/automation/waits_executor.js.map +1 -0
  99. package/dist/bridge/backend_bridge.cjs.map +1 -1
  100. package/dist/bridge/backend_bridge.js.map +1 -1
  101. package/dist/client/index.cjs +78 -21
  102. package/dist/client/index.cjs.map +1 -1
  103. package/dist/client/index.d.cts +19 -3
  104. package/dist/client/index.d.ts +19 -3
  105. package/dist/client/index.js +80 -22
  106. package/dist/client/index.js.map +1 -1
  107. package/dist/client/renderer_log_transport.cjs +151 -0
  108. package/dist/client/renderer_log_transport.cjs.map +1 -0
  109. package/dist/client/renderer_log_transport.d.cts +54 -0
  110. package/dist/client/renderer_log_transport.d.ts +54 -0
  111. package/dist/client/renderer_log_transport.js +123 -0
  112. package/dist/client/renderer_log_transport.js.map +1 -0
  113. package/dist/codegen/controller_registration_generator.cjs +13 -2
  114. package/dist/codegen/controller_registration_generator.cjs.map +1 -1
  115. package/dist/codegen/controller_registration_generator.d.cts +12 -1
  116. package/dist/codegen/controller_registration_generator.d.ts +12 -1
  117. package/dist/codegen/controller_registration_generator.js +10 -1
  118. package/dist/codegen/controller_registration_generator.js.map +1 -1
  119. package/dist/codegen/index.d.cts +1 -0
  120. package/dist/codegen/index.d.ts +1 -0
  121. package/dist/codegen/preload_generator.cjs +13 -6
  122. package/dist/codegen/preload_generator.cjs.map +1 -1
  123. package/dist/codegen/preload_generator.d.cts +11 -2
  124. package/dist/codegen/preload_generator.d.ts +11 -2
  125. package/dist/codegen/preload_generator.js +13 -6
  126. package/dist/codegen/preload_generator.js.map +1 -1
  127. package/dist/codegen/renderer_app_generator.cjs +95 -44
  128. package/dist/codegen/renderer_app_generator.cjs.map +1 -1
  129. package/dist/codegen/renderer_app_generator.js +95 -44
  130. package/dist/codegen/renderer_app_generator.js.map +1 -1
  131. package/dist/codegen/type_generator.cjs +1 -0
  132. package/dist/codegen/type_generator.cjs.map +1 -1
  133. package/dist/codegen/type_generator.js +1 -0
  134. package/dist/codegen/type_generator.js.map +1 -1
  135. package/dist/config/config_parser.cjs +95 -4
  136. package/dist/config/config_parser.cjs.map +1 -1
  137. package/dist/config/config_parser.d.cts +10 -2
  138. package/dist/config/config_parser.d.ts +10 -2
  139. package/dist/config/config_parser.js +92 -3
  140. package/dist/config/config_parser.js.map +1 -1
  141. package/dist/config/index.cjs +6 -2
  142. package/dist/config/index.cjs.map +1 -1
  143. package/dist/config/index.d.cts +2 -2
  144. package/dist/config/index.d.ts +2 -2
  145. package/dist/config/index.js +8 -2
  146. package/dist/config/index.js.map +1 -1
  147. package/dist/controller/controller_resolver.cjs +51 -3
  148. package/dist/controller/controller_resolver.cjs.map +1 -1
  149. package/dist/controller/controller_resolver.d.cts +27 -4
  150. package/dist/controller/controller_resolver.d.ts +27 -4
  151. package/dist/controller/controller_resolver.js +48 -2
  152. package/dist/controller/controller_resolver.js.map +1 -1
  153. package/dist/controller/index.cjs +6 -2
  154. package/dist/controller/index.cjs.map +1 -1
  155. package/dist/controller/index.d.cts +1 -1
  156. package/dist/controller/index.d.ts +1 -1
  157. package/dist/controller/index.js +4 -2
  158. package/dist/controller/index.js.map +1 -1
  159. package/dist/dev/wood_dev_server.cjs +4 -1
  160. package/dist/dev/wood_dev_server.cjs.map +1 -1
  161. package/dist/dev/wood_dev_server.js +5 -2
  162. package/dist/dev/wood_dev_server.js.map +1 -1
  163. package/dist/dev/yaml_watcher.cjs +1 -1
  164. package/dist/dev/yaml_watcher.cjs.map +1 -1
  165. package/dist/dev/yaml_watcher.d.cts +4 -0
  166. package/dist/dev/yaml_watcher.d.ts +4 -0
  167. package/dist/dev/yaml_watcher.js +1 -1
  168. package/dist/dev/yaml_watcher.js.map +1 -1
  169. package/dist/frontend/frontend_lifecycle.cjs +74 -0
  170. package/dist/frontend/frontend_lifecycle.cjs.map +1 -0
  171. package/dist/frontend/frontend_lifecycle.d.cts +50 -0
  172. package/dist/frontend/frontend_lifecycle.d.ts +50 -0
  173. package/dist/frontend/frontend_lifecycle.js +50 -0
  174. package/dist/frontend/frontend_lifecycle.js.map +1 -0
  175. package/dist/frontend/frontend_page.cjs +122 -0
  176. package/dist/frontend/frontend_page.cjs.map +1 -0
  177. package/dist/frontend/frontend_page.d.cts +62 -0
  178. package/dist/frontend/frontend_page.d.ts +62 -0
  179. package/dist/frontend/frontend_page.js +98 -0
  180. package/dist/frontend/frontend_page.js.map +1 -0
  181. package/dist/frontend/frontend_surface.cjs +249 -0
  182. package/dist/frontend/frontend_surface.cjs.map +1 -0
  183. package/dist/frontend/frontend_surface.d.cts +64 -0
  184. package/dist/frontend/frontend_surface.d.ts +64 -0
  185. package/dist/frontend/frontend_surface.js +224 -0
  186. package/dist/frontend/frontend_surface.js.map +1 -0
  187. package/dist/frontend/index.cjs +52 -0
  188. package/dist/frontend/index.cjs.map +1 -0
  189. package/dist/frontend/index.d.cts +10 -0
  190. package/dist/frontend/index.d.ts +10 -0
  191. package/dist/frontend/index.js +19 -0
  192. package/dist/frontend/index.js.map +1 -0
  193. package/dist/frontend/page_catalog.cjs +135 -0
  194. package/dist/frontend/page_catalog.cjs.map +1 -0
  195. package/dist/frontend/page_catalog.d.cts +56 -0
  196. package/dist/frontend/page_catalog.d.ts +56 -0
  197. package/dist/frontend/page_catalog.js +108 -0
  198. package/dist/frontend/page_catalog.js.map +1 -0
  199. package/dist/frontend/tracked_transport.cjs +55 -0
  200. package/dist/frontend/tracked_transport.cjs.map +1 -0
  201. package/dist/frontend/tracked_transport.d.cts +36 -0
  202. package/dist/frontend/tracked_transport.d.ts +36 -0
  203. package/dist/frontend/tracked_transport.js +31 -0
  204. package/dist/frontend/tracked_transport.js.map +1 -0
  205. package/dist/frontend/work_registry.cjs +153 -0
  206. package/dist/frontend/work_registry.cjs.map +1 -0
  207. package/dist/frontend/work_registry.d.cts +70 -0
  208. package/dist/frontend/work_registry.d.ts +70 -0
  209. package/dist/frontend/work_registry.js +128 -0
  210. package/dist/frontend/work_registry.js.map +1 -0
  211. package/dist/index.cjs +24 -0
  212. package/dist/index.cjs.map +1 -1
  213. package/dist/index.d.cts +11 -7
  214. package/dist/index.d.ts +11 -7
  215. package/dist/index.js +27 -4
  216. package/dist/index.js.map +1 -1
  217. package/dist/main/index.cjs +10 -0
  218. package/dist/main/index.cjs.map +1 -1
  219. package/dist/main/index.d.cts +14 -2
  220. package/dist/main/index.d.ts +14 -2
  221. package/dist/main/index.js +16 -0
  222. package/dist/main/index.js.map +1 -1
  223. package/dist/middleware/middleware_resolver.cjs +22 -1
  224. package/dist/middleware/middleware_resolver.cjs.map +1 -1
  225. package/dist/middleware/middleware_resolver.d.cts +13 -1
  226. package/dist/middleware/middleware_resolver.d.ts +13 -1
  227. package/dist/middleware/middleware_resolver.js +22 -1
  228. package/dist/middleware/middleware_resolver.js.map +1 -1
  229. package/dist/navigation/automation_introspection.cjs +110 -0
  230. package/dist/navigation/automation_introspection.cjs.map +1 -0
  231. package/dist/navigation/automation_introspection.d.cts +60 -0
  232. package/dist/navigation/automation_introspection.d.ts +60 -0
  233. package/dist/navigation/automation_introspection.js +85 -0
  234. package/dist/navigation/automation_introspection.js.map +1 -0
  235. package/dist/navigation/index.cjs +10 -2
  236. package/dist/navigation/index.cjs.map +1 -1
  237. package/dist/navigation/index.d.cts +27 -1
  238. package/dist/navigation/index.d.ts +27 -1
  239. package/dist/navigation/index.js +6 -1
  240. package/dist/navigation/index.js.map +1 -1
  241. package/dist/{middleware/__fixtures__/middleware/auth.cjs → navigation/layout_preservation.cjs} +18 -20
  242. package/dist/navigation/layout_preservation.cjs.map +1 -0
  243. package/dist/navigation/layout_preservation.d.cts +2 -0
  244. package/dist/navigation/layout_preservation.d.ts +2 -0
  245. package/dist/navigation/layout_preservation.js +18 -0
  246. package/dist/navigation/layout_preservation.js.map +1 -0
  247. package/dist/parser/index.cjs +2 -0
  248. package/dist/parser/index.cjs.map +1 -1
  249. package/dist/parser/index.d.cts +1 -1
  250. package/dist/parser/index.d.ts +1 -1
  251. package/dist/parser/index.js +2 -1
  252. package/dist/parser/index.js.map +1 -1
  253. package/dist/parser/operations_parser.cjs +6 -0
  254. package/dist/parser/operations_parser.cjs.map +1 -1
  255. package/dist/parser/operations_parser.d.cts +9 -2
  256. package/dist/parser/operations_parser.d.ts +9 -2
  257. package/dist/parser/operations_parser.js +5 -0
  258. package/dist/parser/operations_parser.js.map +1 -1
  259. package/dist/parser/views_parser.cjs.map +1 -1
  260. package/dist/parser/views_parser.js.map +1 -1
  261. package/dist/router/index.d.cts +1 -0
  262. package/dist/router/index.d.ts +1 -0
  263. package/dist/router/wood_router.cjs +35 -3
  264. package/dist/router/wood_router.cjs.map +1 -1
  265. package/dist/router/wood_router.d.cts +15 -0
  266. package/dist/router/wood_router.d.ts +15 -0
  267. package/dist/router/wood_router.js +36 -4
  268. package/dist/router/wood_router.js.map +1 -1
  269. package/dist/runtime/get_container.cjs +9 -34
  270. package/dist/runtime/get_container.cjs.map +1 -1
  271. package/dist/runtime/get_container.d.cts +24 -4
  272. package/dist/runtime/get_container.d.ts +24 -4
  273. package/dist/runtime/get_container.js +8 -23
  274. package/dist/runtime/get_container.js.map +1 -1
  275. package/dist/runtime/index.cjs +9 -0
  276. package/dist/runtime/index.cjs.map +1 -1
  277. package/dist/runtime/index.d.cts +5 -2
  278. package/dist/runtime/index.d.ts +5 -2
  279. package/dist/runtime/index.js +10 -1
  280. package/dist/runtime/index.js.map +1 -1
  281. package/dist/runtime/renderer_config_extension.cjs +50 -0
  282. package/dist/runtime/renderer_config_extension.cjs.map +1 -0
  283. package/dist/runtime/renderer_config_extension.d.cts +19 -0
  284. package/dist/runtime/renderer_config_extension.d.ts +19 -0
  285. package/dist/runtime/renderer_config_extension.js +24 -0
  286. package/dist/runtime/renderer_config_extension.js.map +1 -0
  287. package/dist/runtime/renderer_log_batch_receiver.cjs +73 -0
  288. package/dist/runtime/renderer_log_batch_receiver.cjs.map +1 -0
  289. package/dist/runtime/renderer_log_batch_receiver.d.cts +29 -0
  290. package/dist/runtime/renderer_log_batch_receiver.d.ts +29 -0
  291. package/dist/runtime/renderer_log_batch_receiver.js +48 -0
  292. package/dist/runtime/renderer_log_batch_receiver.js.map +1 -0
  293. package/dist/runtime/renderer_trace_batch_receiver_registry.d.cts +1 -1
  294. package/dist/runtime/renderer_trace_batch_receiver_registry.d.ts +1 -1
  295. package/dist/runtime/runtime.cjs +14 -0
  296. package/dist/runtime/runtime.cjs.map +1 -1
  297. package/dist/runtime/runtime.d.cts +2 -1
  298. package/dist/runtime/runtime.d.ts +2 -1
  299. package/dist/runtime/runtime.js +14 -0
  300. package/dist/runtime/runtime.js.map +1 -1
  301. package/dist/stick/index.cjs.map +1 -1
  302. package/dist/stick/index.js.map +1 -1
  303. package/dist/testing/automation_assertions.cjs +417 -0
  304. package/dist/testing/automation_assertions.cjs.map +1 -0
  305. package/dist/testing/automation_assertions.d.cts +44 -0
  306. package/dist/testing/automation_assertions.d.ts +44 -0
  307. package/dist/testing/automation_assertions.js +385 -0
  308. package/dist/testing/automation_assertions.js.map +1 -0
  309. package/dist/testing/browser.cjs +130 -57
  310. package/dist/testing/browser.cjs.map +1 -1
  311. package/dist/testing/browser.d.cts +10 -4
  312. package/dist/testing/browser.d.ts +10 -4
  313. package/dist/testing/browser.js +132 -53
  314. package/dist/testing/browser.js.map +1 -1
  315. package/dist/testing/create_controller_harness.cjs +28 -8
  316. package/dist/testing/create_controller_harness.cjs.map +1 -1
  317. package/dist/testing/create_controller_harness.d.cts +18 -2
  318. package/dist/testing/create_controller_harness.d.ts +18 -2
  319. package/dist/testing/create_controller_harness.js +28 -8
  320. package/dist/testing/create_controller_harness.js.map +1 -1
  321. package/dist/testing/create_router_bridge.d.cts +1 -0
  322. package/dist/testing/create_router_bridge.d.ts +1 -0
  323. package/dist/testing/create_test_router.d.cts +1 -0
  324. package/dist/testing/create_test_router.d.ts +1 -0
  325. package/dist/testing/geometry.cjs +109 -0
  326. package/dist/testing/geometry.cjs.map +1 -0
  327. package/dist/testing/geometry.d.cts +45 -0
  328. package/dist/testing/geometry.d.ts +45 -0
  329. package/dist/testing/geometry.js +79 -0
  330. package/dist/testing/geometry.js.map +1 -0
  331. package/dist/testing/index.cjs +62 -2
  332. package/dist/testing/index.cjs.map +1 -1
  333. package/dist/testing/index.d.cts +23 -4
  334. package/dist/testing/index.d.ts +23 -4
  335. package/dist/testing/index.js +50 -2
  336. package/dist/testing/index.js.map +1 -1
  337. package/dist/{controller/__fixtures__/controllers/not_a_class.cjs → testing/test_wood.cjs} +15 -7
  338. package/dist/testing/test_wood.cjs.map +1 -0
  339. package/dist/testing/test_wood.d.cts +16 -0
  340. package/dist/testing/test_wood.d.ts +16 -0
  341. package/dist/testing/test_wood.js +12 -0
  342. package/dist/testing/test_wood.js.map +1 -0
  343. package/dist/testing/test_wood_config.cjs +272 -0
  344. package/dist/testing/test_wood_config.cjs.map +1 -0
  345. package/dist/testing/test_wood_config.d.cts +111 -0
  346. package/dist/testing/test_wood_config.d.ts +111 -0
  347. package/dist/testing/test_wood_config.js +247 -0
  348. package/dist/testing/test_wood_config.js.map +1 -0
  349. package/dist/testing/wood_config_source.cjs +146 -0
  350. package/dist/testing/wood_config_source.cjs.map +1 -0
  351. package/dist/testing/wood_config_source.d.cts +36 -0
  352. package/dist/testing/wood_config_source.d.ts +36 -0
  353. package/dist/testing/wood_config_source.js +112 -0
  354. package/dist/testing/wood_config_source.js.map +1 -0
  355. package/dist/testing/wood_env_renderer.cjs +210 -0
  356. package/dist/testing/wood_env_renderer.cjs.map +1 -0
  357. package/dist/testing/wood_env_renderer.d.cts +74 -0
  358. package/dist/testing/wood_env_renderer.d.ts +74 -0
  359. package/dist/testing/wood_env_renderer.js +188 -0
  360. package/dist/testing/wood_env_renderer.js.map +1 -0
  361. package/dist/testing/wood_test_selection.cjs +94 -0
  362. package/dist/testing/wood_test_selection.cjs.map +1 -0
  363. package/dist/testing/wood_test_selection.d.cts +39 -0
  364. package/dist/testing/wood_test_selection.d.ts +39 -0
  365. package/dist/testing/wood_test_selection.js +68 -0
  366. package/dist/testing/wood_test_selection.js.map +1 -0
  367. package/dist/trace-testing/index.d.cts +1 -2
  368. package/dist/trace-testing/index.d.ts +1 -2
  369. package/dist/trace-testing/trace_recorder.cjs +1 -1
  370. package/dist/trace-testing/trace_recorder.cjs.map +1 -1
  371. package/dist/trace-testing/trace_recorder.d.cts +1 -2
  372. package/dist/trace-testing/trace_recorder.d.ts +1 -2
  373. package/dist/trace-testing/trace_recorder.js +1 -1
  374. package/dist/trace-testing/trace_recorder.js.map +1 -1
  375. package/dist/trace-transport/index.d.cts +1 -1
  376. package/dist/trace-transport/index.d.ts +1 -1
  377. package/dist/{trace_hub-Cob54qRx.d.cts → trace_hub-Cpo_nVze.d.cts} +21 -1
  378. package/dist/{trace_hub-Cob54qRx.d.ts → trace_hub-Cpo_nVze.d.ts} +21 -1
  379. package/dist/tracing/index.cjs +9 -2
  380. package/dist/tracing/index.cjs.map +1 -1
  381. package/dist/tracing/index.d.cts +3 -2
  382. package/dist/tracing/index.d.ts +3 -2
  383. package/dist/tracing/index.js +7 -1
  384. package/dist/tracing/index.js.map +1 -1
  385. package/dist/tracing/renderer_trace_batch_host.d.cts +1 -1
  386. package/dist/tracing/renderer_trace_batch_host.d.ts +1 -1
  387. package/dist/tracing/renderer_trace_batch_transport.cjs +48 -6
  388. package/dist/tracing/renderer_trace_batch_transport.cjs.map +1 -1
  389. package/dist/tracing/renderer_trace_batch_transport.d.cts +17 -1
  390. package/dist/tracing/renderer_trace_batch_transport.d.ts +17 -1
  391. package/dist/tracing/renderer_trace_batch_transport.js +48 -6
  392. package/dist/tracing/renderer_trace_batch_transport.js.map +1 -1
  393. package/dist/tracing/trace_batch_adapter.cjs +110 -0
  394. package/dist/tracing/trace_batch_adapter.cjs.map +1 -0
  395. package/dist/tracing/trace_batch_adapter.d.cts +36 -0
  396. package/dist/tracing/trace_batch_adapter.d.ts +36 -0
  397. package/dist/tracing/trace_batch_adapter.js +86 -0
  398. package/dist/tracing/trace_batch_adapter.js.map +1 -0
  399. package/dist/tracing/trace_commit_writer.d.cts +1 -1
  400. package/dist/tracing/trace_commit_writer.d.ts +1 -1
  401. package/dist/tracing/trace_hub.cjs +87 -20
  402. package/dist/tracing/trace_hub.cjs.map +1 -1
  403. package/dist/tracing/trace_hub.d.cts +1 -1
  404. package/dist/tracing/trace_hub.d.ts +1 -1
  405. package/dist/tracing/trace_hub.js +85 -20
  406. package/dist/tracing/trace_hub.js.map +1 -1
  407. package/dist/tracing/trace_provider.cjs +21 -6
  408. package/dist/tracing/trace_provider.cjs.map +1 -1
  409. package/dist/tracing/trace_provider.d.cts +13 -4
  410. package/dist/tracing/trace_provider.d.ts +13 -4
  411. package/dist/tracing/trace_provider.js +22 -7
  412. package/dist/tracing/trace_provider.js.map +1 -1
  413. package/dist/tracing/types/wood_trace_batch.types.cjs.map +1 -1
  414. package/dist/tracing/types/wood_trace_batch.types.d.cts +15 -1
  415. package/dist/tracing/types/wood_trace_batch.types.d.ts +15 -1
  416. package/dist/tracing/types/wood_trace_sink.types.d.cts +1 -1
  417. package/dist/tracing/types/wood_trace_sink.types.d.ts +1 -1
  418. package/dist/tracing/wood_trace_batch_contract.cjs +2 -0
  419. package/dist/tracing/wood_trace_batch_contract.cjs.map +1 -1
  420. package/dist/tracing/wood_trace_batch_contract.d.cts +1 -1
  421. package/dist/tracing/wood_trace_batch_contract.d.ts +1 -1
  422. package/dist/tracing/wood_trace_batch_contract.js +2 -0
  423. package/dist/tracing/wood_trace_batch_contract.js.map +1 -1
  424. package/dist/transport/build_transport_bridge.cjs +4 -2
  425. package/dist/transport/build_transport_bridge.cjs.map +1 -1
  426. package/dist/transport/build_transport_bridge.d.cts +7 -1
  427. package/dist/transport/build_transport_bridge.d.ts +7 -1
  428. package/dist/transport/build_transport_bridge.js +2 -1
  429. package/dist/transport/build_transport_bridge.js.map +1 -1
  430. package/dist/transport/in_process_router_transport.d.cts +1 -0
  431. package/dist/transport/in_process_router_transport.d.ts +1 -0
  432. package/dist/transport/index.d.cts +1 -0
  433. package/dist/transport/index.d.ts +1 -0
  434. package/dist/types/config.cjs.map +1 -1
  435. package/dist/types/config.d.cts +47 -1
  436. package/dist/types/config.d.ts +47 -1
  437. package/dist/types/context.cjs +12 -0
  438. package/dist/types/context.cjs.map +1 -1
  439. package/dist/types/context.d.cts +27 -1
  440. package/dist/types/context.d.ts +27 -1
  441. package/dist/types/context.js +4 -0
  442. package/dist/types/context.js.map +1 -1
  443. package/dist/types/index.d.cts +2 -2
  444. package/dist/types/index.d.ts +2 -2
  445. package/dist/types/operations.cjs.map +1 -1
  446. package/dist/types/operations.d.cts +2 -0
  447. package/dist/types/operations.d.ts +2 -0
  448. package/docs/axe.md +706 -0
  449. package/package.json +19 -5
  450. package/src/components/NavigationShell.scopes.browser.test.ts +363 -0
  451. package/src/components/NavigationShell.svelte +126 -49
  452. package/dist/controller/__fixtures__/controllers/chat.cjs +0 -32
  453. package/dist/controller/__fixtures__/controllers/chat.cjs.map +0 -1
  454. package/dist/controller/__fixtures__/controllers/chat.d.cts +0 -11
  455. package/dist/controller/__fixtures__/controllers/chat.d.ts +0 -11
  456. package/dist/controller/__fixtures__/controllers/chat.js +0 -12
  457. package/dist/controller/__fixtures__/controllers/chat.js.map +0 -1
  458. package/dist/controller/__fixtures__/controllers/not_a_class.cjs.map +0 -1
  459. package/dist/controller/__fixtures__/controllers/not_a_class.d.cts +0 -3
  460. package/dist/controller/__fixtures__/controllers/not_a_class.d.ts +0 -3
  461. package/dist/controller/__fixtures__/controllers/not_a_class.js +0 -5
  462. package/dist/controller/__fixtures__/controllers/not_a_class.js.map +0 -1
  463. package/dist/controller/__fixtures__/controllers/settings.controller.cjs +0 -32
  464. package/dist/controller/__fixtures__/controllers/settings.controller.cjs.map +0 -1
  465. package/dist/controller/__fixtures__/controllers/settings.controller.d.cts +0 -12
  466. package/dist/controller/__fixtures__/controllers/settings.controller.d.ts +0 -12
  467. package/dist/controller/__fixtures__/controllers/settings.controller.js +0 -12
  468. package/dist/controller/__fixtures__/controllers/settings.controller.js.map +0 -1
  469. package/dist/controller/__fixtures__/controllers/test.cjs.map +0 -1
  470. package/dist/controller/__fixtures__/controllers/test.d.cts +0 -7
  471. package/dist/controller/__fixtures__/controllers/test.d.ts +0 -7
  472. package/dist/controller/__fixtures__/controllers/test.js +0 -9
  473. package/dist/controller/__fixtures__/controllers/test.js.map +0 -1
  474. package/dist/loader/__fixtures__/layouts/app.load.cjs.map +0 -1
  475. package/dist/loader/__fixtures__/layouts/app.load.d.cts +0 -5
  476. package/dist/loader/__fixtures__/layouts/app.load.d.ts +0 -5
  477. package/dist/loader/__fixtures__/layouts/app.load.js +0 -7
  478. package/dist/loader/__fixtures__/layouts/app.load.js.map +0 -1
  479. package/dist/loader/__fixtures__/views/test/page.load.cjs.map +0 -1
  480. package/dist/loader/__fixtures__/views/test/page.load.d.cts +0 -6
  481. package/dist/loader/__fixtures__/views/test/page.load.d.ts +0 -6
  482. package/dist/loader/__fixtures__/views/test/page.load.js +0 -7
  483. package/dist/loader/__fixtures__/views/test/page.load.js.map +0 -1
  484. package/dist/middleware/__fixtures__/middleware/auth.cjs.map +0 -1
  485. package/dist/middleware/__fixtures__/middleware/auth.d.cts +0 -6
  486. package/dist/middleware/__fixtures__/middleware/auth.d.ts +0 -6
  487. package/dist/middleware/__fixtures__/middleware/auth.js +0 -19
  488. package/dist/middleware/__fixtures__/middleware/auth.js.map +0 -1
  489. package/dist/middleware/__fixtures__/middleware/sequence.cjs.map +0 -1
  490. package/dist/middleware/__fixtures__/middleware/sequence.d.cts +0 -7
  491. package/dist/middleware/__fixtures__/middleware/sequence.d.ts +0 -7
  492. package/dist/middleware/__fixtures__/middleware/sequence.js +0 -21
  493. package/dist/middleware/__fixtures__/middleware/sequence.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/codegen/type_generator.ts"],"sourcesContent":["import type { OperationDef } from '../types/index.cjs';\nimport { generatedFileNotice } from './generated_file_notice.cjs';\n\nconst TYPE_SOURCE_INSTRUCTIONS = [\n 'To change IPC channels, input schemas, controller/action names, or renderer bridge types,',\n 'edit the operations YAML configured by wood.config.yml main.openapi and the matching controller methods.',\n] as const;\n\nfunction formatPropertyKey(key: string): string {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {\n return key;\n }\n\n return JSON.stringify(key);\n}\n\nfunction operationHasInput(op: OperationDef): boolean {\n return Boolean(\n op.inputSchema &&\n (op.inputSchema as Record<string, unknown>).type === 'object' &&\n Object.keys((op.inputSchema as Record<string, Record<string, unknown>>).properties ?? {}).length > 0,\n );\n}\n\nfunction jsonSchemaToTS(schema: Record<string, unknown> | undefined, indent: string = ''): string {\n if (!schema) return 'unknown';\n\n const type = schema.type as string | undefined;\n\n if (type === 'string') {\n if (schema.enum) {\n return (schema.enum as string[]).map((v) => `'${v}'`).join(' | ');\n }\n return 'string';\n }\n if (type === 'number' || type === 'integer') return 'number';\n if (type === 'boolean') return 'boolean';\n if (type === 'array') {\n const itemType = jsonSchemaToTS(schema.items as Record<string, unknown>, indent);\n return `Array<${itemType}>`;\n }\n if (type === 'object') {\n const props = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required as string[]) ?? []);\n const entries = Object.entries(props);\n if (entries.length === 0) return 'Record<string, unknown>';\n\n const lines = entries.map(([key, val]) => {\n const optional = required.has(key) ? '' : '?';\n const valType = jsonSchemaToTS(val, indent + ' ');\n return `${indent} ${formatPropertyKey(key)}${optional}: ${valType};`;\n });\n return `{\\n${lines.join('\\n')}\\n${indent}}`;\n }\n\n return 'unknown';\n}\n\nfunction buildNestedTypeTree(operations: Map<string, OperationDef>): Record<string, unknown> {\n const tree: Record<string, unknown> = {};\n for (const [channel, op] of operations) {\n const parts = channel.split('.');\n let current: Record<string, unknown> = tree;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) current[parts[i]] = {};\n current = current[parts[i]] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = { __operation: op };\n }\n return tree;\n}\n\nfunction generateTypeTree(node: Record<string, unknown>, indent: string = ' '): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(node)) {\n const entry = value as Record<string, unknown>;\n if (entry.__operation) {\n const op = entry.__operation as OperationDef;\n const inputType = jsonSchemaToTS(op.inputSchema as Record<string, unknown>, indent + ' ');\n const outputType = jsonSchemaToTS(op.outputSchema as Record<string, unknown>, indent + ' ');\n const hasInput = operationHasInput(op);\n\n if (hasInput) {\n lines.push(`${indent}${formatPropertyKey(key)}(data: ${inputType}): Promise<${outputType}>;`);\n } else {\n lines.push(`${indent}${formatPropertyKey(key)}(): Promise<${outputType}>;`);\n }\n } else {\n lines.push(`${indent}${formatPropertyKey(key)}: {`);\n lines.push(generateTypeTree(entry, indent + ' '));\n lines.push(`${indent}};`);\n }\n }\n return lines.join('\\n');\n}\n\ntype RpcActionTypeEntry = {\n channel: string;\n inputType: string;\n outputType: string;\n hasInput: boolean;\n};\n\nfunction buildRpcControllerTree(\n operations: Map<string, OperationDef>,\n): Record<string, Record<string, RpcActionTypeEntry>> {\n const tree: Record<string, Record<string, RpcActionTypeEntry>> = {};\n\n for (const operation of operations.values()) {\n const controller = operation.controller;\n const action = operation.action;\n\n if (!tree[controller]) {\n tree[controller] = {};\n }\n\n if (tree[controller][action]) {\n throw new Error(\n `Type codegen failed: duplicate RPC action \"${controller}.${action}\" found in channel \"${operation.channel}\".`,\n );\n }\n\n tree[controller][action] = {\n channel: operation.channel,\n inputType: jsonSchemaToTS(operation.inputSchema as Record<string, unknown>, ' '),\n outputType: jsonSchemaToTS(operation.outputSchema as Record<string, unknown>, ' '),\n hasInput: operationHasInput(operation),\n };\n }\n\n return tree;\n}\n\nfunction generateRpcTypeTree(operations: Map<string, OperationDef>): string {\n const controllerTree = buildRpcControllerTree(operations);\n const controllerNames = Object.keys(controllerTree).sort((a, b) => a.localeCompare(b));\n const lines: string[] = [];\n\n for (const controllerName of controllerNames) {\n lines.push(` ${formatPropertyKey(controllerName)}: {`);\n const actions = controllerTree[controllerName];\n const actionNames = Object.keys(actions).sort((a, b) => a.localeCompare(b));\n for (const actionName of actionNames) {\n const action = actions[actionName];\n if (action.hasInput) {\n lines.push(` ${formatPropertyKey(actionName)}(data: ${action.inputType}): Promise<${action.outputType}>;`);\n } else {\n lines.push(` ${formatPropertyKey(actionName)}(): Promise<${action.outputType}>;`);\n }\n }\n lines.push(' };');\n }\n\n return lines.join('\\n');\n}\n\nexport function generateTypes(operations: Map<string, OperationDef>): string {\n const tree = buildNestedTypeTree(operations);\n const typesCode = generateTypeTree(tree);\n const rpcTypeCode = generateRpcTypeTree(operations);\n\n return `${generatedFileNotice(TYPE_SOURCE_INSTRUCTIONS)}\nexport interface WoodRpcManifestEntry {\n channel: string;\n controller: string;\n action: string;\n path: string[];\n hasInput: boolean;\n}\n\n/**\n * Project-specific renderer App facade contract.\n *\n * This matches @noego/wood/client getApp() and injected App instances:\n * controller name -> controller action.\n */\nexport interface GeneratedApp {\n${rpcTypeCode}\n}\n\n/** Backward-compatible name for the generated client App facade contract. */\nexport interface WoodRpcApi extends GeneratedApp {}\n\n/**\n * Project-specific raw preload bridge contract.\n *\n * This matches the channel path exposed by preload.generated.ts:\n * operation channel segments -> invoke function.\n */\nexport interface GeneratedWoodBridge {\n${typesCode}\n}\n\nexport interface WoodApi extends GeneratedWoodBridge {\n __rpcManifest: WoodRpcManifestEntry[];\n __load(route: string, params: Record<string, string>): Promise<unknown>;\n __navigate(windowId: string, route: string): Promise<void>;\n __window: {\n current(): Promise<{ ok: boolean; windowId?: string; defaultRoute?: string }>;\n open(windowId: string, options?: Record<string, unknown>): Promise<void>;\n close(windowId?: string): Promise<void>;\n focus(windowId: string): Promise<void>;\n minimize(windowId?: string): Promise<void>;\n maximize(windowId?: string): Promise<void>;\n };\n __debug: {\n current(): Promise<{\n ok: boolean;\n enabled: boolean;\n mode: 'development' | 'production';\n port?: number;\n windows: Array<{\n windowId: string;\n title: string;\n webContentsId: number;\n url: string;\n focused: boolean;\n rendererHealth?: 'ready' | 'loading' | 'unresponsive' | 'gone' | 'destroyed';\n }>;\n }>;\n };\n __contextMenu: {\n show(data: {\n items: Array<{ label?: string; action?: string; data?: string; _callbackId?: string; disabled?: boolean; type?: 'separator' }>;\n position: { x: number; y: number };\n }): Promise<void>;\n };\n on(channel: string, callback: (...args: unknown[]) => void): () => void;\n __log(level: string, logger: string, message: string, context?: unknown): Promise<{\n ok: boolean;\n forwarded: boolean;\n configured: boolean;\n reason?: 'unconfigured' | 'callback-error';\n errorMessage?: string;\n }>;\n}\n`;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/codegen/type_generator.ts"],"sourcesContent":["import type { OperationDef } from '../types/index.cjs';\nimport { generatedFileNotice } from './generated_file_notice.cjs';\n\nconst TYPE_SOURCE_INSTRUCTIONS = [\n 'To change IPC channels, input schemas, controller/action names, or renderer bridge types,',\n 'edit the operations YAML configured by wood.config.yml main.openapi and the matching controller methods.',\n] as const;\n\nfunction formatPropertyKey(key: string): string {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {\n return key;\n }\n\n return JSON.stringify(key);\n}\n\nfunction operationHasInput(op: OperationDef): boolean {\n return Boolean(\n op.inputSchema &&\n (op.inputSchema as Record<string, unknown>).type === 'object' &&\n Object.keys((op.inputSchema as Record<string, Record<string, unknown>>).properties ?? {}).length > 0,\n );\n}\n\nfunction jsonSchemaToTS(schema: Record<string, unknown> | undefined, indent: string = ''): string {\n if (!schema) return 'unknown';\n\n const type = schema.type as string | undefined;\n\n if (type === 'string') {\n if (schema.enum) {\n return (schema.enum as string[]).map((v) => `'${v}'`).join(' | ');\n }\n return 'string';\n }\n if (type === 'number' || type === 'integer') return 'number';\n if (type === 'boolean') return 'boolean';\n if (type === 'array') {\n const itemType = jsonSchemaToTS(schema.items as Record<string, unknown>, indent);\n return `Array<${itemType}>`;\n }\n if (type === 'object') {\n const props = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required as string[]) ?? []);\n const entries = Object.entries(props);\n if (entries.length === 0) return 'Record<string, unknown>';\n\n const lines = entries.map(([key, val]) => {\n const optional = required.has(key) ? '' : '?';\n const valType = jsonSchemaToTS(val, indent + ' ');\n return `${indent} ${formatPropertyKey(key)}${optional}: ${valType};`;\n });\n return `{\\n${lines.join('\\n')}\\n${indent}}`;\n }\n\n return 'unknown';\n}\n\nfunction buildNestedTypeTree(operations: Map<string, OperationDef>): Record<string, unknown> {\n const tree: Record<string, unknown> = {};\n for (const [channel, op] of operations) {\n const parts = channel.split('.');\n let current: Record<string, unknown> = tree;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) current[parts[i]] = {};\n current = current[parts[i]] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = { __operation: op };\n }\n return tree;\n}\n\nfunction generateTypeTree(node: Record<string, unknown>, indent: string = ' '): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(node)) {\n const entry = value as Record<string, unknown>;\n if (entry.__operation) {\n const op = entry.__operation as OperationDef;\n const inputType = jsonSchemaToTS(op.inputSchema as Record<string, unknown>, indent + ' ');\n const outputType = jsonSchemaToTS(op.outputSchema as Record<string, unknown>, indent + ' ');\n const hasInput = operationHasInput(op);\n\n if (hasInput) {\n lines.push(`${indent}${formatPropertyKey(key)}(data: ${inputType}): Promise<${outputType}>;`);\n } else {\n lines.push(`${indent}${formatPropertyKey(key)}(): Promise<${outputType}>;`);\n }\n } else {\n lines.push(`${indent}${formatPropertyKey(key)}: {`);\n lines.push(generateTypeTree(entry, indent + ' '));\n lines.push(`${indent}};`);\n }\n }\n return lines.join('\\n');\n}\n\ntype RpcActionTypeEntry = {\n channel: string;\n inputType: string;\n outputType: string;\n hasInput: boolean;\n};\n\nfunction buildRpcControllerTree(\n operations: Map<string, OperationDef>,\n): Record<string, Record<string, RpcActionTypeEntry>> {\n const tree: Record<string, Record<string, RpcActionTypeEntry>> = {};\n\n for (const operation of operations.values()) {\n const controller = operation.controller;\n const action = operation.action;\n\n if (!tree[controller]) {\n tree[controller] = {};\n }\n\n if (tree[controller][action]) {\n throw new Error(\n `Type codegen failed: duplicate RPC action \"${controller}.${action}\" found in channel \"${operation.channel}\".`,\n );\n }\n\n tree[controller][action] = {\n channel: operation.channel,\n inputType: jsonSchemaToTS(operation.inputSchema as Record<string, unknown>, ' '),\n outputType: jsonSchemaToTS(operation.outputSchema as Record<string, unknown>, ' '),\n hasInput: operationHasInput(operation),\n };\n }\n\n return tree;\n}\n\nfunction generateRpcTypeTree(operations: Map<string, OperationDef>): string {\n const controllerTree = buildRpcControllerTree(operations);\n const controllerNames = Object.keys(controllerTree).sort((a, b) => a.localeCompare(b));\n const lines: string[] = [];\n\n for (const controllerName of controllerNames) {\n lines.push(` ${formatPropertyKey(controllerName)}: {`);\n const actions = controllerTree[controllerName];\n const actionNames = Object.keys(actions).sort((a, b) => a.localeCompare(b));\n for (const actionName of actionNames) {\n const action = actions[actionName];\n if (action.hasInput) {\n lines.push(` ${formatPropertyKey(actionName)}(data: ${action.inputType}): Promise<${action.outputType}>;`);\n } else {\n lines.push(` ${formatPropertyKey(actionName)}(): Promise<${action.outputType}>;`);\n }\n }\n lines.push(' };');\n }\n\n return lines.join('\\n');\n}\n\nexport function generateTypes(operations: Map<string, OperationDef>): string {\n const tree = buildNestedTypeTree(operations);\n const typesCode = generateTypeTree(tree);\n const rpcTypeCode = generateRpcTypeTree(operations);\n\n return `${generatedFileNotice(TYPE_SOURCE_INSTRUCTIONS)}\nexport interface WoodRpcManifestEntry {\n channel: string;\n controller: string;\n action: string;\n path: string[];\n hasInput: boolean;\n}\n\n/**\n * Project-specific renderer App facade contract.\n *\n * This matches @noego/wood/client getApp() and injected App instances:\n * controller name -> controller action.\n */\nexport interface GeneratedApp {\n${rpcTypeCode}\n}\n\n/** Backward-compatible name for the generated client App facade contract. */\nexport interface WoodRpcApi extends GeneratedApp {}\n\n/**\n * Project-specific raw preload bridge contract.\n *\n * This matches the channel path exposed by preload.generated.ts:\n * operation channel segments -> invoke function.\n */\nexport interface GeneratedWoodBridge {\n${typesCode}\n}\n\nexport interface WoodApi extends GeneratedWoodBridge {\n __rpcManifest: WoodRpcManifestEntry[];\n __load(route: string, params: Record<string, string>): Promise<unknown>;\n __navigate(windowId: string, route: string): Promise<void>;\n __window: {\n current(): Promise<{ ok: boolean; windowId?: string; defaultRoute?: string }>;\n open(windowId: string, options?: Record<string, unknown>): Promise<void>;\n close(windowId?: string): Promise<void>;\n focus(windowId: string): Promise<void>;\n minimize(windowId?: string): Promise<void>;\n maximize(windowId?: string): Promise<void>;\n };\n __debug: {\n current(): Promise<{\n ok: boolean;\n enabled: boolean;\n mode: 'development' | 'production';\n port?: number;\n windows: Array<{\n windowId: string;\n title: string;\n webContentsId: number;\n url: string;\n focused: boolean;\n rendererHealth?: 'ready' | 'loading' | 'unresponsive' | 'gone' | 'destroyed';\n }>;\n }>;\n };\n __contextMenu: {\n show(data: {\n items: Array<{ label?: string; action?: string; data?: string; _callbackId?: string; disabled?: boolean; type?: 'separator' }>;\n position: { x: number; y: number };\n }): Promise<void>;\n };\n on(channel: string, callback: (...args: unknown[]) => void): () => void;\n __log(level: string, logger: string, message: string, context?: unknown): Promise<{\n ok: boolean;\n forwarded: boolean;\n configured: boolean;\n reason?: 'unconfigured' | 'callback-error';\n errorMessage?: string;\n }>;\n __logBatch(batch: unknown): void;\n}\n`;\n}\n"],"mappings":"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","names":[]}
@@ -200,6 +200,7 @@ export interface WoodApi extends GeneratedWoodBridge {
200
200
  reason?: 'unconfigured' | 'callback-error';
201
201
  errorMessage?: string;
202
202
  }>;
203
+ __logBatch(batch: unknown): void;
203
204
  }
204
205
  `;
205
206
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/codegen/type_generator.ts"],"sourcesContent":["import type { OperationDef } from '../types/index.js';\nimport { generatedFileNotice } from './generated_file_notice.js';\n\nconst TYPE_SOURCE_INSTRUCTIONS = [\n 'To change IPC channels, input schemas, controller/action names, or renderer bridge types,',\n 'edit the operations YAML configured by wood.config.yml main.openapi and the matching controller methods.',\n] as const;\n\nfunction formatPropertyKey(key: string): string {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {\n return key;\n }\n\n return JSON.stringify(key);\n}\n\nfunction operationHasInput(op: OperationDef): boolean {\n return Boolean(\n op.inputSchema &&\n (op.inputSchema as Record<string, unknown>).type === 'object' &&\n Object.keys((op.inputSchema as Record<string, Record<string, unknown>>).properties ?? {}).length > 0,\n );\n}\n\nfunction jsonSchemaToTS(schema: Record<string, unknown> | undefined, indent: string = ''): string {\n if (!schema) return 'unknown';\n\n const type = schema.type as string | undefined;\n\n if (type === 'string') {\n if (schema.enum) {\n return (schema.enum as string[]).map((v) => `'${v}'`).join(' | ');\n }\n return 'string';\n }\n if (type === 'number' || type === 'integer') return 'number';\n if (type === 'boolean') return 'boolean';\n if (type === 'array') {\n const itemType = jsonSchemaToTS(schema.items as Record<string, unknown>, indent);\n return `Array<${itemType}>`;\n }\n if (type === 'object') {\n const props = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required as string[]) ?? []);\n const entries = Object.entries(props);\n if (entries.length === 0) return 'Record<string, unknown>';\n\n const lines = entries.map(([key, val]) => {\n const optional = required.has(key) ? '' : '?';\n const valType = jsonSchemaToTS(val, indent + ' ');\n return `${indent} ${formatPropertyKey(key)}${optional}: ${valType};`;\n });\n return `{\\n${lines.join('\\n')}\\n${indent}}`;\n }\n\n return 'unknown';\n}\n\nfunction buildNestedTypeTree(operations: Map<string, OperationDef>): Record<string, unknown> {\n const tree: Record<string, unknown> = {};\n for (const [channel, op] of operations) {\n const parts = channel.split('.');\n let current: Record<string, unknown> = tree;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) current[parts[i]] = {};\n current = current[parts[i]] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = { __operation: op };\n }\n return tree;\n}\n\nfunction generateTypeTree(node: Record<string, unknown>, indent: string = ' '): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(node)) {\n const entry = value as Record<string, unknown>;\n if (entry.__operation) {\n const op = entry.__operation as OperationDef;\n const inputType = jsonSchemaToTS(op.inputSchema as Record<string, unknown>, indent + ' ');\n const outputType = jsonSchemaToTS(op.outputSchema as Record<string, unknown>, indent + ' ');\n const hasInput = operationHasInput(op);\n\n if (hasInput) {\n lines.push(`${indent}${formatPropertyKey(key)}(data: ${inputType}): Promise<${outputType}>;`);\n } else {\n lines.push(`${indent}${formatPropertyKey(key)}(): Promise<${outputType}>;`);\n }\n } else {\n lines.push(`${indent}${formatPropertyKey(key)}: {`);\n lines.push(generateTypeTree(entry, indent + ' '));\n lines.push(`${indent}};`);\n }\n }\n return lines.join('\\n');\n}\n\ntype RpcActionTypeEntry = {\n channel: string;\n inputType: string;\n outputType: string;\n hasInput: boolean;\n};\n\nfunction buildRpcControllerTree(\n operations: Map<string, OperationDef>,\n): Record<string, Record<string, RpcActionTypeEntry>> {\n const tree: Record<string, Record<string, RpcActionTypeEntry>> = {};\n\n for (const operation of operations.values()) {\n const controller = operation.controller;\n const action = operation.action;\n\n if (!tree[controller]) {\n tree[controller] = {};\n }\n\n if (tree[controller][action]) {\n throw new Error(\n `Type codegen failed: duplicate RPC action \"${controller}.${action}\" found in channel \"${operation.channel}\".`,\n );\n }\n\n tree[controller][action] = {\n channel: operation.channel,\n inputType: jsonSchemaToTS(operation.inputSchema as Record<string, unknown>, ' '),\n outputType: jsonSchemaToTS(operation.outputSchema as Record<string, unknown>, ' '),\n hasInput: operationHasInput(operation),\n };\n }\n\n return tree;\n}\n\nfunction generateRpcTypeTree(operations: Map<string, OperationDef>): string {\n const controllerTree = buildRpcControllerTree(operations);\n const controllerNames = Object.keys(controllerTree).sort((a, b) => a.localeCompare(b));\n const lines: string[] = [];\n\n for (const controllerName of controllerNames) {\n lines.push(` ${formatPropertyKey(controllerName)}: {`);\n const actions = controllerTree[controllerName];\n const actionNames = Object.keys(actions).sort((a, b) => a.localeCompare(b));\n for (const actionName of actionNames) {\n const action = actions[actionName];\n if (action.hasInput) {\n lines.push(` ${formatPropertyKey(actionName)}(data: ${action.inputType}): Promise<${action.outputType}>;`);\n } else {\n lines.push(` ${formatPropertyKey(actionName)}(): Promise<${action.outputType}>;`);\n }\n }\n lines.push(' };');\n }\n\n return lines.join('\\n');\n}\n\nexport function generateTypes(operations: Map<string, OperationDef>): string {\n const tree = buildNestedTypeTree(operations);\n const typesCode = generateTypeTree(tree);\n const rpcTypeCode = generateRpcTypeTree(operations);\n\n return `${generatedFileNotice(TYPE_SOURCE_INSTRUCTIONS)}\nexport interface WoodRpcManifestEntry {\n channel: string;\n controller: string;\n action: string;\n path: string[];\n hasInput: boolean;\n}\n\n/**\n * Project-specific renderer App facade contract.\n *\n * This matches @noego/wood/client getApp() and injected App instances:\n * controller name -> controller action.\n */\nexport interface GeneratedApp {\n${rpcTypeCode}\n}\n\n/** Backward-compatible name for the generated client App facade contract. */\nexport interface WoodRpcApi extends GeneratedApp {}\n\n/**\n * Project-specific raw preload bridge contract.\n *\n * This matches the channel path exposed by preload.generated.ts:\n * operation channel segments -> invoke function.\n */\nexport interface GeneratedWoodBridge {\n${typesCode}\n}\n\nexport interface WoodApi extends GeneratedWoodBridge {\n __rpcManifest: WoodRpcManifestEntry[];\n __load(route: string, params: Record<string, string>): Promise<unknown>;\n __navigate(windowId: string, route: string): Promise<void>;\n __window: {\n current(): Promise<{ ok: boolean; windowId?: string; defaultRoute?: string }>;\n open(windowId: string, options?: Record<string, unknown>): Promise<void>;\n close(windowId?: string): Promise<void>;\n focus(windowId: string): Promise<void>;\n minimize(windowId?: string): Promise<void>;\n maximize(windowId?: string): Promise<void>;\n };\n __debug: {\n current(): Promise<{\n ok: boolean;\n enabled: boolean;\n mode: 'development' | 'production';\n port?: number;\n windows: Array<{\n windowId: string;\n title: string;\n webContentsId: number;\n url: string;\n focused: boolean;\n rendererHealth?: 'ready' | 'loading' | 'unresponsive' | 'gone' | 'destroyed';\n }>;\n }>;\n };\n __contextMenu: {\n show(data: {\n items: Array<{ label?: string; action?: string; data?: string; _callbackId?: string; disabled?: boolean; type?: 'separator' }>;\n position: { x: number; y: number };\n }): Promise<void>;\n };\n on(channel: string, callback: (...args: unknown[]) => void): () => void;\n __log(level: string, logger: string, message: string, context?: unknown): Promise<{\n ok: boolean;\n forwarded: boolean;\n configured: boolean;\n reason?: 'unconfigured' | 'callback-error';\n errorMessage?: string;\n }>;\n}\n`;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/codegen/type_generator.ts"],"sourcesContent":["import type { OperationDef } from '../types/index.js';\nimport { generatedFileNotice } from './generated_file_notice.js';\n\nconst TYPE_SOURCE_INSTRUCTIONS = [\n 'To change IPC channels, input schemas, controller/action names, or renderer bridge types,',\n 'edit the operations YAML configured by wood.config.yml main.openapi and the matching controller methods.',\n] as const;\n\nfunction formatPropertyKey(key: string): string {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {\n return key;\n }\n\n return JSON.stringify(key);\n}\n\nfunction operationHasInput(op: OperationDef): boolean {\n return Boolean(\n op.inputSchema &&\n (op.inputSchema as Record<string, unknown>).type === 'object' &&\n Object.keys((op.inputSchema as Record<string, Record<string, unknown>>).properties ?? {}).length > 0,\n );\n}\n\nfunction jsonSchemaToTS(schema: Record<string, unknown> | undefined, indent: string = ''): string {\n if (!schema) return 'unknown';\n\n const type = schema.type as string | undefined;\n\n if (type === 'string') {\n if (schema.enum) {\n return (schema.enum as string[]).map((v) => `'${v}'`).join(' | ');\n }\n return 'string';\n }\n if (type === 'number' || type === 'integer') return 'number';\n if (type === 'boolean') return 'boolean';\n if (type === 'array') {\n const itemType = jsonSchemaToTS(schema.items as Record<string, unknown>, indent);\n return `Array<${itemType}>`;\n }\n if (type === 'object') {\n const props = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required as string[]) ?? []);\n const entries = Object.entries(props);\n if (entries.length === 0) return 'Record<string, unknown>';\n\n const lines = entries.map(([key, val]) => {\n const optional = required.has(key) ? '' : '?';\n const valType = jsonSchemaToTS(val, indent + ' ');\n return `${indent} ${formatPropertyKey(key)}${optional}: ${valType};`;\n });\n return `{\\n${lines.join('\\n')}\\n${indent}}`;\n }\n\n return 'unknown';\n}\n\nfunction buildNestedTypeTree(operations: Map<string, OperationDef>): Record<string, unknown> {\n const tree: Record<string, unknown> = {};\n for (const [channel, op] of operations) {\n const parts = channel.split('.');\n let current: Record<string, unknown> = tree;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) current[parts[i]] = {};\n current = current[parts[i]] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = { __operation: op };\n }\n return tree;\n}\n\nfunction generateTypeTree(node: Record<string, unknown>, indent: string = ' '): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(node)) {\n const entry = value as Record<string, unknown>;\n if (entry.__operation) {\n const op = entry.__operation as OperationDef;\n const inputType = jsonSchemaToTS(op.inputSchema as Record<string, unknown>, indent + ' ');\n const outputType = jsonSchemaToTS(op.outputSchema as Record<string, unknown>, indent + ' ');\n const hasInput = operationHasInput(op);\n\n if (hasInput) {\n lines.push(`${indent}${formatPropertyKey(key)}(data: ${inputType}): Promise<${outputType}>;`);\n } else {\n lines.push(`${indent}${formatPropertyKey(key)}(): Promise<${outputType}>;`);\n }\n } else {\n lines.push(`${indent}${formatPropertyKey(key)}: {`);\n lines.push(generateTypeTree(entry, indent + ' '));\n lines.push(`${indent}};`);\n }\n }\n return lines.join('\\n');\n}\n\ntype RpcActionTypeEntry = {\n channel: string;\n inputType: string;\n outputType: string;\n hasInput: boolean;\n};\n\nfunction buildRpcControllerTree(\n operations: Map<string, OperationDef>,\n): Record<string, Record<string, RpcActionTypeEntry>> {\n const tree: Record<string, Record<string, RpcActionTypeEntry>> = {};\n\n for (const operation of operations.values()) {\n const controller = operation.controller;\n const action = operation.action;\n\n if (!tree[controller]) {\n tree[controller] = {};\n }\n\n if (tree[controller][action]) {\n throw new Error(\n `Type codegen failed: duplicate RPC action \"${controller}.${action}\" found in channel \"${operation.channel}\".`,\n );\n }\n\n tree[controller][action] = {\n channel: operation.channel,\n inputType: jsonSchemaToTS(operation.inputSchema as Record<string, unknown>, ' '),\n outputType: jsonSchemaToTS(operation.outputSchema as Record<string, unknown>, ' '),\n hasInput: operationHasInput(operation),\n };\n }\n\n return tree;\n}\n\nfunction generateRpcTypeTree(operations: Map<string, OperationDef>): string {\n const controllerTree = buildRpcControllerTree(operations);\n const controllerNames = Object.keys(controllerTree).sort((a, b) => a.localeCompare(b));\n const lines: string[] = [];\n\n for (const controllerName of controllerNames) {\n lines.push(` ${formatPropertyKey(controllerName)}: {`);\n const actions = controllerTree[controllerName];\n const actionNames = Object.keys(actions).sort((a, b) => a.localeCompare(b));\n for (const actionName of actionNames) {\n const action = actions[actionName];\n if (action.hasInput) {\n lines.push(` ${formatPropertyKey(actionName)}(data: ${action.inputType}): Promise<${action.outputType}>;`);\n } else {\n lines.push(` ${formatPropertyKey(actionName)}(): Promise<${action.outputType}>;`);\n }\n }\n lines.push(' };');\n }\n\n return lines.join('\\n');\n}\n\nexport function generateTypes(operations: Map<string, OperationDef>): string {\n const tree = buildNestedTypeTree(operations);\n const typesCode = generateTypeTree(tree);\n const rpcTypeCode = generateRpcTypeTree(operations);\n\n return `${generatedFileNotice(TYPE_SOURCE_INSTRUCTIONS)}\nexport interface WoodRpcManifestEntry {\n channel: string;\n controller: string;\n action: string;\n path: string[];\n hasInput: boolean;\n}\n\n/**\n * Project-specific renderer App facade contract.\n *\n * This matches @noego/wood/client getApp() and injected App instances:\n * controller name -> controller action.\n */\nexport interface GeneratedApp {\n${rpcTypeCode}\n}\n\n/** Backward-compatible name for the generated client App facade contract. */\nexport interface WoodRpcApi extends GeneratedApp {}\n\n/**\n * Project-specific raw preload bridge contract.\n *\n * This matches the channel path exposed by preload.generated.ts:\n * operation channel segments -> invoke function.\n */\nexport interface GeneratedWoodBridge {\n${typesCode}\n}\n\nexport interface WoodApi extends GeneratedWoodBridge {\n __rpcManifest: WoodRpcManifestEntry[];\n __load(route: string, params: Record<string, string>): Promise<unknown>;\n __navigate(windowId: string, route: string): Promise<void>;\n __window: {\n current(): Promise<{ ok: boolean; windowId?: string; defaultRoute?: string }>;\n open(windowId: string, options?: Record<string, unknown>): Promise<void>;\n close(windowId?: string): Promise<void>;\n focus(windowId: string): Promise<void>;\n minimize(windowId?: string): Promise<void>;\n maximize(windowId?: string): Promise<void>;\n };\n __debug: {\n current(): Promise<{\n ok: boolean;\n enabled: boolean;\n mode: 'development' | 'production';\n port?: number;\n windows: Array<{\n windowId: string;\n title: string;\n webContentsId: number;\n url: string;\n focused: boolean;\n rendererHealth?: 'ready' | 'loading' | 'unresponsive' | 'gone' | 'destroyed';\n }>;\n }>;\n };\n __contextMenu: {\n show(data: {\n items: Array<{ label?: string; action?: string; data?: string; _callbackId?: string; disabled?: boolean; type?: 'separator' }>;\n position: { x: number; y: number };\n }): Promise<void>;\n };\n on(channel: string, callback: (...args: unknown[]) => void): () => void;\n __log(level: string, logger: string, message: string, context?: unknown): Promise<{\n ok: boolean;\n forwarded: boolean;\n configured: boolean;\n reason?: 'unconfigured' | 'callback-error';\n errorMessage?: string;\n }>;\n __logBatch(batch: unknown): void;\n}\n`;\n}\n"],"mappings":"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","names":[]}
@@ -28,7 +28,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var config_parser_exports = {};
30
30
  __export(config_parser_exports, {
31
- parseConfig: () => parseConfig
31
+ RENDERER_TRACE_BATCHING_DEFAULTS: () => RENDERER_TRACE_BATCHING_DEFAULTS,
32
+ parseConfig: () => parseConfig,
33
+ resolveRendererTraceBatching: () => resolveRendererTraceBatching
32
34
  });
33
35
  module.exports = __toCommonJS(config_parser_exports);
34
36
  var import_js_yaml = __toESM(require("js-yaml"), 1);
@@ -112,6 +114,23 @@ function requireNumber(_doc, field, value) {
112
114
  throw new Error(`Config validation error: "${field}" is required and must be a number`);
113
115
  }
114
116
  }
117
+ function parseTestingSection(section, raw, allowedKeys) {
118
+ if (raw === void 0) return {};
119
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
120
+ throw new Error(`Config validation error: "${section}.testing" must be an object`);
121
+ }
122
+ const testing = {};
123
+ for (const [key, value] of Object.entries(raw)) {
124
+ if (!allowedKeys.includes(key)) {
125
+ throw new Error(
126
+ `Config validation error: "${section}.testing.${key}" is not a known hook (allowed: ${allowedKeys.join(", ")})`
127
+ );
128
+ }
129
+ requireString(raw, `${section}.testing.${key}`, value);
130
+ testing[key] = value;
131
+ }
132
+ return { testing };
133
+ }
115
134
  function applyDefaults(doc) {
116
135
  const app = doc.app;
117
136
  const main = doc.main;
@@ -140,14 +159,16 @@ function applyDefaults(doc) {
140
159
  controllers: main.controllers,
141
160
  middleware: main.middleware,
142
161
  openapi: main.openapi,
143
- watch: Array.isArray(main.watch) ? main.watch : []
162
+ watch: Array.isArray(main.watch) ? main.watch : [],
163
+ ...parseTestingSection("main", main.testing, ["compose"])
144
164
  },
145
165
  renderer: {
146
166
  openapi: renderer.openapi,
147
167
  componentDir: renderer.componentDir,
148
168
  controllers: renderer.controllers,
149
169
  ...typeof renderer.entry === "string" ? { entry: renderer.entry } : {},
150
- ...Array.isArray(renderer.watch) ? { watch: renderer.watch } : {}
170
+ ...Array.isArray(renderer.watch) ? { watch: renderer.watch } : {},
171
+ ...parseTestingSection("renderer", renderer.testing, ["host"])
151
172
  },
152
173
  windows,
153
174
  dev
@@ -167,10 +188,80 @@ function applyDefaults(doc) {
167
188
  if (doc.build && typeof doc.build === "object") {
168
189
  config.build = doc.build;
169
190
  }
191
+ if (doc.observability && typeof doc.observability === "object") {
192
+ config.observability = parseObservability(doc.observability);
193
+ }
170
194
  return config;
171
195
  }
196
+ const RENDERER_TRACE_BATCHING_DEFAULTS = Object.freeze({
197
+ maxQueuedEvents: 256,
198
+ maxBatchEvents: 32,
199
+ acknowledgementTimeoutMs: 1e3,
200
+ retryLimit: 3,
201
+ retryBaseDelayMs: 25
202
+ });
203
+ function resolveRendererTraceBatching(config) {
204
+ return {
205
+ ...RENDERER_TRACE_BATCHING_DEFAULTS,
206
+ ...config.observability?.trace?.rendererToMain?.batching
207
+ };
208
+ }
209
+ function parseObservability(raw) {
210
+ const trace = raw.trace;
211
+ if (trace === void 0) {
212
+ return {};
213
+ }
214
+ if (typeof trace !== "object" || trace === null) {
215
+ throw new Error('Config validation error: "observability.trace" must be an object');
216
+ }
217
+ const rendererToMain = trace.rendererToMain;
218
+ if (rendererToMain === void 0) {
219
+ return { trace: {} };
220
+ }
221
+ if (typeof rendererToMain !== "object" || rendererToMain === null) {
222
+ throw new Error('Config validation error: "observability.trace.rendererToMain" must be an object');
223
+ }
224
+ const batching = rendererToMain.batching;
225
+ if (batching === void 0) {
226
+ return { trace: { rendererToMain: {} } };
227
+ }
228
+ if (typeof batching !== "object" || batching === null) {
229
+ throw new Error('Config validation error: "observability.trace.rendererToMain.batching" must be an object');
230
+ }
231
+ const resolved = {
232
+ ...RENDERER_TRACE_BATCHING_DEFAULTS,
233
+ ...batching
234
+ };
235
+ const positiveIntFields = ["maxQueuedEvents", "maxBatchEvents", "acknowledgementTimeoutMs"];
236
+ for (const field of positiveIntFields) {
237
+ const value = resolved[field];
238
+ if (!Number.isSafeInteger(value) || value <= 0) {
239
+ throw new Error(
240
+ `Config validation error: "observability.trace.rendererToMain.batching.${field}" must be a positive integer`
241
+ );
242
+ }
243
+ }
244
+ if (!Number.isSafeInteger(resolved.retryLimit) || resolved.retryLimit < 0) {
245
+ throw new Error(
246
+ 'Config validation error: "observability.trace.rendererToMain.batching.retryLimit" must be a non-negative integer'
247
+ );
248
+ }
249
+ if (!Number.isFinite(resolved.retryBaseDelayMs) || resolved.retryBaseDelayMs < 0) {
250
+ throw new Error(
251
+ 'Config validation error: "observability.trace.rendererToMain.batching.retryBaseDelayMs" must be a non-negative number'
252
+ );
253
+ }
254
+ if (resolved.maxBatchEvents > resolved.maxQueuedEvents) {
255
+ throw new Error(
256
+ 'Config validation error: "observability.trace.rendererToMain.batching.maxBatchEvents" cannot exceed maxQueuedEvents'
257
+ );
258
+ }
259
+ return { trace: { rendererToMain: { batching: resolved } } };
260
+ }
172
261
  // Annotate the CommonJS export names for ESM import in node:
173
262
  0 && (module.exports = {
174
- parseConfig
263
+ RENDERER_TRACE_BATCHING_DEFAULTS,
264
+ parseConfig,
265
+ resolveRendererTraceBatching
175
266
  });
176
267
  //# sourceMappingURL=config_parser.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/config_parser.ts"],"sourcesContent":["import yaml from 'js-yaml';\nimport { readFileSync, existsSync } from 'fs';\nimport path from 'path';\nimport { getLogger } from '@noego/logger';\nimport type { WoodConfig, WindowDef, DevConfig } from '../types/config.cjs';\n\nconst logger = getLogger('wood:config');\n\n/** Default values applied when optional fields are omitted. */\nconst WINDOW_DEFAULTS: Partial<WindowDef> = {\n frame: true,\n resizable: true,\n show: true,\n modal: false,\n};\n\nconst DEV_DEFAULTS: DevConfig = {\n watch: true,\n splitServe: true,\n port: 5173,\n};\n\n/**\n * Parse and validate a wood.config.yml file, returning a fully-typed WoodConfig\n * with defaults applied for optional fields.\n */\nexport function parseConfig(configPath: string): WoodConfig {\n const resolved = path.resolve(configPath);\n\n if (!existsSync(resolved)) {\n throw new Error(`Config file not found: ${resolved}`);\n }\n\n const raw = readFileSync(resolved, 'utf-8');\n const doc = yaml.load(raw) as Record<string, unknown> | null;\n\n if (!doc || typeof doc !== 'object') {\n throw new Error(`Invalid YAML in config file: ${resolved}`);\n }\n\n validateRequired(doc);\n\n const config = applyDefaults(doc as RawConfig);\n\n logger.info('Parsed config', { path: resolved, windows: Object.keys(config.windows) });\n\n return config;\n}\n\n/** Shape of the raw YAML before defaults are applied. */\ntype RawConfig = Record<string, unknown>;\n\nfunction validateRequired(doc: Record<string, unknown>): void {\n requireString(doc, 'app.boot', (doc as Record<string, Record<string, unknown>>).app?.boot);\n requireString(doc, 'main.entry', (doc as Record<string, Record<string, unknown>>).main?.entry);\n requireString(doc, 'main.controllers', (doc as Record<string, Record<string, unknown>>).main?.controllers);\n requireString(doc, 'main.middleware', (doc as Record<string, Record<string, unknown>>).main?.middleware);\n requireString(doc, 'main.openapi', (doc as Record<string, Record<string, unknown>>).main?.openapi);\n requireString(doc, 'renderer.openapi', (doc as Record<string, Record<string, unknown>>).renderer?.openapi);\n requireString(doc, 'renderer.componentDir', (doc as Record<string, Record<string, unknown>>).renderer?.componentDir);\n requireString(doc, 'renderer.controllers', (doc as Record<string, Record<string, unknown>>).renderer?.controllers);\n const rendererEntry = (doc as Record<string, Record<string, unknown>>).renderer?.entry;\n if (rendererEntry !== undefined) {\n requireString(doc, 'renderer.entry', rendererEntry);\n }\n\n // Windows validation\n const windows = doc.windows;\n if (!windows || typeof windows !== 'object') {\n throw new Error('Config validation error: \"windows\" is required and must be an object with at least one window');\n }\n\n const windowKeys = Object.keys(windows as Record<string, unknown>);\n if (windowKeys.length === 0) {\n throw new Error('Config validation error: \"windows\" must contain at least one window definition');\n }\n\n for (const key of windowKeys) {\n const win = (windows as Record<string, Record<string, unknown>>)[key];\n if (!win || typeof win !== 'object') {\n throw new Error(`Config validation error: window \"${key}\" must be an object`);\n }\n requireString(doc, `windows.${key}.title`, win.title);\n requireNumber(doc, `windows.${key}.width`, win.width);\n requireNumber(doc, `windows.${key}.height`, win.height);\n requireString(doc, `windows.${key}.defaultRoute`, win.defaultRoute);\n\n if (win.contextMenu !== undefined) {\n if (typeof win.contextMenu !== 'string') {\n throw new Error(`Config validation error: \"windows.${key}.contextMenu\" must be a string`);\n }\n if (win.contextMenu !== 'native' && win.contextMenu !== 'custom') {\n throw new Error(`Config validation error: \"windows.${key}.contextMenu\" must be \"native\" or \"custom\"`);\n }\n }\n }\n}\n\nfunction requireString(_doc: Record<string, unknown>, field: string, value: unknown): asserts value is string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`Config validation error: \"${field}\" is required and must be a non-empty string`);\n }\n}\n\nfunction requireNumber(_doc: Record<string, unknown>, field: string, value: unknown): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Config validation error: \"${field}\" is required and must be a number`);\n }\n}\n\nfunction applyDefaults(doc: RawConfig): WoodConfig {\n const app = doc.app as Record<string, unknown>;\n const main = doc.main as Record<string, unknown>;\n const renderer = doc.renderer as Record<string, unknown>;\n const rawWindows = doc.windows as Record<string, Record<string, unknown>>;\n\n const windows: Record<string, WindowDef> = {};\n for (const [key, rawWin] of Object.entries(rawWindows)) {\n windows[key] = {\n ...WINDOW_DEFAULTS,\n ...rawWin,\n } as WindowDef;\n }\n\n const dev: DevConfig = {\n ...DEV_DEFAULTS,\n ...(doc.dev as Record<string, unknown> | undefined),\n };\n\n const config: WoodConfig = {\n root: typeof doc.root === 'string' ? doc.root : '.',\n outDir: typeof doc.outDir === 'string' ? doc.outDir : 'dist',\n app: {\n boot: app.boot as string,\n watch: Array.isArray(app.watch) ? (app.watch as string[]) : [],\n },\n main: {\n entry: main.entry as string,\n controllers: main.controllers as string,\n middleware: main.middleware as string,\n openapi: main.openapi as string,\n watch: Array.isArray(main.watch) ? (main.watch as string[]) : [],\n },\n renderer: {\n openapi: renderer.openapi as string,\n componentDir: renderer.componentDir as string,\n controllers: renderer.controllers as string,\n ...(typeof renderer.entry === 'string' ? { entry: renderer.entry as string } : {}),\n ...(Array.isArray(renderer.watch) ? { watch: renderer.watch as string[] } : {}),\n },\n windows,\n dev,\n };\n\n // Optional database section (preserve :userData: token for runtime expansion)\n if (doc.database && typeof doc.database === 'object') {\n const db = doc.database as Record<string, unknown>;\n if (typeof db.path === 'string') {\n config.database = {\n path: db.path,\n ...(typeof db.migrations === 'string' ? { migrations: db.migrations } : {}),\n };\n }\n }\n\n // Optional assets\n if (Array.isArray(doc.assets)) {\n config.assets = doc.assets as string[];\n }\n\n // Optional build section\n if (doc.build && typeof doc.build === 'object') {\n config.build = doc.build as WoodConfig['build'];\n }\n\n return config;\n}\n"],"mappings":"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","names":["path","yaml"]}
1
+ {"version":3,"sources":["../../src/config/config_parser.ts"],"sourcesContent":["import yaml from 'js-yaml';\nimport { readFileSync, existsSync } from 'fs';\nimport path from 'path';\nimport { getLogger } from '@noego/logger';\nimport type {\n WoodConfig,\n WindowDef,\n DevConfig,\n RendererTraceBatchingConfig,\n} from '../types/config.cjs';\n\nconst logger = getLogger('wood:config');\n\n/** Default values applied when optional fields are omitted. */\nconst WINDOW_DEFAULTS: Partial<WindowDef> = {\n frame: true,\n resizable: true,\n show: true,\n modal: false,\n};\n\nconst DEV_DEFAULTS: DevConfig = {\n watch: true,\n splitServe: true,\n port: 5173,\n};\n\n/**\n * Parse and validate a wood.config.yml file, returning a fully-typed WoodConfig\n * with defaults applied for optional fields.\n */\nexport function parseConfig(configPath: string): WoodConfig {\n const resolved = path.resolve(configPath);\n\n if (!existsSync(resolved)) {\n throw new Error(`Config file not found: ${resolved}`);\n }\n\n const raw = readFileSync(resolved, 'utf-8');\n const doc = yaml.load(raw) as Record<string, unknown> | null;\n\n if (!doc || typeof doc !== 'object') {\n throw new Error(`Invalid YAML in config file: ${resolved}`);\n }\n\n validateRequired(doc);\n\n const config = applyDefaults(doc as RawConfig);\n\n logger.info('Parsed config', { path: resolved, windows: Object.keys(config.windows) });\n\n return config;\n}\n\n/** Shape of the raw YAML before defaults are applied. */\ntype RawConfig = Record<string, unknown>;\n\nfunction validateRequired(doc: Record<string, unknown>): void {\n requireString(doc, 'app.boot', (doc as Record<string, Record<string, unknown>>).app?.boot);\n requireString(doc, 'main.entry', (doc as Record<string, Record<string, unknown>>).main?.entry);\n requireString(doc, 'main.controllers', (doc as Record<string, Record<string, unknown>>).main?.controllers);\n requireString(doc, 'main.middleware', (doc as Record<string, Record<string, unknown>>).main?.middleware);\n requireString(doc, 'main.openapi', (doc as Record<string, Record<string, unknown>>).main?.openapi);\n requireString(doc, 'renderer.openapi', (doc as Record<string, Record<string, unknown>>).renderer?.openapi);\n requireString(doc, 'renderer.componentDir', (doc as Record<string, Record<string, unknown>>).renderer?.componentDir);\n requireString(doc, 'renderer.controllers', (doc as Record<string, Record<string, unknown>>).renderer?.controllers);\n const rendererEntry = (doc as Record<string, Record<string, unknown>>).renderer?.entry;\n if (rendererEntry !== undefined) {\n requireString(doc, 'renderer.entry', rendererEntry);\n }\n\n // Windows validation\n const windows = doc.windows;\n if (!windows || typeof windows !== 'object') {\n throw new Error('Config validation error: \"windows\" is required and must be an object with at least one window');\n }\n\n const windowKeys = Object.keys(windows as Record<string, unknown>);\n if (windowKeys.length === 0) {\n throw new Error('Config validation error: \"windows\" must contain at least one window definition');\n }\n\n for (const key of windowKeys) {\n const win = (windows as Record<string, Record<string, unknown>>)[key];\n if (!win || typeof win !== 'object') {\n throw new Error(`Config validation error: window \"${key}\" must be an object`);\n }\n requireString(doc, `windows.${key}.title`, win.title);\n requireNumber(doc, `windows.${key}.width`, win.width);\n requireNumber(doc, `windows.${key}.height`, win.height);\n requireString(doc, `windows.${key}.defaultRoute`, win.defaultRoute);\n\n if (win.contextMenu !== undefined) {\n if (typeof win.contextMenu !== 'string') {\n throw new Error(`Config validation error: \"windows.${key}.contextMenu\" must be a string`);\n }\n if (win.contextMenu !== 'native' && win.contextMenu !== 'custom') {\n throw new Error(`Config validation error: \"windows.${key}.contextMenu\" must be \"native\" or \"custom\"`);\n }\n }\n }\n}\n\nfunction requireString(_doc: Record<string, unknown>, field: string, value: unknown): asserts value is string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`Config validation error: \"${field}\" is required and must be a non-empty string`);\n }\n}\n\nfunction requireNumber(_doc: Record<string, unknown>, field: string, value: unknown): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Config validation error: \"${field}\" is required and must be a number`);\n }\n}\n\n/**\n * Parse an optional `<section>.testing` mapping: every allowed key is an\n * optional non-empty string (a config-relative module path); anything else\n * is a validation error so a typo cannot silently drop a hook.\n */\nfunction parseTestingSection(\n section: 'main' | 'renderer',\n raw: unknown,\n allowedKeys: readonly string[],\n): { testing?: Record<string, string> } {\n if (raw === undefined) return {};\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n throw new Error(`Config validation error: \"${section}.testing\" must be an object`);\n }\n const testing: Record<string, string> = {};\n for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {\n if (!allowedKeys.includes(key)) {\n throw new Error(\n `Config validation error: \"${section}.testing.${key}\" is not a known hook (allowed: ${allowedKeys.join(', ')})`,\n );\n }\n requireString(raw as Record<string, unknown>, `${section}.testing.${key}`, value);\n testing[key] = value;\n }\n return { testing };\n}\n\nfunction applyDefaults(doc: RawConfig): WoodConfig {\n const app = doc.app as Record<string, unknown>;\n const main = doc.main as Record<string, unknown>;\n const renderer = doc.renderer as Record<string, unknown>;\n const rawWindows = doc.windows as Record<string, Record<string, unknown>>;\n\n const windows: Record<string, WindowDef> = {};\n for (const [key, rawWin] of Object.entries(rawWindows)) {\n windows[key] = {\n ...WINDOW_DEFAULTS,\n ...rawWin,\n } as WindowDef;\n }\n\n const dev: DevConfig = {\n ...DEV_DEFAULTS,\n ...(doc.dev as Record<string, unknown> | undefined),\n };\n\n const config: WoodConfig = {\n root: typeof doc.root === 'string' ? doc.root : '.',\n outDir: typeof doc.outDir === 'string' ? doc.outDir : 'dist',\n app: {\n boot: app.boot as string,\n watch: Array.isArray(app.watch) ? (app.watch as string[]) : [],\n },\n main: {\n entry: main.entry as string,\n controllers: main.controllers as string,\n middleware: main.middleware as string,\n openapi: main.openapi as string,\n watch: Array.isArray(main.watch) ? (main.watch as string[]) : [],\n ...parseTestingSection('main', main.testing, ['compose']),\n },\n renderer: {\n openapi: renderer.openapi as string,\n componentDir: renderer.componentDir as string,\n controllers: renderer.controllers as string,\n ...(typeof renderer.entry === 'string' ? { entry: renderer.entry as string } : {}),\n ...(Array.isArray(renderer.watch) ? { watch: renderer.watch as string[] } : {}),\n ...parseTestingSection('renderer', renderer.testing, ['host']),\n },\n windows,\n dev,\n };\n\n // Optional database section (preserve :userData: token for runtime expansion)\n if (doc.database && typeof doc.database === 'object') {\n const db = doc.database as Record<string, unknown>;\n if (typeof db.path === 'string') {\n config.database = {\n path: db.path,\n ...(typeof db.migrations === 'string' ? { migrations: db.migrations } : {}),\n };\n }\n }\n\n // Optional assets\n if (Array.isArray(doc.assets)) {\n config.assets = doc.assets as string[];\n }\n\n // Optional build section\n if (doc.build && typeof doc.build === 'object') {\n config.build = doc.build as WoodConfig['build'];\n }\n\n // Optional observability section (renderer→main trace batching policy)\n if (doc.observability && typeof doc.observability === 'object') {\n config.observability = parseObservability(doc.observability as Record<string, unknown>);\n }\n\n return config;\n}\n\n/**\n * Default renderer→main IPC trace batching policy. These values match the\n * policy previously hard-coded in the generated preload; wood.config.yml\n * `observability.trace.rendererToMain.batching` is now the owner.\n */\nexport const RENDERER_TRACE_BATCHING_DEFAULTS: RendererTraceBatchingConfig = Object.freeze({\n maxQueuedEvents: 256,\n maxBatchEvents: 32,\n acknowledgementTimeoutMs: 1_000,\n retryLimit: 3,\n retryBaseDelayMs: 25,\n});\n\n/** Resolves the renderer trace batching policy from a parsed config. */\nexport function resolveRendererTraceBatching(\n config: Pick<WoodConfig, 'observability'>,\n): RendererTraceBatchingConfig {\n return {\n ...RENDERER_TRACE_BATCHING_DEFAULTS,\n ...config.observability?.trace?.rendererToMain?.batching,\n };\n}\n\nfunction parseObservability(raw: Record<string, unknown>): WoodConfig['observability'] {\n const trace = raw.trace;\n if (trace === undefined) {\n return {};\n }\n if (typeof trace !== 'object' || trace === null) {\n throw new Error('Config validation error: \"observability.trace\" must be an object');\n }\n const rendererToMain = (trace as Record<string, unknown>).rendererToMain;\n if (rendererToMain === undefined) {\n return { trace: {} };\n }\n if (typeof rendererToMain !== 'object' || rendererToMain === null) {\n throw new Error('Config validation error: \"observability.trace.rendererToMain\" must be an object');\n }\n const batching = (rendererToMain as Record<string, unknown>).batching;\n if (batching === undefined) {\n return { trace: { rendererToMain: {} } };\n }\n if (typeof batching !== 'object' || batching === null) {\n throw new Error('Config validation error: \"observability.trace.rendererToMain.batching\" must be an object');\n }\n\n const resolved: RendererTraceBatchingConfig = {\n ...RENDERER_TRACE_BATCHING_DEFAULTS,\n ...(batching as Partial<RendererTraceBatchingConfig>),\n };\n\n const positiveIntFields = ['maxQueuedEvents', 'maxBatchEvents', 'acknowledgementTimeoutMs'] as const;\n for (const field of positiveIntFields) {\n const value = resolved[field];\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(\n `Config validation error: \"observability.trace.rendererToMain.batching.${field}\" must be a positive integer`,\n );\n }\n }\n if (!Number.isSafeInteger(resolved.retryLimit) || resolved.retryLimit < 0) {\n throw new Error(\n 'Config validation error: \"observability.trace.rendererToMain.batching.retryLimit\" must be a non-negative integer',\n );\n }\n if (!Number.isFinite(resolved.retryBaseDelayMs) || resolved.retryBaseDelayMs < 0) {\n throw new Error(\n 'Config validation error: \"observability.trace.rendererToMain.batching.retryBaseDelayMs\" must be a non-negative number',\n );\n }\n if (resolved.maxBatchEvents > resolved.maxQueuedEvents) {\n throw new Error(\n 'Config validation error: \"observability.trace.rendererToMain.batching.maxBatchEvents\" cannot exceed maxQueuedEvents',\n );\n }\n\n return { trace: { rendererToMain: { batching: resolved } } };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAiB;AACjB,gBAAyC;AACzC,kBAAiB;AACjB,oBAA0B;AAQ1B,MAAM,aAAS,yBAAU,aAAa;AAGtC,MAAM,kBAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AACT;AAEA,MAAM,eAA0B;AAAA,EAC9B,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,MAAM;AACR;AAMO,SAAS,YAAY,YAAgC;AAC1D,QAAM,WAAW,YAAAA,QAAK,QAAQ,UAAU;AAExC,MAAI,KAAC,sBAAW,QAAQ,GAAG;AACzB,UAAM,IAAI,MAAM,0BAA0B,QAAQ,EAAE;AAAA,EACtD;AAEA,QAAM,UAAM,wBAAa,UAAU,OAAO;AAC1C,QAAM,MAAM,eAAAC,QAAK,KAAK,GAAG;AAEzB,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,UAAM,IAAI,MAAM,gCAAgC,QAAQ,EAAE;AAAA,EAC5D;AAEA,mBAAiB,GAAG;AAEpB,QAAM,SAAS,cAAc,GAAgB;AAE7C,SAAO,KAAK,iBAAiB,EAAE,MAAM,UAAU,SAAS,OAAO,KAAK,OAAO,OAAO,EAAE,CAAC;AAErF,SAAO;AACT;AAKA,SAAS,iBAAiB,KAAoC;AAC5D,gBAAc,KAAK,YAAa,IAAgD,KAAK,IAAI;AACzF,gBAAc,KAAK,cAAe,IAAgD,MAAM,KAAK;AAC7F,gBAAc,KAAK,oBAAqB,IAAgD,MAAM,WAAW;AACzG,gBAAc,KAAK,mBAAoB,IAAgD,MAAM,UAAU;AACvG,gBAAc,KAAK,gBAAiB,IAAgD,MAAM,OAAO;AACjG,gBAAc,KAAK,oBAAqB,IAAgD,UAAU,OAAO;AACzG,gBAAc,KAAK,yBAA0B,IAAgD,UAAU,YAAY;AACnH,gBAAc,KAAK,wBAAyB,IAAgD,UAAU,WAAW;AACjH,QAAM,gBAAiB,IAAgD,UAAU;AACjF,MAAI,kBAAkB,QAAW;AAC/B,kBAAc,KAAK,kBAAkB,aAAa;AAAA,EACpD;AAGA,QAAM,UAAU,IAAI;AACpB,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,UAAM,IAAI,MAAM,+FAA+F;AAAA,EACjH;AAEA,QAAM,aAAa,OAAO,KAAK,OAAkC;AACjE,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,MAAM,gFAAgF;AAAA,EAClG;AAEA,aAAW,OAAO,YAAY;AAC5B,UAAM,MAAO,QAAoD,GAAG;AACpE,QAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,YAAM,IAAI,MAAM,oCAAoC,GAAG,qBAAqB;AAAA,IAC9E;AACA,kBAAc,KAAK,WAAW,GAAG,UAAU,IAAI,KAAK;AACpD,kBAAc,KAAK,WAAW,GAAG,UAAU,IAAI,KAAK;AACpD,kBAAc,KAAK,WAAW,GAAG,WAAW,IAAI,MAAM;AACtD,kBAAc,KAAK,WAAW,GAAG,iBAAiB,IAAI,YAAY;AAElE,QAAI,IAAI,gBAAgB,QAAW;AACjC,UAAI,OAAO,IAAI,gBAAgB,UAAU;AACvC,cAAM,IAAI,MAAM,qCAAqC,GAAG,gCAAgC;AAAA,MAC1F;AACA,UAAI,IAAI,gBAAgB,YAAY,IAAI,gBAAgB,UAAU;AAChE,cAAM,IAAI,MAAM,qCAAqC,GAAG,4CAA4C;AAAA,MACtG;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAA+B,OAAe,OAAyC;AAC5G,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AACnD,UAAM,IAAI,MAAM,6BAA6B,KAAK,8CAA8C;AAAA,EAClG;AACF;AAEA,SAAS,cAAc,MAA+B,OAAe,OAAyC;AAC5G,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,UAAM,IAAI,MAAM,6BAA6B,KAAK,oCAAoC;AAAA,EACxF;AACF;AAOA,SAAS,oBACP,SACA,KACA,aACsC;AACtC,MAAI,QAAQ,OAAW,QAAO,CAAC;AAC/B,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,MAAM,QAAQ,GAAG,GAAG;AACjE,UAAM,IAAI,MAAM,6BAA6B,OAAO,6BAA6B;AAAA,EACnF;AACA,QAAM,UAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAA8B,GAAG;AACzE,QAAI,CAAC,YAAY,SAAS,GAAG,GAAG;AAC9B,YAAM,IAAI;AAAA,QACR,6BAA6B,OAAO,YAAY,GAAG,mCAAmC,YAAY,KAAK,IAAI,CAAC;AAAA,MAC9G;AAAA,IACF;AACA,kBAAc,KAAgC,GAAG,OAAO,YAAY,GAAG,IAAI,KAAK;AAChF,YAAQ,GAAG,IAAI;AAAA,EACjB;AACA,SAAO,EAAE,QAAQ;AACnB;AAEA,SAAS,cAAc,KAA4B;AACjD,QAAM,MAAM,IAAI;AAChB,QAAM,OAAO,IAAI;AACjB,QAAM,WAAW,IAAI;AACrB,QAAM,aAAa,IAAI;AAEvB,QAAM,UAAqC,CAAC;AAC5C,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AACtD,YAAQ,GAAG,IAAI;AAAA,MACb,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AAEA,QAAM,MAAiB;AAAA,IACrB,GAAG;AAAA,IACH,GAAI,IAAI;AAAA,EACV;AAEA,QAAM,SAAqB;AAAA,IACzB,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,IAChD,QAAQ,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS;AAAA,IACtD,KAAK;AAAA,MACH,MAAM,IAAI;AAAA,MACV,OAAO,MAAM,QAAQ,IAAI,KAAK,IAAK,IAAI,QAAqB,CAAC;AAAA,IAC/D;AAAA,IACA,MAAM;AAAA,MACJ,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,MACd,OAAO,MAAM,QAAQ,KAAK,KAAK,IAAK,KAAK,QAAqB,CAAC;AAAA,MAC/D,GAAG,oBAAoB,QAAQ,KAAK,SAAS,CAAC,SAAS,CAAC;AAAA,IAC1D;AAAA,IACA,UAAU;AAAA,MACR,SAAS,SAAS;AAAA,MAClB,cAAc,SAAS;AAAA,MACvB,aAAa,SAAS;AAAA,MACtB,GAAI,OAAO,SAAS,UAAU,WAAW,EAAE,OAAO,SAAS,MAAgB,IAAI,CAAC;AAAA,MAChF,GAAI,MAAM,QAAQ,SAAS,KAAK,IAAI,EAAE,OAAO,SAAS,MAAkB,IAAI,CAAC;AAAA,MAC7E,GAAG,oBAAoB,YAAY,SAAS,SAAS,CAAC,MAAM,CAAC;AAAA,IAC/D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,MAAI,IAAI,YAAY,OAAO,IAAI,aAAa,UAAU;AACpD,UAAM,KAAK,IAAI;AACf,QAAI,OAAO,GAAG,SAAS,UAAU;AAC/B,aAAO,WAAW;AAAA,QAChB,MAAM,GAAG;AAAA,QACT,GAAI,OAAO,GAAG,eAAe,WAAW,EAAE,YAAY,GAAG,WAAW,IAAI,CAAC;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,QAAQ,IAAI,MAAM,GAAG;AAC7B,WAAO,SAAS,IAAI;AAAA,EACtB;AAGA,MAAI,IAAI,SAAS,OAAO,IAAI,UAAU,UAAU;AAC9C,WAAO,QAAQ,IAAI;AAAA,EACrB;AAGA,MAAI,IAAI,iBAAiB,OAAO,IAAI,kBAAkB,UAAU;AAC9D,WAAO,gBAAgB,mBAAmB,IAAI,aAAwC;AAAA,EACxF;AAEA,SAAO;AACT;AAOO,MAAM,mCAAgE,OAAO,OAAO;AAAA,EACzF,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,0BAA0B;AAAA,EAC1B,YAAY;AAAA,EACZ,kBAAkB;AACpB,CAAC;AAGM,SAAS,6BACd,QAC6B;AAC7B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,OAAO,eAAe,OAAO,gBAAgB;AAAA,EAClD;AACF;AAEA,SAAS,mBAAmB,KAA2D;AACrF,QAAM,QAAQ,IAAI;AAClB,MAAI,UAAU,QAAW;AACvB,WAAO,CAAC;AAAA,EACV;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AACA,QAAM,iBAAkB,MAAkC;AAC1D,MAAI,mBAAmB,QAAW;AAChC,WAAO,EAAE,OAAO,CAAC,EAAE;AAAA,EACrB;AACA,MAAI,OAAO,mBAAmB,YAAY,mBAAmB,MAAM;AACjE,UAAM,IAAI,MAAM,iFAAiF;AAAA,EACnG;AACA,QAAM,WAAY,eAA2C;AAC7D,MAAI,aAAa,QAAW;AAC1B,WAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,EAAE;AAAA,EACzC;AACA,MAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,UAAM,IAAI,MAAM,0FAA0F;AAAA,EAC5G;AAEA,QAAM,WAAwC;AAAA,IAC5C,GAAG;AAAA,IACH,GAAI;AAAA,EACN;AAEA,QAAM,oBAAoB,CAAC,mBAAmB,kBAAkB,0BAA0B;AAC1F,aAAW,SAAS,mBAAmB;AACrC,UAAM,QAAQ,SAAS,KAAK;AAC5B,QAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAAG;AAC9C,YAAM,IAAI;AAAA,QACR,yEAAyE,KAAK;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,OAAO,cAAc,SAAS,UAAU,KAAK,SAAS,aAAa,GAAG;AACzE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,OAAO,SAAS,SAAS,gBAAgB,KAAK,SAAS,mBAAmB,GAAG;AAChF,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,iBAAiB,SAAS,iBAAiB;AACtD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,SAAS,EAAE,EAAE;AAC7D;","names":["path","yaml"]}
@@ -1,9 +1,17 @@
1
- import { WoodConfig } from '../types/config.cjs';
1
+ import { RendererTraceBatchingConfig, WoodConfig } from '../types/config.cjs';
2
2
 
3
3
  /**
4
4
  * Parse and validate a wood.config.yml file, returning a fully-typed WoodConfig
5
5
  * with defaults applied for optional fields.
6
6
  */
7
7
  declare function parseConfig(configPath: string): WoodConfig;
8
+ /**
9
+ * Default renderer→main IPC trace batching policy. These values match the
10
+ * policy previously hard-coded in the generated preload; wood.config.yml
11
+ * `observability.trace.rendererToMain.batching` is now the owner.
12
+ */
13
+ declare const RENDERER_TRACE_BATCHING_DEFAULTS: RendererTraceBatchingConfig;
14
+ /** Resolves the renderer trace batching policy from a parsed config. */
15
+ declare function resolveRendererTraceBatching(config: Pick<WoodConfig, 'observability'>): RendererTraceBatchingConfig;
8
16
 
9
- export { parseConfig };
17
+ export { RENDERER_TRACE_BATCHING_DEFAULTS, parseConfig, resolveRendererTraceBatching };
@@ -1,9 +1,17 @@
1
- import { WoodConfig } from '../types/config.js';
1
+ import { RendererTraceBatchingConfig, WoodConfig } from '../types/config.js';
2
2
 
3
3
  /**
4
4
  * Parse and validate a wood.config.yml file, returning a fully-typed WoodConfig
5
5
  * with defaults applied for optional fields.
6
6
  */
7
7
  declare function parseConfig(configPath: string): WoodConfig;
8
+ /**
9
+ * Default renderer→main IPC trace batching policy. These values match the
10
+ * policy previously hard-coded in the generated preload; wood.config.yml
11
+ * `observability.trace.rendererToMain.batching` is now the owner.
12
+ */
13
+ declare const RENDERER_TRACE_BATCHING_DEFAULTS: RendererTraceBatchingConfig;
14
+ /** Resolves the renderer trace batching policy from a parsed config. */
15
+ declare function resolveRendererTraceBatching(config: Pick<WoodConfig, 'observability'>): RendererTraceBatchingConfig;
8
16
 
9
- export { parseConfig };
17
+ export { RENDERER_TRACE_BATCHING_DEFAULTS, parseConfig, resolveRendererTraceBatching };
@@ -79,6 +79,23 @@ function requireNumber(_doc, field, value) {
79
79
  throw new Error(`Config validation error: "${field}" is required and must be a number`);
80
80
  }
81
81
  }
82
+ function parseTestingSection(section, raw, allowedKeys) {
83
+ if (raw === void 0) return {};
84
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
85
+ throw new Error(`Config validation error: "${section}.testing" must be an object`);
86
+ }
87
+ const testing = {};
88
+ for (const [key, value] of Object.entries(raw)) {
89
+ if (!allowedKeys.includes(key)) {
90
+ throw new Error(
91
+ `Config validation error: "${section}.testing.${key}" is not a known hook (allowed: ${allowedKeys.join(", ")})`
92
+ );
93
+ }
94
+ requireString(raw, `${section}.testing.${key}`, value);
95
+ testing[key] = value;
96
+ }
97
+ return { testing };
98
+ }
82
99
  function applyDefaults(doc) {
83
100
  const app = doc.app;
84
101
  const main = doc.main;
@@ -107,14 +124,16 @@ function applyDefaults(doc) {
107
124
  controllers: main.controllers,
108
125
  middleware: main.middleware,
109
126
  openapi: main.openapi,
110
- watch: Array.isArray(main.watch) ? main.watch : []
127
+ watch: Array.isArray(main.watch) ? main.watch : [],
128
+ ...parseTestingSection("main", main.testing, ["compose"])
111
129
  },
112
130
  renderer: {
113
131
  openapi: renderer.openapi,
114
132
  componentDir: renderer.componentDir,
115
133
  controllers: renderer.controllers,
116
134
  ...typeof renderer.entry === "string" ? { entry: renderer.entry } : {},
117
- ...Array.isArray(renderer.watch) ? { watch: renderer.watch } : {}
135
+ ...Array.isArray(renderer.watch) ? { watch: renderer.watch } : {},
136
+ ...parseTestingSection("renderer", renderer.testing, ["host"])
118
137
  },
119
138
  windows,
120
139
  dev
@@ -134,9 +153,79 @@ function applyDefaults(doc) {
134
153
  if (doc.build && typeof doc.build === "object") {
135
154
  config.build = doc.build;
136
155
  }
156
+ if (doc.observability && typeof doc.observability === "object") {
157
+ config.observability = parseObservability(doc.observability);
158
+ }
137
159
  return config;
138
160
  }
161
+ const RENDERER_TRACE_BATCHING_DEFAULTS = Object.freeze({
162
+ maxQueuedEvents: 256,
163
+ maxBatchEvents: 32,
164
+ acknowledgementTimeoutMs: 1e3,
165
+ retryLimit: 3,
166
+ retryBaseDelayMs: 25
167
+ });
168
+ function resolveRendererTraceBatching(config) {
169
+ return {
170
+ ...RENDERER_TRACE_BATCHING_DEFAULTS,
171
+ ...config.observability?.trace?.rendererToMain?.batching
172
+ };
173
+ }
174
+ function parseObservability(raw) {
175
+ const trace = raw.trace;
176
+ if (trace === void 0) {
177
+ return {};
178
+ }
179
+ if (typeof trace !== "object" || trace === null) {
180
+ throw new Error('Config validation error: "observability.trace" must be an object');
181
+ }
182
+ const rendererToMain = trace.rendererToMain;
183
+ if (rendererToMain === void 0) {
184
+ return { trace: {} };
185
+ }
186
+ if (typeof rendererToMain !== "object" || rendererToMain === null) {
187
+ throw new Error('Config validation error: "observability.trace.rendererToMain" must be an object');
188
+ }
189
+ const batching = rendererToMain.batching;
190
+ if (batching === void 0) {
191
+ return { trace: { rendererToMain: {} } };
192
+ }
193
+ if (typeof batching !== "object" || batching === null) {
194
+ throw new Error('Config validation error: "observability.trace.rendererToMain.batching" must be an object');
195
+ }
196
+ const resolved = {
197
+ ...RENDERER_TRACE_BATCHING_DEFAULTS,
198
+ ...batching
199
+ };
200
+ const positiveIntFields = ["maxQueuedEvents", "maxBatchEvents", "acknowledgementTimeoutMs"];
201
+ for (const field of positiveIntFields) {
202
+ const value = resolved[field];
203
+ if (!Number.isSafeInteger(value) || value <= 0) {
204
+ throw new Error(
205
+ `Config validation error: "observability.trace.rendererToMain.batching.${field}" must be a positive integer`
206
+ );
207
+ }
208
+ }
209
+ if (!Number.isSafeInteger(resolved.retryLimit) || resolved.retryLimit < 0) {
210
+ throw new Error(
211
+ 'Config validation error: "observability.trace.rendererToMain.batching.retryLimit" must be a non-negative integer'
212
+ );
213
+ }
214
+ if (!Number.isFinite(resolved.retryBaseDelayMs) || resolved.retryBaseDelayMs < 0) {
215
+ throw new Error(
216
+ 'Config validation error: "observability.trace.rendererToMain.batching.retryBaseDelayMs" must be a non-negative number'
217
+ );
218
+ }
219
+ if (resolved.maxBatchEvents > resolved.maxQueuedEvents) {
220
+ throw new Error(
221
+ 'Config validation error: "observability.trace.rendererToMain.batching.maxBatchEvents" cannot exceed maxQueuedEvents'
222
+ );
223
+ }
224
+ return { trace: { rendererToMain: { batching: resolved } } };
225
+ }
139
226
  export {
140
- parseConfig
227
+ RENDERER_TRACE_BATCHING_DEFAULTS,
228
+ parseConfig,
229
+ resolveRendererTraceBatching
141
230
  };
142
231
  //# sourceMappingURL=config_parser.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/config_parser.ts"],"sourcesContent":["import yaml from 'js-yaml';\nimport { readFileSync, existsSync } from 'fs';\nimport path from 'path';\nimport { getLogger } from '@noego/logger';\nimport type { WoodConfig, WindowDef, DevConfig } from '../types/config.js';\n\nconst logger = getLogger('wood:config');\n\n/** Default values applied when optional fields are omitted. */\nconst WINDOW_DEFAULTS: Partial<WindowDef> = {\n frame: true,\n resizable: true,\n show: true,\n modal: false,\n};\n\nconst DEV_DEFAULTS: DevConfig = {\n watch: true,\n splitServe: true,\n port: 5173,\n};\n\n/**\n * Parse and validate a wood.config.yml file, returning a fully-typed WoodConfig\n * with defaults applied for optional fields.\n */\nexport function parseConfig(configPath: string): WoodConfig {\n const resolved = path.resolve(configPath);\n\n if (!existsSync(resolved)) {\n throw new Error(`Config file not found: ${resolved}`);\n }\n\n const raw = readFileSync(resolved, 'utf-8');\n const doc = yaml.load(raw) as Record<string, unknown> | null;\n\n if (!doc || typeof doc !== 'object') {\n throw new Error(`Invalid YAML in config file: ${resolved}`);\n }\n\n validateRequired(doc);\n\n const config = applyDefaults(doc as RawConfig);\n\n logger.info('Parsed config', { path: resolved, windows: Object.keys(config.windows) });\n\n return config;\n}\n\n/** Shape of the raw YAML before defaults are applied. */\ntype RawConfig = Record<string, unknown>;\n\nfunction validateRequired(doc: Record<string, unknown>): void {\n requireString(doc, 'app.boot', (doc as Record<string, Record<string, unknown>>).app?.boot);\n requireString(doc, 'main.entry', (doc as Record<string, Record<string, unknown>>).main?.entry);\n requireString(doc, 'main.controllers', (doc as Record<string, Record<string, unknown>>).main?.controllers);\n requireString(doc, 'main.middleware', (doc as Record<string, Record<string, unknown>>).main?.middleware);\n requireString(doc, 'main.openapi', (doc as Record<string, Record<string, unknown>>).main?.openapi);\n requireString(doc, 'renderer.openapi', (doc as Record<string, Record<string, unknown>>).renderer?.openapi);\n requireString(doc, 'renderer.componentDir', (doc as Record<string, Record<string, unknown>>).renderer?.componentDir);\n requireString(doc, 'renderer.controllers', (doc as Record<string, Record<string, unknown>>).renderer?.controllers);\n const rendererEntry = (doc as Record<string, Record<string, unknown>>).renderer?.entry;\n if (rendererEntry !== undefined) {\n requireString(doc, 'renderer.entry', rendererEntry);\n }\n\n // Windows validation\n const windows = doc.windows;\n if (!windows || typeof windows !== 'object') {\n throw new Error('Config validation error: \"windows\" is required and must be an object with at least one window');\n }\n\n const windowKeys = Object.keys(windows as Record<string, unknown>);\n if (windowKeys.length === 0) {\n throw new Error('Config validation error: \"windows\" must contain at least one window definition');\n }\n\n for (const key of windowKeys) {\n const win = (windows as Record<string, Record<string, unknown>>)[key];\n if (!win || typeof win !== 'object') {\n throw new Error(`Config validation error: window \"${key}\" must be an object`);\n }\n requireString(doc, `windows.${key}.title`, win.title);\n requireNumber(doc, `windows.${key}.width`, win.width);\n requireNumber(doc, `windows.${key}.height`, win.height);\n requireString(doc, `windows.${key}.defaultRoute`, win.defaultRoute);\n\n if (win.contextMenu !== undefined) {\n if (typeof win.contextMenu !== 'string') {\n throw new Error(`Config validation error: \"windows.${key}.contextMenu\" must be a string`);\n }\n if (win.contextMenu !== 'native' && win.contextMenu !== 'custom') {\n throw new Error(`Config validation error: \"windows.${key}.contextMenu\" must be \"native\" or \"custom\"`);\n }\n }\n }\n}\n\nfunction requireString(_doc: Record<string, unknown>, field: string, value: unknown): asserts value is string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`Config validation error: \"${field}\" is required and must be a non-empty string`);\n }\n}\n\nfunction requireNumber(_doc: Record<string, unknown>, field: string, value: unknown): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Config validation error: \"${field}\" is required and must be a number`);\n }\n}\n\nfunction applyDefaults(doc: RawConfig): WoodConfig {\n const app = doc.app as Record<string, unknown>;\n const main = doc.main as Record<string, unknown>;\n const renderer = doc.renderer as Record<string, unknown>;\n const rawWindows = doc.windows as Record<string, Record<string, unknown>>;\n\n const windows: Record<string, WindowDef> = {};\n for (const [key, rawWin] of Object.entries(rawWindows)) {\n windows[key] = {\n ...WINDOW_DEFAULTS,\n ...rawWin,\n } as WindowDef;\n }\n\n const dev: DevConfig = {\n ...DEV_DEFAULTS,\n ...(doc.dev as Record<string, unknown> | undefined),\n };\n\n const config: WoodConfig = {\n root: typeof doc.root === 'string' ? doc.root : '.',\n outDir: typeof doc.outDir === 'string' ? doc.outDir : 'dist',\n app: {\n boot: app.boot as string,\n watch: Array.isArray(app.watch) ? (app.watch as string[]) : [],\n },\n main: {\n entry: main.entry as string,\n controllers: main.controllers as string,\n middleware: main.middleware as string,\n openapi: main.openapi as string,\n watch: Array.isArray(main.watch) ? (main.watch as string[]) : [],\n },\n renderer: {\n openapi: renderer.openapi as string,\n componentDir: renderer.componentDir as string,\n controllers: renderer.controllers as string,\n ...(typeof renderer.entry === 'string' ? { entry: renderer.entry as string } : {}),\n ...(Array.isArray(renderer.watch) ? { watch: renderer.watch as string[] } : {}),\n },\n windows,\n dev,\n };\n\n // Optional database section (preserve :userData: token for runtime expansion)\n if (doc.database && typeof doc.database === 'object') {\n const db = doc.database as Record<string, unknown>;\n if (typeof db.path === 'string') {\n config.database = {\n path: db.path,\n ...(typeof db.migrations === 'string' ? { migrations: db.migrations } : {}),\n };\n }\n }\n\n // Optional assets\n if (Array.isArray(doc.assets)) {\n config.assets = doc.assets as string[];\n }\n\n // Optional build section\n if (doc.build && typeof doc.build === 'object') {\n config.build = doc.build as WoodConfig['build'];\n }\n\n return config;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/config/config_parser.ts"],"sourcesContent":["import yaml from 'js-yaml';\nimport { readFileSync, existsSync } from 'fs';\nimport path from 'path';\nimport { getLogger } from '@noego/logger';\nimport type {\n WoodConfig,\n WindowDef,\n DevConfig,\n RendererTraceBatchingConfig,\n} from '../types/config.js';\n\nconst logger = getLogger('wood:config');\n\n/** Default values applied when optional fields are omitted. */\nconst WINDOW_DEFAULTS: Partial<WindowDef> = {\n frame: true,\n resizable: true,\n show: true,\n modal: false,\n};\n\nconst DEV_DEFAULTS: DevConfig = {\n watch: true,\n splitServe: true,\n port: 5173,\n};\n\n/**\n * Parse and validate a wood.config.yml file, returning a fully-typed WoodConfig\n * with defaults applied for optional fields.\n */\nexport function parseConfig(configPath: string): WoodConfig {\n const resolved = path.resolve(configPath);\n\n if (!existsSync(resolved)) {\n throw new Error(`Config file not found: ${resolved}`);\n }\n\n const raw = readFileSync(resolved, 'utf-8');\n const doc = yaml.load(raw) as Record<string, unknown> | null;\n\n if (!doc || typeof doc !== 'object') {\n throw new Error(`Invalid YAML in config file: ${resolved}`);\n }\n\n validateRequired(doc);\n\n const config = applyDefaults(doc as RawConfig);\n\n logger.info('Parsed config', { path: resolved, windows: Object.keys(config.windows) });\n\n return config;\n}\n\n/** Shape of the raw YAML before defaults are applied. */\ntype RawConfig = Record<string, unknown>;\n\nfunction validateRequired(doc: Record<string, unknown>): void {\n requireString(doc, 'app.boot', (doc as Record<string, Record<string, unknown>>).app?.boot);\n requireString(doc, 'main.entry', (doc as Record<string, Record<string, unknown>>).main?.entry);\n requireString(doc, 'main.controllers', (doc as Record<string, Record<string, unknown>>).main?.controllers);\n requireString(doc, 'main.middleware', (doc as Record<string, Record<string, unknown>>).main?.middleware);\n requireString(doc, 'main.openapi', (doc as Record<string, Record<string, unknown>>).main?.openapi);\n requireString(doc, 'renderer.openapi', (doc as Record<string, Record<string, unknown>>).renderer?.openapi);\n requireString(doc, 'renderer.componentDir', (doc as Record<string, Record<string, unknown>>).renderer?.componentDir);\n requireString(doc, 'renderer.controllers', (doc as Record<string, Record<string, unknown>>).renderer?.controllers);\n const rendererEntry = (doc as Record<string, Record<string, unknown>>).renderer?.entry;\n if (rendererEntry !== undefined) {\n requireString(doc, 'renderer.entry', rendererEntry);\n }\n\n // Windows validation\n const windows = doc.windows;\n if (!windows || typeof windows !== 'object') {\n throw new Error('Config validation error: \"windows\" is required and must be an object with at least one window');\n }\n\n const windowKeys = Object.keys(windows as Record<string, unknown>);\n if (windowKeys.length === 0) {\n throw new Error('Config validation error: \"windows\" must contain at least one window definition');\n }\n\n for (const key of windowKeys) {\n const win = (windows as Record<string, Record<string, unknown>>)[key];\n if (!win || typeof win !== 'object') {\n throw new Error(`Config validation error: window \"${key}\" must be an object`);\n }\n requireString(doc, `windows.${key}.title`, win.title);\n requireNumber(doc, `windows.${key}.width`, win.width);\n requireNumber(doc, `windows.${key}.height`, win.height);\n requireString(doc, `windows.${key}.defaultRoute`, win.defaultRoute);\n\n if (win.contextMenu !== undefined) {\n if (typeof win.contextMenu !== 'string') {\n throw new Error(`Config validation error: \"windows.${key}.contextMenu\" must be a string`);\n }\n if (win.contextMenu !== 'native' && win.contextMenu !== 'custom') {\n throw new Error(`Config validation error: \"windows.${key}.contextMenu\" must be \"native\" or \"custom\"`);\n }\n }\n }\n}\n\nfunction requireString(_doc: Record<string, unknown>, field: string, value: unknown): asserts value is string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`Config validation error: \"${field}\" is required and must be a non-empty string`);\n }\n}\n\nfunction requireNumber(_doc: Record<string, unknown>, field: string, value: unknown): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Config validation error: \"${field}\" is required and must be a number`);\n }\n}\n\n/**\n * Parse an optional `<section>.testing` mapping: every allowed key is an\n * optional non-empty string (a config-relative module path); anything else\n * is a validation error so a typo cannot silently drop a hook.\n */\nfunction parseTestingSection(\n section: 'main' | 'renderer',\n raw: unknown,\n allowedKeys: readonly string[],\n): { testing?: Record<string, string> } {\n if (raw === undefined) return {};\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n throw new Error(`Config validation error: \"${section}.testing\" must be an object`);\n }\n const testing: Record<string, string> = {};\n for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {\n if (!allowedKeys.includes(key)) {\n throw new Error(\n `Config validation error: \"${section}.testing.${key}\" is not a known hook (allowed: ${allowedKeys.join(', ')})`,\n );\n }\n requireString(raw as Record<string, unknown>, `${section}.testing.${key}`, value);\n testing[key] = value;\n }\n return { testing };\n}\n\nfunction applyDefaults(doc: RawConfig): WoodConfig {\n const app = doc.app as Record<string, unknown>;\n const main = doc.main as Record<string, unknown>;\n const renderer = doc.renderer as Record<string, unknown>;\n const rawWindows = doc.windows as Record<string, Record<string, unknown>>;\n\n const windows: Record<string, WindowDef> = {};\n for (const [key, rawWin] of Object.entries(rawWindows)) {\n windows[key] = {\n ...WINDOW_DEFAULTS,\n ...rawWin,\n } as WindowDef;\n }\n\n const dev: DevConfig = {\n ...DEV_DEFAULTS,\n ...(doc.dev as Record<string, unknown> | undefined),\n };\n\n const config: WoodConfig = {\n root: typeof doc.root === 'string' ? doc.root : '.',\n outDir: typeof doc.outDir === 'string' ? doc.outDir : 'dist',\n app: {\n boot: app.boot as string,\n watch: Array.isArray(app.watch) ? (app.watch as string[]) : [],\n },\n main: {\n entry: main.entry as string,\n controllers: main.controllers as string,\n middleware: main.middleware as string,\n openapi: main.openapi as string,\n watch: Array.isArray(main.watch) ? (main.watch as string[]) : [],\n ...parseTestingSection('main', main.testing, ['compose']),\n },\n renderer: {\n openapi: renderer.openapi as string,\n componentDir: renderer.componentDir as string,\n controllers: renderer.controllers as string,\n ...(typeof renderer.entry === 'string' ? { entry: renderer.entry as string } : {}),\n ...(Array.isArray(renderer.watch) ? { watch: renderer.watch as string[] } : {}),\n ...parseTestingSection('renderer', renderer.testing, ['host']),\n },\n windows,\n dev,\n };\n\n // Optional database section (preserve :userData: token for runtime expansion)\n if (doc.database && typeof doc.database === 'object') {\n const db = doc.database as Record<string, unknown>;\n if (typeof db.path === 'string') {\n config.database = {\n path: db.path,\n ...(typeof db.migrations === 'string' ? { migrations: db.migrations } : {}),\n };\n }\n }\n\n // Optional assets\n if (Array.isArray(doc.assets)) {\n config.assets = doc.assets as string[];\n }\n\n // Optional build section\n if (doc.build && typeof doc.build === 'object') {\n config.build = doc.build as WoodConfig['build'];\n }\n\n // Optional observability section (renderer→main trace batching policy)\n if (doc.observability && typeof doc.observability === 'object') {\n config.observability = parseObservability(doc.observability as Record<string, unknown>);\n }\n\n return config;\n}\n\n/**\n * Default renderer→main IPC trace batching policy. These values match the\n * policy previously hard-coded in the generated preload; wood.config.yml\n * `observability.trace.rendererToMain.batching` is now the owner.\n */\nexport const RENDERER_TRACE_BATCHING_DEFAULTS: RendererTraceBatchingConfig = Object.freeze({\n maxQueuedEvents: 256,\n maxBatchEvents: 32,\n acknowledgementTimeoutMs: 1_000,\n retryLimit: 3,\n retryBaseDelayMs: 25,\n});\n\n/** Resolves the renderer trace batching policy from a parsed config. */\nexport function resolveRendererTraceBatching(\n config: Pick<WoodConfig, 'observability'>,\n): RendererTraceBatchingConfig {\n return {\n ...RENDERER_TRACE_BATCHING_DEFAULTS,\n ...config.observability?.trace?.rendererToMain?.batching,\n };\n}\n\nfunction parseObservability(raw: Record<string, unknown>): WoodConfig['observability'] {\n const trace = raw.trace;\n if (trace === undefined) {\n return {};\n }\n if (typeof trace !== 'object' || trace === null) {\n throw new Error('Config validation error: \"observability.trace\" must be an object');\n }\n const rendererToMain = (trace as Record<string, unknown>).rendererToMain;\n if (rendererToMain === undefined) {\n return { trace: {} };\n }\n if (typeof rendererToMain !== 'object' || rendererToMain === null) {\n throw new Error('Config validation error: \"observability.trace.rendererToMain\" must be an object');\n }\n const batching = (rendererToMain as Record<string, unknown>).batching;\n if (batching === undefined) {\n return { trace: { rendererToMain: {} } };\n }\n if (typeof batching !== 'object' || batching === null) {\n throw new Error('Config validation error: \"observability.trace.rendererToMain.batching\" must be an object');\n }\n\n const resolved: RendererTraceBatchingConfig = {\n ...RENDERER_TRACE_BATCHING_DEFAULTS,\n ...(batching as Partial<RendererTraceBatchingConfig>),\n };\n\n const positiveIntFields = ['maxQueuedEvents', 'maxBatchEvents', 'acknowledgementTimeoutMs'] as const;\n for (const field of positiveIntFields) {\n const value = resolved[field];\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(\n `Config validation error: \"observability.trace.rendererToMain.batching.${field}\" must be a positive integer`,\n );\n }\n }\n if (!Number.isSafeInteger(resolved.retryLimit) || resolved.retryLimit < 0) {\n throw new Error(\n 'Config validation error: \"observability.trace.rendererToMain.batching.retryLimit\" must be a non-negative integer',\n );\n }\n if (!Number.isFinite(resolved.retryBaseDelayMs) || resolved.retryBaseDelayMs < 0) {\n throw new Error(\n 'Config validation error: \"observability.trace.rendererToMain.batching.retryBaseDelayMs\" must be a non-negative number',\n );\n }\n if (resolved.maxBatchEvents > resolved.maxQueuedEvents) {\n throw new Error(\n 'Config validation error: \"observability.trace.rendererToMain.batching.maxBatchEvents\" cannot exceed maxQueuedEvents',\n );\n }\n\n return { trace: { rendererToMain: { batching: resolved } } };\n}\n"],"mappings":"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","names":[]}
@@ -18,12 +18,16 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var config_exports = {};
20
20
  __export(config_exports, {
21
- parseConfig: () => import_config_parser.parseConfig
21
+ RENDERER_TRACE_BATCHING_DEFAULTS: () => import_config_parser.RENDERER_TRACE_BATCHING_DEFAULTS,
22
+ parseConfig: () => import_config_parser.parseConfig,
23
+ resolveRendererTraceBatching: () => import_config_parser.resolveRendererTraceBatching
22
24
  });
23
25
  module.exports = __toCommonJS(config_exports);
24
26
  var import_config_parser = require("./config_parser.cjs");
25
27
  // Annotate the CommonJS export names for ESM import in node:
26
28
  0 && (module.exports = {
27
- parseConfig
29
+ RENDERER_TRACE_BATCHING_DEFAULTS,
30
+ parseConfig,
31
+ resolveRendererTraceBatching
28
32
  });
29
33
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/index.ts"],"sourcesContent":["export { parseConfig } from './config_parser.cjs';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAA4B;","names":[]}
1
+ {"version":3,"sources":["../../src/config/index.ts"],"sourcesContent":["export {\n parseConfig,\n resolveRendererTraceBatching,\n RENDERER_TRACE_BATCHING_DEFAULTS,\n} from './config_parser.cjs';\nexport type {\n ObservabilityConfig,\n RendererTraceBatchingConfig,\n} from '../types/config.cjs';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAIO;","names":[]}
@@ -1,2 +1,2 @@
1
- export { parseConfig } from './config_parser.cjs';
2
- import '../types/config.cjs';
1
+ export { RENDERER_TRACE_BATCHING_DEFAULTS, parseConfig, resolveRendererTraceBatching } from './config_parser.cjs';
2
+ export { ObservabilityConfig, RendererTraceBatchingConfig } from '../types/config.cjs';
@@ -1,2 +1,2 @@
1
- export { parseConfig } from './config_parser.js';
2
- import '../types/config.js';
1
+ export { RENDERER_TRACE_BATCHING_DEFAULTS, parseConfig, resolveRendererTraceBatching } from './config_parser.js';
2
+ export { ObservabilityConfig, RendererTraceBatchingConfig } from '../types/config.js';
@@ -1,5 +1,11 @@
1
- import { parseConfig } from "./config_parser.js";
1
+ import {
2
+ parseConfig,
3
+ resolveRendererTraceBatching,
4
+ RENDERER_TRACE_BATCHING_DEFAULTS
5
+ } from "./config_parser.js";
2
6
  export {
3
- parseConfig
7
+ RENDERER_TRACE_BATCHING_DEFAULTS,
8
+ parseConfig,
9
+ resolveRendererTraceBatching
4
10
  };
5
11
  //# sourceMappingURL=index.js.map