@velastack/cms 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +644 -0
- package/dist/cms.d.ts +6 -0
- package/dist/cms.js +30 -0
- package/dist/components/admin-bar/admin-bar-internal.svelte +1697 -0
- package/dist/components/admin-bar/admin-bar-internal.svelte.d.ts +12 -0
- package/dist/components/admin-bar/admin-bar.css +5 -0
- package/dist/components/admin-bar/admin-bar.svelte +355 -0
- package/dist/components/admin-bar/admin-bar.svelte.d.ts +7 -0
- package/dist/components/admin-bar/click-outside.d.ts +8 -0
- package/dist/components/admin-bar/click-outside.js +17 -0
- package/dist/components/admin-bar/css-root.svelte +23 -0
- package/dist/components/admin-bar/css-root.svelte.d.ts +19 -0
- package/dist/components/admin-bar/delete-page-dialog.svelte +326 -0
- package/dist/components/admin-bar/delete-page-dialog.svelte.d.ts +32 -0
- package/dist/components/admin-bar/history-panel.svelte +264 -0
- package/dist/components/admin-bar/history-panel.svelte.d.ts +8 -0
- package/dist/components/admin-bar/icons/bold.svelte +13 -0
- package/dist/components/admin-bar/icons/bold.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/check.svelte +11 -0
- package/dist/components/admin-bar/icons/check.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/chevron-down.svelte +11 -0
- package/dist/components/admin-bar/icons/chevron-down.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/chevron-right.svelte +11 -0
- package/dist/components/admin-bar/icons/chevron-right.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/chevron-up.svelte +11 -0
- package/dist/components/admin-bar/icons/chevron-up.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/code.svelte +14 -0
- package/dist/components/admin-bar/icons/code.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/external-link.svelte +15 -0
- package/dist/components/admin-bar/icons/external-link.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/file.svelte +19 -0
- package/dist/components/admin-bar/icons/file.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/heading-2.svelte +16 -0
- package/dist/components/admin-bar/icons/heading-2.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/heading-3.svelte +17 -0
- package/dist/components/admin-bar/icons/heading-3.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/icon.svelte +41 -0
- package/dist/components/admin-bar/icons/icon.svelte.d.ts +21 -0
- package/dist/components/admin-bar/icons/images.svelte +16 -0
- package/dist/components/admin-bar/icons/images.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/italic.svelte +15 -0
- package/dist/components/admin-bar/icons/italic.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/link-2-off.svelte +16 -0
- package/dist/components/admin-bar/icons/link-2-off.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/link.svelte +14 -0
- package/dist/components/admin-bar/icons/link.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/list-ordered.svelte +18 -0
- package/dist/components/admin-bar/icons/list-ordered.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/list.svelte +18 -0
- package/dist/components/admin-bar/icons/list.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/loader-circle.svelte +11 -0
- package/dist/components/admin-bar/icons/loader-circle.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/minus.svelte +11 -0
- package/dist/components/admin-bar/icons/minus.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/quote.svelte +24 -0
- package/dist/components/admin-bar/icons/quote.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/search.svelte +14 -0
- package/dist/components/admin-bar/icons/search.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/trash-2.svelte +17 -0
- package/dist/components/admin-bar/icons/trash-2.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/triangle-alert.svelte +15 -0
- package/dist/components/admin-bar/icons/triangle-alert.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/types.d.ts +7 -0
- package/dist/components/admin-bar/icons/types.js +1 -0
- package/dist/components/admin-bar/icons/undo-2.svelte +14 -0
- package/dist/components/admin-bar/icons/undo-2.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/upload.svelte +15 -0
- package/dist/components/admin-bar/icons/upload.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/x.svelte +14 -0
- package/dist/components/admin-bar/icons/x.svelte.d.ts +3 -0
- package/dist/components/admin-bar/keyboard-shortcuts-dialog.svelte +96 -0
- package/dist/components/admin-bar/keyboard-shortcuts-dialog.svelte.d.ts +7 -0
- package/dist/components/admin-bar/locales-panel.svelte +137 -0
- package/dist/components/admin-bar/locales-panel.svelte.d.ts +9 -0
- package/dist/components/admin-bar/media-panel.svelte +282 -0
- package/dist/components/admin-bar/media-panel.svelte.d.ts +7 -0
- package/dist/components/admin-bar/new-page-chooser-dialog.svelte +56 -0
- package/dist/components/admin-bar/new-page-chooser-dialog.svelte.d.ts +10 -0
- package/dist/components/admin-bar/new-page-dialog.svelte +126 -0
- package/dist/components/admin-bar/new-page-dialog.svelte.d.ts +14 -0
- package/dist/components/admin-bar/page-config.d.ts +61 -0
- package/dist/components/admin-bar/page-config.js +24 -0
- package/dist/components/admin-bar/pages-panel.svelte +639 -0
- package/dist/components/admin-bar/pages-panel.svelte.d.ts +13 -0
- package/dist/components/admin-bar/panel-footer.svelte +21 -0
- package/dist/components/admin-bar/panel-footer.svelte.d.ts +8 -0
- package/dist/components/admin-bar/panel-header.svelte +29 -0
- package/dist/components/admin-bar/panel-header.svelte.d.ts +10 -0
- package/dist/components/admin-bar/panel.svelte +41 -0
- package/dist/components/admin-bar/panel.svelte.d.ts +10 -0
- package/dist/components/admin-bar/publish-dialog.svelte +387 -0
- package/dist/components/admin-bar/publish-dialog.svelte.d.ts +16 -0
- package/dist/components/admin-bar/resolve-route.d.ts +20 -0
- package/dist/components/admin-bar/resolve-route.js +50 -0
- package/dist/components/admin-bar/seo-panel.svelte +387 -0
- package/dist/components/admin-bar/seo-panel.svelte.d.ts +7 -0
- package/dist/components/admin-bar/share-preview-link-dialog.svelte +97 -0
- package/dist/components/admin-bar/share-preview-link-dialog.svelte.d.ts +9 -0
- package/dist/components/admin-bar/site-settings-panel.svelte +225 -0
- package/dist/components/admin-bar/site-settings-panel.svelte.d.ts +7 -0
- package/dist/components/admin-bar/status-pill.svelte +49 -0
- package/dist/components/admin-bar/status-pill.svelte.d.ts +11 -0
- package/dist/components/admin-bar/theme.svelte.d.ts +16 -0
- package/dist/components/admin-bar/theme.svelte.js +39 -0
- package/dist/components/admin-bar/ui/badge/badge.svelte +57 -0
- package/dist/components/admin-bar/ui/badge/badge.svelte.d.ts +16 -0
- package/dist/components/admin-bar/ui/badge/index.d.ts +4 -0
- package/dist/components/admin-bar/ui/badge/index.js +4 -0
- package/dist/components/admin-bar/ui/button/button.svelte +73 -0
- package/dist/components/admin-bar/ui/button/button.svelte.d.ts +16 -0
- package/dist/components/admin-bar/ui/button/index.d.ts +4 -0
- package/dist/components/admin-bar/ui/button/index.js +4 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible-content.svelte +7 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible-content.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible-trigger.svelte +7 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible-trigger.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible.svelte +7 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/collapsible/index.d.ts +4 -0
- package/dist/components/admin-bar/ui/collapsible/index.js +6 -0
- package/dist/components/admin-bar/ui/dialog/dialog-close.svelte +7 -0
- package/dist/components/admin-bar/ui/dialog/dialog-close.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/dialog/dialog-content.svelte +46 -0
- package/dist/components/admin-bar/ui/dialog/dialog-content.svelte.d.ts +11 -0
- package/dist/components/admin-bar/ui/dialog/dialog-description.svelte +17 -0
- package/dist/components/admin-bar/ui/dialog/dialog-description.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/dialog/dialog-footer.svelte +23 -0
- package/dist/components/admin-bar/ui/dialog/dialog-footer.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/dialog/dialog-header.svelte +20 -0
- package/dist/components/admin-bar/ui/dialog/dialog-header.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/dialog/dialog-overlay.svelte +20 -0
- package/dist/components/admin-bar/ui/dialog/dialog-overlay.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/dialog/dialog-portal.svelte +7 -0
- package/dist/components/admin-bar/ui/dialog/dialog-portal.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/dialog/dialog-title.svelte +17 -0
- package/dist/components/admin-bar/ui/dialog/dialog-title.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/dialog/dialog-trigger.svelte +7 -0
- package/dist/components/admin-bar/ui/dialog/dialog-trigger.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/dialog/dialog.svelte +7 -0
- package/dist/components/admin-bar/ui/dialog/dialog.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/dialog/index.d.ts +11 -0
- package/dist/components/admin-bar/ui/dialog/index.js +13 -0
- package/dist/components/admin-bar/ui/input/index.d.ts +3 -0
- package/dist/components/admin-bar/ui/input/index.js +3 -0
- package/dist/components/admin-bar/ui/input/input.svelte +24 -0
- package/dist/components/admin-bar/ui/input/input.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/kbd/index.d.ts +4 -0
- package/dist/components/admin-bar/ui/kbd/index.js +6 -0
- package/dist/components/admin-bar/ui/kbd/kbd-group.svelte +20 -0
- package/dist/components/admin-bar/ui/kbd/kbd-group.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/kbd/kbd-shortcut.svelte +52 -0
- package/dist/components/admin-bar/ui/kbd/kbd-shortcut.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/kbd/kbd.svelte +27 -0
- package/dist/components/admin-bar/ui/kbd/kbd.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/label/index.d.ts +3 -0
- package/dist/components/admin-bar/ui/label/index.js +3 -0
- package/dist/components/admin-bar/ui/label/label.svelte +20 -0
- package/dist/components/admin-bar/ui/label/label.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/index.d.ts +18 -0
- package/dist/components/admin-bar/ui/menubar/index.js +20 -0
- package/dist/components/admin-bar/ui/menubar/menubar-checkbox-item.svelte +46 -0
- package/dist/components/admin-bar/ui/menubar/menubar-checkbox-item.svelte.d.ts +10 -0
- package/dist/components/admin-bar/ui/menubar/menubar-content.svelte +28 -0
- package/dist/components/admin-bar/ui/menubar/menubar-content.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar-group-heading.svelte +25 -0
- package/dist/components/admin-bar/ui/menubar/menubar-group-heading.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/menubar/menubar-group.svelte +12 -0
- package/dist/components/admin-bar/ui/menubar/menubar-group.svelte.d.ts +7 -0
- package/dist/components/admin-bar/ui/menubar/menubar-item.svelte +27 -0
- package/dist/components/admin-bar/ui/menubar/menubar-item.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/menubar/menubar-label.svelte +25 -0
- package/dist/components/admin-bar/ui/menubar/menubar-label.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/menubar/menubar-menu.svelte +7 -0
- package/dist/components/admin-bar/ui/menubar/menubar-menu.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/menubar/menubar-portal.svelte +7 -0
- package/dist/components/admin-bar/ui/menubar/menubar-portal.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/menubar/menubar-radio-group.svelte +11 -0
- package/dist/components/admin-bar/ui/menubar/menubar-radio-group.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar-radio-item.svelte +37 -0
- package/dist/components/admin-bar/ui/menubar/menubar-radio-item.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/menubar/menubar-separator.svelte +17 -0
- package/dist/components/admin-bar/ui/menubar/menubar-separator.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar-shortcut.svelte +23 -0
- package/dist/components/admin-bar/ui/menubar/menubar-shortcut.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub-content.svelte +20 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub-content.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub-trigger.svelte +29 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub-trigger.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub.svelte +7 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar-trigger.svelte +20 -0
- package/dist/components/admin-bar/ui/menubar/menubar-trigger.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar.svelte +20 -0
- package/dist/components/admin-bar/ui/menubar/menubar.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/select/index.d.ts +12 -0
- package/dist/components/admin-bar/ui/select/index.js +14 -0
- package/dist/components/admin-bar/ui/select/select-content.svelte +45 -0
- package/dist/components/admin-bar/ui/select/select-content.svelte.d.ts +11 -0
- package/dist/components/admin-bar/ui/select/select-group-heading.svelte +21 -0
- package/dist/components/admin-bar/ui/select/select-group-heading.svelte.d.ts +10 -0
- package/dist/components/admin-bar/ui/select/select-group.svelte +17 -0
- package/dist/components/admin-bar/ui/select/select-group.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/select/select-item.svelte +40 -0
- package/dist/components/admin-bar/ui/select/select-item.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/select/select-label.svelte +20 -0
- package/dist/components/admin-bar/ui/select/select-label.svelte.d.ts +6 -0
- package/dist/components/admin-bar/ui/select/select-portal.svelte +7 -0
- package/dist/components/admin-bar/ui/select/select-portal.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/select/select-scroll-down-button.svelte +23 -0
- package/dist/components/admin-bar/ui/select/select-scroll-down-button.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/select/select-scroll-up-button.svelte +23 -0
- package/dist/components/admin-bar/ui/select/select-scroll-up-button.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/select/select-separator.svelte +21 -0
- package/dist/components/admin-bar/ui/select/select-separator.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/select/select-trigger.svelte +31 -0
- package/dist/components/admin-bar/ui/select/select-trigger.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/select/select.svelte +11 -0
- package/dist/components/admin-bar/ui/select/select.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/separator/index.d.ts +2 -0
- package/dist/components/admin-bar/ui/separator/index.js +4 -0
- package/dist/components/admin-bar/ui/separator/separator.svelte +21 -0
- package/dist/components/admin-bar/ui/separator/separator.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/textarea/index.d.ts +3 -0
- package/dist/components/admin-bar/ui/textarea/index.js +3 -0
- package/dist/components/admin-bar/ui/textarea/textarea.svelte +21 -0
- package/dist/components/admin-bar/ui/textarea/textarea.svelte.d.ts +5 -0
- package/dist/components/admin-bar/user-avatar.svelte +29 -0
- package/dist/components/admin-bar/user-avatar.svelte.d.ts +7 -0
- package/dist/components/admin-bar/utils.d.ts +10 -0
- package/dist/components/admin-bar/utils.js +46 -0
- package/dist/components/admin-bar/variants.d.ts +20 -0
- package/dist/components/admin-bar/variants.js +14 -0
- package/dist/components/cms/cms-boolean.svelte +102 -0
- package/dist/components/cms/cms-boolean.svelte.d.ts +10 -0
- package/dist/components/cms/cms-date-time-editable.svelte +66 -0
- package/dist/components/cms/cms-date-time-editable.svelte.d.ts +11 -0
- package/dist/components/cms/cms-date-time.svelte +67 -0
- package/dist/components/cms/cms-date-time.svelte.d.ts +19 -0
- package/dist/components/cms/cms-entries.svelte +24 -0
- package/dist/components/cms/cms-entries.svelte.d.ts +31 -0
- package/dist/components/cms/cms-image-editable.svelte +439 -0
- package/dist/components/cms/cms-image-editable.svelte.d.ts +11 -0
- package/dist/components/cms/cms-image.svelte +78 -0
- package/dist/components/cms/cms-image.svelte.d.ts +18 -0
- package/dist/components/cms/cms-link-editable.svelte +429 -0
- package/dist/components/cms/cms-link-editable.svelte.d.ts +13 -0
- package/dist/components/cms/cms-link.svelte +92 -0
- package/dist/components/cms/cms-link.svelte.d.ts +25 -0
- package/dist/components/cms/cms-markdown-editable.svelte +74 -0
- package/dist/components/cms/cms-markdown-editable.svelte.d.ts +9 -0
- package/dist/components/cms/cms-markdown.svelte +56 -0
- package/dist/components/cms/cms-markdown.svelte.d.ts +10 -0
- package/dist/components/cms/cms-media-picker.svelte +150 -0
- package/dist/components/cms/cms-media-picker.svelte.d.ts +8 -0
- package/dist/components/cms/cms-number-editable.svelte +77 -0
- package/dist/components/cms/cms-number-editable.svelte.d.ts +13 -0
- package/dist/components/cms/cms-number.svelte +63 -0
- package/dist/components/cms/cms-number.svelte.d.ts +16 -0
- package/dist/components/cms/cms-repeater-editable.svelte +137 -0
- package/dist/components/cms/cms-repeater-editable.svelte.d.ts +31 -0
- package/dist/components/cms/cms-repeater.svelte +55 -0
- package/dist/components/cms/cms-repeater.svelte.d.ts +30 -0
- package/dist/components/cms/cms-rich-text-editable.svelte +101 -0
- package/dist/components/cms/cms-rich-text-editable.svelte.d.ts +9 -0
- package/dist/components/cms/cms-rich-text-toolbar.svelte +246 -0
- package/dist/components/cms/cms-rich-text-toolbar.svelte.d.ts +9 -0
- package/dist/components/cms/cms-rich-text.svelte +74 -0
- package/dist/components/cms/cms-rich-text.svelte.d.ts +10 -0
- package/dist/components/cms/cms-store.svelte.d.ts +294 -0
- package/dist/components/cms/cms-store.svelte.js +625 -0
- package/dist/components/cms/cms-text.svelte +131 -0
- package/dist/components/cms/cms-text.svelte.d.ts +11 -0
- package/dist/components/cms/index.d.ts +13 -0
- package/dist/components/cms/index.js +11 -0
- package/dist/components/cms/install-scope.svelte.d.ts +7 -0
- package/dist/components/cms/install-scope.svelte.js +33 -0
- package/dist/components/cms/locale-merge.d.ts +41 -0
- package/dist/components/cms/locale-merge.js +77 -0
- package/dist/components/cms/overlay-sync.d.ts +82 -0
- package/dist/components/cms/overlay-sync.js +76 -0
- package/dist/components/cms/path.d.ts +30 -0
- package/dist/components/cms/path.js +156 -0
- package/dist/components/cms/scope.d.ts +120 -0
- package/dist/components/cms/scope.js +23 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +28 -0
- package/dist/srv/README.md +341 -0
- package/dist/srv/api-adapter.d.ts +20 -0
- package/dist/srv/api-adapter.js +178 -0
- package/dist/srv/cms.d.ts +62 -0
- package/dist/srv/cms.js +35 -0
- package/dist/srv/index.d.ts +5 -0
- package/dist/srv/index.js +4 -0
- package/dist/srv/load-cms.d.ts +105 -0
- package/dist/srv/load-cms.js +227 -0
- package/dist/srv/mock-adapter.d.ts +96 -0
- package/dist/srv/mock-adapter.js +171 -0
- package/dist/srv/types.d.ts +114 -0
- package/dist/srv/types.js +1 -0
- package/package.json +116 -0
- package/plugin/README.md +137 -0
- package/plugin/dist/adapter.d.ts +35 -0
- package/plugin/dist/adapter.js +346 -0
- package/plugin/dist/adapter.js.map +1 -0
- package/plugin/dist/build-state.d.ts +10 -0
- package/plugin/dist/build-state.js +26 -0
- package/plugin/dist/build-state.js.map +1 -0
- package/plugin/dist/fallback-shim.js +194 -0
- package/plugin/dist/index.d.ts +56 -0
- package/plugin/dist/index.js +396 -0
- package/plugin/dist/index.js.map +1 -0
- package/plugin/dist/manifest.d.ts +76 -0
- package/plugin/dist/manifest.js +367 -0
- package/plugin/dist/manifest.js.map +1 -0
- package/plugin/dist/media.d.ts +36 -0
- package/plugin/dist/media.js +153 -0
- package/plugin/dist/media.js.map +1 -0
- package/plugin/dist/parse-svelte.d.ts +35 -0
- package/plugin/dist/parse-svelte.js +120 -0
- package/plugin/dist/parse-svelte.js.map +1 -0
- package/plugin/dist/route-tree.d.ts +27 -0
- package/plugin/dist/route-tree.js +69 -0
- package/plugin/dist/route-tree.js.map +1 -0
- package/plugin/dist/transforms.d.ts +42 -0
- package/plugin/dist/transforms.js +95 -0
- package/plugin/dist/transforms.js.map +1 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type Tree } from '../components/cms/path.ts';
|
|
2
|
+
import type { CmsAdapter, CmsAdapterTombstone } from './types.ts';
|
|
3
|
+
/**
|
|
4
|
+
* One page-kind entry: a specific (`routeId`, `params`) pair and its
|
|
5
|
+
* currently-published content. `routeId` is the SvelteKit route id (e.g.
|
|
6
|
+
* `/(marketing)/rooms/[slug]`); `params` is the bound values for that route's
|
|
7
|
+
* owned params (e.g. `{ slug: 'suite-1' }`). For static page routes (no owned
|
|
8
|
+
* params) `params` is `{}` and there's exactly one entry per route id.
|
|
9
|
+
*
|
|
10
|
+
* Pending edits live in releases (see `_store.ts`), not on the entry — saving
|
|
11
|
+
* a draft adds an item to the editor's open release rather than mutating the
|
|
12
|
+
* published content here.
|
|
13
|
+
*
|
|
14
|
+
* `tombstone`, when set, marks this entry as a published tombstone — the page
|
|
15
|
+
* was deleted with a non-404 outcome in a prior release. `published` is still
|
|
16
|
+
* required (for `findPageEntry` symmetry) but is ignored when `tombstone` is
|
|
17
|
+
* set; `fetchDocs` returns the tombstone instead of the doc.
|
|
18
|
+
*/
|
|
19
|
+
export type PageEntry = {
|
|
20
|
+
params: Record<string, string>;
|
|
21
|
+
published: Record<string, unknown>;
|
|
22
|
+
tombstone?: CmsAdapterTombstone;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* One pending change in an open release, snapshot for adapter overlay. Items
|
|
26
|
+
* with `kind: 'page'` carry `params`; layout items don't (layouts have no
|
|
27
|
+
* owned params). `kind: 'page-delete'` signals a staged page removal — in
|
|
28
|
+
* preview, the adapter emits the staged `outcome` (gone / redirect) when set,
|
|
29
|
+
* and otherwise suppresses the page so it appears removed (404 after publish).
|
|
30
|
+
* The `tree` is a partial tree that deep-merges over the published content.
|
|
31
|
+
*
|
|
32
|
+
* Each item carries its `locale`. A release in flight typically holds items
|
|
33
|
+
* across all locales the editor has touched; the adapter filters by the
|
|
34
|
+
* request's `locale` so only matching items overlay.
|
|
35
|
+
*/
|
|
36
|
+
export type ReleaseItemSnapshot = {
|
|
37
|
+
kind: 'page';
|
|
38
|
+
routeId: string;
|
|
39
|
+
params: Record<string, string>;
|
|
40
|
+
locale: string;
|
|
41
|
+
tree: Tree;
|
|
42
|
+
} | {
|
|
43
|
+
kind: 'layout';
|
|
44
|
+
routeId: string;
|
|
45
|
+
locale: string;
|
|
46
|
+
tree: Tree;
|
|
47
|
+
} | {
|
|
48
|
+
kind: 'page-delete';
|
|
49
|
+
routeId: string;
|
|
50
|
+
params: Record<string, string>;
|
|
51
|
+
locale: string;
|
|
52
|
+
outcome?: CmsAdapterTombstone;
|
|
53
|
+
};
|
|
54
|
+
export type ReleaseSnapshot = {
|
|
55
|
+
id: string;
|
|
56
|
+
items: ReleaseItemSnapshot[];
|
|
57
|
+
};
|
|
58
|
+
export type MockAdapterOptions = {
|
|
59
|
+
/**
|
|
60
|
+
* Layout docs keyed by `[locale][routeId]` (e.g. `en['/']`,
|
|
61
|
+
* `en['/(marketing)']`). Layouts have no owned params, so the inner
|
|
62
|
+
* `routeId` alone identifies a layout doc per locale.
|
|
63
|
+
*/
|
|
64
|
+
layoutDocs?: Record<string, Record<string, Record<string, unknown>>>;
|
|
65
|
+
/**
|
|
66
|
+
* Page docs keyed by `[locale][routeId]`, with one `PageEntry` per
|
|
67
|
+
* (`params`) combination per locale. Stores only currently-published
|
|
68
|
+
* content; missing-locale fallback to the default locale happens in
|
|
69
|
+
* `resolveCmsPayload`, not here.
|
|
70
|
+
*/
|
|
71
|
+
pageDocs?: Record<string, Record<string, PageEntry[]>>;
|
|
72
|
+
/**
|
|
73
|
+
* Look up an open release by its preview key. Called when a request
|
|
74
|
+
* carries `?preview=…` so adapter results overlay the matching release's
|
|
75
|
+
* pending edits onto published content.
|
|
76
|
+
*/
|
|
77
|
+
resolvePreview?: (previewKey: string) => ReleaseSnapshot | null | undefined;
|
|
78
|
+
};
|
|
79
|
+
/** Match a `PageEntry` whose `params` map equals the requested params. */
|
|
80
|
+
export declare const findPageEntry: (entries: PageEntry[] | undefined, params: Record<string, string>) => PageEntry | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* In-memory {@link CmsAdapter} useful for tests, demos, and local development
|
|
83
|
+
* before a real backend is wired up.
|
|
84
|
+
*
|
|
85
|
+
* Layout queries are looked up by `[locale][routeId]`; page queries by
|
|
86
|
+
* `[locale][routeId]` + exact `params` map. When `context.previewKey` is set
|
|
87
|
+
* and matches an open release (via `resolvePreview`), pending edits in that
|
|
88
|
+
* release whose `locale` matches the query's `locale` overlay the published
|
|
89
|
+
* content for any matching scope. Without a preview key, queries always
|
|
90
|
+
* return the published content for the requested locale.
|
|
91
|
+
*
|
|
92
|
+
* Default-locale fallback (when a value is missing in the requested locale)
|
|
93
|
+
* is handled by `resolveCmsPayload`, not here — the adapter only returns
|
|
94
|
+
* what's stored for the requested locale.
|
|
95
|
+
*/
|
|
96
|
+
export declare const mockAdapter: (options?: MockAdapterOptions) => CmsAdapter;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { mergeTree } from "../components/cms/path.js";
|
|
2
|
+
/** Match a `PageEntry` whose `params` map equals the requested params. */
|
|
3
|
+
export const findPageEntry = (entries, params) => {
|
|
4
|
+
if (!entries)
|
|
5
|
+
return undefined;
|
|
6
|
+
const keys = Object.keys(params);
|
|
7
|
+
for (const entry of entries) {
|
|
8
|
+
const entryKeys = Object.keys(entry.params);
|
|
9
|
+
if (entryKeys.length !== keys.length)
|
|
10
|
+
continue;
|
|
11
|
+
let match = true;
|
|
12
|
+
for (const k of keys) {
|
|
13
|
+
if (entry.params[k] !== params[k]) {
|
|
14
|
+
match = false;
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (match)
|
|
19
|
+
return entry;
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
};
|
|
23
|
+
const paramsEqual = (a, b) => {
|
|
24
|
+
const aKeys = Object.keys(a);
|
|
25
|
+
if (aKeys.length !== Object.keys(b).length)
|
|
26
|
+
return false;
|
|
27
|
+
for (const k of aKeys)
|
|
28
|
+
if (a[k] !== b[k])
|
|
29
|
+
return false;
|
|
30
|
+
return true;
|
|
31
|
+
};
|
|
32
|
+
const findReleaseItem = (snapshot, q) => {
|
|
33
|
+
for (const item of snapshot.items) {
|
|
34
|
+
if (item.locale !== q.locale)
|
|
35
|
+
continue;
|
|
36
|
+
if (q.kind === 'layout') {
|
|
37
|
+
if (item.kind === 'layout' && item.routeId === q.routeId)
|
|
38
|
+
return item;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
if (item.kind === 'layout')
|
|
42
|
+
continue;
|
|
43
|
+
if (item.routeId === q.routeId && paramsEqual(item.params, q.params)) {
|
|
44
|
+
return item;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
};
|
|
50
|
+
const findPageDelete = (snapshot, routeId, params, locale) => {
|
|
51
|
+
for (const item of snapshot.items) {
|
|
52
|
+
if (item.kind !== 'page-delete')
|
|
53
|
+
continue;
|
|
54
|
+
if (item.locale !== locale)
|
|
55
|
+
continue;
|
|
56
|
+
if (item.routeId === routeId && paramsEqual(item.params, params))
|
|
57
|
+
return item;
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
};
|
|
61
|
+
const applyOverlay = (base, item) => mergeTree(base ?? {}, item.tree);
|
|
62
|
+
/**
|
|
63
|
+
* In-memory {@link CmsAdapter} useful for tests, demos, and local development
|
|
64
|
+
* before a real backend is wired up.
|
|
65
|
+
*
|
|
66
|
+
* Layout queries are looked up by `[locale][routeId]`; page queries by
|
|
67
|
+
* `[locale][routeId]` + exact `params` map. When `context.previewKey` is set
|
|
68
|
+
* and matches an open release (via `resolvePreview`), pending edits in that
|
|
69
|
+
* release whose `locale` matches the query's `locale` overlay the published
|
|
70
|
+
* content for any matching scope. Without a preview key, queries always
|
|
71
|
+
* return the published content for the requested locale.
|
|
72
|
+
*
|
|
73
|
+
* Default-locale fallback (when a value is missing in the requested locale)
|
|
74
|
+
* is handled by `resolveCmsPayload`, not here — the adapter only returns
|
|
75
|
+
* what's stored for the requested locale.
|
|
76
|
+
*/
|
|
77
|
+
export const mockAdapter = (options = {}) => {
|
|
78
|
+
const layoutDocs = options.layoutDocs ?? {};
|
|
79
|
+
const pageDocs = options.pageDocs ?? {};
|
|
80
|
+
const resolvePreview = options.resolvePreview;
|
|
81
|
+
return {
|
|
82
|
+
fetchDocs(queries, context) {
|
|
83
|
+
const previewKey = context.previewKey;
|
|
84
|
+
const release = previewKey && resolvePreview ? resolvePreview(previewKey) : null;
|
|
85
|
+
const out = {};
|
|
86
|
+
for (const q of queries) {
|
|
87
|
+
let base;
|
|
88
|
+
let baseTombstone;
|
|
89
|
+
if (q.kind === 'page') {
|
|
90
|
+
const entry = findPageEntry(pageDocs[q.locale]?.[q.routeId], q.params);
|
|
91
|
+
base = entry?.published;
|
|
92
|
+
baseTombstone = entry?.tombstone;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
base = layoutDocs[q.locale]?.[q.routeId];
|
|
96
|
+
}
|
|
97
|
+
const pageDelete = release && q.kind === 'page'
|
|
98
|
+
? findPageDelete(release, q.routeId, q.params, q.locale)
|
|
99
|
+
: undefined;
|
|
100
|
+
if (pageDelete) {
|
|
101
|
+
if (pageDelete.outcome)
|
|
102
|
+
out[q.scopeId] = pageDelete.outcome;
|
|
103
|
+
// No outcome → suppress (404 in production after publish).
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const overlayItem = release ? findReleaseItem(release, q) : undefined;
|
|
107
|
+
if (overlayItem && overlayItem.kind !== 'page-delete') {
|
|
108
|
+
out[q.scopeId] = { contents: applyOverlay(base, overlayItem) };
|
|
109
|
+
}
|
|
110
|
+
else if (baseTombstone) {
|
|
111
|
+
out[q.scopeId] = baseTombstone;
|
|
112
|
+
}
|
|
113
|
+
else if (base) {
|
|
114
|
+
out[q.scopeId] = { contents: base };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
},
|
|
119
|
+
fetchEntries(routeId, context) {
|
|
120
|
+
const locale = context.locale;
|
|
121
|
+
const entries = pageDocs[locale]?.[routeId];
|
|
122
|
+
const previewKey = context.previewKey;
|
|
123
|
+
const release = previewKey && resolvePreview ? resolvePreview(previewKey) : null;
|
|
124
|
+
const out = [];
|
|
125
|
+
const metaOf = (tree) => {
|
|
126
|
+
const m = tree?.metadata;
|
|
127
|
+
return m && typeof m === 'object' && !Array.isArray(m)
|
|
128
|
+
? m
|
|
129
|
+
: {};
|
|
130
|
+
};
|
|
131
|
+
const tombstoneFlags = (t) => t.kind === 'redirect' ? { redirectTo: t.to } : { gone: true };
|
|
132
|
+
for (const e of entries ?? []) {
|
|
133
|
+
if (release) {
|
|
134
|
+
const pageDelete = findPageDelete(release, routeId, e.params, locale);
|
|
135
|
+
if (pageDelete) {
|
|
136
|
+
if (pageDelete.outcome) {
|
|
137
|
+
out.push({
|
|
138
|
+
params: { ...e.params },
|
|
139
|
+
metadata: metaOf(e.published),
|
|
140
|
+
...tombstoneFlags(pageDelete.outcome)
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// No outcome → drop from preview list (hard-delete in flight).
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (e.tombstone) {
|
|
148
|
+
out.push({
|
|
149
|
+
params: { ...e.params },
|
|
150
|
+
metadata: metaOf(e.published),
|
|
151
|
+
...tombstoneFlags(e.tombstone)
|
|
152
|
+
});
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
out.push({ params: { ...e.params }, metadata: metaOf(e.published) });
|
|
156
|
+
}
|
|
157
|
+
if (release) {
|
|
158
|
+
for (const item of release.items) {
|
|
159
|
+
if (item.kind !== 'page' || item.routeId !== routeId)
|
|
160
|
+
continue;
|
|
161
|
+
if (item.locale !== locale)
|
|
162
|
+
continue;
|
|
163
|
+
if (findPageEntry(entries, item.params))
|
|
164
|
+
continue;
|
|
165
|
+
out.push({ params: { ...item.params }, metadata: metaOf(item.tree) });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return out;
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { CmsEntry, CmsScopeEntry, SiteSchema } from '../components/cms/scope.ts';
|
|
2
|
+
export type { CmsEntry, SiteSchema };
|
|
3
|
+
/**
|
|
4
|
+
* One scope's request, expanded from the build-time manifest with the locale
|
|
5
|
+
* and any owned param values from the current SvelteKit request. Adapters
|
|
6
|
+
* receive arrays of these and translate them into backend reads.
|
|
7
|
+
*/
|
|
8
|
+
export type CmsScopeQuery = CmsScopeEntry & {
|
|
9
|
+
locale: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* One resolved document from an adapter. `contents` is the doc's tree —
|
|
13
|
+
* lodash-style paths walk into nested branches. Page-kind docs own a
|
|
14
|
+
* `metadata` branch that `loadCms` aliases as `cms.metadata`.
|
|
15
|
+
*/
|
|
16
|
+
export type CmsAdapterDoc = {
|
|
17
|
+
contents: Record<string, unknown>;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Tombstone for a page-kind scope: the page was deleted but the URL still
|
|
21
|
+
* resolves with non-404 semantics. `kind: 'gone'` means the page is
|
|
22
|
+
* deliberately permanently removed (HTTP 410); `kind: 'redirect'` means the
|
|
23
|
+
* page was replaced with a permanent redirect to `to` (HTTP 308). Layout
|
|
24
|
+
* scopes never resolve to a tombstone — only page-kind scopes do.
|
|
25
|
+
*/
|
|
26
|
+
export type CmsAdapterTombstone = {
|
|
27
|
+
kind: 'gone';
|
|
28
|
+
} | {
|
|
29
|
+
kind: 'redirect';
|
|
30
|
+
to: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* One resolution from an adapter for a single scope query: either the doc's
|
|
34
|
+
* tree (`CmsAdapterDoc`) or a tombstone signaling the page was deleted with
|
|
35
|
+
* a non-404 outcome. Discriminator: presence of `kind` on the value.
|
|
36
|
+
*/
|
|
37
|
+
export type CmsAdapterResolution = CmsAdapterDoc | CmsAdapterTombstone;
|
|
38
|
+
/**
|
|
39
|
+
* Per-request context handed to adapter methods alongside their queries.
|
|
40
|
+
* `fetch` is the SvelteKit request-scoped fetch, suitable for HTTP-backed
|
|
41
|
+
* adapters that need cookie forwarding during SSR. `previewKey`, when set,
|
|
42
|
+
* is the value of `?preview=…` from the request URL — adapters that support
|
|
43
|
+
* release previews use it to overlay an open release's pending edits onto
|
|
44
|
+
* published content. `versionKey`, when set, is the value of `?version=…` —
|
|
45
|
+
* adapters resolve it to a past published release and return that release's
|
|
46
|
+
* snapshot. Mutually exclusive with `previewKey`; when both are present
|
|
47
|
+
* `versionKey` wins.
|
|
48
|
+
*
|
|
49
|
+
* `locale` is the BCP-47 string bound at `loadCms(event, { locale })` time;
|
|
50
|
+
* `locales` is the full supported set from `createCms({ locales })`. The
|
|
51
|
+
* first entry of `locales` is the default locale used for read-time
|
|
52
|
+
* fallback. Adapters use `locale` to scope reads (`fetchEntries` doesn't
|
|
53
|
+
* take queries, so it relies on this); `fetchDocs` also gets per-query
|
|
54
|
+
* `locale` on each `CmsScopeQuery`.
|
|
55
|
+
*/
|
|
56
|
+
export type CmsAdapterContext = {
|
|
57
|
+
fetch: typeof fetch;
|
|
58
|
+
previewKey?: string | null;
|
|
59
|
+
versionKey?: string | null;
|
|
60
|
+
locale: string;
|
|
61
|
+
locales: string[];
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Backend-agnostic adapter. Implementations connect Vela CMS to a backing
|
|
65
|
+
* store (PocketBase, a flat-file mock, an in-memory table, …) and decide how
|
|
66
|
+
* scope queries map to documents.
|
|
67
|
+
*
|
|
68
|
+
* `fetchDocs` is called once per request with every applicable scope. May be
|
|
69
|
+
* sync or async. Page-kind docs own a `metadata` branch on their tree;
|
|
70
|
+
* `loadCms` aliases it as `cms.metadata` for the request without removing it
|
|
71
|
+
* from the doc — components can address `metadata.title` like any other path.
|
|
72
|
+
*/
|
|
73
|
+
export interface CmsAdapter {
|
|
74
|
+
/**
|
|
75
|
+
* URL prefix the frontend uses for client-side admin-bar fetches and that
|
|
76
|
+
* gets surfaced in `CmsPayload.endpoint`. HTTP-backed adapters set this to
|
|
77
|
+
* their base URL (e.g. `https://cms.example/v1/projects/p1/cms`); adapters
|
|
78
|
+
* with no remote (`mockAdapter`) leave it unset and the loader falls back
|
|
79
|
+
* to `'/api/cms'`.
|
|
80
|
+
*/
|
|
81
|
+
readonly endpoint?: string;
|
|
82
|
+
/**
|
|
83
|
+
* Resolve documents for every scope in `queries`. The result map is keyed
|
|
84
|
+
* by `query.scopeId`; missing entries are treated as "no document yet"
|
|
85
|
+
* and components fall back to their authored `fallback`. Adapters
|
|
86
|
+
* disambiguate page-kind documents using `routeId` + `params` from the
|
|
87
|
+
* query, never a pre-composed scope-key string. When `context.previewKey`
|
|
88
|
+
* is set, adapters that support release previews overlay the matching
|
|
89
|
+
* open release's pending field edits on top of published content before
|
|
90
|
+
* returning.
|
|
91
|
+
*
|
|
92
|
+
* Page-kind scopes may resolve to a {@link CmsAdapterTombstone} instead of
|
|
93
|
+
* a {@link CmsAdapterDoc} when the page has been deleted with a non-404
|
|
94
|
+
* outcome (gone / redirect). The resolver short-circuits the page render
|
|
95
|
+
* for tombstoned scopes; layout-kind scopes never tombstone.
|
|
96
|
+
*/
|
|
97
|
+
fetchDocs(queries: CmsScopeQuery[], context: CmsAdapterContext): Promise<Record<string, CmsAdapterResolution>> | Record<string, CmsAdapterResolution>;
|
|
98
|
+
/**
|
|
99
|
+
* Enumerate the publishable entries the adapter has at a given
|
|
100
|
+
* `routeId`. Each entry carries its bound owned `params` (for SvelteKit's
|
|
101
|
+
* prerender `entries()`) plus the doc's `metadata` branch (for index pages
|
|
102
|
+
* that render a list with titles).
|
|
103
|
+
*/
|
|
104
|
+
fetchEntries(routeId: string, context: CmsAdapterContext): Promise<CmsEntry[]> | CmsEntry[];
|
|
105
|
+
/**
|
|
106
|
+
* Resolve the project-wide site tree (branding, contact, social, …).
|
|
107
|
+
* Always one tree per project — no locale, no params. Preview-overlay
|
|
108
|
+
* support is identical to `fetchDocs`: when `context.previewKey` is set,
|
|
109
|
+
* adapters merge the open release's site item on top of the published
|
|
110
|
+
* tree. Optional — adapters that don't carry site state may omit this and
|
|
111
|
+
* the loader treats the project as having an empty site tree.
|
|
112
|
+
*/
|
|
113
|
+
fetchSite?(context: CmsAdapterContext): Promise<Record<string, unknown>> | Record<string, unknown>;
|
|
114
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@velastack/cms",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A scope-aware CMS for SvelteKit, for static or dynamic sites.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"svelte",
|
|
7
|
+
"sveltekit",
|
|
8
|
+
"cms",
|
|
9
|
+
"content",
|
|
10
|
+
"editing",
|
|
11
|
+
"vite-plugin",
|
|
12
|
+
"velastack"
|
|
13
|
+
],
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/velastack/cms.git"
|
|
18
|
+
},
|
|
19
|
+
"homepage": "https://github.com/velastack/cms#readme",
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://github.com/velastack/cms/issues"
|
|
22
|
+
},
|
|
23
|
+
"type": "module",
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": "^20.19.0 || >=22.12.0"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"dev": "vite dev",
|
|
29
|
+
"build": "vite build && npm run prepack",
|
|
30
|
+
"preview": "vite preview",
|
|
31
|
+
"prepare": "svelte-kit sync || echo ''",
|
|
32
|
+
"prepack": "svelte-kit sync && svelte-package && node scripts/build-plugin.js && node scripts/build-admin-bar-css.js && publint",
|
|
33
|
+
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
34
|
+
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
35
|
+
"lint": "prettier --check .",
|
|
36
|
+
"format": "prettier --write .",
|
|
37
|
+
"test:unit": "vitest",
|
|
38
|
+
"test": "npm run test:unit -- --run"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"!dist/**/*.test.*",
|
|
43
|
+
"!dist/**/*.spec.*",
|
|
44
|
+
"plugin/dist",
|
|
45
|
+
"!plugin/dist/**/*.test.*",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE"
|
|
48
|
+
],
|
|
49
|
+
"sideEffects": [
|
|
50
|
+
"**/*.css"
|
|
51
|
+
],
|
|
52
|
+
"svelte": "./dist/index.js",
|
|
53
|
+
"types": "./dist/index.d.ts",
|
|
54
|
+
"exports": {
|
|
55
|
+
".": {
|
|
56
|
+
"types": "./dist/index.d.ts",
|
|
57
|
+
"svelte": "./dist/index.js",
|
|
58
|
+
"default": "./dist/index.js"
|
|
59
|
+
},
|
|
60
|
+
"./srv": {
|
|
61
|
+
"types": "./dist/srv/index.d.ts",
|
|
62
|
+
"default": "./dist/srv/index.js"
|
|
63
|
+
},
|
|
64
|
+
"./vite": {
|
|
65
|
+
"types": "./plugin/dist/index.d.ts",
|
|
66
|
+
"default": "./plugin/dist/index.js"
|
|
67
|
+
},
|
|
68
|
+
"./adapter": {
|
|
69
|
+
"types": "./plugin/dist/adapter.d.ts",
|
|
70
|
+
"default": "./plugin/dist/adapter.js"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"peerDependencies": {
|
|
74
|
+
"@sveltejs/kit": "^2.0.0",
|
|
75
|
+
"marked": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
|
|
76
|
+
"svelte": "^5.0.0",
|
|
77
|
+
"vite": "^8.0.0"
|
|
78
|
+
},
|
|
79
|
+
"peerDependenciesMeta": {
|
|
80
|
+
"marked": {
|
|
81
|
+
"optional": true
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"devDependencies": {
|
|
85
|
+
"@internationalized/date": "^3.12.3",
|
|
86
|
+
"@sveltejs/adapter-auto": "^7.0.1",
|
|
87
|
+
"@sveltejs/kit": "^2.70.3",
|
|
88
|
+
"@sveltejs/package": "^2.5.8",
|
|
89
|
+
"@sveltejs/vite-plugin-svelte": "^7.3.0",
|
|
90
|
+
"@tailwindcss/cli": "^4.3.3",
|
|
91
|
+
"@tailwindcss/vite": "^4.3.3",
|
|
92
|
+
"@types/node": "^26.4.0",
|
|
93
|
+
"marked": "^18.0.11",
|
|
94
|
+
"prettier": "^3.9.6",
|
|
95
|
+
"prettier-plugin-svelte": "^4.1.1",
|
|
96
|
+
"publint": "^0.3.24",
|
|
97
|
+
"svelte": "^5.57.0",
|
|
98
|
+
"svelte-check": "^4.7.6",
|
|
99
|
+
"svelte-meta-tags": "^5.0.2",
|
|
100
|
+
"tailwindcss": "^4.3.3",
|
|
101
|
+
"tw-animate-css": "^1.4.0",
|
|
102
|
+
"typescript": "^6.0.3",
|
|
103
|
+
"vite": "^8.2.2",
|
|
104
|
+
"vitest": "^4.1.11"
|
|
105
|
+
},
|
|
106
|
+
"dependencies": {
|
|
107
|
+
"@sveltejs/adapter-static": "^3.0.10",
|
|
108
|
+
"@tiptap/core": "^3.30.6",
|
|
109
|
+
"@tiptap/extension-link": "^3.30.6",
|
|
110
|
+
"@tiptap/pm": "^3.30.6",
|
|
111
|
+
"@tiptap/starter-kit": "^3.30.6",
|
|
112
|
+
"bits-ui": "^2.19.0",
|
|
113
|
+
"devalue": "^5.9.2",
|
|
114
|
+
"tailwind-merge": "^3.6.0"
|
|
115
|
+
}
|
|
116
|
+
}
|
package/plugin/README.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# `@velastack/cms/vite` — Vite plugin
|
|
2
|
+
|
|
3
|
+
Build-time companion to [`@velastack/cms`](../README.md). Walks SvelteKit's `src/routes`
|
|
4
|
+
tree, scans every route file's static Svelte import graph, and exposes the
|
|
5
|
+
result as virtual modules that the runtime CMS components and AdminBar consume.
|
|
6
|
+
Also auto-injects two small bits of glue so authors don't repeat themselves at
|
|
7
|
+
every route.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
// vite.config.ts
|
|
13
|
+
import { defineConfig } from 'vite';
|
|
14
|
+
import { sveltekit } from '@sveltejs/kit/vite';
|
|
15
|
+
import { cms } from '@velastack/cms/vite';
|
|
16
|
+
|
|
17
|
+
export default defineConfig({
|
|
18
|
+
plugins: [cms(), sveltekit()]
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`cms()` should be registered **before** `sveltekit()`. The plugin sets
|
|
23
|
+
`enforce: 'pre'` so its `transform` hook runs before vite-plugin-svelte
|
|
24
|
+
compiles the route file.
|
|
25
|
+
|
|
26
|
+
## Options
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
type CmsPluginOptions = {
|
|
30
|
+
routesDir?: string; // default: 'src/routes' (relative to vite root)
|
|
31
|
+
libDir?: string; // default: 'src/lib'
|
|
32
|
+
components?: ExternalCmsComponentSpec[];
|
|
33
|
+
traverse?: (string | RegExp)[];
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
type ExternalCmsComponentSpec =
|
|
37
|
+
| { source: string; names: string[] } // bare specifier with named CMS exports
|
|
38
|
+
| { source: string; default: true }; // bare specifier whose default export is a CMS component
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- `routesDir` / `libDir` — only override if your project diverges from the
|
|
42
|
+
SvelteKit defaults.
|
|
43
|
+
- `components` — third-party CMS component packs the walker should recognize.
|
|
44
|
+
Auto-discovered for everything inside `<libDir>/components/cms/` and the
|
|
45
|
+
`@velastack/cms` package itself; use this for components installed from npm.
|
|
46
|
+
- `traverse` — bare specifiers whose `.svelte` files contain CMS usages but
|
|
47
|
+
aren't themselves CMS components (wrapper packages). Strings match
|
|
48
|
+
`source === pattern || source.startsWith(pattern + '/')`. Auto-populated with
|
|
49
|
+
every `components[].source`.
|
|
50
|
+
|
|
51
|
+
## Virtual modules
|
|
52
|
+
|
|
53
|
+
### `virtual:vela-cms/manifest`
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
import { cmsManifest } from 'virtual:vela-cms/manifest';
|
|
57
|
+
|
|
58
|
+
type CmsManifest = {
|
|
59
|
+
version: 1;
|
|
60
|
+
routes: Record<string, { scopes: CmsManifestScope[] }>;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
type CmsManifestScope = {
|
|
64
|
+
scopeId: string; // 'layout:/(marketing)' or 'page:/(marketing)/rooms/[slug]'
|
|
65
|
+
kind: 'layout' | 'page';
|
|
66
|
+
routeId: string; // route the scope is rooted at
|
|
67
|
+
ownedParams: string[]; // params introduced at this scope (deduped up-chain)
|
|
68
|
+
fields: string[]; // CMS field names referenced anywhere in the scope
|
|
69
|
+
metadata?: string[]; // page-only — editable metadata field names
|
|
70
|
+
};
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
One entry per route id whose chain ends in a `+page.svelte`. Each entry's
|
|
74
|
+
`scopes` array goes from root layout → leaf page; layouts that contribute
|
|
75
|
+
nothing are still included. `loadCms` consumes this map at request time.
|
|
76
|
+
|
|
77
|
+
### `virtual:vela-cms/pages`
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
import { pages } from 'virtual:vela-cms/pages';
|
|
81
|
+
// pages: Record<string, { routeId: string; /* …user definePage(...) config */ }>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Aggregates every `page.cms.ts` next to a `+page.svelte` (one per route).
|
|
85
|
+
Each entry is the `definePage(...)` config plus the auto-injected `routeId`.
|
|
86
|
+
The AdminBar reads this to know what's editable per page.
|
|
87
|
+
|
|
88
|
+
## Auto-injection
|
|
89
|
+
|
|
90
|
+
### Scope install in route `.svelte` files
|
|
91
|
+
|
|
92
|
+
For every `+layout.svelte` and `+page.svelte` whose route appears in the
|
|
93
|
+
manifest, the plugin prepends an `installCmsScope({...})` call into the
|
|
94
|
+
instance script (or creates one if absent). Authors never write
|
|
95
|
+
`setContext(CMS_SCOPE, ...)` manually.
|
|
96
|
+
|
|
97
|
+
### `routeId` into zero-arg `generateEntries()` calls
|
|
98
|
+
|
|
99
|
+
In any `+page.ts` or `+page.server.ts` that imports `generateEntries` (from
|
|
100
|
+
anywhere — typically `$lib/cms.ts`), zero-argument calls
|
|
101
|
+
`generateEntries()` are rewritten to `generateEntries('<routeId>')`. Calls
|
|
102
|
+
with any explicit argument are left alone — that's the documented opt-out.
|
|
103
|
+
|
|
104
|
+
## What gets walked
|
|
105
|
+
|
|
106
|
+
For each route entrypoint (`+page.svelte` or `+layout.svelte`), the plugin
|
|
107
|
+
parses with `svelte/compiler` and follows static imports of `.svelte` files.
|
|
108
|
+
Imports get classified as CMS components by:
|
|
109
|
+
|
|
110
|
+
1. **In-tree barrel** — anything from `<libDir>/components/cms/index.{ts,js}`.
|
|
111
|
+
Named imports are CMS components; default isn't.
|
|
112
|
+
2. **In-tree files** — `.svelte` files directly under `<libDir>/components/cms/`.
|
|
113
|
+
Default imports are CMS components.
|
|
114
|
+
3. **`@velastack/cms` package** — any import resolving inside the `@velastack/cms`
|
|
115
|
+
package itself (named exports, plus `.svelte` default imports).
|
|
116
|
+
4. **External `components` spec** — user-declared packs.
|
|
117
|
+
|
|
118
|
+
Component usages with a `name=<static>` prop are recorded as field
|
|
119
|
+
references; `value=<…>` opts the call out (it's a runtime override, not a
|
|
120
|
+
field). Dynamic `name={expr}` props are ignored.
|
|
121
|
+
|
|
122
|
+
## HMR
|
|
123
|
+
|
|
124
|
+
The plugin invalidates `virtual:vela-cms/manifest` and
|
|
125
|
+
`virtual:vela-cms/pages` (plus the per-`page.cms.ts` synthetic ids) when:
|
|
126
|
+
|
|
127
|
+
- a `.svelte` file already in the visited graph changes, or
|
|
128
|
+
- any file in `routesDir/` changes (route added/removed), or
|
|
129
|
+
- a `+page.ts` / `+page.server.ts` / `page.cms.ts` changes.
|
|
130
|
+
|
|
131
|
+
The walker re-runs lazily on the next `load` of the virtual module.
|
|
132
|
+
|
|
133
|
+
## Stability
|
|
134
|
+
|
|
135
|
+
Pre-1.0. The `CmsManifest` shape is part of the public surface; the
|
|
136
|
+
synthetic `page-cms-N` ids and the install-call code template are
|
|
137
|
+
internal implementation details and may change.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps `@sveltejs/adapter-static`. After the inner adapter writes prerendered
|
|
3
|
+
* pages, scans `builder.routes` for parameterized routes and emits a
|
|
4
|
+
* `__fallback.json` next to each parent URL directory. The fallback is built
|
|
5
|
+
* from a real prerendered `__data.json` for that route, with `cms.metadata`
|
|
6
|
+
* and `cms.docs[pageScope]` cleared and every `params[name]` replaced by
|
|
7
|
+
* `%name%`. The runtime can fetch the fallback when navigating to a CMS page
|
|
8
|
+
* that wasn't prerendered, then substitute the actual params client-side.
|
|
9
|
+
*
|
|
10
|
+
* @param {StaticAdapterOptions} [options]
|
|
11
|
+
*/
|
|
12
|
+
export default function adapter(options?: StaticAdapterOptions): {
|
|
13
|
+
name: string;
|
|
14
|
+
/** @param {import('@sveltejs/kit').Builder} builder */
|
|
15
|
+
adapt(builder: import("@sveltejs/kit").Builder): Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
export function parseRouteSegments(routeId: string): ParsedSegment[];
|
|
18
|
+
export function buildParamExtractor(segments: ParsedSegment[]): ((url: string) => Record<string, string> | null) | null;
|
|
19
|
+
export type StaticAdapterOptions = Parameters<typeof staticAdapter>[0];
|
|
20
|
+
export type ParsedSegment = {
|
|
21
|
+
kind: "static";
|
|
22
|
+
value: string;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "dynamic";
|
|
25
|
+
name: string;
|
|
26
|
+
} | {
|
|
27
|
+
kind: "rest";
|
|
28
|
+
name: string;
|
|
29
|
+
} | {
|
|
30
|
+
kind: "optional";
|
|
31
|
+
name: string;
|
|
32
|
+
} | {
|
|
33
|
+
kind: "unsupported";
|
|
34
|
+
};
|
|
35
|
+
import staticAdapter from '@sveltejs/adapter-static';
|