@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 @@
1
+ {"version":3,"file":"form-write-target.js","sourceRoot":"","sources":["../../src/forms/form-write-target.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Form write target — WHICH verb, WHICH record, and what a refusal means.\n *\n * A form binding says how it wants to write (`method: 'PATCH'`), but a PATCH\n * has to name a record and the page only knows one from what its source\n * loaded. When nothing loaded there is nothing to patch; the honest write is a\n * create. Otherwise a Profile form would send `PATCH /records/Attendee` — the\n * collection, no id — the API would answer 404 \"Route not found\", and the\n * page would report it as a field-validation problem with no field\n * highlighted.\n *\n * Two pure functions, so the rule is testable without a DOM and the same\n * answer serves the in-process facade and the HTTP path alike.\n *\n * @module @pwfabric/runtime/forms/form-write-target\n */\n\nimport type { DataFetchError } from '../data/types.js'\nimport type { EntityOperationError } from '../entity/types.js'\n\nexport type FormWriteMethod = 'POST' | 'PUT' | 'PATCH'\n\nexport interface FormWriteTarget {\n readonly method: FormWriteMethod\n /** Present only for an update — the id of the record the source has loaded. */\n readonly recordId?: string\n}\n\n/**\n * The record a source currently binds, if any.\n *\n * A list source binds an array (the platform's record reads always do — see\n * `LIST_KINDS` in DataBoundSurfaceRenderer); a single-record source may bind\n * an object. The FIRST row is the record a form on that page edits: a\n * profile page reads \"me\", a settings page reads \"the one preference row\".\n */\nfunction boundRecord(bound: unknown): Record<string, unknown> | undefined {\n const candidate = Array.isArray(bound) ? bound[0] : bound\n return candidate !== null && typeof candidate === 'object' && !Array.isArray(candidate)\n ? (candidate as Record<string, unknown>)\n : undefined\n}\n\nexport function resolveFormWriteTarget(method: FormWriteMethod, bound: unknown): FormWriteTarget {\n if (method === 'POST') return { method: 'POST' }\n const id = boundRecord(bound)?.['id']\n const recordId = typeof id === 'string' ? id : typeof id === 'number' ? String(id) : undefined\n return recordId ? { method, recordId } : { method: 'POST' }\n}\n\n/**\n * The field paths a validation refusal names.\n *\n * The API answers `VALIDATION_FAILED` with `path: message; path: message`\n * (the host's app-records API). Read the paths out so a\n * form can highlight them; keep the whole sentence so the visitor can too.\n */\nfunction fieldPathsOf(message: string): string[] {\n return message\n .split(';')\n .map((part) => part.trim())\n .filter((part) => part.includes(':'))\n .map((part) => part.slice(0, part.indexOf(':')).trim())\n .filter((path) => path.length > 0 && !/\\s/.test(path))\n}\n\nconst VALIDATION_CODES = new Set(['VALIDATION_FAILED', 'INVALID_BODY'])\n\n/**\n * Translate a data-layer refusal into what the form should say.\n *\n * \"Check the highlighted fields\" is reserved for a 400 that names fields.\n * Anything else is the server refusing, and the server's own status and\n * words are the message — a 404 on the collection path is a routing fact,\n * not a problem with what the visitor typed.\n */\nexport function toFormWriteError(err: DataFetchError): EntityOperationError {\n const { status, code, message } = err\n if (status === undefined) {\n return { type: 'connector', message: `Could not reach the server: ${message}` }\n }\n if (status === 400 && (code === undefined || VALIDATION_CODES.has(code))) {\n return {\n type: 'validation',\n message: `Check the highlighted fields — ${message}`,\n details: { status, code, fields: fieldPathsOf(message) },\n }\n }\n const type: EntityOperationError['type'] =\n status === 404 ? 'not_found' : status === 401 || status === 403 ? 'unauthorized' : 'connector'\n return {\n type,\n message: `The server could not save this record (${status}): ${message}`,\n details: { status, code },\n }\n}\n"]}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Form Processing Module
3
+ *
4
+ * Form processing capability for surfaces
5
+ *
6
+ * Exports:
7
+ * - Types: FormField, FormState, ValidationRule, FormResult, etc.
8
+ * - Implementations: DefaultFormValidator, DefaultFormProcessor
9
+ * - Factory functions: createFormValidator, createFormProcessor
10
+ * - Utilities: isFormSuccess, isFormFailure, formatValidationErrors
11
+ *
12
+ * @module @pwfabric/runtime/forms
13
+ */
14
+ export type { FormFieldType, ValidationRuleType, ValidationRule, SelectOption, FormField, FormState, FormValidationResult, FormValidationSuccess, FormValidationFailure, FormResult, FormError, FormSubmitHandler, FormProcessor, FormValidator, FormProcessorConfig, ValidationMessages, } from './types.js';
15
+ export { INITIAL_FORM_STATE, DEFAULT_VALIDATION_MESSAGES } from './types.js';
16
+ export { DefaultFormValidator, createFormValidator, validateWithZod, FormSchemas, } from './validator.js';
17
+ export { DefaultFormProcessor, createFormProcessor, isFormSuccess, isFormFailure, formatFormErrors, getErrorMessages, } from './processor.js';
18
+ export { attachFormEntityBridge } from './form-entity-bridge.js';
19
+ export { completeNamedControlValues } from './named-control-values.js';
20
+ export type { FormEntityBridgeConfig, FormWriter, Unsubscribe } from './form-entity-bridge.js';
21
+ export { resolveFormWriteTarget, toFormWriteError } from './form-write-target.js';
22
+ export type { FormWriteMethod, FormWriteTarget } from './form-write-target.js';
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Form Processing Module
3
+ *
4
+ * Form processing capability for surfaces
5
+ *
6
+ * Exports:
7
+ * - Types: FormField, FormState, ValidationRule, FormResult, etc.
8
+ * - Implementations: DefaultFormValidator, DefaultFormProcessor
9
+ * - Factory functions: createFormValidator, createFormProcessor
10
+ * - Utilities: isFormSuccess, isFormFailure, formatValidationErrors
11
+ *
12
+ * @module @pwfabric/runtime/forms
13
+ */
14
+ // Constants
15
+ export { INITIAL_FORM_STATE, DEFAULT_VALIDATION_MESSAGES } from './types.js';
16
+ // Validator
17
+ export { DefaultFormValidator, createFormValidator, validateWithZod, FormSchemas, } from './validator.js';
18
+ // Processor
19
+ export { DefaultFormProcessor, createFormProcessor, isFormSuccess, isFormFailure, formatFormErrors, getErrorMessages, } from './processor.js';
20
+ // Form → Entity Bridge
21
+ export { attachFormEntityBridge } from './form-entity-bridge.js';
22
+ export { completeNamedControlValues } from './named-control-values.js';
23
+ // Which verb / which record a form write addresses, and what a refusal means
24
+ export { resolveFormWriteTarget, toFormWriteError } from './form-write-target.js';
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAsBH,YAAY;AACZ,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA;AAE5E,YAAY;AACZ,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,WAAW,GACZ,MAAM,gBAAgB,CAAA;AAEvB,YAAY;AACZ,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAA;AAEvB,uBAAuB;AACvB,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AAGtE,6EAA6E;AAC7E,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA","sourcesContent":["/**\n * Form Processing Module\n *\n * Form processing capability for surfaces\n *\n * Exports:\n * - Types: FormField, FormState, ValidationRule, FormResult, etc.\n * - Implementations: DefaultFormValidator, DefaultFormProcessor\n * - Factory functions: createFormValidator, createFormProcessor\n * - Utilities: isFormSuccess, isFormFailure, formatValidationErrors\n *\n * @module @pwfabric/runtime/forms\n */\n\n// Types\nexport type {\n FormFieldType,\n ValidationRuleType,\n ValidationRule,\n SelectOption,\n FormField,\n FormState,\n FormValidationResult,\n FormValidationSuccess,\n FormValidationFailure,\n FormResult,\n FormError,\n FormSubmitHandler,\n FormProcessor,\n FormValidator,\n FormProcessorConfig,\n ValidationMessages,\n} from './types.js'\n\n// Constants\nexport { INITIAL_FORM_STATE, DEFAULT_VALIDATION_MESSAGES } from './types.js'\n\n// Validator\nexport {\n DefaultFormValidator,\n createFormValidator,\n validateWithZod,\n FormSchemas,\n} from './validator.js'\n\n// Processor\nexport {\n DefaultFormProcessor,\n createFormProcessor,\n isFormSuccess,\n isFormFailure,\n formatFormErrors,\n getErrorMessages,\n} from './processor.js'\n\n// Form → Entity Bridge\nexport { attachFormEntityBridge } from './form-entity-bridge.js'\nexport { completeNamedControlValues } from './named-control-values.js'\nexport type { FormEntityBridgeConfig, FormWriter, Unsubscribe } from './form-entity-bridge.js'\n\n// Which verb / which record a form write addresses, and what a refusal means\nexport { resolveFormWriteTarget, toFormWriteError } from './form-write-target.js'\nexport type { FormWriteMethod, FormWriteTarget } from './form-write-target.js'\n"]}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Named controls that FormData cannot see.
3
+ *
4
+ * A form block gathers its values with `new FormData(form)`, which reads
5
+ * native fields only. A control drawn from buttons — a segmented control, a
6
+ * custom picker — has no field, so its answer never reached the record even
7
+ * though the control named itself and wrote its `stateKey` (an RSVP form
8
+ * would store every reply without its yes/no answer).
9
+ *
10
+ * The page state already holds that answer. This completes the submitted
11
+ * values from `state[stateKey]` for every block inside the form that declares
12
+ * both a `name` and a `stateKey` — ONLY where FormData carried nothing under
13
+ * that name, so a native field's own value always wins, and never for a
14
+ * disabled control (a disabled native field is not submitted either).
15
+ *
16
+ * A control that is never touched has written no state; it contributes
17
+ * nothing here. A block that wants its untouched default submitted renders a
18
+ * hidden input (foundation's segmented-control does, from 3.1.3).
19
+ *
20
+ * @module @pwfabric/runtime/forms/named-control-values
21
+ */
22
+ import type { Block } from '@pwfabric/core';
23
+ /**
24
+ * The form's submitted values, completed from page state for named controls
25
+ * FormData missed. Returns `values` itself when there is nothing to add.
26
+ */
27
+ export declare function completeNamedControlValues(blocks: readonly Block[], formId: string, values: Record<string, unknown>, state: Record<string, unknown>): Record<string, unknown>;
@@ -0,0 +1,42 @@
1
+ function findBlock(blocks, id) {
2
+ for (const block of blocks ?? []) {
3
+ if (block.id === id)
4
+ return block;
5
+ const inner = findBlock(block.children, id);
6
+ if (inner)
7
+ return inner;
8
+ }
9
+ return undefined;
10
+ }
11
+ function collect(blocks, state, into, seen) {
12
+ for (const block of blocks ?? []) {
13
+ const props = (block.props ?? {});
14
+ const name = props['name'];
15
+ const stateKey = props['stateKey'];
16
+ if (typeof name === 'string' &&
17
+ name &&
18
+ typeof stateKey === 'string' &&
19
+ stateKey &&
20
+ props['disabled'] !== true &&
21
+ !seen.has(name) &&
22
+ state[stateKey] !== undefined) {
23
+ into[name] = state[stateKey];
24
+ seen.add(name);
25
+ }
26
+ collect(block.children, state, into, seen);
27
+ }
28
+ }
29
+ /**
30
+ * The form's submitted values, completed from page state for named controls
31
+ * FormData missed. Returns `values` itself when there is nothing to add.
32
+ */
33
+ export function completeNamedControlValues(blocks, formId, values, state) {
34
+ const form = findBlock(blocks, formId);
35
+ if (!form)
36
+ return values;
37
+ const seen = new Set(Object.keys(values));
38
+ const added = {};
39
+ collect(form.children, state, added, seen);
40
+ return Object.keys(added).length > 0 ? { ...values, ...added } : values;
41
+ }
42
+ //# sourceMappingURL=named-control-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"named-control-values.js","sourceRoot":"","sources":["../../src/forms/named-control-values.ts"],"names":[],"mappings":"AAuBA,SAAS,SAAS,CAAC,MAAoC,EAAE,EAAU;IACjE,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAA;QACjC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAwC,EAAE,EAAE,CAAC,CAAA;QAC3E,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,OAAO,CACd,MAAoC,EACpC,KAA8B,EAC9B,IAA6B,EAC7B,IAAiB;IAEjB,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAA;QAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;QAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;QAClC,IACE,OAAO,IAAI,KAAK,QAAQ;YACxB,IAAI;YACJ,OAAO,QAAQ,KAAK,QAAQ;YAC5B,QAAQ;YACR,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI;YAC1B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACf,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS,EAC7B,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,QAAwC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC5E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAwB,EACxB,MAAc,EACd,MAA+B,EAC/B,KAA8B;IAE9B,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAA;IACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACzC,MAAM,KAAK,GAA4B,EAAE,CAAA;IACzC,OAAO,CAAC,IAAI,CAAC,QAAwC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAC1E,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;AACzE,CAAC","sourcesContent":["/**\n * Named controls that FormData cannot see.\n *\n * A form block gathers its values with `new FormData(form)`, which reads\n * native fields only. A control drawn from buttons — a segmented control, a\n * custom picker — has no field, so its answer never reached the record even\n * though the control named itself and wrote its `stateKey` (an RSVP form\n * would store every reply without its yes/no answer).\n *\n * The page state already holds that answer. This completes the submitted\n * values from `state[stateKey]` for every block inside the form that declares\n * both a `name` and a `stateKey` — ONLY where FormData carried nothing under\n * that name, so a native field's own value always wins, and never for a\n * disabled control (a disabled native field is not submitted either).\n *\n * A control that is never touched has written no state; it contributes\n * nothing here. A block that wants its untouched default submitted renders a\n * hidden input (foundation's segmented-control does, from 3.1.3).\n *\n * @module @pwfabric/runtime/forms/named-control-values\n */\nimport type { Block } from '@pwfabric/core'\n\nfunction findBlock(blocks: readonly Block[] | undefined, id: string): Block | undefined {\n for (const block of blocks ?? []) {\n if (block.id === id) return block\n const inner = findBlock(block.children as readonly Block[] | undefined, id)\n if (inner) return inner\n }\n return undefined\n}\n\nfunction collect(\n blocks: readonly Block[] | undefined,\n state: Record<string, unknown>,\n into: Record<string, unknown>,\n seen: Set<string>\n): void {\n for (const block of blocks ?? []) {\n const props = (block.props ?? {}) as Record<string, unknown>\n const name = props['name']\n const stateKey = props['stateKey']\n if (\n typeof name === 'string' &&\n name &&\n typeof stateKey === 'string' &&\n stateKey &&\n props['disabled'] !== true &&\n !seen.has(name) &&\n state[stateKey] !== undefined\n ) {\n into[name] = state[stateKey]\n seen.add(name)\n }\n collect(block.children as readonly Block[] | undefined, state, into, seen)\n }\n}\n\n/**\n * The form's submitted values, completed from page state for named controls\n * FormData missed. Returns `values` itself when there is nothing to add.\n */\nexport function completeNamedControlValues(\n blocks: readonly Block[],\n formId: string,\n values: Record<string, unknown>,\n state: Record<string, unknown>\n): Record<string, unknown> {\n const form = findBlock(blocks, formId)\n if (!form) return values\n const seen = new Set(Object.keys(values))\n const added: Record<string, unknown> = {}\n collect(form.children as readonly Block[] | undefined, state, added, seen)\n return Object.keys(added).length > 0 ? { ...values, ...added } : values\n}\n"]}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Form Processor
3
+ *
4
+ * Form processing implementation
5
+ *
6
+ * @module @pwfabric/runtime/forms/processor
7
+ */
8
+ import type { ZodType } from 'zod';
9
+ import type { FormProcessor, FormField, FormSubmitHandler, FormResult, FormError, FormValidationResult, FormProcessorConfig } from './types.js';
10
+ /**
11
+ * Default form processor implementation
12
+ */
13
+ export declare class DefaultFormProcessor implements FormProcessor {
14
+ private readonly validator;
15
+ private readonly config;
16
+ constructor(config?: FormProcessorConfig);
17
+ validate(values: Record<string, unknown>, fields: readonly FormField[]): FormValidationResult;
18
+ validateWithSchema<T>(values: Record<string, unknown>, schema: ZodType<T>): FormValidationResult;
19
+ process<T>(_formId: string, values: Record<string, unknown>, handler: FormSubmitHandler<T>): Promise<FormResult<T>>;
20
+ /**
21
+ * Process form with validation
22
+ */
23
+ processWithValidation<T>(formId: string, values: Record<string, unknown>, fields: readonly FormField[], handler: FormSubmitHandler<T>): Promise<FormResult<T>>;
24
+ /**
25
+ * Process form with Zod schema validation
26
+ */
27
+ processWithSchema<T, TOutput>(formId: string, values: Record<string, unknown>, schema: ZodType<TOutput>, handler: FormSubmitHandler<T>): Promise<FormResult<T>>;
28
+ private createFormError;
29
+ }
30
+ /**
31
+ * Create a form processor
32
+ */
33
+ export declare function createFormProcessor(config?: FormProcessorConfig): FormProcessor;
34
+ /**
35
+ * Check if a form result is successful
36
+ */
37
+ export declare function isFormSuccess<T>(result: FormResult<T>): result is {
38
+ success: true;
39
+ data: T;
40
+ };
41
+ /**
42
+ * Check if a form result is a failure
43
+ */
44
+ export declare function isFormFailure<T>(result: FormResult<T>): result is {
45
+ success: false;
46
+ error: FormError;
47
+ };
48
+ /**
49
+ * Format form validation errors into a single message
50
+ */
51
+ export declare function formatFormErrors(errors: Record<string, string[]>): string;
52
+ /**
53
+ * Get all error messages as a flat array
54
+ */
55
+ export declare function getErrorMessages(errors: Record<string, string[]>): string[];
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Form Processor
3
+ *
4
+ * Form processing implementation
5
+ *
6
+ * @module @pwfabric/runtime/forms/processor
7
+ */
8
+ import { DefaultFormValidator, validateWithZod } from './validator.js';
9
+ // ============================================================
10
+ // DEFAULT FORM PROCESSOR
11
+ // ============================================================
12
+ /**
13
+ * Default form processor implementation
14
+ */
15
+ export class DefaultFormProcessor {
16
+ validator;
17
+ config;
18
+ constructor(config = {}) {
19
+ this.validator = new DefaultFormValidator(config.messages);
20
+ this.config = {
21
+ validateOnSubmit: config.validateOnSubmit ?? true,
22
+ validateOnBlur: config.validateOnBlur ?? true,
23
+ validateOnChange: config.validateOnChange ?? false,
24
+ messages: config.messages ?? {},
25
+ };
26
+ }
27
+ validate(values, fields) {
28
+ return this.validator.validateAll(values, fields);
29
+ }
30
+ validateWithSchema(values, schema) {
31
+ return validateWithZod(values, schema);
32
+ }
33
+ async process(_formId, values, handler) {
34
+ try {
35
+ const result = await handler(values);
36
+ return {
37
+ success: true,
38
+ data: result,
39
+ };
40
+ }
41
+ catch (error) {
42
+ return {
43
+ success: false,
44
+ error: this.createFormError(error),
45
+ };
46
+ }
47
+ }
48
+ /**
49
+ * Process form with validation
50
+ */
51
+ async processWithValidation(formId, values, fields, handler) {
52
+ // Validate first if enabled
53
+ if (this.config.validateOnSubmit) {
54
+ const validationResult = this.validate(values, fields);
55
+ if (!validationResult.valid) {
56
+ return {
57
+ success: false,
58
+ error: {
59
+ type: 'validation_failed',
60
+ message: 'Form validation failed',
61
+ validationErrors: validationResult.errors,
62
+ },
63
+ };
64
+ }
65
+ }
66
+ return this.process(formId, values, handler);
67
+ }
68
+ /**
69
+ * Process form with Zod schema validation
70
+ */
71
+ async processWithSchema(formId, values, schema, handler) {
72
+ // Validate with Zod schema
73
+ const validationResult = this.validateWithSchema(values, schema);
74
+ if (!validationResult.valid) {
75
+ return {
76
+ success: false,
77
+ error: {
78
+ type: 'validation_failed',
79
+ message: 'Form validation failed',
80
+ validationErrors: validationResult.errors,
81
+ },
82
+ };
83
+ }
84
+ return this.process(formId, values, handler);
85
+ }
86
+ createFormError(error) {
87
+ if (error instanceof Error) {
88
+ // Check for network errors
89
+ if (error.name === 'NetworkError' ||
90
+ error.message.includes('network') ||
91
+ error.message.includes('fetch')) {
92
+ return {
93
+ type: 'network_error',
94
+ message: 'A network error occurred. Please try again.',
95
+ cause: error,
96
+ };
97
+ }
98
+ return {
99
+ type: 'processing_failed',
100
+ message: error.message,
101
+ cause: error,
102
+ };
103
+ }
104
+ return {
105
+ type: 'unknown',
106
+ message: 'An unexpected error occurred',
107
+ cause: error,
108
+ };
109
+ }
110
+ }
111
+ /**
112
+ * Create a form processor
113
+ */
114
+ export function createFormProcessor(config) {
115
+ return new DefaultFormProcessor(config);
116
+ }
117
+ // ============================================================
118
+ // HELPER FUNCTIONS
119
+ // ============================================================
120
+ /**
121
+ * Check if a form result is successful
122
+ */
123
+ export function isFormSuccess(result) {
124
+ return result.success;
125
+ }
126
+ /**
127
+ * Check if a form result is a failure
128
+ */
129
+ export function isFormFailure(result) {
130
+ return !result.success;
131
+ }
132
+ /**
133
+ * Format form validation errors into a single message
134
+ */
135
+ export function formatFormErrors(errors) {
136
+ const messages = [];
137
+ for (const [field, fieldErrors] of Object.entries(errors)) {
138
+ for (const error of fieldErrors) {
139
+ messages.push(`${field}: ${error}`);
140
+ }
141
+ }
142
+ return messages.join('. ');
143
+ }
144
+ /**
145
+ * Get all error messages as a flat array
146
+ */
147
+ export function getErrorMessages(errors) {
148
+ const messages = [];
149
+ for (const fieldErrors of Object.values(errors)) {
150
+ messages.push(...fieldErrors);
151
+ }
152
+ return messages;
153
+ }
154
+ //# sourceMappingURL=processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/forms/processor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Form Processor\n *\n * Form processing implementation\n *\n * @module @pwfabric/runtime/forms/processor\n */\n\nimport type { ZodType } from 'zod'\nimport type {\n FormProcessor,\n FormField,\n FormSubmitHandler,\n FormResult,\n FormError,\n FormValidationResult,\n FormProcessorConfig,\n} from './types.js'\nimport { DefaultFormValidator, validateWithZod } from './validator.js'\n\n// ============================================================\n// DEFAULT FORM PROCESSOR\n// ============================================================\n\n/**\n * Default form processor implementation\n */\nexport class DefaultFormProcessor implements FormProcessor {\n private readonly validator: DefaultFormValidator\n private readonly config: Required<FormProcessorConfig>\n\n constructor(config: FormProcessorConfig = {}) {\n this.validator = new DefaultFormValidator(config.messages)\n this.config = {\n validateOnSubmit: config.validateOnSubmit ?? true,\n validateOnBlur: config.validateOnBlur ?? true,\n validateOnChange: config.validateOnChange ?? false,\n messages: config.messages ?? {},\n }\n }\n\n validate(values: Record<string, unknown>, fields: readonly FormField[]): FormValidationResult {\n return this.validator.validateAll(values, fields)\n }\n\n validateWithSchema<T>(values: Record<string, unknown>, schema: ZodType<T>): FormValidationResult {\n return validateWithZod(values, schema)\n }\n\n async process<T>(\n _formId: string,\n values: Record<string, unknown>,\n handler: FormSubmitHandler<T>\n ): Promise<FormResult<T>> {\n try {\n const result = await handler(values)\n return {\n success: true,\n data: result,\n }\n } catch (error) {\n return {\n success: false,\n error: this.createFormError(error),\n }\n }\n }\n\n /**\n * Process form with validation\n */\n async processWithValidation<T>(\n formId: string,\n values: Record<string, unknown>,\n fields: readonly FormField[],\n handler: FormSubmitHandler<T>\n ): Promise<FormResult<T>> {\n // Validate first if enabled\n if (this.config.validateOnSubmit) {\n const validationResult = this.validate(values, fields)\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: {\n type: 'validation_failed',\n message: 'Form validation failed',\n validationErrors: validationResult.errors,\n },\n }\n }\n }\n\n return this.process(formId, values, handler)\n }\n\n /**\n * Process form with Zod schema validation\n */\n async processWithSchema<T, TOutput>(\n formId: string,\n values: Record<string, unknown>,\n schema: ZodType<TOutput>,\n handler: FormSubmitHandler<T>\n ): Promise<FormResult<T>> {\n // Validate with Zod schema\n const validationResult = this.validateWithSchema(values, schema)\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: {\n type: 'validation_failed',\n message: 'Form validation failed',\n validationErrors: validationResult.errors,\n },\n }\n }\n\n return this.process(formId, values, handler)\n }\n\n private createFormError(error: unknown): FormError {\n if (error instanceof Error) {\n // Check for network errors\n if (\n error.name === 'NetworkError' ||\n error.message.includes('network') ||\n error.message.includes('fetch')\n ) {\n return {\n type: 'network_error',\n message: 'A network error occurred. Please try again.',\n cause: error,\n }\n }\n\n return {\n type: 'processing_failed',\n message: error.message,\n cause: error,\n }\n }\n\n return {\n type: 'unknown',\n message: 'An unexpected error occurred',\n cause: error,\n }\n }\n}\n\n/**\n * Create a form processor\n */\nexport function createFormProcessor(config?: FormProcessorConfig): FormProcessor {\n return new DefaultFormProcessor(config)\n}\n\n// ============================================================\n// HELPER FUNCTIONS\n// ============================================================\n\n/**\n * Check if a form result is successful\n */\nexport function isFormSuccess<T>(result: FormResult<T>): result is { success: true; data: T } {\n return result.success\n}\n\n/**\n * Check if a form result is a failure\n */\nexport function isFormFailure<T>(\n result: FormResult<T>\n): result is { success: false; error: FormError } {\n return !result.success\n}\n\n/**\n * Format form validation errors into a single message\n */\nexport function formatFormErrors(errors: Record<string, string[]>): string {\n const messages: string[] = []\n\n for (const [field, fieldErrors] of Object.entries(errors)) {\n for (const error of fieldErrors) {\n messages.push(`${field}: ${error}`)\n }\n }\n\n return messages.join('. ')\n}\n\n/**\n * Get all error messages as a flat array\n */\nexport function getErrorMessages(errors: Record<string, string[]>): string[] {\n const messages: string[] = []\n\n for (const fieldErrors of Object.values(errors)) {\n messages.push(...fieldErrors)\n }\n\n return messages\n}\n"]}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Form Processing Types
3
+ *
4
+ * Form processing capability for surfaces
5
+ *
6
+ * @module @pwfabric/runtime/forms/types
7
+ */
8
+ import type { ZodType } from 'zod';
9
+ /**
10
+ * Form field input type
11
+ */
12
+ export type FormFieldType = 'text' | 'email' | 'number' | 'select' | 'checkbox' | 'textarea' | 'password' | 'tel' | 'url' | 'date' | 'hidden';
13
+ /**
14
+ * Validation rule type
15
+ */
16
+ export type ValidationRuleType = 'required' | 'minLength' | 'maxLength' | 'min' | 'max' | 'pattern' | 'email' | 'url' | 'custom';
17
+ /**
18
+ * Validation rule definition
19
+ */
20
+ export interface ValidationRule {
21
+ readonly type: ValidationRuleType;
22
+ readonly value?: unknown;
23
+ readonly message: string;
24
+ }
25
+ /**
26
+ * Select option for select fields
27
+ */
28
+ export interface SelectOption {
29
+ readonly value: string | number;
30
+ readonly label: string;
31
+ readonly disabled?: boolean;
32
+ }
33
+ /**
34
+ * Form field definition
35
+ */
36
+ export interface FormField {
37
+ readonly name: string;
38
+ readonly type: FormFieldType;
39
+ readonly label?: string;
40
+ readonly placeholder?: string;
41
+ readonly required?: boolean;
42
+ readonly disabled?: boolean;
43
+ readonly defaultValue?: unknown;
44
+ readonly validation?: readonly ValidationRule[];
45
+ readonly options?: readonly SelectOption[];
46
+ }
47
+ /**
48
+ * Form state tracking
49
+ */
50
+ export interface FormState {
51
+ readonly values: Record<string, unknown>;
52
+ readonly errors: Record<string, string[]>;
53
+ readonly touched: Record<string, boolean>;
54
+ readonly isValid: boolean;
55
+ readonly isSubmitting: boolean;
56
+ readonly isDirty: boolean;
57
+ readonly submitCount: number;
58
+ }
59
+ /**
60
+ * Initial form state
61
+ */
62
+ export declare const INITIAL_FORM_STATE: FormState;
63
+ /**
64
+ * Result of validating form values
65
+ */
66
+ export interface FormValidationResult {
67
+ readonly valid: boolean;
68
+ readonly errors: Record<string, string[]>;
69
+ }
70
+ /**
71
+ * Successful validation result
72
+ */
73
+ export interface FormValidationSuccess extends FormValidationResult {
74
+ readonly valid: true;
75
+ readonly errors: Record<string, never>;
76
+ }
77
+ /**
78
+ * Failed validation result
79
+ */
80
+ export interface FormValidationFailure extends FormValidationResult {
81
+ readonly valid: false;
82
+ readonly errors: Record<string, string[]>;
83
+ }
84
+ /**
85
+ * Result of form processing
86
+ */
87
+ export type FormResult<T = unknown> = {
88
+ readonly success: true;
89
+ readonly data: T;
90
+ } | {
91
+ readonly success: false;
92
+ readonly error: FormError;
93
+ };
94
+ /**
95
+ * Form processing error
96
+ */
97
+ export interface FormError {
98
+ readonly type: 'validation_failed' | 'processing_failed' | 'network_error' | 'unknown';
99
+ readonly message: string;
100
+ readonly validationErrors?: Record<string, string[]>;
101
+ readonly cause?: unknown;
102
+ }
103
+ /**
104
+ * Form submission handler function
105
+ */
106
+ export type FormSubmitHandler<T = unknown> = (values: Record<string, unknown>) => Promise<T> | T;
107
+ /**
108
+ * Form processor interface
109
+ */
110
+ export interface FormProcessor {
111
+ /**
112
+ * Validate form values against field definitions
113
+ */
114
+ validate(values: Record<string, unknown>, fields: readonly FormField[]): FormValidationResult;
115
+ /**
116
+ * Validate form values using a Zod schema
117
+ */
118
+ validateWithSchema<T>(values: Record<string, unknown>, schema: ZodType<T>): FormValidationResult;
119
+ /**
120
+ * Process a form submission
121
+ */
122
+ process<T>(formId: string, values: Record<string, unknown>, handler: FormSubmitHandler<T>): Promise<FormResult<T>>;
123
+ }
124
+ /**
125
+ * Form validator interface
126
+ */
127
+ export interface FormValidator {
128
+ /**
129
+ * Validate a single field value
130
+ */
131
+ validateField(value: unknown, field: FormField): string[];
132
+ /**
133
+ * Validate all fields
134
+ */
135
+ validateAll(values: Record<string, unknown>, fields: readonly FormField[]): FormValidationResult;
136
+ }
137
+ /**
138
+ * Form processor configuration
139
+ */
140
+ export interface FormProcessorConfig {
141
+ /**
142
+ * Whether to validate on submit
143
+ */
144
+ readonly validateOnSubmit?: boolean;
145
+ /**
146
+ * Whether to validate individual fields on blur
147
+ */
148
+ readonly validateOnBlur?: boolean;
149
+ /**
150
+ * Whether to validate individual fields on change
151
+ */
152
+ readonly validateOnChange?: boolean;
153
+ /**
154
+ * Custom error messages
155
+ */
156
+ readonly messages?: Partial<ValidationMessages>;
157
+ }
158
+ /**
159
+ * Default validation error messages
160
+ */
161
+ export interface ValidationMessages {
162
+ readonly required: string;
163
+ readonly email: string;
164
+ readonly url: string;
165
+ readonly minLength: string;
166
+ readonly maxLength: string;
167
+ readonly min: string;
168
+ readonly max: string;
169
+ readonly pattern: string;
170
+ }
171
+ /**
172
+ * Default validation messages
173
+ */
174
+ export declare const DEFAULT_VALIDATION_MESSAGES: ValidationMessages;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Form Processing Types
3
+ *
4
+ * Form processing capability for surfaces
5
+ *
6
+ * @module @pwfabric/runtime/forms/types
7
+ */
8
+ /**
9
+ * Initial form state
10
+ */
11
+ export const INITIAL_FORM_STATE = {
12
+ values: {},
13
+ errors: {},
14
+ touched: {},
15
+ isValid: true,
16
+ isSubmitting: false,
17
+ isDirty: false,
18
+ submitCount: 0,
19
+ };
20
+ /**
21
+ * Default validation messages
22
+ */
23
+ export const DEFAULT_VALIDATION_MESSAGES = {
24
+ required: 'This field is required',
25
+ email: 'Please enter a valid email address',
26
+ url: 'Please enter a valid URL',
27
+ minLength: 'Must be at least {value} characters',
28
+ maxLength: 'Must be no more than {value} characters',
29
+ min: 'Must be at least {value}',
30
+ max: 'Must be no more than {value}',
31
+ pattern: 'Invalid format',
32
+ };
33
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwFH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,CAAC;CACf,CAAA;AAkJD;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAuB;IAC7D,QAAQ,EAAE,wBAAwB;IAClC,KAAK,EAAE,oCAAoC;IAC3C,GAAG,EAAE,0BAA0B;IAC/B,SAAS,EAAE,qCAAqC;IAChD,SAAS,EAAE,yCAAyC;IACpD,GAAG,EAAE,0BAA0B;IAC/B,GAAG,EAAE,8BAA8B;IACnC,OAAO,EAAE,gBAAgB;CAC1B,CAAA","sourcesContent":["/**\n * Form Processing Types\n *\n * Form processing capability for surfaces\n *\n * @module @pwfabric/runtime/forms/types\n */\n\nimport type { ZodType } from 'zod'\n\n// ============================================================\n// FORM FIELD TYPES\n// ============================================================\n\n/**\n * Form field input type\n */\nexport type FormFieldType =\n | 'text'\n | 'email'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'password'\n | 'tel'\n | 'url'\n | 'date'\n | 'hidden'\n\n/**\n * Validation rule type\n */\nexport type ValidationRuleType =\n | 'required'\n | 'minLength'\n | 'maxLength'\n | 'min'\n | 'max'\n | 'pattern'\n | 'email'\n | 'url'\n | 'custom'\n\n/**\n * Validation rule definition\n */\nexport interface ValidationRule {\n readonly type: ValidationRuleType\n readonly value?: unknown\n readonly message: string\n}\n\n/**\n * Select option for select fields\n */\nexport interface SelectOption {\n readonly value: string | number\n readonly label: string\n readonly disabled?: boolean\n}\n\n/**\n * Form field definition\n */\nexport interface FormField {\n readonly name: string\n readonly type: FormFieldType\n readonly label?: string\n readonly placeholder?: string\n readonly required?: boolean\n readonly disabled?: boolean\n readonly defaultValue?: unknown\n readonly validation?: readonly ValidationRule[]\n readonly options?: readonly SelectOption[] // For select fields\n}\n\n// ============================================================\n// FORM STATE\n// ============================================================\n\n/**\n * Form state tracking\n */\nexport interface FormState {\n readonly values: Record<string, unknown>\n readonly errors: Record<string, string[]>\n readonly touched: Record<string, boolean>\n readonly isValid: boolean\n readonly isSubmitting: boolean\n readonly isDirty: boolean\n readonly submitCount: number\n}\n\n/**\n * Initial form state\n */\nexport const INITIAL_FORM_STATE: FormState = {\n values: {},\n errors: {},\n touched: {},\n isValid: true,\n isSubmitting: false,\n isDirty: false,\n submitCount: 0,\n}\n\n// ============================================================\n// FORM VALIDATION RESULT\n// ============================================================\n\n/**\n * Result of validating form values\n */\nexport interface FormValidationResult {\n readonly valid: boolean\n readonly errors: Record<string, string[]>\n}\n\n/**\n * Successful validation result\n */\nexport interface FormValidationSuccess extends FormValidationResult {\n readonly valid: true\n readonly errors: Record<string, never>\n}\n\n/**\n * Failed validation result\n */\nexport interface FormValidationFailure extends FormValidationResult {\n readonly valid: false\n readonly errors: Record<string, string[]>\n}\n\n// ============================================================\n// FORM RESULT\n// ============================================================\n\n/**\n * Result of form processing\n */\nexport type FormResult<T = unknown> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly error: FormError }\n\n/**\n * Form processing error\n */\nexport interface FormError {\n readonly type: 'validation_failed' | 'processing_failed' | 'network_error' | 'unknown'\n readonly message: string\n readonly validationErrors?: Record<string, string[]>\n readonly cause?: unknown\n}\n\n// ============================================================\n// FORM PROCESSOR\n// ============================================================\n\n/**\n * Form submission handler function\n */\nexport type FormSubmitHandler<T = unknown> = (values: Record<string, unknown>) => Promise<T> | T\n\n/**\n * Form processor interface\n */\nexport interface FormProcessor {\n /**\n * Validate form values against field definitions\n */\n validate(values: Record<string, unknown>, fields: readonly FormField[]): FormValidationResult\n\n /**\n * Validate form values using a Zod schema\n */\n validateWithSchema<T>(values: Record<string, unknown>, schema: ZodType<T>): FormValidationResult\n\n /**\n * Process a form submission\n */\n process<T>(\n formId: string,\n values: Record<string, unknown>,\n handler: FormSubmitHandler<T>\n ): Promise<FormResult<T>>\n}\n\n// ============================================================\n// FORM VALIDATOR\n// ============================================================\n\n/**\n * Form validator interface\n */\nexport interface FormValidator {\n /**\n * Validate a single field value\n */\n validateField(value: unknown, field: FormField): string[]\n\n /**\n * Validate all fields\n */\n validateAll(values: Record<string, unknown>, fields: readonly FormField[]): FormValidationResult\n}\n\n// ============================================================\n// FORM CONFIGURATION\n// ============================================================\n\n/**\n * Form processor configuration\n */\nexport interface FormProcessorConfig {\n /**\n * Whether to validate on submit\n */\n readonly validateOnSubmit?: boolean\n\n /**\n * Whether to validate individual fields on blur\n */\n readonly validateOnBlur?: boolean\n\n /**\n * Whether to validate individual fields on change\n */\n readonly validateOnChange?: boolean\n\n /**\n * Custom error messages\n */\n readonly messages?: Partial<ValidationMessages>\n}\n\n/**\n * Default validation error messages\n */\nexport interface ValidationMessages {\n readonly required: string\n readonly email: string\n readonly url: string\n readonly minLength: string\n readonly maxLength: string\n readonly min: string\n readonly max: string\n readonly pattern: string\n}\n\n/**\n * Default validation messages\n */\nexport const DEFAULT_VALIDATION_MESSAGES: ValidationMessages = {\n required: 'This field is required',\n email: 'Please enter a valid email address',\n url: 'Please enter a valid URL',\n minLength: 'Must be at least {value} characters',\n maxLength: 'Must be no more than {value} characters',\n min: 'Must be at least {value}',\n max: 'Must be no more than {value}',\n pattern: 'Invalid format',\n}\n"]}