@microsoft/fast-element 3.0.0-rc.1 → 3.0.0-rc.2

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 (286) hide show
  1. package/CHANGELOG.md +51 -1
  2. package/README.md +50 -14
  3. package/dist/context/context.api.json +13 -13
  4. package/dist/declarative/declarative.api.json +654 -15
  5. package/dist/di/di.api.json +15 -15
  6. package/dist/dts/__test__/helpers.d.ts +6 -0
  7. package/dist/dts/__test__/setup-node.d.ts +0 -0
  8. package/dist/dts/binding/binding.d.ts +15 -5
  9. package/dist/dts/binding/one-time.d.ts +1 -1
  10. package/dist/dts/binding/one-way.d.ts +1 -1
  11. package/dist/dts/binding/signal.d.ts +1 -1
  12. package/dist/dts/binding/two-way.d.ts +1 -1
  13. package/dist/dts/components/attributes.d.ts +1 -1
  14. package/dist/dts/components/enable-hydration.d.ts +22 -2
  15. package/dist/dts/components/fast-definitions.d.ts +7 -4
  16. package/dist/dts/components/fast-element.d.ts +42 -12
  17. package/dist/dts/components/hydration-tracker.d.ts +47 -4
  18. package/dist/dts/components/hydration.d.ts +5 -0
  19. package/dist/dts/context.d.ts +7 -7
  20. package/dist/dts/declarative/debug.d.ts +2 -3
  21. package/dist/dts/declarative/index.d.ts +3 -2
  22. package/dist/dts/declarative/interfaces.d.ts +1 -2
  23. package/dist/dts/declarative/template.d.ts +2 -1
  24. package/dist/dts/declarative/utilities.d.ts +50 -4
  25. package/dist/dts/di/di.d.ts +6 -6
  26. package/dist/dts/dom-policy.d.ts +22 -4
  27. package/dist/dts/dom.d.ts +4 -16
  28. package/dist/dts/hydration/diagnostics.d.ts +93 -0
  29. package/dist/dts/hydration/hydration-debugger.d.ts +35 -0
  30. package/dist/dts/hydration/messages.d.ts +62 -0
  31. package/dist/dts/hydration/target-builder.d.ts +26 -1
  32. package/dist/dts/hydration.d.ts +7 -3
  33. package/dist/dts/index.d.ts +7 -3
  34. package/dist/dts/interfaces.d.ts +1 -0
  35. package/dist/dts/observation/observable.d.ts +3 -3
  36. package/dist/dts/platform.d.ts +20 -4
  37. package/dist/dts/registry.d.ts +1 -0
  38. package/dist/dts/templating/children.d.ts +1 -1
  39. package/dist/dts/templating/compiler.d.ts +1 -1
  40. package/dist/dts/templating/html-binding-directive.d.ts +6 -2
  41. package/dist/dts/templating/html-directive.d.ts +2 -1
  42. package/dist/dts/templating/hydration-view.d.ts +24 -3
  43. package/dist/dts/templating/ref.d.ts +1 -1
  44. package/dist/dts/templating/render.d.ts +2 -2
  45. package/dist/dts/templating/repeat.d.ts +1 -1
  46. package/dist/dts/templating/slotted.d.ts +1 -1
  47. package/dist/dts/templating/template.d.ts +5 -5
  48. package/dist/dts/templating/when.d.ts +1 -1
  49. package/dist/dts/testing/fakes.d.ts +4 -4
  50. package/dist/esm/__test__/helpers.js +22 -0
  51. package/dist/esm/__test__/setup-node.js +18 -0
  52. package/dist/esm/binding/two-way.js +1 -2
  53. package/dist/esm/components/attributes.js +12 -8
  54. package/dist/esm/components/element-controller.js +11 -6
  55. package/dist/esm/components/enable-hydration.js +27 -3
  56. package/dist/esm/components/fast-definitions.js +19 -18
  57. package/dist/esm/components/hydration-tracker.js +34 -5
  58. package/dist/esm/components/hydration.js +85 -6
  59. package/dist/esm/debug.js +1 -0
  60. package/dist/esm/declarative/attribute-map.js +2 -1
  61. package/dist/esm/declarative/debug.js +0 -1
  62. package/dist/esm/declarative/index.js +1 -0
  63. package/dist/esm/declarative/interfaces.js +0 -1
  64. package/dist/esm/declarative/observer-map-utilities.js +58 -55
  65. package/dist/esm/declarative/template-bridge.js +4 -14
  66. package/dist/esm/declarative/template.js +4 -3
  67. package/dist/esm/declarative/utilities.js +236 -1
  68. package/dist/esm/di/di.js +2 -1
  69. package/dist/esm/dom-policy.js +33 -4
  70. package/dist/esm/hydration/diagnostics.js +50 -0
  71. package/dist/esm/hydration/hydration-debugger.js +112 -0
  72. package/dist/esm/hydration/messages.js +84 -0
  73. package/dist/esm/hydration/target-builder.js +65 -19
  74. package/dist/esm/hydration.js +3 -1
  75. package/dist/esm/index.js +6 -2
  76. package/dist/esm/interfaces.js +1 -0
  77. package/dist/esm/metadata.js +2 -8
  78. package/dist/esm/observation/notifier.js +2 -4
  79. package/dist/esm/registry.js +1 -0
  80. package/dist/esm/templating/html-binding-directive.js +1 -1
  81. package/dist/esm/templating/hydration-view.js +20 -27
  82. package/dist/esm/templating/render.js +39 -18
  83. package/dist/esm/templating/repeat.js +51 -17
  84. package/dist/esm/templating/view.js +1 -1
  85. package/dist/esm/testing/fixture.js +2 -2
  86. package/dist/esm/testing/timeout.js +2 -2
  87. package/dist/fast-element.api.json +1329 -99
  88. package/dist/fast-element.d.ts +147 -66
  89. package/dist/fast-element.debug.js +392 -99
  90. package/dist/fast-element.debug.min.js +2 -2
  91. package/dist/fast-element.js +392 -99
  92. package/dist/fast-element.min.js +2 -2
  93. package/dist/fast-element.untrimmed.d.ts +133 -70
  94. package/dist/hydration/hydration.api.json +1280 -57
  95. package/dist/styles/styles.api.json +1 -1
  96. package/package.json +21 -9
  97. package/ARCHITECTURE_FASTELEMENT.md +0 -63
  98. package/ARCHITECTURE_HTML_TAGGED_TEMPLATE_LITERAL.md +0 -36
  99. package/ARCHITECTURE_INTRO.md +0 -10
  100. package/ARCHITECTURE_OVERVIEW.md +0 -52
  101. package/ARCHITECTURE_UPDATES.md +0 -11
  102. package/CHANGELOG.json +0 -2275
  103. package/DECLARATIVE_DESIGN.md +0 -806
  104. package/DECLARATIVE_HTML.md +0 -470
  105. package/DECLARATIVE_MIGRATION.md +0 -215
  106. package/DECLARATIVE_RENDERING.md +0 -530
  107. package/DECLARATIVE_RENDERING_LIFECYCLE.md +0 -288
  108. package/DECLARATIVE_SCHEMA_OBSERVER_MAP.md +0 -489
  109. package/DESIGN.md +0 -615
  110. package/MIGRATION.md +0 -387
  111. package/SIZES.md +0 -25
  112. package/api-extractor.arrays.json +0 -15
  113. package/api-extractor.context.json +0 -15
  114. package/api-extractor.declarative.json +0 -15
  115. package/api-extractor.di.json +0 -15
  116. package/api-extractor.hydration.json +0 -15
  117. package/api-extractor.styles.json +0 -15
  118. package/biome.json +0 -4
  119. package/docs/ACKNOWLEDGEMENTS.md +0 -12
  120. package/docs/api-report.api.md +0 -1299
  121. package/docs/arrays/api-report.api.md +0 -114
  122. package/docs/context/api-report.api.md +0 -69
  123. package/docs/declarative/api-report.api.md +0 -397
  124. package/docs/di/api-report.api.md +0 -315
  125. package/docs/fast-element-2-changes.md +0 -15
  126. package/docs/hydration/api-report.api.md +0 -285
  127. package/docs/styles/api-report.api.md +0 -135
  128. package/playwright.config.ts +0 -26
  129. package/playwright.declarative.config.ts +0 -26
  130. package/playwright.declarative.webui.config.ts +0 -20
  131. package/scripts/declarative/build-fixtures-with-webui.js +0 -135
  132. package/scripts/declarative/build-fixtures.js +0 -49
  133. package/scripts/declarative/build-fixtures.utilities.js +0 -101
  134. package/scripts/measure-sizes.js +0 -219
  135. package/scripts/run-api-extractor.js +0 -70
  136. package/test/declarative/fixtures/README.md +0 -72
  137. package/test/declarative/fixtures/WRITING_FIXTURES.md +0 -330
  138. package/test/declarative/fixtures/bindings/README.md +0 -12
  139. package/test/declarative/fixtures/bindings/attribute/entry.html +0 -13
  140. package/test/declarative/fixtures/bindings/attribute/fast-build.config.json +0 -6
  141. package/test/declarative/fixtures/bindings/attribute/index.html +0 -25
  142. package/test/declarative/fixtures/bindings/attribute/main.ts +0 -41
  143. package/test/declarative/fixtures/bindings/attribute/state.json +0 -8
  144. package/test/declarative/fixtures/bindings/attribute/templates.html +0 -11
  145. package/test/declarative/fixtures/bindings/content/entry.html +0 -12
  146. package/test/declarative/fixtures/bindings/content/fast-build.config.json +0 -6
  147. package/test/declarative/fixtures/bindings/content/index.html +0 -19
  148. package/test/declarative/fixtures/bindings/content/main.ts +0 -27
  149. package/test/declarative/fixtures/bindings/content/state.json +0 -4
  150. package/test/declarative/fixtures/bindings/content/templates.html +0 -6
  151. package/test/declarative/fixtures/bindings/dot-syntax/entry.html +0 -11
  152. package/test/declarative/fixtures/bindings/dot-syntax/fast-build.config.json +0 -6
  153. package/test/declarative/fixtures/bindings/dot-syntax/index.html +0 -47
  154. package/test/declarative/fixtures/bindings/dot-syntax/main.ts +0 -59
  155. package/test/declarative/fixtures/bindings/dot-syntax/state.json +0 -16
  156. package/test/declarative/fixtures/bindings/dot-syntax/templates.html +0 -17
  157. package/test/declarative/fixtures/bindings/event/entry.html +0 -11
  158. package/test/declarative/fixtures/bindings/event/fast-build.config.json +0 -6
  159. package/test/declarative/fixtures/bindings/event/index.html +0 -43
  160. package/test/declarative/fixtures/bindings/event/main.ts +0 -43
  161. package/test/declarative/fixtures/bindings/event/state.json +0 -3
  162. package/test/declarative/fixtures/bindings/event/templates.html +0 -18
  163. package/test/declarative/fixtures/bindings/host/entry.html +0 -40
  164. package/test/declarative/fixtures/bindings/host/fast-build.config.json +0 -6
  165. package/test/declarative/fixtures/bindings/host/index.html +0 -96
  166. package/test/declarative/fixtures/bindings/host/main.ts +0 -222
  167. package/test/declarative/fixtures/bindings/host/state.json +0 -9
  168. package/test/declarative/fixtures/bindings/host/templates.html +0 -55
  169. package/test/declarative/fixtures/directives/README.md +0 -12
  170. package/test/declarative/fixtures/directives/children/entry.html +0 -11
  171. package/test/declarative/fixtures/directives/children/fast-build.config.json +0 -6
  172. package/test/declarative/fixtures/directives/children/index.html +0 -15
  173. package/test/declarative/fixtures/directives/children/main.ts +0 -22
  174. package/test/declarative/fixtures/directives/children/state.json +0 -3
  175. package/test/declarative/fixtures/directives/children/templates.html +0 -3
  176. package/test/declarative/fixtures/directives/ref/entry.html +0 -11
  177. package/test/declarative/fixtures/directives/ref/fast-build.config.json +0 -6
  178. package/test/declarative/fixtures/directives/ref/index.html +0 -15
  179. package/test/declarative/fixtures/directives/ref/main.ts +0 -17
  180. package/test/declarative/fixtures/directives/ref/state.json +0 -1
  181. package/test/declarative/fixtures/directives/ref/templates.html +0 -3
  182. package/test/declarative/fixtures/directives/repeat/entry.html +0 -21
  183. package/test/declarative/fixtures/directives/repeat/fast-build.config.json +0 -6
  184. package/test/declarative/fixtures/directives/repeat/index.html +0 -133
  185. package/test/declarative/fixtures/directives/repeat/main.ts +0 -110
  186. package/test/declarative/fixtures/directives/repeat/sprites.svg +0 -8
  187. package/test/declarative/fixtures/directives/repeat/state.json +0 -10
  188. package/test/declarative/fixtures/directives/repeat/templates.html +0 -75
  189. package/test/declarative/fixtures/directives/slotted/entry.html +0 -17
  190. package/test/declarative/fixtures/directives/slotted/fast-build.config.json +0 -6
  191. package/test/declarative/fixtures/directives/slotted/index.html +0 -27
  192. package/test/declarative/fixtures/directives/slotted/main.ts +0 -29
  193. package/test/declarative/fixtures/directives/slotted/state.json +0 -1
  194. package/test/declarative/fixtures/directives/slotted/templates.html +0 -7
  195. package/test/declarative/fixtures/directives/when/entry.html +0 -51
  196. package/test/declarative/fixtures/directives/when/fast-build.config.json +0 -6
  197. package/test/declarative/fixtures/directives/when/index.html +0 -136
  198. package/test/declarative/fixtures/directives/when/main.ts +0 -172
  199. package/test/declarative/fixtures/directives/when/state.json +0 -12
  200. package/test/declarative/fixtures/directives/when/templates.html +0 -75
  201. package/test/declarative/fixtures/ecosystem/README.md +0 -11
  202. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/entry.html +0 -12
  203. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/fast-build.config.json +0 -6
  204. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/index.html +0 -20
  205. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/main.ts +0 -68
  206. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/state.json +0 -4
  207. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/templates.html +0 -7
  208. package/test/declarative/fixtures/ecosystem/errors/entry.html +0 -12
  209. package/test/declarative/fixtures/ecosystem/errors/fast-build.config.json +0 -6
  210. package/test/declarative/fixtures/ecosystem/errors/index.html +0 -20
  211. package/test/declarative/fixtures/ecosystem/errors/main.ts +0 -17
  212. package/test/declarative/fixtures/ecosystem/errors/state.json +0 -1
  213. package/test/declarative/fixtures/ecosystem/errors/templates.html +0 -7
  214. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/entry.html +0 -17
  215. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/fast-build.config.json +0 -6
  216. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/index.html +0 -56
  217. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/main.ts +0 -134
  218. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/state.json +0 -12
  219. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/templates.html +0 -34
  220. package/test/declarative/fixtures/ecosystem/performance-metrics/entry.html +0 -25
  221. package/test/declarative/fixtures/ecosystem/performance-metrics/fast-build.config.json +0 -6
  222. package/test/declarative/fixtures/ecosystem/performance-metrics/fast-card.css +0 -10
  223. package/test/declarative/fixtures/ecosystem/performance-metrics/index.html +0 -181
  224. package/test/declarative/fixtures/ecosystem/performance-metrics/main.ts +0 -58
  225. package/test/declarative/fixtures/ecosystem/performance-metrics/state.json +0 -6
  226. package/test/declarative/fixtures/ecosystem/performance-metrics/templates.html +0 -15
  227. package/test/declarative/fixtures/extensions/README.md +0 -15
  228. package/test/declarative/fixtures/extensions/attribute-map/entry.html +0 -14
  229. package/test/declarative/fixtures/extensions/attribute-map/fast-build.config.json +0 -6
  230. package/test/declarative/fixtures/extensions/attribute-map/index.html +0 -31
  231. package/test/declarative/fixtures/extensions/attribute-map/main.ts +0 -40
  232. package/test/declarative/fixtures/extensions/attribute-map/state.json +0 -4
  233. package/test/declarative/fixtures/extensions/attribute-map/templates.html +0 -14
  234. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/entry.html +0 -12
  235. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/fast-build.config.json +0 -7
  236. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/index.html +0 -25
  237. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/main.ts +0 -31
  238. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/state.json +0 -5
  239. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/templates.html +0 -11
  240. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/entry.html +0 -13
  241. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/fast-build.config.json +0 -7
  242. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/index.html +0 -23
  243. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/main.ts +0 -37
  244. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/state.json +0 -1
  245. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/templates.html +0 -9
  246. package/test/declarative/fixtures/extensions/observer-map/entry.html +0 -15
  247. package/test/declarative/fixtures/extensions/observer-map/fast-build.config.json +0 -6
  248. package/test/declarative/fixtures/extensions/observer-map/index.html +0 -442
  249. package/test/declarative/fixtures/extensions/observer-map/main.ts +0 -482
  250. package/test/declarative/fixtures/extensions/observer-map/state.json +0 -158
  251. package/test/declarative/fixtures/extensions/observer-map/templates.html +0 -172
  252. package/test/declarative/fixtures/extensions/observer-map-config-object/entry.html +0 -16
  253. package/test/declarative/fixtures/extensions/observer-map-config-object/fast-build.config.json +0 -6
  254. package/test/declarative/fixtures/extensions/observer-map-config-object/index.html +0 -27
  255. package/test/declarative/fixtures/extensions/observer-map-config-object/main.ts +0 -53
  256. package/test/declarative/fixtures/extensions/observer-map-config-object/state.json +0 -9
  257. package/test/declarative/fixtures/extensions/observer-map-config-object/templates.html +0 -12
  258. package/test/declarative/fixtures/extensions/observer-map-deep-merge/README.md +0 -98
  259. package/test/declarative/fixtures/extensions/observer-map-deep-merge/entry.html +0 -156
  260. package/test/declarative/fixtures/extensions/observer-map-deep-merge/fast-build.config.json +0 -6
  261. package/test/declarative/fixtures/extensions/observer-map-deep-merge/index.html +0 -376
  262. package/test/declarative/fixtures/extensions/observer-map-deep-merge/main.ts +0 -366
  263. package/test/declarative/fixtures/extensions/observer-map-deep-merge/state.json +0 -69
  264. package/test/declarative/fixtures/extensions/observer-map-deep-merge/templates.html +0 -91
  265. package/test/declarative/fixtures/extensions/observer-map-properties/entry.html +0 -14
  266. package/test/declarative/fixtures/extensions/observer-map-properties/fast-build.config.json +0 -6
  267. package/test/declarative/fixtures/extensions/observer-map-properties/index.html +0 -110
  268. package/test/declarative/fixtures/extensions/observer-map-properties/main.ts +0 -175
  269. package/test/declarative/fixtures/extensions/observer-map-properties/state.json +0 -29
  270. package/test/declarative/fixtures/extensions/observer-map-properties/templates.html +0 -55
  271. package/test/declarative/fixtures/scenarios/README.md +0 -7
  272. package/test/declarative/fixtures/scenarios/nested-elements/entry.html +0 -16
  273. package/test/declarative/fixtures/scenarios/nested-elements/fast-build.config.json +0 -6
  274. package/test/declarative/fixtures/scenarios/nested-elements/index.html +0 -126
  275. package/test/declarative/fixtures/scenarios/nested-elements/main.ts +0 -214
  276. package/test/declarative/fixtures/scenarios/nested-elements/state.json +0 -10
  277. package/test/declarative/fixtures/scenarios/nested-elements/templates.html +0 -54
  278. package/test/declarative/index.html +0 -12
  279. package/test/declarative/vite.config.ts +0 -55
  280. package/test/declarative-main.ts +0 -6
  281. package/test/extension-subpaths-main.ts +0 -9
  282. package/test/index.html +0 -11
  283. package/test/main.ts +0 -109
  284. package/test/pure-declarative-main.ts +0 -1
  285. package/test/vite.config.ts +0 -19
  286. package/tsconfig.api-extractor.json +0 -6
@@ -1,172 +0,0 @@
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>
@@ -1,16 +0,0 @@
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>
@@ -1,6 +0,0 @@
1
- {
2
- "entry": "entry.html",
3
- "state": "state.json",
4
- "output": "index.html",
5
- "templates": "templates.html"
6
- }
@@ -1,27 +0,0 @@
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>
@@ -1,53 +0,0 @@
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
- );
@@ -1,9 +0,0 @@
1
- {
2
- "data": {
3
- "message": "hello",
4
- "nested": {
5
- "value": 42
6
- }
7
- },
8
- "label": ""
9
- }
@@ -1,12 +0,0 @@
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>
@@ -1,98 +0,0 @@
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
@@ -1,156 +0,0 @@
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>
@@ -1,6 +0,0 @@
1
- {
2
- "entry": "entry.html",
3
- "state": "state.json",
4
- "output": "index.html",
5
- "templates": "templates.html"
6
- }