@pipe0/react 0.0.5 → 0.0.7

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 (307) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +69 -2
  3. package/dist/components/compound/pipe-catalog/active-filters.d.mts +7 -10
  4. package/dist/components/compound/pipe-catalog/active-filters.d.mts.map +1 -1
  5. package/dist/components/compound/pipe-catalog/active-filters.mjs +22 -18
  6. package/dist/components/compound/pipe-catalog/active-filters.mjs.map +1 -1
  7. package/dist/components/compound/pipe-catalog/card.d.mts +3 -11
  8. package/dist/components/compound/pipe-catalog/card.d.mts.map +1 -1
  9. package/dist/components/compound/pipe-catalog/card.mjs +30 -25
  10. package/dist/components/compound/pipe-catalog/card.mjs.map +1 -1
  11. package/dist/components/compound/pipe-catalog/category-filter.d.mts +7 -10
  12. package/dist/components/compound/pipe-catalog/category-filter.d.mts.map +1 -1
  13. package/dist/components/compound/pipe-catalog/category-filter.mjs +18 -9
  14. package/dist/components/compound/pipe-catalog/category-filter.mjs.map +1 -1
  15. package/dist/components/compound/pipe-catalog/column-filter.d.mts +7 -13
  16. package/dist/components/compound/pipe-catalog/column-filter.d.mts.map +1 -1
  17. package/dist/components/compound/pipe-catalog/column-filter.mjs +13 -7
  18. package/dist/components/compound/pipe-catalog/column-filter.mjs.map +1 -1
  19. package/dist/components/compound/pipe-catalog/empty.d.mts +5 -10
  20. package/dist/components/compound/pipe-catalog/empty.d.mts.map +1 -1
  21. package/dist/components/compound/pipe-catalog/empty.mjs +12 -14
  22. package/dist/components/compound/pipe-catalog/empty.mjs.map +1 -1
  23. package/dist/components/compound/pipe-catalog/index.d.mts +1 -1
  24. package/dist/components/compound/pipe-catalog/input-field-filter.d.mts +3 -3
  25. package/dist/components/compound/pipe-catalog/input-field-filter.d.mts.map +1 -1
  26. package/dist/components/compound/pipe-catalog/input-field-filter.mjs.map +1 -1
  27. package/dist/components/compound/pipe-catalog/list.d.mts +9 -24
  28. package/dist/components/compound/pipe-catalog/list.d.mts.map +1 -1
  29. package/dist/components/compound/pipe-catalog/list.mjs +18 -14
  30. package/dist/components/compound/pipe-catalog/list.mjs.map +1 -1
  31. package/dist/components/compound/pipe-catalog/output-field-filter.d.mts +3 -3
  32. package/dist/components/compound/pipe-catalog/output-field-filter.d.mts.map +1 -1
  33. package/dist/components/compound/pipe-catalog/output-field-filter.mjs.map +1 -1
  34. package/dist/components/compound/pipe-catalog/provider-filter.d.mts +3 -3
  35. package/dist/components/compound/pipe-catalog/provider-filter.d.mts.map +1 -1
  36. package/dist/components/compound/pipe-catalog/provider-filter.mjs.map +1 -1
  37. package/dist/components/compound/pipe-catalog/root.d.mts +6 -6
  38. package/dist/components/compound/pipe-catalog/root.d.mts.map +1 -1
  39. package/dist/components/compound/pipe-catalog/root.mjs +2 -2
  40. package/dist/components/compound/pipe-catalog/root.mjs.map +1 -1
  41. package/dist/components/compound/pipe-catalog/search-filter.d.mts +6 -9
  42. package/dist/components/compound/pipe-catalog/search-filter.d.mts.map +1 -1
  43. package/dist/components/compound/pipe-catalog/search-filter.mjs +10 -9
  44. package/dist/components/compound/pipe-catalog/search-filter.mjs.map +1 -1
  45. package/dist/components/compound/pipe-catalog/tag-filter.d.mts +3 -3
  46. package/dist/components/compound/pipe-catalog/tag-filter.d.mts.map +1 -1
  47. package/dist/components/compound/pipe-catalog/tag-filter.mjs.map +1 -1
  48. package/dist/components/compound/pipe-form/content.d.mts +7 -2
  49. package/dist/components/compound/pipe-form/content.d.mts.map +1 -1
  50. package/dist/components/compound/pipe-form/content.mjs +23 -25
  51. package/dist/components/compound/pipe-form/content.mjs.map +1 -1
  52. package/dist/components/compound/pipe-form/errors.d.mts +27 -0
  53. package/dist/components/compound/pipe-form/errors.d.mts.map +1 -0
  54. package/dist/components/compound/pipe-form/errors.mjs +48 -0
  55. package/dist/components/compound/pipe-form/errors.mjs.map +1 -0
  56. package/dist/components/compound/pipe-form/footer.d.mts +7 -7
  57. package/dist/components/compound/pipe-form/footer.d.mts.map +1 -1
  58. package/dist/components/compound/pipe-form/footer.mjs +11 -6
  59. package/dist/components/compound/pipe-form/footer.mjs.map +1 -1
  60. package/dist/components/compound/pipe-form/header.d.mts +7 -7
  61. package/dist/components/compound/pipe-form/header.d.mts.map +1 -1
  62. package/dist/components/compound/pipe-form/header.mjs +11 -6
  63. package/dist/components/compound/pipe-form/header.mjs.map +1 -1
  64. package/dist/components/compound/pipe-form/index.d.mts +2 -1
  65. package/dist/components/compound/pipe-form/root.d.mts +18 -11
  66. package/dist/components/compound/pipe-form/root.d.mts.map +1 -1
  67. package/dist/components/compound/pipe-form/root.mjs +21 -27
  68. package/dist/components/compound/pipe-form/root.mjs.map +1 -1
  69. package/dist/components/compound/pipe-form/submit-button.d.mts +15 -4
  70. package/dist/components/compound/pipe-form/submit-button.d.mts.map +1 -1
  71. package/dist/components/compound/pipe-form/submit-button.mjs +23 -8
  72. package/dist/components/compound/pipe-form/submit-button.mjs.map +1 -1
  73. package/dist/components/compound/pipe-form/title.d.mts +9 -8
  74. package/dist/components/compound/pipe-form/title.d.mts.map +1 -1
  75. package/dist/components/compound/pipe-form/title.mjs +11 -6
  76. package/dist/components/compound/pipe-form/title.mjs.map +1 -1
  77. package/dist/components/compound/search-catalog/active-filters.d.mts +7 -10
  78. package/dist/components/compound/search-catalog/active-filters.d.mts.map +1 -1
  79. package/dist/components/compound/search-catalog/active-filters.mjs +22 -18
  80. package/dist/components/compound/search-catalog/active-filters.mjs.map +1 -1
  81. package/dist/components/compound/search-catalog/card.d.mts +4 -12
  82. package/dist/components/compound/search-catalog/card.d.mts.map +1 -1
  83. package/dist/components/compound/search-catalog/card.mjs +33 -28
  84. package/dist/components/compound/search-catalog/card.mjs.map +1 -1
  85. package/dist/components/compound/search-catalog/category-filter.d.mts +8 -10
  86. package/dist/components/compound/search-catalog/category-filter.d.mts.map +1 -1
  87. package/dist/components/compound/search-catalog/category-filter.mjs +18 -9
  88. package/dist/components/compound/search-catalog/category-filter.mjs.map +1 -1
  89. package/dist/components/compound/search-catalog/column-filter.d.mts +7 -9
  90. package/dist/components/compound/search-catalog/column-filter.d.mts.map +1 -1
  91. package/dist/components/compound/search-catalog/column-filter.mjs +13 -7
  92. package/dist/components/compound/search-catalog/column-filter.mjs.map +1 -1
  93. package/dist/components/compound/search-catalog/empty.d.mts +5 -10
  94. package/dist/components/compound/search-catalog/empty.d.mts.map +1 -1
  95. package/dist/components/compound/search-catalog/empty.mjs +12 -14
  96. package/dist/components/compound/search-catalog/empty.mjs.map +1 -1
  97. package/dist/components/compound/search-catalog/index.d.mts +1 -1
  98. package/dist/components/compound/search-catalog/list.d.mts +9 -9
  99. package/dist/components/compound/search-catalog/list.d.mts.map +1 -1
  100. package/dist/components/compound/search-catalog/list.mjs +18 -14
  101. package/dist/components/compound/search-catalog/list.mjs.map +1 -1
  102. package/dist/components/compound/search-catalog/output-field-filter.d.mts +3 -3
  103. package/dist/components/compound/search-catalog/output-field-filter.d.mts.map +1 -1
  104. package/dist/components/compound/search-catalog/output-field-filter.mjs.map +1 -1
  105. package/dist/components/compound/search-catalog/provider-filter.d.mts +3 -3
  106. package/dist/components/compound/search-catalog/provider-filter.d.mts.map +1 -1
  107. package/dist/components/compound/search-catalog/provider-filter.mjs.map +1 -1
  108. package/dist/components/compound/search-catalog/root.d.mts +6 -6
  109. package/dist/components/compound/search-catalog/root.d.mts.map +1 -1
  110. package/dist/components/compound/search-catalog/root.mjs +2 -2
  111. package/dist/components/compound/search-catalog/root.mjs.map +1 -1
  112. package/dist/components/compound/search-catalog/search-filter.d.mts +6 -9
  113. package/dist/components/compound/search-catalog/search-filter.d.mts.map +1 -1
  114. package/dist/components/compound/search-catalog/search-filter.mjs +10 -9
  115. package/dist/components/compound/search-catalog/search-filter.mjs.map +1 -1
  116. package/dist/components/compound/search-catalog/tag-filter.d.mts +3 -3
  117. package/dist/components/compound/search-catalog/tag-filter.d.mts.map +1 -1
  118. package/dist/components/compound/search-catalog/tag-filter.mjs.map +1 -1
  119. package/dist/components/compound/search-form/content.d.mts +7 -2
  120. package/dist/components/compound/search-form/content.d.mts.map +1 -1
  121. package/dist/components/compound/search-form/content.mjs +23 -25
  122. package/dist/components/compound/search-form/content.mjs.map +1 -1
  123. package/dist/components/compound/search-form/errors.d.mts +27 -0
  124. package/dist/components/compound/search-form/errors.d.mts.map +1 -0
  125. package/dist/components/compound/search-form/errors.mjs +48 -0
  126. package/dist/components/compound/search-form/errors.mjs.map +1 -0
  127. package/dist/components/compound/search-form/footer.d.mts +7 -7
  128. package/dist/components/compound/search-form/footer.d.mts.map +1 -1
  129. package/dist/components/compound/search-form/footer.mjs +11 -6
  130. package/dist/components/compound/search-form/footer.mjs.map +1 -1
  131. package/dist/components/compound/search-form/header.d.mts +7 -7
  132. package/dist/components/compound/search-form/header.d.mts.map +1 -1
  133. package/dist/components/compound/search-form/header.mjs +11 -6
  134. package/dist/components/compound/search-form/header.mjs.map +1 -1
  135. package/dist/components/compound/search-form/index.d.mts +2 -1
  136. package/dist/components/compound/search-form/root.d.mts +19 -12
  137. package/dist/components/compound/search-form/root.d.mts.map +1 -1
  138. package/dist/components/compound/search-form/root.mjs +21 -27
  139. package/dist/components/compound/search-form/root.mjs.map +1 -1
  140. package/dist/components/compound/search-form/submit-button.d.mts +15 -4
  141. package/dist/components/compound/search-form/submit-button.d.mts.map +1 -1
  142. package/dist/components/compound/search-form/submit-button.mjs +23 -8
  143. package/dist/components/compound/search-form/submit-button.mjs.map +1 -1
  144. package/dist/components/compound/search-form/title.d.mts +9 -8
  145. package/dist/components/compound/search-form/title.d.mts.map +1 -1
  146. package/dist/components/compound/search-form/title.mjs +11 -6
  147. package/dist/components/compound/search-form/title.mjs.map +1 -1
  148. package/dist/components/compound/searches-catalog/active-filters.d.mts +7 -10
  149. package/dist/components/compound/searches-catalog/active-filters.d.mts.map +1 -1
  150. package/dist/components/compound/searches-catalog/active-filters.mjs +22 -18
  151. package/dist/components/compound/searches-catalog/active-filters.mjs.map +1 -1
  152. package/dist/components/compound/searches-catalog/card.d.mts +6 -6
  153. package/dist/components/compound/searches-catalog/card.d.mts.map +1 -1
  154. package/dist/components/compound/searches-catalog/card.mjs +40 -28
  155. package/dist/components/compound/searches-catalog/card.mjs.map +1 -1
  156. package/dist/components/compound/searches-catalog/category-filter.d.mts +8 -10
  157. package/dist/components/compound/searches-catalog/category-filter.d.mts.map +1 -1
  158. package/dist/components/compound/searches-catalog/category-filter.mjs +18 -9
  159. package/dist/components/compound/searches-catalog/category-filter.mjs.map +1 -1
  160. package/dist/components/compound/searches-catalog/column-filter.d.mts +7 -9
  161. package/dist/components/compound/searches-catalog/column-filter.d.mts.map +1 -1
  162. package/dist/components/compound/searches-catalog/column-filter.mjs +13 -7
  163. package/dist/components/compound/searches-catalog/column-filter.mjs.map +1 -1
  164. package/dist/components/compound/searches-catalog/empty.d.mts +5 -10
  165. package/dist/components/compound/searches-catalog/empty.d.mts.map +1 -1
  166. package/dist/components/compound/searches-catalog/empty.mjs +12 -14
  167. package/dist/components/compound/searches-catalog/empty.mjs.map +1 -1
  168. package/dist/components/compound/searches-catalog/index.d.mts +1 -1
  169. package/dist/components/compound/searches-catalog/list.d.mts +9 -9
  170. package/dist/components/compound/searches-catalog/list.d.mts.map +1 -1
  171. package/dist/components/compound/searches-catalog/list.mjs +18 -14
  172. package/dist/components/compound/searches-catalog/list.mjs.map +1 -1
  173. package/dist/components/compound/searches-catalog/output-field-filter.d.mts +3 -3
  174. package/dist/components/compound/searches-catalog/output-field-filter.d.mts.map +1 -1
  175. package/dist/components/compound/searches-catalog/output-field-filter.mjs.map +1 -1
  176. package/dist/components/compound/searches-catalog/provider-filter.d.mts +3 -3
  177. package/dist/components/compound/searches-catalog/provider-filter.d.mts.map +1 -1
  178. package/dist/components/compound/searches-catalog/provider-filter.mjs.map +1 -1
  179. package/dist/components/compound/searches-catalog/root.d.mts +6 -6
  180. package/dist/components/compound/searches-catalog/root.d.mts.map +1 -1
  181. package/dist/components/compound/searches-catalog/root.mjs +2 -2
  182. package/dist/components/compound/searches-catalog/root.mjs.map +1 -1
  183. package/dist/components/compound/searches-catalog/search-filter.d.mts +6 -9
  184. package/dist/components/compound/searches-catalog/search-filter.d.mts.map +1 -1
  185. package/dist/components/compound/searches-catalog/search-filter.mjs +10 -9
  186. package/dist/components/compound/searches-catalog/search-filter.mjs.map +1 -1
  187. package/dist/components/compound/searches-catalog/tag-filter.d.mts +3 -3
  188. package/dist/components/compound/searches-catalog/tag-filter.d.mts.map +1 -1
  189. package/dist/components/compound/searches-catalog/tag-filter.mjs.map +1 -1
  190. package/dist/components/defaults/adapters/index.mjs +2 -2
  191. package/dist/components/defaults/adapters/index.mjs.map +1 -1
  192. package/dist/components/defaults/adapters/json-extraction-input.mjs +291 -199
  193. package/dist/components/defaults/adapters/json-extraction-input.mjs.map +1 -1
  194. package/dist/components/defaults/adapters/{pipes-trigger-input.mjs → pipes-run-if-input.mjs} +32 -32
  195. package/dist/components/defaults/adapters/pipes-run-if-input.mjs.map +1 -0
  196. package/dist/components/defaults/adapters/providers-input.mjs +221 -13
  197. package/dist/components/defaults/adapters/providers-input.mjs.map +1 -1
  198. package/dist/components/defaults/catalog/card-primitives.d.mts +14 -24
  199. package/dist/components/defaults/catalog/card-primitives.d.mts.map +1 -1
  200. package/dist/components/defaults/catalog/card-primitives.mjs +19 -19
  201. package/dist/components/defaults/catalog/card-primitives.mjs.map +1 -1
  202. package/dist/components/defaults/catalog/layout.mjs +7 -10
  203. package/dist/components/defaults/catalog/layout.mjs.map +1 -1
  204. package/dist/components/defaults/layout/field-wrapper.d.mts +2 -1
  205. package/dist/components/defaults/layout/field-wrapper.d.mts.map +1 -1
  206. package/dist/components/defaults/layout/field-wrapper.mjs +7 -2
  207. package/dist/components/defaults/layout/field-wrapper.mjs.map +1 -1
  208. package/dist/components/defaults/layout/group.d.mts +6 -3
  209. package/dist/components/defaults/layout/group.d.mts.map +1 -1
  210. package/dist/components/defaults/layout/group.mjs +74 -53
  211. package/dist/components/defaults/layout/group.mjs.map +1 -1
  212. package/dist/components/defaults/layout/section.d.mts +9 -3
  213. package/dist/components/defaults/layout/section.d.mts.map +1 -1
  214. package/dist/components/defaults/layout/section.mjs +13 -11
  215. package/dist/components/defaults/layout/section.mjs.map +1 -1
  216. package/dist/components/field-renderer.d.mts.map +1 -1
  217. package/dist/components/field-renderer.mjs +1 -1
  218. package/dist/components/field-renderer.mjs.map +1 -1
  219. package/dist/components/internal/LiquidEditor/ChipEditPopover.mjs +30 -15
  220. package/dist/components/internal/LiquidEditor/ChipEditPopover.mjs.map +1 -1
  221. package/dist/components/internal/icons.mjs +36 -1
  222. package/dist/components/internal/icons.mjs.map +1 -1
  223. package/dist/components/internal/multi-select-popover-trigger.mjs +0 -1
  224. package/dist/components/internal/multi-select-popover-trigger.mjs.map +1 -1
  225. package/dist/components/internal/tag-chip-decoration.mjs +15 -0
  226. package/dist/components/internal/tag-chip-decoration.mjs.map +1 -1
  227. package/dist/components/ui/badge.mjs +1 -1
  228. package/dist/components/ui/button.d.mts +1 -1
  229. package/dist/components/ui/combobox.mjs +0 -1
  230. package/dist/components/ui/combobox.mjs.map +1 -1
  231. package/dist/context/pipe-catalog-card-context.d.mts +7 -0
  232. package/dist/context/pipe-catalog-card-context.d.mts.map +1 -1
  233. package/dist/context/pipe-catalog-card-context.mjs.map +1 -1
  234. package/dist/context/pipe-form-context.d.mts +17 -3
  235. package/dist/context/pipe-form-context.d.mts.map +1 -1
  236. package/dist/context/pipe-form-context.mjs.map +1 -1
  237. package/dist/context/search-catalog-card-context.d.mts +8 -0
  238. package/dist/context/search-catalog-card-context.d.mts.map +1 -1
  239. package/dist/context/search-catalog-card-context.mjs.map +1 -1
  240. package/dist/context/search-form-context.d.mts +17 -3
  241. package/dist/context/search-form-context.d.mts.map +1 -1
  242. package/dist/context/search-form-context.mjs.map +1 -1
  243. package/dist/context/searches-catalog-card-context.d.mts +8 -0
  244. package/dist/context/searches-catalog-card-context.d.mts.map +1 -1
  245. package/dist/context/searches-catalog-card-context.mjs.map +1 -1
  246. package/dist/hooks/use-field-error.d.mts +2 -2
  247. package/dist/hooks/use-field-error.d.mts.map +1 -1
  248. package/dist/hooks/use-field-error.mjs +7 -3
  249. package/dist/hooks/use-field-error.mjs.map +1 -1
  250. package/dist/hooks/use-form-core.d.mts +0 -3
  251. package/dist/hooks/use-form-core.d.mts.map +1 -1
  252. package/dist/hooks/use-form-core.mjs +36 -2
  253. package/dist/hooks/use-form-core.mjs.map +1 -1
  254. package/dist/hooks/use-pipe-catalog-table.d.mts +8 -8
  255. package/dist/hooks/use-pipe-form.d.mts +11 -0
  256. package/dist/hooks/use-pipe-form.d.mts.map +1 -1
  257. package/dist/hooks/use-pipe-form.mjs +35 -6
  258. package/dist/hooks/use-pipe-form.mjs.map +1 -1
  259. package/dist/hooks/use-search-catalog-table.d.mts +6 -6
  260. package/dist/hooks/use-search-form.d.mts +11 -0
  261. package/dist/hooks/use-search-form.d.mts.map +1 -1
  262. package/dist/hooks/use-search-form.mjs +35 -6
  263. package/dist/hooks/use-search-form.mjs.map +1 -1
  264. package/dist/index.d.mts +9 -8
  265. package/dist/index.mjs +3 -9
  266. package/dist/styles/pipe0-form.css +4116 -1
  267. package/dist/types/adapters.d.mts +6 -5
  268. package/dist/types/adapters.d.mts.map +1 -1
  269. package/dist/types/catalog-adapters.d.mts +2 -2
  270. package/dist/types/field-props.d.mts +4 -16
  271. package/dist/types/field-props.d.mts.map +1 -1
  272. package/dist/types/form-handle.d.mts +81 -1
  273. package/dist/types/form-handle.d.mts.map +1 -1
  274. package/dist/utils/build-section-handlers.mjs +6 -2
  275. package/dist/utils/build-section-handlers.mjs.map +1 -1
  276. package/dist/utils/internal-form.mjs +28 -0
  277. package/dist/utils/internal-form.mjs.map +1 -0
  278. package/dist/widgets/avatar-group.d.mts +4 -7
  279. package/dist/widgets/avatar-group.d.mts.map +1 -1
  280. package/dist/widgets/avatar-group.mjs +13 -12
  281. package/dist/widgets/avatar-group.mjs.map +1 -1
  282. package/package.json +70 -18
  283. package/dist/components/compound/pipe-catalog/index.mjs +0 -15
  284. package/dist/components/compound/pipe-form/index.mjs +0 -11
  285. package/dist/components/compound/search-catalog/index.mjs +0 -14
  286. package/dist/components/compound/search-form/index.mjs +0 -11
  287. package/dist/components/compound/searches-catalog/index.mjs +0 -14
  288. package/dist/components/defaults/adapters/pipes-trigger-input.mjs.map +0 -1
  289. package/dist/components/defaults/layout/submit-button.d.mts +0 -9
  290. package/dist/components/defaults/layout/submit-button.d.mts.map +0 -1
  291. package/dist/components/defaults/layout/submit-button.mjs +0 -23
  292. package/dist/components/defaults/layout/submit-button.mjs.map +0 -1
  293. package/dist/components/defaults/toggle-advanced-button.mjs +0 -29
  294. package/dist/components/defaults/toggle-advanced-button.mjs.map +0 -1
  295. package/dist/components/ui/input-group.mjs +0 -30
  296. package/dist/components/ui/input-group.mjs.map +0 -1
  297. package/dist/context/form-customization-context.d.mts +0 -71
  298. package/dist/context/form-customization-context.d.mts.map +0 -1
  299. package/dist/context/form-customization-context.mjs +0 -114
  300. package/dist/context/form-customization-context.mjs.map +0 -1
  301. package/dist/hooks/use-disclosure.mjs +0 -35
  302. package/dist/hooks/use-disclosure.mjs.map +0 -1
  303. package/dist/utils/render-slot.d.mts +0 -44
  304. package/dist/utils/render-slot.d.mts.map +0 -1
  305. package/dist/utils/render-slot.mjs +0 -30
  306. package/dist/utils/render-slot.mjs.map +0 -1
  307. package/dist/widgets/index.mjs +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"pipe-catalog-card-context.mjs","names":[],"sources":["../../src/context/pipe-catalog-card-context.ts"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { PipeCardData } from \"../types/catalog-adapters.js\";\n\nexport interface PipeCatalogCardContextValue {\n card: PipeCardData;\n index: number;\n selected: boolean;\n /** Selection handler — fires the catalog root's `onSelectCard`. */\n onSelect: (e: SyntheticEvent) => void;\n}\n\nexport const PipeCatalogCardContext = createContext<PipeCatalogCardContextValue | null>(null);\n\nexport function usePipeCatalogCard(): PipeCatalogCardContextValue {\n const value = useContext(PipeCatalogCardContext);\n if (value == null) {\n throw new Error(\"usePipeCatalogCard must be used inside <PipeCatalogCard>.\");\n }\n return value;\n}\n"],"mappings":";;;AAYA,MAAa,yBAAyB,cAAkD,KAAK;AAE7F,SAAgB,qBAAkD;CAChE,MAAM,QAAQ,WAAW,uBAAuB;AAChD,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,4DAA4D;AAE9E,QAAO"}
