@pilotiq/pilotiq 0.1.0

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 (1409) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/CHANGELOG.md +11 -0
  3. package/CLAUDE.md +207 -0
  4. package/LICENSE +21 -0
  5. package/dist/Cluster.d.ts +56 -0
  6. package/dist/Cluster.d.ts.map +1 -0
  7. package/dist/Cluster.js +62 -0
  8. package/dist/Cluster.js.map +1 -0
  9. package/dist/Column.d.ts +378 -0
  10. package/dist/Column.d.ts.map +1 -0
  11. package/dist/Column.js +434 -0
  12. package/dist/Column.js.map +1 -0
  13. package/dist/Global.d.ts +123 -0
  14. package/dist/Global.d.ts.map +1 -0
  15. package/dist/Global.js +124 -0
  16. package/dist/Global.js.map +1 -0
  17. package/dist/Page.d.ts +90 -0
  18. package/dist/Page.d.ts.map +1 -0
  19. package/dist/Page.js +107 -0
  20. package/dist/Page.js.map +1 -0
  21. package/dist/Pilotiq.d.ts +505 -0
  22. package/dist/Pilotiq.d.ts.map +1 -0
  23. package/dist/Pilotiq.js +463 -0
  24. package/dist/Pilotiq.js.map +1 -0
  25. package/dist/PilotiqRegistry.d.ts +10 -0
  26. package/dist/PilotiqRegistry.d.ts.map +1 -0
  27. package/dist/PilotiqRegistry.js +32 -0
  28. package/dist/PilotiqRegistry.js.map +1 -0
  29. package/dist/PilotiqServiceProvider.d.ts +16 -0
  30. package/dist/PilotiqServiceProvider.d.ts.map +1 -0
  31. package/dist/PilotiqServiceProvider.js +57 -0
  32. package/dist/PilotiqServiceProvider.js.map +1 -0
  33. package/dist/RelationManager.d.ts +372 -0
  34. package/dist/RelationManager.d.ts.map +1 -0
  35. package/dist/RelationManager.js +342 -0
  36. package/dist/RelationManager.js.map +1 -0
  37. package/dist/RenderHook.d.ts +86 -0
  38. package/dist/RenderHook.d.ts.map +1 -0
  39. package/dist/RenderHook.js +116 -0
  40. package/dist/RenderHook.js.map +1 -0
  41. package/dist/Resource.d.ts +290 -0
  42. package/dist/Resource.d.ts.map +1 -0
  43. package/dist/Resource.js +362 -0
  44. package/dist/Resource.js.map +1 -0
  45. package/dist/RightPanel.d.ts +92 -0
  46. package/dist/RightPanel.d.ts.map +1 -0
  47. package/dist/RightPanel.js +61 -0
  48. package/dist/RightPanel.js.map +1 -0
  49. package/dist/Tab.d.ts +92 -0
  50. package/dist/Tab.d.ts.map +1 -0
  51. package/dist/Tab.js +93 -0
  52. package/dist/Tab.js.map +1 -0
  53. package/dist/UserMenuItem.d.ts +76 -0
  54. package/dist/UserMenuItem.d.ts.map +1 -0
  55. package/dist/UserMenuItem.js +87 -0
  56. package/dist/UserMenuItem.js.map +1 -0
  57. package/dist/actions/Action.d.ts +888 -0
  58. package/dist/actions/Action.d.ts.map +1 -0
  59. package/dist/actions/Action.js +1652 -0
  60. package/dist/actions/Action.js.map +1 -0
  61. package/dist/actions/ActionGroup.d.ts +85 -0
  62. package/dist/actions/ActionGroup.d.ts.map +1 -0
  63. package/dist/actions/ActionGroup.js +132 -0
  64. package/dist/actions/ActionGroup.js.map +1 -0
  65. package/dist/actions/attachFactory.d.ts +67 -0
  66. package/dist/actions/attachFactory.d.ts.map +1 -0
  67. package/dist/actions/attachFactory.js +115 -0
  68. package/dist/actions/attachFactory.js.map +1 -0
  69. package/dist/actions/exportFactory.d.ts +88 -0
  70. package/dist/actions/exportFactory.d.ts.map +1 -0
  71. package/dist/actions/exportFactory.js +144 -0
  72. package/dist/actions/exportFactory.js.map +1 -0
  73. package/dist/actions/importFactory.d.ts +97 -0
  74. package/dist/actions/importFactory.d.ts.map +1 -0
  75. package/dist/actions/importFactory.js +143 -0
  76. package/dist/actions/importFactory.js.map +1 -0
  77. package/dist/actions/index.d.ts +3 -0
  78. package/dist/actions/index.d.ts.map +1 -0
  79. package/dist/actions/index.js +3 -0
  80. package/dist/actions/index.js.map +1 -0
  81. package/dist/applyPageHooks.d.ts +54 -0
  82. package/dist/applyPageHooks.d.ts.map +1 -0
  83. package/dist/applyPageHooks.js +149 -0
  84. package/dist/applyPageHooks.js.map +1 -0
  85. package/dist/cells/coerce.d.ts +25 -0
  86. package/dist/cells/coerce.d.ts.map +1 -0
  87. package/dist/cells/coerce.js +87 -0
  88. package/dist/cells/coerce.js.map +1 -0
  89. package/dist/clusterPaths.d.ts +9 -0
  90. package/dist/clusterPaths.d.ts.map +1 -0
  91. package/dist/clusterPaths.js +19 -0
  92. package/dist/clusterPaths.js.map +1 -0
  93. package/dist/columns/BadgeColumn.d.ts +16 -0
  94. package/dist/columns/BadgeColumn.d.ts.map +1 -0
  95. package/dist/columns/BadgeColumn.js +25 -0
  96. package/dist/columns/BadgeColumn.js.map +1 -0
  97. package/dist/columns/BooleanColumn.d.ts +10 -0
  98. package/dist/columns/BooleanColumn.d.ts.map +1 -0
  99. package/dist/columns/BooleanColumn.js +18 -0
  100. package/dist/columns/BooleanColumn.js.map +1 -0
  101. package/dist/columns/ColorColumn.d.ts +27 -0
  102. package/dist/columns/ColorColumn.d.ts.map +1 -0
  103. package/dist/columns/ColorColumn.js +35 -0
  104. package/dist/columns/ColorColumn.js.map +1 -0
  105. package/dist/columns/IconColumn.d.ts +22 -0
  106. package/dist/columns/IconColumn.d.ts.map +1 -0
  107. package/dist/columns/IconColumn.js +28 -0
  108. package/dist/columns/IconColumn.js.map +1 -0
  109. package/dist/columns/ImageColumn.d.ts +17 -0
  110. package/dist/columns/ImageColumn.d.ts.map +1 -0
  111. package/dist/columns/ImageColumn.js +24 -0
  112. package/dist/columns/ImageColumn.js.map +1 -0
  113. package/dist/columns/SelectColumn.d.ts +36 -0
  114. package/dist/columns/SelectColumn.d.ts.map +1 -0
  115. package/dist/columns/SelectColumn.js +52 -0
  116. package/dist/columns/SelectColumn.js.map +1 -0
  117. package/dist/columns/TextColumn.d.ts +18 -0
  118. package/dist/columns/TextColumn.d.ts.map +1 -0
  119. package/dist/columns/TextColumn.js +20 -0
  120. package/dist/columns/TextColumn.js.map +1 -0
  121. package/dist/columns/TextInputColumn.d.ts +47 -0
  122. package/dist/columns/TextInputColumn.d.ts.map +1 -0
  123. package/dist/columns/TextInputColumn.js +60 -0
  124. package/dist/columns/TextInputColumn.js.map +1 -0
  125. package/dist/columns/ToggleColumn.d.ts +32 -0
  126. package/dist/columns/ToggleColumn.d.ts.map +1 -0
  127. package/dist/columns/ToggleColumn.js +45 -0
  128. package/dist/columns/ToggleColumn.js.map +1 -0
  129. package/dist/columns/index.d.ts +10 -0
  130. package/dist/columns/index.d.ts.map +1 -0
  131. package/dist/columns/index.js +10 -0
  132. package/dist/columns/index.js.map +1 -0
  133. package/dist/defaultGlobalPages.d.ts +11 -0
  134. package/dist/defaultGlobalPages.d.ts.map +1 -0
  135. package/dist/defaultGlobalPages.js +87 -0
  136. package/dist/defaultGlobalPages.js.map +1 -0
  137. package/dist/defaultPages.d.ts +247 -0
  138. package/dist/defaultPages.d.ts.map +1 -0
  139. package/dist/defaultPages.js +558 -0
  140. package/dist/defaultPages.js.map +1 -0
  141. package/dist/elements/Form.d.ts +219 -0
  142. package/dist/elements/Form.d.ts.map +1 -0
  143. package/dist/elements/Form.js +259 -0
  144. package/dist/elements/Form.js.map +1 -0
  145. package/dist/elements/ListTabs.d.ts +17 -0
  146. package/dist/elements/ListTabs.d.ts.map +1 -0
  147. package/dist/elements/ListTabs.js +23 -0
  148. package/dist/elements/ListTabs.js.map +1 -0
  149. package/dist/elements/Table.d.ts +535 -0
  150. package/dist/elements/Table.d.ts.map +1 -0
  151. package/dist/elements/Table.js +481 -0
  152. package/dist/elements/Table.js.map +1 -0
  153. package/dist/elements/TableGroup.d.ts +121 -0
  154. package/dist/elements/TableGroup.d.ts.map +1 -0
  155. package/dist/elements/TableGroup.js +162 -0
  156. package/dist/elements/TableGroup.js.map +1 -0
  157. package/dist/elements/dispatchAction.d.ts +127 -0
  158. package/dist/elements/dispatchAction.d.ts.map +1 -0
  159. package/dist/elements/dispatchAction.js +254 -0
  160. package/dist/elements/dispatchAction.js.map +1 -0
  161. package/dist/elements/dispatchForm.d.ts +220 -0
  162. package/dist/elements/dispatchForm.d.ts.map +1 -0
  163. package/dist/elements/dispatchForm.js +1645 -0
  164. package/dist/elements/dispatchForm.js.map +1 -0
  165. package/dist/elements/dispatchTable.d.ts +69 -0
  166. package/dist/elements/dispatchTable.d.ts.map +1 -0
  167. package/dist/elements/dispatchTable.js +606 -0
  168. package/dist/elements/dispatchTable.js.map +1 -0
  169. package/dist/elements/index.d.ts +3 -0
  170. package/dist/elements/index.d.ts.map +1 -0
  171. package/dist/elements/index.js +3 -0
  172. package/dist/elements/index.js.map +1 -0
  173. package/dist/entries/BadgeEntry.d.ts +21 -0
  174. package/dist/entries/BadgeEntry.d.ts.map +1 -0
  175. package/dist/entries/BadgeEntry.js +32 -0
  176. package/dist/entries/BadgeEntry.js.map +1 -0
  177. package/dist/entries/CodeEntry.d.ts +38 -0
  178. package/dist/entries/CodeEntry.d.ts.map +1 -0
  179. package/dist/entries/CodeEntry.js +44 -0
  180. package/dist/entries/CodeEntry.js.map +1 -0
  181. package/dist/entries/ColorEntry.d.ts +32 -0
  182. package/dist/entries/ColorEntry.d.ts.map +1 -0
  183. package/dist/entries/ColorEntry.js +48 -0
  184. package/dist/entries/ColorEntry.js.map +1 -0
  185. package/dist/entries/ComponentEntry.d.ts +66 -0
  186. package/dist/entries/ComponentEntry.d.ts.map +1 -0
  187. package/dist/entries/ComponentEntry.js +86 -0
  188. package/dist/entries/ComponentEntry.js.map +1 -0
  189. package/dist/entries/Entry.d.ts +175 -0
  190. package/dist/entries/Entry.d.ts.map +1 -0
  191. package/dist/entries/Entry.js +233 -0
  192. package/dist/entries/Entry.js.map +1 -0
  193. package/dist/entries/IconEntry.d.ts +30 -0
  194. package/dist/entries/IconEntry.d.ts.map +1 -0
  195. package/dist/entries/IconEntry.js +34 -0
  196. package/dist/entries/IconEntry.js.map +1 -0
  197. package/dist/entries/ImageEntry.d.ts +33 -0
  198. package/dist/entries/ImageEntry.d.ts.map +1 -0
  199. package/dist/entries/ImageEntry.js +47 -0
  200. package/dist/entries/ImageEntry.js.map +1 -0
  201. package/dist/entries/KeyValueEntry.d.ts +30 -0
  202. package/dist/entries/KeyValueEntry.d.ts.map +1 -0
  203. package/dist/entries/KeyValueEntry.js +38 -0
  204. package/dist/entries/KeyValueEntry.js.map +1 -0
  205. package/dist/entries/RepeatableEntry.d.ts +122 -0
  206. package/dist/entries/RepeatableEntry.d.ts.map +1 -0
  207. package/dist/entries/RepeatableEntry.js +121 -0
  208. package/dist/entries/RepeatableEntry.js.map +1 -0
  209. package/dist/entries/TextEntry.d.ts +38 -0
  210. package/dist/entries/TextEntry.d.ts.map +1 -0
  211. package/dist/entries/TextEntry.js +49 -0
  212. package/dist/entries/TextEntry.js.map +1 -0
  213. package/dist/entries/index.d.ts +2 -0
  214. package/dist/entries/index.d.ts.map +1 -0
  215. package/dist/entries/index.js +8 -0
  216. package/dist/entries/index.js.map +1 -0
  217. package/dist/entries/registry.d.ts +41 -0
  218. package/dist/entries/registry.d.ts.map +1 -0
  219. package/dist/entries/registry.js +17 -0
  220. package/dist/entries/registry.js.map +1 -0
  221. package/dist/fields/BuilderField.d.ts +420 -0
  222. package/dist/fields/BuilderField.d.ts.map +1 -0
  223. package/dist/fields/BuilderField.js +359 -0
  224. package/dist/fields/BuilderField.js.map +1 -0
  225. package/dist/fields/CheckboxField.d.ts +18 -0
  226. package/dist/fields/CheckboxField.d.ts.map +1 -0
  227. package/dist/fields/CheckboxField.js +23 -0
  228. package/dist/fields/CheckboxField.js.map +1 -0
  229. package/dist/fields/CheckboxListField.d.ts +25 -0
  230. package/dist/fields/CheckboxListField.d.ts.map +1 -0
  231. package/dist/fields/CheckboxListField.js +46 -0
  232. package/dist/fields/CheckboxListField.js.map +1 -0
  233. package/dist/fields/ColorPickerField.d.ts +16 -0
  234. package/dist/fields/ColorPickerField.d.ts.map +1 -0
  235. package/dist/fields/ColorPickerField.js +21 -0
  236. package/dist/fields/ColorPickerField.js.map +1 -0
  237. package/dist/fields/DateField.d.ts +29 -0
  238. package/dist/fields/DateField.d.ts.map +1 -0
  239. package/dist/fields/DateField.js +45 -0
  240. package/dist/fields/DateField.js.map +1 -0
  241. package/dist/fields/EmailField.d.ts +8 -0
  242. package/dist/fields/EmailField.d.ts.map +1 -0
  243. package/dist/fields/EmailField.js +13 -0
  244. package/dist/fields/EmailField.js.map +1 -0
  245. package/dist/fields/Field.d.ts +485 -0
  246. package/dist/fields/Field.d.ts.map +1 -0
  247. package/dist/fields/Field.js +539 -0
  248. package/dist/fields/Field.js.map +1 -0
  249. package/dist/fields/FileUploadField.d.ts +43 -0
  250. package/dist/fields/FileUploadField.d.ts.map +1 -0
  251. package/dist/fields/FileUploadField.js +60 -0
  252. package/dist/fields/FileUploadField.js.map +1 -0
  253. package/dist/fields/HiddenField.d.ts +19 -0
  254. package/dist/fields/HiddenField.d.ts.map +1 -0
  255. package/dist/fields/HiddenField.js +24 -0
  256. package/dist/fields/HiddenField.js.map +1 -0
  257. package/dist/fields/KeyValueField.d.ts +36 -0
  258. package/dist/fields/KeyValueField.d.ts.map +1 -0
  259. package/dist/fields/KeyValueField.js +47 -0
  260. package/dist/fields/KeyValueField.js.map +1 -0
  261. package/dist/fields/MarkdownField.d.ts +79 -0
  262. package/dist/fields/MarkdownField.d.ts.map +1 -0
  263. package/dist/fields/MarkdownField.js +117 -0
  264. package/dist/fields/MarkdownField.js.map +1 -0
  265. package/dist/fields/NumberField.d.ts +17 -0
  266. package/dist/fields/NumberField.d.ts.map +1 -0
  267. package/dist/fields/NumberField.js +27 -0
  268. package/dist/fields/NumberField.js.map +1 -0
  269. package/dist/fields/RadioField.d.ts +26 -0
  270. package/dist/fields/RadioField.d.ts.map +1 -0
  271. package/dist/fields/RadioField.js +47 -0
  272. package/dist/fields/RadioField.js.map +1 -0
  273. package/dist/fields/RepeaterField.d.ts +594 -0
  274. package/dist/fields/RepeaterField.d.ts.map +1 -0
  275. package/dist/fields/RepeaterField.js +504 -0
  276. package/dist/fields/RepeaterField.js.map +1 -0
  277. package/dist/fields/RowButton.d.ts +86 -0
  278. package/dist/fields/RowButton.d.ts.map +1 -0
  279. package/dist/fields/RowButton.js +85 -0
  280. package/dist/fields/RowButton.js.map +1 -0
  281. package/dist/fields/SelectField.d.ts +127 -0
  282. package/dist/fields/SelectField.d.ts.map +1 -0
  283. package/dist/fields/SelectField.js +160 -0
  284. package/dist/fields/SelectField.js.map +1 -0
  285. package/dist/fields/SliderField.d.ts +31 -0
  286. package/dist/fields/SliderField.d.ts.map +1 -0
  287. package/dist/fields/SliderField.js +45 -0
  288. package/dist/fields/SliderField.js.map +1 -0
  289. package/dist/fields/SlugField.d.ts +11 -0
  290. package/dist/fields/SlugField.d.ts.map +1 -0
  291. package/dist/fields/SlugField.js +19 -0
  292. package/dist/fields/SlugField.js.map +1 -0
  293. package/dist/fields/TagsInputField.d.ts +65 -0
  294. package/dist/fields/TagsInputField.d.ts.map +1 -0
  295. package/dist/fields/TagsInputField.js +104 -0
  296. package/dist/fields/TagsInputField.js.map +1 -0
  297. package/dist/fields/TextField.d.ts +11 -0
  298. package/dist/fields/TextField.d.ts.map +1 -0
  299. package/dist/fields/TextField.js +19 -0
  300. package/dist/fields/TextField.js.map +1 -0
  301. package/dist/fields/TextareaField.d.ts +40 -0
  302. package/dist/fields/TextareaField.d.ts.map +1 -0
  303. package/dist/fields/TextareaField.js +51 -0
  304. package/dist/fields/TextareaField.js.map +1 -0
  305. package/dist/fields/ToggleButtonsField.d.ts +24 -0
  306. package/dist/fields/ToggleButtonsField.d.ts.map +1 -0
  307. package/dist/fields/ToggleButtonsField.js +41 -0
  308. package/dist/fields/ToggleButtonsField.js.map +1 -0
  309. package/dist/fields/ToggleField.d.ts +8 -0
  310. package/dist/fields/ToggleField.d.ts.map +1 -0
  311. package/dist/fields/ToggleField.js +13 -0
  312. package/dist/fields/ToggleField.js.map +1 -0
  313. package/dist/fields/optionsResolver.d.ts +54 -0
  314. package/dist/fields/optionsResolver.d.ts.map +1 -0
  315. package/dist/fields/optionsResolver.js +62 -0
  316. package/dist/fields/optionsResolver.js.map +1 -0
  317. package/dist/fields/resolveField.d.ts +21 -0
  318. package/dist/fields/resolveField.d.ts.map +1 -0
  319. package/dist/fields/resolveField.js +26 -0
  320. package/dist/fields/resolveField.js.map +1 -0
  321. package/dist/filters/BooleanFilter.d.ts +20 -0
  322. package/dist/filters/BooleanFilter.d.ts.map +1 -0
  323. package/dist/filters/BooleanFilter.js +31 -0
  324. package/dist/filters/BooleanFilter.js.map +1 -0
  325. package/dist/filters/DateRangeFilter.d.ts +68 -0
  326. package/dist/filters/DateRangeFilter.d.ts.map +1 -0
  327. package/dist/filters/DateRangeFilter.js +137 -0
  328. package/dist/filters/DateRangeFilter.js.map +1 -0
  329. package/dist/filters/Filter.d.ts +140 -0
  330. package/dist/filters/Filter.d.ts.map +1 -0
  331. package/dist/filters/Filter.js +99 -0
  332. package/dist/filters/Filter.js.map +1 -0
  333. package/dist/filters/FormFilter.d.ts +103 -0
  334. package/dist/filters/FormFilter.d.ts.map +1 -0
  335. package/dist/filters/FormFilter.js +180 -0
  336. package/dist/filters/FormFilter.js.map +1 -0
  337. package/dist/filters/MultiSelectFilter.d.ts +41 -0
  338. package/dist/filters/MultiSelectFilter.d.ts.map +1 -0
  339. package/dist/filters/MultiSelectFilter.js +67 -0
  340. package/dist/filters/MultiSelectFilter.js.map +1 -0
  341. package/dist/filters/QueryBuilderFilter.d.ts +145 -0
  342. package/dist/filters/QueryBuilderFilter.d.ts.map +1 -0
  343. package/dist/filters/QueryBuilderFilter.js +323 -0
  344. package/dist/filters/QueryBuilderFilter.js.map +1 -0
  345. package/dist/filters/SelectFilter.d.ts +26 -0
  346. package/dist/filters/SelectFilter.d.ts.map +1 -0
  347. package/dist/filters/SelectFilter.js +35 -0
  348. package/dist/filters/SelectFilter.js.map +1 -0
  349. package/dist/filters/TernaryFilter.d.ts +35 -0
  350. package/dist/filters/TernaryFilter.d.ts.map +1 -0
  351. package/dist/filters/TernaryFilter.js +71 -0
  352. package/dist/filters/TernaryFilter.js.map +1 -0
  353. package/dist/filters/TrashedFilter.d.ts +28 -0
  354. package/dist/filters/TrashedFilter.d.ts.map +1 -0
  355. package/dist/filters/TrashedFilter.js +52 -0
  356. package/dist/filters/TrashedFilter.js.map +1 -0
  357. package/dist/filters/queryBuilder/BooleanConstraint.d.ts +13 -0
  358. package/dist/filters/queryBuilder/BooleanConstraint.d.ts.map +1 -0
  359. package/dist/filters/queryBuilder/BooleanConstraint.js +27 -0
  360. package/dist/filters/queryBuilder/BooleanConstraint.js.map +1 -0
  361. package/dist/filters/queryBuilder/Constraint.d.ts +74 -0
  362. package/dist/filters/queryBuilder/Constraint.d.ts.map +1 -0
  363. package/dist/filters/queryBuilder/Constraint.js +45 -0
  364. package/dist/filters/queryBuilder/Constraint.js.map +1 -0
  365. package/dist/filters/queryBuilder/DateConstraint.d.ts +18 -0
  366. package/dist/filters/queryBuilder/DateConstraint.d.ts.map +1 -0
  367. package/dist/filters/queryBuilder/DateConstraint.js +63 -0
  368. package/dist/filters/queryBuilder/DateConstraint.js.map +1 -0
  369. package/dist/filters/queryBuilder/NumberConstraint.d.ts +12 -0
  370. package/dist/filters/queryBuilder/NumberConstraint.d.ts.map +1 -0
  371. package/dist/filters/queryBuilder/NumberConstraint.js +61 -0
  372. package/dist/filters/queryBuilder/NumberConstraint.js.map +1 -0
  373. package/dist/filters/queryBuilder/SelectConstraint.d.ts +22 -0
  374. package/dist/filters/queryBuilder/SelectConstraint.d.ts.map +1 -0
  375. package/dist/filters/queryBuilder/SelectConstraint.js +66 -0
  376. package/dist/filters/queryBuilder/SelectConstraint.js.map +1 -0
  377. package/dist/filters/queryBuilder/TextConstraint.d.ts +18 -0
  378. package/dist/filters/queryBuilder/TextConstraint.d.ts.map +1 -0
  379. package/dist/filters/queryBuilder/TextConstraint.js +58 -0
  380. package/dist/filters/queryBuilder/TextConstraint.js.map +1 -0
  381. package/dist/filters/queryBuilder/index.d.ts +7 -0
  382. package/dist/filters/queryBuilder/index.d.ts.map +1 -0
  383. package/dist/filters/queryBuilder/index.js +7 -0
  384. package/dist/filters/queryBuilder/index.js.map +1 -0
  385. package/dist/icons/index.d.ts +3 -0
  386. package/dist/icons/index.d.ts.map +1 -0
  387. package/dist/icons/index.js +3 -0
  388. package/dist/icons/index.js.map +1 -0
  389. package/dist/icons/lucide.d.ts +16 -0
  390. package/dist/icons/lucide.d.ts.map +1 -0
  391. package/dist/icons/lucide.js +173 -0
  392. package/dist/icons/lucide.js.map +1 -0
  393. package/dist/icons/registry.d.ts +27 -0
  394. package/dist/icons/registry.d.ts.map +1 -0
  395. package/dist/icons/registry.js +35 -0
  396. package/dist/icons/registry.js.map +1 -0
  397. package/dist/icons/types.d.ts +38 -0
  398. package/dist/icons/types.d.ts.map +1 -0
  399. package/dist/icons/types.js +23 -0
  400. package/dist/icons/types.js.map +1 -0
  401. package/dist/index.d.ts +118 -0
  402. package/dist/index.d.ts.map +1 -0
  403. package/dist/index.js +135 -0
  404. package/dist/index.js.map +1 -0
  405. package/dist/io/csv.d.ts +51 -0
  406. package/dist/io/csv.d.ts.map +1 -0
  407. package/dist/io/csv.js +168 -0
  408. package/dist/io/csv.js.map +1 -0
  409. package/dist/notifications/Notification.d.ts +181 -0
  410. package/dist/notifications/Notification.d.ts.map +1 -0
  411. package/dist/notifications/Notification.js +290 -0
  412. package/dist/notifications/Notification.js.map +1 -0
  413. package/dist/notifications/broadcast.d.ts +58 -0
  414. package/dist/notifications/broadcast.d.ts.map +1 -0
  415. package/dist/notifications/broadcast.js +72 -0
  416. package/dist/notifications/broadcast.js.map +1 -0
  417. package/dist/notifications/database.d.ts +164 -0
  418. package/dist/notifications/database.d.ts.map +1 -0
  419. package/dist/notifications/database.js +321 -0
  420. package/dist/notifications/database.js.map +1 -0
  421. package/dist/notifications/dispatchNotificationAction.d.ts +48 -0
  422. package/dist/notifications/dispatchNotificationAction.d.ts.map +1 -0
  423. package/dist/notifications/dispatchNotificationAction.js +100 -0
  424. package/dist/notifications/dispatchNotificationAction.js.map +1 -0
  425. package/dist/notifications/flash.d.ts +34 -0
  426. package/dist/notifications/flash.d.ts.map +1 -0
  427. package/dist/notifications/flash.js +51 -0
  428. package/dist/notifications/flash.js.map +1 -0
  429. package/dist/notifications/index.d.ts +8 -0
  430. package/dist/notifications/index.d.ts.map +1 -0
  431. package/dist/notifications/index.js +6 -0
  432. package/dist/notifications/index.js.map +1 -0
  433. package/dist/notifications/registerBroadcastAuth.d.ts +45 -0
  434. package/dist/notifications/registerBroadcastAuth.d.ts.map +1 -0
  435. package/dist/notifications/registerBroadcastAuth.js +86 -0
  436. package/dist/notifications/registerBroadcastAuth.js.map +1 -0
  437. package/dist/notifications/resolveSavedNotification.d.ts +21 -0
  438. package/dist/notifications/resolveSavedNotification.d.ts.map +1 -0
  439. package/dist/notifications/resolveSavedNotification.js +43 -0
  440. package/dist/notifications/resolveSavedNotification.js.map +1 -0
  441. package/dist/notifications/types.d.ts +87 -0
  442. package/dist/notifications/types.d.ts.map +1 -0
  443. package/dist/notifications/types.js +2 -0
  444. package/dist/notifications/types.js.map +1 -0
  445. package/dist/orm/m2mAccessor.d.ts +49 -0
  446. package/dist/orm/m2mAccessor.d.ts.map +1 -0
  447. package/dist/orm/m2mAccessor.js +45 -0
  448. package/dist/orm/m2mAccessor.js.map +1 -0
  449. package/dist/orm/modelDefaults.d.ts +347 -0
  450. package/dist/orm/modelDefaults.d.ts.map +1 -0
  451. package/dist/orm/modelDefaults.js +375 -0
  452. package/dist/orm/modelDefaults.js.map +1 -0
  453. package/dist/pageData.d.ts +778 -0
  454. package/dist/pageData.d.ts.map +1 -0
  455. package/dist/pageData.js +3725 -0
  456. package/dist/pageData.js.map +1 -0
  457. package/dist/plugins/index.d.ts +2 -0
  458. package/dist/plugins/index.d.ts.map +1 -0
  459. package/dist/plugins/index.js +2 -0
  460. package/dist/plugins/index.js.map +1 -0
  461. package/dist/plugins/themeEditor.d.ts +17 -0
  462. package/dist/plugins/themeEditor.d.ts.map +1 -0
  463. package/dist/plugins/themeEditor.js +23 -0
  464. package/dist/plugins/themeEditor.js.map +1 -0
  465. package/dist/react/AppShell.d.ts +58 -0
  466. package/dist/react/AppShell.d.ts.map +1 -0
  467. package/dist/react/AppShell.js +58 -0
  468. package/dist/react/AppShell.js.map +1 -0
  469. package/dist/react/CommandPalette.d.ts +21 -0
  470. package/dist/react/CommandPalette.d.ts.map +1 -0
  471. package/dist/react/CommandPalette.js +236 -0
  472. package/dist/react/CommandPalette.js.map +1 -0
  473. package/dist/react/FormStateContext.d.ts +83 -0
  474. package/dist/react/FormStateContext.d.ts.map +1 -0
  475. package/dist/react/FormStateContext.js +284 -0
  476. package/dist/react/FormStateContext.js.map +1 -0
  477. package/dist/react/HeadHooks.d.ts +26 -0
  478. package/dist/react/HeadHooks.d.ts.map +1 -0
  479. package/dist/react/HeadHooks.js +141 -0
  480. package/dist/react/HeadHooks.js.map +1 -0
  481. package/dist/react/NotificationActionStrip.d.ts +39 -0
  482. package/dist/react/NotificationActionStrip.d.ts.map +1 -0
  483. package/dist/react/NotificationActionStrip.js +129 -0
  484. package/dist/react/NotificationActionStrip.js.map +1 -0
  485. package/dist/react/NotificationBell.d.ts +20 -0
  486. package/dist/react/NotificationBell.d.ts.map +1 -0
  487. package/dist/react/NotificationBell.js +273 -0
  488. package/dist/react/NotificationBell.js.map +1 -0
  489. package/dist/react/RenderHookSlot.d.ts +20 -0
  490. package/dist/react/RenderHookSlot.d.ts.map +1 -0
  491. package/dist/react/RenderHookSlot.js +24 -0
  492. package/dist/react/RenderHookSlot.js.map +1 -0
  493. package/dist/react/RightSidebar.d.ts +33 -0
  494. package/dist/react/RightSidebar.d.ts.map +1 -0
  495. package/dist/react/RightSidebar.js +82 -0
  496. package/dist/react/RightSidebar.js.map +1 -0
  497. package/dist/react/RightSidebarContext.d.ts +62 -0
  498. package/dist/react/RightSidebarContext.d.ts.map +1 -0
  499. package/dist/react/RightSidebarContext.js +178 -0
  500. package/dist/react/RightSidebarContext.js.map +1 -0
  501. package/dist/react/RightSidebarTrigger.d.ts +16 -0
  502. package/dist/react/RightSidebarTrigger.d.ts.map +1 -0
  503. package/dist/react/RightSidebarTrigger.js +24 -0
  504. package/dist/react/RightSidebarTrigger.js.map +1 -0
  505. package/dist/react/SchemaRenderer.d.ts +63 -0
  506. package/dist/react/SchemaRenderer.d.ts.map +1 -0
  507. package/dist/react/SchemaRenderer.js +3458 -0
  508. package/dist/react/SchemaRenderer.js.map +1 -0
  509. package/dist/react/SearchTrigger.d.ts +13 -0
  510. package/dist/react/SearchTrigger.d.ts.map +1 -0
  511. package/dist/react/SearchTrigger.js +30 -0
  512. package/dist/react/SearchTrigger.js.map +1 -0
  513. package/dist/react/ThemeProvider.d.ts +18 -0
  514. package/dist/react/ThemeProvider.d.ts.map +1 -0
  515. package/dist/react/ThemeProvider.js +66 -0
  516. package/dist/react/ThemeProvider.js.map +1 -0
  517. package/dist/react/ThemeSettingsPage.d.ts +10 -0
  518. package/dist/react/ThemeSettingsPage.d.ts.map +1 -0
  519. package/dist/react/ThemeSettingsPage.js +293 -0
  520. package/dist/react/ThemeSettingsPage.js.map +1 -0
  521. package/dist/react/ThemeToggle.d.ts +2 -0
  522. package/dist/react/ThemeToggle.d.ts.map +1 -0
  523. package/dist/react/ThemeToggle.js +8 -0
  524. package/dist/react/ThemeToggle.js.map +1 -0
  525. package/dist/react/Toaster.d.ts +25 -0
  526. package/dist/react/Toaster.d.ts.map +1 -0
  527. package/dist/react/Toaster.js +89 -0
  528. package/dist/react/Toaster.js.map +1 -0
  529. package/dist/react/UserMenu.d.ts +23 -0
  530. package/dist/react/UserMenu.d.ts.map +1 -0
  531. package/dist/react/UserMenu.js +78 -0
  532. package/dist/react/UserMenu.js.map +1 -0
  533. package/dist/react/WidgetDataContext.d.ts +64 -0
  534. package/dist/react/WidgetDataContext.d.ts.map +1 -0
  535. package/dist/react/WidgetDataContext.js +89 -0
  536. package/dist/react/WidgetDataContext.js.map +1 -0
  537. package/dist/react/cells/EditableCell.d.ts +20 -0
  538. package/dist/react/cells/EditableCell.d.ts.map +1 -0
  539. package/dist/react/cells/EditableCell.js +251 -0
  540. package/dist/react/cells/EditableCell.js.map +1 -0
  541. package/dist/react/fieldJsHandler.d.ts +33 -0
  542. package/dist/react/fieldJsHandler.d.ts.map +1 -0
  543. package/dist/react/fieldJsHandler.js +61 -0
  544. package/dist/react/fieldJsHandler.js.map +1 -0
  545. package/dist/react/fields/BuilderInput.d.ts +21 -0
  546. package/dist/react/fields/BuilderInput.d.ts.map +1 -0
  547. package/dist/react/fields/BuilderInput.js +553 -0
  548. package/dist/react/fields/BuilderInput.js.map +1 -0
  549. package/dist/react/fields/CheckboxInput.d.ts +9 -0
  550. package/dist/react/fields/CheckboxInput.d.ts.map +1 -0
  551. package/dist/react/fields/CheckboxInput.js +23 -0
  552. package/dist/react/fields/CheckboxInput.js.map +1 -0
  553. package/dist/react/fields/CheckboxListInput.d.ts +19 -0
  554. package/dist/react/fields/CheckboxListInput.d.ts.map +1 -0
  555. package/dist/react/fields/CheckboxListInput.js +53 -0
  556. package/dist/react/fields/CheckboxListInput.js.map +1 -0
  557. package/dist/react/fields/ColorInput.d.ts +12 -0
  558. package/dist/react/fields/ColorInput.d.ts.map +1 -0
  559. package/dist/react/fields/ColorInput.js +29 -0
  560. package/dist/react/fields/ColorInput.js.map +1 -0
  561. package/dist/react/fields/DateFieldInput.d.ts +8 -0
  562. package/dist/react/fields/DateFieldInput.d.ts.map +1 -0
  563. package/dist/react/fields/DateFieldInput.js +39 -0
  564. package/dist/react/fields/DateFieldInput.js.map +1 -0
  565. package/dist/react/fields/DateTimeInput.d.ts +13 -0
  566. package/dist/react/fields/DateTimeInput.d.ts.map +1 -0
  567. package/dist/react/fields/DateTimeInput.js +29 -0
  568. package/dist/react/fields/DateTimeInput.js.map +1 -0
  569. package/dist/react/fields/FieldShell.d.ts +23 -0
  570. package/dist/react/fields/FieldShell.d.ts.map +1 -0
  571. package/dist/react/fields/FieldShell.js +46 -0
  572. package/dist/react/fields/FieldShell.js.map +1 -0
  573. package/dist/react/fields/FileUploadInput.d.ts +21 -0
  574. package/dist/react/fields/FileUploadInput.d.ts.map +1 -0
  575. package/dist/react/fields/FileUploadInput.js +120 -0
  576. package/dist/react/fields/FileUploadInput.js.map +1 -0
  577. package/dist/react/fields/HiddenInput.d.ts +11 -0
  578. package/dist/react/fields/HiddenInput.d.ts.map +1 -0
  579. package/dist/react/fields/HiddenInput.js +14 -0
  580. package/dist/react/fields/HiddenInput.js.map +1 -0
  581. package/dist/react/fields/KeyValueInput.d.ts +18 -0
  582. package/dist/react/fields/KeyValueInput.d.ts.map +1 -0
  583. package/dist/react/fields/KeyValueInput.js +122 -0
  584. package/dist/react/fields/KeyValueInput.js.map +1 -0
  585. package/dist/react/fields/MarkdownInput.d.ts +29 -0
  586. package/dist/react/fields/MarkdownInput.d.ts.map +1 -0
  587. package/dist/react/fields/MarkdownInput.js +250 -0
  588. package/dist/react/fields/MarkdownInput.js.map +1 -0
  589. package/dist/react/fields/RadioInput.d.ts +18 -0
  590. package/dist/react/fields/RadioInput.d.ts.map +1 -0
  591. package/dist/react/fields/RadioInput.js +34 -0
  592. package/dist/react/fields/RadioInput.js.map +1 -0
  593. package/dist/react/fields/RepeaterInput.d.ts +92 -0
  594. package/dist/react/fields/RepeaterInput.d.ts.map +1 -0
  595. package/dist/react/fields/RepeaterInput.js +705 -0
  596. package/dist/react/fields/RepeaterInput.js.map +1 -0
  597. package/dist/react/fields/SelectFieldInput.d.ts +23 -0
  598. package/dist/react/fields/SelectFieldInput.d.ts.map +1 -0
  599. package/dist/react/fields/SelectFieldInput.js +146 -0
  600. package/dist/react/fields/SelectFieldInput.js.map +1 -0
  601. package/dist/react/fields/SliderInput.d.ts +16 -0
  602. package/dist/react/fields/SliderInput.d.ts.map +1 -0
  603. package/dist/react/fields/SliderInput.js +37 -0
  604. package/dist/react/fields/SliderInput.js.map +1 -0
  605. package/dist/react/fields/TagsInput.d.ts +27 -0
  606. package/dist/react/fields/TagsInput.d.ts.map +1 -0
  607. package/dist/react/fields/TagsInput.js +189 -0
  608. package/dist/react/fields/TagsInput.js.map +1 -0
  609. package/dist/react/fields/TextLikeInput.d.ts +18 -0
  610. package/dist/react/fields/TextLikeInput.d.ts.map +1 -0
  611. package/dist/react/fields/TextLikeInput.js +46 -0
  612. package/dist/react/fields/TextLikeInput.js.map +1 -0
  613. package/dist/react/fields/ToggleButtonsInput.d.ts +20 -0
  614. package/dist/react/fields/ToggleButtonsInput.d.ts.map +1 -0
  615. package/dist/react/fields/ToggleButtonsInput.js +42 -0
  616. package/dist/react/fields/ToggleButtonsInput.js.map +1 -0
  617. package/dist/react/fields/ToggleFieldInput.d.ts +7 -0
  618. package/dist/react/fields/ToggleFieldInput.d.ts.map +1 -0
  619. package/dist/react/fields/ToggleFieldInput.js +30 -0
  620. package/dist/react/fields/ToggleFieldInput.js.map +1 -0
  621. package/dist/react/fields/rowChromeButton.d.ts +84 -0
  622. package/dist/react/fields/rowChromeButton.d.ts.map +1 -0
  623. package/dist/react/fields/rowChromeButton.js +111 -0
  624. package/dist/react/fields/rowChromeButton.js.map +1 -0
  625. package/dist/react/fields/syncRowGates.d.ts +11 -0
  626. package/dist/react/fields/syncRowGates.d.ts.map +1 -0
  627. package/dist/react/fields/syncRowGates.js +55 -0
  628. package/dist/react/fields/syncRowGates.js.map +1 -0
  629. package/dist/react/formStateHelpers.d.ts +44 -0
  630. package/dist/react/formStateHelpers.d.ts.map +1 -0
  631. package/dist/react/formStateHelpers.js +230 -0
  632. package/dist/react/formStateHelpers.js.map +1 -0
  633. package/dist/react/hooks/use-mobile.d.ts +2 -0
  634. package/dist/react/hooks/use-mobile.d.ts.map +1 -0
  635. package/dist/react/hooks/use-mobile.js +16 -0
  636. package/dist/react/hooks/use-mobile.js.map +1 -0
  637. package/dist/react/icon-context.d.ts +35 -0
  638. package/dist/react/icon-context.d.ts.map +1 -0
  639. package/dist/react/icon-context.js +45 -0
  640. package/dist/react/icon-context.js.map +1 -0
  641. package/dist/react/index.d.ts +26 -0
  642. package/dist/react/index.d.ts.map +1 -0
  643. package/dist/react/index.js +28 -0
  644. package/dist/react/index.js.map +1 -0
  645. package/dist/react/layouts/SidebarLayout.d.ts +3 -0
  646. package/dist/react/layouts/SidebarLayout.d.ts.map +1 -0
  647. package/dist/react/layouts/SidebarLayout.js +85 -0
  648. package/dist/react/layouts/SidebarLayout.js.map +1 -0
  649. package/dist/react/layouts/TopbarLayout.d.ts +3 -0
  650. package/dist/react/layouts/TopbarLayout.d.ts.map +1 -0
  651. package/dist/react/layouts/TopbarLayout.js +103 -0
  652. package/dist/react/layouts/TopbarLayout.js.map +1 -0
  653. package/dist/react/navigate.d.ts +22 -0
  654. package/dist/react/navigate.d.ts.map +1 -0
  655. package/dist/react/navigate.js +30 -0
  656. package/dist/react/navigate.js.map +1 -0
  657. package/dist/react/registry.d.ts +35 -0
  658. package/dist/react/registry.d.ts.map +1 -0
  659. package/dist/react/registry.js +22 -0
  660. package/dist/react/registry.js.map +1 -0
  661. package/dist/react/right-panel-registry.d.ts +32 -0
  662. package/dist/react/right-panel-registry.d.ts.map +1 -0
  663. package/dist/react/right-panel-registry.js +20 -0
  664. package/dist/react/right-panel-registry.js.map +1 -0
  665. package/dist/react/theme-preview/apply.d.ts +11 -0
  666. package/dist/react/theme-preview/apply.d.ts.map +1 -0
  667. package/dist/react/theme-preview/apply.js +93 -0
  668. package/dist/react/theme-preview/apply.js.map +1 -0
  669. package/dist/react/theme-preview/build-html.d.ts +3 -0
  670. package/dist/react/theme-preview/build-html.d.ts.map +1 -0
  671. package/dist/react/theme-preview/build-html.js +437 -0
  672. package/dist/react/theme-preview/build-html.js.map +1 -0
  673. package/dist/react/ui/button.d.ts +9 -0
  674. package/dist/react/ui/button.d.ts.map +1 -0
  675. package/dist/react/ui/button.js +35 -0
  676. package/dist/react/ui/button.js.map +1 -0
  677. package/dist/react/ui/calendar.d.ts +5 -0
  678. package/dist/react/ui/calendar.d.ts.map +1 -0
  679. package/dist/react/ui/calendar.js +34 -0
  680. package/dist/react/ui/calendar.js.map +1 -0
  681. package/dist/react/ui/checkbox.d.ts +4 -0
  682. package/dist/react/ui/checkbox.d.ts.map +1 -0
  683. package/dist/react/ui/checkbox.js +9 -0
  684. package/dist/react/ui/checkbox.js.map +1 -0
  685. package/dist/react/ui/dialog.d.ts +12 -0
  686. package/dist/react/ui/dialog.d.ts.map +1 -0
  687. package/dist/react/ui/dialog.js +34 -0
  688. package/dist/react/ui/dialog.js.map +1 -0
  689. package/dist/react/ui/dropdown-menu.d.ts +12 -0
  690. package/dist/react/ui/dropdown-menu.d.ts.map +1 -0
  691. package/dist/react/ui/dropdown-menu.js +23 -0
  692. package/dist/react/ui/dropdown-menu.js.map +1 -0
  693. package/dist/react/ui/input.d.ts +4 -0
  694. package/dist/react/ui/input.d.ts.map +1 -0
  695. package/dist/react/ui/input.js +8 -0
  696. package/dist/react/ui/input.js.map +1 -0
  697. package/dist/react/ui/label.d.ts +4 -0
  698. package/dist/react/ui/label.d.ts.map +1 -0
  699. package/dist/react/ui/label.js +7 -0
  700. package/dist/react/ui/label.js.map +1 -0
  701. package/dist/react/ui/popover.d.ts +6 -0
  702. package/dist/react/ui/popover.d.ts.map +1 -0
  703. package/dist/react/ui/popover.js +14 -0
  704. package/dist/react/ui/popover.js.map +1 -0
  705. package/dist/react/ui/select.d.ts +17 -0
  706. package/dist/react/ui/select.d.ts.map +1 -0
  707. package/dist/react/ui/select.js +39 -0
  708. package/dist/react/ui/select.js.map +1 -0
  709. package/dist/react/ui/separator.d.ts +4 -0
  710. package/dist/react/ui/separator.d.ts.map +1 -0
  711. package/dist/react/ui/separator.js +9 -0
  712. package/dist/react/ui/separator.js.map +1 -0
  713. package/dist/react/ui/sheet.d.ts +15 -0
  714. package/dist/react/ui/sheet.d.ts.map +1 -0
  715. package/dist/react/ui/sheet.js +37 -0
  716. package/dist/react/ui/sheet.js.map +1 -0
  717. package/dist/react/ui/sidebar.d.ts +64 -0
  718. package/dist/react/ui/sidebar.d.ts.map +1 -0
  719. package/dist/react/ui/sidebar.js +257 -0
  720. package/dist/react/ui/sidebar.js.map +1 -0
  721. package/dist/react/ui/skeleton.d.ts +3 -0
  722. package/dist/react/ui/skeleton.d.ts.map +1 -0
  723. package/dist/react/ui/skeleton.js +7 -0
  724. package/dist/react/ui/skeleton.js.map +1 -0
  725. package/dist/react/ui/slider.d.ts +4 -0
  726. package/dist/react/ui/slider.d.ts.map +1 -0
  727. package/dist/react/ui/slider.js +8 -0
  728. package/dist/react/ui/slider.js.map +1 -0
  729. package/dist/react/ui/switch.d.ts +4 -0
  730. package/dist/react/ui/switch.d.ts.map +1 -0
  731. package/dist/react/ui/switch.js +8 -0
  732. package/dist/react/ui/switch.js.map +1 -0
  733. package/dist/react/ui/table.d.ts +11 -0
  734. package/dist/react/ui/table.d.ts.map +1 -0
  735. package/dist/react/ui/table.js +28 -0
  736. package/dist/react/ui/table.js.map +1 -0
  737. package/dist/react/ui/tabs.d.ts +7 -0
  738. package/dist/react/ui/tabs.d.ts.map +1 -0
  739. package/dist/react/ui/tabs.js +17 -0
  740. package/dist/react/ui/tabs.js.map +1 -0
  741. package/dist/react/ui/textarea.d.ts +4 -0
  742. package/dist/react/ui/textarea.d.ts.map +1 -0
  743. package/dist/react/ui/textarea.js +7 -0
  744. package/dist/react/ui/textarea.js.map +1 -0
  745. package/dist/react/ui/tooltip.d.ts +7 -0
  746. package/dist/react/ui/tooltip.d.ts.map +1 -0
  747. package/dist/react/ui/tooltip.js +17 -0
  748. package/dist/react/ui/tooltip.js.map +1 -0
  749. package/dist/react/useResizableWidth.d.ts +47 -0
  750. package/dist/react/useResizableWidth.d.ts.map +1 -0
  751. package/dist/react/useResizableWidth.js +99 -0
  752. package/dist/react/useResizableWidth.js.map +1 -0
  753. package/dist/react/utils.d.ts +3 -0
  754. package/dist/react/utils.d.ts.map +1 -0
  755. package/dist/react/utils.js +6 -0
  756. package/dist/react/utils.js.map +1 -0
  757. package/dist/react/widgetRegistry.d.ts +33 -0
  758. package/dist/react/widgetRegistry.d.ts.map +1 -0
  759. package/dist/react/widgetRegistry.js +15 -0
  760. package/dist/react/widgetRegistry.js.map +1 -0
  761. package/dist/react/widgets/StatsOverviewRenderer.d.ts +6 -0
  762. package/dist/react/widgets/StatsOverviewRenderer.d.ts.map +1 -0
  763. package/dist/react/widgets/StatsOverviewRenderer.js +124 -0
  764. package/dist/react/widgets/StatsOverviewRenderer.js.map +1 -0
  765. package/dist/react/widgets/TableWidgetRenderer.d.ts +6 -0
  766. package/dist/react/widgets/TableWidgetRenderer.d.ts.map +1 -0
  767. package/dist/react/widgets/TableWidgetRenderer.js +123 -0
  768. package/dist/react/widgets/TableWidgetRenderer.js.map +1 -0
  769. package/dist/react/widgets/ViewRenderer.d.ts +16 -0
  770. package/dist/react/widgets/ViewRenderer.d.ts.map +1 -0
  771. package/dist/react/widgets/ViewRenderer.js +26 -0
  772. package/dist/react/widgets/ViewRenderer.js.map +1 -0
  773. package/dist/richtext/index.d.ts +2 -0
  774. package/dist/richtext/index.d.ts.map +1 -0
  775. package/dist/richtext/index.js +2 -0
  776. package/dist/richtext/index.js.map +1 -0
  777. package/dist/richtext/registry.d.ts +55 -0
  778. package/dist/richtext/registry.d.ts.map +1 -0
  779. package/dist/richtext/registry.js +66 -0
  780. package/dist/richtext/registry.js.map +1 -0
  781. package/dist/routes.d.ts +9 -0
  782. package/dist/routes.d.ts.map +1 -0
  783. package/dist/routes.js +3116 -0
  784. package/dist/routes.js.map +1 -0
  785. package/dist/schema/Alert.d.ts +33 -0
  786. package/dist/schema/Alert.d.ts.map +1 -0
  787. package/dist/schema/Alert.js +41 -0
  788. package/dist/schema/Alert.js.map +1 -0
  789. package/dist/schema/Block.d.ts +112 -0
  790. package/dist/schema/Block.d.ts.map +1 -0
  791. package/dist/schema/Block.js +136 -0
  792. package/dist/schema/Block.js.map +1 -0
  793. package/dist/schema/Breadcrumbs.d.ts +31 -0
  794. package/dist/schema/Breadcrumbs.d.ts.map +1 -0
  795. package/dist/schema/Breadcrumbs.js +30 -0
  796. package/dist/schema/Breadcrumbs.js.map +1 -0
  797. package/dist/schema/Card.d.ts +17 -0
  798. package/dist/schema/Card.d.ts.map +1 -0
  799. package/dist/schema/Card.js +31 -0
  800. package/dist/schema/Card.js.map +1 -0
  801. package/dist/schema/Divider.d.ts +12 -0
  802. package/dist/schema/Divider.d.ts.map +1 -0
  803. package/dist/schema/Divider.js +19 -0
  804. package/dist/schema/Divider.js.map +1 -0
  805. package/dist/schema/Element.d.ts +150 -0
  806. package/dist/schema/Element.d.ts.map +1 -0
  807. package/dist/schema/Element.js +124 -0
  808. package/dist/schema/Element.js.map +1 -0
  809. package/dist/schema/EmptyState.d.ts +48 -0
  810. package/dist/schema/EmptyState.d.ts.map +1 -0
  811. package/dist/schema/EmptyState.js +57 -0
  812. package/dist/schema/EmptyState.js.map +1 -0
  813. package/dist/schema/Fieldset.d.ts +25 -0
  814. package/dist/schema/Fieldset.d.ts.map +1 -0
  815. package/dist/schema/Fieldset.js +39 -0
  816. package/dist/schema/Fieldset.js.map +1 -0
  817. package/dist/schema/Grid.d.ts +23 -0
  818. package/dist/schema/Grid.d.ts.map +1 -0
  819. package/dist/schema/Grid.js +36 -0
  820. package/dist/schema/Grid.js.map +1 -0
  821. package/dist/schema/Group.d.ts +19 -0
  822. package/dist/schema/Group.d.ts.map +1 -0
  823. package/dist/schema/Group.js +26 -0
  824. package/dist/schema/Group.js.map +1 -0
  825. package/dist/schema/Heading.d.ts +25 -0
  826. package/dist/schema/Heading.d.ts.map +1 -0
  827. package/dist/schema/Heading.js +34 -0
  828. package/dist/schema/Heading.js.map +1 -0
  829. package/dist/schema/Html.d.ts +48 -0
  830. package/dist/schema/Html.d.ts.map +1 -0
  831. package/dist/schema/Html.js +60 -0
  832. package/dist/schema/Html.js.map +1 -0
  833. package/dist/schema/Icon.d.ts +34 -0
  834. package/dist/schema/Icon.d.ts.map +1 -0
  835. package/dist/schema/Icon.js +40 -0
  836. package/dist/schema/Icon.js.map +1 -0
  837. package/dist/schema/Image.d.ts +38 -0
  838. package/dist/schema/Image.d.ts.map +1 -0
  839. package/dist/schema/Image.js +48 -0
  840. package/dist/schema/Image.js.map +1 -0
  841. package/dist/schema/LinkTag.d.ts +48 -0
  842. package/dist/schema/LinkTag.d.ts.map +1 -0
  843. package/dist/schema/LinkTag.js +16 -0
  844. package/dist/schema/LinkTag.js.map +1 -0
  845. package/dist/schema/Markdown.d.ts +57 -0
  846. package/dist/schema/Markdown.d.ts.map +1 -0
  847. package/dist/schema/Markdown.js +75 -0
  848. package/dist/schema/Markdown.js.map +1 -0
  849. package/dist/schema/MetaTag.d.ts +41 -0
  850. package/dist/schema/MetaTag.d.ts.map +1 -0
  851. package/dist/schema/MetaTag.js +16 -0
  852. package/dist/schema/MetaTag.js.map +1 -0
  853. package/dist/schema/RelationTabs.d.ts +50 -0
  854. package/dist/schema/RelationTabs.d.ts.map +1 -0
  855. package/dist/schema/RelationTabs.js +48 -0
  856. package/dist/schema/RelationTabs.js.map +1 -0
  857. package/dist/schema/ScriptTag.d.ts +63 -0
  858. package/dist/schema/ScriptTag.d.ts.map +1 -0
  859. package/dist/schema/ScriptTag.js +16 -0
  860. package/dist/schema/ScriptTag.js.map +1 -0
  861. package/dist/schema/Section.d.ts +93 -0
  862. package/dist/schema/Section.d.ts.map +1 -0
  863. package/dist/schema/Section.js +127 -0
  864. package/dist/schema/Section.js.map +1 -0
  865. package/dist/schema/ServerDataElement.d.ts +101 -0
  866. package/dist/schema/ServerDataElement.d.ts.map +1 -0
  867. package/dist/schema/ServerDataElement.js +135 -0
  868. package/dist/schema/ServerDataElement.js.map +1 -0
  869. package/dist/schema/Split.d.ts +31 -0
  870. package/dist/schema/Split.d.ts.map +1 -0
  871. package/dist/schema/Split.js +41 -0
  872. package/dist/schema/Split.js.map +1 -0
  873. package/dist/schema/Stat.d.ts +92 -0
  874. package/dist/schema/Stat.d.ts.map +1 -0
  875. package/dist/schema/Stat.js +116 -0
  876. package/dist/schema/Stat.js.map +1 -0
  877. package/dist/schema/StatsOverview.d.ts +76 -0
  878. package/dist/schema/StatsOverview.d.ts.map +1 -0
  879. package/dist/schema/StatsOverview.js +71 -0
  880. package/dist/schema/StatsOverview.js.map +1 -0
  881. package/dist/schema/StyleTag.d.ts +32 -0
  882. package/dist/schema/StyleTag.d.ts.map +1 -0
  883. package/dist/schema/StyleTag.js +38 -0
  884. package/dist/schema/StyleTag.js.map +1 -0
  885. package/dist/schema/TableWidget.d.ts +148 -0
  886. package/dist/schema/TableWidget.d.ts.map +1 -0
  887. package/dist/schema/TableWidget.js +190 -0
  888. package/dist/schema/TableWidget.js.map +1 -0
  889. package/dist/schema/Tabs.d.ts +40 -0
  890. package/dist/schema/Tabs.d.ts.map +1 -0
  891. package/dist/schema/Tabs.js +66 -0
  892. package/dist/schema/Tabs.js.map +1 -0
  893. package/dist/schema/Text.d.ts +33 -0
  894. package/dist/schema/Text.d.ts.map +1 -0
  895. package/dist/schema/Text.js +40 -0
  896. package/dist/schema/Text.js.map +1 -0
  897. package/dist/schema/UnorderedList.d.ts +36 -0
  898. package/dist/schema/UnorderedList.d.ts.map +1 -0
  899. package/dist/schema/UnorderedList.js +42 -0
  900. package/dist/schema/UnorderedList.js.map +1 -0
  901. package/dist/schema/View.d.ts +81 -0
  902. package/dist/schema/View.d.ts.map +1 -0
  903. package/dist/schema/View.js +81 -0
  904. package/dist/schema/View.js.map +1 -0
  905. package/dist/schema/Wizard.d.ts +67 -0
  906. package/dist/schema/Wizard.d.ts.map +1 -0
  907. package/dist/schema/Wizard.js +94 -0
  908. package/dist/schema/Wizard.js.map +1 -0
  909. package/dist/schema/index.d.ts +26 -0
  910. package/dist/schema/index.d.ts.map +1 -0
  911. package/dist/schema/index.js +26 -0
  912. package/dist/schema/index.js.map +1 -0
  913. package/dist/schema/resolveSchema.d.ts +122 -0
  914. package/dist/schema/resolveSchema.d.ts.map +1 -0
  915. package/dist/schema/resolveSchema.js +648 -0
  916. package/dist/schema/resolveSchema.js.map +1 -0
  917. package/dist/schema/sanitize.d.ts +21 -0
  918. package/dist/schema/sanitize.d.ts.map +1 -0
  919. package/dist/schema/sanitize.js +46 -0
  920. package/dist/schema/sanitize.js.map +1 -0
  921. package/dist/search.d.ts +53 -0
  922. package/dist/search.d.ts.map +1 -0
  923. package/dist/search.js +114 -0
  924. package/dist/search.js.map +1 -0
  925. package/dist/sessionFilters.d.ts +8 -0
  926. package/dist/sessionFilters.d.ts.map +1 -0
  927. package/dist/sessionFilters.js +115 -0
  928. package/dist/sessionFilters.js.map +1 -0
  929. package/dist/summarizers/Summarizer.d.ts +65 -0
  930. package/dist/summarizers/Summarizer.d.ts.map +1 -0
  931. package/dist/summarizers/Summarizer.js +98 -0
  932. package/dist/summarizers/Summarizer.js.map +1 -0
  933. package/dist/summarizers/index.d.ts +2 -0
  934. package/dist/summarizers/index.d.ts.map +1 -0
  935. package/dist/summarizers/index.js +2 -0
  936. package/dist/summarizers/index.js.map +1 -0
  937. package/dist/theme/base-colors.d.ts +3 -0
  938. package/dist/theme/base-colors.d.ts.map +1 -0
  939. package/dist/theme/base-colors.js +64 -0
  940. package/dist/theme/base-colors.js.map +1 -0
  941. package/dist/theme/chart-colors.d.ts +3 -0
  942. package/dist/theme/chart-colors.d.ts.map +1 -0
  943. package/dist/theme/chart-colors.js +46 -0
  944. package/dist/theme/chart-colors.js.map +1 -0
  945. package/dist/theme/colors.d.ts +56 -0
  946. package/dist/theme/colors.d.ts.map +1 -0
  947. package/dist/theme/colors.js +410 -0
  948. package/dist/theme/colors.js.map +1 -0
  949. package/dist/theme/generate-css.d.ts +9 -0
  950. package/dist/theme/generate-css.d.ts.map +1 -0
  951. package/dist/theme/generate-css.js +36 -0
  952. package/dist/theme/generate-css.js.map +1 -0
  953. package/dist/theme/generate-scale.d.ts +3 -0
  954. package/dist/theme/generate-scale.d.ts.map +1 -0
  955. package/dist/theme/generate-scale.js +89 -0
  956. package/dist/theme/generate-scale.js.map +1 -0
  957. package/dist/theme/icon-map.d.ts +9 -0
  958. package/dist/theme/icon-map.d.ts.map +1 -0
  959. package/dist/theme/icon-map.js +40 -0
  960. package/dist/theme/icon-map.js.map +1 -0
  961. package/dist/theme/index.d.ts +15 -0
  962. package/dist/theme/index.d.ts.map +1 -0
  963. package/dist/theme/index.js +13 -0
  964. package/dist/theme/index.js.map +1 -0
  965. package/dist/theme/migrate.d.ts +14 -0
  966. package/dist/theme/migrate.d.ts.map +1 -0
  967. package/dist/theme/migrate.js +79 -0
  968. package/dist/theme/migrate.js.map +1 -0
  969. package/dist/theme/presets.d.ts +30 -0
  970. package/dist/theme/presets.d.ts.map +1 -0
  971. package/dist/theme/presets.js +128 -0
  972. package/dist/theme/presets.js.map +1 -0
  973. package/dist/theme/radius.d.ts +11 -0
  974. package/dist/theme/radius.d.ts.map +1 -0
  975. package/dist/theme/radius.js +17 -0
  976. package/dist/theme/radius.js.map +1 -0
  977. package/dist/theme/resolve.d.ts +13 -0
  978. package/dist/theme/resolve.d.ts.map +1 -0
  979. package/dist/theme/resolve.js +91 -0
  980. package/dist/theme/resolve.js.map +1 -0
  981. package/dist/theme/spacing.d.ts +14 -0
  982. package/dist/theme/spacing.d.ts.map +1 -0
  983. package/dist/theme/spacing.js +17 -0
  984. package/dist/theme/spacing.js.map +1 -0
  985. package/dist/theme/theme-colors.d.ts +9 -0
  986. package/dist/theme/theme-colors.d.ts.map +1 -0
  987. package/dist/theme/theme-colors.js +84 -0
  988. package/dist/theme/theme-colors.js.map +1 -0
  989. package/dist/theme/types.d.ts +94 -0
  990. package/dist/theme/types.d.ts.map +1 -0
  991. package/dist/theme/types.js +2 -0
  992. package/dist/theme/types.js.map +1 -0
  993. package/dist/uploads/UploadAdapter.d.ts +34 -0
  994. package/dist/uploads/UploadAdapter.d.ts.map +1 -0
  995. package/dist/uploads/UploadAdapter.js +2 -0
  996. package/dist/uploads/UploadAdapter.js.map +1 -0
  997. package/dist/uploads/index.d.ts +3 -0
  998. package/dist/uploads/index.d.ts.map +1 -0
  999. package/dist/uploads/index.js +2 -0
  1000. package/dist/uploads/index.js.map +1 -0
  1001. package/dist/uploads/localUpload.d.ts +25 -0
  1002. package/dist/uploads/localUpload.d.ts.map +1 -0
  1003. package/dist/uploads/localUpload.js +65 -0
  1004. package/dist/uploads/localUpload.js.map +1 -0
  1005. package/dist/validation/Validator.d.ts +40 -0
  1006. package/dist/validation/Validator.d.ts.map +1 -0
  1007. package/dist/validation/Validator.js +25 -0
  1008. package/dist/validation/Validator.js.map +1 -0
  1009. package/dist/validation/index.d.ts +5 -0
  1010. package/dist/validation/index.d.ts.map +1 -0
  1011. package/dist/validation/index.js +5 -0
  1012. package/dist/validation/index.js.map +1 -0
  1013. package/dist/validation/rules.d.ts +9 -0
  1014. package/dist/validation/rules.d.ts.map +1 -0
  1015. package/dist/validation/rules.js +61 -0
  1016. package/dist/validation/rules.js.map +1 -0
  1017. package/dist/validation/runValidators.d.ts +30 -0
  1018. package/dist/validation/runValidators.d.ts.map +1 -0
  1019. package/dist/validation/runValidators.js +438 -0
  1020. package/dist/validation/runValidators.js.map +1 -0
  1021. package/dist/validation/uniqueValidator.d.ts +61 -0
  1022. package/dist/validation/uniqueValidator.d.ts.map +1 -0
  1023. package/dist/validation/uniqueValidator.js +80 -0
  1024. package/dist/validation/uniqueValidator.js.map +1 -0
  1025. package/dist/vite.d.ts +19 -0
  1026. package/dist/vite.d.ts.map +1 -0
  1027. package/dist/vite.js +696 -0
  1028. package/dist/vite.js.map +1 -0
  1029. package/dist/widgets/index.d.ts +2 -0
  1030. package/dist/widgets/index.d.ts.map +1 -0
  1031. package/dist/widgets/index.js +7 -0
  1032. package/dist/widgets/index.js.map +1 -0
  1033. package/dist/widgets/registry.d.ts +32 -0
  1034. package/dist/widgets/registry.d.ts.map +1 -0
  1035. package/dist/widgets/registry.js +17 -0
  1036. package/dist/widgets/registry.js.map +1 -0
  1037. package/package.json +101 -0
  1038. package/src/Cluster.test.ts +283 -0
  1039. package/src/Cluster.ts +83 -0
  1040. package/src/Column.test.ts +140 -0
  1041. package/src/Column.ts +612 -0
  1042. package/src/Global.test.ts +367 -0
  1043. package/src/Global.ts +169 -0
  1044. package/src/Page.test.ts +50 -0
  1045. package/src/Page.ts +139 -0
  1046. package/src/Pilotiq.test.ts +47 -0
  1047. package/src/Pilotiq.ts +705 -0
  1048. package/src/PilotiqRegistry.ts +36 -0
  1049. package/src/PilotiqServiceProvider.ts +69 -0
  1050. package/src/RelationManager.test.ts +400 -0
  1051. package/src/RelationManager.ts +527 -0
  1052. package/src/RenderHook.test.ts +252 -0
  1053. package/src/RenderHook.ts +226 -0
  1054. package/src/Resource.test.ts +240 -0
  1055. package/src/Resource.ts +439 -0
  1056. package/src/RightPanel.test.ts +202 -0
  1057. package/src/RightPanel.ts +132 -0
  1058. package/src/Tab.test.ts +91 -0
  1059. package/src/Tab.ts +156 -0
  1060. package/src/UserMenuItem.ts +145 -0
  1061. package/src/actions/Action.test.ts +2479 -0
  1062. package/src/actions/Action.ts +2124 -0
  1063. package/src/actions/ActionGroup.test.ts +112 -0
  1064. package/src/actions/ActionGroup.ts +173 -0
  1065. package/src/actions/attachFactory.ts +172 -0
  1066. package/src/actions/exportFactory.ts +215 -0
  1067. package/src/actions/importFactory.ts +222 -0
  1068. package/src/actions/index.ts +17 -0
  1069. package/src/applyPageHooks.test.ts +298 -0
  1070. package/src/applyPageHooks.ts +242 -0
  1071. package/src/authorization.test.ts +483 -0
  1072. package/src/breadcrumbs.test.ts +238 -0
  1073. package/src/cells/coerce.test.ts +85 -0
  1074. package/src/cells/coerce.ts +84 -0
  1075. package/src/clusterPaths.ts +35 -0
  1076. package/src/columns/BadgeColumn.test.ts +54 -0
  1077. package/src/columns/BadgeColumn.ts +32 -0
  1078. package/src/columns/BooleanColumn.test.ts +41 -0
  1079. package/src/columns/BooleanColumn.ts +18 -0
  1080. package/src/columns/ColorColumn.test.ts +37 -0
  1081. package/src/columns/ColorColumn.ts +38 -0
  1082. package/src/columns/IconColumn.test.ts +54 -0
  1083. package/src/columns/IconColumn.ts +37 -0
  1084. package/src/columns/ImageColumn.test.ts +41 -0
  1085. package/src/columns/ImageColumn.ts +28 -0
  1086. package/src/columns/SelectColumn.ts +60 -0
  1087. package/src/columns/TextColumn.test.ts +190 -0
  1088. package/src/columns/TextColumn.ts +20 -0
  1089. package/src/columns/TextInputColumn.ts +68 -0
  1090. package/src/columns/ToggleColumn.ts +46 -0
  1091. package/src/columns/editableColumns.test.ts +193 -0
  1092. package/src/columns/index.ts +9 -0
  1093. package/src/defaultGlobalPages.ts +95 -0
  1094. package/src/defaultPages.test.ts +634 -0
  1095. package/src/defaultPages.ts +614 -0
  1096. package/src/defaultViewPage.test.ts +147 -0
  1097. package/src/elements/Form.test.ts +223 -0
  1098. package/src/elements/Form.ts +397 -0
  1099. package/src/elements/ListTabs.ts +28 -0
  1100. package/src/elements/Table.test.ts +422 -0
  1101. package/src/elements/Table.ts +816 -0
  1102. package/src/elements/TableGroup.test.ts +149 -0
  1103. package/src/elements/TableGroup.ts +199 -0
  1104. package/src/elements/dispatchAction.test.ts +463 -0
  1105. package/src/elements/dispatchAction.ts +355 -0
  1106. package/src/elements/dispatchForm.test.ts +455 -0
  1107. package/src/elements/dispatchForm.ts +1855 -0
  1108. package/src/elements/dispatchTable.test.ts +1247 -0
  1109. package/src/elements/dispatchTable.ts +666 -0
  1110. package/src/elements/index.ts +21 -0
  1111. package/src/entries/BadgeEntry.ts +39 -0
  1112. package/src/entries/CodeEntry.test.ts +40 -0
  1113. package/src/entries/CodeEntry.ts +52 -0
  1114. package/src/entries/ColorEntry.ts +63 -0
  1115. package/src/entries/ComponentEntry.test.ts +173 -0
  1116. package/src/entries/ComponentEntry.ts +95 -0
  1117. package/src/entries/Entry.ts +304 -0
  1118. package/src/entries/IconEntry.ts +49 -0
  1119. package/src/entries/ImageEntry.ts +61 -0
  1120. package/src/entries/KeyValueEntry.ts +47 -0
  1121. package/src/entries/RepeatableEntry.test.ts +239 -0
  1122. package/src/entries/RepeatableEntry.ts +173 -0
  1123. package/src/entries/TextEntry.test.ts +394 -0
  1124. package/src/entries/TextEntry.ts +60 -0
  1125. package/src/entries/index.ts +12 -0
  1126. package/src/entries/leaves.test.ts +306 -0
  1127. package/src/entries/registry.ts +54 -0
  1128. package/src/fields/BuilderField.test.ts +1188 -0
  1129. package/src/fields/BuilderField.ts +568 -0
  1130. package/src/fields/BuilderRelationship.test.ts +811 -0
  1131. package/src/fields/CheckboxField.test.ts +44 -0
  1132. package/src/fields/CheckboxField.ts +27 -0
  1133. package/src/fields/CheckboxListField.test.ts +99 -0
  1134. package/src/fields/CheckboxListField.ts +66 -0
  1135. package/src/fields/ColorPickerField.test.ts +33 -0
  1136. package/src/fields/ColorPickerField.ts +25 -0
  1137. package/src/fields/DateField.ts +54 -0
  1138. package/src/fields/DateTimeField.test.ts +55 -0
  1139. package/src/fields/EmailField.ts +16 -0
  1140. package/src/fields/Field.test.ts +639 -0
  1141. package/src/fields/Field.ts +773 -0
  1142. package/src/fields/FileUploadField.test.ts +97 -0
  1143. package/src/fields/FileUploadField.ts +71 -0
  1144. package/src/fields/HiddenField.test.ts +27 -0
  1145. package/src/fields/HiddenField.ts +28 -0
  1146. package/src/fields/KeyValueField.test.ts +105 -0
  1147. package/src/fields/KeyValueField.ts +55 -0
  1148. package/src/fields/MarkdownField.test.ts +167 -0
  1149. package/src/fields/MarkdownField.ts +151 -0
  1150. package/src/fields/NumberField.ts +33 -0
  1151. package/src/fields/RadioField.test.ts +94 -0
  1152. package/src/fields/RadioField.ts +67 -0
  1153. package/src/fields/RepeaterField.test.ts +1806 -0
  1154. package/src/fields/RepeaterField.ts +791 -0
  1155. package/src/fields/RepeaterRelationship.test.ts +1630 -0
  1156. package/src/fields/RepeaterSimple.test.ts +248 -0
  1157. package/src/fields/RowButton.test.ts +149 -0
  1158. package/src/fields/RowButton.ts +125 -0
  1159. package/src/fields/SelectField.test.ts +192 -0
  1160. package/src/fields/SelectField.ts +235 -0
  1161. package/src/fields/SliderField.test.ts +50 -0
  1162. package/src/fields/SliderField.ts +53 -0
  1163. package/src/fields/SlugField.ts +24 -0
  1164. package/src/fields/TagsInputField.test.ts +154 -0
  1165. package/src/fields/TagsInputField.ts +133 -0
  1166. package/src/fields/TextField.ts +24 -0
  1167. package/src/fields/TextareaField.test.ts +58 -0
  1168. package/src/fields/TextareaField.ts +59 -0
  1169. package/src/fields/ToggleButtonsField.test.ts +106 -0
  1170. package/src/fields/ToggleButtonsField.ts +59 -0
  1171. package/src/fields/ToggleField.ts +16 -0
  1172. package/src/fields/disableOptionsWhenSelectedInSiblingRepeaterItems.test.ts +319 -0
  1173. package/src/fields/optionsResolver.ts +95 -0
  1174. package/src/fields/resolveField.ts +28 -0
  1175. package/src/filters/BooleanFilter.ts +35 -0
  1176. package/src/filters/DateRangeFilter.test.ts +194 -0
  1177. package/src/filters/DateRangeFilter.ts +148 -0
  1178. package/src/filters/Filter.test.ts +268 -0
  1179. package/src/filters/Filter.ts +184 -0
  1180. package/src/filters/FormFilter.test.ts +238 -0
  1181. package/src/filters/FormFilter.ts +215 -0
  1182. package/src/filters/MultiSelectFilter.test.ts +119 -0
  1183. package/src/filters/MultiSelectFilter.ts +78 -0
  1184. package/src/filters/QueryBuilderFilter.test.ts +644 -0
  1185. package/src/filters/QueryBuilderFilter.ts +398 -0
  1186. package/src/filters/SelectFilter.ts +46 -0
  1187. package/src/filters/TernaryFilter.test.ts +160 -0
  1188. package/src/filters/TernaryFilter.ts +72 -0
  1189. package/src/filters/TrashedFilter.test.ts +149 -0
  1190. package/src/filters/TrashedFilter.ts +55 -0
  1191. package/src/filters/queryBuilder/BooleanConstraint.ts +31 -0
  1192. package/src/filters/queryBuilder/Constraint.ts +115 -0
  1193. package/src/filters/queryBuilder/DateConstraint.ts +69 -0
  1194. package/src/filters/queryBuilder/NumberConstraint.ts +66 -0
  1195. package/src/filters/queryBuilder/SelectConstraint.ts +72 -0
  1196. package/src/filters/queryBuilder/TextConstraint.ts +65 -0
  1197. package/src/filters/queryBuilder/index.ts +12 -0
  1198. package/src/icons/index.ts +2 -0
  1199. package/src/icons/lucide.ts +204 -0
  1200. package/src/icons/registry.test.ts +56 -0
  1201. package/src/icons/registry.ts +41 -0
  1202. package/src/icons/types.ts +47 -0
  1203. package/src/index.ts +521 -0
  1204. package/src/io/csv.test.ts +142 -0
  1205. package/src/io/csv.ts +170 -0
  1206. package/src/nestedRelationManagerData.test.ts +526 -0
  1207. package/src/notifications/Notification.test.ts +210 -0
  1208. package/src/notifications/Notification.ts +354 -0
  1209. package/src/notifications/broadcast.test.ts +110 -0
  1210. package/src/notifications/broadcast.ts +95 -0
  1211. package/src/notifications/database.test.ts +383 -0
  1212. package/src/notifications/database.ts +398 -0
  1213. package/src/notifications/databaseNotifications.test.ts +187 -0
  1214. package/src/notifications/dispatchNotificationAction.test.ts +341 -0
  1215. package/src/notifications/dispatchNotificationAction.ts +142 -0
  1216. package/src/notifications/flash.test.ts +89 -0
  1217. package/src/notifications/flash.ts +71 -0
  1218. package/src/notifications/index.ts +45 -0
  1219. package/src/notifications/registerBroadcastAuth.test.ts +134 -0
  1220. package/src/notifications/registerBroadcastAuth.ts +100 -0
  1221. package/src/notifications/resolveSavedNotification.test.ts +82 -0
  1222. package/src/notifications/resolveSavedNotification.ts +59 -0
  1223. package/src/notifications/types.ts +93 -0
  1224. package/src/orm/m2mAccessor.ts +66 -0
  1225. package/src/orm/modelDefaults.test.ts +633 -0
  1226. package/src/orm/modelDefaults.ts +632 -0
  1227. package/src/pageData.test.ts +1121 -0
  1228. package/src/pageData.ts +4662 -0
  1229. package/src/plugins/index.ts +1 -0
  1230. package/src/plugins/themeEditor.ts +24 -0
  1231. package/src/react/AppShell.tsx +148 -0
  1232. package/src/react/CommandPalette.tsx +375 -0
  1233. package/src/react/FormStateContext.tsx +398 -0
  1234. package/src/react/HeadHooks.tsx +126 -0
  1235. package/src/react/NotificationActionStrip.tsx +263 -0
  1236. package/src/react/NotificationBell.tsx +426 -0
  1237. package/src/react/RenderHookSlot.tsx +32 -0
  1238. package/src/react/RightSidebar.tsx +257 -0
  1239. package/src/react/RightSidebarContext.tsx +211 -0
  1240. package/src/react/RightSidebarTrigger.tsx +53 -0
  1241. package/src/react/SchemaRenderer.tsx +6128 -0
  1242. package/src/react/SearchTrigger.tsx +46 -0
  1243. package/src/react/ThemeProvider.tsx +93 -0
  1244. package/src/react/ThemeSettingsPage.tsx +579 -0
  1245. package/src/react/ThemeToggle.tsx +20 -0
  1246. package/src/react/Toaster.tsx +158 -0
  1247. package/src/react/UserMenu.tsx +196 -0
  1248. package/src/react/WidgetDataContext.tsx +157 -0
  1249. package/src/react/cells/EditableCell.tsx +376 -0
  1250. package/src/react/fieldJsHandler.test.ts +166 -0
  1251. package/src/react/fieldJsHandler.ts +79 -0
  1252. package/src/react/fields/BuilderInput.tsx +995 -0
  1253. package/src/react/fields/CheckboxInput.tsx +39 -0
  1254. package/src/react/fields/CheckboxListInput.tsx +81 -0
  1255. package/src/react/fields/ColorInput.tsx +51 -0
  1256. package/src/react/fields/DateFieldInput.tsx +70 -0
  1257. package/src/react/fields/DateTimeInput.tsx +42 -0
  1258. package/src/react/fields/FieldShell.tsx +107 -0
  1259. package/src/react/fields/FileUploadInput.tsx +189 -0
  1260. package/src/react/fields/HiddenInput.tsx +17 -0
  1261. package/src/react/fields/KeyValueInput.tsx +200 -0
  1262. package/src/react/fields/MarkdownInput.tsx +333 -0
  1263. package/src/react/fields/RadioInput.tsx +60 -0
  1264. package/src/react/fields/RepeaterInput.test.ts +116 -0
  1265. package/src/react/fields/RepeaterInput.tsx +1313 -0
  1266. package/src/react/fields/SelectFieldInput.tsx +257 -0
  1267. package/src/react/fields/SliderInput.tsx +63 -0
  1268. package/src/react/fields/TagsInput.tsx +265 -0
  1269. package/src/react/fields/TextLikeInput.tsx +54 -0
  1270. package/src/react/fields/ToggleButtonsInput.tsx +60 -0
  1271. package/src/react/fields/ToggleFieldInput.tsx +35 -0
  1272. package/src/react/fields/rowChromeButton.tsx +225 -0
  1273. package/src/react/fields/syncRowGates.test.ts +202 -0
  1274. package/src/react/fields/syncRowGates.ts +66 -0
  1275. package/src/react/formStateHelpers.test.ts +295 -0
  1276. package/src/react/formStateHelpers.ts +218 -0
  1277. package/src/react/hooks/use-mobile.ts +19 -0
  1278. package/src/react/icon-context.tsx +60 -0
  1279. package/src/react/index.ts +85 -0
  1280. package/src/react/layouts/SidebarLayout.tsx +239 -0
  1281. package/src/react/layouts/TopbarLayout.tsx +245 -0
  1282. package/src/react/navigate.tsx +37 -0
  1283. package/src/react/registry.ts +48 -0
  1284. package/src/react/right-panel-registry.tsx +47 -0
  1285. package/src/react/theme-preview/apply.ts +99 -0
  1286. package/src/react/theme-preview/build-html.ts +436 -0
  1287. package/src/react/ui/button.tsx +51 -0
  1288. package/src/react/ui/calendar.tsx +67 -0
  1289. package/src/react/ui/checkbox.tsx +29 -0
  1290. package/src/react/ui/dialog.tsx +108 -0
  1291. package/src/react/ui/dropdown-menu.tsx +97 -0
  1292. package/src/react/ui/input.tsx +20 -0
  1293. package/src/react/ui/label.tsx +21 -0
  1294. package/src/react/ui/popover.tsx +50 -0
  1295. package/src/react/ui/select.tsx +169 -0
  1296. package/src/react/ui/separator.tsx +25 -0
  1297. package/src/react/ui/sheet.tsx +136 -0
  1298. package/src/react/ui/sidebar.tsx +723 -0
  1299. package/src/react/ui/skeleton.tsx +13 -0
  1300. package/src/react/ui/slider.tsx +34 -0
  1301. package/src/react/ui/switch.tsx +28 -0
  1302. package/src/react/ui/table.tsx +105 -0
  1303. package/src/react/ui/tabs.tsx +63 -0
  1304. package/src/react/ui/textarea.tsx +18 -0
  1305. package/src/react/ui/tooltip.tsx +64 -0
  1306. package/src/react/useResizableWidth.ts +139 -0
  1307. package/src/react/utils.ts +6 -0
  1308. package/src/react/widgetRegistry.test.ts +43 -0
  1309. package/src/react/widgetRegistry.ts +50 -0
  1310. package/src/react/widgets/StatsOverviewRenderer.tsx +232 -0
  1311. package/src/react/widgets/TableWidgetRenderer.tsx +231 -0
  1312. package/src/react/widgets/ViewRenderer.tsx +71 -0
  1313. package/src/relationManagerData.test.ts +1146 -0
  1314. package/src/richtext/index.ts +8 -0
  1315. package/src/richtext/registry.ts +89 -0
  1316. package/src/routes-nested-relations.test.ts +676 -0
  1317. package/src/routes-relations.test.ts +972 -0
  1318. package/src/routes.test.ts +1886 -0
  1319. package/src/routes.ts +3262 -0
  1320. package/src/schema/Alert.test.ts +63 -0
  1321. package/src/schema/Alert.ts +49 -0
  1322. package/src/schema/Block.ts +169 -0
  1323. package/src/schema/Breadcrumbs.ts +40 -0
  1324. package/src/schema/Card.ts +35 -0
  1325. package/src/schema/Divider.ts +20 -0
  1326. package/src/schema/Element.ts +219 -0
  1327. package/src/schema/EmptyState.test.ts +37 -0
  1328. package/src/schema/EmptyState.ts +63 -0
  1329. package/src/schema/Fieldset.ts +43 -0
  1330. package/src/schema/Grid.ts +43 -0
  1331. package/src/schema/Group.ts +30 -0
  1332. package/src/schema/Heading.ts +39 -0
  1333. package/src/schema/Html.ts +67 -0
  1334. package/src/schema/Icon.ts +54 -0
  1335. package/src/schema/Image.ts +57 -0
  1336. package/src/schema/LinkTag.ts +41 -0
  1337. package/src/schema/Markdown.ts +85 -0
  1338. package/src/schema/MetaTag.ts +41 -0
  1339. package/src/schema/RelationTabs.ts +71 -0
  1340. package/src/schema/ScriptTag.ts +55 -0
  1341. package/src/schema/Section.ts +143 -0
  1342. package/src/schema/ServerDataElement.test.ts +140 -0
  1343. package/src/schema/ServerDataElement.ts +156 -0
  1344. package/src/schema/Split.ts +50 -0
  1345. package/src/schema/Stat.test.ts +118 -0
  1346. package/src/schema/Stat.ts +154 -0
  1347. package/src/schema/StatsOverview.test.ts +141 -0
  1348. package/src/schema/StatsOverview.ts +119 -0
  1349. package/src/schema/StyleTag.ts +35 -0
  1350. package/src/schema/TableWidget.test.ts +297 -0
  1351. package/src/schema/TableWidget.ts +289 -0
  1352. package/src/schema/Tabs.ts +79 -0
  1353. package/src/schema/Text.ts +58 -0
  1354. package/src/schema/UnorderedList.ts +49 -0
  1355. package/src/schema/View.test.ts +111 -0
  1356. package/src/schema/View.ts +127 -0
  1357. package/src/schema/Wizard.ts +108 -0
  1358. package/src/schema/containers.test.ts +446 -0
  1359. package/src/schema/headTags.test.ts +134 -0
  1360. package/src/schema/index.ts +39 -0
  1361. package/src/schema/primes.test.ts +269 -0
  1362. package/src/schema/resolveSchema.test.ts +329 -0
  1363. package/src/schema/resolveSchema.ts +807 -0
  1364. package/src/schema/sanitize.ts +49 -0
  1365. package/src/search.test.ts +446 -0
  1366. package/src/search.ts +178 -0
  1367. package/src/sessionFilters.test.ts +352 -0
  1368. package/src/sessionFilters.ts +133 -0
  1369. package/src/summarizers/Summarizer.test.ts +84 -0
  1370. package/src/summarizers/Summarizer.ts +123 -0
  1371. package/src/summarizers/index.ts +11 -0
  1372. package/src/theme/base-colors.ts +68 -0
  1373. package/src/theme/chart-colors.ts +50 -0
  1374. package/src/theme/colors.ts +447 -0
  1375. package/src/theme/generate-css.test.ts +139 -0
  1376. package/src/theme/generate-css.ts +44 -0
  1377. package/src/theme/generate-scale.test.ts +106 -0
  1378. package/src/theme/generate-scale.ts +97 -0
  1379. package/src/theme/icon-map.ts +42 -0
  1380. package/src/theme/index.ts +28 -0
  1381. package/src/theme/migrate.ts +81 -0
  1382. package/src/theme/presets.ts +135 -0
  1383. package/src/theme/radius.ts +18 -0
  1384. package/src/theme/resolve.test.ts +238 -0
  1385. package/src/theme/resolve.ts +96 -0
  1386. package/src/theme/spacing.ts +18 -0
  1387. package/src/theme/theme-colors.ts +88 -0
  1388. package/src/theme/types.ts +125 -0
  1389. package/src/uploads/UploadAdapter.ts +35 -0
  1390. package/src/uploads/index.ts +2 -0
  1391. package/src/uploads/localUpload.test.ts +70 -0
  1392. package/src/uploads/localUpload.ts +84 -0
  1393. package/src/validation/Validator.ts +49 -0
  1394. package/src/validation/index.ts +28 -0
  1395. package/src/validation/rules.ts +78 -0
  1396. package/src/validation/runValidators.ts +435 -0
  1397. package/src/validation/uniqueValidator.test.ts +196 -0
  1398. package/src/validation/uniqueValidator.ts +133 -0
  1399. package/src/validation/validators.test.ts +268 -0
  1400. package/src/vite.ts +758 -0
  1401. package/src/widgets/index.ts +10 -0
  1402. package/src/widgets/registry.ts +45 -0
  1403. package/src/widgets.test.ts +592 -0
  1404. package/tsconfig.build.json +11 -0
  1405. package/tsconfig.json +4 -0
  1406. package/tsconfig.test.json +10 -0
  1407. package/views/react/Dashboard.tsx +27 -0
  1408. package/views/react/Resources/Form.tsx +102 -0
  1409. package/views/react/Resources/Index.tsx +49 -0
