@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,65 @@
1
+ /**
2
+ * Binding Engine
3
+ *
4
+ * Resolves and manages capability bindings for surfaces
5
+ *
6
+ * @module @pwfabric/runtime/binding/engine
7
+ */
8
+ import type { SurfaceId } from '@pwfabric/contracts';
9
+ import type { FabricKernel } from '../kernel.js';
10
+ import type { BindingConfig, BoundCapability, BindingContext, BindingResult, SurfaceBindingResult, AuthContext } from './types.js';
11
+ import type { CacheProvider } from '../cache/types.js';
12
+ /**
13
+ * Binding engine interface
14
+ */
15
+ export interface BindingEngine {
16
+ /**
17
+ * Bind a capability to a surface
18
+ */
19
+ bind<TOutput>(surfaceId: SurfaceId, config: BindingConfig): BindingResult<TOutput>;
20
+ /**
21
+ * Bind all capabilities for a surface
22
+ */
23
+ bindAll(surfaceId: SurfaceId, configs: readonly BindingConfig[]): SurfaceBindingResult;
24
+ /**
25
+ * Get a bound capability
26
+ */
27
+ get(surfaceId: SurfaceId, alias: string): BoundCapability | undefined;
28
+ /**
29
+ * Unbind a capability
30
+ */
31
+ unbind(surfaceId: SurfaceId, alias: string): boolean;
32
+ /**
33
+ * Unbind all capabilities for a surface
34
+ */
35
+ unbindAll(surfaceId: SurfaceId): void;
36
+ /**
37
+ * Get binding context for a surface
38
+ */
39
+ getContext(surfaceId: SurfaceId): BindingContext | undefined;
40
+ /**
41
+ * Set authentication context
42
+ */
43
+ setAuthContext(surfaceId: SurfaceId, auth: AuthContext): void;
44
+ }
45
+ /**
46
+ * Runtime binding engine implementation
47
+ */
48
+ export declare class RuntimeBindingEngine implements BindingEngine {
49
+ private readonly fabric;
50
+ private readonly cache;
51
+ private readonly contexts;
52
+ constructor(fabric: FabricKernel, cache?: CacheProvider);
53
+ bind<TOutput>(surfaceId: SurfaceId, config: BindingConfig): BindingResult<TOutput>;
54
+ bindAll(surfaceId: SurfaceId, configs: readonly BindingConfig[]): SurfaceBindingResult;
55
+ get(surfaceId: SurfaceId, alias: string): BoundCapability | undefined;
56
+ unbind(surfaceId: SurfaceId, alias: string): boolean;
57
+ unbindAll(surfaceId: SurfaceId): void;
58
+ getContext(surfaceId: SurfaceId): BindingContext | undefined;
59
+ setAuthContext(surfaceId: SurfaceId, auth: AuthContext): void;
60
+ private createBoundCapability;
61
+ }
62
+ /**
63
+ * Create a binding engine
64
+ */
65
+ export declare function createBindingEngine(fabric: FabricKernel, cache?: CacheProvider): BindingEngine;
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Binding Engine
3
+ *
4
+ * Resolves and manages capability bindings for surfaces
5
+ *
6
+ * @module @pwfabric/runtime/binding/engine
7
+ */
8
+ import { executionErr } from '@pwfabric/contracts';
9
+ // ============================================================
10
+ // RUNTIME BINDING ENGINE
11
+ // ============================================================
12
+ /**
13
+ * Runtime binding engine implementation
14
+ */
15
+ export class RuntimeBindingEngine {
16
+ fabric;
17
+ cache;
18
+ contexts = new Map();
19
+ constructor(fabric, cache) {
20
+ this.fabric = fabric;
21
+ this.cache = cache;
22
+ }
23
+ bind(surfaceId, config) {
24
+ // Resolve capability from fabric
25
+ const resolution = this.fabric.resolve(config.capabilityId);
26
+ if (!resolution.found) {
27
+ return {
28
+ success: false,
29
+ error: {
30
+ type: 'resolution_failed',
31
+ message: `Capability ${config.capabilityId} not found`,
32
+ },
33
+ };
34
+ }
35
+ const alias = config.alias ?? config.capabilityId;
36
+ // Create bound capability
37
+ const boundCapability = this.createBoundCapability(surfaceId, alias, resolution.capability, config);
38
+ // Get or create context
39
+ let context = this.contexts.get(surfaceId);
40
+ if (!context) {
41
+ context = {
42
+ surfaceId,
43
+ data: {},
44
+ bindings: new Map(),
45
+ };
46
+ this.contexts.set(surfaceId, context);
47
+ }
48
+ // Add to bindings
49
+ context.bindings.set(alias, boundCapability);
50
+ return { success: true, binding: boundCapability };
51
+ }
52
+ bindAll(surfaceId, configs) {
53
+ const errors = [];
54
+ for (const config of configs) {
55
+ const result = this.bind(surfaceId, config);
56
+ if (!result.success) {
57
+ errors.push(result.error);
58
+ }
59
+ }
60
+ if (errors.length > 0) {
61
+ return { success: false, errors };
62
+ }
63
+ const context = this.contexts.get(surfaceId);
64
+ if (!context) {
65
+ return {
66
+ success: false,
67
+ errors: [{ type: 'resolution_failed', message: 'Context not created' }],
68
+ };
69
+ }
70
+ return { success: true, context };
71
+ }
72
+ get(surfaceId, alias) {
73
+ return this.contexts.get(surfaceId)?.bindings.get(alias);
74
+ }
75
+ unbind(surfaceId, alias) {
76
+ const context = this.contexts.get(surfaceId);
77
+ if (!context)
78
+ return false;
79
+ return context.bindings.delete(alias);
80
+ }
81
+ unbindAll(surfaceId) {
82
+ this.contexts.delete(surfaceId);
83
+ }
84
+ getContext(surfaceId) {
85
+ return this.contexts.get(surfaceId);
86
+ }
87
+ setAuthContext(surfaceId, auth) {
88
+ const existing = this.contexts.get(surfaceId);
89
+ if (existing) {
90
+ const updated = {
91
+ ...existing,
92
+ auth,
93
+ };
94
+ this.contexts.set(surfaceId, updated);
95
+ }
96
+ else {
97
+ this.contexts.set(surfaceId, {
98
+ surfaceId,
99
+ auth,
100
+ data: {},
101
+ bindings: new Map(),
102
+ });
103
+ }
104
+ }
105
+ createBoundCapability(surfaceId, alias, _capability, config) {
106
+ let state = 'bound';
107
+ let lastExecuted;
108
+ let lastResult;
109
+ let lastInput;
110
+ let error;
111
+ const execute = async (input) => {
112
+ state = 'binding';
113
+ lastInput = input;
114
+ try {
115
+ // Apply input transform if configured
116
+ let transformedInput = input;
117
+ if (config.transform?.input) {
118
+ try {
119
+ transformedInput = config.transform.input(input);
120
+ }
121
+ catch (e) {
122
+ state = 'error';
123
+ error = {
124
+ type: 'transform_failed',
125
+ message: `Input transform failed: ${e}`,
126
+ cause: e,
127
+ };
128
+ const execError = {
129
+ type: 'execution_error',
130
+ message: error.message,
131
+ capabilityId: config.capabilityId,
132
+ };
133
+ return executionErr(execError);
134
+ }
135
+ }
136
+ // Check cache if enabled
137
+ if (config.cache?.enabled && this.cache) {
138
+ const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(input)}`;
139
+ const cached = await this.cache.get(cacheKey);
140
+ if (cached !== undefined) {
141
+ state = 'bound';
142
+ lastExecuted = Date.now();
143
+ lastResult = { success: true, data: cached };
144
+ return lastResult;
145
+ }
146
+ }
147
+ // Execute capability
148
+ const result = await this.fabric.execute(config.capabilityId, transformedInput);
149
+ if (result.success) {
150
+ // Apply output transform if configured
151
+ let output = result.data;
152
+ if (config.transform?.output) {
153
+ try {
154
+ output = config.transform.output(output);
155
+ }
156
+ catch (e) {
157
+ state = 'error';
158
+ error = {
159
+ type: 'transform_failed',
160
+ message: `Output transform failed: ${e}`,
161
+ cause: e,
162
+ };
163
+ const execError = {
164
+ type: 'execution_error',
165
+ message: error.message,
166
+ capabilityId: config.capabilityId,
167
+ };
168
+ return executionErr(execError);
169
+ }
170
+ }
171
+ // Store in cache if enabled
172
+ if (config.cache?.enabled && this.cache) {
173
+ const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(input)}`;
174
+ await this.cache.set(cacheKey, output, config.cache.ttl);
175
+ }
176
+ state = 'bound';
177
+ lastExecuted = Date.now();
178
+ lastResult = { success: true, data: output };
179
+ return lastResult;
180
+ }
181
+ else {
182
+ state = 'error';
183
+ error = {
184
+ type: 'execution_failed',
185
+ message: result.error.message,
186
+ cause: result.error,
187
+ };
188
+ lastResult = result;
189
+ return result;
190
+ }
191
+ }
192
+ catch (e) {
193
+ state = 'error';
194
+ error = {
195
+ type: 'execution_failed',
196
+ message: `Execution failed: ${e}`,
197
+ cause: e,
198
+ };
199
+ const execError = {
200
+ type: 'execution_error',
201
+ message: error.message,
202
+ capabilityId: config.capabilityId,
203
+ };
204
+ return executionErr(execError);
205
+ }
206
+ };
207
+ const refresh = async () => {
208
+ if (lastInput === undefined) {
209
+ const execError = {
210
+ type: 'execution_error',
211
+ message: 'No previous input to refresh',
212
+ capabilityId: config.capabilityId,
213
+ };
214
+ return executionErr(execError);
215
+ }
216
+ return execute(lastInput);
217
+ };
218
+ const invalidate = () => {
219
+ state = 'stale';
220
+ if (config.cache?.enabled && this.cache) {
221
+ const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(lastInput)}`;
222
+ this.cache.delete(cacheKey);
223
+ }
224
+ };
225
+ const boundCapability = {
226
+ get id() {
227
+ return `${surfaceId}:${alias}`;
228
+ },
229
+ capabilityId: config.capabilityId,
230
+ get state() {
231
+ return state;
232
+ },
233
+ config,
234
+ execute,
235
+ refresh,
236
+ invalidate,
237
+ };
238
+ // Use Object.defineProperties for optional getters to satisfy exactOptionalPropertyTypes
239
+ Object.defineProperties(boundCapability, {
240
+ lastExecuted: {
241
+ get() {
242
+ return lastExecuted;
243
+ },
244
+ enumerable: true,
245
+ },
246
+ lastResult: {
247
+ get() {
248
+ return lastResult;
249
+ },
250
+ enumerable: true,
251
+ },
252
+ error: {
253
+ get() {
254
+ return error;
255
+ },
256
+ enumerable: true,
257
+ },
258
+ });
259
+ return boundCapability;
260
+ }
261
+ }
262
+ /**
263
+ * Create a binding engine
264
+ */
265
+ export function createBindingEngine(fabric, cache) {
266
+ return new RuntimeBindingEngine(fabric, cache);
267
+ }
268
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/binding/engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Binding Engine\n *\n * Resolves and manages capability bindings for surfaces\n *\n * @module @pwfabric/runtime/binding/engine\n */\n\nimport type { SurfaceId, Capability, ExecutionResult, ExecutionError } from '@pwfabric/contracts'\nimport { executionErr } from '@pwfabric/contracts'\nimport type { FabricKernel } from '../kernel.js'\nimport type {\n BindingConfig,\n BoundCapability,\n BindingState,\n BindingError,\n BindingContext,\n BindingResult,\n SurfaceBindingResult,\n AuthContext,\n} from './types.js'\nimport type { CacheProvider } from '../cache/types.js'\n\n// ============================================================\n// BINDING ENGINE\n// ============================================================\n\n/**\n * Binding engine interface\n */\nexport interface BindingEngine {\n /**\n * Bind a capability to a surface\n */\n bind<TOutput>(surfaceId: SurfaceId, config: BindingConfig): BindingResult<TOutput>\n\n /**\n * Bind all capabilities for a surface\n */\n bindAll(surfaceId: SurfaceId, configs: readonly BindingConfig[]): SurfaceBindingResult\n\n /**\n * Get a bound capability\n */\n get(surfaceId: SurfaceId, alias: string): BoundCapability | undefined\n\n /**\n * Unbind a capability\n */\n unbind(surfaceId: SurfaceId, alias: string): boolean\n\n /**\n * Unbind all capabilities for a surface\n */\n unbindAll(surfaceId: SurfaceId): void\n\n /**\n * Get binding context for a surface\n */\n getContext(surfaceId: SurfaceId): BindingContext | undefined\n\n /**\n * Set authentication context\n */\n setAuthContext(surfaceId: SurfaceId, auth: AuthContext): void\n}\n\n// ============================================================\n// RUNTIME BINDING ENGINE\n// ============================================================\n\n/**\n * Runtime binding engine implementation\n */\nexport class RuntimeBindingEngine implements BindingEngine {\n private readonly fabric: FabricKernel\n private readonly cache: CacheProvider | undefined\n private readonly contexts = new Map<SurfaceId, BindingContext>()\n\n constructor(fabric: FabricKernel, cache?: CacheProvider) {\n this.fabric = fabric\n this.cache = cache\n }\n\n bind<TOutput>(surfaceId: SurfaceId, config: BindingConfig): BindingResult<TOutput> {\n // Resolve capability from fabric\n const resolution = this.fabric.resolve(config.capabilityId)\n if (!resolution.found) {\n return {\n success: false,\n error: {\n type: 'resolution_failed',\n message: `Capability ${config.capabilityId} not found`,\n },\n }\n }\n\n const alias = config.alias ?? config.capabilityId\n\n // Create bound capability\n const boundCapability = this.createBoundCapability<unknown, TOutput>(\n surfaceId,\n alias,\n resolution.capability,\n config\n )\n\n // Get or create context\n let context = this.contexts.get(surfaceId)\n if (!context) {\n context = {\n surfaceId,\n data: {},\n bindings: new Map(),\n }\n this.contexts.set(surfaceId, context)\n }\n\n // Add to bindings\n context.bindings.set(alias, boundCapability as BoundCapability)\n\n return { success: true, binding: boundCapability }\n }\n\n bindAll(surfaceId: SurfaceId, configs: readonly BindingConfig[]): SurfaceBindingResult {\n const errors: BindingError[] = []\n\n for (const config of configs) {\n const result = this.bind(surfaceId, config)\n if (!result.success) {\n errors.push(result.error)\n }\n }\n\n if (errors.length > 0) {\n return { success: false, errors }\n }\n\n const context = this.contexts.get(surfaceId)\n if (!context) {\n return {\n success: false,\n errors: [{ type: 'resolution_failed', message: 'Context not created' }],\n }\n }\n\n return { success: true, context }\n }\n\n get(surfaceId: SurfaceId, alias: string): BoundCapability | undefined {\n return this.contexts.get(surfaceId)?.bindings.get(alias)\n }\n\n unbind(surfaceId: SurfaceId, alias: string): boolean {\n const context = this.contexts.get(surfaceId)\n if (!context) return false\n return context.bindings.delete(alias)\n }\n\n unbindAll(surfaceId: SurfaceId): void {\n this.contexts.delete(surfaceId)\n }\n\n getContext(surfaceId: SurfaceId): BindingContext | undefined {\n return this.contexts.get(surfaceId)\n }\n\n setAuthContext(surfaceId: SurfaceId, auth: AuthContext): void {\n const existing = this.contexts.get(surfaceId)\n if (existing) {\n const updated: BindingContext = {\n ...existing,\n auth,\n }\n this.contexts.set(surfaceId, updated)\n } else {\n this.contexts.set(surfaceId, {\n surfaceId,\n auth,\n data: {},\n bindings: new Map(),\n })\n }\n }\n\n private createBoundCapability<TInput, TOutput>(\n surfaceId: SurfaceId,\n alias: string,\n _capability: Capability,\n config: BindingConfig\n ): BoundCapability<TInput, TOutput> {\n let state: BindingState = 'bound'\n let lastExecuted: number | undefined\n let lastResult: ExecutionResult<TOutput> | undefined\n let lastInput: TInput | undefined\n let error: BindingError | undefined\n\n const execute = async (input: TInput): Promise<ExecutionResult<TOutput>> => {\n state = 'binding'\n lastInput = input\n\n try {\n // Apply input transform if configured\n let transformedInput = input\n if (config.transform?.input) {\n try {\n transformedInput = config.transform.input(input) as TInput\n } catch (e) {\n state = 'error'\n error = {\n type: 'transform_failed',\n message: `Input transform failed: ${e}`,\n cause: e,\n }\n const execError: ExecutionError = {\n type: 'execution_error',\n message: error.message,\n capabilityId: config.capabilityId,\n }\n return executionErr(execError)\n }\n }\n\n // Check cache if enabled\n if (config.cache?.enabled && this.cache) {\n const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(input)}`\n const cached = await this.cache.get<TOutput>(cacheKey)\n if (cached !== undefined) {\n state = 'bound'\n lastExecuted = Date.now()\n lastResult = { success: true, data: cached }\n return lastResult\n }\n }\n\n // Execute capability\n const result = await this.fabric.execute<TInput, TOutput>(\n config.capabilityId,\n transformedInput\n )\n\n if (result.success) {\n // Apply output transform if configured\n let output = result.data\n if (config.transform?.output) {\n try {\n output = config.transform.output(output) as TOutput\n } catch (e) {\n state = 'error'\n error = {\n type: 'transform_failed',\n message: `Output transform failed: ${e}`,\n cause: e,\n }\n const execError: ExecutionError = {\n type: 'execution_error',\n message: error.message,\n capabilityId: config.capabilityId,\n }\n return executionErr(execError)\n }\n }\n\n // Store in cache if enabled\n if (config.cache?.enabled && this.cache) {\n const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(input)}`\n await this.cache.set(cacheKey, output, config.cache.ttl)\n }\n\n state = 'bound'\n lastExecuted = Date.now()\n lastResult = { success: true, data: output }\n return lastResult\n } else {\n state = 'error'\n error = {\n type: 'execution_failed',\n message: result.error.message,\n cause: result.error,\n }\n lastResult = result\n return result\n }\n } catch (e) {\n state = 'error'\n error = {\n type: 'execution_failed',\n message: `Execution failed: ${e}`,\n cause: e,\n }\n const execError: ExecutionError = {\n type: 'execution_error',\n message: error.message,\n capabilityId: config.capabilityId,\n }\n return executionErr(execError)\n }\n }\n\n const refresh = async (): Promise<ExecutionResult<TOutput>> => {\n if (lastInput === undefined) {\n const execError: ExecutionError = {\n type: 'execution_error',\n message: 'No previous input to refresh',\n capabilityId: config.capabilityId,\n }\n return executionErr(execError)\n }\n return execute(lastInput)\n }\n\n const invalidate = (): void => {\n state = 'stale'\n if (config.cache?.enabled && this.cache) {\n const cacheKey = config.cache.key ?? `${surfaceId}:${alias}:${JSON.stringify(lastInput)}`\n this.cache.delete(cacheKey)\n }\n }\n\n const boundCapability: BoundCapability<TInput, TOutput> = {\n get id() {\n return `${surfaceId}:${alias}`\n },\n capabilityId: config.capabilityId,\n get state() {\n return state\n },\n config,\n execute,\n refresh,\n invalidate,\n }\n\n // Use Object.defineProperties for optional getters to satisfy exactOptionalPropertyTypes\n Object.defineProperties(boundCapability, {\n lastExecuted: {\n get() {\n return lastExecuted\n },\n enumerable: true,\n },\n lastResult: {\n get() {\n return lastResult\n },\n enumerable: true,\n },\n error: {\n get() {\n return error\n },\n enumerable: true,\n },\n })\n\n return boundCapability\n }\n}\n\n/**\n * Create a binding engine\n */\nexport function createBindingEngine(fabric: FabricKernel, cache?: CacheProvider): BindingEngine {\n return new RuntimeBindingEngine(fabric, cache)\n}\n"]}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Expression Evaluator for Data Binding
3
+ *
4
+ * Enhanced expression evaluation for data binding in surfaces
5
+ *
6
+ * This module extends the base expression evaluator with:
7
+ * - Arithmetic operations (+, -, *, /, %)
8
+ * - Data/state/params context separation
9
+ * - Dependency extraction for reactive updates
10
+ * - Safe null-coalescing operators
11
+ *
12
+ * @module @pwfabric/runtime/binding/expression
13
+ */
14
+ /**
15
+ * Context for expression evaluation in data binding
16
+ */
17
+ export interface BindingExpressionContext {
18
+ /** Data from data sources */
19
+ readonly data: Record<string, unknown>;
20
+ /** State from state stores */
21
+ readonly state: Record<string, unknown>;
22
+ /** URL/route parameters */
23
+ readonly params: Record<string, unknown>;
24
+ /** Custom helper functions */
25
+ readonly helpers?: Record<string, (...args: unknown[]) => unknown>;
26
+ }
27
+ /**
28
+ * Result of expression evaluation
29
+ */
30
+ export type ExpressionEvalResult<T = unknown> = {
31
+ readonly success: true;
32
+ readonly value: T;
33
+ } | {
34
+ readonly success: false;
35
+ readonly error: string;
36
+ };
37
+ /**
38
+ * Expression evaluator interface for data binding
39
+ */
40
+ export interface ExpressionEvaluator {
41
+ /**
42
+ * Evaluate an expression in the given context
43
+ */
44
+ evaluate(expression: string, context: BindingExpressionContext): unknown;
45
+ /**
46
+ * Check if a value is an expression (contains {{...}})
47
+ */
48
+ isExpression(value: unknown): boolean;
49
+ /**
50
+ * Extract dependencies from an expression for reactive updates
51
+ */
52
+ extractDependencies(expression: string): ExpressionDependency[];
53
+ /**
54
+ * Interpolate expressions in a template string
55
+ */
56
+ interpolate(template: string, context: BindingExpressionContext): string;
57
+ }
58
+ /**
59
+ * Dependency extracted from an expression
60
+ */
61
+ export interface ExpressionDependency {
62
+ /** The source of the dependency */
63
+ readonly source: 'data' | 'state' | 'params';
64
+ /** The path within the source */
65
+ readonly path: string;
66
+ }
67
+ /**
68
+ * Read one named property off a value, stepping into a list of one record.
69
+ *
70
+ * A LIST SOURCE ALWAYS BINDS AS A LIST (DataBoundSurfaceRenderer): a `rest`,
71
+ * `entity` or `graphql` source answering with ONE object is bound as `[obj]`,
72
+ * so `{{src[0].field}}` and `{{src.length}}` behave the same whatever the
73
+ * endpoint returned. But a detail page is authored as `{{product.title}}`, and
74
+ * a property read on an array finds nothing — such a page would render blank
75
+ * (`{{rows.name}}` → empty while `{{rows[0].name}}` → "banana").
76
+ *
77
+ * So: when the value is an array of EXACTLY ONE element and the array itself
78
+ * does not carry the key (not `length`, not an index, not an array method),
79
+ * the read continues into that one element. A list of two or more is a list —
80
+ * its `.title` stays undefined, as it always was. Both evaluators (this one
81
+ * and surface/expression) read properties through here, so a path means the
82
+ * same thing in a binding and in a block prop.
83
+ */
84
+ export declare function readProperty(target: unknown, key: string): unknown;
85
+ /**
86
+ * Resolve a dotted path in an object, handling nested properties and array indices
87
+ *
88
+ * @example
89
+ * resolvePath({ user: { name: 'John' } }, 'user.name') // 'John'
90
+ * resolvePath({ items: ['a', 'b'] }, 'items[0]') // 'a'
91
+ * resolvePath({ users: [{ name: 'John' }] }, 'users[0].name') // 'John'
92
+ */
93
+ export declare function resolvePath(obj: unknown, path: string): unknown;
94
+ /** Lexical options — the only grammar differences between the two callers. */
95
+ export interface ExpressionSyntaxOptions {
96
+ /**
97
+ * `hero-stats-data.0.text` is ONE name. Surface data-source ids are
98
+ * hyphenated, and the surface evaluator always read them as paths, so in
99
+ * that mode a `-` between two name characters with no space around it is
100
+ * part of the name. Subtraction needs spaces there: `a - b`.
101
+ */
102
+ readonly hyphenNames?: boolean;
103
+ /** The binding evaluator has always read the literal `undefined` as `null`. */
104
+ readonly undefinedAsNull?: boolean;
105
+ }
106
+ /**
107
+ * How a bare name and a call resolve. The grammar is shared; the scope is the
108
+ * caller's: bindings see `data` / `state` / `params`, block props see the
109
+ * surface's expression data (`state`, source ids, `item`, `__errors`, …).
110
+ */
111
+ export interface NameResolver {
112
+ /** The value of a bare name. */
113
+ lookup(name: string): unknown;
114
+ /** The helper a call names, or undefined when there is none. */
115
+ helper(name: string): ((...args: unknown[]) => unknown) | undefined;
116
+ }
117
+ /**
118
+ * Evaluate one expression (the text between `{{` and `}}`) against a scope.
119
+ * Throws on a syntax error, an unknown helper or an unsupported method — the
120
+ * two public evaluators turn that into `{ success: false }`.
121
+ */
122
+ export declare function evaluateWithScope(expression: string, scope: NameResolver, opts?: ExpressionSyntaxOptions): unknown;
123
+ /**
124
+ * Evaluate an expression with full context support
125
+ */
126
+ export declare function evaluateExpression(expression: string, context: BindingExpressionContext): ExpressionEvalResult;
127
+ /**
128
+ * Extract dependencies from an expression for reactive updates
129
+ */
130
+ export declare function extractDependencies(expression: string): ExpressionDependency[];
131
+ /**
132
+ * Check if a value contains expression syntax
133
+ */
134
+ export declare function isExpression(value: unknown): boolean;
135
+ /**
136
+ * Interpolate expressions within a template string
137
+ *
138
+ * @example
139
+ * interpolate('Hello, {{user.name}}!', context) // 'Hello, John!'
140
+ * interpolate('Total: {{price * quantity}}', context) // 'Total: 100'
141
+ */
142
+ export declare function interpolate(template: string, context: BindingExpressionContext): string;
143
+ /**
144
+ * Default helper functions for expressions
145
+ */
146
+ export declare const DEFAULT_BINDING_HELPERS: Record<string, (...args: unknown[]) => unknown>;
147
+ /**
148
+ * Create an expression evaluator with context and helpers
149
+ */
150
+ export declare function createExpressionEvaluator(additionalHelpers?: Record<string, (...args: unknown[]) => unknown>): ExpressionEvaluator;