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