@@ -0,0 +1,1188 @@
1
+ import { describe, it } from 'node:test'
2
+ import assert from 'node:assert/strict'
3
+
4
+ import { BuilderField, Builder, isBuilderField, type BuilderFieldMeta } from './BuilderField.js'
5
+ import { RepeaterField } from './RepeaterField.js'
6
+ import { TextField } from './TextField.js'
7
+ import { NumberField } from './NumberField.js'
8
+ import { ToggleField } from './ToggleField.js'
9
+ import { Block } from '../schema/Block.js'
10
+ import { resolveSchema } from '../schema/resolveSchema.js'
11
+ import { coerceFormValues, applyStateUpdate, findForms } from '../elements/dispatchForm.js'
12
+ import { findActions } from '../elements/dispatchAction.js'
13
+ import { findTables } from '../elements/dispatchTable.js'
14
+ import { Form } from '../elements/Form.js'
15
+ import { Table } from '../elements/Table.js'
16
+ import { Action } from '../actions/Action.js'
17
+ import { Section } from '../schema/Section.js'
18
+ import { validateSchema, isValid } from '../validation/index.js'
19
+
20
+ // ─── Block ──────────────────────────────────────────────────
21
+
22
+ describe('Block', () => {
23
+ it('label defaults to titlecased name', () => {
24
+ const meta = Block.make('heading').toMeta()
25
+ assert.equal(meta.label, 'Heading')
26
+ assert.equal(meta.name, 'heading')
27
+ })
28
+
29
+ it('builders round-trip through toMeta', () => {
30
+ const meta = Block.make('heading')
31
+ .label('Title')
32
+ .icon('heading')
33
+ .columns(2)
34
+ .maxItems(1)
35
+ .toMeta()
36
+ assert.equal(meta.label, 'Title')
37
+ assert.equal(meta.icon, 'heading')
38
+ assert.equal(meta.columns, 2)
39
+ assert.equal(meta.maxItems, 1)
40
+ })
41
+
42
+ it('schema() stores inner elements', () => {
43
+ const inner = [TextField.make('text'), NumberField.make('level')]
44
+ const b = Block.make('heading').schema(inner)
45
+ assert.deepEqual(b.getSchema(), inner)
46
+ })
47
+
48
+ it('only sets meta keys when configured', () => {
49
+ const meta = Block.make('p').toMeta()
50
+ assert.equal('icon' in meta, false)
51
+ assert.equal('columns' in meta, false)
52
+ assert.equal('maxItems' in meta, false)
53
+ })
54
+
55
+ describe('visible(rule)', () => {
56
+ it('returns true when no rule is set', async () => {
57
+ const visible = await Block.make('heading').evaluateVisibility()
58
+ assert.equal(visible, true)
59
+ assert.equal(Block.make('heading').hasVisibilityRule(), false)
60
+ })
61
+
62
+ it('boolean rule short-circuits', async () => {
63
+ const b = Block.make('heading').visible(false)
64
+ assert.equal(await b.evaluateVisibility(), false)
65
+ assert.equal(b.hasVisibilityRule(), true)
66
+ })
67
+
68
+ it('callback receives the layout context', async () => {
69
+ let seen: unknown
70
+ const b = Block.make('heading').visible((ctx) => {
71
+ seen = ctx.user
72
+ return true
73
+ })
74
+ await b.evaluateVisibility({ user: { role: 'admin' } })
75
+ assert.deepEqual(seen, { role: 'admin' })
76
+ })
77
+
78
+ it('async callback is awaited', async () => {
79
+ const b = Block.make('heading').visible(async () => false)
80
+ assert.equal(await b.evaluateVisibility(), false)
81
+ })
82
+
83
+ it('throwing rule fails closed (hidden)', async () => {
84
+ const b = Block.make('heading').visible(() => { throw new Error('boom') })
85
+ assert.equal(await b.evaluateVisibility(), false)
86
+ })
87
+
88
+ it('hidden() inverts the rule', async () => {
89
+ assert.equal(await Block.make('h').hidden(true).evaluateVisibility(), false)
90
+ assert.equal(await Block.make('h').hidden(false).evaluateVisibility(), true)
91
+ const b = Block.make('h').hidden((ctx) => ctx.user === 'banned')
92
+ assert.equal(await b.evaluateVisibility({ user: 'banned' }), false)
93
+ assert.equal(await b.evaluateVisibility({ user: 'ok' }), true)
94
+ })
95
+ })
96
+ })
97
+
98
+ // ─── BuilderField ────────────────────────────────────────────
99
+
100
+ describe('BuilderField', () => {
101
+ it('emits fieldType "builder"', () => {
102
+ const meta = BuilderField.make('content').toMeta()
103
+ assert.equal(meta.fieldType, 'builder')
104
+ })
105
+
106
+ it('exports an alias `Builder`', () => {
107
+ assert.equal(Builder, BuilderField)
108
+ })
109
+
110
+ it('uses `field` as the element type discriminator', () => {
111
+ assert.equal(BuilderField.make('content').getType(), 'field')
112
+ })
113
+
114
+ it('rows defaults to empty', () => {
115
+ const meta = BuilderField.make('content').toMeta()
116
+ assert.deepEqual(meta.rows, [])
117
+ assert.deepEqual(meta.blocks, [])
118
+ })
119
+
120
+ it('blocks() ships picker meta (label/icon/columns/maxItems)', () => {
121
+ const meta = BuilderField.make('content')
122
+ .blocks([
123
+ Block.make('heading').label('Heading').icon('heading').columns(2),
124
+ Block.make('paragraph').label('Paragraph').maxItems(5),
125
+ ])
126
+ .toMeta()
127
+ assert.equal(meta.blocks.length, 2)
128
+ assert.equal(meta.blocks[0]?.name, 'heading')
129
+ assert.equal(meta.blocks[0]?.label, 'Heading')
130
+ assert.equal(meta.blocks[0]?.icon, 'heading')
131
+ assert.equal(meta.blocks[0]?.columns, 2)
132
+ assert.equal(meta.blocks[1]?.maxItems, 5)
133
+ })
134
+
135
+ describe('builders', () => {
136
+ it('minItems() / maxItems() emit only when set', () => {
137
+ const empty = BuilderField.make('x').toMeta()
138
+ assert.equal('minItems' in empty, false)
139
+ assert.equal('maxItems' in empty, false)
140
+
141
+ const set = BuilderField.make('x').minItems(1).maxItems(10).toMeta()
142
+ assert.equal(set.minItems, 1)
143
+ assert.equal(set.maxItems, 10)
144
+ })
145
+
146
+ it('reorderable() / collapsible() / cloneable() / collapsed() / blockNumbers() / itemNumbers() / blockIcons(false) flip flags', () => {
147
+ const meta = BuilderField.make('x')
148
+ .reorderable()
149
+ .reorderableWithButtons()
150
+ .collapsible()
151
+ .collapsed()
152
+ .cloneable()
153
+ .blockNumbers()
154
+ .itemNumbers()
155
+ .blockIcons(false)
156
+ .toMeta()
157
+ assert.equal(meta.reorderable, true)
158
+ assert.equal(meta.reorderableWithButtons, true)
159
+ assert.equal(meta.collapsible, true)
160
+ assert.equal(meta.defaultCollapsed, true)
161
+ assert.equal(meta.cloneable, true)
162
+ assert.equal(meta.blockNumbers, true)
163
+ assert.equal(meta.itemNumbers, true)
164
+ assert.equal(meta.blockIcons, false)
165
+ })
166
+
167
+ it('accordion() emits only when set, auto-arms collapsible', () => {
168
+ assert.equal('accordion' in BuilderField.make('x').toMeta(), false)
169
+ const meta = BuilderField.make('x').accordion().toMeta()
170
+ assert.equal(meta.accordion, true)
171
+ assert.equal(meta.collapsible, true)
172
+ assert.equal(BuilderField.make('x').accordion().isAccordion(), true)
173
+ assert.equal(BuilderField.make('x').accordion().isCollapsible(), true)
174
+ })
175
+
176
+ it('accordion() composes with collapsed() to start all-collapsed', () => {
177
+ const meta = BuilderField.make('x').accordion().collapsed().toMeta()
178
+ assert.equal(meta.accordion, true)
179
+ assert.equal(meta.collapsible, true)
180
+ assert.equal(meta.defaultCollapsed, true)
181
+ })
182
+
183
+ it('accordion(false) leaves collapsible alone and isAccordion() reflects setter', () => {
184
+ const meta = BuilderField.make('x').collapsible().accordion(false).toMeta()
185
+ assert.equal(meta.collapsible, true)
186
+ assert.equal('accordion' in meta, false)
187
+ assert.equal(BuilderField.make('x').isAccordion(), false)
188
+ assert.equal(BuilderField.make('x').accordion().isAccordion(), true)
189
+ assert.equal(BuilderField.make('x').accordion(false).isAccordion(), false)
190
+ })
191
+
192
+ it('addable(false) / deletable(false) emit only when off', () => {
193
+ const on = BuilderField.make('x').toMeta()
194
+ assert.equal('addable' in on, false)
195
+ assert.equal('deletable' in on, false)
196
+ const off = BuilderField.make('x').addable(false).deletable(false).toMeta()
197
+ assert.equal(off.addable, false)
198
+ assert.equal(off.deletable, false)
199
+ })
200
+
201
+ it('addBetween() emits only when set', () => {
202
+ const off = BuilderField.make('x').toMeta()
203
+ assert.equal('addBetween' in off, false)
204
+ assert.equal(BuilderField.make('x').isAddBetween(), false)
205
+ const on = BuilderField.make('x').addBetween().toMeta()
206
+ assert.equal(on.addBetween, true)
207
+ assert.equal(BuilderField.make('x').addBetween().isAddBetween(), true)
208
+ // Toggleable back off.
209
+ const back = BuilderField.make('x').addBetween().addBetween(false).toMeta()
210
+ assert.equal('addBetween' in back, false)
211
+ })
212
+
213
+ it('addActionAlignment defaults to start (omitted) and emits when changed', () => {
214
+ assert.equal('addActionAlignment' in BuilderField.make('x').toMeta(), false)
215
+ const center = BuilderField.make('x').addActionAlignment('center').toMeta()
216
+ assert.equal(center.addActionAlignment, 'center')
217
+ })
218
+
219
+ it('blockPickerColumns() emits only when set', () => {
220
+ assert.equal('blockPickerColumns' in BuilderField.make('x').toMeta(), false)
221
+ assert.equal(BuilderField.make('x').blockPickerColumns(2).toMeta().blockPickerColumns, 2)
222
+ })
223
+
224
+ it('addActionLabel() emits only when set', () => {
225
+ assert.equal('addActionLabel' in BuilderField.make('x').toMeta(), false)
226
+ assert.equal(
227
+ BuilderField.make('x').addActionLabel('Add block').toMeta().addActionLabel,
228
+ 'Add block',
229
+ )
230
+ })
231
+
232
+ it('itemHidden() / itemLabel() store the rule (evaluated per row at resolve)', () => {
233
+ const labelFn = (data: Record<string, unknown>) => String(data['text'] ?? '')
234
+ const hiddenFn = () => false
235
+ const f = BuilderField.make('x').itemLabel(labelFn).itemHidden(hiddenFn)
236
+ assert.equal(f.getItemLabel(), labelFn)
237
+ assert.equal(f.getItemHidden(), hiddenFn)
238
+ })
239
+
240
+ it('grid() emits only when set with n >= 2', () => {
241
+ // Mirrors RepeaterField.grid() — same semantics, same threshold.
242
+ // n < 2 acts as the off sentinel so users can toggle via a config
243
+ // value without a separate "no-grid" branch.
244
+ assert.equal('grid' in BuilderField.make('x').toMeta(), false)
245
+ assert.equal(BuilderField.make('x').grid(2).toMeta().grid, 2)
246
+ assert.equal('grid' in BuilderField.make('x').grid(1).toMeta(), false)
247
+ assert.equal('grid' in BuilderField.make('x').grid(0).toMeta(), false)
248
+ assert.equal(
249
+ BuilderField.make('x').grid(0).grid(3).toMeta().grid,
250
+ 3,
251
+ )
252
+ })
253
+
254
+ it('getGrid() reflects the setter', () => {
255
+ assert.equal(BuilderField.make('x').getGrid(), undefined)
256
+ assert.equal(BuilderField.make('x').grid(2).getGrid(), 2)
257
+ assert.equal(BuilderField.make('x').grid(2).grid(1).getGrid(), undefined)
258
+ })
259
+
260
+ it('grid() accepts a responsive object form (mirrors RepeaterField)', () => {
261
+ const meta = BuilderField.make('x')
262
+ .grid({ default: 1, md: 2, xl: 3 })
263
+ .toMeta()
264
+ assert.deepEqual(meta.grid, { default: 1, md: 2, xl: 3 })
265
+ })
266
+
267
+ it('grid() collapses single-default responsive object to scalar', () => {
268
+ const meta = BuilderField.make('x').grid({ default: 3 }).toMeta()
269
+ assert.equal(meta.grid, 3)
270
+ })
271
+ })
272
+
273
+ // ─── Resolution ───────────────────────────────────────────
274
+
275
+ describe('per-row resolve', () => {
276
+ function builder() {
277
+ return BuilderField.make('content').blocks([
278
+ Block.make('heading').schema([TextField.make('text')]),
279
+ Block.make('paragraph').schema([TextField.make('body'), ToggleField.make('emphasized')]),
280
+ ])
281
+ }
282
+
283
+ function metaOf(m: unknown): BuilderFieldMeta {
284
+ return m as BuilderFieldMeta
285
+ }
286
+
287
+ it('zero submitted rows → empty rows array', async () => {
288
+ const [raw] = await resolveSchema([builder()])
289
+ const m = metaOf(raw)
290
+ assert.deepEqual(m.rows, [])
291
+ assert.equal(m.blocks.length, 2)
292
+ })
293
+
294
+ it('rows resolve against the matching block schema (heterogeneous)', async () => {
295
+ const [raw] = await resolveSchema([builder()], {
296
+ values: { content: [
297
+ { type: 'heading', data: { text: 'Welcome' } },
298
+ { type: 'paragraph', data: { body: 'Hello', emphasized: true } },
299
+ ] },
300
+ })
301
+ const m = metaOf(raw)
302
+ assert.equal(m.rows.length, 2)
303
+ assert.equal(m.rows[0]?.type, 'heading')
304
+ assert.equal(m.rows[1]?.type, 'paragraph')
305
+ assert.equal(m.rows[0]?.children.length, 1) // heading has 1 field
306
+ assert.equal(m.rows[1]?.children.length, 2) // paragraph has 2 fields
307
+ })
308
+
309
+ it('preserves __id from submitted row values', async () => {
310
+ const [raw] = await resolveSchema([builder()], {
311
+ values: { content: [{ __id: 'row-abc', type: 'heading', data: { text: 'X' } }] },
312
+ })
313
+ const m = metaOf(raw)
314
+ assert.equal(m.rows[0]?.id, 'row-abc')
315
+ })
316
+
317
+ it('falls back to deterministic id when __id missing', async () => {
318
+ const [raw] = await resolveSchema([builder()], {
319
+ values: { content: [{ type: 'heading', data: {} }, { type: 'paragraph', data: {} }] },
320
+ })
321
+ const m = metaOf(raw)
322
+ assert.equal(m.rows[0]?.id, 'content-0')
323
+ assert.equal(m.rows[1]?.id, 'content-1')
324
+ })
325
+
326
+ it('Block.visible() drops hidden blocks from picker meta only', async () => {
327
+ const f = BuilderField.make('content').blocks([
328
+ Block.make('heading').schema([TextField.make('text')]),
329
+ Block.make('admin')
330
+ .visible(({ user }) => (user as { role?: string } | undefined)?.role === 'admin')
331
+ .schema([TextField.make('secret')]),
332
+ ])
333
+ const [rawGuest] = await resolveSchema([f], { user: { role: 'guest' } })
334
+ const mGuest = metaOf(rawGuest)
335
+ assert.equal(mGuest.blocks.length, 1)
336
+ assert.equal(mGuest.blocks[0]?.name, 'heading')
337
+
338
+ const [rawAdmin] = await resolveSchema([f], { user: { role: 'admin' } })
339
+ const mAdmin = metaOf(rawAdmin)
340
+ assert.equal(mAdmin.blocks.length, 2)
341
+ })
342
+
343
+ it('Block.visible() does NOT hide existing rows of a hidden block', async () => {
344
+ // Toggling a feature flag must never silently destroy stored content.
345
+ const f = BuilderField.make('content').blocks([
346
+ Block.make('heading').schema([TextField.make('text')]),
347
+ Block.make('admin').visible(false).schema([TextField.make('secret')]),
348
+ ])
349
+ const [raw] = await resolveSchema([f], {
350
+ values: { content: [
351
+ { type: 'heading', data: { text: 'A' } },
352
+ { type: 'admin', data: { secret: 'shh' } },
353
+ ] },
354
+ })
355
+ const m = metaOf(raw)
356
+ assert.equal(m.blocks.length, 1, 'picker drops admin')
357
+ assert.equal(m.rows.length, 2, 'rows still render')
358
+ assert.equal(m.rows[1]?.type, 'admin')
359
+ assert.equal(m.rows[1]?.children.length, 1, 'admin row inner schema resolves')
360
+ })
361
+
362
+ it('unknown block type → unknownType:true with empty children', async () => {
363
+ const [raw] = await resolveSchema([builder()], {
364
+ values: { content: [{ type: 'mysterious', data: { stuff: 42 } }] },
365
+ })
366
+ const m = metaOf(raw)
367
+ assert.equal(m.rows[0]?.unknownType, true)
368
+ assert.equal(m.rows[0]?.type, 'mysterious')
369
+ assert.deepEqual(m.rows[0]?.children, [])
370
+ })
371
+
372
+ it('row-scoped $get reads the row\'s data only', async () => {
373
+ let captured: unknown
374
+ const f = BuilderField.make('content').blocks([
375
+ Block.make('heading').schema([
376
+ TextField.make('text').showWhen(({ $get, row }) => {
377
+ if (row) captured = $get?.('text')
378
+ return true
379
+ }),
380
+ ]),
381
+ ])
382
+ await resolveSchema([f], {
383
+ values: { content: [{ type: 'heading', data: { text: 'fromRow' } }] },
384
+ })
385
+ assert.equal(captured, 'fromRow')
386
+ })
387
+
388
+ it('ctx.row.index reflects the row position', async () => {
389
+ const seen: number[] = []
390
+ const f = BuilderField.make('content').blocks([
391
+ Block.make('heading').schema([
392
+ TextField.make('text').showWhen(({ row }) => {
393
+ if (row) seen.push(row.index)
394
+ return true
395
+ }),
396
+ ]),
397
+ ])
398
+ await resolveSchema([f], {
399
+ values: { content: [
400
+ { type: 'heading', data: {} },
401
+ { type: 'heading', data: {} },
402
+ { type: 'heading', data: {} },
403
+ ] },
404
+ })
405
+ assert.deepEqual(seen, [0, 1, 2])
406
+ })
407
+
408
+ it('itemLabel(data, blockName) lands on row.itemLabel', async () => {
409
+ const f = BuilderField.make('content')
410
+ .blocks([Block.make('heading').schema([TextField.make('text')])])
411
+ .itemLabel((data, blockName) => `${blockName}: ${String(data['text'] ?? '')}`)
412
+ const [raw] = await resolveSchema([f], {
413
+ values: { content: [{ type: 'heading', data: { text: 'Welcome' } }] },
414
+ })
415
+ const m = metaOf(raw)
416
+ assert.equal(m.rows[0]?.itemLabel, 'heading: Welcome')
417
+ })
418
+
419
+ it('itemHidden() truthy stamps row.hidden=true', async () => {
420
+ const f = BuilderField.make('content')
421
+ .blocks([Block.make('heading').schema([TextField.make('text')])])
422
+ .itemHidden(({ values }) => (values as Record<string, unknown>)['text'] === 'skip')
423
+ const [raw] = await resolveSchema([f], {
424
+ values: { content: [
425
+ { type: 'heading', data: { text: 'show' } },
426
+ { type: 'heading', data: { text: 'skip' } },
427
+ ] },
428
+ })
429
+ const m = metaOf(raw)
430
+ assert.equal(m.rows[0]?.hidden, undefined)
431
+ assert.equal(m.rows[1]?.hidden, true)
432
+ })
433
+ })
434
+
435
+ describe('itemCanDelete / itemCanClone / itemCanReorder (per-row capability gates)', () => {
436
+ function builder() {
437
+ return BuilderField.make('content').blocks([
438
+ Block.make('heading').schema([TextField.make('text')]),
439
+ Block.make('paragraph').schema([TextField.make('body')]),
440
+ ])
441
+ }
442
+
443
+ function metaOf(m: unknown): BuilderFieldMeta {
444
+ return m as BuilderFieldMeta
445
+ }
446
+
447
+ it('builders store + return their rules', () => {
448
+ const del = (_ctx: unknown) => true
449
+ const clone = (_ctx: unknown) => true
450
+ const reorder = (_ctx: unknown) => true
451
+ const f = BuilderField.make('content')
452
+ .itemCanDelete(del as never)
453
+ .itemCanClone(clone as never)
454
+ .itemCanReorder(reorder as never)
455
+ assert.equal(f.getItemCanDelete(), del)
456
+ assert.equal(f.getItemCanClone(), clone)
457
+ assert.equal(f.getItemCanReorder(), reorder)
458
+ })
459
+
460
+ it('rules unset → no row carries cap flags', async () => {
461
+ const [raw] = await resolveSchema([builder()], {
462
+ values: { content: [{ type: 'heading', data: { text: 'A' } }] },
463
+ })
464
+ const m = metaOf(raw)
465
+ assert.equal(m.rows[0]?.canDelete, undefined)
466
+ assert.equal(m.rows[0]?.canClone, undefined)
467
+ assert.equal(m.rows[0]?.canReorder, undefined)
468
+ })
469
+
470
+ it('static `itemCanDelete(false)` → every row stamps canDelete: false', async () => {
471
+ const f = builder().itemCanDelete(false)
472
+ const [raw] = await resolveSchema([f], {
473
+ values: { content: [
474
+ { type: 'heading', data: { text: 'A' } },
475
+ { type: 'paragraph', data: { body: 'B' } },
476
+ ] },
477
+ })
478
+ const m = metaOf(raw)
479
+ assert.equal(m.rows[0]?.canDelete, false)
480
+ assert.equal(m.rows[1]?.canDelete, false)
481
+ })
482
+
483
+ it('predicate sees row.blockType so a single rule can branch by block', async () => {
484
+ const f = builder().itemCanDelete(({ row }) => row?.blockType !== 'heading')
485
+ const [raw] = await resolveSchema([f], {
486
+ values: { content: [
487
+ { type: 'heading', data: { text: 'A' } },
488
+ { type: 'paragraph', data: { body: 'B' } },
489
+ ] },
490
+ })
491
+ const m = metaOf(raw)
492
+ assert.equal(m.rows[0]?.canDelete, false)
493
+ assert.equal(m.rows[1]?.canDelete, undefined)
494
+ })
495
+
496
+ it('itemCanClone gates clone per-row', async () => {
497
+ const f = builder()
498
+ .cloneable()
499
+ .itemCanClone(({ row }) => row?.index !== 0)
500
+ const [raw] = await resolveSchema([f], {
501
+ values: { content: [
502
+ { type: 'heading', data: { text: 'A' } },
503
+ { type: 'paragraph', data: { body: 'B' } },
504
+ ] },
505
+ })
506
+ const m = metaOf(raw)
507
+ assert.equal(m.rows[0]?.canClone, false)
508
+ assert.equal(m.rows[1]?.canClone, undefined)
509
+ })
510
+
511
+ it('itemCanReorder gates reorder controls per-row', async () => {
512
+ const f = builder()
513
+ .reorderable()
514
+ .itemCanReorder(({ values }) => (values as Record<string, unknown>)['text'] !== 'pinned')
515
+ const [raw] = await resolveSchema([f], {
516
+ values: { content: [
517
+ { type: 'heading', data: { text: 'free' } },
518
+ { type: 'heading', data: { text: 'pinned' } },
519
+ ] },
520
+ })
521
+ const m = metaOf(raw)
522
+ assert.equal(m.rows[0]?.canReorder, undefined)
523
+ assert.equal(m.rows[1]?.canReorder, false)
524
+ })
525
+
526
+ it('async predicate is awaited', async () => {
527
+ const f = builder().itemCanDelete(async ({ row }) => {
528
+ await Promise.resolve()
529
+ return row?.index !== 0
530
+ })
531
+ const [raw] = await resolveSchema([f], {
532
+ values: { content: [
533
+ { type: 'heading', data: { text: 'A' } },
534
+ { type: 'paragraph', data: { body: 'B' } },
535
+ ] },
536
+ })
537
+ const m = metaOf(raw)
538
+ assert.equal(m.rows[0]?.canDelete, false)
539
+ assert.equal(m.rows[1]?.canDelete, undefined)
540
+ })
541
+
542
+ it('throwing predicate → capability stays enabled (fail-open) + warns', async () => {
543
+ const original = console.warn
544
+ const warnings: unknown[][] = []
545
+ console.warn = (...args: unknown[]) => { warnings.push(args) }
546
+ try {
547
+ const f = builder().itemCanReorder(() => { throw new Error('boom') })
548
+ const [raw] = await resolveSchema([f], {
549
+ values: { content: [{ type: 'heading', data: { text: 'A' } }] },
550
+ })
551
+ const m = metaOf(raw)
552
+ assert.equal(m.rows[0]?.canReorder, undefined)
553
+ assert.ok(warnings.length >= 1, 'expected at least one warning')
554
+ assert.match(String(warnings[0]?.[0]), /itemCanReorder\(\) on Builder "content" threw/)
555
+ } finally {
556
+ console.warn = original
557
+ }
558
+ })
559
+ })
560
+
561
+ // Live-reactive gate flow mirrors Repeater's. The renderer-side sync (in
562
+ // `BuilderInput`) is unit-tested in `react/fields/syncRowGates.test.ts`.
563
+ describe('reactive `itemHidden / itemCan*` (Form.live re-resolve)', () => {
564
+ function builder() {
565
+ return BuilderField.make('content').blocks([
566
+ Block.make('heading').schema([TextField.make('text')]),
567
+ Block.make('paragraph').schema([TextField.make('body')]),
568
+ ])
569
+ }
570
+
571
+ function metaOf(m: unknown): BuilderFieldMeta {
572
+ return m as BuilderFieldMeta
573
+ }
574
+
575
+ it('a row\'s value flip re-evaluates its itemHidden on the next resolve', async () => {
576
+ const f = builder().itemHidden(({ values }) => (values as Record<string, unknown>)['text'] === 'skip')
577
+
578
+ const before = metaOf((await resolveSchema([f], {
579
+ values: { content: [{ type: 'heading', data: { text: 'keep' } }] },
580
+ }))[0])
581
+ assert.equal(before.rows[0]?.hidden, undefined)
582
+
583
+ const after = metaOf((await resolveSchema([f], {
584
+ values: { content: [{ type: 'heading', data: { text: 'skip' } }] },
585
+ }))[0])
586
+ assert.equal(after.rows[0]?.hidden, true)
587
+ })
588
+
589
+ it('a row-scoped value flip re-evaluates that row\'s itemCanDelete', async () => {
590
+ const f = builder().itemCanDelete(({ values }) => (values as Record<string, unknown>)['text'] !== 'locked')
591
+
592
+ const before = metaOf((await resolveSchema([f], {
593
+ values: { content: [{ type: 'heading', data: { text: 'free' } }] },
594
+ }))[0])
595
+ assert.equal(before.rows[0]?.canDelete, undefined)
596
+
597
+ const after = metaOf((await resolveSchema([f], {
598
+ values: { content: [{ type: 'heading', data: { text: 'locked' } }] },
599
+ }))[0])
600
+ assert.equal(after.rows[0]?.canDelete, false)
601
+ })
602
+
603
+ it('a row\'s value flip re-evaluates its itemLabel', async () => {
604
+ const f = builder().itemLabel((data) => String((data as Record<string, unknown>)['text'] ?? 'Untitled'))
605
+
606
+ const before = metaOf((await resolveSchema([f], {
607
+ values: { content: [{ type: 'heading', data: { text: 'Hello' } }] },
608
+ }))[0])
609
+ assert.equal(before.rows[0]?.itemLabel, 'Hello')
610
+
611
+ const after = metaOf((await resolveSchema([f], {
612
+ values: { content: [{ type: 'heading', data: { text: 'World' } }] },
613
+ }))[0])
614
+ assert.equal(after.rows[0]?.itemLabel, 'World')
615
+ })
616
+
617
+ it('a row\'s value flip re-evaluates its extraItemActions visibility', async () => {
618
+ const promote = Action.make('promote').label('Promote').visible(({ values }) => (values as Record<string, unknown>)?.['text'] === 'ready')
619
+ const f = builder().extraItemActions([promote])
620
+
621
+ const before = metaOf((await resolveSchema([f], {
622
+ values: { content: [{ type: 'heading', data: { text: 'draft' } }] },
623
+ }))[0])
624
+ assert.equal(before.rows[0]?.extraActions, undefined)
625
+
626
+ const after = metaOf((await resolveSchema([f], {
627
+ values: { content: [{ type: 'heading', data: { text: 'ready' } }] },
628
+ }))[0])
629
+ assert.equal(after.rows[0]?.extraActions?.length, 1)
630
+ })
631
+ })
632
+
633
+ // ─── Coercion ─────────────────────────────────────────────
634
+
635
+ describe('coerceFormValues', () => {
636
+ function builder() {
637
+ return BuilderField.make('content').blocks([
638
+ Block.make('heading').schema([TextField.make('text')]),
639
+ Block.make('counter').schema([NumberField.make('count'), ToggleField.make('on')]),
640
+ ])
641
+ }
642
+
643
+ it('JSON shape — array round-trips with inner-field coercion', () => {
644
+ const out = coerceFormValues([builder()], {
645
+ content: [
646
+ { __id: 'a', type: 'heading', data: { text: 'X' } },
647
+ { type: 'counter', data: { count: '5', on: 'on' } },
648
+ ],
649
+ })
650
+ assert.deepEqual(out['content'], [
651
+ { __id: 'a', type: 'heading', data: { text: 'X' } },
652
+ { type: 'counter', data: { count: 5, on: true } },
653
+ ])
654
+ })
655
+
656
+ it('flat-key shape — folds into {type, data} envelopes', () => {
657
+ const out = coerceFormValues([builder()], {
658
+ 'content.0.__id': 'row-a',
659
+ 'content.0.type': 'heading',
660
+ 'content.0.data.text': 'Hello',
661
+ 'content.1.type': 'counter',
662
+ 'content.1.data.count': '3',
663
+ 'content.1.data.on': 'on',
664
+ })
665
+ assert.deepEqual(out['content'], [
666
+ { __id: 'row-a', type: 'heading', data: { text: 'Hello' } },
667
+ { type: 'counter', data: { count: 3, on: true } },
668
+ ])
669
+ assert.equal(out['content.0.type'], undefined) // flat keys cleaned up
670
+ })
671
+
672
+ it('trailing empty rows trimmed (data with no entered values)', () => {
673
+ const out = coerceFormValues([builder()], {
674
+ content: [
675
+ { type: 'heading', data: { text: 'A' } },
676
+ { type: 'heading', data: { text: '' } },
677
+ { type: 'heading', data: { text: '' } },
678
+ ],
679
+ })
680
+ // Trailing empties trimmed. The non-empty first row stays.
681
+ assert.equal((out['content'] as unknown[]).length, 1)
682
+ })
683
+
684
+ it('keeps a non-empty trailing row even with empty siblings', () => {
685
+ const out = coerceFormValues([builder()], {
686
+ content: [
687
+ { type: 'heading', data: { text: '' } },
688
+ { type: 'heading', data: { text: 'kept' } },
689
+ ],
690
+ })
691
+ // Only trailing emptiness trims; the first empty row survives the trim.
692
+ assert.equal((out['content'] as unknown[]).length, 2)
693
+ })
694
+
695
+ it('unknown block type — data passes through verbatim', () => {
696
+ const out = coerceFormValues([builder()], {
697
+ content: [{ type: 'mysterious', data: { stuff: 'preserved' } }],
698
+ })
699
+ assert.deepEqual(out['content'], [
700
+ { type: 'mysterious', data: { stuff: 'preserved' } },
701
+ ])
702
+ })
703
+
704
+ it('non-object row entries → empty rows preserved at non-trailing positions', () => {
705
+ const out = coerceFormValues([builder()], {
706
+ content: [null, 'oops', { type: 'heading', data: { text: 'real' } }],
707
+ })
708
+ const arr = out['content'] as Array<Record<string, unknown>>
709
+ // Non-object entries normalize to `{ type: '', data: {} }`. Only
710
+ // trailing empties trim, so the two empties at positions 0 and 1
711
+ // survive and the real row anchors them.
712
+ assert.equal(arr.length, 3)
713
+ assert.equal(arr[0]?.['type'], '')
714
+ assert.equal(arr[2]?.['type'], 'heading')
715
+ })
716
+ })
717
+
718
+ // ─── Validation ───────────────────────────────────────────
719
+
720
+ describe('validateSchema', () => {
721
+ function builder() {
722
+ return BuilderField.make('content')
723
+ .blocks([
724
+ Block.make('heading').schema([TextField.make('text').required()]),
725
+ Block.make('paragraph').schema([TextField.make('body').required()]),
726
+ ])
727
+ }
728
+
729
+ it('inner required → error keyed name.<i>.data.<child>', async () => {
730
+ const errors = await validateSchema([builder()], {
731
+ content: [{ type: 'heading', data: { text: '' } }],
732
+ })
733
+ assert.ok(errors['content.0.data.text'])
734
+ assert.equal(isValid(errors), false)
735
+ })
736
+
737
+ it('minItems violated → bare-key error', async () => {
738
+ const errors = await validateSchema([builder().minItems(2)], {
739
+ content: [{ type: 'heading', data: { text: 'A' } }],
740
+ })
741
+ assert.ok(errors['content']?.some(e => e.includes('At least 2')))
742
+ })
743
+
744
+ it('maxItems violated → bare-key error', async () => {
745
+ const errors = await validateSchema([builder().maxItems(1)], {
746
+ content: [
747
+ { type: 'heading', data: { text: 'A' } },
748
+ { type: 'paragraph', data: { body: 'B' } },
749
+ ],
750
+ })
751
+ assert.ok(errors['content']?.some(e => e.includes('At most 1')))
752
+ })
753
+
754
+ it('Block.maxItems violated → bare-key error mentioning block label', async () => {
755
+ const f = BuilderField.make('content').blocks([
756
+ Block.make('hero').label('Hero').maxItems(1).schema([TextField.make('h')]),
757
+ Block.make('p').schema([TextField.make('b')]),
758
+ ])
759
+ const errors = await validateSchema([f], {
760
+ content: [
761
+ { type: 'hero', data: { h: 'A' } },
762
+ { type: 'hero', data: { h: 'B' } },
763
+ ],
764
+ })
765
+ assert.ok(errors['content']?.some(e => e.includes('"Hero"')))
766
+ })
767
+
768
+ it('unknown block type → row-level error', async () => {
769
+ const errors = await validateSchema([builder()], {
770
+ content: [{ type: 'phantom', data: {} }],
771
+ })
772
+ assert.ok(errors['content.0']?.some(e => e.includes('Unknown')))
773
+ })
774
+
775
+ it('missing block type → row-level error', async () => {
776
+ const errors = await validateSchema([builder()], {
777
+ content: [{ type: '', data: {} }],
778
+ })
779
+ assert.ok(errors['content.0']?.some(e => e.includes('required')))
780
+ })
781
+
782
+ it('flat-key body folds + validates non-empty rows', async () => {
783
+ // Non-empty data anchors the row past the trailing-empty trim, so
784
+ // validation can run against it. (Trim semantics match Repeater:
785
+ // a row with no entered values is treated as never-created.)
786
+ const errors = await validateSchema([builder()], {
787
+ 'content.0.type': 'paragraph',
788
+ 'content.0.data.body': '', // touched-but-empty after sibling fills
789
+ // Anchor the row by adding a non-empty key inside data
790
+ 'content.0.data.body.touched': 'x',
791
+ })
792
+ // The fold puts `body` AND `body.touched` into data — the latter
793
+ // is treated as a literal string key. The row is non-empty.
794
+ // Required validation fires for body.
795
+ assert.ok(errors['content.0.data.body'])
796
+ })
797
+ })
798
+
799
+ describe('distinct() — cross-row uniqueness (per block type)', () => {
800
+ function distinctBuilder() {
801
+ return BuilderField.make('content').blocks([
802
+ Block.make('heading').schema([TextField.make('text').distinct()]),
803
+ Block.make('paragraph').schema([TextField.make('body').distinct()]),
804
+ ])
805
+ }
806
+
807
+ it('all-unique rows produce no error', async () => {
808
+ const errors = await validateSchema([distinctBuilder()], {
809
+ content: [
810
+ { type: 'heading', data: { text: 'A' } },
811
+ { type: 'heading', data: { text: 'B' } },
812
+ { type: 'paragraph', data: { body: 'A' } },
813
+ ],
814
+ })
815
+ assert.equal(isValid(errors), true)
816
+ })
817
+
818
+ it('duplicate within the same block flags the second occurrence', async () => {
819
+ const errors = await validateSchema([distinctBuilder()], {
820
+ content: [
821
+ { type: 'heading', data: { text: 'A' } },
822
+ { type: 'heading', data: { text: 'A' } },
823
+ ],
824
+ })
825
+ assert.equal('content.0.data.text' in errors, false)
826
+ assert.deepEqual(errors['content.1.data.text'], ['Must be unique'])
827
+ })
828
+
829
+ it('comparison is scoped to same block type — different blocks with the same field-name value never conflict', async () => {
830
+ // Both schemas happen to have a `text` field marked distinct (renamed
831
+ // here so the assertion is explicit). A heading block's value should
832
+ // never be compared against a paragraph block's value.
833
+ const f = BuilderField.make('content').blocks([
834
+ Block.make('heading').schema([TextField.make('val').distinct()]),
835
+ Block.make('paragraph').schema([TextField.make('val').distinct()]),
836
+ ])
837
+ const errors = await validateSchema([f], {
838
+ content: [
839
+ { type: 'heading', data: { val: 'A' } },
840
+ { type: 'paragraph', data: { val: 'A' } }, // same value, different block
841
+ ],
842
+ })
843
+ assert.equal(isValid(errors), true)
844
+ })
845
+
846
+ it('non-contiguous rows of the same type still conflict', async () => {
847
+ // heading(A) at idx 0, paragraph at idx 1, heading(A) at idx 2 → idx 2 fails.
848
+ const errors = await validateSchema([distinctBuilder()], {
849
+ content: [
850
+ { type: 'heading', data: { text: 'A' } },
851
+ { type: 'paragraph', data: { body: 'B' } },
852
+ { type: 'heading', data: { text: 'A' } },
853
+ ],
854
+ })
855
+ assert.deepEqual(errors['content.2.data.text'], ['Must be unique'])
856
+ })
857
+
858
+ it('caseInsensitive folds case before comparing', async () => {
859
+ const f = BuilderField.make('content').blocks([
860
+ Block.make('heading').schema([TextField.make('text').distinct({ caseInsensitive: true })]),
861
+ ])
862
+ const errors = await validateSchema([f], {
863
+ content: [
864
+ { type: 'heading', data: { text: 'Foo' } },
865
+ { type: 'heading', data: { text: 'foo' } },
866
+ ],
867
+ })
868
+ assert.deepEqual(errors['content.1.data.text'], ['Must be unique'])
869
+ })
870
+
871
+ it('default ignoreNulls=true skips empty values', async () => {
872
+ const errors = await validateSchema([distinctBuilder()], {
873
+ content: [
874
+ { type: 'heading', data: { text: '' } },
875
+ { type: 'heading', data: { text: '' } },
876
+ ],
877
+ })
878
+ // The required-style check isn't on this field, so empty rows pass.
879
+ assert.equal(isValid(errors), true)
880
+ })
881
+
882
+ it('custom message overrides the default', async () => {
883
+ const f = BuilderField.make('content').blocks([
884
+ Block.make('heading').schema([
885
+ TextField.make('text').distinct({ message: 'Each heading text must be unique' }),
886
+ ]),
887
+ ])
888
+ const errors = await validateSchema([f], {
889
+ content: [
890
+ { type: 'heading', data: { text: 'A' } },
891
+ { type: 'heading', data: { text: 'A' } },
892
+ ],
893
+ })
894
+ assert.deepEqual(errors['content.1.data.text'], ['Each heading text must be unique'])
895
+ })
896
+
897
+ it('unknown block rows are skipped (no crash, no false dup)', async () => {
898
+ const errors = await validateSchema([distinctBuilder()], {
899
+ content: [
900
+ { type: 'heading', data: { text: 'A' } },
901
+ { type: 'phantom', data: { text: 'A' } }, // unknown block type
902
+ ],
903
+ })
904
+ // Row 1 produces an "Unknown block type" error but no distinct error.
905
+ assert.ok(errors['content.1']?.some(e => e.includes('Unknown')))
906
+ assert.equal('content.1.data.text' in errors, false)
907
+ })
908
+ })
909
+
910
+ // ─── Live re-resolve (applyStateUpdate) ──────────────────
911
+
912
+ describe('applyStateUpdate (dotted path)', () => {
913
+ function form() {
914
+ return Form.make().schema([
915
+ BuilderField.make('content').blocks([
916
+ Block.make('heading').schema([TextField.make('text').live()]),
917
+ Block.make('counter').schema([NumberField.make('count').live()]),
918
+ ]),
919
+ ])
920
+ }
921
+
922
+ it('updates the leaf field at the dotted path', async () => {
923
+ const f = form()
924
+ const result = await applyStateUpdate(
925
+ f,
926
+ { content: [{ type: 'heading', data: { text: 'Hello' } }] },
927
+ 'content.0.data.text',
928
+ )
929
+ assert.notEqual(result, null)
930
+ const root = result!.values['content'] as Array<Record<string, unknown>>
931
+ const data = root[0]!['data'] as Record<string, unknown>
932
+ assert.equal(data['text'], 'Hello')
933
+ assert.deepEqual(result!.dirty, ['content.0.data.text'])
934
+ })
935
+
936
+ it('coerces the leaf only — sibling values untouched', async () => {
937
+ const f = form()
938
+ const result = await applyStateUpdate(
939
+ f,
940
+ { content: [{ type: 'counter', data: { count: '7' } }] },
941
+ 'content.0.data.count',
942
+ )
943
+ assert.notEqual(result, null)
944
+ const root = result!.values['content'] as Array<Record<string, unknown>>
945
+ const data = root[0]!['data'] as Record<string, unknown>
946
+ assert.equal(data['count'], 7)
947
+ })
948
+
949
+ it('routes by row.type, not field — wrong-type leaf 404s', async () => {
950
+ const f = form()
951
+ const result = await applyStateUpdate(
952
+ f,
953
+ { content: [{ type: 'heading', data: {} }] },
954
+ 'content.0.data.count', // 'count' belongs to counter, not heading
955
+ )
956
+ assert.equal(result, null)
957
+ })
958
+
959
+ it('returns null for unsupported nested array-row paths', async () => {
960
+ const f = form()
961
+ const result = await applyStateUpdate(
962
+ f,
963
+ { content: [{ type: 'heading', data: {} }] },
964
+ 'content.0.data.text.0.something',
965
+ )
966
+ assert.equal(result, null)
967
+ })
968
+
969
+ it('afterStateUpdated receives row-scoped $get + ctx.row.blockType', async () => {
970
+ let blockTypeSeen: string | undefined
971
+ let rowTextSeen: unknown
972
+ const f = Form.make().schema([
973
+ BuilderField.make('content').blocks([
974
+ Block.make('heading').schema([
975
+ TextField.make('text').live(),
976
+ TextField.make('subtitle').live().afterStateUpdated((value, ctx) => {
977
+ void value
978
+ if (ctx.row) {
979
+ blockTypeSeen = ctx.row.blockType
980
+ rowTextSeen = ctx.row.$get('text')
981
+ }
982
+ }),
983
+ ]),
984
+ ]),
985
+ ])
986
+ await applyStateUpdate(
987
+ f,
988
+ { content: [{ type: 'heading', data: { text: 'Existing', subtitle: 'New' } }] },
989
+ 'content.0.data.subtitle',
990
+ )
991
+ assert.equal(blockTypeSeen, 'heading')
992
+ assert.equal(rowTextSeen, 'Existing')
993
+ })
994
+ })
995
+
996
+ // ─── Walkers stop at Builder boundary ────────────────────
997
+
998
+ describe('walker boundaries', () => {
999
+ it('findForms does not recurse into Builder rows', () => {
1000
+ const inner = Form.make().schema([TextField.make('inner')])
1001
+ const outer = Form.make().schema([
1002
+ BuilderField.make('content').blocks([
1003
+ Block.make('h').schema([inner as unknown as TextField]), // intentional misuse
1004
+ ]),
1005
+ ])
1006
+ const forms = findForms([outer])
1007
+ assert.equal(forms.length, 1)
1008
+ assert.equal(forms[0], outer)
1009
+ })
1010
+
1011
+ it('findActions does not recurse into Builder rows', () => {
1012
+ const innerAction = Action.make('inner-action').handler(() => {})
1013
+ const outer = BuilderField.make('content').blocks([
1014
+ Block.make('h').schema([innerAction as unknown as TextField]),
1015
+ ])
1016
+ assert.deepEqual(findActions([outer]), [])
1017
+ })
1018
+
1019
+ it('findTables does not recurse into Builder rows', () => {
1020
+ const innerTable = Table.make().columns([])
1021
+ const outer = BuilderField.make('content').blocks([
1022
+ Block.make('h').schema([innerTable as unknown as TextField]),
1023
+ ])
1024
+ assert.deepEqual(findTables([outer]), [])
1025
+ })
1026
+
1027
+ it('isBuilderField structural check', () => {
1028
+ assert.equal(isBuilderField(BuilderField.make('x')), true)
1029
+ assert.equal(isBuilderField(RepeaterField.make('x')), false)
1030
+ assert.equal(isBuilderField(TextField.make('x')), false)
1031
+ assert.equal(isBuilderField(Section.make('x')), false)
1032
+ })
1033
+
1034
+ it('isBuilderField narrow check passes structural shape (Vite SSR safety)', () => {
1035
+ // Simulates a duplicate-module-cache copy: a plain object whose
1036
+ // discriminators match. The structural check should still catch it.
1037
+ const fake = { getType: () => 'field', fieldType: 'builder' }
1038
+ assert.equal(isBuilderField(fake), true)
1039
+ })
1040
+ })
1041
+
1042
+ describe('extraItemActions (per-row buttons)', () => {
1043
+ it('builder stores extra actions; getter returns them', () => {
1044
+ const a = Action.make('promote').handler(() => undefined)
1045
+ const f = BuilderField.make('content').extraItemActions([a])
1046
+ assert.deepEqual(f.getExtraItemActions(), [a])
1047
+ })
1048
+
1049
+ it('per-row resolve stamps extraActions on each row', async () => {
1050
+ const promote = Action.make('promote').handler(() => undefined)
1051
+ const f = BuilderField.make('content')
1052
+ .blocks([
1053
+ Block.make('heading').schema([TextField.make('text')]),
1054
+ ])
1055
+ .extraItemActions([promote])
1056
+
1057
+ const [meta] = await resolveSchema([f], { values: { content: [
1058
+ { type: 'heading', data: { text: 'A' } },
1059
+ { type: 'heading', data: { text: 'B' } },
1060
+ ] } })
1061
+ const builder = meta as BuilderFieldMeta
1062
+ assert.equal(builder.rows.length, 2)
1063
+ assert.equal(builder.rows[0]!.extraActions?.length, 1)
1064
+ assert.equal(builder.rows[1]!.extraActions?.length, 1)
1065
+ })
1066
+
1067
+ it('predicate sees row data via ctx.values', async () => {
1068
+ const seen: Array<Record<string, unknown> | undefined> = []
1069
+ const a = Action.make('a')
1070
+ .handler(() => undefined)
1071
+ .visible(({ values }) => { seen.push(values); return true })
1072
+ const f = BuilderField.make('content')
1073
+ .blocks([Block.make('heading').schema([TextField.make('text')])])
1074
+ .extraItemActions([a])
1075
+
1076
+ await resolveSchema([f], { values: { content: [
1077
+ { type: 'heading', data: { text: 'foo' } },
1078
+ ] } })
1079
+ assert.deepEqual(seen, [{ text: 'foo' }])
1080
+ })
1081
+
1082
+ it('unknown-type rows skip extraActions resolve (no row context)', async () => {
1083
+ const promote = Action.make('promote').handler(() => undefined)
1084
+ const f = BuilderField.make('content')
1085
+ .blocks([Block.make('heading').schema([TextField.make('text')])])
1086
+ .extraItemActions([promote])
1087
+
1088
+ const [meta] = await resolveSchema([f], { values: { content: [
1089
+ { type: 'mystery', data: { foo: 'bar' } },
1090
+ ] } })
1091
+ const builder = meta as BuilderFieldMeta
1092
+ assert.equal(builder.rows[0]!.unknownType, true)
1093
+ assert.equal(builder.rows[0]!.extraActions, undefined)
1094
+ })
1095
+ })
1096
+
1097
+ describe('relationship(...) — setter / getter / meta', () => {
1098
+ it('string form stores the relationship name', () => {
1099
+ const f = BuilderField.make('content')
1100
+ .relationship('blocks')
1101
+ .blocks([Block.make('heading').schema([TextField.make('text')])])
1102
+ const cfg = f.getRelationship()
1103
+ assert.equal(f.isRelationship(), true)
1104
+ assert.equal(cfg?.name, 'blocks')
1105
+ assert.equal(cfg?.model, undefined)
1106
+ assert.equal(cfg?.foreignKey, undefined)
1107
+ assert.equal(cfg?.typeColumn, undefined)
1108
+ assert.equal(cfg?.dataColumn, undefined)
1109
+ assert.equal(cfg?.orderColumn, undefined)
1110
+ })
1111
+
1112
+ it('object form copies all explicit overrides verbatim', () => {
1113
+ const f = BuilderField.make('content')
1114
+ .relationship({
1115
+ name: 'blocks',
1116
+ foreignKey: 'pageId',
1117
+ typeColumn: 'kind',
1118
+ dataColumn: 'payload',
1119
+ orderColumn: 'sort',
1120
+ })
1121
+ .blocks([Block.make('heading').schema([TextField.make('text')])])
1122
+ const cfg = f.getRelationship()
1123
+ assert.equal(cfg?.name, 'blocks')
1124
+ assert.equal(cfg?.foreignKey, 'pageId')
1125
+ assert.equal(cfg?.typeColumn, 'kind')
1126
+ assert.equal(cfg?.dataColumn, 'payload')
1127
+ assert.equal(cfg?.orderColumn, 'sort')
1128
+ })
1129
+
1130
+ it('orderColumn() sugar sets the order column when relationship is configured', () => {
1131
+ const f = BuilderField.make('content')
1132
+ .relationship('blocks')
1133
+ .orderColumn('sort')
1134
+ .blocks([Block.make('heading').schema([TextField.make('text')])])
1135
+ assert.equal(f.getRelationship()?.orderColumn, 'sort')
1136
+ })
1137
+
1138
+ it('orderColumn() throws when relationship() not called first', () => {
1139
+ assert.throws(
1140
+ () => BuilderField.make('content').orderColumn('sort'),
1141
+ /requires relationship\(\) to be configured first/,
1142
+ )
1143
+ })
1144
+
1145
+ it('relationship() is incompatible with dehydrated(false)', () => {
1146
+ assert.throws(
1147
+ () => BuilderField.make('content').dehydrated(false).relationship('blocks'),
1148
+ /incompatible with dehydrated\(false\)/,
1149
+ )
1150
+ })
1151
+
1152
+ it('toMeta serializes relationship under meta.relationship — only name when no overrides', () => {
1153
+ const meta = BuilderField.make('content')
1154
+ .relationship('blocks')
1155
+ .blocks([Block.make('heading').schema([TextField.make('text')])])
1156
+ .toMeta() as BuilderFieldMeta
1157
+ assert.deepEqual(meta.relationship, { name: 'blocks' })
1158
+ })
1159
+
1160
+ it('toMeta omits server-only model + foreignKey, preserves typeColumn / dataColumn / orderColumn', () => {
1161
+ const meta = BuilderField.make('content')
1162
+ .relationship({
1163
+ name: 'blocks',
1164
+ foreignKey: 'pageId',
1165
+ typeColumn: 'kind',
1166
+ dataColumn: 'payload',
1167
+ orderColumn: 'sort',
1168
+ })
1169
+ .blocks([Block.make('heading').schema([TextField.make('text')])])
1170
+ .toMeta() as BuilderFieldMeta
1171
+ assert.deepEqual(meta.relationship, {
1172
+ name: 'blocks',
1173
+ typeColumn: 'kind',
1174
+ dataColumn: 'payload',
1175
+ orderColumn: 'sort',
1176
+ })
1177
+ assert.equal('model' in (meta.relationship as object), false)
1178
+ assert.equal('foreignKey' in (meta.relationship as object), false)
1179
+ })
1180
+
1181
+ it('toMeta omits relationship key entirely when not configured', () => {
1182
+ const meta = BuilderField.make('content')
1183
+ .blocks([Block.make('heading').schema([TextField.make('text')])])
1184
+ .toMeta() as BuilderFieldMeta
1185
+ assert.equal(meta.relationship, undefined)
1186
+ })
1187
+ })
1188
+ })