1
+ {"version":3,"file":"pipe-catalog-card-context.mjs","names":[],"sources":["../../src/context/pipe-catalog-card-context.ts"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { PipeCardData } from \"../types/catalog-adapters.js\";\n\nexport interface PipeCatalogCardContextValue {\n card: PipeCardData;\n index: number;\n selected: boolean;\n expanded: boolean;\n /** Selection handler — fires the catalog root's `onSelectCard`. */\n onSelect: (e: SyntheticEvent) => void;\n /**\n * Open or close this card's expansion drawer. Only a single card inside a\n * `<PipeCatalog>` can be expanded at any time — opening one closes the\n * previously expanded card.\n */\n setExpanded: (open: boolean) => void;\n}\n\nexport const PipeCatalogCardContext = createContext<PipeCatalogCardContextValue | null>(null);\n\nexport function usePipeCatalogCard(): PipeCatalogCardContextValue {\n const value = useContext(PipeCatalogCardContext);\n if (value == null) {\n throw new Error(\"usePipeCatalogCard must be used inside <PipeCatalogCard>.\");\n }\n return value;\n}\n"],"mappings":";;;AAmBA,MAAa,yBAAyB,cAAkD,KAAK;AAE7F,SAAgB,qBAAkD;CAChE,MAAM,QAAQ,WAAW,uBAAuB;AAChD,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,4DAA4D;AAE9E,QAAO"}
@@ -1,19 +1,33 @@
1
1
  import { AnyFieldProps } from "../types/field-props.mjs";
