@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,288 @@
|
|
|
1
|
+
# Rendering Lifecycle
|
|
2
|
+
|
|
3
|
+
This document describes the declarative rendering lifecycle inside
|
|
4
|
+
`@microsoft/fast-element`.
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
The FAST Element rendering lifecycle involves a coordinated process between the
|
|
9
|
+
core runtime and its declarative entrypoint:
|
|
10
|
+
|
|
11
|
+
- **`@microsoft/fast-element`**: Provides the core `FASTElement` base class and
|
|
12
|
+
element definition system.
|
|
13
|
+
- **`@microsoft/fast-element/declarative.js`**: Provides the `f-template`
|
|
14
|
+
custom element that processes HTML templates and attaches them to FAST
|
|
15
|
+
elements as a `ViewTemplate` in lieu of an `html` template created during
|
|
16
|
+
`FASTElement.define()`. The preferred path uses `declarativeTemplate()` so
|
|
17
|
+
`FASTElement.define()` waits for the matching declarative template and keeps
|
|
18
|
+
the definition concrete before registration completes.
|
|
19
|
+
|
|
20
|
+
## Lifecycle Phases
|
|
21
|
+
|
|
22
|
+
Given a DOM which includes an `f-template` and a component:
|
|
23
|
+
|
|
24
|
+
```html
|
|
25
|
+
<my-component text="Hello World">
|
|
26
|
+
<template shadowrootmode="open">
|
|
27
|
+
<h1><!--fe:b-->Hello World<!--fe:/b--></h1>
|
|
28
|
+
</template>
|
|
29
|
+
</my-component>
|
|
30
|
+
|
|
31
|
+
<f-template name="my-component">
|
|
32
|
+
<template>
|
|
33
|
+
<h1>{{text}}</h1>
|
|
34
|
+
</template>
|
|
35
|
+
</f-template>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The following phases will then be kicked off once the JavaScript is parsed.
|
|
39
|
+
|
|
40
|
+
### Phase 1: Definition Resolution
|
|
41
|
+
|
|
42
|
+
Custom elements begin their lifecycle by composing a definition that points at
|
|
43
|
+
`declarativeTemplate()`. The resolver waits for a matching declarative template
|
|
44
|
+
and returns a concrete `ViewTemplate` before the platform registration step.
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// Custom element class definition
|
|
48
|
+
class MyComponent extends FASTElement {
|
|
49
|
+
@attr text: string = "";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Register with the declarative template bridge
|
|
53
|
+
await MyComponent.define({
|
|
54
|
+
name: "my-component",
|
|
55
|
+
template: declarativeTemplate(),
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Key characteristics of this phase:
|
|
60
|
+
- The element definition stays unresolved until a matching declarative template is available
|
|
61
|
+
- The resolved template is concrete before platform registration completes
|
|
62
|
+
|
|
63
|
+
### Phase 2: Declarative Template Bridge
|
|
64
|
+
|
|
65
|
+
`declarativeTemplate()` from `@microsoft/fast-element/declarative.js`
|
|
66
|
+
automatically ensures that `f-template` is defined in the same registry as the
|
|
67
|
+
FAST element being composed.
|
|
68
|
+
|
|
69
|
+
### Phase 3: Template Processing and Attachment
|
|
70
|
+
|
|
71
|
+
When an `f-template` element is connected to the DOM, it initiates the template attachment process.
|
|
72
|
+
|
|
73
|
+
The lifecycle flow during this phase:
|
|
74
|
+
|
|
75
|
+
1. **Template Discovery**: The resolver waits for a matching
|
|
76
|
+
`<f-template name="...">` in the same registry as the element definition.
|
|
77
|
+
2. **Template Element Connection**: The matching `f-template` element's
|
|
78
|
+
`connectedCallback()` registers it with the declarative template bridge.
|
|
79
|
+
3. **Template Processing**: The bridge reads and transforms the markup, builds
|
|
80
|
+
the schema, applies `observerMap()` / `attributeMap()` behavior, and resolves
|
|
81
|
+
data bindings, directives, and other template features into the `ViewTemplate`
|
|
82
|
+
model which is also used by the `@microsoft/fast-element` `html` tag template.
|
|
83
|
+
4. **Template Attachment**: The concrete `ViewTemplate` is returned to
|
|
84
|
+
`FASTElement.define()`, which assigns it to the definition before platform
|
|
85
|
+
registration completes.
|
|
86
|
+
|
|
87
|
+
### Phase 4: Composition Completion
|
|
88
|
+
|
|
89
|
+
Once the template is attached to the partial definition, the element completes its composition:
|
|
90
|
+
|
|
91
|
+
1. **`compose()` Execution**: The element definition internally completes its composition process
|
|
92
|
+
2. **Platform Registration**: The completed element definition is fully registered with the platform's custom element registry
|
|
93
|
+
|
|
94
|
+
### Phase 5: Element Instantiation and Hydration
|
|
95
|
+
|
|
96
|
+
When custom elements are instantiated in the DOM, the following occurs:
|
|
97
|
+
|
|
98
|
+
1. **Element Creation**: The platform creates instances of the custom element
|
|
99
|
+
2. **Prerendered Content Detection**: `ElementController` detects the existing shadow root from SSR — `isPrerendered` resolves `true`
|
|
100
|
+
3. **Hydration Check**: If `enableHydration()` was called and the template is hydratable, the element hydrates — `isHydrated` resolves `true`. Otherwise it falls back to client-side rendering.
|
|
101
|
+
4. **Concrete Template Ready**: Because `declarativeTemplate()` resolved during
|
|
102
|
+
definition, `connect()` starts with the final template already attached.
|
|
103
|
+
5. **Hydration**: `ElementController` uses `template.hydrate()` to create a
|
|
104
|
+
`HydrationView` that maps existing DOM nodes to binding targets using `fe:b`
|
|
105
|
+
/ `fe:/b` markers
|
|
106
|
+
|
|
107
|
+
The DOM after hydration should look like this:
|
|
108
|
+
|
|
109
|
+
```html
|
|
110
|
+
<my-component text="Hello World">
|
|
111
|
+
<template shadowrootmode="open">
|
|
112
|
+
<h1><!---->Hello World<!----></h1>
|
|
113
|
+
</template>
|
|
114
|
+
</my-component>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Key Integration Points
|
|
118
|
+
|
|
119
|
+
### Fast Element Registry
|
|
120
|
+
|
|
121
|
+
The `fastElementRegistry` serves as the central coordination point between the two packages:
|
|
122
|
+
|
|
123
|
+
- Stores partial element definitions created by `define()`
|
|
124
|
+
- Provides lookup mechanism via `register()` for template attachment
|
|
125
|
+
- Maintains the registry of all FAST element definitions
|
|
126
|
+
|
|
127
|
+
### Observable Pattern
|
|
128
|
+
|
|
129
|
+
Both packages use the Observable pattern for coordination:
|
|
130
|
+
|
|
131
|
+
- `FASTElementDefinition.register()` uses `Observable.getNotifier()` to notify when elements are registered
|
|
132
|
+
- Template attachment triggers observable notifications to complete the lifecycle
|
|
133
|
+
|
|
134
|
+
## Error Handling
|
|
135
|
+
|
|
136
|
+
The lifecycle includes error handling for missing components:
|
|
137
|
+
|
|
138
|
+
- Template elements throw errors if no corresponding element definition is found
|
|
139
|
+
- Element definitions can exist without templates (partial state)
|
|
140
|
+
|
|
141
|
+
## Performance Considerations
|
|
142
|
+
|
|
143
|
+
The asynchronous nature of the lifecycle provides several performance benefits:
|
|
144
|
+
|
|
145
|
+
- **Progressive Enhancement**: Elements can be registered before templates are loaded
|
|
146
|
+
- **Code Splitting**: Templates can be loaded separately from element definitions
|
|
147
|
+
- **Reduced Blocking**: Template processing doesn't block element registration
|
|
148
|
+
- **Hydration Optimization**: Server-side rendered content can be hydrated efficiently
|
|
149
|
+
|
|
150
|
+
This coordinated lifecycle enables powerful scenarios like server-side rendering, progressive enhancement, and dynamic template loading while maintaining the reactive capabilities of FAST Element.
|
|
151
|
+
|
|
152
|
+
## Lifecycle Callbacks
|
|
153
|
+
|
|
154
|
+
FAST HTML provides a set of lifecycle callbacks that allow you to hook into various stages of the rendering and hydration process. These callbacks are particularly useful for performance monitoring, debugging, analytics, and coordinating initialization sequences.
|
|
155
|
+
|
|
156
|
+
### Available Callbacks
|
|
157
|
+
|
|
158
|
+
The lifecycle callbacks are split between two APIs:
|
|
159
|
+
|
|
160
|
+
**Per-element callbacks** — passed to `declarativeTemplate()`:
|
|
161
|
+
- `elementDidRegister(name: string)` - Called after the JavaScript class definition has been registered as a partial definition
|
|
162
|
+
- `templateWillUpdate(name: string)` - Called before the template has been evaluated and assigned to the definition
|
|
163
|
+
- `templateDidUpdate(name: string)` - Called after the template has been assigned to the definition
|
|
164
|
+
- `elementDidDefine(name: string)` - Called after the custom element has been fully defined with the platform
|
|
165
|
+
- `elementWillHydrate(source: HTMLElement)` - Called before an element begins hydration
|
|
166
|
+
- `elementDidHydrate(source: HTMLElement)` - Called after an element completes hydration
|
|
167
|
+
|
|
168
|
+
**Global hydration callbacks** — passed to `enableHydration()`:
|
|
169
|
+
- `hydrationStarted()` - Called once when the first prerendered element begins hydrating
|
|
170
|
+
- `hydrationComplete()` - Called once after all prerendered elements have completed hydration
|
|
171
|
+
|
|
172
|
+
The `hydrationComplete` callback fires only after every prerendered element has finished binding.
|
|
173
|
+
|
|
174
|
+
### Callback Execution Order
|
|
175
|
+
|
|
176
|
+
The callbacks execute in the following sequence for each element:
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
Registration Phase:
|
|
180
|
+
1. elementDidRegister(name)
|
|
181
|
+
|
|
182
|
+
Template Processing Phase (asynchronous):
|
|
183
|
+
2. templateWillUpdate(name)
|
|
184
|
+
3. [Template processing occurs]
|
|
185
|
+
4. templateDidUpdate(name)
|
|
186
|
+
5. elementDidDefine(name)
|
|
187
|
+
|
|
188
|
+
Hydration Phase (per element, only when enableHydration() has been called):
|
|
189
|
+
6. hydrationStarted() [once, on first element]
|
|
190
|
+
7. elementWillHydrate(source)
|
|
191
|
+
8. [Hydration occurs]
|
|
192
|
+
9. elementDidHydrate(source)
|
|
193
|
+
|
|
194
|
+
Completion (called once for all elements):
|
|
195
|
+
10. hydrationComplete()
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Important:** Template processing is asynchronous and happens independently for each element. When multiple elements are being processed, the template and hydration callbacks can be interleaved across different elements.
|
|
199
|
+
|
|
200
|
+
### Configuring Callbacks
|
|
201
|
+
|
|
202
|
+
Hydration must be explicitly opted into by calling `enableHydration()`. Per-element
|
|
203
|
+
callbacks are passed directly to `declarativeTemplate()`:
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
import { declarativeTemplate } from "@microsoft/fast-element/declarative.js";
|
|
207
|
+
import { enableHydration } from "@microsoft/fast-element/hydration.js";
|
|
208
|
+
|
|
209
|
+
// Global hydration events
|
|
210
|
+
enableHydration({
|
|
211
|
+
hydrationStarted() {
|
|
212
|
+
console.log("Hydration started");
|
|
213
|
+
},
|
|
214
|
+
hydrationComplete() {
|
|
215
|
+
console.log("All elements hydrated");
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// Per-element lifecycle callbacks
|
|
220
|
+
MyComponent.define({
|
|
221
|
+
name: "my-component",
|
|
222
|
+
template: declarativeTemplate({
|
|
223
|
+
elementDidRegister(name) {
|
|
224
|
+
console.log(`${name} registered`);
|
|
225
|
+
},
|
|
226
|
+
templateWillUpdate(name) {
|
|
227
|
+
console.log(`${name} template updating`);
|
|
228
|
+
},
|
|
229
|
+
templateDidUpdate(name) {
|
|
230
|
+
console.log(`${name} template updated`);
|
|
231
|
+
},
|
|
232
|
+
elementDidDefine(name) {
|
|
233
|
+
console.log(`${name} fully defined`);
|
|
234
|
+
},
|
|
235
|
+
elementWillHydrate(source) {
|
|
236
|
+
console.log(`${source.localName} starting hydration`);
|
|
237
|
+
},
|
|
238
|
+
elementDidHydrate(source) {
|
|
239
|
+
console.log(`${source.localName} hydrated`);
|
|
240
|
+
},
|
|
241
|
+
}),
|
|
242
|
+
});
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Use Cases
|
|
246
|
+
|
|
247
|
+
**Performance Monitoring:**
|
|
248
|
+
```typescript
|
|
249
|
+
import { declarativeTemplate } from "@microsoft/fast-element/declarative.js";
|
|
250
|
+
import { enableHydration } from "@microsoft/fast-element/hydration.js";
|
|
251
|
+
|
|
252
|
+
enableHydration({
|
|
253
|
+
hydrationComplete() {
|
|
254
|
+
const measures = performance.getEntriesByType("measure");
|
|
255
|
+
// Send metrics to analytics
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
MyComponent.define({
|
|
260
|
+
name: "my-component",
|
|
261
|
+
template: declarativeTemplate({
|
|
262
|
+
elementWillHydrate(source) {
|
|
263
|
+
performance.mark(`${source.localName}-hydration-start`);
|
|
264
|
+
},
|
|
265
|
+
elementDidHydrate(source) {
|
|
266
|
+
performance.mark(`${source.localName}-hydration-end`);
|
|
267
|
+
performance.measure(
|
|
268
|
+
`${source.localName}-hydration`,
|
|
269
|
+
`${source.localName}-hydration-start`,
|
|
270
|
+
`${source.localName}-hydration-end`,
|
|
271
|
+
);
|
|
272
|
+
},
|
|
273
|
+
}),
|
|
274
|
+
});
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
**Loading State Management:**
|
|
278
|
+
```typescript
|
|
279
|
+
enableHydration({
|
|
280
|
+
hydrationStarted() {
|
|
281
|
+
document.body.classList.add("hydrating");
|
|
282
|
+
},
|
|
283
|
+
hydrationComplete() {
|
|
284
|
+
document.body.classList.remove("hydrating");
|
|
285
|
+
document.body.classList.add("interactive");
|
|
286
|
+
},
|
|
287
|
+
});
|
|
288
|
+
```
|