@noego/wood 0.6.1 → 0.7.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 (247) hide show
  1. package/README.md +7 -0
  2. package/dist/browser-test-setup.cjs +29 -0
  3. package/dist/browser-test-setup.cjs.map +1 -0
  4. package/dist/browser-test-setup.d.cts +8 -0
  5. package/dist/browser-test-setup.d.ts +8 -0
  6. package/dist/browser-test-setup.js +9 -0
  7. package/dist/browser-test-setup.js.map +1 -0
  8. package/dist/client/global_polyfill.d.cts +1 -0
  9. package/dist/client/global_polyfill.d.ts +1 -0
  10. package/dist/client/index.cjs +7 -0
  11. package/dist/client/index.cjs.map +1 -1
  12. package/dist/client/index.d.cts +8 -4
  13. package/dist/client/index.d.ts +8 -4
  14. package/dist/client/index.js +6 -1
  15. package/dist/client/index.js.map +1 -1
  16. package/dist/codegen/renderer_app_generator.cjs +97 -24
  17. package/dist/codegen/renderer_app_generator.cjs.map +1 -1
  18. package/dist/codegen/renderer_app_generator.js +97 -24
  19. package/dist/codegen/renderer_app_generator.js.map +1 -1
  20. package/dist/codegen/type_generator.cjs +9 -0
  21. package/dist/codegen/type_generator.cjs.map +1 -1
  22. package/dist/codegen/type_generator.js +9 -0
  23. package/dist/codegen/type_generator.js.map +1 -1
  24. package/dist/config/config_parser.cjs +10 -0
  25. package/dist/config/config_parser.cjs.map +1 -1
  26. package/dist/config/config_parser.js +10 -0
  27. package/dist/config/config_parser.js.map +1 -1
  28. package/dist/fetch.cjs +38 -0
  29. package/dist/fetch.cjs.map +1 -0
  30. package/dist/fetch.d.cts +7 -0
  31. package/dist/fetch.d.ts +7 -0
  32. package/dist/fetch.js +12 -0
  33. package/dist/fetch.js.map +1 -0
  34. package/dist/frontend/frontend_page.cjs +3 -3
  35. package/dist/frontend/frontend_page.cjs.map +1 -1
  36. package/dist/frontend/frontend_page.d.cts +1 -1
  37. package/dist/frontend/frontend_page.d.ts +1 -1
  38. package/dist/frontend/frontend_page.js +3 -3
  39. package/dist/frontend/frontend_page.js.map +1 -1
  40. package/dist/frontend/frontend_surface.cjs +31 -17
  41. package/dist/frontend/frontend_surface.cjs.map +1 -1
  42. package/dist/frontend/frontend_surface.d.cts +13 -2
  43. package/dist/frontend/frontend_surface.d.ts +13 -2
  44. package/dist/frontend/frontend_surface.js +37 -17
  45. package/dist/frontend/frontend_surface.js.map +1 -1
  46. package/dist/frontend/index.d.cts +3 -0
  47. package/dist/frontend/index.d.ts +3 -0
  48. package/dist/index.cjs +5 -0
  49. package/dist/index.cjs.map +1 -1
  50. package/dist/index.d.cts +27 -1
  51. package/dist/index.d.ts +27 -1
  52. package/dist/index.js +3 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/loader/index.cjs +19 -2
  55. package/dist/loader/index.cjs.map +1 -1
  56. package/dist/loader/index.d.cts +1 -0
  57. package/dist/loader/index.d.ts +1 -0
  58. package/dist/loader/index.js +19 -1
  59. package/dist/loader/index.js.map +1 -1
  60. package/dist/loader/loader_orchestration.cjs +82 -0
  61. package/dist/loader/loader_orchestration.cjs.map +1 -0
  62. package/dist/loader/loader_orchestration.d.cts +66 -0
  63. package/dist/loader/loader_orchestration.d.ts +66 -0
  64. package/dist/loader/loader_orchestration.js +51 -0
  65. package/dist/loader/loader_orchestration.js.map +1 -0
  66. package/dist/loader/loader_runner.cjs +46 -41
  67. package/dist/loader/loader_runner.cjs.map +1 -1
  68. package/dist/loader/loader_runner.d.cts +12 -6
  69. package/dist/loader/loader_runner.d.ts +12 -6
  70. package/dist/loader/loader_runner.js +50 -41
  71. package/dist/loader/loader_runner.js.map +1 -1
  72. package/dist/native_browser.types-BY2daUOS.d.ts +189 -0
  73. package/dist/native_browser.types-vWXtE4rM.d.cts +189 -0
  74. package/dist/navigation/index.cjs +15 -2
  75. package/dist/navigation/index.cjs.map +1 -1
  76. package/dist/navigation/index.d.cts +6 -28
  77. package/dist/navigation/index.d.ts +6 -28
  78. package/dist/navigation/index.js +8 -1
  79. package/dist/navigation/index.js.map +1 -1
  80. package/dist/navigation/layout_preservation.cjs.map +1 -1
  81. package/dist/navigation/layout_preservation.d.cts +27 -2
  82. package/dist/navigation/layout_preservation.d.ts +27 -2
  83. package/dist/navigation/layout_preservation.js.map +1 -1
  84. package/dist/runtime/get_container.cjs +2 -0
  85. package/dist/runtime/get_container.cjs.map +1 -1
  86. package/dist/runtime/get_container.js +2 -0
  87. package/dist/runtime/get_container.js.map +1 -1
  88. package/dist/runtime/index.cjs +5 -0
  89. package/dist/runtime/index.cjs.map +1 -1
  90. package/dist/runtime/index.d.cts +2 -0
  91. package/dist/runtime/index.d.ts +2 -0
  92. package/dist/runtime/index.js +3 -0
  93. package/dist/runtime/index.js.map +1 -1
  94. package/dist/runtime/runtime_capabilities.cjs +35 -0
  95. package/dist/runtime/runtime_capabilities.cjs.map +1 -0
  96. package/dist/runtime/runtime_capabilities.d.cts +6 -0
  97. package/dist/runtime/runtime_capabilities.d.ts +6 -0
  98. package/dist/runtime/runtime_capabilities.js +11 -0
  99. package/dist/runtime/runtime_capabilities.js.map +1 -0
  100. package/dist/runtime/runtime_module.cjs +2 -0
  101. package/dist/runtime/runtime_module.cjs.map +1 -1
  102. package/dist/runtime/runtime_module.js +2 -0
  103. package/dist/runtime/runtime_module.js.map +1 -1
  104. package/dist/test-wood.cjs +150 -0
  105. package/dist/test-wood.cjs.map +1 -0
  106. package/dist/test-wood.d.cts +62 -0
  107. package/dist/test-wood.d.ts +62 -0
  108. package/dist/test-wood.js +115 -0
  109. package/dist/test-wood.js.map +1 -0
  110. package/dist/testing/browser.cjs +92 -163
  111. package/dist/testing/browser.cjs.map +1 -1
  112. package/dist/testing/browser.d.cts +14 -13
  113. package/dist/testing/browser.d.ts +14 -13
  114. package/dist/testing/browser.js +88 -162
  115. package/dist/testing/browser.js.map +1 -1
  116. package/dist/testing/create_controller_harness.d.cts +3 -1
  117. package/dist/testing/create_controller_harness.d.ts +3 -1
  118. package/dist/testing/create_router_bridge.cjs +19 -15
  119. package/dist/testing/create_router_bridge.cjs.map +1 -1
  120. package/dist/testing/create_router_bridge.d.cts +8 -1
  121. package/dist/testing/create_router_bridge.d.ts +8 -1
  122. package/dist/testing/create_router_bridge.js +18 -15
  123. package/dist/testing/create_router_bridge.js.map +1 -1
  124. package/dist/testing/index.cjs +12 -4
  125. package/dist/testing/index.cjs.map +1 -1
  126. package/dist/testing/index.d.cts +12 -5
  127. package/dist/testing/index.d.ts +12 -5
  128. package/dist/testing/index.js +9 -3
  129. package/dist/testing/index.js.map +1 -1
  130. package/dist/testing/native_browser/browser_pool.cjs +31 -0
  131. package/dist/testing/native_browser/browser_pool.cjs.map +1 -0
  132. package/dist/testing/native_browser/browser_pool.d.cts +1 -0
  133. package/dist/testing/native_browser/browser_pool.d.ts +1 -0
  134. package/dist/testing/native_browser/browser_pool.js +6 -0
  135. package/dist/testing/native_browser/browser_pool.js.map +1 -0
  136. package/dist/testing/native_browser/happy_dom_tab.cjs +107 -0
  137. package/dist/testing/native_browser/happy_dom_tab.cjs.map +1 -0
  138. package/dist/testing/native_browser/happy_dom_tab.d.cts +35 -0
  139. package/dist/testing/native_browser/happy_dom_tab.d.ts +35 -0
  140. package/dist/testing/native_browser/happy_dom_tab.js +73 -0
  141. package/dist/testing/native_browser/happy_dom_tab.js.map +1 -0
  142. package/dist/testing/native_browser/happy_dom_transfer.cjs +29 -0
  143. package/dist/testing/native_browser/happy_dom_transfer.cjs.map +1 -0
  144. package/dist/testing/native_browser/happy_dom_transfer.d.cts +1 -0
  145. package/dist/testing/native_browser/happy_dom_transfer.d.ts +1 -0
  146. package/dist/testing/native_browser/happy_dom_transfer.js +5 -0
  147. package/dist/testing/native_browser/happy_dom_transfer.js.map +1 -0
  148. package/dist/testing/native_browser/host_transport.cjs +89 -0
  149. package/dist/testing/native_browser/host_transport.cjs.map +1 -0
  150. package/dist/testing/native_browser/host_transport.d.cts +44 -0
  151. package/dist/testing/native_browser/host_transport.d.ts +44 -0
  152. package/dist/testing/native_browser/host_transport.js +65 -0
  153. package/dist/testing/native_browser/host_transport.js.map +1 -0
  154. package/dist/testing/native_browser/native_browser.types.cjs +17 -0
  155. package/dist/testing/native_browser/native_browser.types.cjs.map +1 -0
  156. package/dist/testing/native_browser/native_browser.types.d.cts +31 -0
  157. package/dist/testing/native_browser/native_browser.types.d.ts +31 -0
  158. package/dist/testing/native_browser/native_browser.types.js +1 -0
  159. package/dist/testing/native_browser/native_browser.types.js.map +1 -0
  160. package/dist/testing/native_browser/native_browser_environment.cjs +143 -0
  161. package/dist/testing/native_browser/native_browser_environment.cjs.map +1 -0
  162. package/dist/testing/native_browser/native_browser_environment.d.cts +36 -0
  163. package/dist/testing/native_browser/native_browser_environment.d.ts +36 -0
  164. package/dist/testing/native_browser/native_browser_environment.js +109 -0
  165. package/dist/testing/native_browser/native_browser_environment.js.map +1 -0
  166. package/dist/testing/native_browser/native_browser_lifecycle.cjs +31 -0
  167. package/dist/testing/native_browser/native_browser_lifecycle.cjs.map +1 -0
  168. package/dist/testing/native_browser/native_browser_lifecycle.d.cts +1 -0
  169. package/dist/testing/native_browser/native_browser_lifecycle.d.ts +1 -0
  170. package/dist/testing/native_browser/native_browser_lifecycle.js +6 -0
  171. package/dist/testing/native_browser/native_browser_lifecycle.js.map +1 -0
  172. package/dist/testing/native_browser/playwright_tab.cjs +124 -0
  173. package/dist/testing/native_browser/playwright_tab.cjs.map +1 -0
  174. package/dist/testing/native_browser/playwright_tab.d.cts +35 -0
  175. package/dist/testing/native_browser/playwright_tab.d.ts +35 -0
  176. package/dist/testing/native_browser/playwright_tab.js +100 -0
  177. package/dist/testing/native_browser/playwright_tab.js.map +1 -0
  178. package/dist/testing/native_browser/renderer_compilation.cjs +149 -0
  179. package/dist/testing/native_browser/renderer_compilation.cjs.map +1 -0
  180. package/dist/testing/native_browser/renderer_compilation.d.cts +35 -0
  181. package/dist/testing/native_browser/renderer_compilation.d.ts +35 -0
  182. package/dist/testing/native_browser/renderer_compilation.js +115 -0
  183. package/dist/testing/native_browser/renderer_compilation.js.map +1 -0
  184. package/dist/testing/native_browser/renderer_entry.cjs +148 -0
  185. package/dist/testing/native_browser/renderer_entry.cjs.map +1 -0
  186. package/dist/testing/native_browser/renderer_entry.d.cts +13 -0
  187. package/dist/testing/native_browser/renderer_entry.d.ts +13 -0
  188. package/dist/testing/native_browser/renderer_entry.js +114 -0
  189. package/dist/testing/native_browser/renderer_entry.js.map +1 -0
  190. package/dist/testing/registration_only_root.cjs +61 -5
  191. package/dist/testing/registration_only_root.cjs.map +1 -1
  192. package/dist/testing/registration_only_root.d.cts +25 -4
  193. package/dist/testing/registration_only_root.d.ts +25 -4
  194. package/dist/testing/registration_only_root.js +60 -5
  195. package/dist/testing/registration_only_root.js.map +1 -1
  196. package/dist/testing/runner_importer.cjs +75 -0
  197. package/dist/testing/runner_importer.cjs.map +1 -0
  198. package/dist/testing/runner_importer.d.cts +8 -0
  199. package/dist/testing/runner_importer.d.ts +8 -0
  200. package/dist/testing/runner_importer.js +41 -0
  201. package/dist/testing/runner_importer.js.map +1 -0
  202. package/dist/testing/test_wood_config.cjs +387 -272
  203. package/dist/testing/test_wood_config.cjs.map +1 -1
  204. package/dist/testing/test_wood_config.d.cts +19 -123
  205. package/dist/testing/test_wood_config.d.ts +19 -123
  206. package/dist/testing/test_wood_config.js +396 -270
  207. package/dist/testing/test_wood_config.js.map +1 -1
  208. package/dist/testing/wood_config_source.cjs +12 -0
  209. package/dist/testing/wood_config_source.cjs.map +1 -1
  210. package/dist/testing/wood_config_source.d.cts +10 -0
  211. package/dist/testing/wood_config_source.d.ts +10 -0
  212. package/dist/testing/wood_config_source.js +12 -0
  213. package/dist/testing/wood_config_source.js.map +1 -1
  214. package/dist/testing/wood_env_renderer.cjs +28 -3
  215. package/dist/testing/wood_env_renderer.cjs.map +1 -1
  216. package/dist/testing/wood_env_renderer.d.cts +13 -1
  217. package/dist/testing/wood_env_renderer.d.ts +13 -1
  218. package/dist/testing/wood_env_renderer.js +28 -3
  219. package/dist/testing/wood_env_renderer.js.map +1 -1
  220. package/dist/testing/wood_lazy_runtime.cjs +109 -0
  221. package/dist/testing/wood_lazy_runtime.cjs.map +1 -0
  222. package/dist/testing/wood_lazy_runtime.d.cts +36 -0
  223. package/dist/testing/wood_lazy_runtime.d.ts +36 -0
  224. package/dist/testing/wood_lazy_runtime.js +84 -0
  225. package/dist/testing/wood_lazy_runtime.js.map +1 -0
  226. package/dist/testing/wood_test_selection.cjs +34 -55
  227. package/dist/testing/wood_test_selection.cjs.map +1 -1
  228. package/dist/testing/wood_test_selection.d.cts +18 -24
  229. package/dist/testing/wood_test_selection.d.ts +18 -24
  230. package/dist/testing/wood_test_selection.js +30 -54
  231. package/dist/testing/wood_test_selection.js.map +1 -1
  232. package/dist/testing-api.cjs +17 -0
  233. package/dist/testing-api.cjs.map +1 -0
  234. package/dist/testing-api.d.cts +18 -0
  235. package/dist/testing-api.d.ts +18 -0
  236. package/dist/testing-api.js +1 -0
  237. package/dist/testing-api.js.map +1 -0
  238. package/dist/types/config.cjs.map +1 -1
  239. package/dist/types/config.d.cts +4 -0
  240. package/dist/types/config.d.ts +4 -0
  241. package/docs/native-browser-testing.md +164 -0
  242. package/package.json +31 -5
  243. package/src/components/NavigationShell.browser.test.ts +10 -10
  244. package/src/components/NavigationShell.cleanup.browser.test.ts +57 -0
  245. package/src/components/NavigationShell.scopes.browser.test.ts +5 -5
  246. package/src/components/NavigationShell.svelte +50 -24
  247. package/src/navigation/layout_preservation.ts +3 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/navigation/index.ts"],"sourcesContent":["import { emitRendererTrace } from '../tracing/index.js';\n\nconst NAVIGATION_SYMBOL = Symbol.for('@noego/wood.navigation');\nconst HISTORY_STATE_MARKER = '__wood_navigation_state__';\n\nexport interface NavigationEntry {\n page: string;\n params: Record<string, string>;\n query: Record<string, string>;\n options: NavigationOptions;\n}\n\nexport interface NavigationOptions {\n preserveLayouts?: boolean;\n}\n\ntype NavigationHistoryState = NavigationEntry & {\n [HISTORY_STATE_MARKER]: true;\n};\n\ntype NavigationListener = (entry: NavigationEntry | null) => void;\n\nexport class Navigation {\n private entries: NavigationEntry[] = [];\n private index = -1;\n private listeners = new Set<NavigationListener>();\n\n getCurrent(): NavigationEntry | null {\n if (this.index < 0 || this.index >= this.entries.length) {\n return null;\n }\n return this.cloneEntry(this.entries[this.index]);\n }\n\n getPages(): NavigationEntry[] {\n return this.entries.map((entry) => this.cloneEntry(entry));\n }\n\n getParams(): Record<string, string> {\n const current = this.getCurrent();\n if (!current) {\n return {};\n }\n return { ...current.params };\n }\n\n replace(\n page: string,\n params: Record<string, string> = {},\n query: Record<string, string> = {},\n options: NavigationOptions = {},\n ): NavigationEntry {\n const entry = this.createEntry(page, params, query, options);\n\n if (this.index < 0) {\n this.entries.push(entry);\n this.index = 0;\n } else {\n this.entries[this.index] = entry;\n }\n\n this.writeWindowHistory('replaceState', entry);\n this.notify();\n emitRendererTrace('info', {\n source: 'wood.navigation',\n type: 'navigation.replace',\n payload: {\n page: entry.page,\n params: entry.params,\n query: entry.query,\n options: entry.options,\n },\n });\n return this.cloneEntry(entry);\n }\n\n go(\n page: string,\n params: Record<string, string> = {},\n query: Record<string, string> = {},\n options: NavigationOptions = {},\n ): NavigationEntry {\n const entry = this.createEntry(page, params, query, options);\n if (this.index < this.entries.length - 1) {\n this.entries = this.entries.slice(0, this.index + 1);\n }\n this.entries.push(entry);\n this.index = this.entries.length - 1;\n\n this.writeWindowHistory('pushState', entry);\n this.notify();\n emitRendererTrace('info', {\n source: 'wood.navigation',\n type: 'navigation.go',\n payload: {\n page: entry.page,\n params: entry.params,\n query: entry.query,\n options: entry.options,\n },\n });\n return this.cloneEntry(entry);\n }\n\n goto(delta: number): NavigationEntry | null {\n return this.moveCursor(delta);\n }\n\n goBack(): NavigationEntry | null {\n return this.goto(-1);\n }\n\n goForward(): NavigationEntry | null {\n return this.goto(1);\n }\n\n subscribe(listener: NavigationListener): () => void {\n this.listeners.add(listener);\n listener(this.getCurrent());\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private moveCursor(delta: number): NavigationEntry | null {\n if (delta === 0) {\n return this.getCurrent();\n }\n\n const nextIndex = this.index + delta;\n if (nextIndex < 0 || nextIndex >= this.entries.length) {\n return this.getCurrent();\n }\n\n this.index = nextIndex;\n const entry = this.entries[this.index];\n this.writeWindowHistory('replaceState', entry);\n this.notify();\n emitRendererTrace('info', {\n source: 'wood.navigation',\n type: 'navigation.goto',\n payload: {\n delta,\n page: entry.page,\n },\n });\n return this.cloneEntry(entry);\n }\n\n private notify(): void {\n const current = this.getCurrent();\n for (const listener of this.listeners) {\n listener(current);\n }\n }\n\n private createEntry(\n page: string,\n params: Record<string, string>,\n query: Record<string, string>,\n options: NavigationOptions,\n ): NavigationEntry {\n return {\n page,\n params: this.normalizeRecord(params),\n query: this.normalizeRecord(query),\n options: { ...options },\n };\n }\n\n private cloneEntry(entry: NavigationEntry): NavigationEntry {\n return {\n page: entry.page,\n params: { ...entry.params },\n query: { ...entry.query },\n options: { ...entry.options },\n };\n }\n\n private normalizeRecord(input: Record<string, string>): Record<string, string> {\n const output: Record<string, string> = {};\n for (const [key, value] of Object.entries(input ?? {})) {\n output[String(key)] = String(value);\n }\n return output;\n }\n\n private writeWindowHistory(\n mode: 'pushState' | 'replaceState',\n entry: NavigationEntry,\n ): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const state: NavigationHistoryState = {\n [HISTORY_STATE_MARKER]: true,\n page: entry.page,\n params: { ...entry.params },\n query: { ...entry.query },\n options: { ...entry.options },\n };\n\n window.history[mode](state, '');\n }\n}\n\ntype GlobalWithNavigation = typeof globalThis & {\n [NAVIGATION_SYMBOL]?: Navigation;\n};\n\nfunction createNavigationInstance(): Navigation {\n return new Navigation();\n}\n\nexport function getNavigation(): Navigation {\n const globalObj = globalThis as GlobalWithNavigation;\n if (!globalObj[NAVIGATION_SYMBOL]) {\n globalObj[NAVIGATION_SYMBOL] = createNavigationInstance();\n }\n return globalObj[NAVIGATION_SYMBOL];\n}\n\nexport function goto(\n delta: number,\n): NavigationEntry | null {\n return getNavigation().goto(delta);\n}\n\nexport function go(\n page: string,\n params: Record<string, string> = {},\n query: Record<string, string> = {},\n options: NavigationOptions = {},\n): NavigationEntry {\n return getNavigation().go(page, params, query, options);\n}\n\nexport function goback(): NavigationEntry | null {\n return goto(-1);\n}\n\n/** Test-only helper to clear the navigation singleton. */\nexport function clearNavigationForTests(): void {\n const globalObj = globalThis as GlobalWithNavigation;\n delete globalObj[NAVIGATION_SYMBOL];\n}\n\n// Dev/test-only automation introspection surface (Axe AXE-WP-02).\n// Benign import cycle: automation_introspection uses getNavigation lazily.\n// NOTE: keep these re-exports single-line — the tsup extension-rewrite plugin\n// only rewrites single-line import/export specifiers.\nexport { installAutomationIntrospection, WOOD_AUTOMATION_GLOBAL_KEY } from './automation_introspection.js';\nexport type { WoodAutomationSnapshot, WoodAutomationEvent, WoodAutomationIntrospection, InstallAutomationIntrospectionOptions } from './automation_introspection.js';\nexport { computePreservedLayoutDepth } from './layout_preservation.js';\nexport type { LayoutStack } from './layout_preservation.js';\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/navigation/index.ts"],"sourcesContent":["import { emitRendererTrace } from '../tracing/index.js';\n\nconst NAVIGATION_SYMBOL = Symbol.for('@noego/wood.navigation');\nconst HISTORY_STATE_MARKER = '__wood_navigation_state__';\n\nexport interface NavigationEntry {\n page: string;\n params: Record<string, string>;\n query: Record<string, string>;\n options: NavigationOptions;\n}\n\nimport type { NavigationOptions } from './layout_preservation.js';\nexport type { NavigationOptions } from './layout_preservation.js';\n\ntype NavigationHistoryState = NavigationEntry & {\n [HISTORY_STATE_MARKER]: true;\n};\n\ntype NavigationListener = (entry: NavigationEntry | null) => void;\n\nexport class Navigation {\n private entries: NavigationEntry[] = [];\n private index = -1;\n private listeners = new Set<NavigationListener>();\n\n getCurrent(): NavigationEntry | null {\n if (this.index < 0 || this.index >= this.entries.length) {\n return null;\n }\n return this.cloneEntry(this.entries[this.index]);\n }\n\n getPages(): NavigationEntry[] {\n return this.entries.map((entry) => this.cloneEntry(entry));\n }\n\n getParams(): Record<string, string> {\n const current = this.getCurrent();\n if (!current) {\n return {};\n }\n return { ...current.params };\n }\n\n replace(\n page: string,\n params: Record<string, string> = {},\n query: Record<string, string> = {},\n options: NavigationOptions = {},\n ): NavigationEntry {\n const entry = this.createEntry(page, params, query, options);\n\n if (this.index < 0) {\n this.entries.push(entry);\n this.index = 0;\n } else {\n this.entries[this.index] = entry;\n }\n\n this.writeWindowHistory('replaceState', entry);\n this.notify();\n emitRendererTrace('info', {\n source: 'wood.navigation',\n type: 'navigation.replace',\n payload: {\n page: entry.page,\n params: entry.params,\n query: entry.query,\n options: entry.options,\n },\n });\n return this.cloneEntry(entry);\n }\n\n go(\n page: string,\n params: Record<string, string> = {},\n query: Record<string, string> = {},\n options: NavigationOptions = {},\n ): NavigationEntry {\n const entry = this.createEntry(page, params, query, options);\n if (this.index < this.entries.length - 1) {\n this.entries = this.entries.slice(0, this.index + 1);\n }\n this.entries.push(entry);\n this.index = this.entries.length - 1;\n\n this.writeWindowHistory('pushState', entry);\n this.notify();\n emitRendererTrace('info', {\n source: 'wood.navigation',\n type: 'navigation.go',\n payload: {\n page: entry.page,\n params: entry.params,\n query: entry.query,\n options: entry.options,\n },\n });\n return this.cloneEntry(entry);\n }\n\n goto(delta: number): NavigationEntry | null {\n return this.moveCursor(delta);\n }\n\n goBack(): NavigationEntry | null {\n return this.goto(-1);\n }\n\n goForward(): NavigationEntry | null {\n return this.goto(1);\n }\n\n subscribe(listener: NavigationListener): () => void {\n this.listeners.add(listener);\n listener(this.getCurrent());\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private moveCursor(delta: number): NavigationEntry | null {\n if (delta === 0) {\n return this.getCurrent();\n }\n\n const nextIndex = this.index + delta;\n if (nextIndex < 0 || nextIndex >= this.entries.length) {\n return this.getCurrent();\n }\n\n this.index = nextIndex;\n const entry = this.entries[this.index];\n this.writeWindowHistory('replaceState', entry);\n this.notify();\n emitRendererTrace('info', {\n source: 'wood.navigation',\n type: 'navigation.goto',\n payload: {\n delta,\n page: entry.page,\n },\n });\n return this.cloneEntry(entry);\n }\n\n private notify(): void {\n const current = this.getCurrent();\n for (const listener of this.listeners) {\n listener(current);\n }\n }\n\n private createEntry(\n page: string,\n params: Record<string, string>,\n query: Record<string, string>,\n options: NavigationOptions,\n ): NavigationEntry {\n return {\n page,\n params: this.normalizeRecord(params),\n query: this.normalizeRecord(query),\n options: { ...options },\n };\n }\n\n private cloneEntry(entry: NavigationEntry): NavigationEntry {\n return {\n page: entry.page,\n params: { ...entry.params },\n query: { ...entry.query },\n options: { ...entry.options },\n };\n }\n\n private normalizeRecord(input: Record<string, string>): Record<string, string> {\n const output: Record<string, string> = {};\n for (const [key, value] of Object.entries(input ?? {})) {\n output[String(key)] = String(value);\n }\n return output;\n }\n\n private writeWindowHistory(\n mode: 'pushState' | 'replaceState',\n entry: NavigationEntry,\n ): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const state: NavigationHistoryState = {\n [HISTORY_STATE_MARKER]: true,\n page: entry.page,\n params: { ...entry.params },\n query: { ...entry.query },\n options: { ...entry.options },\n };\n\n window.history[mode](state, '');\n }\n}\n\ntype GlobalWithNavigation = typeof globalThis & {\n [NAVIGATION_SYMBOL]?: Navigation;\n};\n\nfunction createNavigationInstance(): Navigation {\n return new Navigation();\n}\n\nexport function getNavigation(): Navigation {\n const globalObj = globalThis as GlobalWithNavigation;\n if (!globalObj[NAVIGATION_SYMBOL]) {\n globalObj[NAVIGATION_SYMBOL] = createNavigationInstance();\n }\n return globalObj[NAVIGATION_SYMBOL];\n}\n\nexport function goto(\n delta: number,\n): NavigationEntry | null {\n return getNavigation().goto(delta);\n}\n\nexport function go(\n page: string,\n params: Record<string, string> = {},\n query: Record<string, string> = {},\n options: NavigationOptions = {},\n): NavigationEntry {\n return getNavigation().go(page, params, query, options);\n}\n\nexport function goback(): NavigationEntry | null {\n return goto(-1);\n}\n\n/** Test-only helper to clear the navigation singleton. */\nexport function clearNavigationForTests(): void {\n const globalObj = globalThis as GlobalWithNavigation;\n delete globalObj[NAVIGATION_SYMBOL];\n}\n\n// Dev/test-only automation introspection surface (Axe AXE-WP-02).\n// Benign import cycle: automation_introspection uses getNavigation lazily.\n// NOTE: keep these re-exports single-line — the tsup extension-rewrite plugin\n// only rewrites single-line import/export specifiers.\nexport { installAutomationIntrospection, WOOD_AUTOMATION_GLOBAL_KEY } from './automation_introspection.js';\nexport type { WoodAutomationSnapshot, WoodAutomationEvent, WoodAutomationIntrospection, InstallAutomationIntrospectionOptions } from './automation_introspection.js';\nexport { computePreservedLayoutDepth } from './layout_preservation.js';\nexport type { LayoutStack } from './layout_preservation.js';\n// Shared page/layout data-loader orchestration for the generated renderer app.\nexport { createLoaderRequest, initializeArgument, initializeController, runViewLoaders, assertDataLoader, NO_LOADERS } from '../loader/loader_orchestration.js';\nexport type { DataLoader, LoadedData, RouteInput, ViewLoaderResult, ViewLoaderSet } from '../loader/loader_orchestration.js';\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/navigation/layout_preservation.ts"],"sourcesContent":["/**\n * Layout preservation depth — the single production rule for how many\n * leading layouts a navigation transition keeps mounted.\n *\n * One implementation, two callers: the renderer's NavigationShell (real\n * component transitions) and the Node frontend application slice\n * (`createFrontendSurface`). They must agree — a slice test that preserved\n * a layout the renderer rebuilds, or vice versa, would be evidence about a\n * rule that does not exist in production.\n *\n * The rule: walk the layout stacks in parallel and keep a layout only while\n * BOTH sides declare the same layout path, the same layout controller, and\n * both mark it `preserve: true`. `NavigationOptions.preserveLayouts`\n * overrides the declaration in both directions.\n */\nimport type { NavigationOptions } from './index.js';\n\n/** The layout stack of one view, in the shape both callers can supply. */\nexport interface LayoutStack {\n layoutPaths: readonly string[];\n layoutControllers?: ReadonlyArray<string | undefined>;\n layoutPreserve?: readonly boolean[];\n}\n\nexport function computePreservedLayoutDepth(\n from: LayoutStack,\n to: LayoutStack,\n options: NavigationOptions = {},\n): number {\n const maxDepth = Math.min(from.layoutPaths.length, to.layoutPaths.length);\n let depth = 0;\n for (let index = 0; index < maxDepth; index += 1) {\n if (from.layoutPaths[index] !== to.layoutPaths[index]) break;\n if (from.layoutControllers?.[index] !== to.layoutControllers?.[index]) break;\n if (options.preserveLayouts === false) break;\n if (\n options.preserveLayouts !== true &&\n (from.layoutPreserve?.[index] !== true || to.layoutPreserve?.[index] !== true)\n ) {\n break;\n }\n depth += 1;\n }\n return depth;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBO,SAAS,4BACd,MACA,IACA,UAA6B,CAAC,GACtB;AACR,QAAM,WAAW,KAAK,IAAI,KAAK,YAAY,QAAQ,GAAG,YAAY,MAAM;AACxE,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAAG;AAChD,QAAI,KAAK,YAAY,KAAK,MAAM,GAAG,YAAY,KAAK,EAAG;AACvD,QAAI,KAAK,oBAAoB,KAAK,MAAM,GAAG,oBAAoB,KAAK,EAAG;AACvE,QAAI,QAAQ,oBAAoB,MAAO;AACvC,QACE,QAAQ,oBAAoB,SAC3B,KAAK,iBAAiB,KAAK,MAAM,QAAQ,GAAG,iBAAiB,KAAK,MAAM,OACzE;AACA;AAAA,IACF;AACA,aAAS;AAAA,EACX;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/navigation/layout_preservation.ts"],"sourcesContent":["/**\n * Layout preservation depth — the single production rule for how many\n * leading layouts a navigation transition keeps mounted.\n *\n * One implementation, two callers: the renderer's NavigationShell (real\n * component transitions) and the Node frontend application slice\n * (`createFrontendSurface`). They must agree — a slice test that preserved\n * a layout the renderer rebuilds, or vice versa, would be evidence about a\n * rule that does not exist in production.\n *\n * The rule: walk the layout stacks in parallel and keep a layout only while\n * BOTH sides declare the same layout path, the same layout controller, and\n * both mark it `preserve: true`. `NavigationOptions.preserveLayouts`\n * overrides the declaration in both directions.\n */\nexport interface NavigationOptions {\n preserveLayouts?: boolean;\n}\n\n/** The layout stack of one view, in the shape both callers can supply. */\nexport interface LayoutStack {\n layoutPaths: readonly string[];\n layoutControllers?: ReadonlyArray<string | undefined>;\n layoutPreserve?: readonly boolean[];\n}\n\nexport function computePreservedLayoutDepth(\n from: LayoutStack,\n to: LayoutStack,\n options: NavigationOptions = {},\n): number {\n const maxDepth = Math.min(from.layoutPaths.length, to.layoutPaths.length);\n let depth = 0;\n for (let index = 0; index < maxDepth; index += 1) {\n if (from.layoutPaths[index] !== to.layoutPaths[index]) break;\n if (from.layoutControllers?.[index] !== to.layoutControllers?.[index]) break;\n if (options.preserveLayouts === false) break;\n if (\n options.preserveLayouts !== true &&\n (from.layoutPreserve?.[index] !== true || to.layoutPreserve?.[index] !== true)\n ) {\n break;\n }\n depth += 1;\n }\n return depth;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BO,SAAS,4BACd,MACA,IACA,UAA6B,CAAC,GACtB;AACR,QAAM,WAAW,KAAK,IAAI,KAAK,YAAY,QAAQ,GAAG,YAAY,MAAM;AACxE,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAAG;AAChD,QAAI,KAAK,YAAY,KAAK,MAAM,GAAG,YAAY,KAAK,EAAG;AACvD,QAAI,KAAK,oBAAoB,KAAK,MAAM,GAAG,oBAAoB,KAAK,EAAG;AACvE,QAAI,QAAQ,oBAAoB,MAAO;AACvC,QACE,QAAQ,oBAAoB,SAC3B,KAAK,iBAAiB,KAAK,MAAM,QAAQ,GAAG,iBAAiB,KAAK,MAAM,OACzE;AACA;AAAA,IACF;AACA,aAAS;AAAA,EACX;AACA,SAAO;AACT;","names":[]}
