@noego/wood 0.4.10 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -42
- package/dist/bridge/backend_bridge.cjs.map +1 -1
- package/dist/bridge/backend_bridge.js.map +1 -1
- package/dist/client/index.cjs +78 -21
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +18 -3
- package/dist/client/index.d.ts +18 -3
- package/dist/client/index.js +80 -22
- package/dist/client/index.js.map +1 -1
- package/dist/client/renderer_log_transport.cjs +151 -0
- package/dist/client/renderer_log_transport.cjs.map +1 -0
- package/dist/client/renderer_log_transport.d.cts +54 -0
- package/dist/client/renderer_log_transport.d.ts +54 -0
- package/dist/client/renderer_log_transport.js +123 -0
- package/dist/client/renderer_log_transport.js.map +1 -0
- package/dist/codegen/controller_registration_generator.cjs +13 -2
- package/dist/codegen/controller_registration_generator.cjs.map +1 -1
- package/dist/codegen/controller_registration_generator.d.cts +12 -1
- package/dist/codegen/controller_registration_generator.d.ts +12 -1
- package/dist/codegen/controller_registration_generator.js +10 -1
- package/dist/codegen/controller_registration_generator.js.map +1 -1
- package/dist/codegen/index.d.cts +1 -0
- package/dist/codegen/index.d.ts +1 -0
- package/dist/codegen/preload_generator.cjs +13 -6
- package/dist/codegen/preload_generator.cjs.map +1 -1
- package/dist/codegen/preload_generator.d.cts +11 -2
- package/dist/codegen/preload_generator.d.ts +11 -2
- package/dist/codegen/preload_generator.js +13 -6
- package/dist/codegen/preload_generator.js.map +1 -1
- package/dist/codegen/renderer_app_generator.cjs +78 -42
- package/dist/codegen/renderer_app_generator.cjs.map +1 -1
- package/dist/codegen/renderer_app_generator.js +78 -42
- package/dist/codegen/renderer_app_generator.js.map +1 -1
- package/dist/codegen/type_generator.cjs +1 -0
- package/dist/codegen/type_generator.cjs.map +1 -1
- package/dist/codegen/type_generator.js +1 -0
- package/dist/codegen/type_generator.js.map +1 -1
- package/dist/config/config_parser.cjs +95 -4
- package/dist/config/config_parser.cjs.map +1 -1
- package/dist/config/config_parser.d.cts +10 -2
- package/dist/config/config_parser.d.ts +10 -2
- package/dist/config/config_parser.js +92 -3
- package/dist/config/config_parser.js.map +1 -1
- package/dist/config/index.cjs +6 -2
- package/dist/config/index.cjs.map +1 -1
- package/dist/config/index.d.cts +2 -2
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +8 -2
- package/dist/config/index.js.map +1 -1
- package/dist/controller/controller_resolver.cjs +51 -3
- package/dist/controller/controller_resolver.cjs.map +1 -1
- package/dist/controller/controller_resolver.d.cts +27 -4
- package/dist/controller/controller_resolver.d.ts +27 -4
- package/dist/controller/controller_resolver.js +48 -2
- package/dist/controller/controller_resolver.js.map +1 -1
- package/dist/controller/index.cjs +6 -2
- package/dist/controller/index.cjs.map +1 -1
- package/dist/controller/index.d.cts +1 -1
- package/dist/controller/index.d.ts +1 -1
- package/dist/controller/index.js +4 -2
- package/dist/controller/index.js.map +1 -1
- package/dist/dev/wood_dev_server.cjs +4 -1
- package/dist/dev/wood_dev_server.cjs.map +1 -1
- package/dist/dev/wood_dev_server.js +5 -2
- package/dist/dev/wood_dev_server.js.map +1 -1
- package/dist/dev/yaml_watcher.cjs +1 -1
- package/dist/dev/yaml_watcher.cjs.map +1 -1
- package/dist/dev/yaml_watcher.d.cts +4 -0
- package/dist/dev/yaml_watcher.d.ts +4 -0
- package/dist/dev/yaml_watcher.js +1 -1
- package/dist/dev/yaml_watcher.js.map +1 -1
- package/dist/frontend/frontend_lifecycle.cjs +74 -0
- package/dist/frontend/frontend_lifecycle.cjs.map +1 -0
- package/dist/frontend/frontend_lifecycle.d.cts +50 -0
- package/dist/frontend/frontend_lifecycle.d.ts +50 -0
- package/dist/frontend/frontend_lifecycle.js +50 -0
- package/dist/frontend/frontend_lifecycle.js.map +1 -0
- package/dist/frontend/frontend_page.cjs +122 -0
- package/dist/frontend/frontend_page.cjs.map +1 -0
- package/dist/frontend/frontend_page.d.cts +62 -0
- package/dist/frontend/frontend_page.d.ts +62 -0
- package/dist/frontend/frontend_page.js +98 -0
- package/dist/frontend/frontend_page.js.map +1 -0
- package/dist/frontend/frontend_surface.cjs +249 -0
- package/dist/frontend/frontend_surface.cjs.map +1 -0
- package/dist/frontend/frontend_surface.d.cts +64 -0
- package/dist/frontend/frontend_surface.d.ts +64 -0
- package/dist/frontend/frontend_surface.js +224 -0
- package/dist/frontend/frontend_surface.js.map +1 -0
- package/dist/frontend/index.cjs +52 -0
- package/dist/frontend/index.cjs.map +1 -0
- package/dist/frontend/index.d.cts +10 -0
- package/dist/frontend/index.d.ts +10 -0
- package/dist/frontend/index.js +19 -0
- package/dist/frontend/index.js.map +1 -0
- package/dist/frontend/page_catalog.cjs +135 -0
- package/dist/frontend/page_catalog.cjs.map +1 -0
- package/dist/frontend/page_catalog.d.cts +56 -0
- package/dist/frontend/page_catalog.d.ts +56 -0
- package/dist/frontend/page_catalog.js +108 -0
- package/dist/frontend/page_catalog.js.map +1 -0
- package/dist/frontend/tracked_transport.cjs +55 -0
- package/dist/frontend/tracked_transport.cjs.map +1 -0
- package/dist/frontend/tracked_transport.d.cts +36 -0
- package/dist/frontend/tracked_transport.d.ts +36 -0
- package/dist/frontend/tracked_transport.js +31 -0
- package/dist/frontend/tracked_transport.js.map +1 -0
- package/dist/frontend/work_registry.cjs +153 -0
- package/dist/frontend/work_registry.cjs.map +1 -0
- package/dist/frontend/work_registry.d.cts +70 -0
- package/dist/frontend/work_registry.d.ts +70 -0
- package/dist/frontend/work_registry.js +128 -0
- package/dist/frontend/work_registry.js.map +1 -0
- package/dist/index.cjs +24 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -7
- package/dist/index.d.ts +10 -7
- package/dist/index.js +27 -4
- package/dist/index.js.map +1 -1
- package/dist/main/index.cjs +10 -0
- package/dist/main/index.cjs.map +1 -1
- package/dist/main/index.d.cts +14 -2
- package/dist/main/index.d.ts +14 -2
- package/dist/main/index.js +16 -0
- package/dist/main/index.js.map +1 -1
- package/dist/middleware/middleware_resolver.cjs +22 -1
- package/dist/middleware/middleware_resolver.cjs.map +1 -1
- package/dist/middleware/middleware_resolver.d.cts +13 -1
- package/dist/middleware/middleware_resolver.d.ts +13 -1
- package/dist/middleware/middleware_resolver.js +22 -1
- package/dist/middleware/middleware_resolver.js.map +1 -1
- package/dist/navigation/index.cjs +3 -0
- package/dist/navigation/index.cjs.map +1 -1
- package/dist/navigation/index.d.cts +25 -1
- package/dist/navigation/index.d.ts +25 -1
- package/dist/navigation/index.js +2 -0
- package/dist/navigation/index.js.map +1 -1
- package/dist/{middleware/__fixtures__/middleware/auth.cjs → navigation/layout_preservation.cjs} +18 -20
- package/dist/navigation/layout_preservation.cjs.map +1 -0
- package/dist/navigation/layout_preservation.d.cts +2 -0
- package/dist/navigation/layout_preservation.d.ts +2 -0
- package/dist/navigation/layout_preservation.js +18 -0
- package/dist/navigation/layout_preservation.js.map +1 -0
- package/dist/parser/index.cjs +2 -0
- package/dist/parser/index.cjs.map +1 -1
- package/dist/parser/index.d.cts +1 -1
- package/dist/parser/index.d.ts +1 -1
- package/dist/parser/index.js +2 -1
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/operations_parser.cjs +6 -0
- package/dist/parser/operations_parser.cjs.map +1 -1
- package/dist/parser/operations_parser.d.cts +9 -2
- package/dist/parser/operations_parser.d.ts +9 -2
- package/dist/parser/operations_parser.js +5 -0
- package/dist/parser/operations_parser.js.map +1 -1
- package/dist/parser/views_parser.cjs.map +1 -1
- package/dist/parser/views_parser.js.map +1 -1
- package/dist/router/index.d.cts +1 -0
- package/dist/router/index.d.ts +1 -0
- package/dist/router/wood_router.cjs +35 -3
- package/dist/router/wood_router.cjs.map +1 -1
- package/dist/router/wood_router.d.cts +15 -0
- package/dist/router/wood_router.d.ts +15 -0
- package/dist/router/wood_router.js +36 -4
- package/dist/router/wood_router.js.map +1 -1
- package/dist/runtime/get_container.cjs +9 -34
- package/dist/runtime/get_container.cjs.map +1 -1
- package/dist/runtime/get_container.d.cts +24 -4
- package/dist/runtime/get_container.d.ts +24 -4
- package/dist/runtime/get_container.js +8 -23
- package/dist/runtime/get_container.js.map +1 -1
- package/dist/runtime/index.cjs +9 -0
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.d.cts +5 -2
- package/dist/runtime/index.d.ts +5 -2
- package/dist/runtime/index.js +10 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/renderer_config_extension.cjs +50 -0
- package/dist/runtime/renderer_config_extension.cjs.map +1 -0
- package/dist/runtime/renderer_config_extension.d.cts +19 -0
- package/dist/runtime/renderer_config_extension.d.ts +19 -0
- package/dist/runtime/renderer_config_extension.js +24 -0
- package/dist/runtime/renderer_config_extension.js.map +1 -0
- package/dist/runtime/renderer_log_batch_receiver.cjs +73 -0
- package/dist/runtime/renderer_log_batch_receiver.cjs.map +1 -0
- package/dist/runtime/renderer_log_batch_receiver.d.cts +29 -0
- package/dist/runtime/renderer_log_batch_receiver.d.ts +29 -0
- package/dist/runtime/renderer_log_batch_receiver.js +48 -0
- package/dist/runtime/renderer_log_batch_receiver.js.map +1 -0
- package/dist/runtime/renderer_trace_batch_receiver_registry.d.cts +1 -1
- package/dist/runtime/renderer_trace_batch_receiver_registry.d.ts +1 -1
- package/dist/runtime/runtime.cjs +14 -0
- package/dist/runtime/runtime.cjs.map +1 -1
- package/dist/runtime/runtime.d.cts +2 -1
- package/dist/runtime/runtime.d.ts +2 -1
- package/dist/runtime/runtime.js +14 -0
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/stick/index.cjs.map +1 -1
- package/dist/stick/index.js.map +1 -1
- package/dist/testing/browser.cjs +104 -23
- package/dist/testing/browser.cjs.map +1 -1
- package/dist/testing/browser.d.cts +8 -3
- package/dist/testing/browser.d.ts +8 -3
- package/dist/testing/browser.js +102 -22
- package/dist/testing/browser.js.map +1 -1
- package/dist/testing/create_controller_harness.cjs +28 -8
- package/dist/testing/create_controller_harness.cjs.map +1 -1
- package/dist/testing/create_controller_harness.d.cts +17 -2
- package/dist/testing/create_controller_harness.d.ts +17 -2
- package/dist/testing/create_controller_harness.js +28 -8
- package/dist/testing/create_controller_harness.js.map +1 -1
- package/dist/testing/create_router_bridge.d.cts +1 -0
- package/dist/testing/create_router_bridge.d.ts +1 -0
- package/dist/testing/create_test_router.d.cts +1 -0
- package/dist/testing/create_test_router.d.ts +1 -0
- package/dist/testing/index.cjs +31 -0
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +20 -5
- package/dist/testing/index.d.ts +20 -5
- package/dist/testing/index.js +19 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/{controller/__fixtures__/controllers/not_a_class.cjs → testing/test_wood.cjs} +15 -7
- package/dist/testing/test_wood.cjs.map +1 -0
- package/dist/testing/test_wood.d.cts +16 -0
- package/dist/testing/test_wood.d.ts +16 -0
- package/dist/testing/test_wood.js +12 -0
- package/dist/testing/test_wood.js.map +1 -0
- package/dist/testing/test_wood_config.cjs +272 -0
- package/dist/testing/test_wood_config.cjs.map +1 -0
- package/dist/testing/test_wood_config.d.cts +111 -0
- package/dist/testing/test_wood_config.d.ts +111 -0
- package/dist/testing/test_wood_config.js +247 -0
- package/dist/testing/test_wood_config.js.map +1 -0
- package/dist/testing/wood_config_source.cjs +146 -0
- package/dist/testing/wood_config_source.cjs.map +1 -0
- package/dist/testing/wood_config_source.d.cts +36 -0
- package/dist/testing/wood_config_source.d.ts +36 -0
- package/dist/testing/wood_config_source.js +112 -0
- package/dist/testing/wood_config_source.js.map +1 -0
- package/dist/testing/wood_env_renderer.cjs +210 -0
- package/dist/testing/wood_env_renderer.cjs.map +1 -0
- package/dist/testing/wood_env_renderer.d.cts +74 -0
- package/dist/testing/wood_env_renderer.d.ts +74 -0
- package/dist/testing/wood_env_renderer.js +188 -0
- package/dist/testing/wood_env_renderer.js.map +1 -0
- package/dist/testing/wood_test_selection.cjs +94 -0
- package/dist/testing/wood_test_selection.cjs.map +1 -0
- package/dist/testing/wood_test_selection.d.cts +39 -0
- package/dist/testing/wood_test_selection.d.ts +39 -0
- package/dist/testing/wood_test_selection.js +68 -0
- package/dist/testing/wood_test_selection.js.map +1 -0
- package/dist/trace-testing/index.d.cts +1 -2
- package/dist/trace-testing/index.d.ts +1 -2
- package/dist/trace-testing/trace_recorder.cjs +1 -1
- package/dist/trace-testing/trace_recorder.cjs.map +1 -1
- package/dist/trace-testing/trace_recorder.d.cts +1 -2
- package/dist/trace-testing/trace_recorder.d.ts +1 -2
- package/dist/trace-testing/trace_recorder.js +1 -1
- package/dist/trace-testing/trace_recorder.js.map +1 -1
- package/dist/trace-transport/index.d.cts +1 -1
- package/dist/trace-transport/index.d.ts +1 -1
- package/dist/{trace_hub-Cob54qRx.d.cts → trace_hub-Cpo_nVze.d.cts} +21 -1
- package/dist/{trace_hub-Cob54qRx.d.ts → trace_hub-Cpo_nVze.d.ts} +21 -1
- package/dist/tracing/index.cjs +9 -2
- package/dist/tracing/index.cjs.map +1 -1
- package/dist/tracing/index.d.cts +3 -2
- package/dist/tracing/index.d.ts +3 -2
- package/dist/tracing/index.js +7 -1
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/renderer_trace_batch_host.d.cts +1 -1
- package/dist/tracing/renderer_trace_batch_host.d.ts +1 -1
- package/dist/tracing/renderer_trace_batch_transport.cjs +48 -6
- package/dist/tracing/renderer_trace_batch_transport.cjs.map +1 -1
- package/dist/tracing/renderer_trace_batch_transport.d.cts +17 -1
- package/dist/tracing/renderer_trace_batch_transport.d.ts +17 -1
- package/dist/tracing/renderer_trace_batch_transport.js +48 -6
- package/dist/tracing/renderer_trace_batch_transport.js.map +1 -1
- package/dist/tracing/trace_batch_adapter.cjs +110 -0
- package/dist/tracing/trace_batch_adapter.cjs.map +1 -0
- package/dist/tracing/trace_batch_adapter.d.cts +36 -0
- package/dist/tracing/trace_batch_adapter.d.ts +36 -0
- package/dist/tracing/trace_batch_adapter.js +86 -0
- package/dist/tracing/trace_batch_adapter.js.map +1 -0
- package/dist/tracing/trace_commit_writer.d.cts +1 -1
- package/dist/tracing/trace_commit_writer.d.ts +1 -1
- package/dist/tracing/trace_hub.cjs +87 -20
- package/dist/tracing/trace_hub.cjs.map +1 -1
- package/dist/tracing/trace_hub.d.cts +1 -1
- package/dist/tracing/trace_hub.d.ts +1 -1
- package/dist/tracing/trace_hub.js +85 -20
- package/dist/tracing/trace_hub.js.map +1 -1
- package/dist/tracing/trace_provider.cjs +21 -6
- package/dist/tracing/trace_provider.cjs.map +1 -1
- package/dist/tracing/trace_provider.d.cts +13 -4
- package/dist/tracing/trace_provider.d.ts +13 -4
- package/dist/tracing/trace_provider.js +22 -7
- package/dist/tracing/trace_provider.js.map +1 -1
- package/dist/tracing/types/wood_trace_batch.types.cjs.map +1 -1
- package/dist/tracing/types/wood_trace_batch.types.d.cts +15 -1
- package/dist/tracing/types/wood_trace_batch.types.d.ts +15 -1
- package/dist/tracing/types/wood_trace_sink.types.d.cts +1 -1
- package/dist/tracing/types/wood_trace_sink.types.d.ts +1 -1
- package/dist/tracing/wood_trace_batch_contract.cjs +2 -0
- package/dist/tracing/wood_trace_batch_contract.cjs.map +1 -1
- package/dist/tracing/wood_trace_batch_contract.d.cts +1 -1
- package/dist/tracing/wood_trace_batch_contract.d.ts +1 -1
- package/dist/tracing/wood_trace_batch_contract.js +2 -0
- package/dist/tracing/wood_trace_batch_contract.js.map +1 -1
- package/dist/transport/build_transport_bridge.cjs +4 -2
- package/dist/transport/build_transport_bridge.cjs.map +1 -1
- package/dist/transport/build_transport_bridge.d.cts +7 -1
- package/dist/transport/build_transport_bridge.d.ts +7 -1
- package/dist/transport/build_transport_bridge.js +2 -1
- package/dist/transport/build_transport_bridge.js.map +1 -1
- package/dist/transport/in_process_router_transport.d.cts +1 -0
- package/dist/transport/in_process_router_transport.d.ts +1 -0
- package/dist/transport/index.d.cts +1 -0
- package/dist/transport/index.d.ts +1 -0
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.cts +47 -1
- package/dist/types/config.d.ts +47 -1
- package/dist/types/context.cjs +12 -0
- package/dist/types/context.cjs.map +1 -1
- package/dist/types/context.d.cts +27 -1
- package/dist/types/context.d.ts +27 -1
- package/dist/types/context.js +4 -0
- package/dist/types/context.js.map +1 -1
- package/dist/types/index.d.cts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.cts +2 -0
- package/dist/types/operations.d.ts +2 -0
- package/docs/axe.md +706 -0
- package/package.json +13 -5
- package/src/components/NavigationShell.scopes.browser.test.ts +363 -0
- package/src/components/NavigationShell.svelte +126 -49
- package/dist/controller/__fixtures__/controllers/chat.cjs +0 -32
- package/dist/controller/__fixtures__/controllers/chat.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/chat.d.cts +0 -11
- package/dist/controller/__fixtures__/controllers/chat.d.ts +0 -11
- package/dist/controller/__fixtures__/controllers/chat.js +0 -12
- package/dist/controller/__fixtures__/controllers/chat.js.map +0 -1
- package/dist/controller/__fixtures__/controllers/not_a_class.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/not_a_class.d.cts +0 -3
- package/dist/controller/__fixtures__/controllers/not_a_class.d.ts +0 -3
- package/dist/controller/__fixtures__/controllers/not_a_class.js +0 -5
- package/dist/controller/__fixtures__/controllers/not_a_class.js.map +0 -1
- package/dist/controller/__fixtures__/controllers/settings.controller.cjs +0 -32
- package/dist/controller/__fixtures__/controllers/settings.controller.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/settings.controller.d.cts +0 -12
- package/dist/controller/__fixtures__/controllers/settings.controller.d.ts +0 -12
- package/dist/controller/__fixtures__/controllers/settings.controller.js +0 -12
- package/dist/controller/__fixtures__/controllers/settings.controller.js.map +0 -1
- package/dist/controller/__fixtures__/controllers/test.cjs +0 -29
- package/dist/controller/__fixtures__/controllers/test.cjs.map +0 -1
- package/dist/controller/__fixtures__/controllers/test.d.cts +0 -7
- package/dist/controller/__fixtures__/controllers/test.d.ts +0 -7
- package/dist/controller/__fixtures__/controllers/test.js +0 -9
- package/dist/controller/__fixtures__/controllers/test.js.map +0 -1
- package/dist/loader/__fixtures__/layouts/app.load.cjs +0 -27
- package/dist/loader/__fixtures__/layouts/app.load.cjs.map +0 -1
- package/dist/loader/__fixtures__/layouts/app.load.d.cts +0 -5
- package/dist/loader/__fixtures__/layouts/app.load.d.ts +0 -5
- package/dist/loader/__fixtures__/layouts/app.load.js +0 -7
- package/dist/loader/__fixtures__/layouts/app.load.js.map +0 -1
- package/dist/loader/__fixtures__/views/test/page.load.cjs +0 -27
- package/dist/loader/__fixtures__/views/test/page.load.cjs.map +0 -1
- package/dist/loader/__fixtures__/views/test/page.load.d.cts +0 -6
- package/dist/loader/__fixtures__/views/test/page.load.d.ts +0 -6
- package/dist/loader/__fixtures__/views/test/page.load.js +0 -7
- package/dist/loader/__fixtures__/views/test/page.load.js.map +0 -1
- package/dist/middleware/__fixtures__/middleware/auth.cjs.map +0 -1
- package/dist/middleware/__fixtures__/middleware/auth.d.cts +0 -6
- package/dist/middleware/__fixtures__/middleware/auth.d.ts +0 -6
- package/dist/middleware/__fixtures__/middleware/auth.js +0 -19
- package/dist/middleware/__fixtures__/middleware/auth.js.map +0 -1
- package/dist/middleware/__fixtures__/middleware/sequence.cjs +0 -47
- package/dist/middleware/__fixtures__/middleware/sequence.cjs.map +0 -1
- package/dist/middleware/__fixtures__/middleware/sequence.d.cts +0 -7
- package/dist/middleware/__fixtures__/middleware/sequence.d.ts +0 -7
- package/dist/middleware/__fixtures__/middleware/sequence.js +0 -21
- package/dist/middleware/__fixtures__/middleware/sequence.js.map +0 -1
|
@@ -0,0 +1,151 @@
|
|
|
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 renderer_log_transport_exports = {};
|
|
20
|
+
__export(renderer_log_transport_exports, {
|
|
21
|
+
RendererLogTransport: () => RendererLogTransport,
|
|
22
|
+
clearRendererLogTransportForTests: () => clearRendererLogTransportForTests,
|
|
23
|
+
configureRendererLogTransport: () => configureRendererLogTransport,
|
|
24
|
+
flushRendererLogs: () => flushRendererLogs,
|
|
25
|
+
getRendererLogTransport: () => getRendererLogTransport
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(renderer_log_transport_exports);
|
|
28
|
+
var import_logger = require("@noego/logger");
|
|
29
|
+
var import_stream = require("@noego/trace/stream");
|
|
30
|
+
const TRANSPORT_SYMBOL = /* @__PURE__ */ Symbol.for("@noego/wood.client.renderer-log-transport");
|
|
31
|
+
const DEFAULT_BUFFER = { mode: "buffered", intervalMs: 500, maxRecords: 500 };
|
|
32
|
+
function randomSuffix() {
|
|
33
|
+
return Math.random().toString(36).slice(2, 10);
|
|
34
|
+
}
|
|
35
|
+
class RendererLogTransport {
|
|
36
|
+
constructor(config = {}) {
|
|
37
|
+
this.sequence = 0;
|
|
38
|
+
this.sender = null;
|
|
39
|
+
this.fallback = null;
|
|
40
|
+
const c = globalThis.crypto;
|
|
41
|
+
this.producerId = `renderer:${c && typeof c.randomUUID === "function" ? c.randomUUID() : randomSuffix()}`;
|
|
42
|
+
this.config = config;
|
|
43
|
+
this.pipe = this.buildPipe();
|
|
44
|
+
}
|
|
45
|
+
/** Rebuilds the pipe with new buffering config; pending records are flushed first. */
|
|
46
|
+
configure(config) {
|
|
47
|
+
this.pipe.flush();
|
|
48
|
+
void this.pipe.close();
|
|
49
|
+
this.config = config;
|
|
50
|
+
this.pipe = this.buildPipe();
|
|
51
|
+
}
|
|
52
|
+
/** Installs the batch sender (the preload bridge's __logBatch). */
|
|
53
|
+
setSender(sender) {
|
|
54
|
+
this.sender = sender;
|
|
55
|
+
}
|
|
56
|
+
/** Installs the per-record fallback used when no batch sender is available. */
|
|
57
|
+
setFallback(fallback) {
|
|
58
|
+
this.fallback = fallback;
|
|
59
|
+
}
|
|
60
|
+
/** Admits one renderer log call: stamps identity + time, enters the pipe. */
|
|
61
|
+
admit(level, logger, message, context) {
|
|
62
|
+
const record = Object.freeze({
|
|
63
|
+
id: this.nextId(),
|
|
64
|
+
occurredAtMs: Date.now(),
|
|
65
|
+
producerId: this.producerId,
|
|
66
|
+
sequence: ++this.sequence,
|
|
67
|
+
level,
|
|
68
|
+
logger,
|
|
69
|
+
message,
|
|
70
|
+
service: "renderer",
|
|
71
|
+
environment: "renderer",
|
|
72
|
+
...context !== void 0 ? { context: sanitizeContext(context) } : {}
|
|
73
|
+
});
|
|
74
|
+
this.pipe.accept(record);
|
|
75
|
+
return record;
|
|
76
|
+
}
|
|
77
|
+
/** Drains buffered records across the boundary now. */
|
|
78
|
+
flush() {
|
|
79
|
+
this.pipe.flush();
|
|
80
|
+
}
|
|
81
|
+
buildPipe() {
|
|
82
|
+
const pipe = (0, import_logger.createLogPipe)({
|
|
83
|
+
buffer: this.config.buffer ?? DEFAULT_BUFFER,
|
|
84
|
+
flushOnLevels: this.config.flushOnLevels ?? ["error"],
|
|
85
|
+
name: "renderer-log-ipc"
|
|
86
|
+
});
|
|
87
|
+
pipe.to((records) => this.send(records));
|
|
88
|
+
return pipe;
|
|
89
|
+
}
|
|
90
|
+
send(records) {
|
|
91
|
+
if (this.sender) {
|
|
92
|
+
try {
|
|
93
|
+
this.sender((0, import_stream.createRecordBatch)(records));
|
|
94
|
+
return;
|
|
95
|
+
} catch {
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (this.fallback) {
|
|
99
|
+
for (const record of records) this.fallback(record);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
nextId() {
|
|
103
|
+
const c = globalThis.crypto;
|
|
104
|
+
if (c && typeof c.randomUUID === "function") return c.randomUUID();
|
|
105
|
+
return `${this.producerId}-${this.sequence + 1}-${randomSuffix()}`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function sanitizeContext(value) {
|
|
109
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
110
|
+
try {
|
|
111
|
+
const json = JSON.stringify(value, (_key, val) => {
|
|
112
|
+
if (typeof val === "bigint") return val.toString();
|
|
113
|
+
if (typeof val === "object" && val !== null) {
|
|
114
|
+
if (seen.has(val)) return "[Circular]";
|
|
115
|
+
seen.add(val);
|
|
116
|
+
}
|
|
117
|
+
if (val instanceof Error) {
|
|
118
|
+
return { name: val.name, message: val.message, stack: val.stack };
|
|
119
|
+
}
|
|
120
|
+
return val;
|
|
121
|
+
});
|
|
122
|
+
return json === void 0 ? void 0 : JSON.parse(json);
|
|
123
|
+
} catch {
|
|
124
|
+
return "[Unserializable]";
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function getRendererLogTransport() {
|
|
128
|
+
const globalObj = globalThis;
|
|
129
|
+
if (!globalObj[TRANSPORT_SYMBOL]) {
|
|
130
|
+
globalObj[TRANSPORT_SYMBOL] = new RendererLogTransport();
|
|
131
|
+
}
|
|
132
|
+
return globalObj[TRANSPORT_SYMBOL];
|
|
133
|
+
}
|
|
134
|
+
function configureRendererLogTransport(config) {
|
|
135
|
+
getRendererLogTransport().configure(config);
|
|
136
|
+
}
|
|
137
|
+
function flushRendererLogs() {
|
|
138
|
+
getRendererLogTransport().flush();
|
|
139
|
+
}
|
|
140
|
+
function clearRendererLogTransportForTests() {
|
|
141
|
+
delete globalThis[TRANSPORT_SYMBOL];
|
|
142
|
+
}
|
|
143
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
144
|
+
0 && (module.exports = {
|
|
145
|
+
RendererLogTransport,
|
|
146
|
+
clearRendererLogTransportForTests,
|
|
147
|
+
configureRendererLogTransport,
|
|
148
|
+
flushRendererLogs,
|
|
149
|
+
getRendererLogTransport
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=renderer_log_transport.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/renderer_log_transport.ts"],"sourcesContent":["import { createLogPipe, type LogPipe, type LogPipeBuffer, type LogRecord } from '@noego/logger';\nimport { createRecordBatch } from '@noego/trace/stream';\n\nconst TRANSPORT_SYMBOL = Symbol.for('@noego/wood.client.renderer-log-transport');\n\n/**\n * Per-pipe buffering configuration for renderer logs crossing the IPC\n * boundary. Batching is a property of the pipe, not of the record: records\n * are admitted (identity + occurredAtMs stamped) the moment they are logged,\n * and buffering only affects when they travel.\n */\nexport interface RendererLogTransportConfig {\n buffer?: LogPipeBuffer;\n /** Levels that flush the pipe immediately (default ['error']). */\n flushOnLevels?: readonly string[];\n}\n\nexport type RendererLogBatchSender = (batch: unknown) => void;\n\ntype FallbackWriter = (record: LogRecord) => void;\n\nconst DEFAULT_BUFFER: LogPipeBuffer = { mode: 'buffered', intervalMs: 500, maxRecords: 500 };\n\nfunction randomSuffix(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\n/**\n * The renderer's admission point and IPC-facing pipe.\n *\n * Admission happens here, in the renderer, at creation time: each record gets\n * this window's producerId, a strictly increasing sequence, and occurredAtMs\n * stamped when the log call ran. Everything downstream — the pipe's buffer,\n * the batch envelope, the main-process receiver, the database — transports\n * the frozen record unchanged.\n */\nexport class RendererLogTransport {\n private readonly producerId: string;\n private sequence = 0;\n private pipe: LogPipe;\n private sender: RendererLogBatchSender | null = null;\n private fallback: FallbackWriter | null = null;\n private config: RendererLogTransportConfig;\n\n constructor(config: RendererLogTransportConfig = {}) {\n const c = globalThis.crypto;\n this.producerId = `renderer:${c && typeof c.randomUUID === 'function' ? c.randomUUID() : randomSuffix()}`;\n this.config = config;\n this.pipe = this.buildPipe();\n }\n\n /** Rebuilds the pipe with new buffering config; pending records are flushed first. */\n configure(config: RendererLogTransportConfig): void {\n this.pipe.flush();\n void this.pipe.close();\n this.config = config;\n this.pipe = this.buildPipe();\n }\n\n /** Installs the batch sender (the preload bridge's __logBatch). */\n setSender(sender: RendererLogBatchSender | null): void {\n this.sender = sender;\n }\n\n /** Installs the per-record fallback used when no batch sender is available. */\n setFallback(fallback: FallbackWriter | null): void {\n this.fallback = fallback;\n }\n\n /** Admits one renderer log call: stamps identity + time, enters the pipe. */\n admit(level: string, logger: string, message: string, context?: unknown): LogRecord {\n const record = Object.freeze({\n id: this.nextId(),\n occurredAtMs: Date.now(),\n producerId: this.producerId,\n sequence: ++this.sequence,\n level,\n logger,\n message,\n service: 'renderer',\n environment: 'renderer',\n ...(context !== undefined ? { context: sanitizeContext(context) } : {}),\n });\n this.pipe.accept(record);\n return record;\n }\n\n /** Drains buffered records across the boundary now. */\n flush(): void {\n this.pipe.flush();\n }\n\n private buildPipe(): LogPipe {\n const pipe = createLogPipe({\n buffer: this.config.buffer ?? DEFAULT_BUFFER,\n flushOnLevels: this.config.flushOnLevels ?? ['error'],\n name: 'renderer-log-ipc',\n });\n pipe.to((records) => this.send(records));\n return pipe;\n }\n\n private send(records: readonly LogRecord[]): void {\n if (this.sender) {\n try {\n this.sender(createRecordBatch(records));\n return;\n } catch {\n // Fall through to per-record fallback below.\n }\n }\n if (this.fallback) {\n for (const record of records) this.fallback(record);\n }\n }\n\n private nextId(): string {\n const c = globalThis.crypto;\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n return `${this.producerId}-${this.sequence + 1}-${randomSuffix()}`;\n }\n}\n\n/**\n * Context crossing IPC must survive structured clone: snapshot through JSON\n * with circular/bigint/Error handling. The original object stays untouched.\n */\nfunction sanitizeContext(value: unknown): unknown {\n const seen = new WeakSet<object>();\n try {\n const json = JSON.stringify(value, (_key, val: unknown) => {\n if (typeof val === 'bigint') return val.toString();\n if (typeof val === 'object' && val !== null) {\n if (seen.has(val)) return '[Circular]';\n seen.add(val);\n }\n if (val instanceof Error) {\n return { name: val.name, message: val.message, stack: val.stack };\n }\n return val;\n });\n return json === undefined ? undefined : JSON.parse(json);\n } catch {\n return '[Unserializable]';\n }\n}\n\ntype GlobalWithTransport = typeof globalThis & {\n [TRANSPORT_SYMBOL]?: RendererLogTransport;\n};\n\nexport function getRendererLogTransport(): RendererLogTransport {\n const globalObj = globalThis as GlobalWithTransport;\n if (!globalObj[TRANSPORT_SYMBOL]) {\n globalObj[TRANSPORT_SYMBOL] = new RendererLogTransport();\n }\n return globalObj[TRANSPORT_SYMBOL];\n}\n\n/** Reconfigures the renderer→main log pipe (buffer interval, flush levels). */\nexport function configureRendererLogTransport(config: RendererLogTransportConfig): void {\n getRendererLogTransport().configure(config);\n}\n\n/** Flushes all buffered renderer logs across the IPC boundary now. */\nexport function flushRendererLogs(): void {\n getRendererLogTransport().flush();\n}\n\nexport function clearRendererLogTransportForTests(): void {\n delete (globalThis as GlobalWithTransport)[TRANSPORT_SYMBOL];\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { LogPipeBuffer, LogRecord } from '@noego/logger';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Per-pipe buffering configuration for renderer logs crossing the IPC
|
|
5
|
+
* boundary. Batching is a property of the pipe, not of the record: records
|
|
6
|
+
* are admitted (identity + occurredAtMs stamped) the moment they are logged,
|
|
7
|
+
* and buffering only affects when they travel.
|
|
8
|
+
*/
|
|
9
|
+
interface RendererLogTransportConfig {
|
|
10
|
+
buffer?: LogPipeBuffer;
|
|
11
|
+
/** Levels that flush the pipe immediately (default ['error']). */
|
|
12
|
+
flushOnLevels?: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
type RendererLogBatchSender = (batch: unknown) => void;
|
|
15
|
+
type FallbackWriter = (record: LogRecord) => void;
|
|
16
|
+
/**
|
|
17
|
+
* The renderer's admission point and IPC-facing pipe.
|
|
18
|
+
*
|
|
19
|
+
* Admission happens here, in the renderer, at creation time: each record gets
|
|
20
|
+
* this window's producerId, a strictly increasing sequence, and occurredAtMs
|
|
21
|
+
* stamped when the log call ran. Everything downstream — the pipe's buffer,
|
|
22
|
+
* the batch envelope, the main-process receiver, the database — transports
|
|
23
|
+
* the frozen record unchanged.
|
|
24
|
+
*/
|
|
25
|
+
declare class RendererLogTransport {
|
|
26
|
+
private readonly producerId;
|
|
27
|
+
private sequence;
|
|
28
|
+
private pipe;
|
|
29
|
+
private sender;
|
|
30
|
+
private fallback;
|
|
31
|
+
private config;
|
|
32
|
+
constructor(config?: RendererLogTransportConfig);
|
|
33
|
+
/** Rebuilds the pipe with new buffering config; pending records are flushed first. */
|
|
34
|
+
configure(config: RendererLogTransportConfig): void;
|
|
35
|
+
/** Installs the batch sender (the preload bridge's __logBatch). */
|
|
36
|
+
setSender(sender: RendererLogBatchSender | null): void;
|
|
37
|
+
/** Installs the per-record fallback used when no batch sender is available. */
|
|
38
|
+
setFallback(fallback: FallbackWriter | null): void;
|
|
39
|
+
/** Admits one renderer log call: stamps identity + time, enters the pipe. */
|
|
40
|
+
admit(level: string, logger: string, message: string, context?: unknown): LogRecord;
|
|
41
|
+
/** Drains buffered records across the boundary now. */
|
|
42
|
+
flush(): void;
|
|
43
|
+
private buildPipe;
|
|
44
|
+
private send;
|
|
45
|
+
private nextId;
|
|
46
|
+
}
|
|
47
|
+
declare function getRendererLogTransport(): RendererLogTransport;
|
|
48
|
+
/** Reconfigures the renderer→main log pipe (buffer interval, flush levels). */
|
|
49
|
+
declare function configureRendererLogTransport(config: RendererLogTransportConfig): void;
|
|
50
|
+
/** Flushes all buffered renderer logs across the IPC boundary now. */
|
|
51
|
+
declare function flushRendererLogs(): void;
|
|
52
|
+
declare function clearRendererLogTransportForTests(): void;
|
|
53
|
+
|
|
54
|
+
export { type RendererLogBatchSender, RendererLogTransport, type RendererLogTransportConfig, clearRendererLogTransportForTests, configureRendererLogTransport, flushRendererLogs, getRendererLogTransport };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { LogPipeBuffer, LogRecord } from '@noego/logger';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Per-pipe buffering configuration for renderer logs crossing the IPC
|
|
5
|
+
* boundary. Batching is a property of the pipe, not of the record: records
|
|
6
|
+
* are admitted (identity + occurredAtMs stamped) the moment they are logged,
|
|
7
|
+
* and buffering only affects when they travel.
|
|
8
|
+
*/
|
|
9
|
+
interface RendererLogTransportConfig {
|
|
10
|
+
buffer?: LogPipeBuffer;
|
|
11
|
+
/** Levels that flush the pipe immediately (default ['error']). */
|
|
12
|
+
flushOnLevels?: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
type RendererLogBatchSender = (batch: unknown) => void;
|
|
15
|
+
type FallbackWriter = (record: LogRecord) => void;
|
|
16
|
+
/**
|
|
17
|
+
* The renderer's admission point and IPC-facing pipe.
|
|
18
|
+
*
|
|
19
|
+
* Admission happens here, in the renderer, at creation time: each record gets
|
|
20
|
+
* this window's producerId, a strictly increasing sequence, and occurredAtMs
|
|
21
|
+
* stamped when the log call ran. Everything downstream — the pipe's buffer,
|
|
22
|
+
* the batch envelope, the main-process receiver, the database — transports
|
|
23
|
+
* the frozen record unchanged.
|
|
24
|
+
*/
|
|
25
|
+
declare class RendererLogTransport {
|
|
26
|
+
private readonly producerId;
|
|
27
|
+
private sequence;
|
|
28
|
+
private pipe;
|
|
29
|
+
private sender;
|
|
30
|
+
private fallback;
|
|
31
|
+
private config;
|
|
32
|
+
constructor(config?: RendererLogTransportConfig);
|
|
33
|
+
/** Rebuilds the pipe with new buffering config; pending records are flushed first. */
|
|
34
|
+
configure(config: RendererLogTransportConfig): void;
|
|
35
|
+
/** Installs the batch sender (the preload bridge's __logBatch). */
|
|
36
|
+
setSender(sender: RendererLogBatchSender | null): void;
|
|
37
|
+
/** Installs the per-record fallback used when no batch sender is available. */
|
|
38
|
+
setFallback(fallback: FallbackWriter | null): void;
|
|
39
|
+
/** Admits one renderer log call: stamps identity + time, enters the pipe. */
|
|
40
|
+
admit(level: string, logger: string, message: string, context?: unknown): LogRecord;
|
|
41
|
+
/** Drains buffered records across the boundary now. */
|
|
42
|
+
flush(): void;
|
|
43
|
+
private buildPipe;
|
|
44
|
+
private send;
|
|
45
|
+
private nextId;
|
|
46
|
+
}
|
|
47
|
+
declare function getRendererLogTransport(): RendererLogTransport;
|
|
48
|
+
/** Reconfigures the renderer→main log pipe (buffer interval, flush levels). */
|
|
49
|
+
declare function configureRendererLogTransport(config: RendererLogTransportConfig): void;
|
|
50
|
+
/** Flushes all buffered renderer logs across the IPC boundary now. */
|
|
51
|
+
declare function flushRendererLogs(): void;
|
|
52
|
+
declare function clearRendererLogTransportForTests(): void;
|
|
53
|
+
|
|
54
|
+
export { type RendererLogBatchSender, RendererLogTransport, type RendererLogTransportConfig, clearRendererLogTransportForTests, configureRendererLogTransport, flushRendererLogs, getRendererLogTransport };
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { createLogPipe } from "@noego/logger";
|
|
2
|
+
import { createRecordBatch } from "@noego/trace/stream";
|
|
3
|
+
const TRANSPORT_SYMBOL = /* @__PURE__ */ Symbol.for("@noego/wood.client.renderer-log-transport");
|
|
4
|
+
const DEFAULT_BUFFER = { mode: "buffered", intervalMs: 500, maxRecords: 500 };
|
|
5
|
+
function randomSuffix() {
|
|
6
|
+
return Math.random().toString(36).slice(2, 10);
|
|
7
|
+
}
|
|
8
|
+
class RendererLogTransport {
|
|
9
|
+
constructor(config = {}) {
|
|
10
|
+
this.sequence = 0;
|
|
11
|
+
this.sender = null;
|
|
12
|
+
this.fallback = null;
|
|
13
|
+
const c = globalThis.crypto;
|
|
14
|
+
this.producerId = `renderer:${c && typeof c.randomUUID === "function" ? c.randomUUID() : randomSuffix()}`;
|
|
15
|
+
this.config = config;
|
|
16
|
+
this.pipe = this.buildPipe();
|
|
17
|
+
}
|
|
18
|
+
/** Rebuilds the pipe with new buffering config; pending records are flushed first. */
|
|
19
|
+
configure(config) {
|
|
20
|
+
this.pipe.flush();
|
|
21
|
+
void this.pipe.close();
|
|
22
|
+
this.config = config;
|
|
23
|
+
this.pipe = this.buildPipe();
|
|
24
|
+
}
|
|
25
|
+
/** Installs the batch sender (the preload bridge's __logBatch). */
|
|
26
|
+
setSender(sender) {
|
|
27
|
+
this.sender = sender;
|
|
28
|
+
}
|
|
29
|
+
/** Installs the per-record fallback used when no batch sender is available. */
|
|
30
|
+
setFallback(fallback) {
|
|
31
|
+
this.fallback = fallback;
|
|
32
|
+
}
|
|
33
|
+
/** Admits one renderer log call: stamps identity + time, enters the pipe. */
|
|
34
|
+
admit(level, logger, message, context) {
|
|
35
|
+
const record = Object.freeze({
|
|
36
|
+
id: this.nextId(),
|
|
37
|
+
occurredAtMs: Date.now(),
|
|
38
|
+
producerId: this.producerId,
|
|
39
|
+
sequence: ++this.sequence,
|
|
40
|
+
level,
|
|
41
|
+
logger,
|
|
42
|
+
message,
|
|
43
|
+
service: "renderer",
|
|
44
|
+
environment: "renderer",
|
|
45
|
+
...context !== void 0 ? { context: sanitizeContext(context) } : {}
|
|
46
|
+
});
|
|
47
|
+
this.pipe.accept(record);
|
|
48
|
+
return record;
|
|
49
|
+
}
|
|
50
|
+
/** Drains buffered records across the boundary now. */
|
|
51
|
+
flush() {
|
|
52
|
+
this.pipe.flush();
|
|
53
|
+
}
|
|
54
|
+
buildPipe() {
|
|
55
|
+
const pipe = createLogPipe({
|
|
56
|
+
buffer: this.config.buffer ?? DEFAULT_BUFFER,
|
|
57
|
+
flushOnLevels: this.config.flushOnLevels ?? ["error"],
|
|
58
|
+
name: "renderer-log-ipc"
|
|
59
|
+
});
|
|
60
|
+
pipe.to((records) => this.send(records));
|
|
61
|
+
return pipe;
|
|
62
|
+
}
|
|
63
|
+
send(records) {
|
|
64
|
+
if (this.sender) {
|
|
65
|
+
try {
|
|
66
|
+
this.sender(createRecordBatch(records));
|
|
67
|
+
return;
|
|
68
|
+
} catch {
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (this.fallback) {
|
|
72
|
+
for (const record of records) this.fallback(record);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
nextId() {
|
|
76
|
+
const c = globalThis.crypto;
|
|
77
|
+
if (c && typeof c.randomUUID === "function") return c.randomUUID();
|
|
78
|
+
return `${this.producerId}-${this.sequence + 1}-${randomSuffix()}`;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function sanitizeContext(value) {
|
|
82
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
83
|
+
try {
|
|
84
|
+
const json = JSON.stringify(value, (_key, val) => {
|
|
85
|
+
if (typeof val === "bigint") return val.toString();
|
|
86
|
+
if (typeof val === "object" && val !== null) {
|
|
87
|
+
if (seen.has(val)) return "[Circular]";
|
|
88
|
+
seen.add(val);
|
|
89
|
+
}
|
|
90
|
+
if (val instanceof Error) {
|
|
91
|
+
return { name: val.name, message: val.message, stack: val.stack };
|
|
92
|
+
}
|
|
93
|
+
return val;
|
|
94
|
+
});
|
|
95
|
+
return json === void 0 ? void 0 : JSON.parse(json);
|
|
96
|
+
} catch {
|
|
97
|
+
return "[Unserializable]";
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function getRendererLogTransport() {
|
|
101
|
+
const globalObj = globalThis;
|
|
102
|
+
if (!globalObj[TRANSPORT_SYMBOL]) {
|
|
103
|
+
globalObj[TRANSPORT_SYMBOL] = new RendererLogTransport();
|
|
104
|
+
}
|
|
105
|
+
return globalObj[TRANSPORT_SYMBOL];
|
|
106
|
+
}
|
|
107
|
+
function configureRendererLogTransport(config) {
|
|
108
|
+
getRendererLogTransport().configure(config);
|
|
109
|
+
}
|
|
110
|
+
function flushRendererLogs() {
|
|
111
|
+
getRendererLogTransport().flush();
|
|
112
|
+
}
|
|
113
|
+
function clearRendererLogTransportForTests() {
|
|
114
|
+
delete globalThis[TRANSPORT_SYMBOL];
|
|
115
|
+
}
|
|
116
|
+
export {
|
|
117
|
+
RendererLogTransport,
|
|
118
|
+
clearRendererLogTransportForTests,
|
|
119
|
+
configureRendererLogTransport,
|
|
120
|
+
flushRendererLogs,
|
|
121
|
+
getRendererLogTransport
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=renderer_log_transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/renderer_log_transport.ts"],"sourcesContent":["import { createLogPipe, type LogPipe, type LogPipeBuffer, type LogRecord } from '@noego/logger';\nimport { createRecordBatch } from '@noego/trace/stream';\n\nconst TRANSPORT_SYMBOL = Symbol.for('@noego/wood.client.renderer-log-transport');\n\n/**\n * Per-pipe buffering configuration for renderer logs crossing the IPC\n * boundary. Batching is a property of the pipe, not of the record: records\n * are admitted (identity + occurredAtMs stamped) the moment they are logged,\n * and buffering only affects when they travel.\n */\nexport interface RendererLogTransportConfig {\n buffer?: LogPipeBuffer;\n /** Levels that flush the pipe immediately (default ['error']). */\n flushOnLevels?: readonly string[];\n}\n\nexport type RendererLogBatchSender = (batch: unknown) => void;\n\ntype FallbackWriter = (record: LogRecord) => void;\n\nconst DEFAULT_BUFFER: LogPipeBuffer = { mode: 'buffered', intervalMs: 500, maxRecords: 500 };\n\nfunction randomSuffix(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\n/**\n * The renderer's admission point and IPC-facing pipe.\n *\n * Admission happens here, in the renderer, at creation time: each record gets\n * this window's producerId, a strictly increasing sequence, and occurredAtMs\n * stamped when the log call ran. Everything downstream — the pipe's buffer,\n * the batch envelope, the main-process receiver, the database — transports\n * the frozen record unchanged.\n */\nexport class RendererLogTransport {\n private readonly producerId: string;\n private sequence = 0;\n private pipe: LogPipe;\n private sender: RendererLogBatchSender | null = null;\n private fallback: FallbackWriter | null = null;\n private config: RendererLogTransportConfig;\n\n constructor(config: RendererLogTransportConfig = {}) {\n const c = globalThis.crypto;\n this.producerId = `renderer:${c && typeof c.randomUUID === 'function' ? c.randomUUID() : randomSuffix()}`;\n this.config = config;\n this.pipe = this.buildPipe();\n }\n\n /** Rebuilds the pipe with new buffering config; pending records are flushed first. */\n configure(config: RendererLogTransportConfig): void {\n this.pipe.flush();\n void this.pipe.close();\n this.config = config;\n this.pipe = this.buildPipe();\n }\n\n /** Installs the batch sender (the preload bridge's __logBatch). */\n setSender(sender: RendererLogBatchSender | null): void {\n this.sender = sender;\n }\n\n /** Installs the per-record fallback used when no batch sender is available. */\n setFallback(fallback: FallbackWriter | null): void {\n this.fallback = fallback;\n }\n\n /** Admits one renderer log call: stamps identity + time, enters the pipe. */\n admit(level: string, logger: string, message: string, context?: unknown): LogRecord {\n const record = Object.freeze({\n id: this.nextId(),\n occurredAtMs: Date.now(),\n producerId: this.producerId,\n sequence: ++this.sequence,\n level,\n logger,\n message,\n service: 'renderer',\n environment: 'renderer',\n ...(context !== undefined ? { context: sanitizeContext(context) } : {}),\n });\n this.pipe.accept(record);\n return record;\n }\n\n /** Drains buffered records across the boundary now. */\n flush(): void {\n this.pipe.flush();\n }\n\n private buildPipe(): LogPipe {\n const pipe = createLogPipe({\n buffer: this.config.buffer ?? DEFAULT_BUFFER,\n flushOnLevels: this.config.flushOnLevels ?? ['error'],\n name: 'renderer-log-ipc',\n });\n pipe.to((records) => this.send(records));\n return pipe;\n }\n\n private send(records: readonly LogRecord[]): void {\n if (this.sender) {\n try {\n this.sender(createRecordBatch(records));\n return;\n } catch {\n // Fall through to per-record fallback below.\n }\n }\n if (this.fallback) {\n for (const record of records) this.fallback(record);\n }\n }\n\n private nextId(): string {\n const c = globalThis.crypto;\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n return `${this.producerId}-${this.sequence + 1}-${randomSuffix()}`;\n }\n}\n\n/**\n * Context crossing IPC must survive structured clone: snapshot through JSON\n * with circular/bigint/Error handling. The original object stays untouched.\n */\nfunction sanitizeContext(value: unknown): unknown {\n const seen = new WeakSet<object>();\n try {\n const json = JSON.stringify(value, (_key, val: unknown) => {\n if (typeof val === 'bigint') return val.toString();\n if (typeof val === 'object' && val !== null) {\n if (seen.has(val)) return '[Circular]';\n seen.add(val);\n }\n if (val instanceof Error) {\n return { name: val.name, message: val.message, stack: val.stack };\n }\n return val;\n });\n return json === undefined ? undefined : JSON.parse(json);\n } catch {\n return '[Unserializable]';\n }\n}\n\ntype GlobalWithTransport = typeof globalThis & {\n [TRANSPORT_SYMBOL]?: RendererLogTransport;\n};\n\nexport function getRendererLogTransport(): RendererLogTransport {\n const globalObj = globalThis as GlobalWithTransport;\n if (!globalObj[TRANSPORT_SYMBOL]) {\n globalObj[TRANSPORT_SYMBOL] = new RendererLogTransport();\n }\n return globalObj[TRANSPORT_SYMBOL];\n}\n\n/** Reconfigures the renderer→main log pipe (buffer interval, flush levels). */\nexport function configureRendererLogTransport(config: RendererLogTransportConfig): void {\n getRendererLogTransport().configure(config);\n}\n\n/** Flushes all buffered renderer logs across the IPC boundary now. */\nexport function flushRendererLogs(): void {\n getRendererLogTransport().flush();\n}\n\nexport function clearRendererLogTransportForTests(): void {\n delete (globalThis as GlobalWithTransport)[TRANSPORT_SYMBOL];\n}\n"],"mappings":"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","names":[]}
|
|
@@ -28,7 +28,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
var controller_registration_generator_exports = {};
|
|
30
30
|
__export(controller_registration_generator_exports, {
|
|
31
|
-
|
|
31
|
+
controllerFileCandidates: () => controllerFileCandidates,
|
|
32
|
+
generateControllerRegistration: () => generateControllerRegistration,
|
|
33
|
+
resolveControllerFile: () => resolveControllerFile
|
|
32
34
|
});
|
|
33
35
|
module.exports = __toCommonJS(controller_registration_generator_exports);
|
|
34
36
|
var import_fs = require("fs");
|
|
@@ -48,6 +50,13 @@ const INDEX_CANDIDATES = [
|
|
|
48
50
|
"index.ts",
|
|
49
51
|
"index.js"
|
|
50
52
|
];
|
|
53
|
+
function controllerFileCandidates(controllerName, controllersDir) {
|
|
54
|
+
const basePath = import_path.default.resolve(controllersDir, controllerName);
|
|
55
|
+
return [
|
|
56
|
+
...CANDIDATE_SUFFIXES.map((suffix) => basePath + suffix),
|
|
57
|
+
...INDEX_CANDIDATES.map((indexFile) => import_path.default.resolve(controllersDir, controllerName, indexFile))
|
|
58
|
+
];
|
|
59
|
+
}
|
|
51
60
|
function resolveControllerFile(controllerName, controllersDir) {
|
|
52
61
|
const basePath = import_path.default.resolve(controllersDir, controllerName);
|
|
53
62
|
for (const suffix of CANDIDATE_SUFFIXES) {
|
|
@@ -138,6 +147,8 @@ Ensure each controller file exists with one of these suffixes: .ts, .controller.
|
|
|
138
147
|
}
|
|
139
148
|
// Annotate the CommonJS export names for ESM import in node:
|
|
140
149
|
0 && (module.exports = {
|
|
141
|
-
|
|
150
|
+
controllerFileCandidates,
|
|
151
|
+
generateControllerRegistration,
|
|
152
|
+
resolveControllerFile
|
|
142
153
|
});
|
|
143
154
|
//# sourceMappingURL=controller_registration_generator.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/codegen/controller_registration_generator.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport path from 'path';\nimport type { OperationDef } from '../types/index.cjs';\nimport { generatedFileNotice } from './generated_file_notice.cjs';\n\nconst CONTROLLER_REGISTRATION_SOURCE_INSTRUCTIONS = [\n 'To change controller registration, edit the operations YAML configured by',\n 'wood.config.yml main.openapi and the matching controller files.',\n] as const;\n\n/**\n * Candidate file extensions to search when resolving a controller name to a file.\n * Matches the order used by ControllerResolver.resolveClass().\n */\nconst CANDIDATE_SUFFIXES = [\n '.ts',\n '.controller.ts',\n '.js',\n '.controller.js',\n] as const;\n\nconst INDEX_CANDIDATES = [\n 'index.ts',\n 'index.js',\n] as const;\n\n/**\n * Resolve a controller name to a file path on disk.\n * Returns the first candidate that exists, or undefined if none match.\n */\
|
|
1
|
+
{"version":3,"sources":["../../src/codegen/controller_registration_generator.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport path from 'path';\nimport type { OperationDef } from '../types/index.cjs';\nimport { generatedFileNotice } from './generated_file_notice.cjs';\n\nconst CONTROLLER_REGISTRATION_SOURCE_INSTRUCTIONS = [\n 'To change controller registration, edit the operations YAML configured by',\n 'wood.config.yml main.openapi and the matching controller files.',\n] as const;\n\n/**\n * Candidate file extensions to search when resolving a controller name to a file.\n * Matches the order used by ControllerResolver.resolveClass().\n */\nconst CANDIDATE_SUFFIXES = [\n '.ts',\n '.controller.ts',\n '.js',\n '.controller.js',\n] as const;\n\nconst INDEX_CANDIDATES = [\n 'index.ts',\n 'index.js',\n] as const;\n\n/**\n * Every file a controller identity may live at, in resolution order —\n * shared by codegen and by test-time auto-binding so both agree on where an\n * identity resolves and on what to report when it does not.\n */\nexport function controllerFileCandidates(controllerName: string, controllersDir: string): string[] {\n const basePath = path.resolve(controllersDir, controllerName);\n return [\n ...CANDIDATE_SUFFIXES.map((suffix) => basePath + suffix),\n ...INDEX_CANDIDATES.map((indexFile) => path.resolve(controllersDir, controllerName, indexFile)),\n ];\n}\n\n/**\n * Resolve a controller name to a file path on disk.\n * Returns the first candidate that exists, or undefined if none match.\n */\nexport function resolveControllerFile(controllerName: string, controllersDir: string): string | undefined {\n const basePath = path.resolve(controllersDir, controllerName);\n\n for (const suffix of CANDIDATE_SUFFIXES) {\n const candidate = basePath + suffix;\n if (existsSync(candidate)) return candidate;\n }\n\n for (const indexFile of INDEX_CANDIDATES) {\n const candidate = path.resolve(controllersDir, controllerName, indexFile);\n if (existsSync(candidate)) return candidate;\n }\n\n return undefined;\n}\n\n/**\n * Compute a relative import path from the generated file's directory to the\n * resolved controller file. Strips `.ts` extensions since TypeScript imports\n * should not include them.\n */\nfunction computeImportPath(fromDir: string, toFile: string): string {\n let rel = path.relative(fromDir, toFile);\n\n // Ensure the path starts with ./ or ../\n if (!rel.startsWith('.')) {\n rel = './' + rel;\n }\n\n // Strip .ts extension (TypeScript convention)\n if (rel.endsWith('.ts')) {\n rel = rel.slice(0, -3);\n }\n\n // Normalize path separators to forward slashes (Windows compat)\n return rel.replace(/\\\\/g, '/');\n}\n\n/**\n * Convert a controller name to a valid PascalCase identifier for the import.\n * e.g. \"chat\" -> \"ChatController\", \"multi_agent\" -> \"MultiAgentController\"\n */\nfunction toControllerClassName(controllerName: string): string {\n const pascal = controllerName\n .split(/[_\\-.]/)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join('');\n\n return pascal + 'Controller';\n}\n\n/**\n * Extract all unique controller names from a set of parsed operations.\n */\nfunction extractControllerNames(operations: Map<string, OperationDef>): string[] {\n const names = new Set<string>();\n\n operations.forEach((op) => {\n names.add(op.controller);\n });\n\n return Array.from(names).sort();\n}\n\nexport interface ControllerRegistrationOptions {\n /** Directory where controller source files live */\n controllersDir: string;\n /** Directory where the generated file will be written */\n outDir: string;\n /** If true, unresolved controllers emit a warning comment instead of throwing. Default: false. */\n allowUnresolved?: boolean;\n}\n\n/**\n * Generate a TypeScript registration file that statically imports every\n * controller referenced in operations and exports a function to register\n * them with a WoodRouter.\n */\nexport function generateControllerRegistration(\n operations: Map<string, OperationDef>,\n options: ControllerRegistrationOptions,\n): string {\n const controllerNames = extractControllerNames(operations);\n const outDirResolved = path.resolve(options.outDir);\n\n const imports: string[] = [];\n const registrations: string[] = [];\n const unresolved: string[] = [];\n\n for (const name of controllerNames) {\n const filePath = resolveControllerFile(name, options.controllersDir);\n\n if (!filePath) {\n unresolved.push(name);\n continue;\n }\n\n const importPath = computeImportPath(outDirResolved, filePath);\n const className = toControllerClassName(name);\n\n imports.push(`import ${className} from '${importPath}';`);\n registrations.push(` router.registerController('${name}', ${className});`);\n }\n\n // Fail by default when controllers cannot be resolved\n if (unresolved.length > 0 && !options.allowUnresolved) {\n throw new Error(\n `Controller registration codegen failed: ${unresolved.length} controller(s) not found on disk:\\n` +\n unresolved.map(name => ` - \"${name}\" (searched in ${options.controllersDir})`).join('\\n') +\n `\\n\\nEnsure each controller file exists with one of these suffixes: .ts, .controller.ts, .js, .controller.js`\n );\n }\n\n const lines: string[] = [\n generatedFileNotice(CONTROLLER_REGISTRATION_SOURCE_INSTRUCTIONS),\n '//',\n '// Static imports ensure all controllers are bundled and available at startup.',\n '// registerController() puts each class directly in the router\\'s cache.',\n ];\n\n if (unresolved.length > 0) {\n lines.push(\n '',\n '// WARNING: The following controllers could not be resolved on disk:',\n ...unresolved.map((name) => `// - ${name}`),\n );\n }\n\n // Static imports\n lines.push('');\n for (const imp of imports) {\n lines.push(imp);\n }\n\n // Registration function\n lines.push(\n '',\n 'export function registerControllers(router: { registerController(name: string, cls: any): void }) {',\n );\n for (const reg of registrations) {\n lines.push(reg);\n }\n lines.push(\n '}',\n '',\n );\n\n return lines.join('\\n');\n}\n"],"mappings":"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","names":["path"]}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { OperationDef } from '../types/operations.cjs';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Every file a controller identity may live at, in resolution order —
|
|
5
|
+
* shared by codegen and by test-time auto-binding so both agree on where an
|
|
6
|
+
* identity resolves and on what to report when it does not.
|
|
7
|
+
*/
|
|
8
|
+
declare function controllerFileCandidates(controllerName: string, controllersDir: string): string[];
|
|
9
|
+
/**
|
|
10
|
+
* Resolve a controller name to a file path on disk.
|
|
11
|
+
* Returns the first candidate that exists, or undefined if none match.
|
|
12
|
+
*/
|
|
13
|
+
declare function resolveControllerFile(controllerName: string, controllersDir: string): string | undefined;
|
|
3
14
|
interface ControllerRegistrationOptions {
|
|
4
15
|
/** Directory where controller source files live */
|
|
5
16
|
controllersDir: string;
|
|
@@ -15,4 +26,4 @@ interface ControllerRegistrationOptions {
|
|
|
15
26
|
*/
|
|
16
27
|
declare function generateControllerRegistration(operations: Map<string, OperationDef>, options: ControllerRegistrationOptions): string;
|
|
17
28
|
|
|
18
|
-
export { type ControllerRegistrationOptions, generateControllerRegistration };
|
|
29
|
+
export { type ControllerRegistrationOptions, controllerFileCandidates, generateControllerRegistration, resolveControllerFile };
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { OperationDef } from '../types/operations.js';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Every file a controller identity may live at, in resolution order —
|
|
5
|
+
* shared by codegen and by test-time auto-binding so both agree on where an
|
|
6
|
+
* identity resolves and on what to report when it does not.
|
|
7
|
+
*/
|
|
8
|
+
declare function controllerFileCandidates(controllerName: string, controllersDir: string): string[];
|
|
9
|
+
/**
|
|
10
|
+
* Resolve a controller name to a file path on disk.
|
|
11
|
+
* Returns the first candidate that exists, or undefined if none match.
|
|
12
|
+
*/
|
|
13
|
+
declare function resolveControllerFile(controllerName: string, controllersDir: string): string | undefined;
|
|
3
14
|
interface ControllerRegistrationOptions {
|
|
4
15
|
/** Directory where controller source files live */
|
|
5
16
|
controllersDir: string;
|
|
@@ -15,4 +26,4 @@ interface ControllerRegistrationOptions {
|
|
|
15
26
|
*/
|
|
16
27
|
declare function generateControllerRegistration(operations: Map<string, OperationDef>, options: ControllerRegistrationOptions): string;
|
|
17
28
|
|
|
18
|
-
export { type ControllerRegistrationOptions, generateControllerRegistration };
|
|
29
|
+
export { type ControllerRegistrationOptions, controllerFileCandidates, generateControllerRegistration, resolveControllerFile };
|
|
@@ -15,6 +15,13 @@ const INDEX_CANDIDATES = [
|
|
|
15
15
|
"index.ts",
|
|
16
16
|
"index.js"
|
|
17
17
|
];
|
|
18
|
+
function controllerFileCandidates(controllerName, controllersDir) {
|
|
19
|
+
const basePath = path.resolve(controllersDir, controllerName);
|
|
20
|
+
return [
|
|
21
|
+
...CANDIDATE_SUFFIXES.map((suffix) => basePath + suffix),
|
|
22
|
+
...INDEX_CANDIDATES.map((indexFile) => path.resolve(controllersDir, controllerName, indexFile))
|
|
23
|
+
];
|
|
24
|
+
}
|
|
18
25
|
function resolveControllerFile(controllerName, controllersDir) {
|
|
19
26
|
const basePath = path.resolve(controllersDir, controllerName);
|
|
20
27
|
for (const suffix of CANDIDATE_SUFFIXES) {
|
|
@@ -104,6 +111,8 @@ Ensure each controller file exists with one of these suffixes: .ts, .controller.
|
|
|
104
111
|
return lines.join("\n");
|
|
105
112
|
}
|
|
106
113
|
export {
|
|
107
|
-
|
|
114
|
+
controllerFileCandidates,
|
|
115
|
+
generateControllerRegistration,
|
|
116
|
+
resolveControllerFile
|
|
108
117
|
};
|
|
109
118
|
//# sourceMappingURL=controller_registration_generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/codegen/controller_registration_generator.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport path from 'path';\nimport type { OperationDef } from '../types/index.js';\nimport { generatedFileNotice } from './generated_file_notice.js';\n\nconst CONTROLLER_REGISTRATION_SOURCE_INSTRUCTIONS = [\n 'To change controller registration, edit the operations YAML configured by',\n 'wood.config.yml main.openapi and the matching controller files.',\n] as const;\n\n/**\n * Candidate file extensions to search when resolving a controller name to a file.\n * Matches the order used by ControllerResolver.resolveClass().\n */\nconst CANDIDATE_SUFFIXES = [\n '.ts',\n '.controller.ts',\n '.js',\n '.controller.js',\n] as const;\n\nconst INDEX_CANDIDATES = [\n 'index.ts',\n 'index.js',\n] as const;\n\n/**\n * Resolve a controller name to a file path on disk.\n * Returns the first candidate that exists, or undefined if none match.\n */\
|
|
1
|
+
{"version":3,"sources":["../../src/codegen/controller_registration_generator.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport path from 'path';\nimport type { OperationDef } from '../types/index.js';\nimport { generatedFileNotice } from './generated_file_notice.js';\n\nconst CONTROLLER_REGISTRATION_SOURCE_INSTRUCTIONS = [\n 'To change controller registration, edit the operations YAML configured by',\n 'wood.config.yml main.openapi and the matching controller files.',\n] as const;\n\n/**\n * Candidate file extensions to search when resolving a controller name to a file.\n * Matches the order used by ControllerResolver.resolveClass().\n */\nconst CANDIDATE_SUFFIXES = [\n '.ts',\n '.controller.ts',\n '.js',\n '.controller.js',\n] as const;\n\nconst INDEX_CANDIDATES = [\n 'index.ts',\n 'index.js',\n] as const;\n\n/**\n * Every file a controller identity may live at, in resolution order —\n * shared by codegen and by test-time auto-binding so both agree on where an\n * identity resolves and on what to report when it does not.\n */\nexport function controllerFileCandidates(controllerName: string, controllersDir: string): string[] {\n const basePath = path.resolve(controllersDir, controllerName);\n return [\n ...CANDIDATE_SUFFIXES.map((suffix) => basePath + suffix),\n ...INDEX_CANDIDATES.map((indexFile) => path.resolve(controllersDir, controllerName, indexFile)),\n ];\n}\n\n/**\n * Resolve a controller name to a file path on disk.\n * Returns the first candidate that exists, or undefined if none match.\n */\nexport function resolveControllerFile(controllerName: string, controllersDir: string): string | undefined {\n const basePath = path.resolve(controllersDir, controllerName);\n\n for (const suffix of CANDIDATE_SUFFIXES) {\n const candidate = basePath + suffix;\n if (existsSync(candidate)) return candidate;\n }\n\n for (const indexFile of INDEX_CANDIDATES) {\n const candidate = path.resolve(controllersDir, controllerName, indexFile);\n if (existsSync(candidate)) return candidate;\n }\n\n return undefined;\n}\n\n/**\n * Compute a relative import path from the generated file's directory to the\n * resolved controller file. Strips `.ts` extensions since TypeScript imports\n * should not include them.\n */\nfunction computeImportPath(fromDir: string, toFile: string): string {\n let rel = path.relative(fromDir, toFile);\n\n // Ensure the path starts with ./ or ../\n if (!rel.startsWith('.')) {\n rel = './' + rel;\n }\n\n // Strip .ts extension (TypeScript convention)\n if (rel.endsWith('.ts')) {\n rel = rel.slice(0, -3);\n }\n\n // Normalize path separators to forward slashes (Windows compat)\n return rel.replace(/\\\\/g, '/');\n}\n\n/**\n * Convert a controller name to a valid PascalCase identifier for the import.\n * e.g. \"chat\" -> \"ChatController\", \"multi_agent\" -> \"MultiAgentController\"\n */\nfunction toControllerClassName(controllerName: string): string {\n const pascal = controllerName\n .split(/[_\\-.]/)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join('');\n\n return pascal + 'Controller';\n}\n\n/**\n * Extract all unique controller names from a set of parsed operations.\n */\nfunction extractControllerNames(operations: Map<string, OperationDef>): string[] {\n const names = new Set<string>();\n\n operations.forEach((op) => {\n names.add(op.controller);\n });\n\n return Array.from(names).sort();\n}\n\nexport interface ControllerRegistrationOptions {\n /** Directory where controller source files live */\n controllersDir: string;\n /** Directory where the generated file will be written */\n outDir: string;\n /** If true, unresolved controllers emit a warning comment instead of throwing. Default: false. */\n allowUnresolved?: boolean;\n}\n\n/**\n * Generate a TypeScript registration file that statically imports every\n * controller referenced in operations and exports a function to register\n * them with a WoodRouter.\n */\nexport function generateControllerRegistration(\n operations: Map<string, OperationDef>,\n options: ControllerRegistrationOptions,\n): string {\n const controllerNames = extractControllerNames(operations);\n const outDirResolved = path.resolve(options.outDir);\n\n const imports: string[] = [];\n const registrations: string[] = [];\n const unresolved: string[] = [];\n\n for (const name of controllerNames) {\n const filePath = resolveControllerFile(name, options.controllersDir);\n\n if (!filePath) {\n unresolved.push(name);\n continue;\n }\n\n const importPath = computeImportPath(outDirResolved, filePath);\n const className = toControllerClassName(name);\n\n imports.push(`import ${className} from '${importPath}';`);\n registrations.push(` router.registerController('${name}', ${className});`);\n }\n\n // Fail by default when controllers cannot be resolved\n if (unresolved.length > 0 && !options.allowUnresolved) {\n throw new Error(\n `Controller registration codegen failed: ${unresolved.length} controller(s) not found on disk:\\n` +\n unresolved.map(name => ` - \"${name}\" (searched in ${options.controllersDir})`).join('\\n') +\n `\\n\\nEnsure each controller file exists with one of these suffixes: .ts, .controller.ts, .js, .controller.js`\n );\n }\n\n const lines: string[] = [\n generatedFileNotice(CONTROLLER_REGISTRATION_SOURCE_INSTRUCTIONS),\n '//',\n '// Static imports ensure all controllers are bundled and available at startup.',\n '// registerController() puts each class directly in the router\\'s cache.',\n ];\n\n if (unresolved.length > 0) {\n lines.push(\n '',\n '// WARNING: The following controllers could not be resolved on disk:',\n ...unresolved.map((name) => `// - ${name}`),\n );\n }\n\n // Static imports\n lines.push('');\n for (const imp of imports) {\n lines.push(imp);\n }\n\n // Registration function\n lines.push(\n '',\n 'export function registerControllers(router: { registerController(name: string, cls: any): void }) {',\n );\n for (const reg of registrations) {\n lines.push(reg);\n }\n lines.push(\n '}',\n '',\n );\n\n return lines.join('\\n');\n}\n"],"mappings":"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","names":[]}
|
package/dist/codegen/index.d.cts
CHANGED
|
@@ -7,5 +7,6 @@ export { RuntimeGeneratorOptions, generateRuntime } from './runtime_generator.cj
|
|
|
7
7
|
export { RendererViewManifestGeneratorOptions, generateRendererViewManifest } from './renderer_view_manifest_generator.cjs';
|
|
8
8
|
export { RendererControllerRegistrationOptions, generateRendererControllerRegistration } from './renderer_controller_registration_generator.cjs';
|
|
9
9
|
export { RendererAppGeneratorOptions, generateRendererApp } from './renderer_app_generator.cjs';
|
|
10
|
+
import '../types/config.cjs';
|
|
10
11
|
import '../types/operations.cjs';
|
|
11
12
|
import '../types/views.cjs';
|
package/dist/codegen/index.d.ts
CHANGED
|
@@ -7,5 +7,6 @@ export { RuntimeGeneratorOptions, generateRuntime } from './runtime_generator.js
|
|
|
7
7
|
export { RendererViewManifestGeneratorOptions, generateRendererViewManifest } from './renderer_view_manifest_generator.js';
|
|
8
8
|
export { RendererControllerRegistrationOptions, generateRendererControllerRegistration } from './renderer_controller_registration_generator.js';
|
|
9
9
|
export { RendererAppGeneratorOptions, generateRendererApp } from './renderer_app_generator.js';
|
|
10
|
+
import '../types/config.js';
|
|
10
11
|
import '../types/operations.js';
|
|
11
12
|
import '../types/views.js';
|