@noego/wood 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +107 -0
- package/bin/axe.js +202 -0
- package/bin/stick.js +96 -0
- package/bin/wood.js +572 -0
- package/dist/bridge/backend_bridge.cjs +186 -0
- package/dist/bridge/backend_bridge.cjs.map +1 -0
- package/dist/bridge/backend_bridge.d.cts +32 -0
- package/dist/bridge/backend_bridge.d.ts +32 -0
- package/dist/bridge/backend_bridge.js +152 -0
- package/dist/bridge/backend_bridge.js.map +1 -0
- package/dist/bridge/backend_entry.cjs +64 -0
- package/dist/bridge/backend_entry.cjs.map +1 -0
- package/dist/bridge/backend_entry.d.cts +14 -0
- package/dist/bridge/backend_entry.d.ts +14 -0
- package/dist/bridge/backend_entry.js +39 -0
- package/dist/bridge/backend_entry.js.map +1 -0
- package/dist/bridge/index.cjs +34 -0
- package/dist/bridge/index.cjs.map +1 -0
- package/dist/bridge/index.d.cts +2 -0
- package/dist/bridge/index.d.ts +2 -0
- package/dist/bridge/index.js +8 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/client/controller_contract.cjs +17 -0
- package/dist/client/controller_contract.cjs.map +1 -0
- package/dist/client/controller_contract.d.cts +15 -0
- package/dist/client/controller_contract.d.ts +15 -0
- package/dist/client/controller_contract.js +1 -0
- package/dist/client/controller_contract.js.map +1 -0
- package/dist/client/global_polyfill.cjs +6 -0
- package/dist/client/global_polyfill.cjs.map +1 -0
- package/dist/client/global_polyfill.d.cts +2 -0
- package/dist/client/global_polyfill.d.ts +2 -0
- package/dist/client/global_polyfill.js +5 -0
- package/dist/client/global_polyfill.js.map +1 -0
- package/dist/client/index.cjs +451 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +75 -0
- package/dist/client/index.d.ts +75 -0
- package/dist/client/index.js +414 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/wood_controller.svelte.cjs +110 -0
- package/dist/client/wood_controller.svelte.cjs.map +1 -0
- package/dist/client/wood_controller.svelte.d.cts +30 -0
- package/dist/client/wood_controller.svelte.d.ts +30 -0
- package/dist/client/wood_controller.svelte.js +86 -0
- package/dist/client/wood_controller.svelte.js.map +1 -0
- package/dist/codegen/controller_registration_generator.cjs +138 -0
- package/dist/codegen/controller_registration_generator.cjs.map +1 -0
- package/dist/codegen/controller_registration_generator.d.cts +18 -0
- package/dist/codegen/controller_registration_generator.d.ts +18 -0
- package/dist/codegen/controller_registration_generator.js +104 -0
- package/dist/codegen/controller_registration_generator.js.map +1 -0
- package/dist/codegen/index.cjs +50 -0
- package/dist/codegen/index.cjs.map +1 -0
- package/dist/codegen/index.d.cts +10 -0
- package/dist/codegen/index.d.ts +10 -0
- package/dist/codegen/index.js +19 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/preload_generator.cjs +151 -0
- package/dist/codegen/preload_generator.cjs.map +1 -0
- package/dist/codegen/preload_generator.d.cts +8 -0
- package/dist/codegen/preload_generator.d.ts +8 -0
- package/dist/codegen/preload_generator.js +127 -0
- package/dist/codegen/preload_generator.js.map +1 -0
- package/dist/codegen/renderer_app_generator.cjs +397 -0
- package/dist/codegen/renderer_app_generator.cjs.map +1 -0
- package/dist/codegen/renderer_app_generator.d.cts +13 -0
- package/dist/codegen/renderer_app_generator.d.ts +13 -0
- package/dist/codegen/renderer_app_generator.js +363 -0
- package/dist/codegen/renderer_app_generator.js.map +1 -0
- package/dist/codegen/renderer_controller_registration_generator.cjs +122 -0
- package/dist/codegen/renderer_controller_registration_generator.cjs.map +1 -0
- package/dist/codegen/renderer_controller_registration_generator.d.cts +9 -0
- package/dist/codegen/renderer_controller_registration_generator.d.ts +9 -0
- package/dist/codegen/renderer_controller_registration_generator.js +88 -0
- package/dist/codegen/renderer_controller_registration_generator.js.map +1 -0
- package/dist/codegen/renderer_view_manifest_generator.cjs +126 -0
- package/dist/codegen/renderer_view_manifest_generator.cjs.map +1 -0
- package/dist/codegen/renderer_view_manifest_generator.d.cts +11 -0
- package/dist/codegen/renderer_view_manifest_generator.d.ts +11 -0
- package/dist/codegen/renderer_view_manifest_generator.js +92 -0
- package/dist/codegen/renderer_view_manifest_generator.js.map +1 -0
- package/dist/codegen/runtime_generator.cjs +156 -0
- package/dist/codegen/runtime_generator.cjs.map +1 -0
- package/dist/codegen/runtime_generator.d.cts +14 -0
- package/dist/codegen/runtime_generator.d.ts +14 -0
- package/dist/codegen/runtime_generator.js +122 -0
- package/dist/codegen/runtime_generator.js.map +1 -0
- package/dist/codegen/test_mock_generator.cjs +98 -0
- package/dist/codegen/test_mock_generator.cjs.map +1 -0
- package/dist/codegen/test_mock_generator.d.cts +5 -0
- package/dist/codegen/test_mock_generator.d.ts +5 -0
- package/dist/codegen/test_mock_generator.js +74 -0
- package/dist/codegen/test_mock_generator.js.map +1 -0
- package/dist/codegen/type_generator.cjs +203 -0
- package/dist/codegen/type_generator.cjs.map +1 -0
- package/dist/codegen/type_generator.d.cts +5 -0
- package/dist/codegen/type_generator.d.ts +5 -0
- package/dist/codegen/type_generator.js +179 -0
- package/dist/codegen/type_generator.js.map +1 -0
- package/dist/components/contextMenu.cjs +163 -0
- package/dist/components/contextMenu.cjs.map +1 -0
- package/dist/components/contextMenu.d.cts +43 -0
- package/dist/components/contextMenu.d.ts +43 -0
- package/dist/components/contextMenu.js +138 -0
- package/dist/components/contextMenu.js.map +1 -0
- package/dist/config/config_parser.cjs +176 -0
- package/dist/config/config_parser.cjs.map +1 -0
- package/dist/config/config_parser.d.cts +9 -0
- package/dist/config/config_parser.d.ts +9 -0
- package/dist/config/config_parser.js +142 -0
- package/dist/config/config_parser.js.map +1 -0
- package/dist/config/index.cjs +29 -0
- package/dist/config/index.cjs.map +1 -0
- package/dist/config/index.d.cts +2 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/controller/__fixtures__/controllers/chat.cjs +32 -0
- package/dist/controller/__fixtures__/controllers/chat.cjs.map +1 -0
- package/dist/controller/__fixtures__/controllers/chat.d.cts +11 -0
- package/dist/controller/__fixtures__/controllers/chat.d.ts +11 -0
- package/dist/controller/__fixtures__/controllers/chat.js +12 -0
- package/dist/controller/__fixtures__/controllers/chat.js.map +1 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.cjs +29 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.cjs.map +1 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.d.cts +3 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.d.ts +3 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.js +5 -0
- package/dist/controller/__fixtures__/controllers/not_a_class.js.map +1 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.cjs +32 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.cjs.map +1 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.d.cts +12 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.d.ts +12 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.js +12 -0
- package/dist/controller/__fixtures__/controllers/settings.controller.js.map +1 -0
- package/dist/controller/__fixtures__/controllers/test.cjs +29 -0
- package/dist/controller/__fixtures__/controllers/test.cjs.map +1 -0
- package/dist/controller/__fixtures__/controllers/test.d.cts +7 -0
- package/dist/controller/__fixtures__/controllers/test.d.ts +7 -0
- package/dist/controller/__fixtures__/controllers/test.js +9 -0
- package/dist/controller/__fixtures__/controllers/test.js.map +1 -0
- package/dist/controller/controller_resolver.cjs +180 -0
- package/dist/controller/controller_resolver.cjs.map +1 -0
- package/dist/controller/controller_resolver.d.cts +51 -0
- package/dist/controller/controller_resolver.d.ts +51 -0
- package/dist/controller/controller_resolver.js +145 -0
- package/dist/controller/controller_resolver.js.map +1 -0
- package/dist/controller/index.cjs +31 -0
- package/dist/controller/index.cjs.map +1 -0
- package/dist/controller/index.d.cts +2 -0
- package/dist/controller/index.d.ts +2 -0
- package/dist/controller/index.js +6 -0
- package/dist/controller/index.js.map +1 -0
- package/dist/dev/backend_watcher.cjs +108 -0
- package/dist/dev/backend_watcher.cjs.map +1 -0
- package/dist/dev/backend_watcher.d.cts +22 -0
- package/dist/dev/backend_watcher.d.ts +22 -0
- package/dist/dev/backend_watcher.js +84 -0
- package/dist/dev/backend_watcher.js.map +1 -0
- package/dist/dev/dev_metadata.cjs +94 -0
- package/dist/dev/dev_metadata.cjs.map +1 -0
- package/dist/dev/dev_metadata.d.cts +20 -0
- package/dist/dev/dev_metadata.d.ts +20 -0
- package/dist/dev/dev_metadata.js +52 -0
- package/dist/dev/dev_metadata.js.map +1 -0
- package/dist/dev/esbuild_backend.cjs +124 -0
- package/dist/dev/esbuild_backend.cjs.map +1 -0
- package/dist/dev/esbuild_backend.d.cts +30 -0
- package/dist/dev/esbuild_backend.d.ts +30 -0
- package/dist/dev/esbuild_backend.js +90 -0
- package/dist/dev/esbuild_backend.js.map +1 -0
- package/dist/dev/index.cjs +57 -0
- package/dist/dev/index.cjs.map +1 -0
- package/dist/dev/index.d.cts +8 -0
- package/dist/dev/index.d.ts +8 -0
- package/dist/dev/index.js +31 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/wood_dev_server.cjs +220 -0
- package/dist/dev/wood_dev_server.cjs.map +1 -0
- package/dist/dev/wood_dev_server.d.cts +39 -0
- package/dist/dev/wood_dev_server.d.ts +39 -0
- package/dist/dev/wood_dev_server.js +186 -0
- package/dist/dev/wood_dev_server.js.map +1 -0
- package/dist/dev/yaml_watcher.cjs +142 -0
- package/dist/dev/yaml_watcher.cjs.map +1 -0
- package/dist/dev/yaml_watcher.d.cts +22 -0
- package/dist/dev/yaml_watcher.d.ts +22 -0
- package/dist/dev/yaml_watcher.js +108 -0
- package/dist/dev/yaml_watcher.js.map +1 -0
- package/dist/electron/index.cjs +176 -0
- package/dist/electron/index.cjs.map +1 -0
- package/dist/electron/index.d.cts +29 -0
- package/dist/electron/index.d.ts +29 -0
- package/dist/electron/index.js +140 -0
- package/dist/electron/index.js.map +1 -0
- package/dist/index.cjs +178 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +41 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/index.cjs +80 -0
- package/dist/ipc/index.cjs.map +1 -0
- package/dist/ipc/index.d.cts +12 -0
- package/dist/ipc/index.d.ts +12 -0
- package/dist/ipc/index.js +57 -0
- package/dist/ipc/index.js.map +1 -0
- package/dist/ipc/shared.cjs +50 -0
- package/dist/ipc/shared.cjs.map +1 -0
- package/dist/ipc/shared.d.cts +10 -0
- package/dist/ipc/shared.d.ts +10 -0
- package/dist/ipc/shared.js +23 -0
- package/dist/ipc/shared.js.map +1 -0
- package/dist/loader/__fixtures__/layouts/app.load.cjs +27 -0
- package/dist/loader/__fixtures__/layouts/app.load.cjs.map +1 -0
- package/dist/loader/__fixtures__/layouts/app.load.d.cts +5 -0
- package/dist/loader/__fixtures__/layouts/app.load.d.ts +5 -0
- package/dist/loader/__fixtures__/layouts/app.load.js +7 -0
- package/dist/loader/__fixtures__/layouts/app.load.js.map +1 -0
- package/dist/loader/__fixtures__/views/test/page.load.cjs +27 -0
- package/dist/loader/__fixtures__/views/test/page.load.cjs.map +1 -0
- package/dist/loader/__fixtures__/views/test/page.load.d.cts +6 -0
- package/dist/loader/__fixtures__/views/test/page.load.d.ts +6 -0
- package/dist/loader/__fixtures__/views/test/page.load.js +7 -0
- package/dist/loader/__fixtures__/views/test/page.load.js.map +1 -0
- package/dist/loader/index.cjs +29 -0
- package/dist/loader/index.cjs.map +1 -0
- package/dist/loader/index.d.cts +3 -0
- package/dist/loader/index.d.ts +3 -0
- package/dist/loader/index.js +5 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/loader_runner.cjs +109 -0
- package/dist/loader/loader_runner.cjs.map +1 -0
- package/dist/loader/loader_runner.d.cts +27 -0
- package/dist/loader/loader_runner.d.ts +27 -0
- package/dist/loader/loader_runner.js +75 -0
- package/dist/loader/loader_runner.js.map +1 -0
- package/dist/main/index.cjs +500 -0
- package/dist/main/index.cjs.map +1 -0
- package/dist/main/index.d.cts +98 -0
- package/dist/main/index.d.ts +98 -0
- package/dist/main/index.js +475 -0
- package/dist/main/index.js.map +1 -0
- package/dist/middleware/__fixtures__/middleware/auth.cjs +44 -0
- package/dist/middleware/__fixtures__/middleware/auth.cjs.map +1 -0
- package/dist/middleware/__fixtures__/middleware/auth.d.cts +6 -0
- package/dist/middleware/__fixtures__/middleware/auth.d.ts +6 -0
- package/dist/middleware/__fixtures__/middleware/auth.js +19 -0
- package/dist/middleware/__fixtures__/middleware/auth.js.map +1 -0
- package/dist/middleware/__fixtures__/middleware/sequence.cjs +47 -0
- package/dist/middleware/__fixtures__/middleware/sequence.cjs.map +1 -0
- package/dist/middleware/__fixtures__/middleware/sequence.d.cts +7 -0
- package/dist/middleware/__fixtures__/middleware/sequence.d.ts +7 -0
- package/dist/middleware/__fixtures__/middleware/sequence.js +21 -0
- package/dist/middleware/__fixtures__/middleware/sequence.js.map +1 -0
- package/dist/middleware/index.cjs +34 -0
- package/dist/middleware/index.cjs.map +1 -0
- package/dist/middleware/index.d.cts +3 -0
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.js +8 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/middleware_pipeline.cjs +55 -0
- package/dist/middleware/middleware_pipeline.cjs.map +1 -0
- package/dist/middleware/middleware_pipeline.d.cts +13 -0
- package/dist/middleware/middleware_pipeline.d.ts +13 -0
- package/dist/middleware/middleware_pipeline.js +30 -0
- package/dist/middleware/middleware_pipeline.js.map +1 -0
- package/dist/middleware/middleware_resolver.cjs +91 -0
- package/dist/middleware/middleware_resolver.cjs.map +1 -0
- package/dist/middleware/middleware_resolver.d.cts +19 -0
- package/dist/middleware/middleware_resolver.d.ts +19 -0
- package/dist/middleware/middleware_resolver.js +57 -0
- package/dist/middleware/middleware_resolver.js.map +1 -0
- package/dist/navigation/index.cjs +205 -0
- package/dist/navigation/index.cjs.map +1 -0
- package/dist/navigation/index.d.cts +34 -0
- package/dist/navigation/index.d.ts +34 -0
- package/dist/navigation/index.js +176 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/parser/index.cjs +36 -0
- package/dist/parser/index.cjs.map +1 -0
- package/dist/parser/index.d.cts +4 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.js +9 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/operations_parser.cjs +94 -0
- package/dist/parser/operations_parser.cjs.map +1 -0
- package/dist/parser/operations_parser.d.cts +7 -0
- package/dist/parser/operations_parser.d.ts +7 -0
- package/dist/parser/operations_parser.js +59 -0
- package/dist/parser/operations_parser.js.map +1 -0
- package/dist/parser/views_parser.cjs +153 -0
- package/dist/parser/views_parser.cjs.map +1 -0
- package/dist/parser/views_parser.d.cts +11 -0
- package/dist/parser/views_parser.d.ts +11 -0
- package/dist/parser/views_parser.js +118 -0
- package/dist/parser/views_parser.js.map +1 -0
- package/dist/router/index.cjs +31 -0
- package/dist/router/index.cjs.map +1 -0
- package/dist/router/index.d.cts +2 -0
- package/dist/router/index.d.ts +2 -0
- package/dist/router/index.js +6 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/wood_router.cjs +246 -0
- package/dist/router/wood_router.cjs.map +1 -0
- package/dist/router/wood_router.d.cts +70 -0
- package/dist/router/wood_router.d.ts +70 -0
- package/dist/router/wood_router.js +221 -0
- package/dist/router/wood_router.js.map +1 -0
- package/dist/runtime/application_root.cjs +98 -0
- package/dist/runtime/application_root.cjs.map +1 -0
- package/dist/runtime/application_root.d.cts +5 -0
- package/dist/runtime/application_root.d.ts +5 -0
- package/dist/runtime/application_root.js +61 -0
- package/dist/runtime/application_root.js.map +1 -0
- package/dist/runtime/get_container.cjs +96 -0
- package/dist/runtime/get_container.cjs.map +1 -0
- package/dist/runtime/get_container.d.cts +16 -0
- package/dist/runtime/get_container.d.ts +16 -0
- package/dist/runtime/get_container.js +60 -0
- package/dist/runtime/get_container.js.map +1 -0
- package/dist/runtime/index.cjs +49 -0
- package/dist/runtime/index.cjs.map +1 -0
- package/dist/runtime/index.d.cts +8 -0
- package/dist/runtime/index.d.ts +8 -0
- package/dist/runtime/index.js +24 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/renderer_log_dispatcher.cjs +79 -0
- package/dist/runtime/renderer_log_dispatcher.cjs.map +1 -0
- package/dist/runtime/renderer_log_dispatcher.d.cts +27 -0
- package/dist/runtime/renderer_log_dispatcher.d.ts +27 -0
- package/dist/runtime/renderer_log_dispatcher.js +54 -0
- package/dist/runtime/renderer_log_dispatcher.js.map +1 -0
- package/dist/runtime/runtime.cjs +158 -0
- package/dist/runtime/runtime.cjs.map +1 -0
- package/dist/runtime/runtime.d.cts +35 -0
- package/dist/runtime/runtime.d.ts +35 -0
- package/dist/runtime/runtime.js +136 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/stick/allow_cli.cjs +39 -0
- package/dist/stick/allow_cli.cjs.map +1 -0
- package/dist/stick/allow_cli.d.cts +6 -0
- package/dist/stick/allow_cli.d.ts +6 -0
- package/dist/stick/allow_cli.js +15 -0
- package/dist/stick/allow_cli.js.map +1 -0
- package/dist/stick/index.cjs +276 -0
- package/dist/stick/index.cjs.map +1 -0
- package/dist/stick/index.d.cts +111 -0
- package/dist/stick/index.d.ts +111 -0
- package/dist/stick/index.js +237 -0
- package/dist/stick/index.js.map +1 -0
- package/dist/stick/static_renderer.cjs +144 -0
- package/dist/stick/static_renderer.cjs.map +1 -0
- package/dist/stick/static_renderer.d.cts +51 -0
- package/dist/stick/static_renderer.d.ts +51 -0
- package/dist/stick/static_renderer.js +119 -0
- package/dist/stick/static_renderer.js.map +1 -0
- package/dist/stick/template_resolver.cjs +156 -0
- package/dist/stick/template_resolver.cjs.map +1 -0
- package/dist/stick/template_resolver.d.cts +7 -0
- package/dist/stick/template_resolver.d.ts +7 -0
- package/dist/stick/template_resolver.js +122 -0
- package/dist/stick/template_resolver.js.map +1 -0
- package/dist/testing/create_controller_harness.cjs +175 -0
- package/dist/testing/create_controller_harness.cjs.map +1 -0
- package/dist/testing/create_controller_harness.d.cts +37 -0
- package/dist/testing/create_controller_harness.d.ts +37 -0
- package/dist/testing/create_controller_harness.js +162 -0
- package/dist/testing/create_controller_harness.js.map +1 -0
- package/dist/testing/create_router_bridge.cjs +103 -0
- package/dist/testing/create_router_bridge.cjs.map +1 -0
- package/dist/testing/create_router_bridge.d.cts +71 -0
- package/dist/testing/create_router_bridge.d.ts +71 -0
- package/dist/testing/create_router_bridge.js +78 -0
- package/dist/testing/create_router_bridge.js.map +1 -0
- package/dist/testing/create_test_container.cjs +72 -0
- package/dist/testing/create_test_container.cjs.map +1 -0
- package/dist/testing/create_test_container.d.cts +14 -0
- package/dist/testing/create_test_container.d.ts +14 -0
- package/dist/testing/create_test_container.js +48 -0
- package/dist/testing/create_test_container.js.map +1 -0
- package/dist/testing/create_test_router.cjs +57 -0
- package/dist/testing/create_test_router.cjs.map +1 -0
- package/dist/testing/create_test_router.d.cts +19 -0
- package/dist/testing/create_test_router.d.ts +19 -0
- package/dist/testing/create_test_router.js +33 -0
- package/dist/testing/create_test_router.js.map +1 -0
- package/dist/testing/index.cjs +48 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +12 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.js +22 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock_electron.cjs +100 -0
- package/dist/testing/mock_electron.cjs.map +1 -0
- package/dist/testing/mock_electron.d.cts +12 -0
- package/dist/testing/mock_electron.d.ts +12 -0
- package/dist/testing/mock_electron.js +75 -0
- package/dist/testing/mock_electron.js.map +1 -0
- package/dist/tracing/index.cjs +56 -0
- package/dist/tracing/index.cjs.map +1 -0
- package/dist/tracing/index.d.cts +4 -0
- package/dist/tracing/index.d.ts +4 -0
- package/dist/tracing/index.js +35 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/trace_hub.cjs +213 -0
- package/dist/tracing/trace_hub.cjs.map +1 -0
- package/dist/tracing/trace_hub.d.cts +47 -0
- package/dist/tracing/trace_hub.d.ts +47 -0
- package/dist/tracing/trace_hub.js +172 -0
- package/dist/tracing/trace_hub.js.map +1 -0
- package/dist/tracing/trace_provider.cjs +200 -0
- package/dist/tracing/trace_provider.cjs.map +1 -0
- package/dist/tracing/trace_provider.d.cts +69 -0
- package/dist/tracing/trace_provider.d.ts +69 -0
- package/dist/tracing/trace_provider.js +179 -0
- package/dist/tracing/trace_provider.js.map +1 -0
- package/dist/types/bridge.cjs +51 -0
- package/dist/types/bridge.cjs.map +1 -0
- package/dist/types/bridge.d.cts +56 -0
- package/dist/types/bridge.d.ts +56 -0
- package/dist/types/bridge.js +25 -0
- package/dist/types/bridge.js.map +1 -0
- package/dist/types/config.cjs +17 -0
- package/dist/types/config.cjs.map +1 -0
- package/dist/types/config.d.cts +74 -0
- package/dist/types/config.d.ts +74 -0
- package/dist/types/config.js +1 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/context.cjs +17 -0
- package/dist/types/context.cjs.map +1 -0
- package/dist/types/context.d.cts +61 -0
- package/dist/types/context.d.ts +61 -0
- package/dist/types/context.js +1 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/context_menu.cjs +17 -0
- package/dist/types/context_menu.cjs.map +1 -0
- package/dist/types/context_menu.d.cts +30 -0
- package/dist/types/context_menu.d.ts +30 -0
- package/dist/types/context_menu.js +1 -0
- package/dist/types/context_menu.js.map +1 -0
- package/dist/types/index.cjs +33 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +6 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/operations.cjs +17 -0
- package/dist/types/operations.cjs.map +1 -0
- package/dist/types/operations.d.cts +39 -0
- package/dist/types/operations.d.ts +39 -0
- package/dist/types/operations.js +1 -0
- package/dist/types/operations.js.map +1 -0
- package/dist/types/views.cjs +17 -0
- package/dist/types/views.cjs.map +1 -0
- package/dist/types/views.d.cts +44 -0
- package/dist/types/views.d.ts +44 -0
- package/dist/types/views.js +1 -0
- package/dist/types/views.js.map +1 -0
- package/dist/validation/index.cjs +29 -0
- package/dist/validation/index.cjs.map +1 -0
- package/dist/validation/index.d.cts +1 -0
- package/dist/validation/index.d.ts +1 -0
- package/dist/validation/index.js +5 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/schema_validator.cjs +86 -0
- package/dist/validation/schema_validator.cjs.map +1 -0
- package/dist/validation/schema_validator.d.cts +24 -0
- package/dist/validation/schema_validator.d.ts +24 -0
- package/dist/validation/schema_validator.js +52 -0
- package/dist/validation/schema_validator.js.map +1 -0
- package/dist/window/index.cjs +32 -0
- package/dist/window/index.cjs.map +1 -0
- package/dist/window/index.d.cts +4 -0
- package/dist/window/index.d.ts +4 -0
- package/dist/window/index.js +7 -0
- package/dist/window/index.js.map +1 -0
- package/dist/window/window_manager.cjs +354 -0
- package/dist/window/window_manager.cjs.map +1 -0
- package/dist/window/window_manager.d.cts +172 -0
- package/dist/window/window_manager.d.ts +172 -0
- package/dist/window/window_manager.js +330 -0
- package/dist/window/window_manager.js.map +1 -0
- package/dist/window/window_state_store.cjs +129 -0
- package/dist/window/window_state_store.cjs.map +1 -0
- package/dist/window/window_state_store.d.cts +39 -0
- package/dist/window/window_state_store.d.ts +39 -0
- package/dist/window/window_state_store.js +105 -0
- package/dist/window/window_state_store.js.map +1 -0
- package/loaders/loader.mjs +46 -0
- package/package.json +119 -0
- package/src/components/ContextMenuProvider.svelte +145 -0
- package/src/components/NavigationShell.svelte +204 -0
- package/src/components/WoodRecursiveRender.svelte +91 -0
- package/src/components/contextMenu.ts +228 -0
- package/src/components/index.d.ts +14 -0
- package/src/components/index.js +2 -0
- package/src/stick/WoodRecursiveRender.svelte +74 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var controller_resolver_exports = {};
|
|
30
|
+
__export(controller_resolver_exports, {
|
|
31
|
+
ControllerResolver: () => ControllerResolver,
|
|
32
|
+
buildControllerArgs: () => buildControllerArgs
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(controller_resolver_exports);
|
|
35
|
+
var import_path = __toESM(require("path"), 1);
|
|
36
|
+
var import_logger = require("@noego/logger");
|
|
37
|
+
const logger = (0, import_logger.getLogger)("wood:controller");
|
|
38
|
+
class ControllerResolver {
|
|
39
|
+
constructor(controllersDir, options) {
|
|
40
|
+
this.classCache = /* @__PURE__ */ new Map();
|
|
41
|
+
this.pathCache = /* @__PURE__ */ new Map();
|
|
42
|
+
this.baseDir = controllersDir;
|
|
43
|
+
this.mode = options?.mode ?? (process.env.WOOD_MODE === "development" ? "dev" : "bundled");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check whether a controller name has been pre-registered (class or path).
|
|
47
|
+
*/
|
|
48
|
+
has(name) {
|
|
49
|
+
return this.classCache.has(name) || this.pathCache.has(name);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Register an import path for a controller. The controller will be lazily
|
|
53
|
+
* imported from this path when first needed. This avoids circular dependencies
|
|
54
|
+
* at module load time.
|
|
55
|
+
*/
|
|
56
|
+
registerPath(name, importPath) {
|
|
57
|
+
if (!importPath) {
|
|
58
|
+
throw new Error(`registerPath("${name}"): importPath cannot be empty`);
|
|
59
|
+
}
|
|
60
|
+
this.pathCache.set(name, importPath);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolve a controller name to its class.
|
|
64
|
+
*
|
|
65
|
+
* 1. Check class cache (already imported)
|
|
66
|
+
* 2. Check path cache (registered via registerPath) and lazily import
|
|
67
|
+
* 3. In dev mode only: fall back to filesystem resolution
|
|
68
|
+
*
|
|
69
|
+
* Classes are cached -- same class reference returned for same name.
|
|
70
|
+
*/
|
|
71
|
+
async resolveClass(controllerName) {
|
|
72
|
+
const cached = this.classCache.get(controllerName);
|
|
73
|
+
if (cached) return cached;
|
|
74
|
+
const importPath = this.pathCache.get(controllerName);
|
|
75
|
+
if (importPath) {
|
|
76
|
+
const mod = await import(importPath);
|
|
77
|
+
const ControllerClass = mod.default ?? mod[Object.keys(mod)[0]];
|
|
78
|
+
if (!ControllerClass || typeof ControllerClass !== "function") {
|
|
79
|
+
throw new Error(
|
|
80
|
+
`Controller "${controllerName}" at ${importPath}: module does not export a class`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
this.classCache.set(controllerName, ControllerClass);
|
|
84
|
+
logger.debug(`Resolved controller "${controllerName}" from registered path`);
|
|
85
|
+
return ControllerClass;
|
|
86
|
+
}
|
|
87
|
+
if (this.mode === "bundled") {
|
|
88
|
+
throw new Error(
|
|
89
|
+
`Controller "${controllerName}" is not registered. In bundled mode, all controllers must be pre-registered via controllers.generated.ts. Run "npx wood build" to regenerate the registration file.
|
|
90
|
+
Registered controllers: [${Array.from(this.pathCache.keys()).join(", ")}]`
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
return this.resolveFromFilesystem(controllerName);
|
|
94
|
+
}
|
|
95
|
+
async resolveFromFilesystem(controllerName) {
|
|
96
|
+
const basePath = import_path.default.resolve(this.baseDir, controllerName);
|
|
97
|
+
const candidates = [
|
|
98
|
+
basePath + ".ts",
|
|
99
|
+
basePath + ".controller.ts",
|
|
100
|
+
basePath + ".js",
|
|
101
|
+
basePath + ".controller.js",
|
|
102
|
+
import_path.default.resolve(this.baseDir, controllerName, "index.ts"),
|
|
103
|
+
import_path.default.resolve(this.baseDir, controllerName, "index.js")
|
|
104
|
+
];
|
|
105
|
+
let mod;
|
|
106
|
+
let loaded = false;
|
|
107
|
+
for (const candidate of candidates) {
|
|
108
|
+
try {
|
|
109
|
+
mod = await import(candidate);
|
|
110
|
+
loaded = true;
|
|
111
|
+
break;
|
|
112
|
+
} catch {
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (!loaded) {
|
|
116
|
+
throw new Error(
|
|
117
|
+
`Controller "${controllerName}" not found. Searched:
|
|
118
|
+
` + candidates.map((c) => ` - ${c}`).join("\n")
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
const ControllerClass = mod.default ?? mod[Object.keys(mod)[0]];
|
|
122
|
+
if (!ControllerClass || typeof ControllerClass !== "function") {
|
|
123
|
+
throw new Error(
|
|
124
|
+
`Controller "${controllerName}": module does not export a class`
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
logger.debug(`Resolved controller "${controllerName}" from ${this.baseDir}`);
|
|
128
|
+
this.classCache.set(controllerName, ControllerClass);
|
|
129
|
+
return ControllerClass;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Create a controller instance using IoC container.
|
|
133
|
+
* Per-request scoped: container.extend() creates an isolated scope.
|
|
134
|
+
*/
|
|
135
|
+
async createInstance(ControllerClass, container) {
|
|
136
|
+
const scopedContainer = container.extend();
|
|
137
|
+
return scopedContainer.instance(ControllerClass);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Pre-register a controller class by name so that resolveClass()
|
|
141
|
+
* finds it in the cache without attempting a filesystem import.
|
|
142
|
+
*/
|
|
143
|
+
register(name, ControllerClass) {
|
|
144
|
+
if (typeof ControllerClass !== "function") {
|
|
145
|
+
throw new Error(`register("${name}"): expected a class/constructor, got ${typeof ControllerClass}`);
|
|
146
|
+
}
|
|
147
|
+
this.classCache.set(name, ControllerClass);
|
|
148
|
+
}
|
|
149
|
+
clearCache() {
|
|
150
|
+
this.classCache.clear();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function buildControllerArgs(ipcContext, container) {
|
|
154
|
+
return {
|
|
155
|
+
req: {
|
|
156
|
+
body: ipcContext.body ?? {},
|
|
157
|
+
params: ipcContext.params ?? {},
|
|
158
|
+
query: ipcContext.query ?? {},
|
|
159
|
+
context: ipcContext.context ?? {},
|
|
160
|
+
headers: {}
|
|
161
|
+
},
|
|
162
|
+
res: {
|
|
163
|
+
status: (_code) => {
|
|
164
|
+
},
|
|
165
|
+
cookie: (_name, _value, _opts) => {
|
|
166
|
+
},
|
|
167
|
+
clearCookie: (_name, _opts) => {
|
|
168
|
+
},
|
|
169
|
+
set: (_header, _value) => {
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
container
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
176
|
+
0 && (module.exports = {
|
|
177
|
+
ControllerResolver,
|
|
178
|
+
buildControllerArgs
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=controller_resolver.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/controller/controller_resolver.ts"],"sourcesContent":["import path from 'path';\nimport { getLogger } from '@noego/logger';\nimport type { IpcContext, ControllerArgs } from '../types/context.cjs';\n\nconst logger = getLogger('wood:controller');\n\nexport class ControllerResolver {\n private baseDir: string;\n private classCache = new Map<string, any>();\n private pathCache = new Map<string, string>(); // name -> import path\n private mode: 'bundled' | 'dev';\n\n constructor(controllersDir: string, options?: { mode?: 'bundled' | 'dev' }) {\n this.baseDir = controllersDir;\n // Default to bundled mode for safety. Dev mode must be explicitly opted into.\n this.mode = options?.mode ?? (process.env.WOOD_MODE === 'development' ? 'dev' : 'bundled');\n }\n\n /**\n * Check whether a controller name has been pre-registered (class or path).\n */\n has(name: string): boolean {\n return this.classCache.has(name) || this.pathCache.has(name);\n }\n\n /**\n * Register an import path for a controller. The controller will be lazily\n * imported from this path when first needed. This avoids circular dependencies\n * at module load time.\n */\n registerPath(name: string, importPath: string): void {\n if (!importPath) {\n throw new Error(`registerPath(\"${name}\"): importPath cannot be empty`);\n }\n this.pathCache.set(name, importPath);\n }\n\n /**\n * Resolve a controller name to its class.\n *\n * 1. Check class cache (already imported)\n * 2. Check path cache (registered via registerPath) and lazily import\n * 3. In dev mode only: fall back to filesystem resolution\n *\n * Classes are cached -- same class reference returned for same name.\n */\n async resolveClass(controllerName: string): Promise<any> {\n const cached = this.classCache.get(controllerName);\n if (cached) return cached;\n\n // Check if import path is registered — lazily load it\n const importPath = this.pathCache.get(controllerName);\n if (importPath) {\n const mod = await import(importPath);\n const ControllerClass = mod.default ?? mod[Object.keys(mod)[0]];\n if (!ControllerClass || typeof ControllerClass !== 'function') {\n throw new Error(\n `Controller \"${controllerName}\" at ${importPath}: module does not export a class`\n );\n }\n this.classCache.set(controllerName, ControllerClass);\n logger.debug(`Resolved controller \"${controllerName}\" from registered path`);\n return ControllerClass;\n }\n\n if (this.mode === 'bundled') {\n throw new Error(\n `Controller \"${controllerName}\" is not registered. ` +\n `In bundled mode, all controllers must be pre-registered via controllers.generated.ts. ` +\n `Run \"npx wood build\" to regenerate the registration file.\\n` +\n `Registered controllers: [${Array.from(this.pathCache.keys()).join(', ')}]`\n );\n }\n\n // Dev mode: attempt dynamic filesystem imports\n return this.resolveFromFilesystem(controllerName);\n }\n\n private async resolveFromFilesystem(controllerName: string): Promise<any> {\n const basePath = path.resolve(this.baseDir, controllerName);\n const candidates = [\n basePath + '.ts',\n basePath + '.controller.ts',\n basePath + '.js',\n basePath + '.controller.js',\n path.resolve(this.baseDir, controllerName, 'index.ts'),\n path.resolve(this.baseDir, controllerName, 'index.js'),\n ];\n\n let mod: any;\n let loaded = false;\n\n for (const candidate of candidates) {\n try {\n mod = await import(candidate);\n loaded = true;\n break;\n } catch {\n // Try next candidate\n }\n }\n\n if (!loaded) {\n throw new Error(\n `Controller \"${controllerName}\" not found. Searched:\\n` +\n candidates.map(c => ` - ${c}`).join('\\n')\n );\n }\n\n const ControllerClass = mod.default ?? mod[Object.keys(mod)[0]];\n if (!ControllerClass || typeof ControllerClass !== 'function') {\n throw new Error(\n `Controller \"${controllerName}\": module does not export a class`\n );\n }\n\n logger.debug(`Resolved controller \"${controllerName}\" from ${this.baseDir}`);\n this.classCache.set(controllerName, ControllerClass);\n return ControllerClass;\n }\n\n /**\n * Create a controller instance using IoC container.\n * Per-request scoped: container.extend() creates an isolated scope.\n */\n async createInstance(ControllerClass: any, container: any): Promise<any> {\n const scopedContainer = container.extend();\n return scopedContainer.instance(ControllerClass);\n }\n\n /**\n * Pre-register a controller class by name so that resolveClass()\n * finds it in the cache without attempting a filesystem import.\n */\n register(name: string, ControllerClass: any): void {\n if (typeof ControllerClass !== 'function') {\n throw new Error(`register(\"${name}\"): expected a class/constructor, got ${typeof ControllerClass}`);\n }\n this.classCache.set(name, ControllerClass);\n }\n\n clearCache(): void {\n this.classCache.clear();\n }\n}\n\n/**\n * Build controller args from IPC context.\n * Creates a fake req/res that matches the Dinner web pattern so\n * existing controllers work without modification.\n */\nexport function buildControllerArgs(ipcContext: IpcContext, container: unknown): ControllerArgs {\n return {\n req: {\n body: ipcContext.body ?? {},\n params: ipcContext.params ?? {},\n query: ipcContext.query ?? {},\n context: ipcContext.context ?? {},\n headers: {},\n },\n res: {\n status: (_code: number) => {},\n cookie: (_name: string, _value: string, _opts?: unknown) => {},\n clearCookie: (_name: string, _opts?: unknown) => {},\n set: (_header: string, _value: string) => {},\n },\n container,\n };\n}\n"],"mappings":"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","names":["path"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { IpcContext, ControllerArgs } from '../types/context.cjs';
|
|
2
|
+
|
|
3
|
+
declare class ControllerResolver {
|
|
4
|
+
private baseDir;
|
|
5
|
+
private classCache;
|
|
6
|
+
private pathCache;
|
|
7
|
+
private mode;
|
|
8
|
+
constructor(controllersDir: string, options?: {
|
|
9
|
+
mode?: 'bundled' | 'dev';
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* Check whether a controller name has been pre-registered (class or path).
|
|
13
|
+
*/
|
|
14
|
+
has(name: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Register an import path for a controller. The controller will be lazily
|
|
17
|
+
* imported from this path when first needed. This avoids circular dependencies
|
|
18
|
+
* at module load time.
|
|
19
|
+
*/
|
|
20
|
+
registerPath(name: string, importPath: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve a controller name to its class.
|
|
23
|
+
*
|
|
24
|
+
* 1. Check class cache (already imported)
|
|
25
|
+
* 2. Check path cache (registered via registerPath) and lazily import
|
|
26
|
+
* 3. In dev mode only: fall back to filesystem resolution
|
|
27
|
+
*
|
|
28
|
+
* Classes are cached -- same class reference returned for same name.
|
|
29
|
+
*/
|
|
30
|
+
resolveClass(controllerName: string): Promise<any>;
|
|
31
|
+
private resolveFromFilesystem;
|
|
32
|
+
/**
|
|
33
|
+
* Create a controller instance using IoC container.
|
|
34
|
+
* Per-request scoped: container.extend() creates an isolated scope.
|
|
35
|
+
*/
|
|
36
|
+
createInstance(ControllerClass: any, container: any): Promise<any>;
|
|
37
|
+
/**
|
|
38
|
+
* Pre-register a controller class by name so that resolveClass()
|
|
39
|
+
* finds it in the cache without attempting a filesystem import.
|
|
40
|
+
*/
|
|
41
|
+
register(name: string, ControllerClass: any): void;
|
|
42
|
+
clearCache(): void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build controller args from IPC context.
|
|
46
|
+
* Creates a fake req/res that matches the Dinner web pattern so
|
|
47
|
+
* existing controllers work without modification.
|
|
48
|
+
*/
|
|
49
|
+
declare function buildControllerArgs(ipcContext: IpcContext, container: unknown): ControllerArgs;
|
|
50
|
+
|
|
51
|
+
export { ControllerResolver, buildControllerArgs };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { IpcContext, ControllerArgs } from '../types/context.js';
|
|
2
|
+
|
|
3
|
+
declare class ControllerResolver {
|
|
4
|
+
private baseDir;
|
|
5
|
+
private classCache;
|
|
6
|
+
private pathCache;
|
|
7
|
+
private mode;
|
|
8
|
+
constructor(controllersDir: string, options?: {
|
|
9
|
+
mode?: 'bundled' | 'dev';
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* Check whether a controller name has been pre-registered (class or path).
|
|
13
|
+
*/
|
|
14
|
+
has(name: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Register an import path for a controller. The controller will be lazily
|
|
17
|
+
* imported from this path when first needed. This avoids circular dependencies
|
|
18
|
+
* at module load time.
|
|
19
|
+
*/
|
|
20
|
+
registerPath(name: string, importPath: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve a controller name to its class.
|
|
23
|
+
*
|
|
24
|
+
* 1. Check class cache (already imported)
|
|
25
|
+
* 2. Check path cache (registered via registerPath) and lazily import
|
|
26
|
+
* 3. In dev mode only: fall back to filesystem resolution
|
|
27
|
+
*
|
|
28
|
+
* Classes are cached -- same class reference returned for same name.
|
|
29
|
+
*/
|
|
30
|
+
resolveClass(controllerName: string): Promise<any>;
|
|
31
|
+
private resolveFromFilesystem;
|
|
32
|
+
/**
|
|
33
|
+
* Create a controller instance using IoC container.
|
|
34
|
+
* Per-request scoped: container.extend() creates an isolated scope.
|
|
35
|
+
*/
|
|
36
|
+
createInstance(ControllerClass: any, container: any): Promise<any>;
|
|
37
|
+
/**
|
|
38
|
+
* Pre-register a controller class by name so that resolveClass()
|
|
39
|
+
* finds it in the cache without attempting a filesystem import.
|
|
40
|
+
*/
|
|
41
|
+
register(name: string, ControllerClass: any): void;
|
|
42
|
+
clearCache(): void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build controller args from IPC context.
|
|
46
|
+
* Creates a fake req/res that matches the Dinner web pattern so
|
|
47
|
+
* existing controllers work without modification.
|
|
48
|
+
*/
|
|
49
|
+
declare function buildControllerArgs(ipcContext: IpcContext, container: unknown): ControllerArgs;
|
|
50
|
+
|
|
51
|
+
export { ControllerResolver, buildControllerArgs };
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { getLogger } from "@noego/logger";
|
|
3
|
+
const logger = getLogger("wood:controller");
|
|
4
|
+
class ControllerResolver {
|
|
5
|
+
constructor(controllersDir, options) {
|
|
6
|
+
this.classCache = /* @__PURE__ */ new Map();
|
|
7
|
+
this.pathCache = /* @__PURE__ */ new Map();
|
|
8
|
+
this.baseDir = controllersDir;
|
|
9
|
+
this.mode = options?.mode ?? (process.env.WOOD_MODE === "development" ? "dev" : "bundled");
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Check whether a controller name has been pre-registered (class or path).
|
|
13
|
+
*/
|
|
14
|
+
has(name) {
|
|
15
|
+
return this.classCache.has(name) || this.pathCache.has(name);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Register an import path for a controller. The controller will be lazily
|
|
19
|
+
* imported from this path when first needed. This avoids circular dependencies
|
|
20
|
+
* at module load time.
|
|
21
|
+
*/
|
|
22
|
+
registerPath(name, importPath) {
|
|
23
|
+
if (!importPath) {
|
|
24
|
+
throw new Error(`registerPath("${name}"): importPath cannot be empty`);
|
|
25
|
+
}
|
|
26
|
+
this.pathCache.set(name, importPath);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve a controller name to its class.
|
|
30
|
+
*
|
|
31
|
+
* 1. Check class cache (already imported)
|
|
32
|
+
* 2. Check path cache (registered via registerPath) and lazily import
|
|
33
|
+
* 3. In dev mode only: fall back to filesystem resolution
|
|
34
|
+
*
|
|
35
|
+
* Classes are cached -- same class reference returned for same name.
|
|
36
|
+
*/
|
|
37
|
+
async resolveClass(controllerName) {
|
|
38
|
+
const cached = this.classCache.get(controllerName);
|
|
39
|
+
if (cached) return cached;
|
|
40
|
+
const importPath = this.pathCache.get(controllerName);
|
|
41
|
+
if (importPath) {
|
|
42
|
+
const mod = await import(importPath);
|
|
43
|
+
const ControllerClass = mod.default ?? mod[Object.keys(mod)[0]];
|
|
44
|
+
if (!ControllerClass || typeof ControllerClass !== "function") {
|
|
45
|
+
throw new Error(
|
|
46
|
+
`Controller "${controllerName}" at ${importPath}: module does not export a class`
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
this.classCache.set(controllerName, ControllerClass);
|
|
50
|
+
logger.debug(`Resolved controller "${controllerName}" from registered path`);
|
|
51
|
+
return ControllerClass;
|
|
52
|
+
}
|
|
53
|
+
if (this.mode === "bundled") {
|
|
54
|
+
throw new Error(
|
|
55
|
+
`Controller "${controllerName}" is not registered. In bundled mode, all controllers must be pre-registered via controllers.generated.ts. Run "npx wood build" to regenerate the registration file.
|
|
56
|
+
Registered controllers: [${Array.from(this.pathCache.keys()).join(", ")}]`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
return this.resolveFromFilesystem(controllerName);
|
|
60
|
+
}
|
|
61
|
+
async resolveFromFilesystem(controllerName) {
|
|
62
|
+
const basePath = path.resolve(this.baseDir, controllerName);
|
|
63
|
+
const candidates = [
|
|
64
|
+
basePath + ".ts",
|
|
65
|
+
basePath + ".controller.ts",
|
|
66
|
+
basePath + ".js",
|
|
67
|
+
basePath + ".controller.js",
|
|
68
|
+
path.resolve(this.baseDir, controllerName, "index.ts"),
|
|
69
|
+
path.resolve(this.baseDir, controllerName, "index.js")
|
|
70
|
+
];
|
|
71
|
+
let mod;
|
|
72
|
+
let loaded = false;
|
|
73
|
+
for (const candidate of candidates) {
|
|
74
|
+
try {
|
|
75
|
+
mod = await import(candidate);
|
|
76
|
+
loaded = true;
|
|
77
|
+
break;
|
|
78
|
+
} catch {
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (!loaded) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
`Controller "${controllerName}" not found. Searched:
|
|
84
|
+
` + candidates.map((c) => ` - ${c}`).join("\n")
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
const ControllerClass = mod.default ?? mod[Object.keys(mod)[0]];
|
|
88
|
+
if (!ControllerClass || typeof ControllerClass !== "function") {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`Controller "${controllerName}": module does not export a class`
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
logger.debug(`Resolved controller "${controllerName}" from ${this.baseDir}`);
|
|
94
|
+
this.classCache.set(controllerName, ControllerClass);
|
|
95
|
+
return ControllerClass;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create a controller instance using IoC container.
|
|
99
|
+
* Per-request scoped: container.extend() creates an isolated scope.
|
|
100
|
+
*/
|
|
101
|
+
async createInstance(ControllerClass, container) {
|
|
102
|
+
const scopedContainer = container.extend();
|
|
103
|
+
return scopedContainer.instance(ControllerClass);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Pre-register a controller class by name so that resolveClass()
|
|
107
|
+
* finds it in the cache without attempting a filesystem import.
|
|
108
|
+
*/
|
|
109
|
+
register(name, ControllerClass) {
|
|
110
|
+
if (typeof ControllerClass !== "function") {
|
|
111
|
+
throw new Error(`register("${name}"): expected a class/constructor, got ${typeof ControllerClass}`);
|
|
112
|
+
}
|
|
113
|
+
this.classCache.set(name, ControllerClass);
|
|
114
|
+
}
|
|
115
|
+
clearCache() {
|
|
116
|
+
this.classCache.clear();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function buildControllerArgs(ipcContext, container) {
|
|
120
|
+
return {
|
|
121
|
+
req: {
|
|
122
|
+
body: ipcContext.body ?? {},
|
|
123
|
+
params: ipcContext.params ?? {},
|
|
124
|
+
query: ipcContext.query ?? {},
|
|
125
|
+
context: ipcContext.context ?? {},
|
|
126
|
+
headers: {}
|
|
127
|
+
},
|
|
128
|
+
res: {
|
|
129
|
+
status: (_code) => {
|
|
130
|
+
},
|
|
131
|
+
cookie: (_name, _value, _opts) => {
|
|
132
|
+
},
|
|
133
|
+
clearCookie: (_name, _opts) => {
|
|
134
|
+
},
|
|
135
|
+
set: (_header, _value) => {
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
container
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export {
|
|
142
|
+
ControllerResolver,
|
|
143
|
+
buildControllerArgs
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=controller_resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/controller/controller_resolver.ts"],"sourcesContent":["import path from 'path';\nimport { getLogger } from '@noego/logger';\nimport type { IpcContext, ControllerArgs } from '../types/context.js';\n\nconst logger = getLogger('wood:controller');\n\nexport class ControllerResolver {\n private baseDir: string;\n private classCache = new Map<string, any>();\n private pathCache = new Map<string, string>(); // name -> import path\n private mode: 'bundled' | 'dev';\n\n constructor(controllersDir: string, options?: { mode?: 'bundled' | 'dev' }) {\n this.baseDir = controllersDir;\n // Default to bundled mode for safety. Dev mode must be explicitly opted into.\n this.mode = options?.mode ?? (process.env.WOOD_MODE === 'development' ? 'dev' : 'bundled');\n }\n\n /**\n * Check whether a controller name has been pre-registered (class or path).\n */\n has(name: string): boolean {\n return this.classCache.has(name) || this.pathCache.has(name);\n }\n\n /**\n * Register an import path for a controller. The controller will be lazily\n * imported from this path when first needed. This avoids circular dependencies\n * at module load time.\n */\n registerPath(name: string, importPath: string): void {\n if (!importPath) {\n throw new Error(`registerPath(\"${name}\"): importPath cannot be empty`);\n }\n this.pathCache.set(name, importPath);\n }\n\n /**\n * Resolve a controller name to its class.\n *\n * 1. Check class cache (already imported)\n * 2. Check path cache (registered via registerPath) and lazily import\n * 3. In dev mode only: fall back to filesystem resolution\n *\n * Classes are cached -- same class reference returned for same name.\n */\n async resolveClass(controllerName: string): Promise<any> {\n const cached = this.classCache.get(controllerName);\n if (cached) return cached;\n\n // Check if import path is registered — lazily load it\n const importPath = this.pathCache.get(controllerName);\n if (importPath) {\n const mod = await import(importPath);\n const ControllerClass = mod.default ?? mod[Object.keys(mod)[0]];\n if (!ControllerClass || typeof ControllerClass !== 'function') {\n throw new Error(\n `Controller \"${controllerName}\" at ${importPath}: module does not export a class`\n );\n }\n this.classCache.set(controllerName, ControllerClass);\n logger.debug(`Resolved controller \"${controllerName}\" from registered path`);\n return ControllerClass;\n }\n\n if (this.mode === 'bundled') {\n throw new Error(\n `Controller \"${controllerName}\" is not registered. ` +\n `In bundled mode, all controllers must be pre-registered via controllers.generated.ts. ` +\n `Run \"npx wood build\" to regenerate the registration file.\\n` +\n `Registered controllers: [${Array.from(this.pathCache.keys()).join(', ')}]`\n );\n }\n\n // Dev mode: attempt dynamic filesystem imports\n return this.resolveFromFilesystem(controllerName);\n }\n\n private async resolveFromFilesystem(controllerName: string): Promise<any> {\n const basePath = path.resolve(this.baseDir, controllerName);\n const candidates = [\n basePath + '.ts',\n basePath + '.controller.ts',\n basePath + '.js',\n basePath + '.controller.js',\n path.resolve(this.baseDir, controllerName, 'index.ts'),\n path.resolve(this.baseDir, controllerName, 'index.js'),\n ];\n\n let mod: any;\n let loaded = false;\n\n for (const candidate of candidates) {\n try {\n mod = await import(candidate);\n loaded = true;\n break;\n } catch {\n // Try next candidate\n }\n }\n\n if (!loaded) {\n throw new Error(\n `Controller \"${controllerName}\" not found. Searched:\\n` +\n candidates.map(c => ` - ${c}`).join('\\n')\n );\n }\n\n const ControllerClass = mod.default ?? mod[Object.keys(mod)[0]];\n if (!ControllerClass || typeof ControllerClass !== 'function') {\n throw new Error(\n `Controller \"${controllerName}\": module does not export a class`\n );\n }\n\n logger.debug(`Resolved controller \"${controllerName}\" from ${this.baseDir}`);\n this.classCache.set(controllerName, ControllerClass);\n return ControllerClass;\n }\n\n /**\n * Create a controller instance using IoC container.\n * Per-request scoped: container.extend() creates an isolated scope.\n */\n async createInstance(ControllerClass: any, container: any): Promise<any> {\n const scopedContainer = container.extend();\n return scopedContainer.instance(ControllerClass);\n }\n\n /**\n * Pre-register a controller class by name so that resolveClass()\n * finds it in the cache without attempting a filesystem import.\n */\n register(name: string, ControllerClass: any): void {\n if (typeof ControllerClass !== 'function') {\n throw new Error(`register(\"${name}\"): expected a class/constructor, got ${typeof ControllerClass}`);\n }\n this.classCache.set(name, ControllerClass);\n }\n\n clearCache(): void {\n this.classCache.clear();\n }\n}\n\n/**\n * Build controller args from IPC context.\n * Creates a fake req/res that matches the Dinner web pattern so\n * existing controllers work without modification.\n */\nexport function buildControllerArgs(ipcContext: IpcContext, container: unknown): ControllerArgs {\n return {\n req: {\n body: ipcContext.body ?? {},\n params: ipcContext.params ?? {},\n query: ipcContext.query ?? {},\n context: ipcContext.context ?? {},\n headers: {},\n },\n res: {\n status: (_code: number) => {},\n cookie: (_name: string, _value: string, _opts?: unknown) => {},\n clearCookie: (_name: string, _opts?: unknown) => {},\n set: (_header: string, _value: string) => {},\n },\n container,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
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 controller_exports = {};
|
|
20
|
+
__export(controller_exports, {
|
|
21
|
+
ControllerResolver: () => import_controller_resolver.ControllerResolver,
|
|
22
|
+
buildControllerArgs: () => import_controller_resolver.buildControllerArgs
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(controller_exports);
|
|
25
|
+
var import_controller_resolver = require("./controller_resolver.cjs");
|
|
26
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
27
|
+
0 && (module.exports = {
|
|
28
|
+
ControllerResolver,
|
|
29
|
+
buildControllerArgs
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/controller/index.ts"],"sourcesContent":["export { ControllerResolver, buildControllerArgs } from './controller_resolver.cjs';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAwD;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/controller/index.ts"],"sourcesContent":["export { ControllerResolver, buildControllerArgs } from './controller_resolver.js';\n"],"mappings":"AAAA,SAAS,oBAAoB,2BAA2B;","names":[]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from2, except, desc) => {
|
|
11
|
+
if (from2 && typeof from2 === "object" || typeof from2 === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from2))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var backend_watcher_exports = {};
|
|
20
|
+
__export(backend_watcher_exports, {
|
|
21
|
+
BackendWatcher: () => BackendWatcher
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(backend_watcher_exports);
|
|
24
|
+
var import_chokidar = require("chokidar");
|
|
25
|
+
var import_rxjs = require("rxjs");
|
|
26
|
+
var import_logger = require("@noego/logger");
|
|
27
|
+
const logger = (0, import_logger.getLogger)("wood:dev:backend-watcher");
|
|
28
|
+
const MAX_CRASH_RESTARTS = 3;
|
|
29
|
+
const STABILITY_THRESHOLD = 3e4;
|
|
30
|
+
const BOOT_ERROR_THRESHOLD = 5e3;
|
|
31
|
+
class BackendWatcher {
|
|
32
|
+
constructor(options) {
|
|
33
|
+
this.options = options;
|
|
34
|
+
this.watcher = null;
|
|
35
|
+
this.change$ = new import_rxjs.Subject();
|
|
36
|
+
this.crashCount = 0;
|
|
37
|
+
this.lastStartTime = 0;
|
|
38
|
+
this.paused = false;
|
|
39
|
+
}
|
|
40
|
+
start() {
|
|
41
|
+
this.watcher = (0, import_chokidar.watch)(this.options.patterns, {
|
|
42
|
+
cwd: this.options.cwd,
|
|
43
|
+
ignoreInitial: true
|
|
44
|
+
});
|
|
45
|
+
this.watcher.on("change", (filePath) => {
|
|
46
|
+
if (this.paused) {
|
|
47
|
+
logger.info("file change detected while paused, resuming restarts");
|
|
48
|
+
this.paused = false;
|
|
49
|
+
this.crashCount = 0;
|
|
50
|
+
}
|
|
51
|
+
logger.debug("backend file changed", { filePath });
|
|
52
|
+
this.change$.next(filePath);
|
|
53
|
+
});
|
|
54
|
+
this.change$.pipe(
|
|
55
|
+
(0, import_rxjs.debounceTime)(100),
|
|
56
|
+
(0, import_rxjs.switchMap)(() => (0, import_rxjs.from)(this.rebuild()))
|
|
57
|
+
).subscribe({
|
|
58
|
+
error: (err) => {
|
|
59
|
+
logger.error("backend watcher pipeline error", { error: String(err) });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
stop() {
|
|
64
|
+
this.watcher?.close();
|
|
65
|
+
this.change$.complete();
|
|
66
|
+
}
|
|
67
|
+
async rebuild() {
|
|
68
|
+
if (this.paused) return;
|
|
69
|
+
try {
|
|
70
|
+
logger.info("restarting backend");
|
|
71
|
+
await this.options.bridge.stop();
|
|
72
|
+
await this.options.buildFn();
|
|
73
|
+
const timeSinceLastStart = Date.now() - this.lastStartTime;
|
|
74
|
+
if (this.lastStartTime > 0 && timeSinceLastStart < STABILITY_THRESHOLD) {
|
|
75
|
+
this.crashCount++;
|
|
76
|
+
if (this.crashCount >= MAX_CRASH_RESTARTS) {
|
|
77
|
+
logger.error(
|
|
78
|
+
"backend crashed too many times in quick succession, pausing restarts",
|
|
79
|
+
{ crashCount: this.crashCount }
|
|
80
|
+
);
|
|
81
|
+
this.paused = true;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
} else {
|
|
85
|
+
this.crashCount = 0;
|
|
86
|
+
}
|
|
87
|
+
this.lastStartTime = Date.now();
|
|
88
|
+
await this.options.bridge.start();
|
|
89
|
+
logger.info("backend restarted successfully");
|
|
90
|
+
} catch (err) {
|
|
91
|
+
const timeSinceBoot = Date.now() - this.lastStartTime;
|
|
92
|
+
if (timeSinceBoot < BOOT_ERROR_THRESHOLD) {
|
|
93
|
+
logger.error(
|
|
94
|
+
"backend failed to boot (exited within 5s), pausing auto-restart \u2014 fix the error and save to retry",
|
|
95
|
+
{ error: String(err) }
|
|
96
|
+
);
|
|
97
|
+
this.paused = true;
|
|
98
|
+
} else {
|
|
99
|
+
logger.error("backend rebuild/restart failed", { error: String(err) });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
105
|
+
0 && (module.exports = {
|
|
106
|
+
BackendWatcher
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=backend_watcher.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/dev/backend_watcher.ts"],"sourcesContent":["import { watch, type FSWatcher } from 'chokidar';\nimport { Subject, debounceTime, switchMap, from } from 'rxjs';\nimport { getLogger } from '@noego/logger';\nimport { BackendBridge } from '../bridge/backend_bridge.cjs';\n\nconst logger = getLogger('wood:dev:backend-watcher');\n\nexport interface BackendWatcherOptions {\n patterns: string[];\n bridge: BackendBridge;\n buildFn: () => Promise<void>;\n cwd: string;\n}\n\nconst MAX_CRASH_RESTARTS = 3;\nconst STABILITY_THRESHOLD = 30_000; // 30 seconds\nconst BOOT_ERROR_THRESHOLD = 5_000; // 5 seconds — quick exit = boot error, don't retry\n\nexport class BackendWatcher {\n private watcher: FSWatcher | null = null;\n private change$ = new Subject<string>();\n private crashCount = 0;\n private lastStartTime = 0;\n private paused = false;\n\n constructor(private options: BackendWatcherOptions) {}\n\n start(): void {\n this.watcher = watch(this.options.patterns, {\n cwd: this.options.cwd,\n ignoreInitial: true,\n });\n\n this.watcher.on('change', (filePath: string) => {\n if (this.paused) {\n // A file change while paused resets the pause — the developer likely fixed the issue\n logger.info('file change detected while paused, resuming restarts');\n this.paused = false;\n this.crashCount = 0;\n }\n logger.debug('backend file changed', { filePath });\n this.change$.next(filePath);\n });\n\n // RxJS pipeline: debounce rapid saves, switchMap cancels in-progress restarts\n this.change$.pipe(\n debounceTime(100),\n switchMap(() => from(this.rebuild())),\n ).subscribe({\n error: (err) => {\n logger.error('backend watcher pipeline error', { error: String(err) });\n },\n });\n }\n\n stop(): void {\n this.watcher?.close();\n this.change$.complete();\n }\n\n private async rebuild(): Promise<void> {\n if (this.paused) return;\n\n try {\n logger.info('restarting backend');\n\n // Stop backend\n await this.options.bridge.stop();\n\n // Rebuild\n await this.options.buildFn();\n\n // Check crash threshold — rapid crashes indicate a persistent issue\n const timeSinceLastStart = Date.now() - this.lastStartTime;\n if (this.lastStartTime > 0 && timeSinceLastStart < STABILITY_THRESHOLD) {\n this.crashCount++;\n if (this.crashCount >= MAX_CRASH_RESTARTS) {\n logger.error(\n 'backend crashed too many times in quick succession, pausing restarts',\n { crashCount: this.crashCount },\n );\n this.paused = true;\n return;\n }\n } else {\n this.crashCount = 0;\n }\n\n // Start backend\n this.lastStartTime = Date.now();\n await this.options.bridge.start();\n\n // Boot error detection: if the backend exits very quickly after start,\n // it likely has a fatal error (syntax error, missing dep, etc.)\n // The bridge's onExit fires and state goes to 'stopped'.\n // We check inline here — if bridge.start() resolved but then\n // immediately exits, the next change will see it as a crash.\n // However, we can also detect it if start() itself throws\n // (bridge.waitForReady rejects on exit).\n\n logger.info('backend restarted successfully');\n } catch (err) {\n const timeSinceBoot = Date.now() - this.lastStartTime;\n if (timeSinceBoot < BOOT_ERROR_THRESHOLD) {\n logger.error(\n 'backend failed to boot (exited within 5s), pausing auto-restart — fix the error and save to retry',\n { error: String(err) },\n );\n this.paused = true;\n } else {\n logger.error('backend rebuild/restart failed', { error: String(err) });\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAsC;AACtC,kBAAuD;AACvD,oBAA0B;AAG1B,MAAM,aAAS,yBAAU,0BAA0B;AASnD,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;AAEtB,MAAM,eAAe;AAAA,EAO1B,YAAoB,SAAgC;AAAhC;AANpB,SAAQ,UAA4B;AACpC,SAAQ,UAAU,IAAI,oBAAgB;AACtC,SAAQ,aAAa;AACrB,SAAQ,gBAAgB;AACxB,SAAQ,SAAS;AAAA,EAEoC;AAAA,EAErD,QAAc;AACZ,SAAK,cAAU,uBAAM,KAAK,QAAQ,UAAU;AAAA,MAC1C,KAAK,KAAK,QAAQ;AAAA,MAClB,eAAe;AAAA,IACjB,CAAC;AAED,SAAK,QAAQ,GAAG,UAAU,CAAC,aAAqB;AAC9C,UAAI,KAAK,QAAQ;AAEf,eAAO,KAAK,sDAAsD;AAClE,aAAK,SAAS;AACd,aAAK,aAAa;AAAA,MACpB;AACA,aAAO,MAAM,wBAAwB,EAAE,SAAS,CAAC;AACjD,WAAK,QAAQ,KAAK,QAAQ;AAAA,IAC5B,CAAC;AAGD,SAAK,QAAQ;AAAA,UACX,0BAAa,GAAG;AAAA,UAChB,uBAAU,UAAM,kBAAK,KAAK,QAAQ,CAAC,CAAC;AAAA,IACtC,EAAE,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ;AACd,eAAO,MAAM,kCAAkC,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,MACvE;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,OAAa;AACX,SAAK,SAAS,MAAM;AACpB,SAAK,QAAQ,SAAS;AAAA,EACxB;AAAA,EAEA,MAAc,UAAyB;AACrC,QAAI,KAAK,OAAQ;AAEjB,QAAI;AACF,aAAO,KAAK,oBAAoB;AAGhC,YAAM,KAAK,QAAQ,OAAO,KAAK;AAG/B,YAAM,KAAK,QAAQ,QAAQ;AAG3B,YAAM,qBAAqB,KAAK,IAAI,IAAI,KAAK;AAC7C,UAAI,KAAK,gBAAgB,KAAK,qBAAqB,qBAAqB;AACtE,aAAK;AACL,YAAI,KAAK,cAAc,oBAAoB;AACzC,iBAAO;AAAA,YACL;AAAA,YACA,EAAE,YAAY,KAAK,WAAW;AAAA,UAChC;AACA,eAAK,SAAS;AACd;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK,aAAa;AAAA,MACpB;AAGA,WAAK,gBAAgB,KAAK,IAAI;AAC9B,YAAM,KAAK,QAAQ,OAAO,MAAM;AAUhC,aAAO,KAAK,gCAAgC;AAAA,IAC9C,SAAS,KAAK;AACZ,YAAM,gBAAgB,KAAK,IAAI,IAAI,KAAK;AACxC,UAAI,gBAAgB,sBAAsB;AACxC,eAAO;AAAA,UACL;AAAA,UACA,EAAE,OAAO,OAAO,GAAG,EAAE;AAAA,QACvB;AACA,aAAK,SAAS;AAAA,MAChB,OAAO;AACL,eAAO,MAAM,kCAAkC,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|