@questpie/admin 1.1.1 → 3.0.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 (566) hide show
  1. package/README.md +256 -488
  2. package/dist/augmentation.d.mts +414 -0
  3. package/dist/client/blocks/block-renderer.d.mts +45 -0
  4. package/dist/client/blocks/block-renderer.mjs +105 -0
  5. package/dist/client/blocks/index.d.mts +2 -0
  6. package/dist/client/blocks/types.d.mts +68 -0
  7. package/dist/client/blocks/types.mjs +19 -0
  8. package/dist/client/builder/admin-types.d.mts +40 -0
  9. package/dist/client/builder/admin.d.mts +110 -0
  10. package/dist/client/builder/admin.mjs +151 -0
  11. package/dist/client/builder/field/field.d.mts +51 -0
  12. package/dist/client/builder/field/field.mjs +37 -0
  13. package/dist/client/builder/index.d.mts +31 -0
  14. package/dist/client/builder/page/page.d.mts +24 -0
  15. package/dist/client/builder/page/page.mjs +31 -0
  16. package/dist/client/builder/registry.d.mts +50 -0
  17. package/dist/client/builder/types/action-registry.mjs +276 -0
  18. package/dist/client/builder/types/action-types.d.mts +226 -0
  19. package/dist/client/builder/types/collection-types.mjs +10 -0
  20. package/dist/client/builder/types/common.d.mts +46 -0
  21. package/dist/client/builder/types/field-types.d.mts +592 -0
  22. package/dist/client/builder/types/field-types.mjs +18 -0
  23. package/dist/client/builder/types/ui-config.d.mts +158 -0
  24. package/dist/client/builder/types/widget-types.d.mts +562 -0
  25. package/dist/client/builder/validation.d.mts +33 -0
  26. package/dist/client/builder/validation.mjs +227 -0
  27. package/dist/client/builder/view/view.d.mts +49 -0
  28. package/dist/client/builder/view/view.mjs +27 -0
  29. package/dist/client/builder/widget/widget.d.mts +27 -0
  30. package/dist/client/builder/widget/widget.mjs +21 -0
  31. package/dist/client/components/actions/action-button.mjs +245 -0
  32. package/dist/client/components/actions/action-dialog.mjs +559 -0
  33. package/dist/client/components/actions/confirmation-dialog.mjs +201 -0
  34. package/dist/client/components/actions/header-actions.mjs +210 -0
  35. package/dist/client/components/admin-link.d.mts +66 -0
  36. package/dist/client/components/admin-link.mjs +171 -0
  37. package/dist/client/components/auth/auth-guard.d.mts +50 -0
  38. package/dist/client/components/auth/auth-guard.mjs +60 -0
  39. package/dist/client/components/auth/auth-loading.d.mts +35 -0
  40. package/dist/client/components/auth/auth-loading.mjs +55 -0
  41. package/dist/client/components/blocks/block-canvas.mjs +159 -0
  42. package/dist/client/components/blocks/block-editor-context.mjs +125 -0
  43. package/dist/client/components/blocks/block-editor-layout.mjs +199 -0
  44. package/dist/client/components/blocks/block-editor-provider.mjs +235 -0
  45. package/dist/client/components/blocks/block-fields-renderer.mjs +240 -0
  46. package/dist/client/components/blocks/block-insert-button.mjs +189 -0
  47. package/dist/client/components/blocks/block-item-menu.mjs +363 -0
  48. package/dist/client/components/blocks/block-item.mjs +434 -0
  49. package/dist/client/components/blocks/block-library-sidebar.mjs +285 -0
  50. package/dist/client/components/blocks/block-tree.mjs +103 -0
  51. package/dist/client/components/blocks/block-type-icon.mjs +95 -0
  52. package/dist/client/components/blocks/utils/tree-utils.mjs +185 -0
  53. package/dist/client/components/component-renderer.d.mts +114 -0
  54. package/dist/client/components/component-renderer.mjs +258 -0
  55. package/dist/client/components/error-boundary.mjs +144 -0
  56. package/dist/client/components/fields/array-field.mjs +506 -0
  57. package/dist/client/components/fields/asset-preview-field.mjs +159 -0
  58. package/dist/client/components/fields/blocks-field/blocks-field.mjs +209 -0
  59. package/dist/client/components/fields/boolean-field.mjs +77 -0
  60. package/dist/client/components/fields/date-field.mjs +76 -0
  61. package/dist/client/components/fields/datetime-field.mjs +74 -0
  62. package/dist/client/components/fields/email-field.mjs +67 -0
  63. package/dist/client/components/fields/field-utils.mjs +64 -0
  64. package/dist/client/components/fields/field-wrapper.mjs +124 -0
  65. package/dist/client/components/fields/json-field.mjs +461 -0
  66. package/dist/client/components/fields/locale-badge.mjs +25 -0
  67. package/dist/client/components/fields/number-field.mjs +73 -0
  68. package/dist/client/components/fields/object-array-field.mjs +707 -0
  69. package/dist/client/components/fields/object-field.mjs +686 -0
  70. package/dist/client/components/fields/relation/displays/cards-display.mjs +254 -0
  71. package/dist/client/components/fields/relation/displays/chips-display.mjs +173 -0
  72. package/dist/client/components/fields/relation/displays/grid-display.mjs +209 -0
  73. package/dist/client/components/fields/relation/displays/list-display.mjs +247 -0
  74. package/dist/client/components/fields/relation/displays/table-display.mjs +309 -0
  75. package/dist/client/components/fields/relation/displays/types.mjs +72 -0
  76. package/dist/client/components/fields/relation/relation-items-display.mjs +143 -0
  77. package/dist/client/components/fields/relation-field.mjs +161 -0
  78. package/dist/client/components/fields/relation-picker.mjs +296 -0
  79. package/dist/client/components/fields/relation-select.mjs +232 -0
  80. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +105 -0
  81. package/dist/client/components/fields/rich-text-editor/extensions.mjs +144 -0
  82. package/dist/client/components/fields/rich-text-editor/image-popover.mjs +221 -0
  83. package/dist/client/components/fields/rich-text-editor/index.mjs +520 -0
  84. package/dist/client/components/fields/rich-text-editor/link-popover.mjs +85 -0
  85. package/dist/client/components/fields/rich-text-editor/presets.mjs +123 -0
  86. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +188 -0
  87. package/dist/client/components/fields/rich-text-editor/table-controls.mjs +433 -0
  88. package/dist/client/components/fields/rich-text-editor/toolbar.mjs +541 -0
  89. package/dist/client/components/fields/rich-text-editor/types.mjs +30 -0
  90. package/dist/client/components/fields/rich-text-editor/utils.mjs +50 -0
  91. package/dist/client/components/fields/rich-text-field.mjs +64 -0
  92. package/dist/client/components/fields/select-field.mjs +88 -0
  93. package/dist/client/components/fields/text-field.mjs +72 -0
  94. package/dist/client/components/fields/textarea-field.mjs +71 -0
  95. package/dist/client/components/fields/time-field.mjs +67 -0
  96. package/dist/client/components/fields/upload-field.mjs +621 -0
  97. package/dist/client/components/filter-builder/columns-tab.mjs +325 -0
  98. package/dist/client/components/filter-builder/filter-builder-sheet.mjs +456 -0
  99. package/dist/client/components/filter-builder/filters-tab.mjs +663 -0
  100. package/dist/client/components/filter-builder/saved-views-tab.mjs +278 -0
  101. package/dist/client/components/history-sidebar.mjs +496 -0
  102. package/dist/client/components/layout/field-layout-renderer.mjs +301 -0
  103. package/dist/client/components/locale-switcher.mjs +251 -0
  104. package/dist/client/components/media/media-grid.mjs +314 -0
  105. package/dist/client/components/media/media-picker-dialog.mjs +563 -0
  106. package/dist/client/components/preview/live-preview-mode.mjs +503 -0
  107. package/dist/client/components/preview/preview-pane.mjs +388 -0
  108. package/dist/client/components/primitives/asset-preview.mjs +771 -0
  109. package/dist/client/components/primitives/checkbox-input.mjs +59 -0
  110. package/dist/client/components/primitives/date-input.mjs +461 -0
  111. package/dist/client/components/primitives/dropzone.mjs +368 -0
  112. package/dist/client/components/primitives/number-input.mjs +117 -0
  113. package/dist/client/components/primitives/select-multi.mjs +590 -0
  114. package/dist/client/components/primitives/select-single.mjs +473 -0
  115. package/dist/client/components/primitives/text-input.mjs +45 -0
  116. package/dist/client/components/primitives/textarea-input.mjs +43 -0
  117. package/dist/client/components/primitives/time-input.mjs +145 -0
  118. package/dist/client/components/primitives/toggle-input.mjs +51 -0
  119. package/dist/client/components/primitives/types.mjs +12 -0
  120. package/dist/client/components/sheets/resource-sheet.mjs +86 -0
  121. package/dist/client/components/ui/accordion.mjs +169 -0
  122. package/dist/client/components/ui/alert.mjs +85 -0
  123. package/dist/client/components/ui/badge.mjs +76 -0
  124. package/dist/client/components/ui/button.mjs +84 -0
  125. package/dist/client/components/ui/card.mjs +206 -0
  126. package/dist/client/components/ui/checkbox.mjs +82 -0
  127. package/dist/client/components/ui/command.mjs +239 -0
  128. package/dist/client/components/ui/dialog.mjs +296 -0
  129. package/dist/client/components/ui/drawer.mjs +278 -0
  130. package/dist/client/components/ui/dropdown-menu.mjs +315 -0
  131. package/dist/client/components/ui/empty-state.mjs +99 -0
  132. package/dist/client/components/ui/field.mjs +354 -0
  133. package/dist/client/components/ui/input-group.mjs +201 -0
  134. package/dist/client/components/ui/input.mjs +46 -0
  135. package/dist/client/components/ui/kbd.mjs +53 -0
  136. package/dist/client/components/ui/label.mjs +45 -0
  137. package/dist/client/components/ui/popover.mjs +176 -0
  138. package/dist/client/components/ui/responsive-dialog.mjs +308 -0
  139. package/dist/client/components/ui/search-input.mjs +139 -0
  140. package/dist/client/components/ui/select.mjs +325 -0
  141. package/dist/client/components/ui/separator.mjs +47 -0
  142. package/dist/client/components/ui/sheet.mjs +280 -0
  143. package/dist/client/components/ui/sidebar.mjs +774 -0
  144. package/dist/client/components/ui/skeleton.mjs +40 -0
  145. package/dist/client/components/ui/sonner.d.mts +13 -0
  146. package/dist/client/components/ui/sonner.mjs +85 -0
  147. package/dist/client/components/ui/spinner.mjs +52 -0
  148. package/dist/client/components/ui/switch.mjs +58 -0
  149. package/dist/client/components/ui/table.mjs +276 -0
  150. package/dist/client/components/ui/tabs.mjs +160 -0
  151. package/dist/client/components/ui/textarea.mjs +40 -0
  152. package/dist/client/components/ui/toolbar.mjs +136 -0
  153. package/dist/client/components/ui/tooltip.mjs +146 -0
  154. package/dist/client/components/widgets/chart-widget.mjs +582 -0
  155. package/dist/client/components/widgets/progress-widget.mjs +200 -0
  156. package/dist/client/components/widgets/quick-actions-widget.mjs +209 -0
  157. package/dist/client/components/widgets/recent-items-widget.mjs +196 -0
  158. package/dist/client/components/widgets/stats-widget.mjs +261 -0
  159. package/dist/client/components/widgets/table-widget.mjs +273 -0
  160. package/dist/client/components/widgets/timeline-widget.mjs +279 -0
  161. package/dist/client/components/widgets/value-widget.mjs +312 -0
  162. package/dist/client/components/widgets/widget-skeletons.mjs +427 -0
  163. package/dist/client/contexts/breadcrumb-context.mjs +60 -0
  164. package/dist/client/contexts/focus-context.d.mts +87 -0
  165. package/dist/client/contexts/focus-context.mjs +250 -0
  166. package/dist/client/hooks/typed-hooks.d.mts +110 -0
  167. package/dist/client/hooks/typed-hooks.mjs +888 -0
  168. package/dist/client/hooks/use-action.mjs +329 -0
  169. package/dist/client/hooks/use-admin-config.mjs +69 -0
  170. package/dist/client/hooks/use-admin-preferences.mjs +171 -0
  171. package/dist/client/hooks/use-admin-routes.mjs +130 -0
  172. package/dist/client/hooks/use-audit-history.mjs +157 -0
  173. package/dist/client/hooks/use-auth.d.mts +97 -0
  174. package/dist/{use-auth-BoLmWtmU.mjs → client/hooks/use-auth.mjs} +9 -10
  175. package/dist/client/hooks/use-collection-fields.mjs +71 -0
  176. package/dist/client/hooks/use-collection-meta.mjs +153 -0
  177. package/dist/client/hooks/use-collection-schema.mjs +90 -0
  178. package/dist/client/hooks/use-collection-validation.mjs +88 -0
  179. package/dist/client/hooks/use-collection.d.mts +96 -0
  180. package/dist/client/hooks/use-collection.mjs +673 -0
  181. package/dist/client/hooks/use-current-user.d.mts +60 -0
  182. package/dist/client/hooks/use-current-user.mjs +79 -0
  183. package/dist/client/hooks/use-field-hooks.mjs +199 -0
  184. package/dist/client/hooks/use-field-options.d.mts +57 -0
  185. package/dist/client/hooks/use-field-options.mjs +269 -0
  186. package/dist/client/hooks/use-global-fields.mjs +58 -0
  187. package/dist/client/hooks/use-global-meta.mjs +105 -0
  188. package/dist/client/hooks/use-global-schema.mjs +53 -0
  189. package/dist/client/hooks/use-global.d.mts +51 -0
  190. package/dist/client/hooks/use-global.mjs +284 -0
  191. package/dist/client/hooks/use-locks.mjs +452 -0
  192. package/dist/client/hooks/use-media-query.d.mts +22 -0
  193. package/dist/client/hooks/use-media-query.mjs +81 -0
  194. package/dist/client/hooks/use-prefill-params.mjs +47 -0
  195. package/dist/client/hooks/use-questpie-query-options.mjs +50 -0
  196. package/dist/client/hooks/use-reactive-fields.d.mts +78 -0
  197. package/dist/client/hooks/use-reactive-fields.mjs +201 -0
  198. package/dist/client/hooks/use-realtime-highlight.mjs +158 -0
  199. package/dist/client/hooks/use-saved-views.mjs +140 -0
  200. package/dist/client/hooks/use-search-param-toggle.d.mts +12 -0
  201. package/dist/client/hooks/use-search-param-toggle.mjs +115 -0
  202. package/dist/client/hooks/use-search.mjs +258 -0
  203. package/dist/client/hooks/use-server-actions.mjs +191 -0
  204. package/dist/client/hooks/use-server-validation.mjs +291 -0
  205. package/dist/client/hooks/use-server-widget-data.d.mts +25 -0
  206. package/dist/client/hooks/use-server-widget-data.mjs +65 -0
  207. package/dist/client/hooks/use-setup-status.d.mts +38 -0
  208. package/dist/client/hooks/use-setup-status.mjs +62 -0
  209. package/dist/client/hooks/use-sidebar-search-param.d.mts +9 -0
  210. package/dist/client/hooks/use-sidebar-search-param.mjs +104 -0
  211. package/dist/client/hooks/use-transition-stage.mjs +125 -0
  212. package/dist/client/hooks/use-upload-collection.mjs +31 -0
  213. package/dist/client/hooks/use-upload.mjs +209 -0
  214. package/dist/client/hooks/use-validation-error-map.mjs +57 -0
  215. package/dist/client/hooks/use-view-state.mjs +479 -0
  216. package/dist/client/i18n/hooks.mjs +284 -0
  217. package/dist/client/i18n/intl-cache.mjs +64 -0
  218. package/dist/client/i18n/messages.mjs +6 -0
  219. package/dist/client/i18n/simple.d.mts +21 -0
  220. package/dist/client/i18n/simple.mjs +156 -0
  221. package/dist/client/i18n/types.d.mts +109 -0
  222. package/dist/client/lib/cookies.mjs +9 -0
  223. package/dist/client/lib/events.mjs +5 -0
  224. package/dist/client/lib/render-profiler.mjs +51 -0
  225. package/dist/client/lib/utils.mjs +23 -0
  226. package/dist/client/preview/block-scope-context.d.mts +73 -0
  227. package/dist/client/preview/block-scope-context.mjs +116 -0
  228. package/dist/client/preview/index.d.mts +5 -0
  229. package/dist/client/preview/preview-banner.d.mts +45 -0
  230. package/dist/client/preview/preview-banner.mjs +134 -0
  231. package/dist/client/preview/preview-field.d.mts +107 -0
  232. package/dist/client/preview/preview-field.mjs +227 -0
  233. package/dist/client/preview/types.d.mts +114 -0
  234. package/dist/client/preview/types.mjs +20 -0
  235. package/dist/client/preview/use-collection-preview.d.mts +70 -0
  236. package/dist/client/preview/use-collection-preview.mjs +163 -0
  237. package/dist/client/runtime/content-locales-provider.d.mts +1 -0
  238. package/dist/client/runtime/content-locales-provider.mjs +136 -0
  239. package/dist/client/runtime/index.d.mts +5 -0
  240. package/dist/client/runtime/index.mjs +6 -0
  241. package/dist/client/runtime/locale-scope.d.mts +2 -0
  242. package/dist/client/runtime/locale-scope.mjs +108 -0
  243. package/dist/client/runtime/provider.d.mts +203 -0
  244. package/dist/client/runtime/provider.mjs +393 -0
  245. package/dist/client/runtime/routes.d.mts +49 -0
  246. package/dist/client/runtime/routes.mjs +91 -0
  247. package/dist/client/runtime/translations-provider.mjs +242 -0
  248. package/dist/client/scope/index.d.mts +3 -0
  249. package/dist/client/scope/picker.d.mts +53 -0
  250. package/dist/client/scope/picker.mjs +395 -0
  251. package/dist/client/scope/provider.d.mts +103 -0
  252. package/dist/client/scope/provider.mjs +167 -0
  253. package/dist/client/scope/types.d.mts +111 -0
  254. package/dist/client/styles/index.css +344 -188
  255. package/dist/client/utils/auto-expand-fields.mjs +83 -0
  256. package/dist/client/utils/build-field-definitions-from-schema.mjs +259 -0
  257. package/dist/client/utils/dependency-tracker.mjs +61 -0
  258. package/dist/client/utils/detect-relations.mjs +45 -0
  259. package/dist/client/utils/locale-to-flag.d.mts +119 -0
  260. package/dist/client/utils/locale-to-flag.mjs +129 -0
  261. package/dist/client/utils/routes.mjs +195 -0
  262. package/dist/client/views/auth/accept-invite-form.d.mts +72 -0
  263. package/dist/client/views/auth/accept-invite-form.mjs +473 -0
  264. package/dist/client/views/auth/auth-layout.d.mts +43 -0
  265. package/dist/client/views/auth/auth-layout.mjs +116 -0
  266. package/dist/client/views/auth/forgot-password-form.d.mts +58 -0
  267. package/dist/client/views/auth/forgot-password-form.mjs +386 -0
  268. package/dist/client/views/auth/invite-form.mjs +497 -0
  269. package/dist/client/views/auth/login-form.d.mts +75 -0
  270. package/dist/client/views/auth/login-form.mjs +387 -0
  271. package/dist/client/views/auth/reset-password-form.d.mts +65 -0
  272. package/dist/client/views/auth/reset-password-form.mjs +515 -0
  273. package/dist/client/views/auth/setup-form.d.mts +60 -0
  274. package/dist/client/views/auth/setup-form.mjs +526 -0
  275. package/dist/client/views/collection/auto-form-fields.mjs +873 -0
  276. package/dist/client/views/collection/bulk-action-toolbar.mjs +480 -0
  277. package/dist/client/views/collection/cells/complex-cells.mjs +746 -0
  278. package/dist/client/views/collection/cells/primitive-cells.mjs +395 -0
  279. package/dist/client/views/collection/cells/relation-cells.mjs +260 -0
  280. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +509 -0
  281. package/dist/client/views/collection/cells/shared/cell-helpers.mjs +125 -0
  282. package/dist/client/views/collection/cells/shared/relation-chip.mjs +121 -0
  283. package/dist/client/views/collection/cells/upload-cells.mjs +28 -0
  284. package/dist/client/views/collection/columns/build-columns.mjs +195 -0
  285. package/dist/client/views/collection/columns/column-defaults.mjs +123 -0
  286. package/dist/client/views/collection/field-context.mjs +126 -0
  287. package/dist/client/views/collection/field-renderer.mjs +368 -0
  288. package/dist/client/views/collection/form-view.mjs +1566 -0
  289. package/dist/client/views/collection/table-view.mjs +832 -0
  290. package/dist/client/views/collection/view-skeletons.mjs +215 -0
  291. package/dist/client/views/common/global-search.mjs +700 -0
  292. package/dist/client/views/dashboard/dashboard-grid.mjs +881 -0
  293. package/dist/client/views/dashboard/dashboard-widget.mjs +265 -0
  294. package/dist/client/views/dashboard/widget-card.mjs +372 -0
  295. package/dist/client/views/globals/global-form-view.mjs +1306 -0
  296. package/dist/client/views/layout/admin-layout-provider.d.mts +137 -0
  297. package/dist/client/views/layout/admin-layout-provider.mjs +193 -0
  298. package/dist/client/views/layout/admin-layout.d.mts +133 -0
  299. package/dist/client/views/layout/admin-layout.mjs +302 -0
  300. package/dist/client/views/layout/admin-router.d.mts +93 -0
  301. package/dist/client/views/layout/admin-router.mjs +1254 -0
  302. package/dist/client/views/layout/admin-sidebar.d.mts +99 -0
  303. package/dist/client/views/layout/admin-sidebar.mjs +1379 -0
  304. package/dist/client/views/layout/admin-topbar.mjs +236 -0
  305. package/dist/client/views/pages/accept-invite-page.d.mts +66 -0
  306. package/dist/client/views/pages/accept-invite-page.mjs +349 -0
  307. package/dist/client/views/pages/dashboard-page.d.mts +43 -0
  308. package/dist/client/views/pages/dashboard-page.mjs +84 -0
  309. package/dist/client/views/pages/forgot-password-page.d.mts +56 -0
  310. package/dist/client/views/pages/forgot-password-page.mjs +152 -0
  311. package/dist/client/views/pages/invite-page.d.mts +70 -0
  312. package/dist/client/views/pages/invite-page.mjs +161 -0
  313. package/dist/client/views/pages/login-page.d.mts +69 -0
  314. package/dist/client/views/pages/login-page.mjs +193 -0
  315. package/dist/client/views/pages/reset-password-page.d.mts +63 -0
  316. package/dist/client/views/pages/reset-password-page.mjs +257 -0
  317. package/dist/client/views/pages/setup-page.d.mts +61 -0
  318. package/dist/client/views/pages/setup-page.mjs +156 -0
  319. package/dist/client-module.d.mts +3 -0
  320. package/dist/client-module.mjs +3 -0
  321. package/dist/client.d.mts +99 -3
  322. package/dist/client.mjs +52 -12
  323. package/dist/components/rich-text/index.d.mts +1 -0
  324. package/dist/components/rich-text/rich-text-renderer.d.mts +103 -0
  325. package/dist/components/rich-text/rich-text-renderer.mjs +237 -0
  326. package/dist/index.d.mts +59 -3
  327. package/dist/index.mjs +52 -12
  328. package/dist/plugin.d.mts +2 -0
  329. package/dist/plugin.mjs +3 -0
  330. package/dist/server/adapters/nextjs.d.mts +120 -0
  331. package/dist/server/adapters/nextjs.mjs +110 -0
  332. package/dist/server/adapters/tanstack.d.mts +132 -0
  333. package/dist/server/adapters/tanstack.mjs +89 -0
  334. package/dist/server/augmentation/actions.d.mts +279 -0
  335. package/dist/server/augmentation/common.d.mts +76 -0
  336. package/dist/server/augmentation/dashboard.d.mts +547 -0
  337. package/dist/server/augmentation/form-layout.d.mts +303 -0
  338. package/dist/server/augmentation/index.d.mts +44 -0
  339. package/dist/server/augmentation/index.mjs +10 -0
  340. package/dist/server/augmentation/sidebar.d.mts +181 -0
  341. package/dist/server/augmentation/views.d.mts +237 -0
  342. package/dist/server/augmentation.d.mts +7 -0
  343. package/dist/server/block/index.d.mts +4 -0
  344. package/dist/server/codegen/admin-client-template.mjs +93 -0
  345. package/dist/server/codegen/projection-validator.mjs +67 -0
  346. package/dist/server/fields/blocks.d.mts +71 -0
  347. package/dist/server/fields/blocks.mjs +151 -0
  348. package/dist/server/fields/index.d.mts +15 -0
  349. package/dist/server/fields/index.mjs +15 -0
  350. package/dist/server/fields/rich-text.d.mts +68 -0
  351. package/dist/server/fields/rich-text.mjs +147 -0
  352. package/dist/server/i18n/index.mjs +43 -0
  353. package/dist/server/i18n/messages/cs.mjs +461 -0
  354. package/dist/server/i18n/messages/de.mjs +461 -0
  355. package/dist/server/i18n/messages/en.mjs +707 -0
  356. package/dist/server/i18n/messages/es.mjs +461 -0
  357. package/dist/server/i18n/messages/fr.mjs +461 -0
  358. package/dist/server/i18n/messages/index.mjs +23 -0
  359. package/dist/server/i18n/messages/pl.mjs +461 -0
  360. package/dist/server/i18n/messages/pt.mjs +464 -0
  361. package/dist/server/i18n/messages/sk.mjs +689 -0
  362. package/dist/server/modules/admin/.generated/module.d.mts +52 -0
  363. package/dist/server/modules/admin/.generated/module.mjs +78 -0
  364. package/dist/server/modules/admin/.generated/registries.d.mts +22 -0
  365. package/dist/server/modules/admin/auth-helpers.d.mts +142 -0
  366. package/dist/server/modules/admin/auth-helpers.mjs +107 -0
  367. package/dist/server/modules/admin/block/block-builder.d.mts +383 -0
  368. package/dist/server/modules/admin/block/block-builder.mjs +315 -0
  369. package/dist/server/modules/admin/block/index.d.mts +3 -0
  370. package/dist/server/modules/admin/block/introspection.d.mts +89 -0
  371. package/dist/server/modules/admin/block/introspection.mjs +100 -0
  372. package/dist/server/modules/admin/block/prefetch.d.mts +78 -0
  373. package/dist/server/modules/admin/block/prefetch.mjs +241 -0
  374. package/dist/server/modules/admin/client/.generated/module.d.mts +94 -0
  375. package/dist/server/modules/admin/client/.generated/module.mjs +91 -0
  376. package/dist/server/modules/admin/client/components/badge.d.mts +1 -0
  377. package/dist/server/modules/admin/client/components/icon.d.mts +1 -0
  378. package/dist/server/modules/admin/client/fields/array.d.mts +6 -0
  379. package/dist/server/modules/admin/client/fields/array.mjs +12 -0
  380. package/dist/server/modules/admin/client/fields/assetPreview.d.mts +6 -0
  381. package/dist/server/modules/admin/client/fields/assetPreview.mjs +18 -0
  382. package/dist/server/modules/admin/client/fields/blocks.d.mts +6 -0
  383. package/dist/server/modules/admin/client/fields/blocks.mjs +12 -0
  384. package/dist/server/modules/admin/client/fields/boolean.d.mts +6 -0
  385. package/dist/server/modules/admin/client/fields/boolean.mjs +12 -0
  386. package/dist/server/modules/admin/client/fields/date.d.mts +6 -0
  387. package/dist/server/modules/admin/client/fields/date.mjs +12 -0
  388. package/dist/server/modules/admin/client/fields/datetime.d.mts +6 -0
  389. package/dist/server/modules/admin/client/fields/datetime.mjs +12 -0
  390. package/dist/server/modules/admin/client/fields/email.d.mts +6 -0
  391. package/dist/server/modules/admin/client/fields/email.mjs +12 -0
  392. package/dist/server/modules/admin/client/fields/json.d.mts +6 -0
  393. package/dist/server/modules/admin/client/fields/json.mjs +11 -0
  394. package/dist/server/modules/admin/client/fields/number.d.mts +6 -0
  395. package/dist/server/modules/admin/client/fields/number.mjs +12 -0
  396. package/dist/server/modules/admin/client/fields/object.d.mts +6 -0
  397. package/dist/server/modules/admin/client/fields/object.mjs +12 -0
  398. package/dist/server/modules/admin/client/fields/relation.d.mts +6 -0
  399. package/dist/server/modules/admin/client/fields/relation.mjs +12 -0
  400. package/dist/server/modules/admin/client/fields/richText.d.mts +6 -0
  401. package/dist/server/modules/admin/client/fields/richText.mjs +11 -0
  402. package/dist/server/modules/admin/client/fields/select.d.mts +6 -0
  403. package/dist/server/modules/admin/client/fields/select.mjs +12 -0
  404. package/dist/server/modules/admin/client/fields/text.d.mts +6 -0
  405. package/dist/server/modules/admin/client/fields/text.mjs +12 -0
  406. package/dist/server/modules/admin/client/fields/textarea.d.mts +6 -0
  407. package/dist/server/modules/admin/client/fields/textarea.mjs +12 -0
  408. package/dist/server/modules/admin/client/fields/time.d.mts +6 -0
  409. package/dist/server/modules/admin/client/fields/time.mjs +12 -0
  410. package/dist/server/modules/admin/client/fields/upload.d.mts +6 -0
  411. package/dist/server/modules/admin/client/fields/upload.mjs +12 -0
  412. package/dist/server/modules/admin/client/fields/url.d.mts +6 -0
  413. package/dist/server/modules/admin/client/fields/url.mjs +12 -0
  414. package/dist/server/modules/admin/client/index.d.mts +1 -0
  415. package/dist/server/modules/admin/client/pages/dashboard.d.mts +6 -0
  416. package/dist/server/modules/admin/client/pages/dashboard.mjs +11 -0
  417. package/dist/server/modules/admin/client/pages/forgotPassword.d.mts +6 -0
  418. package/dist/server/modules/admin/client/pages/forgotPassword.mjs +11 -0
  419. package/dist/server/modules/admin/client/pages/login.d.mts +6 -0
  420. package/dist/server/modules/admin/client/pages/login.mjs +11 -0
  421. package/dist/server/modules/admin/client/pages/resetPassword.d.mts +6 -0
  422. package/dist/server/modules/admin/client/pages/resetPassword.mjs +11 -0
  423. package/dist/server/modules/admin/client/pages/setup.d.mts +6 -0
  424. package/dist/server/modules/admin/client/pages/setup.mjs +11 -0
  425. package/dist/server/modules/admin/client/views/collection-form.mjs +10 -0
  426. package/dist/server/modules/admin/client/views/collection-table.mjs +10 -0
  427. package/dist/server/modules/admin/client/views/global-form.mjs +10 -0
  428. package/dist/server/modules/admin/client/widgets/chart.d.mts +6 -0
  429. package/dist/server/modules/admin/client/widgets/chart.mjs +7 -0
  430. package/dist/server/modules/admin/client/widgets/progress.d.mts +6 -0
  431. package/dist/server/modules/admin/client/widgets/progress.mjs +7 -0
  432. package/dist/server/modules/admin/client/widgets/quickActions.d.mts +6 -0
  433. package/dist/server/modules/admin/client/widgets/quickActions.mjs +7 -0
  434. package/dist/server/modules/admin/client/widgets/recentItems.d.mts +6 -0
  435. package/dist/server/modules/admin/client/widgets/recentItems.mjs +7 -0
  436. package/dist/server/modules/admin/client/widgets/stats.d.mts +6 -0
  437. package/dist/server/modules/admin/client/widgets/stats.mjs +7 -0
  438. package/dist/server/modules/admin/client/widgets/table.d.mts +6 -0
  439. package/dist/server/modules/admin/client/widgets/table.mjs +7 -0
  440. package/dist/server/modules/admin/client/widgets/timeline.d.mts +6 -0
  441. package/dist/server/modules/admin/client/widgets/timeline.mjs +7 -0
  442. package/dist/server/modules/admin/client/widgets/value.d.mts +6 -0
  443. package/dist/server/modules/admin/client/widgets/value.mjs +7 -0
  444. package/dist/server/modules/admin/collections/account.d.mts +77 -0
  445. package/dist/server/modules/admin/collections/account.mjs +23 -0
  446. package/dist/server/modules/admin/collections/admin-locks.d.mts +90 -0
  447. package/dist/server/modules/admin/collections/admin-locks.mjs +16 -0
  448. package/dist/server/modules/admin/collections/admin-preferences.d.mts +69 -0
  449. package/dist/server/modules/admin/collections/admin-preferences.mjs +16 -0
  450. package/dist/server/modules/admin/collections/admin-saved-views.d.mts +83 -0
  451. package/dist/server/modules/admin/collections/admin-saved-views.mjs +16 -0
  452. package/dist/server/modules/admin/collections/apikey.d.mts +99 -0
  453. package/dist/server/modules/admin/collections/apikey.mjs +15 -0
  454. package/dist/server/modules/admin/collections/assets.d.mts +72 -0
  455. package/dist/server/modules/admin/collections/assets.mjs +71 -0
  456. package/dist/server/modules/admin/collections/session.d.mts +69 -0
  457. package/dist/server/modules/admin/collections/session.mjs +15 -0
  458. package/dist/server/modules/admin/collections/user.d.mts +85 -0
  459. package/dist/server/modules/admin/collections/user.mjs +204 -0
  460. package/dist/server/modules/admin/collections/verification.d.mts +63 -0
  461. package/dist/server/modules/admin/collections/verification.mjs +15 -0
  462. package/dist/server/modules/admin/components/badge.d.mts +10 -0
  463. package/dist/server/modules/admin/components/badge.mjs +10 -0
  464. package/dist/server/modules/admin/components/icon.d.mts +9 -0
  465. package/dist/server/modules/admin/components/icon.mjs +11 -0
  466. package/dist/server/modules/admin/config/admin.mjs +34 -0
  467. package/dist/server/modules/admin/dto/admin-config.dto.mjs +102 -0
  468. package/dist/server/modules/admin/factories.mjs +172 -0
  469. package/dist/server/modules/admin/index.d.mts +1093 -0
  470. package/dist/server/modules/admin/index.mjs +26 -0
  471. package/dist/server/modules/admin/modules.mjs +11 -0
  472. package/dist/server/modules/admin/plugin.mjs +13 -0
  473. package/dist/server/modules/admin/routes/admin-config.d.mts +28 -0
  474. package/dist/server/modules/admin/routes/admin-config.mjs +552 -0
  475. package/dist/server/modules/admin/routes/execute-action.d.mts +92 -0
  476. package/dist/server/modules/admin/routes/execute-action.mjs +433 -0
  477. package/dist/server/modules/admin/routes/locales.d.mts +18 -0
  478. package/dist/server/modules/admin/routes/locales.mjs +69 -0
  479. package/dist/server/modules/admin/routes/preview.d.mts +80 -0
  480. package/dist/server/modules/admin/routes/preview.mjs +230 -0
  481. package/dist/server/modules/admin/routes/reactive.d.mts +74 -0
  482. package/dist/server/modules/admin/routes/reactive.mjs +350 -0
  483. package/dist/server/modules/admin/routes/route-helpers.d.mts +23 -0
  484. package/dist/server/modules/admin/routes/route-helpers.mjs +76 -0
  485. package/dist/server/modules/admin/routes/setup.d.mts +63 -0
  486. package/dist/server/modules/admin/routes/setup.mjs +114 -0
  487. package/dist/server/modules/admin/routes/translations.d.mts +26 -0
  488. package/dist/server/modules/admin/routes/translations.mjs +114 -0
  489. package/dist/server/modules/admin/routes/widget-data.d.mts +32 -0
  490. package/dist/server/modules/admin/routes/widget-data.mjs +62 -0
  491. package/dist/server/modules/admin/views/form.d.mts +8 -0
  492. package/dist/server/modules/admin/views/form.mjs +7 -0
  493. package/dist/server/modules/admin/views/global-form.d.mts +8 -0
  494. package/dist/server/modules/admin/views/global-form.mjs +7 -0
  495. package/dist/server/modules/admin/views/table.d.mts +8 -0
  496. package/dist/server/modules/admin/views/table.mjs +7 -0
  497. package/dist/server/modules/admin-preferences/collections/admin-preferences.mjs +37 -0
  498. package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +55 -0
  499. package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +99 -0
  500. package/dist/server/modules/admin-preferences/collections/saved-views.mjs +38 -0
  501. package/dist/server/modules/audit/.generated/module.d.mts +60 -0
  502. package/dist/server/modules/audit/.generated/module.mjs +30 -0
  503. package/dist/server/modules/audit/collections/audit-log.d.mts +214 -0
  504. package/dist/server/modules/audit/collections/audit-log.mjs +107 -0
  505. package/dist/server/modules/audit/config/admin.mjs +21 -0
  506. package/dist/server/modules/audit/config/app.mjs +262 -0
  507. package/dist/server/modules/audit/index.d.mts +2 -0
  508. package/dist/server/modules/audit/jobs/audit-cleanup.d.mts +13 -0
  509. package/dist/server/modules/audit/jobs/audit-cleanup.mjs +28 -0
  510. package/dist/server/plugin.d.mts +26 -0
  511. package/dist/server/plugin.mjs +385 -0
  512. package/dist/server/proxy-factories.d.mts +85 -0
  513. package/dist/server/proxy-factories.mjs +302 -0
  514. package/dist/server/registry-helpers.d.mts +83 -0
  515. package/dist/server/registry-helpers.mjs +104 -0
  516. package/dist/server.d.mts +33 -250
  517. package/dist/server.mjs +22 -832
  518. package/dist/shared/preview-utils.d.mts +53 -0
  519. package/dist/{preview-utils-BKQ9-TMa.mjs → shared/preview-utils.mjs} +2 -3
  520. package/dist/{saved-views.types-BMsz5mCy.d.mts → shared/types/saved-views.types.d.mts} +7 -2
  521. package/dist/shared.d.mts +3 -57
  522. package/dist/shared.mjs +1 -1
  523. package/package.json +56 -51
  524. package/skills/questpie-admin/SKILL.md +397 -0
  525. package/skills/questpie-admin/blocks/SKILL.md +305 -0
  526. package/skills/questpie-admin/custom-ui/SKILL.md +307 -0
  527. package/skills/questpie-admin/views/SKILL.md +442 -0
  528. package/dist/auth-layout-M8K8_q5R.mjs +0 -181
  529. package/dist/auth-layout-M8K8_q5R.mjs.map +0 -1
  530. package/dist/bulk-upload-dialog-D7w7W1Hl.mjs +0 -273
  531. package/dist/bulk-upload-dialog-D7w7W1Hl.mjs.map +0 -1
  532. package/dist/card-BKHjBQfw.mjs +0 -58
  533. package/dist/card-BKHjBQfw.mjs.map +0 -1
  534. package/dist/client-D1DqawtP.d.mts +0 -13403
  535. package/dist/client-D1DqawtP.d.mts.map +0 -1
  536. package/dist/client-njX1rZmi.mjs +0 -22612
  537. package/dist/client-njX1rZmi.mjs.map +0 -1
  538. package/dist/content-locales-provider-BXvuIgfg.mjs +0 -1650
  539. package/dist/content-locales-provider-BXvuIgfg.mjs.map +0 -1
  540. package/dist/dashboard-page-B4PGEdc2.mjs +0 -2500
  541. package/dist/dashboard-page-B4PGEdc2.mjs.map +0 -1
  542. package/dist/dashboard-page-mCY0pgZv.mjs +0 -3
  543. package/dist/dropzone-Do3awXKd.mjs +0 -634
  544. package/dist/dropzone-Do3awXKd.mjs.map +0 -1
  545. package/dist/forgot-password-page-Bcp-An4Y.mjs +0 -221
  546. package/dist/forgot-password-page-Bcp-An4Y.mjs.map +0 -1
  547. package/dist/forgot-password-page-CEwsdLwn.mjs +0 -3
  548. package/dist/index-B4H3amCD.d.mts +0 -2753
  549. package/dist/index-B4H3amCD.d.mts.map +0 -1
  550. package/dist/login-page-BUnpCbCa.mjs +0 -3
  551. package/dist/login-page-CP4gA-dl.mjs +0 -298
  552. package/dist/login-page-CP4gA-dl.mjs.map +0 -1
  553. package/dist/preview-utils-BKQ9-TMa.mjs.map +0 -1
  554. package/dist/reset-password-page-BqfDmLxA.mjs +0 -281
  555. package/dist/reset-password-page-BqfDmLxA.mjs.map +0 -1
  556. package/dist/reset-password-page-CufHz3h3.mjs +0 -3
  557. package/dist/runtime-6VZM878K.mjs +0 -69
  558. package/dist/runtime-6VZM878K.mjs.map +0 -1
  559. package/dist/saved-views.types-BMsz5mCy.d.mts.map +0 -1
  560. package/dist/server.d.mts.map +0 -1
  561. package/dist/server.mjs.map +0 -1
  562. package/dist/setup-page-BNNzt_Z6.mjs +0 -3
  563. package/dist/setup-page-YAP_fzqh.mjs +0 -264
  564. package/dist/setup-page-YAP_fzqh.mjs.map +0 -1
  565. package/dist/shared.d.mts.map +0 -1
  566. package/dist/use-auth-BoLmWtmU.mjs.map +0 -1
