@pwfabric/runtime 0.0.0-stage → 1.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +90 -0
- package/README.md +13 -2
- package/dist/__tests__/dom-test-setup.d.ts +21 -0
- package/dist/__tests__/dom-test-setup.d.ts.map +1 -0
- package/dist/__tests__/dom-test-setup.js +36 -0
- package/dist/__tests__/dom-test-setup.js.map +1 -0
- package/dist/a11y/announcer.d.ts +66 -0
- package/dist/a11y/announcer.d.ts.map +1 -0
- package/dist/a11y/announcer.js +140 -0
- package/dist/a11y/announcer.js.map +1 -0
- package/dist/a11y/contrast.d.ts +55 -0
- package/dist/a11y/contrast.d.ts.map +1 -0
- package/dist/a11y/contrast.js +93 -0
- package/dist/a11y/contrast.js.map +1 -0
- package/dist/a11y/focus.d.ts +124 -0
- package/dist/a11y/focus.d.ts.map +1 -0
- package/dist/a11y/focus.js +282 -0
- package/dist/a11y/focus.js.map +1 -0
- package/dist/a11y/index.d.ts +22 -0
- package/dist/a11y/index.d.ts.map +1 -0
- package/dist/a11y/index.js +18 -0
- package/dist/a11y/index.js.map +1 -0
- package/dist/a11y/keyboard.d.ts +145 -0
- package/dist/a11y/keyboard.d.ts.map +1 -0
- package/dist/a11y/keyboard.js +317 -0
- package/dist/a11y/keyboard.js.map +1 -0
- package/dist/adapters/default-image.d.ts +26 -0
- package/dist/adapters/default-image.d.ts.map +1 -0
- package/dist/adapters/default-image.js +37 -0
- package/dist/adapters/default-image.js.map +1 -0
- package/dist/adapters/index.d.ts +28 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +28 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/next-image.d.ts +39 -0
- package/dist/adapters/next-image.d.ts.map +1 -0
- package/dist/adapters/next-image.js +124 -0
- package/dist/adapters/next-image.js.map +1 -0
- package/dist/adapters/types.d.ts +62 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +11 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/analytics/index.d.ts +15 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +15 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/tracker.d.ts +66 -0
- package/dist/analytics/tracker.d.ts.map +1 -0
- package/dist/analytics/tracker.js +251 -0
- package/dist/analytics/tracker.js.map +1 -0
- package/dist/analytics/types.d.ts +131 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +11 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/auth/index.d.ts +16 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +14 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/provider.d.ts +133 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +473 -0
- package/dist/auth/provider.js.map +1 -0
- package/dist/auth/types.d.ts +118 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +9 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/binding/collection.d.ts +191 -0
- package/dist/binding/collection.d.ts.map +1 -0
- package/dist/binding/collection.js +358 -0
- package/dist/binding/collection.js.map +1 -0
- package/dist/binding/datasource.d.ts +320 -0
- package/dist/binding/datasource.d.ts.map +1 -0
- package/dist/binding/datasource.js +556 -0
- package/dist/binding/datasource.js.map +1 -0
- package/dist/binding/engine.d.ts +66 -0
- package/dist/binding/engine.d.ts.map +1 -0
- package/dist/binding/engine.js +268 -0
- package/dist/binding/engine.js.map +1 -0
- package/dist/binding/expression.d.ts +151 -0
- package/dist/binding/expression.d.ts.map +1 -0
- package/dist/binding/expression.js +787 -0
- package/dist/binding/expression.js.map +1 -0
- package/dist/binding/index.d.ts +20 -0
- package/dist/binding/index.d.ts.map +1 -0
- package/dist/binding/index.js +14 -0
- package/dist/binding/index.js.map +1 -0
- package/dist/binding/two-way.d.ts +150 -0
- package/dist/binding/two-way.d.ts.map +1 -0
- package/dist/binding/two-way.js +462 -0
- package/dist/binding/two-way.js.map +1 -0
- package/dist/binding/types.d.ts +120 -0
- package/dist/binding/types.d.ts.map +1 -0
- package/dist/binding/types.js +9 -0
- package/dist/binding/types.js.map +1 -0
- package/dist/blocks/__test-fixtures__/block-fixtures.d.ts +40 -0
- package/dist/blocks/__test-fixtures__/block-fixtures.d.ts.map +1 -0
- package/dist/blocks/__test-fixtures__/block-fixtures.js +506 -0
- package/dist/blocks/__test-fixtures__/block-fixtures.js.map +1 -0
- package/dist/blocks/component-types.d.ts +82 -0
- package/dist/blocks/component-types.d.ts.map +1 -0
- package/dist/blocks/component-types.js +11 -0
- package/dist/blocks/component-types.js.map +1 -0
- package/dist/blocks/composition-rules.d.ts +169 -0
- package/dist/blocks/composition-rules.d.ts.map +1 -0
- package/dist/blocks/composition-rules.js +391 -0
- package/dist/blocks/composition-rules.js.map +1 -0
- package/dist/blocks/hooks.d.ts +32 -0
- package/dist/blocks/hooks.d.ts.map +1 -0
- package/dist/blocks/hooks.js +42 -0
- package/dist/blocks/hooks.js.map +1 -0
- package/dist/blocks/index.d.ts +16 -0
- package/dist/blocks/index.d.ts.map +1 -0
- package/dist/blocks/index.js +24 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/blocks/registry.d.ts +85 -0
- package/dist/blocks/registry.d.ts.map +1 -0
- package/dist/blocks/registry.js +136 -0
- package/dist/blocks/registry.js.map +1 -0
- package/dist/blocks/rule-engine.d.ts +132 -0
- package/dist/blocks/rule-engine.d.ts.map +1 -0
- package/dist/blocks/rule-engine.js +321 -0
- package/dist/blocks/rule-engine.js.map +1 -0
- package/dist/blocks/surface-event-context.d.ts +14 -0
- package/dist/blocks/surface-event-context.d.ts.map +1 -0
- package/dist/blocks/surface-event-context.js +14 -0
- package/dist/blocks/surface-event-context.js.map +1 -0
- package/dist/blocks/surface-id-context.d.ts +14 -0
- package/dist/blocks/surface-id-context.d.ts.map +1 -0
- package/dist/blocks/surface-id-context.js +15 -0
- package/dist/blocks/surface-id-context.js.map +1 -0
- package/dist/bus.d.ts +42 -0
- package/dist/bus.d.ts.map +1 -0
- package/dist/bus.js +158 -0
- package/dist/bus.js.map +1 -0
- package/dist/cache/index.d.ts +10 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +10 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory.d.ts +33 -0
- package/dist/cache/memory.d.ts.map +1 -0
- package/dist/cache/memory.js +138 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/types.d.ts +63 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +9 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/capability/index.d.ts +73 -0
- package/dist/capability/index.d.ts.map +1 -0
- package/dist/capability/index.js +87 -0
- package/dist/capability/index.js.map +1 -0
- package/dist/capability/kernel-capabilities.d.ts +32 -0
- package/dist/capability/kernel-capabilities.d.ts.map +1 -0
- package/dist/capability/kernel-capabilities.js +36 -0
- package/dist/capability/kernel-capabilities.js.map +1 -0
- package/dist/capability/platform-capabilities.d.ts +72 -0
- package/dist/capability/platform-capabilities.d.ts.map +1 -0
- package/dist/capability/platform-capabilities.js +267 -0
- package/dist/capability/platform-capabilities.js.map +1 -0
- package/dist/capability/type-mapping.d.ts +71 -0
- package/dist/capability/type-mapping.d.ts.map +1 -0
- package/dist/capability/type-mapping.js +107 -0
- package/dist/capability/type-mapping.js.map +1 -0
- package/dist/capability/validation.d.ts +47 -0
- package/dist/capability/validation.d.ts.map +1 -0
- package/dist/capability/validation.js +54 -0
- package/dist/capability/validation.js.map +1 -0
- package/dist/connectors/declared-connector.d.ts +49 -0
- package/dist/connectors/declared-connector.d.ts.map +1 -0
- package/dist/connectors/declared-connector.js +333 -0
- package/dist/connectors/declared-connector.js.map +1 -0
- package/dist/connectors/engine-registry.d.ts +51 -0
- package/dist/connectors/engine-registry.d.ts.map +1 -0
- package/dist/connectors/engine-registry.js +135 -0
- package/dist/connectors/engine-registry.js.map +1 -0
- package/dist/connectors/index.d.ts +15 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +14 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/module-loader.d.ts +71 -0
- package/dist/connectors/module-loader.d.ts.map +1 -0
- package/dist/connectors/module-loader.js +143 -0
- package/dist/connectors/module-loader.js.map +1 -0
- package/dist/connectors/types.d.ts +175 -0
- package/dist/connectors/types.d.ts.map +1 -0
- package/dist/connectors/types.js +23 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/context.d.ts +28 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +38 -0
- package/dist/context.js.map +1 -0
- package/dist/data/DataCapabilityProvider.d.ts +40 -0
- package/dist/data/DataCapabilityProvider.d.ts.map +1 -0
- package/dist/data/DataCapabilityProvider.js +58 -0
- package/dist/data/DataCapabilityProvider.js.map +1 -0
- package/dist/data/index.d.ts +18 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +18 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/manager.d.ts +41 -0
- package/dist/data/manager.d.ts.map +1 -0
- package/dist/data/manager.js +442 -0
- package/dist/data/manager.js.map +1 -0
- package/dist/data/types.d.ts +219 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/data/types.js +2 -0
- package/dist/data/types.js.map +1 -0
- package/dist/entity/aggregate.d.ts +9 -0
- package/dist/entity/aggregate.d.ts.map +1 -0
- package/dist/entity/aggregate.js +24 -0
- package/dist/entity/aggregate.js.map +1 -0
- package/dist/entity/apply-query.d.ts +59 -0
- package/dist/entity/apply-query.d.ts.map +1 -0
- package/dist/entity/apply-query.js +264 -0
- package/dist/entity/apply-query.js.map +1 -0
- package/dist/entity/behavior.d.ts +95 -0
- package/dist/entity/behavior.d.ts.map +1 -0
- package/dist/entity/behavior.js +78 -0
- package/dist/entity/behavior.js.map +1 -0
- package/dist/entity/connector.d.ts +142 -0
- package/dist/entity/connector.d.ts.map +1 -0
- package/dist/entity/connector.js +89 -0
- package/dist/entity/connector.js.map +1 -0
- package/dist/entity/connectors/index.d.ts +13 -0
- package/dist/entity/connectors/index.d.ts.map +1 -0
- package/dist/entity/connectors/index.js +11 -0
- package/dist/entity/connectors/index.js.map +1 -0
- package/dist/entity/connectors/static.d.ts +52 -0
- package/dist/entity/connectors/static.d.ts.map +1 -0
- package/dist/entity/connectors/static.js +245 -0
- package/dist/entity/connectors/static.js.map +1 -0
- package/dist/entity/entity-datasource.d.ts +51 -0
- package/dist/entity/entity-datasource.d.ts.map +1 -0
- package/dist/entity/entity-datasource.js +33 -0
- package/dist/entity/entity-datasource.js.map +1 -0
- package/dist/entity/facade.d.ts +71 -0
- package/dist/entity/facade.d.ts.map +1 -0
- package/dist/entity/facade.js +70 -0
- package/dist/entity/facade.js.map +1 -0
- package/dist/entity/http-connector.d.ts +124 -0
- package/dist/entity/http-connector.d.ts.map +1 -0
- package/dist/entity/http-connector.js +295 -0
- package/dist/entity/http-connector.js.map +1 -0
- package/dist/entity/index.d.ts +39 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/index.js +31 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/postgres-connector.d.ts +65 -0
- package/dist/entity/postgres-connector.d.ts.map +1 -0
- package/dist/entity/postgres-connector.js +239 -0
- package/dist/entity/postgres-connector.js.map +1 -0
- package/dist/entity/registry.d.ts +60 -0
- package/dist/entity/registry.d.ts.map +1 -0
- package/dist/entity/registry.js +90 -0
- package/dist/entity/registry.js.map +1 -0
- package/dist/entity/store.d.ts +67 -0
- package/dist/entity/store.d.ts.map +1 -0
- package/dist/entity/store.js +349 -0
- package/dist/entity/store.js.map +1 -0
- package/dist/entity/types.d.ts +181 -0
- package/dist/entity/types.d.ts.map +1 -0
- package/dist/entity/types.js +10 -0
- package/dist/entity/types.js.map +1 -0
- package/dist/execution-context.d.ts +89 -0
- package/dist/execution-context.d.ts.map +1 -0
- package/dist/execution-context.js +146 -0
- package/dist/execution-context.js.map +1 -0
- package/dist/executor.d.ts +28 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +33 -0
- package/dist/executor.js.map +1 -0
- package/dist/forms/form-entity-bridge.d.ts +95 -0
- package/dist/forms/form-entity-bridge.d.ts.map +1 -0
- package/dist/forms/form-entity-bridge.js +96 -0
- package/dist/forms/form-entity-bridge.js.map +1 -0
- package/dist/forms/form-write-target.d.ts +35 -0
- package/dist/forms/form-write-target.d.ts.map +1 -0
- package/dist/forms/form-write-target.js +81 -0
- package/dist/forms/form-write-target.js.map +1 -0
- package/dist/forms/index.d.ts +23 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/index.js +25 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/named-control-values.d.ts +28 -0
- package/dist/forms/named-control-values.d.ts.map +1 -0
- package/dist/forms/named-control-values.js +42 -0
- package/dist/forms/named-control-values.js.map +1 -0
- package/dist/forms/processor.d.ts +56 -0
- package/dist/forms/processor.d.ts.map +1 -0
- package/dist/forms/processor.js +154 -0
- package/dist/forms/processor.js.map +1 -0
- package/dist/forms/types.d.ts +175 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/forms/types.js +33 -0
- package/dist/forms/types.js.map +1 -0
- package/dist/forms/validator.d.ts +62 -0
- package/dist/forms/validator.d.ts.map +1 -0
- package/dist/forms/validator.js +218 -0
- package/dist/forms/validator.js.map +1 -0
- package/dist/graph/index.d.ts +11 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +9 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/resolver.d.ts +67 -0
- package/dist/graph/resolver.d.ts.map +1 -0
- package/dist/graph/resolver.js +243 -0
- package/dist/graph/resolver.js.map +1 -0
- package/dist/graph/types.d.ts +126 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +9 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/hooks/useInstalledAtoms.d.ts +97 -0
- package/dist/hooks/useInstalledAtoms.d.ts.map +1 -0
- package/dist/hooks/useInstalledAtoms.js +92 -0
- package/dist/hooks/useInstalledAtoms.js.map +1 -0
- package/dist/i18n/index.d.ts +16 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +14 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/translator.d.ts +77 -0
- package/dist/i18n/translator.d.ts.map +1 -0
- package/dist/i18n/translator.js +357 -0
- package/dist/i18n/translator.js.map +1 -0
- package/dist/i18n/types.d.ts +94 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +9 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +48 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +258 -0
- package/dist/kernel.js.map +1 -0
- package/dist/perf/budget.d.ts +93 -0
- package/dist/perf/budget.d.ts.map +1 -0
- package/dist/perf/budget.js +122 -0
- package/dist/perf/budget.js.map +1 -0
- package/dist/perf/index.d.ts +17 -0
- package/dist/perf/index.d.ts.map +1 -0
- package/dist/perf/index.js +13 -0
- package/dist/perf/index.js.map +1 -0
- package/dist/perf/render-timer.d.ts +91 -0
- package/dist/perf/render-timer.d.ts.map +1 -0
- package/dist/perf/render-timer.js +136 -0
- package/dist/perf/render-timer.js.map +1 -0
- package/dist/perf/reporter.d.ts +127 -0
- package/dist/perf/reporter.d.ts.map +1 -0
- package/dist/perf/reporter.js +241 -0
- package/dist/perf/reporter.js.map +1 -0
- package/dist/perf/web-vitals.d.ts +112 -0
- package/dist/perf/web-vitals.d.ts.map +1 -0
- package/dist/perf/web-vitals.js +268 -0
- package/dist/perf/web-vitals.js.map +1 -0
- package/dist/registry.d.ts +64 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +126 -0
- package/dist/registry.js.map +1 -0
- package/dist/render/BehaviorSurfaceProvider.d.ts +66 -0
- package/dist/render/BehaviorSurfaceProvider.d.ts.map +1 -0
- package/dist/render/BehaviorSurfaceProvider.js +185 -0
- package/dist/render/BehaviorSurfaceProvider.js.map +1 -0
- package/dist/render/BlockErrorBoundary.d.ts +27 -0
- package/dist/render/BlockErrorBoundary.d.ts.map +1 -0
- package/dist/render/BlockErrorBoundary.js +41 -0
- package/dist/render/BlockErrorBoundary.js.map +1 -0
- package/dist/render/DataBoundSurfaceRenderer.d.ts +79 -0
- package/dist/render/DataBoundSurfaceRenderer.d.ts.map +1 -0
- package/dist/render/DataBoundSurfaceRenderer.js +998 -0
- package/dist/render/DataBoundSurfaceRenderer.js.map +1 -0
- package/dist/render/DynamicBlockWrapper.d.ts +24 -0
- package/dist/render/DynamicBlockWrapper.d.ts.map +1 -0
- package/dist/render/DynamicBlockWrapper.js +117 -0
- package/dist/render/DynamicBlockWrapper.js.map +1 -0
- package/dist/render/appearance-resolver.d.ts +51 -0
- package/dist/render/appearance-resolver.d.ts.map +1 -0
- package/dist/render/appearance-resolver.js +78 -0
- package/dist/render/appearance-resolver.js.map +1 -0
- package/dist/render/capability-gate.d.ts +70 -0
- package/dist/render/capability-gate.d.ts.map +1 -0
- package/dist/render/capability-gate.js +94 -0
- package/dist/render/capability-gate.js.map +1 -0
- package/dist/render/conditional-states-css.d.ts +42 -0
- package/dist/render/conditional-states-css.d.ts.map +1 -0
- package/dist/render/conditional-states-css.js +82 -0
- package/dist/render/conditional-states-css.js.map +1 -0
- package/dist/render/connections-context.d.ts +32 -0
- package/dist/render/connections-context.d.ts.map +1 -0
- package/dist/render/connections-context.js +34 -0
- package/dist/render/connections-context.js.map +1 -0
- package/dist/render/dark-theme-css.d.ts +37 -0
- package/dist/render/dark-theme-css.d.ts.map +1 -0
- package/dist/render/dark-theme-css.js +67 -0
- package/dist/render/dark-theme-css.js.map +1 -0
- package/dist/render/data-binding-types.d.ts +192 -0
- package/dist/render/data-binding-types.d.ts.map +1 -0
- package/dist/render/data-binding-types.js +11 -0
- package/dist/render/data-binding-types.js.map +1 -0
- package/dist/render/data-cache.d.ts +31 -0
- package/dist/render/data-cache.d.ts.map +1 -0
- package/dist/render/data-cache.js +37 -0
- package/dist/render/data-cache.js.map +1 -0
- package/dist/render/derive-dark-theme.d.ts +18 -0
- package/dist/render/derive-dark-theme.d.ts.map +1 -0
- package/dist/render/derive-dark-theme.js +18 -0
- package/dist/render/derive-dark-theme.js.map +1 -0
- package/dist/render/dynamic-artifact-context.d.ts +78 -0
- package/dist/render/dynamic-artifact-context.d.ts.map +1 -0
- package/dist/render/dynamic-artifact-context.js +89 -0
- package/dist/render/dynamic-artifact-context.js.map +1 -0
- package/dist/render/dynamic-block-loader.d.ts +81 -0
- package/dist/render/dynamic-block-loader.d.ts.map +1 -0
- package/dist/render/dynamic-block-loader.js +197 -0
- package/dist/render/dynamic-block-loader.js.map +1 -0
- package/dist/render/endpoint.d.ts +19 -0
- package/dist/render/endpoint.d.ts.map +1 -0
- package/dist/render/endpoint.js +109 -0
- package/dist/render/endpoint.js.map +1 -0
- package/dist/render/entity-facade-context.d.ts +35 -0
- package/dist/render/entity-facade-context.d.ts.map +1 -0
- package/dist/render/entity-facade-context.js +37 -0
- package/dist/render/entity-facade-context.js.map +1 -0
- package/dist/render/group-states-css.d.ts +42 -0
- package/dist/render/group-states-css.d.ts.map +1 -0
- package/dist/render/group-states-css.js +73 -0
- package/dist/render/group-states-css.js.map +1 -0
- package/dist/render/hooks/useSurfaceEvents.d.ts +9 -0
- package/dist/render/hooks/useSurfaceEvents.d.ts.map +1 -0
- package/dist/render/hooks/useSurfaceEvents.js +9 -0
- package/dist/render/hooks/useSurfaceEvents.js.map +1 -0
- package/dist/render/hooks/useSurfaceId.d.ts +9 -0
- package/dist/render/hooks/useSurfaceId.d.ts.map +1 -0
- package/dist/render/hooks/useSurfaceId.js +9 -0
- package/dist/render/hooks/useSurfaceId.js.map +1 -0
- package/dist/render/index.d.ts +49 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +61 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/interaction-rule-engine.d.ts +13 -0
- package/dist/render/interaction-rule-engine.d.ts.map +1 -0
- package/dist/render/interaction-rule-engine.js +47 -0
- package/dist/render/interaction-rule-engine.js.map +1 -0
- package/dist/render/keyframes-css.d.ts +32 -0
- package/dist/render/keyframes-css.d.ts.map +1 -0
- package/dist/render/keyframes-css.js +44 -0
- package/dist/render/keyframes-css.js.map +1 -0
- package/dist/render/query-state.d.ts +4 -0
- package/dist/render/query-state.d.ts.map +1 -0
- package/dist/render/query-state.js +70 -0
- package/dist/render/query-state.js.map +1 -0
- package/dist/render/renderer.d.ts +45 -0
- package/dist/render/renderer.d.ts.map +1 -0
- package/dist/render/renderer.js +937 -0
- package/dist/render/renderer.js.map +1 -0
- package/dist/render/resolve-expressions.d.ts +38 -0
- package/dist/render/resolve-expressions.d.ts.map +1 -0
- package/dist/render/resolve-expressions.js +309 -0
- package/dist/render/resolve-expressions.js.map +1 -0
- package/dist/render/responsive-style-css.d.ts +43 -0
- package/dist/render/responsive-style-css.d.ts.map +1 -0
- package/dist/render/responsive-style-css.js +123 -0
- package/dist/render/responsive-style-css.js.map +1 -0
- package/dist/render/responsive.d.ts +50 -0
- package/dist/render/responsive.d.ts.map +1 -0
- package/dist/render/responsive.js +99 -0
- package/dist/render/responsive.js.map +1 -0
- package/dist/render/scoped-css.d.ts +72 -0
- package/dist/render/scoped-css.d.ts.map +1 -0
- package/dist/render/scoped-css.js +102 -0
- package/dist/render/scoped-css.js.map +1 -0
- package/dist/render/shell-selection.d.ts +70 -0
- package/dist/render/shell-selection.d.ts.map +1 -0
- package/dist/render/shell-selection.js +117 -0
- package/dist/render/shell-selection.js.map +1 -0
- package/dist/render/states-css.d.ts +33 -0
- package/dist/render/states-css.d.ts.map +1 -0
- package/dist/render/states-css.js +63 -0
- package/dist/render/states-css.js.map +1 -0
- package/dist/render/surface-data-context.d.ts +19 -0
- package/dist/render/surface-data-context.d.ts.map +1 -0
- package/dist/render/surface-data-context.js +21 -0
- package/dist/render/surface-data-context.js.map +1 -0
- package/dist/render/surface-event-bus.d.ts +20 -0
- package/dist/render/surface-event-bus.d.ts.map +1 -0
- package/dist/render/surface-event-bus.js +68 -0
- package/dist/render/surface-event-bus.js.map +1 -0
- package/dist/render/surface-event-context.d.ts +12 -0
- package/dist/render/surface-event-context.d.ts.map +1 -0
- package/dist/render/surface-event-context.js +12 -0
- package/dist/render/surface-event-context.js.map +1 -0
- package/dist/render/surface-id-context.d.ts +9 -0
- package/dist/render/surface-id-context.d.ts.map +1 -0
- package/dist/render/surface-id-context.js +9 -0
- package/dist/render/surface-id-context.js.map +1 -0
- package/dist/render/theme-utils.d.ts +15 -0
- package/dist/render/theme-utils.d.ts.map +1 -0
- package/dist/render/theme-utils.js +15 -0
- package/dist/render/theme-utils.js.map +1 -0
- package/dist/render/types.d.ts +283 -0
- package/dist/render/types.d.ts.map +1 -0
- package/dist/render/types.js +9 -0
- package/dist/render/types.js.map +1 -0
- package/dist/render/visibility-css.d.ts +43 -0
- package/dist/render/visibility-css.d.ts.map +1 -0
- package/dist/render/visibility-css.js +119 -0
- package/dist/render/visibility-css.js.map +1 -0
- package/dist/render/width-scope.d.ts +35 -0
- package/dist/render/width-scope.d.ts.map +1 -0
- package/dist/render/width-scope.js +44 -0
- package/dist/render/width-scope.js.map +1 -0
- package/dist/render/write-only-sources.d.ts +34 -0
- package/dist/render/write-only-sources.d.ts.map +1 -0
- package/dist/render/write-only-sources.js +99 -0
- package/dist/render/write-only-sources.js.map +1 -0
- package/dist/routing/index.d.ts +15 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +15 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/router.d.ts +43 -0
- package/dist/routing/router.d.ts.map +1 -0
- package/dist/routing/router.js +218 -0
- package/dist/routing/router.js.map +1 -0
- package/dist/routing/types.d.ts +125 -0
- package/dist/routing/types.d.ts.map +1 -0
- package/dist/routing/types.js +9 -0
- package/dist/routing/types.js.map +1 -0
- package/dist/seo/generator.d.ts +40 -0
- package/dist/seo/generator.d.ts.map +1 -0
- package/dist/seo/generator.js +236 -0
- package/dist/seo/generator.js.map +1 -0
- package/dist/seo/index.d.ts +15 -0
- package/dist/seo/index.d.ts.map +1 -0
- package/dist/seo/index.js +15 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/types.d.ts +182 -0
- package/dist/seo/types.d.ts.map +1 -0
- package/dist/seo/types.js +9 -0
- package/dist/seo/types.js.map +1 -0
- package/dist/state/index.d.ts +16 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +16 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/manager.d.ts +34 -0
- package/dist/state/manager.d.ts.map +1 -0
- package/dist/state/manager.js +81 -0
- package/dist/state/manager.js.map +1 -0
- package/dist/state/store.d.ts +41 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +145 -0
- package/dist/state/store.js.map +1 -0
- package/dist/state/types.d.ts +108 -0
- package/dist/state/types.d.ts.map +1 -0
- package/dist/state/types.js +9 -0
- package/dist/state/types.js.map +1 -0
- package/dist/surface/expression.d.ts +66 -0
- package/dist/surface/expression.d.ts.map +1 -0
- package/dist/surface/expression.js +179 -0
- package/dist/surface/expression.js.map +1 -0
- package/dist/surface/index.d.ts +33 -0
- package/dist/surface/index.d.ts.map +1 -0
- package/dist/surface/index.js +25 -0
- package/dist/surface/index.js.map +1 -0
- package/dist/surface/interpreter.d.ts +97 -0
- package/dist/surface/interpreter.d.ts.map +1 -0
- package/dist/surface/interpreter.js +231 -0
- package/dist/surface/interpreter.js.map +1 -0
- package/dist/surface/layout.d.ts +55 -0
- package/dist/surface/layout.d.ts.map +1 -0
- package/dist/surface/layout.js +288 -0
- package/dist/surface/layout.js.map +1 -0
- package/dist/surface/output.d.ts +91 -0
- package/dist/surface/output.d.ts.map +1 -0
- package/dist/surface/output.js +104 -0
- package/dist/surface/output.js.map +1 -0
- package/dist/surface/primitives.d.ts +181 -0
- package/dist/surface/primitives.d.ts.map +1 -0
- package/dist/surface/primitives.js +339 -0
- package/dist/surface/primitives.js.map +1 -0
- package/dist/surface/renderer.d.ts +97 -0
- package/dist/surface/renderer.d.ts.map +1 -0
- package/dist/surface/renderer.js +190 -0
- package/dist/surface/renderer.js.map +1 -0
- package/dist/surface/schemas.d.ts +182 -0
- package/dist/surface/schemas.d.ts.map +1 -0
- package/dist/surface/schemas.js +142 -0
- package/dist/surface/schemas.js.map +1 -0
- package/dist/surface/transforms.d.ts +145 -0
- package/dist/surface/transforms.d.ts.map +1 -0
- package/dist/surface/transforms.js +120 -0
- package/dist/surface/transforms.js.map +1 -0
- package/dist/surface/types.d.ts +161 -0
- package/dist/surface/types.d.ts.map +1 -0
- package/dist/surface/types.js +51 -0
- package/dist/surface/types.js.map +1 -0
- package/dist/surface/validation.d.ts +124 -0
- package/dist/surface/validation.d.ts.map +1 -0
- package/dist/surface/validation.js +147 -0
- package/dist/surface/validation.js.map +1 -0
- package/dist/validator.d.ts +56 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +100 -0
- package/dist/validator.js.map +1 -0
- package/package.json +105 -3
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Artifact Context Provider
|
|
3
|
+
*
|
|
4
|
+
* Provides dynamic block and starter descriptor maps
|
|
5
|
+
* to the component tree. Populated from the host's render grants.
|
|
6
|
+
*
|
|
7
|
+
* @module @pwfabric/runtime/render/dynamic-artifact-context
|
|
8
|
+
*/
|
|
9
|
+
import { type ReactNode } from 'react';
|
|
10
|
+
import type { DynamicBlockDescriptor, DynamicStarterDescriptor } from '@pwfabric/contracts';
|
|
11
|
+
export interface DynamicArtifactContextValue {
|
|
12
|
+
readonly dynamicBlocks: ReadonlyMap<string, DynamicBlockDescriptor>;
|
|
13
|
+
readonly dynamicStarters: ReadonlyMap<string, DynamicStarterDescriptor>;
|
|
14
|
+
readonly isLoaded: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface DynamicArtifactProviderProps {
|
|
17
|
+
readonly dynamicBlocks?: readonly DynamicBlockDescriptor[];
|
|
18
|
+
readonly dynamicStarters?: readonly DynamicStarterDescriptor[];
|
|
19
|
+
/**
|
|
20
|
+
* Whether the dynamic descriptors have finished loading. Server-rendered
|
|
21
|
+
* consumers (a published page) pass fully-resolved descriptors
|
|
22
|
+
* synchronously and omit this — it defaults to `true`. Client-side editors
|
|
23
|
+
* load descriptors from the host's aggregate after mount, so they pass the
|
|
24
|
+
* live loading state; consumers can then tell "still loading" apart from
|
|
25
|
+
* "genuinely no descriptor" instead of flashing every block as unknown on
|
|
26
|
+
* first paint.
|
|
27
|
+
*/
|
|
28
|
+
readonly isLoaded?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* WARM THE WHOLE CATALOG ON MOUNT. Off by default, and that default is the
|
|
31
|
+
* point.
|
|
32
|
+
*
|
|
33
|
+
* This provider typically sits in the host app's root layout, so it is
|
|
34
|
+
* mounted on every route. Preloading from there downloads, hash-verifies and
|
|
35
|
+
* blob-imports every descriptor the host owns on pages that render none of
|
|
36
|
+
* them — dozens of bundles and tens of seconds of summed download on a page
|
|
37
|
+
* with no renderer at all.
|
|
38
|
+
*
|
|
39
|
+
* Rendering a block does not need this: `DynamicBlockWrapper` asks the
|
|
40
|
+
* loader for the descriptor it is about to draw, and the loader caches and
|
|
41
|
+
* de-dupes by block type. Turn it on only where a canvas is genuinely about
|
|
42
|
+
* to render arbitrary blocks and the round trip should already be in flight
|
|
43
|
+
* — a studio or an editor, never a layout.
|
|
44
|
+
*/
|
|
45
|
+
readonly preload?: boolean;
|
|
46
|
+
readonly children: ReactNode;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Warm the loader's cache for a whole catalog, fire-and-forget.
|
|
50
|
+
*
|
|
51
|
+
* The imperative half of the same opt-in: a canvas that knows it is about to
|
|
52
|
+
* render arbitrary blocks can start the downloads itself, without the provider
|
|
53
|
+
* having to guess from the fact that it was mounted. Caching and de-duplication
|
|
54
|
+
* stay entirely the loader's business — calling this twice costs one download.
|
|
55
|
+
*/
|
|
56
|
+
export declare function preloadDynamicBlocks(descriptors: readonly DynamicBlockDescriptor[] | undefined | null): void;
|
|
57
|
+
/**
|
|
58
|
+
* Provides dynamic block and starter descriptors to the component tree.
|
|
59
|
+
*
|
|
60
|
+
* Downloads nothing by itself: blocks load lazily as they are rendered. Pass
|
|
61
|
+
* `preload` to warm the whole catalog on mount.
|
|
62
|
+
*/
|
|
63
|
+
export declare function DynamicArtifactProvider({ dynamicBlocks, dynamicStarters, isLoaded, preload, children, }: DynamicArtifactProviderProps): ReactNode;
|
|
64
|
+
/**
|
|
65
|
+
* Access dynamic block descriptors.
|
|
66
|
+
*/
|
|
67
|
+
export declare function useDynamicBlocks(): {
|
|
68
|
+
readonly blocks: ReadonlyMap<string, DynamicBlockDescriptor>;
|
|
69
|
+
readonly isLoaded: boolean;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Access dynamic starter descriptors.
|
|
73
|
+
*/
|
|
74
|
+
export declare function useDynamicStarters(): {
|
|
75
|
+
readonly starters: ReadonlyMap<string, DynamicStarterDescriptor>;
|
|
76
|
+
readonly isLoaded: boolean;
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=dynamic-artifact-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-artifact-context.d.ts","sourceRoot":"","sources":["../../src/render/dynamic-artifact-context.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAiD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAO3F,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IACnE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;IACvE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAA;IAC1D,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAA;IAC9D;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;CAC7B;AAgBD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,SAAS,sBAAsB,EAAE,GAAG,SAAS,GAAG,IAAI,GAChE,IAAI,CAGN;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,aAAa,EACb,eAAe,EACf,QAAe,EACf,OAAe,EACf,QAAQ,GACT,EAAE,4BAA4B,GAAG,SAAS,CAiC1C;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI;IAClC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IAC5D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B,CAGA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;IAChE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B,CAGA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Dynamic Artifact Context Provider
|
|
4
|
+
*
|
|
5
|
+
* Provides dynamic block and starter descriptor maps
|
|
6
|
+
* to the component tree. Populated from the host's render grants.
|
|
7
|
+
*
|
|
8
|
+
* @module @pwfabric/runtime/render/dynamic-artifact-context
|
|
9
|
+
*/
|
|
10
|
+
import { createContext, useContext, useEffect, useMemo } from 'react';
|
|
11
|
+
import { BlockModuleLoader } from './dynamic-block-loader.js';
|
|
12
|
+
// ============================================================
|
|
13
|
+
// CONTEXT
|
|
14
|
+
// ============================================================
|
|
15
|
+
const DynamicArtifactContext = createContext({
|
|
16
|
+
dynamicBlocks: new Map(),
|
|
17
|
+
dynamicStarters: new Map(),
|
|
18
|
+
isLoaded: false,
|
|
19
|
+
});
|
|
20
|
+
// ============================================================
|
|
21
|
+
// PROVIDER
|
|
22
|
+
// ============================================================
|
|
23
|
+
/**
|
|
24
|
+
* Warm the loader's cache for a whole catalog, fire-and-forget.
|
|
25
|
+
*
|
|
26
|
+
* The imperative half of the same opt-in: a canvas that knows it is about to
|
|
27
|
+
* render arbitrary blocks can start the downloads itself, without the provider
|
|
28
|
+
* having to guess from the fact that it was mounted. Caching and de-duplication
|
|
29
|
+
* stay entirely the loader's business — calling this twice costs one download.
|
|
30
|
+
*/
|
|
31
|
+
export function preloadDynamicBlocks(descriptors) {
|
|
32
|
+
if (!descriptors || descriptors.length === 0)
|
|
33
|
+
return;
|
|
34
|
+
BlockModuleLoader.preload(descriptors);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Provides dynamic block and starter descriptors to the component tree.
|
|
38
|
+
*
|
|
39
|
+
* Downloads nothing by itself: blocks load lazily as they are rendered. Pass
|
|
40
|
+
* `preload` to warm the whole catalog on mount.
|
|
41
|
+
*/
|
|
42
|
+
export function DynamicArtifactProvider({ dynamicBlocks, dynamicStarters, isLoaded = true, preload = false, children, }) {
|
|
43
|
+
const value = useMemo(() => {
|
|
44
|
+
const blockMap = new Map();
|
|
45
|
+
const starterMap = new Map();
|
|
46
|
+
if (dynamicBlocks) {
|
|
47
|
+
for (const block of dynamicBlocks) {
|
|
48
|
+
blockMap.set(block.blockType, block);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (dynamicStarters) {
|
|
52
|
+
for (const starter of dynamicStarters) {
|
|
53
|
+
starterMap.set(starter.starterId, starter);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
dynamicBlocks: blockMap,
|
|
58
|
+
dynamicStarters: starterMap,
|
|
59
|
+
isLoaded,
|
|
60
|
+
};
|
|
61
|
+
}, [dynamicBlocks, dynamicStarters, isLoaded]);
|
|
62
|
+
// In an effect, not in the memo above: a preload is a side effect and a
|
|
63
|
+
// render is not the place for one — inside `useMemo` it also ran during
|
|
64
|
+
// server rendering, where nothing can consume the result.
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (!preload)
|
|
67
|
+
return;
|
|
68
|
+
preloadDynamicBlocks(dynamicBlocks);
|
|
69
|
+
}, [preload, dynamicBlocks]);
|
|
70
|
+
return _jsx(DynamicArtifactContext.Provider, { value: value, children: children });
|
|
71
|
+
}
|
|
72
|
+
// ============================================================
|
|
73
|
+
// HOOKS
|
|
74
|
+
// ============================================================
|
|
75
|
+
/**
|
|
76
|
+
* Access dynamic block descriptors.
|
|
77
|
+
*/
|
|
78
|
+
export function useDynamicBlocks() {
|
|
79
|
+
const ctx = useContext(DynamicArtifactContext);
|
|
80
|
+
return { blocks: ctx.dynamicBlocks, isLoaded: ctx.isLoaded };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Access dynamic starter descriptors.
|
|
84
|
+
*/
|
|
85
|
+
export function useDynamicStarters() {
|
|
86
|
+
const ctx = useContext(DynamicArtifactContext);
|
|
87
|
+
return { starters: ctx.dynamicStarters, isLoaded: ctx.isLoaded };
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=dynamic-artifact-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-artifact-context.js","sourceRoot":"","sources":["../../src/render/dynamic-artifact-context.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAA;AAErF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AA6C7D,+DAA+D;AAC/D,UAAU;AACV,+DAA+D;AAE/D,MAAM,sBAAsB,GAAG,aAAa,CAA8B;IACxE,aAAa,EAAE,IAAI,GAAG,EAAE;IACxB,eAAe,EAAE,IAAI,GAAG,EAAE;IAC1B,QAAQ,EAAE,KAAK;CAChB,CAAC,CAAA;AAEF,+DAA+D;AAC/D,WAAW;AACX,+DAA+D;AAE/D;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAiE;IAEjE,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IACpD,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACtC,aAAa,EACb,eAAe,EACf,QAAQ,GAAG,IAAI,EACf,OAAO,GAAG,KAAK,EACf,QAAQ,GACqB;IAC7B,MAAM,KAAK,GAAG,OAAO,CAA8B,GAAG,EAAE;QACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAA;QAC1D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoC,CAAA;QAE9D,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAClC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACtC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QAED,OAAO;YACL,aAAa,EAAE,QAAQ;YACvB,eAAe,EAAE,UAAU;YAC3B,QAAQ;SACT,CAAA;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE9C,wEAAwE;IACxE,wEAAwE;IACxE,0DAA0D;IAC1D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,oBAAoB,CAAC,aAAa,CAAC,CAAA;IACrC,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAA;IAE5B,OAAO,KAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAmC,CAAA;AACpG,CAAC;AAED,+DAA+D;AAC/D,QAAQ;AACR,+DAA+D;AAE/D;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAI9B,MAAM,GAAG,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAA;IAC9C,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAA;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAIhC,MAAM,GAAG,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAA;IAC9C,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAA;AAClE,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Block Module Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads third-party block ESM modules at runtime via dynamic import().
|
|
5
|
+
* extends to first-party packs — the loader now SHA-256 hash
|
|
6
|
+
* checks the bundle bytes against `descriptor.integrity` before evaluation
|
|
7
|
+
* and discovers both the component and the BlockDefinition under stable
|
|
8
|
+
* export names (`Component` + `definition`) emitted by the bundle wrapper.
|
|
9
|
+
*
|
|
10
|
+
* @module @pwfabric/runtime/render/dynamic-block-loader
|
|
11
|
+
*/
|
|
12
|
+
import type { BlockDefinition } from '@pwfabric/core';
|
|
13
|
+
import type { DynamicBlockDescriptor } from '@pwfabric/contracts';
|
|
14
|
+
import type { BlockComponent } from './types.js';
|
|
15
|
+
export interface LoadedAtom {
|
|
16
|
+
readonly Component: BlockComponent;
|
|
17
|
+
readonly definition: BlockDefinition | null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Singleton loader for dynamic block ESM modules.
|
|
21
|
+
*
|
|
22
|
+
* - Caches loaded modules by blockType
|
|
23
|
+
* - Deduplicates concurrent requests for the same module
|
|
24
|
+
* - Provides preload for fire-and-forget pre-fetching
|
|
25
|
+
*/
|
|
26
|
+
declare class BlockModuleLoaderImpl {
|
|
27
|
+
private readonly cache;
|
|
28
|
+
private readonly pending;
|
|
29
|
+
/**
|
|
30
|
+
* Load a dynamic block module and return its component.
|
|
31
|
+
*/
|
|
32
|
+
load(descriptor: DynamicBlockDescriptor): Promise<BlockComponent>;
|
|
33
|
+
/**
|
|
34
|
+
* load both the component and the BlockDefinition. Hash-checks
|
|
35
|
+
* the bundle bytes against `descriptor.integrity` before evaluation.
|
|
36
|
+
*/
|
|
37
|
+
loadAtom(descriptor: DynamicBlockDescriptor): Promise<LoadedAtom>;
|
|
38
|
+
/**
|
|
39
|
+
* Preload multiple block modules (fire-and-forget).
|
|
40
|
+
*/
|
|
41
|
+
preload(descriptors: readonly DynamicBlockDescriptor[]): void;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a block module is already loaded.
|
|
44
|
+
*/
|
|
45
|
+
isLoaded(blockType: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Synchronously get a cached block component, or null if not yet loaded.
|
|
48
|
+
*/
|
|
49
|
+
getSync(blockType: string): BlockComponent | null;
|
|
50
|
+
/**
|
|
51
|
+
* Synchronously get the cached block definition, or null if not yet loaded
|
|
52
|
+
* (or the bundle did not export one).
|
|
53
|
+
*/
|
|
54
|
+
getDefinitionSync(blockType: string): BlockDefinition | null;
|
|
55
|
+
/**
|
|
56
|
+
* Invalidate cache for a specific block type or all blocks.
|
|
57
|
+
*/
|
|
58
|
+
invalidate(blockType?: string): void;
|
|
59
|
+
private doLoad;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* SHA-256 verify the fetched bundle bytes against `descriptor.integrity`.
|
|
63
|
+
*
|
|
64
|
+
* Accepted formats:
|
|
65
|
+
* - bare 64-char hex (the format `bundleHash` is stored in DB / listing
|
|
66
|
+
* metadata)
|
|
67
|
+
* - SRI-style `sha256-<base64>` (allowed for forward-compat with W3C
|
|
68
|
+
* subresource-integrity strings)
|
|
69
|
+
*
|
|
70
|
+
* Empty / missing integrity is treated as a hard failure — this is a
|
|
71
|
+
* security boundary, not a hint.
|
|
72
|
+
*
|
|
73
|
+
* Exported for unit tests; runtime callers should use `BlockModuleLoader.load`.
|
|
74
|
+
*/
|
|
75
|
+
export declare function verifyIntegrity(bytes: ArrayBuffer, integrity: string, blockType: string): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Singleton instance
|
|
78
|
+
*/
|
|
79
|
+
export declare const BlockModuleLoader: BlockModuleLoaderImpl;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=dynamic-block-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-block-loader.d.ts","sourceRoot":"","sources":["../../src/render/dynamic-block-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAMhD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CAC5C;AAqBD;;;;;;GAMG;AACH,cAAM,qBAAqB;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IAEjE;;OAEG;IACG,IAAI,CAAC,UAAU,EAAE,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC;IAKvE;;;OAGG;IACG,QAAQ,CAAC,UAAU,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAyBvE;;OAEG;IACH,OAAO,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,GAAG,IAAI;IAU7D;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAIjD;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAI5D;;OAEG;IACH,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;YAQtB,MAAM;CA8CrB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAkBD;;GAEG;AACH,eAAO,MAAM,iBAAiB,uBAA8B,CAAA"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Block Module Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads third-party block ESM modules at runtime via dynamic import().
|
|
5
|
+
* extends to first-party packs — the loader now SHA-256 hash
|
|
6
|
+
* checks the bundle bytes against `descriptor.integrity` before evaluation
|
|
7
|
+
* and discovers both the component and the BlockDefinition under stable
|
|
8
|
+
* export names (`Component` + `definition`) emitted by the bundle wrapper.
|
|
9
|
+
*
|
|
10
|
+
* @module @pwfabric/runtime/render/dynamic-block-loader
|
|
11
|
+
*/
|
|
12
|
+
// ============================================================
|
|
13
|
+
// MODULE LOADER
|
|
14
|
+
// ============================================================
|
|
15
|
+
/**
|
|
16
|
+
* Singleton loader for dynamic block ESM modules.
|
|
17
|
+
*
|
|
18
|
+
* - Caches loaded modules by blockType
|
|
19
|
+
* - Deduplicates concurrent requests for the same module
|
|
20
|
+
* - Provides preload for fire-and-forget pre-fetching
|
|
21
|
+
*/
|
|
22
|
+
class BlockModuleLoaderImpl {
|
|
23
|
+
cache = new Map();
|
|
24
|
+
pending = new Map();
|
|
25
|
+
/**
|
|
26
|
+
* Load a dynamic block module and return its component.
|
|
27
|
+
*/
|
|
28
|
+
async load(descriptor) {
|
|
29
|
+
const atom = await this.loadAtom(descriptor);
|
|
30
|
+
return atom.Component;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* load both the component and the BlockDefinition. Hash-checks
|
|
34
|
+
* the bundle bytes against `descriptor.integrity` before evaluation.
|
|
35
|
+
*/
|
|
36
|
+
async loadAtom(descriptor) {
|
|
37
|
+
// Check cache
|
|
38
|
+
const cached = this.cache.get(descriptor.blockType);
|
|
39
|
+
if (cached)
|
|
40
|
+
return { Component: cached.component, definition: cached.definition };
|
|
41
|
+
// Check pending (dedup concurrent requests)
|
|
42
|
+
const inflight = this.pending.get(descriptor.blockType);
|
|
43
|
+
if (inflight)
|
|
44
|
+
return inflight;
|
|
45
|
+
const promise = this.doLoad(descriptor);
|
|
46
|
+
this.pending.set(descriptor.blockType, promise);
|
|
47
|
+
try {
|
|
48
|
+
const atom = await promise;
|
|
49
|
+
this.cache.set(descriptor.blockType, {
|
|
50
|
+
component: atom.Component,
|
|
51
|
+
definition: atom.definition,
|
|
52
|
+
loadedAt: Date.now(),
|
|
53
|
+
});
|
|
54
|
+
return atom;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
this.pending.delete(descriptor.blockType);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Preload multiple block modules (fire-and-forget).
|
|
62
|
+
*/
|
|
63
|
+
preload(descriptors) {
|
|
64
|
+
for (const descriptor of descriptors) {
|
|
65
|
+
if (!this.cache.has(descriptor.blockType) && !this.pending.has(descriptor.blockType)) {
|
|
66
|
+
this.loadAtom(descriptor).catch(() => {
|
|
67
|
+
// Preload failure is non-fatal
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if a block module is already loaded.
|
|
74
|
+
*/
|
|
75
|
+
isLoaded(blockType) {
|
|
76
|
+
return this.cache.has(blockType);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Synchronously get a cached block component, or null if not yet loaded.
|
|
80
|
+
*/
|
|
81
|
+
getSync(blockType) {
|
|
82
|
+
return this.cache.get(blockType)?.component ?? null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Synchronously get the cached block definition, or null if not yet loaded
|
|
86
|
+
* (or the bundle did not export one).
|
|
87
|
+
*/
|
|
88
|
+
getDefinitionSync(blockType) {
|
|
89
|
+
return this.cache.get(blockType)?.definition ?? null;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Invalidate cache for a specific block type or all blocks.
|
|
93
|
+
*/
|
|
94
|
+
invalidate(blockType) {
|
|
95
|
+
if (blockType) {
|
|
96
|
+
this.cache.delete(blockType);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.cache.clear();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async doLoad(descriptor) {
|
|
103
|
+
const LOAD_TIMEOUT_MS = 10_000;
|
|
104
|
+
const fetchAndImport = async () => {
|
|
105
|
+
// integrity is required before evaluation. We fetch the
|
|
106
|
+
// bundle, hash-verify the bytes against `descriptor.integrity`, and
|
|
107
|
+
// only then create a Blob URL and feed it to `import()`. Skipping
|
|
108
|
+
// this would let a CDN-side compromise execute attacker code under
|
|
109
|
+
// our origin.
|
|
110
|
+
const res = await fetch(descriptor.moduleUrl, { credentials: 'omit' });
|
|
111
|
+
if (!res.ok) {
|
|
112
|
+
throw new Error(`Bundle fetch failed for ${descriptor.blockType}: ${res.status}`);
|
|
113
|
+
}
|
|
114
|
+
const bytes = await res.arrayBuffer();
|
|
115
|
+
await verifyIntegrity(bytes, descriptor.integrity, descriptor.blockType);
|
|
116
|
+
const blob = new Blob([bytes], { type: 'text/javascript' });
|
|
117
|
+
const blobUrl = URL.createObjectURL(blob);
|
|
118
|
+
try {
|
|
119
|
+
return (await import(/* webpackIgnore: true */ blobUrl));
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
URL.revokeObjectURL(blobUrl);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const loadPromise = fetchAndImport();
|
|
126
|
+
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`Module load timed out after ${LOAD_TIMEOUT_MS / 1000}s`)), LOAD_TIMEOUT_MS));
|
|
127
|
+
const mod = await Promise.race([loadPromise, timeoutPromise]);
|
|
128
|
+
// wrapper convention emits `Component` + `definition`.
|
|
129
|
+
// Fall back to legacy export names so older bundles keep working.
|
|
130
|
+
const component = mod.Component ?? mod.default ?? mod.component ?? mod.render;
|
|
131
|
+
if (!component || typeof component !== 'function') {
|
|
132
|
+
throw new Error(`Module at ${descriptor.moduleUrl} does not export a valid block component`);
|
|
133
|
+
}
|
|
134
|
+
const definition = mod.definition && typeof mod.definition === 'object' ? mod.definition : null;
|
|
135
|
+
return { Component: component, definition };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// ============================================================
|
|
139
|
+
// HASH VERIFICATION
|
|
140
|
+
// ============================================================
|
|
141
|
+
/**
|
|
142
|
+
* SHA-256 verify the fetched bundle bytes against `descriptor.integrity`.
|
|
143
|
+
*
|
|
144
|
+
* Accepted formats:
|
|
145
|
+
* - bare 64-char hex (the format `bundleHash` is stored in DB / listing
|
|
146
|
+
* metadata)
|
|
147
|
+
* - SRI-style `sha256-<base64>` (allowed for forward-compat with W3C
|
|
148
|
+
* subresource-integrity strings)
|
|
149
|
+
*
|
|
150
|
+
* Empty / missing integrity is treated as a hard failure — this is a
|
|
151
|
+
* security boundary, not a hint.
|
|
152
|
+
*
|
|
153
|
+
* Exported for unit tests; runtime callers should use `BlockModuleLoader.load`.
|
|
154
|
+
*/
|
|
155
|
+
export async function verifyIntegrity(bytes, integrity, blockType) {
|
|
156
|
+
if (!integrity) {
|
|
157
|
+
throw new Error(`Missing integrity for ${blockType}; refusing to evaluate bundle`);
|
|
158
|
+
}
|
|
159
|
+
const computed = new Uint8Array(await crypto.subtle.digest('SHA-256', bytes));
|
|
160
|
+
const computedHex = bytesToHex(computed);
|
|
161
|
+
const expected = integrity.trim();
|
|
162
|
+
if (/^[0-9a-f]{64}$/i.test(expected)) {
|
|
163
|
+
if (computedHex.toLowerCase() !== expected.toLowerCase()) {
|
|
164
|
+
throw new Error(`Integrity check failed for ${blockType}`);
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const sriMatch = /^sha256-(.+)$/i.exec(expected);
|
|
169
|
+
if (sriMatch) {
|
|
170
|
+
const expectedB64 = sriMatch[1] ?? '';
|
|
171
|
+
const computedB64 = bytesToBase64(computed);
|
|
172
|
+
if (expectedB64.replace(/=+$/, '') !== computedB64.replace(/=+$/, '')) {
|
|
173
|
+
throw new Error(`Integrity check failed for ${blockType}`);
|
|
174
|
+
}
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
throw new Error(`Unrecognized integrity format for ${blockType}`);
|
|
178
|
+
}
|
|
179
|
+
function bytesToHex(bytes) {
|
|
180
|
+
let out = '';
|
|
181
|
+
for (const v of bytes) {
|
|
182
|
+
out += v.toString(16).padStart(2, '0');
|
|
183
|
+
}
|
|
184
|
+
return out;
|
|
185
|
+
}
|
|
186
|
+
function bytesToBase64(bytes) {
|
|
187
|
+
let bin = '';
|
|
188
|
+
for (const v of bytes) {
|
|
189
|
+
bin += String.fromCharCode(v);
|
|
190
|
+
}
|
|
191
|
+
return btoa(bin);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Singleton instance
|
|
195
|
+
*/
|
|
196
|
+
export const BlockModuleLoader = new BlockModuleLoaderImpl();
|
|
197
|
+
//# sourceMappingURL=dynamic-block-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-block-loader.js","sourceRoot":"","sources":["../../src/render/dynamic-block-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** The form a single state value takes inside a mixed endpoint. */
|
|
2
|
+
export declare function encodeEndpointValue(value: unknown): string;
|
|
3
|
+
export declare function resolveEndpoint(endpoint: string, state: Readonly<Record<string, unknown>>): string;
|
|
4
|
+
/**
|
|
5
|
+
* Would this endpoint be requested with a required value MISSING?
|
|
6
|
+
*
|
|
7
|
+
* A detail source is authored as `/carts/{{state.numara}}`. Until the visitor
|
|
8
|
+
* types a number, `numara` is empty and the request would go to `/carts/` —
|
|
9
|
+
* the whole collection (DummyJSON redirects there), which then fails `returns`
|
|
10
|
+
* and opens the page on an error. A placeholder in the PATH is
|
|
11
|
+
* required: when it resolves to nothing (`''`, `null`, `undefined`) or cannot
|
|
12
|
+
* be evaluated, the source is not fetched at all and stays idle.
|
|
13
|
+
*
|
|
14
|
+
* A placeholder in the QUERY STRING (`?q={{state.q}}`) is not required — an
|
|
15
|
+
* empty search box legitimately means "no constraint". An endpoint that is
|
|
16
|
+
* ONE expression (`{{state.url}}`) is required as a whole.
|
|
17
|
+
*/
|
|
18
|
+
export declare function endpointMissingPathValue(endpoint: string, state: Readonly<Record<string, unknown>>): boolean;
|
|
19
|
+
//# sourceMappingURL=endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../src/render/endpoint.ts"],"names":[],"mappings":"AAmCA,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI1D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAqBlG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,OAAO,CA4BT"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolveEndpoint — place surface state into a REST source's `endpoint`.
|
|
3
|
+
*
|
|
4
|
+
* EVERY VALUE IS URL-ENCODED WHEN THE ENDPOINT MIXES TEXT AND EXPRESSIONS.
|
|
5
|
+
*
|
|
6
|
+
* A raw interpolation would be harmless if state could only come from the
|
|
7
|
+
* page's own controls, but a published app can seed state from its address
|
|
8
|
+
* (`/product?id=12`): `?id=12/../../admin` or `?id=1%26role=owner` would
|
|
9
|
+
* rewrite the path or the query of a request the visitor's credential rides on. A space or a `ü`
|
|
10
|
+
* was always encoded by `fetch`; what this adds is `& # + % ? /`.
|
|
11
|
+
*
|
|
12
|
+
* Three rules:
|
|
13
|
+
*
|
|
14
|
+
* - mixed endpoint (`/products/{{state.id}}`, `?q={{state.q}}`): each value
|
|
15
|
+
* goes through `encodeURIComponent` — ALL values, not only the ones that
|
|
16
|
+
* came from the address, because the renderer cannot tell them apart;
|
|
17
|
+
* - a value that is exactly `.` or `..` becomes `''` — `encodeURIComponent`
|
|
18
|
+
* leaves both alone, and a lone `..` segment still climbs a directory;
|
|
19
|
+
* - an endpoint that is ONE expression (`"{{state.url}}"`) is left as it
|
|
20
|
+
* resolves, unencoded — today's behaviour. The published-app runner never
|
|
21
|
+
* seeds a key read there (nor one read in the scheme/host part), so the
|
|
22
|
+
* address cannot reach it.
|
|
23
|
+
*
|
|
24
|
+
* A failed expression leaves the endpoint as authored, as it always did.
|
|
25
|
+
*
|
|
26
|
+
* @module @pwfabric/runtime/render/endpoint
|
|
27
|
+
*/
|
|
28
|
+
import { createExpressionContext, evaluate, interpolate } from '../surface/expression.js';
|
|
29
|
+
/** `"{{ expr }}"` and nothing else (surrounding whitespace allowed). */
|
|
30
|
+
const WHOLE = /^\s*\{\{\s*([^{}]+?)\s*\}\}\s*$/;
|
|
31
|
+
/** One `{{ … }}` placeholder — the same shape `interpolate` walks. */
|
|
32
|
+
const PLACEHOLDER = /\{\{(.+?)\}\}/g;
|
|
33
|
+
/** The form a single state value takes inside a mixed endpoint. */
|
|
34
|
+
export function encodeEndpointValue(value) {
|
|
35
|
+
const s = String(value ?? '');
|
|
36
|
+
if (s === '.' || s === '..')
|
|
37
|
+
return '';
|
|
38
|
+
return encodeURIComponent(s);
|
|
39
|
+
}
|
|
40
|
+
export function resolveEndpoint(endpoint, state) {
|
|
41
|
+
if (!endpoint.includes('{{'))
|
|
42
|
+
return endpoint;
|
|
43
|
+
const ctx = createExpressionContext({ state: state });
|
|
44
|
+
// One expression: resolved as before, no encoding (see module note).
|
|
45
|
+
if (WHOLE.test(endpoint)) {
|
|
46
|
+
const r = interpolate(endpoint, ctx);
|
|
47
|
+
return r.success ? r.value : endpoint;
|
|
48
|
+
}
|
|
49
|
+
let failed = false;
|
|
50
|
+
const out = endpoint.replace(PLACEHOLDER, (_match, expression) => {
|
|
51
|
+
if (failed)
|
|
52
|
+
return '';
|
|
53
|
+
const r = evaluate(expression.trim(), ctx);
|
|
54
|
+
if (!r.success) {
|
|
55
|
+
failed = true;
|
|
56
|
+
return '';
|
|
57
|
+
}
|
|
58
|
+
return encodeEndpointValue(r.value);
|
|
59
|
+
});
|
|
60
|
+
return failed ? endpoint : out;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Would this endpoint be requested with a required value MISSING?
|
|
64
|
+
*
|
|
65
|
+
* A detail source is authored as `/carts/{{state.numara}}`. Until the visitor
|
|
66
|
+
* types a number, `numara` is empty and the request would go to `/carts/` —
|
|
67
|
+
* the whole collection (DummyJSON redirects there), which then fails `returns`
|
|
68
|
+
* and opens the page on an error. A placeholder in the PATH is
|
|
69
|
+
* required: when it resolves to nothing (`''`, `null`, `undefined`) or cannot
|
|
70
|
+
* be evaluated, the source is not fetched at all and stays idle.
|
|
71
|
+
*
|
|
72
|
+
* A placeholder in the QUERY STRING (`?q={{state.q}}`) is not required — an
|
|
73
|
+
* empty search box legitimately means "no constraint". An endpoint that is
|
|
74
|
+
* ONE expression (`{{state.url}}`) is required as a whole.
|
|
75
|
+
*/
|
|
76
|
+
export function endpointMissingPathValue(endpoint, state) {
|
|
77
|
+
if (!endpoint.includes('{{'))
|
|
78
|
+
return false;
|
|
79
|
+
const ctx = createExpressionContext({ state: state });
|
|
80
|
+
const empty = (expression) => {
|
|
81
|
+
const r = evaluate(expression.trim(), ctx);
|
|
82
|
+
return !r.success || r.value === undefined || r.value === null || String(r.value).trim() === '';
|
|
83
|
+
};
|
|
84
|
+
const whole = WHOLE.exec(endpoint);
|
|
85
|
+
if (whole)
|
|
86
|
+
return empty(whole[1] ?? '');
|
|
87
|
+
// The path part ends at the first `?` or `#` that is not inside a placeholder.
|
|
88
|
+
let pathEnd = endpoint.length;
|
|
89
|
+
for (let i = 0, depth = 0; i < endpoint.length; i++) {
|
|
90
|
+
if (endpoint.startsWith('{{', i)) {
|
|
91
|
+
depth++;
|
|
92
|
+
i++;
|
|
93
|
+
}
|
|
94
|
+
else if (endpoint.startsWith('}}', i) && depth > 0) {
|
|
95
|
+
depth--;
|
|
96
|
+
i++;
|
|
97
|
+
}
|
|
98
|
+
else if (depth === 0 && (endpoint[i] === '?' || endpoint[i] === '#')) {
|
|
99
|
+
pathEnd = i;
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
for (const m of endpoint.slice(0, pathEnd).matchAll(PLACEHOLDER)) {
|
|
104
|
+
if (empty(m[1] ?? ''))
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../src/render/endpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity Facade React Context
|
|
3
|
+
*
|
|
4
|
+
* Provides EntityFacade to the surface render tree via React
|
|
5
|
+
* context. Pattern mirrors SurfaceRoutingContext / useSurfaceRouting().
|
|
6
|
+
*
|
|
7
|
+
* Injection point: EntityFacadeContext.Provider wraps BehaviorSurfaceProvider
|
|
8
|
+
* inside SurfaceRenderer when entityFacade prop is supplied.
|
|
9
|
+
*
|
|
10
|
+
* @module @pwfabric/runtime/render/entity-facade-context
|
|
11
|
+
*/
|
|
12
|
+
import type { EntityFacade } from '../entity/facade.js';
|
|
13
|
+
/**
|
|
14
|
+
* React context that carries an EntityFacade instance through the render tree.
|
|
15
|
+
* Defaults to null — blocks that require entity access check for null and
|
|
16
|
+
* gracefully handle the absent-facade case.
|
|
17
|
+
*/
|
|
18
|
+
export declare const EntityFacadeContext: import("react").Context<EntityFacade | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Returns the EntityFacade from the nearest EntityFacadeContext.Provider.
|
|
21
|
+
* Returns null when no provider is present (entity support not configured).
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* import { useEntityFacade } from '@pwfabric/runtime/render'
|
|
26
|
+
*
|
|
27
|
+
* function MyBlock() {
|
|
28
|
+
* const facade = useEntityFacade()
|
|
29
|
+
* if (!facade) return null // No entity support configured
|
|
30
|
+
* const result = await facade.store.query('Employee', {})
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function useEntityFacade(): EntityFacade | null;
|
|
35
|
+
//# sourceMappingURL=entity-facade-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-facade-context.d.ts","sourceRoot":"","sources":["../../src/render/entity-facade-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,8CAA2C,CAAA;AAE3E;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD"}
|