2
- import { FormSectionHandle } from "../types/form-handle.mjs";
2
+ import { FormHandle, FormSectionHandle } from "../types/form-handle.mjs";
3
3
  import { FieldLoadState, ResourceStatus } from "../hooks/use-form-core.mjs";
4
4
  import * as _$react from "react";
5
5
  import { FormResolvers, FormStore, PipeId, PipePayload } from "@pipe0/base";
6
- import { UseFormReturn } from "react-hook-form";
7
6
 
8
7
  //#region src/context/pipe-form-context.d.ts
9
8
  interface PipeFormContext {
10
9
  id: PipeId;
11
10
  publicKey: string;
12
- form: UseFormReturn<PipePayload>;
11
+ form: FormHandle<PipePayload>;
12
+ /**
13
+ * Sections to render, after applying any active form customization
14
+ * (hide/relabel section/group/field). Iterate this directly when
15
+ * building a custom form body — it matches what the default body renders.
16
+ */
13
17
  sections: FormSectionHandle[];
14
18
  fields: AnyFieldProps[];
19
+ /**
20
+ * The set of field paths actually rendered by `sections`, after
21
+ * customization. Used by form-level error rendering to decide which
22
+ * errors are owned by a visible field vs. need surfacing separately.
23
+ */
24
+ fieldPaths: Set<string>;
15
25
  connectionsStatus: ResourceStatus;
16
26
  fieldLoadStates: Record<string, FieldLoadState>;
27
+ fieldLoaderErrors: Record<string, FieldLoadState>;
28
+ loadingFieldLoaders: Record<string, FieldLoadState>;
29
+ hasFieldLoaderError: boolean;
30
+ isFieldLoaderLoading: boolean;
17
31
  resolvers?: FormResolvers;
18
32
  store: FormStore;
19
33
  reset: (values?: PipePayload) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"pipe-form-context.d.mts","names":[],"sources":["../../src/context/pipe-form-context.ts"],"mappings":";;;;;;;;UAOiB,eAAA;EACf,EAAA,EAAI,MAAA;EACJ,SAAA;EAEA,IAAA,EAAM,aAAA,CAAc,WAAA;EACpB,QAAA,EAAU,iBAAA;EACV,MAAA,EAAQ,aAAA;EAER,iBAAA,EAAmB,cAAA;EACnB,eAAA,EAAiB,MAAA,SAAe,cAAA;EAEhC,SAAA,GAAY,aAAA;EACZ,KAAA,EAAO,SAAA;EAEP,KAAA,GAAQ,MAAA,GAAS,WAAA;AAAA;AAAA,cAGN,eAAA,EAAe,OAAA,CAAA,OAAA,CAAA,eAAA;AAAA,iBAEZ,kBAAA,CAAA,GAAsB,eAAA"}
1
+ {"version":3,"file":"pipe-form-context.d.mts","names":[],"sources":["../../src/context/pipe-form-context.ts"],"mappings":";;;;;;;UAMiB,eAAA;EACf,EAAA,EAAI,MAAA;EACJ,SAAA;EAEA,IAAA,EAAM,UAAA,CAAW,WAAA;EAJa;;;;;EAU9B,QAAA,EAAU,iBAAA;EACV,MAAA,EAAQ,aAAA;EAMI;;;;;EAAZ,UAAA,EAAY,GAAA;EAEZ,iBAAA,EAAmB,cAAA;EACnB,eAAA,EAAiB,MAAA,SAAe,cAAA;EAChC,iBAAA,EAAmB,MAAA,SAAe,cAAA;EAClC,mBAAA,EAAqB,MAAA,SAAe,cAAA;EACpC,mBAAA;EACA,oBAAA;EAEA,SAAA,GAAY,aAAA;EACZ,KAAA,EAAO,SAAA;EAEP,KAAA,GAAQ,MAAA,GAAS,WAAA;AAAA;AAAA,cAGN,eAAA,EAAe,OAAA,CAAA,OAAA,CAAA,eAAA;AAAA,iBAEZ,kBAAA,CAAA,GAAsB,eAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"pipe-form-context.mjs","names":[],"sources":["../../src/context/pipe-form-context.ts"],"sourcesContent":["import type { FormResolvers, FormStore, PipeId, PipePayload } from \"@pipe0/base\";\nimport { createContext, useContext } from \"react\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport type { FieldLoadState, ResourceStatus } from \"../hooks/use-form-core.js\";\nimport type { AnyFieldProps } from \"../types/field-props.js\";\nimport type { FormSectionHandle } from \"../types/form-handle.js\";\n\nexport interface PipeFormContext {\n id: PipeId;\n publicKey: string;\n\n form: UseFormReturn<PipePayload>;\n sections: FormSectionHandle[];\n fields: AnyFieldProps[];\n\n connectionsStatus: ResourceStatus;\n fieldLoadStates: Record<string, FieldLoadState>;\n\n resolvers?: FormResolvers;\n store: FormStore;\n\n reset: (values?: PipePayload) => void;\n}\n\nexport const PipeFormContext = createContext<PipeFormContext | null>(null);\n\nexport function usePipeFormContext(): PipeFormContext {\n const value = useContext(PipeFormContext);\n if (value == null) {\n throw new Error(\"usePipeFormContext must be used inside <PipeForm context={...}>\");\n }\n return value;\n}\n"],"mappings":";;;AAwBA,MAAa,kBAAkB,cAAsC,KAAK;AAE1E,SAAgB,qBAAsC;CACpD,MAAM,QAAQ,WAAW,gBAAgB;AACzC,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,kEAAkE;AAEpF,QAAO"}
1
+ {"version":3,"file":"pipe-form-context.mjs","names":[],"sources":["../../src/context/pipe-form-context.ts"],"sourcesContent":["import type { FormResolvers, FormStore, PipeId, PipePayload } from \"@pipe0/base\";\nimport { createContext, useContext } from \"react\";\nimport type { FieldLoadState, ResourceStatus } from \"../hooks/use-form-core.js\";\nimport type { AnyFieldProps } from \"../types/field-props.js\";\nimport type { FormHandle, FormSectionHandle } from \"../types/form-handle.js\";\n\nexport interface PipeFormContext {\n id: PipeId;\n publicKey: string;\n\n form: FormHandle<PipePayload>;\n /**\n * Sections to render, after applying any active form customization\n * (hide/relabel section/group/field). Iterate this directly when\n * building a custom form body — it matches what the default body renders.\n */\n sections: FormSectionHandle[];\n fields: AnyFieldProps[];\n /**\n * The set of field paths actually rendered by `sections`, after\n * customization. Used by form-level error rendering to decide which\n * errors are owned by a visible field vs. need surfacing separately.\n */\n fieldPaths: Set<string>;\n\n connectionsStatus: ResourceStatus;\n fieldLoadStates: Record<string, FieldLoadState>;\n fieldLoaderErrors: Record<string, FieldLoadState>;\n loadingFieldLoaders: Record<string, FieldLoadState>;\n hasFieldLoaderError: boolean;\n isFieldLoaderLoading: boolean;\n\n resolvers?: FormResolvers;\n store: FormStore;\n\n reset: (values?: PipePayload) => void;\n}\n\nexport const PipeFormContext = createContext<PipeFormContext | null>(null);\n\nexport function usePipeFormContext(): PipeFormContext {\n const value = useContext(PipeFormContext);\n if (value == null) {\n throw new Error(\"usePipeFormContext must be used inside <PipeForm context={...}>\");\n }\n return value;\n}\n"],"mappings":";;;AAsCA,MAAa,kBAAkB,cAAsC,KAAK;AAE1E,SAAgB,qBAAsC;CACpD,MAAM,QAAQ,WAAW,gBAAgB;AACzC,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,kEAAkE;AAEpF,QAAO"}
@@ -7,7 +7,15 @@ interface SearchCatalogCardContextValue {
7
7
  card: SearchCardData;
8
8
  index: number;
9
9
  selected: boolean;
10
+ expanded: boolean;
11
+ /** Selection handler — fires the catalog root's `onSelectCard`. */
10
12
  onSelect: (e: SyntheticEvent) => void;
13
+ /**
14
+ * Open or close this card's expansion drawer. Only a single card inside a
15
+ * `<SearchCatalog>` can be expanded at any time — opening one closes the
16
+ * previously expanded card.
17
+ */
18
+ setExpanded: (open: boolean) => void;
11
19
  }
12
20
  declare const SearchCatalogCardContext: _$react.Context<SearchCatalogCardContextValue | null>;
13
21
  declare function useSearchCatalogCard(): SearchCatalogCardContextValue;
@@ -1 +1 @@
1
- {"version":3,"file":"search-catalog-card-context.d.mts","names":[],"sources":["../../src/context/search-catalog-card-context.ts"],"mappings":";;;;;UAIiB,6BAAA;EACf,IAAA,EAAM,cAAA;EACN,KAAA;EACA,QAAA;EACA,QAAA,GAAW,CAAA,EAAG,cAAA;AAAA;AAAA,cAGH,wBAAA,EAAwB,OAAA,CAAA,OAAA,CAAA,6BAAA;AAAA,iBAErB,oBAAA,CAAA,GAAwB,6BAAA"}
1
+ {"version":3,"file":"search-catalog-card-context.d.mts","names":[],"sources":["../../src/context/search-catalog-card-context.ts"],"mappings":";;;;;UAIiB,6BAAA;EACf,IAAA,EAAM,cAAA;EACN,KAAA;EACA,QAAA;EACA,QAAA;;EAEA,QAAA,GAAW,CAAA,EAAG,cAAA;EALd;;;;;EAWA,WAAA,GAAc,IAAA;AAAA;AAAA,cAGH,wBAAA,EAAwB,OAAA,CAAA,OAAA,CAAA,6BAAA;AAAA,iBAErB,oBAAA,CAAA,GAAwB,6BAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"search-catalog-card-context.mjs","names":[],"sources":["../../src/context/search-catalog-card-context.ts"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { SearchCardData } from \"../types/catalog-adapters.js\";\n\nexport interface SearchCatalogCardContextValue {\n card: SearchCardData;\n index: number;\n selected: boolean;\n onSelect: (e: SyntheticEvent) => void;\n}\n\nexport const SearchCatalogCardContext = createContext<SearchCatalogCardContextValue | null>(null);\n\nexport function useSearchCatalogCard(): SearchCatalogCardContextValue {\n const value = useContext(SearchCatalogCardContext);\n if (value == null) {\n throw new Error(\"useSearchCatalogCard must be used inside <SearchCatalogCard>.\");\n }\n return value;\n}\n"],"mappings":";;;AAWA,MAAa,2BAA2B,cAAoD,KAAK;AAEjG,SAAgB,uBAAsD;CACpE,MAAM,QAAQ,WAAW,yBAAyB;AAClD,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,gEAAgE;AAElF,QAAO"}
1
+ {"version":3,"file":"search-catalog-card-context.mjs","names":[],"sources":["../../src/context/search-catalog-card-context.ts"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { SearchCardData } from \"../types/catalog-adapters.js\";\n\nexport interface SearchCatalogCardContextValue {\n card: SearchCardData;\n index: number;\n selected: boolean;\n expanded: boolean;\n /** Selection handler — fires the catalog root's `onSelectCard`. */\n onSelect: (e: SyntheticEvent) => void;\n /**\n * Open or close this card's expansion drawer. Only a single card inside a\n * `<SearchCatalog>` can be expanded at any time — opening one closes the\n * previously expanded card.\n */\n setExpanded: (open: boolean) => void;\n}\n\nexport const SearchCatalogCardContext = createContext<SearchCatalogCardContextValue | null>(null);\n\nexport function useSearchCatalogCard(): SearchCatalogCardContextValue {\n const value = useContext(SearchCatalogCardContext);\n if (value == null) {\n throw new Error(\"useSearchCatalogCard must be used inside <SearchCatalogCard>.\");\n }\n return value;\n}\n"],"mappings":";;;AAmBA,MAAa,2BAA2B,cAAoD,KAAK;AAEjG,SAAgB,uBAAsD;CACpE,MAAM,QAAQ,WAAW,yBAAyB;AAClD,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,gEAAgE;AAElF,QAAO"}
@@ -1,19 +1,33 @@
1
1
  import { AnyFieldProps } from "../types/field-props.mjs";
