@questpie/admin 2.0.0 → 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.
- package/README.md +119 -122
- package/dist/augmentation.d.mts +110 -11
- package/dist/client/blocks/block-renderer.d.mts +5 -12
- package/dist/client/blocks/block-renderer.mjs +89 -55
- package/dist/client/blocks/index.d.mts +2 -4
- package/dist/client/blocks/types.d.mts +3 -4
- package/dist/client/blocks/types.mjs +1 -2
- package/dist/client/builder/admin-types.d.mts +11 -44
- package/dist/client/builder/admin.d.mts +34 -45
- package/dist/client/builder/admin.mjs +35 -44
- package/dist/client/builder/field/field.d.mts +27 -205
- package/dist/client/builder/field/field.mjs +22 -68
- package/dist/client/builder/index.d.mts +23 -28
- package/dist/client/builder/page/page.d.mts +15 -27
- package/dist/client/builder/page/page.mjs +21 -17
- package/dist/client/builder/registry.d.mts +14 -34
- package/dist/client/builder/types/action-registry.mjs +148 -14
- package/dist/client/builder/types/action-types.d.mts +8 -35
- package/dist/client/builder/types/collection-types.mjs +1 -2
- package/dist/client/builder/types/common.d.mts +6 -20
- package/dist/client/builder/types/field-types.d.mts +4 -5
- package/dist/client/builder/types/field-types.mjs +1 -2
- package/dist/client/builder/types/ui-config.d.mts +3 -5
- package/dist/client/builder/types/widget-types.d.mts +19 -20
- package/dist/client/builder/validation.d.mts +33 -3
- package/dist/client/builder/validation.mjs +169 -150
- package/dist/client/builder/view/view.d.mts +26 -106
- package/dist/client/builder/view/view.mjs +14 -96
- package/dist/client/builder/widget/widget.d.mts +16 -22
- package/dist/client/builder/widget/widget.mjs +11 -16
- package/dist/client/components/actions/action-button.mjs +207 -97
- package/dist/client/components/actions/action-dialog.mjs +471 -176
- package/dist/client/components/actions/confirmation-dialog.mjs +166 -47
- package/dist/client/components/actions/header-actions.mjs +164 -71
- package/dist/client/components/admin-link.d.mts +8 -9
- package/dist/client/components/admin-link.mjs +127 -48
- package/dist/client/components/auth/auth-guard.d.mts +6 -7
- package/dist/client/components/auth/auth-guard.mjs +9 -9
- package/dist/client/components/auth/auth-loading.d.mts +3 -4
- package/dist/client/components/auth/auth-loading.mjs +38 -10
- package/dist/client/components/blocks/block-canvas.mjs +111 -42
- package/dist/client/components/blocks/block-editor-context.mjs +90 -23
- package/dist/client/components/blocks/block-editor-layout.mjs +176 -59
- package/dist/client/components/blocks/block-editor-provider.mjs +219 -139
- package/dist/client/components/blocks/block-fields-renderer.mjs +212 -42
- package/dist/client/components/blocks/block-insert-button.mjs +168 -51
- package/dist/client/components/blocks/block-item-menu.mjs +312 -110
- package/dist/client/components/blocks/block-item.mjs +372 -125
- package/dist/client/components/blocks/block-library-sidebar.mjs +209 -114
- package/dist/client/components/blocks/block-tree.mjs +73 -15
- package/dist/client/components/blocks/block-type-icon.mjs +65 -20
- package/dist/client/components/blocks/utils/tree-utils.mjs +1 -2
- package/dist/client/components/component-renderer.d.mts +11 -22
- package/dist/client/components/component-renderer.mjs +151 -38
- package/dist/client/components/error-boundary.mjs +77 -25
- package/dist/client/components/fields/array-field.mjs +474 -199
- package/dist/client/components/fields/asset-preview-field.mjs +143 -44
- package/dist/client/components/fields/blocks-field/blocks-field.mjs +143 -35
- package/dist/client/components/fields/boolean-field.mjs +62 -32
- package/dist/client/components/fields/date-field.mjs +46 -12
- package/dist/client/components/fields/datetime-field.mjs +42 -11
- package/dist/client/components/fields/email-field.mjs +57 -28
- package/dist/client/components/fields/field-utils.mjs +1 -2
- package/dist/client/components/fields/field-wrapper.mjs +107 -32
- package/dist/client/components/fields/json-field.mjs +323 -110
- package/dist/client/components/fields/locale-badge.mjs +16 -8
- package/dist/client/components/fields/number-field.mjs +63 -30
- package/dist/client/components/fields/object-array-field.mjs +666 -272
- package/dist/client/components/fields/object-field.mjs +656 -98
- package/dist/client/components/fields/relation/displays/cards-display.mjs +225 -111
- package/dist/client/components/fields/relation/displays/chips-display.mjs +150 -77
- package/dist/client/components/fields/relation/displays/grid-display.mjs +186 -91
- package/dist/client/components/fields/relation/displays/list-display.mjs +230 -111
- package/dist/client/components/fields/relation/displays/table-display.mjs +241 -66
- package/dist/client/components/fields/relation/displays/types.mjs +2 -3
- package/dist/client/components/fields/relation/relation-items-display.mjs +131 -35
- package/dist/client/components/fields/relation-field.mjs +70 -15
- package/dist/client/components/fields/relation-picker.mjs +93 -98
- package/dist/client/components/fields/relation-select.mjs +42 -29
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +90 -41
- package/dist/client/components/fields/rich-text-editor/extensions.mjs +33 -7
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs +48 -23
- package/dist/client/components/fields/rich-text-editor/index.mjs +491 -158
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs +13 -14
- package/dist/client/components/fields/rich-text-editor/presets.mjs +1 -2
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +96 -53
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs +416 -107
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs +476 -215
- package/dist/client/components/fields/rich-text-editor/types.mjs +1 -2
- package/dist/client/components/fields/rich-text-editor/utils.mjs +1 -2
- package/dist/client/components/fields/rich-text-field.mjs +55 -17
- package/dist/client/components/fields/select-field.mjs +79 -44
- package/dist/client/components/fields/text-field.mjs +62 -29
- package/dist/client/components/fields/textarea-field.mjs +61 -29
- package/dist/client/components/fields/time-field.mjs +39 -11
- package/dist/client/components/fields/upload-field.mjs +253 -129
- package/dist/client/components/filter-builder/columns-tab.mjs +287 -93
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs +437 -138
- package/dist/client/components/filter-builder/filters-tab.mjs +409 -126
- package/dist/client/components/filter-builder/saved-views-tab.mjs +259 -106
- package/dist/client/components/history-sidebar.mjs +496 -0
- package/dist/client/components/layout/field-layout-renderer.mjs +301 -0
- package/dist/client/components/locale-switcher.mjs +231 -108
- package/dist/client/components/media/media-grid.mjs +259 -84
- package/dist/client/components/media/media-picker-dialog.mjs +500 -192
- package/dist/client/components/preview/live-preview-mode.mjs +416 -124
- package/dist/client/components/preview/preview-pane.mjs +353 -144
- package/dist/client/components/primitives/asset-preview.mjs +665 -257
- package/dist/client/components/primitives/checkbox-input.mjs +37 -11
- package/dist/client/components/primitives/date-input.mjs +392 -149
- package/dist/client/components/primitives/dropzone.mjs +314 -185
- package/dist/client/components/primitives/number-input.mjs +14 -10
- package/dist/client/components/primitives/select-multi.mjs +519 -185
- package/dist/client/components/primitives/select-single.mjs +416 -126
- package/dist/client/components/primitives/text-input.mjs +10 -5
- package/dist/client/components/primitives/textarea-input.mjs +10 -5
- package/dist/client/components/primitives/time-input.mjs +118 -45
- package/dist/client/components/primitives/toggle-input.mjs +31 -11
- package/dist/client/components/primitives/types.mjs +1 -2
- package/dist/client/components/sheets/resource-sheet.mjs +72 -64
- package/dist/client/components/ui/accordion.mjs +156 -37
- package/dist/client/components/ui/alert.mjs +70 -17
- package/dist/client/components/ui/badge.mjs +57 -16
- package/dist/client/components/ui/button.mjs +49 -14
- package/dist/client/components/ui/card.mjs +194 -39
- package/dist/client/components/ui/checkbox.mjs +71 -16
- package/dist/client/components/ui/command.mjs +220 -50
- package/dist/client/components/ui/dialog.mjs +265 -52
- package/dist/client/components/ui/drawer.mjs +260 -57
- package/dist/client/components/ui/dropdown-menu.mjs +293 -67
- package/dist/client/components/ui/empty-state.mjs +72 -26
- package/dist/client/components/ui/field.mjs +332 -56
- package/dist/client/components/ui/input-group.mjs +174 -41
- package/dist/client/components/ui/input.mjs +38 -9
- package/dist/client/components/ui/kbd.mjs +37 -8
- package/dist/client/components/ui/label.mjs +38 -8
- package/dist/client/components/ui/popover.mjs +162 -35
- package/dist/client/components/ui/responsive-dialog.mjs +277 -71
- package/dist/client/components/ui/search-input.mjs +101 -36
- package/dist/client/components/ui/select.mjs +297 -57
- package/dist/client/components/ui/separator.mjs +39 -9
- package/dist/client/components/ui/sheet.mjs +253 -51
- package/dist/client/components/ui/sidebar.mjs +700 -182
- package/dist/client/components/ui/skeleton.mjs +33 -8
- package/dist/client/components/ui/sonner.d.mts +2 -3
- package/dist/client/components/ui/sonner.mjs +45 -15
- package/dist/client/components/ui/spinner.mjs +44 -10
- package/dist/client/components/ui/switch.mjs +47 -12
- package/dist/client/components/ui/table.mjs +260 -50
- package/dist/client/components/ui/tabs.mjs +140 -29
- package/dist/client/components/ui/textarea.mjs +33 -8
- package/dist/client/components/ui/toolbar.mjs +105 -23
- package/dist/client/components/ui/tooltip.mjs +130 -29
- package/dist/client/components/widgets/chart-widget.mjs +456 -156
- package/dist/client/components/widgets/progress-widget.mjs +150 -60
- package/dist/client/components/widgets/quick-actions-widget.mjs +175 -87
- package/dist/client/components/widgets/recent-items-widget.mjs +157 -62
- package/dist/client/components/widgets/stats-widget.mjs +153 -42
- package/dist/client/components/widgets/table-widget.mjs +198 -64
- package/dist/client/components/widgets/timeline-widget.mjs +193 -82
- package/dist/client/components/widgets/value-widget.mjs +257 -56
- package/dist/client/components/widgets/widget-skeletons.mjs +390 -108
- package/dist/client/contexts/breadcrumb-context.mjs +44 -16
- package/dist/client/{context → contexts}/focus-context.d.mts +6 -7
- package/dist/client/{context → contexts}/focus-context.mjs +134 -62
- package/dist/client/hooks/typed-hooks.d.mts +38 -12
- package/dist/client/hooks/typed-hooks.mjs +758 -142
- package/dist/client/hooks/use-action.mjs +197 -69
- package/dist/client/hooks/use-admin-config.mjs +39 -10
- package/dist/client/hooks/use-admin-preferences.mjs +118 -15
- package/dist/client/hooks/use-admin-routes.mjs +60 -27
- package/dist/client/hooks/use-audit-history.mjs +157 -0
- package/dist/client/hooks/use-auth.d.mts +14 -15
- package/dist/client/hooks/use-auth.mjs +8 -9
- package/dist/client/hooks/use-collection-fields.mjs +58 -19
- package/dist/client/hooks/use-collection-meta.mjs +45 -13
- package/dist/client/hooks/use-collection-schema.mjs +34 -11
- package/dist/client/hooks/use-collection-validation.mjs +39 -25
- package/dist/client/hooks/use-collection.d.mts +18 -8
- package/dist/client/hooks/use-collection.mjs +560 -101
- package/dist/client/hooks/use-current-user.d.mts +6 -3
- package/dist/client/hooks/use-current-user.mjs +2 -2
- package/dist/client/hooks/use-field-hooks.mjs +73 -65
- package/dist/client/hooks/use-field-options.d.mts +1 -34
- package/dist/client/hooks/use-field-options.mjs +233 -148
- package/dist/client/hooks/use-global-fields.mjs +47 -16
- package/dist/client/hooks/use-global-meta.mjs +57 -11
- package/dist/client/hooks/use-global-schema.mjs +31 -11
- package/dist/client/hooks/use-global.d.mts +13 -2
- package/dist/client/hooks/use-global.mjs +244 -34
- package/dist/client/hooks/use-locks.mjs +331 -124
- package/dist/client/hooks/use-media-query.d.mts +1 -2
- package/dist/client/hooks/use-media-query.mjs +38 -19
- package/dist/client/hooks/use-prefill-params.mjs +2 -2
- package/dist/client/hooks/use-questpie-query-options.mjs +33 -11
- package/dist/client/hooks/use-reactive-fields.d.mts +6 -3
- package/dist/client/hooks/use-reactive-fields.mjs +130 -93
- package/dist/client/hooks/use-realtime-highlight.mjs +115 -53
- package/dist/client/hooks/use-saved-views.mjs +109 -34
- package/dist/client/hooks/use-search-param-toggle.d.mts +12 -0
- package/dist/client/hooks/use-search-param-toggle.mjs +115 -0
- package/dist/client/hooks/use-search.mjs +147 -36
- package/dist/client/hooks/use-server-actions.mjs +191 -0
- package/dist/client/hooks/use-server-validation.mjs +164 -72
- package/dist/client/hooks/use-server-widget-data.d.mts +2 -3
- package/dist/client/hooks/use-server-widget-data.mjs +36 -11
- package/dist/client/hooks/use-setup-status.d.mts +3 -4
- package/dist/client/hooks/use-setup-status.mjs +28 -16
- package/dist/client/hooks/use-sidebar-search-param.d.mts +9 -0
- package/dist/client/hooks/use-sidebar-search-param.mjs +104 -0
- package/dist/client/hooks/use-transition-stage.mjs +125 -0
- package/dist/client/hooks/use-upload-collection.mjs +1 -2
- package/dist/client/hooks/use-upload.mjs +189 -125
- package/dist/client/hooks/use-validation-error-map.mjs +10 -6
- package/dist/client/hooks/use-view-state.mjs +380 -162
- package/dist/client/i18n/hooks.mjs +191 -67
- package/dist/client/i18n/intl-cache.mjs +1 -2
- package/dist/client/i18n/messages.mjs +1 -2
- package/dist/client/i18n/simple.d.mts +1 -2
- package/dist/client/i18n/simple.mjs +1 -2
- package/dist/client/i18n/types.d.mts +1 -2
- package/dist/client/lib/cookies.mjs +9 -0
- package/dist/client/lib/events.mjs +5 -0
- package/dist/client/lib/render-profiler.mjs +51 -0
- package/dist/client/lib/utils.mjs +1 -6
- package/dist/client/preview/block-scope-context.d.mts +5 -6
- package/dist/client/preview/block-scope-context.mjs +50 -27
- package/dist/client/preview/index.d.mts +2 -2
- package/dist/client/preview/preview-banner.d.mts +3 -4
- package/dist/client/preview/preview-banner.mjs +74 -35
- package/dist/client/preview/preview-field.d.mts +9 -10
- package/dist/client/preview/preview-field.mjs +163 -61
- package/dist/client/preview/types.d.mts +1 -2
- package/dist/client/preview/types.mjs +1 -2
- package/dist/client/preview/use-collection-preview.d.mts +1 -2
- package/dist/client/preview/use-collection-preview.mjs +105 -56
- package/dist/client/runtime/content-locales-provider.mjs +87 -36
- package/dist/client/runtime/index.d.mts +1 -3
- package/dist/client/runtime/index.mjs +1 -3
- package/dist/client/runtime/locale-scope.mjs +69 -29
- package/dist/client/runtime/provider.d.mts +18 -9922
- package/dist/client/runtime/provider.mjs +250 -86
- package/dist/client/runtime/routes.d.mts +7 -7
- package/dist/client/runtime/routes.mjs +4 -20
- package/dist/client/runtime/translations-provider.mjs +114 -53
- package/dist/client/scope/picker.d.mts +3 -4
- package/dist/client/scope/picker.mjs +324 -90
- package/dist/client/scope/provider.d.mts +4 -5
- package/dist/client/scope/provider.mjs +30 -22
- package/dist/client/scope/types.d.mts +1 -2
- package/dist/client/styles/index.css +301 -225
- package/dist/client/utils/auto-expand-fields.mjs +23 -5
- package/dist/client/utils/build-field-definitions-from-schema.mjs +10 -7
- package/dist/client/utils/dependency-tracker.mjs +61 -0
- package/dist/client/utils/detect-relations.mjs +1 -2
- package/dist/client/utils/locale-to-flag.d.mts +8 -7
- package/dist/client/utils/locale-to-flag.mjs +1 -2
- package/dist/client/utils/routes.mjs +1 -2
- package/dist/client/views/auth/accept-invite-form.d.mts +3 -4
- package/dist/client/views/auth/accept-invite-form.mjs +414 -121
- package/dist/client/views/auth/auth-layout.d.mts +7 -8
- package/dist/client/views/auth/auth-layout.mjs +93 -30
- package/dist/client/views/auth/forgot-password-form.d.mts +4 -5
- package/dist/client/views/auth/forgot-password-form.mjs +332 -100
- package/dist/client/views/auth/invite-form.mjs +447 -105
- package/dist/client/views/auth/login-form.d.mts +4 -5
- package/dist/client/views/auth/login-form.mjs +340 -120
- package/dist/client/views/auth/reset-password-form.d.mts +4 -5
- package/dist/client/views/auth/reset-password-form.mjs +458 -131
- package/dist/client/views/auth/setup-form.d.mts +4 -5
- package/dist/client/views/auth/setup-form.mjs +481 -141
- package/dist/client/views/collection/auto-form-fields.mjs +686 -266
- package/dist/client/views/collection/bulk-action-toolbar.mjs +392 -203
- package/dist/client/views/collection/cells/complex-cells.mjs +635 -216
- package/dist/client/views/collection/cells/primitive-cells.mjs +332 -102
- package/dist/client/views/collection/cells/relation-cells.mjs +227 -72
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +456 -136
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs +49 -2
- package/dist/client/views/collection/cells/shared/relation-chip.mjs +109 -25
- package/dist/client/views/collection/cells/upload-cells.mjs +16 -8
- package/dist/client/views/collection/columns/build-columns.mjs +51 -12
- package/dist/client/views/collection/columns/column-defaults.mjs +17 -2
- package/dist/client/views/collection/field-context.mjs +10 -11
- package/dist/client/views/collection/field-renderer.mjs +237 -40
- package/dist/client/views/collection/form-view.mjs +1108 -445
- package/dist/client/views/collection/table-view.mjs +300 -163
- package/dist/client/views/collection/view-skeletons.mjs +181 -87
- package/dist/client/views/common/global-search.mjs +557 -233
- package/dist/client/views/dashboard/dashboard-grid.mjs +707 -211
- package/dist/client/views/dashboard/dashboard-widget.mjs +145 -58
- package/dist/client/views/dashboard/widget-card.mjs +315 -102
- package/dist/client/views/globals/global-form-view.mjs +1256 -131
- package/dist/client/views/layout/admin-layout-provider.d.mts +18 -21
- package/dist/client/views/layout/admin-layout-provider.mjs +135 -32
- package/dist/client/views/layout/admin-layout.d.mts +14 -32
- package/dist/client/views/layout/admin-layout.mjs +254 -96
- package/dist/client/views/layout/admin-router.d.mts +10 -42
- package/dist/client/views/layout/admin-router.mjs +1086 -426
- package/dist/client/views/layout/admin-sidebar.d.mts +10 -16
- package/dist/client/views/layout/admin-sidebar.mjs +1211 -382
- package/dist/client/views/layout/admin-topbar.mjs +220 -112
- package/dist/client/views/pages/accept-invite-page.d.mts +5 -6
- package/dist/client/views/pages/accept-invite-page.mjs +302 -96
- package/dist/client/views/pages/dashboard-page.d.mts +7 -16
- package/dist/client/views/pages/dashboard-page.mjs +62 -23
- package/dist/client/views/pages/forgot-password-page.d.mts +7 -10
- package/dist/client/views/pages/forgot-password-page.mjs +112 -40
- package/dist/client/views/pages/invite-page.d.mts +6 -7
- package/dist/client/views/pages/invite-page.mjs +121 -46
- package/dist/client/views/pages/login-page.d.mts +8 -15
- package/dist/client/views/pages/login-page.mjs +152 -57
- package/dist/client/views/pages/reset-password-page.d.mts +7 -10
- package/dist/client/views/pages/reset-password-page.mjs +209 -57
- package/dist/client/views/pages/setup-page.d.mts +7 -10
- package/dist/client/views/pages/setup-page.mjs +108 -43
- package/dist/client-module.d.mts +3 -0
- package/dist/client-module.mjs +3 -0
- package/dist/client.d.mts +55 -48
- package/dist/client.mjs +26 -28
- package/dist/components/rich-text/rich-text-renderer.d.mts +3 -4
- package/dist/components/rich-text/rich-text-renderer.mjs +97 -70
- package/dist/index.d.mts +36 -39
- package/dist/index.mjs +26 -28
- package/dist/plugin.d.mts +2 -0
- package/dist/plugin.mjs +3 -0
- package/dist/server/adapters/nextjs.d.mts +13 -14
- package/dist/server/adapters/nextjs.mjs +12 -13
- package/dist/server/adapters/tanstack.d.mts +10 -11
- package/dist/server/adapters/tanstack.mjs +11 -12
- package/dist/server/augmentation/actions.d.mts +279 -0
- package/dist/server/augmentation/common.d.mts +76 -0
- package/dist/server/augmentation/dashboard.d.mts +547 -0
- package/dist/server/augmentation/form-layout.d.mts +303 -0
- package/dist/server/augmentation/index.d.mts +44 -0
- package/dist/server/augmentation/index.mjs +10 -0
- package/dist/server/augmentation/sidebar.d.mts +181 -0
- package/dist/server/augmentation/views.d.mts +237 -0
- package/dist/server/augmentation.d.mts +7 -1523
- package/dist/server/block/index.d.mts +4 -3
- package/dist/server/codegen/admin-client-template.mjs +93 -0
- package/dist/server/codegen/projection-validator.mjs +67 -0
- package/dist/server/fields/blocks.d.mts +10 -78
- package/dist/server/fields/blocks.mjs +74 -115
- package/dist/server/fields/index.d.mts +6 -39
- package/dist/server/fields/index.mjs +6 -7
- package/dist/server/fields/rich-text.d.mts +10 -77
- package/dist/server/fields/rich-text.mjs +59 -100
- package/dist/server/i18n/index.mjs +8 -9
- package/dist/server/i18n/messages/cs.mjs +3 -3
- package/dist/server/i18n/messages/de.mjs +3 -3
- package/dist/server/i18n/messages/en.mjs +217 -3
- package/dist/server/i18n/messages/es.mjs +3 -3
- package/dist/server/i18n/messages/fr.mjs +3 -3
- package/dist/server/i18n/messages/index.mjs +1 -2
- package/dist/server/i18n/messages/pl.mjs +3 -3
- package/dist/server/i18n/messages/pt.mjs +3 -3
- package/dist/server/i18n/messages/sk.mjs +202 -3
- package/dist/server/modules/admin/.generated/module.d.mts +52 -0
- package/dist/server/modules/admin/.generated/module.mjs +78 -0
- package/dist/server/modules/admin/.generated/registries.d.mts +22 -0
- package/dist/server/{auth-helpers.d.mts → modules/admin/auth-helpers.d.mts} +13 -14
- package/dist/server/{auth-helpers.mjs → modules/admin/auth-helpers.mjs} +15 -16
- package/dist/server/{block → modules/admin/block}/block-builder.d.mts +96 -32
- package/dist/server/{block → modules/admin/block}/block-builder.mjs +113 -15
- package/dist/server/modules/admin/block/index.d.mts +3 -0
- package/dist/server/{block → modules/admin/block}/introspection.d.mts +10 -5
- package/dist/server/{block → modules/admin/block}/introspection.mjs +18 -7
- package/dist/server/{block → modules/admin/block}/prefetch.d.mts +17 -17
- package/dist/server/{block → modules/admin/block}/prefetch.mjs +17 -16
- package/dist/server/modules/admin/client/.generated/module.d.mts +94 -0
- package/dist/server/modules/admin/client/.generated/module.mjs +91 -0
- package/dist/server/modules/admin/client/components/badge.d.mts +1 -0
- package/dist/server/modules/admin/client/components/icon.d.mts +1 -0
- package/dist/server/modules/admin/client/fields/array.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/array.mjs +12 -0
- package/dist/server/modules/admin/client/fields/assetPreview.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/assetPreview.mjs +18 -0
- package/dist/server/modules/admin/client/fields/blocks.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/blocks.mjs +12 -0
- package/dist/server/modules/admin/client/fields/boolean.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/boolean.mjs +12 -0
- package/dist/server/modules/admin/client/fields/date.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/date.mjs +12 -0
- package/dist/server/modules/admin/client/fields/datetime.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/datetime.mjs +12 -0
- package/dist/server/modules/admin/client/fields/email.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/email.mjs +12 -0
- package/dist/server/modules/admin/client/fields/json.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/json.mjs +11 -0
- package/dist/server/modules/admin/client/fields/number.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/number.mjs +12 -0
- package/dist/server/modules/admin/client/fields/object.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/object.mjs +12 -0
- package/dist/server/modules/admin/client/fields/relation.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/relation.mjs +12 -0
- package/dist/server/modules/admin/client/fields/richText.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/richText.mjs +11 -0
- package/dist/server/modules/admin/client/fields/select.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/select.mjs +12 -0
- package/dist/server/modules/admin/client/fields/text.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/text.mjs +12 -0
- package/dist/server/modules/admin/client/fields/textarea.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/textarea.mjs +12 -0
- package/dist/server/modules/admin/client/fields/time.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/time.mjs +12 -0
- package/dist/server/modules/admin/client/fields/upload.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/upload.mjs +12 -0
- package/dist/server/modules/admin/client/fields/url.d.mts +6 -0
- package/dist/server/modules/admin/client/fields/url.mjs +12 -0
- package/dist/server/modules/admin/client/index.d.mts +1 -0
- package/dist/server/modules/admin/client/pages/dashboard.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/dashboard.mjs +11 -0
- package/dist/server/modules/admin/client/pages/forgotPassword.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/forgotPassword.mjs +11 -0
- package/dist/server/modules/admin/client/pages/login.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/login.mjs +11 -0
- package/dist/server/modules/admin/client/pages/resetPassword.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/resetPassword.mjs +11 -0
- package/dist/server/modules/admin/client/pages/setup.d.mts +6 -0
- package/dist/server/modules/admin/client/pages/setup.mjs +11 -0
- package/dist/server/modules/admin/client/views/collection-form.mjs +10 -0
- package/dist/server/modules/admin/client/views/collection-table.mjs +10 -0
- package/dist/server/modules/admin/client/views/global-form.mjs +10 -0
- package/dist/server/modules/admin/client/widgets/chart.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/chart.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/progress.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/progress.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/quickActions.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/quickActions.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/recentItems.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/recentItems.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/stats.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/stats.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/table.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/table.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/timeline.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/timeline.mjs +7 -0
- package/dist/server/modules/admin/client/widgets/value.d.mts +6 -0
- package/dist/server/modules/admin/client/widgets/value.mjs +7 -0
- package/dist/server/modules/admin/collections/account.d.mts +77 -0
- package/dist/server/modules/admin/collections/account.mjs +23 -0
- package/dist/server/modules/admin/collections/admin-locks.d.mts +90 -0
- package/dist/server/modules/admin/collections/admin-locks.mjs +16 -0
- package/dist/server/modules/admin/collections/admin-preferences.d.mts +69 -0
- package/dist/server/modules/admin/collections/admin-preferences.mjs +16 -0
- package/dist/server/modules/admin/collections/admin-saved-views.d.mts +83 -0
- package/dist/server/modules/admin/collections/admin-saved-views.mjs +16 -0
- package/dist/server/modules/admin/collections/apikey.d.mts +99 -0
- package/dist/server/modules/admin/collections/apikey.mjs +15 -0
- package/dist/server/modules/admin/collections/assets.d.mts +72 -0
- package/dist/server/modules/admin/collections/assets.mjs +71 -0
- package/dist/server/modules/admin/collections/session.d.mts +69 -0
- package/dist/server/modules/admin/collections/session.mjs +15 -0
- package/dist/server/modules/admin/collections/user.d.mts +85 -0
- package/dist/server/modules/admin/collections/user.mjs +204 -0
- package/dist/server/modules/admin/collections/verification.d.mts +63 -0
- package/dist/server/modules/admin/collections/verification.mjs +15 -0
- package/dist/server/modules/admin/components/badge.d.mts +10 -0
- package/dist/server/modules/admin/components/badge.mjs +10 -0
- package/dist/server/modules/admin/components/icon.d.mts +9 -0
- package/dist/server/modules/admin/components/icon.mjs +11 -0
- package/dist/server/modules/admin/config/admin.mjs +34 -0
- package/dist/server/modules/admin/dto/admin-config.dto.mjs +102 -0
- package/dist/server/modules/admin/factories.mjs +172 -0
- package/dist/server/modules/admin/index.d.mts +1060 -16846
- package/dist/server/modules/admin/index.mjs +17 -240
- package/dist/server/modules/admin/modules.mjs +11 -0
- package/dist/server/modules/admin/plugin.mjs +13 -0
- package/dist/server/modules/admin/routes/admin-config.d.mts +28 -0
- package/dist/server/modules/admin/routes/admin-config.mjs +552 -0
- package/dist/server/modules/admin/{functions → routes}/execute-action.d.mts +17 -32
- package/dist/server/modules/admin/{functions → routes}/execute-action.mjs +146 -44
- package/dist/server/modules/admin/routes/locales.d.mts +18 -0
- package/dist/server/modules/admin/routes/locales.mjs +69 -0
- package/dist/server/modules/admin/{functions → routes}/preview.d.mts +25 -15
- package/dist/server/modules/admin/{functions → routes}/preview.mjs +84 -97
- package/dist/server/modules/admin/{functions → routes}/reactive.d.mts +19 -44
- package/dist/server/modules/admin/{functions → routes}/reactive.mjs +89 -117
- package/dist/server/modules/admin/routes/route-helpers.d.mts +23 -0
- package/dist/server/modules/admin/routes/route-helpers.mjs +76 -0
- package/dist/server/modules/admin/{functions → routes}/setup.d.mts +11 -32
- package/dist/server/modules/admin/routes/setup.mjs +114 -0
- package/dist/server/modules/admin/routes/translations.d.mts +26 -0
- package/dist/server/modules/admin/routes/translations.mjs +114 -0
- package/dist/server/modules/admin/routes/widget-data.d.mts +32 -0
- package/dist/server/modules/admin/routes/widget-data.mjs +62 -0
- package/dist/server/modules/admin/views/form.d.mts +8 -0
- package/dist/server/modules/admin/views/form.mjs +7 -0
- package/dist/server/modules/admin/views/global-form.d.mts +8 -0
- package/dist/server/modules/admin/views/global-form.mjs +7 -0
- package/dist/server/modules/admin/views/table.d.mts +8 -0
- package/dist/server/modules/admin/views/table.mjs +7 -0
- package/dist/server/modules/admin-preferences/collections/{admin-preferences.collection.mjs → admin-preferences.mjs} +13 -24
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +18 -42
- package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +99 -0
- package/dist/server/modules/admin-preferences/collections/saved-views.mjs +38 -0
- package/dist/server/modules/audit/.generated/module.d.mts +60 -0
- package/dist/server/modules/audit/.generated/module.mjs +30 -0
- package/dist/server/modules/audit/collections/audit-log.d.mts +214 -0
- package/dist/server/modules/audit/collections/audit-log.mjs +107 -0
- package/dist/server/modules/audit/config/admin.mjs +21 -0
- package/dist/server/modules/audit/config/app.mjs +262 -0
- package/dist/server/modules/audit/index.d.mts +2 -0
- package/dist/server/modules/audit/jobs/audit-cleanup.d.mts +13 -0
- package/dist/server/modules/audit/jobs/audit-cleanup.mjs +28 -0
- package/dist/server/plugin.d.mts +26 -0
- package/dist/server/plugin.mjs +385 -0
- package/dist/server/proxy-factories.d.mts +85 -0
- package/dist/server/proxy-factories.mjs +302 -0
- package/dist/server/registry-helpers.d.mts +83 -0
- package/dist/server/registry-helpers.mjs +104 -0
- package/dist/server.d.mts +30 -18
- package/dist/server.mjs +19 -16
- package/dist/shared/preview-utils.d.mts +2 -3
- package/dist/shared/preview-utils.mjs +2 -3
- package/dist/shared/types/saved-views.types.d.mts +2 -2
- package/package.json +50 -40
- package/skills/questpie-admin/SKILL.md +397 -0
- package/skills/questpie-admin/blocks/SKILL.md +305 -0
- package/skills/questpie-admin/custom-ui/SKILL.md +307 -0
- package/skills/questpie-admin/views/SKILL.md +442 -0
- package/dist/_virtual/rolldown_runtime.mjs +0 -18
- package/dist/augmentation.d.mts.map +0 -1
- package/dist/client/blocks/block-registry.d.mts +0 -199
- package/dist/client/blocks/block-registry.d.mts.map +0 -1
- package/dist/client/blocks/block-registry.mjs +0 -88
- package/dist/client/blocks/block-registry.mjs.map +0 -1
- package/dist/client/blocks/block-renderer.d.mts.map +0 -1
- package/dist/client/blocks/block-renderer.mjs.map +0 -1
- package/dist/client/blocks/prefetch.d.mts +0 -45
- package/dist/client/blocks/prefetch.d.mts.map +0 -1
- package/dist/client/blocks/prefetch.mjs +0 -26
- package/dist/client/blocks/prefetch.mjs.map +0 -1
- package/dist/client/blocks/types.d.mts.map +0 -1
- package/dist/client/blocks/types.mjs.map +0 -1
- package/dist/client/builder/admin-builder.d.mts +0 -112
- package/dist/client/builder/admin-builder.d.mts.map +0 -1
- package/dist/client/builder/admin-builder.mjs +0 -185
- package/dist/client/builder/admin-builder.mjs.map +0 -1
- package/dist/client/builder/admin-types.d.mts.map +0 -1
- package/dist/client/builder/admin.d.mts.map +0 -1
- package/dist/client/builder/admin.mjs.map +0 -1
- package/dist/client/builder/defaults/components.mjs +0 -20
- package/dist/client/builder/defaults/components.mjs.map +0 -1
- package/dist/client/builder/defaults/core.d.mts +0 -354
- package/dist/client/builder/defaults/core.d.mts.map +0 -1
- package/dist/client/builder/defaults/core.mjs +0 -49
- package/dist/client/builder/defaults/core.mjs.map +0 -1
- package/dist/client/builder/defaults/fields.mjs +0 -328
- package/dist/client/builder/defaults/fields.mjs.map +0 -1
- package/dist/client/builder/defaults/pages.mjs +0 -58
- package/dist/client/builder/defaults/pages.mjs.map +0 -1
- package/dist/client/builder/defaults/starter.d.mts +0 -351
- package/dist/client/builder/defaults/starter.d.mts.map +0 -1
- package/dist/client/builder/defaults/starter.mjs +0 -28
- package/dist/client/builder/defaults/starter.mjs.map +0 -1
- package/dist/client/builder/defaults/views.mjs +0 -27
- package/dist/client/builder/defaults/views.mjs.map +0 -1
- package/dist/client/builder/defaults/widgets.mjs +0 -31
- package/dist/client/builder/defaults/widgets.mjs.map +0 -1
- package/dist/client/builder/field/field.d.mts.map +0 -1
- package/dist/client/builder/field/field.mjs.map +0 -1
- package/dist/client/builder/index.d.mts.map +0 -1
- package/dist/client/builder/page/page.d.mts.map +0 -1
- package/dist/client/builder/page/page.mjs.map +0 -1
- package/dist/client/builder/proxies.d.mts +0 -2
- package/dist/client/builder/proxies.mjs +0 -24
- package/dist/client/builder/proxies.mjs.map +0 -1
- package/dist/client/builder/qa.d.mts +0 -50
- package/dist/client/builder/qa.d.mts.map +0 -1
- package/dist/client/builder/qa.mjs +0 -42
- package/dist/client/builder/qa.mjs.map +0 -1
- package/dist/client/builder/registry.d.mts.map +0 -1
- package/dist/client/builder/types/action-registry.d.mts +0 -2
- package/dist/client/builder/types/action-registry.mjs.map +0 -1
- package/dist/client/builder/types/action-types.d.mts.map +0 -1
- package/dist/client/builder/types/collection-types.d.mts +0 -199
- package/dist/client/builder/types/collection-types.d.mts.map +0 -1
- package/dist/client/builder/types/collection-types.mjs.map +0 -1
- package/dist/client/builder/types/common.d.mts.map +0 -1
- package/dist/client/builder/types/field-types.d.mts.map +0 -1
- package/dist/client/builder/types/field-types.mjs.map +0 -1
- package/dist/client/builder/types/global-types.d.mts +0 -22
- package/dist/client/builder/types/global-types.d.mts.map +0 -1
- package/dist/client/builder/types/ui-config.d.mts.map +0 -1
- package/dist/client/builder/types/views.d.mts +0 -89
- package/dist/client/builder/types/views.d.mts.map +0 -1
- package/dist/client/builder/types/widget-types.d.mts.map +0 -1
- package/dist/client/builder/validation.mjs.map +0 -1
- package/dist/client/builder/view/view.d.mts.map +0 -1
- package/dist/client/builder/view/view.mjs.map +0 -1
- package/dist/client/builder/widget/widget.d.mts.map +0 -1
- package/dist/client/builder/widget/widget.mjs.map +0 -1
- package/dist/client/components/actions/action-button.d.mts +0 -2
- package/dist/client/components/actions/action-button.mjs.map +0 -1
- package/dist/client/components/actions/action-dialog.d.mts +0 -2
- package/dist/client/components/actions/action-dialog.mjs.map +0 -1
- package/dist/client/components/actions/confirmation-dialog.d.mts +0 -2
- package/dist/client/components/actions/confirmation-dialog.mjs.map +0 -1
- package/dist/client/components/actions/header-actions.d.mts +0 -2
- package/dist/client/components/actions/header-actions.mjs.map +0 -1
- package/dist/client/components/actions/index.d.mts +0 -4
- package/dist/client/components/admin-link.d.mts.map +0 -1
- package/dist/client/components/admin-link.mjs.map +0 -1
- package/dist/client/components/auth/auth-guard.d.mts.map +0 -1
- package/dist/client/components/auth/auth-guard.mjs.map +0 -1
- package/dist/client/components/auth/auth-loading.d.mts.map +0 -1
- package/dist/client/components/auth/auth-loading.mjs.map +0 -1
- package/dist/client/components/auth/index.d.mts +0 -2
- package/dist/client/components/blocks/block-canvas.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-context.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-layout.mjs.map +0 -1
- package/dist/client/components/blocks/block-editor-provider.mjs.map +0 -1
- package/dist/client/components/blocks/block-fields-renderer.mjs.map +0 -1
- package/dist/client/components/blocks/block-insert-button.mjs.map +0 -1
- package/dist/client/components/blocks/block-item-menu.mjs.map +0 -1
- package/dist/client/components/blocks/block-item.mjs.map +0 -1
- package/dist/client/components/blocks/block-library-sidebar.mjs.map +0 -1
- package/dist/client/components/blocks/block-tree.mjs.map +0 -1
- package/dist/client/components/blocks/block-type-icon.mjs.map +0 -1
- package/dist/client/components/blocks/utils/tree-utils.mjs.map +0 -1
- package/dist/client/components/component-renderer.d.mts.map +0 -1
- package/dist/client/components/component-renderer.mjs.map +0 -1
- package/dist/client/components/error-boundary.mjs.map +0 -1
- package/dist/client/components/fields/array-field.d.mts +0 -44
- package/dist/client/components/fields/array-field.d.mts.map +0 -1
- package/dist/client/components/fields/array-field.mjs.map +0 -1
- package/dist/client/components/fields/asset-preview-field.d.mts +0 -52
- package/dist/client/components/fields/asset-preview-field.d.mts.map +0 -1
- package/dist/client/components/fields/asset-preview-field.mjs.map +0 -1
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts +0 -41
- package/dist/client/components/fields/blocks-field/blocks-field.d.mts.map +0 -1
- package/dist/client/components/fields/blocks-field/blocks-field.mjs.map +0 -1
- package/dist/client/components/fields/blocks-field/index.d.mts +0 -1
- package/dist/client/components/fields/boolean-field.d.mts +0 -30
- package/dist/client/components/fields/boolean-field.d.mts.map +0 -1
- package/dist/client/components/fields/boolean-field.mjs.map +0 -1
- package/dist/client/components/fields/custom-field.d.mts +0 -3
- package/dist/client/components/fields/date-field.d.mts +0 -22
- package/dist/client/components/fields/date-field.d.mts.map +0 -1
- package/dist/client/components/fields/date-field.mjs.map +0 -1
- package/dist/client/components/fields/datetime-field.d.mts +0 -23
- package/dist/client/components/fields/datetime-field.d.mts.map +0 -1
- package/dist/client/components/fields/datetime-field.mjs.map +0 -1
- package/dist/client/components/fields/email-field.d.mts +0 -19
- package/dist/client/components/fields/email-field.d.mts.map +0 -1
- package/dist/client/components/fields/email-field.mjs.map +0 -1
- package/dist/client/components/fields/embedded-collection.d.mts +0 -3
- package/dist/client/components/fields/field-types.d.mts +0 -571
- package/dist/client/components/fields/field-types.d.mts.map +0 -1
- package/dist/client/components/fields/field-utils.d.mts +0 -1
- package/dist/client/components/fields/field-utils.mjs.map +0 -1
- package/dist/client/components/fields/field-wrapper.d.mts +0 -3
- package/dist/client/components/fields/field-wrapper.mjs.map +0 -1
- package/dist/client/components/fields/index.d.mts +0 -33
- package/dist/client/components/fields/json-field.d.mts +0 -84
- package/dist/client/components/fields/json-field.d.mts.map +0 -1
- package/dist/client/components/fields/json-field.mjs.map +0 -1
- package/dist/client/components/fields/locale-badge.d.mts +0 -1
- package/dist/client/components/fields/locale-badge.mjs.map +0 -1
- package/dist/client/components/fields/number-field.d.mts +0 -23
- package/dist/client/components/fields/number-field.d.mts.map +0 -1
- package/dist/client/components/fields/number-field.mjs.map +0 -1
- package/dist/client/components/fields/object-array-field.d.mts +0 -2
- package/dist/client/components/fields/object-array-field.mjs.map +0 -1
- package/dist/client/components/fields/object-field.d.mts +0 -32
- package/dist/client/components/fields/object-field.d.mts.map +0 -1
- package/dist/client/components/fields/object-field.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/cards-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/cards-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/chips-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/chips-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/grid-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/grid-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/index.d.mts +0 -6
- package/dist/client/components/fields/relation/displays/list-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/list-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/table-display.d.mts +0 -2
- package/dist/client/components/fields/relation/displays/table-display.mjs.map +0 -1
- package/dist/client/components/fields/relation/displays/types.d.mts +0 -22
- package/dist/client/components/fields/relation/displays/types.d.mts.map +0 -1
- package/dist/client/components/fields/relation/displays/types.mjs.map +0 -1
- package/dist/client/components/fields/relation/index.d.mts +0 -3
- package/dist/client/components/fields/relation/relation-items-display.d.mts +0 -5
- package/dist/client/components/fields/relation/relation-items-display.mjs.map +0 -1
- package/dist/client/components/fields/relation-field.d.mts +0 -134
- package/dist/client/components/fields/relation-field.d.mts.map +0 -1
- package/dist/client/components/fields/relation-field.mjs.map +0 -1
- package/dist/client/components/fields/relation-picker.d.mts +0 -4
- package/dist/client/components/fields/relation-picker.mjs.map +0 -1
- package/dist/client/components/fields/relation-select.d.mts +0 -3
- package/dist/client/components/fields/relation-select.mjs.map +0 -1
- package/dist/client/components/fields/reverse-relation-field.d.mts +0 -2
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/extensions.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/image-popover.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/index.d.mts +0 -4
- package/dist/client/components/fields/rich-text-editor/index.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/link-popover.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/presets.d.mts +0 -11
- package/dist/client/components/fields/rich-text-editor/presets.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-editor/presets.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/table-controls.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/types.d.mts +0 -78
- package/dist/client/components/fields/rich-text-editor/types.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-editor/types.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/utils.mjs.map +0 -1
- package/dist/client/components/fields/rich-text-editor/variants.d.mts +0 -2
- package/dist/client/components/fields/rich-text-field.d.mts +0 -14
- package/dist/client/components/fields/rich-text-field.d.mts.map +0 -1
- package/dist/client/components/fields/rich-text-field.mjs.map +0 -1
- package/dist/client/components/fields/select-field.d.mts +0 -25
- package/dist/client/components/fields/select-field.d.mts.map +0 -1
- package/dist/client/components/fields/select-field.mjs.map +0 -1
- package/dist/client/components/fields/status-field.d.mts +0 -2
- package/dist/client/components/fields/text-field.d.mts +0 -22
- package/dist/client/components/fields/text-field.d.mts.map +0 -1
- package/dist/client/components/fields/text-field.mjs.map +0 -1
- package/dist/client/components/fields/textarea-field.d.mts +0 -22
- package/dist/client/components/fields/textarea-field.d.mts.map +0 -1
- package/dist/client/components/fields/textarea-field.mjs.map +0 -1
- package/dist/client/components/fields/time-field.d.mts +0 -20
- package/dist/client/components/fields/time-field.d.mts.map +0 -1
- package/dist/client/components/fields/time-field.mjs.map +0 -1
- package/dist/client/components/fields/upload-field.d.mts +0 -97
- package/dist/client/components/fields/upload-field.d.mts.map +0 -1
- package/dist/client/components/fields/upload-field.mjs.map +0 -1
- package/dist/client/components/filter-builder/columns-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/columns-tab.mjs.map +0 -1
- package/dist/client/components/filter-builder/filter-builder-sheet.d.mts +0 -1
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs.map +0 -1
- package/dist/client/components/filter-builder/filters-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/filters-tab.mjs.map +0 -1
- package/dist/client/components/filter-builder/index.d.mts +0 -5
- package/dist/client/components/filter-builder/saved-views-tab.d.mts +0 -1
- package/dist/client/components/filter-builder/saved-views-tab.mjs.map +0 -1
- package/dist/client/components/index.d.mts +0 -80
- package/dist/client/components/locale-switcher.d.mts +0 -2
- package/dist/client/components/locale-switcher.mjs.map +0 -1
- package/dist/client/components/media/media-grid.mjs.map +0 -1
- package/dist/client/components/media/media-picker-dialog.mjs.map +0 -1
- package/dist/client/components/preview/live-preview-mode.mjs.map +0 -1
- package/dist/client/components/preview/preview-pane.mjs.map +0 -1
- package/dist/client/components/primitives/asset-preview.mjs.map +0 -1
- package/dist/client/components/primitives/checkbox-input.mjs.map +0 -1
- package/dist/client/components/primitives/date-input.mjs.map +0 -1
- package/dist/client/components/primitives/dropzone.mjs.map +0 -1
- package/dist/client/components/primitives/number-input.mjs.map +0 -1
- package/dist/client/components/primitives/select-multi.mjs.map +0 -1
- package/dist/client/components/primitives/select-single.mjs.map +0 -1
- package/dist/client/components/primitives/text-input.mjs.map +0 -1
- package/dist/client/components/primitives/textarea-input.mjs.map +0 -1
- package/dist/client/components/primitives/time-input.mjs.map +0 -1
- package/dist/client/components/primitives/toggle-input.mjs.map +0 -1
- package/dist/client/components/primitives/types.d.mts +0 -14
- package/dist/client/components/primitives/types.d.mts.map +0 -1
- package/dist/client/components/primitives/types.mjs.map +0 -1
- package/dist/client/components/sheets/index.d.mts +0 -1
- package/dist/client/components/sheets/resource-sheet.d.mts +0 -1
- package/dist/client/components/sheets/resource-sheet.mjs.map +0 -1
- package/dist/client/components/ui/accordion.d.mts +0 -2
- package/dist/client/components/ui/accordion.mjs.map +0 -1
- package/dist/client/components/ui/alert.mjs.map +0 -1
- package/dist/client/components/ui/avatar.d.mts +0 -3
- package/dist/client/components/ui/badge.d.mts +0 -3
- package/dist/client/components/ui/badge.mjs.map +0 -1
- package/dist/client/components/ui/button.d.mts +0 -3
- package/dist/client/components/ui/button.mjs.map +0 -1
- package/dist/client/components/ui/card.d.mts +0 -2
- package/dist/client/components/ui/card.mjs.map +0 -1
- package/dist/client/components/ui/checkbox.d.mts +0 -2
- package/dist/client/components/ui/checkbox.mjs.map +0 -1
- package/dist/client/components/ui/combobox.d.mts +0 -3
- package/dist/client/components/ui/command.mjs.map +0 -1
- package/dist/client/components/ui/dialog.d.mts +0 -3
- package/dist/client/components/ui/dialog.mjs.map +0 -1
- package/dist/client/components/ui/drawer.mjs.map +0 -1
- package/dist/client/components/ui/dropdown-menu.d.mts +0 -3
- package/dist/client/components/ui/dropdown-menu.mjs.map +0 -1
- package/dist/client/components/ui/empty-state.mjs.map +0 -1
- package/dist/client/components/ui/field.d.mts +0 -3
- package/dist/client/components/ui/field.mjs.map +0 -1
- package/dist/client/components/ui/input-group.d.mts +0 -4
- package/dist/client/components/ui/input-group.mjs.map +0 -1
- package/dist/client/components/ui/input.d.mts +0 -2
- package/dist/client/components/ui/input.mjs.map +0 -1
- package/dist/client/components/ui/kbd.mjs.map +0 -1
- package/dist/client/components/ui/label.d.mts +0 -2
- package/dist/client/components/ui/label.mjs.map +0 -1
- package/dist/client/components/ui/popover.d.mts +0 -3
- package/dist/client/components/ui/popover.mjs.map +0 -1
- package/dist/client/components/ui/responsive-dialog.mjs.map +0 -1
- package/dist/client/components/ui/scroll-area.d.mts +0 -2
- package/dist/client/components/ui/search-input.mjs.map +0 -1
- package/dist/client/components/ui/select.d.mts +0 -3
- package/dist/client/components/ui/select.mjs.map +0 -1
- package/dist/client/components/ui/separator.d.mts +0 -2
- package/dist/client/components/ui/separator.mjs.map +0 -1
- package/dist/client/components/ui/sheet.d.mts +0 -3
- package/dist/client/components/ui/sheet.mjs.map +0 -1
- package/dist/client/components/ui/sidebar.d.mts +0 -8
- package/dist/client/components/ui/sidebar.mjs.map +0 -1
- package/dist/client/components/ui/skeleton.d.mts +0 -1
- package/dist/client/components/ui/skeleton.mjs.map +0 -1
- package/dist/client/components/ui/sonner.d.mts.map +0 -1
- package/dist/client/components/ui/sonner.mjs.map +0 -1
- package/dist/client/components/ui/spinner.d.mts +0 -1
- package/dist/client/components/ui/spinner.mjs.map +0 -1
- package/dist/client/components/ui/switch.d.mts +0 -2
- package/dist/client/components/ui/switch.mjs.map +0 -1
- package/dist/client/components/ui/table.d.mts +0 -2
- package/dist/client/components/ui/table.mjs.map +0 -1
- package/dist/client/components/ui/tabs.d.mts +0 -3
- package/dist/client/components/ui/tabs.mjs.map +0 -1
- package/dist/client/components/ui/textarea.d.mts +0 -2
- package/dist/client/components/ui/textarea.mjs.map +0 -1
- package/dist/client/components/ui/toolbar.mjs.map +0 -1
- package/dist/client/components/ui/tooltip.d.mts +0 -2
- package/dist/client/components/ui/tooltip.mjs.map +0 -1
- package/dist/client/components/widgets/chart-widget.d.mts +0 -57
- package/dist/client/components/widgets/chart-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/chart-widget.mjs.map +0 -1
- package/dist/client/components/widgets/progress-widget.d.mts +0 -41
- package/dist/client/components/widgets/progress-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/progress-widget.mjs.map +0 -1
- package/dist/client/components/widgets/quick-actions-widget.d.mts +0 -29
- package/dist/client/components/widgets/quick-actions-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/quick-actions-widget.mjs.map +0 -1
- package/dist/client/components/widgets/recent-items-widget.d.mts +0 -51
- package/dist/client/components/widgets/recent-items-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/recent-items-widget.mjs.map +0 -1
- package/dist/client/components/widgets/stats-widget.d.mts +0 -55
- package/dist/client/components/widgets/stats-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/stats-widget.mjs.map +0 -1
- package/dist/client/components/widgets/table-widget.d.mts +0 -31
- package/dist/client/components/widgets/table-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/table-widget.mjs.map +0 -1
- package/dist/client/components/widgets/timeline-widget.d.mts +0 -51
- package/dist/client/components/widgets/timeline-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/timeline-widget.mjs.map +0 -1
- package/dist/client/components/widgets/value-widget.d.mts +0 -39
- package/dist/client/components/widgets/value-widget.d.mts.map +0 -1
- package/dist/client/components/widgets/value-widget.mjs.map +0 -1
- package/dist/client/components/widgets/widget-skeletons.mjs.map +0 -1
- package/dist/client/context/focus-context.d.mts.map +0 -1
- package/dist/client/context/focus-context.mjs.map +0 -1
- package/dist/client/contexts/breadcrumb-context.mjs.map +0 -1
- package/dist/client/hooks/typed-hooks.d.mts.map +0 -1
- package/dist/client/hooks/typed-hooks.mjs.map +0 -1
- package/dist/client/hooks/use-action.mjs.map +0 -1
- package/dist/client/hooks/use-admin-config.mjs.map +0 -1
- package/dist/client/hooks/use-admin-preferences.mjs.map +0 -1
- package/dist/client/hooks/use-admin-routes.mjs.map +0 -1
- package/dist/client/hooks/use-auth.d.mts.map +0 -1
- package/dist/client/hooks/use-auth.mjs.map +0 -1
- package/dist/client/hooks/use-collection-fields.mjs.map +0 -1
- package/dist/client/hooks/use-collection-meta.mjs.map +0 -1
- package/dist/client/hooks/use-collection-schema.mjs.map +0 -1
- package/dist/client/hooks/use-collection-validation.mjs.map +0 -1
- package/dist/client/hooks/use-collection.d.mts.map +0 -1
- package/dist/client/hooks/use-collection.mjs.map +0 -1
- package/dist/client/hooks/use-current-user.d.mts.map +0 -1
- package/dist/client/hooks/use-current-user.mjs.map +0 -1
- package/dist/client/hooks/use-field-hooks.mjs.map +0 -1
- package/dist/client/hooks/use-field-options.d.mts.map +0 -1
- package/dist/client/hooks/use-field-options.mjs.map +0 -1
- package/dist/client/hooks/use-global-fields.mjs.map +0 -1
- package/dist/client/hooks/use-global-meta.mjs.map +0 -1
- package/dist/client/hooks/use-global-schema.mjs.map +0 -1
- package/dist/client/hooks/use-global.d.mts.map +0 -1
- package/dist/client/hooks/use-global.mjs.map +0 -1
- package/dist/client/hooks/use-locks.mjs.map +0 -1
- package/dist/client/hooks/use-media-query.d.mts.map +0 -1
- package/dist/client/hooks/use-media-query.mjs.map +0 -1
- package/dist/client/hooks/use-prefill-params.mjs.map +0 -1
- package/dist/client/hooks/use-questpie-query-options.mjs.map +0 -1
- package/dist/client/hooks/use-reactive-fields.d.mts.map +0 -1
- package/dist/client/hooks/use-reactive-fields.mjs.map +0 -1
- package/dist/client/hooks/use-realtime-highlight.mjs.map +0 -1
- package/dist/client/hooks/use-saved-views.mjs.map +0 -1
- package/dist/client/hooks/use-search.mjs.map +0 -1
- package/dist/client/hooks/use-server-validation.mjs.map +0 -1
- package/dist/client/hooks/use-server-widget-data.d.mts.map +0 -1
- package/dist/client/hooks/use-server-widget-data.mjs.map +0 -1
- package/dist/client/hooks/use-setup-status.d.mts.map +0 -1
- package/dist/client/hooks/use-setup-status.mjs.map +0 -1
- package/dist/client/hooks/use-upload-collection.mjs.map +0 -1
- package/dist/client/hooks/use-upload.d.mts +0 -23
- package/dist/client/hooks/use-upload.d.mts.map +0 -1
- package/dist/client/hooks/use-upload.mjs.map +0 -1
- package/dist/client/hooks/use-validation-error-map.mjs.map +0 -1
- package/dist/client/hooks/use-view-state.mjs.map +0 -1
- package/dist/client/i18n/hooks.mjs.map +0 -1
- package/dist/client/i18n/intl-cache.mjs.map +0 -1
- package/dist/client/i18n/messages.mjs.map +0 -1
- package/dist/client/i18n/simple.d.mts.map +0 -1
- package/dist/client/i18n/simple.mjs.map +0 -1
- package/dist/client/i18n/types.d.mts.map +0 -1
- package/dist/client/lib/utils.d.mts +0 -1
- package/dist/client/lib/utils.mjs.map +0 -1
- package/dist/client/preview/block-scope-context.d.mts.map +0 -1
- package/dist/client/preview/block-scope-context.mjs.map +0 -1
- package/dist/client/preview/preview-banner.d.mts.map +0 -1
- package/dist/client/preview/preview-banner.mjs.map +0 -1
- package/dist/client/preview/preview-field.d.mts.map +0 -1
- package/dist/client/preview/preview-field.mjs.map +0 -1
- package/dist/client/preview/types.d.mts.map +0 -1
- package/dist/client/preview/types.mjs.map +0 -1
- package/dist/client/preview/use-collection-preview.d.mts.map +0 -1
- package/dist/client/preview/use-collection-preview.mjs.map +0 -1
- package/dist/client/runtime/content-locales-provider.mjs.map +0 -1
- package/dist/client/runtime/locale-scope.mjs.map +0 -1
- package/dist/client/runtime/provider.d.mts.map +0 -1
- package/dist/client/runtime/provider.mjs.map +0 -1
- package/dist/client/runtime/routes.d.mts.map +0 -1
- package/dist/client/runtime/routes.mjs.map +0 -1
- package/dist/client/runtime/translations-provider.d.mts +0 -2
- package/dist/client/runtime/translations-provider.mjs.map +0 -1
- package/dist/client/scope/picker.d.mts.map +0 -1
- package/dist/client/scope/picker.mjs.map +0 -1
- package/dist/client/scope/provider.d.mts.map +0 -1
- package/dist/client/scope/provider.mjs.map +0 -1
- package/dist/client/scope/types.d.mts.map +0 -1
- package/dist/client/utils/auto-expand-fields.mjs.map +0 -1
- package/dist/client/utils/build-field-definitions-from-schema.mjs.map +0 -1
- package/dist/client/utils/detect-relations.mjs.map +0 -1
- package/dist/client/utils/locale-to-flag.d.mts.map +0 -1
- package/dist/client/utils/locale-to-flag.mjs.map +0 -1
- package/dist/client/utils/routes.mjs.map +0 -1
- package/dist/client/views/auth/accept-invite-form.d.mts.map +0 -1
- package/dist/client/views/auth/accept-invite-form.mjs.map +0 -1
- package/dist/client/views/auth/auth-layout.d.mts.map +0 -1
- package/dist/client/views/auth/auth-layout.mjs.map +0 -1
- package/dist/client/views/auth/forgot-password-form.d.mts.map +0 -1
- package/dist/client/views/auth/forgot-password-form.mjs.map +0 -1
- package/dist/client/views/auth/index.d.mts +0 -7
- package/dist/client/views/auth/invite-form.d.mts +0 -1
- package/dist/client/views/auth/invite-form.mjs.map +0 -1
- package/dist/client/views/auth/login-form.d.mts.map +0 -1
- package/dist/client/views/auth/login-form.mjs.map +0 -1
- package/dist/client/views/auth/reset-password-form.d.mts.map +0 -1
- package/dist/client/views/auth/reset-password-form.mjs.map +0 -1
- package/dist/client/views/auth/setup-form.d.mts.map +0 -1
- package/dist/client/views/auth/setup-form.mjs.map +0 -1
- package/dist/client/views/collection/auto-form-fields.d.mts +0 -4
- package/dist/client/views/collection/auto-form-fields.mjs.map +0 -1
- package/dist/client/views/collection/bulk-action-toolbar.mjs.map +0 -1
- package/dist/client/views/collection/cells/complex-cells.d.mts +0 -46
- package/dist/client/views/collection/cells/complex-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/complex-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/index.d.mts +0 -7
- package/dist/client/views/collection/cells/primitive-cells.d.mts +0 -76
- package/dist/client/views/collection/cells/primitive-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/primitive-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/relation-cells.d.mts +0 -21
- package/dist/client/views/collection/cells/relation-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/relation-cells.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/asset-thumbnail.d.mts +0 -1
- package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/cell-helpers.d.mts +0 -2
- package/dist/client/views/collection/cells/shared/cell-helpers.mjs.map +0 -1
- package/dist/client/views/collection/cells/shared/relation-chip.d.mts +0 -1
- package/dist/client/views/collection/cells/shared/relation-chip.mjs.map +0 -1
- package/dist/client/views/collection/cells/upload-cells.d.mts +0 -25
- package/dist/client/views/collection/cells/upload-cells.d.mts.map +0 -1
- package/dist/client/views/collection/cells/upload-cells.mjs.map +0 -1
- package/dist/client/views/collection/columns/build-columns.d.mts +0 -2
- package/dist/client/views/collection/columns/build-columns.mjs.map +0 -1
- package/dist/client/views/collection/columns/column-defaults.d.mts +0 -2
- package/dist/client/views/collection/columns/column-defaults.mjs.map +0 -1
- package/dist/client/views/collection/columns/index.d.mts +0 -3
- package/dist/client/views/collection/columns/types.d.mts +0 -2
- package/dist/client/views/collection/field-context.mjs.map +0 -1
- package/dist/client/views/collection/field-renderer.mjs.map +0 -1
- package/dist/client/views/collection/form-view.d.mts +0 -112
- package/dist/client/views/collection/form-view.d.mts.map +0 -1
- package/dist/client/views/collection/form-view.mjs.map +0 -1
- package/dist/client/views/collection/index.d.mts +0 -9
- package/dist/client/views/collection/table-view.d.mts +0 -102
- package/dist/client/views/collection/table-view.d.mts.map +0 -1
- package/dist/client/views/collection/table-view.mjs.map +0 -1
- package/dist/client/views/collection/view-skeletons.mjs.map +0 -1
- package/dist/client/views/common/global-search.d.mts +0 -1
- package/dist/client/views/common/global-search.mjs.map +0 -1
- package/dist/client/views/common/index.d.mts +0 -1
- package/dist/client/views/dashboard/dashboard-grid.mjs.map +0 -1
- package/dist/client/views/dashboard/dashboard-widget.mjs.map +0 -1
- package/dist/client/views/dashboard/widget-card.mjs.map +0 -1
- package/dist/client/views/globals/global-form-view.d.mts +0 -74
- package/dist/client/views/globals/global-form-view.d.mts.map +0 -1
- package/dist/client/views/globals/global-form-view.mjs.map +0 -1
- package/dist/client/views/index.d.mts +0 -28
- package/dist/client/views/layout/admin-layout-provider.d.mts.map +0 -1
- package/dist/client/views/layout/admin-layout-provider.mjs.map +0 -1
- package/dist/client/views/layout/admin-layout.d.mts.map +0 -1
- package/dist/client/views/layout/admin-layout.mjs.map +0 -1
- package/dist/client/views/layout/admin-root.d.mts +0 -7
- package/dist/client/views/layout/admin-router.d.mts.map +0 -1
- package/dist/client/views/layout/admin-router.mjs.map +0 -1
- package/dist/client/views/layout/admin-sidebar.d.mts.map +0 -1
- package/dist/client/views/layout/admin-sidebar.mjs.map +0 -1
- package/dist/client/views/layout/admin-topbar.mjs.map +0 -1
- package/dist/client/views/layout/index.d.mts +0 -5
- package/dist/client/views/pages/accept-invite-page.d.mts.map +0 -1
- package/dist/client/views/pages/accept-invite-page.mjs.map +0 -1
- package/dist/client/views/pages/dashboard-page.d.mts.map +0 -1
- package/dist/client/views/pages/dashboard-page.mjs.map +0 -1
- package/dist/client/views/pages/forgot-password-page.d.mts.map +0 -1
- package/dist/client/views/pages/forgot-password-page.mjs.map +0 -1
- package/dist/client/views/pages/index.d.mts +0 -7
- package/dist/client/views/pages/invite-page.d.mts.map +0 -1
- package/dist/client/views/pages/invite-page.mjs.map +0 -1
- package/dist/client/views/pages/login-page.d.mts.map +0 -1
- package/dist/client/views/pages/login-page.mjs.map +0 -1
- package/dist/client/views/pages/reset-password-page.d.mts.map +0 -1
- package/dist/client/views/pages/reset-password-page.mjs.map +0 -1
- package/dist/client/views/pages/setup-page.d.mts.map +0 -1
- package/dist/client/views/pages/setup-page.mjs.map +0 -1
- package/dist/client.d.mts.map +0 -1
- package/dist/components/rich-text/rich-text-renderer.d.mts.map +0 -1
- package/dist/components/rich-text/rich-text-renderer.mjs.map +0 -1
- package/dist/server/adapters/nextjs.d.mts.map +0 -1
- package/dist/server/adapters/nextjs.mjs.map +0 -1
- package/dist/server/adapters/tanstack.d.mts.map +0 -1
- package/dist/server/adapters/tanstack.mjs.map +0 -1
- package/dist/server/augmentation.d.mts.map +0 -1
- package/dist/server/auth-helpers.d.mts.map +0 -1
- package/dist/server/auth-helpers.mjs.map +0 -1
- package/dist/server/block/block-builder.d.mts.map +0 -1
- package/dist/server/block/block-builder.mjs.map +0 -1
- package/dist/server/block/introspection.d.mts.map +0 -1
- package/dist/server/block/introspection.mjs.map +0 -1
- package/dist/server/block/prefetch.d.mts.map +0 -1
- package/dist/server/block/prefetch.mjs.map +0 -1
- package/dist/server/fields/blocks.d.mts.map +0 -1
- package/dist/server/fields/blocks.mjs.map +0 -1
- package/dist/server/fields/index.d.mts.map +0 -1
- package/dist/server/fields/index.mjs.map +0 -1
- package/dist/server/fields/rich-text.d.mts.map +0 -1
- package/dist/server/fields/rich-text.mjs.map +0 -1
- package/dist/server/i18n/index.d.mts +0 -16
- package/dist/server/i18n/index.d.mts.map +0 -1
- package/dist/server/i18n/index.mjs.map +0 -1
- package/dist/server/i18n/messages/cs.mjs.map +0 -1
- package/dist/server/i18n/messages/de.mjs.map +0 -1
- package/dist/server/i18n/messages/en.mjs.map +0 -1
- package/dist/server/i18n/messages/es.mjs.map +0 -1
- package/dist/server/i18n/messages/fr.mjs.map +0 -1
- package/dist/server/i18n/messages/index.mjs.map +0 -1
- package/dist/server/i18n/messages/pl.mjs.map +0 -1
- package/dist/server/i18n/messages/pt.mjs.map +0 -1
- package/dist/server/i18n/messages/sk.mjs.map +0 -1
- package/dist/server/index.d.mts +0 -20
- package/dist/server/modules/admin/functions/admin-config.mjs +0 -348
- package/dist/server/modules/admin/functions/admin-config.mjs.map +0 -1
- package/dist/server/modules/admin/functions/execute-action.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/execute-action.mjs.map +0 -1
- package/dist/server/modules/admin/functions/locales.mjs +0 -80
- package/dist/server/modules/admin/functions/locales.mjs.map +0 -1
- package/dist/server/modules/admin/functions/preview.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/preview.mjs.map +0 -1
- package/dist/server/modules/admin/functions/reactive.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/reactive.mjs.map +0 -1
- package/dist/server/modules/admin/functions/setup.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/setup.mjs +0 -131
- package/dist/server/modules/admin/functions/setup.mjs.map +0 -1
- package/dist/server/modules/admin/functions/translations.mjs +0 -125
- package/dist/server/modules/admin/functions/translations.mjs.map +0 -1
- package/dist/server/modules/admin/functions/widget-data.d.mts +0 -33
- package/dist/server/modules/admin/functions/widget-data.d.mts.map +0 -1
- package/dist/server/modules/admin/functions/widget-data.mjs +0 -70
- package/dist/server/modules/admin/functions/widget-data.mjs.map +0 -1
- package/dist/server/modules/admin/index.d.mts.map +0 -1
- package/dist/server/modules/admin/index.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.d.mts +0 -3
- package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/locks.collection.d.mts +0 -3
- package/dist/server/modules/admin-preferences/collections/locks.collection.mjs.map +0 -1
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts +0 -1490
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts.map +0 -1
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs +0 -57
- package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs.map +0 -1
- package/dist/server/patch.d.mts +0 -100
- package/dist/server/patch.d.mts.map +0 -1
- package/dist/server/patch.mjs +0 -1062
- package/dist/server/patch.mjs.map +0 -1
- package/dist/shared/preview-utils.d.mts.map +0 -1
- package/dist/shared/preview-utils.mjs.map +0 -1
- package/dist/shared/types/saved-views.types.d.mts.map +0 -1
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
import { introspectBlocks } from "../../../block/introspection.mjs";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
import { executeAccessRule, fn } from "questpie";
|
|
4
|
-
|
|
5
|
-
//#region src/server/modules/admin/functions/admin-config.ts
|
|
6
|
-
/**
|
|
7
|
-
* Admin Config Functions
|
|
8
|
-
*
|
|
9
|
-
* Provides server-defined admin configuration (dashboard, sidebar,
|
|
10
|
-
* collection/global metadata) to the client via functions API.
|
|
11
|
-
*
|
|
12
|
-
* Filters results by the current user's read access.
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```ts
|
|
16
|
-
* // Client usage
|
|
17
|
-
* const config = await cms.api.functions.getAdminConfig();
|
|
18
|
-
* // { dashboard: {...}, sidebar: {...}, collections: {...}, globals: {...} }
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* Helper to get typed CMS app from handler context.
|
|
23
|
-
*/
|
|
24
|
-
function getApp(ctx) {
|
|
25
|
-
return ctx.app;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Check if the current user has read access to a collection or global.
|
|
29
|
-
* Returns true if accessible, false if denied.
|
|
30
|
-
* Fail-open: returns true on errors to avoid hiding content due to rule bugs.
|
|
31
|
-
*/
|
|
32
|
-
async function hasReadAccess(readRule, ctx) {
|
|
33
|
-
if (readRule === void 0 || readRule === true) return true;
|
|
34
|
-
if (readRule === false) return false;
|
|
35
|
-
try {
|
|
36
|
-
return await executeAccessRule(readRule, {
|
|
37
|
-
cms: ctx.app,
|
|
38
|
-
db: ctx.db,
|
|
39
|
-
session: ctx.session,
|
|
40
|
-
locale: ctx.locale
|
|
41
|
-
}) !== false;
|
|
42
|
-
} catch {
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Extract admin metadata from all registered collections.
|
|
48
|
-
*/
|
|
49
|
-
function extractCollectionsMeta(cms) {
|
|
50
|
-
const result = {};
|
|
51
|
-
const collections = cms.getCollections();
|
|
52
|
-
for (const [name, collection] of Object.entries(collections)) {
|
|
53
|
-
const admin = collection.state?.admin;
|
|
54
|
-
if (admin) result[name] = {
|
|
55
|
-
label: admin.label,
|
|
56
|
-
description: admin.description,
|
|
57
|
-
icon: admin.icon,
|
|
58
|
-
hidden: admin.hidden,
|
|
59
|
-
group: admin.group,
|
|
60
|
-
order: admin.order
|
|
61
|
-
};
|
|
62
|
-
else result[name] = {};
|
|
63
|
-
}
|
|
64
|
-
return result;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Extract admin metadata from all registered globals.
|
|
68
|
-
*/
|
|
69
|
-
function extractGlobalsMeta(cms) {
|
|
70
|
-
const result = {};
|
|
71
|
-
const globals = cms.getGlobals();
|
|
72
|
-
for (const [name, global] of Object.entries(globals)) {
|
|
73
|
-
const admin = global.state?.admin;
|
|
74
|
-
if (admin) result[name] = {
|
|
75
|
-
label: admin.label,
|
|
76
|
-
description: admin.description,
|
|
77
|
-
icon: admin.icon,
|
|
78
|
-
hidden: admin.hidden,
|
|
79
|
-
group: admin.group,
|
|
80
|
-
order: admin.order
|
|
81
|
-
};
|
|
82
|
-
else result[name] = {};
|
|
83
|
-
}
|
|
84
|
-
return result;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Auto-generate a sidebar config from pre-filtered collection and global metadata.
|
|
88
|
-
* Used when no explicit `.sidebar()` is configured.
|
|
89
|
-
*/
|
|
90
|
-
function buildAutoSidebar(collectionsMeta, globalsMeta) {
|
|
91
|
-
const ungrouped = [];
|
|
92
|
-
const grouped = {};
|
|
93
|
-
for (const [name, meta] of Object.entries(collectionsMeta)) {
|
|
94
|
-
if (meta.hidden) continue;
|
|
95
|
-
if (meta.group) {
|
|
96
|
-
if (!grouped[meta.group]) grouped[meta.group] = [];
|
|
97
|
-
grouped[meta.group].push({
|
|
98
|
-
name,
|
|
99
|
-
meta
|
|
100
|
-
});
|
|
101
|
-
} else ungrouped.push({
|
|
102
|
-
name,
|
|
103
|
-
meta
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
const sortByOrder = (a, b) => (a.meta.order ?? 0) - (b.meta.order ?? 0);
|
|
107
|
-
ungrouped.sort(sortByOrder);
|
|
108
|
-
for (const items of Object.values(grouped)) items.sort(sortByOrder);
|
|
109
|
-
const sections = [];
|
|
110
|
-
if (ungrouped.length > 0) sections.push({
|
|
111
|
-
id: "content",
|
|
112
|
-
title: { en: "Content" },
|
|
113
|
-
items: ungrouped.map(({ name, meta }) => ({
|
|
114
|
-
type: "collection",
|
|
115
|
-
collection: name,
|
|
116
|
-
label: meta.label,
|
|
117
|
-
icon: meta.icon
|
|
118
|
-
}))
|
|
119
|
-
});
|
|
120
|
-
const sortedGroupNames = Object.keys(grouped).sort();
|
|
121
|
-
for (const groupName of sortedGroupNames) {
|
|
122
|
-
const items = grouped[groupName];
|
|
123
|
-
sections.push({
|
|
124
|
-
id: `group:${groupName}`,
|
|
125
|
-
title: { en: groupName.charAt(0).toUpperCase() + groupName.slice(1) },
|
|
126
|
-
items: items.map(({ name, meta }) => ({
|
|
127
|
-
type: "collection",
|
|
128
|
-
collection: name,
|
|
129
|
-
label: meta.label,
|
|
130
|
-
icon: meta.icon
|
|
131
|
-
}))
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
const visibleGlobals = Object.entries(globalsMeta).filter(([, meta]) => !meta.hidden);
|
|
135
|
-
if (visibleGlobals.length > 0) {
|
|
136
|
-
visibleGlobals.sort(([, a], [, b]) => (a.order ?? 0) - (b.order ?? 0));
|
|
137
|
-
sections.push({
|
|
138
|
-
id: "globals",
|
|
139
|
-
title: { en: "Globals" },
|
|
140
|
-
items: visibleGlobals.map(([name, meta]) => ({
|
|
141
|
-
type: "global",
|
|
142
|
-
global: name,
|
|
143
|
-
label: meta.label,
|
|
144
|
-
icon: meta.icon
|
|
145
|
-
}))
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
return { sections };
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Filter an explicit sidebar config by accessible collections and globals.
|
|
152
|
-
* Removes items referencing inaccessible collections/globals.
|
|
153
|
-
* Removes empty sections after filtering.
|
|
154
|
-
*/
|
|
155
|
-
function filterSidebarConfig(config, accessibleCollections, accessibleGlobals) {
|
|
156
|
-
return { sections: config.sections.map((s) => ({
|
|
157
|
-
...s,
|
|
158
|
-
items: (s.items ?? []).filter((item) => {
|
|
159
|
-
if (item.type === "collection") return accessibleCollections.has(item.collection);
|
|
160
|
-
if (item.type === "global") return accessibleGlobals.has(item.global);
|
|
161
|
-
return true;
|
|
162
|
-
})
|
|
163
|
-
})).filter((s) => (s.items?.length ?? 0) > 0 || (s.sections?.length ?? 0) > 0) };
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Collect all collection and global names referenced in a sidebar config.
|
|
167
|
-
*/
|
|
168
|
-
function collectSidebarReferences(config) {
|
|
169
|
-
const collections = /* @__PURE__ */ new Set();
|
|
170
|
-
const globals = /* @__PURE__ */ new Set();
|
|
171
|
-
function collectFromSection(section) {
|
|
172
|
-
for (const item of section.items ?? []) if (item.type === "collection") collections.add(item.collection);
|
|
173
|
-
else if (item.type === "global") globals.add(item.global);
|
|
174
|
-
for (const subSection of section.sections ?? []) collectFromSection(subSection);
|
|
175
|
-
}
|
|
176
|
-
for (const section of config.sections) collectFromSection(section);
|
|
177
|
-
return {
|
|
178
|
-
collections,
|
|
179
|
-
globals
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Auto-assign IDs to widgets that don't have one.
|
|
184
|
-
* Needed for fetchWidgetData lookup by widget ID.
|
|
185
|
-
*/
|
|
186
|
-
function assignWidgetIds(items) {
|
|
187
|
-
let counter = 0;
|
|
188
|
-
function walk(items$1) {
|
|
189
|
-
for (const item of items$1) if (item.type === "section") walk(item.items || []);
|
|
190
|
-
else if (item.type === "tabs") for (const tab of item.tabs || []) walk(tab.items || []);
|
|
191
|
-
else if (!item.id) item.id = `__auto_${item.type}_${counter++}`;
|
|
192
|
-
}
|
|
193
|
-
walk(items);
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Process dashboard items: evaluate access, strip non-serializable props,
|
|
197
|
-
* mark hasFetchFn, and filter by collection access.
|
|
198
|
-
*/
|
|
199
|
-
async function processDashboardItems(items, accessibleCollections, accessCtx) {
|
|
200
|
-
const result = [];
|
|
201
|
-
for (const item of items) {
|
|
202
|
-
if (item.type === "section") {
|
|
203
|
-
const filtered = await processDashboardItems(item.items || [], accessibleCollections, accessCtx);
|
|
204
|
-
if (filtered.length > 0) result.push({
|
|
205
|
-
...item,
|
|
206
|
-
items: filtered
|
|
207
|
-
});
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
if (item.type === "tabs") {
|
|
211
|
-
const tabs = [];
|
|
212
|
-
for (const tab of item.tabs || []) {
|
|
213
|
-
const filtered = await processDashboardItems(tab.items || [], accessibleCollections, accessCtx);
|
|
214
|
-
tabs.push({
|
|
215
|
-
...tab,
|
|
216
|
-
items: filtered
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
result.push({
|
|
220
|
-
...item,
|
|
221
|
-
tabs
|
|
222
|
-
});
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
225
|
-
const widget = item;
|
|
226
|
-
if (widget.access !== void 0) {
|
|
227
|
-
if ((typeof widget.access === "function" ? await widget.access({
|
|
228
|
-
cms: accessCtx.app,
|
|
229
|
-
db: accessCtx.db,
|
|
230
|
-
session: accessCtx.session,
|
|
231
|
-
locale: accessCtx.locale
|
|
232
|
-
}) : widget.access) === false) continue;
|
|
233
|
-
}
|
|
234
|
-
if (widget.collection && !accessibleCollections.has(widget.collection)) continue;
|
|
235
|
-
if (widget.type === "quickActions") {
|
|
236
|
-
const actions = (widget.actions || []).filter((action) => {
|
|
237
|
-
if (action.action?.type === "create") return accessibleCollections.has(action.action.collection);
|
|
238
|
-
return true;
|
|
239
|
-
});
|
|
240
|
-
const { fetchFn: fetchFn$1, access: access$1, ...serializable$1 } = widget;
|
|
241
|
-
result.push({
|
|
242
|
-
...serializable$1,
|
|
243
|
-
actions
|
|
244
|
-
});
|
|
245
|
-
continue;
|
|
246
|
-
}
|
|
247
|
-
const { fetchFn, access, filterFn, ...serializable } = widget;
|
|
248
|
-
if (fetchFn) serializable.hasFetchFn = true;
|
|
249
|
-
result.push(serializable);
|
|
250
|
-
}
|
|
251
|
-
return result;
|
|
252
|
-
}
|
|
253
|
-
const getAdminConfigSchema = z.object({}).optional();
|
|
254
|
-
const getAdminConfigOutputSchema = z.object({
|
|
255
|
-
dashboard: z.unknown().optional(),
|
|
256
|
-
sidebar: z.unknown().optional(),
|
|
257
|
-
branding: z.unknown().optional(),
|
|
258
|
-
blocks: z.record(z.string(), z.unknown()).optional(),
|
|
259
|
-
collections: z.record(z.string(), z.unknown()).optional(),
|
|
260
|
-
globals: z.record(z.string(), z.unknown()).optional(),
|
|
261
|
-
uploads: z.object({
|
|
262
|
-
collections: z.array(z.string()),
|
|
263
|
-
defaultCollection: z.string().optional()
|
|
264
|
-
}).optional()
|
|
265
|
-
});
|
|
266
|
-
/**
|
|
267
|
-
* Get admin configuration including dashboard, sidebar, blocks,
|
|
268
|
-
* and collection/global metadata.
|
|
269
|
-
*
|
|
270
|
-
* Filters all results by the current user's read access rules.
|
|
271
|
-
*
|
|
272
|
-
* @example
|
|
273
|
-
* ```ts
|
|
274
|
-
* // In your CMS
|
|
275
|
-
* const cms = q({ name: "my-app" })
|
|
276
|
-
* .use(adminModule)
|
|
277
|
-
* .dashboard(({ d }) => d.dashboard({
|
|
278
|
-
* title: { en: "Dashboard" },
|
|
279
|
-
* items: [...],
|
|
280
|
-
* }))
|
|
281
|
-
* .sidebar(({ s }) => s.sidebar({
|
|
282
|
-
* sections: [...],
|
|
283
|
-
* }))
|
|
284
|
-
* .build({ ... });
|
|
285
|
-
*
|
|
286
|
-
* // Client fetches config
|
|
287
|
-
* const config = await cms.api.functions.getAdminConfig();
|
|
288
|
-
* ```
|
|
289
|
-
*/
|
|
290
|
-
const getAdminConfig = fn({
|
|
291
|
-
type: "query",
|
|
292
|
-
schema: getAdminConfigSchema,
|
|
293
|
-
outputSchema: getAdminConfigOutputSchema,
|
|
294
|
-
handler: async (ctx) => {
|
|
295
|
-
const cms = getApp(ctx);
|
|
296
|
-
const state = cms.state || {};
|
|
297
|
-
const collections = cms.getCollections();
|
|
298
|
-
const globals = cms.getGlobals();
|
|
299
|
-
const accessCtx = {
|
|
300
|
-
app: cms,
|
|
301
|
-
session: ctx.session,
|
|
302
|
-
db: ctx.db,
|
|
303
|
-
locale: ctx.locale
|
|
304
|
-
};
|
|
305
|
-
const accessibleCollections = /* @__PURE__ */ new Set();
|
|
306
|
-
for (const [name, col] of Object.entries(collections)) if (await hasReadAccess(col.state?.access?.read, accessCtx)) accessibleCollections.add(name);
|
|
307
|
-
const accessibleGlobals = /* @__PURE__ */ new Set();
|
|
308
|
-
for (const [name, g] of Object.entries(globals)) if (await hasReadAccess(g.state?.access?.read, accessCtx)) accessibleGlobals.add(name);
|
|
309
|
-
const allCollectionsMeta = extractCollectionsMeta(cms);
|
|
310
|
-
const allGlobalsMeta = extractGlobalsMeta(cms);
|
|
311
|
-
const filteredCollectionsMeta = Object.fromEntries(Object.entries(allCollectionsMeta).filter(([n]) => accessibleCollections.has(n)));
|
|
312
|
-
const filteredGlobalsMeta = Object.fromEntries(Object.entries(allGlobalsMeta).filter(([n]) => accessibleGlobals.has(n)));
|
|
313
|
-
const response = {};
|
|
314
|
-
const uploadCollections = Object.entries(collections).filter(([name, collection]) => accessibleCollections.has(name) && Boolean(collection?.state?.upload)).map(([name]) => name);
|
|
315
|
-
response.uploads = {
|
|
316
|
-
collections: uploadCollections,
|
|
317
|
-
defaultCollection: uploadCollections.length === 1 ? uploadCollections[0] : void 0
|
|
318
|
-
};
|
|
319
|
-
if (state.branding) response.branding = state.branding;
|
|
320
|
-
if (state.dashboard) {
|
|
321
|
-
const dashboard = state.dashboard;
|
|
322
|
-
if (dashboard.items) assignWidgetIds(dashboard.items);
|
|
323
|
-
response.dashboard = {
|
|
324
|
-
...dashboard,
|
|
325
|
-
items: dashboard.items ? await processDashboardItems(dashboard.items, accessibleCollections, accessCtx) : void 0
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
if (state.sidebar) {
|
|
329
|
-
const filteredSidebar = filterSidebarConfig(state.sidebar, accessibleCollections, accessibleGlobals);
|
|
330
|
-
const referenced = collectSidebarReferences(state.sidebar);
|
|
331
|
-
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)));
|
|
332
|
-
response.sidebar = { sections: [...filteredSidebar.sections, ...unlistedSidebar.sections] };
|
|
333
|
-
} else response.sidebar = buildAutoSidebar(filteredCollectionsMeta, filteredGlobalsMeta);
|
|
334
|
-
if (state.blocks && Object.keys(state.blocks).length > 0) response.blocks = introspectBlocks(state.blocks);
|
|
335
|
-
response.collections = filteredCollectionsMeta;
|
|
336
|
-
response.globals = filteredGlobalsMeta;
|
|
337
|
-
return response;
|
|
338
|
-
}
|
|
339
|
-
});
|
|
340
|
-
/**
|
|
341
|
-
* Admin config functions group.
|
|
342
|
-
* Add to your CMS via `.functions(adminConfigFunctions)`.
|
|
343
|
-
*/
|
|
344
|
-
const adminConfigFunctions = { getAdminConfig };
|
|
345
|
-
|
|
346
|
-
//#endregion
|
|
347
|
-
export { adminConfigFunctions, getAdminConfig };
|
|
348
|
-
//# sourceMappingURL=admin-config.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin-config.mjs","names":["result: Record<string, AdminConfigItemMeta>","admin: AdminCollectionConfig | undefined","admin: AdminGlobalConfig | undefined","ungrouped: Array<{ name: string; meta: AdminConfigItemMeta }>","grouped: Record<\n\t\tstring,\n\t\tArray<{ name: string; meta: AdminConfigItemMeta }>\n\t>","sections: ServerSidebarSection[]","items","result: ServerDashboardItem[]","serializable","response: {\n\t\t\tdashboard?: unknown;\n\t\t\tsidebar?: unknown;\n\t\t\tbranding?: { name?: unknown; logo?: unknown };\n\t\t\tblocks?: Record<string, unknown>;\n\t\t\tcollections?: Record<string, unknown>;\n\t\t\tglobals?: Record<string, unknown>;\n\t\t\tuploads?: { collections: string[]; defaultCollection?: string };\n\t\t}"],"sources":["../../../../../src/server/modules/admin/functions/admin-config.ts"],"sourcesContent":["/**\n * Admin Config Functions\n *\n * Provides server-defined admin configuration (dashboard, sidebar,\n * collection/global metadata) to the client via functions API.\n *\n * Filters results by the current user's read access.\n *\n * @example\n * ```ts\n * // Client usage\n * const config = await cms.api.functions.getAdminConfig();\n * // { dashboard: {...}, sidebar: {...}, collections: {...}, globals: {...} }\n * ```\n */\n\nimport { executeAccessRule, fn, type Questpie } from \"questpie\";\nimport { z } from \"zod\";\nimport type {\n\tAdminCollectionConfig,\n\tAdminGlobalConfig,\n\tComponentReference,\n\tServerDashboardConfig,\n\tServerDashboardItem,\n\tServerSidebarConfig,\n\tServerSidebarSection,\n} from \"../../../augmentation.js\";\nimport { introspectBlocks } from \"../../../block/introspection.js\";\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\ntype AdminConfigItemMeta = {\n\tlabel?: unknown;\n\tdescription?: unknown;\n\ticon?: ComponentReference;\n\thidden?: boolean;\n\tgroup?: string;\n\torder?: number;\n};\n\n/**\n * Helper to get typed CMS app from handler context.\n */\nfunction getApp(ctx: { app: unknown }): Questpie<any> {\n\treturn ctx.app as Questpie<any>;\n}\n\n// ============================================================================\n// Access Control Helpers\n// ============================================================================\n\n/**\n * Check if the current user has read access to a collection or global.\n * Returns true if accessible, false if denied.\n * Fail-open: returns true on errors to avoid hiding content due to rule bugs.\n */\nasync function hasReadAccess(\n\treadRule: unknown,\n\tctx: { app: unknown; session?: any; db: any; locale?: string },\n): Promise<boolean> {\n\tif (readRule === undefined || readRule === true) return true;\n\tif (readRule === false) return false;\n\ttry {\n\t\tconst result = await executeAccessRule(readRule as any, {\n\t\t\tcms: ctx.app as any,\n\t\t\tdb: ctx.db,\n\t\t\tsession: ctx.session,\n\t\t\tlocale: ctx.locale,\n\t\t});\n\t\treturn result !== false; // AccessWhere = still visible (row-level filter, but collection itself is accessible)\n\t} catch {\n\t\treturn true; // Fail-open: don't hide content due to access rule errors\n\t}\n}\n\n// ============================================================================\n// Metadata Extraction\n// ============================================================================\n\n/**\n * Extract admin metadata from all registered collections.\n */\nfunction extractCollectionsMeta(\n\tcms: Questpie<any>,\n): Record<string, AdminConfigItemMeta> {\n\tconst result: Record<string, AdminConfigItemMeta> = {};\n\tconst collections = cms.getCollections();\n\n\tfor (const [name, collection] of Object.entries(collections)) {\n\t\tconst admin: AdminCollectionConfig | undefined = (collection as any).state\n\t\t\t?.admin;\n\t\tif (admin) {\n\t\t\tresult[name] = {\n\t\t\t\tlabel: admin.label,\n\t\t\t\tdescription: admin.description,\n\t\t\t\ticon: admin.icon,\n\t\t\t\thidden: admin.hidden,\n\t\t\t\tgroup: admin.group,\n\t\t\t\torder: admin.order,\n\t\t\t};\n\t\t} else {\n\t\t\tresult[name] = {};\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Extract admin metadata from all registered globals.\n */\nfunction extractGlobalsMeta(\n\tcms: Questpie<any>,\n): Record<string, AdminConfigItemMeta> {\n\tconst result: Record<string, AdminConfigItemMeta> = {};\n\tconst globals = cms.getGlobals();\n\n\tfor (const [name, global] of Object.entries(globals)) {\n\t\tconst admin: AdminGlobalConfig | undefined = (global as any).state?.admin;\n\t\tif (admin) {\n\t\t\tresult[name] = {\n\t\t\t\tlabel: admin.label,\n\t\t\t\tdescription: admin.description,\n\t\t\t\ticon: admin.icon,\n\t\t\t\thidden: admin.hidden,\n\t\t\t\tgroup: admin.group,\n\t\t\t\torder: admin.order,\n\t\t\t};\n\t\t} else {\n\t\t\tresult[name] = {};\n\t\t}\n\t}\n\n\treturn result;\n}\n\n// ============================================================================\n// Auto-Sidebar Generation\n// ============================================================================\n\n/**\n * Auto-generate a sidebar config from pre-filtered collection and global metadata.\n * Used when no explicit `.sidebar()` is configured.\n */\nfunction buildAutoSidebar(\n\tcollectionsMeta: Record<string, AdminConfigItemMeta>,\n\tglobalsMeta: Record<string, AdminConfigItemMeta>,\n): ServerSidebarConfig {\n\t// Group collections by their admin.group property\n\tconst ungrouped: Array<{ name: string; meta: AdminConfigItemMeta }> = [];\n\tconst grouped: Record<\n\t\tstring,\n\t\tArray<{ name: string; meta: AdminConfigItemMeta }>\n\t> = {};\n\n\tfor (const [name, meta] of Object.entries(collectionsMeta)) {\n\t\tif (meta.hidden) continue;\n\t\tif (meta.group) {\n\t\t\tif (!grouped[meta.group]) grouped[meta.group] = [];\n\t\t\tgrouped[meta.group].push({ name, meta });\n\t\t} else {\n\t\t\tungrouped.push({ name, meta });\n\t\t}\n\t}\n\n\t// Sort by order within each group\n\tconst sortByOrder = (\n\t\ta: { meta: AdminConfigItemMeta },\n\t\tb: { meta: AdminConfigItemMeta },\n\t) => (a.meta.order ?? 0) - (b.meta.order ?? 0);\n\n\tungrouped.sort(sortByOrder);\n\tfor (const items of Object.values(grouped)) {\n\t\titems.sort(sortByOrder);\n\t}\n\n\tconst sections: ServerSidebarSection[] = [];\n\n\t// Content section: ungrouped collections\n\tif (ungrouped.length > 0) {\n\t\tsections.push({\n\t\t\tid: \"content\",\n\t\t\ttitle: { en: \"Content\" },\n\t\t\titems: ungrouped.map(({ name, meta }) => ({\n\t\t\t\ttype: \"collection\" as const,\n\t\t\t\tcollection: name,\n\t\t\t\tlabel: meta.label as any,\n\t\t\t\ticon: meta.icon,\n\t\t\t})),\n\t\t});\n\t}\n\n\t// Named sections for grouped collections\n\tconst sortedGroupNames = Object.keys(grouped).sort();\n\tfor (const groupName of sortedGroupNames) {\n\t\tconst items = grouped[groupName];\n\t\tsections.push({\n\t\t\tid: `group:${groupName}`,\n\t\t\ttitle: { en: groupName.charAt(0).toUpperCase() + groupName.slice(1) },\n\t\t\titems: items.map(({ name, meta }) => ({\n\t\t\t\ttype: \"collection\" as const,\n\t\t\t\tcollection: name,\n\t\t\t\tlabel: meta.label as any,\n\t\t\t\ticon: meta.icon,\n\t\t\t})),\n\t\t});\n\t}\n\n\t// Globals section\n\tconst visibleGlobals = Object.entries(globalsMeta).filter(\n\t\t([, meta]) => !meta.hidden,\n\t);\n\tif (visibleGlobals.length > 0) {\n\t\tvisibleGlobals.sort(([, a], [, b]) => (a.order ?? 0) - (b.order ?? 0));\n\t\tsections.push({\n\t\t\tid: \"globals\",\n\t\t\ttitle: { en: \"Globals\" },\n\t\t\titems: visibleGlobals.map(([name, meta]) => ({\n\t\t\t\ttype: \"global\" as const,\n\t\t\t\tglobal: name,\n\t\t\t\tlabel: meta.label as any,\n\t\t\t\ticon: meta.icon,\n\t\t\t})),\n\t\t});\n\t}\n\n\treturn { sections };\n}\n\n// ============================================================================\n// Sidebar Filtering (explicit sidebar config)\n// ============================================================================\n\n/**\n * Filter an explicit sidebar config by accessible collections and globals.\n * Removes items referencing inaccessible collections/globals.\n * Removes empty sections after filtering.\n */\nfunction filterSidebarConfig(\n\tconfig: ServerSidebarConfig,\n\taccessibleCollections: Set<string>,\n\taccessibleGlobals: Set<string>,\n): ServerSidebarConfig {\n\treturn {\n\t\tsections: config.sections\n\t\t\t.map((s) => ({\n\t\t\t\t...s,\n\t\t\t\titems: (s.items ?? []).filter((item) => {\n\t\t\t\t\tif (item.type === \"collection\")\n\t\t\t\t\t\treturn accessibleCollections.has((item as any).collection);\n\t\t\t\t\tif (item.type === \"global\")\n\t\t\t\t\t\treturn accessibleGlobals.has((item as any).global);\n\t\t\t\t\treturn true; // pages, links, dividers always pass\n\t\t\t\t}),\n\t\t\t}))\n\t\t\t.filter(\n\t\t\t\t(s) => (s.items?.length ?? 0) > 0 || (s.sections?.length ?? 0) > 0,\n\t\t\t),\n\t};\n}\n\n/**\n * Collect all collection and global names referenced in a sidebar config.\n */\nfunction collectSidebarReferences(config: ServerSidebarConfig): {\n\tcollections: Set<string>;\n\tglobals: Set<string>;\n} {\n\tconst collections = new Set<string>();\n\tconst globals = new Set<string>();\n\n\tfunction collectFromSection(section: ServerSidebarSection): void {\n\t\tfor (const item of section.items ?? []) {\n\t\t\tif (item.type === \"collection\") collections.add((item as any).collection);\n\t\t\telse if (item.type === \"global\") globals.add((item as any).global);\n\t\t}\n\t\tfor (const subSection of section.sections ?? []) {\n\t\t\tcollectFromSection(subSection);\n\t\t}\n\t}\n\n\tfor (const section of config.sections) {\n\t\tcollectFromSection(section);\n\t}\n\treturn { collections, globals };\n}\n\n// ============================================================================\n// Dashboard Processing (access + serialization + ID assignment)\n// ============================================================================\n\n/**\n * Auto-assign IDs to widgets that don't have one.\n * Needed for fetchWidgetData lookup by widget ID.\n */\nfunction assignWidgetIds(items: ServerDashboardItem[]): void {\n\tlet counter = 0;\n\tfunction walk(items: ServerDashboardItem[]) {\n\t\tfor (const item of items) {\n\t\t\tif (item.type === \"section\") {\n\t\t\t\twalk((item as any).items || []);\n\t\t\t} else if (item.type === \"tabs\") {\n\t\t\t\tfor (const tab of (item as any).tabs || []) {\n\t\t\t\t\twalk(tab.items || []);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Widget — assign ID if missing\n\t\t\t\tif (!(item as any).id) {\n\t\t\t\t\t(item as any).id = `__auto_${item.type}_${counter++}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\twalk(items);\n}\n\n/**\n * Process dashboard items: evaluate access, strip non-serializable props,\n * mark hasFetchFn, and filter by collection access.\n */\nasync function processDashboardItems(\n\titems: ServerDashboardItem[],\n\taccessibleCollections: Set<string>,\n\taccessCtx: { app: unknown; session?: any; db: any; locale?: string },\n): Promise<ServerDashboardItem[]> {\n\tconst result: ServerDashboardItem[] = [];\n\n\tfor (const item of items) {\n\t\t// Recurse into sections\n\t\tif (item.type === \"section\") {\n\t\t\tconst filtered = await processDashboardItems(\n\t\t\t\t(item as any).items || [],\n\t\t\t\taccessibleCollections,\n\t\t\t\taccessCtx,\n\t\t\t);\n\t\t\tif (filtered.length > 0) {\n\t\t\t\tresult.push({ ...item, items: filtered } as any);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Recurse into tabs\n\t\tif (item.type === \"tabs\") {\n\t\t\tconst tabs = [];\n\t\t\tfor (const tab of (item as any).tabs || []) {\n\t\t\t\tconst filtered = await processDashboardItems(\n\t\t\t\t\ttab.items || [],\n\t\t\t\t\taccessibleCollections,\n\t\t\t\t\taccessCtx,\n\t\t\t\t);\n\t\t\t\ttabs.push({ ...tab, items: filtered });\n\t\t\t}\n\t\t\tresult.push({ ...item, tabs } as any);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Widget processing\n\t\tconst widget = item as any;\n\n\t\t// 1. Check per-widget access\n\t\tif (widget.access !== undefined) {\n\t\t\tconst widgetAccessResult =\n\t\t\t\ttypeof widget.access === \"function\"\n\t\t\t\t\t? await widget.access({\n\t\t\t\t\t\t\tcms: accessCtx.app,\n\t\t\t\t\t\t\tdb: accessCtx.db,\n\t\t\t\t\t\t\tsession: accessCtx.session,\n\t\t\t\t\t\t\tlocale: accessCtx.locale,\n\t\t\t\t\t\t})\n\t\t\t\t\t: widget.access;\n\t\t\tif (widgetAccessResult === false) continue;\n\t\t}\n\n\t\t// 2. Check collection access for collection-bound widgets\n\t\tif (widget.collection && !accessibleCollections.has(widget.collection)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// 3. Filter quickActions' individual actions by collection access\n\t\tif (widget.type === \"quickActions\") {\n\t\t\tconst actions = (widget.actions || []).filter((action: any) => {\n\t\t\t\tif (action.action?.type === \"create\") {\n\t\t\t\t\treturn accessibleCollections.has(action.action.collection);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t\tconst { fetchFn, access, ...serializable } = widget;\n\t\t\tresult.push({ ...serializable, actions } as any);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// 4. Strip non-serializable props, mark hasFetchFn\n\t\tconst { fetchFn, access, filterFn, ...serializable } = widget;\n\t\tif (fetchFn) {\n\t\t\tserializable.hasFetchFn = true;\n\t\t}\n\t\tresult.push(serializable);\n\t}\n\n\treturn result;\n}\n\n// ============================================================================\n// Schema Definitions\n// ============================================================================\n\nconst getAdminConfigSchema = z.object({}).optional();\n\n// Output schema is flexible since dashboard/sidebar configs are complex\nconst getAdminConfigOutputSchema = z.object({\n\tdashboard: z.unknown().optional(),\n\tsidebar: z.unknown().optional(),\n\tbranding: z.unknown().optional(),\n\tblocks: z.record(z.string(), z.unknown()).optional(),\n\tcollections: z.record(z.string(), z.unknown()).optional(),\n\tglobals: z.record(z.string(), z.unknown()).optional(),\n\tuploads: z\n\t\t.object({\n\t\t\tcollections: z.array(z.string()),\n\t\t\tdefaultCollection: z.string().optional(),\n\t\t})\n\t\t.optional(),\n});\n\n// ============================================================================\n// Functions\n// ============================================================================\n\n/**\n * Get admin configuration including dashboard, sidebar, blocks,\n * and collection/global metadata.\n *\n * Filters all results by the current user's read access rules.\n *\n * @example\n * ```ts\n * // In your CMS\n * const cms = q({ name: \"my-app\" })\n * .use(adminModule)\n * .dashboard(({ d }) => d.dashboard({\n * title: { en: \"Dashboard\" },\n * items: [...],\n * }))\n * .sidebar(({ s }) => s.sidebar({\n * sections: [...],\n * }))\n * .build({ ... });\n *\n * // Client fetches config\n * const config = await cms.api.functions.getAdminConfig();\n * ```\n */\nexport const getAdminConfig = fn({\n\ttype: \"query\",\n\tschema: getAdminConfigSchema,\n\toutputSchema: getAdminConfigOutputSchema,\n\thandler: async (ctx) => {\n\t\tconst cms = getApp(ctx);\n\t\tconst state = (cms as any).state || {};\n\n\t\t// 1. Compute accessible collections and globals\n\t\tconst collections = cms.getCollections();\n\t\tconst globals = cms.getGlobals();\n\t\tconst accessCtx = {\n\t\t\tapp: cms,\n\t\t\tsession: (ctx as any).session,\n\t\t\tdb: (ctx as any).db,\n\t\t\tlocale: (ctx as any).locale,\n\t\t};\n\n\t\tconst accessibleCollections = new Set<string>();\n\t\tfor (const [name, col] of Object.entries(collections)) {\n\t\t\tif (await hasReadAccess((col as any).state?.access?.read, accessCtx)) {\n\t\t\t\taccessibleCollections.add(name);\n\t\t\t}\n\t\t}\n\n\t\tconst accessibleGlobals = new Set<string>();\n\t\tfor (const [name, g] of Object.entries(globals)) {\n\t\t\tif (await hasReadAccess((g as any).state?.access?.read, accessCtx)) {\n\t\t\t\taccessibleGlobals.add(name);\n\t\t\t}\n\t\t}\n\n\t\t// 2. Extract and filter metadata\n\t\tconst allCollectionsMeta = extractCollectionsMeta(cms);\n\t\tconst allGlobalsMeta = extractGlobalsMeta(cms);\n\n\t\tconst filteredCollectionsMeta = Object.fromEntries(\n\t\t\tObject.entries(allCollectionsMeta).filter(([n]) =>\n\t\t\t\taccessibleCollections.has(n),\n\t\t\t),\n\t\t);\n\t\tconst filteredGlobalsMeta = Object.fromEntries(\n\t\t\tObject.entries(allGlobalsMeta).filter(([n]) => accessibleGlobals.has(n)),\n\t\t);\n\n\t\tconst response: {\n\t\t\tdashboard?: unknown;\n\t\t\tsidebar?: unknown;\n\t\t\tbranding?: { name?: unknown; logo?: unknown };\n\t\t\tblocks?: Record<string, unknown>;\n\t\t\tcollections?: Record<string, unknown>;\n\t\t\tglobals?: Record<string, unknown>;\n\t\t\tuploads?: { collections: string[]; defaultCollection?: string };\n\t\t} = {};\n\n\t\tconst uploadCollections = Object.entries(collections)\n\t\t\t.filter(\n\t\t\t\t([name, collection]) =>\n\t\t\t\t\taccessibleCollections.has(name) &&\n\t\t\t\t\tBoolean((collection as any)?.state?.upload),\n\t\t\t)\n\t\t\t.map(([name]) => name);\n\n\t\tresponse.uploads = {\n\t\t\tcollections: uploadCollections,\n\t\t\tdefaultCollection:\n\t\t\t\tuploadCollections.length === 1 ? uploadCollections[0] : undefined,\n\t\t};\n\n\t\t// Branding config\n\t\tif (state.branding) {\n\t\t\tresponse.branding = state.branding;\n\t\t}\n\n\t\t// 3. Dashboard: assign IDs, process access, strip non-serializable\n\t\tif (state.dashboard) {\n\t\t\tconst dashboard = state.dashboard as ServerDashboardConfig;\n\t\t\tif (dashboard.items) {\n\t\t\t\tassignWidgetIds(dashboard.items);\n\t\t\t}\n\t\t\tresponse.dashboard = {\n\t\t\t\t...dashboard,\n\t\t\t\titems: dashboard.items\n\t\t\t\t\t? await processDashboardItems(\n\t\t\t\t\t\t\tdashboard.items,\n\t\t\t\t\t\t\taccessibleCollections,\n\t\t\t\t\t\t\taccessCtx,\n\t\t\t\t\t\t)\n\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t}\n\n\t\t// 4. Sidebar: explicit → filter + auto-append unlisted; auto → build from filtered meta\n\t\tif (state.sidebar) {\n\t\t\tconst filteredSidebar = filterSidebarConfig(\n\t\t\t\tstate.sidebar,\n\t\t\t\taccessibleCollections,\n\t\t\t\taccessibleGlobals,\n\t\t\t);\n\n\t\t\t// Find collections/globals the user explicitly listed\n\t\t\tconst referenced = collectSidebarReferences(state.sidebar);\n\n\t\t\t// Find non-hidden accessible items NOT referenced in the explicit sidebar\n\t\t\tconst unlistedCollectionsMeta = Object.fromEntries(\n\t\t\t\tObject.entries(filteredCollectionsMeta).filter(\n\t\t\t\t\t([name, meta]) => !referenced.collections.has(name) && !meta.hidden,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst unlistedGlobalsMeta = Object.fromEntries(\n\t\t\t\tObject.entries(filteredGlobalsMeta).filter(\n\t\t\t\t\t([name, meta]) => !referenced.globals.has(name) && !meta.hidden,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\t// Auto-generate sections for unlisted items, append after explicit sections\n\t\t\tconst unlistedSidebar = buildAutoSidebar(\n\t\t\t\tunlistedCollectionsMeta,\n\t\t\t\tunlistedGlobalsMeta,\n\t\t\t);\n\n\t\t\tresponse.sidebar = {\n\t\t\t\tsections: [...filteredSidebar.sections, ...unlistedSidebar.sections],\n\t\t\t};\n\t\t} else {\n\t\t\tresponse.sidebar = buildAutoSidebar(\n\t\t\t\tfilteredCollectionsMeta,\n\t\t\t\tfilteredGlobalsMeta,\n\t\t\t);\n\t\t}\n\n\t\t// 5. Blocks: unchanged (not access-controlled)\n\t\tif (state.blocks && Object.keys(state.blocks).length > 0) {\n\t\t\tresponse.blocks = introspectBlocks(state.blocks);\n\t\t}\n\n\t\t// 6. Return filtered metadata\n\t\tresponse.collections = filteredCollectionsMeta;\n\t\tresponse.globals = filteredGlobalsMeta;\n\n\t\treturn response;\n\t},\n});\n\n// ============================================================================\n// Export Bundle\n// ============================================================================\n\n/**\n * Admin config functions group.\n * Add to your CMS via `.functions(adminConfigFunctions)`.\n */\nexport const adminConfigFunctions = {\n\tgetAdminConfig,\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA6CA,SAAS,OAAO,KAAsC;AACrD,QAAO,IAAI;;;;;;;AAYZ,eAAe,cACd,UACA,KACmB;AACnB,KAAI,aAAa,UAAa,aAAa,KAAM,QAAO;AACxD,KAAI,aAAa,MAAO,QAAO;AAC/B,KAAI;AAOH,SANe,MAAM,kBAAkB,UAAiB;GACvD,KAAK,IAAI;GACT,IAAI,IAAI;GACR,SAAS,IAAI;GACb,QAAQ,IAAI;GACZ,CAAC,KACgB;SACX;AACP,SAAO;;;;;;AAWT,SAAS,uBACR,KACsC;CACtC,MAAMA,SAA8C,EAAE;CACtD,MAAM,cAAc,IAAI,gBAAgB;AAExC,MAAK,MAAM,CAAC,MAAM,eAAe,OAAO,QAAQ,YAAY,EAAE;EAC7D,MAAMC,QAA4C,WAAmB,OAClE;AACH,MAAI,MACH,QAAO,QAAQ;GACd,OAAO,MAAM;GACb,aAAa,MAAM;GACnB,MAAM,MAAM;GACZ,QAAQ,MAAM;GACd,OAAO,MAAM;GACb,OAAO,MAAM;GACb;MAED,QAAO,QAAQ,EAAE;;AAInB,QAAO;;;;;AAMR,SAAS,mBACR,KACsC;CACtC,MAAMD,SAA8C,EAAE;CACtD,MAAM,UAAU,IAAI,YAAY;AAEhC,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,QAAQ,EAAE;EACrD,MAAME,QAAwC,OAAe,OAAO;AACpE,MAAI,MACH,QAAO,QAAQ;GACd,OAAO,MAAM;GACb,aAAa,MAAM;GACnB,MAAM,MAAM;GACZ,QAAQ,MAAM;GACd,OAAO,MAAM;GACb,OAAO,MAAM;GACb;MAED,QAAO,QAAQ,EAAE;;AAInB,QAAO;;;;;;AAWR,SAAS,iBACR,iBACA,aACsB;CAEtB,MAAMC,YAAgE,EAAE;CACxE,MAAMC,UAGF,EAAE;AAEN,MAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,gBAAgB,EAAE;AAC3D,MAAI,KAAK,OAAQ;AACjB,MAAI,KAAK,OAAO;AACf,OAAI,CAAC,QAAQ,KAAK,OAAQ,SAAQ,KAAK,SAAS,EAAE;AAClD,WAAQ,KAAK,OAAO,KAAK;IAAE;IAAM;IAAM,CAAC;QAExC,WAAU,KAAK;GAAE;GAAM;GAAM,CAAC;;CAKhC,MAAM,eACL,GACA,OACK,EAAE,KAAK,SAAS,MAAM,EAAE,KAAK,SAAS;AAE5C,WAAU,KAAK,YAAY;AAC3B,MAAK,MAAM,SAAS,OAAO,OAAO,QAAQ,CACzC,OAAM,KAAK,YAAY;CAGxB,MAAMC,WAAmC,EAAE;AAG3C,KAAI,UAAU,SAAS,EACtB,UAAS,KAAK;EACb,IAAI;EACJ,OAAO,EAAE,IAAI,WAAW;EACxB,OAAO,UAAU,KAAK,EAAE,MAAM,YAAY;GACzC,MAAM;GACN,YAAY;GACZ,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,EAAE;EACH,CAAC;CAIH,MAAM,mBAAmB,OAAO,KAAK,QAAQ,CAAC,MAAM;AACpD,MAAK,MAAM,aAAa,kBAAkB;EACzC,MAAM,QAAQ,QAAQ;AACtB,WAAS,KAAK;GACb,IAAI,SAAS;GACb,OAAO,EAAE,IAAI,UAAU,OAAO,EAAE,CAAC,aAAa,GAAG,UAAU,MAAM,EAAE,EAAE;GACrE,OAAO,MAAM,KAAK,EAAE,MAAM,YAAY;IACrC,MAAM;IACN,YAAY;IACZ,OAAO,KAAK;IACZ,MAAM,KAAK;IACX,EAAE;GACH,CAAC;;CAIH,MAAM,iBAAiB,OAAO,QAAQ,YAAY,CAAC,QACjD,GAAG,UAAU,CAAC,KAAK,OACpB;AACD,KAAI,eAAe,SAAS,GAAG;AAC9B,iBAAe,MAAM,GAAG,IAAI,GAAG,QAAQ,EAAE,SAAS,MAAM,EAAE,SAAS,GAAG;AACtE,WAAS,KAAK;GACb,IAAI;GACJ,OAAO,EAAE,IAAI,WAAW;GACxB,OAAO,eAAe,KAAK,CAAC,MAAM,WAAW;IAC5C,MAAM;IACN,QAAQ;IACR,OAAO,KAAK;IACZ,MAAM,KAAK;IACX,EAAE;GACH,CAAC;;AAGH,QAAO,EAAE,UAAU;;;;;;;AAYpB,SAAS,oBACR,QACA,uBACA,mBACsB;AACtB,QAAO,EACN,UAAU,OAAO,SACf,KAAK,OAAO;EACZ,GAAG;EACH,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,SAAS;AACvC,OAAI,KAAK,SAAS,aACjB,QAAO,sBAAsB,IAAK,KAAa,WAAW;AAC3D,OAAI,KAAK,SAAS,SACjB,QAAO,kBAAkB,IAAK,KAAa,OAAO;AACnD,UAAO;IACN;EACF,EAAE,CACF,QACC,OAAO,EAAE,OAAO,UAAU,KAAK,MAAM,EAAE,UAAU,UAAU,KAAK,EACjE,EACF;;;;;AAMF,SAAS,yBAAyB,QAGhC;CACD,MAAM,8BAAc,IAAI,KAAa;CACrC,MAAM,0BAAU,IAAI,KAAa;CAEjC,SAAS,mBAAmB,SAAqC;AAChE,OAAK,MAAM,QAAQ,QAAQ,SAAS,EAAE,CACrC,KAAI,KAAK,SAAS,aAAc,aAAY,IAAK,KAAa,WAAW;WAChE,KAAK,SAAS,SAAU,SAAQ,IAAK,KAAa,OAAO;AAEnE,OAAK,MAAM,cAAc,QAAQ,YAAY,EAAE,CAC9C,oBAAmB,WAAW;;AAIhC,MAAK,MAAM,WAAW,OAAO,SAC5B,oBAAmB,QAAQ;AAE5B,QAAO;EAAE;EAAa;EAAS;;;;;;AAWhC,SAAS,gBAAgB,OAAoC;CAC5D,IAAI,UAAU;CACd,SAAS,KAAK,SAA8B;AAC3C,OAAK,MAAM,QAAQC,QAClB,KAAI,KAAK,SAAS,UACjB,MAAM,KAAa,SAAS,EAAE,CAAC;WACrB,KAAK,SAAS,OACxB,MAAK,MAAM,OAAQ,KAAa,QAAQ,EAAE,CACzC,MAAK,IAAI,SAAS,EAAE,CAAC;WAIlB,CAAE,KAAa,GAClB,CAAC,KAAa,KAAK,UAAU,KAAK,KAAK,GAAG;;AAK9C,MAAK,MAAM;;;;;;AAOZ,eAAe,sBACd,OACA,uBACA,WACiC;CACjC,MAAMC,SAAgC,EAAE;AAExC,MAAK,MAAM,QAAQ,OAAO;AAEzB,MAAI,KAAK,SAAS,WAAW;GAC5B,MAAM,WAAW,MAAM,sBACrB,KAAa,SAAS,EAAE,EACzB,uBACA,UACA;AACD,OAAI,SAAS,SAAS,EACrB,QAAO,KAAK;IAAE,GAAG;IAAM,OAAO;IAAU,CAAQ;AAEjD;;AAID,MAAI,KAAK,SAAS,QAAQ;GACzB,MAAM,OAAO,EAAE;AACf,QAAK,MAAM,OAAQ,KAAa,QAAQ,EAAE,EAAE;IAC3C,MAAM,WAAW,MAAM,sBACtB,IAAI,SAAS,EAAE,EACf,uBACA,UACA;AACD,SAAK,KAAK;KAAE,GAAG;KAAK,OAAO;KAAU,CAAC;;AAEvC,UAAO,KAAK;IAAE,GAAG;IAAM;IAAM,CAAQ;AACrC;;EAID,MAAM,SAAS;AAGf,MAAI,OAAO,WAAW,QAUrB;QARC,OAAO,OAAO,WAAW,aACtB,MAAM,OAAO,OAAO;IACpB,KAAK,UAAU;IACf,IAAI,UAAU;IACd,SAAS,UAAU;IACnB,QAAQ,UAAU;IAClB,CAAC,GACD,OAAO,YACgB,MAAO;;AAInC,MAAI,OAAO,cAAc,CAAC,sBAAsB,IAAI,OAAO,WAAW,CACrE;AAID,MAAI,OAAO,SAAS,gBAAgB;GACnC,MAAM,WAAW,OAAO,WAAW,EAAE,EAAE,QAAQ,WAAgB;AAC9D,QAAI,OAAO,QAAQ,SAAS,SAC3B,QAAO,sBAAsB,IAAI,OAAO,OAAO,WAAW;AAE3D,WAAO;KACN;GACF,MAAM,EAAE,oBAAS,kBAAQ,GAAGC,mBAAiB;AAC7C,UAAO,KAAK;IAAE,GAAGA;IAAc;IAAS,CAAQ;AAChD;;EAID,MAAM,EAAE,SAAS,QAAQ,UAAU,GAAG,iBAAiB;AACvD,MAAI,QACH,cAAa,aAAa;AAE3B,SAAO,KAAK,aAAa;;AAG1B,QAAO;;AAOR,MAAM,uBAAuB,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU;AAGpD,MAAM,6BAA6B,EAAE,OAAO;CAC3C,WAAW,EAAE,SAAS,CAAC,UAAU;CACjC,SAAS,EAAE,SAAS,CAAC,UAAU;CAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;CAChC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,UAAU;CACpD,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,UAAU;CACzD,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,UAAU;CACrD,SAAS,EACP,OAAO;EACP,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC;EAChC,mBAAmB,EAAE,QAAQ,CAAC,UAAU;EACxC,CAAC,CACD,UAAU;CACZ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AA8BF,MAAa,iBAAiB,GAAG;CAChC,MAAM;CACN,QAAQ;CACR,cAAc;CACd,SAAS,OAAO,QAAQ;EACvB,MAAM,MAAM,OAAO,IAAI;EACvB,MAAM,QAAS,IAAY,SAAS,EAAE;EAGtC,MAAM,cAAc,IAAI,gBAAgB;EACxC,MAAM,UAAU,IAAI,YAAY;EAChC,MAAM,YAAY;GACjB,KAAK;GACL,SAAU,IAAY;GACtB,IAAK,IAAY;GACjB,QAAS,IAAY;GACrB;EAED,MAAM,wCAAwB,IAAI,KAAa;AAC/C,OAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,YAAY,CACpD,KAAI,MAAM,cAAe,IAAY,OAAO,QAAQ,MAAM,UAAU,CACnE,uBAAsB,IAAI,KAAK;EAIjC,MAAM,oCAAoB,IAAI,KAAa;AAC3C,OAAK,MAAM,CAAC,MAAM,MAAM,OAAO,QAAQ,QAAQ,CAC9C,KAAI,MAAM,cAAe,EAAU,OAAO,QAAQ,MAAM,UAAU,CACjE,mBAAkB,IAAI,KAAK;EAK7B,MAAM,qBAAqB,uBAAuB,IAAI;EACtD,MAAM,iBAAiB,mBAAmB,IAAI;EAE9C,MAAM,0BAA0B,OAAO,YACtC,OAAO,QAAQ,mBAAmB,CAAC,QAAQ,CAAC,OAC3C,sBAAsB,IAAI,EAAE,CAC5B,CACD;EACD,MAAM,sBAAsB,OAAO,YAClC,OAAO,QAAQ,eAAe,CAAC,QAAQ,CAAC,OAAO,kBAAkB,IAAI,EAAE,CAAC,CACxE;EAED,MAAMC,WAQF,EAAE;EAEN,MAAM,oBAAoB,OAAO,QAAQ,YAAY,CACnD,QACC,CAAC,MAAM,gBACP,sBAAsB,IAAI,KAAK,IAC/B,QAAS,YAAoB,OAAO,OAAO,CAC5C,CACA,KAAK,CAAC,UAAU,KAAK;AAEvB,WAAS,UAAU;GAClB,aAAa;GACb,mBACC,kBAAkB,WAAW,IAAI,kBAAkB,KAAK;GACzD;AAGD,MAAI,MAAM,SACT,UAAS,WAAW,MAAM;AAI3B,MAAI,MAAM,WAAW;GACpB,MAAM,YAAY,MAAM;AACxB,OAAI,UAAU,MACb,iBAAgB,UAAU,MAAM;AAEjC,YAAS,YAAY;IACpB,GAAG;IACH,OAAO,UAAU,QACd,MAAM,sBACN,UAAU,OACV,uBACA,UACA,GACA;IACH;;AAIF,MAAI,MAAM,SAAS;GAClB,MAAM,kBAAkB,oBACvB,MAAM,SACN,uBACA,kBACA;GAGD,MAAM,aAAa,yBAAyB,MAAM,QAAQ;GAe1D,MAAM,kBAAkB,iBAZQ,OAAO,YACtC,OAAO,QAAQ,wBAAwB,CAAC,QACtC,CAAC,MAAM,UAAU,CAAC,WAAW,YAAY,IAAI,KAAK,IAAI,CAAC,KAAK,OAC7D,CACD,EAC2B,OAAO,YAClC,OAAO,QAAQ,oBAAoB,CAAC,QAClC,CAAC,MAAM,UAAU,CAAC,WAAW,QAAQ,IAAI,KAAK,IAAI,CAAC,KAAK,OACzD,CACD,CAMA;AAED,YAAS,UAAU,EAClB,UAAU,CAAC,GAAG,gBAAgB,UAAU,GAAG,gBAAgB,SAAS,EACpE;QAED,UAAS,UAAU,iBAClB,yBACA,oBACA;AAIF,MAAI,MAAM,UAAU,OAAO,KAAK,MAAM,OAAO,CAAC,SAAS,EACtD,UAAS,SAAS,iBAAiB,MAAM,OAAO;AAIjD,WAAS,cAAc;AACvB,WAAS,UAAU;AAEnB,SAAO;;CAER,CAAC;;;;;AAUF,MAAa,uBAAuB,EACnC,gBACA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute-action.d.mts","names":[],"sources":["../../../../../src/server/modules/admin/functions/execute-action.ts"],"sourcesContent":[],"mappings":";;;;;;KA6BK,GAAA,GAAM,QAoFD,CAAA,GAAA,CAAA;AAmWV;AAeA;AAcA;UA/ciB,oBAAA;;;;;;;;;;SAUR;;;;;;;UAQQ,qBAAA;;WAEN;;;;;;;iBAQK,gBAAA,MACT;;UAIG,MAAM,KAAK;;;;;;iBA0CC,aAAA,MACf,cACI,0CAER,QAAQ;;;;;;;;;;;;;;cAmWE,iBASX,aAAA,CAT0B;;;;;SAS1B;;;;;;;;;;;cAMW,oBAQX,aAAA,CAR6B;;;;;;;;;;cAclB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute-action.mjs","names":["actionsConfig: ServerActionsConfig | undefined","context: ServerActionContext","field"],"sources":["../../../../../src/server/modules/admin/functions/execute-action.ts"],"sourcesContent":["/**\n * Action Execution Functions\n *\n * Server-side functions for executing collection actions.\n * Actions can be built-in (create, delete, etc.) or custom with forms.\n *\n * @example\n * ```ts\n * // Execute a custom action\n * const result = await executeAction(app, {\n * collection: \"posts\",\n * actionId: \"publish\",\n * itemId: \"123\",\n * data: {},\n * });\n * ```\n */\n\nimport { fn, type Questpie } from \"questpie\";\nimport { z } from \"zod\";\nimport type {\n ServerActionContext,\n ServerActionDefinition,\n ServerActionFormField,\n ServerActionResult,\n ServerActionsConfig,\n} from \"../../../augmentation.js\";\n\n// Type alias for the CMS app\ntype App = Questpie<any>;\n\n/**\n * Request to execute an action\n */\nexport interface ExecuteActionRequest {\n /** Collection slug */\n collection: string;\n /** Action ID (builtin: \"create\", \"delete\", etc. or custom id) */\n actionId: string;\n /** Single item ID (for single-item actions) */\n itemId?: string;\n /** Multiple item IDs (for bulk actions) */\n itemIds?: string[];\n /** Form data (for actions with forms) */\n data?: Record<string, unknown>;\n /** Current locale */\n locale?: string;\n}\n\n/**\n * Response from action execution\n */\nexport interface ExecuteActionResponse {\n success: boolean;\n result?: ServerActionResult;\n error?: string;\n}\n\n/**\n * Get action configuration for introspection.\n * Returns action definitions without handlers (for client-side rendering).\n */\nexport function getActionsConfig(\n app: App,\n collectionSlug: string,\n): {\n builtin: string[];\n custom: Array<Omit<ServerActionDefinition, \"handler\">>;\n} | null {\n const state = (app as any).state as any;\n const collection = state.collections?.[collectionSlug];\n\n if (!collection) {\n return null;\n }\n\n const collectionState = collection.state || collection;\n const actionsConfig: ServerActionsConfig | undefined =\n collectionState.adminActions;\n\n if (!actionsConfig) {\n // Return default built-in actions if no config\n return {\n builtin: [\"create\", \"save\", \"delete\", \"deleteMany\"],\n custom: [],\n };\n }\n\n // Strip handlers from custom actions for client\n const customWithoutHandlers = (actionsConfig.custom || []).map((action) => {\n const { handler, ...rest } = action;\n return rest;\n });\n\n return {\n builtin: actionsConfig.builtin || [\n \"create\",\n \"save\",\n \"delete\",\n \"deleteMany\",\n ],\n custom: customWithoutHandlers,\n };\n}\n\n/**\n * Execute a collection action.\n * Handles both built-in actions and custom actions.\n */\nexport async function executeAction(\n app: App,\n request: ExecuteActionRequest,\n session?: unknown,\n): Promise<ExecuteActionResponse> {\n const {\n collection: collectionSlug,\n actionId,\n itemId,\n itemIds,\n data,\n locale,\n } = request;\n\n const state = (app as any).state as any;\n const collection = state.collections?.[collectionSlug];\n\n if (!collection) {\n return {\n success: false,\n error: `Collection \"${collectionSlug}\" not found`,\n };\n }\n\n const collectionState = collection.state || collection;\n const actionsConfig: ServerActionsConfig | undefined =\n collectionState.adminActions;\n\n // Handle built-in actions\n const builtinActions = actionsConfig?.builtin || [\n \"create\",\n \"save\",\n \"delete\",\n \"deleteMany\",\n \"duplicate\",\n ];\n\n if (builtinActions.includes(actionId as any)) {\n return executeBuiltinAction(app, {\n collectionSlug,\n actionId,\n itemId,\n itemIds,\n data,\n locale,\n session,\n });\n }\n\n // Find custom action\n const customAction = actionsConfig?.custom?.find((a) => a.id === actionId);\n\n if (!customAction) {\n return {\n success: false,\n error: `Action \"${actionId}\" not found on collection \"${collectionSlug}\"`,\n };\n }\n\n // Validate form data if action has a form\n if (customAction.form) {\n const validationError = validateActionFormData(\n customAction.form.fields,\n data || {},\n );\n if (validationError) {\n return {\n success: false,\n result: {\n type: \"error\",\n toast: { message: validationError },\n },\n };\n }\n }\n\n // Execute custom action handler\n try {\n const context: ServerActionContext = {\n data: data || {},\n itemId,\n itemIds,\n app,\n db: (app as any).db,\n session,\n locale,\n };\n\n const result = await customAction.handler(context);\n\n return {\n success: result.type === \"success\" || result.type === \"redirect\",\n result,\n };\n } catch (error) {\n console.error(`Action \"${actionId}\" failed:`, error);\n return {\n success: false,\n result: {\n type: \"error\",\n toast: {\n message:\n error instanceof Error ? error.message : \"Action execution failed\",\n },\n },\n };\n }\n}\n\n/**\n * Execute a built-in action.\n */\nasync function executeBuiltinAction(\n app: App,\n params: {\n collectionSlug: string;\n actionId: string;\n itemId?: string;\n itemIds?: string[];\n data?: Record<string, unknown>;\n locale?: string;\n session?: unknown;\n },\n): Promise<ExecuteActionResponse> {\n const { collectionSlug, actionId, itemId, itemIds, data } = params;\n\n try {\n switch (actionId) {\n case \"create\": {\n const result = await (app as any).create(collectionSlug, data || {});\n return {\n success: true,\n result: {\n type: \"success\",\n toast: { message: \"Item created successfully\" },\n effects: {\n invalidate: [collectionSlug],\n redirect: `/admin/collections/${collectionSlug}/${result.id}`,\n },\n },\n };\n }\n\n case \"save\": {\n if (!itemId) {\n return {\n success: false,\n result: {\n type: \"error\",\n toast: { message: \"Item ID is required for save action\" },\n },\n };\n }\n await (app as any).update(collectionSlug, itemId, data || {});\n return {\n success: true,\n result: {\n type: \"success\",\n toast: { message: \"Item saved successfully\" },\n effects: { invalidate: [collectionSlug] },\n },\n };\n }\n\n case \"delete\": {\n if (!itemId) {\n return {\n success: false,\n result: {\n type: \"error\",\n toast: { message: \"Item ID is required for delete action\" },\n },\n };\n }\n await (app as any).delete(collectionSlug, itemId);\n return {\n success: true,\n result: {\n type: \"success\",\n toast: { message: \"Item deleted successfully\" },\n effects: {\n invalidate: [collectionSlug],\n redirect: `/admin/collections/${collectionSlug}`,\n },\n },\n };\n }\n\n case \"deleteMany\": {\n if (!itemIds || itemIds.length === 0) {\n return {\n success: false,\n result: {\n type: \"error\",\n toast: {\n message: \"Item IDs are required for bulk delete action\",\n },\n },\n };\n }\n // Delete items in parallel\n await Promise.all(\n itemIds.map((id) => (app as any).delete(collectionSlug, id)),\n );\n return {\n success: true,\n result: {\n type: \"success\",\n toast: { message: `${itemIds.length} items deleted successfully` },\n effects: { invalidate: [collectionSlug] },\n },\n };\n }\n\n case \"duplicate\": {\n if (!itemId) {\n return {\n success: false,\n result: {\n type: \"error\",\n toast: { message: \"Item ID is required for duplicate action\" },\n },\n };\n }\n const original = await (app as any).findById(collectionSlug, itemId);\n if (!original) {\n return {\n success: false,\n result: {\n type: \"error\",\n toast: { message: \"Item not found\" },\n },\n };\n }\n // Remove id and timestamps for duplication\n const { id, createdAt, updatedAt, ...duplicateData } = original;\n const duplicated = await (app as any).create(\n collectionSlug,\n duplicateData,\n );\n return {\n success: true,\n result: {\n type: \"success\",\n toast: { message: \"Item duplicated successfully\" },\n effects: {\n invalidate: [collectionSlug],\n redirect: `/admin/collections/${collectionSlug}/${duplicated.id}`,\n },\n },\n };\n }\n\n default:\n return {\n success: false,\n result: {\n type: \"error\",\n toast: { message: `Unknown built-in action: ${actionId}` },\n },\n };\n }\n } catch (error) {\n console.error(`Built-in action \"${actionId}\" failed:`, error);\n return {\n success: false,\n result: {\n type: \"error\",\n toast: {\n message:\n error instanceof Error ? error.message : \"Action execution failed\",\n },\n },\n };\n }\n}\n\n/**\n * Check if a field is a ServerActionFormFieldDefinition (has getMetadata)\n */\nfunction isFieldDefinition(\n field: ServerActionFormField,\n): field is { state: any; getMetadata(): any; toZodSchema(): unknown } {\n return typeof (field as any).getMetadata === \"function\";\n}\n\n/**\n * Extract required status from a form field (handles both config and definition)\n */\nfunction isFieldRequired(field: ServerActionFormField): boolean {\n if (isFieldDefinition(field)) {\n return !!field.state?.required;\n }\n return !!field.required;\n}\n\n/**\n * Validate form data against action form fields.\n * Returns error message if validation fails, null if valid.\n */\nfunction validateActionFormData(\n fields: Record<string, ServerActionFormField>,\n data: Record<string, unknown>,\n): string | null {\n for (const [fieldName, fieldConfig] of Object.entries(fields)) {\n if (isFieldRequired(fieldConfig) && !data[fieldName]) {\n return `Field \"${fieldName}\" is required`;\n }\n }\n return null;\n}\n\n// ============================================================================\n// Schema Definitions\n// ============================================================================\n\nconst executeActionRequestSchema = z.object({\n collection: z.string(),\n actionId: z.string(),\n itemId: z.string().optional(),\n itemIds: z.array(z.string()).optional(),\n data: z.record(z.string(), z.unknown()).optional(),\n locale: z.string().optional(),\n});\n\nconst executeActionResponseSchema = z.object({\n success: z.boolean(),\n result: z.unknown().optional(),\n error: z.string().optional(),\n});\n\nconst getActionsConfigRequestSchema = z.object({\n collection: z.string(),\n});\n\nconst getActionsConfigResponseSchema = z\n .object({\n builtin: z.array(z.string()),\n custom: z.array(z.unknown()),\n })\n .nullable();\n\n// ============================================================================\n// CMS Functions\n// ============================================================================\n\n/**\n * Execute a collection action.\n *\n * @example\n * ```ts\n * // From client\n * const result = await cms.api.functions.executeAction({\n * collection: \"posts\",\n * actionId: \"publish\",\n * itemId: \"123\",\n * });\n * ```\n */\nexport const executeActionFn = fn({\n type: \"mutation\",\n schema: executeActionRequestSchema,\n outputSchema: executeActionResponseSchema,\n handler: async (ctx) => {\n const app = ctx.app as App;\n const session = (ctx as any).session;\n return executeAction(app, ctx.input, session);\n },\n});\n\n/**\n * Get actions configuration for a collection.\n * Returns action definitions without handlers for client rendering.\n */\nexport const getActionsConfigFn = fn({\n type: \"query\",\n schema: getActionsConfigRequestSchema,\n outputSchema: getActionsConfigResponseSchema,\n handler: (ctx) => {\n const app = ctx.app as App;\n return getActionsConfig(app, ctx.input.collection);\n },\n});\n\n/**\n * CMS functions for action execution.\n * These are registered on the adminModule.\n */\nexport const actionFunctions = {\n executeAction: executeActionFn,\n getActionsConfig: getActionsConfigFn,\n};\n"],"mappings":"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"}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { fn } from "questpie";
|
|
3
|
-
|
|
4
|
-
//#region src/server/modules/admin/functions/locales.ts
|
|
5
|
-
/**
|
|
6
|
-
* Content Locales Functions
|
|
7
|
-
*
|
|
8
|
-
* Functions for retrieving available content locales from the CMS configuration.
|
|
9
|
-
* Used by the admin panel to populate locale switchers and validate locale selection.
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Helper to get typed CMS app from handler context.
|
|
13
|
-
*/
|
|
14
|
-
function getApp(ctx) {
|
|
15
|
-
return ctx.app;
|
|
16
|
-
}
|
|
17
|
-
const getContentLocalesSchema = z.object({}).optional();
|
|
18
|
-
const getContentLocalesOutputSchema = z.object({
|
|
19
|
-
locales: z.array(z.object({
|
|
20
|
-
code: z.string(),
|
|
21
|
-
label: z.string().optional(),
|
|
22
|
-
fallback: z.boolean().optional(),
|
|
23
|
-
flagCountryCode: z.string().optional()
|
|
24
|
-
})),
|
|
25
|
-
defaultLocale: z.string(),
|
|
26
|
-
fallbacks: z.record(z.string(), z.string()).optional()
|
|
27
|
-
});
|
|
28
|
-
/**
|
|
29
|
-
* Get available content locales from CMS configuration.
|
|
30
|
-
*
|
|
31
|
-
* Returns the list of available locales for content localization,
|
|
32
|
-
* the default locale, and any fallback mappings.
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```ts
|
|
36
|
-
* const result = await client.rpc.getContentLocales({});
|
|
37
|
-
* // {
|
|
38
|
-
* // locales: [
|
|
39
|
-
* // { code: "en", label: "English", fallback: true },
|
|
40
|
-
* // { code: "sk", label: "Slovenčina" },
|
|
41
|
-
* // ],
|
|
42
|
-
* // defaultLocale: "en",
|
|
43
|
-
* // fallbacks: { "en-GB": "en" },
|
|
44
|
-
* // }
|
|
45
|
-
* ```
|
|
46
|
-
*/
|
|
47
|
-
const getContentLocales = fn({
|
|
48
|
-
type: "query",
|
|
49
|
-
schema: getContentLocalesSchema,
|
|
50
|
-
outputSchema: getContentLocalesOutputSchema,
|
|
51
|
-
handler: async (ctx) => {
|
|
52
|
-
const localeConfig = getApp(ctx).config.locale;
|
|
53
|
-
if (!localeConfig) return {
|
|
54
|
-
locales: [{
|
|
55
|
-
code: "en",
|
|
56
|
-
label: "English",
|
|
57
|
-
fallback: true
|
|
58
|
-
}],
|
|
59
|
-
defaultLocale: "en"
|
|
60
|
-
};
|
|
61
|
-
return {
|
|
62
|
-
locales: (typeof localeConfig.locales === "function" ? await localeConfig.locales() : localeConfig.locales).map((l) => ({
|
|
63
|
-
code: l.code,
|
|
64
|
-
label: l.label,
|
|
65
|
-
fallback: l.fallback,
|
|
66
|
-
flagCountryCode: l.flagCountryCode
|
|
67
|
-
})),
|
|
68
|
-
defaultLocale: localeConfig.defaultLocale,
|
|
69
|
-
fallbacks: localeConfig.fallbacks
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
/**
|
|
74
|
-
* Bundle of locale-related functions.
|
|
75
|
-
*/
|
|
76
|
-
const localeFunctions = { getContentLocales };
|
|
77
|
-
|
|
78
|
-
//#endregion
|
|
79
|
-
export { getContentLocales, localeFunctions };
|
|
80
|
-
//# sourceMappingURL=locales.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"locales.mjs","names":[],"sources":["../../../../../src/server/modules/admin/functions/locales.ts"],"sourcesContent":["/**\n * Content Locales Functions\n *\n * Functions for retrieving available content locales from the CMS configuration.\n * Used by the admin panel to populate locale switchers and validate locale selection.\n */\n\nimport { fn, type Questpie } from \"questpie\";\nimport { z } from \"zod\";\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Helper to get typed CMS app from handler context.\n */\nfunction getApp(ctx: { app: unknown }): Questpie<any> {\n return ctx.app as Questpie<any>;\n}\n\n// ============================================================================\n// Schema Definitions\n// ============================================================================\n\nconst getContentLocalesSchema = z.object({}).optional();\n\nconst getContentLocalesOutputSchema = z.object({\n locales: z.array(\n z.object({\n code: z.string(),\n label: z.string().optional(),\n fallback: z.boolean().optional(),\n flagCountryCode: z.string().optional(),\n }),\n ),\n defaultLocale: z.string(),\n fallbacks: z.record(z.string(), z.string()).optional(),\n});\n\n// ============================================================================\n// Functions\n// ============================================================================\n\n/**\n * Get available content locales from CMS configuration.\n *\n * Returns the list of available locales for content localization,\n * the default locale, and any fallback mappings.\n *\n * @example\n * ```ts\n * const result = await client.rpc.getContentLocales({});\n * // {\n * // locales: [\n * // { code: \"en\", label: \"English\", fallback: true },\n * // { code: \"sk\", label: \"Slovenčina\" },\n * // ],\n * // defaultLocale: \"en\",\n * // fallbacks: { \"en-GB\": \"en\" },\n * // }\n * ```\n */\nexport const getContentLocales = fn({\n type: \"query\",\n schema: getContentLocalesSchema,\n outputSchema: getContentLocalesOutputSchema,\n handler: async (ctx) => {\n const cms = getApp(ctx);\n const localeConfig = cms.config.locale;\n\n // If no locale config, return sensible defaults\n if (!localeConfig) {\n return {\n locales: [{ code: \"en\", label: \"English\", fallback: true }],\n defaultLocale: \"en\",\n };\n }\n\n // Resolve locales (can be async function)\n const locales =\n typeof localeConfig.locales === \"function\"\n ? await localeConfig.locales()\n : localeConfig.locales;\n\n return {\n locales: locales.map(\n (l: {\n code: string;\n label?: string;\n fallback?: boolean;\n flagCountryCode?: string;\n }) => ({\n code: l.code,\n label: l.label,\n fallback: l.fallback,\n flagCountryCode: l.flagCountryCode,\n }),\n ),\n defaultLocale: localeConfig.defaultLocale,\n fallbacks: localeConfig.fallbacks,\n };\n },\n});\n\n// ============================================================================\n// Export Bundle\n// ============================================================================\n\n/**\n * Bundle of locale-related functions.\n */\nexport const localeFunctions = {\n getContentLocales,\n} as const;\n"],"mappings":";;;;;;;;;;;;;AAiBA,SAAS,OAAO,KAAsC;AACpD,QAAO,IAAI;;AAOb,MAAM,0BAA0B,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU;AAEvD,MAAM,gCAAgC,EAAE,OAAO;CAC7C,SAAS,EAAE,MACT,EAAE,OAAO;EACP,MAAM,EAAE,QAAQ;EAChB,OAAO,EAAE,QAAQ,CAAC,UAAU;EAC5B,UAAU,EAAE,SAAS,CAAC,UAAU;EAChC,iBAAiB,EAAE,QAAQ,CAAC,UAAU;EACvC,CAAC,CACH;CACD,eAAe,EAAE,QAAQ;CACzB,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU;CACvD,CAAC;;;;;;;;;;;;;;;;;;;;AAyBF,MAAa,oBAAoB,GAAG;CAClC,MAAM;CACN,QAAQ;CACR,cAAc;CACd,SAAS,OAAO,QAAQ;EAEtB,MAAM,eADM,OAAO,IAAI,CACE,OAAO;AAGhC,MAAI,CAAC,aACH,QAAO;GACL,SAAS,CAAC;IAAE,MAAM;IAAM,OAAO;IAAW,UAAU;IAAM,CAAC;GAC3D,eAAe;GAChB;AASH,SAAO;GACL,UALA,OAAO,aAAa,YAAY,aAC5B,MAAM,aAAa,SAAS,GAC5B,aAAa,SAGA,KACd,OAKM;IACL,MAAM,EAAE;IACR,OAAO,EAAE;IACT,UAAU,EAAE;IACZ,iBAAiB,EAAE;IACpB,EACF;GACD,eAAe,aAAa;GAC5B,WAAW,aAAa;GACzB;;CAEJ,CAAC;;;;AASF,MAAa,kBAAkB,EAC7B,mBACD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.mts","names":[],"sources":["../../../../../src/server/modules/admin/functions/preview.ts"],"sourcesContent":[],"mappings":";;;;;;;AAiEA;AAiBA;AAgIA;AAuDA;;UAxMiB,mBAAA;;;;;;;;;;iBAiBD,sBAAA;oBAAsB,aAAA,CAAA;;;;;;;sBAAA,aAAA,CAAA;;;;;;;;;;;;;;;;iBAgItB,wBAAA,iCAGb;;;;;;;;;;;;;;;;;;;;iBAoDa,0BAAA,sCAGS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preview.mjs","names":["payload: PreviewTokenPayload"],"sources":["../../../../../src/server/modules/admin/functions/preview.ts"],"sourcesContent":["/**\n * Preview Functions - Server-side\n *\n * RPC functions for draft mode preview.\n * Handles token minting for secure, shareable preview links.\n *\n * Browser-safe utilities (isDraftMode, createDraftModeCookie, etc.) are in @questpie/admin/shared\n */\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { fn, type Questpie } from \"questpie\";\nimport { z } from \"zod\";\nimport { getPreviewSecret } from \"#questpie/admin/shared/preview-utils.js\";\nimport type { PreviewConfig } from \"../../../augmentation.js\";\n\n// ============================================================================\n// Token Utilities\n// ============================================================================\n\nfunction base64UrlEncode(input: string | Buffer): string {\n\tconst buffer = Buffer.isBuffer(input) ? input : Buffer.from(input);\n\treturn buffer\n\t\t.toString(\"base64\")\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=+$/g, \"\");\n}\n\nfunction base64UrlDecode(input: string): string {\n\tlet base64 = input.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\tconst padding = base64.length % 4;\n\tif (padding) {\n\t\tbase64 += \"=\".repeat(4 - padding);\n\t}\n\treturn Buffer.from(base64, \"base64\").toString(\"utf8\");\n}\n\n// ============================================================================\n// Schema Definitions\n// ============================================================================\n\nconst mintPreviewTokenSchema = z.object({\n\tpath: z.string().min(1, \"Path is required\"),\n\tttlMs: z.number().positive().optional(),\n});\n\nconst mintPreviewTokenOutputSchema = z.object({\n\ttoken: z.string(),\n\texpiresAt: z.number(),\n});\n\nconst verifyPreviewTokenSchema = z.object({\n\ttoken: z.string(),\n});\n\nconst verifyPreviewTokenOutputSchema = z.object({\n\tvalid: z.boolean(),\n\tpath: z.string().optional(),\n\terror: z.string().optional(),\n});\n\n// ============================================================================\n// Preview Token Payload\n// ============================================================================\n\nexport interface PreviewTokenPayload {\n\tpath: string;\n\texp: number;\n}\n\n// ============================================================================\n// Functions Factory\n// ============================================================================\n\nconst DEFAULT_TTL_MS = 60 * 60 * 1000; // 1 hour\n\n/**\n * Create preview-related RPC functions.\n *\n * @param secret - Secret key for signing tokens\n * @returns Object with preview functions\n */\nexport function createPreviewFunctions(secret: string) {\n\tconst signPayload = (payload: string): string => {\n\t\tconst signature = createHmac(\"sha256\", secret).update(payload).digest();\n\t\treturn base64UrlEncode(signature);\n\t};\n\n\t/**\n\t * Mint a preview token for draft mode access.\n\t *\n\t * Requires authenticated admin session.\n\t * Token contains the target path and expiration time.\n\t *\n\t * @example\n\t * ```ts\n\t * const { token } = await client.rpc.mintPreviewToken({\n\t * path: \"/pages/about\",\n\t * ttlMs: 30 * 60 * 1000, // 30 minutes\n\t * });\n\t * // Use: /api/preview?token=${token}\n\t * ```\n\t */\n\tconst mintPreviewToken = fn({\n\t\ttype: \"mutation\",\n\t\tschema: mintPreviewTokenSchema,\n\t\toutputSchema: mintPreviewTokenOutputSchema,\n\t\thandler: async ({ input, session }) => {\n\t\t\t// Require authenticated admin session\n\t\t\tif (!session) {\n\t\t\t\tthrow new Error(\"Unauthorized: Admin session required\");\n\t\t\t}\n\n\t\t\tconst { path, ttlMs = DEFAULT_TTL_MS } = input;\n\t\t\tconst expiresAt = Date.now() + ttlMs;\n\n\t\t\tconst payload: PreviewTokenPayload = { path, exp: expiresAt };\n\t\t\tconst payloadString = JSON.stringify(payload);\n\t\t\tconst encodedPayload = base64UrlEncode(payloadString);\n\t\t\tconst signature = signPayload(encodedPayload);\n\n\t\t\treturn {\n\t\t\t\ttoken: `${encodedPayload}.${signature}`,\n\t\t\t\texpiresAt,\n\t\t\t};\n\t\t},\n\t});\n\n\t/**\n\t * Verify a preview token.\n\t *\n\t * Used by the preview route to validate tokens before setting draft mode cookie.\n\t * Does not require authentication (token IS the authentication).\n\t *\n\t * @example\n\t * ```ts\n\t * const result = await client.rpc.verifyPreviewToken({ token });\n\t * if (result.valid) {\n\t * // Redirect to result.path with draft mode cookie\n\t * }\n\t * ```\n\t */\n\tconst verifyPreviewToken = fn({\n\t\ttype: \"query\",\n\t\tschema: verifyPreviewTokenSchema,\n\t\toutputSchema: verifyPreviewTokenOutputSchema,\n\t\thandler: async ({ input }) => {\n\t\t\tconst { token } = input;\n\n\t\t\tconst [encodedPayload, signature] = token.split(\".\");\n\t\t\tif (!encodedPayload || !signature) {\n\t\t\t\treturn { valid: false, error: \"Invalid token format\" };\n\t\t\t}\n\n\t\t\t// Verify signature\n\t\t\tconst expectedSignature = signPayload(encodedPayload);\n\t\t\tconst signatureBuffer = Uint8Array.from(Buffer.from(signature));\n\t\t\tconst expectedBuffer = Uint8Array.from(Buffer.from(expectedSignature));\n\n\t\t\tif (signatureBuffer.length !== expectedBuffer.length) {\n\t\t\t\treturn { valid: false, error: \"Invalid signature\" };\n\t\t\t}\n\n\t\t\tif (!timingSafeEqual(signatureBuffer, expectedBuffer)) {\n\t\t\t\treturn { valid: false, error: \"Invalid signature\" };\n\t\t\t}\n\n\t\t\t// Parse and validate payload\n\t\t\ttry {\n\t\t\t\tconst payload = JSON.parse(\n\t\t\t\t\tbase64UrlDecode(encodedPayload),\n\t\t\t\t) as PreviewTokenPayload;\n\n\t\t\t\tif (!payload?.exp || typeof payload.exp !== \"number\") {\n\t\t\t\t\treturn { valid: false, error: \"Invalid payload\" };\n\t\t\t\t}\n\n\t\t\t\tif (payload.exp < Date.now()) {\n\t\t\t\t\treturn { valid: false, error: \"Token expired\" };\n\t\t\t\t}\n\n\t\t\t\tif (!payload.path || typeof payload.path !== \"string\") {\n\t\t\t\t\treturn { valid: false, error: \"Invalid path\" };\n\t\t\t\t}\n\n\t\t\t\treturn { valid: true, path: payload.path };\n\t\t\t} catch {\n\t\t\t\treturn { valid: false, error: \"Invalid payload\" };\n\t\t\t}\n\t\t},\n\t});\n\n\treturn {\n\t\tmintPreviewToken,\n\t\tverifyPreviewToken,\n\t};\n}\n\n// ============================================================================\n// Standalone Token Verification (for route handlers)\n// ============================================================================\n\n/**\n * Verify a preview token without RPC.\n * Used directly in route handlers where RPC is not available.\n *\n * @param token - The preview token to verify\n * @param secret - The secret used to sign the token\n * @returns The payload if valid, null otherwise\n */\nexport function verifyPreviewTokenDirect(\n\ttoken: string,\n\tsecret: string,\n): PreviewTokenPayload | null {\n\tconst [encodedPayload, signature] = token.split(\".\");\n\tif (!encodedPayload || !signature) return null;\n\n\tconst expectedSignature = base64UrlEncode(\n\t\tcreateHmac(\"sha256\", secret).update(encodedPayload).digest(),\n\t);\n\n\tconst signatureBuffer = Uint8Array.from(Buffer.from(signature));\n\tconst expectedBuffer = Uint8Array.from(Buffer.from(expectedSignature));\n\n\tif (signatureBuffer.length !== expectedBuffer.length) return null;\n\tif (!timingSafeEqual(signatureBuffer, expectedBuffer)) return null;\n\n\ttry {\n\t\tconst payload = JSON.parse(\n\t\t\tbase64UrlDecode(encodedPayload),\n\t\t) as PreviewTokenPayload;\n\n\t\tif (!payload?.exp || typeof payload.exp !== \"number\") return null;\n\t\tif (payload.exp < Date.now()) return null;\n\t\tif (!payload.path || typeof payload.path !== \"string\") return null;\n\n\t\treturn payload;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n// ============================================================================\n// Factory & Helpers\n// ============================================================================\n\n/**\n * Create a preview token verifier with bound secret.\n * Use this in route handlers to avoid passing secret repeatedly.\n *\n * @param secret - The secret used to sign tokens (optional, uses env if not provided)\n * @returns A verify function that only needs the token\n *\n * @example\n * ```ts\n * // Create once at module level\n * const verifyPreviewToken = createPreviewTokenVerifier();\n *\n * // Use in route handler\n * const payload = verifyPreviewToken(token);\n * if (!payload) {\n * return new Response(\"Invalid token\", { status: 401 });\n * }\n * ```\n */\nexport function createPreviewTokenVerifier(secret?: string) {\n\tconst resolvedSecret = secret ?? getPreviewSecret();\n\n\treturn (token: string): PreviewTokenPayload | null => {\n\t\treturn verifyPreviewTokenDirect(token, resolvedSecret);\n\t};\n}\n\n// ============================================================================\n// Preview URL Generation\n// ============================================================================\n\nconst getPreviewUrlSchema = z.object({\n\tcollection: z.string().min(1, \"Collection name is required\"),\n\trecord: z.record(z.string(), z.unknown()),\n\tlocale: z.string().optional(),\n});\n\nconst getPreviewUrlOutputSchema = z.object({\n\turl: z.string().nullable(),\n\terror: z.string().optional(),\n});\n\n/**\n * Get preview URL for a collection record.\n *\n * Calls the server-side url() function from the collection's .preview() config.\n * This is needed because url() is a function that cannot be serialized to JSON.\n *\n * @example\n * ```ts\n * const { url } = await client.rpc.getPreviewUrl({\n * collection: \"pages\",\n * record: { slug: \"about\", title: \"About Us\" },\n * locale: \"en\",\n * });\n * // Returns: \"/about?preview=true\"\n * ```\n */\nexport const getPreviewUrl = fn({\n\ttype: \"query\",\n\tschema: getPreviewUrlSchema,\n\toutputSchema: getPreviewUrlOutputSchema,\n\thandler: async ({ input, app, session }) => {\n\t\t// Require authenticated admin session\n\t\tif (!session) {\n\t\t\treturn { url: null, error: \"Unauthorized: Admin session required\" };\n\t\t}\n\n\t\tconst { collection: collectionName, record, locale } = input;\n\t\tconst cms = app as Questpie<any>;\n\n\t\t// Get collection from CMS\n\t\tconst collections = cms.getCollections();\n\t\tconst collection = collections[collectionName];\n\n\t\tif (!collection) {\n\t\t\treturn { url: null, error: `Collection '${collectionName}' not found` };\n\t\t}\n\n\t\t// Get preview config from collection state\n\t\tconst previewConfig = (collection.state as any).adminPreview as\n\t\t\t| PreviewConfig\n\t\t\t| undefined;\n\n\t\tif (!previewConfig?.url) {\n\t\t\treturn {\n\t\t\t\turl: null,\n\t\t\t\terror: \"No preview URL configured for this collection\",\n\t\t\t};\n\t\t}\n\n\t\tif (previewConfig.enabled === false) {\n\t\t\treturn { url: null, error: \"Preview is disabled for this collection\" };\n\t\t}\n\n\t\ttry {\n\t\t\tconst url = previewConfig.url({ record, locale });\n\t\t\treturn { url };\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\turl: null,\n\t\t\t\terror: `Failed to generate preview URL: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n\t\t\t};\n\t\t}\n\t},\n});\n\n// ============================================================================\n// Default Functions Bundle\n// ============================================================================\n\n/**\n * Default preview functions bundle with env-based secret.\n * Used by adminModule to register preview RPC functions.\n */\nexport const previewFunctions = {\n\t...createPreviewFunctions(getPreviewSecret()),\n\tgetPreviewUrl,\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reactive.d.mts","names":[],"sources":["../../../../../src/server/modules/admin/functions/reactive.ts"],"sourcesContent":[],"mappings":";;;;;;;AAygBA;;;;;;;AAmFA;cAnFa,6BAAa;;;;IAmFD,KAAA,EAAA,MAAA;IA0GZ,IAAA,EAAA,UAGH,GAAA,UAAA,GAAA,QAAA,GAAA,SAAA;;;;;;;;;;;;;;;;;;cA7GG,4BAAY;;;;;;;;;;;;;;;;;;;;cA0GZ"}
|