@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,482 @@
1
+ import { attr } from "@microsoft/fast-element/attr.js";
2
+ import { declarativeTemplate } from "@microsoft/fast-element/declarative.js";
3
+ import { FASTElement } from "@microsoft/fast-element/fast-element.js";
4
+ import { enableHydration } from "@microsoft/fast-element/hydration.js";
5
+ import { Observable, observable } from "@microsoft/fast-element/observable.js";
6
+ import { observerMap } from "@microsoft/fast-element/observer-map.js";
7
+
8
+ class ObserverMapTestElement extends FASTElement {
9
+ public users: any[] = [
10
+ {
11
+ id: 1,
12
+ name: "Alice Johnson",
13
+ details: {
14
+ personal: {
15
+ age: 28,
16
+ location: {
17
+ city: "New York",
18
+ country: "USA",
19
+ coordinates: {
20
+ lat: 40.7128,
21
+ lng: -74.006,
22
+ },
23
+ },
24
+ },
25
+ preferences: {
26
+ theme: "dark",
27
+ notifications: {
28
+ email: true,
29
+ push: false,
30
+ settings: {
31
+ frequency: "daily",
32
+ categories: ["tech", "news"],
33
+ },
34
+ },
35
+ },
36
+ },
37
+ posts: [
38
+ {
39
+ id: 101,
40
+ title: "First Post",
41
+ content: "Hello World!",
42
+ metadata: {
43
+ views: 150,
44
+ likes: 25,
45
+ tags: ["introduction", "hello"],
46
+ author: {
47
+ name: "Alice Johnson",
48
+ verified: true,
49
+ },
50
+ },
51
+ },
52
+ {
53
+ id: 102,
54
+ title: "Tech Update",
55
+ content: "Latest in technology...",
56
+ metadata: {
57
+ views: 320,
58
+ likes: 45,
59
+ tags: ["tech", "update"],
60
+ author: {
61
+ name: "Alice Johnson",
62
+ verified: true,
63
+ },
64
+ },
65
+ },
66
+ ],
67
+ },
68
+ {
69
+ id: 2,
70
+ name: "Bob Smith",
71
+ details: {
72
+ personal: {
73
+ age: 35,
74
+ location: {
75
+ city: "London",
76
+ country: "UK",
77
+ coordinates: {
78
+ lat: 51.5074,
79
+ lng: -0.1278,
80
+ },
81
+ },
82
+ },
83
+ preferences: {
84
+ theme: "light",
85
+ notifications: {
86
+ email: false,
87
+ push: true,
88
+ settings: {
89
+ frequency: "weekly",
90
+ categories: ["sports", "music"],
91
+ },
92
+ },
93
+ },
94
+ },
95
+ posts: [
96
+ {
97
+ id: 201,
98
+ title: "Music Review",
99
+ content: "Amazing concert last night...",
100
+ metadata: {
101
+ views: 89,
102
+ likes: 12,
103
+ tags: ["music", "review"],
104
+ author: {
105
+ name: "Bob Smith",
106
+ verified: false,
107
+ },
108
+ },
109
+ },
110
+ ],
111
+ },
112
+ ];
113
+
114
+ public selecteduserid: number = 1;
115
+
116
+ public stats = {
117
+ totalusers: 2,
118
+ activeusers: 1,
119
+ metrics: {
120
+ engagement: {
121
+ daily: 100,
122
+ weekly: 500,
123
+ monthly: 2000,
124
+ },
125
+ performance: {
126
+ loadtime: 1.2,
127
+ rendertime: 0.8,
128
+ },
129
+ },
130
+ };
131
+
132
+ // Methods to test deeply nested property changes
133
+ public updateUserAge = (userId: number) => {
134
+ const user = this.users.find(u => u.id === userId);
135
+ if (user) {
136
+ user.details.personal.age += 1;
137
+ }
138
+ };
139
+
140
+ public toggleUserTheme = (userId: number) => {
141
+ const user = this.users.find(u => u.id === userId);
142
+ if (user) {
143
+ user.details.preferences.theme =
144
+ user.details.preferences.theme === "dark" ? "light" : "dark";
145
+ }
146
+ };
147
+
148
+ public updateUserLocation = (userId: number) => {
149
+ const user = this.users.find(u => u.id === userId);
150
+ if (user) {
151
+ // Use hardcoded values since we can only pass single argument
152
+ user.details.personal.location.city = "Tokyo";
153
+ user.details.personal.location.country = "Japan";
154
+ // Update coordinates randomly for demo
155
+ user.details.personal.location.coordinates.lat = Math.random() * 180 - 90;
156
+ user.details.personal.location.coordinates.lng = Math.random() * 360 - 180;
157
+ }
158
+ };
159
+
160
+ public addPostToUser = (userId: number) => {
161
+ const user = this.users.find(u => u.id === userId);
162
+ if (user) {
163
+ const newPostId = Math.max(...user.posts.map((p: any) => p.id)) + 1;
164
+ user.posts.push({
165
+ id: newPostId,
166
+ title: `New Post ${newPostId}`,
167
+ content: `This is a new post with ID ${newPostId}`,
168
+ metadata: {
169
+ views: 0,
170
+ likes: 0,
171
+ tags: ["new", "auto-generated"],
172
+ author: {
173
+ name: user.name,
174
+ verified: Math.random() > 0.5,
175
+ },
176
+ },
177
+ });
178
+ }
179
+ };
180
+
181
+ public incrementPostLikes = (postId: number) => {
182
+ // Find the post across all users since we only have postId
183
+ for (const user of this.users) {
184
+ const post = user.posts.find((p: any) => p.id === postId);
185
+ if (post) {
186
+ post.metadata.likes += 1;
187
+ post.metadata.views += Math.floor(Math.random() * 5) + 1;
188
+ break;
189
+ }
190
+ }
191
+ };
192
+
193
+ public updateNotificationSettings = (userId: number) => {
194
+ const user = this.users.find(u => u.id === userId);
195
+ if (user) {
196
+ user.details.preferences.notifications.email =
197
+ !user.details.preferences.notifications.email;
198
+ user.details.preferences.notifications.push =
199
+ !user.details.preferences.notifications.push;
200
+
201
+ // Cycle through frequency options
202
+ const frequencies = ["daily", "weekly", "monthly"];
203
+ const currentIndex = frequencies.indexOf(
204
+ user.details.preferences.notifications.settings.frequency,
205
+ );
206
+ const nextIndex = (currentIndex + 1) % frequencies.length;
207
+ user.details.preferences.notifications.settings.frequency =
208
+ frequencies[nextIndex];
209
+ }
210
+ };
211
+
212
+ public addNotificationCategory = (userId: number) => {
213
+ const user = this.users.find(u => u.id === userId);
214
+ if (user) {
215
+ // Use hardcoded category since we can only pass single argument
216
+ const category = "sports";
217
+ if (
218
+ !user.details.preferences.notifications.settings.categories.includes(
219
+ category,
220
+ )
221
+ ) {
222
+ user.details.preferences.notifications.settings.categories.push(category);
223
+ }
224
+ }
225
+ };
226
+
227
+ public removeNotificationCategory = (userId: number) => {
228
+ const user = this.users.find(u => u.id === userId);
229
+ if (user) {
230
+ // Use hardcoded category since we can only pass single argument
231
+ const category = "tech";
232
+ const index =
233
+ user.details.preferences.notifications.settings.categories.indexOf(
234
+ category,
235
+ );
236
+ if (index > -1) {
237
+ user.details.preferences.notifications.settings.categories.splice(
238
+ index,
239
+ 1,
240
+ );
241
+ }
242
+ }
243
+ };
244
+
245
+ public addNewUser = () => {
246
+ const newId = Math.max(...this.users.map(u => u.id)) + 1;
247
+ this.users.push({
248
+ id: newId,
249
+ name: `User ${newId}`,
250
+ details: {
251
+ personal: {
252
+ age: Math.floor(Math.random() * 50) + 18,
253
+ location: {
254
+ city: "Random City",
255
+ country: "Random Country",
256
+ coordinates: {
257
+ lat: Math.random() * 180 - 90,
258
+ lng: Math.random() * 360 - 180,
259
+ },
260
+ },
261
+ },
262
+ preferences: {
263
+ theme: "dark",
264
+ notifications: {
265
+ email: Math.random() > 0.5,
266
+ push: Math.random() > 0.5,
267
+ settings: {
268
+ frequency: ["daily", "weekly", "monthly"][
269
+ Math.floor(Math.random() * 3)
270
+ ],
271
+ categories: ["general"],
272
+ },
273
+ },
274
+ },
275
+ },
276
+ posts: [],
277
+ });
278
+ this.stats.totalusers = this.users.length;
279
+ };
280
+
281
+ public removeUser = (userId: number) => {
282
+ const index = this.users.findIndex(u => u.id === userId);
283
+ if (index > -1) {
284
+ this.users.splice(index, 1);
285
+ this.stats.totalusers = this.users.length;
286
+ }
287
+ };
288
+
289
+ public updateStats = () => {
290
+ this.stats.metrics.engagement.daily += Math.floor(Math.random() * 10);
291
+ this.stats.metrics.engagement.weekly += Math.floor(Math.random() * 20);
292
+ this.stats.metrics.engagement.monthly += Math.floor(Math.random() * 50);
293
+ this.stats.metrics.performance.loadtime = Math.random() * 2 + 0.5;
294
+ this.stats.metrics.performance.rendertime = Math.random() * 1 + 0.3;
295
+ };
296
+
297
+ public selectUser = (userId: number) => {
298
+ this.selecteduserid = userId;
299
+ };
300
+ }
301
+
302
+ class ObserverMapInternalTestElement extends FASTElement {
303
+ public selecteduserid?: number;
304
+ public totalusers?: number;
305
+
306
+ public a: any = {};
307
+
308
+ public x: any = undefined;
309
+
310
+ public groups = [
311
+ {
312
+ items: [
313
+ {
314
+ text: "item A",
315
+ actions: {
316
+ trailing: [
317
+ {
318
+ label: "action label A",
319
+ },
320
+ ],
321
+ },
322
+ },
323
+ ],
324
+ },
325
+ ];
326
+
327
+ public removeAllItems() {
328
+ this.groups[0].items.shift();
329
+ }
330
+
331
+ public addAnItem() {
332
+ this.groups[0].items.push({
333
+ text: "item B",
334
+ actions: {
335
+ trailing: [
336
+ {
337
+ label: "action label A",
338
+ },
339
+ ],
340
+ },
341
+ });
342
+ }
343
+
344
+ public updateAnItem() {
345
+ this.groups[0].items[0].text = "item C";
346
+ }
347
+
348
+ public removeGroup() {
349
+ this.groups = [];
350
+ }
351
+
352
+ public addGroup() {
353
+ this.groups = [
354
+ {
355
+ items: [
356
+ {
357
+ text: "item A",
358
+ actions: {
359
+ trailing: [
360
+ {
361
+ label: "action label A",
362
+ },
363
+ ],
364
+ },
365
+ },
366
+ ],
367
+ },
368
+ ];
369
+ }
370
+
371
+ public updateActionLabel() {
372
+ this.groups[0].items[0].actions.trailing[0].label = "action label B";
373
+ }
374
+
375
+ public defineB() {
376
+ this.a = {
377
+ b: {
378
+ c: "Hello world",
379
+ },
380
+ };
381
+ }
382
+
383
+ public updateC() {
384
+ this.a.b.c = "Hello pluto";
385
+ }
386
+
387
+ public defineY() {
388
+ this.x = {
389
+ y: {
390
+ z: "Z1",
391
+ },
392
+ };
393
+ }
394
+
395
+ public updateZ() {
396
+ this.x.y.z = "Z2";
397
+ }
398
+ }
399
+
400
+ (window as any).messages = [];
401
+
402
+ class ObserverMapWithObservablesTestElement extends FASTElement {
403
+ @observable
404
+ public value1: number = 42;
405
+
406
+ value1Changed(previous: any, current: any) {
407
+ (window as any).messages.push(`value1 changed from ${previous} to ${current}`);
408
+ }
409
+
410
+ public updateValue1() {
411
+ this.value1 += 1;
412
+ }
413
+
414
+ public value2: number = 42;
415
+
416
+ value2Changed(previous: any, current: any) {
417
+ (window as any).messages.push(`value2 changed from ${previous} to ${current}`);
418
+ }
419
+
420
+ @attr({ attribute: "some-attribute" })
421
+ attribute: string = "initial";
422
+
423
+ attributeChanged(previous: string, current: string) {
424
+ (window as any).messages.push(`attribute changed from ${previous} to ${current}`);
425
+ }
426
+
427
+ public updateValue2() {
428
+ this.value2 += 1;
429
+ }
430
+ }
431
+
432
+ ObserverMapInternalTestElement.define(
433
+ {
434
+ name: "observer-map-internal-test-element",
435
+ template: declarativeTemplate(),
436
+ },
437
+ [observerMap()],
438
+ );
439
+
440
+ ObserverMapTestElement.define(
441
+ {
442
+ name: "observer-map-test-element",
443
+ template: declarativeTemplate(),
444
+ },
445
+ [observerMap()],
446
+ );
447
+
448
+ ObserverMapWithObservablesTestElement.define(
449
+ {
450
+ name: "observer-map-with-observables-test-element",
451
+ template: declarativeTemplate(),
452
+ },
453
+ [observerMap()],
454
+ );
455
+
456
+ class ObserverMapSimpleArrayTestElement extends FASTElement {
457
+ public items: string[] = ["foo", "baz"];
458
+
459
+ public updateFirstItem() {
460
+ this.items[0] = "bar";
461
+ }
462
+
463
+ public updateSecondItem() {
464
+ this.items[1] = "qux";
465
+ }
466
+ }
467
+
468
+ ObserverMapSimpleArrayTestElement.define(
469
+ {
470
+ name: "observer-map-simple-array-test-element",
471
+ template: declarativeTemplate(),
472
+ },
473
+ [observerMap()],
474
+ );
475
+
476
+ enableHydration({
477
+ hydrationComplete() {
478
+ (window as any).hydrationCompleted = true;
479
+ },
480
+ });
481
+
482
+ (window as any).Observable = Observable;
@@ -0,0 +1,158 @@
1
+ {
2
+ "items": ["foo", "baz"],
3
+ "value1": 42,
4
+ "value2": 42,
5
+ "selecteduserid": 1,
6
+ "totalusers": 2,
7
+ "metrics": {
8
+ "engagement": {
9
+ "daily": 100,
10
+ "weekly": 500,
11
+ "monthly": 2000
12
+ },
13
+ "performance": {
14
+ "loadtime": 1.2,
15
+ "rendertime": 0.8
16
+ }
17
+ },
18
+ "groups": [
19
+ {
20
+ "items": [
21
+ {
22
+ "text": "item A",
23
+ "actions": {
24
+ "trailing": [
25
+ {
26
+ "label": "action label A"
27
+ }
28
+ ]
29
+ }
30
+ }
31
+ ]
32
+ }
33
+ ],
34
+ "a": {
35
+ "b": {
36
+ "c": ""
37
+ }
38
+ },
39
+ "stats": {
40
+ "totalusers": 2,
41
+ "activeusers": 1,
42
+ "metrics": {
43
+ "performance": {
44
+ "loadtime": 1.2,
45
+ "rendertime": 0.8
46
+ },
47
+ "engagement": {
48
+ "daily": 100,
49
+ "weekly": 500,
50
+ "monthly": 2000
51
+ }
52
+ }
53
+ },
54
+ "users": [
55
+ {
56
+ "id": 1,
57
+ "name": "Alice Johnson",
58
+ "details": {
59
+ "personal": {
60
+ "age": 28,
61
+ "location": {
62
+ "city": "New York",
63
+ "country": "USA",
64
+ "coordinates": {
65
+ "lat": 40.7128,
66
+ "lng": -74.006
67
+ }
68
+ }
69
+ },
70
+ "preferences": {
71
+ "theme": "dark",
72
+ "notifications": {
73
+ "email": true,
74
+ "push": false,
75
+ "settings": {
76
+ "frequency": "daily",
77
+ "categories": ["tech", "news"]
78
+ }
79
+ }
80
+ }
81
+ },
82
+ "posts": [
83
+ {
84
+ "id": 101,
85
+ "title": "First Post",
86
+ "content": "Hello World!",
87
+ "metadata": {
88
+ "views": 150,
89
+ "likes": 25,
90
+ "tags": ["introduction", "hello"],
91
+ "author": {
92
+ "name": "Alice Johnson",
93
+ "verified": true
94
+ }
95
+ }
96
+ },
97
+ {
98
+ "id": 102,
99
+ "title": "Tech Update",
100
+ "content": "Latest in technology...",
101
+ "metadata": {
102
+ "views": 320,
103
+ "likes": 45,
104
+ "tags": ["tech", "update"],
105
+ "author": {
106
+ "name": "Alice Johnson",
107
+ "verified": true
108
+ }
109
+ }
110
+ }
111
+ ]
112
+ },
113
+ {
114
+ "id": 2,
115
+ "name": "Bob Smith",
116
+ "details": {
117
+ "personal": {
118
+ "age": 35,
119
+ "location": {
120
+ "city": "London",
121
+ "country": "UK",
122
+ "coordinates": {
123
+ "lat": 51.5074,
124
+ "lng": -0.1278
125
+ }
126
+ }
127
+ },
128
+ "preferences": {
129
+ "theme": "light",
130
+ "notifications": {
131
+ "email": false,
132
+ "push": true,
133
+ "settings": {
134
+ "frequency": "weekly",
135
+ "categories": ["sports", "music"]
136
+ }
137
+ }
138
+ }
139
+ },
140
+ "posts": [
141
+ {
142
+ "id": 201,
143
+ "title": "Music Review",
144
+ "content": "Amazing concert last night...",
145
+ "metadata": {
146
+ "views": 89,
147
+ "likes": 12,
148
+ "tags": ["music", "review"],
149
+ "author": {
150
+ "name": "Bob Smith",
151
+ "verified": false
152
+ }
153
+ }
154
+ }
155
+ ]
156
+ }
157
+ ]
158
+ }