@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,204 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { setContext, onDestroy } from 'svelte';
|
|
3
|
+
import { getNavigation } from '@noego/wood/navigation';
|
|
4
|
+
import WoodRecursiveRender from './WoodRecursiveRender.svelte';
|
|
5
|
+
|
|
6
|
+
type ViewManifestEntry = {
|
|
7
|
+
key: string;
|
|
8
|
+
windowName: string;
|
|
9
|
+
pageName: string;
|
|
10
|
+
view: any;
|
|
11
|
+
layouts: any[];
|
|
12
|
+
[k: string]: unknown;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type CreateViewControllerFn = (entry: ViewManifestEntry) => Promise<unknown>;
|
|
16
|
+
type CreateLayoutControllersFn = (entry: ViewManifestEntry) => Promise<Array<unknown>>;
|
|
17
|
+
type GetViewManifestEntryFn = (viewKey: string) => ViewManifestEntry | null;
|
|
18
|
+
type WoodBridgeLike = {
|
|
19
|
+
__window?: {
|
|
20
|
+
open?: (windowId: string, options?: Record<string, unknown>) => Promise<unknown>;
|
|
21
|
+
};
|
|
22
|
+
__navigate?: (windowId: string, route: string) => Promise<unknown>;
|
|
23
|
+
on?: (channel: string, callback: (...args: unknown[]) => void) => (() => void);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const WOOD_INTERNAL_BRIDGE_KEY = '__NOEGO_WOOD_BRIDGE__';
|
|
27
|
+
|
|
28
|
+
let {
|
|
29
|
+
manifest,
|
|
30
|
+
initialEntry,
|
|
31
|
+
initialController,
|
|
32
|
+
initialLayoutControllers,
|
|
33
|
+
createViewControllerFn,
|
|
34
|
+
createLayoutControllersFn,
|
|
35
|
+
getViewManifestEntryFn,
|
|
36
|
+
}: {
|
|
37
|
+
manifest: Record<string, ViewManifestEntry>;
|
|
38
|
+
initialEntry: ViewManifestEntry;
|
|
39
|
+
initialController: unknown;
|
|
40
|
+
initialLayoutControllers: Array<unknown>;
|
|
41
|
+
createViewControllerFn: CreateViewControllerFn;
|
|
42
|
+
createLayoutControllersFn: CreateLayoutControllersFn;
|
|
43
|
+
getViewManifestEntryFn: GetViewManifestEntryFn;
|
|
44
|
+
} = $props();
|
|
45
|
+
|
|
46
|
+
let activeEntry = $state(initialEntry);
|
|
47
|
+
let activeController = $state(initialController);
|
|
48
|
+
let activeLayoutControllers: Array<unknown> = $state(initialLayoutControllers);
|
|
49
|
+
let activeParams: Record<string, unknown> = $state({});
|
|
50
|
+
let activeQuery: Record<string, unknown> = $state({});
|
|
51
|
+
|
|
52
|
+
let activePage = $derived({
|
|
53
|
+
key: activeEntry.key,
|
|
54
|
+
windowName: activeEntry.windowName,
|
|
55
|
+
pageName: activeEntry.pageName,
|
|
56
|
+
params: activeParams,
|
|
57
|
+
query: activeQuery,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const navigation = getNavigation();
|
|
61
|
+
|
|
62
|
+
function getWoodBridge(): WoodBridgeLike | null {
|
|
63
|
+
if (typeof window === 'undefined') {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const bridge = (window as unknown as Record<string, unknown>)[WOOD_INTERNAL_BRIDGE_KEY];
|
|
67
|
+
if (!bridge || typeof bridge !== 'object') {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return bridge as WoodBridgeLike;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function navigateToAnotherWindow(entry: ViewManifestEntry): Promise<void> {
|
|
74
|
+
const bridge = getWoodBridge();
|
|
75
|
+
if (!bridge || !bridge.__window?.open || !bridge.__navigate) {
|
|
76
|
+
throw new Error(
|
|
77
|
+
'Wood bridge does not expose __window.open/__navigate. Regenerate preload with the latest @noego/wood.',
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
await bridge.__window.open(entry.windowName);
|
|
82
|
+
await bridge.__navigate(entry.windowName, entry.key);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function navigateWithinCurrentWindow(
|
|
86
|
+
viewKey: string,
|
|
87
|
+
params?: Record<string, unknown>,
|
|
88
|
+
options?: { replace?: boolean },
|
|
89
|
+
): Promise<void> {
|
|
90
|
+
const normalizedViewKey = viewKey.replace(',', '.');
|
|
91
|
+
const entry = getViewManifestEntryFn(normalizedViewKey);
|
|
92
|
+
if (!entry) {
|
|
93
|
+
throw new Error(`Unknown route "${normalizedViewKey}" in generated view manifest.`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (entry.windowName !== activeEntry.windowName) {
|
|
97
|
+
await navigateToAnotherWindow(entry);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const p = (params ?? {}) as Record<string, string>;
|
|
102
|
+
if (options?.replace) {
|
|
103
|
+
navigation.replace(normalizedViewKey, p);
|
|
104
|
+
} else {
|
|
105
|
+
navigation.go(normalizedViewKey, p);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
setContext('wood:navigate', (
|
|
110
|
+
viewKey: string,
|
|
111
|
+
params?: Record<string, unknown>,
|
|
112
|
+
options?: { replace?: boolean },
|
|
113
|
+
) => {
|
|
114
|
+
void navigateWithinCurrentWindow(viewKey, params, options).catch((error) => {
|
|
115
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
116
|
+
console.error(`[wood] navigation failed: ${message}`);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
function parseRoutePayload(payload: unknown): string | null {
|
|
121
|
+
if (typeof payload === 'string') {
|
|
122
|
+
return payload;
|
|
123
|
+
}
|
|
124
|
+
if (payload && typeof payload === 'object') {
|
|
125
|
+
const route = (payload as Record<string, unknown>).route;
|
|
126
|
+
if (typeof route === 'string') {
|
|
127
|
+
return route;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
let initialFire = true;
|
|
134
|
+
|
|
135
|
+
const unsubscribe = navigation.subscribe(async (navEntry) => {
|
|
136
|
+
if (initialFire) {
|
|
137
|
+
initialFire = false;
|
|
138
|
+
if (navEntry) {
|
|
139
|
+
activeParams = { ...navEntry.params };
|
|
140
|
+
activeQuery = { ...navEntry.query };
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (!navEntry) return;
|
|
146
|
+
|
|
147
|
+
const newKey = navEntry.page;
|
|
148
|
+
const entry = getViewManifestEntryFn(newKey);
|
|
149
|
+
if (!entry) return;
|
|
150
|
+
|
|
151
|
+
if (newKey === activeEntry.key) {
|
|
152
|
+
activeParams = { ...navEntry.params };
|
|
153
|
+
activeQuery = { ...navEntry.query };
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const [controller, layoutControllers] = await Promise.all([
|
|
158
|
+
createViewControllerFn(entry),
|
|
159
|
+
createLayoutControllersFn(entry),
|
|
160
|
+
]);
|
|
161
|
+
|
|
162
|
+
activeEntry = entry;
|
|
163
|
+
activeController = controller;
|
|
164
|
+
activeLayoutControllers = layoutControllers;
|
|
165
|
+
activeParams = { ...navEntry.params };
|
|
166
|
+
activeQuery = { ...navEntry.query };
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const bridge = getWoodBridge();
|
|
170
|
+
const unsubscribeWindowNavigate = bridge?.on?.('__navigate', (payload: unknown) => {
|
|
171
|
+
const route = parseRoutePayload(payload);
|
|
172
|
+
if (!route) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const entry = getViewManifestEntryFn(route);
|
|
177
|
+
if (!entry) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (entry.windowName !== activeEntry.windowName) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
navigation.replace(route, {}, {});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
onDestroy(() => {
|
|
189
|
+
unsubscribe();
|
|
190
|
+
unsubscribeWindowNavigate?.();
|
|
191
|
+
});
|
|
192
|
+
</script>
|
|
193
|
+
|
|
194
|
+
{#key activeEntry.key}
|
|
195
|
+
<WoodRecursiveRender
|
|
196
|
+
layouts={activeEntry.layouts}
|
|
197
|
+
layoutControllers={activeLayoutControllers}
|
|
198
|
+
view={activeEntry.view}
|
|
199
|
+
controller={activeController}
|
|
200
|
+
params={activeParams}
|
|
201
|
+
query={activeQuery}
|
|
202
|
+
page={activePage}
|
|
203
|
+
/>
|
|
204
|
+
{/key}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { PageController } from '../client/controller_contract';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
layouts = [],
|
|
6
|
+
layoutControllers = [],
|
|
7
|
+
view = null,
|
|
8
|
+
controller = undefined,
|
|
9
|
+
params = {},
|
|
10
|
+
query = {},
|
|
11
|
+
page = {},
|
|
12
|
+
} = $props<{
|
|
13
|
+
layouts?: any[];
|
|
14
|
+
layoutControllers?: Array<PageController<any, any, any> | undefined>;
|
|
15
|
+
view?: any;
|
|
16
|
+
controller?: PageController<any, any, any>;
|
|
17
|
+
params?: Record<string, unknown>;
|
|
18
|
+
query?: Record<string, unknown>;
|
|
19
|
+
page?: Record<string, unknown>;
|
|
20
|
+
}>();
|
|
21
|
+
|
|
22
|
+
let topLayout = $derived(layouts[0]);
|
|
23
|
+
let childLayouts = $derived(layouts.slice(1));
|
|
24
|
+
let topLayoutController = $derived(layoutControllers[0]);
|
|
25
|
+
let childLayoutControllers = $derived(layoutControllers.slice(1));
|
|
26
|
+
let ViewComponent = $derived(view);
|
|
27
|
+
|
|
28
|
+
let topState = $derived(topLayoutController?.state);
|
|
29
|
+
let topInput = $derived(topLayoutController?.input);
|
|
30
|
+
let topEvents = $derived(topLayoutController?.events);
|
|
31
|
+
|
|
32
|
+
let viewState = $derived(controller?.state);
|
|
33
|
+
let viewInput = $derived(controller?.input);
|
|
34
|
+
let viewEvents = $derived(controller?.events);
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
{#if childLayouts.length > 0}
|
|
38
|
+
{#snippet nestedChild()}
|
|
39
|
+
<svelte:self
|
|
40
|
+
layouts={childLayouts}
|
|
41
|
+
layoutControllers={childLayoutControllers}
|
|
42
|
+
{view}
|
|
43
|
+
{controller}
|
|
44
|
+
{params}
|
|
45
|
+
{query}
|
|
46
|
+
{page}
|
|
47
|
+
/>
|
|
48
|
+
{/snippet}
|
|
49
|
+
<svelte:component
|
|
50
|
+
this={topLayout}
|
|
51
|
+
state={topState}
|
|
52
|
+
input={topInput}
|
|
53
|
+
events={topEvents}
|
|
54
|
+
{params}
|
|
55
|
+
{query}
|
|
56
|
+
{page}
|
|
57
|
+
children={nestedChild}
|
|
58
|
+
/>
|
|
59
|
+
{:else if topLayout}
|
|
60
|
+
{#snippet viewChild()}
|
|
61
|
+
<svelte:component
|
|
62
|
+
this={ViewComponent}
|
|
63
|
+
state={viewState}
|
|
64
|
+
input={viewInput}
|
|
65
|
+
events={viewEvents}
|
|
66
|
+
{params}
|
|
67
|
+
{query}
|
|
68
|
+
{page}
|
|
69
|
+
/>
|
|
70
|
+
{/snippet}
|
|
71
|
+
<svelte:component
|
|
72
|
+
this={topLayout}
|
|
73
|
+
state={topState}
|
|
74
|
+
input={topInput}
|
|
75
|
+
events={topEvents}
|
|
76
|
+
{params}
|
|
77
|
+
{query}
|
|
78
|
+
{page}
|
|
79
|
+
children={viewChild}
|
|
80
|
+
/>
|
|
81
|
+
{:else}
|
|
82
|
+
<svelte:component
|
|
83
|
+
this={ViewComponent}
|
|
84
|
+
state={viewState}
|
|
85
|
+
input={viewInput}
|
|
86
|
+
events={viewEvents}
|
|
87
|
+
{params}
|
|
88
|
+
{query}
|
|
89
|
+
{page}
|
|
90
|
+
/>
|
|
91
|
+
{/if}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte action + types for the `use:contextMenu` directive.
|
|
3
|
+
*
|
|
4
|
+
* Prevents the native contextmenu event, builds smart defaults when
|
|
5
|
+
* `defaults: true`, serializes items (storing callbacks in a module-level
|
|
6
|
+
* map), and calls the internal Wood bridge `__contextMenu.show()`.
|
|
7
|
+
*/
|
|
8
|
+
const WOOD_INTERNAL_BRIDGE_KEY = '__NOEGO_WOOD_BRIDGE__';
|
|
9
|
+
|
|
10
|
+
type InternalWoodBridge = {
|
|
11
|
+
__contextMenu: {
|
|
12
|
+
show(data: { items: unknown[]; position: { x: number; y: number } }): Promise<void>;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// ── Types ────────────────────────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
/** Individual menu entry. */
|
|
19
|
+
export type ContextMenuEntry =
|
|
20
|
+
| { label: string; action: string; data?: string; disabled?: boolean }
|
|
21
|
+
| { label: string; action: () => void; disabled?: boolean }
|
|
22
|
+
| { type: 'separator' };
|
|
23
|
+
|
|
24
|
+
/** What the developer passes to `use:contextMenu`. */
|
|
25
|
+
/** Overrides applied to default items by action key. */
|
|
26
|
+
export type ContextMenuOverride = { label?: string; disabled?: boolean };
|
|
27
|
+
|
|
28
|
+
export type ContextMenuParam =
|
|
29
|
+
| ContextMenuEntry[]
|
|
30
|
+
| {
|
|
31
|
+
defaults?: boolean;
|
|
32
|
+
remove?: string[];
|
|
33
|
+
overrides?: Record<string, ContextMenuOverride>;
|
|
34
|
+
items?: ContextMenuEntry[];
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** Resolved item shape passed to the `menu` snippet. */
|
|
38
|
+
export interface ResolvedMenuItem {
|
|
39
|
+
label: string;
|
|
40
|
+
disabled: boolean;
|
|
41
|
+
type?: 'separator';
|
|
42
|
+
execute: () => void;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ── Callback map ─────────────────────────────────────────────────────
|
|
46
|
+
|
|
47
|
+
const callbacks = new Map<string, () => void>();
|
|
48
|
+
let idCounter = 0;
|
|
49
|
+
|
|
50
|
+
function nextId(): string {
|
|
51
|
+
return `__cb_${++idCounter}_${Math.random().toString(36).slice(2, 8)}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Execute a stored callback by its ID and remove it from the map.
|
|
56
|
+
* Called from `ContextMenuProvider` when it receives `__contextMenu:callback`.
|
|
57
|
+
*/
|
|
58
|
+
export function executeCallback(id: string): void {
|
|
59
|
+
const fn = callbacks.get(id);
|
|
60
|
+
if (fn) {
|
|
61
|
+
callbacks.delete(id);
|
|
62
|
+
fn();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ── Smart defaults ───────────────────────────────────────────────────
|
|
67
|
+
|
|
68
|
+
function buildDefaults(e: MouseEvent): ContextMenuEntry[] {
|
|
69
|
+
const target = e.target as HTMLElement;
|
|
70
|
+
const selection = document.getSelection()?.toString();
|
|
71
|
+
const isEditable =
|
|
72
|
+
target instanceof HTMLInputElement ||
|
|
73
|
+
target instanceof HTMLTextAreaElement ||
|
|
74
|
+
target.isContentEditable;
|
|
75
|
+
const linkEl = target.closest('a[href]') as HTMLAnchorElement | null;
|
|
76
|
+
const items: ContextMenuEntry[] = [];
|
|
77
|
+
|
|
78
|
+
if (isEditable) {
|
|
79
|
+
items.push(
|
|
80
|
+
{ label: 'Cut', action: 'cut' },
|
|
81
|
+
{ label: 'Copy', action: 'copy' },
|
|
82
|
+
{ label: 'Paste', action: 'paste' },
|
|
83
|
+
{ label: 'Select All', action: 'selectAll' },
|
|
84
|
+
);
|
|
85
|
+
} else if (selection) {
|
|
86
|
+
items.push({ label: 'Copy', action: 'copy' });
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (linkEl) {
|
|
90
|
+
if (items.length) items.push({ type: 'separator' });
|
|
91
|
+
items.push(
|
|
92
|
+
{ label: 'Open Link', action: 'openExternal', data: linkEl.getAttribute('href')! },
|
|
93
|
+
{ label: 'Copy Link Address', action: 'copyText', data: linkEl.getAttribute('href')! },
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return items;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// ── Serialization ────────────────────────────────────────────────────
|
|
101
|
+
|
|
102
|
+
interface SerializedItem {
|
|
103
|
+
id: string;
|
|
104
|
+
label?: string;
|
|
105
|
+
action?: string;
|
|
106
|
+
data?: string;
|
|
107
|
+
_callbackId?: string;
|
|
108
|
+
disabled?: boolean;
|
|
109
|
+
type?: 'separator';
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function serializeItems(entries: ContextMenuEntry[]): SerializedItem[] {
|
|
113
|
+
return entries.map((entry, i) => {
|
|
114
|
+
if ('type' in entry && entry.type === 'separator') {
|
|
115
|
+
return { id: `sep_${i}`, type: 'separator' as const };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const e = entry as Exclude<ContextMenuEntry, { type: 'separator' }>;
|
|
119
|
+
|
|
120
|
+
if (typeof e.action === 'function') {
|
|
121
|
+
const cbId = nextId();
|
|
122
|
+
callbacks.set(cbId, e.action);
|
|
123
|
+
return {
|
|
124
|
+
id: cbId,
|
|
125
|
+
label: e.label,
|
|
126
|
+
_callbackId: cbId,
|
|
127
|
+
disabled: e.disabled,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
id: `${e.action}_${i}`,
|
|
133
|
+
label: e.label,
|
|
134
|
+
action: e.action,
|
|
135
|
+
data: (e as { data?: string }).data,
|
|
136
|
+
disabled: e.disabled,
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ── Svelte action ────────────────────────────────────────────────────
|
|
142
|
+
|
|
143
|
+
export function contextMenu(node: HTMLElement, param: ContextMenuParam) {
|
|
144
|
+
let currentParam = param;
|
|
145
|
+
|
|
146
|
+
function getBridge(): InternalWoodBridge {
|
|
147
|
+
const bridge = (window as unknown as Record<string, unknown>)[WOOD_INTERNAL_BRIDGE_KEY];
|
|
148
|
+
if (!bridge || typeof bridge !== 'object') {
|
|
149
|
+
throw new Error(`Wood bridge "${WOOD_INTERNAL_BRIDGE_KEY}" not found.`);
|
|
150
|
+
}
|
|
151
|
+
return bridge as InternalWoodBridge;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function handler(e: MouseEvent) {
|
|
155
|
+
e.preventDefault();
|
|
156
|
+
|
|
157
|
+
let entries: ContextMenuEntry[];
|
|
158
|
+
|
|
159
|
+
if (Array.isArray(currentParam)) {
|
|
160
|
+
entries = currentParam;
|
|
161
|
+
} else {
|
|
162
|
+
const cfg = currentParam;
|
|
163
|
+
let defaults: ContextMenuEntry[] = [];
|
|
164
|
+
|
|
165
|
+
if (cfg.defaults) {
|
|
166
|
+
defaults = buildDefaults(e);
|
|
167
|
+
|
|
168
|
+
// Apply remove
|
|
169
|
+
if (cfg.remove) {
|
|
170
|
+
const removeSet = new Set(cfg.remove);
|
|
171
|
+
defaults = defaults.filter(item => {
|
|
172
|
+
if ('type' in item && item.type === 'separator') return true;
|
|
173
|
+
const actionKey = typeof (item as any).action === 'string' ? (item as any).action : '';
|
|
174
|
+
return !removeSet.has(actionKey);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Apply overrides
|
|
179
|
+
if (cfg.overrides) {
|
|
180
|
+
defaults = defaults.map((item): ContextMenuEntry => {
|
|
181
|
+
if ('type' in item && item.type === 'separator') return item;
|
|
182
|
+
const entry = item as { label: string; action: string; data?: string; disabled?: boolean };
|
|
183
|
+
const override = cfg.overrides![entry.action];
|
|
184
|
+
if (override) {
|
|
185
|
+
return {
|
|
186
|
+
...entry,
|
|
187
|
+
...(override.label !== undefined && { label: override.label }),
|
|
188
|
+
...(override.disabled !== undefined && { disabled: override.disabled }),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
return item;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Append custom items (with separator if both exist)
|
|
197
|
+
if (cfg.items && cfg.items.length > 0) {
|
|
198
|
+
if (defaults.length > 0) {
|
|
199
|
+
entries = [...defaults, { type: 'separator' }, ...cfg.items];
|
|
200
|
+
} else {
|
|
201
|
+
entries = cfg.items;
|
|
202
|
+
}
|
|
203
|
+
} else {
|
|
204
|
+
entries = defaults;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (entries.length === 0) return;
|
|
209
|
+
|
|
210
|
+
const serialized = serializeItems(entries);
|
|
211
|
+
|
|
212
|
+
getBridge().__contextMenu.show({
|
|
213
|
+
items: serialized,
|
|
214
|
+
position: { x: e.clientX, y: e.clientY },
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
node.addEventListener('contextmenu', handler);
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
update(newParam: ContextMenuParam) {
|
|
222
|
+
currentParam = newParam;
|
|
223
|
+
},
|
|
224
|
+
destroy() {
|
|
225
|
+
node.removeEventListener('contextmenu', handler);
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Component, Snippet } from 'svelte';
|
|
2
|
+
import type { ContextMenuEntry, ContextMenuParam, ResolvedMenuItem } from './contextMenu.js';
|
|
3
|
+
|
|
4
|
+
export type { ContextMenuEntry, ContextMenuParam, ResolvedMenuItem };
|
|
5
|
+
|
|
6
|
+
export declare const ContextMenuProvider: Component<{
|
|
7
|
+
menu?: Snippet<[{ items: ResolvedMenuItem[]; close: () => void }]>;
|
|
8
|
+
children: Snippet;
|
|
9
|
+
}>;
|
|
10
|
+
|
|
11
|
+
export declare function contextMenu(
|
|
12
|
+
node: HTMLElement,
|
|
13
|
+
param: ContextMenuParam,
|
|
14
|
+
): { update(param: ContextMenuParam): void; destroy(): void };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
// SSR-only recursive layout renderer for stick (wood's visual preview CLI).
|
|
3
|
+
// Simplified version of Forge's RecursiveRender — no stores, navigation, or error boundaries.
|
|
4
|
+
let {
|
|
5
|
+
layouts = [],
|
|
6
|
+
view = null,
|
|
7
|
+
data = { layout: [], view: {} },
|
|
8
|
+
wood = undefined,
|
|
9
|
+
} = $props<{
|
|
10
|
+
layouts?: any[];
|
|
11
|
+
view?: any;
|
|
12
|
+
data?: { layout?: any[]; view?: any };
|
|
13
|
+
wood?: any;
|
|
14
|
+
}>();
|
|
15
|
+
|
|
16
|
+
let topLayout = $derived(layouts[0]);
|
|
17
|
+
let childLayouts = $derived(layouts.slice(1));
|
|
18
|
+
let topData = $derived((data.layout || [])[0]);
|
|
19
|
+
let otherData = $derived((data.layout || []).slice(1));
|
|
20
|
+
let viewData = $derived(data.view);
|
|
21
|
+
let recursiveChildData = $derived({
|
|
22
|
+
layout: otherData,
|
|
23
|
+
view: data.view,
|
|
24
|
+
});
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
{#if childLayouts.length > 0}
|
|
28
|
+
{#snippet nested_child()}
|
|
29
|
+
<svelte:self
|
|
30
|
+
layouts={childLayouts}
|
|
31
|
+
view={view}
|
|
32
|
+
data={recursiveChildData}
|
|
33
|
+
{wood}
|
|
34
|
+
/>
|
|
35
|
+
{/snippet}
|
|
36
|
+
<svelte:component
|
|
37
|
+
this={topLayout}
|
|
38
|
+
{...(topData || {})}
|
|
39
|
+
state={topData?.controller?.state}
|
|
40
|
+
input={topData?.controller?.input}
|
|
41
|
+
events={topData?.controller?.events}
|
|
42
|
+
{wood}
|
|
43
|
+
children={nested_child}
|
|
44
|
+
/>
|
|
45
|
+
{:else if topLayout}
|
|
46
|
+
{#snippet view_child()}
|
|
47
|
+
<svelte:component
|
|
48
|
+
this={view}
|
|
49
|
+
{...(viewData || {})}
|
|
50
|
+
state={viewData?.controller?.state}
|
|
51
|
+
input={viewData?.controller?.input}
|
|
52
|
+
events={viewData?.controller?.events}
|
|
53
|
+
{wood}
|
|
54
|
+
/>
|
|
55
|
+
{/snippet}
|
|
56
|
+
<svelte:component
|
|
57
|
+
this={topLayout}
|
|
58
|
+
{...(topData || {})}
|
|
59
|
+
state={topData?.controller?.state}
|
|
60
|
+
input={topData?.controller?.input}
|
|
61
|
+
events={topData?.controller?.events}
|
|
62
|
+
{wood}
|
|
63
|
+
children={view_child}
|
|
64
|
+
/>
|
|
65
|
+
{:else}
|
|
66
|
+
<svelte:component
|
|
67
|
+
this={view}
|
|
68
|
+
{...(viewData || {})}
|
|
69
|
+
state={viewData?.controller?.state}
|
|
70
|
+
input={viewData?.controller?.input}
|
|
71
|
+
events={viewData?.controller?.events}
|
|
72
|
+
{wood}
|
|
73
|
+
/>
|
|
74
|
+
{/if}
|