@microsoft/fast-element 2.10.3 → 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.
Files changed (351) hide show
  1. package/ARCHITECTURE_HTML_TAGGED_TEMPLATE_LITERAL.md +1 -1
  2. package/ARCHITECTURE_OVERVIEW.md +2 -2
  3. package/CHANGELOG.json +31 -1
  4. package/CHANGELOG.md +10 -2
  5. package/DECLARATIVE_DESIGN.md +806 -0
  6. package/DECLARATIVE_HTML.md +470 -0
  7. package/DECLARATIVE_MIGRATION.md +215 -0
  8. package/DECLARATIVE_RENDERING.md +530 -0
  9. package/DECLARATIVE_RENDERING_LIFECYCLE.md +288 -0
  10. package/DECLARATIVE_SCHEMA_OBSERVER_MAP.md +489 -0
  11. package/DESIGN.md +143 -34
  12. package/MIGRATION.md +387 -0
  13. package/README.md +208 -1
  14. package/SIZES.md +25 -0
  15. package/api-extractor.arrays.json +15 -0
  16. package/api-extractor.context.json +1 -0
  17. package/api-extractor.declarative.json +15 -0
  18. package/api-extractor.di.json +1 -0
  19. package/api-extractor.hydration.json +15 -0
  20. package/api-extractor.styles.json +15 -0
  21. package/dist/arrays/arrays.api.json +2621 -0
  22. package/dist/context/context.api.json +1 -1
  23. package/dist/declarative/declarative.api.json +7844 -0
  24. package/dist/di/di.api.json +2 -2
  25. package/dist/dts/array-observer.d.ts +2 -0
  26. package/dist/dts/arrays.d.ts +2 -0
  27. package/dist/dts/attr.d.ts +1 -0
  28. package/dist/dts/binding/signal.d.ts +6 -6
  29. package/dist/dts/binding/two-way.d.ts +1 -0
  30. package/dist/dts/binding.d.ts +7 -0
  31. package/dist/dts/components/attributes.d.ts +2 -5
  32. package/dist/dts/components/definition-schema-transforms.d.ts +9 -0
  33. package/dist/dts/components/element-controller.d.ts +80 -114
  34. package/dist/dts/components/element-hydration.d.ts +1 -1
  35. package/dist/dts/components/enable-hydration.d.ts +34 -0
  36. package/dist/dts/components/fast-definitions.d.ts +91 -42
  37. package/dist/dts/components/fast-element.d.ts +5 -8
  38. package/dist/dts/components/hydration-tracker.d.ts +40 -0
  39. package/dist/dts/components/hydration.d.ts +18 -53
  40. package/dist/dts/components/schema.d.ts +205 -0
  41. package/dist/dts/context.d.ts +6 -6
  42. package/dist/dts/css.d.ts +3 -0
  43. package/dist/dts/debug.d.ts +5 -1
  44. package/dist/dts/declarative/attribute-map.d.ts +58 -0
  45. package/dist/dts/declarative/debug.d.ts +5 -0
  46. package/dist/dts/declarative/index.d.ts +13 -0
  47. package/dist/dts/declarative/interfaces.d.ts +9 -0
  48. package/dist/dts/declarative/observer-map-utilities.d.ts +58 -0
  49. package/dist/dts/declarative/observer-map.d.ts +89 -0
  50. package/dist/dts/declarative/runtime.d.ts +5 -0
  51. package/dist/dts/declarative/syntax.d.ts +21 -0
  52. package/dist/dts/declarative/template-bridge.d.ts +33 -0
  53. package/dist/dts/declarative/template-parser.d.ts +98 -0
  54. package/dist/dts/declarative/template.d.ts +9 -0
  55. package/dist/dts/declarative/utilities.d.ts +312 -0
  56. package/dist/dts/di/di.d.ts +1 -1
  57. package/dist/dts/directives/children.d.ts +2 -0
  58. package/dist/dts/directives/node-observation.d.ts +2 -0
  59. package/dist/dts/directives/ref.d.ts +2 -0
  60. package/dist/dts/directives/repeat.d.ts +4 -0
  61. package/dist/dts/directives/slotted.d.ts +2 -0
  62. package/dist/dts/directives/when.d.ts +3 -0
  63. package/dist/dts/dom-policy.d.ts +1 -1
  64. package/dist/dts/html.d.ts +5 -0
  65. package/dist/dts/hydration/runtime.d.ts +7 -0
  66. package/dist/dts/hydration/target-builder.d.ts +15 -12
  67. package/dist/dts/hydration.d.ts +14 -0
  68. package/dist/dts/index.d.ts +38 -42
  69. package/dist/dts/index.debug.d.ts +0 -1
  70. package/dist/dts/index.rollup.debug.d.ts +0 -1
  71. package/dist/dts/interfaces.d.ts +1 -49
  72. package/dist/dts/observable.d.ts +3 -6
  73. package/dist/dts/observation/arrays.d.ts +1 -1
  74. package/dist/dts/observation/update-queue.d.ts +1 -1
  75. package/dist/dts/platform.d.ts +25 -4
  76. package/dist/dts/render.d.ts +7 -0
  77. package/dist/dts/schema.d.ts +1 -0
  78. package/dist/dts/state/exports.d.ts +1 -1
  79. package/dist/dts/state/state.d.ts +2 -2
  80. package/dist/dts/styles/css-directive.d.ts +5 -12
  81. package/dist/dts/styles/css.d.ts +5 -7
  82. package/dist/dts/styles/element-styles.d.ts +0 -10
  83. package/dist/dts/styles.d.ts +6 -0
  84. package/dist/dts/templating/children.d.ts +1 -1
  85. package/dist/dts/templating/html-binding-directive.d.ts +10 -0
  86. package/dist/dts/templating/html-directive.d.ts +17 -0
  87. package/dist/dts/templating/hydration-view.d.ts +109 -0
  88. package/dist/dts/templating/ref.d.ts +1 -1
  89. package/dist/dts/templating/render.d.ts +8 -2
  90. package/dist/dts/templating/repeat.d.ts +2 -2
  91. package/dist/dts/templating/slotted.d.ts +1 -1
  92. package/dist/dts/templating/template.d.ts +17 -9
  93. package/dist/dts/templating/view.d.ts +25 -102
  94. package/dist/dts/templating/when.d.ts +1 -1
  95. package/dist/dts/templating.d.ts +10 -0
  96. package/dist/dts/testing/exports.d.ts +2 -2
  97. package/dist/dts/tsdoc-metadata.json +1 -1
  98. package/dist/dts/updates.d.ts +1 -0
  99. package/dist/dts/volatile.d.ts +2 -0
  100. package/dist/esm/array-observer.js +1 -0
  101. package/dist/esm/arrays.js +1 -0
  102. package/dist/esm/attr.js +1 -0
  103. package/dist/esm/binding/normalize.js +1 -1
  104. package/dist/esm/binding/signal.js +4 -4
  105. package/dist/esm/binding/two-way.js +2 -1
  106. package/dist/esm/binding.js +4 -0
  107. package/dist/esm/components/attributes.js +8 -5
  108. package/dist/esm/components/definition-schema-transforms.js +23 -0
  109. package/dist/esm/components/element-controller.js +200 -269
  110. package/dist/esm/components/element-hydration.js +1 -1
  111. package/dist/esm/components/enable-hydration.js +100 -0
  112. package/dist/esm/components/fast-definitions.js +211 -49
  113. package/dist/esm/components/fast-element.js +18 -27
  114. package/dist/esm/components/hydration-tracker.js +93 -0
  115. package/dist/esm/components/hydration.js +62 -144
  116. package/dist/esm/components/schema.js +253 -0
  117. package/dist/esm/context.js +6 -6
  118. package/dist/esm/css.js +3 -0
  119. package/dist/esm/debug.js +26 -26
  120. package/dist/esm/declarative/attribute-map.js +121 -0
  121. package/dist/esm/declarative/debug.js +5 -0
  122. package/dist/esm/declarative/index.js +3 -0
  123. package/dist/esm/declarative/interfaces.js +10 -0
  124. package/dist/esm/declarative/observer-map-utilities.js +562 -0
  125. package/dist/esm/declarative/observer-map.js +216 -0
  126. package/dist/esm/declarative/runtime.js +14 -0
  127. package/dist/esm/declarative/syntax.js +36 -0
  128. package/dist/esm/declarative/template-bridge.js +170 -0
  129. package/dist/esm/declarative/template-parser.js +306 -0
  130. package/dist/esm/declarative/template.js +142 -0
  131. package/dist/esm/declarative/utilities.js +834 -0
  132. package/dist/esm/di/di.js +6 -8
  133. package/dist/esm/directives/children.js +1 -0
  134. package/dist/esm/directives/node-observation.js +1 -0
  135. package/dist/esm/directives/ref.js +1 -0
  136. package/dist/esm/directives/repeat.js +1 -0
  137. package/dist/esm/directives/slotted.js +1 -0
  138. package/dist/esm/directives/when.js +1 -0
  139. package/dist/esm/dom-policy.js +2 -2
  140. package/dist/esm/dom.js +1 -1
  141. package/dist/esm/html.js +2 -0
  142. package/dist/esm/hydration/runtime.js +33 -0
  143. package/dist/esm/hydration/target-builder.js +97 -90
  144. package/dist/esm/hydration.js +4 -0
  145. package/dist/esm/index.debug.js +2 -1
  146. package/dist/esm/index.js +34 -29
  147. package/dist/esm/index.rollup.debug.js +3 -2
  148. package/dist/esm/index.rollup.js +1 -1
  149. package/dist/esm/interfaces.js +1 -45
  150. package/dist/esm/observable.js +1 -4
  151. package/dist/esm/observation/arrays.js +1 -1
  152. package/dist/esm/observation/observable.js +5 -5
  153. package/dist/esm/observation/update-queue.js +47 -58
  154. package/dist/esm/platform.js +31 -30
  155. package/dist/esm/render.js +1 -0
  156. package/dist/esm/schema.js +1 -0
  157. package/dist/esm/state/exports.js +1 -1
  158. package/dist/esm/styles/css-directive.js +1 -2
  159. package/dist/esm/styles/css.js +15 -56
  160. package/dist/esm/styles/element-styles.js +69 -15
  161. package/dist/esm/styles.js +2 -0
  162. package/dist/esm/templating/html-binding-directive.js +24 -10
  163. package/dist/esm/templating/hydration-view.js +235 -0
  164. package/dist/esm/templating/render.js +13 -2
  165. package/dist/esm/templating/repeat.js +36 -34
  166. package/dist/esm/templating/template.js +7 -7
  167. package/dist/esm/templating/view.js +24 -233
  168. package/dist/esm/templating.js +7 -0
  169. package/dist/esm/testing/exports.js +2 -2
  170. package/dist/esm/updates.js +1 -0
  171. package/dist/esm/volatile.js +1 -0
  172. package/dist/fast-element.api.json +9017 -6996
  173. package/dist/fast-element.d.ts +3557 -796
  174. package/dist/fast-element.debug.js +5093 -4419
  175. package/dist/fast-element.debug.min.js +2 -2
  176. package/dist/fast-element.js +5398 -4655
  177. package/dist/fast-element.min.js +2 -2
  178. package/dist/fast-element.untrimmed.d.ts +881 -481
  179. package/dist/hydration/hydration.api.json +5237 -0
  180. package/dist/styles/styles.api.json +2672 -0
  181. package/docs/api-report.api.md +344 -167
  182. package/docs/arrays/api-report.api.md +114 -0
  183. package/docs/declarative/api-report.api.md +397 -0
  184. package/docs/hydration/api-report.api.md +285 -0
  185. package/docs/styles/api-report.api.md +135 -0
  186. package/package.json +149 -40
  187. package/playwright.declarative.config.ts +26 -0
  188. package/playwright.declarative.webui.config.ts +20 -0
  189. package/scripts/declarative/build-fixtures-with-webui.js +135 -0
  190. package/scripts/declarative/build-fixtures.js +49 -0
  191. package/scripts/declarative/build-fixtures.utilities.js +101 -0
  192. package/scripts/measure-sizes.js +219 -0
  193. package/scripts/run-api-extractor.js +39 -20
  194. package/test/declarative/fixtures/README.md +72 -0
  195. package/test/declarative/fixtures/WRITING_FIXTURES.md +330 -0
  196. package/test/declarative/fixtures/bindings/README.md +12 -0
  197. package/test/declarative/fixtures/bindings/attribute/entry.html +13 -0
  198. package/test/declarative/fixtures/bindings/attribute/fast-build.config.json +6 -0
  199. package/test/declarative/fixtures/bindings/attribute/index.html +25 -0
  200. package/test/declarative/fixtures/bindings/attribute/main.ts +41 -0
  201. package/test/declarative/fixtures/bindings/attribute/state.json +8 -0
  202. package/test/declarative/fixtures/bindings/attribute/templates.html +11 -0
  203. package/test/declarative/fixtures/bindings/content/entry.html +12 -0
  204. package/test/declarative/fixtures/bindings/content/fast-build.config.json +6 -0
  205. package/test/declarative/fixtures/bindings/content/index.html +19 -0
  206. package/test/declarative/fixtures/bindings/content/main.ts +27 -0
  207. package/test/declarative/fixtures/bindings/content/state.json +4 -0
  208. package/test/declarative/fixtures/bindings/content/templates.html +6 -0
  209. package/test/declarative/fixtures/bindings/dot-syntax/entry.html +11 -0
  210. package/test/declarative/fixtures/bindings/dot-syntax/fast-build.config.json +6 -0
  211. package/test/declarative/fixtures/bindings/dot-syntax/index.html +47 -0
  212. package/test/declarative/fixtures/bindings/dot-syntax/main.ts +59 -0
  213. package/test/declarative/fixtures/bindings/dot-syntax/state.json +16 -0
  214. package/test/declarative/fixtures/bindings/dot-syntax/templates.html +17 -0
  215. package/test/declarative/fixtures/bindings/event/entry.html +11 -0
  216. package/test/declarative/fixtures/bindings/event/fast-build.config.json +6 -0
  217. package/test/declarative/fixtures/bindings/event/index.html +43 -0
  218. package/test/declarative/fixtures/bindings/event/main.ts +43 -0
  219. package/test/declarative/fixtures/bindings/event/state.json +3 -0
  220. package/test/declarative/fixtures/bindings/event/templates.html +18 -0
  221. package/test/declarative/fixtures/bindings/host/entry.html +40 -0
  222. package/test/declarative/fixtures/bindings/host/fast-build.config.json +6 -0
  223. package/test/declarative/fixtures/bindings/host/index.html +96 -0
  224. package/test/declarative/fixtures/bindings/host/main.ts +222 -0
  225. package/test/declarative/fixtures/bindings/host/state.json +9 -0
  226. package/test/declarative/fixtures/bindings/host/templates.html +55 -0
  227. package/test/declarative/fixtures/directives/README.md +12 -0
  228. package/test/declarative/fixtures/directives/children/entry.html +11 -0
  229. package/test/declarative/fixtures/directives/children/fast-build.config.json +6 -0
  230. package/test/declarative/fixtures/directives/children/index.html +15 -0
  231. package/test/declarative/fixtures/directives/children/main.ts +22 -0
  232. package/test/declarative/fixtures/directives/children/state.json +3 -0
  233. package/test/declarative/fixtures/directives/children/templates.html +3 -0
  234. package/test/declarative/fixtures/directives/ref/entry.html +11 -0
  235. package/test/declarative/fixtures/directives/ref/fast-build.config.json +6 -0
  236. package/test/declarative/fixtures/directives/ref/index.html +15 -0
  237. package/test/declarative/fixtures/directives/ref/main.ts +17 -0
  238. package/test/declarative/fixtures/directives/ref/state.json +1 -0
  239. package/test/declarative/fixtures/directives/ref/templates.html +3 -0
  240. package/test/declarative/fixtures/directives/repeat/entry.html +21 -0
  241. package/test/declarative/fixtures/directives/repeat/fast-build.config.json +6 -0
  242. package/test/declarative/fixtures/directives/repeat/index.html +133 -0
  243. package/test/declarative/fixtures/directives/repeat/main.ts +110 -0
  244. package/test/declarative/fixtures/directives/repeat/sprites.svg +8 -0
  245. package/test/declarative/fixtures/directives/repeat/state.json +10 -0
  246. package/test/declarative/fixtures/directives/repeat/templates.html +75 -0
  247. package/test/declarative/fixtures/directives/slotted/entry.html +17 -0
  248. package/test/declarative/fixtures/directives/slotted/fast-build.config.json +6 -0
  249. package/test/declarative/fixtures/directives/slotted/index.html +27 -0
  250. package/test/declarative/fixtures/directives/slotted/main.ts +29 -0
  251. package/test/declarative/fixtures/directives/slotted/state.json +1 -0
  252. package/test/declarative/fixtures/directives/slotted/templates.html +7 -0
  253. package/test/declarative/fixtures/directives/when/entry.html +51 -0
  254. package/test/declarative/fixtures/directives/when/fast-build.config.json +6 -0
  255. package/test/declarative/fixtures/directives/when/index.html +136 -0
  256. package/test/declarative/fixtures/directives/when/main.ts +172 -0
  257. package/test/declarative/fixtures/directives/when/state.json +12 -0
  258. package/test/declarative/fixtures/directives/when/templates.html +75 -0
  259. package/test/declarative/fixtures/ecosystem/README.md +11 -0
  260. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/entry.html +12 -0
  261. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/fast-build.config.json +6 -0
  262. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/index.html +20 -0
  263. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/main.ts +68 -0
  264. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/state.json +4 -0
  265. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/templates.html +7 -0
  266. package/test/declarative/fixtures/ecosystem/errors/entry.html +12 -0
  267. package/test/declarative/fixtures/ecosystem/errors/fast-build.config.json +6 -0
  268. package/test/declarative/fixtures/ecosystem/errors/index.html +20 -0
  269. package/test/declarative/fixtures/ecosystem/errors/main.ts +17 -0
  270. package/test/declarative/fixtures/ecosystem/errors/state.json +1 -0
  271. package/test/declarative/fixtures/ecosystem/errors/templates.html +7 -0
  272. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/entry.html +17 -0
  273. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/fast-build.config.json +6 -0
  274. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/index.html +56 -0
  275. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/main.ts +134 -0
  276. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/state.json +12 -0
  277. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/templates.html +34 -0
  278. package/test/declarative/fixtures/ecosystem/performance-metrics/entry.html +25 -0
  279. package/test/declarative/fixtures/ecosystem/performance-metrics/fast-build.config.json +6 -0
  280. package/test/declarative/fixtures/ecosystem/performance-metrics/fast-card.css +10 -0
  281. package/test/declarative/fixtures/ecosystem/performance-metrics/index.html +181 -0
  282. package/test/declarative/fixtures/ecosystem/performance-metrics/main.ts +58 -0
  283. package/test/declarative/fixtures/ecosystem/performance-metrics/state.json +6 -0
  284. package/test/declarative/fixtures/ecosystem/performance-metrics/templates.html +15 -0
  285. package/test/declarative/fixtures/extensions/README.md +15 -0
  286. package/test/declarative/fixtures/extensions/attribute-map/entry.html +14 -0
  287. package/test/declarative/fixtures/extensions/attribute-map/fast-build.config.json +6 -0
  288. package/test/declarative/fixtures/extensions/attribute-map/index.html +31 -0
  289. package/test/declarative/fixtures/extensions/attribute-map/main.ts +40 -0
  290. package/test/declarative/fixtures/extensions/attribute-map/state.json +4 -0
  291. package/test/declarative/fixtures/extensions/attribute-map/templates.html +14 -0
  292. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/entry.html +12 -0
  293. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/fast-build.config.json +7 -0
  294. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/index.html +25 -0
  295. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/main.ts +31 -0
  296. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/state.json +5 -0
  297. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/templates.html +11 -0
  298. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/entry.html +13 -0
  299. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/fast-build.config.json +7 -0
  300. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/index.html +23 -0
  301. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/main.ts +37 -0
  302. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/state.json +1 -0
  303. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/templates.html +9 -0
  304. package/test/declarative/fixtures/extensions/observer-map/entry.html +15 -0
  305. package/test/declarative/fixtures/extensions/observer-map/fast-build.config.json +6 -0
  306. package/test/declarative/fixtures/extensions/observer-map/index.html +442 -0
  307. package/test/declarative/fixtures/extensions/observer-map/main.ts +482 -0
  308. package/test/declarative/fixtures/extensions/observer-map/state.json +158 -0
  309. package/test/declarative/fixtures/extensions/observer-map/templates.html +172 -0
  310. package/test/declarative/fixtures/extensions/observer-map-config-object/entry.html +16 -0
  311. package/test/declarative/fixtures/extensions/observer-map-config-object/fast-build.config.json +6 -0
  312. package/test/declarative/fixtures/extensions/observer-map-config-object/index.html +27 -0
  313. package/test/declarative/fixtures/extensions/observer-map-config-object/main.ts +53 -0
  314. package/test/declarative/fixtures/extensions/observer-map-config-object/state.json +9 -0
  315. package/test/declarative/fixtures/extensions/observer-map-config-object/templates.html +12 -0
  316. package/test/declarative/fixtures/extensions/observer-map-deep-merge/README.md +98 -0
  317. package/test/declarative/fixtures/extensions/observer-map-deep-merge/entry.html +156 -0
  318. package/test/declarative/fixtures/extensions/observer-map-deep-merge/fast-build.config.json +6 -0
  319. package/test/declarative/fixtures/extensions/observer-map-deep-merge/index.html +376 -0
  320. package/test/declarative/fixtures/extensions/observer-map-deep-merge/main.ts +366 -0
  321. package/test/declarative/fixtures/extensions/observer-map-deep-merge/state.json +69 -0
  322. package/test/declarative/fixtures/extensions/observer-map-deep-merge/templates.html +91 -0
  323. package/test/declarative/fixtures/extensions/observer-map-properties/entry.html +14 -0
  324. package/test/declarative/fixtures/extensions/observer-map-properties/fast-build.config.json +6 -0
  325. package/test/declarative/fixtures/extensions/observer-map-properties/index.html +110 -0
  326. package/test/declarative/fixtures/extensions/observer-map-properties/main.ts +175 -0
  327. package/test/declarative/fixtures/extensions/observer-map-properties/state.json +29 -0
  328. package/test/declarative/fixtures/extensions/observer-map-properties/templates.html +55 -0
  329. package/test/declarative/fixtures/scenarios/README.md +7 -0
  330. package/test/declarative/fixtures/scenarios/nested-elements/entry.html +16 -0
  331. package/test/declarative/fixtures/scenarios/nested-elements/fast-build.config.json +6 -0
  332. package/test/declarative/fixtures/scenarios/nested-elements/index.html +126 -0
  333. package/test/declarative/fixtures/scenarios/nested-elements/main.ts +214 -0
  334. package/test/declarative/fixtures/scenarios/nested-elements/state.json +10 -0
  335. package/test/declarative/fixtures/scenarios/nested-elements/templates.html +54 -0
  336. package/test/declarative/index.html +12 -0
  337. package/test/declarative/vite.config.ts +55 -0
  338. package/test/declarative-main.ts +6 -0
  339. package/test/extension-subpaths-main.ts +9 -0
  340. package/test/main.ts +38 -33
  341. package/test/pure-declarative-main.ts +1 -0
  342. package/dist/dts/components/install-hydration.d.ts +0 -1
  343. package/dist/dts/pending-task.d.ts +0 -32
  344. package/dist/dts/polyfills.d.ts +0 -0
  345. package/dist/dts/styles/css-binding-directive.d.ts +0 -60
  346. package/dist/dts/templating/install-hydratable-view-templates.d.ts +0 -1
  347. package/dist/esm/components/install-hydration.js +0 -3
  348. package/dist/esm/pending-task.js +0 -28
  349. package/dist/esm/polyfills.js +0 -60
  350. package/dist/esm/styles/css-binding-directive.js +0 -76
  351. package/dist/esm/templating/install-hydratable-view-templates.js +0 -23