2
- import { FormSectionHandle } from "../types/form-handle.mjs";
2
+ import { FormHandle, FormSectionHandle } from "../types/form-handle.mjs";
3
3
  import { FieldLoadState, ResourceStatus } from "../hooks/use-form-core.mjs";
4
4
  import * as _$react from "react";
5
5
  import { FormResolvers, FormStore, SearchId, SearchPayload } from "@pipe0/base";
6
- import { UseFormReturn } from "react-hook-form";
7
6
 
8
7
  //#region src/context/search-form-context.d.ts
9
8
  interface SearchFormContext {
10
9
  id: SearchId;
11
10
  publicKey: string;
12
- form: UseFormReturn<SearchPayload>;
11
+ form: FormHandle<SearchPayload>;
12
+ /**
13
+ * Sections to render, after applying any active form customization
14
+ * (hide/relabel section/group/field). Iterate this directly when
15
+ * building a custom form body — it matches what the default body renders.
16
+ */
13
17
  sections: FormSectionHandle[];
14
18
  fields: AnyFieldProps[];
19
+ /**
20
+ * The set of field paths actually rendered by `sections`, after
21
+ * customization. Used by form-level error rendering to decide which
22
+ * errors are owned by a visible field vs. need surfacing separately.
23
+ */
24
+ fieldPaths: Set<string>;
15
25
  connectionsStatus: ResourceStatus;
16
26
  fieldLoadStates: Record<string, FieldLoadState>;
27
+ fieldLoaderErrors: Record<string, FieldLoadState>;
28
+ loadingFieldLoaders: Record<string, FieldLoadState>;
29
+ hasFieldLoaderError: boolean;
30
+ isFieldLoaderLoading: boolean;
17
31
  resolvers?: FormResolvers;
18
32
  store: FormStore;
19
33
  reset: (values?: SearchPayload) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"search-form-context.d.mts","names":[],"sources":["../../src/context/search-form-context.ts"],"mappings":";;;;;;;;UAOiB,iBAAA;EACf,EAAA,EAAI,QAAA;EACJ,SAAA;EAEA,IAAA,EAAM,aAAA,CAAc,aAAA;EACpB,QAAA,EAAU,iBAAA;EACV,MAAA,EAAQ,aAAA;EAER,iBAAA,EAAmB,cAAA;EACnB,eAAA,EAAiB,MAAA,SAAe,cAAA;EAEhC,SAAA,GAAY,aAAA;EACZ,KAAA,EAAO,SAAA;EAEP,KAAA,GAAQ,MAAA,GAAS,aAAA;AAAA;AAAA,cAGN,iBAAA,EAAiB,OAAA,CAAA,OAAA,CAAA,iBAAA;AAAA,iBAEd,oBAAA,CAAA,GAAwB,iBAAA"}
1
+ {"version":3,"file":"search-form-context.d.mts","names":[],"sources":["../../src/context/search-form-context.ts"],"mappings":";;;;;;;UAMiB,iBAAA;EACf,EAAA,EAAI,QAAA;EACJ,SAAA;EAEA,IAAA,EAAM,UAAA,CAAW,aAAA;EAJe;;;;;EAUhC,QAAA,EAAU,iBAAA;EACV,MAAA,EAAQ,aAAA;EAMI;;;;;EAAZ,UAAA,EAAY,GAAA;EAEZ,iBAAA,EAAmB,cAAA;EACnB,eAAA,EAAiB,MAAA,SAAe,cAAA;EAChC,iBAAA,EAAmB,MAAA,SAAe,cAAA;EAClC,mBAAA,EAAqB,MAAA,SAAe,cAAA;EACpC,mBAAA;EACA,oBAAA;EAEA,SAAA,GAAY,aAAA;EACZ,KAAA,EAAO,SAAA;EAEP,KAAA,GAAQ,MAAA,GAAS,aAAA;AAAA;AAAA,cAGN,iBAAA,EAAiB,OAAA,CAAA,OAAA,CAAA,iBAAA;AAAA,iBAEd,oBAAA,CAAA,GAAwB,iBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"search-form-context.mjs","names":[],"sources":["../../src/context/search-form-context.ts"],"sourcesContent":["import type { FormResolvers, FormStore, SearchId, SearchPayload } from \"@pipe0/base\";\nimport { createContext, useContext } from \"react\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport type { FieldLoadState, ResourceStatus } from \"../hooks/use-form-core.js\";\nimport type { AnyFieldProps } from \"../types/field-props.js\";\nimport type { FormSectionHandle } from \"../types/form-handle.js\";\n\nexport interface SearchFormContext {\n id: SearchId;\n publicKey: string;\n\n form: UseFormReturn<SearchPayload>;\n sections: FormSectionHandle[];\n fields: AnyFieldProps[];\n\n connectionsStatus: ResourceStatus;\n fieldLoadStates: Record<string, FieldLoadState>;\n\n resolvers?: FormResolvers;\n store: FormStore;\n\n reset: (values?: SearchPayload) => void;\n}\n\nexport const SearchFormContext = createContext<SearchFormContext | null>(null);\n\nexport function useSearchFormContext(): SearchFormContext {\n const value = useContext(SearchFormContext);\n if (value == null) {\n throw new Error(\"useSearchFormContext must be used inside <SearchForm context={...}>\");\n }\n return value;\n}\n"],"mappings":";;;AAwBA,MAAa,oBAAoB,cAAwC,KAAK;AAE9E,SAAgB,uBAA0C;CACxD,MAAM,QAAQ,WAAW,kBAAkB;AAC3C,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,sEAAsE;AAExF,QAAO"}
1
+ {"version":3,"file":"search-form-context.mjs","names":[],"sources":["../../src/context/search-form-context.ts"],"sourcesContent":["import type { FormResolvers, FormStore, SearchId, SearchPayload } from \"@pipe0/base\";\nimport { createContext, useContext } from \"react\";\nimport type { FieldLoadState, ResourceStatus } from \"../hooks/use-form-core.js\";\nimport type { AnyFieldProps } from \"../types/field-props.js\";\nimport type { FormHandle, FormSectionHandle } from \"../types/form-handle.js\";\n\nexport interface SearchFormContext {\n id: SearchId;\n publicKey: string;\n\n form: FormHandle<SearchPayload>;\n /**\n * Sections to render, after applying any active form customization\n * (hide/relabel section/group/field). Iterate this directly when\n * building a custom form body — it matches what the default body renders.\n */\n sections: FormSectionHandle[];\n fields: AnyFieldProps[];\n /**\n * The set of field paths actually rendered by `sections`, after\n * customization. Used by form-level error rendering to decide which\n * errors are owned by a visible field vs. need surfacing separately.\n */\n fieldPaths: Set<string>;\n\n connectionsStatus: ResourceStatus;\n fieldLoadStates: Record<string, FieldLoadState>;\n fieldLoaderErrors: Record<string, FieldLoadState>;\n loadingFieldLoaders: Record<string, FieldLoadState>;\n hasFieldLoaderError: boolean;\n isFieldLoaderLoading: boolean;\n\n resolvers?: FormResolvers;\n store: FormStore;\n\n reset: (values?: SearchPayload) => void;\n}\n\nexport const SearchFormContext = createContext<SearchFormContext | null>(null);\n\nexport function useSearchFormContext(): SearchFormContext {\n const value = useContext(SearchFormContext);\n if (value == null) {\n throw new Error(\"useSearchFormContext must be used inside <SearchForm context={...}>\");\n }\n return value;\n}\n"],"mappings":";;;AAsCA,MAAa,oBAAoB,cAAwC,KAAK;AAE9E,SAAgB,uBAA0C;CACxD,MAAM,QAAQ,WAAW,kBAAkB;AAC3C,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,sEAAsE;AAExF,QAAO"}
@@ -7,7 +7,15 @@ interface SearchesCatalogCardContextValue {
7
7
  card: SearchesCardData;
8
8
  index: number;
9
9
  selected: boolean;
10
+ expanded: boolean;
11
+ /** Selection handler — fires the catalog root's `onSelectCard`. */
10
12
  onSelect: (e: SyntheticEvent) => void;
13
+ /**
14
+ * Open or close this card's expansion drawer. Only a single card inside a
15
+ * `<SearchesCatalog>` can be expanded at any time — opening one closes the
16
+ * previously expanded card.
17
+ */
18
+ setExpanded: (open: boolean) => void;
11
19
  }
12
20
  declare const SearchesCatalogCardContext: _$react.Context<SearchesCatalogCardContextValue | null>;
13
21
  declare function useSearchesCatalogCard(): SearchesCatalogCardContextValue;
@@ -1 +1 @@
1
- {"version":3,"file":"searches-catalog-card-context.d.mts","names":[],"sources":["../../src/context/searches-catalog-card-context.ts"],"mappings":";;;;;UAIiB,+BAAA;EACf,IAAA,EAAM,gBAAA;EACN,KAAA;EACA,QAAA;EACA,QAAA,GAAW,CAAA,EAAG,cAAA;AAAA;AAAA,cAGH,0BAAA,EAA0B,OAAA,CAAA,OAAA,CAAA,+BAAA;AAAA,iBAIvB,sBAAA,CAAA,GAA0B,+BAAA"}
1
+ {"version":3,"file":"searches-catalog-card-context.d.mts","names":[],"sources":["../../src/context/searches-catalog-card-context.ts"],"mappings":";;;;;UAIiB,+BAAA;EACf,IAAA,EAAM,gBAAA;EACN,KAAA;EACA,QAAA;EACA,QAAA;;EAEA,QAAA,GAAW,CAAA,EAAG,cAAA;EALd;;;;;EAWA,WAAA,GAAc,IAAA;AAAA;AAAA,cAGH,0BAAA,EAA0B,OAAA,CAAA,OAAA,CAAA,+BAAA;AAAA,iBAIvB,sBAAA,CAAA,GAA0B,+BAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"searches-catalog-card-context.mjs","names":[],"sources":["../../src/context/searches-catalog-card-context.ts"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { SearchesCardData } from \"../types/catalog-adapters.js\";\n\nexport interface SearchesCatalogCardContextValue {\n card: SearchesCardData;\n index: number;\n selected: boolean;\n onSelect: (e: SyntheticEvent) => void;\n}\n\nexport const SearchesCatalogCardContext = createContext<SearchesCatalogCardContextValue | null>(\n null,\n);\n\nexport function useSearchesCatalogCard(): SearchesCatalogCardContextValue {\n const value = useContext(SearchesCatalogCardContext);\n if (value == null) {\n throw new Error(\"useSearchesCatalogCard must be used inside <SearchesCatalogCard>.\");\n }\n return value;\n}\n"],"mappings":";;;AAWA,MAAa,6BAA6B,cACxC,KACD;AAED,SAAgB,yBAA0D;CACxE,MAAM,QAAQ,WAAW,2BAA2B;AACpD,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,oEAAoE;AAEtF,QAAO"}
1
+ {"version":3,"file":"searches-catalog-card-context.mjs","names":[],"sources":["../../src/context/searches-catalog-card-context.ts"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { SearchesCardData } from \"../types/catalog-adapters.js\";\n\nexport interface SearchesCatalogCardContextValue {\n card: SearchesCardData;\n index: number;\n selected: boolean;\n expanded: boolean;\n /** Selection handler — fires the catalog root's `onSelectCard`. */\n onSelect: (e: SyntheticEvent) => void;\n /**\n * Open or close this card's expansion drawer. Only a single card inside a\n * `<SearchesCatalog>` can be expanded at any time — opening one closes the\n * previously expanded card.\n */\n setExpanded: (open: boolean) => void;\n}\n\nexport const SearchesCatalogCardContext = createContext<SearchesCatalogCardContextValue | null>(\n null,\n);\n\nexport function useSearchesCatalogCard(): SearchesCatalogCardContextValue {\n const value = useContext(SearchesCatalogCardContext);\n if (value == null) {\n throw new Error(\"useSearchesCatalogCard must be used inside <SearchesCatalogCard>.\");\n }\n return value;\n}\n"],"mappings":";;;AAmBA,MAAa,6BAA6B,cACxC,KACD;AAED,SAAgB,yBAA0D;CACxE,MAAM,QAAQ,WAAW,2BAA2B;AACpD,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,oEAAoE;AAEtF,QAAO"}
@@ -1,11 +1,11 @@
1
- import { UseFormReturn } from "react-hook-form";
1
+ import { FormHandle } from "../types/form-handle.mjs";
2
2
 
