@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,276 @@
|
|
|
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 stick_exports = {};
|
|
30
|
+
__export(stick_exports, {
|
|
31
|
+
BrowserLaunchError: () => BrowserLaunchError,
|
|
32
|
+
ImageRenderer: () => ImageRenderer,
|
|
33
|
+
PlaywrightNotInstalledError: () => PlaywrightNotInstalledError,
|
|
34
|
+
RenderError: () => RenderError,
|
|
35
|
+
RenderTimeoutError: () => RenderTimeoutError,
|
|
36
|
+
createImageRenderer: () => createImageRenderer
|
|
37
|
+
});
|
|
38
|
+
module.exports = __toCommonJS(stick_exports);
|
|
39
|
+
var import_allow_cli = require("./allow_cli.cjs");
|
|
40
|
+
var fs = __toESM(require("fs"), 1);
|
|
41
|
+
var path = __toESM(require("path"), 1);
|
|
42
|
+
var import_template_resolver = require("./template_resolver.cjs");
|
|
43
|
+
class PlaywrightNotInstalledError extends Error {
|
|
44
|
+
constructor() {
|
|
45
|
+
super(
|
|
46
|
+
"ImageRenderer requires Playwright. Install it with:\n npm install playwright\n npx playwright install chromium"
|
|
47
|
+
);
|
|
48
|
+
this.name = "PlaywrightNotInstalledError";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
class BrowserLaunchError extends Error {
|
|
52
|
+
constructor(message, cause) {
|
|
53
|
+
super(message);
|
|
54
|
+
this.cause = cause;
|
|
55
|
+
this.name = "BrowserLaunchError";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
class RenderTimeoutError extends Error {
|
|
59
|
+
constructor(timeoutMs) {
|
|
60
|
+
super(`Render timed out after ${timeoutMs}ms`);
|
|
61
|
+
this.name = "RenderTimeoutError";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
class RenderError extends Error {
|
|
65
|
+
constructor(message, cause) {
|
|
66
|
+
super(message);
|
|
67
|
+
this.cause = cause;
|
|
68
|
+
this.name = "RenderError";
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function loadPlaywright() {
|
|
72
|
+
try {
|
|
73
|
+
const playwright = await import("playwright");
|
|
74
|
+
return playwright;
|
|
75
|
+
} catch {
|
|
76
|
+
throw new PlaywrightNotInstalledError();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function getContentType(filePath) {
|
|
80
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
81
|
+
const types = {
|
|
82
|
+
".png": "image/png",
|
|
83
|
+
".jpg": "image/jpeg",
|
|
84
|
+
".jpeg": "image/jpeg",
|
|
85
|
+
".gif": "image/gif",
|
|
86
|
+
".svg": "image/svg+xml",
|
|
87
|
+
".webp": "image/webp",
|
|
88
|
+
".css": "text/css",
|
|
89
|
+
".js": "application/javascript",
|
|
90
|
+
".json": "application/json",
|
|
91
|
+
".woff": "font/woff",
|
|
92
|
+
".woff2": "font/woff2",
|
|
93
|
+
".ttf": "font/ttf"
|
|
94
|
+
};
|
|
95
|
+
return types[ext] || "application/octet-stream";
|
|
96
|
+
}
|
|
97
|
+
class ImageRenderer {
|
|
98
|
+
constructor(browser, staticRenderer, config) {
|
|
99
|
+
this.browser = browser;
|
|
100
|
+
this.staticRenderer = staticRenderer;
|
|
101
|
+
this.config = {
|
|
102
|
+
outputDir: config.outputDir,
|
|
103
|
+
width: config.width ?? 1920,
|
|
104
|
+
height: config.height ?? 1080,
|
|
105
|
+
deviceScaleFactor: config.deviceScaleFactor ?? 1,
|
|
106
|
+
format: config.format ?? "png",
|
|
107
|
+
quality: config.quality ?? 80,
|
|
108
|
+
waitUntil: config.waitUntil ?? "networkidle",
|
|
109
|
+
timeoutMs: config.timeoutMs ?? 1e4,
|
|
110
|
+
template: config.template,
|
|
111
|
+
assets: config.assets
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Capture a view by dot-path key and save to outputDir
|
|
116
|
+
*/
|
|
117
|
+
async capture(name, viewKey, options) {
|
|
118
|
+
const { view, layout, wood } = options ?? {};
|
|
119
|
+
const html = await this.staticRenderer.renderToPage({
|
|
120
|
+
viewKey,
|
|
121
|
+
data: { view, layout },
|
|
122
|
+
wood,
|
|
123
|
+
template: this.config.template
|
|
124
|
+
});
|
|
125
|
+
return this.captureHtmlInternal(name, html, options);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Capture raw HTML and save to outputDir
|
|
129
|
+
*/
|
|
130
|
+
async captureHtml(name, html, options) {
|
|
131
|
+
return this.captureHtmlInternal(name, html, options);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Internal method to capture HTML to image
|
|
135
|
+
*/
|
|
136
|
+
async captureHtmlInternal(name, html, options) {
|
|
137
|
+
const width = options?.width ?? this.config.width;
|
|
138
|
+
const height = options?.height ?? this.config.height;
|
|
139
|
+
let context;
|
|
140
|
+
let page;
|
|
141
|
+
try {
|
|
142
|
+
context = await this.browser.newContext({
|
|
143
|
+
viewport: { width, height },
|
|
144
|
+
deviceScaleFactor: this.config.deviceScaleFactor
|
|
145
|
+
});
|
|
146
|
+
page = await context.newPage();
|
|
147
|
+
const FAKE_BASE_URL = "http://stick-renderer/";
|
|
148
|
+
await page.route(FAKE_BASE_URL, async (route) => {
|
|
149
|
+
await route.fulfill({
|
|
150
|
+
body: html,
|
|
151
|
+
contentType: "text/html"
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
if (this.config.assets) {
|
|
155
|
+
for (const [urlPath, fsPaths] of Object.entries(this.config.assets)) {
|
|
156
|
+
await page.route(`**${urlPath}/**`, async (route) => {
|
|
157
|
+
const url = new URL(route.request().url());
|
|
158
|
+
const relativePath = url.pathname.replace(urlPath, "");
|
|
159
|
+
for (const fsPath of fsPaths) {
|
|
160
|
+
const filePath = path.join(fsPath, relativePath);
|
|
161
|
+
try {
|
|
162
|
+
const body = await fs.promises.readFile(filePath);
|
|
163
|
+
const contentType = getContentType(filePath);
|
|
164
|
+
await route.fulfill({ body, contentType });
|
|
165
|
+
return;
|
|
166
|
+
} catch {
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
await route.abort("filenotfound");
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const waitUntilMapping = {
|
|
174
|
+
"load": "load",
|
|
175
|
+
"domcontentloaded": "domcontentloaded",
|
|
176
|
+
"networkidle": "networkidle"
|
|
177
|
+
};
|
|
178
|
+
try {
|
|
179
|
+
await page.goto(FAKE_BASE_URL, {
|
|
180
|
+
waitUntil: waitUntilMapping[this.config.waitUntil],
|
|
181
|
+
timeout: this.config.timeoutMs
|
|
182
|
+
});
|
|
183
|
+
} catch (error) {
|
|
184
|
+
if (error instanceof Error && error.message.includes("timeout")) {
|
|
185
|
+
throw new RenderTimeoutError(this.config.timeoutMs);
|
|
186
|
+
}
|
|
187
|
+
throw new RenderError(
|
|
188
|
+
"Failed to render HTML content",
|
|
189
|
+
error instanceof Error ? error : void 0
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
if (options?.beforeCapture) {
|
|
193
|
+
await options.beforeCapture(page);
|
|
194
|
+
}
|
|
195
|
+
const screenshotOptions = {
|
|
196
|
+
type: this.config.format,
|
|
197
|
+
fullPage: options?.fullPage ?? true
|
|
198
|
+
};
|
|
199
|
+
if (this.config.format === "jpeg") {
|
|
200
|
+
screenshotOptions.quality = this.config.quality;
|
|
201
|
+
}
|
|
202
|
+
const screenshot = await page.screenshot(screenshotOptions);
|
|
203
|
+
const buffer = Buffer.from(screenshot);
|
|
204
|
+
const filename = `${name}@${width}x${height}.${this.config.format}`;
|
|
205
|
+
const outputPath = path.join(this.config.outputDir, filename);
|
|
206
|
+
await fs.promises.mkdir(this.config.outputDir, { recursive: true });
|
|
207
|
+
await fs.promises.writeFile(outputPath, buffer);
|
|
208
|
+
return { buffer, path: outputPath };
|
|
209
|
+
} finally {
|
|
210
|
+
if (page) {
|
|
211
|
+
await page.close().catch(() => {
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
if (context) {
|
|
215
|
+
await context.close().catch(() => {
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Close browser and clean up resources
|
|
222
|
+
*/
|
|
223
|
+
async close() {
|
|
224
|
+
if (this.browser) {
|
|
225
|
+
await this.browser.close().catch(() => {
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async function createImageRenderer(config) {
|
|
231
|
+
const resolvedTemplate = (0, import_template_resolver.resolveImageRendererTemplate)({
|
|
232
|
+
template: config.template,
|
|
233
|
+
componentDir: config.componentDir
|
|
234
|
+
});
|
|
235
|
+
const resolvedConfig = {
|
|
236
|
+
...config,
|
|
237
|
+
template: resolvedTemplate
|
|
238
|
+
};
|
|
239
|
+
const playwright = await loadPlaywright();
|
|
240
|
+
let browser;
|
|
241
|
+
try {
|
|
242
|
+
browser = await playwright.chromium.launch({
|
|
243
|
+
headless: true
|
|
244
|
+
});
|
|
245
|
+
} catch (error) {
|
|
246
|
+
throw new BrowserLaunchError(
|
|
247
|
+
"Failed to launch Chromium. Ensure it is installed with: npx playwright install chromium",
|
|
248
|
+
error instanceof Error ? error : void 0
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
let staticRenderer;
|
|
252
|
+
if (resolvedConfig.staticRenderer) {
|
|
253
|
+
staticRenderer = resolvedConfig.staticRenderer;
|
|
254
|
+
} else if (resolvedConfig.viewsConfig && resolvedConfig.componentDir) {
|
|
255
|
+
const { createWoodStaticRenderer } = await import("./static_renderer.cjs");
|
|
256
|
+
staticRenderer = createWoodStaticRenderer({
|
|
257
|
+
viewsConfig: resolvedConfig.viewsConfig,
|
|
258
|
+
componentDir: resolvedConfig.componentDir
|
|
259
|
+
});
|
|
260
|
+
} else {
|
|
261
|
+
throw new Error(
|
|
262
|
+
"ImageRendererConfig requires either staticRenderer or both viewsConfig and componentDir"
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
return new ImageRenderer(browser, staticRenderer, resolvedConfig);
|
|
266
|
+
}
|
|
267
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
268
|
+
0 && (module.exports = {
|
|
269
|
+
BrowserLaunchError,
|
|
270
|
+
ImageRenderer,
|
|
271
|
+
PlaywrightNotInstalledError,
|
|
272
|
+
RenderError,
|
|
273
|
+
RenderTimeoutError,
|
|
274
|
+
createImageRenderer
|
|
275
|
+
});
|
|
276
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/stick/index.ts"],"sourcesContent":["import './allow_cli.cjs';\n// Type-only import — erased at runtime, won't trigger module loading\nimport type { WoodStaticRenderer } from './static_renderer.cjs';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { resolveImageRendererTemplate } from './template_resolver.cjs';\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.cjs');\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,111 @@
|
|
|
1
|
+
import { WoodStaticRenderer } from './static_renderer.cjs';
|
|
2
|
+
export { WoodRenderOptions, WoodRenderResult, WoodRenderToPageOptions, WoodStaticRendererConfig } from './static_renderer.cjs';
|
|
3
|
+
import '../types/views.cjs';
|
|
4
|
+
|
|
5
|
+
declare class PlaywrightNotInstalledError extends Error {
|
|
6
|
+
name: "PlaywrightNotInstalledError";
|
|
7
|
+
constructor();
|
|
8
|
+
}
|
|
9
|
+
declare class BrowserLaunchError extends Error {
|
|
10
|
+
cause?: Error | undefined;
|
|
11
|
+
name: "BrowserLaunchError";
|
|
12
|
+
constructor(message: string, cause?: Error | undefined);
|
|
13
|
+
}
|
|
14
|
+
declare class RenderTimeoutError extends Error {
|
|
15
|
+
name: "RenderTimeoutError";
|
|
16
|
+
constructor(timeoutMs: number);
|
|
17
|
+
}
|
|
18
|
+
declare class RenderError extends Error {
|
|
19
|
+
cause?: Error | undefined;
|
|
20
|
+
name: "RenderError";
|
|
21
|
+
constructor(message: string, cause?: Error | undefined);
|
|
22
|
+
}
|
|
23
|
+
interface ImageRendererConfig {
|
|
24
|
+
/** Output directory for screenshots */
|
|
25
|
+
outputDir: string;
|
|
26
|
+
/** Default width (default: 1920) */
|
|
27
|
+
width?: number;
|
|
28
|
+
/** Default height (default: 1080) */
|
|
29
|
+
height?: number;
|
|
30
|
+
/** Device scale factor for retina (default: 1) */
|
|
31
|
+
deviceScaleFactor?: number;
|
|
32
|
+
/** Image format (default: 'png') */
|
|
33
|
+
format?: 'png' | 'jpeg';
|
|
34
|
+
/** JPEG quality 0-100 (default: 80) */
|
|
35
|
+
quality?: number;
|
|
36
|
+
/** Wait condition (default: 'networkidle') */
|
|
37
|
+
waitUntil?: 'load' | 'domcontentloaded' | 'networkidle';
|
|
38
|
+
/** Timeout in ms (default: 10000) */
|
|
39
|
+
timeoutMs?: number;
|
|
40
|
+
/** Custom HTML template with {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders */
|
|
41
|
+
template?: string;
|
|
42
|
+
/** Pre-created WoodStaticRenderer instance */
|
|
43
|
+
staticRenderer?: WoodStaticRenderer;
|
|
44
|
+
/** OR: Path to views.yaml */
|
|
45
|
+
viewsConfig?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Component directory (required if viewsConfig provided).
|
|
48
|
+
* When template is omitted, stick auto-loads <componentDir>/index.html and
|
|
49
|
+
* inlines <componentDir>/styles.css when present.
|
|
50
|
+
*/
|
|
51
|
+
componentDir?: string;
|
|
52
|
+
/** Asset path mappings (e.g., { '/images': ['public/images'] }) */
|
|
53
|
+
assets?: Record<string, string[]>;
|
|
54
|
+
}
|
|
55
|
+
interface CaptureOptions {
|
|
56
|
+
/** View component data */
|
|
57
|
+
view?: any;
|
|
58
|
+
/** Layout data (one object per layout) */
|
|
59
|
+
layout?: any[];
|
|
60
|
+
/** Wood bridge object passed as a prop to layouts and views */
|
|
61
|
+
wood?: any;
|
|
62
|
+
/** Override width */
|
|
63
|
+
width?: number;
|
|
64
|
+
/** Override height */
|
|
65
|
+
height?: number;
|
|
66
|
+
/** Capture full page (default: true) */
|
|
67
|
+
fullPage?: boolean;
|
|
68
|
+
/** Callback executed after page load, before screenshot. Receives the Playwright page object. */
|
|
69
|
+
beforeCapture?: (page: any) => Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
interface CaptureHtmlOptions {
|
|
72
|
+
/** Override width */
|
|
73
|
+
width?: number;
|
|
74
|
+
/** Override height */
|
|
75
|
+
height?: number;
|
|
76
|
+
/** Capture full page (default: true) */
|
|
77
|
+
fullPage?: boolean;
|
|
78
|
+
/** Callback executed after page load, before screenshot. Receives the Playwright page object. */
|
|
79
|
+
beforeCapture?: (page: any) => Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
interface CaptureResult {
|
|
82
|
+
/** Raw image buffer */
|
|
83
|
+
buffer: Buffer;
|
|
84
|
+
/** Path where image was saved */
|
|
85
|
+
path: string;
|
|
86
|
+
}
|
|
87
|
+
declare class ImageRenderer {
|
|
88
|
+
private browser;
|
|
89
|
+
private staticRenderer;
|
|
90
|
+
private config;
|
|
91
|
+
constructor(browser: any, staticRenderer: WoodStaticRenderer, config: ImageRendererConfig);
|
|
92
|
+
/**
|
|
93
|
+
* Capture a view by dot-path key and save to outputDir
|
|
94
|
+
*/
|
|
95
|
+
capture(name: string, viewKey: string, options?: CaptureOptions): Promise<CaptureResult>;
|
|
96
|
+
/**
|
|
97
|
+
* Capture raw HTML and save to outputDir
|
|
98
|
+
*/
|
|
99
|
+
captureHtml(name: string, html: string, options?: CaptureHtmlOptions): Promise<CaptureResult>;
|
|
100
|
+
/**
|
|
101
|
+
* Internal method to capture HTML to image
|
|
102
|
+
*/
|
|
103
|
+
private captureHtmlInternal;
|
|
104
|
+
/**
|
|
105
|
+
* Close browser and clean up resources
|
|
106
|
+
*/
|
|
107
|
+
close(): Promise<void>;
|
|
108
|
+
}
|
|
109
|
+
declare function createImageRenderer(config: ImageRendererConfig): Promise<ImageRenderer>;
|
|
110
|
+
|
|
111
|
+
export { BrowserLaunchError, type CaptureHtmlOptions, type CaptureOptions, ImageRenderer, type ImageRendererConfig, PlaywrightNotInstalledError, RenderError, RenderTimeoutError, WoodStaticRenderer, createImageRenderer };
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { WoodStaticRenderer } from './static_renderer.js';
|
|
2
|
+
export { WoodRenderOptions, WoodRenderResult, WoodRenderToPageOptions, WoodStaticRendererConfig } from './static_renderer.js';
|
|
3
|
+
import '../types/views.js';
|
|
4
|
+
|
|
5
|
+
declare class PlaywrightNotInstalledError extends Error {
|
|
6
|
+
name: "PlaywrightNotInstalledError";
|
|
7
|
+
constructor();
|
|
8
|
+
}
|
|
9
|
+
declare class BrowserLaunchError extends Error {
|
|
10
|
+
cause?: Error | undefined;
|
|
11
|
+
name: "BrowserLaunchError";
|
|
12
|
+
constructor(message: string, cause?: Error | undefined);
|
|
13
|
+
}
|
|
14
|
+
declare class RenderTimeoutError extends Error {
|
|
15
|
+
name: "RenderTimeoutError";
|
|
16
|
+
constructor(timeoutMs: number);
|
|
17
|
+
}
|
|
18
|
+
declare class RenderError extends Error {
|
|
19
|
+
cause?: Error | undefined;
|
|
20
|
+
name: "RenderError";
|
|
21
|
+
constructor(message: string, cause?: Error | undefined);
|
|
22
|
+
}
|
|
23
|
+
interface ImageRendererConfig {
|
|
24
|
+
/** Output directory for screenshots */
|
|
25
|
+
outputDir: string;
|
|
26
|
+
/** Default width (default: 1920) */
|
|
27
|
+
width?: number;
|
|
28
|
+
/** Default height (default: 1080) */
|
|
29
|
+
height?: number;
|
|
30
|
+
/** Device scale factor for retina (default: 1) */
|
|
31
|
+
deviceScaleFactor?: number;
|
|
32
|
+
/** Image format (default: 'png') */
|
|
33
|
+
format?: 'png' | 'jpeg';
|
|
34
|
+
/** JPEG quality 0-100 (default: 80) */
|
|
35
|
+
quality?: number;
|
|
36
|
+
/** Wait condition (default: 'networkidle') */
|
|
37
|
+
waitUntil?: 'load' | 'domcontentloaded' | 'networkidle';
|
|
38
|
+
/** Timeout in ms (default: 10000) */
|
|
39
|
+
timeoutMs?: number;
|
|
40
|
+
/** Custom HTML template with {{{HEAD}}}, {{{CSS}}}, {{{APP}}} placeholders */
|
|
41
|
+
template?: string;
|
|
42
|
+
/** Pre-created WoodStaticRenderer instance */
|
|
43
|
+
staticRenderer?: WoodStaticRenderer;
|
|
44
|
+
/** OR: Path to views.yaml */
|
|
45
|
+
viewsConfig?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Component directory (required if viewsConfig provided).
|
|
48
|
+
* When template is omitted, stick auto-loads <componentDir>/index.html and
|
|
49
|
+
* inlines <componentDir>/styles.css when present.
|
|
50
|
+
*/
|
|
51
|
+
componentDir?: string;
|
|
52
|
+
/** Asset path mappings (e.g., { '/images': ['public/images'] }) */
|
|
53
|
+
assets?: Record<string, string[]>;
|
|
54
|
+
}
|
|
55
|
+
interface CaptureOptions {
|
|
56
|
+
/** View component data */
|
|
57
|
+
view?: any;
|
|
58
|
+
/** Layout data (one object per layout) */
|
|
59
|
+
layout?: any[];
|
|
60
|
+
/** Wood bridge object passed as a prop to layouts and views */
|
|
61
|
+
wood?: any;
|
|
62
|
+
/** Override width */
|
|
63
|
+
width?: number;
|
|
64
|
+
/** Override height */
|
|
65
|
+
height?: number;
|
|
66
|
+
/** Capture full page (default: true) */
|
|
67
|
+
fullPage?: boolean;
|
|
68
|
+
/** Callback executed after page load, before screenshot. Receives the Playwright page object. */
|
|
69
|
+
beforeCapture?: (page: any) => Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
interface CaptureHtmlOptions {
|
|
72
|
+
/** Override width */
|
|
73
|
+
width?: number;
|
|
74
|
+
/** Override height */
|
|
75
|
+
height?: number;
|
|
76
|
+
/** Capture full page (default: true) */
|
|
77
|
+
fullPage?: boolean;
|
|
78
|
+
/** Callback executed after page load, before screenshot. Receives the Playwright page object. */
|
|
79
|
+
beforeCapture?: (page: any) => Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
interface CaptureResult {
|
|
82
|
+
/** Raw image buffer */
|
|
83
|
+
buffer: Buffer;
|
|
84
|
+
/** Path where image was saved */
|
|
85
|
+
path: string;
|
|
86
|
+
}
|
|
87
|
+
declare class ImageRenderer {
|
|
88
|
+
private browser;
|
|
89
|
+
private staticRenderer;
|
|
90
|
+
private config;
|
|
91
|
+
constructor(browser: any, staticRenderer: WoodStaticRenderer, config: ImageRendererConfig);
|
|
92
|
+
/**
|
|
93
|
+
* Capture a view by dot-path key and save to outputDir
|
|
94
|
+
*/
|
|
95
|
+
capture(name: string, viewKey: string, options?: CaptureOptions): Promise<CaptureResult>;
|
|
96
|
+
/**
|
|
97
|
+
* Capture raw HTML and save to outputDir
|
|
98
|
+
*/
|
|
99
|
+
captureHtml(name: string, html: string, options?: CaptureHtmlOptions): Promise<CaptureResult>;
|
|
100
|
+
/**
|
|
101
|
+
* Internal method to capture HTML to image
|
|
102
|
+
*/
|
|
103
|
+
private captureHtmlInternal;
|
|
104
|
+
/**
|
|
105
|
+
* Close browser and clean up resources
|
|
106
|
+
*/
|
|
107
|
+
close(): Promise<void>;
|
|
108
|
+
}
|
|
109
|
+
declare function createImageRenderer(config: ImageRendererConfig): Promise<ImageRenderer>;
|
|
110
|
+
|
|
111
|
+
export { BrowserLaunchError, type CaptureHtmlOptions, type CaptureOptions, ImageRenderer, type ImageRendererConfig, PlaywrightNotInstalledError, RenderError, RenderTimeoutError, WoodStaticRenderer, createImageRenderer };
|