@pwfabric/runtime 0.0.0-stage → 1.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 (447) hide show
  1. package/LICENSE +90 -0
  2. package/README.md +43 -2
  3. package/dist/a11y/announcer.d.ts +65 -0
  4. package/dist/a11y/announcer.js +140 -0
  5. package/dist/a11y/announcer.js.map +1 -0
  6. package/dist/a11y/contrast.d.ts +54 -0
  7. package/dist/a11y/contrast.js +93 -0
  8. package/dist/a11y/contrast.js.map +1 -0
  9. package/dist/a11y/focus.d.ts +123 -0
  10. package/dist/a11y/focus.js +282 -0
  11. package/dist/a11y/focus.js.map +1 -0
  12. package/dist/a11y/index.d.ts +21 -0
  13. package/dist/a11y/index.js +18 -0
  14. package/dist/a11y/index.js.map +1 -0
  15. package/dist/a11y/keyboard.d.ts +144 -0
  16. package/dist/a11y/keyboard.js +317 -0
  17. package/dist/a11y/keyboard.js.map +1 -0
  18. package/dist/adapters/default-image.d.ts +25 -0
  19. package/dist/adapters/default-image.js +37 -0
  20. package/dist/adapters/default-image.js.map +1 -0
  21. package/dist/adapters/index.d.ts +27 -0
  22. package/dist/adapters/index.js +28 -0
  23. package/dist/adapters/index.js.map +1 -0
  24. package/dist/adapters/next-image.d.ts +38 -0
  25. package/dist/adapters/next-image.js +124 -0
  26. package/dist/adapters/next-image.js.map +1 -0
  27. package/dist/adapters/types.d.ts +61 -0
  28. package/dist/adapters/types.js +11 -0
  29. package/dist/adapters/types.js.map +1 -0
  30. package/dist/analytics/index.d.ts +14 -0
  31. package/dist/analytics/index.js +15 -0
  32. package/dist/analytics/index.js.map +1 -0
  33. package/dist/analytics/tracker.d.ts +65 -0
  34. package/dist/analytics/tracker.js +251 -0
  35. package/dist/analytics/tracker.js.map +1 -0
  36. package/dist/analytics/types.d.ts +130 -0
  37. package/dist/analytics/types.js +11 -0
  38. package/dist/analytics/types.js.map +1 -0
  39. package/dist/auth/index.d.ts +15 -0
  40. package/dist/auth/index.js +14 -0
  41. package/dist/auth/index.js.map +1 -0
  42. package/dist/auth/provider.d.ts +132 -0
  43. package/dist/auth/provider.js +473 -0
  44. package/dist/auth/provider.js.map +1 -0
  45. package/dist/auth/types.d.ts +117 -0
  46. package/dist/auth/types.js +9 -0
  47. package/dist/auth/types.js.map +1 -0
  48. package/dist/binding/collection.d.ts +190 -0
  49. package/dist/binding/collection.js +358 -0
  50. package/dist/binding/collection.js.map +1 -0
  51. package/dist/binding/datasource.d.ts +319 -0
  52. package/dist/binding/datasource.js +556 -0
  53. package/dist/binding/datasource.js.map +1 -0
  54. package/dist/binding/engine.d.ts +65 -0
  55. package/dist/binding/engine.js +268 -0
  56. package/dist/binding/engine.js.map +1 -0
  57. package/dist/binding/expression.d.ts +150 -0
  58. package/dist/binding/expression.js +787 -0
  59. package/dist/binding/expression.js.map +1 -0
  60. package/dist/binding/index.d.ts +19 -0
  61. package/dist/binding/index.js +14 -0
  62. package/dist/binding/index.js.map +1 -0
  63. package/dist/binding/two-way.d.ts +149 -0
  64. package/dist/binding/two-way.js +462 -0
  65. package/dist/binding/two-way.js.map +1 -0
  66. package/dist/binding/types.d.ts +119 -0
  67. package/dist/binding/types.js +9 -0
  68. package/dist/binding/types.js.map +1 -0
  69. package/dist/blocks/component-types.d.ts +81 -0
  70. package/dist/blocks/component-types.js +11 -0
  71. package/dist/blocks/component-types.js.map +1 -0
  72. package/dist/blocks/composition-rules.d.ts +168 -0
  73. package/dist/blocks/composition-rules.js +391 -0
  74. package/dist/blocks/composition-rules.js.map +1 -0
  75. package/dist/blocks/hooks.d.ts +31 -0
  76. package/dist/blocks/hooks.js +42 -0
  77. package/dist/blocks/hooks.js.map +1 -0
  78. package/dist/blocks/index.d.ts +14 -0
  79. package/dist/blocks/index.js +23 -0
  80. package/dist/blocks/index.js.map +1 -0
  81. package/dist/blocks/registry.d.ts +84 -0
  82. package/dist/blocks/registry.js +136 -0
  83. package/dist/blocks/registry.js.map +1 -0
  84. package/dist/blocks/rule-engine.d.ts +131 -0
  85. package/dist/blocks/rule-engine.js +321 -0
  86. package/dist/blocks/rule-engine.js.map +1 -0
  87. package/dist/blocks/surface-event-context.d.ts +13 -0
  88. package/dist/blocks/surface-event-context.js +14 -0
  89. package/dist/blocks/surface-event-context.js.map +1 -0
  90. package/dist/blocks/surface-id-context.d.ts +13 -0
  91. package/dist/blocks/surface-id-context.js +15 -0
  92. package/dist/blocks/surface-id-context.js.map +1 -0
  93. package/dist/bus.d.ts +41 -0
  94. package/dist/bus.js +158 -0
  95. package/dist/bus.js.map +1 -0
  96. package/dist/cache/index.d.ts +9 -0
  97. package/dist/cache/index.js +10 -0
  98. package/dist/cache/index.js.map +1 -0
  99. package/dist/cache/memory.d.ts +32 -0
  100. package/dist/cache/memory.js +138 -0
  101. package/dist/cache/memory.js.map +1 -0
  102. package/dist/cache/types.d.ts +62 -0
  103. package/dist/cache/types.js +9 -0
  104. package/dist/cache/types.js.map +1 -0
  105. package/dist/capability/index.d.ts +72 -0
  106. package/dist/capability/index.js +87 -0
  107. package/dist/capability/index.js.map +1 -0
  108. package/dist/capability/kernel-capabilities.d.ts +31 -0
  109. package/dist/capability/kernel-capabilities.js +36 -0
  110. package/dist/capability/kernel-capabilities.js.map +1 -0
  111. package/dist/capability/platform-capabilities.d.ts +71 -0
  112. package/dist/capability/platform-capabilities.js +267 -0
  113. package/dist/capability/platform-capabilities.js.map +1 -0
  114. package/dist/capability/type-mapping.d.ts +70 -0
  115. package/dist/capability/type-mapping.js +107 -0
  116. package/dist/capability/type-mapping.js.map +1 -0
  117. package/dist/capability/validation.d.ts +46 -0
  118. package/dist/capability/validation.js +54 -0
  119. package/dist/capability/validation.js.map +1 -0
  120. package/dist/connectors/declared-connector.d.ts +48 -0
  121. package/dist/connectors/declared-connector.js +333 -0
  122. package/dist/connectors/declared-connector.js.map +1 -0
  123. package/dist/connectors/engine-registry.d.ts +50 -0
  124. package/dist/connectors/engine-registry.js +135 -0
  125. package/dist/connectors/engine-registry.js.map +1 -0
  126. package/dist/connectors/index.d.ts +14 -0
  127. package/dist/connectors/index.js +14 -0
  128. package/dist/connectors/index.js.map +1 -0
  129. package/dist/connectors/module-loader.d.ts +70 -0
  130. package/dist/connectors/module-loader.js +143 -0
  131. package/dist/connectors/module-loader.js.map +1 -0
  132. package/dist/connectors/types.d.ts +174 -0
  133. package/dist/connectors/types.js +23 -0
  134. package/dist/connectors/types.js.map +1 -0
  135. package/dist/context.d.ts +27 -0
  136. package/dist/context.js +38 -0
  137. package/dist/context.js.map +1 -0
  138. package/dist/data/DataCapabilityProvider.d.ts +39 -0
  139. package/dist/data/DataCapabilityProvider.js +58 -0
  140. package/dist/data/DataCapabilityProvider.js.map +1 -0
  141. package/dist/data/index.d.ts +17 -0
  142. package/dist/data/index.js +18 -0
  143. package/dist/data/index.js.map +1 -0
  144. package/dist/data/manager.d.ts +40 -0
  145. package/dist/data/manager.js +442 -0
  146. package/dist/data/manager.js.map +1 -0
  147. package/dist/data/types.d.ts +218 -0
  148. package/dist/data/types.js +2 -0
  149. package/dist/data/types.js.map +1 -0
  150. package/dist/entity/aggregate.d.ts +8 -0
  151. package/dist/entity/aggregate.js +24 -0
  152. package/dist/entity/aggregate.js.map +1 -0
  153. package/dist/entity/apply-query.d.ts +58 -0
  154. package/dist/entity/apply-query.js +264 -0
  155. package/dist/entity/apply-query.js.map +1 -0
  156. package/dist/entity/behavior.d.ts +94 -0
  157. package/dist/entity/behavior.js +78 -0
  158. package/dist/entity/behavior.js.map +1 -0
  159. package/dist/entity/connector.d.ts +141 -0
  160. package/dist/entity/connector.js +89 -0
  161. package/dist/entity/connector.js.map +1 -0
  162. package/dist/entity/connectors/index.d.ts +12 -0
  163. package/dist/entity/connectors/index.js +11 -0
  164. package/dist/entity/connectors/index.js.map +1 -0
  165. package/dist/entity/connectors/static.d.ts +51 -0
  166. package/dist/entity/connectors/static.js +245 -0
  167. package/dist/entity/connectors/static.js.map +1 -0
  168. package/dist/entity/entity-datasource.d.ts +50 -0
  169. package/dist/entity/entity-datasource.js +33 -0
  170. package/dist/entity/entity-datasource.js.map +1 -0
  171. package/dist/entity/facade.d.ts +70 -0
  172. package/dist/entity/facade.js +70 -0
  173. package/dist/entity/facade.js.map +1 -0
  174. package/dist/entity/http-connector.d.ts +123 -0
  175. package/dist/entity/http-connector.js +295 -0
  176. package/dist/entity/http-connector.js.map +1 -0
  177. package/dist/entity/index.d.ts +38 -0
  178. package/dist/entity/index.js +31 -0
  179. package/dist/entity/index.js.map +1 -0
  180. package/dist/entity/postgres-connector.d.ts +64 -0
  181. package/dist/entity/postgres-connector.js +239 -0
  182. package/dist/entity/postgres-connector.js.map +1 -0
  183. package/dist/entity/registry.d.ts +59 -0
  184. package/dist/entity/registry.js +90 -0
  185. package/dist/entity/registry.js.map +1 -0
  186. package/dist/entity/store.d.ts +66 -0
  187. package/dist/entity/store.js +349 -0
  188. package/dist/entity/store.js.map +1 -0
  189. package/dist/entity/types.d.ts +180 -0
  190. package/dist/entity/types.js +10 -0
  191. package/dist/entity/types.js.map +1 -0
  192. package/dist/execution-context.d.ts +88 -0
  193. package/dist/execution-context.js +146 -0
  194. package/dist/execution-context.js.map +1 -0
  195. package/dist/executor.d.ts +27 -0
  196. package/dist/executor.js +33 -0
  197. package/dist/executor.js.map +1 -0
  198. package/dist/forms/form-entity-bridge.d.ts +94 -0
  199. package/dist/forms/form-entity-bridge.js +96 -0
  200. package/dist/forms/form-entity-bridge.js.map +1 -0
  201. package/dist/forms/form-write-target.d.ts +34 -0
  202. package/dist/forms/form-write-target.js +81 -0
  203. package/dist/forms/form-write-target.js.map +1 -0
  204. package/dist/forms/index.d.ts +22 -0
  205. package/dist/forms/index.js +25 -0
  206. package/dist/forms/index.js.map +1 -0
  207. package/dist/forms/named-control-values.d.ts +27 -0
  208. package/dist/forms/named-control-values.js +42 -0
  209. package/dist/forms/named-control-values.js.map +1 -0
  210. package/dist/forms/processor.d.ts +55 -0
  211. package/dist/forms/processor.js +154 -0
  212. package/dist/forms/processor.js.map +1 -0
  213. package/dist/forms/types.d.ts +174 -0
  214. package/dist/forms/types.js +33 -0
  215. package/dist/forms/types.js.map +1 -0
  216. package/dist/forms/validator.d.ts +61 -0
  217. package/dist/forms/validator.js +218 -0
  218. package/dist/forms/validator.js.map +1 -0
  219. package/dist/graph/index.d.ts +10 -0
  220. package/dist/graph/index.js +9 -0
  221. package/dist/graph/index.js.map +1 -0
  222. package/dist/graph/resolver.d.ts +66 -0
  223. package/dist/graph/resolver.js +243 -0
  224. package/dist/graph/resolver.js.map +1 -0
  225. package/dist/graph/types.d.ts +125 -0
  226. package/dist/graph/types.js +9 -0
  227. package/dist/graph/types.js.map +1 -0
  228. package/dist/hooks/useInstalledAtoms.d.ts +96 -0
  229. package/dist/hooks/useInstalledAtoms.js +92 -0
  230. package/dist/hooks/useInstalledAtoms.js.map +1 -0
  231. package/dist/i18n/index.d.ts +15 -0
  232. package/dist/i18n/index.js +14 -0
  233. package/dist/i18n/index.js.map +1 -0
  234. package/dist/i18n/translator.d.ts +76 -0
  235. package/dist/i18n/translator.js +357 -0
  236. package/dist/i18n/translator.js.map +1 -0
  237. package/dist/i18n/types.d.ts +93 -0
  238. package/dist/i18n/types.js +9 -0
  239. package/dist/i18n/types.js.map +1 -0
  240. package/dist/index.d.ts +64 -0
  241. package/dist/index.js +95 -0
  242. package/dist/index.js.map +1 -0
  243. package/dist/kernel.d.ts +47 -0
  244. package/dist/kernel.js +258 -0
  245. package/dist/kernel.js.map +1 -0
  246. package/dist/perf/budget.d.ts +92 -0
  247. package/dist/perf/budget.js +122 -0
  248. package/dist/perf/budget.js.map +1 -0
  249. package/dist/perf/index.d.ts +16 -0
  250. package/dist/perf/index.js +13 -0
  251. package/dist/perf/index.js.map +1 -0
  252. package/dist/perf/render-timer.d.ts +90 -0
  253. package/dist/perf/render-timer.js +136 -0
  254. package/dist/perf/render-timer.js.map +1 -0
  255. package/dist/perf/reporter.d.ts +126 -0
  256. package/dist/perf/reporter.js +241 -0
  257. package/dist/perf/reporter.js.map +1 -0
  258. package/dist/perf/web-vitals.d.ts +111 -0
  259. package/dist/perf/web-vitals.js +268 -0
  260. package/dist/perf/web-vitals.js.map +1 -0
  261. package/dist/registry.d.ts +63 -0
  262. package/dist/registry.js +126 -0
  263. package/dist/registry.js.map +1 -0
  264. package/dist/render/BehaviorSurfaceProvider.d.ts +65 -0
  265. package/dist/render/BehaviorSurfaceProvider.js +185 -0
  266. package/dist/render/BehaviorSurfaceProvider.js.map +1 -0
  267. package/dist/render/BlockErrorBoundary.d.ts +26 -0
  268. package/dist/render/BlockErrorBoundary.js +41 -0
  269. package/dist/render/BlockErrorBoundary.js.map +1 -0
  270. package/dist/render/DataBoundSurfaceRenderer.d.ts +78 -0
  271. package/dist/render/DataBoundSurfaceRenderer.js +998 -0
  272. package/dist/render/DataBoundSurfaceRenderer.js.map +1 -0
  273. package/dist/render/DynamicBlockWrapper.d.ts +23 -0
  274. package/dist/render/DynamicBlockWrapper.js +117 -0
  275. package/dist/render/DynamicBlockWrapper.js.map +1 -0
  276. package/dist/render/appearance-resolver.d.ts +50 -0
  277. package/dist/render/appearance-resolver.js +78 -0
  278. package/dist/render/appearance-resolver.js.map +1 -0
  279. package/dist/render/capability-gate.d.ts +69 -0
  280. package/dist/render/capability-gate.js +94 -0
  281. package/dist/render/capability-gate.js.map +1 -0
  282. package/dist/render/conditional-states-css.d.ts +41 -0
  283. package/dist/render/conditional-states-css.js +82 -0
  284. package/dist/render/conditional-states-css.js.map +1 -0
  285. package/dist/render/connections-context.d.ts +31 -0
  286. package/dist/render/connections-context.js +34 -0
  287. package/dist/render/connections-context.js.map +1 -0
  288. package/dist/render/dark-theme-css.d.ts +36 -0
  289. package/dist/render/dark-theme-css.js +67 -0
  290. package/dist/render/dark-theme-css.js.map +1 -0
  291. package/dist/render/data-binding-types.d.ts +191 -0
  292. package/dist/render/data-binding-types.js +11 -0
  293. package/dist/render/data-binding-types.js.map +1 -0
  294. package/dist/render/data-cache.d.ts +30 -0
  295. package/dist/render/data-cache.js +37 -0
  296. package/dist/render/data-cache.js.map +1 -0
  297. package/dist/render/derive-dark-theme.d.ts +17 -0
  298. package/dist/render/derive-dark-theme.js +18 -0
  299. package/dist/render/derive-dark-theme.js.map +1 -0
  300. package/dist/render/dynamic-artifact-context.d.ts +77 -0
  301. package/dist/render/dynamic-artifact-context.js +89 -0
  302. package/dist/render/dynamic-artifact-context.js.map +1 -0
  303. package/dist/render/dynamic-block-loader.d.ts +80 -0
  304. package/dist/render/dynamic-block-loader.js +197 -0
  305. package/dist/render/dynamic-block-loader.js.map +1 -0
  306. package/dist/render/endpoint.d.ts +18 -0
  307. package/dist/render/endpoint.js +109 -0
  308. package/dist/render/endpoint.js.map +1 -0
  309. package/dist/render/entity-facade-context.d.ts +34 -0
  310. package/dist/render/entity-facade-context.js +37 -0
  311. package/dist/render/entity-facade-context.js.map +1 -0
  312. package/dist/render/group-states-css.d.ts +41 -0
  313. package/dist/render/group-states-css.js +73 -0
  314. package/dist/render/group-states-css.js.map +1 -0
  315. package/dist/render/hooks/useSurfaceEvents.d.ts +8 -0
  316. package/dist/render/hooks/useSurfaceEvents.js +9 -0
  317. package/dist/render/hooks/useSurfaceEvents.js.map +1 -0
  318. package/dist/render/hooks/useSurfaceId.d.ts +8 -0
  319. package/dist/render/hooks/useSurfaceId.js +9 -0
  320. package/dist/render/hooks/useSurfaceId.js.map +1 -0
  321. package/dist/render/index.d.ts +48 -0
  322. package/dist/render/index.js +61 -0
  323. package/dist/render/index.js.map +1 -0
  324. package/dist/render/interaction-rule-engine.d.ts +12 -0
  325. package/dist/render/interaction-rule-engine.js +47 -0
  326. package/dist/render/interaction-rule-engine.js.map +1 -0
  327. package/dist/render/keyframes-css.d.ts +31 -0
  328. package/dist/render/keyframes-css.js +44 -0
  329. package/dist/render/keyframes-css.js.map +1 -0
  330. package/dist/render/query-state.d.ts +3 -0
  331. package/dist/render/query-state.js +70 -0
  332. package/dist/render/query-state.js.map +1 -0
  333. package/dist/render/renderer.d.ts +44 -0
  334. package/dist/render/renderer.js +937 -0
  335. package/dist/render/renderer.js.map +1 -0
  336. package/dist/render/resolve-expressions.d.ts +37 -0
  337. package/dist/render/resolve-expressions.js +309 -0
  338. package/dist/render/resolve-expressions.js.map +1 -0
  339. package/dist/render/responsive-style-css.d.ts +42 -0
  340. package/dist/render/responsive-style-css.js +123 -0
  341. package/dist/render/responsive-style-css.js.map +1 -0
  342. package/dist/render/responsive.d.ts +49 -0
  343. package/dist/render/responsive.js +99 -0
  344. package/dist/render/responsive.js.map +1 -0
  345. package/dist/render/scoped-css.d.ts +71 -0
  346. package/dist/render/scoped-css.js +102 -0
  347. package/dist/render/scoped-css.js.map +1 -0
  348. package/dist/render/shell-selection.d.ts +69 -0
  349. package/dist/render/shell-selection.js +117 -0
  350. package/dist/render/shell-selection.js.map +1 -0
  351. package/dist/render/states-css.d.ts +32 -0
  352. package/dist/render/states-css.js +63 -0
  353. package/dist/render/states-css.js.map +1 -0
  354. package/dist/render/surface-data-context.d.ts +18 -0
  355. package/dist/render/surface-data-context.js +21 -0
  356. package/dist/render/surface-data-context.js.map +1 -0
  357. package/dist/render/surface-event-bus.d.ts +19 -0
  358. package/dist/render/surface-event-bus.js +68 -0
  359. package/dist/render/surface-event-bus.js.map +1 -0
  360. package/dist/render/surface-event-context.d.ts +11 -0
  361. package/dist/render/surface-event-context.js +12 -0
  362. package/dist/render/surface-event-context.js.map +1 -0
  363. package/dist/render/surface-id-context.d.ts +8 -0
  364. package/dist/render/surface-id-context.js +9 -0
  365. package/dist/render/surface-id-context.js.map +1 -0
  366. package/dist/render/theme-utils.d.ts +14 -0
  367. package/dist/render/theme-utils.js +15 -0
  368. package/dist/render/theme-utils.js.map +1 -0
  369. package/dist/render/types.d.ts +282 -0
  370. package/dist/render/types.js +9 -0
  371. package/dist/render/types.js.map +1 -0
  372. package/dist/render/visibility-css.d.ts +42 -0
  373. package/dist/render/visibility-css.js +119 -0
  374. package/dist/render/visibility-css.js.map +1 -0
  375. package/dist/render/width-scope.d.ts +34 -0
  376. package/dist/render/width-scope.js +44 -0
  377. package/dist/render/width-scope.js.map +1 -0
  378. package/dist/render/write-only-sources.d.ts +33 -0
  379. package/dist/render/write-only-sources.js +99 -0
  380. package/dist/render/write-only-sources.js.map +1 -0
  381. package/dist/routing/index.d.ts +14 -0
  382. package/dist/routing/index.js +15 -0
  383. package/dist/routing/index.js.map +1 -0
  384. package/dist/routing/router.d.ts +42 -0
  385. package/dist/routing/router.js +218 -0
  386. package/dist/routing/router.js.map +1 -0
  387. package/dist/routing/types.d.ts +124 -0
  388. package/dist/routing/types.js +9 -0
  389. package/dist/routing/types.js.map +1 -0
  390. package/dist/seo/generator.d.ts +39 -0
  391. package/dist/seo/generator.js +236 -0
  392. package/dist/seo/generator.js.map +1 -0
  393. package/dist/seo/index.d.ts +14 -0
  394. package/dist/seo/index.js +15 -0
  395. package/dist/seo/index.js.map +1 -0
  396. package/dist/seo/types.d.ts +181 -0
  397. package/dist/seo/types.js +9 -0
  398. package/dist/seo/types.js.map +1 -0
  399. package/dist/state/index.d.ts +15 -0
  400. package/dist/state/index.js +16 -0
  401. package/dist/state/index.js.map +1 -0
  402. package/dist/state/manager.d.ts +33 -0
  403. package/dist/state/manager.js +81 -0
  404. package/dist/state/manager.js.map +1 -0
  405. package/dist/state/store.d.ts +40 -0
  406. package/dist/state/store.js +145 -0
  407. package/dist/state/store.js.map +1 -0
  408. package/dist/state/types.d.ts +107 -0
  409. package/dist/state/types.js +9 -0
  410. package/dist/state/types.js.map +1 -0
  411. package/dist/surface/expression.d.ts +65 -0
  412. package/dist/surface/expression.js +179 -0
  413. package/dist/surface/expression.js.map +1 -0
  414. package/dist/surface/index.d.ts +32 -0
  415. package/dist/surface/index.js +25 -0
  416. package/dist/surface/index.js.map +1 -0
  417. package/dist/surface/interpreter.d.ts +96 -0
  418. package/dist/surface/interpreter.js +231 -0
  419. package/dist/surface/interpreter.js.map +1 -0
  420. package/dist/surface/layout.d.ts +54 -0
  421. package/dist/surface/layout.js +288 -0
  422. package/dist/surface/layout.js.map +1 -0
  423. package/dist/surface/output.d.ts +90 -0
  424. package/dist/surface/output.js +104 -0
  425. package/dist/surface/output.js.map +1 -0
  426. package/dist/surface/primitives.d.ts +180 -0
  427. package/dist/surface/primitives.js +339 -0
  428. package/dist/surface/primitives.js.map +1 -0
  429. package/dist/surface/renderer.d.ts +96 -0
  430. package/dist/surface/renderer.js +190 -0
  431. package/dist/surface/renderer.js.map +1 -0
  432. package/dist/surface/schemas.d.ts +181 -0
  433. package/dist/surface/schemas.js +142 -0
  434. package/dist/surface/schemas.js.map +1 -0
  435. package/dist/surface/transforms.d.ts +144 -0
  436. package/dist/surface/transforms.js +120 -0
  437. package/dist/surface/transforms.js.map +1 -0
  438. package/dist/surface/types.d.ts +160 -0
  439. package/dist/surface/types.js +51 -0
  440. package/dist/surface/types.js.map +1 -0
  441. package/dist/surface/validation.d.ts +123 -0
  442. package/dist/surface/validation.js +147 -0
  443. package/dist/surface/validation.js.map +1 -0
  444. package/dist/validator.d.ts +55 -0
  445. package/dist/validator.js +100 -0
  446. package/dist/validator.js.map +1 -0
  447. package/package.json +106 -3
