@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,237 @@
|
|
|
1
|
+
import "./allow_cli.js";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import { resolveImageRendererTemplate } from "./template_resolver.js";
|
|
5
|
+
class PlaywrightNotInstalledError extends Error {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(
|
|
8
|
+
"ImageRenderer requires Playwright. Install it with:\n npm install playwright\n npx playwright install chromium"
|
|
9
|
+
);
|
|
10
|
+
this.name = "PlaywrightNotInstalledError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
class BrowserLaunchError extends Error {
|
|
14
|
+
constructor(message, cause) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.cause = cause;
|
|
17
|
+
this.name = "BrowserLaunchError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
class RenderTimeoutError extends Error {
|
|
21
|
+
constructor(timeoutMs) {
|
|
22
|
+
super(`Render timed out after ${timeoutMs}ms`);
|
|
23
|
+
this.name = "RenderTimeoutError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
class RenderError extends Error {
|
|
27
|
+
constructor(message, cause) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.cause = cause;
|
|
30
|
+
this.name = "RenderError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function loadPlaywright() {
|
|
34
|
+
try {
|
|
35
|
+
const playwright = await import("playwright");
|
|
36
|
+
return playwright;
|
|
37
|
+
} catch {
|
|
38
|
+
throw new PlaywrightNotInstalledError();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function getContentType(filePath) {
|
|
42
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
43
|
+
const types = {
|
|
44
|
+
".png": "image/png",
|
|
45
|
+
".jpg": "image/jpeg",
|
|
46
|
+
".jpeg": "image/jpeg",
|
|
47
|
+
".gif": "image/gif",
|
|
48
|
+
".svg": "image/svg+xml",
|
|
49
|
+
".webp": "image/webp",
|
|
50
|
+
".css": "text/css",
|
|
51
|
+
".js": "application/javascript",
|
|
52
|
+
".json": "application/json",
|
|
53
|
+
".woff": "font/woff",
|
|
54
|
+
".woff2": "font/woff2",
|
|
55
|
+
".ttf": "font/ttf"
|
|
56
|
+
};
|
|
57
|
+
return types[ext] || "application/octet-stream";
|
|
58
|
+
}
|
|
59
|
+
class ImageRenderer {
|
|
60
|
+
constructor(browser, staticRenderer, config) {
|
|
61
|
+
this.browser = browser;
|
|
62
|
+
this.staticRenderer = staticRenderer;
|
|
63
|
+
this.config = {
|
|
64
|
+
outputDir: config.outputDir,
|
|
65
|
+
width: config.width ?? 1920,
|
|
66
|
+
height: config.height ?? 1080,
|
|
67
|
+
deviceScaleFactor: config.deviceScaleFactor ?? 1,
|
|
68
|
+
format: config.format ?? "png",
|
|
69
|
+
quality: config.quality ?? 80,
|
|
70
|
+
waitUntil: config.waitUntil ?? "networkidle",
|
|
71
|
+
timeoutMs: config.timeoutMs ?? 1e4,
|
|
72
|
+
template: config.template,
|
|
73
|
+
assets: config.assets
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Capture a view by dot-path key and save to outputDir
|
|
78
|
+
*/
|
|
79
|
+
async capture(name, viewKey, options) {
|
|
80
|
+
const { view, layout, wood } = options ?? {};
|
|
81
|
+
const html = await this.staticRenderer.renderToPage({
|
|
82
|
+
viewKey,
|
|
83
|
+
data: { view, layout },
|
|
84
|
+
wood,
|
|
85
|
+
template: this.config.template
|
|
86
|
+
});
|
|
87
|
+
return this.captureHtmlInternal(name, html, options);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Capture raw HTML and save to outputDir
|
|
91
|
+
*/
|
|
92
|
+
async captureHtml(name, html, options) {
|
|
93
|
+
return this.captureHtmlInternal(name, html, options);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Internal method to capture HTML to image
|
|
97
|
+
*/
|
|
98
|
+
async captureHtmlInternal(name, html, options) {
|
|
99
|
+
const width = options?.width ?? this.config.width;
|
|
100
|
+
const height = options?.height ?? this.config.height;
|
|
101
|
+
let context;
|
|
102
|
+
let page;
|
|
103
|
+
try {
|
|
104
|
+
context = await this.browser.newContext({
|
|
105
|
+
viewport: { width, height },
|
|
106
|
+
deviceScaleFactor: this.config.deviceScaleFactor
|
|
107
|
+
});
|
|
108
|
+
page = await context.newPage();
|
|
109
|
+
const FAKE_BASE_URL = "http://stick-renderer/";
|
|
110
|
+
await page.route(FAKE_BASE_URL, async (route) => {
|
|
111
|
+
await route.fulfill({
|
|
112
|
+
body: html,
|
|
113
|
+
contentType: "text/html"
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
if (this.config.assets) {
|
|
117
|
+
for (const [urlPath, fsPaths] of Object.entries(this.config.assets)) {
|
|
118
|
+
await page.route(`**${urlPath}/**`, async (route) => {
|
|
119
|
+
const url = new URL(route.request().url());
|
|
120
|
+
const relativePath = url.pathname.replace(urlPath, "");
|
|
121
|
+
for (const fsPath of fsPaths) {
|
|
122
|
+
const filePath = path.join(fsPath, relativePath);
|
|
123
|
+
try {
|
|
124
|
+
const body = await fs.promises.readFile(filePath);
|
|
125
|
+
const contentType = getContentType(filePath);
|
|
126
|
+
await route.fulfill({ body, contentType });
|
|
127
|
+
return;
|
|
128
|
+
} catch {
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
await route.abort("filenotfound");
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const waitUntilMapping = {
|
|
136
|
+
"load": "load",
|
|
137
|
+
"domcontentloaded": "domcontentloaded",
|
|
138
|
+
"networkidle": "networkidle"
|
|
139
|
+
};
|
|
140
|
+
try {
|
|
141
|
+
await page.goto(FAKE_BASE_URL, {
|
|
142
|
+
waitUntil: waitUntilMapping[this.config.waitUntil],
|
|
143
|
+
timeout: this.config.timeoutMs
|
|
144
|
+
});
|
|
145
|
+
} catch (error) {
|
|
146
|
+
if (error instanceof Error && error.message.includes("timeout")) {
|
|
147
|
+
throw new RenderTimeoutError(this.config.timeoutMs);
|
|
148
|
+
}
|
|
149
|
+
throw new RenderError(
|
|
150
|
+
"Failed to render HTML content",
|
|
151
|
+
error instanceof Error ? error : void 0
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
if (options?.beforeCapture) {
|
|
155
|
+
await options.beforeCapture(page);
|
|
156
|
+
}
|
|
157
|
+
const screenshotOptions = {
|
|
158
|
+
type: this.config.format,
|
|
159
|
+
fullPage: options?.fullPage ?? true
|
|
160
|
+
};
|
|
161
|
+
if (this.config.format === "jpeg") {
|
|
162
|
+
screenshotOptions.quality = this.config.quality;
|
|
163
|
+
}
|
|
164
|
+
const screenshot = await page.screenshot(screenshotOptions);
|
|
165
|
+
const buffer = Buffer.from(screenshot);
|
|
166
|
+
const filename = `${name}@${width}x${height}.${this.config.format}`;
|
|
167
|
+
const outputPath = path.join(this.config.outputDir, filename);
|
|
168
|
+
await fs.promises.mkdir(this.config.outputDir, { recursive: true });
|
|
169
|
+
await fs.promises.writeFile(outputPath, buffer);
|
|
170
|
+
return { buffer, path: outputPath };
|
|
171
|
+
} finally {
|
|
172
|
+
if (page) {
|
|
173
|
+
await page.close().catch(() => {
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
if (context) {
|
|
177
|
+
await context.close().catch(() => {
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Close browser and clean up resources
|
|
184
|
+
*/
|
|
185
|
+
async close() {
|
|
186
|
+
if (this.browser) {
|
|
187
|
+
await this.browser.close().catch(() => {
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async function createImageRenderer(config) {
|
|
193
|
+
const resolvedTemplate = resolveImageRendererTemplate({
|
|
194
|
+
template: config.template,
|
|
195
|
+
componentDir: config.componentDir
|
|
196
|
+
});
|
|
197
|
+
const resolvedConfig = {
|
|
198
|
+
...config,
|
|
199
|
+
template: resolvedTemplate
|
|
200
|
+
};
|
|
201
|
+
const playwright = await loadPlaywright();
|
|
202
|
+
let browser;
|
|
203
|
+
try {
|
|
204
|
+
browser = await playwright.chromium.launch({
|
|
205
|
+
headless: true
|
|
206
|
+
});
|
|
207
|
+
} catch (error) {
|
|
208
|
+
throw new BrowserLaunchError(
|
|
209
|
+
"Failed to launch Chromium. Ensure it is installed with: npx playwright install chromium",
|
|
210
|
+
error instanceof Error ? error : void 0
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
let staticRenderer;
|
|
214
|
+
if (resolvedConfig.staticRenderer) {
|
|
215
|
+
staticRenderer = resolvedConfig.staticRenderer;
|
|
216
|
+
} else if (resolvedConfig.viewsConfig && resolvedConfig.componentDir) {
|
|
217
|
+
const { createWoodStaticRenderer } = await import("./static_renderer.js");
|
|
218
|
+
staticRenderer = createWoodStaticRenderer({
|
|
219
|
+
viewsConfig: resolvedConfig.viewsConfig,
|
|
220
|
+
componentDir: resolvedConfig.componentDir
|
|
221
|
+
});
|
|
222
|
+
} else {
|
|
223
|
+
throw new Error(
|
|
224
|
+
"ImageRendererConfig requires either staticRenderer or both viewsConfig and componentDir"
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
return new ImageRenderer(browser, staticRenderer, resolvedConfig);
|
|
228
|
+
}
|
|
229
|
+
export {
|
|
230
|
+
BrowserLaunchError,
|
|
231
|
+
ImageRenderer,
|
|
232
|
+
PlaywrightNotInstalledError,
|
|
233
|
+
RenderError,
|
|
234
|
+
RenderTimeoutError,
|
|
235
|
+
createImageRenderer
|
|
236
|
+
};
|
|
237
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/stick/index.ts"],"sourcesContent":["import './allow_cli.js';\n// Type-only import — erased at runtime, won't trigger module loading\nimport type { WoodStaticRenderer } from './static_renderer.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { resolveImageRendererTemplate } from './template_resolver.js';\n\nexport type { WoodStaticRenderer };\nexport type {\n WoodStaticRendererConfig,\n WoodRenderOptions,\n WoodRenderToPageOptions,\n WoodRenderResult,\n} from './static_renderer';\n\n// ─────────────────────────────────────────────────────────────\n// Error Classes\n// ─────────────────────────────────────────────────────────────\n\nexport class PlaywrightNotInstalledError extends Error {\n name = 'PlaywrightNotInstalledError' as const;\n constructor() {\n super(\n 'ImageRenderer requires Playwright. Install it with:\\n' +\n ' npm install playwright\\n' +\n ' npx playwright install chromium'\n );\n }\n}\n\nexport class BrowserLaunchError extends Error {\n name = 'BrowserLaunchError' as const;\n constructor(message: string, public cause?: Error) {\n super(message);\n }\n}\n\nexport class RenderTimeoutError extends Error {\n name = 'RenderTimeoutError' as const;\n constructor(timeoutMs: number) {\n super(`Render timed out after ${timeoutMs}ms`);\n }\n}\n\nexport class RenderError extends Error {\n name = 'RenderError' as const;\n constructor(message: string, public cause?: Error) {\n super(message);\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\nexport interface ImageRendererConfig {\n /** Output directory for screenshots */\n outputDir: string;\n /** Default width (default: 1920) */\n width?: number;\n /** Default height (default: 1080) */\n height?: number;\n /** Device scale factor for retina (default: 1) */\n deviceScaleFactor?: number;\n /** Image format (default: 'png') */\n format?: 'png' | 'jpeg';\n /** JPEG quality 0-100 (default: 80) */\n quality?: number;\n /** Wait condition (default: 'networkidle') */\n waitUntil?: 'load' | 'domcontentloaded' | 'networkidle';\n /** Timeout in ms (default: 10000) */\n timeoutMs?: number;\n /** Custom HTML template with {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders */\n template?: string;\n\n // Static renderer config (one of these)\n /** Pre-created WoodStaticRenderer instance */\n staticRenderer?: WoodStaticRenderer;\n /** OR: Path to views.yaml */\n viewsConfig?: string;\n /**\n * Component directory (required if viewsConfig provided).\n * When template is omitted, stick auto-loads <componentDir>/index.html and\n * inlines <componentDir>/styles.css when present.\n */\n componentDir?: string;\n /** Asset path mappings (e.g., { '/images': ['public/images'] }) */\n assets?: Record<string, string[]>;\n}\n\nexport interface CaptureOptions {\n /** View component data */\n view?: any;\n /** Layout data (one object per layout) */\n layout?: any[];\n /** Wood bridge object passed as a prop to layouts and views */\n wood?: any;\n /** Override width */\n width?: number;\n /** Override height */\n height?: number;\n /** Capture full page (default: true) */\n fullPage?: boolean;\n /** Callback executed after page load, before screenshot. Receives the Playwright page object. */\n beforeCapture?: (page: any) => Promise<void>;\n}\n\nexport interface CaptureHtmlOptions {\n /** Override width */\n width?: number;\n /** Override height */\n height?: number;\n /** Capture full page (default: true) */\n fullPage?: boolean;\n /** Callback executed after page load, before screenshot. Receives the Playwright page object. */\n beforeCapture?: (page: any) => Promise<void>;\n}\n\ninterface CaptureResult {\n /** Raw image buffer */\n buffer: Buffer;\n /** Path where image was saved */\n path: string;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Playwright Loader\n// ─────────────────────────────────────────────────────────────\n\ntype PlaywrightModule = typeof import('playwright');\n\nasync function loadPlaywright(): Promise<PlaywrightModule> {\n try {\n const playwright = await import('playwright');\n return playwright;\n } catch {\n throw new PlaywrightNotInstalledError();\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Content Type Helper\n// ─────────────────────────────────────────────────────────────\n\nfunction getContentType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const types: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.css': 'text/css',\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n };\n return types[ext] || 'application/octet-stream';\n}\n\n// ─────────────────────────────────────────────────────────────\n// ImageRenderer Class\n// ─────────────────────────────────────────────────────────────\n\nexport class ImageRenderer {\n private browser: any;\n private staticRenderer: WoodStaticRenderer;\n private config: Required<Omit<ImageRendererConfig, 'staticRenderer' | 'viewsConfig' | 'componentDir' | 'template' | 'assets'>> & {\n outputDir: string;\n template?: string;\n assets?: Record<string, string[]>;\n };\n\n constructor(\n browser: any,\n staticRenderer: WoodStaticRenderer,\n config: ImageRendererConfig\n ) {\n this.browser = browser;\n this.staticRenderer = staticRenderer;\n this.config = {\n outputDir: config.outputDir,\n width: config.width ?? 1920,\n height: config.height ?? 1080,\n deviceScaleFactor: config.deviceScaleFactor ?? 1,\n format: config.format ?? 'png',\n quality: config.quality ?? 80,\n waitUntil: config.waitUntil ?? 'networkidle',\n timeoutMs: config.timeoutMs ?? 10000,\n template: config.template,\n assets: config.assets,\n };\n }\n\n /**\n * Capture a view by dot-path key and save to outputDir\n */\n async capture(\n name: string,\n viewKey: string,\n options?: CaptureOptions\n ): Promise<CaptureResult> {\n const { view, layout, wood } = options ?? {};\n const html = await this.staticRenderer.renderToPage({\n viewKey,\n data: { view, layout },\n wood,\n template: this.config.template,\n });\n\n return this.captureHtmlInternal(name, html, options);\n }\n\n /**\n * Capture raw HTML and save to outputDir\n */\n async captureHtml(\n name: string,\n html: string,\n options?: CaptureHtmlOptions\n ): Promise<CaptureResult> {\n return this.captureHtmlInternal(name, html, options);\n }\n\n /**\n * Internal method to capture HTML to image\n */\n private async captureHtmlInternal(\n name: string,\n html: string,\n options?: CaptureHtmlOptions\n ): Promise<CaptureResult> {\n const width = options?.width ?? this.config.width;\n const height = options?.height ?? this.config.height;\n\n let context: any;\n let page: any;\n\n try {\n context = await this.browser.newContext({\n viewport: { width, height },\n deviceScaleFactor: this.config.deviceScaleFactor,\n });\n\n page = await context.newPage();\n\n // Route Interception Strategy:\n // We use page.goto() with a fake URL instead of page.setContent() because\n // setContent() has no base URL, so relative paths can't resolve.\n const FAKE_BASE_URL = 'http://stick-renderer/';\n\n await page.route(FAKE_BASE_URL, async (route: any) => {\n await route.fulfill({\n body: html,\n contentType: 'text/html',\n });\n });\n\n // Asset route interception\n if (this.config.assets) {\n for (const [urlPath, fsPaths] of Object.entries(this.config.assets)) {\n await page.route(`**${urlPath}/**`, async (route: any) => {\n const url = new URL(route.request().url());\n const relativePath = url.pathname.replace(urlPath, '');\n\n for (const fsPath of fsPaths) {\n const filePath = path.join(fsPath, relativePath);\n try {\n const body = await fs.promises.readFile(filePath);\n const contentType = getContentType(filePath);\n await route.fulfill({ body, contentType });\n return;\n } catch {\n // File not found in this path, try the next one\n }\n }\n\n await route.abort('filenotfound');\n });\n }\n }\n\n const waitUntilMapping = {\n 'load': 'load',\n 'domcontentloaded': 'domcontentloaded',\n 'networkidle': 'networkidle',\n } as const;\n\n try {\n await page.goto(FAKE_BASE_URL, {\n waitUntil: waitUntilMapping[this.config.waitUntil],\n timeout: this.config.timeoutMs,\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes('timeout')) {\n throw new RenderTimeoutError(this.config.timeoutMs);\n }\n throw new RenderError(\n 'Failed to render HTML content',\n error instanceof Error ? error : undefined\n );\n }\n\n if (options?.beforeCapture) {\n await options.beforeCapture(page);\n }\n\n const screenshotOptions: {\n type: 'png' | 'jpeg';\n quality?: number;\n fullPage: boolean;\n } = {\n type: this.config.format,\n fullPage: options?.fullPage ?? true,\n };\n\n if (this.config.format === 'jpeg') {\n screenshotOptions.quality = this.config.quality;\n }\n\n const screenshot = await page.screenshot(screenshotOptions);\n const buffer = Buffer.from(screenshot);\n\n const filename = `${name}@${width}x${height}.${this.config.format}`;\n const outputPath = path.join(this.config.outputDir, filename);\n\n await fs.promises.mkdir(this.config.outputDir, { recursive: true });\n await fs.promises.writeFile(outputPath, buffer);\n\n return { buffer, path: outputPath };\n\n } finally {\n if (page) {\n await page.close().catch(() => {});\n }\n if (context) {\n await context.close().catch(() => {});\n }\n }\n }\n\n /**\n * Close browser and clean up resources\n */\n async close(): Promise<void> {\n if (this.browser) {\n await this.browser.close().catch(() => {});\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────\n\nexport async function createImageRenderer(\n config: ImageRendererConfig\n): Promise<ImageRenderer> {\n const resolvedTemplate = resolveImageRendererTemplate({\n template: config.template,\n componentDir: config.componentDir,\n });\n const resolvedConfig: ImageRendererConfig = {\n ...config,\n template: resolvedTemplate,\n };\n\n const playwright = await loadPlaywright();\n\n let browser: any;\n try {\n browser = await playwright.chromium.launch({\n headless: true,\n });\n } catch (error) {\n throw new BrowserLaunchError(\n 'Failed to launch Chromium. Ensure it is installed with: npx playwright install chromium',\n error instanceof Error ? error : undefined\n );\n }\n\n let staticRenderer: WoodStaticRenderer;\n if (resolvedConfig.staticRenderer) {\n staticRenderer = resolvedConfig.staticRenderer;\n } else if (resolvedConfig.viewsConfig && resolvedConfig.componentDir) {\n const { createWoodStaticRenderer } = await import('./static_renderer.js');\n staticRenderer = createWoodStaticRenderer({\n viewsConfig: resolvedConfig.viewsConfig,\n componentDir: resolvedConfig.componentDir,\n });\n } else {\n throw new Error(\n 'ImageRendererConfig requires either staticRenderer or both viewsConfig and componentDir'\n );\n }\n\n return new ImageRenderer(browser, staticRenderer, resolvedConfig);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,144 @@
|
|
|
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 static_renderer_exports = {};
|
|
20
|
+
__export(static_renderer_exports, {
|
|
21
|
+
WoodStaticRenderer: () => WoodStaticRenderer,
|
|
22
|
+
createWoodStaticRenderer: () => createWoodStaticRenderer
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(static_renderer_exports);
|
|
25
|
+
var import_url = require("url");
|
|
26
|
+
var import_path = require("path");
|
|
27
|
+
var import_views_parser = require("../parser/views_parser.cjs");
|
|
28
|
+
async function loadWoodRecursiveRenderComponent() {
|
|
29
|
+
const candidates = [
|
|
30
|
+
"./WoodRecursiveRender.svelte",
|
|
31
|
+
"../../src/stick/WoodRecursiveRender.svelte"
|
|
32
|
+
];
|
|
33
|
+
let lastNotFoundError;
|
|
34
|
+
for (const candidate of candidates) {
|
|
35
|
+
try {
|
|
36
|
+
return await import(
|
|
37
|
+
/* @vite-ignore */
|
|
38
|
+
candidate
|
|
39
|
+
);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
const code = error?.code;
|
|
42
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
43
|
+
const isNotFound = code === "ERR_MODULE_NOT_FOUND" || message.includes("Cannot find module");
|
|
44
|
+
if (!isNotFound) {
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
lastNotFoundError = error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw lastNotFoundError ?? new Error("Failed to load WoodRecursiveRender.svelte.");
|
|
51
|
+
}
|
|
52
|
+
class WoodStaticRenderer {
|
|
53
|
+
constructor(views, componentDir) {
|
|
54
|
+
this.views = views;
|
|
55
|
+
this.componentDir = componentDir;
|
|
56
|
+
}
|
|
57
|
+
/** Find a ViewDef by dot-path key (e.g., 'chat.main') */
|
|
58
|
+
findView(viewKey) {
|
|
59
|
+
const segments = viewKey.split(".");
|
|
60
|
+
const windowName = segments[0];
|
|
61
|
+
const pageName = segments.slice(1).join(".");
|
|
62
|
+
const found = this.views.find(
|
|
63
|
+
(v) => v.windowName === windowName && v.pageName === pageName
|
|
64
|
+
);
|
|
65
|
+
if (!found) {
|
|
66
|
+
const available = this.views.map((v) => `${v.windowName}.${v.pageName}`).join(", ");
|
|
67
|
+
throw new Error(
|
|
68
|
+
`No view found for key "${viewKey}". Available views: ${available}`
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
return found;
|
|
72
|
+
}
|
|
73
|
+
/** Dynamically import a Svelte component via the ESM loader */
|
|
74
|
+
async loadComponent(relativePath) {
|
|
75
|
+
const absPath = (0, import_path.resolve)(this.componentDir, relativePath);
|
|
76
|
+
const fileUrl = (0, import_url.pathToFileURL)(absPath).href;
|
|
77
|
+
const mod = await import(fileUrl);
|
|
78
|
+
return mod.default;
|
|
79
|
+
}
|
|
80
|
+
async render(options) {
|
|
81
|
+
const { viewKey, data = {}, wood } = options;
|
|
82
|
+
const viewDef = this.findView(viewKey);
|
|
83
|
+
const view = await this.loadComponent(viewDef.viewPath);
|
|
84
|
+
const layouts = [];
|
|
85
|
+
for (const layoutPath of viewDef.layouts) {
|
|
86
|
+
layouts.push(await this.loadComponent(layoutPath));
|
|
87
|
+
}
|
|
88
|
+
const serverData = {
|
|
89
|
+
layout: data.layout || [],
|
|
90
|
+
view: data.view || {}
|
|
91
|
+
};
|
|
92
|
+
const svelteServer = "svelte/server";
|
|
93
|
+
const { render } = await import(
|
|
94
|
+
/* @vite-ignore */
|
|
95
|
+
svelteServer
|
|
96
|
+
);
|
|
97
|
+
const WoodRecursiveRenderMod = await loadWoodRecursiveRenderComponent();
|
|
98
|
+
const WoodRecursiveRender = WoodRecursiveRenderMod.default;
|
|
99
|
+
const result = render(WoodRecursiveRender, {
|
|
100
|
+
props: {
|
|
101
|
+
layouts,
|
|
102
|
+
view,
|
|
103
|
+
data: serverData,
|
|
104
|
+
wood
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
html: result.html,
|
|
109
|
+
head: result.head,
|
|
110
|
+
css: result.css?.code || "",
|
|
111
|
+
viewDef
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Render to a full HTML document.
|
|
116
|
+
* Uses default template or custom template with {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders.
|
|
117
|
+
*/
|
|
118
|
+
async renderToPage(options) {
|
|
119
|
+
const { html, head, css } = await this.render(options);
|
|
120
|
+
const defaultTemplate = `<!DOCTYPE html>
|
|
121
|
+
<html>
|
|
122
|
+
<head>
|
|
123
|
+
{{{HEAD}}}
|
|
124
|
+
<style>{{{CSS}}}</style>
|
|
125
|
+
</head>
|
|
126
|
+
<body>
|
|
127
|
+
<div id="app">{{{APP}}}</div>
|
|
128
|
+
</body>
|
|
129
|
+
</html>`;
|
|
130
|
+
const template = options.template || defaultTemplate;
|
|
131
|
+
return template.replace("{{{HEAD}}}", head).replace("{{{CSS}}}", css).replace("{{{APP}}}", html);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function createWoodStaticRenderer(config) {
|
|
135
|
+
const views = (0, import_views_parser.parseViewsFile)(config.viewsConfig);
|
|
136
|
+
const componentDir = (0, import_path.resolve)(config.componentDir);
|
|
137
|
+
return new WoodStaticRenderer(views, componentDir);
|
|
138
|
+
}
|
|
139
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
140
|
+
0 && (module.exports = {
|
|
141
|
+
WoodStaticRenderer,
|
|
142
|
+
createWoodStaticRenderer
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=static_renderer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/stick/static_renderer.ts"],"sourcesContent":["import { pathToFileURL } from 'url';\nimport { resolve } from 'path';\nimport { parseViewsFile } from '../parser/views_parser.cjs';\nimport type { ViewDef } from '../types/index.cjs';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\nexport interface WoodStaticRendererConfig {\n /** Path to views.yaml (e.g., './ui/views.yaml') */\n viewsConfig: string;\n /** Base directory for components (e.g., './ui') */\n componentDir: string;\n}\n\nexport interface WoodRenderOptions {\n /** Dot-path view key (e.g., 'chat.main') */\n viewKey: string;\n /** Mock data for layouts and view */\n data?: {\n layout?: any[];\n view?: any;\n };\n /** Wood bridge object passed as a prop to layouts and views */\n wood?: any;\n}\n\nexport interface WoodRenderToPageOptions extends WoodRenderOptions {\n /** Custom HTML template. Use {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders */\n template?: string;\n}\n\nexport interface WoodRenderResult {\n /** Rendered component HTML */\n html: string;\n /** Content from <svelte:head> tags */\n head: string;\n /** Component CSS */\n css: string;\n /** The matched view definition */\n viewDef: ViewDef;\n}\n\nasync function loadWoodRecursiveRenderComponent(): Promise<any> {\n const candidates = [\n './WoodRecursiveRender.svelte',\n '../../src/stick/WoodRecursiveRender.svelte',\n ];\n\n let lastNotFoundError: unknown;\n for (const candidate of candidates) {\n try {\n return await import(/* @vite-ignore */ candidate);\n } catch (error) {\n const code = (error as { code?: string })?.code;\n const message = error instanceof Error ? error.message : String(error);\n const isNotFound = code === 'ERR_MODULE_NOT_FOUND' || message.includes('Cannot find module');\n if (!isNotFound) {\n throw error;\n }\n lastNotFoundError = error;\n }\n }\n\n throw lastNotFoundError ?? new Error('Failed to load WoodRecursiveRender.svelte.');\n}\n\n// ─────────────────────────────────────────────────────────────\n// WoodStaticRenderer\n// ─────────────────────────────────────────────────────────────\n\nexport class WoodStaticRenderer {\n private views: ViewDef[];\n private componentDir: string;\n\n constructor(views: ViewDef[], componentDir: string) {\n this.views = views;\n this.componentDir = componentDir;\n }\n\n /** Find a ViewDef by dot-path key (e.g., 'chat.main') */\n private findView(viewKey: string): ViewDef {\n const segments = viewKey.split('.');\n const windowName = segments[0];\n const pageName = segments.slice(1).join('.');\n\n const found = this.views.find(\n v => v.windowName === windowName && v.pageName === pageName\n );\n if (!found) {\n const available = this.views.map(v => `${v.windowName}.${v.pageName}`).join(', ');\n throw new Error(\n `No view found for key \"${viewKey}\". Available views: ${available}`\n );\n }\n return found;\n }\n\n /** Dynamically import a Svelte component via the ESM loader */\n private async loadComponent(relativePath: string): Promise<any> {\n const absPath = resolve(this.componentDir, relativePath);\n const fileUrl = pathToFileURL(absPath).href;\n const mod = await import(fileUrl);\n return mod.default;\n }\n\n async render(options: WoodRenderOptions): Promise<WoodRenderResult> {\n const { viewKey, data = {}, wood } = options;\n\n const viewDef = this.findView(viewKey);\n\n // Load view component\n const view = await this.loadComponent(viewDef.viewPath);\n\n // Load layout components\n const layouts = [];\n for (const layoutPath of viewDef.layouts) {\n layouts.push(await this.loadComponent(layoutPath));\n }\n\n // Build server data\n const serverData = {\n layout: data.layout || [],\n view: data.view || {},\n };\n\n // Variable-based dynamic imports so tsc doesn't try to resolve these\n // modules during DTS generation (svelte is a peer dep, .svelte needs the loader).\n const svelteServer = 'svelte/server';\n const { render } = await import(/* @vite-ignore */ svelteServer);\n const WoodRecursiveRenderMod = await loadWoodRecursiveRenderComponent();\n const WoodRecursiveRender = WoodRecursiveRenderMod.default;\n\n const result = render(WoodRecursiveRender, {\n props: {\n layouts,\n view,\n data: serverData,\n wood,\n },\n });\n\n return {\n html: result.html,\n head: result.head,\n css: (result as any).css?.code || '',\n viewDef,\n };\n }\n\n /**\n * Render to a full HTML document.\n * Uses default template or custom template with {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders.\n */\n async renderToPage(options: WoodRenderToPageOptions): Promise<string> {\n const { html, head, css } = await this.render(options);\n\n const defaultTemplate = `<!DOCTYPE html>\n<html>\n<head>\n {{{HEAD}}}\n <style>{{{CSS}}}</style>\n</head>\n<body>\n <div id=\"app\">{{{APP}}}</div>\n</body>\n</html>`;\n\n const template = options.template || defaultTemplate;\n\n return template\n .replace('{{{HEAD}}}', head)\n .replace('{{{CSS}}}', css)\n .replace('{{{APP}}}', html);\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────\n\nexport function createWoodStaticRenderer(\n config: WoodStaticRendererConfig\n): WoodStaticRenderer {\n const views = parseViewsFile(config.viewsConfig);\n const componentDir = resolve(config.componentDir);\n return new WoodStaticRenderer(views, componentDir);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA8B;AAC9B,kBAAwB;AACxB,0BAA+B;AA0C/B,eAAe,mCAAiD;AAC5D,QAAM,aAAa;AAAA,IACf;AAAA,IACA;AAAA,EACJ;AAEA,MAAI;AACJ,aAAW,aAAa,YAAY;AAChC,QAAI;AACA,aAAO,MAAM;AAAA;AAAA,QAA0B;AAAA;AAAA,IAC3C,SAAS,OAAO;AACZ,YAAM,OAAQ,OAA6B;AAC3C,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAM,aAAa,SAAS,0BAA0B,QAAQ,SAAS,oBAAoB;AAC3F,UAAI,CAAC,YAAY;AACb,cAAM;AAAA,MACV;AACA,0BAAoB;AAAA,IACxB;AAAA,EACJ;AAEA,QAAM,qBAAqB,IAAI,MAAM,4CAA4C;AACrF;AAMO,MAAM,mBAAmB;AAAA,EAI5B,YAAY,OAAkB,cAAsB;AAChD,SAAK,QAAQ;AACb,SAAK,eAAe;AAAA,EACxB;AAAA;AAAA,EAGQ,SAAS,SAA0B;AACvC,UAAM,WAAW,QAAQ,MAAM,GAAG;AAClC,UAAM,aAAa,SAAS,CAAC;AAC7B,UAAM,WAAW,SAAS,MAAM,CAAC,EAAE,KAAK,GAAG;AAE3C,UAAM,QAAQ,KAAK,MAAM;AAAA,MACrB,OAAK,EAAE,eAAe,cAAc,EAAE,aAAa;AAAA,IACvD;AACA,QAAI,CAAC,OAAO;AACR,YAAM,YAAY,KAAK,MAAM,IAAI,OAAK,GAAG,EAAE,UAAU,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI;AAChF,YAAM,IAAI;AAAA,QACN,0BAA0B,OAAO,uBAAuB,SAAS;AAAA,MACrE;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,MAAc,cAAc,cAAoC;AAC5D,UAAM,cAAU,qBAAQ,KAAK,cAAc,YAAY;AACvD,UAAM,cAAU,0BAAc,OAAO,EAAE;AACvC,UAAM,MAAM,MAAM,OAAO;AACzB,WAAO,IAAI;AAAA,EACf;AAAA,EAEA,MAAM,OAAO,SAAuD;AAChE,UAAM,EAAE,SAAS,OAAO,CAAC,GAAG,KAAK,IAAI;AAErC,UAAM,UAAU,KAAK,SAAS,OAAO;AAGrC,UAAM,OAAO,MAAM,KAAK,cAAc,QAAQ,QAAQ;AAGtD,UAAM,UAAU,CAAC;AACjB,eAAW,cAAc,QAAQ,SAAS;AACtC,cAAQ,KAAK,MAAM,KAAK,cAAc,UAAU,CAAC;AAAA,IACrD;AAGA,UAAM,aAAa;AAAA,MACf,QAAQ,KAAK,UAAU,CAAC;AAAA,MACxB,MAAM,KAAK,QAAQ,CAAC;AAAA,IACxB;AAIA,UAAM,eAAe;AACrB,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA;AAAA,MAA0B;AAAA;AACnD,UAAM,yBAAyB,MAAM,iCAAiC;AACtE,UAAM,sBAAsB,uBAAuB;AAEnD,UAAM,SAAS,OAAO,qBAAqB;AAAA,MACvC,OAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,MACH,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,KAAM,OAAe,KAAK,QAAQ;AAAA,MAClC;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,SAAmD;AAClE,UAAM,EAAE,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK,OAAO,OAAO;AAErD,UAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWxB,UAAM,WAAW,QAAQ,YAAY;AAErC,WAAO,SACF,QAAQ,cAAc,IAAI,EAC1B,QAAQ,aAAa,GAAG,EACxB,QAAQ,aAAa,IAAI;AAAA,EAClC;AACJ;AAMO,SAAS,yBACZ,QACkB;AAClB,QAAM,YAAQ,oCAAe,OAAO,WAAW;AAC/C,QAAM,mBAAe,qBAAQ,OAAO,YAAY;AAChD,SAAO,IAAI,mBAAmB,OAAO,YAAY;AACrD;","names":[]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ViewDef } from '../types/views.cjs';
|
|
2
|
+
|
|
3
|
+
interface WoodStaticRendererConfig {
|
|
4
|
+
/** Path to views.yaml (e.g., './ui/views.yaml') */
|
|
5
|
+
viewsConfig: string;
|
|
6
|
+
/** Base directory for components (e.g., './ui') */
|
|
7
|
+
componentDir: string;
|
|
8
|
+
}
|
|
9
|
+
interface WoodRenderOptions {
|
|
10
|
+
/** Dot-path view key (e.g., 'chat.main') */
|
|
11
|
+
viewKey: string;
|
|
12
|
+
/** Mock data for layouts and view */
|
|
13
|
+
data?: {
|
|
14
|
+
layout?: any[];
|
|
15
|
+
view?: any;
|
|
16
|
+
};
|
|
17
|
+
/** Wood bridge object passed as a prop to layouts and views */
|
|
18
|
+
wood?: any;
|
|
19
|
+
}
|
|
20
|
+
interface WoodRenderToPageOptions extends WoodRenderOptions {
|
|
21
|
+
/** Custom HTML template. Use {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders */
|
|
22
|
+
template?: string;
|
|
23
|
+
}
|
|
24
|
+
interface WoodRenderResult {
|
|
25
|
+
/** Rendered component HTML */
|
|
26
|
+
html: string;
|
|
27
|
+
/** Content from <svelte:head> tags */
|
|
28
|
+
head: string;
|
|
29
|
+
/** Component CSS */
|
|
30
|
+
css: string;
|
|
31
|
+
/** The matched view definition */
|
|
32
|
+
viewDef: ViewDef;
|
|
33
|
+
}
|
|
34
|
+
declare class WoodStaticRenderer {
|
|
35
|
+
private views;
|
|
36
|
+
private componentDir;
|
|
37
|
+
constructor(views: ViewDef[], componentDir: string);
|
|
38
|
+
/** Find a ViewDef by dot-path key (e.g., 'chat.main') */
|
|
39
|
+
private findView;
|
|
40
|
+
/** Dynamically import a Svelte component via the ESM loader */
|
|
41
|
+
private loadComponent;
|
|
42
|
+
render(options: WoodRenderOptions): Promise<WoodRenderResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Render to a full HTML document.
|
|
45
|
+
* Uses default template or custom template with {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders.
|
|
46
|
+
*/
|
|
47
|
+
renderToPage(options: WoodRenderToPageOptions): Promise<string>;
|
|
48
|
+
}
|
|
49
|
+
declare function createWoodStaticRenderer(config: WoodStaticRendererConfig): WoodStaticRenderer;
|
|
50
|
+
|
|
51
|
+
export { type WoodRenderOptions, type WoodRenderResult, type WoodRenderToPageOptions, WoodStaticRenderer, type WoodStaticRendererConfig, createWoodStaticRenderer };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ViewDef } from '../types/views.js';
|
|
2
|
+
|
|
3
|
+
interface WoodStaticRendererConfig {
|
|
4
|
+
/** Path to views.yaml (e.g., './ui/views.yaml') */
|
|
5
|
+
viewsConfig: string;
|
|
6
|
+
/** Base directory for components (e.g., './ui') */
|
|
7
|
+
componentDir: string;
|
|
8
|
+
}
|
|
9
|
+
interface WoodRenderOptions {
|
|
10
|
+
/** Dot-path view key (e.g., 'chat.main') */
|
|
11
|
+
viewKey: string;
|
|
12
|
+
/** Mock data for layouts and view */
|
|
13
|
+
data?: {
|
|
14
|
+
layout?: any[];
|
|
15
|
+
view?: any;
|
|
16
|
+
};
|
|
17
|
+
/** Wood bridge object passed as a prop to layouts and views */
|
|
18
|
+
wood?: any;
|
|
19
|
+
}
|
|
20
|
+
interface WoodRenderToPageOptions extends WoodRenderOptions {
|
|
21
|
+
/** Custom HTML template. Use {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders */
|
|
22
|
+
template?: string;
|
|
23
|
+
}
|
|
24
|
+
interface WoodRenderResult {
|
|
25
|
+
/** Rendered component HTML */
|
|
26
|
+
html: string;
|
|
27
|
+
/** Content from <svelte:head> tags */
|
|
28
|
+
head: string;
|
|
29
|
+
/** Component CSS */
|
|
30
|
+
css: string;
|
|
31
|
+
/** The matched view definition */
|
|
32
|
+
viewDef: ViewDef;
|
|
33
|
+
}
|
|
34
|
+
declare class WoodStaticRenderer {
|
|
35
|
+
private views;
|
|
36
|
+
private componentDir;
|
|
37
|
+
constructor(views: ViewDef[], componentDir: string);
|
|
38
|
+
/** Find a ViewDef by dot-path key (e.g., 'chat.main') */
|
|
39
|
+
private findView;
|
|
40
|
+
/** Dynamically import a Svelte component via the ESM loader */
|
|
41
|
+
private loadComponent;
|
|
42
|
+
render(options: WoodRenderOptions): Promise<WoodRenderResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Render to a full HTML document.
|
|
45
|
+
* Uses default template or custom template with {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders.
|
|
46
|
+
*/
|
|
47
|
+
renderToPage(options: WoodRenderToPageOptions): Promise<string>;
|
|
48
|
+
}
|
|
49
|
+
declare function createWoodStaticRenderer(config: WoodStaticRendererConfig): WoodStaticRenderer;
|
|
50
|
+
|
|
51
|
+
export { type WoodRenderOptions, type WoodRenderResult, type WoodRenderToPageOptions, WoodStaticRenderer, type WoodStaticRendererConfig, createWoodStaticRenderer };
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { pathToFileURL } from "url";
|
|
2
|
+
import { resolve } from "path";
|
|
3
|
+
import { parseViewsFile } from "../parser/views_parser.js";
|
|
4
|
+
async function loadWoodRecursiveRenderComponent() {
|
|
5
|
+
const candidates = [
|
|
6
|
+
"./WoodRecursiveRender.svelte",
|
|
7
|
+
"../../src/stick/WoodRecursiveRender.svelte"
|
|
8
|
+
];
|
|
9
|
+
let lastNotFoundError;
|
|
10
|
+
for (const candidate of candidates) {
|
|
11
|
+
try {
|
|
12
|
+
return await import(
|
|
13
|
+
/* @vite-ignore */
|
|
14
|
+
candidate
|
|
15
|
+
);
|
|
16
|
+
} catch (error) {
|
|
17
|
+
const code = error?.code;
|
|
18
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
19
|
+
const isNotFound = code === "ERR_MODULE_NOT_FOUND" || message.includes("Cannot find module");
|
|
20
|
+
if (!isNotFound) {
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
lastNotFoundError = error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
throw lastNotFoundError ?? new Error("Failed to load WoodRecursiveRender.svelte.");
|
|
27
|
+
}
|
|
28
|
+
class WoodStaticRenderer {
|
|
29
|
+
constructor(views, componentDir) {
|
|
30
|
+
this.views = views;
|
|
31
|
+
this.componentDir = componentDir;
|
|
32
|
+
}
|
|
33
|
+
/** Find a ViewDef by dot-path key (e.g., 'chat.main') */
|
|
34
|
+
findView(viewKey) {
|
|
35
|
+
const segments = viewKey.split(".");
|
|
36
|
+
const windowName = segments[0];
|
|
37
|
+
const pageName = segments.slice(1).join(".");
|
|
38
|
+
const found = this.views.find(
|
|
39
|
+
(v) => v.windowName === windowName && v.pageName === pageName
|
|
40
|
+
);
|
|
41
|
+
if (!found) {
|
|
42
|
+
const available = this.views.map((v) => `${v.windowName}.${v.pageName}`).join(", ");
|
|
43
|
+
throw new Error(
|
|
44
|
+
`No view found for key "${viewKey}". Available views: ${available}`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
return found;
|
|
48
|
+
}
|
|
49
|
+
/** Dynamically import a Svelte component via the ESM loader */
|
|
50
|
+
async loadComponent(relativePath) {
|
|
51
|
+
const absPath = resolve(this.componentDir, relativePath);
|
|
52
|
+
const fileUrl = pathToFileURL(absPath).href;
|
|
53
|
+
const mod = await import(fileUrl);
|
|
54
|
+
return mod.default;
|
|
55
|
+
}
|
|
56
|
+
async render(options) {
|
|
57
|
+
const { viewKey, data = {}, wood } = options;
|
|
58
|
+
const viewDef = this.findView(viewKey);
|
|
59
|
+
const view = await this.loadComponent(viewDef.viewPath);
|
|
60
|
+
const layouts = [];
|
|
61
|
+
for (const layoutPath of viewDef.layouts) {
|
|
62
|
+
layouts.push(await this.loadComponent(layoutPath));
|
|
63
|
+
}
|
|
64
|
+
const serverData = {
|
|
65
|
+
layout: data.layout || [],
|
|
66
|
+
view: data.view || {}
|
|
67
|
+
};
|
|
68
|
+
const svelteServer = "svelte/server";
|
|
69
|
+
const { render } = await import(
|
|
70
|
+
/* @vite-ignore */
|
|
71
|
+
svelteServer
|
|
72
|
+
);
|
|
73
|
+
const WoodRecursiveRenderMod = await loadWoodRecursiveRenderComponent();
|
|
74
|
+
const WoodRecursiveRender = WoodRecursiveRenderMod.default;
|
|
75
|
+
const result = render(WoodRecursiveRender, {
|
|
76
|
+
props: {
|
|
77
|
+
layouts,
|
|
78
|
+
view,
|
|
79
|
+
data: serverData,
|
|
80
|
+
wood
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
html: result.html,
|
|
85
|
+
head: result.head,
|
|
86
|
+
css: result.css?.code || "",
|
|
87
|
+
viewDef
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Render to a full HTML document.
|
|
92
|
+
* Uses default template or custom template with {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders.
|
|
93
|
+
*/
|
|
94
|
+
async renderToPage(options) {
|
|
95
|
+
const { html, head, css } = await this.render(options);
|
|
96
|
+
const defaultTemplate = `<!DOCTYPE html>
|
|
97
|
+
<html>
|
|
98
|
+
<head>
|
|
99
|
+
{{{HEAD}}}
|
|
100
|
+
<style>{{{CSS}}}</style>
|
|
101
|
+
</head>
|
|
102
|
+
<body>
|
|
103
|
+
<div id="app">{{{APP}}}</div>
|
|
104
|
+
</body>
|
|
105
|
+
</html>`;
|
|
106
|
+
const template = options.template || defaultTemplate;
|
|
107
|
+
return template.replace("{{{HEAD}}}", head).replace("{{{CSS}}}", css).replace("{{{APP}}}", html);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function createWoodStaticRenderer(config) {
|
|
111
|
+
const views = parseViewsFile(config.viewsConfig);
|
|
112
|
+
const componentDir = resolve(config.componentDir);
|
|
113
|
+
return new WoodStaticRenderer(views, componentDir);
|
|
114
|
+
}
|
|
115
|
+
export {
|
|
116
|
+
WoodStaticRenderer,
|
|
117
|
+
createWoodStaticRenderer
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=static_renderer.js.map
|