@@ -1,2 +1,27 @@
1
- export { LayoutStack, computePreservedLayoutDepth } from './index.cjs';
2
- import './automation_introspection.cjs';
1
+ /**
2
+ * Layout preservation depth — the single production rule for how many
3
+ * leading layouts a navigation transition keeps mounted.
4
+ *
5
+ * One implementation, two callers: the renderer's NavigationShell (real
6
+ * component transitions) and the Node frontend application slice
7
+ * (`createFrontendSurface`). They must agree — a slice test that preserved
8
+ * a layout the renderer rebuilds, or vice versa, would be evidence about a
9
+ * rule that does not exist in production.
10
+ *
11
+ * The rule: walk the layout stacks in parallel and keep a layout only while
12
+ * BOTH sides declare the same layout path, the same layout controller, and
13
+ * both mark it `preserve: true`. `NavigationOptions.preserveLayouts`
14
+ * overrides the declaration in both directions.
15
+ */
16
+ interface NavigationOptions {
17
+ preserveLayouts?: boolean;
18
+ }
19
+ /** The layout stack of one view, in the shape both callers can supply. */
20
+ interface LayoutStack {
21
+ layoutPaths: readonly string[];
22
+ layoutControllers?: ReadonlyArray<string | undefined>;
23
+ layoutPreserve?: readonly boolean[];
24
+ }
25
+ declare function computePreservedLayoutDepth(from: LayoutStack, to: LayoutStack, options?: NavigationOptions): number;
26
+
27
+ export { type LayoutStack, type NavigationOptions, computePreservedLayoutDepth };
@@ -1,2 +1,27 @@
1
- export { LayoutStack, computePreservedLayoutDepth } from './index.js';
2
- import './automation_introspection.js';
1
+ /**
2
+ * Layout preservation depth — the single production rule for how many
3
+ * leading layouts a navigation transition keeps mounted.
4
+ *
5
+ * One implementation, two callers: the renderer's NavigationShell (real
6
+ * component transitions) and the Node frontend application slice
7
+ * (`createFrontendSurface`). They must agree — a slice test that preserved
8
+ * a layout the renderer rebuilds, or vice versa, would be evidence about a
9
+ * rule that does not exist in production.
10
+ *
11
+ * The rule: walk the layout stacks in parallel and keep a layout only while
12
+ * BOTH sides declare the same layout path, the same layout controller, and
13
+ * both mark it `preserve: true`. `NavigationOptions.preserveLayouts`
14
+ * overrides the declaration in both directions.
15
+ */
16
+ interface NavigationOptions {
17
+ preserveLayouts?: boolean;
18
+ }
19
+ /** The layout stack of one view, in the shape both callers can supply. */
20
+ interface LayoutStack {
21
+ layoutPaths: readonly string[];
22
+ layoutControllers?: ReadonlyArray<string | undefined>;
23
+ layoutPreserve?: readonly boolean[];
24
+ }
25
+ declare function computePreservedLayoutDepth(from: LayoutStack, to: LayoutStack, options?: NavigationOptions): number;
26
+
27
+ export { type LayoutStack, type NavigationOptions, computePreservedLayoutDepth };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/navigation/layout_preservation.ts"],"sourcesContent":["/**\n * Layout preservation depth — the single production rule for how many\n * leading layouts a navigation transition keeps mounted.\n *\n * One implementation, two callers: the renderer's NavigationShell (real\n * component transitions) and the Node frontend application slice\n * (`createFrontendSurface`). They must agree — a slice test that preserved\n * a layout the renderer rebuilds, or vice versa, would be evidence about a\n * rule that does not exist in production.\n *\n * The rule: walk the layout stacks in parallel and keep a layout only while\n * BOTH sides declare the same layout path, the same layout controller, and\n * both mark it `preserve: true`. `NavigationOptions.preserveLayouts`\n * overrides the declaration in both directions.\n */\nimport type { NavigationOptions } from './index.js';\n\n/** The layout stack of one view, in the shape both callers can supply. */\nexport interface LayoutStack {\n layoutPaths: readonly string[];\n layoutControllers?: ReadonlyArray<string | undefined>;\n layoutPreserve?: readonly boolean[];\n}\n\nexport function computePreservedLayoutDepth(\n from: LayoutStack,\n to: LayoutStack,\n options: NavigationOptions = {},\n): number {\n const maxDepth = Math.min(from.layoutPaths.length, to.layoutPaths.length);\n let depth = 0;\n for (let index = 0; index < maxDepth; index += 1) {\n if (from.layoutPaths[index] !== to.layoutPaths[index]) break;\n if (from.layoutControllers?.[index] !== to.layoutControllers?.[index]) break;\n if (options.preserveLayouts === false) break;\n if (\n options.preserveLayouts !== true &&\n (from.layoutPreserve?.[index] !== true || to.layoutPreserve?.[index] !== true)\n ) {\n break;\n }\n depth += 1;\n }\n return depth;\n}\n"],"mappings":"AAwBO,SAAS,4BACd,MACA,IACA,UAA6B,CAAC,GACtB;AACR,QAAM,WAAW,KAAK,IAAI,KAAK,YAAY,QAAQ,GAAG,YAAY,MAAM;AACxE,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAAG;AAChD,QAAI,KAAK,YAAY,KAAK,MAAM,GAAG,YAAY,KAAK,EAAG;AACvD,QAAI,KAAK,oBAAoB,KAAK,MAAM,GAAG,oBAAoB,KAAK,EAAG;AACvE,QAAI,QAAQ,oBAAoB,MAAO;AACvC,QACE,QAAQ,oBAAoB,SAC3B,KAAK,iBAAiB,KAAK,MAAM,QAAQ,GAAG,iBAAiB,KAAK,MAAM,OACzE;AACA;AAAA,IACF;AACA,aAAS;AAAA,EACX;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/navigation/layout_preservation.ts"],"sourcesContent":["/**\n * Layout preservation depth — the single production rule for how many\n * leading layouts a navigation transition keeps mounted.\n *\n * One implementation, two callers: the renderer's NavigationShell (real\n * component transitions) and the Node frontend application slice\n * (`createFrontendSurface`). They must agree — a slice test that preserved\n * a layout the renderer rebuilds, or vice versa, would be evidence about a\n * rule that does not exist in production.\n *\n * The rule: walk the layout stacks in parallel and keep a layout only while\n * BOTH sides declare the same layout path, the same layout controller, and\n * both mark it `preserve: true`. `NavigationOptions.preserveLayouts`\n * overrides the declaration in both directions.\n */\nexport interface NavigationOptions {\n preserveLayouts?: boolean;\n}\n\n/** The layout stack of one view, in the shape both callers can supply. */\nexport interface LayoutStack {\n layoutPaths: readonly string[];\n layoutControllers?: ReadonlyArray<string | undefined>;\n layoutPreserve?: readonly boolean[];\n}\n\nexport function computePreservedLayoutDepth(\n from: LayoutStack,\n to: LayoutStack,\n options: NavigationOptions = {},\n): number {\n const maxDepth = Math.min(from.layoutPaths.length, to.layoutPaths.length);\n let depth = 0;\n for (let index = 0; index < maxDepth; index += 1) {\n if (from.layoutPaths[index] !== to.layoutPaths[index]) break;\n if (from.layoutControllers?.[index] !== to.layoutControllers?.[index]) break;\n if (options.preserveLayouts === false) break;\n if (\n options.preserveLayouts !== true &&\n (from.layoutPreserve?.[index] !== true || to.layoutPreserve?.[index] !== true)\n ) {\n break;\n }\n depth += 1;\n }\n return depth;\n}\n"],"mappings":"AA0BO,SAAS,4BACd,MACA,IACA,UAA6B,CAAC,GACtB;AACR,QAAM,WAAW,KAAK,IAAI,KAAK,YAAY,QAAQ,GAAG,YAAY,MAAM;AACxE,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAAG;AAChD,QAAI,KAAK,YAAY,KAAK,MAAM,GAAG,YAAY,KAAK,EAAG;AACvD,QAAI,KAAK,oBAAoB,KAAK,MAAM,GAAG,oBAAoB,KAAK,EAAG;AACvE,QAAI,QAAQ,oBAAoB,MAAO;AACvC,QACE,QAAQ,oBAAoB,SAC3B,KAAK,iBAAiB,KAAK,MAAM,QAAQ,GAAG,iBAAiB,KAAK,MAAM,OACzE;AACA;AAAA,IACF;AACA,aAAS;AAAA,EACX;AACA,SAAO;AACT;","names":[]}
@@ -25,10 +25,12 @@ __export(get_container_exports, {
25
25
  module.exports = __toCommonJS(get_container_exports);
26
26
  var import_ioc = require("@noego/ioc");
27
27
  var import_logger = require("@noego/logger");
28
+ var import_runtime_capabilities = require("./runtime_capabilities.js");
28
29
  const logger = (0, import_logger.getLogger)("wood:runtime:container");
29
30
  const CONTAINER_REGISTRY_SYMBOL = /* @__PURE__ */ Symbol.for("@noego/wood.container.registry");
30
31
  function createWoodRoot(options = {}) {
31
32
  const root = (0, import_ioc.createContainer)();
33
+ (0, import_runtime_capabilities.installRuntimeCapabilities)(root);
32
34
  options.configure?.(root);
33
35
  return root;
34
36
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/get_container.ts"],"sourcesContent":["import { createContainer } from '@noego/ioc';\nimport type { IContainer } from '@noego/ioc';\nimport { getLogger } from '@noego/logger';\n\nconst logger = getLogger('wood:runtime:container');\n\nconst CONTAINER_REGISTRY_SYMBOL = Symbol.for('@noego/wood.container.registry');\n\nexport interface GetContainerOptions {\n /** Scope key for the container instance. Defaults to process.cwd(). */\n scope?: string;\n /** Called only when a new scoped container is created. */\n configure?: (container: any) => void;\n}\n\nexport interface CreateWoodRootOptions {\n /** Applied to the fresh root before it is returned. */\n configure?: (container: IContainer) => void;\n}\n\n/**\n * Create an explicit Wood composition root: a fresh real `@noego/ioc`\n * container owned by the caller. This is the canonical construction path —\n * runtime boot, tests, and tools receive/create a root explicitly and pass\n * it down; operation/renderer scopes are children of it.\n *\n * Decorator metadata uses `Symbol.for(...)` keys and the global\n * reflect-metadata registry, so consumer-decorated classes resolve\n * correctly regardless of which package instance created the container —\n * the old `createRequire` consumer-package resolution is unnecessary.\n */\nexport function createWoodRoot(options: CreateWoodRootOptions = {}): IContainer {\n const root = createContainer() as IContainer;\n options.configure?.(root);\n return root;\n}\n\ntype ContainerRegistry = Map<string, any>;\n\nfunction registry(): ContainerRegistry {\n const globalObj = globalThis as typeof globalThis & {\n [CONTAINER_REGISTRY_SYMBOL]?: ContainerRegistry;\n };\n\n if (!globalObj[CONTAINER_REGISTRY_SYMBOL]) {\n globalObj[CONTAINER_REGISTRY_SYMBOL] = new Map<string, any>();\n logger.info('container registry created', { symbol: CONTAINER_REGISTRY_SYMBOL.toString() });\n }\n\n return globalObj[CONTAINER_REGISTRY_SYMBOL]!;\n}\n\n/**\n * COMPAT: return a process-global scoped container from the registry.\n *\n * The canonical architecture owns an explicit root (see createWoodRoot);\n * this global accessor remains as a runtime-boundary convenience while\n * consumers migrate. Note its known trap: `configure` runs only on first\n * creation for a scope key.\n */\nexport function getContainer(options: GetContainerOptions = {}): any {\n const scope = options.scope ?? process.cwd();\n const containers = registry();\n\n const existing = containers.get(scope);\n if (existing) {\n logger.info('container reused', { scope });\n return existing;\n }\n\n const created = createWoodRoot();\n containers.set(scope, created);\n logger.info('container created', { scope });\n\n if (options.configure) {\n options.configure(created);\n logger.info('container configured', { scope });\n }\n\n return created;\n}\n\nexport function clearContainerRegistryForTests(): void {\n const containers = registry();\n containers.clear();\n logger.info('container registry cleared');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAgC;AAEhC,oBAA0B;AAE1B,MAAM,aAAS,yBAAU,wBAAwB;AAEjD,MAAM,4BAA4B,uBAAO,IAAI,gCAAgC;AAyBtE,SAAS,eAAe,UAAiC,CAAC,GAAe;AAC9E,QAAM,WAAO,4BAAgB;AAC7B,UAAQ,YAAY,IAAI;AACxB,SAAO;AACT;AAIA,SAAS,WAA8B;AACrC,QAAM,YAAY;AAIlB,MAAI,CAAC,UAAU,yBAAyB,GAAG;AACzC,cAAU,yBAAyB,IAAI,oBAAI,IAAiB;AAC5D,WAAO,KAAK,8BAA8B,EAAE,QAAQ,0BAA0B,SAAS,EAAE,CAAC;AAAA,EAC5F;AAEA,SAAO,UAAU,yBAAyB;AAC5C;AAUO,SAAS,aAAa,UAA+B,CAAC,GAAQ;AACnE,QAAM,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAC3C,QAAM,aAAa,SAAS;AAE5B,QAAM,WAAW,WAAW,IAAI,KAAK;AACrC,MAAI,UAAU;AACZ,WAAO,KAAK,oBAAoB,EAAE,MAAM,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,eAAe;AAC/B,aAAW,IAAI,OAAO,OAAO;AAC7B,SAAO,KAAK,qBAAqB,EAAE,MAAM,CAAC;AAE1C,MAAI,QAAQ,WAAW;AACrB,YAAQ,UAAU,OAAO;AACzB,WAAO,KAAK,wBAAwB,EAAE,MAAM,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEO,SAAS,iCAAuC;AACrD,QAAM,aAAa,SAAS;AAC5B,aAAW,MAAM;AACjB,SAAO,KAAK,4BAA4B;AAC1C;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/get_container.ts"],"sourcesContent":["import { createContainer } from '@noego/ioc';\nimport type { IContainer } from '@noego/ioc';\nimport { getLogger } from '@noego/logger';\nimport { installRuntimeCapabilities } from './runtime_capabilities.js';\n\nconst logger = getLogger('wood:runtime:container');\n\nconst CONTAINER_REGISTRY_SYMBOL = Symbol.for('@noego/wood.container.registry');\n\nexport interface GetContainerOptions {\n /** Scope key for the container instance. Defaults to process.cwd(). */\n scope?: string;\n /** Called only when a new scoped container is created. */\n configure?: (container: any) => void;\n}\n\nexport interface CreateWoodRootOptions {\n /** Applied to the fresh root before it is returned. */\n configure?: (container: IContainer) => void;\n}\n\n/**\n * Create an explicit Wood composition root: a fresh real `@noego/ioc`\n * container owned by the caller. This is the canonical construction path —\n * runtime boot, tests, and tools receive/create a root explicitly and pass\n * it down; operation/renderer scopes are children of it.\n *\n * Decorator metadata uses `Symbol.for(...)` keys and the global\n * reflect-metadata registry, so consumer-decorated classes resolve\n * correctly regardless of which package instance created the container —\n * the old `createRequire` consumer-package resolution is unnecessary.\n */\nexport function createWoodRoot(options: CreateWoodRootOptions = {}): IContainer {\n const root = createContainer() as IContainer;\n installRuntimeCapabilities(root);\n options.configure?.(root);\n return root;\n}\n\ntype ContainerRegistry = Map<string, any>;\n\nfunction registry(): ContainerRegistry {\n const globalObj = globalThis as typeof globalThis & {\n [CONTAINER_REGISTRY_SYMBOL]?: ContainerRegistry;\n };\n\n if (!globalObj[CONTAINER_REGISTRY_SYMBOL]) {\n globalObj[CONTAINER_REGISTRY_SYMBOL] = new Map<string, any>();\n logger.info('container registry created', { symbol: CONTAINER_REGISTRY_SYMBOL.toString() });\n }\n\n return globalObj[CONTAINER_REGISTRY_SYMBOL]!;\n}\n\n/**\n * COMPAT: return a process-global scoped container from the registry.\n *\n * The canonical architecture owns an explicit root (see createWoodRoot);\n * this global accessor remains as a runtime-boundary convenience while\n * consumers migrate. Note its known trap: `configure` runs only on first\n * creation for a scope key.\n */\nexport function getContainer(options: GetContainerOptions = {}): any {\n const scope = options.scope ?? process.cwd();\n const containers = registry();\n\n const existing = containers.get(scope);\n if (existing) {\n logger.info('container reused', { scope });\n return existing;\n }\n\n const created = createWoodRoot();\n containers.set(scope, created);\n logger.info('container created', { scope });\n\n if (options.configure) {\n options.configure(created);\n logger.info('container configured', { scope });\n }\n\n return created;\n}\n\nexport function clearContainerRegistryForTests(): void {\n const containers = registry();\n containers.clear();\n logger.info('container registry cleared');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAgC;AAEhC,oBAA0B;AAC1B,kCAA2C;AAE3C,MAAM,aAAS,yBAAU,wBAAwB;AAEjD,MAAM,4BAA4B,uBAAO,IAAI,gCAAgC;AAyBtE,SAAS,eAAe,UAAiC,CAAC,GAAe;AAC9E,QAAM,WAAO,4BAAgB;AAC7B,8DAA2B,IAAI;AAC/B,UAAQ,YAAY,IAAI;AACxB,SAAO;AACT;AAIA,SAAS,WAA8B;AACrC,QAAM,YAAY;AAIlB,MAAI,CAAC,UAAU,yBAAyB,GAAG;AACzC,cAAU,yBAAyB,IAAI,oBAAI,IAAiB;AAC5D,WAAO,KAAK,8BAA8B,EAAE,QAAQ,0BAA0B,SAAS,EAAE,CAAC;AAAA,EAC5F;AAEA,SAAO,UAAU,yBAAyB;AAC5C;AAUO,SAAS,aAAa,UAA+B,CAAC,GAAQ;AACnE,QAAM,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAC3C,QAAM,aAAa,SAAS;AAE5B,QAAM,WAAW,WAAW,IAAI,KAAK;AACrC,MAAI,UAAU;AACZ,WAAO,KAAK,oBAAoB,EAAE,MAAM,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,eAAe;AAC/B,aAAW,IAAI,OAAO,OAAO;AAC7B,SAAO,KAAK,qBAAqB,EAAE,MAAM,CAAC;AAE1C,MAAI,QAAQ,WAAW;AACrB,YAAQ,UAAU,OAAO;AACzB,WAAO,KAAK,wBAAwB,EAAE,MAAM,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEO,SAAS,iCAAuC;AACrD,QAAM,aAAa,SAAS;AAC5B,aAAW,MAAM;AACjB,SAAO,KAAK,4BAA4B;AAC1C;","names":[]}
@@ -1,9 +1,11 @@
1
1
  import { createContainer } from "@noego/ioc";
2
2
  import { getLogger } from "@noego/logger";
3
+ import { installRuntimeCapabilities } from "./runtime_capabilities.js";
3
4
  const logger = getLogger("wood:runtime:container");
4
5
  const CONTAINER_REGISTRY_SYMBOL = /* @__PURE__ */ Symbol.for("@noego/wood.container.registry");
5
6
  function createWoodRoot(options = {}) {
6
7
  const root = createContainer();
8
+ installRuntimeCapabilities(root);
7
9
  options.configure?.(root);
8
10
  return root;
9
11
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/get_container.ts"],"sourcesContent":["import { createContainer } from '@noego/ioc';\nimport type { IContainer } from '@noego/ioc';\nimport { getLogger } from '@noego/logger';\n\nconst logger = getLogger('wood:runtime:container');\n\nconst CONTAINER_REGISTRY_SYMBOL = Symbol.for('@noego/wood.container.registry');\n\nexport interface GetContainerOptions {\n /** Scope key for the container instance. Defaults to process.cwd(). */\n scope?: string;\n /** Called only when a new scoped container is created. */\n configure?: (container: any) => void;\n}\n\nexport interface CreateWoodRootOptions {\n /** Applied to the fresh root before it is returned. */\n configure?: (container: IContainer) => void;\n}\n\n/**\n * Create an explicit Wood composition root: a fresh real `@noego/ioc`\n * container owned by the caller. This is the canonical construction path —\n * runtime boot, tests, and tools receive/create a root explicitly and pass\n * it down; operation/renderer scopes are children of it.\n *\n * Decorator metadata uses `Symbol.for(...)` keys and the global\n * reflect-metadata registry, so consumer-decorated classes resolve\n * correctly regardless of which package instance created the container —\n * the old `createRequire` consumer-package resolution is unnecessary.\n */\nexport function createWoodRoot(options: CreateWoodRootOptions = {}): IContainer {\n const root = createContainer() as IContainer;\n options.configure?.(root);\n return root;\n}\n\ntype ContainerRegistry = Map<string, any>;\n\nfunction registry(): ContainerRegistry {\n const globalObj = globalThis as typeof globalThis & {\n [CONTAINER_REGISTRY_SYMBOL]?: ContainerRegistry;\n };\n\n if (!globalObj[CONTAINER_REGISTRY_SYMBOL]) {\n globalObj[CONTAINER_REGISTRY_SYMBOL] = new Map<string, any>();\n logger.info('container registry created', { symbol: CONTAINER_REGISTRY_SYMBOL.toString() });\n }\n\n return globalObj[CONTAINER_REGISTRY_SYMBOL]!;\n}\n\n/**\n * COMPAT: return a process-global scoped container from the registry.\n *\n * The canonical architecture owns an explicit root (see createWoodRoot);\n * this global accessor remains as a runtime-boundary convenience while\n * consumers migrate. Note its known trap: `configure` runs only on first\n * creation for a scope key.\n */\nexport function getContainer(options: GetContainerOptions = {}): any {\n const scope = options.scope ?? process.cwd();\n const containers = registry();\n\n const existing = containers.get(scope);\n if (existing) {\n logger.info('container reused', { scope });\n return existing;\n }\n\n const created = createWoodRoot();\n containers.set(scope, created);\n logger.info('container created', { scope });\n\n if (options.configure) {\n options.configure(created);\n logger.info('container configured', { scope });\n }\n\n return created;\n}\n\nexport function clearContainerRegistryForTests(): void {\n const containers = registry();\n containers.clear();\n logger.info('container registry cleared');\n}\n"],"mappings":"AAAA,SAAS,uBAAuB;AAEhC,SAAS,iBAAiB;AAE1B,MAAM,SAAS,UAAU,wBAAwB;AAEjD,MAAM,4BAA4B,uBAAO,IAAI,gCAAgC;AAyBtE,SAAS,eAAe,UAAiC,CAAC,GAAe;AAC9E,QAAM,OAAO,gBAAgB;AAC7B,UAAQ,YAAY,IAAI;AACxB,SAAO;AACT;AAIA,SAAS,WAA8B;AACrC,QAAM,YAAY;AAIlB,MAAI,CAAC,UAAU,yBAAyB,GAAG;AACzC,cAAU,yBAAyB,IAAI,oBAAI,IAAiB;AAC5D,WAAO,KAAK,8BAA8B,EAAE,QAAQ,0BAA0B,SAAS,EAAE,CAAC;AAAA,EAC5F;AAEA,SAAO,UAAU,yBAAyB;AAC5C;AAUO,SAAS,aAAa,UAA+B,CAAC,GAAQ;AACnE,QAAM,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAC3C,QAAM,aAAa,SAAS;AAE5B,QAAM,WAAW,WAAW,IAAI,KAAK;AACrC,MAAI,UAAU;AACZ,WAAO,KAAK,oBAAoB,EAAE,MAAM,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,eAAe;AAC/B,aAAW,IAAI,OAAO,OAAO;AAC7B,SAAO,KAAK,qBAAqB,EAAE,MAAM,CAAC;AAE1C,MAAI,QAAQ,WAAW;AACrB,YAAQ,UAAU,OAAO;AACzB,WAAO,KAAK,wBAAwB,EAAE,MAAM,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEO,SAAS,iCAAuC;AACrD,QAAM,aAAa,SAAS;AAC5B,aAAW,MAAM;AACjB,SAAO,KAAK,4BAA4B;AAC1C;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/get_container.ts"],"sourcesContent":["import { createContainer } from '@noego/ioc';\nimport type { IContainer } from '@noego/ioc';\nimport { getLogger } from '@noego/logger';\nimport { installRuntimeCapabilities } from './runtime_capabilities.js';\n\nconst logger = getLogger('wood:runtime:container');\n\nconst CONTAINER_REGISTRY_SYMBOL = Symbol.for('@noego/wood.container.registry');\n\nexport interface GetContainerOptions {\n /** Scope key for the container instance. Defaults to process.cwd(). */\n scope?: string;\n /** Called only when a new scoped container is created. */\n configure?: (container: any) => void;\n}\n\nexport interface CreateWoodRootOptions {\n /** Applied to the fresh root before it is returned. */\n configure?: (container: IContainer) => void;\n}\n\n/**\n * Create an explicit Wood composition root: a fresh real `@noego/ioc`\n * container owned by the caller. This is the canonical construction path —\n * runtime boot, tests, and tools receive/create a root explicitly and pass\n * it down; operation/renderer scopes are children of it.\n *\n * Decorator metadata uses `Symbol.for(...)` keys and the global\n * reflect-metadata registry, so consumer-decorated classes resolve\n * correctly regardless of which package instance created the container —\n * the old `createRequire` consumer-package resolution is unnecessary.\n */\nexport function createWoodRoot(options: CreateWoodRootOptions = {}): IContainer {\n const root = createContainer() as IContainer;\n installRuntimeCapabilities(root);\n options.configure?.(root);\n return root;\n}\n\ntype ContainerRegistry = Map<string, any>;\n\nfunction registry(): ContainerRegistry {\n const globalObj = globalThis as typeof globalThis & {\n [CONTAINER_REGISTRY_SYMBOL]?: ContainerRegistry;\n };\n\n if (!globalObj[CONTAINER_REGISTRY_SYMBOL]) {\n globalObj[CONTAINER_REGISTRY_SYMBOL] = new Map<string, any>();\n logger.info('container registry created', { symbol: CONTAINER_REGISTRY_SYMBOL.toString() });\n }\n\n return globalObj[CONTAINER_REGISTRY_SYMBOL]!;\n}\n\n/**\n * COMPAT: return a process-global scoped container from the registry.\n *\n * The canonical architecture owns an explicit root (see createWoodRoot);\n * this global accessor remains as a runtime-boundary convenience while\n * consumers migrate. Note its known trap: `configure` runs only on first\n * creation for a scope key.\n */\nexport function getContainer(options: GetContainerOptions = {}): any {\n const scope = options.scope ?? process.cwd();\n const containers = registry();\n\n const existing = containers.get(scope);\n if (existing) {\n logger.info('container reused', { scope });\n return existing;\n }\n\n const created = createWoodRoot();\n containers.set(scope, created);\n logger.info('container created', { scope });\n\n if (options.configure) {\n options.configure(created);\n logger.info('container configured', { scope });\n }\n\n return created;\n}\n\nexport function clearContainerRegistryForTests(): void {\n const containers = registry();\n containers.clear();\n logger.info('container registry cleared');\n}\n"],"mappings":"AAAA,SAAS,uBAAuB;AAEhC,SAAS,iBAAiB;AAC1B,SAAS,kCAAkC;AAE3C,MAAM,SAAS,UAAU,wBAAwB;AAEjD,MAAM,4BAA4B,uBAAO,IAAI,gCAAgC;AAyBtE,SAAS,eAAe,UAAiC,CAAC,GAAe;AAC9E,QAAM,OAAO,gBAAgB;AAC7B,6BAA2B,IAAI;AAC/B,UAAQ,YAAY,IAAI;AACxB,SAAO;AACT;AAIA,SAAS,WAA8B;AACrC,QAAM,YAAY;AAIlB,MAAI,CAAC,UAAU,yBAAyB,GAAG;AACzC,cAAU,yBAAyB,IAAI,oBAAI,IAAiB;AAC5D,WAAO,KAAK,8BAA8B,EAAE,QAAQ,0BAA0B,SAAS,EAAE,CAAC;AAAA,EAC5F;AAEA,SAAO,UAAU,yBAAyB;AAC5C;AAUO,SAAS,aAAa,UAA+B,CAAC,GAAQ;AACnE,QAAM,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAC3C,QAAM,aAAa,SAAS;AAE5B,QAAM,WAAW,WAAW,IAAI,KAAK;AACrC,MAAI,UAAU;AACZ,WAAO,KAAK,oBAAoB,EAAE,MAAM,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,eAAe;AAC/B,aAAW,IAAI,OAAO,OAAO;AAC7B,SAAO,KAAK,qBAAqB,EAAE,MAAM,CAAC;AAE1C,MAAI,QAAQ,WAAW;AACrB,YAAQ,UAAU,OAAO;AACzB,WAAO,KAAK,wBAAwB,EAAE,MAAM,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEO,SAAS,iCAAuC;AACrD,QAAM,aAAa,SAAS;AAC5B,aAAW,MAAM;AACjB,SAAO,KAAK,4BAA4B;AAC1C;","names":[]}
@@ -19,6 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var runtime_exports = {};
20
20
  __export(runtime_exports, {
21
21
  ControllerResolver: () => import_runtime_module.ControllerResolver,
22
+ FETCH_RUNTIME: () => import_fetch.FETCH_RUNTIME,
22
23
  MiddlewareResolver: () => import_runtime_module.MiddlewareResolver,
23
24
  RendererLogDispatcher: () => import_renderer_log_dispatcher.RendererLogDispatcher,
24
25
  SchemaValidator: () => import_runtime_module.SchemaValidator,
@@ -31,6 +32,7 @@ __export(runtime_exports, {
31
32
  dispatchRendererTracePayload: () => import_tracing.dispatchRendererTracePayload,
32
33
  getApplicationRoot: () => import_application_root.getApplicationRoot,
33
34
  getContainer: () => import_get_container.getContainer,
35
+ getFetchRuntime: () => import_fetch.getFetchRuntime,
34
36
  getRendererConfigExtension: () => import_renderer_config_extension.getRendererConfigExtension,
35
37
  getRendererLogDispatcher: () => import_renderer_log_dispatcher.getRendererLogDispatcher,
36
38
  getRendererTraceBatchReceiver: () => import_renderer_trace_batch_receiver_registry.getRendererTraceBatchReceiver,
@@ -50,9 +52,11 @@ var import_renderer_trace_batch_receiver_registry = require("./renderer_trace_ba
50
52
  var import_renderer_config_extension = require("./renderer_config_extension.js");
51
53
  var import_tracing = require("../tracing/index.js");
52
54
  var import_runtime_module = require("./runtime_module.js");
55
+ var import_fetch = require("../fetch.js");
53
56
  // Annotate the CommonJS export names for ESM import in node:
54
57
  0 && (module.exports = {
55
58
  ControllerResolver,
59
+ FETCH_RUNTIME,
56
60
  MiddlewareResolver,
57
61
  RendererLogDispatcher,
58
62
  SchemaValidator,
@@ -65,6 +69,7 @@ var import_runtime_module = require("./runtime_module.js");
65
69
  dispatchRendererTracePayload,
66
70
  getApplicationRoot,
67
71
  getContainer,
72
+ getFetchRuntime,
68
73
  getRendererConfigExtension,
69
74
  getRendererLogDispatcher,
70
75
  getRendererTraceBatchReceiver,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["export { createWoodRoot, getContainer, clearContainerRegistryForTests } from './get_container.js';\nexport type { GetContainerOptions, CreateWoodRootOptions } from './get_container.js';\n\nexport {\n getApplicationRoot,\n setApplicationRoot,\n clearApplicationRootForTests,\n} from './application_root.js';\n\nexport { runtime } from './runtime.js';\nexport type { RuntimeOptions, RuntimeResult, RegisterRuntimeRouter } from './runtime.js';\n\nexport {\n getRendererLogDispatcher,\n RendererLogDispatcher,\n clearRendererLogDispatcherForTests,\n} from './renderer_log_dispatcher.js';\nexport type {\n RendererLogLevel,\n RendererLogEntry,\n RendererLogCallback,\n RendererLogDispatchResult,\n} from './renderer_log_dispatcher.js';\n\nexport {\n clearRendererTraceBatchReceiverForTests,\n getRendererTraceBatchReceiver,\n setRendererTraceBatchReceiver,\n} from './renderer_trace_batch_receiver_registry.js';\n\nexport {\n getRendererConfigExtension,\n resolveRendererConfigExtension,\n setRendererConfigExtension,\n} from './renderer_config_extension.js';\nexport type { RendererConfigExtension } from './renderer_config_extension.js';\n\nexport { dispatchRendererTracePayload } from '../tracing/index.js';\nexport type { TraceDispatchResult } from '../tracing/index.js';\n\nexport { installWoodRuntime, WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver } from './runtime_module.js';\nexport type { WoodRuntimeModuleOptions } from './runtime_module.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAA6E;AAG7E,8BAIO;AAEP,qBAAwB;AAGxB,qCAIO;AAQP,oDAIO;AAEP,uCAIO;AAGP,qBAA6C;AAG7C,4BAAwG;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["export { createWoodRoot, getContainer, clearContainerRegistryForTests } from './get_container.js';\nexport type { GetContainerOptions, CreateWoodRootOptions } from './get_container.js';\n\nexport {\n getApplicationRoot,\n setApplicationRoot,\n clearApplicationRootForTests,\n} from './application_root.js';\n\nexport { runtime } from './runtime.js';\nexport type { RuntimeOptions, RuntimeResult, RegisterRuntimeRouter } from './runtime.js';\n\nexport {\n getRendererLogDispatcher,\n RendererLogDispatcher,\n clearRendererLogDispatcherForTests,\n} from './renderer_log_dispatcher.js';\nexport type {\n RendererLogLevel,\n RendererLogEntry,\n RendererLogCallback,\n RendererLogDispatchResult,\n} from './renderer_log_dispatcher.js';\n\nexport {\n clearRendererTraceBatchReceiverForTests,\n getRendererTraceBatchReceiver,\n setRendererTraceBatchReceiver,\n} from './renderer_trace_batch_receiver_registry.js';\n\nexport {\n getRendererConfigExtension,\n resolveRendererConfigExtension,\n setRendererConfigExtension,\n} from './renderer_config_extension.js';\nexport type { RendererConfigExtension } from './renderer_config_extension.js';\n\nexport { dispatchRendererTracePayload } from '../tracing/index.js';\nexport type { TraceDispatchResult } from '../tracing/index.js';\n\nexport { installWoodRuntime, WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver } from './runtime_module.js';\nexport type { WoodRuntimeModuleOptions } from './runtime_module.js';\n\nexport { getFetchRuntime, FETCH_RUNTIME } from '../fetch.js';\nexport type { FetchRuntime } from '../fetch.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAA6E;AAG7E,8BAIO;AAEP,qBAAwB;AAGxB,qCAIO;AAQP,oDAIO;AAEP,uCAIO;AAGP,qBAA6C;AAG7C,4BAAwG;AAGxG,mBAA+C;","names":[]}
@@ -6,7 +6,9 @@ export { clearRendererTraceBatchReceiverForTests, getRendererTraceBatchReceiver,
6
6
  export { RendererConfigExtension, getRendererConfigExtension, resolveRendererConfigExtension, setRendererConfigExtension } from './renderer_config_extension.cjs';
7
7
  export { T as TraceDispatchResult, o as dispatchRendererTracePayload } from '../trace_hub-Cpo_nVze.cjs';
8
8
  export { WoodRuntimeModuleOptions, installWoodRuntime } from './runtime_module.cjs';
9
+ export { getFetchRuntime } from '../fetch.cjs';
9
10
  export { ControllerResolver } from '../controller/controller_resolver.cjs';
11
+ export { FETCH_RUNTIME, FetchRuntime } from '@noego/runtime/fetch';
10
12
  export { MiddlewareResolver } from '../middleware/middleware_resolver.cjs';
11
13
  export { SchemaValidator } from '../validation/schema_validator.cjs';
12
14
  export { WoodRouter } from '../router/wood_router.cjs';
@@ -6,7 +6,9 @@ export { clearRendererTraceBatchReceiverForTests, getRendererTraceBatchReceiver,
6
6
  export { RendererConfigExtension, getRendererConfigExtension, resolveRendererConfigExtension, setRendererConfigExtension } from './renderer_config_extension.js';
7
7
  export { T as TraceDispatchResult, o as dispatchRendererTracePayload } from '../trace_hub-Cpo_nVze.js';
8
8
  export { WoodRuntimeModuleOptions, installWoodRuntime } from './runtime_module.js';
9
+ export { getFetchRuntime } from '../fetch.js';
9
10
  export { ControllerResolver } from '../controller/controller_resolver.js';
11
+ export { FETCH_RUNTIME, FetchRuntime } from '@noego/runtime/fetch';
10
12
  export { MiddlewareResolver } from '../middleware/middleware_resolver.js';
11
13
  export { SchemaValidator } from '../validation/schema_validator.js';
12
14
  export { WoodRouter } from '../router/wood_router.js';
@@ -22,8 +22,10 @@ import {
22
22
  } from "./renderer_config_extension.js";
23
23
  import { dispatchRendererTracePayload } from "../tracing/index.js";
24
24
  import { installWoodRuntime, WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver } from "./runtime_module.js";
25
+ import { getFetchRuntime, FETCH_RUNTIME } from "../fetch.js";
25
26
  export {
26
27
  ControllerResolver,
28
+ FETCH_RUNTIME,
27
29
  MiddlewareResolver,
28
30
  RendererLogDispatcher,
29
31
  SchemaValidator,
@@ -36,6 +38,7 @@ export {
36
38
  dispatchRendererTracePayload,
37
39
  getApplicationRoot,
38
40
  getContainer,
41
+ getFetchRuntime,
39
42
  getRendererConfigExtension,
40
43
  getRendererLogDispatcher,
41
44
  getRendererTraceBatchReceiver,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["export { createWoodRoot, getContainer, clearContainerRegistryForTests } from './get_container.js';\nexport type { GetContainerOptions, CreateWoodRootOptions } from './get_container.js';\n\nexport {\n getApplicationRoot,\n setApplicationRoot,\n clearApplicationRootForTests,\n} from './application_root.js';\n\nexport { runtime } from './runtime.js';\nexport type { RuntimeOptions, RuntimeResult, RegisterRuntimeRouter } from './runtime.js';\n\nexport {\n getRendererLogDispatcher,\n RendererLogDispatcher,\n clearRendererLogDispatcherForTests,\n} from './renderer_log_dispatcher.js';\nexport type {\n RendererLogLevel,\n RendererLogEntry,\n RendererLogCallback,\n RendererLogDispatchResult,\n} from './renderer_log_dispatcher.js';\n\nexport {\n clearRendererTraceBatchReceiverForTests,\n getRendererTraceBatchReceiver,\n setRendererTraceBatchReceiver,\n} from './renderer_trace_batch_receiver_registry.js';\n\nexport {\n getRendererConfigExtension,\n resolveRendererConfigExtension,\n setRendererConfigExtension,\n} from './renderer_config_extension.js';\nexport type { RendererConfigExtension } from './renderer_config_extension.js';\n\nexport { dispatchRendererTracePayload } from '../tracing/index.js';\nexport type { TraceDispatchResult } from '../tracing/index.js';\n\nexport { installWoodRuntime, WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver } from './runtime_module.js';\nexport type { WoodRuntimeModuleOptions } from './runtime_module.js';\n"],"mappings":"AAAA,SAAS,gBAAgB,cAAc,sCAAsC;AAG7E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,eAAe;AAGxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,oCAAoC;AAG7C,SAAS,oBAAoB,YAAY,iBAAiB,oBAAoB,0BAA0B;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["export { createWoodRoot, getContainer, clearContainerRegistryForTests } from './get_container.js';\nexport type { GetContainerOptions, CreateWoodRootOptions } from './get_container.js';\n\nexport {\n getApplicationRoot,\n setApplicationRoot,\n clearApplicationRootForTests,\n} from './application_root.js';\n\nexport { runtime } from './runtime.js';\nexport type { RuntimeOptions, RuntimeResult, RegisterRuntimeRouter } from './runtime.js';\n\nexport {\n getRendererLogDispatcher,\n RendererLogDispatcher,\n clearRendererLogDispatcherForTests,\n} from './renderer_log_dispatcher.js';\nexport type {\n RendererLogLevel,\n RendererLogEntry,\n RendererLogCallback,\n RendererLogDispatchResult,\n} from './renderer_log_dispatcher.js';\n\nexport {\n clearRendererTraceBatchReceiverForTests,\n getRendererTraceBatchReceiver,\n setRendererTraceBatchReceiver,\n} from './renderer_trace_batch_receiver_registry.js';\n\nexport {\n getRendererConfigExtension,\n resolveRendererConfigExtension,\n setRendererConfigExtension,\n} from './renderer_config_extension.js';\nexport type { RendererConfigExtension } from './renderer_config_extension.js';\n\nexport { dispatchRendererTracePayload } from '../tracing/index.js';\nexport type { TraceDispatchResult } from '../tracing/index.js';\n\nexport { installWoodRuntime, WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver } from './runtime_module.js';\nexport type { WoodRuntimeModuleOptions } from './runtime_module.js';\n\nexport { getFetchRuntime, FETCH_RUNTIME } from '../fetch.js';\nexport type { FetchRuntime } from '../fetch.js';\n"],"mappings":"AAAA,SAAS,gBAAgB,cAAc,sCAAsC;AAG7E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,eAAe;AAGxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,oCAAoC;AAG7C,SAAS,oBAAoB,YAAY,iBAAiB,oBAAoB,0BAA0B;AAGxG,SAAS,iBAAiB,qBAAqB;","names":[]}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var runtime_capabilities_exports = {};
20
+ __export(runtime_capabilities_exports, {
21
+ installRuntimeCapabilities: () => installRuntimeCapabilities
22
+ });
23
+ module.exports = __toCommonJS(runtime_capabilities_exports);
24
+ var import_ioc = require("@noego/ioc");
25
+ var import_fetch = require("@noego/runtime/fetch");
26
+ function installRuntimeCapabilities(root) {
27
+ if (!root.isRegistered(import_fetch.FETCH_RUNTIME)) {
28
+ root.registerFunction(import_fetch.FETCH_RUNTIME, import_fetch.nativeFetchRuntime, { loadAs: import_ioc.LoadAs.Singleton });
29
+ }
30
+ }
31
+ // Annotate the CommonJS export names for ESM import in node:
32
+ 0 && (module.exports = {
33
+ installRuntimeCapabilities
34
+ });
35
+ //# sourceMappingURL=runtime_capabilities.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/runtime_capabilities.ts"],"sourcesContent":["import { LoadAs, type IContainer } from '@noego/ioc';\nimport { FETCH_RUNTIME, nativeFetchRuntime } from '@noego/runtime/fetch';\n\n/** Baseline host capabilities, independent of router or Electron startup. */\nexport function installRuntimeCapabilities(root: IContainer): void {\n if (!root.isRegistered(FETCH_RUNTIME)) {\n root.registerFunction(FETCH_RUNTIME, nativeFetchRuntime, { loadAs: LoadAs.Singleton });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAwC;AACxC,mBAAkD;AAG3C,SAAS,2BAA2B,MAAwB;AACjE,MAAI,CAAC,KAAK,aAAa,0BAAa,GAAG;AACrC,SAAK,iBAAiB,4BAAe,iCAAoB,EAAE,QAAQ,kBAAO,UAAU,CAAC;AAAA,EACvF;AACF;","names":[]}
@@ -0,0 +1,6 @@
1
+ import { IContainer } from '@noego/ioc';
2
+
3
+ /** Baseline host capabilities, independent of router or Electron startup. */
4
+ declare function installRuntimeCapabilities(root: IContainer): void;
5
+
6
+ export { installRuntimeCapabilities };
@@ -0,0 +1,6 @@
1
+ import { IContainer } from '@noego/ioc';
2
+
3
+ /** Baseline host capabilities, independent of router or Electron startup. */
4
+ declare function installRuntimeCapabilities(root: IContainer): void;
5
+
6
+ export { installRuntimeCapabilities };
@@ -0,0 +1,11 @@
1
+ import { LoadAs } from "@noego/ioc";
2
+ import { FETCH_RUNTIME, nativeFetchRuntime } from "@noego/runtime/fetch";
3
+ function installRuntimeCapabilities(root) {
4
+ if (!root.isRegistered(FETCH_RUNTIME)) {
5
+ root.registerFunction(FETCH_RUNTIME, nativeFetchRuntime, { loadAs: LoadAs.Singleton });
6
+ }
7
+ }
8
+ export {
9
+ installRuntimeCapabilities
10
+ };
11
+ //# sourceMappingURL=runtime_capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/runtime_capabilities.ts"],"sourcesContent":["import { LoadAs, type IContainer } from '@noego/ioc';\nimport { FETCH_RUNTIME, nativeFetchRuntime } from '@noego/runtime/fetch';\n\n/** Baseline host capabilities, independent of router or Electron startup. */\nexport function installRuntimeCapabilities(root: IContainer): void {\n if (!root.isRegistered(FETCH_RUNTIME)) {\n root.registerFunction(FETCH_RUNTIME, nativeFetchRuntime, { loadAs: LoadAs.Singleton });\n }\n}\n"],"mappings":"AAAA,SAAS,cAA+B;AACxC,SAAS,eAAe,0BAA0B;AAG3C,SAAS,2BAA2B,MAAwB;AACjE,MAAI,CAAC,KAAK,aAAa,aAAa,GAAG;AACrC,SAAK,iBAAiB,eAAe,oBAAoB,EAAE,QAAQ,OAAO,UAAU,CAAC;AAAA,EACvF;AACF;","names":[]}
@@ -25,6 +25,7 @@ __export(runtime_module_exports, {
25
25
  installWoodRuntime: () => installWoodRuntime
26
26
  });
27
27
  module.exports = __toCommonJS(runtime_module_exports);
28
+ var import_runtime_capabilities = require("./runtime_capabilities.js");
28
29
  var import_ioc = require("@noego/ioc");
29
30
  var import_wood_router = require("../router/wood_router.js");
30
31
  var import_schema_validator = require("../validation/schema_validator.js");
@@ -34,6 +35,7 @@ function installWoodRuntime(root, options) {
34
35
  if (typeof root.isRegistered !== "function" || typeof root.registerFunction !== "function") {
35
36
  throw new Error("Wood runtime requires an explicit IoC root; use createWoodRoot().");
36
37
  }
38
+ (0, import_runtime_capabilities.installRuntimeCapabilities)(root);
37
39
  if (!root.isRegistered(import_schema_validator.SchemaValidator)) root.registerFunction(import_schema_validator.SchemaValidator, () => new import_schema_validator.SchemaValidator());
38
40
  if (!root.isRegistered(import_middleware_resolver.MiddlewareResolver)) root.registerFunction(import_middleware_resolver.MiddlewareResolver, () => new import_middleware_resolver.MiddlewareResolver(options.middlewareDir));
39
41
  if (!root.isRegistered(import_controller_resolver.ControllerResolver)) root.registerFunction(import_controller_resolver.ControllerResolver, () => new import_controller_resolver.ControllerResolver(options.controllersDir, { mode: options.mode }));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/runtime_module.ts"],"sourcesContent":["import { LoadAs, type IContainer } from '@noego/ioc';\nimport { WoodRouter } from '../router/wood_router.js';\nimport { SchemaValidator } from '../validation/schema_validator.js';\nimport { MiddlewareResolver } from '../middleware/middleware_resolver.js';\nimport { ControllerResolver } from '../controller/controller_resolver.js';\n\nexport interface WoodRuntimeModuleOptions {\n controllersDir: string;\n middlewareDir: string;\n mode?: 'bundled' | 'dev';\n registerRuntime(router: WoodRouter): void;\n}\n\n/**\n * Registration-only production module, also installed by testWood before\n * scenario overlays. Resolving WoodRouter starts the selected real pipeline.\n * Existing registrations remain authoritative; token identities are exact.\n */\nexport function installWoodRuntime(root: IContainer, options: WoodRuntimeModuleOptions): void {\n if (typeof root.isRegistered !== 'function' || typeof root.registerFunction !== 'function') {\n throw new Error('Wood runtime requires an explicit IoC root; use createWoodRoot().');\n }\n if (!root.isRegistered(SchemaValidator)) root.registerFunction(SchemaValidator, () => new SchemaValidator());\n if (!root.isRegistered(MiddlewareResolver)) root.registerFunction(MiddlewareResolver, () => new MiddlewareResolver(options.middlewareDir));\n if (!root.isRegistered(ControllerResolver)) root.registerFunction(ControllerResolver, () => new ControllerResolver(options.controllersDir, { mode: options.mode }));\n if (!root.isRegistered(WoodRouter)) {\n root.registerFunction(WoodRouter, (validator: SchemaValidator, middlewareResolver: MiddlewareResolver, controllerResolver: ControllerResolver) => {\n const router = new WoodRouter({ container: root, ...options, validator, middlewareResolver, controllerResolver });\n options.registerRuntime(router);\n router.validateControllers();\n router.precompileSchemas();\n return router;\n }, { loadAs: LoadAs.Scoped, param: [SchemaValidator, MiddlewareResolver, ControllerResolver] });\n }\n}\n\nexport { WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAwC;AACxC,yBAA2B;AAC3B,8BAAgC;AAChC,iCAAmC;AACnC,iCAAmC;AAc5B,SAAS,mBAAmB,MAAkB,SAAyC;AAC5F,MAAI,OAAO,KAAK,iBAAiB,cAAc,OAAO,KAAK,qBAAqB,YAAY;AAC1F,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,MAAI,CAAC,KAAK,aAAa,uCAAe,EAAG,MAAK,iBAAiB,yCAAiB,MAAM,IAAI,wCAAgB,CAAC;AAC3G,MAAI,CAAC,KAAK,aAAa,6CAAkB,EAAG,MAAK,iBAAiB,+CAAoB,MAAM,IAAI,8CAAmB,QAAQ,aAAa,CAAC;AACzI,MAAI,CAAC,KAAK,aAAa,6CAAkB,EAAG,MAAK,iBAAiB,+CAAoB,MAAM,IAAI,8CAAmB,QAAQ,gBAAgB,EAAE,MAAM,QAAQ,KAAK,CAAC,CAAC;AAClK,MAAI,CAAC,KAAK,aAAa,6BAAU,GAAG;AAClC,SAAK,iBAAiB,+BAAY,CAAC,WAA4B,oBAAwC,uBAA2C;AAChJ,YAAM,SAAS,IAAI,8BAAW,EAAE,WAAW,MAAM,GAAG,SAAS,WAAW,oBAAoB,mBAAmB,CAAC;AAChH,cAAQ,gBAAgB,MAAM;AAC9B,aAAO,oBAAoB;AAC3B,aAAO,kBAAkB;AACzB,aAAO;AAAA,IACT,GAAG,EAAE,QAAQ,kBAAO,QAAQ,OAAO,CAAC,yCAAiB,+CAAoB,6CAAkB,EAAE,CAAC;AAAA,EAChG;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/runtime_module.ts"],"sourcesContent":["import { installRuntimeCapabilities } from './runtime_capabilities.js';\nimport { LoadAs, type IContainer } from '@noego/ioc';\nimport { WoodRouter } from '../router/wood_router.js';\nimport { SchemaValidator } from '../validation/schema_validator.js';\nimport { MiddlewareResolver } from '../middleware/middleware_resolver.js';\nimport { ControllerResolver } from '../controller/controller_resolver.js';\n\nexport interface WoodRuntimeModuleOptions {\n controllersDir: string;\n middlewareDir: string;\n mode?: 'bundled' | 'dev';\n registerRuntime(router: WoodRouter): void;\n}\n\n/**\n * Registration-only production module, also installed by testWood before\n * scenario overlays. Resolving WoodRouter starts the selected real pipeline.\n * Existing registrations remain authoritative; token identities are exact.\n */\nexport function installWoodRuntime(root: IContainer, options: WoodRuntimeModuleOptions): void {\n if (typeof root.isRegistered !== 'function' || typeof root.registerFunction !== 'function') {\n throw new Error('Wood runtime requires an explicit IoC root; use createWoodRoot().');\n }\n installRuntimeCapabilities(root);\n if (!root.isRegistered(SchemaValidator)) root.registerFunction(SchemaValidator, () => new SchemaValidator());\n if (!root.isRegistered(MiddlewareResolver)) root.registerFunction(MiddlewareResolver, () => new MiddlewareResolver(options.middlewareDir));\n if (!root.isRegistered(ControllerResolver)) root.registerFunction(ControllerResolver, () => new ControllerResolver(options.controllersDir, { mode: options.mode }));\n if (!root.isRegistered(WoodRouter)) {\n root.registerFunction(WoodRouter, (validator: SchemaValidator, middlewareResolver: MiddlewareResolver, controllerResolver: ControllerResolver) => {\n const router = new WoodRouter({ container: root, ...options, validator, middlewareResolver, controllerResolver });\n options.registerRuntime(router);\n router.validateControllers();\n router.precompileSchemas();\n return router;\n }, { loadAs: LoadAs.Scoped, param: [SchemaValidator, MiddlewareResolver, ControllerResolver] });\n }\n}\n\nexport { WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAA2C;AAC3C,iBAAwC;AACxC,yBAA2B;AAC3B,8BAAgC;AAChC,iCAAmC;AACnC,iCAAmC;AAc5B,SAAS,mBAAmB,MAAkB,SAAyC;AAC5F,MAAI,OAAO,KAAK,iBAAiB,cAAc,OAAO,KAAK,qBAAqB,YAAY;AAC1F,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,8DAA2B,IAAI;AAC/B,MAAI,CAAC,KAAK,aAAa,uCAAe,EAAG,MAAK,iBAAiB,yCAAiB,MAAM,IAAI,wCAAgB,CAAC;AAC3G,MAAI,CAAC,KAAK,aAAa,6CAAkB,EAAG,MAAK,iBAAiB,+CAAoB,MAAM,IAAI,8CAAmB,QAAQ,aAAa,CAAC;AACzI,MAAI,CAAC,KAAK,aAAa,6CAAkB,EAAG,MAAK,iBAAiB,+CAAoB,MAAM,IAAI,8CAAmB,QAAQ,gBAAgB,EAAE,MAAM,QAAQ,KAAK,CAAC,CAAC;AAClK,MAAI,CAAC,KAAK,aAAa,6BAAU,GAAG;AAClC,SAAK,iBAAiB,+BAAY,CAAC,WAA4B,oBAAwC,uBAA2C;AAChJ,YAAM,SAAS,IAAI,8BAAW,EAAE,WAAW,MAAM,GAAG,SAAS,WAAW,oBAAoB,mBAAmB,CAAC;AAChH,cAAQ,gBAAgB,MAAM;AAC9B,aAAO,oBAAoB;AAC3B,aAAO,kBAAkB;AACzB,aAAO;AAAA,IACT,GAAG,EAAE,QAAQ,kBAAO,QAAQ,OAAO,CAAC,yCAAiB,+CAAoB,6CAAkB,EAAE,CAAC;AAAA,EAChG;AACF;","names":[]}
@@ -1,3 +1,4 @@
1
+ import { installRuntimeCapabilities } from "./runtime_capabilities.js";
1
2
  import { LoadAs } from "@noego/ioc";
2
3
  import { WoodRouter } from "../router/wood_router.js";
3
4
  import { SchemaValidator } from "../validation/schema_validator.js";
@@ -7,6 +8,7 @@ function installWoodRuntime(root, options) {
7
8
  if (typeof root.isRegistered !== "function" || typeof root.registerFunction !== "function") {
8
9
  throw new Error("Wood runtime requires an explicit IoC root; use createWoodRoot().");
9
10
  }
11
+ installRuntimeCapabilities(root);
10
12
  if (!root.isRegistered(SchemaValidator)) root.registerFunction(SchemaValidator, () => new SchemaValidator());
11
13
  if (!root.isRegistered(MiddlewareResolver)) root.registerFunction(MiddlewareResolver, () => new MiddlewareResolver(options.middlewareDir));
12
14
  if (!root.isRegistered(ControllerResolver)) root.registerFunction(ControllerResolver, () => new ControllerResolver(options.controllersDir, { mode: options.mode }));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/runtime_module.ts"],"sourcesContent":["import { LoadAs, type IContainer } from '@noego/ioc';\nimport { WoodRouter } from '../router/wood_router.js';\nimport { SchemaValidator } from '../validation/schema_validator.js';\nimport { MiddlewareResolver } from '../middleware/middleware_resolver.js';\nimport { ControllerResolver } from '../controller/controller_resolver.js';\n\nexport interface WoodRuntimeModuleOptions {\n controllersDir: string;\n middlewareDir: string;\n mode?: 'bundled' | 'dev';\n registerRuntime(router: WoodRouter): void;\n}\n\n/**\n * Registration-only production module, also installed by testWood before\n * scenario overlays. Resolving WoodRouter starts the selected real pipeline.\n * Existing registrations remain authoritative; token identities are exact.\n */\nexport function installWoodRuntime(root: IContainer, options: WoodRuntimeModuleOptions): void {\n if (typeof root.isRegistered !== 'function' || typeof root.registerFunction !== 'function') {\n throw new Error('Wood runtime requires an explicit IoC root; use createWoodRoot().');\n }\n if (!root.isRegistered(SchemaValidator)) root.registerFunction(SchemaValidator, () => new SchemaValidator());\n if (!root.isRegistered(MiddlewareResolver)) root.registerFunction(MiddlewareResolver, () => new MiddlewareResolver(options.middlewareDir));\n if (!root.isRegistered(ControllerResolver)) root.registerFunction(ControllerResolver, () => new ControllerResolver(options.controllersDir, { mode: options.mode }));\n if (!root.isRegistered(WoodRouter)) {\n root.registerFunction(WoodRouter, (validator: SchemaValidator, middlewareResolver: MiddlewareResolver, controllerResolver: ControllerResolver) => {\n const router = new WoodRouter({ container: root, ...options, validator, middlewareResolver, controllerResolver });\n options.registerRuntime(router);\n router.validateControllers();\n router.precompileSchemas();\n return router;\n }, { loadAs: LoadAs.Scoped, param: [SchemaValidator, MiddlewareResolver, ControllerResolver] });\n }\n}\n\nexport { WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver };\n"],"mappings":"AAAA,SAAS,cAA+B;AACxC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,0BAA0B;AAc5B,SAAS,mBAAmB,MAAkB,SAAyC;AAC5F,MAAI,OAAO,KAAK,iBAAiB,cAAc,OAAO,KAAK,qBAAqB,YAAY;AAC1F,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,MAAI,CAAC,KAAK,aAAa,eAAe,EAAG,MAAK,iBAAiB,iBAAiB,MAAM,IAAI,gBAAgB,CAAC;AAC3G,MAAI,CAAC,KAAK,aAAa,kBAAkB,EAAG,MAAK,iBAAiB,oBAAoB,MAAM,IAAI,mBAAmB,QAAQ,aAAa,CAAC;AACzI,MAAI,CAAC,KAAK,aAAa,kBAAkB,EAAG,MAAK,iBAAiB,oBAAoB,MAAM,IAAI,mBAAmB,QAAQ,gBAAgB,EAAE,MAAM,QAAQ,KAAK,CAAC,CAAC;AAClK,MAAI,CAAC,KAAK,aAAa,UAAU,GAAG;AAClC,SAAK,iBAAiB,YAAY,CAAC,WAA4B,oBAAwC,uBAA2C;AAChJ,YAAM,SAAS,IAAI,WAAW,EAAE,WAAW,MAAM,GAAG,SAAS,WAAW,oBAAoB,mBAAmB,CAAC;AAChH,cAAQ,gBAAgB,MAAM;AAC9B,aAAO,oBAAoB;AAC3B,aAAO,kBAAkB;AACzB,aAAO;AAAA,IACT,GAAG,EAAE,QAAQ,OAAO,QAAQ,OAAO,CAAC,iBAAiB,oBAAoB,kBAAkB,EAAE,CAAC;AAAA,EAChG;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/runtime_module.ts"],"sourcesContent":["import { installRuntimeCapabilities } from './runtime_capabilities.js';\nimport { LoadAs, type IContainer } from '@noego/ioc';\nimport { WoodRouter } from '../router/wood_router.js';\nimport { SchemaValidator } from '../validation/schema_validator.js';\nimport { MiddlewareResolver } from '../middleware/middleware_resolver.js';\nimport { ControllerResolver } from '../controller/controller_resolver.js';\n\nexport interface WoodRuntimeModuleOptions {\n controllersDir: string;\n middlewareDir: string;\n mode?: 'bundled' | 'dev';\n registerRuntime(router: WoodRouter): void;\n}\n\n/**\n * Registration-only production module, also installed by testWood before\n * scenario overlays. Resolving WoodRouter starts the selected real pipeline.\n * Existing registrations remain authoritative; token identities are exact.\n */\nexport function installWoodRuntime(root: IContainer, options: WoodRuntimeModuleOptions): void {\n if (typeof root.isRegistered !== 'function' || typeof root.registerFunction !== 'function') {\n throw new Error('Wood runtime requires an explicit IoC root; use createWoodRoot().');\n }\n installRuntimeCapabilities(root);\n if (!root.isRegistered(SchemaValidator)) root.registerFunction(SchemaValidator, () => new SchemaValidator());\n if (!root.isRegistered(MiddlewareResolver)) root.registerFunction(MiddlewareResolver, () => new MiddlewareResolver(options.middlewareDir));\n if (!root.isRegistered(ControllerResolver)) root.registerFunction(ControllerResolver, () => new ControllerResolver(options.controllersDir, { mode: options.mode }));\n if (!root.isRegistered(WoodRouter)) {\n root.registerFunction(WoodRouter, (validator: SchemaValidator, middlewareResolver: MiddlewareResolver, controllerResolver: ControllerResolver) => {\n const router = new WoodRouter({ container: root, ...options, validator, middlewareResolver, controllerResolver });\n options.registerRuntime(router);\n router.validateControllers();\n router.precompileSchemas();\n return router;\n }, { loadAs: LoadAs.Scoped, param: [SchemaValidator, MiddlewareResolver, ControllerResolver] });\n }\n}\n\nexport { WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver };\n"],"mappings":"AAAA,SAAS,kCAAkC;AAC3C,SAAS,cAA+B;AACxC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,0BAA0B;AAc5B,SAAS,mBAAmB,MAAkB,SAAyC;AAC5F,MAAI,OAAO,KAAK,iBAAiB,cAAc,OAAO,KAAK,qBAAqB,YAAY;AAC1F,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,6BAA2B,IAAI;AAC/B,MAAI,CAAC,KAAK,aAAa,eAAe,EAAG,MAAK,iBAAiB,iBAAiB,MAAM,IAAI,gBAAgB,CAAC;AAC3G,MAAI,CAAC,KAAK,aAAa,kBAAkB,EAAG,MAAK,iBAAiB,oBAAoB,MAAM,IAAI,mBAAmB,QAAQ,aAAa,CAAC;AACzI,MAAI,CAAC,KAAK,aAAa,kBAAkB,EAAG,MAAK,iBAAiB,oBAAoB,MAAM,IAAI,mBAAmB,QAAQ,gBAAgB,EAAE,MAAM,QAAQ,KAAK,CAAC,CAAC;AAClK,MAAI,CAAC,KAAK,aAAa,UAAU,GAAG;AAClC,SAAK,iBAAiB,YAAY,CAAC,WAA4B,oBAAwC,uBAA2C;AAChJ,YAAM,SAAS,IAAI,WAAW,EAAE,WAAW,MAAM,GAAG,SAAS,WAAW,oBAAoB,mBAAmB,CAAC;AAChH,cAAQ,gBAAgB,MAAM;AAC9B,aAAO,oBAAoB;AAC3B,aAAO,kBAAkB;AACzB,aAAO;AAAA,IACT,GAAG,EAAE,QAAQ,OAAO,QAAQ,OAAO,CAAC,iBAAiB,oBAAoB,kBAAkB,EAAE,CAAC;AAAA,EAChG;AACF;","names":[]}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var test_wood_exports = {};
30
+ __export(test_wood_exports, {
31
+ WoodTestBuilder: () => WoodTestBuilder,
32
+ testWood: () => testWood
33
+ });
34
+ module.exports = __toCommonJS(test_wood_exports);
35
+ var import_node_url = require("node:url");
36
+ const logs = /* @__PURE__ */ new WeakMap();
37
+ function derive(builder, method, args) {
38
+ const state = logs.get(builder);
39
+ const copied = [...args];
40
+ const optionsIndex = method === "method" ? 3 : 2;
41
+ if (!["select", "use"].includes(method) && copied[optionsIndex] !== void 0) {
42
+ copied[optionsIndex] = Object.freeze({ ...copied[optionsIndex] });
43
+ }
44
+ if (method === "load" && typeof copied[0] !== "string") copied[0] = Object.freeze({ ...copied[0] });
45
+ const child = Object.create(WoodTestBuilder.prototype);
46
+ logs.set(child, {
47
+ config: state.config,
48
+ commands: Object.freeze([...state.commands, Object.freeze({ method, args: Object.freeze(copied) })])
49
+ });
50
+ return Object.freeze(child);
51
+ }
52
+ function plain(value) {
53
+ return !!value && typeof value === "object" && !Array.isArray(value) && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
54
+ }
55
+ function copyOwner(owner, input) {
56
+ if (!plain(input) || Reflect.ownKeys(input).some((key) => key !== "module" && key !== "path") || Reflect.ownKeys(input).length > 1) {
57
+ throw new TypeError(`select({ ${owner} }) takes module OR path, or {}`);
58
+ }
59
+ const value = { ...input };
60
+ if (typeof value.module === "string") value.module = Object.freeze([value.module]);
61
+ else if (Array.isArray(value.module)) value.module = Object.freeze([...value.module]);
62
+ if (Array.isArray(value.path)) value.path = Object.freeze([...value.path]);
63
+ return Object.freeze(value);
64
+ }
65
+ function copySelection(selection) {
66
+ if (!plain(selection) || Reflect.ownKeys(selection).some((key) => key !== "main" && key !== "renderer")) {
67
+ throw new TypeError("select requires { main } and/or { renderer }");
68
+ }
69
+ const out = {};
70
+ if ("main" in selection) out.main = copyOwner("main", selection.main);
71
+ if ("renderer" in selection) out.renderer = copyOwner("renderer", selection.renderer);
72
+ if (!("main" in out) && !("renderer" in out)) throw new TypeError("select requires { main } and/or { renderer }");
73
+ return Object.freeze(out);
74
+ }
75
+ function identity(value, what) {
76
+ if (typeof value !== "string" || !value.trim()) throw new TypeError(`${what} requires a nonempty identity`);
77
+ }
78
+ class WoodTestBuilder {
79
+ constructor() {
80
+ }
81
+ fetch(configure) {
82
+ if (typeof configure !== "function") throw new TypeError("fetch() requires a route configuration callback");
83
+ return derive(this, "fetch", [configure]);
84
+ }
85
+ browser(host = "playwright") {
86
+ if (host !== "playwright" && host !== "happy_dom") throw new TypeError("browser() accepts playwright or happy_dom");
87
+ return derive(this, "browser", [host]);
88
+ }
89
+ select(selection) {
90
+ return derive(this, "select", [copySelection(selection)]);
91
+ }
92
+ use(stub) {
93
+ if (!stub || typeof stub !== "object") throw new TypeError("use() expects a testStub() description");
94
+ return derive(this, "use", [stub]);
95
+ }
96
+ class(target, replacement, options) {
97
+ return derive(this, "class", options === void 0 ? [target, replacement] : [target, replacement, options]);
98
+ }
99
+ function(target, replacement, options) {
100
+ return derive(this, "function", options === void 0 ? [target, replacement] : [target, replacement, options]);
101
+ }
102
+ method(target, method, replacement, options) {
103
+ identity(method, "method()");
104
+ return derive(this, "method", options === void 0 ? [target, method, replacement] : [target, method, replacement, options]);
105
+ }
106
+ value(target, replacement, options) {
107
+ return derive(this, "value", options === void 0 ? [target, replacement] : [target, replacement, options]);
108
+ }
109
+ middleware(identity_, replacement, options) {
110
+ identity(identity_, "middleware()");
111
+ return derive(this, "middleware", options === void 0 ? [identity_, replacement] : [identity_, replacement, options]);
112
+ }
113
+ load(identity_, replacement, options) {
114
+ return derive(this, "load", options === void 0 ? [identity_, replacement] : [identity_, replacement, options]);
115
+ }
116
+ /**
117
+ * Load the implementation and replay the recorded calls in order. Under
118
+ * Vitest the build binds to the project-local runner's module registry so
119
+ * production modules keep the identity the test file imported.
120
+ */
121
+ async build() {
122
+ const state = logs.get(this);
123
+ const implementation = await import("./testing/index.js");
124
+ let builder = implementation.testWood(state.config);
125
+ if (process.env.VITEST) builder = builder.importer(await implementation.vitestModuleImporter(state.config));
126
+ for (const command of state.commands) {
127
+ if (command.method === "use") {
128
+ const { stubEntries } = await import("@noego/testing");
129
+ stubEntries(command.args[0]);
130
+ }
131
+ builder = builder[command.method].apply(builder, [...command.args]);
132
+ }
133
+ const environment = await builder.build();
134
+ const { registerTestResource } = await import("@noego/testing");
135
+ return await registerTestResource(environment, "testWood");
136
+ }
137
+ }
138
+ function testWood(configPath) {
139
+ const config = configPath instanceof URL ? (0, import_node_url.fileURLToPath)(configPath) : typeof configPath === "string" && configPath.startsWith("file:") ? (0, import_node_url.fileURLToPath)(configPath) : configPath;
140
+ if (typeof config !== "string" || !config.trim()) throw new TypeError("testWood requires an original wood.config.yml path or file URL");
141
+ const builder = Object.create(WoodTestBuilder.prototype);
142
+ logs.set(builder, { config, commands: Object.freeze([]) });
143
+ return Object.freeze(builder);
144
+ }
145
+ // Annotate the CommonJS export names for ESM import in node:
146
+ 0 && (module.exports = {
147
+ WoodTestBuilder,
148
+ testWood
149
+ });
150
+ //# sourceMappingURL=test-wood.cjs.map