@microsoft/fast-element 2.10.4 → 3.0.0-rc.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/ARCHITECTURE_HTML_TAGGED_TEMPLATE_LITERAL.md +1 -1
- package/ARCHITECTURE_OVERVIEW.md +2 -2
- package/CHANGELOG.json +1 -1
- package/CHANGELOG.md +2 -2
- package/DECLARATIVE_DESIGN.md +806 -0
- package/DECLARATIVE_HTML.md +470 -0
- package/DECLARATIVE_MIGRATION.md +215 -0
- package/DECLARATIVE_RENDERING.md +530 -0
- package/DECLARATIVE_RENDERING_LIFECYCLE.md +288 -0
- package/DECLARATIVE_SCHEMA_OBSERVER_MAP.md +489 -0
- package/DESIGN.md +138 -33
- package/MIGRATION.md +387 -0
- package/README.md +208 -1
- package/SIZES.md +25 -0
- package/api-extractor.arrays.json +15 -0
- package/api-extractor.context.json +1 -0
- package/api-extractor.declarative.json +15 -0
- package/api-extractor.di.json +1 -0
- package/api-extractor.hydration.json +15 -0
- package/api-extractor.styles.json +15 -0
- package/dist/arrays/arrays.api.json +2621 -0
- package/dist/declarative/declarative.api.json +7844 -0
- package/dist/di/di.api.json +1 -1
- package/dist/dts/array-observer.d.ts +2 -0
- package/dist/dts/arrays.d.ts +2 -0
- package/dist/dts/attr.d.ts +1 -0
- package/dist/dts/binding/signal.d.ts +6 -6
- package/dist/dts/binding/two-way.d.ts +1 -0
- package/dist/dts/binding.d.ts +7 -0
- package/dist/dts/components/attributes.d.ts +2 -5
- package/dist/dts/components/definition-schema-transforms.d.ts +9 -0
- package/dist/dts/components/element-controller.d.ts +80 -114
- package/dist/dts/components/element-hydration.d.ts +1 -1
- package/dist/dts/components/enable-hydration.d.ts +34 -0
- package/dist/dts/components/fast-definitions.d.ts +91 -42
- package/dist/dts/components/fast-element.d.ts +5 -8
- package/dist/dts/components/hydration-tracker.d.ts +40 -0
- package/dist/dts/components/hydration.d.ts +18 -53
- package/dist/dts/components/schema.d.ts +205 -0
- package/dist/dts/context.d.ts +6 -6
- package/dist/dts/css.d.ts +3 -0
- package/dist/dts/debug.d.ts +5 -1
- package/dist/dts/declarative/attribute-map.d.ts +58 -0
- package/dist/dts/declarative/debug.d.ts +5 -0
- package/dist/dts/declarative/index.d.ts +13 -0
- package/dist/dts/declarative/interfaces.d.ts +9 -0
- package/dist/dts/declarative/observer-map-utilities.d.ts +58 -0
- package/dist/dts/declarative/observer-map.d.ts +89 -0
- package/dist/dts/declarative/runtime.d.ts +5 -0
- package/dist/dts/declarative/syntax.d.ts +21 -0
- package/dist/dts/declarative/template-bridge.d.ts +33 -0
- package/dist/dts/declarative/template-parser.d.ts +98 -0
- package/dist/dts/declarative/template.d.ts +9 -0
- package/dist/dts/declarative/utilities.d.ts +312 -0
- package/dist/dts/di/di.d.ts +1 -1
- package/dist/dts/directives/children.d.ts +2 -0
- package/dist/dts/directives/node-observation.d.ts +2 -0
- package/dist/dts/directives/ref.d.ts +2 -0
- package/dist/dts/directives/repeat.d.ts +4 -0
- package/dist/dts/directives/slotted.d.ts +2 -0
- package/dist/dts/directives/when.d.ts +3 -0
- package/dist/dts/dom-policy.d.ts +1 -1
- package/dist/dts/html.d.ts +5 -0
- package/dist/dts/hydration/runtime.d.ts +7 -0
- package/dist/dts/hydration/target-builder.d.ts +15 -12
- package/dist/dts/hydration.d.ts +14 -0
- package/dist/dts/index.d.ts +38 -42
- package/dist/dts/index.debug.d.ts +0 -1
- package/dist/dts/index.rollup.debug.d.ts +0 -1
- package/dist/dts/interfaces.d.ts +1 -49
- package/dist/dts/observable.d.ts +3 -6
- package/dist/dts/observation/arrays.d.ts +1 -1
- package/dist/dts/observation/update-queue.d.ts +1 -1
- package/dist/dts/platform.d.ts +25 -4
- package/dist/dts/render.d.ts +7 -0
- package/dist/dts/schema.d.ts +1 -0
- package/dist/dts/state/exports.d.ts +1 -1
- package/dist/dts/state/state.d.ts +2 -2
- package/dist/dts/styles/css-directive.d.ts +5 -12
- package/dist/dts/styles/css.d.ts +5 -7
- package/dist/dts/styles/element-styles.d.ts +0 -10
- package/dist/dts/styles.d.ts +6 -0
- package/dist/dts/templating/children.d.ts +1 -1
- package/dist/dts/templating/html-binding-directive.d.ts +4 -0
- package/dist/dts/templating/html-directive.d.ts +17 -0
- package/dist/dts/templating/hydration-view.d.ts +109 -0
- package/dist/dts/templating/ref.d.ts +1 -1
- package/dist/dts/templating/render.d.ts +1 -1
- package/dist/dts/templating/repeat.d.ts +2 -2
- package/dist/dts/templating/slotted.d.ts +1 -1
- package/dist/dts/templating/template.d.ts +17 -9
- package/dist/dts/templating/view.d.ts +25 -102
- package/dist/dts/templating/when.d.ts +1 -1
- package/dist/dts/templating.d.ts +10 -0
- package/dist/dts/testing/exports.d.ts +2 -2
- package/dist/dts/updates.d.ts +1 -0
- package/dist/dts/volatile.d.ts +2 -0
- package/dist/esm/array-observer.js +1 -0
- package/dist/esm/arrays.js +1 -0
- package/dist/esm/attr.js +1 -0
- package/dist/esm/binding/normalize.js +1 -1
- package/dist/esm/binding/signal.js +4 -4
- package/dist/esm/binding/two-way.js +2 -1
- package/dist/esm/binding.js +4 -0
- package/dist/esm/components/attributes.js +8 -5
- package/dist/esm/components/definition-schema-transforms.js +23 -0
- package/dist/esm/components/element-controller.js +200 -269
- package/dist/esm/components/element-hydration.js +1 -1
- package/dist/esm/components/enable-hydration.js +100 -0
- package/dist/esm/components/fast-definitions.js +211 -49
- package/dist/esm/components/fast-element.js +18 -27
- package/dist/esm/components/hydration-tracker.js +93 -0
- package/dist/esm/components/hydration.js +62 -144
- package/dist/esm/components/schema.js +253 -0
- package/dist/esm/context.js +6 -6
- package/dist/esm/css.js +3 -0
- package/dist/esm/debug.js +26 -26
- package/dist/esm/declarative/attribute-map.js +121 -0
- package/dist/esm/declarative/debug.js +5 -0
- package/dist/esm/declarative/index.js +3 -0
- package/dist/esm/declarative/interfaces.js +10 -0
- package/dist/esm/declarative/observer-map-utilities.js +562 -0
- package/dist/esm/declarative/observer-map.js +216 -0
- package/dist/esm/declarative/runtime.js +14 -0
- package/dist/esm/declarative/syntax.js +36 -0
- package/dist/esm/declarative/template-bridge.js +170 -0
- package/dist/esm/declarative/template-parser.js +306 -0
- package/dist/esm/declarative/template.js +142 -0
- package/dist/esm/declarative/utilities.js +834 -0
- package/dist/esm/di/di.js +6 -8
- package/dist/esm/directives/children.js +1 -0
- package/dist/esm/directives/node-observation.js +1 -0
- package/dist/esm/directives/ref.js +1 -0
- package/dist/esm/directives/repeat.js +1 -0
- package/dist/esm/directives/slotted.js +1 -0
- package/dist/esm/directives/when.js +1 -0
- package/dist/esm/dom-policy.js +2 -2
- package/dist/esm/dom.js +1 -1
- package/dist/esm/html.js +2 -0
- package/dist/esm/hydration/runtime.js +33 -0
- package/dist/esm/hydration/target-builder.js +97 -90
- package/dist/esm/hydration.js +4 -0
- package/dist/esm/index.debug.js +2 -1
- package/dist/esm/index.js +34 -29
- package/dist/esm/index.rollup.debug.js +3 -2
- package/dist/esm/index.rollup.js +1 -1
- package/dist/esm/interfaces.js +1 -45
- package/dist/esm/observable.js +1 -4
- package/dist/esm/observation/arrays.js +1 -1
- package/dist/esm/observation/observable.js +5 -5
- package/dist/esm/observation/update-queue.js +47 -58
- package/dist/esm/platform.js +31 -30
- package/dist/esm/render.js +1 -0
- package/dist/esm/schema.js +1 -0
- package/dist/esm/state/exports.js +1 -1
- package/dist/esm/styles/css-directive.js +1 -2
- package/dist/esm/styles/css.js +15 -56
- package/dist/esm/styles/element-styles.js +69 -15
- package/dist/esm/styles.js +2 -0
- package/dist/esm/templating/html-binding-directive.js +10 -8
- package/dist/esm/templating/hydration-view.js +235 -0
- package/dist/esm/templating/render.js +1 -1
- package/dist/esm/templating/repeat.js +36 -34
- package/dist/esm/templating/template.js +7 -7
- package/dist/esm/templating/view.js +24 -233
- package/dist/esm/templating.js +7 -0
- package/dist/esm/testing/exports.js +2 -2
- package/dist/esm/updates.js +1 -0
- package/dist/esm/volatile.js +1 -0
- package/dist/fast-element.api.json +9016 -6995
- package/dist/fast-element.d.ts +3557 -796
- package/dist/fast-element.debug.js +5088 -4437
- package/dist/fast-element.debug.min.js +2 -2
- package/dist/fast-element.js +5369 -4649
- package/dist/fast-element.min.js +2 -2
- package/dist/fast-element.untrimmed.d.ts +863 -475
- package/dist/hydration/hydration.api.json +5237 -0
- package/dist/styles/styles.api.json +2672 -0
- package/docs/api-report.api.md +343 -166
- package/docs/arrays/api-report.api.md +114 -0
- package/docs/declarative/api-report.api.md +397 -0
- package/docs/hydration/api-report.api.md +285 -0
- package/docs/styles/api-report.api.md +135 -0
- package/package.json +149 -41
- package/playwright.declarative.config.ts +26 -0
- package/playwright.declarative.webui.config.ts +20 -0
- package/scripts/declarative/build-fixtures-with-webui.js +135 -0
- package/scripts/declarative/build-fixtures.js +49 -0
- package/scripts/declarative/build-fixtures.utilities.js +101 -0
- package/scripts/measure-sizes.js +219 -0
- package/scripts/run-api-extractor.js +39 -20
- package/test/declarative/fixtures/README.md +72 -0
- package/test/declarative/fixtures/WRITING_FIXTURES.md +330 -0
- package/test/declarative/fixtures/bindings/README.md +12 -0
- package/test/declarative/fixtures/bindings/attribute/entry.html +13 -0
- package/test/declarative/fixtures/bindings/attribute/fast-build.config.json +6 -0
- package/test/declarative/fixtures/bindings/attribute/index.html +25 -0
- package/test/declarative/fixtures/bindings/attribute/main.ts +41 -0
- package/test/declarative/fixtures/bindings/attribute/state.json +8 -0
- package/test/declarative/fixtures/bindings/attribute/templates.html +11 -0
- package/test/declarative/fixtures/bindings/content/entry.html +12 -0
- package/test/declarative/fixtures/bindings/content/fast-build.config.json +6 -0
- package/test/declarative/fixtures/bindings/content/index.html +19 -0
- package/test/declarative/fixtures/bindings/content/main.ts +27 -0
- package/test/declarative/fixtures/bindings/content/state.json +4 -0
- package/test/declarative/fixtures/bindings/content/templates.html +6 -0
- package/test/declarative/fixtures/bindings/dot-syntax/entry.html +11 -0
- package/test/declarative/fixtures/bindings/dot-syntax/fast-build.config.json +6 -0
- package/test/declarative/fixtures/bindings/dot-syntax/index.html +47 -0
- package/test/declarative/fixtures/bindings/dot-syntax/main.ts +59 -0
- package/test/declarative/fixtures/bindings/dot-syntax/state.json +16 -0
- package/test/declarative/fixtures/bindings/dot-syntax/templates.html +17 -0
- package/test/declarative/fixtures/bindings/event/entry.html +11 -0
- package/test/declarative/fixtures/bindings/event/fast-build.config.json +6 -0
- package/test/declarative/fixtures/bindings/event/index.html +43 -0
- package/test/declarative/fixtures/bindings/event/main.ts +43 -0
- package/test/declarative/fixtures/bindings/event/state.json +3 -0
- package/test/declarative/fixtures/bindings/event/templates.html +18 -0
- package/test/declarative/fixtures/bindings/host/entry.html +40 -0
- package/test/declarative/fixtures/bindings/host/fast-build.config.json +6 -0
- package/test/declarative/fixtures/bindings/host/index.html +96 -0
- package/test/declarative/fixtures/bindings/host/main.ts +222 -0
- package/test/declarative/fixtures/bindings/host/state.json +9 -0
- package/test/declarative/fixtures/bindings/host/templates.html +55 -0
- package/test/declarative/fixtures/directives/README.md +12 -0
- package/test/declarative/fixtures/directives/children/entry.html +11 -0
- package/test/declarative/fixtures/directives/children/fast-build.config.json +6 -0
- package/test/declarative/fixtures/directives/children/index.html +15 -0
- package/test/declarative/fixtures/directives/children/main.ts +22 -0
- package/test/declarative/fixtures/directives/children/state.json +3 -0
- package/test/declarative/fixtures/directives/children/templates.html +3 -0
- package/test/declarative/fixtures/directives/ref/entry.html +11 -0
- package/test/declarative/fixtures/directives/ref/fast-build.config.json +6 -0
- package/test/declarative/fixtures/directives/ref/index.html +15 -0
- package/test/declarative/fixtures/directives/ref/main.ts +17 -0
- package/test/declarative/fixtures/directives/ref/state.json +1 -0
- package/test/declarative/fixtures/directives/ref/templates.html +3 -0
- package/test/declarative/fixtures/directives/repeat/entry.html +21 -0
- package/test/declarative/fixtures/directives/repeat/fast-build.config.json +6 -0
- package/test/declarative/fixtures/directives/repeat/index.html +133 -0
- package/test/declarative/fixtures/directives/repeat/main.ts +110 -0
- package/test/declarative/fixtures/directives/repeat/sprites.svg +8 -0
- package/test/declarative/fixtures/directives/repeat/state.json +10 -0
- package/test/declarative/fixtures/directives/repeat/templates.html +75 -0
- package/test/declarative/fixtures/directives/slotted/entry.html +17 -0
- package/test/declarative/fixtures/directives/slotted/fast-build.config.json +6 -0
- package/test/declarative/fixtures/directives/slotted/index.html +27 -0
- package/test/declarative/fixtures/directives/slotted/main.ts +29 -0
- package/test/declarative/fixtures/directives/slotted/state.json +1 -0
- package/test/declarative/fixtures/directives/slotted/templates.html +7 -0
- package/test/declarative/fixtures/directives/when/entry.html +51 -0
- package/test/declarative/fixtures/directives/when/fast-build.config.json +6 -0
- package/test/declarative/fixtures/directives/when/index.html +136 -0
- package/test/declarative/fixtures/directives/when/main.ts +172 -0
- package/test/declarative/fixtures/directives/when/state.json +12 -0
- package/test/declarative/fixtures/directives/when/templates.html +75 -0
- package/test/declarative/fixtures/ecosystem/README.md +11 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/entry.html +12 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/fast-build.config.json +6 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/index.html +20 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/main.ts +68 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/state.json +4 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/templates.html +7 -0
- package/test/declarative/fixtures/ecosystem/errors/entry.html +12 -0
- package/test/declarative/fixtures/ecosystem/errors/fast-build.config.json +6 -0
- package/test/declarative/fixtures/ecosystem/errors/index.html +20 -0
- package/test/declarative/fixtures/ecosystem/errors/main.ts +17 -0
- package/test/declarative/fixtures/ecosystem/errors/state.json +1 -0
- package/test/declarative/fixtures/ecosystem/errors/templates.html +7 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/entry.html +17 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/fast-build.config.json +6 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/index.html +56 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/main.ts +134 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/state.json +12 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/templates.html +34 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/entry.html +25 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/fast-build.config.json +6 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/fast-card.css +10 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/index.html +181 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/main.ts +58 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/state.json +6 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/templates.html +15 -0
- package/test/declarative/fixtures/extensions/README.md +15 -0
- package/test/declarative/fixtures/extensions/attribute-map/entry.html +14 -0
- package/test/declarative/fixtures/extensions/attribute-map/fast-build.config.json +6 -0
- package/test/declarative/fixtures/extensions/attribute-map/index.html +31 -0
- package/test/declarative/fixtures/extensions/attribute-map/main.ts +40 -0
- package/test/declarative/fixtures/extensions/attribute-map/state.json +4 -0
- package/test/declarative/fixtures/extensions/attribute-map/templates.html +14 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/entry.html +12 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/fast-build.config.json +7 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/index.html +25 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/main.ts +31 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/state.json +5 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/templates.html +11 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/entry.html +13 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/fast-build.config.json +7 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/index.html +23 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/main.ts +37 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/state.json +1 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/templates.html +9 -0
- package/test/declarative/fixtures/extensions/observer-map/entry.html +15 -0
- package/test/declarative/fixtures/extensions/observer-map/fast-build.config.json +6 -0
- package/test/declarative/fixtures/extensions/observer-map/index.html +442 -0
- package/test/declarative/fixtures/extensions/observer-map/main.ts +482 -0
- package/test/declarative/fixtures/extensions/observer-map/state.json +158 -0
- package/test/declarative/fixtures/extensions/observer-map/templates.html +172 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/entry.html +16 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/fast-build.config.json +6 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/index.html +27 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/main.ts +53 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/state.json +9 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/templates.html +12 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/README.md +98 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/entry.html +156 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/fast-build.config.json +6 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/index.html +376 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/main.ts +366 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/state.json +69 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/templates.html +91 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/entry.html +14 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/fast-build.config.json +6 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/index.html +110 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/main.ts +175 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/state.json +29 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/templates.html +55 -0
- package/test/declarative/fixtures/scenarios/README.md +7 -0
- package/test/declarative/fixtures/scenarios/nested-elements/entry.html +16 -0
- package/test/declarative/fixtures/scenarios/nested-elements/fast-build.config.json +6 -0
- package/test/declarative/fixtures/scenarios/nested-elements/index.html +126 -0
- package/test/declarative/fixtures/scenarios/nested-elements/main.ts +214 -0
- package/test/declarative/fixtures/scenarios/nested-elements/state.json +10 -0
- package/test/declarative/fixtures/scenarios/nested-elements/templates.html +54 -0
- package/test/declarative/index.html +12 -0
- package/test/declarative/vite.config.ts +55 -0
- package/test/declarative-main.ts +6 -0
- package/test/extension-subpaths-main.ts +9 -0
- package/test/main.ts +38 -33
- package/test/pure-declarative-main.ts +1 -0
- package/dist/dts/components/install-hydration.d.ts +0 -1
- package/dist/dts/pending-task.d.ts +0 -32
- package/dist/dts/polyfills.d.ts +0 -0
- package/dist/dts/styles/css-binding-directive.d.ts +0 -60
- package/dist/dts/templating/install-hydratable-view-templates.d.ts +0 -1
- package/dist/esm/components/install-hydration.js +0 -3
- package/dist/esm/pending-task.js +0 -28
- package/dist/esm/polyfills.js +0 -60
- package/dist/esm/styles/css-binding-directive.js +0 -76
- package/dist/esm/templating/install-hydratable-view-templates.js +0 -23
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { setDefinitionSchemaTransform } from "../components/definition-schema-transforms.js";
|
|
2
|
+
import { hasFASTElementTemplateResolver, } from "../components/fast-definitions.js";
|
|
3
|
+
import { Observable } from "../observation/observable.js";
|
|
4
|
+
import { assignObservables, deepMerge } from "./observer-map-utilities.js";
|
|
5
|
+
export { Schema, schemaRegistry, } from "../components/schema.js";
|
|
6
|
+
const observerMapSchemaTransformKey = "observer-map";
|
|
7
|
+
const observerMapSchemaTransformPriority = 1;
|
|
8
|
+
function defineObserverMap(definition, schema, config) {
|
|
9
|
+
new ObserverMap(definition.type.prototype, schema, config).defineProperties();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Creates a FAST element extension that enables schema-driven observer mapping
|
|
13
|
+
* for the resolved definition. When called without arguments, observes every
|
|
14
|
+
* discovered root property. The extension uses `config.schema`,
|
|
15
|
+
* `definition.schema`, or the schema generated by `declarativeTemplate()`.
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
18
|
+
export function observerMap(config = {}) {
|
|
19
|
+
return definition => {
|
|
20
|
+
var _a;
|
|
21
|
+
const schema = (_a = config.schema) !== null && _a !== void 0 ? _a : definition.schema;
|
|
22
|
+
const hasTemplateResolver = hasFASTElementTemplateResolver(definition);
|
|
23
|
+
if (schema && !hasTemplateResolver) {
|
|
24
|
+
defineObserverMap(definition, schema, config);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (!hasTemplateResolver) {
|
|
28
|
+
throw new Error("observerMap requires a schema. Pass observerMap({ schema }), provide a schema on the FASTElement definition, or use declarativeTemplate().");
|
|
29
|
+
}
|
|
30
|
+
setDefinitionSchemaTransform(definition, observerMapSchemaTransformKey, ({ definition, schema }) => {
|
|
31
|
+
var _a;
|
|
32
|
+
defineObserverMap(definition, (_a = config.schema) !== null && _a !== void 0 ? _a : schema, config);
|
|
33
|
+
}, observerMapSchemaTransformPriority);
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Determines whether a config entry (or any of its descendants) enables observation.
|
|
38
|
+
* Used to decide whether a root property needs an observable accessor and change handler.
|
|
39
|
+
*/
|
|
40
|
+
function hasObservedPath(entry) {
|
|
41
|
+
if (typeof entry === "boolean") {
|
|
42
|
+
return entry;
|
|
43
|
+
}
|
|
44
|
+
// ObserverMapPathNode
|
|
45
|
+
if (entry.$observe === true) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
for (const key of Object.keys(entry)) {
|
|
49
|
+
if (key === "$observe") {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const child = entry[key];
|
|
53
|
+
if (child !== undefined && hasObservedPath(child)) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// A node with no explicit $observe and no observed children:
|
|
58
|
+
// at the root level the default $observe is true, so a node like `{ }` (no children)
|
|
59
|
+
// is observed. But a node with `$observe: false` and no observed children is not.
|
|
60
|
+
return entry.$observe !== false;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Stamps `$observe` flags onto schema nodes based on the config tree.
|
|
64
|
+
* After this one-time pass the proxy system can check `schema.$observe`
|
|
65
|
+
* instead of needing a separate config parameter threaded through every call.
|
|
66
|
+
*
|
|
67
|
+
* @param schema - A schema node (must have `properties` to recurse)
|
|
68
|
+
* @param entry - The corresponding config path entry
|
|
69
|
+
* @param inherited - The inherited `$observe` value from the parent
|
|
70
|
+
*/
|
|
71
|
+
function applyConfigToSchema(schema, entry, inherited = true) {
|
|
72
|
+
var _a;
|
|
73
|
+
if (entry === false) {
|
|
74
|
+
stampObserveFalse(schema);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (entry === true) {
|
|
78
|
+
// Explicitly observed — no stamp needed (default is observed)
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// ObserverMapPathNode
|
|
82
|
+
const nodeObserve = (_a = entry.$observe) !== null && _a !== void 0 ? _a : inherited;
|
|
83
|
+
if (!nodeObserve) {
|
|
84
|
+
schema.$observe = false;
|
|
85
|
+
}
|
|
86
|
+
if (!(schema === null || schema === void 0 ? void 0 : schema.properties)) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
for (const key of Object.keys(entry)) {
|
|
90
|
+
if (key === "$observe") {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const childEntry = entry[key];
|
|
94
|
+
const childSchema = schema.properties[key];
|
|
95
|
+
// Paths in config but not in schema are silently ignored
|
|
96
|
+
if (childEntry !== undefined && childSchema) {
|
|
97
|
+
applyConfigToSchema(childSchema, childEntry, nodeObserve);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// For properties in the schema that are NOT listed in the config,
|
|
101
|
+
// they inherit the parent's $observe value
|
|
102
|
+
if (!nodeObserve) {
|
|
103
|
+
for (const key of Object.keys(schema.properties)) {
|
|
104
|
+
if (!(key in entry) && schema.properties[key]) {
|
|
105
|
+
stampObserveFalse(schema.properties[key]);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Recursively stamps `$observe: false` on a schema node and all its descendants.
|
|
112
|
+
*/
|
|
113
|
+
function stampObserveFalse(schema) {
|
|
114
|
+
if (!schema) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
schema.$observe = false;
|
|
118
|
+
if (schema.properties) {
|
|
119
|
+
for (const key of Object.keys(schema.properties)) {
|
|
120
|
+
stampObserveFalse(schema.properties[key]);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* ObserverMap provides functionality for caching binding paths, extracting root properties,
|
|
126
|
+
* and defining observable properties on class prototypes
|
|
127
|
+
* @public
|
|
128
|
+
*/
|
|
129
|
+
export class ObserverMap {
|
|
130
|
+
constructor(classPrototype, schema, config) {
|
|
131
|
+
/**
|
|
132
|
+
* Creates a property change handler function for observable properties
|
|
133
|
+
* This handler is called when an observable property transitions from undefined to a defined value
|
|
134
|
+
* @param propertyName - The name of the property for which to create the change handler
|
|
135
|
+
* @param existingChangedMethod - Optional existing changed method to call after the instance resolver logic
|
|
136
|
+
* @returns A function that handles property changes and sets up proxies for object values
|
|
137
|
+
*/
|
|
138
|
+
this.defineChanged = (propertyName, existingChangedMethod) => {
|
|
139
|
+
const getAndAssignObservablesAlias = this.getAndAssignObservables;
|
|
140
|
+
const schema = this.schema;
|
|
141
|
+
function instanceResolverChanged(prev, next) {
|
|
142
|
+
const isObjectAssignment = next !== null && typeof next === "object";
|
|
143
|
+
const isManagedArray = Array.isArray(next) && (next === null || next === void 0 ? void 0 : next.$fastController);
|
|
144
|
+
const shouldAssignProxy = isObjectAssignment && !(next === null || next === void 0 ? void 0 : next.$isProxy) && !isManagedArray;
|
|
145
|
+
const hasExistingProxy = prev !== null && typeof prev === "object" && prev.$isProxy;
|
|
146
|
+
if (shouldAssignProxy) {
|
|
147
|
+
if (hasExistingProxy) {
|
|
148
|
+
deepMerge(prev, next);
|
|
149
|
+
this[`_${propertyName}`] = prev;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this[propertyName] = getAndAssignObservablesAlias(this, propertyName, next, schema);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (!isObjectAssignment) {
|
|
156
|
+
this[propertyName] = next;
|
|
157
|
+
}
|
|
158
|
+
existingChangedMethod === null || existingChangedMethod === void 0 ? void 0 : existingChangedMethod.call(this, prev, next);
|
|
159
|
+
}
|
|
160
|
+
return instanceResolverChanged;
|
|
161
|
+
};
|
|
162
|
+
this.classPrototype = classPrototype;
|
|
163
|
+
this.schema = schema;
|
|
164
|
+
this.config = config;
|
|
165
|
+
}
|
|
166
|
+
defineProperties() {
|
|
167
|
+
var _a;
|
|
168
|
+
const propertyNames = this.schema.getRootProperties();
|
|
169
|
+
const existingAccessors = Observable.getAccessors(this.classPrototype);
|
|
170
|
+
const configProperties = (_a = this.config) === null || _a === void 0 ? void 0 : _a.properties;
|
|
171
|
+
for (const propertyName of propertyNames) {
|
|
172
|
+
// When `properties` is present, skip root properties not listed in the config
|
|
173
|
+
if (configProperties && !(propertyName in configProperties)) {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
// Resolve the config entry for this root property
|
|
177
|
+
const configEntry = configProperties === null || configProperties === void 0 ? void 0 : configProperties[propertyName];
|
|
178
|
+
// Skip root properties explicitly set to `false` with no observed descendants
|
|
179
|
+
if (configEntry === false) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
// Skip ObserverMapPathNode entries with no observed descendants
|
|
183
|
+
if (typeof configEntry === "object" &&
|
|
184
|
+
configEntry !== null &&
|
|
185
|
+
!hasObservedPath(configEntry)) {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
// Stamp $observe flags onto the schema so the proxy system
|
|
189
|
+
// can check schema nodes directly without a separate config tree
|
|
190
|
+
const rootSchema = this.schema.getSchema(propertyName);
|
|
191
|
+
if (configEntry && rootSchema) {
|
|
192
|
+
applyConfigToSchema(rootSchema, configEntry);
|
|
193
|
+
}
|
|
194
|
+
// Skip if property already has an accessor (from `@attr` or `@observable` decorator)
|
|
195
|
+
if (!existingAccessors.some(accessor => accessor.name === propertyName)) {
|
|
196
|
+
Observable.defineProperty(this.classPrototype, propertyName);
|
|
197
|
+
}
|
|
198
|
+
const changedMethodName = `${propertyName}Changed`;
|
|
199
|
+
const existingChangedMethod = this.classPrototype[changedMethodName];
|
|
200
|
+
this.classPrototype[changedMethodName] = this.defineChanged(propertyName, existingChangedMethod);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Creates a proxy for an object that intercepts property mutations and triggers Observable notifications
|
|
205
|
+
* @param target - The target instance that owns the root property
|
|
206
|
+
* @param rootProperty - The name of the root property for notification purposes
|
|
207
|
+
* @param object - The object to wrap with a proxy
|
|
208
|
+
* @param schema - The schema for the element
|
|
209
|
+
* @returns A proxy that triggers notifications on property mutations
|
|
210
|
+
*/
|
|
211
|
+
getAndAssignObservables(target, rootProperty, object, schema) {
|
|
212
|
+
let proxiedObject = object;
|
|
213
|
+
proxiedObject = assignObservables(schema.getSchema(rootProperty), schema.getSchema(rootProperty), proxiedObject, target, rootProperty);
|
|
214
|
+
return proxiedObject;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FAST } from "../platform.js";
|
|
2
|
+
import { debugMessages } from "./debug.js";
|
|
3
|
+
let declarativeRuntimeInstalled = false;
|
|
4
|
+
/**
|
|
5
|
+
* Installs the declarative runtime debug messages.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export function ensureDeclarativeRuntime() {
|
|
9
|
+
if (declarativeRuntimeInstalled) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
FAST.addMessages(debugMessages);
|
|
13
|
+
declarativeRuntimeInstalled = true;
|
|
14
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const defaultSyntax = {
|
|
2
|
+
attributeDirectivePrefix: "f-",
|
|
3
|
+
clientSideCloseExpression: "}",
|
|
4
|
+
clientSideOpenExpression: "{",
|
|
5
|
+
closeExpression: "}}",
|
|
6
|
+
eventArgAccessor: "$e",
|
|
7
|
+
executionContextAccessor: "$c",
|
|
8
|
+
openExpression: "{{",
|
|
9
|
+
unescapedCloseExpression: "}}}",
|
|
10
|
+
unescapedOpenExpression: "{{{",
|
|
11
|
+
repeatDirectiveClose: "</f-repeat>",
|
|
12
|
+
repeatDirectiveOpen: "<f-repeat",
|
|
13
|
+
whenDirectiveClose: "</f-when>",
|
|
14
|
+
whenDirectiveOpen: "<f-when",
|
|
15
|
+
};
|
|
16
|
+
export const attributeDirectivePrefix = defaultSyntax.attributeDirectivePrefix;
|
|
17
|
+
export const clientSideCloseExpression = defaultSyntax.clientSideCloseExpression;
|
|
18
|
+
export const clientSideOpenExpression = defaultSyntax.clientSideOpenExpression;
|
|
19
|
+
export const closeExpression = defaultSyntax.closeExpression;
|
|
20
|
+
/**
|
|
21
|
+
* Event argument accessor for declarative event bindings.
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
export const eventArgAccessor = defaultSyntax.eventArgAccessor;
|
|
25
|
+
/**
|
|
26
|
+
* Execution context accessor for declarative event bindings.
|
|
27
|
+
* @public
|
|
28
|
+
*/
|
|
29
|
+
export const executionContextAccessor = defaultSyntax.executionContextAccessor;
|
|
30
|
+
export const openExpression = defaultSyntax.openExpression;
|
|
31
|
+
export const repeatDirectiveClose = defaultSyntax.repeatDirectiveClose;
|
|
32
|
+
export const repeatDirectiveOpen = defaultSyntax.repeatDirectiveOpen;
|
|
33
|
+
export const unescapedCloseExpression = defaultSyntax.unescapedCloseExpression;
|
|
34
|
+
export const unescapedOpenExpression = defaultSyntax.unescapedOpenExpression;
|
|
35
|
+
export const whenDirectiveClose = defaultSyntax.whenDirectiveClose;
|
|
36
|
+
export const whenDirectiveOpen = defaultSyntax.whenDirectiveOpen;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { FAST } from "../platform.js";
|
|
2
|
+
import { Message } from "./interfaces.js";
|
|
3
|
+
/**
|
|
4
|
+
* Coordinates declarative template publishers and FAST element definitions.
|
|
5
|
+
* Requests are keyed by registry + element name so scoped registries can
|
|
6
|
+
* resolve templates independently.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export class DeclarativeTemplateBridge {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.buckets = new WeakMap();
|
|
12
|
+
}
|
|
13
|
+
requestTemplate(definition) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const bucket = this.getBucket(definition.registry, definition.name, true);
|
|
16
|
+
const request = {
|
|
17
|
+
definition,
|
|
18
|
+
settled: false,
|
|
19
|
+
resolve,
|
|
20
|
+
reject,
|
|
21
|
+
};
|
|
22
|
+
bucket.requests.add(request);
|
|
23
|
+
this.processBucket(definition.registry, definition.name);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
registerPublisher(registry, name, publisher) {
|
|
27
|
+
if (!name) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const bucket = this.getBucket(registry, name, true);
|
|
31
|
+
bucket.publishers.add(publisher);
|
|
32
|
+
this.processBucket(registry, name);
|
|
33
|
+
}
|
|
34
|
+
unregisterPublisher(registry, name, publisher) {
|
|
35
|
+
if (!name) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const bucket = this.getBucket(registry, name);
|
|
39
|
+
if (!bucket) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
bucket.publishers.delete(publisher);
|
|
43
|
+
this.resetPublisherRequests(bucket, publisher);
|
|
44
|
+
this.processBucket(registry, name);
|
|
45
|
+
this.cleanupBucket(registry, name, bucket);
|
|
46
|
+
}
|
|
47
|
+
movePublisher(registry, previousName, nextName, publisher) {
|
|
48
|
+
if (previousName === nextName) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this.unregisterPublisher(registry, previousName, publisher);
|
|
52
|
+
this.registerPublisher(registry, nextName, publisher);
|
|
53
|
+
}
|
|
54
|
+
getBucket(registry, name, create = false) {
|
|
55
|
+
let bucketsByName = this.buckets.get(registry);
|
|
56
|
+
if (!bucketsByName) {
|
|
57
|
+
if (!create) {
|
|
58
|
+
return void 0;
|
|
59
|
+
}
|
|
60
|
+
bucketsByName = new Map();
|
|
61
|
+
this.buckets.set(registry, bucketsByName);
|
|
62
|
+
}
|
|
63
|
+
let bucket = bucketsByName.get(name);
|
|
64
|
+
if (!bucket && create) {
|
|
65
|
+
bucket = {
|
|
66
|
+
publishers: new Set(),
|
|
67
|
+
requests: new Set(),
|
|
68
|
+
};
|
|
69
|
+
bucketsByName.set(name, bucket);
|
|
70
|
+
}
|
|
71
|
+
return bucket;
|
|
72
|
+
}
|
|
73
|
+
processBucket(registry, name) {
|
|
74
|
+
const bucket = this.getBucket(registry, name);
|
|
75
|
+
if (!bucket) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const publishers = [...bucket.publishers];
|
|
79
|
+
if (publishers.length > 1) {
|
|
80
|
+
const error = FAST.error(Message.moreThanOneMatchingTemplateProvided, {
|
|
81
|
+
name,
|
|
82
|
+
});
|
|
83
|
+
for (const request of [...bucket.requests]) {
|
|
84
|
+
this.rejectRequest(registry, name, bucket, request, error);
|
|
85
|
+
}
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (publishers.length === 0) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const [publisher] = publishers;
|
|
92
|
+
for (const request of bucket.requests) {
|
|
93
|
+
if (request.settled) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (request.publisher === publisher && request.publishing) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
request.publisher = publisher;
|
|
100
|
+
request.publishing = Promise.resolve()
|
|
101
|
+
.then(() => publisher.publishTemplate(request.definition))
|
|
102
|
+
.then(template => {
|
|
103
|
+
if (request.settled) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const currentBucket = this.getBucket(registry, name);
|
|
107
|
+
if (!(currentBucket === null || currentBucket === void 0 ? void 0 : currentBucket.publishers.has(publisher))) {
|
|
108
|
+
request.publisher = void 0;
|
|
109
|
+
request.publishing = void 0;
|
|
110
|
+
this.processBucket(registry, name);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.resolveRequest(registry, name, currentBucket, request, template);
|
|
114
|
+
})
|
|
115
|
+
.catch(error => {
|
|
116
|
+
if (request.settled) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const currentBucket = this.getBucket(registry, name);
|
|
120
|
+
if (!currentBucket) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.rejectRequest(registry, name, currentBucket, request, error);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
resetPublisherRequests(bucket, publisher) {
|
|
128
|
+
for (const request of bucket.requests) {
|
|
129
|
+
if (request.publisher !== publisher) {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
request.publisher = void 0;
|
|
133
|
+
request.publishing = void 0;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
resolveRequest(registry, name, bucket, request, template) {
|
|
137
|
+
if (request.settled) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
request.settled = true;
|
|
141
|
+
request.publisher = void 0;
|
|
142
|
+
request.publishing = void 0;
|
|
143
|
+
bucket.requests.delete(request);
|
|
144
|
+
this.cleanupBucket(registry, name, bucket);
|
|
145
|
+
request.resolve(template);
|
|
146
|
+
}
|
|
147
|
+
rejectRequest(registry, name, bucket, request, error) {
|
|
148
|
+
if (request.settled) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
request.settled = true;
|
|
152
|
+
request.publisher = void 0;
|
|
153
|
+
request.publishing = void 0;
|
|
154
|
+
bucket.requests.delete(request);
|
|
155
|
+
this.cleanupBucket(registry, name, bucket);
|
|
156
|
+
request.reject(error);
|
|
157
|
+
}
|
|
158
|
+
cleanupBucket(registry, name, bucket) {
|
|
159
|
+
if (bucket.publishers.size > 0 || bucket.requests.size > 0) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const bucketsByName = this.buckets.get(registry);
|
|
163
|
+
bucketsByName === null || bucketsByName === void 0 ? void 0 : bucketsByName.delete(name);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Shared template bridge storage for the current FAST runtime.
|
|
168
|
+
* @internal
|
|
169
|
+
*/
|
|
170
|
+
export const declarativeTemplateBridge = new DeclarativeTemplateBridge();
|