@antelopejs/interface-dms 0.9.1 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/README.md +1 -1
  3. package/dist/attachments.js +3 -1
  4. package/dist/attachments.js.map +1 -1
  5. package/dist/auth/db/models/sessions.model.js +1 -5
  6. package/dist/auth/db/models/sessions.model.js.map +1 -1
  7. package/dist/auth/db/tables/users.table.js.map +1 -1
  8. package/dist/auth/index.js +4 -1
  9. package/dist/auth/index.js.map +1 -1
  10. package/dist/auth/internal/jwt-auth-decorator.js +7 -5
  11. package/dist/auth/internal/jwt-auth-decorator.js.map +1 -1
  12. package/dist/auth/internal/request-authenticators.js +4 -1
  13. package/dist/auth/internal/request-authenticators.js.map +1 -1
  14. package/dist/auth/internal/request-principal.js +1 -0
  15. package/dist/auth/internal/request-principal.js.map +1 -1
  16. package/dist/base/activity-feed.d.ts +26 -26
  17. package/dist/base/banner.d.ts +14 -14
  18. package/dist/base/banner.js +1 -0
  19. package/dist/base/banner.js.map +1 -1
  20. package/dist/base/block-registry/helpers.js +1 -0
  21. package/dist/base/block-registry/helpers.js.map +1 -1
  22. package/dist/base/block-registry/internal/describe.js +107 -85
  23. package/dist/base/block-registry/internal/describe.js.map +1 -1
  24. package/dist/base/block-registry/presentation.js +0 -5
  25. package/dist/base/block-registry/presentation.js.map +1 -1
  26. package/dist/base/block-registry/registry.js +4 -1
  27. package/dist/base/block-registry/registry.js.map +1 -1
  28. package/dist/base/block-types.js +0 -2
  29. package/dist/base/block-types.js.map +1 -1
  30. package/dist/base/card.d.ts +8 -8
  31. package/dist/base/chart-card.d.ts +2 -2
  32. package/dist/base/chart-card.js +2 -2
  33. package/dist/base/chart-card.js.map +1 -1
  34. package/dist/base/chart-schemas.d.ts +66 -66
  35. package/dist/base/chart-schemas.js +19 -21
  36. package/dist/base/chart-schemas.js.map +1 -1
  37. package/dist/base/chart.js +1 -0
  38. package/dist/base/chart.js.map +1 -1
  39. package/dist/base/code-block.js +1 -0
  40. package/dist/base/code-block.js.map +1 -1
  41. package/dist/base/confirm-dialog.d.ts +2 -6
  42. package/dist/base/confirm-dialog.js +36 -15
  43. package/dist/base/confirm-dialog.js.map +1 -1
  44. package/dist/base/data-sources.js +6 -2
  45. package/dist/base/data-sources.js.map +1 -1
  46. package/dist/base/data-types/compare-types.js +82 -68
  47. package/dist/base/data-types/compare-types.js.map +1 -1
  48. package/dist/base/data-types/core.d.ts +8 -101
  49. package/dist/base/data-types/core.js +40 -143
  50. package/dist/base/data-types/core.js.map +1 -1
  51. package/dist/base/data-types/default/address.d.ts +126 -0
  52. package/dist/base/data-types/default/address.js +57 -0
  53. package/dist/base/data-types/default/address.js.map +1 -0
  54. package/dist/base/data-types/default/choices.d.ts +54 -0
  55. package/dist/base/data-types/default/choices.js +135 -0
  56. package/dist/base/data-types/default/choices.js.map +1 -0
  57. package/dist/base/data-types/default/files.d.ts +86 -0
  58. package/dist/base/data-types/default/files.js +214 -0
  59. package/dist/base/data-types/default/files.js.map +1 -0
  60. package/dist/base/data-types/default/inputs.d.ts +11 -0
  61. package/dist/base/data-types/default/inputs.js +26 -0
  62. package/dist/base/data-types/default/inputs.js.map +1 -0
  63. package/dist/base/data-types/default/numbers.d.ts +62 -0
  64. package/dist/base/data-types/default/numbers.js +287 -0
  65. package/dist/base/data-types/default/numbers.js.map +1 -0
  66. package/dist/base/data-types/default/options.d.ts +133 -0
  67. package/dist/base/data-types/default/options.js +3 -0
  68. package/dist/base/data-types/default/options.js.map +1 -0
  69. package/dist/base/data-types/default/relations.d.ts +267 -0
  70. package/dist/base/data-types/default/relations.js +149 -0
  71. package/dist/base/data-types/default/relations.js.map +1 -0
  72. package/dist/base/data-types/default/strings.d.ts +35 -0
  73. package/dist/base/data-types/default/strings.js +154 -0
  74. package/dist/base/data-types/default/strings.js.map +1 -0
  75. package/dist/base/data-types/default-types.d.ts +73 -753
  76. package/dist/base/data-types/default-types.js +39 -991
  77. package/dist/base/data-types/default-types.js.map +1 -1
  78. package/dist/base/data-types/field-types.js +2 -6
  79. package/dist/base/data-types/field-types.js.map +1 -1
  80. package/dist/base/data-types/index.js +1 -20
  81. package/dist/base/data-types/index.js.map +1 -1
  82. package/dist/base/data-types/internal/compare-types.js +0 -2
  83. package/dist/base/data-types/internal/compare-types.js.map +1 -1
  84. package/dist/base/data-types/internal/relation-add-form.d.ts +7 -0
  85. package/dist/base/data-types/internal/relation-add-form.js +21 -0
  86. package/dist/base/data-types/internal/relation-add-form.js.map +1 -0
  87. package/dist/base/data-types/internal/relation-endpoints.d.ts +8 -0
  88. package/dist/base/data-types/internal/relation-endpoints.js +36 -0
  89. package/dist/base/data-types/internal/relation-endpoints.js.map +1 -0
  90. package/dist/base/data-types/status-type.js +0 -6
  91. package/dist/base/data-types/status-type.js.map +1 -1
  92. package/dist/base/display.d.ts +6 -6
  93. package/dist/base/display.js +15 -10
  94. package/dist/base/display.js.map +1 -1
  95. package/dist/base/empty-state.d.ts +8 -8
  96. package/dist/base/export-jobs.js.map +1 -1
  97. package/dist/base/form-block-schema.d.ts +36 -36
  98. package/dist/base/form-block-schema.js +0 -5
  99. package/dist/base/form-block-schema.js.map +1 -1
  100. package/dist/base/form-schema.d.ts +5 -1
  101. package/dist/base/form-schema.js +44 -206
  102. package/dist/base/form-schema.js.map +1 -1
  103. package/dist/base/form-types.d.ts +4 -84
  104. package/dist/base/form-types.js.map +1 -1
  105. package/dist/base/form.js +0 -7
  106. package/dist/base/form.js.map +1 -1
  107. package/dist/base/guard.d.ts +14 -14
  108. package/dist/base/helpers/archive-mode-helpers.js +11 -11
  109. package/dist/base/helpers/archive-mode-helpers.js.map +1 -1
  110. package/dist/base/helpers/file-refs.js +20 -7
  111. package/dist/base/helpers/file-refs.js.map +1 -1
  112. package/dist/base/index.js +0 -5
  113. package/dist/base/index.js.map +1 -1
  114. package/dist/base/internal/button-availability.d.ts +3 -17
  115. package/dist/base/internal/button-availability.js +36 -31
  116. package/dist/base/internal/button-availability.js.map +1 -1
  117. package/dist/base/internal/chart-schemas.js +0 -2
  118. package/dist/base/internal/chart-schemas.js.map +1 -1
  119. package/dist/base/internal/composed-text.js +0 -2
  120. package/dist/base/internal/composed-text.js.map +1 -1
  121. package/dist/base/internal/confirm-dialog.d.ts +3 -13
  122. package/dist/base/internal/confirm-dialog.js +37 -21
  123. package/dist/base/internal/confirm-dialog.js.map +1 -1
  124. package/dist/base/internal/display.js +3 -1
  125. package/dist/base/internal/display.js.map +1 -1
  126. package/dist/base/internal/form-schema-components.d.ts +12 -0
  127. package/dist/base/internal/form-schema-components.js +61 -0
  128. package/dist/base/internal/form-schema-components.js.map +1 -0
  129. package/dist/base/internal/form-schema-validation.d.ts +16 -0
  130. package/dist/base/internal/form-schema-validation.js +68 -0
  131. package/dist/base/internal/form-schema-validation.js.map +1 -0
  132. package/dist/base/internal/form-schema.d.ts +2 -7
  133. package/dist/base/internal/form-schema.js +36 -28
  134. package/dist/base/internal/form-schema.js.map +1 -1
  135. package/dist/base/internal/layouts.d.ts +1 -59
  136. package/dist/base/internal/searchable.js +3 -1
  137. package/dist/base/internal/searchable.js.map +1 -1
  138. package/dist/base/key-value-list.d.ts +12 -12
  139. package/dist/base/kpi-card.d.ts +2 -2
  140. package/dist/base/kpi-card.js +2 -0
  141. package/dist/base/kpi-card.js.map +1 -1
  142. package/dist/base/layouts.d.ts +6 -80
  143. package/dist/base/layouts.js +38 -54
  144. package/dist/base/layouts.js.map +1 -1
  145. package/dist/base/live-toggle.d.ts +2 -2
  146. package/dist/base/meter.d.ts +25 -25
  147. package/dist/base/meter.js +0 -1
  148. package/dist/base/meter.js.map +1 -1
  149. package/dist/base/nav-card-grid.d.ts +13 -13
  150. package/dist/base/page-toolbar.d.ts +2 -2
  151. package/dist/base/page-toolbar.js +0 -6
  152. package/dist/base/page-toolbar.js.map +1 -1
  153. package/dist/base/period-selector.d.ts +2 -2
  154. package/dist/base/period-selector.js +0 -4
  155. package/dist/base/period-selector.js.map +1 -1
  156. package/dist/base/query-response.js +3 -5
  157. package/dist/base/query-response.js.map +1 -1
  158. package/dist/base/resource-form-schema.js +0 -4
  159. package/dist/base/resource-form-schema.js.map +1 -1
  160. package/dist/base/searchable.d.ts +5 -0
  161. package/dist/base/searchable.js +11 -2
  162. package/dist/base/searchable.js.map +1 -1
  163. package/dist/base/stat-group.d.ts +15 -15
  164. package/dist/base/tab.d.ts +8 -8
  165. package/dist/base/tab.js +1 -0
  166. package/dist/base/tab.js.map +1 -1
  167. package/dist/base/table-view/column-display.js +0 -1
  168. package/dist/base/table-view/column-display.js.map +1 -1
  169. package/dist/base/table-view/data-functions.d.ts +10 -10
  170. package/dist/base/table-view/data-functions.js.map +1 -1
  171. package/dist/base/table-view/factory.js +32 -204
  172. package/dist/base/table-view/factory.js.map +1 -1
  173. package/dist/base/table-view/internal/auth.js +5 -19
  174. package/dist/base/table-view/internal/auth.js.map +1 -1
  175. package/dist/base/table-view/internal/column-conditions.js +0 -5
  176. package/dist/base/table-view/internal/column-conditions.js.map +1 -1
  177. package/dist/base/table-view/internal/column-display.js +5 -3
  178. package/dist/base/table-view/internal/column-display.js.map +1 -1
  179. package/dist/base/table-view/internal/factory-helpers.js +24 -158
  180. package/dist/base/table-view/internal/factory-helpers.js.map +1 -1
  181. package/dist/base/table-view/internal/factory-lifecycle-created.d.ts +21 -0
  182. package/dist/base/table-view/internal/factory-lifecycle-created.js +96 -0
  183. package/dist/base/table-view/internal/factory-lifecycle-created.js.map +1 -0
  184. package/dist/base/table-view/internal/factory-lifecycle-filter.d.ts +15 -0
  185. package/dist/base/table-view/internal/factory-lifecycle-filter.js +37 -0
  186. package/dist/base/table-view/internal/factory-lifecycle-filter.js.map +1 -0
  187. package/dist/base/table-view/internal/factory-lifecycle-options.d.ts +41 -0
  188. package/dist/base/table-view/internal/factory-lifecycle-options.js +99 -0
  189. package/dist/base/table-view/internal/factory-lifecycle-options.js.map +1 -0
  190. package/dist/base/table-view/internal/factory-private-actions.d.ts +32 -0
  191. package/dist/base/table-view/internal/factory-private-actions.js +77 -0
  192. package/dist/base/table-view/internal/factory-private-actions.js.map +1 -0
  193. package/dist/base/table-view/internal/factory-private-displays.d.ts +5 -0
  194. package/dist/base/table-view/internal/factory-private-displays.js +21 -0
  195. package/dist/base/table-view/internal/factory-private-displays.js.map +1 -0
  196. package/dist/base/table-view/internal/factory-private-urls.d.ts +15 -0
  197. package/dist/base/table-view/internal/factory-private-urls.js +43 -0
  198. package/dist/base/table-view/internal/factory-private-urls.js.map +1 -0
  199. package/dist/base/table-view/internal/files.js +3 -4
  200. package/dist/base/table-view/internal/files.js.map +1 -1
  201. package/dist/base/table-view/internal/footer.js +5 -3
  202. package/dist/base/table-view/internal/footer.js.map +1 -1
  203. package/dist/base/table-view/internal/guards.js +7 -10
  204. package/dist/base/table-view/internal/guards.js.map +1 -1
  205. package/dist/base/table-view/internal/meta-helpers.d.ts +27 -0
  206. package/dist/base/table-view/internal/meta-helpers.js +75 -0
  207. package/dist/base/table-view/internal/meta-helpers.js.map +1 -0
  208. package/dist/base/table-view/internal/meta.js +8 -2
  209. package/dist/base/table-view/internal/meta.js.map +1 -1
  210. package/dist/base/table-view/internal/nav-badges.js +5 -3
  211. package/dist/base/table-view/internal/nav-badges.js.map +1 -1
  212. package/dist/base/table-view/internal/option-contract.d.ts +403 -0
  213. package/dist/base/table-view/internal/option-contract.js +3 -0
  214. package/dist/base/table-view/internal/option-contract.js.map +1 -0
  215. package/dist/base/table-view/internal/option-displays.d.ts +125 -0
  216. package/dist/base/table-view/internal/option-displays.js +3 -0
  217. package/dist/base/table-view/internal/option-displays.js.map +1 -0
  218. package/dist/base/table-view/internal/option-empty-states.d.ts +43 -0
  219. package/dist/base/table-view/internal/option-empty-states.js +3 -0
  220. package/dist/base/table-view/internal/option-empty-states.js.map +1 -0
  221. package/dist/base/table-view/internal/option-expandable.d.ts +66 -0
  222. package/dist/base/table-view/internal/option-expandable.js +3 -0
  223. package/dist/base/table-view/internal/option-expandable.js.map +1 -0
  224. package/dist/base/table-view/internal/option-filtering.d.ts +85 -0
  225. package/dist/base/table-view/internal/option-filtering.js +4 -0
  226. package/dist/base/table-view/internal/option-filtering.js.map +1 -0
  227. package/dist/base/table-view/internal/option-footer.d.ts +64 -0
  228. package/dist/base/table-view/internal/option-footer.js +3 -0
  229. package/dist/base/table-view/internal/option-footer.js.map +1 -0
  230. package/dist/base/table-view/internal/option-forms.d.ts +62 -0
  231. package/dist/base/table-view/internal/option-forms.js +3 -0
  232. package/dist/base/table-view/internal/option-forms.js.map +1 -0
  233. package/dist/base/table-view/internal/option-row-actions.d.ts +76 -0
  234. package/dist/base/table-view/internal/option-row-actions.js +3 -0
  235. package/dist/base/table-view/internal/option-row-actions.js.map +1 -0
  236. package/dist/base/table-view/internal/option-views.d.ts +199 -0
  237. package/dist/base/table-view/internal/option-views.js +3 -0
  238. package/dist/base/table-view/internal/option-views.js.map +1 -0
  239. package/dist/base/table-view/internal/options.d.ts +2 -6
  240. package/dist/base/table-view/internal/options.js +35 -6
  241. package/dist/base/table-view/internal/options.js.map +1 -1
  242. package/dist/base/table-view/internal/realtime.js +15 -5
  243. package/dist/base/table-view/internal/realtime.js.map +1 -1
  244. package/dist/base/table-view/internal/request-filter.js +12 -12
  245. package/dist/base/table-view/internal/request-filter.js.map +1 -1
  246. package/dist/base/table-view/internal/resource-form.js +1 -10
  247. package/dist/base/table-view/internal/resource-form.js.map +1 -1
  248. package/dist/base/table-view/internal/row-actions-schema.js +0 -6
  249. package/dist/base/table-view/internal/row-actions-schema.js.map +1 -1
  250. package/dist/base/table-view/internal/row-rule-shape.d.ts +10 -0
  251. package/dist/base/table-view/internal/row-rule-shape.js +43 -0
  252. package/dist/base/table-view/internal/row-rule-shape.js.map +1 -0
  253. package/dist/base/table-view/internal/row-rules.js +1 -4
  254. package/dist/base/table-view/internal/row-rules.js.map +1 -1
  255. package/dist/base/table-view/internal/tabs.d.ts +1 -1
  256. package/dist/base/table-view/internal/tabs.js +6 -9
  257. package/dist/base/table-view/internal/tabs.js.map +1 -1
  258. package/dist/base/table-view/internal/validation.js +2 -16
  259. package/dist/base/table-view/internal/validation.js.map +1 -1
  260. package/dist/base/table-view/internal/writer.js +1 -0
  261. package/dist/base/table-view/internal/writer.js.map +1 -1
  262. package/dist/base/table-view/meta.js +11 -93
  263. package/dist/base/table-view/meta.js.map +1 -1
  264. package/dist/base/table-view/options.d.ts +61 -1099
  265. package/dist/base/table-view/options.js.map +1 -1
  266. package/dist/base/table-view/resource-form.js +0 -2
  267. package/dist/base/table-view/resource-form.js.map +1 -1
  268. package/dist/base/table-view/routes.d.ts +3 -1
  269. package/dist/base/table-view/routes.js +33 -28
  270. package/dist/base/table-view/routes.js.map +1 -1
  271. package/dist/base/table-view/schema.d.ts +93 -93
  272. package/dist/base/table-view/schema.js +4 -22
  273. package/dist/base/table-view/schema.js.map +1 -1
  274. package/dist/base/table-view/source.js +0 -5
  275. package/dist/base/table-view/source.js.map +1 -1
  276. package/dist/base/table-view/views.js +0 -3
  277. package/dist/base/table-view/views.js.map +1 -1
  278. package/dist/base/table-view/writer.js +0 -5
  279. package/dist/base/table-view/writer.js.map +1 -1
  280. package/dist/base/top-list-card.d.ts +13 -13
  281. package/dist/base/top-list-card.js +2 -0
  282. package/dist/base/top-list-card.js.map +1 -1
  283. package/dist/base/types/action-target.d.ts +1 -302
  284. package/dist/base/types/button.d.ts +2 -7
  285. package/dist/base/types/button.js +35 -8
  286. package/dist/base/types/button.js.map +1 -1
  287. package/dist/base/types/confirm-dialog.d.ts +1 -127
  288. package/dist/base/types/custom-button.d.ts +1 -87
  289. package/dist/base/types/error.js +2 -1
  290. package/dist/base/types/error.js.map +1 -1
  291. package/dist/base/types/export-status.d.ts +2 -8
  292. package/dist/base/types/export-status.js +35 -9
  293. package/dist/base/types/export-status.js.map +1 -1
  294. package/dist/base/types/form-values.d.ts +1 -4
  295. package/dist/base/types/internal/action-target.d.ts +2 -8
  296. package/dist/base/types/internal/action-target.js +36 -15
  297. package/dist/base/types/internal/action-target.js.map +1 -1
  298. package/dist/base/types/row-action-operators.d.ts +3 -29
  299. package/dist/base/types/row-action-operators.js +35 -18
  300. package/dist/base/types/row-action-operators.js.map +1 -1
  301. package/dist/base/types/row-action.d.ts +3 -36
  302. package/dist/base/types/size.d.ts +1 -3
  303. package/dist/base/types/size.js +0 -3
  304. package/dist/base/types/size.js.map +1 -1
  305. package/dist/base/types/tone.d.ts +3 -8
  306. package/dist/base/types/tone.js +35 -15
  307. package/dist/base/types/tone.js.map +1 -1
  308. package/dist/base/types/watch.d.ts +5 -19
  309. package/dist/base/types/watch.js +35 -3
  310. package/dist/base/types/watch.js.map +1 -1
  311. package/dist/component-options/action-target.d.ts +304 -0
  312. package/dist/component-options/action-target.js +3 -0
  313. package/dist/component-options/action-target.js.map +1 -0
  314. package/dist/component-options/button.d.ts +93 -0
  315. package/dist/component-options/button.js +12 -0
  316. package/dist/component-options/button.js.map +1 -0
  317. package/dist/component-options/confirm-dialog.d.ts +132 -0
  318. package/dist/component-options/confirm-dialog.js +18 -0
  319. package/dist/component-options/confirm-dialog.js.map +1 -0
  320. package/dist/component-options/data-type.d.ts +101 -0
  321. package/dist/component-options/data-type.js +146 -0
  322. package/dist/component-options/data-type.js.map +1 -0
  323. package/dist/component-options/form-field.d.ts +88 -0
  324. package/dist/component-options/form-field.js +3 -0
  325. package/dist/component-options/form-field.js.map +1 -0
  326. package/dist/component-options/internal/action-target.d.ts +8 -0
  327. package/dist/component-options/internal/action-target.js +18 -0
  328. package/dist/component-options/internal/action-target.js.map +1 -0
  329. package/dist/component-options/internal/button-availability.d.ts +17 -0
  330. package/dist/component-options/internal/button-availability.js +34 -0
  331. package/dist/component-options/internal/button-availability.js.map +1 -0
  332. package/dist/component-options/internal/confirm-dialog.d.ts +13 -0
  333. package/dist/component-options/internal/confirm-dialog.js +24 -0
  334. package/dist/component-options/internal/confirm-dialog.js.map +1 -0
  335. package/dist/component-options/internal/form-field.d.ts +7 -0
  336. package/dist/component-options/internal/form-field.js +31 -0
  337. package/dist/component-options/internal/form-field.js.map +1 -0
  338. package/dist/component-options/internal/page-layout.d.ts +71 -0
  339. package/dist/component-options/internal/page-layout.js +10 -0
  340. package/dist/component-options/internal/page-layout.js.map +1 -0
  341. package/dist/component-options/page-layout.d.ts +80 -0
  342. package/dist/component-options/page-layout.js +57 -0
  343. package/dist/component-options/page-layout.js.map +1 -0
  344. package/dist/component-options/row-action.d.ts +66 -0
  345. package/dist/component-options/row-action.js +22 -0
  346. package/dist/component-options/row-action.js.map +1 -0
  347. package/dist/component-slots.js.map +1 -1
  348. package/dist/component.d.ts +2 -2
  349. package/dist/component.js +38 -193
  350. package/dist/component.js.map +1 -1
  351. package/dist/data-controllers/members.js +2 -8
  352. package/dist/data-controllers/members.js.map +1 -1
  353. package/dist/data-controllers/roles.js +0 -5
  354. package/dist/data-controllers/roles.js.map +1 -1
  355. package/dist/db/internal/exportJobs.model.js +10 -6
  356. package/dist/db/internal/exportJobs.model.js.map +1 -1
  357. package/dist/db/internal/tenantLifecycle.model.js +0 -2
  358. package/dist/db/internal/tenantLifecycle.model.js.map +1 -1
  359. package/dist/db/tables/exportJobs.table.d.ts +1 -1
  360. package/dist/db/tables/roles.table.js.map +1 -1
  361. package/dist/db/tables/user_invites.table.d.ts +1 -1
  362. package/dist/db/tables/user_invites.table.js.map +1 -1
  363. package/dist/export-status.d.ts +8 -0
  364. package/dist/export-status.js +13 -0
  365. package/dist/export-status.js.map +1 -0
  366. package/dist/hooks.d.ts +1 -1
  367. package/dist/hooks.js +2 -4
  368. package/dist/hooks.js.map +1 -1
  369. package/dist/index.js +0 -9
  370. package/dist/index.js.map +1 -1
  371. package/dist/internal/component-builder.d.ts +17 -0
  372. package/dist/internal/component-builder.js +58 -0
  373. package/dist/internal/component-builder.js.map +1 -0
  374. package/dist/internal/component-permissions.d.ts +13 -0
  375. package/dist/internal/component-permissions.js +45 -0
  376. package/dist/internal/component-permissions.js.map +1 -0
  377. package/dist/internal/component-serialization.d.ts +10 -0
  378. package/dist/internal/component-serialization.js +42 -0
  379. package/dist/internal/component-serialization.js.map +1 -0
  380. package/dist/internal/component-slots.js +7 -4
  381. package/dist/internal/component-slots.js.map +1 -1
  382. package/dist/internal/component-watches.d.ts +17 -0
  383. package/dist/internal/component-watches.js +110 -0
  384. package/dist/internal/component-watches.js.map +1 -0
  385. package/dist/internal/invite-membership.js +0 -1
  386. package/dist/internal/invite-membership.js.map +1 -1
  387. package/dist/invite-extension-payloads.d.ts +2 -0
  388. package/dist/invite-extension-payloads.js +3 -0
  389. package/dist/invite-extension-payloads.js.map +1 -0
  390. package/dist/invite-extensions/internal/delivery.js +4 -1
  391. package/dist/invite-extensions/internal/delivery.js.map +1 -1
  392. package/dist/invite-extensions/internal/edit.js +5 -4
  393. package/dist/invite-extensions/internal/edit.js.map +1 -1
  394. package/dist/invite-extensions/internal/form-slot.js +5 -35
  395. package/dist/invite-extensions/internal/form-slot.js.map +1 -1
  396. package/dist/invite-extensions/internal/payload-slices.js +10 -3
  397. package/dist/invite-extensions/internal/payload-slices.js.map +1 -1
  398. package/dist/invite-extensions/internal/registry.js +3 -5
  399. package/dist/invite-extensions/internal/registry.js.map +1 -1
  400. package/dist/invite-extensions/registry.js +3 -8
  401. package/dist/invite-extensions/registry.js.map +1 -1
  402. package/dist/invite-extensions/types.d.ts +1 -2
  403. package/dist/invite-resolution.js +2 -1
  404. package/dist/invite-resolution.js.map +1 -1
  405. package/dist/layout-banners.js.map +1 -1
  406. package/dist/notifications/builder.js +25 -5
  407. package/dist/notifications/builder.js.map +1 -1
  408. package/dist/notifications/internal.js +0 -3
  409. package/dist/notifications/internal.js.map +1 -1
  410. package/dist/notifications/sendable.js.map +1 -1
  411. package/dist/page/categories.js +1 -4
  412. package/dist/page/categories.js.map +1 -1
  413. package/dist/page/controllers.js +9 -55
  414. package/dist/page/controllers.js.map +1 -1
  415. package/dist/page/form-page-routes.js +0 -7
  416. package/dist/page/form-page-routes.js.map +1 -1
  417. package/dist/page/internal/categories.d.ts +1 -1
  418. package/dist/page/internal/categories.js +12 -36
  419. package/dist/page/internal/categories.js.map +1 -1
  420. package/dist/page/internal/category-permission.d.ts +10 -0
  421. package/dist/page/internal/category-permission.js +20 -0
  422. package/dist/page/internal/category-permission.js.map +1 -0
  423. package/dist/page/internal/component-target.js +2 -2
  424. package/dist/page/internal/component-target.js.map +1 -1
  425. package/dist/page/internal/component-tree.js +0 -2
  426. package/dist/page/internal/component-tree.js.map +1 -1
  427. package/dist/page/internal/controller-options.d.ts +6 -0
  428. package/dist/page/internal/controller-options.js +40 -0
  429. package/dist/page/internal/controller-options.js.map +1 -0
  430. package/dist/page/internal/extension-assembly.js +2 -7
  431. package/dist/page/internal/extension-assembly.js.map +1 -1
  432. package/dist/page/internal/layout-filter.js +7 -3
  433. package/dist/page/internal/layout-filter.js.map +1 -1
  434. package/dist/page/internal/metadata-components.d.ts +47 -0
  435. package/dist/page/internal/metadata-components.js +136 -0
  436. package/dist/page/internal/metadata-components.js.map +1 -0
  437. package/dist/page/internal/metadata-extension-contributions.d.ts +14 -0
  438. package/dist/page/internal/metadata-extension-contributions.js +56 -0
  439. package/dist/page/internal/metadata-extension-contributions.js.map +1 -0
  440. package/dist/page/internal/metadata-extensions.d.ts +8 -0
  441. package/dist/page/internal/metadata-extensions.js +21 -0
  442. package/dist/page/internal/metadata-extensions.js.map +1 -0
  443. package/dist/page/internal/metadata-helpers.js +0 -14
  444. package/dist/page/internal/metadata-helpers.js.map +1 -1
  445. package/dist/page/internal/metadata-info.d.ts +5 -0
  446. package/dist/page/internal/metadata-info.js +39 -0
  447. package/dist/page/internal/metadata-info.js.map +1 -0
  448. package/dist/page/internal/metadata-layout-response.d.ts +32 -0
  449. package/dist/page/internal/metadata-layout-response.js +76 -0
  450. package/dist/page/internal/metadata-layout-response.js.map +1 -0
  451. package/dist/page/internal/metadata-layout.d.ts +10 -0
  452. package/dist/page/internal/metadata-layout.js +44 -0
  453. package/dist/page/internal/metadata-layout.js.map +1 -0
  454. package/dist/page/internal/metadata-lifecycle.d.ts +52 -0
  455. package/dist/page/internal/metadata-lifecycle.js +241 -0
  456. package/dist/page/internal/metadata-lifecycle.js.map +1 -0
  457. package/dist/page/internal/metadata-owner.d.ts +53 -0
  458. package/dist/page/internal/metadata-owner.js +14 -0
  459. package/dist/page/internal/metadata-owner.js.map +1 -0
  460. package/dist/page/internal/metadata-publish.d.ts +20 -0
  461. package/dist/page/internal/metadata-publish.js +55 -0
  462. package/dist/page/internal/metadata-publish.js.map +1 -0
  463. package/dist/page/internal/metadata-registration.d.ts +8 -0
  464. package/dist/page/internal/metadata-registration.js +72 -0
  465. package/dist/page/internal/metadata-registration.js.map +1 -0
  466. package/dist/page/internal/metadata-upload-registration.d.ts +16 -0
  467. package/dist/page/internal/metadata-upload-registration.js +64 -0
  468. package/dist/page/internal/metadata-upload-registration.js.map +1 -0
  469. package/dist/page/internal/metadata-uploads.d.ts +18 -0
  470. package/dist/page/internal/metadata-uploads.js +46 -0
  471. package/dist/page/internal/metadata-uploads.js.map +1 -0
  472. package/dist/page/internal/nav-badges.d.ts +1 -1
  473. package/dist/page/internal/nav-badges.js +3 -1
  474. package/dist/page/internal/nav-badges.js.map +1 -1
  475. package/dist/page/internal/page-record.d.ts +2 -9
  476. package/dist/page/internal/page-record.js +8 -5
  477. package/dist/page/internal/page-record.js.map +1 -1
  478. package/dist/page/internal/page-registration.js +0 -4
  479. package/dist/page/internal/page-registration.js.map +1 -1
  480. package/dist/page/internal/registry.js +2 -1
  481. package/dist/page/internal/registry.js.map +1 -1
  482. package/dist/page/internal/table-view-ids.js +3 -2
  483. package/dist/page/internal/table-view-ids.js.map +1 -1
  484. package/dist/page/layout-filter.js +1 -0
  485. package/dist/page/layout-filter.js.map +1 -1
  486. package/dist/page/metadata.js +192 -558
  487. package/dist/page/metadata.js.map +1 -1
  488. package/dist/page/roots.js +3 -5
  489. package/dist/page/roots.js.map +1 -1
  490. package/dist/page/types.d.ts +1 -1
  491. package/dist/page/types.js.map +1 -1
  492. package/dist/permissions.js +0 -18
  493. package/dist/permissions.js.map +1 -1
  494. package/dist/realtime.js +0 -3
  495. package/dist/realtime.js.map +1 -1
  496. package/dist/request-tenant.js +4 -1
  497. package/dist/request-tenant.js.map +1 -1
  498. package/dist/tenant-lifecycle.js +2 -2
  499. package/dist/tenant-lifecycle.js.map +1 -1
  500. package/dist/tones.d.ts +8 -0
  501. package/dist/tones.js +19 -0
  502. package/dist/tones.js.map +1 -0
  503. package/dist/uploads.js +15 -4
  504. package/dist/uploads.js.map +1 -1
  505. package/dist/utils/internal/row-instance.js +2 -3
  506. package/dist/utils/internal/row-instance.js.map +1 -1
  507. package/dist/utils/internal/type-check.d.ts +10 -1
  508. package/dist/utils/internal/type-check.js +12 -3
  509. package/dist/utils/internal/type-check.js.map +1 -1
  510. package/dist/utils/internal/value-parser.js +7 -2
  511. package/dist/utils/internal/value-parser.js.map +1 -1
  512. package/dist/watch-actions.d.ts +19 -0
  513. package/dist/watch-actions.js +7 -0
  514. package/dist/watch-actions.js.map +1 -0
  515. package/docs/3.base/2.types.md +1 -1
  516. package/docs/3.base/4.tables.md +1 -1
  517. package/docs/3.base/8.data-types.md +2 -0
  518. package/docs/4.notifications/3.sending.md +1 -1
  519. package/package.json +3 -3