@@ -0,0 +1,172 @@
1
+ <f-template name="observer-map-test-element">
2
+ <template>
3
+ <observer-map-internal-test-element
4
+ :selecteduserid="{{selecteduserid}}"
5
+ :totalusers="{{stats.totalusers}}"
6
+ :metrics="{{stats.metrics}}"
7
+ ></observer-map-internal-test-element>
8
+ <div class="stats">
9
+ <h2>Global Stats</h2>
10
+ <div class="nested-info">
11
+ <strong>Total Users:</strong> {{stats.totalusers}} |
12
+ <strong>Active Users:</strong> {{stats.activeusers}}
13
+ </div>
14
+ <div class="nested-info">
15
+ <strong>Performance:</strong>
16
+ Load: {{stats.metrics.performance.loadtime}}s,
17
+ Render: {{stats.metrics.performance.rendertime}}s
18
+ </div>
19
+ <div class="controls">
20
+ <button @click="{updateStats()}">Update Stats</button>
21
+ <button @click="{addNewUser()}">Add New User</button>
22
+ </div>
23
+ </div>
24
+
25
+ <div class="section">
26
+ <h2>Users List</h2>
27
+ <f-repeat value="{{user in users}}">
28
+ <div class="user-card">
29
+ <h3>{{user.name}} (ID: {{user.id}})
30
+ <f-when value="{{user.id == selecteduserid}}">
31
+ <span>⭐ SELECTED</span>
32
+ </f-when>
33
+ </h3>
34
+
35
+ <div class="nested-info">
36
+ <strong>Age:</strong> {{user.details.personal.age}} years old
37
+ </div>
38
+ <div class="nested-info">
39
+ <strong>Location:</strong> {{user.details.personal.location.city}}, {{user.details.personal.location.country}}
40
+ </div>
41
+ <div class="nested-info">
42
+ <strong>Coordinates:</strong>
43
+ Lat: {{user.details.personal.location.coordinates.lat}},
44
+ Lng: {{user.details.personal.location.coordinates.lng}}
45
+ </div>
46
+
47
+ <div class="nested-info">
48
+ <strong>Theme:</strong> {{user.details.preferences.theme}} |
49
+ <strong>Email Notifications:</strong> {{user.details.preferences.notifications.email}} |
50
+ <strong>Push Notifications:</strong> {{user.details.preferences.notifications.push}}
51
+ </div>
52
+ <div class="nested-info">
53
+ <strong>Notification Frequency:</strong> {{user.details.preferences.notifications.settings.frequency}}
54
+ </div>
55
+ <div class="nested-info">
56
+ <strong>Categories:</strong>
57
+ <f-repeat value="{{category in user.details.preferences.notifications.settings.categories}}">
58
+ <span class="tag">{{category}}</span>
59
+ </f-repeat>
60
+ </div>
61
+
62
+ <div class="controls">
63
+ <button @click="{selectUser(user.id)}">Select User</button>
64
+ <button @click="{updateUserAge(user.id)}">Age +1</button>
65
+ <button @click="{toggleUserTheme(user.id)}">Toggle Theme</button>
66
+ <button @click="{updateUserLocation(user.id)}">Change Location</button>
67
+ <button @click="{updateNotificationSettings(user.id)}">Update Notifications</button>
68
+ <button @click="{addNotificationCategory(user.id)}">Add Category</button>
69
+ <button @click="{removeNotificationCategory(user.id)}">Remove Tech Category</button>
70
+ <button @click="{removeUser(user.id)}">Remove User</button>
71
+ </div>
72
+
73
+ <div>
74
+ <h4>Posts ({{user.posts.length}} posts)</h4>
75
+ <f-repeat value="{{post in user.posts}}">
76
+ <div class="post-card">
77
+ <div><strong>{{post.title}}</strong> (ID: {{post.id}})</div>
78
+ <div class="nested-info">{{post.content}}</div>
79
+ <div class="nested-info">
80
+ <strong>Author:</strong> {{post.metadata.author.name}}
81
+ <f-when value="{{post.metadata.author.verified}}">
82
+ <span>✓ Verified</span>
83
+ </f-when>
84
+ </div>
85
+ <div class="nested-info">
86
+ <strong>Stats:</strong> {{post.metadata.views}} views, {{post.metadata.likes}} likes
87
+ </div>
88
+ <div class="nested-info">
89
+ <strong>Tags:</strong>
90
+ <f-repeat value="{{tag in post.metadata.tags}}">
91
+ <span class="tag">{{tag}}</span>
92
+ </f-repeat>
93
+ </div>
94
+ <div class="controls">
95
+ <button @click="{incrementPostLikes(post.id)}">Like Post</button>
96
+ </div>
97
+ </div>
98
+ </f-repeat>
99
+ <div class="controls">
100
+ <button @click="{addPostToUser(user.id)}">Add New Post</button>
101
+ </div>
102
+ </div>
103
+ </div>
104
+ </f-repeat>
105
+ </div>
106
+ </template>
107
+ </f-template>
108
+ <f-template name="observer-map-internal-test-element">
109
+ <template>
110
+ selected user: {{selecteduserid}} <!-- because this is bound to an attribute property it must be lowercase -->
111
+ <br>
112
+ total users: {{totalusers}}
113
+ <br>
114
+ <div class="stats">
115
+ <div class="nested-info">
116
+ <strong>Engagement:</strong>
117
+ Daily: {{metrics.engagement.daily}},
118
+ Weekly: {{metrics.engagement.weekly}},
119
+ Monthly: {{metrics.engagement.monthly}}
120
+ </div>
121
+ </div>
122
+ <f-when value="{{a}}">
123
+ <span class="nested-define">{{a.b.c}}</span>
124
+ </f-when>
125
+ <button @click="{defineB()}">Define B</button>
126
+ <button @click="{updateC()}">Update C</button>
127
+ <br>
128
+ <f-when value="{{x}}">
129
+ <span class="nested-define-2">{{x.y.z}}</span>
130
+ </f-when>
131
+ <button @click="{defineY()}">Define Y</button>
132
+ <button @click="{updateZ()}">Update Z</button>
133
+ <div>
134
+ <f-repeat value="{{group in groups}}">
135
+ <f-repeat value="{{item in group.items}}">
136
+ <div class="item">{{item.text}}</div>
137
+ <span>
138
+ <f-repeat value="{{action in item.actions.trailing}}">
139
+ <span class="action-label">{{action.label}}</span>
140
+ </f-repeat>
141
+ </span>
142
+ </f-repeat>
143
+ </f-repeat>
144
+ </div>
145
+ <button @click="{removeAllItems()}">Remove all items</button>
146
+ <button @click="{addAnItem()}">Add an item</button>
147
+ <button @click="{updateAnItem()}">Update an item</button>
148
+ <button @click="{removeGroup()}">Remove groups</button>
149
+ <button @click="{addGroup()}">Add group</button>
150
+ <button @click="{updateActionLabel()}">Update an action label</button>
151
+ </template>
152
+ </f-template>
153
+ <f-template name="observer-map-with-observables-test-element">
154
+ <template>
155
+ Level 3 Value: {{value1}}
156
+ <button @click="{updateValue1()}">Update Value1</button>
157
+ <br>
158
+ Level 3 Value Observable: {{value2}}
159
+ <button @click="{updateValue2()}">Update Value2</button>
160
+ </template>
161
+ </f-template>
162
+ <f-template name="observer-map-simple-array-test-element">
163
+ <template>
164
+ <ul>
165
+ <f-repeat value="{{item in items}}">
166
+ <li class="simple-item">{{item}}</li>
167
+ </f-repeat>
168
+ </ul>
169
+ <button @click="{updateFirstItem()}">Update First Item</button>
170
+ <button @click="{updateSecondItem()}">Update Second Item</button>
171
+ </template>
172
+ </f-template>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title></title>
6
+ </head>
7
+ <body>
8
+ <config-observer-map-test-element
9
+ id="observer-test"
10
+ ></config-observer-map-test-element>
11
+ <config-attribute-map-test-element
12
+ id="attribute-test"
13
+ ></config-attribute-map-test-element>
14
+ <script type="module" src="./main.ts"></script>
15
+ </body>
16
+ </html>
@@ -0,0 +1,6 @@
1
+ {
2
+ "entry": "entry.html",
3
+ "state": "state.json",
4
+ "output": "index.html",
5
+ "templates": "templates.html"
6
+ }
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title></title>
6
+ </head>
7
+ <body>
8
+ <config-observer-map-test-element id="observer-test"><template shadowrootmode="open" shadowroot="open"><div class="message"><!--fe:b-->hello<!--fe:/b--></div>
9
+ <div class="nested-value"><!--fe:b-->42<!--fe:/b--></div></template></config-observer-map-test-element>
10
+ <config-attribute-map-test-element id="attribute-test"><template shadowrootmode="open" shadowroot="open"><span class="label-value"><!--fe:b--><!--fe:/b--></span>
11
+ <button type="button" data-fe="1">Set Label</button></template></config-attribute-map-test-element>
12
+ <f-template name="config-observer-map-test-element">
13
+ <template>
14
+ <div class="message">{{data.message}}</div>
15
+ <div class="nested-value">{{data.nested.value}}</div>
16
+ </template>
17
+ </f-template>
18
+ <f-template name="config-attribute-map-test-element">
19
+ <template>
20
+ <span class="label-value">{{label}}</span>
21
+ <button type="button" @click="{setLabel()}">Set Label</button>
22
+ </template>
23
+ </f-template>
24
+
25
+ <script type="module" src="./main.ts"></script>
26
+ </body>
27
+ </html>
@@ -0,0 +1,53 @@
1
+ import { attributeMap } from "@microsoft/fast-element/attribute-map.js";
2
+ import { declarativeTemplate } from "@microsoft/fast-element/declarative.js";
3
+ import { FASTElement } from "@microsoft/fast-element/fast-element.js";
4
+ import { observerMap } from "@microsoft/fast-element/observer-map.js";
5
+
6
+ class ConfigObserverMapTestElement extends FASTElement {
7
+ public data: any = {
8
+ message: "hello",
9
+ nested: {
10
+ value: 42,
11
+ },
12
+ };
13
+
14
+ public updateMessage() {
15
+ this.data.message = "updated";
16
+ }
17
+
18
+ public updateNestedValue() {
19
+ this.data.nested.value = 99;
20
+ }
21
+ }
22
+
23
+ ConfigObserverMapTestElement.define(
24
+ {
25
+ name: "config-observer-map-test-element",
26
+ template: declarativeTemplate(),
27
+ },
28
+ [
29
+ observerMap({
30
+ properties: {
31
+ data: true,
32
+ },
33
+ }),
34
+ ],
35
+ );
36
+
37
+ class ConfigAttributeMapTestElement extends FASTElement {
38
+ public setLabel() {
39
+ (this as any).label = "new-label";
40
+ }
41
+ }
42
+
43
+ ConfigAttributeMapTestElement.define(
44
+ {
45
+ name: "config-attribute-map-test-element",
46
+ template: declarativeTemplate(),
47
+ },
48
+ [
49
+ attributeMap({
50
+ "attribute-name-strategy": "none",
51
+ }),
52
+ ],
53
+ );
@@ -0,0 +1,9 @@
1
+ {
2
+ "data": {
3
+ "message": "hello",
4
+ "nested": {
5
+ "value": 42
6
+ }
7
+ },
8
+ "label": ""
9
+ }
@@ -0,0 +1,12 @@
1
+ <f-template name="config-observer-map-test-element">
2
+ <template>
3
+ <div class="message">{{data.message}}</div>
4
+ <div class="nested-value">{{data.nested.value}}</div>
5
+ </template>
6
+ </f-template>
7
+ <f-template name="config-attribute-map-test-element">
8
+ <template>
9
+ <span class="label-value">{{label}}</span>
10
+ <button type="button" @click="{setLabel()}">Set Label</button>
11
+ </template>
12
+ </f-template>
@@ -0,0 +1,98 @@
1
+ # Deep Merge Test Fixture
2
+
3
+ A comprehensive test fixture for validating the `deepMerge` utility function with FAST's observable system.
4
+
5
+ ## Overview
6
+
7
+ This fixture combines multiple FAST features to thoroughly test `deepMerge` behavior:
8
+
9
+ - **Observable Arrays** - Tests array mutation tracking via splice operations
10
+ - **Nested Objects** - Deep property access with dot syntax (e.g., `user.profile.location.city`)
11
+ - **Conditional Rendering** - `f-when` directives with boolean expressions and comparisons
12
+ - **Nested Repeats** - Multiple levels: users → orders → items → tags
13
+ - **Observer Map** - Full observable tracking across all nested structures
14
+
15
+ ## Data Structure
16
+
17
+ The fixture uses a realistic e-commerce data model:
18
+
19
+ ```
20
+ DeepMergeTestElement
21
+ ├── users[] (observable array)
22
+ │ ├── User
23
+ │ │ ├── id, name, email
24
+ │ │ ├── profile
25
+ │ │ │ ├── age
26
+ │ │ │ ├── location { city, country }
27
+ │ │ │ └── preferences { theme, notifications }
28
+ │ │ └── orders[] (nested observable array)
29
+ │ │ └── Order
30
+ │ │ ├── id, date, total
31
+ │ │ └── items[] (deeply nested array)
32
+ │ │ └── Product
33
+ │ │ ├── id, name, price, inStock
34
+ │ │ ├── tags[] (4th level array)
35
+ │ │ └── metadata { views, rating }
36
+ ├── showDetails (boolean for conditionals)
37
+ └── stats { totalOrders, totalRevenue, activeUsers }
38
+ ```
39
+
40
+ ## Test Scenarios
41
+
42
+ ### 1. **Nested Object Updates** (`updateUserProfile`)
43
+ - Updates deeply nested properties
44
+ - Verifies partial merging (some properties unchanged)
45
+ - Tests: `profile.age`, `profile.location.city`, `profile.preferences.theme`
46
+
47
+ ### 2. **Array Replacement** (`updateUserOrders`)
48
+ - Completely replaces an array with new data
49
+ - Tests observable array splice operations
50
+ - Verifies UI updates correctly
51
+
52
+ ### 3. **Array Item Removal** (`removeOrderItems`)
53
+ - Reduces array length (2 items → 1 item)
54
+ - Tests that removed items disappear from UI
55
+ - Validates splice handles item deletion
56
+
57
+ ### 4. **Nested Array Updates** (`updateProductTags`)
58
+ - Updates deeply nested arrays (tags within items within orders)
59
+ - Modifies multiple properties simultaneously
60
+ - Tests 4-level deep array structures
61
+
62
+ ### 5. **Array Addition** (`addNewUser`)
63
+ - Adds new items to observable arrays
64
+ - Tests array expansion
65
+ - Verifies new items render correctly
66
+
67
+ ### 6. **Conditional Rendering** (`toggleDetails`)
68
+ - Shows/hides content based on boolean flag
69
+ - Tests `f-when` integration
70
+ - Verifies conditional updates propagate
71
+
72
+ ### 7. **Direct Property Mutation** (`incrementAge`)
73
+ - Updates properties without using deepMerge
74
+ - Provides baseline comparison
75
+ - Tests standard observable behavior
76
+
77
+ ### 8. **Stats Object Update** (`updateStats`)
78
+ - Partial object updates
79
+ - Verifies unchanged properties remain untouched
80
+ - Tests shallow object merging
81
+
82
+ ### 9. **Undefined Value Handling** (`testUndefinedMerge`)
83
+ - Validates undefined values are skipped
84
+ - Tests selective property updates
85
+ - Ensures undefined doesn't overwrite existing values
86
+
87
+ ## Key Test Assertions
88
+
89
+ The spec file validates:
90
+
91
+ 1. **Splice-based Updates** - Arrays maintain identity and use splice
92
+ 2. **Partial Merges** - Only specified properties change
93
+ 3. **Nested Updates** - Deep property paths update correctly
94
+ 4. **Array Length Changes** - Items added/removed appropriately
95
+ 5. **Conditional Re-evaluation** - UI responds to boolean changes
96
+ 6. **Multiple Update Cycles** - Repeated operations work consistently
97
+ 7. **Empty Array Handling** - Zero-length arrays render correctly
98
+ 8. **Cross-cutting Updates** - Changes propagate through nested structures
@@ -0,0 +1,156 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Deep Merge Test Fixture</title>
6
+ <style>
7
+ body {
8
+ font-family: system-ui, -apple-system, sans-serif;
9
+ max-width: 1200px;
10
+ margin: 0 auto;
11
+ padding: 20px;
12
+ background: #f5f5f5;
13
+ }
14
+
15
+ h1 {
16
+ color: #333;
17
+ border-bottom: 2px solid #0078d4;
18
+ padding-bottom: 10px;
19
+ }
20
+
21
+ h2 {
22
+ color: #555;
23
+ margin-top: 30px;
24
+ }
25
+
26
+ .container {
27
+ background: white;
28
+ padding: 20px;
29
+ border-radius: 8px;
30
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
31
+ }
32
+
33
+ .stats {
34
+ background: #e3f2fd;
35
+ padding: 15px;
36
+ border-radius: 6px;
37
+ margin: 20px 0;
38
+ }
39
+
40
+ .stats p {
41
+ margin: 8px 0;
42
+ }
43
+
44
+ .controls {
45
+ background: #f5f5f5;
46
+ padding: 15px;
47
+ border-radius: 6px;
48
+ margin: 20px 0;
49
+ }
50
+
51
+ button {
52
+ background: #0078d4;
53
+ color: white;
54
+ border: none;
55
+ padding: 10px 16px;
56
+ border-radius: 4px;
57
+ cursor: pointer;
58
+ margin: 5px;
59
+ font-size: 14px;
60
+ }
61
+
62
+ button:hover {
63
+ background: #106ebe;
64
+ }
65
+
66
+ button:active {
67
+ background: #005a9e;
68
+ }
69
+
70
+ .user-card {
71
+ border: 1px solid #ddd;
72
+ border-radius: 6px;
73
+ padding: 15px;
74
+ margin: 15px 0;
75
+ background: #fafafa;
76
+ }
77
+
78
+ .user-card h3 {
79
+ margin-top: 0;
80
+ color: #0078d4;
81
+ }
82
+
83
+ .profile {
84
+ background: white;
85
+ padding: 10px;
86
+ border-radius: 4px;
87
+ margin: 10px 0;
88
+ }
89
+
90
+ .profile h4 {
91
+ margin-top: 0;
92
+ }
93
+
94
+ .orders {
95
+ margin-top: 15px;
96
+ }
97
+
98
+ .order {
99
+ background: white;
100
+ padding: 10px;
101
+ border-radius: 4px;
102
+ margin: 10px 0;
103
+ border-left: 3px solid #0078d4;
104
+ }
105
+
106
+ .items {
107
+ list-style: none;
108
+ padding: 0;
109
+ margin: 10px 0;
110
+ }
111
+
112
+ .item {
113
+ padding: 8px;
114
+ margin: 5px 0;
115
+ background: #f9f9f9;
116
+ border-radius: 4px;
117
+ }
118
+
119
+ .stock {
120
+ margin-left: 10px;
121
+ font-size: 12px;
122
+ }
123
+
124
+ .tags {
125
+ margin-top: 5px;
126
+ font-size: 12px;
127
+ }
128
+
129
+ .tag {
130
+ background: #0078d4;
131
+ color: white;
132
+ padding: 2px 8px;
133
+ border-radius: 3px;
134
+ margin-right: 5px;
135
+ display: inline-block;
136
+ }
137
+
138
+ .metadata {
139
+ margin-top: 5px;
140
+ color: #666;
141
+ }
142
+
143
+ strong {
144
+ color: #333;
145
+ }
146
+
147
+ em {
148
+ color: #999;
149
+ }
150
+ </style>
151
+ </head>
152
+ <body>
153
+ <deep-merge-test-element></deep-merge-test-element>
154
+ <script type="module" src="./main.ts"></script>
155
+ </body>
156
+ </html>
@@ -0,0 +1,6 @@
1
+ {
2
+ "entry": "entry.html",
3
+ "state": "state.json",
4
+ "output": "index.html",
5
+ "templates": "templates.html"
6
+ }