@jini-ai/admin 0.4.2 → 0.4.4
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/CHANGELOG.md +15 -0
- package/README.md +7 -0
- package/dist/agent-plugins/react/components/AgentPluginListPanel.d.ts +1 -1
- package/dist/agent-plugins/react/hooks/AgentPluginInspector.hooks.js +1 -1
- package/dist/agent-plugins/react/hooks/AgentPluginPanel.hooks.d.ts +1 -1
- package/dist/agent-plugins/react/hooks/AgentPluginsPage.hooks.d.ts +1 -1
- package/dist/agent-plugins/react/hooks/AgentPluginsPage.hooks.js +1 -1
- package/dist/agent-plugins/react/hooks/MarketplaceTab.hooks.d.ts +1 -1
- package/dist/agent-plugins/react/index.js +1 -1
- package/dist/agent-plugins/react/pages/AgentPluginsPage.d.ts +1 -1
- package/dist/agent-plugins/react/tabs/DownloadedTab.d.ts +1 -1
- package/dist/agent-plugins/react/tabs/InstalledTab.d.ts +1 -1
- package/dist/agent-plugins/react/tabs/MarketplaceTab.d.ts +1 -1
- package/dist/comments/adapters/http.d.ts +29 -0
- package/dist/comments/adapters/http.js +50 -0
- package/dist/comments/adapters/memory.d.ts +17 -0
- package/dist/comments/adapters/memory.js +61 -0
- package/dist/comments/comments.module.d.ts +73 -0
- package/dist/comments/comments.module.js +16 -0
- package/dist/comments/conformance/comments-api.conformance.d.ts +9 -0
- package/dist/comments/conformance/comments-api.conformance.js +63 -0
- package/dist/comments/controllers/comment-queue.controller.d.ts +48 -0
- package/dist/comments/controllers/comment-queue.controller.js +164 -0
- package/dist/comments/controllers/comment-settings.controller.d.ts +32 -0
- package/dist/comments/controllers/comment-settings.controller.js +77 -0
- package/dist/comments/controllers/comments.controller.d.ts +16 -0
- package/dist/comments/controllers/comments.controller.js +16 -0
- package/dist/comments/index.d.ts +13 -0
- package/dist/comments/index.js +8 -0
- package/dist/comments/messages.en.d.ts +54 -0
- package/dist/comments/messages.en.js +56 -0
- package/dist/comments/models.d.ts +22 -0
- package/dist/comments/models.js +2 -0
- package/dist/comments/ports.d.ts +14 -0
- package/dist/comments/ports.js +5 -0
- package/dist/comments/react/components/QueueSection.d.ts +30 -0
- package/dist/comments/react/components/QueueSection.js +57 -0
- package/dist/comments/react/components/SettingsSection.d.ts +14 -0
- package/dist/comments/react/components/SettingsSection.js +23 -0
- package/dist/comments/react/hooks/CommentsPage.hooks.d.ts +9 -0
- package/dist/comments/react/hooks/CommentsPage.hooks.js +10 -0
- package/dist/comments/react/hooks/CommentsPorts.hooks.d.ts +13 -0
- package/dist/comments/react/hooks/CommentsPorts.hooks.js +15 -0
- package/dist/comments/react/hooks/QueueSection.hooks.d.ts +62 -0
- package/dist/comments/react/hooks/QueueSection.hooks.js +57 -0
- package/dist/comments/react/hooks/SettingsSection.hooks.d.ts +12 -0
- package/dist/comments/react/hooks/SettingsSection.hooks.js +21 -0
- package/dist/comments/react/hooks/use-comment-queue.hooks.d.ts +34 -0
- package/dist/comments/react/hooks/use-comment-queue.hooks.js +47 -0
- package/dist/comments/react/hooks/use-comment-settings.hooks.d.ts +22 -0
- package/dist/comments/react/hooks/use-comment-settings.hooks.js +30 -0
- package/dist/comments/react/hooks/use-comments.hooks.d.ts +15 -0
- package/dist/comments/react/hooks/use-comments.hooks.js +20 -0
- package/dist/comments/react/index.d.ts +316 -0
- package/dist/comments/react/index.js +35 -0
- package/dist/comments/react/pages/CommentsPage.d.ts +12 -0
- package/dist/comments/react/pages/CommentsPage.js +15 -0
- package/dist/comments/rules.d.ts +140 -0
- package/dist/comments/rules.js +199 -0
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.js +1 -0
- package/dist/core/ledger-slice.d.ts +90 -0
- package/dist/core/ledger-slice.js +81 -0
- package/dist/core/ports/comments.d.ts +2 -0
- package/dist/core/ports/forms.d.ts +19 -7
- package/dist/core/ports/forms.js +4 -4
- package/dist/core/ports/index.d.ts +1 -1
- package/dist/core/ports/seo.d.ts +33 -6
- package/dist/core/react/bind-react.d.ts +46 -0
- package/dist/core/react/bind-react.js +28 -0
- package/dist/core/react/index.d.ts +3 -0
- package/dist/core/react/index.js +3 -0
- package/dist/core/react/use-controller.d.ts +16 -0
- package/dist/core/react/use-controller.js +18 -0
- package/dist/forms/adapters/http.d.ts +26 -0
- package/dist/forms/adapters/http.js +43 -0
- package/dist/forms/adapters/memory.d.ts +14 -0
- package/dist/forms/adapters/memory.js +77 -0
- package/dist/forms/conformance/forms-api.conformance.d.ts +17 -0
- package/dist/forms/conformance/forms-api.conformance.js +71 -0
- package/dist/forms/controllers/draft-store.d.ts +18 -0
- package/dist/forms/controllers/draft-store.js +17 -0
- package/dist/forms/controllers/field-attributes-dialog.controller.d.ts +37 -0
- package/dist/forms/controllers/field-attributes-dialog.controller.js +27 -0
- package/dist/forms/controllers/form-editor.controller.d.ts +36 -0
- package/dist/forms/controllers/form-editor.controller.js +22 -0
- package/dist/forms/controllers/form-fields-editor.controller.d.ts +20 -0
- package/dist/forms/controllers/form-fields-editor.controller.js +10 -0
- package/dist/forms/controllers/form-submission-detail.controller.d.ts +20 -0
- package/dist/forms/controllers/form-submission-detail.controller.js +10 -0
- package/dist/forms/controllers/form-submissions.controller.d.ts +25 -0
- package/dist/forms/controllers/form-submissions.controller.js +10 -0
- package/dist/forms/controllers/forms-list.controller.d.ts +22 -0
- package/dist/forms/controllers/forms-list.controller.js +10 -0
- package/dist/forms/forms.module.d.ts +138 -0
- package/dist/forms/forms.module.js +17 -0
- package/dist/forms/html-rules.d.ts +34 -0
- package/dist/forms/html-rules.js +34 -0
- package/dist/forms/index.d.ts +14 -0
- package/dist/forms/index.js +12 -0
- package/dist/forms/messages.en.d.ts +101 -0
- package/dist/forms/messages.en.js +105 -0
- package/dist/forms/models.d.ts +29 -0
- package/dist/forms/models.js +8 -0
- package/dist/forms/ports.d.ts +26 -0
- package/dist/forms/ports.js +6 -0
- package/dist/forms/react/components/FieldAttributesDialog.d.ts +14 -0
- package/dist/forms/react/components/FieldAttributesDialog.js +47 -0
- package/dist/forms/react/components/FormEditorFieldsBody.d.ts +28 -0
- package/dist/forms/react/components/FormEditorFieldsBody.js +24 -0
- package/dist/forms/react/components/FormEditorHeaderText.d.ts +7 -0
- package/dist/forms/react/components/FormEditorHeaderText.js +8 -0
- package/dist/forms/react/components/FormEditorMainPanel.d.ts +12 -0
- package/dist/forms/react/components/FormEditorMainPanel.js +13 -0
- package/dist/forms/react/components/FormEditorTabStrip.d.ts +13 -0
- package/dist/forms/react/components/FormEditorTabStrip.js +14 -0
- package/dist/forms/react/components/FormFieldsEditor.d.ts +13 -0
- package/dist/forms/react/components/FormFieldsEditor.js +39 -0
- package/dist/forms/react/components/FormSubmissionDate.d.ts +8 -0
- package/dist/forms/react/components/FormSubmissionDate.js +5 -0
- package/dist/forms/react/components/FormSubmissionDetail.d.ts +15 -0
- package/dist/forms/react/components/FormSubmissionDetail.js +30 -0
- package/dist/forms/react/components/FormSubmissions.d.ts +12 -0
- package/dist/forms/react/components/FormSubmissions.js +46 -0
- package/dist/forms/react/hooks/FormsPorts.hooks.d.ts +41 -0
- package/dist/forms/react/hooks/FormsPorts.hooks.js +16 -0
- package/dist/forms/react/hooks/forms-view.hooks.d.ts +117 -0
- package/dist/forms/react/hooks/forms-view.hooks.js +78 -0
- package/dist/forms/react/hooks/use-field-attributes-dialog.hooks.d.ts +31 -0
- package/dist/forms/react/hooks/use-field-attributes-dialog.hooks.js +22 -0
- package/dist/forms/react/hooks/use-form-editor.hooks.d.ts +118 -0
- package/dist/forms/react/hooks/use-form-editor.hooks.js +208 -0
- package/dist/forms/react/hooks/use-form-fields-editor.hooks.d.ts +34 -0
- package/dist/forms/react/hooks/use-form-fields-editor.hooks.js +36 -0
- package/dist/forms/react/hooks/use-form-submission-date.hooks.d.ts +12 -0
- package/dist/forms/react/hooks/use-form-submission-date.hooks.js +9 -0
- package/dist/forms/react/hooks/use-form-submission-detail.hooks.d.ts +68 -0
- package/dist/forms/react/hooks/use-form-submission-detail.hooks.js +81 -0
- package/dist/forms/react/hooks/use-form-submissions.hooks.d.ts +67 -0
- package/dist/forms/react/hooks/use-form-submissions.hooks.js +110 -0
- package/dist/forms/react/hooks/use-forms-list.hooks.d.ts +78 -0
- package/dist/forms/react/hooks/use-forms-list.hooks.js +103 -0
- package/dist/forms/react/index.d.ts +452 -0
- package/dist/forms/react/index.js +35 -0
- package/dist/forms/react/pages/FormEditor.d.ts +19 -0
- package/dist/forms/react/pages/FormEditor.js +40 -0
- package/dist/forms/react/pages/FormsList.d.ts +39 -0
- package/dist/forms/react/pages/FormsList.js +50 -0
- package/dist/forms/rules.d.ts +291 -0
- package/dist/forms/rules.js +338 -0
- package/dist/media/react/hooks/EditMediaPanel.hooks.js +1 -1
- package/dist/media/react/hooks/LibraryTab.hooks.d.ts +1 -1
- package/dist/media/react/hooks/LibraryTab.hooks.js +1 -1
- package/dist/media/react/hooks/MediaCard.hooks.js +6 -20
- package/dist/media/react/hooks/MediaGrid.hooks.d.ts +2 -2
- package/dist/media/react/hooks/MediaPage.hooks.d.ts +1 -1
- package/dist/media/react/hooks/MediaPage.hooks.js +1 -1
- package/dist/media/react/hooks/MediaPicker.hooks.js +1 -1
- package/dist/media/react/index.js +1 -1
- package/dist/media/react/tabs/LibraryTab.d.ts +1 -1
- package/dist/media/react/tabs/ProvidersTab.d.ts +1 -1
- package/dist/playground/react/components/Canvas.d.ts +1 -1
- package/dist/playground/react/hooks/Canvas.hooks.d.ts +1 -1
- package/dist/playground/react/hooks/Canvas.hooks.js +1 -1
- package/dist/playground/react/hooks/PlaygroundPage.hooks.d.ts +1 -1
- package/dist/playground/react/index.js +1 -1
- package/dist/playground/react/pages/PlaygroundPage.d.ts +1 -1
- package/dist/playground/react/tabs/CanvasTab.d.ts +1 -1
- package/dist/react/bind-react.d.ts +1 -45
- package/dist/react/bind-react.js +2 -27
- package/dist/react/components/ConfirmDialog/ConfirmDialog.d.ts +22 -5
- package/dist/react/components/ConfirmDialog/ConfirmDialog.hooks.d.ts +2 -2
- package/dist/react/components/ConfirmDialog/ConfirmDialog.hooks.js +17 -55
- package/dist/react/components/ConfirmDialog/ConfirmDialog.js +33 -70
- package/dist/react/components/RowMenu/RowMenu.hooks.js +14 -3
- package/dist/react/use-controller.d.ts +1 -15
- package/dist/react/use-controller.js +2 -17
- package/dist/redirects/adapters/http.d.ts +20 -0
- package/dist/redirects/adapters/http.js +31 -0
- package/dist/redirects/adapters/memory.d.ts +13 -0
- package/dist/redirects/adapters/memory.js +83 -0
- package/dist/redirects/conformance/redirects-api.conformance.d.ts +12 -0
- package/dist/redirects/conformance/redirects-api.conformance.js +66 -0
- package/dist/redirects/controllers/hit-count.controller.d.ts +14 -0
- package/dist/redirects/controllers/hit-count.controller.js +10 -0
- package/dist/redirects/controllers/import-redirects.controller.d.ts +28 -0
- package/dist/redirects/controllers/import-redirects.controller.js +29 -0
- package/dist/redirects/controllers/redirects.controller.d.ts +37 -0
- package/dist/redirects/controllers/redirects.controller.js +38 -0
- package/dist/redirects/index.d.ts +11 -0
- package/dist/redirects/index.js +10 -0
- package/dist/redirects/messages.en.d.ts +58 -0
- package/dist/redirects/messages.en.js +60 -0
- package/dist/redirects/models.d.ts +14 -0
- package/dist/redirects/models.js +2 -0
- package/dist/redirects/ports.d.ts +9 -0
- package/dist/redirects/ports.js +4 -0
- package/dist/redirects/react/components/HitCountCell.d.ts +19 -0
- package/dist/redirects/react/components/HitCountCell.js +19 -0
- package/dist/redirects/react/components/ImportRedirectsForm.d.ts +17 -0
- package/dist/redirects/react/components/ImportRedirectsForm.js +12 -0
- package/dist/redirects/react/hooks/RedirectsOptions.hooks.d.ts +27 -0
- package/dist/redirects/react/hooks/RedirectsOptions.hooks.js +15 -0
- package/dist/redirects/react/hooks/RedirectsPage.hooks.d.ts +50 -0
- package/dist/redirects/react/hooks/RedirectsPage.hooks.js +30 -0
- package/dist/redirects/react/hooks/RedirectsPorts.hooks.d.ts +10 -0
- package/dist/redirects/react/hooks/RedirectsPorts.hooks.js +11 -0
- package/dist/redirects/react/hooks/use-hit-count-cell.hooks.d.ts +19 -0
- package/dist/redirects/react/hooks/use-hit-count-cell.hooks.js +15 -0
- package/dist/redirects/react/hooks/use-import-redirects-form.hooks.d.ts +21 -0
- package/dist/redirects/react/hooks/use-import-redirects-form.hooks.js +25 -0
- package/dist/redirects/react/hooks/use-redirects.hooks.d.ts +34 -0
- package/dist/redirects/react/hooks/use-redirects.hooks.js +63 -0
- package/dist/redirects/react/hooks/wired.hooks.d.ts +55 -0
- package/dist/redirects/react/hooks/wired.hooks.js +31 -0
- package/dist/redirects/react/index.d.ts +324 -0
- package/dist/redirects/react/index.js +28 -0
- package/dist/redirects/react/pages/RedirectsPage.d.ts +15 -0
- package/dist/redirects/react/pages/RedirectsPage.js +20 -0
- package/dist/redirects/redirects.module.d.ts +77 -0
- package/dist/redirects/redirects.module.js +13 -0
- package/dist/redirects/rules.d.ts +131 -0
- package/dist/redirects/rules.js +134 -0
- package/dist/security/react/hooks/AccessTokensTab.hooks.d.ts +1 -1
- package/dist/security/react/hooks/AccessTokensTab.hooks.js +1 -1
- package/dist/security/react/hooks/RootKeyTab.hooks.d.ts +1 -1
- package/dist/security/react/hooks/RootKeyTab.hooks.js +1 -1
- package/dist/security/react/hooks/SecurityPage.hooks.d.ts +1 -1
- package/dist/security/react/index.js +1 -1
- package/dist/security/react/pages/SecurityPage.d.ts +1 -1
- package/dist/security/react/tabs/AccessTokensTab.d.ts +1 -1
- package/dist/security/react/tabs/RootKeyTab.d.ts +1 -1
- package/dist/seo/adapters/http.d.ts +31 -0
- package/dist/seo/adapters/http.js +37 -0
- package/dist/seo/adapters/memory.d.ts +28 -0
- package/dist/seo/adapters/memory.js +129 -0
- package/dist/seo/conformance/seo-api.conformance.d.ts +8 -0
- package/dist/seo/conformance/seo-api.conformance.js +44 -0
- package/dist/seo/controllers/entry-picker.controller.d.ts +21 -0
- package/dist/seo/controllers/entry-picker.controller.js +17 -0
- package/dist/seo/controllers/entry-section.controller.d.ts +20 -0
- package/dist/seo/controllers/entry-section.controller.js +7 -0
- package/dist/seo/controllers/media-ref.controller.d.ts +26 -0
- package/dist/seo/controllers/media-ref.controller.js +14 -0
- package/dist/seo/controllers/seo-entry.controller.d.ts +31 -0
- package/dist/seo/controllers/seo-entry.controller.js +52 -0
- package/dist/seo/controllers/seo.controller.d.ts +29 -0
- package/dist/seo/controllers/seo.controller.js +50 -0
- package/dist/seo/controllers/sitemap.controller.d.ts +25 -0
- package/dist/seo/controllers/sitemap.controller.js +27 -0
- package/dist/seo/index.d.ts +14 -0
- package/dist/seo/index.js +12 -0
- package/dist/seo/messages.en.d.ts +79 -0
- package/dist/seo/messages.en.js +79 -0
- package/dist/seo/models.d.ts +179 -0
- package/dist/seo/models.js +8 -0
- package/dist/seo/ports.d.ts +11 -0
- package/dist/seo/ports.js +4 -0
- package/dist/seo/react/components/MediaPickerBridge.d.ts +4 -0
- package/dist/seo/react/components/MediaPickerBridge.js +8 -0
- package/dist/seo/react/components/MediaRefField.d.ts +40 -0
- package/dist/seo/react/components/MediaRefField.js +12 -0
- package/dist/seo/react/components/SeoIcons.d.ts +13 -0
- package/dist/seo/react/components/SeoIcons.js +32 -0
- package/dist/seo/react/components/SitemapModal.d.ts +48 -0
- package/dist/seo/react/components/SitemapModal.js +72 -0
- package/dist/seo/react/hooks/MediaPickerBridge.hooks.d.ts +6 -0
- package/dist/seo/react/hooks/MediaPickerBridge.hooks.js +27 -0
- package/dist/seo/react/hooks/MediaRefField.hooks.d.ts +25 -0
- package/dist/seo/react/hooks/MediaRefField.hooks.js +30 -0
- package/dist/seo/react/hooks/SeoModuleTabs.d.ts +14 -0
- package/dist/seo/react/hooks/SeoModuleTabs.js +18 -0
- package/dist/seo/react/hooks/SeoPage.hooks.d.ts +69 -0
- package/dist/seo/react/hooks/SeoPage.hooks.js +37 -0
- package/dist/seo/react/hooks/SeoPorts.hooks.d.ts +19 -0
- package/dist/seo/react/hooks/SeoPorts.hooks.js +22 -0
- package/dist/seo/react/hooks/SitemapModal.hooks.d.ts +26 -0
- package/dist/seo/react/hooks/SitemapModal.hooks.js +20 -0
- package/dist/seo/react/hooks/use-entry-picker.hooks.d.ts +11 -0
- package/dist/seo/react/hooks/use-entry-picker.hooks.js +20 -0
- package/dist/seo/react/hooks/use-seo-entry-panel.hooks.d.ts +14 -0
- package/dist/seo/react/hooks/use-seo-entry-panel.hooks.js +26 -0
- package/dist/seo/react/hooks/use-seo-entry-section.hooks.d.ts +4 -0
- package/dist/seo/react/hooks/use-seo-entry-section.hooks.js +7 -0
- package/dist/seo/react/hooks/use-seo.hooks.d.ts +11 -0
- package/dist/seo/react/hooks/use-seo.hooks.js +29 -0
- package/dist/seo/react/hooks/use-sitemap-modal.hooks.d.ts +10 -0
- package/dist/seo/react/hooks/use-sitemap-modal.hooks.js +18 -0
- package/dist/seo/react/index.d.ts +369 -0
- package/dist/seo/react/index.js +30 -0
- package/dist/seo/react/options.d.ts +26 -0
- package/dist/seo/react/options.js +2 -0
- package/dist/seo/react/pages/SeoPage.d.ts +161 -0
- package/dist/seo/react/pages/SeoPage.js +215 -0
- package/dist/seo/rules.d.ts +142 -0
- package/dist/seo/rules.js +220 -0
- package/dist/seo/seo.module.d.ts +115 -0
- package/dist/seo/seo.module.js +14 -0
- package/dist/source-control/react/hooks/ProvidersTab.hooks.d.ts +1 -1
- package/dist/source-control/react/hooks/ProvidersTab.hooks.js +1 -1
- package/dist/source-control/react/hooks/SourceControlPage.hooks.d.ts +1 -1
- package/dist/source-control/react/index.js +1 -1
- package/dist/source-control/react/pages/SourceControlPage.d.ts +1 -1
- package/dist/source-control/react/tabs/ProvidersTab.d.ts +1 -1
- package/dist/widgets/adapters/http.d.ts +19 -0
- package/dist/widgets/adapters/http.js +33 -0
- package/dist/widgets/adapters/memory.d.ts +22 -0
- package/dist/widgets/adapters/memory.js +93 -0
- package/dist/widgets/conformance/widgets-api.conformance.d.ts +6 -0
- package/dist/widgets/conformance/widgets-api.conformance.js +55 -0
- package/dist/widgets/controllers/instance-editor.controller.d.ts +49 -0
- package/dist/widgets/controllers/instance-editor.controller.js +87 -0
- package/dist/widgets/controllers/library.controller.d.ts +33 -0
- package/dist/widgets/controllers/library.controller.js +53 -0
- package/dist/widgets/controllers/region-editor.controller.d.ts +42 -0
- package/dist/widgets/controllers/region-editor.controller.js +69 -0
- package/dist/widgets/controllers/regions.controller.d.ts +27 -0
- package/dist/widgets/controllers/regions.controller.js +44 -0
- package/dist/widgets/index.d.ts +11 -0
- package/dist/widgets/index.js +9 -0
- package/dist/widgets/messages.en.d.ts +78 -0
- package/dist/widgets/messages.en.js +83 -0
- package/dist/widgets/models.d.ts +62 -0
- package/dist/widgets/models.js +2 -0
- package/dist/widgets/ports.d.ts +79 -0
- package/dist/widgets/ports.js +5 -0
- package/dist/widgets/react/components/WidgetInstanceNotices.d.ts +14 -0
- package/dist/widgets/react/components/WidgetInstanceNotices.js +25 -0
- package/dist/widgets/react/components/WidgetRegionEditorHeaderActions.d.ts +22 -0
- package/dist/widgets/react/components/WidgetRegionEditorHeaderActions.js +18 -0
- package/dist/widgets/react/components/WidgetsLibraryNotices.d.ts +13 -0
- package/dist/widgets/react/components/WidgetsLibraryNotices.js +10 -0
- package/dist/widgets/react/hooks/WidgetsPorts.hooks.d.ts +270 -0
- package/dist/widgets/react/hooks/WidgetsPorts.hooks.js +17 -0
- package/dist/widgets/react/hooks/navigation.hooks.d.ts +9 -0
- package/dist/widgets/react/hooks/navigation.hooks.js +6 -0
- package/dist/widgets/react/hooks/page-views.hooks.d.ts +87 -0
- package/dist/widgets/react/hooks/page-views.hooks.js +30 -0
- package/dist/widgets/react/hooks/use-widget-instance-editor.hooks.d.ts +56 -0
- package/dist/widgets/react/hooks/use-widget-instance-editor.hooks.js +38 -0
- package/dist/widgets/react/hooks/use-widget-region-editor.hooks.d.ts +32 -0
- package/dist/widgets/react/hooks/use-widget-region-editor.hooks.js +22 -0
- package/dist/widgets/react/hooks/use-widget-regions.hooks.d.ts +23 -0
- package/dist/widgets/react/hooks/use-widget-regions.hooks.js +22 -0
- package/dist/widgets/react/hooks/use-widgets-library.hooks.d.ts +37 -0
- package/dist/widgets/react/hooks/use-widgets-library.hooks.js +23 -0
- package/dist/widgets/react/index.d.ts +391 -0
- package/dist/widgets/react/index.js +31 -0
- package/dist/widgets/react/pages/WidgetInstanceEditor.d.ts +23 -0
- package/dist/widgets/react/pages/WidgetInstanceEditor.js +37 -0
- package/dist/widgets/react/pages/WidgetRegionEditor.d.ts +22 -0
- package/dist/widgets/react/pages/WidgetRegionEditor.js +25 -0
- package/dist/widgets/react/pages/WidgetRegions.d.ts +21 -0
- package/dist/widgets/react/pages/WidgetRegions.js +31 -0
- package/dist/widgets/react/pages/WidgetsLibrary.d.ts +24 -0
- package/dist/widgets/react/pages/WidgetsLibrary.js +61 -0
- package/dist/widgets/rules.d.ts +94 -0
- package/dist/widgets/rules.js +83 -0
- package/dist/widgets/widgets.module.d.ts +122 -0
- package/dist/widgets/widgets.module.js +21 -0
- package/package.json +206 -9
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AdminSeoPort } from '../ports.js';
|
|
2
|
+
/** Destructive framework-free checklist; use an isolated seed containing the requested entry. */
|
|
3
|
+
export declare function runSeoApiConformance({ api }: {
|
|
4
|
+
api: AdminSeoPort;
|
|
5
|
+
}, { entryId }?: {
|
|
6
|
+
entryId?: string;
|
|
7
|
+
}): Promise<readonly string[]>;
|
|
8
|
+
//# sourceMappingURL=seo-api.conformance.d.ts.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Destructive framework-free checklist; use an isolated seed containing the requested entry. */
|
|
2
|
+
export async function runSeoApiConformance({ api }, { entryId = 'conformance-entry' } = {}) {
|
|
3
|
+
const checks = [];
|
|
4
|
+
function assert(condition, name) {
|
|
5
|
+
if (!condition)
|
|
6
|
+
throw new Error(`SEO API conformance: ${name}`);
|
|
7
|
+
checks.push(name);
|
|
8
|
+
}
|
|
9
|
+
const before = await api.getSeoSettings({});
|
|
10
|
+
const original = await api.getSeoEntry({ entryId });
|
|
11
|
+
const saved = await api.putSeoSettings({}, { defaultDescription: 'conformance-description' });
|
|
12
|
+
assert(saved.defaultDescription === 'conformance-description', 'settings write returns saved value');
|
|
13
|
+
const merged = await api.putSeoSettings({}, { twitterSite: '@conformance' });
|
|
14
|
+
assert(merged.defaultDescription === saved.defaultDescription, 'omitted default survives merge');
|
|
15
|
+
const cleared = await api.putSeoSettings({}, { defaultDescription: null });
|
|
16
|
+
assert(cleared.defaultDescription === undefined, 'null default clears to absent');
|
|
17
|
+
assert(before.defaultDescription !== 'conformance-description', 'settings snapshots remain unchanged');
|
|
18
|
+
await api.putSeoSettings({}, { ...before, defaultDescription: before.defaultDescription ?? null, defaultOgImage: before.defaultOgImage ?? null, twitterSite: before.twitterSite ?? null });
|
|
19
|
+
const changed = await api.putSeoEntry({ entryId }, { title: 'Conformance title', noindex: true });
|
|
20
|
+
assert(changed.title === 'Conformance title' && changed.robots.noindex, 'entry patch returns effective meta');
|
|
21
|
+
const retained = await api.putSeoEntry({ entryId }, { description: 'Conformance description' });
|
|
22
|
+
assert(retained.title === 'Conformance title', 'entry omission preserves previous overrides');
|
|
23
|
+
const reset = await api.putSeoEntry({ entryId }, { title: null, description: null, noindex: null });
|
|
24
|
+
assert(reset.title === original.title, 'null entry override restores fallback');
|
|
25
|
+
assert(original.title !== 'Conformance title', 'entry snapshots remain unchanged');
|
|
26
|
+
const analysis = await api.analyzeSeoEntry({ entryId });
|
|
27
|
+
assert(analysis.entryId === entryId && Array.isArray(analysis.issues), 'analysis returns entry issues');
|
|
28
|
+
assert((await api.regenerateSeoSitemap({})).accepted, 'regeneration accepts request');
|
|
29
|
+
assert(Array.isArray(await api.listSeoPosts({})) && Array.isArray(await api.listSeoPages({})), 'entry choices remain arrays');
|
|
30
|
+
assert(typeof (await api.fetchSitemapXml({})).text === 'string', 'sitemap returns exact text');
|
|
31
|
+
assert(typeof api.mediaOriginalUrl({ id: 'conformance-asset' }) === 'string', 'preview URL is synchronous');
|
|
32
|
+
const abort = new AbortController();
|
|
33
|
+
abort.abort();
|
|
34
|
+
let rejected = false;
|
|
35
|
+
try {
|
|
36
|
+
await api.fetchSitemapXml({}, { signal: abort.signal });
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
rejected = true;
|
|
40
|
+
}
|
|
41
|
+
assert(rejected, 'aborted sitemap request rejects');
|
|
42
|
+
return checks;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=seo-api.conformance.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AdminSeoPort } from '../ports.js';
|
|
2
|
+
import type { EntryPickerController, SeoTranslator, SeoErrorFormatter } from '../models.js';
|
|
3
|
+
/** Two existing reads, combined posts first then pages; no new content repository. */
|
|
4
|
+
export declare function createEntryPickerController({ api }: {
|
|
5
|
+
api: AdminSeoPort;
|
|
6
|
+
}, { t, describeError }?: {
|
|
7
|
+
t?: SeoTranslator | undefined;
|
|
8
|
+
describeError?: SeoErrorFormatter | undefined;
|
|
9
|
+
}): {
|
|
10
|
+
load: (_required?: Record<string, never>, _optional?: Record<string, never>) => Promise<void>;
|
|
11
|
+
getSnapshot: () => Readonly<EntryPickerController>;
|
|
12
|
+
subscribe: ({ listener }: {
|
|
13
|
+
listener: () => void;
|
|
14
|
+
}) => () => void;
|
|
15
|
+
set: ({ patch }: {
|
|
16
|
+
patch: Partial<EntryPickerController>;
|
|
17
|
+
}) => void;
|
|
18
|
+
signal: AbortSignal;
|
|
19
|
+
dispose: () => void;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=entry-picker.controller.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createControllerStore } from '../../core/module/controller-store.js';
|
|
2
|
+
import { initialEntryPickerState, describeSeoError } from '../models.js';
|
|
3
|
+
/** Two existing reads, combined posts first then pages; no new content repository. */
|
|
4
|
+
export function createEntryPickerController({ api }, { t = key => key, describeError = describeSeoError } = {}) {
|
|
5
|
+
const store = createControllerStore({ initial: initialEntryPickerState });
|
|
6
|
+
async function load(_required = {}, _optional = {}) {
|
|
7
|
+
try {
|
|
8
|
+
const [posts, pages] = await Promise.all([api.listSeoPosts({}), api.listSeoPages({})]);
|
|
9
|
+
store.set({ patch: { entries: [...posts, ...pages] } });
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
store.set({ patch: { error: describeError({ error, fallback: t('failed to load entries') }) } });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return { ...store, load };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=entry-picker.controller.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Selection belongs to the section; changing tabs unmounts and resets it. */
|
|
2
|
+
export declare function createSeoEntrySectionController(_required?: Record<string, never>, _optional?: Record<string, never>): {
|
|
3
|
+
setEntryId({ entryId }: {
|
|
4
|
+
entryId: string;
|
|
5
|
+
}, _optional?: Record<string, never>): void;
|
|
6
|
+
getSnapshot: () => Readonly<{
|
|
7
|
+
entryId: string;
|
|
8
|
+
}>;
|
|
9
|
+
subscribe: ({ listener }: {
|
|
10
|
+
listener: () => void;
|
|
11
|
+
}) => () => void;
|
|
12
|
+
set: ({ patch }: {
|
|
13
|
+
patch: Partial<{
|
|
14
|
+
entryId: string;
|
|
15
|
+
}>;
|
|
16
|
+
}) => void;
|
|
17
|
+
signal: AbortSignal;
|
|
18
|
+
dispose: () => void;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=entry-section.controller.d.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createControllerStore } from '../../core/module/controller-store.js';
|
|
2
|
+
/** Selection belongs to the section; changing tabs unmounts and resets it. */
|
|
3
|
+
export function createSeoEntrySectionController(_required = {}, _optional = {}) {
|
|
4
|
+
const store = createControllerStore({ initial: { entryId: '' } });
|
|
5
|
+
return { ...store, setEntryId({ entryId }, _optional = {}) { store.set({ patch: { entryId } }); } };
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=entry-section.controller.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SeoMediaSelection } from '../models.js';
|
|
2
|
+
/** The parent owns the controlled value; this controller owns only picker visibility. */
|
|
3
|
+
export declare function createMediaRefController({ onChange }: {
|
|
4
|
+
onChange: (value: string) => void;
|
|
5
|
+
}, _optional?: Record<string, never>): {
|
|
6
|
+
openPicker(_required?: Record<string, never>, _optional?: Record<string, never>): void;
|
|
7
|
+
closePicker(_required?: Record<string, never>, _optional?: Record<string, never>): void;
|
|
8
|
+
handleSelect({ item }: {
|
|
9
|
+
item: SeoMediaSelection;
|
|
10
|
+
}, _optional?: Record<string, never>): void;
|
|
11
|
+
clear(_required?: Record<string, never>, _optional?: Record<string, never>): void;
|
|
12
|
+
getSnapshot: () => Readonly<{
|
|
13
|
+
pickerOpen: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
subscribe: ({ listener }: {
|
|
16
|
+
listener: () => void;
|
|
17
|
+
}) => () => void;
|
|
18
|
+
set: ({ patch }: {
|
|
19
|
+
patch: Partial<{
|
|
20
|
+
pickerOpen: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
}) => void;
|
|
23
|
+
signal: AbortSignal;
|
|
24
|
+
dispose: () => void;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=media-ref.controller.d.ts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createControllerStore } from '../../core/module/controller-store.js';
|
|
2
|
+
import { buildMediaRef } from '../rules.js';
|
|
3
|
+
/** The parent owns the controlled value; this controller owns only picker visibility. */
|
|
4
|
+
export function createMediaRefController({ onChange }, _optional = {}) {
|
|
5
|
+
const store = createControllerStore({ initial: { pickerOpen: false } });
|
|
6
|
+
return {
|
|
7
|
+
...store,
|
|
8
|
+
openPicker(_required = {}, _optional = {}) { store.set({ patch: { pickerOpen: true } }); },
|
|
9
|
+
closePicker(_required = {}, _optional = {}) { store.set({ patch: { pickerOpen: false } }); },
|
|
10
|
+
handleSelect({ item }, _optional = {}) { onChange(buildMediaRef({ item })); store.set({ patch: { pickerOpen: false } }); },
|
|
11
|
+
clear(_required = {}, _optional = {}) { onChange(''); },
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=media-ref.controller.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AdminSeoPort } from '../ports.js';
|
|
2
|
+
import type { SeoEntryState, SeoEntryOverridesPatch, SeoTranslator, SeoErrorFormatter } from '../models.js';
|
|
3
|
+
/** Partial edits remain distinct from resolved values, including explicit null clears. */
|
|
4
|
+
export declare function createSeoEntryController({ api, entryId }: {
|
|
5
|
+
api: AdminSeoPort;
|
|
6
|
+
entryId: string;
|
|
7
|
+
}, { t, describeError }?: {
|
|
8
|
+
t?: SeoTranslator | undefined;
|
|
9
|
+
describeError?: SeoErrorFormatter | undefined;
|
|
10
|
+
}): {
|
|
11
|
+
load: (_required?: Record<string, never>, _optional?: Record<string, never>) => Promise<void>;
|
|
12
|
+
fieldValue: <K extends keyof SeoEntryOverridesPatch>({ key, resolvedValue }: {
|
|
13
|
+
key: K;
|
|
14
|
+
resolvedValue: SeoEntryOverridesPatch[K];
|
|
15
|
+
}, _optional?: Record<string, never>) => SeoEntryOverridesPatch[K];
|
|
16
|
+
setField: <K extends keyof SeoEntryOverridesPatch>({ key, value }: {
|
|
17
|
+
key: K;
|
|
18
|
+
value: SeoEntryOverridesPatch[K];
|
|
19
|
+
}, _optional?: Record<string, never>) => void;
|
|
20
|
+
save: (_required?: Record<string, never>, _optional?: Record<string, never>) => Promise<void>;
|
|
21
|
+
getSnapshot: () => Readonly<SeoEntryState>;
|
|
22
|
+
subscribe: ({ listener }: {
|
|
23
|
+
listener: () => void;
|
|
24
|
+
}) => () => void;
|
|
25
|
+
set: ({ patch }: {
|
|
26
|
+
patch: Partial<SeoEntryState>;
|
|
27
|
+
}) => void;
|
|
28
|
+
signal: AbortSignal;
|
|
29
|
+
dispose: () => void;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=seo-entry.controller.d.ts.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { createControllerStore } from '../../core/module/controller-store.js';
|
|
2
|
+
import { initialSeoEntryState, describeSeoError } from '../models.js';
|
|
3
|
+
import { overrideOrClear } from '../rules.js';
|
|
4
|
+
/** Partial edits remain distinct from resolved values, including explicit null clears. */
|
|
5
|
+
export function createSeoEntryController({ api, entryId }, { t = key => key, describeError = describeSeoError } = {}) {
|
|
6
|
+
const store = createControllerStore({ initial: initialSeoEntryState });
|
|
7
|
+
let analyzeGeneration = 0;
|
|
8
|
+
async function load(_required = {}, _optional = {}) {
|
|
9
|
+
store.set({ patch: initialSeoEntryState });
|
|
10
|
+
try {
|
|
11
|
+
const [resolved, analysis] = await Promise.all([api.getSeoEntry({ entryId }), api.analyzeSeoEntry({ entryId })]);
|
|
12
|
+
store.set({ patch: { resolved, analysis } });
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
store.set({ patch: { loadError: describeError({ error, fallback: t('failed to load entry SEO data') }) } });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function fieldValue({ key, resolvedValue }, _optional = {}) {
|
|
19
|
+
const { touched } = store.getSnapshot();
|
|
20
|
+
return key in touched ? touched[key] : resolvedValue;
|
|
21
|
+
}
|
|
22
|
+
// Normalize at the single sink rather than the eleven input handlers: a future field cannot
|
|
23
|
+
// silently miss the clear-override behavior. An untouched field remains absent from the PUT.
|
|
24
|
+
function setField({ key, value }, _optional = {}) {
|
|
25
|
+
store.set({ patch: { touched: { ...store.getSnapshot().touched, [key]: overrideOrClear({ value }) } } });
|
|
26
|
+
}
|
|
27
|
+
async function save(_required = {}, _optional = {}) {
|
|
28
|
+
const { touched } = store.getSnapshot();
|
|
29
|
+
if (Object.keys(touched).length === 0)
|
|
30
|
+
return;
|
|
31
|
+
store.set({ patch: { saving: true, saveError: null, notice: null } });
|
|
32
|
+
try {
|
|
33
|
+
const resolved = await api.putSeoEntry({ entryId }, touched);
|
|
34
|
+
store.set({ patch: { resolved, touched: {}, notice: t('Saved.') } });
|
|
35
|
+
// Saving finishes with the PUT, before this best-effort analysis settles. A newer save's
|
|
36
|
+
// analysis must supersede an earlier slow response (the source's 2026-09-07 race fix).
|
|
37
|
+
const ticket = ++analyzeGeneration;
|
|
38
|
+
void api.analyzeSeoEntry({ entryId }).then(analysis => {
|
|
39
|
+
if (ticket === analyzeGeneration)
|
|
40
|
+
store.set({ patch: { analysis } });
|
|
41
|
+
}).catch(() => { });
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
store.set({ patch: { saveError: describeError({ error, fallback: t('failed to save SEO overrides') }) } });
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
store.set({ patch: { saving: false } });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { ...store, load, fieldValue, setField, save };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=seo-entry.controller.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AdminSeoPort } from '../ports.js';
|
|
2
|
+
import type { SeoState, SeoTranslator, SeoSettingsPatch } from '../models.js';
|
|
3
|
+
/** One settings write owner; image drafts rebaseline only on accepted server settings. */
|
|
4
|
+
export declare function createSeoController({ api }: {
|
|
5
|
+
api: AdminSeoPort;
|
|
6
|
+
}, { t }?: {
|
|
7
|
+
t?: SeoTranslator | undefined;
|
|
8
|
+
}): {
|
|
9
|
+
load: (_required?: Record<string, never>, _optional?: Record<string, never>) => Promise<void>;
|
|
10
|
+
save: ({ patch }: {
|
|
11
|
+
patch: SeoSettingsPatch;
|
|
12
|
+
}, _optional?: Record<string, never>) => Promise<void>;
|
|
13
|
+
regenerateSitemap: (_required?: Record<string, never>, _optional?: Record<string, never>) => Promise<boolean>;
|
|
14
|
+
setDefaultOgImage({ value }: {
|
|
15
|
+
value: string;
|
|
16
|
+
}, _optional?: Record<string, never>): void;
|
|
17
|
+
openSitemapModal(_required?: Record<string, never>, _optional?: Record<string, never>): void;
|
|
18
|
+
closeSitemapModal(_required?: Record<string, never>, _optional?: Record<string, never>): void;
|
|
19
|
+
getSnapshot: () => Readonly<SeoState>;
|
|
20
|
+
subscribe: ({ listener }: {
|
|
21
|
+
listener: () => void;
|
|
22
|
+
}) => () => void;
|
|
23
|
+
set: ({ patch }: {
|
|
24
|
+
patch: Partial<SeoState>;
|
|
25
|
+
}) => void;
|
|
26
|
+
signal: AbortSignal;
|
|
27
|
+
dispose: () => void;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=seo.controller.d.ts.map
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createControllerStore } from '../../core/module/controller-store.js';
|
|
2
|
+
import { initialSeoState, describeSeoError } from '../models.js';
|
|
3
|
+
/** One settings write owner; image drafts rebaseline only on accepted server settings. */
|
|
4
|
+
export function createSeoController({ api }, { t = (key) => key } = {}) {
|
|
5
|
+
const store = createControllerStore({ initial: initialSeoState });
|
|
6
|
+
async function load(_required = {}, _optional = {}) {
|
|
7
|
+
try {
|
|
8
|
+
const settings = await api.getSeoSettings({});
|
|
9
|
+
store.set({ patch: { settings, defaultOgImage: settings.defaultOgImage ?? '' } });
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
store.set({ patch: { error: describeSeoError({ error, fallback: t('failed to load SEO settings') }) } });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function save({ patch }, _optional = {}) {
|
|
16
|
+
store.set({ patch: { saving: true, error: null, notice: null } });
|
|
17
|
+
try {
|
|
18
|
+
const settings = await api.putSeoSettings({}, patch);
|
|
19
|
+
store.set({ patch: { settings, defaultOgImage: settings.defaultOgImage ?? '', notice: t('Saved.') } });
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
store.set({ patch: { error: describeSeoError({ error, fallback: t('failed to save SEO settings') }) } });
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
store.set({ patch: { saving: false } });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function regenerateSitemap(_required = {}, _optional = {}) {
|
|
29
|
+
store.set({ patch: { saving: true, error: null, notice: null } });
|
|
30
|
+
try {
|
|
31
|
+
await api.regenerateSeoSitemap({});
|
|
32
|
+
store.set({ patch: { notice: t('Sitemap regeneration accepted.') } });
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
store.set({ patch: { error: describeSeoError({ error, fallback: t('failed to regenerate sitemap') }) } });
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
store.set({ patch: { saving: false } });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
...store, load, save, regenerateSitemap,
|
|
45
|
+
setDefaultOgImage({ value }, _optional = {}) { store.set({ patch: { defaultOgImage: value } }); },
|
|
46
|
+
openSitemapModal(_required = {}, _optional = {}) { store.set({ patch: { sitemapModalOpen: true } }); },
|
|
47
|
+
closeSitemapModal(_required = {}, _optional = {}) { store.set({ patch: { sitemapModalOpen: false } }); },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=seo.controller.js.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AdminSeoPort } from '../ports.js';
|
|
2
|
+
import type { SitemapState, SitemapModalView } from '../models.js';
|
|
3
|
+
/** Disabled is terminal, distinct from loading. Refetch generations ignore older responses. */
|
|
4
|
+
export declare function createSitemapController({ api, enabled }: {
|
|
5
|
+
api: AdminSeoPort;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
}, _optional?: Record<string, never>): {
|
|
8
|
+
load: (_required?: Record<string, never>, _optional?: Record<string, never>) => Promise<void>;
|
|
9
|
+
setFilter({ value }: {
|
|
10
|
+
value: string;
|
|
11
|
+
}, _optional?: Record<string, never>): void;
|
|
12
|
+
setView({ view }: {
|
|
13
|
+
view: SitemapModalView;
|
|
14
|
+
}, _optional?: Record<string, never>): void;
|
|
15
|
+
getSnapshot: () => Readonly<SitemapState>;
|
|
16
|
+
subscribe: ({ listener }: {
|
|
17
|
+
listener: () => void;
|
|
18
|
+
}) => () => void;
|
|
19
|
+
set: ({ patch }: {
|
|
20
|
+
patch: Partial<SitemapState>;
|
|
21
|
+
}) => void;
|
|
22
|
+
signal: AbortSignal;
|
|
23
|
+
dispose: () => void;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=sitemap.controller.d.ts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createControllerStore } from '../../core/module/controller-store.js';
|
|
2
|
+
/** Disabled is terminal, distinct from loading. Refetch generations ignore older responses. */
|
|
3
|
+
export function createSitemapController({ api, enabled }, _optional = {}) {
|
|
4
|
+
const store = createControllerStore({ initial: { status: enabled ? 'loading' : 'disabled', error: null, xmlText: '', filter: '', view: 'table' } });
|
|
5
|
+
let generation = 0;
|
|
6
|
+
async function load(_required = {}, _optional = {}) {
|
|
7
|
+
if (!enabled)
|
|
8
|
+
return;
|
|
9
|
+
const ticket = ++generation;
|
|
10
|
+
store.set({ patch: { status: 'loading', error: null } });
|
|
11
|
+
try {
|
|
12
|
+
const { text } = await api.fetchSitemapXml({}, { signal: store.signal });
|
|
13
|
+
if (ticket === generation)
|
|
14
|
+
store.set({ patch: { xmlText: text, status: 'ready' } });
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (ticket === generation)
|
|
18
|
+
store.set({ patch: { error: error instanceof Error ? error.message : 'failed to load the sitemap', status: 'error' } });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
...store, load,
|
|
23
|
+
setFilter({ value }, _optional = {}) { store.set({ patch: { filter: value } }); },
|
|
24
|
+
setView({ view }, _optional = {}) { store.set({ patch: { view } }); },
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=sitemap.controller.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { seoModule } from './seo.module.js';
|
|
2
|
+
export { seoApiToken, seoEventsToken } from './ports.js';
|
|
3
|
+
export type { AdminSeoPort, SeoEventsPort } from './ports.js';
|
|
4
|
+
export type { AdminSeoOverridesPatch, AdminSeoSettingsPatch, AdminSeoEntryChoice } from '../core/ports/seo.js';
|
|
5
|
+
export * from './models.js';
|
|
6
|
+
export * from './rules.js';
|
|
7
|
+
export { seoMessagesEn } from './messages.en.js';
|
|
8
|
+
export { createSeoController } from './controllers/seo.controller.js';
|
|
9
|
+
export { createSeoEntryController } from './controllers/seo-entry.controller.js';
|
|
10
|
+
export { createEntryPickerController } from './controllers/entry-picker.controller.js';
|
|
11
|
+
export { createSeoEntrySectionController } from './controllers/entry-section.controller.js';
|
|
12
|
+
export { createSitemapController } from './controllers/sitemap.controller.js';
|
|
13
|
+
export { createMediaRefController } from './controllers/media-ref.controller.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { seoModule } from './seo.module.js';
|
|
2
|
+
export { seoApiToken, seoEventsToken } from './ports.js';
|
|
3
|
+
export * from './models.js';
|
|
4
|
+
export * from './rules.js';
|
|
5
|
+
export { seoMessagesEn } from './messages.en.js';
|
|
6
|
+
export { createSeoController } from './controllers/seo.controller.js';
|
|
7
|
+
export { createSeoEntryController } from './controllers/seo-entry.controller.js';
|
|
8
|
+
export { createEntryPickerController } from './controllers/entry-picker.controller.js';
|
|
9
|
+
export { createSeoEntrySectionController } from './controllers/entry-section.controller.js';
|
|
10
|
+
export { createSitemapController } from './controllers/sitemap.controller.js';
|
|
11
|
+
export { createMediaRefController } from './controllers/media-ref.controller.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** English strings are also the host dictionary keys. */
|
|
2
|
+
export declare const seoMessagesEn: {
|
|
3
|
+
readonly "Site defaults": "Site defaults";
|
|
4
|
+
readonly Sitemap: "Sitemap";
|
|
5
|
+
readonly "Pages & posts": "Pages & posts";
|
|
6
|
+
readonly "This site publishes a sitemap.": "This site publishes a sitemap.";
|
|
7
|
+
readonly "This site does not publish a sitemap. Turn it on under Site defaults.": "This site does not publish a sitemap. Turn it on under Site defaults.";
|
|
8
|
+
readonly "Loading entries\u2026": "Loading entries…";
|
|
9
|
+
readonly Entry: "Entry";
|
|
10
|
+
readonly "Choose an entry\u2026": "Choose an entry…";
|
|
11
|
+
readonly Analysis: "Analysis";
|
|
12
|
+
readonly "Score:": "Score:";
|
|
13
|
+
readonly "No issues.": "No issues.";
|
|
14
|
+
readonly "Loading entry SEO\u2026": "Loading entry SEO…";
|
|
15
|
+
readonly "Per-entry overrides": "Per-entry overrides";
|
|
16
|
+
readonly "Fields show the currently-effective value (author override, or site default, or derived from the entry). Only fields you change here are saved as overrides.": "Fields show the currently-effective value (author override, or site default, or derived from the entry). Only fields you change here are saved as overrides.";
|
|
17
|
+
readonly "Empty a field and save to remove its override \u2014 the entry falls back to the site default.": "Empty a field and save to remove its override — the entry falls back to the site default.";
|
|
18
|
+
readonly Title: "Title";
|
|
19
|
+
readonly Description: "Description";
|
|
20
|
+
readonly "Canonical URL": "Canonical URL";
|
|
21
|
+
readonly Noindex: "Noindex";
|
|
22
|
+
readonly Nofollow: "Nofollow";
|
|
23
|
+
readonly "OG title": "OG title";
|
|
24
|
+
readonly "OG description": "OG description";
|
|
25
|
+
readonly "OG image": "OG image";
|
|
26
|
+
readonly "Twitter title": "Twitter title";
|
|
27
|
+
readonly "Twitter description": "Twitter description";
|
|
28
|
+
readonly "Twitter image": "Twitter image";
|
|
29
|
+
readonly "Saving\u2026": "Saving…";
|
|
30
|
+
readonly "Save overrides": "Save overrides";
|
|
31
|
+
readonly "Per-entry SEO": "Per-entry SEO";
|
|
32
|
+
readonly "Search appearance": "Search appearance";
|
|
33
|
+
readonly "Title template (must contain %s)": "Title template (must contain %s)";
|
|
34
|
+
readonly "Default meta description": "Default meta description";
|
|
35
|
+
readonly "Social sharing": "Social sharing";
|
|
36
|
+
readonly "Default Open Graph / Twitter image": "Default Open Graph / Twitter image";
|
|
37
|
+
readonly "Twitter @site handle": "Twitter @site handle";
|
|
38
|
+
readonly Crawling: "Crawling";
|
|
39
|
+
readonly "Default noindex": "Default noindex";
|
|
40
|
+
readonly "Default nofollow": "Default nofollow";
|
|
41
|
+
readonly "Sitemap enabled": "Sitemap enabled";
|
|
42
|
+
readonly "Save settings": "Save settings";
|
|
43
|
+
readonly "Cached sitemap": "Cached sitemap";
|
|
44
|
+
readonly "Rebuild the sitemap now to include the latest published content.": "Rebuild the sitemap now to include the latest published content.";
|
|
45
|
+
readonly "Working\u2026": "Working…";
|
|
46
|
+
readonly "Regenerate sitemap": "Regenerate sitemap";
|
|
47
|
+
readonly "View sitemap": "View sitemap";
|
|
48
|
+
readonly "Loading SEO settings\u2026": "Loading SEO settings…";
|
|
49
|
+
readonly Marketing: "Marketing";
|
|
50
|
+
readonly "Site-wide defaults for meta titles, descriptions, Open Graph/Twitter cards, and robots directives.": "Site-wide defaults for meta titles, descriptions, Open Graph/Twitter cards, and robots directives.";
|
|
51
|
+
readonly "Choose image": "Choose image";
|
|
52
|
+
readonly Remove: "Remove";
|
|
53
|
+
readonly "Sitemap \u00B7 {count} URLs": "Sitemap · {count} URLs";
|
|
54
|
+
readonly "sitemap.xml \u2197": "sitemap.xml ↗";
|
|
55
|
+
readonly Table: "Table";
|
|
56
|
+
readonly "Raw XML": "Raw XML";
|
|
57
|
+
readonly "The sitemap has no URLs yet.": "The sitemap has no URLs yet.";
|
|
58
|
+
readonly "Filter sitemap URLs": "Filter sitemap URLs";
|
|
59
|
+
readonly "Filter by URL\u2026": "Filter by URL…";
|
|
60
|
+
readonly "No URLs match this filter.": "No URLs match this filter.";
|
|
61
|
+
readonly URL: "URL";
|
|
62
|
+
readonly "Last modified": "Last modified";
|
|
63
|
+
readonly "\u2014": "—";
|
|
64
|
+
readonly "Sitemap is off. Turn on \"Sitemap enabled\" above to publish one.": "Sitemap is off. Turn on \"Sitemap enabled\" above to publish one.";
|
|
65
|
+
readonly "Loading sitemap\u2026": "Loading sitemap…";
|
|
66
|
+
readonly Close: "Close";
|
|
67
|
+
readonly "failed to load entries": "failed to load entries";
|
|
68
|
+
readonly "failed to load entry SEO data": "failed to load entry SEO data";
|
|
69
|
+
readonly "Saved.": "Saved.";
|
|
70
|
+
readonly "failed to save SEO overrides": "failed to save SEO overrides";
|
|
71
|
+
readonly "failed to load SEO settings": "failed to load SEO settings";
|
|
72
|
+
readonly "failed to save SEO settings": "failed to save SEO settings";
|
|
73
|
+
readonly "Sitemap regeneration accepted.": "Sitemap regeneration accepted.";
|
|
74
|
+
readonly "failed to regenerate sitemap": "failed to regenerate sitemap";
|
|
75
|
+
readonly "failed to load the sitemap": "failed to load the sitemap";
|
|
76
|
+
readonly "Could not load the sitemap (HTTP {status}).": "Could not load the sitemap (HTTP {status}).";
|
|
77
|
+
readonly "Selected image": "Selected image";
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=messages.en.d.ts.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** English strings are also the host dictionary keys. */
|
|
2
|
+
export const seoMessagesEn = {
|
|
3
|
+
"Site defaults": "Site defaults",
|
|
4
|
+
"Sitemap": "Sitemap",
|
|
5
|
+
"Pages & posts": "Pages & posts",
|
|
6
|
+
"This site publishes a sitemap.": "This site publishes a sitemap.",
|
|
7
|
+
"This site does not publish a sitemap. Turn it on under Site defaults.": "This site does not publish a sitemap. Turn it on under Site defaults.",
|
|
8
|
+
"Loading entries…": "Loading entries…",
|
|
9
|
+
"Entry": "Entry",
|
|
10
|
+
"Choose an entry…": "Choose an entry…",
|
|
11
|
+
"Analysis": "Analysis",
|
|
12
|
+
"Score:": "Score:",
|
|
13
|
+
"No issues.": "No issues.",
|
|
14
|
+
"Loading entry SEO…": "Loading entry SEO…",
|
|
15
|
+
"Per-entry overrides": "Per-entry overrides",
|
|
16
|
+
"Fields show the currently-effective value (author override, or site default, or derived from the entry). Only fields you change here are saved as overrides.": "Fields show the currently-effective value (author override, or site default, or derived from the entry). Only fields you change here are saved as overrides.",
|
|
17
|
+
"Empty a field and save to remove its override — the entry falls back to the site default.": "Empty a field and save to remove its override — the entry falls back to the site default.",
|
|
18
|
+
"Title": "Title",
|
|
19
|
+
"Description": "Description",
|
|
20
|
+
"Canonical URL": "Canonical URL",
|
|
21
|
+
"Noindex": "Noindex",
|
|
22
|
+
"Nofollow": "Nofollow",
|
|
23
|
+
"OG title": "OG title",
|
|
24
|
+
"OG description": "OG description",
|
|
25
|
+
"OG image": "OG image",
|
|
26
|
+
"Twitter title": "Twitter title",
|
|
27
|
+
"Twitter description": "Twitter description",
|
|
28
|
+
"Twitter image": "Twitter image",
|
|
29
|
+
"Saving…": "Saving…",
|
|
30
|
+
"Save overrides": "Save overrides",
|
|
31
|
+
"Per-entry SEO": "Per-entry SEO",
|
|
32
|
+
"Search appearance": "Search appearance",
|
|
33
|
+
"Title template (must contain %s)": "Title template (must contain %s)",
|
|
34
|
+
"Default meta description": "Default meta description",
|
|
35
|
+
"Social sharing": "Social sharing",
|
|
36
|
+
"Default Open Graph / Twitter image": "Default Open Graph / Twitter image",
|
|
37
|
+
"Twitter @site handle": "Twitter @site handle",
|
|
38
|
+
"Crawling": "Crawling",
|
|
39
|
+
"Default noindex": "Default noindex",
|
|
40
|
+
"Default nofollow": "Default nofollow",
|
|
41
|
+
"Sitemap enabled": "Sitemap enabled",
|
|
42
|
+
"Save settings": "Save settings",
|
|
43
|
+
"Cached sitemap": "Cached sitemap",
|
|
44
|
+
"Rebuild the sitemap now to include the latest published content.": "Rebuild the sitemap now to include the latest published content.",
|
|
45
|
+
"Working…": "Working…",
|
|
46
|
+
"Regenerate sitemap": "Regenerate sitemap",
|
|
47
|
+
"View sitemap": "View sitemap",
|
|
48
|
+
"Loading SEO settings…": "Loading SEO settings…",
|
|
49
|
+
"Marketing": "Marketing",
|
|
50
|
+
"Site-wide defaults for meta titles, descriptions, Open Graph/Twitter cards, and robots directives.": "Site-wide defaults for meta titles, descriptions, Open Graph/Twitter cards, and robots directives.",
|
|
51
|
+
"Choose image": "Choose image",
|
|
52
|
+
"Remove": "Remove",
|
|
53
|
+
"Sitemap · {count} URLs": "Sitemap · {count} URLs",
|
|
54
|
+
"sitemap.xml ↗": "sitemap.xml ↗",
|
|
55
|
+
"Table": "Table",
|
|
56
|
+
"Raw XML": "Raw XML",
|
|
57
|
+
"The sitemap has no URLs yet.": "The sitemap has no URLs yet.",
|
|
58
|
+
"Filter sitemap URLs": "Filter sitemap URLs",
|
|
59
|
+
"Filter by URL…": "Filter by URL…",
|
|
60
|
+
"No URLs match this filter.": "No URLs match this filter.",
|
|
61
|
+
"URL": "URL",
|
|
62
|
+
"Last modified": "Last modified",
|
|
63
|
+
"—": "—",
|
|
64
|
+
"Sitemap is off. Turn on \"Sitemap enabled\" above to publish one.": "Sitemap is off. Turn on \"Sitemap enabled\" above to publish one.",
|
|
65
|
+
"Loading sitemap…": "Loading sitemap…",
|
|
66
|
+
"Close": "Close",
|
|
67
|
+
"failed to load entries": "failed to load entries",
|
|
68
|
+
"failed to load entry SEO data": "failed to load entry SEO data",
|
|
69
|
+
"Saved.": "Saved.",
|
|
70
|
+
"failed to save SEO overrides": "failed to save SEO overrides",
|
|
71
|
+
"failed to load SEO settings": "failed to load SEO settings",
|
|
72
|
+
"failed to save SEO settings": "failed to save SEO settings",
|
|
73
|
+
"Sitemap regeneration accepted.": "Sitemap regeneration accepted.",
|
|
74
|
+
"failed to regenerate sitemap": "failed to regenerate sitemap",
|
|
75
|
+
"failed to load the sitemap": "failed to load the sitemap",
|
|
76
|
+
"Could not load the sitemap (HTTP {status}).": "Could not load the sitemap (HTTP {status}).",
|
|
77
|
+
"Selected image": "Selected image",
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=messages.en.js.map
|