3
3
  //#region src/hooks/use-field-error.d.ts
4
4
  /**
5
5
  * Resolves a nested field error by its full dot-notation path.
6
6
  * Only returns an error after the form has been submitted at least once.
7
7
  */
8
- declare function useFieldError(form: UseFormReturn<any>, path: string): string | undefined;
8
+ declare function useFieldError(form: FormHandle, path: string): string | undefined;
9
9
  //#endregion
10
10
  export { useFieldError };
11
11
  //# sourceMappingURL=use-field-error.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-field-error.d.mts","names":[],"sources":["../../src/hooks/use-field-error.ts"],"mappings":";;;;;AAMA;;iBAAgB,aAAA,CAAc,IAAA,EAAM,aAAA,OAAoB,IAAA"}
1
+ {"version":3,"file":"use-field-error.d.mts","names":[],"sources":["../../src/hooks/use-field-error.ts"],"mappings":";;;;;AAMA;;iBAAgB,aAAA,CAAc,IAAA,EAAM,UAAA,EAAY,IAAA"}
@@ -12,10 +12,14 @@ function resolveError(errors, path) {
12
12
  const segments = path.split(".");
13
13
  let node = errors;
14
14
  for (const seg of segments) {
15
- node = node?.[seg];
16
- if (!node) return void 0;
15
+ if (node == null || typeof node !== "object") return void 0;
16
+ node = node[seg];
17
+ if (node == null) return void 0;
18
+ }
19
+ if (node != null && typeof node === "object" && "message" in node) {
20
+ const msg = node.message;
21
+ return typeof msg === "string" ? msg : void 0;
17
22
  }
18
- return node?.message;
19
23
  }
20
24
 
21
25
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"use-field-error.mjs","names":[],"sources":["../../src/hooks/use-field-error.ts"],"sourcesContent":["import type { FieldErrors, UseFormReturn } from \"react-hook-form\";\n\n/**\n * Resolves a nested field error by its full dot-notation path.\n * Only returns an error after the form has been submitted at least once.\n */\nexport function useFieldError(form: UseFormReturn<any>, path: string): string | undefined {\n // Subscribe to both `isSubmitted` and `errors` so RHF's proxy\n // registers the dependency regardless of the current submit state.\n const { isSubmitted, errors } = form.formState;\n if (!isSubmitted) return undefined;\n return resolveError(errors, path);\n}\n\nfunction resolveError(errors: FieldErrors, path: string): string | undefined {\n const segments = path.split(\".\");\n let node: any = errors;\n for (const seg of segments) {\n node = node?.[seg];\n if (!node) return undefined;\n }\n return node?.message as string | undefined;\n}\n"],"mappings":";;;;;AAMA,SAAgB,cAAc,MAA0B,MAAkC;CAGxF,MAAM,EAAE,aAAa,WAAW,KAAK;AACrC,KAAI,CAAC,YAAa,QAAO;AACzB,QAAO,aAAa,QAAQ,KAAK;;AAGnC,SAAS,aAAa,QAAqB,MAAkC;CAC3E,MAAM,WAAW,KAAK,MAAM,IAAI;CAChC,IAAI,OAAY;AAChB,MAAK,MAAM,OAAO,UAAU;AAC1B,SAAO,OAAO;AACd,MAAI,CAAC,KAAM,QAAO;;AAEpB,QAAO,MAAM"}
1
+ {"version":3,"file":"use-field-error.mjs","names":[],"sources":["../../src/hooks/use-field-error.ts"],"sourcesContent":["import type { FormErrors, FormHandle } from \"../types/form-handle.js\";\n\n/**\n * Resolves a nested field error by its full dot-notation path.\n * Only returns an error after the form has been submitted at least once.\n */\nexport function useFieldError(form: FormHandle, path: string): string | undefined {\n // Read both `isSubmitted` and `errors` so the underlying form's reactive\n // tracking registers the dependency regardless of the current submit state.\n const { isSubmitted, errors } = form.formState;\n if (!isSubmitted) return undefined;\n return resolveError(errors, path);\n}\n\nfunction resolveError(errors: FormErrors, path: string): string | undefined {\n const segments = path.split(\".\");\n let node: unknown = errors;\n for (const seg of segments) {\n if (node == null || typeof node !== \"object\") return undefined;\n node = (node as Record<string, unknown>)[seg];\n if (node == null) return undefined;\n }\n if (node != null && typeof node === \"object\" && \"message\" in node) {\n const msg = (node as { message?: unknown }).message;\n return typeof msg === \"string\" ? msg : undefined;\n }\n return undefined;\n}\n"],"mappings":";;;;;AAMA,SAAgB,cAAc,MAAkB,MAAkC;CAGhF,MAAM,EAAE,aAAa,WAAW,KAAK;AACrC,KAAI,CAAC,YAAa,QAAO;AACzB,QAAO,aAAa,QAAQ,KAAK;;AAGnC,SAAS,aAAa,QAAoB,MAAkC;CAC1E,MAAM,WAAW,KAAK,MAAM,IAAI;CAChC,IAAI,OAAgB;AACpB,MAAK,MAAM,OAAO,UAAU;AAC1B,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAAU,QAAO;AACrD,SAAQ,KAAiC;AACzC,MAAI,QAAQ,KAAM,QAAO;;AAE3B,KAAI,QAAQ,QAAQ,OAAO,SAAS,YAAY,aAAa,MAAM;EACjE,MAAM,MAAO,KAA+B;AAC5C,SAAO,OAAO,QAAQ,WAAW,MAAM"}
@@ -1,7 +1,4 @@
1
- import { Dispatch } from "react";
2
1
  import { FormResolvers, FormStore, PipesEnvironment } from "@pipe0/base";
3
- import { UseFormReturn } from "react-hook-form";
4
-
5
2
  //#region src/hooks/use-form-core.d.ts
6
3
  type ResourceStatus = "idle" | "loading" | "ready" | "error";
7
4
  type FieldLoadState = {
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-core.d.mts","names":[],"sources":["../../src/hooks/use-form-core.ts"],"mappings":";;;;;KA8BY,cAAA;AAAA,KASA,cAAA;EACV,MAAA,EAAQ,cAAA,EADgB;EAGxB,QAAA,WAFsB;EAItB,cAAA,WAJQ;EAMR,mBAAA,WAFA;EAIA,yBAAA;AAAA"}
1
+ {"version":3,"file":"use-form-core.d.mts","names":[],"sources":["../../src/hooks/use-form-core.ts"],"mappings":";;KAkCY,cAAA;AAAA,KASA,cAAA;EACV,MAAA,EAAQ,cAAA,EADgB;EAGxB,QAAA,WAFsB;EAItB,cAAA,WAJQ;EAMR,mBAAA,WAFA;EAIA,yBAAA;AAAA"}
@@ -98,6 +98,21 @@ function useFormCore(options) {
98
98
  scopesKey,
99
99
  teamId
100
100
  ]);
101
+ const getConstantsResolver = resolvers?.getConstants;
102
+ const searchConstants = useCallback(async (query) => {
103
+ if (!getConstantsResolver) return [];
104
+ return Promise.resolve(getConstantsResolver({
105
+ query,
106
+ environment,
107
+ scopes,
108
+ teamId
109
+ }));
110
+ }, [
111
+ getConstantsResolver,
112
+ environment,
113
+ scopesKey,
114
+ teamId
115
+ ]);
101
116
  const slots = useMemo(() => collectEnabledSlots(formConfig), [formConfig]);
102
117
  const watchedValues = form.watch();
