@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,26 @@
1
+ import { adminPlugin } from "../../plugin.mjs";
2
+ import { savedViewsCollection } from "../admin-preferences/collections/saved-views.mjs";
3
+ import { actionFunctions, executeAction, executeActionFn, getActionsConfig, getActionsConfigFn } from "./routes/execute-action.mjs";
4
+ import { createPreviewFunctions, createPreviewTokenVerifier, verifyPreviewTokenDirect } from "./routes/preview.mjs";
5
+ import { batchReactive, fieldOptions, reactiveFunctions } from "./routes/reactive.mjs";
6
+ import { createFirstAdmin, isSetupRequired, setupFunctions } from "./routes/setup.mjs";
7
+ import { fetchWidgetData, widgetDataFunctions } from "./routes/widget-data.mjs";
8
+ import module_default from "./.generated/module.mjs";
9
+
10
+ //#region src/server/modules/admin/index.ts
11
+ /**
12
+ * Admin module with codegen plugin attached.
13
+ *
14
+ * The `plugin` field lets `extractPluginsFromModules` auto-discover the admin
15
+ * codegen plugin from modules.ts, eliminating the need for users to manually
16
+ * add `plugins: [adminPlugin()]` in their questpie.config.ts.
17
+ */
18
+ const adminModule = Object.assign(module_default, { plugin: adminPlugin() });
19
+ /**
20
+ * Admin routes — flat spread of all admin route definitions.
21
+ * Automatically registered when adminModule is included in your app modules.
22
+ */
23
+ const adminRoutes = adminModule.routes;
24
+
25
+ //#endregion
26
+ export { adminModule, adminRoutes };
@@ -0,0 +1,11 @@
1
+ import { starterModule } from "questpie";
2
+
3
+ //#region src/server/modules/admin/modules.ts
4
+ /**
5
+ * Admin module dependencies.
6
+ * The admin module depends on the starter module for auth collections and assets.
7
+ */
8
+ var modules_default = [starterModule];
9
+
10
+ //#endregion
11
+ export { modules_default as default };
@@ -0,0 +1,13 @@
1
+ import { adminPlugin } from "../../plugin.mjs";
2
+
3
+ //#region src/server/modules/admin/plugin.ts
4
+ /**
5
+ * Admin module plugin — re-exports the admin codegen plugin so that
6
+ * module codegen discovers it and embeds it in the generated module
7
+ * definition. This allows `extractPluginsFromModules` to pick it up
8
+ * automatically at root-app codegen time.
9
+ */
10
+ var plugin_default = adminPlugin();
11
+
12
+ //#endregion
13
+ export { plugin_default as default };
@@ -0,0 +1,28 @@
1
+ import * as questpie405 from "questpie";
2
+
3
+ //#region src/server/modules/admin/routes/admin-config.d.ts
4
+
5
+ /**
6
+ * Admin Config Functions
7
+ *
8
+ * Provides server-defined admin configuration (dashboard, sidebar,
9
+ * collection/global metadata) to the client via RPC.
10
+ *
11
+ * Filters results by the current user's read access.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * // Client usage
16
+ * const config = await client.routes.getAdminConfig({});
17
+ * // { dashboard: {...}, sidebar: {...}, collections: {...}, globals: {...} }
18
+ * ```
19
+ */
20
+ /**
21
+ * Admin config route handlers.
22
+ * Registered via module routes and exposed through the fetch handler.
23
+ */
24
+ declare const adminConfigFunctions: {
25
+ readonly getAdminConfig: questpie405.JsonRouteDefinition<Record<string, never> | undefined, any>;
26
+ };
27
+ //#endregion
28
+ export { adminConfigFunctions };
@@ -0,0 +1,552 @@
1
+ import { introspectBlocks } from "../block/introspection.mjs";
2
+ import { resolveDashboardCallback, resolveSidebarCallback } from "../../../proxy-factories.mjs";
3
+ import { adminConfigDTOSchema } from "../dto/admin-config.dto.mjs";
4
+ import { getAccessContext, getAdminConfig as getAdminConfig$1, getApp, getAppState, getCollectionState, getGlobalState } from "./route-helpers.mjs";
5
+ import { z } from "zod";
6
+ import { executeAccessRule, route } from "questpie";
7
+
8
+ //#region src/server/modules/admin/routes/admin-config.ts
9
+ /**
10
+ * Admin Config Functions
11
+ *
12
+ * Provides server-defined admin configuration (dashboard, sidebar,
13
+ * collection/global metadata) to the client via RPC.
14
+ *
15
+ * Filters results by the current user's read access.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * // Client usage
20
+ * const config = await client.routes.getAdminConfig({});
21
+ * // { dashboard: {...}, sidebar: {...}, collections: {...}, globals: {...} }
22
+ * ```
23
+ */
24
+ /**
25
+ * Check if the current user has read access to a collection or global.
26
+ * Returns true if accessible, false if denied.
27
+ *
28
+ * Falls back to app `defaultAccess.read` when no explicit read rule is defined.
29
+ * If neither exists, requires session (secure by default).
30
+ *
31
+ * Fail-open on errors: returns true to avoid hiding content due to rule bugs.
32
+ */
33
+ async function hasReadAccess(readRule, ctx) {
34
+ const effectiveRule = readRule ?? ctx.app?.defaultAccess?.read;
35
+ if (effectiveRule === true) return true;
36
+ if (effectiveRule === false) return false;
37
+ if (effectiveRule === void 0) return !!ctx.session;
38
+ try {
39
+ return await executeAccessRule(effectiveRule, {
40
+ app: ctx.app,
41
+ db: ctx.db,
42
+ session: ctx.session,
43
+ locale: ctx.locale
44
+ }) !== false;
45
+ } catch {
46
+ return false;
47
+ }
48
+ }
49
+ /**
50
+ * Extract workflow metadata from a collection/global state.
51
+ */
52
+ function extractWorkflowMeta(state) {
53
+ const versioning = state?.options?.versioning;
54
+ const workflow = versioning && typeof versioning === "object" ? versioning.workflow : void 0;
55
+ if (!workflow) return void 0;
56
+ const opts = workflow === true ? {} : workflow;
57
+ const rawStages = opts.stages;
58
+ let stages;
59
+ if (!rawStages) stages = [{ name: "draft" }, { name: "published" }];
60
+ else if (Array.isArray(rawStages)) stages = rawStages.map((name) => ({ name }));
61
+ else stages = Object.entries(rawStages).map(([name, options]) => ({
62
+ name,
63
+ label: options?.label,
64
+ description: options?.description,
65
+ transitions: options?.transitions
66
+ }));
67
+ return {
68
+ enabled: true,
69
+ initialStage: opts.initialStage ?? stages[0]?.name ?? "draft",
70
+ stages
71
+ };
72
+ }
73
+ /**
74
+ * Extract admin metadata from all registered collections.
75
+ */
76
+ function extractCollectionsMeta(app) {
77
+ const result = {};
78
+ const collections = app.getCollections();
79
+ for (const [name, collection$1] of Object.entries(collections)) {
80
+ const state = getCollectionState(collection$1);
81
+ const admin = state?.admin;
82
+ const workflow = extractWorkflowMeta(state);
83
+ if (admin) result[name] = {
84
+ label: admin.label,
85
+ description: admin.description,
86
+ icon: admin.icon,
87
+ hidden: admin.hidden,
88
+ group: admin.group,
89
+ order: admin.order,
90
+ ...workflow ? { workflow } : {}
91
+ };
92
+ else result[name] = workflow ? { workflow } : {};
93
+ }
94
+ return result;
95
+ }
96
+ /**
97
+ * Extract admin metadata from all registered globals.
98
+ */
99
+ function extractGlobalsMeta(app) {
100
+ const result = {};
101
+ const globals = app.getGlobals();
102
+ for (const [name, global] of Object.entries(globals)) {
103
+ const state = getGlobalState(global);
104
+ const admin = state?.admin;
105
+ const workflow = extractWorkflowMeta(state);
106
+ if (admin) result[name] = {
107
+ label: admin.label,
108
+ description: admin.description,
109
+ icon: admin.icon,
110
+ hidden: admin.hidden,
111
+ group: admin.group,
112
+ order: admin.order,
113
+ ...workflow ? { workflow } : {}
114
+ };
115
+ else result[name] = workflow ? { workflow } : {};
116
+ }
117
+ return result;
118
+ }
119
+ /**
120
+ * Auto-generate a sidebar config from pre-filtered collection and global metadata.
121
+ * Used when no explicit `.sidebar()` is configured.
122
+ */
123
+ function buildAutoSidebar(collectionsMeta, globalsMeta) {
124
+ const ungrouped = [];
125
+ const grouped = {};
126
+ for (const [name, meta] of Object.entries(collectionsMeta)) {
127
+ if (meta.hidden) continue;
128
+ if (meta.group) {
129
+ if (!grouped[meta.group]) grouped[meta.group] = [];
130
+ grouped[meta.group].push({
131
+ name,
132
+ meta
133
+ });
134
+ } else ungrouped.push({
135
+ name,
136
+ meta
137
+ });
138
+ }
139
+ const sortByOrder = (a, b) => (a.meta.order ?? 0) - (b.meta.order ?? 0);
140
+ ungrouped.sort(sortByOrder);
141
+ for (const items of Object.values(grouped)) items.sort(sortByOrder);
142
+ const sections = [];
143
+ if (ungrouped.length > 0) sections.push({
144
+ id: "content",
145
+ title: { en: "Content" },
146
+ items: ungrouped.map(({ name, meta }) => ({
147
+ type: "collection",
148
+ collection: name,
149
+ label: meta.label,
150
+ icon: meta.icon
151
+ }))
152
+ });
153
+ const sortedGroupNames = Object.keys(grouped).sort();
154
+ for (const groupName of sortedGroupNames) {
155
+ const items = grouped[groupName];
156
+ sections.push({
157
+ id: `group:${groupName}`,
158
+ title: { en: groupName.charAt(0).toUpperCase() + groupName.slice(1) },
159
+ items: items.map(({ name, meta }) => ({
160
+ type: "collection",
161
+ collection: name,
162
+ label: meta.label,
163
+ icon: meta.icon
164
+ }))
165
+ });
166
+ }
167
+ const visibleGlobals = Object.entries(globalsMeta).filter(([, meta]) => !meta.hidden);
168
+ if (visibleGlobals.length > 0) {
169
+ visibleGlobals.sort(([, a], [, b]) => (a.order ?? 0) - (b.order ?? 0));
170
+ sections.push({
171
+ id: "globals",
172
+ title: { en: "Globals" },
173
+ items: visibleGlobals.map(([name, meta]) => ({
174
+ type: "global",
175
+ global: name,
176
+ label: meta.label,
177
+ icon: meta.icon
178
+ }))
179
+ });
180
+ }
181
+ return { sections };
182
+ }
183
+ /**
184
+ * Filter an explicit sidebar config by accessible collections and globals.
185
+ * Removes items referencing inaccessible collections/globals.
186
+ * Removes empty sections after filtering.
187
+ */
188
+ function filterSidebarConfig(config, accessibleCollections, accessibleGlobals) {
189
+ return { sections: config.sections.map((s) => ({
190
+ ...s,
191
+ items: (s.items ?? []).filter((item) => {
192
+ const rec = item;
193
+ if (item.type === "collection") return accessibleCollections.has(rec.collection);
194
+ if (item.type === "global") return accessibleGlobals.has(rec.global);
195
+ return true;
196
+ })
197
+ })).filter((s) => (s.items?.length ?? 0) > 0 || (s.sections?.length ?? 0) > 0) };
198
+ }
199
+ /**
200
+ * Collect all collection and global names referenced in a sidebar config.
201
+ */
202
+ function collectSidebarReferences(config) {
203
+ const collections = /* @__PURE__ */ new Set();
204
+ const globals = /* @__PURE__ */ new Set();
205
+ function collectFromSection(section) {
206
+ for (const item of section.items ?? []) {
207
+ const rec = item;
208
+ if (item.type === "collection") collections.add(rec.collection);
209
+ else if (item.type === "global") globals.add(rec.global);
210
+ }
211
+ for (const subSection of section.sections ?? []) collectFromSection(subSection);
212
+ }
213
+ for (const section of config.sections) collectFromSection(section);
214
+ return {
215
+ collections,
216
+ globals
217
+ };
218
+ }
219
+ /**
220
+ * Normalize sidebar/dashboard state from instance.state.
221
+ * The state can be:
222
+ * - An array of SidebarContribution[] (new composable pattern)
223
+ * - A single SidebarContribution or SidebarCallback (legacy or config-level)
224
+ * - A ServerSidebarConfig (old builder pattern from .sidebar() method)
225
+ *
226
+ * Returns a normalized array of contributions.
227
+ */
228
+ function normalizeSidebarContributions(raw) {
229
+ if (!raw) return [];
230
+ if (Array.isArray(raw)) {
231
+ const result = [];
232
+ for (const item of raw) {
233
+ const resolved$1 = resolveSidebarCallback(item);
234
+ if (resolved$1) result.push(resolved$1);
235
+ }
236
+ return result;
237
+ }
238
+ const resolved = resolveSidebarCallback(raw);
239
+ return resolved ? [resolved] : [];
240
+ }
241
+ function normalizeDashboardContributions(raw) {
242
+ if (!raw) return [];
243
+ if (Array.isArray(raw)) {
244
+ const result = [];
245
+ for (const item of raw) {
246
+ const resolved$1 = resolveDashboardCallback(item);
247
+ if (resolved$1) result.push(resolved$1);
248
+ }
249
+ return result;
250
+ }
251
+ const resolved = resolveDashboardCallback(raw);
252
+ return resolved ? [resolved] : [];
253
+ }
254
+ /**
255
+ * Merge SidebarContribution[] into a ServerSidebarConfig.
256
+ *
257
+ * Rules (§5.8.3):
258
+ * - Sections: deduplicated by id. Later contribution wins for title/icon/collapsible.
259
+ * - Items: grouped by sectionId. Appended in module resolution order.
260
+ * Items with `position: "start"` are prepended to the section.
261
+ * - Sections appear in the order they were first defined.
262
+ */
263
+ function mergeSidebarContributions(contributions) {
264
+ const sectionOrder = [];
265
+ const sectionDefs = /* @__PURE__ */ new Map();
266
+ const sectionItems = /* @__PURE__ */ new Map();
267
+ for (const contrib of contributions) {
268
+ if (contrib.sections) for (const sec of contrib.sections) {
269
+ const existingIdx = sectionOrder.indexOf(sec.id);
270
+ if (existingIdx !== -1) sectionOrder.splice(existingIdx, 1);
271
+ sectionOrder.push(sec.id);
272
+ sectionDefs.set(sec.id, {
273
+ title: sec.title ?? sectionDefs.get(sec.id)?.title,
274
+ icon: sec.icon ?? sectionDefs.get(sec.id)?.icon,
275
+ collapsible: sec.collapsible ?? sectionDefs.get(sec.id)?.collapsible
276
+ });
277
+ }
278
+ if (contrib.items) for (const item of contrib.items) {
279
+ const sid = item.sectionId;
280
+ if (!sectionItems.has(sid)) sectionItems.set(sid, []);
281
+ const items = sectionItems.get(sid) ?? [];
282
+ if (item.position === "start") items.unshift(item);
283
+ else items.push(item);
284
+ sectionItems.set(sid, items);
285
+ if (!sectionDefs.has(sid)) {
286
+ sectionOrder.push(sid);
287
+ sectionDefs.set(sid, {});
288
+ }
289
+ }
290
+ }
291
+ const sections = [];
292
+ for (const sectionId of sectionOrder) {
293
+ const def = sectionDefs.get(sectionId);
294
+ const items = sectionItems.get(sectionId) ?? [];
295
+ sections.push({
296
+ id: sectionId,
297
+ title: def?.title,
298
+ icon: def?.icon,
299
+ collapsible: def?.collapsible,
300
+ items: items.map(({ sectionId: _sid, position: _pos, ...rest }) => rest)
301
+ });
302
+ }
303
+ return { sections };
304
+ }
305
+ /**
306
+ * Merge DashboardContribution[] into a ServerDashboardConfig.
307
+ *
308
+ * Rules (§5.8.3):
309
+ * - Metadata (title, description, columns, realtime): last non-undefined wins.
310
+ * - Actions: concatenated from all contributions.
311
+ * - Sections: deduplicated by id. Later wins for label/layout/columns.
312
+ * - Items: grouped by sectionId. Appended in module resolution order.
313
+ * Items with `position: "start"` are prepended.
314
+ */
315
+ function mergeDashboardContributions(contributions) {
316
+ let title;
317
+ let description;
318
+ let columns;
319
+ let realtime;
320
+ const allActions = [];
321
+ const sectionOrder = [];
322
+ const sectionDefs = /* @__PURE__ */ new Map();
323
+ const sectionItems = /* @__PURE__ */ new Map();
324
+ for (const contrib of contributions) {
325
+ if (contrib.title !== void 0) title = contrib.title;
326
+ if (contrib.description !== void 0) description = contrib.description;
327
+ if (contrib.columns !== void 0) columns = contrib.columns;
328
+ if (contrib.realtime !== void 0) realtime = contrib.realtime;
329
+ if (contrib.actions) allActions.push(...contrib.actions);
330
+ if (contrib.sections) for (const sec of contrib.sections) {
331
+ const existingIdx = sectionOrder.indexOf(sec.id);
332
+ if (existingIdx !== -1) sectionOrder.splice(existingIdx, 1);
333
+ sectionOrder.push(sec.id);
334
+ sectionDefs.set(sec.id, {
335
+ label: sec.label ?? sectionDefs.get(sec.id)?.label,
336
+ layout: sec.layout ?? sectionDefs.get(sec.id)?.layout,
337
+ columns: sec.columns ?? sectionDefs.get(sec.id)?.columns
338
+ });
339
+ }
340
+ if (contrib.items) for (const item of contrib.items) {
341
+ const sid = item.sectionId;
342
+ if (!sectionItems.has(sid)) sectionItems.set(sid, []);
343
+ const items = sectionItems.get(sid) ?? [];
344
+ if (item.position === "start") items.unshift(item);
345
+ else items.push(item);
346
+ sectionItems.set(sid, items);
347
+ if (!sectionDefs.has(sid)) {
348
+ sectionOrder.push(sid);
349
+ sectionDefs.set(sid, {});
350
+ }
351
+ }
352
+ }
353
+ const dashboardItems = [];
354
+ for (const sectionId of sectionOrder) {
355
+ const def = sectionDefs.get(sectionId);
356
+ const items = sectionItems.get(sectionId) ?? [];
357
+ if (items.length > 0 || def?.label) dashboardItems.push({
358
+ type: "section",
359
+ label: def?.label,
360
+ layout: def?.layout ?? "grid",
361
+ columns: def?.columns,
362
+ items: items.map(({ sectionId: _sid, position: _pos, ...rest }) => rest)
363
+ });
364
+ }
365
+ return {
366
+ title,
367
+ description,
368
+ columns,
369
+ realtime,
370
+ actions: allActions.length > 0 ? allActions : void 0,
371
+ items: dashboardItems.length > 0 ? dashboardItems : void 0
372
+ };
373
+ }
374
+ /**
375
+ * Check whether a state value looks like legacy ServerSidebarConfig
376
+ * (has .sections array directly) vs contribution-based (array of contributions).
377
+ */
378
+ function isLegacySidebarConfig(value) {
379
+ if (value == null || typeof value !== "object" || Array.isArray(value)) return false;
380
+ const obj = value;
381
+ if (Array.isArray(obj.sections) && Array.isArray(obj.items)) return false;
382
+ return Array.isArray(obj.sections);
383
+ }
384
+ /**
385
+ * Check whether a state value looks like legacy ServerDashboardConfig
386
+ * (has .items or .title directly) vs contribution-based.
387
+ */
388
+ function isLegacyDashboardConfig(value) {
389
+ if (value == null || typeof value !== "object" || Array.isArray(value)) return false;
390
+ const obj = value;
391
+ if (Array.isArray(obj.sections) && Array.isArray(obj.items)) return false;
392
+ return "items" in obj || "title" in obj;
393
+ }
394
+ /**
395
+ * Auto-assign IDs to widgets that don't have one.
396
+ * Needed for fetchWidgetData lookup by widget ID.
397
+ */
398
+ function assignWidgetIds(items) {
399
+ let counter = 0;
400
+ function walk(items$1) {
401
+ for (const item of items$1) {
402
+ const rec = item;
403
+ if (item.type === "section") walk(rec.items || []);
404
+ else if (item.type === "tabs") for (const tab of rec.tabs || []) walk(tab.items || []);
405
+ else if (!rec.id) rec.id = `__auto_${item.type}_${counter++}`;
406
+ }
407
+ }
408
+ walk(items);
409
+ }
410
+ /**
411
+ * Process dashboard items: evaluate access, strip non-serializable props,
412
+ * mark hasLoader, and filter by collection access.
413
+ */
414
+ async function processDashboardItems(items, accessibleCollections, accessCtx) {
415
+ const result = [];
416
+ for (const item of items) {
417
+ const rec = item;
418
+ if (item.type === "section") {
419
+ const filtered = await processDashboardItems(rec.items || [], accessibleCollections, accessCtx);
420
+ if (filtered.length > 0) result.push({
421
+ ...item,
422
+ items: filtered
423
+ });
424
+ continue;
425
+ }
426
+ if (item.type === "tabs") {
427
+ const rawTabs = rec.tabs || [];
428
+ const tabs = await Promise.all(rawTabs.map(async (tab) => {
429
+ const filtered = await processDashboardItems(tab.items || [], accessibleCollections, accessCtx);
430
+ return {
431
+ ...tab,
432
+ items: filtered
433
+ };
434
+ }));
435
+ result.push({
436
+ ...item,
437
+ tabs
438
+ });
439
+ continue;
440
+ }
441
+ const widget = rec;
442
+ if (widget.access !== void 0) {
443
+ if ((typeof widget.access === "function" ? await widget.access({
444
+ app: accessCtx.app,
445
+ db: accessCtx.db,
446
+ session: accessCtx.session,
447
+ locale: accessCtx.locale
448
+ }) : widget.access) === false) continue;
449
+ }
450
+ if (widget.collection && !accessibleCollections.has(widget.collection)) continue;
451
+ if (widget.type === "quickActions") {
452
+ const actions = (widget.actions || []).filter((action) => {
453
+ if (action.action?.type === "create") return accessibleCollections.has(action.action.collection);
454
+ return true;
455
+ });
456
+ const { loader: loader$1, access: access$1, ...serializable$1 } = widget;
457
+ result.push({
458
+ ...serializable$1,
459
+ actions
460
+ });
461
+ continue;
462
+ }
463
+ const { loader, access, filterFn, ...serializable } = widget;
464
+ if (loader) serializable.hasLoader = true;
465
+ if (serializable.label && !serializable.title) serializable.title = serializable.label;
466
+ result.push(serializable);
467
+ }
468
+ return result;
469
+ }
470
+ const getAdminConfigSchema = z.object({}).optional();
471
+ const getAdminConfigOutputSchema = adminConfigDTOSchema;
472
+ /**
473
+ * Get admin configuration including dashboard, sidebar, blocks,
474
+ * and collection/global metadata.
475
+ *
476
+ * Filters all results by the current user's read access rules.
477
+ *
478
+ * @example
479
+ * ```ts
480
+ * // In your app
481
+ * const app = runtimeConfig({
482
+ * modules: [adminModule],
483
+ * dashboard: ({ d }) => d.dashboard({
484
+ * title: { en: "Dashboard" },
485
+ * items: [...],
486
+ * }))
487
+ * .sidebar(({ s }) => s.sidebar({
488
+ * sections: [...],
489
+ * }))
490
+ * .build({ ... });
491
+ *
492
+ * // Client fetches config
493
+ * const config = await client.routes.getAdminConfig({});
494
+ * ```
495
+ */
496
+ const getAdminConfig = route().post().schema(getAdminConfigSchema).outputSchema(getAdminConfigOutputSchema).handler(async (ctx) => {
497
+ const app = getApp(ctx);
498
+ const appState = getAppState(app);
499
+ const adminCfg = getAdminConfig$1(app);
500
+ const accessCtx = getAccessContext(ctx);
501
+ const collections = app.getCollections();
502
+ const globals = app.getGlobals();
503
+ const [accessibleCollections, accessibleGlobals] = await Promise.all([Promise.all(Object.entries(collections).map(async ([name, col]) => await hasReadAccess(getCollectionState(col).access?.read, accessCtx) ? name : null)).then((names) => new Set(names.filter(Boolean))), Promise.all(Object.entries(globals).map(async ([name, g]) => await hasReadAccess(getGlobalState(g).access?.read, accessCtx) ? name : null)).then((names) => new Set(names.filter(Boolean)))]);
504
+ const allCollectionsMeta = extractCollectionsMeta(app);
505
+ const allGlobalsMeta = extractGlobalsMeta(app);
506
+ const filteredCollectionsMeta = Object.fromEntries(Object.entries(allCollectionsMeta).filter(([n]) => accessibleCollections.has(n)));
507
+ const filteredGlobalsMeta = Object.fromEntries(Object.entries(allGlobalsMeta).filter(([n]) => accessibleGlobals.has(n)));
508
+ const response = {};
509
+ const uploadCollections = Object.entries(collections).filter(([name, collection$1]) => accessibleCollections.has(name) && Boolean(getCollectionState(collection$1).upload)).map(([name]) => name);
510
+ response.uploads = {
511
+ collections: uploadCollections,
512
+ defaultCollection: uploadCollections.length === 1 ? uploadCollections[0] : void 0
513
+ };
514
+ if (adminCfg.branding) response.branding = adminCfg.branding;
515
+ if (adminCfg.dashboard) {
516
+ let dashboard;
517
+ if (isLegacyDashboardConfig(adminCfg.dashboard)) dashboard = adminCfg.dashboard;
518
+ else dashboard = mergeDashboardContributions(normalizeDashboardContributions(adminCfg.dashboard));
519
+ if (dashboard.items) assignWidgetIds(dashboard.items);
520
+ response.dashboard = {
521
+ ...dashboard,
522
+ items: dashboard.items ? await processDashboardItems(dashboard.items, accessibleCollections, accessCtx) : void 0
523
+ };
524
+ }
525
+ if (adminCfg.sidebar) {
526
+ let sidebarConfig;
527
+ if (isLegacySidebarConfig(adminCfg.sidebar)) sidebarConfig = adminCfg.sidebar;
528
+ else sidebarConfig = mergeSidebarContributions(normalizeSidebarContributions(adminCfg.sidebar));
529
+ const filteredSidebar = filterSidebarConfig(sidebarConfig, accessibleCollections, accessibleGlobals);
530
+ const referenced = collectSidebarReferences(sidebarConfig);
531
+ const unlistedSidebar = buildAutoSidebar(Object.fromEntries(Object.entries(filteredCollectionsMeta).filter(([name, meta]) => !referenced.collections.has(name) && !meta.hidden)), Object.fromEntries(Object.entries(filteredGlobalsMeta).filter(([name, meta]) => !referenced.globals.has(name) && !meta.hidden)));
532
+ const mergedSections = [...filteredSidebar.sections];
533
+ for (const unlistedSection of unlistedSidebar.sections) {
534
+ const existing = mergedSections.find((s) => s.id === unlistedSection.id);
535
+ if (existing) existing.items = [...existing.items ?? [], ...unlistedSection.items ?? []];
536
+ else mergedSections.push(unlistedSection);
537
+ }
538
+ response.sidebar = { sections: mergedSections };
539
+ } else response.sidebar = buildAutoSidebar(filteredCollectionsMeta, filteredGlobalsMeta);
540
+ if (appState.blocks && Object.keys(appState.blocks).length > 0) response.blocks = introspectBlocks(appState.blocks);
541
+ response.collections = filteredCollectionsMeta;
542
+ response.globals = filteredGlobalsMeta;
543
+ return response;
544
+ });
545
+ /**
546
+ * Admin config route handlers.
547
+ * Registered via module routes and exposed through the fetch handler.
548
+ */
549
+ const adminConfigFunctions = { getAdminConfig };
550
+
551
+ //#endregion
552
+ export { adminConfigFunctions };