@@ -0,0 +1,556 @@
1
+ /**
2
+ * Data Source Management
3
+ *
4
+ * Data source registry and management for surfaces
5
+ *
6
+ * Provides:
7
+ * - Static data sources (inline data)
8
+ * - API data sources (REST endpoints)
9
+ * - State data sources (from state module)
10
+ * - Caching integration
11
+ *
12
+ * @module @pwfabric/runtime/binding/datasource
13
+ */
14
+ // ============================================================
15
+ // STATIC DATA SOURCE
16
+ // ============================================================
17
+ /**
18
+ * Static data source implementation
19
+ */
20
+ export class StaticDataSource {
21
+ id;
22
+ type = 'static';
23
+ name;
24
+ description;
25
+ data;
26
+ constructor(config) {
27
+ this.id = config.id;
28
+ this.name = config.name;
29
+ this.description = config.description;
30
+ this.data = config.data;
31
+ }
32
+ async fetch() {
33
+ return this.data;
34
+ }
35
+ isLoading() {
36
+ return false;
37
+ }
38
+ }
39
+ // ============================================================
40
+ // API DATA SOURCE
41
+ // ============================================================
42
+ /**
43
+ * API data source implementation with caching and polling support
44
+ */
45
+ export class ApiDataSource {
46
+ id;
47
+ type = 'api';
48
+ name;
49
+ description;
50
+ config;
51
+ cache;
52
+ listeners = new Set();
53
+ pollTimer;
54
+ loading = false;
55
+ lastData;
56
+ constructor(config, cache) {
57
+ this.id = config.id;
58
+ this.name = config.name;
59
+ this.description = config.description;
60
+ this.config = config;
61
+ this.cache = cache;
62
+ // Start polling if configured
63
+ if (config.pollInterval && config.pollInterval > 0) {
64
+ this.startPolling(config.pollInterval);
65
+ }
66
+ }
67
+ async fetch(params) {
68
+ // Check cache first
69
+ if (this.config.cache?.enabled && this.cache) {
70
+ const cacheKey = this.getCacheKey(params);
71
+ const cached = await this.cache.get(cacheKey);
72
+ if (cached !== undefined) {
73
+ return cached;
74
+ }
75
+ }
76
+ this.loading = true;
77
+ try {
78
+ const data = await this.fetchWithRetry(params);
79
+ // Apply transform
80
+ const transformed = this.config.transform ? this.config.transform(data) : data;
81
+ // Store in cache
82
+ if (this.config.cache?.enabled && this.cache) {
83
+ const cacheKey = this.getCacheKey(params);
84
+ await this.cache.set(cacheKey, transformed, this.config.cache.ttl);
85
+ }
86
+ this.lastData = transformed;
87
+ this.notifyListeners(transformed);
88
+ return transformed;
89
+ }
90
+ finally {
91
+ this.loading = false;
92
+ }
93
+ }
94
+ subscribe(listener) {
95
+ this.listeners.add(listener);
96
+ // Immediately notify with last data if available
97
+ if (this.lastData !== undefined) {
98
+ listener(this.lastData);
99
+ }
100
+ return () => {
101
+ this.listeners.delete(listener);
102
+ };
103
+ }
104
+ invalidate() {
105
+ if (this.config.cache?.enabled && this.cache) {
106
+ const cacheKey = this.getCacheKey();
107
+ this.cache.delete(cacheKey);
108
+ }
109
+ }
110
+ isLoading() {
111
+ return this.loading;
112
+ }
113
+ /**
114
+ * Stop polling and clean up
115
+ */
116
+ dispose() {
117
+ if (this.pollTimer) {
118
+ clearInterval(this.pollTimer);
119
+ this.pollTimer = undefined;
120
+ }
121
+ this.listeners.clear();
122
+ }
123
+ async fetchWithRetry(params) {
124
+ const maxAttempts = this.config.retry?.maxAttempts ?? 1;
125
+ const delay = this.config.retry?.delay ?? 1000;
126
+ const exponential = this.config.retry?.exponentialBackoff ?? false;
127
+ let lastError;
128
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
129
+ try {
130
+ return await this.doFetch(params);
131
+ }
132
+ catch (e) {
133
+ lastError = e instanceof Error ? e : new Error(String(e));
134
+ if (attempt < maxAttempts - 1) {
135
+ const waitTime = exponential ? delay * Math.pow(2, attempt) : delay;
136
+ await new Promise((resolve) => setTimeout(resolve, waitTime));
137
+ }
138
+ }
139
+ }
140
+ throw lastError;
141
+ }
142
+ async doFetch(params) {
143
+ const originalUrl = this.config.url;
144
+ let url = originalUrl;
145
+ // Track which params are used in URL replacement
146
+ const usedParams = new Set();
147
+ // Replace URL parameters
148
+ if (params) {
149
+ for (const [key, value] of Object.entries(params)) {
150
+ if (originalUrl.includes(`:${key}`) || originalUrl.includes(`{${key}}`)) {
151
+ url = url.replace(`:${key}`, String(value));
152
+ url = url.replace(`{${key}}`, String(value));
153
+ usedParams.add(key);
154
+ }
155
+ }
156
+ }
157
+ // Build query string
158
+ const queryParams = new URLSearchParams();
159
+ if (this.config.query) {
160
+ for (const [key, value] of Object.entries(this.config.query)) {
161
+ queryParams.append(key, String(value));
162
+ }
163
+ }
164
+ // Add remaining params (not used in URL replacement) to query string
165
+ if (params) {
166
+ for (const [key, value] of Object.entries(params)) {
167
+ if (!usedParams.has(key)) {
168
+ queryParams.append(key, String(value));
169
+ }
170
+ }
171
+ }
172
+ const queryString = queryParams.toString();
173
+ if (queryString) {
174
+ url += (url.includes('?') ? '&' : '?') + queryString;
175
+ }
176
+ const requestInit = {
177
+ method: this.config.method ?? 'GET',
178
+ headers: {
179
+ 'Content-Type': 'application/json',
180
+ ...this.config.headers,
181
+ },
182
+ };
183
+ if (this.config.body) {
184
+ requestInit.body = JSON.stringify(this.config.body);
185
+ }
186
+ const response = await fetch(url, requestInit);
187
+ if (!response.ok) {
188
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
189
+ }
190
+ return response.json();
191
+ }
192
+ getCacheKey(params) {
193
+ if (this.config.cache?.key) {
194
+ return this.config.cache.key;
195
+ }
196
+ const paramsKey = params ? JSON.stringify(params) : '';
197
+ return `datasource:${this.id}:${paramsKey}`;
198
+ }
199
+ startPolling(interval) {
200
+ this.pollTimer = setInterval(() => {
201
+ this.fetch().catch(() => {
202
+ // Polling errors are silently ignored
203
+ });
204
+ }, interval);
205
+ }
206
+ notifyListeners(data) {
207
+ for (const listener of this.listeners) {
208
+ try {
209
+ listener(data);
210
+ }
211
+ catch {
212
+ // Swallow errors from listeners
213
+ }
214
+ }
215
+ }
216
+ }
217
+ // ============================================================
218
+ // GRAPHQL DATA SOURCE
219
+ // ============================================================
220
+ /**
221
+ * GraphQL data source implementation with polling and caching support
222
+ */
223
+ export class GraphQLDataSource {
224
+ id;
225
+ type = 'graphql';
226
+ name;
227
+ description;
228
+ config;
229
+ cache;
230
+ listeners = new Set();
231
+ pollTimer;
232
+ loading = false;
233
+ lastData;
234
+ constructor(config, cache) {
235
+ this.id = config.id;
236
+ this.name = config.name;
237
+ this.description = config.description;
238
+ this.config = config;
239
+ this.cache = cache;
240
+ if (config.pollInterval && config.pollInterval > 0) {
241
+ this.startPolling(config.pollInterval);
242
+ }
243
+ }
244
+ async fetch(params) {
245
+ // Check cache first
246
+ if (this.config.cache?.enabled && this.cache) {
247
+ const cacheKey = this.getCacheKey(params);
248
+ const cached = await this.cache.get(cacheKey);
249
+ if (cached !== undefined) {
250
+ return cached;
251
+ }
252
+ }
253
+ this.loading = true;
254
+ try {
255
+ const data = await this.executeQuery(params);
256
+ // Apply transform
257
+ const transformed = this.config.transform ? this.config.transform(data) : data;
258
+ // Store in cache
259
+ if (this.config.cache?.enabled && this.cache) {
260
+ const cacheKey = this.getCacheKey(params);
261
+ await this.cache.set(cacheKey, transformed, this.config.cache.ttl);
262
+ }
263
+ this.lastData = transformed;
264
+ this.notifyListeners(transformed);
265
+ return transformed;
266
+ }
267
+ finally {
268
+ this.loading = false;
269
+ }
270
+ }
271
+ subscribe(listener) {
272
+ this.listeners.add(listener);
273
+ if (this.lastData !== undefined) {
274
+ listener(this.lastData);
275
+ }
276
+ return () => {
277
+ this.listeners.delete(listener);
278
+ };
279
+ }
280
+ invalidate() {
281
+ if (this.config.cache?.enabled && this.cache) {
282
+ const cacheKey = this.getCacheKey();
283
+ this.cache.delete(cacheKey);
284
+ }
285
+ }
286
+ isLoading() {
287
+ return this.loading;
288
+ }
289
+ dispose() {
290
+ if (this.pollTimer) {
291
+ clearInterval(this.pollTimer);
292
+ this.pollTimer = undefined;
293
+ }
294
+ this.listeners.clear();
295
+ }
296
+ async executeQuery(params) {
297
+ // Merge config variables with runtime params
298
+ const variables = { ...this.config.variables, ...params };
299
+ const response = await fetch(this.config.url, {
300
+ method: 'POST',
301
+ headers: {
302
+ 'Content-Type': 'application/json',
303
+ ...this.config.headers,
304
+ },
305
+ body: JSON.stringify({
306
+ query: this.config.query,
307
+ variables: Object.keys(variables).length > 0 ? variables : undefined,
308
+ }),
309
+ });
310
+ if (!response.ok) {
311
+ throw new Error(`GraphQL HTTP ${response.status}: ${response.statusText}`);
312
+ }
313
+ const result = (await response.json());
314
+ if (result.errors && result.errors.length > 0) {
315
+ const messages = result.errors.map((e) => e.message).join('; ');
316
+ throw new Error(`GraphQL errors: ${messages}`);
317
+ }
318
+ return result.data;
319
+ }
320
+ getCacheKey(params) {
321
+ if (this.config.cache?.key) {
322
+ return this.config.cache.key;
323
+ }
324
+ const paramsKey = params ? JSON.stringify(params) : '';
325
+ return `datasource:graphql:${this.id}:${paramsKey}`;
326
+ }
327
+ startPolling(interval) {
328
+ this.pollTimer = setInterval(() => {
329
+ this.fetch().catch(() => {
330
+ // Polling errors are silently ignored
331
+ });
332
+ }, interval);
333
+ }
334
+ notifyListeners(data) {
335
+ for (const listener of this.listeners) {
336
+ try {
337
+ listener(data);
338
+ }
339
+ catch {
340
+ // Swallow errors from listeners
341
+ }
342
+ }
343
+ }
344
+ }
345
+ // ============================================================
346
+ // STATE DATA SOURCE
347
+ // ============================================================
348
+ /**
349
+ * State data source implementation - binds to state store
350
+ */
351
+ export class StateDataSource {
352
+ id;
353
+ type = 'state';
354
+ name;
355
+ description;
356
+ config;
357
+ stateStore;
358
+ listeners = new Set();
359
+ unsubscribe;
360
+ constructor(config, stateStore) {
361
+ this.id = config.id;
362
+ this.name = config.name;
363
+ this.description = config.description;
364
+ this.config = config;
365
+ this.stateStore = stateStore;
366
+ // Subscribe to state changes
367
+ this.unsubscribe = stateStore.subscribe(config.stateKey, (value) => {
368
+ const transformed = this.config.transform ? this.config.transform(value) : value;
369
+ this.notifyListeners(transformed);
370
+ });
371
+ }
372
+ async fetch() {
373
+ const value = this.stateStore.get(this.config.stateKey);
374
+ return this.config.transform ? this.config.transform(value) : value;
375
+ }
376
+ subscribe(listener) {
377
+ this.listeners.add(listener);
378
+ // Immediately notify with current state
379
+ const current = this.stateStore.get(this.config.stateKey);
380
+ if (current !== undefined) {
381
+ const transformed = this.config.transform
382
+ ? this.config.transform(current)
383
+ : current;
384
+ listener(transformed);
385
+ }
386
+ return () => {
387
+ this.listeners.delete(listener);
388
+ };
389
+ }
390
+ isLoading() {
391
+ return false;
392
+ }
393
+ /**
394
+ * Clean up subscriptions
395
+ */
396
+ dispose() {
397
+ if (this.unsubscribe) {
398
+ this.unsubscribe();
399
+ this.unsubscribe = undefined;
400
+ }
401
+ this.listeners.clear();
402
+ }
403
+ notifyListeners(data) {
404
+ for (const listener of this.listeners) {
405
+ try {
406
+ listener(data);
407
+ }
408
+ catch {
409
+ // Swallow errors from listeners
410
+ }
411
+ }
412
+ }
413
+ }
414
+ /**
415
+ * In-memory data source registry implementation
416
+ */
417
+ export class InMemoryDataSourceRegistry {
418
+ sources = new Map();
419
+ register(source) {
420
+ if (this.sources.has(source.id)) {
421
+ throw new Error(`Data source '${source.id}' is already registered`);
422
+ }
423
+ this.sources.set(source.id, source);
424
+ }
425
+ get(id) {
426
+ return this.sources.get(id);
427
+ }
428
+ has(id) {
429
+ return this.sources.has(id);
430
+ }
431
+ async fetch(id, params) {
432
+ const source = this.sources.get(id);
433
+ if (!source) {
434
+ throw new Error(`Data source '${id}' not found`);
435
+ }
436
+ return source.fetch(params);
437
+ }
438
+ unregister(id) {
439
+ const source = this.sources.get(id);
440
+ if (source) {
441
+ // Dispose if the source has a dispose method
442
+ if ('dispose' in source && typeof source.dispose === 'function') {
443
+ source.dispose();
444
+ }
445
+ return this.sources.delete(id);
446
+ }
447
+ return false;
448
+ }
449
+ ids() {
450
+ return Array.from(this.sources.keys());
451
+ }
452
+ clear() {
453
+ // Dispose all sources
454
+ for (const source of this.sources.values()) {
455
+ if ('dispose' in source && typeof source.dispose === 'function') {
456
+ source.dispose();
457
+ }
458
+ }
459
+ this.sources.clear();
460
+ }
461
+ }
462
+ // ============================================================
463
+ // FACTORY FUNCTIONS
464
+ // ============================================================
465
+ /**
466
+ * Create a data source registry
467
+ */
468
+ export function createDataSourceRegistry() {
469
+ return new InMemoryDataSourceRegistry();
470
+ }
471
+ /**
472
+ * Create a data source from configuration
473
+ */
474
+ export function createDataSource(config, dependencies) {
475
+ switch (config.type) {
476
+ case 'static':
477
+ return new StaticDataSource(config);
478
+ case 'api':
479
+ return new ApiDataSource(config, dependencies?.cache);
480
+ case 'state':
481
+ if (!dependencies?.stateStore) {
482
+ throw new Error('State store is required for state data sources');
483
+ }
484
+ return new StateDataSource(config, dependencies.stateStore);
485
+ case 'graphql':
486
+ return new GraphQLDataSource(config, dependencies?.cache);
487
+ default:
488
+ throw new Error(`Unknown data source type: ${config.type}`);
489
+ }
490
+ }
491
+ /**
492
+ * Create a static data source
493
+ */
494
+ export function createStaticDataSource(id, data, options) {
495
+ const config = {
496
+ id,
497
+ type: 'static',
498
+ data,
499
+ };
500
+ if (options?.name !== undefined) {
501
+ ;
502
+ config.name = options.name;
503
+ }
504
+ if (options?.description !== undefined) {
505
+ ;
506
+ config.description = options.description;
507
+ }
508
+ return new StaticDataSource(config);
509
+ }
510
+ /**
511
+ * Create an API data source
512
+ */
513
+ export function createApiDataSource(id, url, options, cache) {
514
+ return new ApiDataSource({
515
+ id,
516
+ type: 'api',
517
+ url,
518
+ ...options,
519
+ }, cache);
520
+ }
521
+ /**
522
+ * Create a state data source
523
+ */
524
+ export function createStateDataSource(id, stateKey, stateStore, options) {
525
+ const config = {
526
+ id,
527
+ type: 'state',
528
+ stateKey,
529
+ };
530
+ if (options?.name !== undefined) {
531
+ ;
532
+ config.name = options.name;
533
+ }
534
+ if (options?.description !== undefined) {
535
+ ;
536
+ config.description = options.description;
537
+ }
538
+ if (options?.transform !== undefined) {
539
+ ;
540
+ config.transform = options.transform;
541
+ }
542
+ return new StateDataSource(config, stateStore);
543
+ }
544
+ /**
545
+ * Create a GraphQL data source
546
+ */
547
+ export function createGraphQLDataSource(id, url, query, options, cache) {
548
+ return new GraphQLDataSource({
549
+ id,
550
+ type: 'graphql',
551
+ url,
552
+ query,
553
+ ...options,
554
+ }, cache);
555
+ }
556
+ //# sourceMappingURL=datasource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasource.js","sourceRoot":"","sources":["../../src/binding/datasource.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Data Source Management\n *\n * Data source registry and management for surfaces\n *\n * Provides:\n * - Static data sources (inline data)\n * - API data sources (REST endpoints)\n * - State data sources (from state module)\n * - Caching integration\n *\n * @module @pwfabric/runtime/binding/datasource\n */\n\nimport type { CacheProvider } from '../cache/types.js'\nimport type { StateStore } from '../state/types.js'\n\n// ============================================================\n// DATA SOURCE TYPES\n// ============================================================\n\n/**\n * Data source types\n */\nexport type DataSourceType = 'static' | 'api' | 'graphql' | 'state'\n\n/**\n * Data source interface\n */\nexport interface DataSource<T = unknown> {\n /** Unique identifier for the data source */\n readonly id: string\n\n /** Type of data source */\n readonly type: DataSourceType\n\n /** Human-readable name */\n readonly name?: string | undefined\n\n /** Optional description */\n readonly description?: string | undefined\n\n /**\n * Fetch data from the source\n */\n fetch(params?: Record<string, unknown>): Promise<T>\n\n /**\n * Subscribe to data changes (if supported)\n * @returns Unsubscribe function, or undefined if not supported\n */\n subscribe?(listener: DataSourceListener<T>): () => void\n\n /**\n * Invalidate cached data (if caching is enabled)\n */\n invalidate?(): void\n\n /**\n * Check if the data source is loading\n */\n isLoading?(): boolean\n}\n\n/**\n * Listener for data source changes\n */\nexport type DataSourceListener<T> = (data: T) => void\n\n// ============================================================\n// DATA SOURCE CONFIGURATION\n// ============================================================\n\n/**\n * Base configuration for data sources\n */\nexport interface BaseDataSourceConfig {\n /** Unique identifier */\n readonly id: string\n\n /** Human-readable name */\n readonly name?: string | undefined\n\n /** Optional description */\n readonly description?: string | undefined\n\n /** Cache configuration */\n readonly cache?: DataSourceCacheConfig | undefined\n}\n\n/**\n * Cache configuration for data sources\n */\nexport interface DataSourceCacheConfig {\n /** Whether caching is enabled */\n readonly enabled: boolean\n\n /** Time-to-live in milliseconds */\n readonly ttl?: number\n\n /** Custom cache key */\n readonly key?: string\n}\n\n/**\n * Static data source configuration\n */\nexport interface StaticDataSourceConfig<T> extends BaseDataSourceConfig {\n readonly type: 'static'\n\n /** Static data */\n readonly data: T\n}\n\n/**\n * API data source configuration\n */\nexport interface ApiDataSourceConfig extends BaseDataSourceConfig {\n readonly type: 'api'\n\n /** API endpoint URL */\n readonly url: string\n\n /** HTTP method */\n readonly method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'\n\n /** Request headers */\n readonly headers?: Record<string, string>\n\n /** Request body (for POST/PUT/PATCH) */\n readonly body?: unknown\n\n /** Query parameters */\n readonly query?: Record<string, string | number | boolean>\n\n /** Transform response data */\n readonly transform?: (data: unknown) => unknown\n\n /** Polling interval in milliseconds (0 = no polling) */\n readonly pollInterval?: number\n\n /** Retry configuration */\n readonly retry?: DataSourceRetryConfig\n}\n\n/**\n * GraphQL data source configuration\n */\nexport interface GraphQLDataSourceConfig extends BaseDataSourceConfig {\n readonly type: 'graphql'\n\n /** GraphQL endpoint URL */\n readonly url: string\n\n /** GraphQL query */\n readonly query: string\n\n /** GraphQL variables */\n readonly variables?: Record<string, unknown>\n\n /** Request headers */\n readonly headers?: Record<string, string>\n\n /** Transform response data */\n readonly transform?: (data: unknown) => unknown\n\n /** Polling interval in milliseconds (0 = no polling) */\n readonly pollInterval?: number\n}\n\n/**\n * State data source configuration\n */\nexport interface StateDataSourceConfig extends BaseDataSourceConfig {\n readonly type: 'state'\n\n /** State key to bind to */\n readonly stateKey: string\n\n /** Transform state data */\n readonly transform?: ((data: unknown) => unknown) | undefined\n}\n\n/**\n * Union of all data source configurations\n */\nexport type DataSourceConfig<T = unknown> =\n | StaticDataSourceConfig<T>\n | ApiDataSourceConfig\n | GraphQLDataSourceConfig\n | StateDataSourceConfig\n\n/**\n * Retry configuration\n */\nexport interface DataSourceRetryConfig {\n /** Maximum number of retry attempts */\n readonly maxAttempts: number\n\n /** Delay between retries in milliseconds */\n readonly delay: number\n\n /** Whether to use exponential backoff */\n readonly exponentialBackoff?: boolean\n}\n\n// ============================================================\n// STATIC DATA SOURCE\n// ============================================================\n\n/**\n * Static data source implementation\n */\nexport class StaticDataSource<T> implements DataSource<T> {\n readonly id: string\n readonly type: DataSourceType = 'static'\n readonly name: string | undefined\n readonly description: string | undefined\n private readonly data: T\n\n constructor(config: StaticDataSourceConfig<T>) {\n this.id = config.id\n this.name = config.name\n this.description = config.description\n this.data = config.data\n }\n\n async fetch(): Promise<T> {\n return this.data\n }\n\n isLoading(): boolean {\n return false\n }\n}\n\n// ============================================================\n// API DATA SOURCE\n// ============================================================\n\n/**\n * API data source implementation with caching and polling support\n */\nexport class ApiDataSource<T = unknown> implements DataSource<T> {\n readonly id: string\n readonly type: DataSourceType = 'api'\n readonly name: string | undefined\n readonly description: string | undefined\n\n private readonly config: ApiDataSourceConfig\n private readonly cache: CacheProvider | undefined\n private readonly listeners = new Set<DataSourceListener<T>>()\n private pollTimer: ReturnType<typeof setInterval> | undefined\n private loading = false\n private lastData: T | undefined\n\n constructor(config: ApiDataSourceConfig, cache?: CacheProvider) {\n this.id = config.id\n this.name = config.name\n this.description = config.description\n this.config = config\n this.cache = cache\n\n // Start polling if configured\n if (config.pollInterval && config.pollInterval > 0) {\n this.startPolling(config.pollInterval)\n }\n }\n\n async fetch(params?: Record<string, unknown>): Promise<T> {\n // Check cache first\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey(params)\n const cached = await this.cache.get<T>(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n }\n\n this.loading = true\n\n try {\n const data = await this.fetchWithRetry(params)\n\n // Apply transform\n const transformed = this.config.transform ? (this.config.transform(data) as T) : (data as T)\n\n // Store in cache\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey(params)\n await this.cache.set(cacheKey, transformed, this.config.cache.ttl)\n }\n\n this.lastData = transformed\n this.notifyListeners(transformed)\n\n return transformed\n } finally {\n this.loading = false\n }\n }\n\n subscribe(listener: DataSourceListener<T>): () => void {\n this.listeners.add(listener)\n\n // Immediately notify with last data if available\n if (this.lastData !== undefined) {\n listener(this.lastData)\n }\n\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n invalidate(): void {\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey()\n this.cache.delete(cacheKey)\n }\n }\n\n isLoading(): boolean {\n return this.loading\n }\n\n /**\n * Stop polling and clean up\n */\n dispose(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer)\n this.pollTimer = undefined\n }\n this.listeners.clear()\n }\n\n private async fetchWithRetry(params?: Record<string, unknown>): Promise<unknown> {\n const maxAttempts = this.config.retry?.maxAttempts ?? 1\n const delay = this.config.retry?.delay ?? 1000\n const exponential = this.config.retry?.exponentialBackoff ?? false\n\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await this.doFetch(params)\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e))\n\n if (attempt < maxAttempts - 1) {\n const waitTime = exponential ? delay * Math.pow(2, attempt) : delay\n await new Promise((resolve) => setTimeout(resolve, waitTime))\n }\n }\n }\n\n throw lastError\n }\n\n private async doFetch(params?: Record<string, unknown>): Promise<unknown> {\n const originalUrl = this.config.url\n let url = originalUrl\n\n // Track which params are used in URL replacement\n const usedParams = new Set<string>()\n\n // Replace URL parameters\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (originalUrl.includes(`:${key}`) || originalUrl.includes(`{${key}}`)) {\n url = url.replace(`:${key}`, String(value))\n url = url.replace(`{${key}}`, String(value))\n usedParams.add(key)\n }\n }\n }\n\n // Build query string\n const queryParams = new URLSearchParams()\n if (this.config.query) {\n for (const [key, value] of Object.entries(this.config.query)) {\n queryParams.append(key, String(value))\n }\n }\n // Add remaining params (not used in URL replacement) to query string\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (!usedParams.has(key)) {\n queryParams.append(key, String(value))\n }\n }\n }\n const queryString = queryParams.toString()\n if (queryString) {\n url += (url.includes('?') ? '&' : '?') + queryString\n }\n\n const requestInit: RequestInit = {\n method: this.config.method ?? 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n }\n if (this.config.body) {\n requestInit.body = JSON.stringify(this.config.body)\n }\n const response = await fetch(url, requestInit)\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n private getCacheKey(params?: Record<string, unknown>): string {\n if (this.config.cache?.key) {\n return this.config.cache.key\n }\n const paramsKey = params ? JSON.stringify(params) : ''\n return `datasource:${this.id}:${paramsKey}`\n }\n\n private startPolling(interval: number): void {\n this.pollTimer = setInterval(() => {\n this.fetch().catch(() => {\n // Polling errors are silently ignored\n })\n }, interval)\n }\n\n private notifyListeners(data: T): void {\n for (const listener of this.listeners) {\n try {\n listener(data)\n } catch {\n // Swallow errors from listeners\n }\n }\n }\n}\n\n// ============================================================\n// GRAPHQL DATA SOURCE\n// ============================================================\n\n/**\n * GraphQL data source implementation with polling and caching support\n */\nexport class GraphQLDataSource<T = unknown> implements DataSource<T> {\n readonly id: string\n readonly type: DataSourceType = 'graphql'\n readonly name: string | undefined\n readonly description: string | undefined\n\n private readonly config: GraphQLDataSourceConfig\n private readonly cache: CacheProvider | undefined\n private readonly listeners = new Set<DataSourceListener<T>>()\n private pollTimer: ReturnType<typeof setInterval> | undefined\n private loading = false\n private lastData: T | undefined\n\n constructor(config: GraphQLDataSourceConfig, cache?: CacheProvider) {\n this.id = config.id\n this.name = config.name\n this.description = config.description\n this.config = config\n this.cache = cache\n\n if (config.pollInterval && config.pollInterval > 0) {\n this.startPolling(config.pollInterval)\n }\n }\n\n async fetch(params?: Record<string, unknown>): Promise<T> {\n // Check cache first\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey(params)\n const cached = await this.cache.get<T>(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n }\n\n this.loading = true\n\n try {\n const data = await this.executeQuery(params)\n\n // Apply transform\n const transformed = this.config.transform ? (this.config.transform(data) as T) : (data as T)\n\n // Store in cache\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey(params)\n await this.cache.set(cacheKey, transformed, this.config.cache.ttl)\n }\n\n this.lastData = transformed\n this.notifyListeners(transformed)\n\n return transformed\n } finally {\n this.loading = false\n }\n }\n\n subscribe(listener: DataSourceListener<T>): () => void {\n this.listeners.add(listener)\n\n if (this.lastData !== undefined) {\n listener(this.lastData)\n }\n\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n invalidate(): void {\n if (this.config.cache?.enabled && this.cache) {\n const cacheKey = this.getCacheKey()\n this.cache.delete(cacheKey)\n }\n }\n\n isLoading(): boolean {\n return this.loading\n }\n\n dispose(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer)\n this.pollTimer = undefined\n }\n this.listeners.clear()\n }\n\n private async executeQuery(params?: Record<string, unknown>): Promise<unknown> {\n // Merge config variables with runtime params\n const variables = { ...this.config.variables, ...params }\n\n const response = await fetch(this.config.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.config.headers,\n },\n body: JSON.stringify({\n query: this.config.query,\n variables: Object.keys(variables).length > 0 ? variables : undefined,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`GraphQL HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = (await response.json()) as {\n data?: unknown\n errors?: { message: string }[]\n }\n\n if (result.errors && result.errors.length > 0) {\n const messages = result.errors.map((e) => e.message).join('; ')\n throw new Error(`GraphQL errors: ${messages}`)\n }\n\n return result.data\n }\n\n private getCacheKey(params?: Record<string, unknown>): string {\n if (this.config.cache?.key) {\n return this.config.cache.key\n }\n const paramsKey = params ? JSON.stringify(params) : ''\n return `datasource:graphql:${this.id}:${paramsKey}`\n }\n\n private startPolling(interval: number): void {\n this.pollTimer = setInterval(() => {\n this.fetch().catch(() => {\n // Polling errors are silently ignored\n })\n }, interval)\n }\n\n private notifyListeners(data: T): void {\n for (const listener of this.listeners) {\n try {\n listener(data)\n } catch {\n // Swallow errors from listeners\n }\n }\n }\n}\n\n// ============================================================\n// STATE DATA SOURCE\n// ============================================================\n\n/**\n * State data source implementation - binds to state store\n */\nexport class StateDataSource<T = unknown> implements DataSource<T> {\n readonly id: string\n readonly type: DataSourceType = 'state'\n readonly name: string | undefined\n readonly description: string | undefined\n\n private readonly config: StateDataSourceConfig\n private readonly stateStore: StateStore\n private readonly listeners = new Set<DataSourceListener<T>>()\n private unsubscribe: (() => void) | undefined\n\n constructor(config: StateDataSourceConfig, stateStore: StateStore) {\n this.id = config.id\n this.name = config.name\n this.description = config.description\n this.config = config\n this.stateStore = stateStore\n\n // Subscribe to state changes\n this.unsubscribe = stateStore.subscribe(config.stateKey, (value) => {\n const transformed = this.config.transform ? (this.config.transform(value) as T) : (value as T)\n this.notifyListeners(transformed)\n })\n }\n\n async fetch(): Promise<T> {\n const value = this.stateStore.get(this.config.stateKey)\n return this.config.transform ? (this.config.transform(value) as T) : (value as T)\n }\n\n subscribe(listener: DataSourceListener<T>): () => void {\n this.listeners.add(listener)\n\n // Immediately notify with current state\n const current = this.stateStore.get(this.config.stateKey)\n if (current !== undefined) {\n const transformed = this.config.transform\n ? (this.config.transform(current) as T)\n : (current as T)\n listener(transformed)\n }\n\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n isLoading(): boolean {\n return false\n }\n\n /**\n * Clean up subscriptions\n */\n dispose(): void {\n if (this.unsubscribe) {\n this.unsubscribe()\n this.unsubscribe = undefined\n }\n this.listeners.clear()\n }\n\n private notifyListeners(data: T): void {\n for (const listener of this.listeners) {\n try {\n listener(data)\n } catch {\n // Swallow errors from listeners\n }\n }\n }\n}\n\n// ============================================================\n// DATA SOURCE REGISTRY\n// ============================================================\n\n/**\n * Data source registry interface\n */\nexport interface DataSourceRegistry {\n /**\n * Register a data source\n */\n register<T>(source: DataSource<T>): void\n\n /**\n * Get a data source by ID\n */\n get<T>(id: string): DataSource<T> | undefined\n\n /**\n * Check if a data source exists\n */\n has(id: string): boolean\n\n /**\n * Fetch data from a source by ID\n */\n fetch<T>(id: string, params?: Record<string, unknown>): Promise<T>\n\n /**\n * Unregister a data source\n */\n unregister(id: string): boolean\n\n /**\n * Get all registered data source IDs\n */\n ids(): string[]\n\n /**\n * Clear all data sources\n */\n clear(): void\n}\n\n/**\n * In-memory data source registry implementation\n */\nexport class InMemoryDataSourceRegistry implements DataSourceRegistry {\n private readonly sources = new Map<string, DataSource>()\n\n register<T>(source: DataSource<T>): void {\n if (this.sources.has(source.id)) {\n throw new Error(`Data source '${source.id}' is already registered`)\n }\n this.sources.set(source.id, source as DataSource)\n }\n\n get<T>(id: string): DataSource<T> | undefined {\n return this.sources.get(id) as DataSource<T> | undefined\n }\n\n has(id: string): boolean {\n return this.sources.has(id)\n }\n\n async fetch<T>(id: string, params?: Record<string, unknown>): Promise<T> {\n const source = this.sources.get(id)\n if (!source) {\n throw new Error(`Data source '${id}' not found`)\n }\n return source.fetch(params) as Promise<T>\n }\n\n unregister(id: string): boolean {\n const source = this.sources.get(id)\n if (source) {\n // Dispose if the source has a dispose method\n if ('dispose' in source && typeof source.dispose === 'function') {\n source.dispose()\n }\n return this.sources.delete(id)\n }\n return false\n }\n\n ids(): string[] {\n return Array.from(this.sources.keys())\n }\n\n clear(): void {\n // Dispose all sources\n for (const source of this.sources.values()) {\n if ('dispose' in source && typeof source.dispose === 'function') {\n source.dispose()\n }\n }\n this.sources.clear()\n }\n}\n\n// ============================================================\n// FACTORY FUNCTIONS\n// ============================================================\n\n/**\n * Create a data source registry\n */\nexport function createDataSourceRegistry(): DataSourceRegistry {\n return new InMemoryDataSourceRegistry()\n}\n\n/**\n * Create a data source from configuration\n */\nexport function createDataSource<T>(\n config: DataSourceConfig<T>,\n dependencies?: {\n cache?: CacheProvider\n stateStore?: StateStore\n }\n): DataSource<T> {\n switch (config.type) {\n case 'static':\n return new StaticDataSource(config) as DataSource<T>\n\n case 'api':\n return new ApiDataSource(config, dependencies?.cache) as DataSource<T>\n\n case 'state':\n if (!dependencies?.stateStore) {\n throw new Error('State store is required for state data sources')\n }\n return new StateDataSource(config, dependencies.stateStore) as DataSource<T>\n\n case 'graphql':\n return new GraphQLDataSource(config, dependencies?.cache) as DataSource<T>\n\n default:\n throw new Error(`Unknown data source type: ${(config as DataSourceConfig).type}`)\n }\n}\n\n/**\n * Create a static data source\n */\nexport function createStaticDataSource<T>(\n id: string,\n data: T,\n options?: { name?: string; description?: string }\n): DataSource<T> {\n const config: StaticDataSourceConfig<T> = {\n id,\n type: 'static',\n data,\n }\n if (options?.name !== undefined) {\n ;(config as { name: string }).name = options.name\n }\n if (options?.description !== undefined) {\n ;(config as { description: string }).description = options.description\n }\n return new StaticDataSource(config)\n}\n\n/**\n * Create an API data source\n */\nexport function createApiDataSource<T>(\n id: string,\n url: string,\n options?: Omit<ApiDataSourceConfig, 'id' | 'type' | 'url'>,\n cache?: CacheProvider\n): DataSource<T> {\n return new ApiDataSource<T>(\n {\n id,\n type: 'api',\n url,\n ...options,\n },\n cache\n )\n}\n\n/**\n * Create a state data source\n */\nexport function createStateDataSource<T>(\n id: string,\n stateKey: string,\n stateStore: StateStore,\n options?: { name?: string; description?: string; transform?: (data: unknown) => T }\n): DataSource<T> {\n const config: StateDataSourceConfig = {\n id,\n type: 'state',\n stateKey,\n }\n if (options?.name !== undefined) {\n ;(config as { name: string }).name = options.name\n }\n if (options?.description !== undefined) {\n ;(config as { description: string }).description = options.description\n }\n if (options?.transform !== undefined) {\n ;(config as { transform: (data: unknown) => unknown }).transform = options.transform\n }\n return new StateDataSource<T>(config, stateStore)\n}\n\n/**\n * Create a GraphQL data source\n */\nexport function createGraphQLDataSource<T>(\n id: string,\n url: string,\n query: string,\n options?: Omit<GraphQLDataSourceConfig, 'id' | 'type' | 'url' | 'query'>,\n cache?: CacheProvider\n): DataSource<T> {\n return new GraphQLDataSource<T>(\n {\n id,\n type: 'graphql',\n url,\n query,\n ...options,\n },\n cache\n )\n}\n"]}