103
118
  const slotResults = useMemo(() => {
@@ -215,7 +230,8 @@ function useFormCore(options) {
215
230
  const formErrors = form.formState.errors;
216
231
  const sections = useMemo(() => buildSectionHandles(formConfig, form, publicKey, {
217
232
  fieldLoadStates,
218
- searchSecrets
233
+ searchSecrets,
234
+ searchConstants
219
235
  }), [
220
236
  formConfig,
221
237
  form,
@@ -223,15 +239,33 @@ function useFormCore(options) {
223
239
  fieldLoadStates,
224
240
  isSubmitted,
225
241
  searchSecrets,
242
+ searchConstants,
226
243
  watchedValues,
227
244
  formErrors
228
245
  ]);
246
+ const fields = useMemo(() => sections.flatMap((s) => s.groups.flatMap((g) => g.fields)), [sections]);
247
+ const { fieldLoaderErrors, loadingFieldLoaders, hasFieldLoaderError, isFieldLoaderLoading } = useMemo(() => {
248
+ const errors = {};
249
+ const loading = {};
250
+ for (const [path, state] of Object.entries(fieldLoadStates)) if (state.status === "error") errors[path] = state;
251
+ else if (state.status === "loading") loading[path] = state;
252
+ return {
253
+ fieldLoaderErrors: errors,
254
+ loadingFieldLoaders: loading,
255
+ hasFieldLoaderError: Object.keys(errors).length > 0,
256
+ isFieldLoaderLoading: Object.keys(loading).length > 0
257
+ };
258
+ }, [fieldLoadStates]);
229
259
  return {
230
260
  connectionsStatus,
231
261
  fieldLoadStates,
262
+ fieldLoaderErrors,
263
+ loadingFieldLoaders,
264
+ hasFieldLoaderError,
265
+ isFieldLoaderLoading,
232
266
  form,
233
267
  sections,
234
- fields: useMemo(() => sections.flatMap((s) => s.groups.flatMap((g) => g.fields)), [sections]),
268
+ fields,
235
269
  reset: form.reset
236
270
  };
237
271
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-core.mjs","names":[],"sources":["../../src/hooks/use-form-core.ts"],"sourcesContent":["import { zodResolver } from \"@hookform/resolvers/zod\";\nimport type {\n EnabledIf,\n EnabledResult,\n FormResolvers,\n FormSection,\n FormStore,\n GeneratedInputMeta,\n PipesEnvironment,\n ProviderName,\n} from \"@pipe0/base\";\nimport {\n type Dispatch,\n type SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { type FieldValues, type UseFormReturn, useForm } from \"react-hook-form\";\nimport type { AnyFieldProps, SecretSuggestion } from \"../types/field-props.js\";\nimport type { FormSectionHandle } from \"../types/form-handle.js\";\nimport { buildSectionHandles } from \"../utils/build-section-handlers.js\";\nimport { mergeFormStores } from \"../utils/merge-form-stores.js\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport type ResourceStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport type SlotId = \"field\" | \"suggestions\";\n\nexport type FieldEnabledState = {\n disabled: boolean;\n reason?: string;\n};\n\nexport type FieldLoadState = {\n status: ResourceStatus;\n /** Field-level disabled (from `meta.enabledIf`). */\n disabled: boolean;\n /** Field-level disabled reason. */\n disabledReason?: string;\n /** Suggestions sub-feature gate (from `optionsDef.enabledIf`). */\n suggestionsDisabled: boolean;\n /** Suggestions sub-feature reason. */\n suggestionsDisabledReason?: string;\n};\n\nexport interface UseFormCoreOptions<T extends FieldValues> {\n pipeOrSearchId: string;\n kind: \"pipe\" | \"search\";\n schema: any;\n publicKey: string;\n defaultValues?: T;\n formConfig: FormSection[];\n resolvers?: FormResolvers;\n store: FormStore;\n setStore: Dispatch<SetStateAction<FormStore>>;\n environment?: PipesEnvironment;\n /**\n * Form-level scope tags. Bundled into every `resolvers.getSecrets` call so\n * the backend can return only the secrets allowed in the declared scopes\n * (intersection on top of cascade visibility).\n */\n scopes?: string[];\n /**\n * Current team context. Bundled into every `resolvers.getSecrets` call so\n * the backend can restrict team-level secrets to exactly this team.\n */\n teamId?: string;\n}\n\nexport interface UseFormCoreReturn<T extends FieldValues> {\n connectionsStatus: ResourceStatus;\n /** Map of field path → load state for dynamic context_select_input fields. */\n fieldLoadStates: Record<string, FieldLoadState>;\n form: UseFormReturn<T, any, any>;\n sections: FormSectionHandle[];\n fields: AnyFieldProps[];\n reset: (values?: T) => void;\n}\n\ntype EnabledSlot = {\n fieldPath: string;\n slotId: SlotId;\n enabledIf: EnabledIf;\n /** Only present for \"suggestions\" slots — used to drive option fetching. */\n optionsDef?: {\n requires: { connection?: ProviderName; fields?: readonly string[] };\n };\n};\n\nfunction collectEnabledSlots(formConfig: FormSection[]): EnabledSlot[] {\n const out: EnabledSlot[] = [];\n for (const section of formConfig) {\n for (const group of section.groups) {\n for (const field of group.fields as GeneratedInputMeta[]) {\n if (field.enabledIf) {\n out.push({\n fieldPath: field.path,\n slotId: \"field\",\n enabledIf: field.enabledIf,\n });\n }\n const supportsOptionsDef =\n field.type === \"context_select_input\" || field.type === \"tagged_text_input\";\n if (supportsOptionsDef && \"optionsDef\" in field && field.optionsDef) {\n const optionsDef = field.optionsDef as EnabledSlot[\"optionsDef\"] & {\n enabledIf?: EnabledIf;\n };\n if (optionsDef?.enabledIf) {\n out.push({\n fieldPath: field.path,\n slotId: \"suggestions\",\n enabledIf: optionsDef.enabledIf,\n optionsDef,\n });\n } else {\n // Even without a sub-feature enabledIf, we still need to track\n // this field as having a fetchable suggestions slot — it's\n // always enabled and the fetch fires on every value change.\n out.push({\n fieldPath: field.path,\n slotId: \"suggestions\",\n enabledIf: () => ({ disabled: false }),\n optionsDef,\n });\n }\n }\n }\n }\n }\n return out;\n}\n\nfunction getPathValue(obj: unknown, path: string): unknown {\n const parts = path.split(\".\");\n let cur: any = obj;\n for (const part of parts) {\n if (cur == null) return undefined;\n cur = cur[part];\n }\n return cur;\n}\n\nfunction evalSlot(slot: EnabledSlot, payload: unknown): EnabledResult {\n return slot.enabledIf(payload);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useFormCore<T extends FieldValues>(\n options: UseFormCoreOptions<T>,\n): UseFormCoreReturn<T> {\n const {\n schema,\n publicKey,\n defaultValues,\n formConfig,\n resolvers,\n pipeOrSearchId,\n kind,\n setStore,\n environment = \"production\",\n scopes,\n teamId,\n } = options;\n\n // Stable signature for `scopes` so its identity doesn't churn the effect\n // dep across renders when callers pass a fresh array literal each time.\n const scopesKey = useMemo(() => (scopes ? JSON.stringify(scopes) : \"\"), [scopes]);\n\n // --- Per-resource status ---\n const [connectionsStatus, setConnectionsStatus] = useState<ResourceStatus>(\n resolvers?.getConnections ? \"loading\" : \"idle\",\n );\n const [fieldLoadStates, setFieldLoadStates] = useState<Record<string, FieldLoadState>>({});\n\n // --- Form ---\n const form = useForm<T>({\n resolver: zodResolver(schema),\n defaultValues: defaultValues as any,\n });\n\n // --- Helpers ---\n const mergeStore = useCallback(\n (incoming: FormStore) => setStore((old) => mergeFormStores(old, incoming)),\n [setStore],\n );\n\n // --- Effect 1: Load connections ---\n useEffect(() => {\n if (!resolvers?.getConnections) {\n setConnectionsStatus(\"idle\");\n return;\n }\n\n let cancelled = false;\n setConnectionsStatus(\"loading\");\n\n Promise.resolve(resolvers.getConnections({ id: pipeOrSearchId, environment }))\n .then((conns) => {\n if (cancelled) return;\n\n mergeStore({\n field_options: {\n connections: {\n options: conns.map((c) => ({\n label: c.public_id,\n value: c.public_id,\n widgets: {\n provider_logo: { provider: c.provider as ProviderName },\n },\n })),\n },\n },\n });\n\n setConnectionsStatus(\"ready\");\n })\n .catch(() => {\n if (!cancelled) setConnectionsStatus(\"error\");\n });\n\n return () => {\n cancelled = true;\n };\n }, [pipeOrSearchId, environment, resolvers?.getConnections, mergeStore]);\n\n // --- Curried secrets search ---\n // Each keystroke in the reference picker fires this with the latest query.\n // The picker handles debounce + race-correctness; here we just bundle in\n // form-level args (environment / scopes / teamId) and call the resolver.\n // No caching: every call hits the resolver. Returns [] if no resolver.\n const getSecretsResolver = resolvers?.getSecrets;\n const searchSecrets = useCallback(\n async (query: string): Promise<SecretSuggestion[]> => {\n if (!getSecretsResolver) return [];\n return Promise.resolve(getSecretsResolver({ query, environment, scopes, teamId }));\n },\n // `scopesKey` is the stable serialization of `scopes`; depending on the\n // raw array would churn the callback identity on every parent render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [getSecretsResolver, environment, scopesKey, teamId],\n );\n\n // --- Effect 2: Evaluate enabledIf slots + drive context_select fetching ---\n const slots = useMemo(() => collectEnabledSlots(formConfig), [formConfig]);\n\n // Subscribe to all form value changes so resolvers re-evaluate.\n const watchedValues = form.watch();\n\n // Evaluate every slot against the current payload. Keep the result\n // serialized so the effect's deps stay stable across reference-identical\n // re-renders.\n const slotResults = useMemo(() => {\n const out: Record<string, EnabledResult> = {};\n for (const slot of slots) {\n out[`${slot.fieldPath}::${slot.slotId}`] = evalSlot(slot, watchedValues);\n }\n return out;\n }, [slots, watchedValues]);\n const slotResultsSig = useMemo(() => JSON.stringify(slotResults), [slotResults]);\n\n // Track previous results so we can detect enabled→disabled transitions\n // (drives field-value clearing) and last-fired fetch signatures.\n const prevResultsRef = useRef<Record<string, EnabledResult>>({});\n const lastFiredSigRef = useRef<Record<string, string>>({});\n\n useEffect(() => {\n if (slots.length === 0) return;\n\n let cancelled = false;\n const nextLoadStates: Record<string, FieldLoadState> = {\n ...fieldLoadStates,\n };\n\n // Group slot results by field path for the load-state map.\n const byField: Record<string, { field?: EnabledResult; suggestions?: EnabledResult }> = {};\n for (const slot of slots) {\n const r = slotResults[`${slot.fieldPath}::${slot.slotId}`];\n if (r == null) continue;\n byField[slot.fieldPath] ??= {};\n byField[slot.fieldPath][slot.slotId] = r;\n }\n\n for (const slot of slots) {\n const key = `${slot.fieldPath}::${slot.slotId}`;\n const r = slotResults[key];\n if (r == null) continue;\n const prev = prevResultsRef.current[key];\n\n // Field-slot only: clear value on enabled→disabled transition.\n if (slot.slotId === \"field\" && r.disabled && prev != null && !prev.disabled) {\n form.setValue(slot.fieldPath as any, \"\" as any, {\n shouldDirty: true,\n shouldTouch: true,\n });\n }\n\n // Suggestions-slot: drive the existing context_select_input fetch.\n if (slot.slotId === \"suggestions\" && resolvers?.getFieldContext) {\n // If suggestions are gated, skip the fetch and reset dedupe so\n // re-enabling re-fires.\n if (r.disabled) {\n delete lastFiredSigRef.current[slot.fieldPath];\n continue;\n }\n\n // Resolve the connection for the legacy `requires.connection`\n // (still needed to pick the right secret for the fetch).\n const watchedConnections = (\n watchedValues as {\n connector?: { connections?: { connection?: string }[] };\n }\n )?.connector?.connections;\n const required = slot.optionsDef?.requires;\n\n let connectionId: string | undefined;\n if (required?.connection) {\n const match = watchedConnections?.find((c) =>\n c?.connection?.startsWith(`${required.connection}_`),\n );\n connectionId = match?.connection;\n // No matching connection — can't fetch, even if enabledIf passed.\n if (!connectionId) continue;\n }\n\n // Per-field signature for dedupe.\n const perFieldSig = JSON.stringify({\n connectionId,\n deps: required?.fields?.map((d) => getPathValue(watchedValues, d)) ?? [],\n });\n if (lastFiredSigRef.current[slot.fieldPath] === perFieldSig) continue;\n lastFiredSigRef.current[slot.fieldPath] = perFieldSig;\n\n // Mark loading for this field's fetch.\n const existing = nextLoadStates[slot.fieldPath];\n nextLoadStates[slot.fieldPath] = {\n status: \"loading\",\n disabled: existing?.disabled ?? false,\n disabledReason: existing?.disabledReason,\n suggestionsDisabled: false,\n suggestionsDisabledReason: undefined,\n };\n\n const idKey = kind === \"search\" ? \"search_id\" : \"pipe_id\";\n\n Promise.resolve(\n resolvers.getFieldContext({\n fieldPath: slot.fieldPath,\n query: \"\",\n payload: {\n ...(watchedValues as Record<string, unknown>),\n [idKey]: pipeOrSearchId,\n },\n }),\n )\n .then((incoming: FormStore) => {\n if (cancelled) return;\n mergeStore(incoming);\n setFieldLoadStates((s) => ({\n ...s,\n [slot.fieldPath]: {\n ...(s[slot.fieldPath] ?? {\n disabled: false,\n suggestionsDisabled: false,\n }),\n status: \"ready\",\n },\n }));\n })\n .catch(() => {\n if (cancelled) return;\n setFieldLoadStates((s) => ({\n ...s,\n [slot.fieldPath]: {\n ...(s[slot.fieldPath] ?? {\n disabled: false,\n suggestionsDisabled: false,\n }),\n status: \"error\",\n },\n }));\n });\n }\n }\n\n // Reflect the latest enabledIf evaluation into fieldLoadStates so the\n // adapters and field-wrapper can render the disabled state.\n for (const fieldPath of Object.keys(byField)) {\n const { field: fieldR, suggestions: sugR } = byField[fieldPath]!;\n const prevState = nextLoadStates[fieldPath];\n nextLoadStates[fieldPath] = {\n status: prevState?.status ?? \"idle\",\n disabled: fieldR == null ? (prevState?.disabled ?? false) : fieldR.disabled,\n disabledReason: fieldR == null ? prevState?.disabledReason : fieldR.message,\n suggestionsDisabled:\n sugR == null ? (prevState?.suggestionsDisabled ?? false) : sugR.disabled,\n suggestionsDisabledReason:\n sugR == null ? prevState?.suggestionsDisabledReason : sugR.message,\n };\n }\n\n setFieldLoadStates(nextLoadStates);\n prevResultsRef.current = slotResults;\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slotResultsSig, slots, pipeOrSearchId]);\n\n // --- Sections & fields ---\n const isSubmitted = form.formState.isSubmitted;\n const formErrors = form.formState.errors;\n\n // `watchedValues` and `formErrors` must be in the dep array: field handles\n // bake `form.getValues(path)` snapshots into `field.value` / textareaProps /\n // selectedValue, and adapters render those as controlled inputs. Without\n // these deps, the memo never refreshes on keystrokes and the controlled\n // inputs snap back to their stale snapshot — typing/selecting appears to\n // do nothing. See FieldRenderer's memo comment for the intended contract.\n const sections = useMemo(\n () =>\n buildSectionHandles(formConfig, form as any, publicKey, {\n fieldLoadStates,\n searchSecrets,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n formConfig,\n form,\n publicKey,\n fieldLoadStates,\n isSubmitted,\n searchSecrets,\n watchedValues,\n formErrors,\n ],\n );\n\n const fields = useMemo(\n () => sections.flatMap((s) => s.groups.flatMap((g) => g.fields)),\n [sections],\n );\n\n return {\n connectionsStatus,\n fieldLoadStates,\n form,\n sections,\n fields,\n reset: form.reset,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-form-core.mjs","names":[],"sources":["../../src/hooks/use-form-core.ts"],"sourcesContent":["import { zodResolver } from \"@hookform/resolvers/zod\";\nimport type {\n EnabledIf,\n EnabledResult,\n FormResolvers,\n FormSection,\n FormStore,\n GeneratedInputMeta,\n PipesEnvironment,\n ProviderName,\n} from \"@pipe0/base\";\nimport {\n type Dispatch,\n type SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { type FieldValues, type UseFormReturn, useForm } from \"react-hook-form\";\nimport type {\n AnyFieldProps,\n ConstantSuggestion,\n SecretSuggestion,\n} from \"../types/field-props.js\";\nimport type { FormSectionHandle } from \"../types/form-handle.js\";\nimport { buildSectionHandles } from \"../utils/build-section-handlers.js\";\nimport { mergeFormStores } from \"../utils/merge-form-stores.js\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport type ResourceStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport type SlotId = \"field\" | \"suggestions\";\n\nexport type FieldEnabledState = {\n disabled: boolean;\n reason?: string;\n};\n\nexport type FieldLoadState = {\n status: ResourceStatus;\n /** Field-level disabled (from `meta.enabledIf`). */\n disabled: boolean;\n /** Field-level disabled reason. */\n disabledReason?: string;\n /** Suggestions sub-feature gate (from `optionsDef.enabledIf`). */\n suggestionsDisabled: boolean;\n /** Suggestions sub-feature reason. */\n suggestionsDisabledReason?: string;\n};\n\nexport interface UseFormCoreOptions<T extends FieldValues> {\n pipeOrSearchId: string;\n kind: \"pipe\" | \"search\";\n schema: any;\n publicKey: string;\n defaultValues?: T;\n formConfig: FormSection[];\n resolvers?: FormResolvers;\n store: FormStore;\n setStore: Dispatch<SetStateAction<FormStore>>;\n environment?: PipesEnvironment;\n /**\n * Form-level scope tags. Bundled into every `resolvers.getSecrets` call so\n * the backend can return only the secrets allowed in the declared scopes\n * (intersection on top of cascade visibility).\n */\n scopes?: string[];\n /**\n * Current team context. Bundled into every `resolvers.getSecrets` call so\n * the backend can restrict team-level secrets to exactly this team.\n */\n teamId?: string;\n}\n\nexport interface UseFormCoreReturn<T extends FieldValues> {\n connectionsStatus: ResourceStatus;\n /** Map of field path → load state for dynamic context_select_input fields. */\n fieldLoadStates: Record<string, FieldLoadState>;\n /** Subset of `fieldLoadStates` where `status === \"error\"`. RHF-style. */\n fieldLoaderErrors: Record<string, FieldLoadState>;\n /** Subset of `fieldLoadStates` where `status === \"loading\"`. RHF-style. */\n loadingFieldLoaders: Record<string, FieldLoadState>;\n /** True when any field loader has errored. */\n hasFieldLoaderError: boolean;\n /** True when any field loader is currently loading. */\n isFieldLoaderLoading: boolean;\n form: UseFormReturn<T, any, any>;\n sections: FormSectionHandle[];\n fields: AnyFieldProps[];\n reset: (values?: T) => void;\n}\n\ntype EnabledSlot = {\n fieldPath: string;\n slotId: SlotId;\n enabledIf: EnabledIf;\n /** Only present for \"suggestions\" slots — used to drive option fetching. */\n optionsDef?: {\n requires: { connection?: ProviderName; fields?: readonly string[] };\n };\n};\n\nfunction collectEnabledSlots(formConfig: FormSection[]): EnabledSlot[] {\n const out: EnabledSlot[] = [];\n for (const section of formConfig) {\n for (const group of section.groups) {\n for (const field of group.fields as GeneratedInputMeta[]) {\n if (field.enabledIf) {\n out.push({\n fieldPath: field.path,\n slotId: \"field\",\n enabledIf: field.enabledIf,\n });\n }\n const supportsOptionsDef =\n field.type === \"context_select_input\" || field.type === \"tagged_text_input\";\n if (supportsOptionsDef && \"optionsDef\" in field && field.optionsDef) {\n const optionsDef = field.optionsDef as EnabledSlot[\"optionsDef\"] & {\n enabledIf?: EnabledIf;\n };\n if (optionsDef?.enabledIf) {\n out.push({\n fieldPath: field.path,\n slotId: \"suggestions\",\n enabledIf: optionsDef.enabledIf,\n optionsDef,\n });\n } else {\n // Even without a sub-feature enabledIf, we still need to track\n // this field as having a fetchable suggestions slot — it's\n // always enabled and the fetch fires on every value change.\n out.push({\n fieldPath: field.path,\n slotId: \"suggestions\",\n enabledIf: () => ({ disabled: false }),\n optionsDef,\n });\n }\n }\n }\n }\n }\n return out;\n}\n\nfunction getPathValue(obj: unknown, path: string): unknown {\n const parts = path.split(\".\");\n let cur: any = obj;\n for (const part of parts) {\n if (cur == null) return undefined;\n cur = cur[part];\n }\n return cur;\n}\n\nfunction evalSlot(slot: EnabledSlot, payload: unknown): EnabledResult {\n return slot.enabledIf(payload);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useFormCore<T extends FieldValues>(\n options: UseFormCoreOptions<T>,\n): UseFormCoreReturn<T> {\n const {\n schema,\n publicKey,\n defaultValues,\n formConfig,\n resolvers,\n pipeOrSearchId,\n kind,\n setStore,\n environment = \"production\",\n scopes,\n teamId,\n } = options;\n\n // Stable signature for `scopes` so its identity doesn't churn the effect\n // dep across renders when callers pass a fresh array literal each time.\n const scopesKey = useMemo(() => (scopes ? JSON.stringify(scopes) : \"\"), [scopes]);\n\n // --- Per-resource status ---\n const [connectionsStatus, setConnectionsStatus] = useState<ResourceStatus>(\n resolvers?.getConnections ? \"loading\" : \"idle\",\n );\n const [fieldLoadStates, setFieldLoadStates] = useState<Record<string, FieldLoadState>>({});\n\n // --- Form ---\n const form = useForm<T>({\n resolver: zodResolver(schema),\n defaultValues: defaultValues as any,\n });\n\n // --- Helpers ---\n const mergeStore = useCallback(\n (incoming: FormStore) => setStore((old) => mergeFormStores(old, incoming)),\n [setStore],\n );\n\n // --- Effect 1: Load connections ---\n useEffect(() => {\n if (!resolvers?.getConnections) {\n setConnectionsStatus(\"idle\");\n return;\n }\n\n let cancelled = false;\n setConnectionsStatus(\"loading\");\n\n Promise.resolve(resolvers.getConnections({ id: pipeOrSearchId, environment }))\n .then((conns) => {\n if (cancelled) return;\n\n mergeStore({\n field_options: {\n connections: {\n options: conns.map((c) => ({\n label: c.public_id,\n value: c.public_id,\n widgets: {\n provider_logo: { provider: c.provider as ProviderName },\n },\n })),\n },\n },\n });\n\n setConnectionsStatus(\"ready\");\n })\n .catch(() => {\n if (!cancelled) setConnectionsStatus(\"error\");\n });\n\n return () => {\n cancelled = true;\n };\n }, [pipeOrSearchId, environment, resolvers?.getConnections, mergeStore]);\n\n // --- Curried secrets search ---\n // Each keystroke in the reference picker fires this with the latest query.\n // The picker handles debounce + race-correctness; here we just bundle in\n // form-level args (environment / scopes / teamId) and call the resolver.\n // No caching: every call hits the resolver. Returns [] if no resolver.\n const getSecretsResolver = resolvers?.getSecrets;\n const searchSecrets = useCallback(\n async (query: string): Promise<SecretSuggestion[]> => {\n if (!getSecretsResolver) return [];\n return Promise.resolve(getSecretsResolver({ query, environment, scopes, teamId }));\n },\n // `scopesKey` is the stable serialization of `scopes`; depending on the\n // raw array would churn the callback identity on every parent render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [getSecretsResolver, environment, scopesKey, teamId],\n );\n\n // --- Curried constants search ---\n // Mirrors `searchSecrets` exactly. Same per-keystroke contract, same\n // form-level arg bundling. Returns [] when no resolver is wired.\n const getConstantsResolver = resolvers?.getConstants;\n const searchConstants = useCallback(\n async (query: string): Promise<ConstantSuggestion[]> => {\n if (!getConstantsResolver) return [];\n return Promise.resolve(getConstantsResolver({ query, environment, scopes, teamId }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [getConstantsResolver, environment, scopesKey, teamId],\n );\n\n // --- Effect 2: Evaluate enabledIf slots + drive context_select fetching ---\n const slots = useMemo(() => collectEnabledSlots(formConfig), [formConfig]);\n\n // Subscribe to all form value changes so resolvers re-evaluate.\n const watchedValues = form.watch();\n\n // Evaluate every slot against the current payload. Keep the result\n // serialized so the effect's deps stay stable across reference-identical\n // re-renders.\n const slotResults = useMemo(() => {\n const out: Record<string, EnabledResult> = {};\n for (const slot of slots) {\n out[`${slot.fieldPath}::${slot.slotId}`] = evalSlot(slot, watchedValues);\n }\n return out;\n }, [slots, watchedValues]);\n const slotResultsSig = useMemo(() => JSON.stringify(slotResults), [slotResults]);\n\n // Track previous results so we can detect enabled→disabled transitions\n // (drives field-value clearing) and last-fired fetch signatures.\n const prevResultsRef = useRef<Record<string, EnabledResult>>({});\n const lastFiredSigRef = useRef<Record<string, string>>({});\n\n useEffect(() => {\n if (slots.length === 0) return;\n\n let cancelled = false;\n const nextLoadStates: Record<string, FieldLoadState> = {\n ...fieldLoadStates,\n };\n\n // Group slot results by field path for the load-state map.\n const byField: Record<string, { field?: EnabledResult; suggestions?: EnabledResult }> = {};\n for (const slot of slots) {\n const r = slotResults[`${slot.fieldPath}::${slot.slotId}`];\n if (r == null) continue;\n byField[slot.fieldPath] ??= {};\n byField[slot.fieldPath][slot.slotId] = r;\n }\n\n for (const slot of slots) {\n const key = `${slot.fieldPath}::${slot.slotId}`;\n const r = slotResults[key];\n if (r == null) continue;\n const prev = prevResultsRef.current[key];\n\n // Field-slot only: clear value on enabled→disabled transition.\n if (slot.slotId === \"field\" && r.disabled && prev != null && !prev.disabled) {\n form.setValue(slot.fieldPath as any, \"\" as any, {\n shouldDirty: true,\n shouldTouch: true,\n });\n }\n\n // Suggestions-slot: drive the existing context_select_input fetch.\n if (slot.slotId === \"suggestions\" && resolvers?.getFieldContext) {\n // If suggestions are gated, skip the fetch and reset dedupe so\n // re-enabling re-fires.\n if (r.disabled) {\n delete lastFiredSigRef.current[slot.fieldPath];\n continue;\n }\n\n // Resolve the connection for the legacy `requires.connection`\n // (still needed to pick the right secret for the fetch).\n const watchedConnections = (\n watchedValues as {\n connector?: { connections?: { connection?: string }[] };\n }\n )?.connector?.connections;\n const required = slot.optionsDef?.requires;\n\n let connectionId: string | undefined;\n if (required?.connection) {\n const match = watchedConnections?.find((c) =>\n c?.connection?.startsWith(`${required.connection}_`),\n );\n connectionId = match?.connection;\n // No matching connection — can't fetch, even if enabledIf passed.\n if (!connectionId) continue;\n }\n\n // Per-field signature for dedupe.\n const perFieldSig = JSON.stringify({\n connectionId,\n deps: required?.fields?.map((d) => getPathValue(watchedValues, d)) ?? [],\n });\n if (lastFiredSigRef.current[slot.fieldPath] === perFieldSig) continue;\n lastFiredSigRef.current[slot.fieldPath] = perFieldSig;\n\n // Mark loading for this field's fetch.\n const existing = nextLoadStates[slot.fieldPath];\n nextLoadStates[slot.fieldPath] = {\n status: \"loading\",\n disabled: existing?.disabled ?? false,\n disabledReason: existing?.disabledReason,\n suggestionsDisabled: false,\n suggestionsDisabledReason: undefined,\n };\n\n const idKey = kind === \"search\" ? \"search_id\" : \"pipe_id\";\n\n Promise.resolve(\n resolvers.getFieldContext({\n fieldPath: slot.fieldPath,\n query: \"\",\n payload: {\n ...(watchedValues as Record<string, unknown>),\n [idKey]: pipeOrSearchId,\n },\n }),\n )\n .then((incoming: FormStore) => {\n if (cancelled) return;\n mergeStore(incoming);\n setFieldLoadStates((s) => ({\n ...s,\n [slot.fieldPath]: {\n ...(s[slot.fieldPath] ?? {\n disabled: false,\n suggestionsDisabled: false,\n }),\n status: \"ready\",\n },\n }));\n })\n .catch(() => {\n if (cancelled) return;\n setFieldLoadStates((s) => ({\n ...s,\n [slot.fieldPath]: {\n ...(s[slot.fieldPath] ?? {\n disabled: false,\n suggestionsDisabled: false,\n }),\n status: \"error\",\n },\n }));\n });\n }\n }\n\n // Reflect the latest enabledIf evaluation into fieldLoadStates so the\n // adapters and field-wrapper can render the disabled state.\n for (const fieldPath of Object.keys(byField)) {\n const { field: fieldR, suggestions: sugR } = byField[fieldPath]!;\n const prevState = nextLoadStates[fieldPath];\n nextLoadStates[fieldPath] = {\n status: prevState?.status ?? \"idle\",\n disabled: fieldR == null ? (prevState?.disabled ?? false) : fieldR.disabled,\n disabledReason: fieldR == null ? prevState?.disabledReason : fieldR.message,\n suggestionsDisabled:\n sugR == null ? (prevState?.suggestionsDisabled ?? false) : sugR.disabled,\n suggestionsDisabledReason:\n sugR == null ? prevState?.suggestionsDisabledReason : sugR.message,\n };\n }\n\n setFieldLoadStates(nextLoadStates);\n prevResultsRef.current = slotResults;\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slotResultsSig, slots, pipeOrSearchId]);\n\n // --- Sections & fields ---\n const isSubmitted = form.formState.isSubmitted;\n const formErrors = form.formState.errors;\n\n // `watchedValues` and `formErrors` must be in the dep array: field handles\n // bake `form.getValues(path)` snapshots into `field.value` / textareaProps /\n // selectedValue, and adapters render those as controlled inputs. Without\n // these deps, the memo never refreshes on keystrokes and the controlled\n // inputs snap back to their stale snapshot — typing/selecting appears to\n // do nothing. See FieldRenderer's memo comment for the intended contract.\n const sections = useMemo(\n () =>\n buildSectionHandles(formConfig, form as any, publicKey, {\n fieldLoadStates,\n searchSecrets,\n searchConstants,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n formConfig,\n form,\n publicKey,\n fieldLoadStates,\n isSubmitted,\n searchSecrets,\n searchConstants,\n watchedValues,\n formErrors,\n ],\n );\n\n const fields = useMemo(\n () => sections.flatMap((s) => s.groups.flatMap((g) => g.fields)),\n [sections],\n );\n\n const { fieldLoaderErrors, loadingFieldLoaders, hasFieldLoaderError, isFieldLoaderLoading } =\n useMemo(() => {\n const errors: Record<string, FieldLoadState> = {};\n const loading: Record<string, FieldLoadState> = {};\n for (const [path, state] of Object.entries(fieldLoadStates)) {\n if (state.status === \"error\") errors[path] = state;\n else if (state.status === \"loading\") loading[path] = state;\n }\n return {\n fieldLoaderErrors: errors,\n loadingFieldLoaders: loading,\n hasFieldLoaderError: Object.keys(errors).length > 0,\n isFieldLoaderLoading: Object.keys(loading).length > 0,\n };\n }, [fieldLoadStates]);\n\n return {\n connectionsStatus,\n fieldLoadStates,\n fieldLoaderErrors,\n loadingFieldLoaders,\n hasFieldLoaderError,\n isFieldLoaderLoading,\n form,\n sections,\n fields,\n reset: form.reset,\n };\n}\n"],"mappings":"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"}
@@ -32,14 +32,14 @@ declare function usePipeCatalogTable(config?: {
32
32
  removeColumnFilter: (id: "inputFields" | "outputFields" | "tags" | "providers") => void;
33
33
  resetFilters: () => void;
34
34
  getColumnFilterValue: (id: "inputFields" | "outputFields" | "tags" | "providers") => string;
35
- sortedInputFieldEntries: [string, ("prompt:run@1" | "company:newssummary:website@1" | "company:techstack:builtwith@1" | "company:websiteurl:email@1" | "company:funding:leadmagic@1" | "people:workemail:waterfall@1" | "people:email:iswork@1" | "people:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "json:extract@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "people:personalemail:profile:waterfall@1" | "people:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:match:logodev@1" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "people:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
36
- sortedOutputFieldEntries: [string, ("prompt:run@1" | "company:newssummary:website@1" | "company:techstack:builtwith@1" | "company:websiteurl:email@1" | "company:funding:leadmagic@1" | "people:workemail:waterfall@1" | "people:email:iswork@1" | "people:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "json:extract@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "people:personalemail:profile:waterfall@1" | "people:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:match:logodev@1" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "people:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
37
- sortedTagEntries: [string, ("prompt:run@1" | "company:newssummary:website@1" | "company:techstack:builtwith@1" | "company:websiteurl:email@1" | "company:funding:leadmagic@1" | "people:workemail:waterfall@1" | "people:email:iswork@1" | "people:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "json:extract@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "people:personalemail:profile:waterfall@1" | "people:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:match:logodev@1" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "people:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
38
- sortedProviderEntries: [string, ("prompt:run@1" | "company:newssummary:website@1" | "company:techstack:builtwith@1" | "company:websiteurl:email@1" | "company:funding:leadmagic@1" | "people:workemail:waterfall@1" | "people:email:iswork@1" | "people:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "json:extract@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "people:personalemail:profile:waterfall@1" | "people:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:match:logodev@1" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "people:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
39
- pipeIdsByInputField: Record<string, ("prompt:run@1" | "company:newssummary:website@1" | "company:techstack:builtwith@1" | "company:websiteurl:email@1" | "company:funding:leadmagic@1" | "people:workemail:waterfall@1" | "people:email:iswork@1" | "people:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "json:extract@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "people:personalemail:profile:waterfall@1" | "people:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:match:logodev@1" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "people:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
40
- pipeIdsByOutputField: Record<string, ("prompt:run@1" | "company:newssummary:website@1" | "company:techstack:builtwith@1" | "company:websiteurl:email@1" | "company:funding:leadmagic@1" | "people:workemail:waterfall@1" | "people:email:iswork@1" | "people:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "json:extract@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "people:personalemail:profile:waterfall@1" | "people:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:match:logodev@1" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "people:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
41
- pipeIdsByProvider: Record<string, ("prompt:run@1" | "company:newssummary:website@1" | "company:techstack:builtwith@1" | "company:websiteurl:email@1" | "company:funding:leadmagic@1" | "people:workemail:waterfall@1" | "people:email:iswork@1" | "people:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "json:extract@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "people:personalemail:profile:waterfall@1" | "people:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:match:logodev@1" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "people:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
42
- pipeIdsByTag: Record<string, ("prompt:run@1" | "company:newssummary:website@1" | "company:techstack:builtwith@1" | "company:websiteurl:email@1" | "company:funding:leadmagic@1" | "people:workemail:waterfall@1" | "people:email:iswork@1" | "people:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "json:extract@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "people:personalemail:profile:waterfall@1" | "people:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:match:logodev@1" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "people:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
35
+ sortedInputFieldEntries: [string, ("prompt:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
36
+ sortedOutputFieldEntries: [string, ("prompt:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
37
+ sortedTagEntries: [string, ("prompt:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
38
+ sortedProviderEntries: [string, ("prompt:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
39
+ pipeIdsByInputField: Record<string, ("prompt:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
40
+ pipeIdsByOutputField: Record<string, ("prompt:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
41
+ pipeIdsByProvider: Record<string, ("prompt:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
42
+ pipeIdsByTag: Record<string, ("prompt:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "message:send:slack@1" | "template:fill@1" | "contact:create:resend@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:maplinks:firecrawl@1" | "sheet:row:append@1" | "sheet:row:expandappend@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:crustdata@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
43
43
  };
44
44
  type UsePipeCatalogTableReturn = ReturnType<typeof usePipeCatalogTable>;
45
45
  //#endregion
@@ -1,5 +1,6 @@
1
1
  import { ResourceStatus } from "./use-form-core.mjs";
2
2
  import { PipeFormContext } from "../context/pipe-form-context.mjs";
3
+ import { GroupMap, PathMap, SectionMap } from "../types/form-customization.mjs";
3
4
  import { FormResolvers, FormStore, PipeId, PipePayload, ValidationContext } from "@pipe0/base";
4
5
 
5
6
  //#region src/hooks/use-pipe-form.d.ts
@@ -14,6 +15,16 @@ interface UsePipeFormOptions {
14
15
  }[];
15
16
  validationContext?: ValidationContext;
16
17
  store?: FormStore;
18
+ /**
19
+ * Hide / relabel / reorder sections by section key. `null` hides a section.
20
+ * Note: when `resolvers.getConnections` is omitted, the `connector` section
21
+ * is hidden automatically — there's no value to render without a resolver.
22
+ */
23
+ sectionMap?: SectionMap;
24
+ /** Hide / relabel / reorder groups by group path. `null` hides a group. */
25
+ groupMap?: GroupMap;
26
+ /** Hide / relabel fields by field path. `null` hides a field. */
27
+ pathMap?: PathMap;
17
28
  /**
18
29
  * Form-level scope tags. Bundled into every `resolvers.getSecrets` call so
19
30
  * the backend can return only the secrets allowed in the declared scopes.
@@ -1 +1 @@
1
- {"version":3,"file":"use-pipe-form.d.mts","names":[],"sources":["../../src/hooks/use-pipe-form.ts"],"mappings":";;;;;UAgBiB,kBAAA;EACf,MAAA,EAAQ,MAAA;EACR,SAAA;EACA,aAAA,GAAgB,WAAA;EAChB,SAAA,GAAY,aAAA;EACZ,eAAA;IAAoB,SAAA;IAAmB,QAAA;EAAA;EACvC,iBAAA,GAAoB,iBAAA;EACpB,KAAA,GAAQ,SAAA;EANR;;;;EAWA,MAAA;EARA;;;;EAaA,MAAA;AAAA;AAAA,iBAGc,WAAA,CAAY,OAAA,EAAS,kBAAA,GAAqB,eAAA"}
1
+ {"version":3,"file":"use-pipe-form.d.mts","names":[],"sources":["../../src/hooks/use-pipe-form.ts"],"mappings":";;;;;;UAwBiB,kBAAA;EACf,MAAA,EAAQ,MAAA;EACR,SAAA;EACA,aAAA,GAAgB,WAAA;EAChB,SAAA,GAAY,aAAA;EACZ,eAAA;IAAoB,SAAA;IAAmB,QAAA;EAAA;EACvC,iBAAA,GAAoB,iBAAA;EACpB,KAAA,GAAQ,SAAA;EAUE;;;;;EAJV,UAAA,GAAa,UAAA;EAVb;EAYA,QAAA,GAAW,QAAA;EAXX;EAaA,OAAA,GAAU,OAAA;EAZV;;;;EAiBA,MAAA;EAfA;;;;EAoBA,MAAA;AAAA;AAAA,iBAGc,WAAA,CAAY,OAAA,EAAS,kBAAA,GAAqB,eAAA"}