@@ -0,0 +1,259 @@
1
+ import { formatLabel } from "../lib/utils.mjs";
2
+ import { configureField } from "../builder/field/field.mjs";
3
+
4
+ //#region src/client/utils/build-field-definitions-from-schema.ts
5
+ /**
6
+ * Build admin field definitions from server collection schema.
7
+ *
8
+ * Maps server field metadata to admin FieldDefinition objects:
9
+ * - Uses `metadata.type` to look up field in registry
10
+ * - Applies `metadata.meta.admin` overrides
11
+ * - Handles relation type mapping (belongsTo -> single, hasMany -> multiple)
12
+ *
13
+ * @param schema - Collection schema from server introspection
14
+ * @param registry - Field registry from admin config (admin.getFields())
15
+ * @param options - Optional configuration
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * // In a component with admin context
20
+ * const admin = useAdminStore(selectAdmin);
21
+ * const { data: schema } = useCollectionSchema("posts");
22
+ * const fields = buildFieldDefinitionsFromSchema(
23
+ * schema,
24
+ * admin.getFields(),
25
+ * );
26
+ * ```
27
+ */
28
+ /**
29
+ * Build field definitions from raw field metadata.
30
+ * Works with metadata from any source (collection schema, global schema, block fields).
31
+ *
32
+ * @param fields - Record of field name to field metadata
33
+ * @param registry - Field registry from admin config
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * const admin = useAdminStore(selectAdmin);
38
+ * const fields = buildFieldDefinitionsFromMetadata(
39
+ * blockDef.fields,
40
+ * admin.getFields(),
41
+ * );
42
+ * ```
43
+ */
44
+ function buildFieldDefinitionsFromMetadata(fields, registry) {
45
+ if (!fields) return {};
46
+ const result = {};
47
+ for (const [fieldName, fieldSchema] of Object.entries(fields)) {
48
+ const metadata = fieldSchema.metadata ?? fieldSchema;
49
+ const fieldType = resolveFieldType(metadata);
50
+ const fieldBuilder = registry[fieldType];
51
+ if (!fieldBuilder) {
52
+ if (process.env.NODE_ENV !== "production") console.warn(`[buildFieldDefinitionsFromMetadata] Field "${fieldName}" has type "${fieldType}" which is not registered in the field registry. Available types: ${Object.keys(registry).join(", ")}`);
53
+ continue;
54
+ }
55
+ result[fieldName] = configureField(fieldBuilder, buildFieldConfig(fieldSchema.name ?? fieldName, metadata, {}, registry, fieldType));
56
+ }
57
+ return result;
58
+ }
59
+ function buildFieldDefinitionsFromSchema(schema, registry, options = {}) {
60
+ if (!schema) return {};
61
+ const relations = "relations" in schema ? schema.relations : {};
62
+ const result = {};
63
+ for (const [fieldName, fieldSchema] of Object.entries(schema.fields)) {
64
+ if (options.exclude?.includes(fieldName)) continue;
65
+ if (options.include && !options.include.includes(fieldName)) continue;
66
+ if (isSystemField(fieldName)) continue;
67
+ const fieldDef = buildFieldDefinition(fieldName, fieldSchema, relations, registry, options.overrides?.[fieldName]);
68
+ if (fieldDef) result[fieldName] = fieldDef;
69
+ }
70
+ return result;
71
+ }
72
+ /**
73
+ * Build a single field definition from schema
74
+ */
75
+ function buildFieldDefinition(fieldName, fieldSchema, relations, registry, overrides) {
76
+ const { metadata } = fieldSchema;
77
+ const fieldType = resolveFieldType(metadata);
78
+ const fieldBuilder = registry[fieldType];
79
+ if (!fieldBuilder) return null;
80
+ const config = buildFieldConfig(fieldName, metadata, relations, registry, fieldType);
81
+ const adminConfig = metadata.meta?.admin;
82
+ if (adminConfig) applyAdminConfig(config, adminConfig);
83
+ if (overrides) Object.assign(config, overrides);
84
+ return configureField(fieldBuilder, config);
85
+ }
86
+ /**
87
+ * Build field config from metadata
88
+ */
89
+ function buildFieldConfig(fieldName, metadata, relations, registry, fieldType) {
90
+ const config = {
91
+ label: metadata.label ?? formatLabel(fieldName),
92
+ description: metadata.description,
93
+ required: metadata.required,
94
+ localized: metadata.localized,
95
+ readOnly: metadata.readOnly
96
+ };
97
+ if (metadata.validation) Object.assign(config, metadata.validation);
98
+ if (isSelectMetadata(metadata)) applySelectConfig(config, metadata);
99
+ else if (isRelationMetadata(metadata)) if (fieldType === "upload") applyUploadConfig(config, metadata, relations[fieldName]);
100
+ else applyRelationConfig(config, metadata, relations[fieldName]);
101
+ else if (isNestedMetadata(metadata)) applyNestedConfig(config, metadata, relations, registry);
102
+ else if (metadata.type === "richText") applyRichTextConfig(config, metadata);
103
+ applyExtraMetadata(config, metadata);
104
+ return config;
105
+ }
106
+ function isSelectMetadata(m) {
107
+ return m.type === "select";
108
+ }
109
+ function isRelationMetadata(m) {
110
+ return m.type === "relation";
111
+ }
112
+ function isNestedMetadata(m) {
113
+ return m.type === "object" || m.type === "array" || m.type === "blocks";
114
+ }
115
+ /**
116
+ * Apply select field config
117
+ */
118
+ function applySelectConfig(config, metadata) {
119
+ config.options = metadata.options.map((opt) => ({
120
+ value: opt.value,
121
+ label: opt.label ?? String(opt.value)
122
+ }));
123
+ if (metadata.multiple !== void 0) config.multiple = metadata.multiple;
124
+ }
125
+ /**
126
+ * Apply relation field config
127
+ */
128
+ function applyRelationConfig(config, metadata, relationSchema) {
129
+ const isSingle = ["belongsTo", "morphTo"].includes(metadata.relationType);
130
+ config.targetCollection = metadata.targetCollection;
131
+ config.type = isSingle ? "single" : "multiple";
132
+ config.relationType = metadata.relationType;
133
+ if (metadata.through ?? relationSchema?.through) config.through = metadata.through ?? relationSchema?.through;
134
+ if (metadata.foreignKey ?? relationSchema?.foreignKey) config.foreignKey = metadata.foreignKey ?? relationSchema?.foreignKey;
135
+ }
136
+ function applyUploadConfig(config, metadata, relationSchema) {
137
+ const isMultiple = [
138
+ "hasMany",
139
+ "manyToMany",
140
+ "multiple",
141
+ "morphMany"
142
+ ].includes(metadata.relationType);
143
+ config.to = metadata.targetCollection;
144
+ config.multiple = isMultiple;
145
+ if (metadata.through ?? relationSchema?.through) config.through = metadata.through ?? relationSchema?.through;
146
+ if (metadata.foreignKey ?? relationSchema?.foreignKey) config.foreignKey = metadata.foreignKey ?? relationSchema?.foreignKey;
147
+ }
148
+ function applyNestedConfig(config, metadata, relations, registry) {
149
+ if (!metadata.nestedFields) return;
150
+ if (metadata.type === "object") {
151
+ const nestedDefs = buildNestedFieldDefinitions(metadata.nestedFields, relations, registry);
152
+ config.fields = () => nestedDefs;
153
+ if (metadata.form) config.form = metadata.form;
154
+ return;
155
+ }
156
+ if (metadata.type === "array") {
157
+ const itemMetadata = metadata.nestedFields.item;
158
+ if (!itemMetadata) return;
159
+ if (itemMetadata.type === "object" && itemMetadata.nestedFields) {
160
+ const itemFields = buildNestedFieldDefinitions(itemMetadata.nestedFields ?? {}, relations, registry);
161
+ config.item = () => itemFields;
162
+ return;
163
+ }
164
+ const itemType = mapArrayItemType(itemMetadata.type);
165
+ if (itemType) {
166
+ config.itemType = itemType;
167
+ if (itemMetadata.type === "select") applySelectConfig(config, itemMetadata);
168
+ }
169
+ }
170
+ if (metadata.type === "blocks") {
171
+ const blocksMetadata = metadata;
172
+ if (blocksMetadata.allowedBlocks) config.allowedBlocks = blocksMetadata.allowedBlocks;
173
+ if (blocksMetadata.minBlocks !== void 0) config.minBlocks = blocksMetadata.minBlocks;
174
+ if (blocksMetadata.maxBlocks !== void 0) config.maxBlocks = blocksMetadata.maxBlocks;
175
+ }
176
+ }
177
+ function applyExtraMetadata(config, metadata) {
178
+ const reservedKeys = new Set([
179
+ "type",
180
+ "label",
181
+ "description",
182
+ "required",
183
+ "localized",
184
+ "readOnly",
185
+ "writeOnly",
186
+ "validation",
187
+ "meta",
188
+ "nestedFields",
189
+ "features"
190
+ ]);
191
+ for (const [key, value] of Object.entries(metadata)) {
192
+ if (reservedKeys.has(key)) continue;
193
+ if (key.startsWith("_")) continue;
194
+ if (value === void 0) continue;
195
+ config[key] = value;
196
+ }
197
+ }
198
+ function applyRichTextConfig(config, metadata) {
199
+ if (metadata.maxCharacters !== void 0) {
200
+ config.maxCharacters = metadata.maxCharacters;
201
+ config.showCharacterCount = true;
202
+ }
203
+ if (metadata.placeholder !== void 0) config.placeholder = metadata.placeholder;
204
+ if (metadata.allowImages !== void 0) config.enableImages = metadata.allowImages;
205
+ if (metadata.imageCollection !== void 0) config.imageCollection = metadata.imageCollection;
206
+ }
207
+ function buildNestedFieldDefinitions(nestedFields, relations, registry) {
208
+ const result = {};
209
+ for (const [nestedName, nestedMetadata] of Object.entries(nestedFields)) {
210
+ const fieldType = resolveFieldType(nestedMetadata);
211
+ const fieldBuilder = registry[fieldType];
212
+ if (!fieldBuilder) continue;
213
+ const config = buildFieldConfig(nestedName, nestedMetadata, relations, registry, fieldType);
214
+ const adminConfig = nestedMetadata.meta?.admin;
215
+ if (adminConfig) applyAdminConfig(config, adminConfig);
216
+ result[nestedName] = configureField(fieldBuilder, config);
217
+ }
218
+ return result;
219
+ }
220
+ function resolveFieldType(metadata) {
221
+ if (metadata.type === "relation") {
222
+ if (metadata.isUpload) return "upload";
223
+ }
224
+ return metadata.type;
225
+ }
226
+ function mapArrayItemType(type) {
227
+ return new Set([
228
+ "text",
229
+ "number",
230
+ "email",
231
+ "textarea",
232
+ "select"
233
+ ]).has(type) ? type : null;
234
+ }
235
+ /**
236
+ * Apply admin config overrides from server meta.admin
237
+ *
238
+ * Since each field type has its own admin meta with only valid properties,
239
+ * we simply copy all defined properties from adminConfig to config.
240
+ */
241
+ function applyAdminConfig(config, adminConfig) {
242
+ for (const [key, value] of Object.entries(adminConfig)) if (value !== void 0) config[key] = value;
243
+ }
244
+ /**
245
+ * Check if a field is a system field that shouldn't be in forms
246
+ */
247
+ function isSystemField(fieldName) {
248
+ return [
249
+ "id",
250
+ "createdAt",
251
+ "updatedAt",
252
+ "deletedAt",
253
+ "_title",
254
+ "_locale"
255
+ ].includes(fieldName);
256
+ }
257
+
258
+ //#endregion
259
+ export { buildFieldDefinitionsFromMetadata, buildFieldDefinitionsFromSchema };
@@ -0,0 +1,61 @@
1
+ //#region src/client/utils/dependency-tracker.ts
2
+ /**
3
+ * Track value dependencies accessed by a resolver function.
4
+ */
5
+ function trackDependencies(values, resolver) {
6
+ const deps = /* @__PURE__ */ new Set();
7
+ const createProxy = (target, prefix = "") => {
8
+ if (!target || typeof target !== "object") return target;
9
+ return new Proxy(target, {
10
+ get(currentTarget, prop) {
11
+ if (typeof prop === "symbol" || prop === "then") return Reflect.get(currentTarget, prop);
12
+ const path = prefix ? `${prefix}.${prop}` : prop;
13
+ deps.add(path);
14
+ const nextValue = Reflect.get(currentTarget, prop);
15
+ if (nextValue && typeof nextValue === "object") return createProxy(nextValue, path);
16
+ return nextValue;
17
+ },
18
+ has(currentTarget, prop) {
19
+ if (typeof prop === "symbol") return Reflect.has(currentTarget, prop);
20
+ const path = prefix ? `${prefix}.${prop}` : prop;
21
+ deps.add(path);
22
+ return Reflect.has(currentTarget, prop);
23
+ },
24
+ ownKeys(currentTarget) {
25
+ const keys = Reflect.ownKeys(currentTarget);
26
+ for (const key of keys) {
27
+ if (typeof key !== "string") continue;
28
+ const path = prefix ? `${prefix}.${key}` : key;
29
+ deps.add(path);
30
+ }
31
+ return keys;
32
+ },
33
+ getOwnPropertyDescriptor(currentTarget, prop) {
34
+ return Reflect.getOwnPropertyDescriptor(currentTarget, prop);
35
+ }
36
+ });
37
+ };
38
+ try {
39
+ return {
40
+ result: resolver(createProxy(values)),
41
+ deps: [...deps],
42
+ error: null
43
+ };
44
+ } catch (error) {
45
+ return {
46
+ result: void 0,
47
+ deps: [...deps],
48
+ error: error instanceof Error ? error : new Error(String(error))
49
+ };
50
+ }
51
+ }
52
+ /**
53
+ * Scope dependency paths for nested field prefixes.
54
+ */
55
+ function scopeDependencies(deps, fieldPrefix) {
56
+ if (!fieldPrefix) return deps.filter((dep) => dep.length > 0 && !dep.startsWith("$"));
57
+ return deps.filter((dep) => dep.length > 0 && !dep.startsWith("$")).map((dep) => `${fieldPrefix}.${dep}`);
58
+ }
59
+
60
+ //#endregion
61
+ export { scopeDependencies, trackDependencies };
@@ -0,0 +1,45 @@
1
+ //#region src/client/utils/detect-relations.ts
2
+ function isMultiRelationType(relationType) {
3
+ return relationType === "hasMany" || relationType === "manyToMany" || relationType === "multiple" || relationType === "morphMany";
4
+ }
5
+ /**
6
+ * Auto-detect M:N relation fields from config and build `with` clause.
7
+ *
8
+ * M:N relations need to be explicitly loaded when fetching items for editing,
9
+ * as they are stored in junction tables and not included by default.
10
+ *
11
+ * @param config - Collection configuration with fields
12
+ * @returns Object mapping relation field names to `true` for M:N relations
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const withRelations = detectManyToManyRelations({ fields: config?.fields });
17
+ *
18
+ * // Use with query
19
+ * const { data } = useCollectionItem(collection, id, {
20
+ * with: withRelations,
21
+ * });
22
+ * ```
23
+ */
24
+ function detectManyToManyRelations(config) {
25
+ const withRelations = {};
26
+ if (config.schema?.fields) for (const [fieldName, fieldSchema] of Object.entries(config.schema.fields)) {
27
+ const metadata = fieldSchema?.metadata;
28
+ if (metadata?.type !== "relation") continue;
29
+ if (isMultiRelationType(metadata.relationType)) withRelations[fieldName] = true;
30
+ }
31
+ if (config?.fields) for (const [fieldName, fieldConfig] of Object.entries(config.fields)) {
32
+ const fc = fieldConfig;
33
+ if (fc?.name === "relation" && fc?.["~options"]?.type === "multiple") withRelations[fieldName] = true;
34
+ }
35
+ return withRelations;
36
+ }
37
+ /**
38
+ * Check if there are any M:N relations to include
39
+ */
40
+ function hasManyToManyRelations(withRelations) {
41
+ return Object.keys(withRelations).length > 0;
42
+ }
43
+
44
+ //#endregion
45
+ export { detectManyToManyRelations, hasManyToManyRelations };
@@ -0,0 +1,119 @@
1
+ //#region src/client/utils/locale-to-flag.d.ts
2
+ /**
3
+ * Locale to Flag Utility
4
+ *
5
+ * Converts locale codes to country codes for flag display.
6
+ * Uses flagcdn.com for PNG flags via CDN (no dependencies).
7
+ *
8
+ * ## Features
9
+ *
10
+ * - **Smart mapping**: Automatically maps locale codes to country codes (sk → SK, en → GB, en-US → US)
11
+ * - **Custom overrides**: Support for custom country codes via `flagCountryCode` in locale config
12
+ * - **Lightweight**: No dependencies, uses CDN for flags
13
+ * - **Fallback support**: Gracefully handles unknown locale codes
14
+ *
15
+ * ## Usage
16
+ *
17
+ * ### Basic Usage
18
+ *
19
+ * ```tsx
20
+ * import { getFlagUrl } from "@questpie/admin/client";
21
+ *
22
+ * function LocaleBadge({ locale }: { locale: string }) {
23
+ * return (
24
+ * <div>
25
+ * <img src={getFlagUrl(locale, 20)} alt={locale} />
26
+ * {locale}
27
+ * </div>
28
+ * );
29
+ * }
30
+ * ```
31
+ *
32
+ * ### Custom Country Code Mapping
33
+ *
34
+ * If the default mapping doesn't fit your needs, you can provide custom mapping:
35
+ *
36
+ * ```tsx
37
+ * // Show US flag for English instead of UK
38
+ * const flagUrl = getFlagUrl("en", 20, { en: "us" });
39
+ * ```
40
+ *
41
+ * ### In QUESTPIE Configuration
42
+ *
43
+ * The best way to customize flag mapping is in your app locale config:
44
+ *
45
+ * ```ts
46
+ * // questpie/server/locale.ts (file convention)
47
+ * import { locale } from "#questpie/factories";
48
+ *
49
+ * export default locale({
50
+ * locales: [
51
+ * {
52
+ * code: "en",
53
+ * label: "English",
54
+ * flagCountryCode: "us", // Show US flag instead of UK
55
+ * },
56
+ * { code: "sk", label: "Slovenčina" },
57
+ * ],
58
+ * defaultLocale: "en",
59
+ * });
60
+ * ```
61
+ *
62
+ * The `flagCountryCode` will be automatically used by `LocaleSwitcher` and other locale UI components.
63
+ */
64
+ interface FlagConfig {
65
+ /** Country code (ISO 3166-1 alpha-2) */
66
+ countryCode: string;
67
+ /** Alt text for accessibility */
68
+ alt: string;
69
+ }
70
+ /**
71
+ * Get country code from locale code.
72
+ *
73
+ * @param locale - Locale code (e.g., "en", "sk", "en-US")
74
+ * @param customMapping - Optional custom locale-to-country mapping (overrides defaults)
75
+ * @returns Country code (lowercase, e.g., "gb", "sk", "us")
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * getCountryCode("en") // "gb" (default)
80
+ * getCountryCode("en-US") // "us"
81
+ * getCountryCode("sk") // "sk"
82
+ * getCountryCode("en", { en: "us" }) // "us" (custom mapping)
83
+ * getCountryCode("unknown") // "unknown" (fallback to input)
84
+ * ```
85
+ */
86
+ declare function getCountryCode(locale: string, customMapping?: Record<string, string>): string;
87
+ /**
88
+ * Get flag configuration for a locale.
89
+ *
90
+ * @param locale - Locale code
91
+ * @param customMapping - Optional custom locale-to-country mapping
92
+ * @returns Flag configuration with country code and alt text
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * getFlagConfig("sk") // { countryCode: "sk", alt: "Slovakia" }
97
+ * getFlagConfig("en-US") // { countryCode: "us", alt: "United States" }
98
+ * getFlagConfig("en", { en: "us" }) // { countryCode: "us", alt: "EN" }
99
+ * ```
100
+ */
101
+ declare function getFlagConfig(locale: string, customMapping?: Record<string, string>): FlagConfig;
102
+ /**
103
+ * Get flag image URL from flagcdn.com.
104
+ *
105
+ * @param locale - Locale code
106
+ * @param size - Width in pixels (default: 20)
107
+ * @param customMapping - Optional custom locale-to-country mapping
108
+ * @returns URL to flag PNG
109
+ *
110
+ * @example
111
+ * ```tsx
112
+ * <img src={getFlagUrl("sk")} alt="SK" />
113
+ * <img src={getFlagUrl("en-US", 40)} alt="EN-US" />
114
+ * <img src={getFlagUrl("en", 20, { en: "us" })} alt="EN" />
115
+ * ```
116
+ */
117
+ declare function getFlagUrl(locale: string, size?: number, customMapping?: Record<string, string>): string;
118
+ //#endregion
119
+ export { FlagConfig, getCountryCode, getFlagConfig, getFlagUrl };
@@ -0,0 +1,129 @@
1
+ //#region src/client/utils/locale-to-flag.ts
2
+ /**
3
+ * Maps locale codes to country codes.
4
+ * Handles both simple codes (en, sk) and region-specific (en-US, en-GB).
5
+ */
6
+ const LOCALE_TO_COUNTRY = {
7
+ en: "gb",
8
+ "en-US": "us",
9
+ "en-GB": "gb",
10
+ "en-CA": "ca",
11
+ "en-AU": "au",
12
+ "en-NZ": "nz",
13
+ "en-IE": "ie",
14
+ sk: "sk",
15
+ cs: "cz",
16
+ de: "de",
17
+ "de-AT": "at",
18
+ "de-CH": "ch",
19
+ fr: "fr",
20
+ "fr-CA": "ca",
21
+ "fr-CH": "ch",
22
+ es: "es",
23
+ "es-MX": "mx",
24
+ "es-AR": "ar",
25
+ it: "it",
26
+ pt: "pt",
27
+ "pt-BR": "br",
28
+ nl: "nl",
29
+ pl: "pl",
30
+ ru: "ru",
31
+ uk: "ua",
32
+ tr: "tr",
33
+ sv: "se",
34
+ no: "no",
35
+ da: "dk",
36
+ fi: "fi",
37
+ hu: "hu",
38
+ ro: "ro",
39
+ bg: "bg",
40
+ hr: "hr",
41
+ sr: "rs",
42
+ sl: "si",
43
+ et: "ee",
44
+ lv: "lv",
45
+ lt: "lt",
46
+ zh: "cn",
47
+ "zh-CN": "cn",
48
+ "zh-TW": "tw",
49
+ "zh-HK": "hk",
50
+ ja: "jp",
51
+ ko: "kr",
52
+ th: "th",
53
+ vi: "vn",
54
+ id: "id",
55
+ ms: "my",
56
+ hi: "in",
57
+ ar: "sa",
58
+ he: "il",
59
+ el: "gr",
60
+ fa: "ir",
61
+ ur: "pk"
62
+ };
63
+ /**
64
+ * Get country code from locale code.
65
+ *
66
+ * @param locale - Locale code (e.g., "en", "sk", "en-US")
67
+ * @param customMapping - Optional custom locale-to-country mapping (overrides defaults)
68
+ * @returns Country code (lowercase, e.g., "gb", "sk", "us")
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * getCountryCode("en") // "gb" (default)
73
+ * getCountryCode("en-US") // "us"
74
+ * getCountryCode("sk") // "sk"
75
+ * getCountryCode("en", { en: "us" }) // "us" (custom mapping)
76
+ * getCountryCode("unknown") // "unknown" (fallback to input)
77
+ * ```
78
+ */
79
+ function getCountryCode(locale, customMapping) {
80
+ const normalized = locale.toLowerCase();
81
+ if (customMapping?.[normalized]) return customMapping[normalized].toLowerCase();
82
+ if (LOCALE_TO_COUNTRY[normalized]) return LOCALE_TO_COUNTRY[normalized];
83
+ const baseCode = normalized.split("-")[0];
84
+ if (baseCode && customMapping?.[baseCode]) return customMapping[baseCode].toLowerCase();
85
+ if (baseCode && LOCALE_TO_COUNTRY[baseCode]) return LOCALE_TO_COUNTRY[baseCode];
86
+ return normalized;
87
+ }
88
+ /**
89
+ * Get flag configuration for a locale.
90
+ *
91
+ * @param locale - Locale code
92
+ * @param customMapping - Optional custom locale-to-country mapping
93
+ * @returns Flag configuration with country code and alt text
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * getFlagConfig("sk") // { countryCode: "sk", alt: "Slovakia" }
98
+ * getFlagConfig("en-US") // { countryCode: "us", alt: "United States" }
99
+ * getFlagConfig("en", { en: "us" }) // { countryCode: "us", alt: "EN" }
100
+ * ```
101
+ */
102
+ function getFlagConfig(locale, customMapping) {
103
+ return {
104
+ countryCode: getCountryCode(locale, customMapping),
105
+ alt: locale.toUpperCase()
106
+ };
107
+ }
108
+ /**
109
+ * Get flag image URL from flagcdn.com.
110
+ *
111
+ * @param locale - Locale code
112
+ * @param size - Width in pixels (default: 20)
113
+ * @param customMapping - Optional custom locale-to-country mapping
114
+ * @returns URL to flag PNG
115
+ *
116
+ * @example
117
+ * ```tsx
118
+ * <img src={getFlagUrl("sk")} alt="SK" />
119
+ * <img src={getFlagUrl("en-US", 40)} alt="EN-US" />
120
+ * <img src={getFlagUrl("en", 20, { en: "us" })} alt="EN" />
121
+ * ```
122
+ */
123
+ function getFlagUrl(locale, size = 24, customMapping) {
124
+ const { countryCode } = getFlagConfig(locale, customMapping);
125
+ return `https://flagcdn.com/h${size}/${countryCode}.png`;
126
+ }
127
+
128
+ //#endregion
129
+ export { getCountryCode, getFlagConfig, getFlagUrl };