@@ -15,12 +15,6 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
- return c > 3 && r && Object.defineProperty(target, key, r), r;
23
- };
24
18
  var __importStar = (this && this.__importStar) || (function () {
25
19
  var ownKeys = function(o) {
26
20
  ownKeys = Object.getOwnPropertyNames || function (o) {
@@ -38,34 +32,29 @@ var __importStar = (this && this.__importStar) || (function () {
38
32
  return result;
39
33
  };
40
34
  })();
41
- var __metadata = (this && this.__metadata) || function (k, v) {
42
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
- };
44
35
  Object.defineProperty(exports, "__esModule", { value: true });
45
36
  exports.DefaultDataTypes = exports.BOOLEAN_DISPLAYS = exports.SELECT_DISPLAYS = void 0;
46
- const interface_core_1 = require("@antelopejs/interface-core");
47
- const metadata_1 = require("@antelopejs/interface-data-api/metadata");
48
- const interface_file_storage_1 = require("@antelopejs/interface-file-storage");
49
- const zod_1 = require("zod");
50
- const value_parser_1 = require("../../utils/internal/value-parser");
51
- const type_check_1 = require("../../utils/internal/type-check");
52
- const attachments_1 = require("../../attachments");
53
- const form_schema_1 = require("../form-schema");
54
- // Import from the defining leaf, not the table-view barrel: the barrel pulls
55
- // in the assembled routes, whose composition runs at module evaluation — and
56
- // this module sits on the import path of the pieces being composed.
57
- // The cycle is what registers the default data types: they declare
58
- // themselves through decorators, and this barrel is the only value
59
- // path that evaluates them. Breaking it left the registry empty and
60
- // every column serialised without a type, silently. Safe because
61
- // neither side dereferences the other while it evaluates.
62
- // oxlint-disable-next-line import/no-cycle
63
- const meta_1 = require("../table-view/meta");
64
- const types_1 = require("../types");
65
- const core_1 = require("./core");
37
+ require("@antelopejs/interface-core");
38
+ require("@antelopejs/interface-data-api/metadata");
39
+ require("@antelopejs/interface-file-storage");
40
+ require("zod");
41
+ require("../../utils/internal/value-parser");
42
+ require("../../utils/internal/type-check");
43
+ require("../../attachments");
44
+ require("../form-schema");
45
+ // oxlint-disable-next-line import/no-cycle -- Preserve the existing table metadata evaluation before built-in registration.
46
+ require("../table-view/meta");
47
+ require("../types");
48
+ require("./core");
66
49
  const FieldTypes = __importStar(require("./field-types"));
67
- const compare_types_1 = require("./internal/compare-types");
68
- const compare_types_2 = require("./compare-types");
50
+ require("./internal/compare-types");
51
+ require("./compare-types");
52
+ const defaultNumbers = __importStar(require("./default/numbers"));
53
+ const defaultChoices = __importStar(require("./default/choices"));
54
+ const defaultStrings = __importStar(require("./default/strings"));
55
+ const defaultRelations = __importStar(require("./default/relations"));
56
+ const defaultAddress = __importStar(require("./default/address"));
57
+ const defaultFiles = __importStar(require("./default/files"));
69
58
  /** How a `SelectType` shows its options. */
70
59
  exports.SELECT_DISPLAYS = [
71
60
  "dropdown",
@@ -75,968 +64,27 @@ exports.SELECT_DISPLAYS = [
75
64
  ];
76
65
  /** How a `BooleanType` shows its value. */
77
66
  exports.BOOLEAN_DISPLAYS = ["switch", "checkbox", "card"];
78
- // Displays picking one value only: a select picking several shows cards.
79
- const SINGLE_PICK_DISPLAYS = new Set(["segmented", "radio"]);
80
- // The cards keep `columns` out of their options unless it is set, so a select
81
- // that does not set it serializes as before.
82
- function choiceCardsOptions({ items, multiple, columns, }) {
83
- const options = { items, multiple };
84
- if (columns !== undefined)
85
- options.columns = columns;
86
- return options;
87
- }
88
- // The input each display of a select renders.
89
- const SELECT_INPUTS = {
90
- dropdown: ({ columns: _columns, ...options }) => form_schema_1.FormComponents.InputSelect(options),
91
- cards: (options) => form_schema_1.FormComponents.InputChoiceCards(choiceCardsOptions(options)),
92
- segmented: ({ items }) => form_schema_1.FormComponents.InputSegmentedSelect({ items }),
93
- radio: ({ items }) => form_schema_1.FormComponents.InputRadioGroup({ items }),
94
- };
95
- // The input each display of a boolean renders.
96
- const BOOLEAN_INPUTS = {
97
- switch: ({ label, description }) => form_schema_1.FormComponents.InputSwitch({ label, description }),
98
- checkbox: ({ label, description }) => form_schema_1.FormComponents.InputCheckbox({ label, description }),
99
- card: (options) => form_schema_1.FormComponents.InputBooleanCard(options),
100
- };
101
67
  var DefaultDataTypes;
102
68
  (function (DefaultDataTypes) {
103
- let NumberType = class NumberType extends core_1.DataType {
104
- options;
105
- constructor(options = {}) {
106
- super([
107
- compare_types_2.DefaultDataCompareTypes.Is,
108
- compare_types_2.DefaultDataCompareTypes.IsNot,
109
- compare_types_2.DefaultDataCompareTypes.GreaterThan,
110
- compare_types_2.DefaultDataCompareTypes.GreaterThanOrEqualTo,
111
- compare_types_2.DefaultDataCompareTypes.LessThan,
112
- compare_types_2.DefaultDataCompareTypes.LessThanOrEqualTo,
113
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
114
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
115
- ], compare_types_2.DefaultDataCompareTypes.Is, options);
116
- this.options = options;
117
- }
118
- defaultInputComponent() {
119
- return form_schema_1.FormComponents.InputNumber({
120
- min: this.options.min,
121
- max: this.options.max,
122
- step: this.options.step,
123
- placeholder: this.options.placeholder,
124
- suffix: this.options.suffix,
125
- width: this.options.width,
126
- });
127
- }
128
- getValidation() {
129
- let schema = zod_1.z.number();
130
- if (this.options.min !== undefined) {
131
- schema = schema.min(this.options.min);
132
- }
133
- if (this.options.max !== undefined) {
134
- schema = schema.max(this.options.max);
135
- }
136
- return schema;
137
- }
138
- };
139
- NumberType = __decorate([
140
- (0, core_1.RegisterDataType)("number"),
141
- __metadata("design:paramtypes", [Object])
142
- ], NumberType);
143
- DefaultDataTypes.NumberType = NumberType;
144
- let StringType = class StringType extends core_1.DataType {
145
- options;
146
- constructor(options = {}) {
147
- super([
148
- compare_types_2.DefaultDataCompareTypes.Is,
149
- compare_types_2.DefaultDataCompareTypes.IsNot,
150
- compare_types_2.DefaultDataCompareTypes.Contains,
151
- compare_types_2.DefaultDataCompareTypes.NotContains,
152
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
153
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
154
- ], compare_types_2.DefaultDataCompareTypes.Contains, options);
155
- this.options = options;
156
- }
157
- defaultInputComponent() {
158
- if (this.options.copyable) {
159
- return form_schema_1.FormComponents.InputCopyableText({
160
- placeholder: this.options.placeholder,
161
- });
162
- }
163
- return this.editableInputComponent();
164
- }
165
- // A filter is typed in, even on a value the form only shows.
166
- filterComponents() {
167
- return { default: this.editableInputComponent() };
168
- }
169
- editableInputComponent() {
170
- if (this.options.textarea) {
171
- return form_schema_1.FormComponents.InputTextarea({
172
- placeholder: this.options.placeholder,
173
- maxLength: this.options.maxLength,
174
- rows: this.options.rows,
175
- showCount: this.options.showCount,
176
- });
177
- }
178
- return form_schema_1.FormComponents.InputText({
179
- placeholder: this.options.placeholder,
180
- maxLength: this.options.maxLength,
181
- minLength: this.options.minLength,
182
- showCount: this.options.showCount,
183
- width: this.options.width,
184
- });
185
- }
186
- getValidation() {
187
- let schema = zod_1.z.string();
188
- if (this.options.minLength !== undefined) {
189
- schema = schema.min(this.options.minLength);
190
- }
191
- if (this.options.maxLength !== undefined) {
192
- schema = schema.max(this.options.maxLength);
193
- }
194
- return schema;
195
- }
196
- };
197
- StringType = __decorate([
198
- (0, core_1.RegisterDataType)("string"),
199
- __metadata("design:paramtypes", [Object])
200
- ], StringType);
201
- DefaultDataTypes.StringType = StringType;
202
- /** Before or after an instant: `less_than` / `greater_than` on a date. */
203
- const INSTANT_COMPARISONS = {
204
- greater_than: (stored, instant) => stored.gt(instant),
205
- less_than: (stored, instant) => stored.lt(instant),
206
- };
207
- /**
208
- * Before or after a whole day, as `is` and `is_between` read a day:
209
- * "greater than" starts at the next day, "less than" ends before it.
210
- */
211
- const DAY_COMPARISONS = {
212
- greater_than: (stored, dayStart) => {
213
- const nextDay = new Date(dayStart);
214
- nextDay.setUTCDate(nextDay.getUTCDate() + 1);
215
- return stored.ge(nextDay);
216
- },
217
- less_than: (stored, dayStart) => stored.lt(dayStart),
218
- };
219
- /** A calendar day as the date picker sends it, without a time. */
220
- const CALENDAR_DAY = /^\d{4}-\d{2}-\d{2}$/;
221
- let DateType = class DateType extends core_1.DataType {
222
- options;
223
- constructor(options = {}) {
224
- super([
225
- compare_types_2.DefaultDataCompareTypes.Is,
226
- compare_types_2.DefaultDataCompareTypes.LessThan,
227
- compare_types_2.DefaultDataCompareTypes.GreaterThan,
228
- compare_types_2.DefaultDataCompareTypes.IsBetween,
229
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
230
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
231
- ], compare_types_2.DefaultDataCompareTypes.Is, options);
232
- this.options = options;
233
- }
234
- defaultInputComponent() {
235
- return form_schema_1.FormComponents.DatePicker({
236
- range: this.options.range,
237
- multiple: this.options.multiple,
238
- minDate: this.options.minDate,
239
- maxDate: this.options.maxDate,
240
- });
241
- }
242
- // A published contract: the runtime calls this positionally and every
243
- // implementing module declares the same shape, so an options object
244
- // cannot be introduced from this side.
245
- // oxlint-disable-next-line eslint/max-params
246
- filter(context, proxy, key, value, mode, row) {
247
- if (mode === "is" || mode === "is_not") {
248
- return this.sameDayFilter(proxy, value, mode === "is_not");
249
- }
250
- if (mode === "is_between") {
251
- return (0, compare_types_1.whenValueSet)(proxy, this.dayRangeFilter(proxy, value));
252
- }
253
- if (Object.hasOwn(INSTANT_COMPARISONS, mode)) {
254
- return (0, compare_types_1.whenValueSet)(proxy, this.orderFilter(proxy, value, mode));
255
- }
256
- return super.filter(context, proxy, key, value, mode, row);
257
- }
258
- // A stored date is a date: comparing it with the instant's milliseconds,
259
- // as the generic number comparison does, matches every row or none.
260
- instant(value) {
261
- const parsed = (0, value_parser_1.parseValue)(value);
262
- if (!(parsed instanceof Date)) {
263
- throw new Error(`Date filter expects a date value. Got: ${value}`);
264
- }
265
- return parsed;
266
- }
267
- // A picked day stands for the whole day; an instant (a `{{now-7d}}`
268
- // token) is compared as it is.
269
- orderFilter(stored, value, mode) {
270
- const instant = this.instant(value);
271
- if (CALENDAR_DAY.test(value.trim())) {
272
- return DAY_COMPARISONS[mode](stored, this.startOfUtcDay(instant));
273
- }
274
- return INSTANT_COMPARISONS[mode](stored, instant);
275
- }
276
- startOfUtcDay(date) {
277
- const result = new Date(date);
278
- result.setUTCHours(0, 0, 0, 0);
279
- return result;
280
- }
281
- nextUtcDay(date) {
282
- const result = this.startOfUtcDay(date);
283
- result.setUTCDate(result.getUTCDate() + 1);
284
- return result;
285
- }
286
- sameDayFilter(proxy, value, negate) {
287
- const parsed = (0, value_parser_1.parseValue)(value);
288
- if (!(parsed instanceof Date)) {
289
- throw new Error(`Date filter expects a date value. Got: ${typeof parsed}`);
290
- }
291
- const dayStart = this.startOfUtcDay(parsed);
292
- const dayEnd = this.nextUtcDay(parsed);
293
- const dbVal = proxy;
294
- const matchesDay = dbVal.ge(dayStart).and(dbVal.lt(dayEnd));
295
- return negate ? matchesDay.not() : matchesDay;
296
- }
297
- dayRangeFilter(proxy, value) {
298
- const [rawStart, rawEnd] = value
299
- .split(",")
300
- .map((v) => (0, value_parser_1.parseValue)(v.trim()));
301
- if (!(rawStart instanceof Date) || !(rawEnd instanceof Date)) {
302
- throw new Error(`Date is_between filter expects two date values. Got: ${value}`);
303
- }
304
- const rangeStart = this.startOfUtcDay(rawStart);
305
- const rangeEnd = this.nextUtcDay(rawEnd);
306
- const dbVal = proxy;
307
- return dbVal.ge(rangeStart).and(dbVal.lt(rangeEnd));
308
- }
309
- filterComponents() {
310
- const datepicker = form_schema_1.FormComponents.DatePicker({
311
- range: this.options.range,
312
- multiple: this.options.multiple,
313
- minDate: this.options.minDate,
314
- maxDate: this.options.maxDate,
315
- });
316
- return {
317
- default: datepicker,
318
- is_between: form_schema_1.FormComponents.DatePickerRange({
319
- minDate: this.options.minDate,
320
- maxDate: this.options.maxDate,
321
- }),
322
- };
323
- }
324
- getValidation() {
325
- if (this.options.range) {
326
- // A range is `{ start, end }`, the date picker's shape; a pair of
327
- // dates `[start, end]` is still read, and validates to the same
328
- // object. Each date gets its own schema: one shared instance would
329
- // serialize as a JSON Schema `$ref`, which the form rebuilds as
330
- // "anything".
331
- return zod_1.z
332
- .union([
333
- zod_1.z.tuple([this.singleDateValidation(), this.singleDateValidation()]),
334
- zod_1.z.object({
335
- start: this.singleDateValidation(),
336
- end: this.singleDateValidation(),
337
- }),
338
- ])
339
- .transform((range) => Array.isArray(range) ? { start: range[0], end: range[1] } : range)
340
- .refine((range) => range.start <= range.end, {
341
- message: "The range must end on or after its start",
342
- path: ["end"],
343
- });
344
- }
345
- if (this.options.multiple) {
346
- return zod_1.z.array(this.singleDateValidation());
347
- }
348
- return this.singleDateValidation();
349
- }
350
- singleDateValidation() {
351
- let singleDateSchema = zod_1.z
352
- .union([
353
- zod_1.z
354
- .string()
355
- .regex(/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?)?$/),
356
- zod_1.z.date(),
357
- ])
358
- .transform((val) => {
359
- return (0, type_check_1.isString)(val) ? new Date(val) : val;
360
- });
361
- if (this.options.minDate) {
362
- const minDate = new Date(this.options.minDate);
363
- singleDateSchema = singleDateSchema.refine((date) => date >= minDate, {
364
- message: `Date must be after ${minDate.toISOString()}`,
365
- });
366
- }
367
- if (this.options.maxDate) {
368
- const maxDate = new Date(this.options.maxDate);
369
- singleDateSchema = singleDateSchema.refine((date) => date <= maxDate, {
370
- message: `Date must be before ${maxDate.toISOString()}`,
371
- });
372
- }
373
- return singleDateSchema;
374
- }
375
- };
376
- DateType = __decorate([
377
- (0, core_1.RegisterDataType)("date"),
378
- __metadata("design:paramtypes", [Object])
379
- ], DateType);
380
- DefaultDataTypes.DateType = DateType;
381
- let BooleanType = class BooleanType extends core_1.DataType {
382
- options;
383
- constructor(options = {}) {
384
- super([
385
- compare_types_2.DefaultDataCompareTypes.Is,
386
- compare_types_2.DefaultDataCompareTypes.IsNot,
387
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
388
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
389
- ], compare_types_2.DefaultDataCompareTypes.Is, options);
390
- this.options = options;
391
- }
392
- defaultInputComponent() {
393
- const { display = "switch", icon, label, description } = this.options;
394
- return BOOLEAN_INPUTS[display]({ icon, label, description });
395
- }
396
- filterComponents() {
397
- const selectOptions = form_schema_1.FormComponents.InputSelect({
398
- items: [
399
- { value: "true", label: "$dms.table.filter.boolean.checked" },
400
- { value: "false", label: "$dms.table.filter.boolean.unchecked" },
401
- ],
402
- });
403
- return {
404
- default: selectOptions,
405
- is: selectOptions,
406
- is_not: selectOptions,
407
- };
408
- }
409
- getValidation() {
410
- return zod_1.z.boolean();
411
- }
412
- };
413
- BooleanType = __decorate([
414
- (0, core_1.RegisterDataType)("boolean"),
415
- __metadata("design:paramtypes", [Object])
416
- ], BooleanType);
417
- DefaultDataTypes.BooleanType = BooleanType;
418
- let SelectType = class SelectType extends core_1.DataType {
419
- options;
420
- constructor(options = { items: [] }) {
421
- super([
422
- options.multiple
423
- ? compare_types_2.DefaultDataCompareTypes.Include
424
- : compare_types_2.DefaultDataCompareTypes.Is,
425
- options.multiple
426
- ? compare_types_2.DefaultDataCompareTypes.Exclude
427
- : compare_types_2.DefaultDataCompareTypes.IsNot,
428
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
429
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
430
- ], options.multiple
431
- ? compare_types_2.DefaultDataCompareTypes.Include
432
- : compare_types_2.DefaultDataCompareTypes.Is, options);
433
- this.options = options;
434
- }
435
- defaultInputComponent() {
436
- const { display = "dropdown", ...options } = this.options;
437
- const shown = options.multiple && SINGLE_PICK_DISPLAYS.has(display)
438
- ? "cards"
439
- : display;
440
- return SELECT_INPUTS[shown](options);
441
- }
442
- // A filter picks from a dropdown, whatever the form shows.
443
- filterComponents() {
444
- const { display: _display, columns: _columns, ...options } = this.options;
445
- return { default: form_schema_1.FormComponents.InputSelect(options) };
446
- }
447
- getValidation() {
448
- const validValues = this.options.items.map((item) => String(item.value));
449
- if (this.options.multiple) {
450
- return zod_1.z.array(zod_1.z.enum(validValues));
451
- }
452
- return zod_1.z.enum(validValues);
453
- }
454
- };
455
- SelectType = __decorate([
456
- (0, core_1.RegisterDataType)("select"),
457
- __metadata("design:paramtypes", [Object])
458
- ], SelectType);
459
- DefaultDataTypes.SelectType = SelectType;
460
- let PriceType = class PriceType extends NumberType {
461
- constructor(options = {}) {
462
- super({
463
- min: options.min ?? 0,
464
- step: options.step ?? 0.01,
465
- ...options,
466
- });
467
- }
468
- };
469
- PriceType = __decorate([
470
- (0, core_1.RegisterDataType)("price"),
471
- __metadata("design:paramtypes", [Object])
472
- ], PriceType);
473
- DefaultDataTypes.PriceType = PriceType;
474
- let PercentageType = class PercentageType extends NumberType {
475
- constructor(options = {}) {
476
- super({
477
- min: options.min ?? 0,
478
- max: options.max ?? 1,
479
- step: options.step ?? 0.01,
480
- ...options,
481
- });
482
- }
483
- defaultInputComponent() {
484
- return form_schema_1.FormComponents.InputPercentage({
485
- min: (this.options.min ?? 0) * 100,
486
- max: (this.options.max ?? 1) * 100,
487
- step: this.options.step,
488
- placeholder: this.options.placeholder,
489
- width: this.options.width,
490
- });
491
- }
492
- };
493
- PercentageType = __decorate([
494
- (0, core_1.RegisterDataType)("percentage"),
495
- __metadata("design:paramtypes", [Object])
496
- ], PercentageType);
497
- DefaultDataTypes.PercentageType = PercentageType;
498
- let EmailType = class EmailType extends core_1.DataType {
499
- options;
500
- constructor(options = {}) {
501
- super([
502
- compare_types_2.DefaultDataCompareTypes.Is,
503
- compare_types_2.DefaultDataCompareTypes.IsNot,
504
- compare_types_2.DefaultDataCompareTypes.Contains,
505
- compare_types_2.DefaultDataCompareTypes.NotContains,
506
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
507
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
508
- ], compare_types_2.DefaultDataCompareTypes.Contains, options);
509
- this.options = options;
510
- }
511
- defaultInputComponent() {
512
- return form_schema_1.FormComponents.InputEmail({
513
- placeholder: this.options.placeholder,
514
- });
515
- }
516
- getValidation() {
517
- return zod_1.z.string().email();
518
- }
519
- };
520
- EmailType = __decorate([
521
- (0, core_1.RegisterDataType)("email"),
522
- __metadata("design:paramtypes", [Object])
523
- ], EmailType);
524
- DefaultDataTypes.EmailType = EmailType;
525
- let ColorType = class ColorType extends core_1.DataType {
526
- options;
527
- constructor(options = {}) {
528
- super([
529
- compare_types_2.DefaultDataCompareTypes.Is,
530
- compare_types_2.DefaultDataCompareTypes.IsNot,
531
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
532
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
533
- ], compare_types_2.DefaultDataCompareTypes.Is, options);
534
- this.options = options;
535
- }
536
- defaultInputComponent() {
537
- return form_schema_1.FormComponents.InputColor({
538
- placeholder: this.options.placeholder,
539
- });
540
- }
541
- getValidation() {
542
- return zod_1.z.string().regex(/^#[0-9a-fA-F]{6}$/);
543
- }
544
- };
545
- ColorType = __decorate([
546
- (0, core_1.RegisterDataType)("color"),
547
- __metadata("design:paramtypes", [Object])
548
- ], ColorType);
549
- DefaultDataTypes.ColorType = ColorType;
550
- let PasswordType = class PasswordType extends core_1.DataType {
551
- options;
552
- constructor(options = {}) {
553
- super([], undefined, options);
554
- this.options = options;
555
- }
556
- defaultInputComponent() {
557
- return form_schema_1.FormComponents.InputPassword({
558
- placeholder: this.options.placeholder,
559
- minLength: this.options.minLength,
560
- confirmPassword: this.options.confirmPassword,
561
- confirmPlaceholder: this.options.confirmPlaceholder,
562
- });
563
- }
564
- getValidation() {
565
- let schema = zod_1.z.string();
566
- if (this.options.minLength !== undefined) {
567
- schema = schema.min(this.options.minLength);
568
- }
569
- return schema;
570
- }
571
- };
572
- PasswordType = __decorate([
573
- (0, core_1.RegisterDataType)("password"),
574
- __metadata("design:paramtypes", [Object])
575
- ], PasswordType);
576
- DefaultDataTypes.PasswordType = PasswordType;
577
- let UrlType = class UrlType extends core_1.DataType {
578
- options;
579
- constructor(options = {}) {
580
- super([
581
- compare_types_2.DefaultDataCompareTypes.Is,
582
- compare_types_2.DefaultDataCompareTypes.IsNot,
583
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
584
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
585
- ], compare_types_2.DefaultDataCompareTypes.Is, options);
586
- this.options = options;
587
- }
588
- defaultInputComponent() {
589
- return form_schema_1.FormComponents.InputText({
590
- placeholder: this.options.placeholder,
591
- preview: this.options.preview,
592
- });
593
- }
594
- getValidation() {
595
- return zod_1.z.string().url();
596
- }
597
- };
598
- UrlType = __decorate([
599
- (0, core_1.RegisterDataType)("url"),
600
- __metadata("design:paramtypes", [Object])
601
- ], UrlType);
602
- DefaultDataTypes.UrlType = UrlType;
603
- let PhoneType = class PhoneType extends core_1.DataType {
604
- options;
605
- constructor(options = {}) {
606
- super([
607
- compare_types_2.DefaultDataCompareTypes.Is,
608
- compare_types_2.DefaultDataCompareTypes.IsNot,
609
- compare_types_2.DefaultDataCompareTypes.Contains,
610
- compare_types_2.DefaultDataCompareTypes.NotContains,
611
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
612
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
613
- ], compare_types_2.DefaultDataCompareTypes.Contains, options);
614
- this.options = options;
615
- }
616
- defaultInputComponent() {
617
- return form_schema_1.FormComponents.InputPhone({
618
- placeholder: this.options.placeholder,
619
- requiredPrefix: this.options.requiredPrefix,
620
- });
621
- }
622
- getValidation() {
623
- if (this.options.requiredPrefix) {
624
- return zod_1.z.string().regex(/^\+[1-9]\d{1,14}$/);
625
- }
626
- return zod_1.z.string();
627
- }
628
- };
629
- PhoneType = __decorate([
630
- (0, core_1.RegisterDataType)("phone"),
631
- __metadata("design:paramtypes", [Object])
632
- ], PhoneType);
633
- DefaultDataTypes.PhoneType = PhoneType;
634
- // A multiple relation stores an array of ids: `is` would compare the
635
- // whole array, so it offers whether the array includes the picked id.
636
- function relationCompareModes(multiple) {
637
- return [
638
- multiple ? compare_types_2.DefaultDataCompareTypes.Include : compare_types_2.DefaultDataCompareTypes.Is,
639
- multiple
640
- ? compare_types_2.DefaultDataCompareTypes.Exclude
641
- : compare_types_2.DefaultDataCompareTypes.IsNot,
642
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
643
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
644
- ];
645
- }
646
- function relationDefaultCompareMode(multiple) {
647
- return multiple
648
- ? compare_types_2.DefaultDataCompareTypes.Include
649
- : compare_types_2.DefaultDataCompareTypes.Is;
650
- }
651
- let RelationType = class RelationType extends core_1.DataType {
652
- options;
653
- constructor(options) {
654
- super(relationCompareModes(options.multiple), relationDefaultCompareMode(options.multiple), options);
655
- this.options = options;
656
- }
657
- defaultInputComponent() {
658
- return this.relationInput(true, this.options.multiple);
659
- }
660
- // A filter picks among the rows there are: it never adds one. A multiple
661
- // relation is filtered on one id at a time (`include`).
662
- filterComponents() {
663
- return { default: this.relationInput(false, false) };
664
- }
665
- describedInputComponent() {
666
- return this.relationInput(false, this.options.multiple);
667
- }
668
- // The picker, with the related table's "new" form when a row can be
669
- // added through it: that form, nested relations included, is the bulk of
670
- // the component, and only an editable field opens it.
671
- relationInput(canAdd, multiple) {
672
- const tableViewMeta = (0, interface_core_1.GetMetadata)(this.options.dataApiController, meta_1.TableViewMeta);
673
- const { config } = tableViewMeta;
674
- const { endpoints } = (0, interface_core_1.GetMetadata)(this.options.dataApiController, metadata_1.DataAPIMeta);
675
- const location = `${config.location}/${endpoints.select.endpoint || "select"}`;
676
- const addOptions = canAdd
677
- ? this.buildAddOptions(tableViewMeta, endpoints)
678
- : undefined;
679
- return form_schema_1.FormComponents.InputRelation({
680
- placeholder: this.options.placeholder,
681
- multiple,
682
- deselectable: this.options.deselectable,
683
- searchUrl: location,
684
- keyMapping: this.options.keyMapping,
685
- filterBy: this.options.filterBy,
686
- addForm: addOptions?.addForm,
687
- addPermissionIds: addOptions?.addPermissionIds,
688
- addFormTexts: this.options.addForm,
689
- });
690
- }
691
- buildAddOptions(tableViewMeta, endpoints) {
692
- if (!endpoints.new)
693
- return undefined;
694
- const newFields = tableViewMeta.getFormFields("new");
695
- if (newFields.length === 0)
696
- return undefined;
697
- const submitUrl = `${tableViewMeta.config.location}/new`;
698
- const addForm = (0, form_schema_1.Form)({
699
- fields: newFields,
700
- submitUrl,
701
- submitUrlMethod: types_1.HttpMethod.post,
702
- kind: "create",
703
- }).serializeSync();
704
- return {
705
- addForm,
706
- addPermissionIds: tableViewMeta.actionPermissionIds("add"),
707
- };
708
- }
709
- getValidation() {
710
- return this.options.multiple ? zod_1.z.array(zod_1.z.string()) : zod_1.z.string();
711
- }
712
- // The search route drops a filter the related controller does not
713
- // declare, so an unfilterable `field` would offer every row in silence.
714
- assertFilterByFilterable(key) {
715
- const field = this.options.filterBy?.field;
716
- if (!field)
717
- return;
718
- const { filters } = (0, interface_core_1.GetMetadata)(this.options.dataApiController, metadata_1.DataAPIMeta);
719
- if (filters[field])
720
- return;
721
- throw new Error(`Relation "${String(key)}": filterBy.field "${field}" is not filterable on ${this.options.dataApiController.name}; declare it filterable: true there.`);
722
- }
723
- decorateField(target, key, descriptor) {
724
- this.assertFilterByFilterable(key);
725
- // Filter-only relations never resolve the related row: skip the join so
726
- // the raw scalar id stays in the `/list` output and the row id key is
727
- // preserved. The funnel filter still works (relation picker +
728
- // `@Filter` equality on the raw column). See {@link options.filterOnly}.
729
- if (this.options.filterOnly) {
730
- return;
731
- }
732
- const meta = (0, interface_core_1.GetMetadata)(this.options.dataApiController, metadata_1.DataAPIMeta);
733
- (0, compare_types_1.absolutizeJoinedSchemas)(meta);
734
- const { tableName, pluck } = meta;
735
- (0, metadata_1.Foreign)(tableName, this.options.index, this.options.multiple, Array.from(pluck.select?.keys() || []), meta.schemaName, meta)(target, key, descriptor ?? {});
736
- }
737
- };
738
- RelationType = __decorate([
739
- (0, core_1.RegisterDataType)("relation"),
740
- __metadata("design:paramtypes", [Object])
741
- ], RelationType);
742
- DefaultDataTypes.RelationType = RelationType;
743
- /**
744
- * Relation to a self-referencing table rendered as a cascader.
745
- *
746
- * The target controller exposes a flat list through its `select` endpoint
747
- * (the `parent` field of `keyMapping` must be decorated with `@Select()`);
748
- * the widget rebuilds the tree client-side and displays the full path
749
- * (e.g. `Electronics / Audio / Headphones`) in table cells.
750
- */
751
- let CascaderRelationType = class CascaderRelationType extends core_1.DataType {
752
- options;
753
- constructor(options) {
754
- super(relationCompareModes(options.multiple), relationDefaultCompareMode(options.multiple), options);
755
- this.options = options;
756
- }
757
- defaultInputComponent() {
758
- return this.cascaderInput(this.options.multiple);
759
- }
760
- // A multiple relation is filtered on one id at a time (`include`).
761
- filterComponents() {
762
- return { default: this.cascaderInput(false) };
763
- }
764
- cascaderInput(multiple) {
765
- const { config } = (0, interface_core_1.GetMetadata)(this.options.dataApiController, meta_1.TableViewMeta);
766
- const { endpoints } = (0, interface_core_1.GetMetadata)(this.options.dataApiController, metadata_1.DataAPIMeta);
767
- return form_schema_1.FormComponents.InputCascader({
768
- placeholder: this.options.placeholder,
769
- multiple,
770
- deselectable: this.options.deselectable,
771
- searchUrl: `${config.location}/${endpoints.select.endpoint || "select"}`,
772
- keyMapping: this.options.keyMapping,
773
- maxDepth: this.options.maxDepth,
774
- leafOnly: this.options.leafOnly,
775
- fallback: this.options.fallback,
776
- });
777
- }
778
- getValidation() {
779
- return this.options.multiple ? zod_1.z.array(zod_1.z.string()) : zod_1.z.string();
780
- }
781
- decorateField(target, key, descriptor) {
782
- // See RelationType.decorateField: a filter-only relation skips the join.
783
- if (this.options.filterOnly) {
784
- return;
785
- }
786
- const meta = (0, interface_core_1.GetMetadata)(this.options.dataApiController, metadata_1.DataAPIMeta);
787
- (0, compare_types_1.absolutizeJoinedSchemas)(meta);
788
- const { tableName, pluck } = meta;
789
- (0, metadata_1.Foreign)(tableName, this.options.index, this.options.multiple, Array.from(pluck.select?.keys() || []), meta.schemaName, meta)(target, key, descriptor ?? {});
790
- }
791
- };
792
- CascaderRelationType = __decorate([
793
- (0, core_1.RegisterDataType)("cascader_relation"),
794
- __metadata("design:paramtypes", [Object])
795
- ], CascaderRelationType);
796
- DefaultDataTypes.CascaderRelationType = CascaderRelationType;
797
- let AddressType = class AddressType extends core_1.DataType {
798
- options;
799
- constructor(options = {}) {
800
- super([compare_types_2.DefaultDataCompareTypes.IsEmpty, compare_types_2.DefaultDataCompareTypes.IsNotEmpty], compare_types_2.DefaultDataCompareTypes.IsEmpty, options);
801
- this.options = options;
802
- }
803
- defaultInputComponent() {
804
- const baseConfig = {
805
- placeholder: this.options.placeholder,
806
- autocomplete: this.options.autocomplete,
807
- defaultCountry: this.options.defaultCountry,
808
- };
809
- if (!this.options.dataApiController) {
810
- return form_schema_1.FormComponents.InputAddress(baseConfig);
811
- }
812
- const { config } = (0, interface_core_1.GetMetadata)(this.options.dataApiController, meta_1.TableViewMeta);
813
- const { endpoints } = (0, interface_core_1.GetMetadata)(this.options.dataApiController, metadata_1.DataAPIMeta);
814
- const location = `${config.location}/${endpoints.select.endpoint || "select"}`;
815
- return form_schema_1.FormComponents.InputAddress({
816
- ...baseConfig,
817
- searchUrl: location,
818
- keyMapping: this.options.keyMapping,
819
- });
820
- }
821
- getValidation() {
822
- return zod_1.z.object({
823
- streetName: zod_1.z.string().min(1),
824
- houseNumber: zod_1.z.string().optional(),
825
- boxNumber: zod_1.z.string().optional(),
826
- addressLine2: zod_1.z.string().optional(),
827
- postalCode: zod_1.z.string().min(1),
828
- city: zod_1.z.string().min(1),
829
- countrySubdivision: zod_1.z.string().optional(),
830
- countryCode: zod_1.z.string().length(2),
831
- });
832
- }
833
- };
834
- AddressType = __decorate([
835
- (0, core_1.RegisterDataType)("address"),
836
- __metadata("design:paramtypes", [Object])
837
- ], AddressType);
838
- DefaultDataTypes.AddressType = AddressType;
839
- let RichTextType = class RichTextType extends core_1.DataType {
840
- options;
841
- constructor(options = {}) {
842
- super([], undefined, options);
843
- this.options = options;
844
- }
845
- defaultInputComponent() {
846
- return form_schema_1.FormComponents.RichText({
847
- placeholder: this.options.placeholder,
848
- });
849
- }
850
- getValidation() {
851
- return zod_1.z.string();
852
- }
853
- };
854
- RichTextType = __decorate([
855
- (0, core_1.RegisterDataType)("rich_text"),
856
- __metadata("design:paramtypes", [Object])
857
- ], RichTextType);
858
- DefaultDataTypes.RichTextType = RichTextType;
859
- let StringTimeType = class StringTimeType extends core_1.DataType {
860
- options;
861
- constructor(options = {}) {
862
- super([
863
- compare_types_2.DefaultDataCompareTypes.Is,
864
- compare_types_2.DefaultDataCompareTypes.IsNot,
865
- compare_types_2.DefaultDataCompareTypes.GreaterThan,
866
- compare_types_2.DefaultDataCompareTypes.GreaterThanOrEqualTo,
867
- compare_types_2.DefaultDataCompareTypes.LessThan,
868
- compare_types_2.DefaultDataCompareTypes.LessThanOrEqualTo,
869
- compare_types_2.DefaultDataCompareTypes.IsEmpty,
870
- compare_types_2.DefaultDataCompareTypes.IsNotEmpty,
871
- ], compare_types_2.DefaultDataCompareTypes.Is, options);
872
- this.options = options;
873
- }
874
- defaultInputComponent() {
875
- return form_schema_1.FormComponents.InputTime({
876
- placeholder: this.options.placeholder,
877
- min: this.options.min,
878
- max: this.options.max,
879
- });
880
- }
881
- getValidation() {
882
- let schema = zod_1.z.number();
883
- if (this.options.min !== undefined) {
884
- schema = schema.min(this.options.min);
885
- }
886
- if (this.options.max !== undefined) {
887
- schema = schema.max(this.options.max);
888
- }
889
- return schema;
890
- }
891
- };
892
- StringTimeType = __decorate([
893
- (0, core_1.RegisterDataType)("string_time"),
894
- __metadata("design:paramtypes", [Object])
895
- ], StringTimeType);
896
- DefaultDataTypes.StringTimeType = StringTimeType;
897
- function matchMimetype(actual, pattern) {
898
- if (pattern === actual)
899
- return true;
900
- if (pattern.endsWith("/*")) {
901
- const prefix = pattern.slice(0, -1);
902
- return actual.startsWith(prefix);
903
- }
904
- return false;
905
- }
906
- const MISSING_FILE_ERROR_PATTERN = /not\s?found|nosuchkey/i;
907
- /**
908
- * A missing referenced file is a validation failure (the submitted key does
909
- * not point at a real upload); any other metadata error (storage outage,
910
- * auth) keeps propagating so it surfaces as a server error, not as a bogus
911
- * "invalid input" on the field.
912
- */
913
- function isMissingFileError(error) {
914
- const message = error instanceof Error ? error.message : String(error);
915
- return MISSING_FILE_ERROR_PATTERN.test(message);
916
- }
917
- function createFileValidationSchema(constraints, storage, attachmentField) {
918
- return zod_1.z.string().refine(async (resourceKey) => {
919
- if (!constraints && !attachmentField)
920
- return true;
921
- // An empty value is the absence of a file, not a reference to check;
922
- // whether the field may be empty is the schema's business.
923
- if (!resourceKey)
924
- return true;
925
- const getMetadata = attachmentField
926
- ? attachments_1.GetAttachmentValidationMetadata
927
- : interface_file_storage_1.GetFileMetadata;
928
- const metadata = await getMetadata(resourceKey, storage).catch((error) => {
929
- if (isMissingFileError(error))
930
- return null;
931
- throw error;
932
- });
933
- // `undefined` comes from the attachment lookup: the key belongs to no
934
- // prepared attachment, so it is an invalid reference. `null` means the
935
- // object itself is gone, which an attachment-backed field survives:
936
- // the attachment row proves provenance and the save replays the
937
- // promotion of a staged key.
938
- if (metadata === null) {
939
- return attachmentField !== undefined;
940
- }
941
- if (!metadata) {
942
- return false;
943
- }
944
- if (constraints?.maxSize && metadata.size > constraints.maxSize) {
945
- return false;
946
- }
947
- if (constraints?.allowedMimetypes?.length) {
948
- const isAllowed = constraints.allowedMimetypes.some((pattern) => matchMimetype(metadata.mimetype, pattern));
949
- if (!isAllowed)
950
- return false;
951
- }
952
- return true;
953
- }, { message: "File does not meet constraints" });
954
- }
955
- let FileType = class FileType extends core_1.DataType {
956
- options;
957
- constructor(options = {}) {
958
- super([], undefined, options);
959
- this.options = options;
960
- }
961
- defaultInputComponent() {
962
- return form_schema_1.FormComponents.File({
963
- multiple: this.options.multiple,
964
- constraints: this.options.constraints,
965
- path: this.options.path,
966
- storage: this.options.storage,
967
- attachmentField: this.options.attachmentField,
968
- visibility: this.options.visibility,
969
- });
970
- }
971
- getValidation() {
972
- const fileSchema = zod_1.z.lazy(() => createFileValidationSchema(this.options.constraints, this.options.storage, this.options.attachmentField));
973
- if (this.options.multiple) {
974
- return zod_1.z.array(fileSchema);
975
- }
976
- return fileSchema;
977
- }
978
- };
979
- FileType = __decorate([
980
- (0, core_1.RegisterDataType)("file"),
981
- __metadata("design:paramtypes", [Object])
982
- ], FileType);
983
- DefaultDataTypes.FileType = FileType;
984
- const DEFAULT_IMAGE_MIMETYPES = ["image/*"];
985
- function resolveImageConstraints(constraints) {
986
- return {
987
- ...constraints,
988
- allowedMimetypes: constraints?.allowedMimetypes?.length
989
- ? constraints.allowedMimetypes
990
- : DEFAULT_IMAGE_MIMETYPES,
991
- };
992
- }
993
- function createImageValueSchema(constraints, storage, attachmentField) {
994
- return zod_1.z.object({
995
- key: createFileValidationSchema(constraints, storage, attachmentField),
996
- alt: zod_1.z.string().optional(),
997
- principal: zod_1.z.boolean().optional(),
998
- });
999
- }
1000
- function hasAtMostOnePrincipal(images) {
1001
- return images.filter((image) => image.principal).length <= 1;
1002
- }
1003
- let ImageType = class ImageType extends core_1.DataType {
1004
- options;
1005
- constructor(options = {}) {
1006
- super([], undefined, options);
1007
- this.options = options;
1008
- }
1009
- defaultInputComponent() {
1010
- return form_schema_1.FormComponents.Image({
1011
- multiple: this.options.multiple,
1012
- max: this.options.max,
1013
- constraints: resolveImageConstraints(this.options.constraints),
1014
- path: this.options.path,
1015
- storage: this.options.storage,
1016
- resize: this.options.resize,
1017
- attachmentField: this.options.attachmentField,
1018
- visibility: this.options.visibility,
1019
- });
1020
- }
1021
- getValidation() {
1022
- const imageSchema = zod_1.z.lazy(() => createImageValueSchema(resolveImageConstraints(this.options.constraints), this.options.storage, this.options.attachmentField));
1023
- if (!this.options.multiple) {
1024
- return imageSchema;
1025
- }
1026
- const arraySchema = this.options.max !== undefined
1027
- ? zod_1.z.array(imageSchema).max(this.options.max)
1028
- : zod_1.z.array(imageSchema);
1029
- return arraySchema.refine(hasAtMostOnePrincipal, {
1030
- message: "Only one image can be marked as principal",
1031
- });
1032
- }
1033
- };
1034
- ImageType = __decorate([
1035
- (0, core_1.RegisterDataType)("image"),
1036
- __metadata("design:paramtypes", [Object])
1037
- ], ImageType);
1038
- DefaultDataTypes.ImageType = ImageType;
1039
- // The field types of `field-types.ts`, under the namespace modules use.
69
+ DefaultDataTypes.NumberType = defaultNumbers.NumberType;
70
+ DefaultDataTypes.StringType = defaultNumbers.StringType;
71
+ DefaultDataTypes.DateType = defaultNumbers.DateType;
72
+ DefaultDataTypes.BooleanType = defaultChoices.BooleanType;
73
+ DefaultDataTypes.SelectType = defaultChoices.SelectType;
74
+ DefaultDataTypes.PriceType = defaultChoices.PriceType;
75
+ DefaultDataTypes.PercentageType = defaultChoices.PercentageType;
76
+ DefaultDataTypes.EmailType = defaultStrings.EmailType;
77
+ DefaultDataTypes.ColorType = defaultStrings.ColorType;
78
+ DefaultDataTypes.PasswordType = defaultStrings.PasswordType;
79
+ DefaultDataTypes.UrlType = defaultStrings.UrlType;
80
+ DefaultDataTypes.PhoneType = defaultStrings.PhoneType;
81
+ DefaultDataTypes.RelationType = defaultRelations.RelationType;
82
+ DefaultDataTypes.CascaderRelationType = defaultRelations.CascaderRelationType;
83
+ DefaultDataTypes.AddressType = defaultAddress.AddressType;
84
+ DefaultDataTypes.RichTextType = defaultFiles.RichTextType;
85
+ DefaultDataTypes.StringTimeType = defaultFiles.StringTimeType;
86
+ DefaultDataTypes.FileType = defaultFiles.FileType;
87
+ DefaultDataTypes.ImageType = defaultFiles.ImageType;
1040
88
  DefaultDataTypes.ArrayType = FieldTypes.ArrayType;
1041
89
  DefaultDataTypes.KeyValueType = FieldTypes.KeyValueType;
1042
90
  DefaultDataTypes.SecretType = FieldTypes.SecretType;