octocms 0.3.8 → 0.4.2
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/dist/admin/AdminApp.d.ts +18 -11
- package/dist/admin/AdminApp.d.ts.map +1 -1
- package/dist/admin/AdminApp.js +41 -15
- package/dist/admin/AdminApp.js.map +1 -1
- package/dist/admin/ThemeProvider.js +1 -1
- package/dist/admin/actions/agent.d.ts +16 -0
- package/dist/admin/actions/agent.d.ts.map +1 -0
- package/dist/admin/actions/agent.js +15 -0
- package/dist/admin/actions/agent.js.map +1 -0
- package/dist/admin/actions/build.d.ts.map +1 -1
- package/dist/admin/actions/build.js +7 -3
- package/dist/admin/actions/build.js.map +1 -1
- package/dist/admin/actions/diff.d.ts +22 -0
- package/dist/admin/actions/diff.d.ts.map +1 -0
- package/dist/admin/actions/diff.js +131 -0
- package/dist/admin/actions/diff.js.map +1 -0
- package/dist/admin/actions/entries.d.ts.map +1 -1
- package/dist/admin/actions/entries.js +39 -7
- package/dist/admin/actions/entries.js.map +1 -1
- package/dist/admin/actions/files.d.ts.map +1 -1
- package/dist/admin/actions/files.js +27 -2
- package/dist/admin/actions/files.js.map +1 -1
- package/dist/admin/actions/getThemeCookie.js +1 -1
- package/dist/admin/actions/git.d.ts +8 -0
- package/dist/admin/actions/git.d.ts.map +1 -1
- package/dist/admin/actions/git.js +48 -1
- package/dist/admin/actions/git.js.map +1 -1
- package/dist/admin/actions/media.js +1 -1
- package/dist/admin/actions/schema.d.ts +53 -0
- package/dist/admin/actions/schema.d.ts.map +1 -0
- package/dist/admin/actions/schema.js +376 -0
- package/dist/admin/actions/schema.js.map +1 -0
- package/dist/admin/actions/search.js +1 -1
- package/dist/admin/actions/status.js +1 -1
- package/dist/admin/actions/utils.js +1 -1
- package/dist/admin/actions.d.ts +3 -0
- package/dist/admin/actions.d.ts.map +1 -1
- package/dist/admin/actions.js +3 -0
- package/dist/admin/actions.js.map +1 -1
- package/dist/admin/auth.js +1 -1
- package/dist/admin/consts.js +1 -1
- package/dist/admin/github.d.ts +31 -0
- package/dist/admin/github.d.ts.map +1 -1
- package/dist/admin/github.js +79 -1
- package/dist/admin/github.js.map +1 -1
- package/dist/admin/index.d.ts +13 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +12 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/AdminErrorView.d.ts +32 -0
- package/dist/admin/pages/AdminErrorView.d.ts.map +1 -0
- package/dist/admin/pages/AdminErrorView.js +40 -0
- package/dist/admin/pages/AdminErrorView.js.map +1 -0
- package/dist/admin/pages/AdminLayout.d.ts.map +1 -1
- package/dist/admin/pages/AdminLayout.js +2 -2
- package/dist/admin/pages/AdminLayout.js.map +1 -1
- package/dist/admin/pages/ChatPage.d.ts +9 -0
- package/dist/admin/pages/ChatPage.d.ts.map +1 -0
- package/dist/admin/pages/ChatPage.js +26 -0
- package/dist/admin/pages/ChatPage.js.map +1 -0
- package/dist/admin/pages/CollectionPage.d.ts +1 -1
- package/dist/admin/pages/CollectionPage.d.ts.map +1 -1
- package/dist/admin/pages/CollectionPage.js +23 -17
- package/dist/admin/pages/CollectionPage.js.map +1 -1
- package/dist/admin/pages/ContentModelPage.d.ts +2 -0
- package/dist/admin/pages/ContentModelPage.d.ts.map +1 -0
- package/dist/admin/pages/ContentModelPage.js +19 -0
- package/dist/admin/pages/ContentModelPage.js.map +1 -0
- package/dist/admin/pages/ContentPage.d.ts +2 -0
- package/dist/admin/pages/ContentPage.d.ts.map +1 -0
- package/dist/admin/pages/ContentPage.js +21 -0
- package/dist/admin/pages/ContentPage.js.map +1 -0
- package/dist/admin/pages/ContentTypePage.d.ts +4 -0
- package/dist/admin/pages/ContentTypePage.d.ts.map +1 -0
- package/dist/admin/pages/ContentTypePage.js +21 -0
- package/dist/admin/pages/ContentTypePage.js.map +1 -0
- package/dist/admin/pages/DashboardPage.d.ts +1 -1
- package/dist/admin/pages/DashboardPage.d.ts.map +1 -1
- package/dist/admin/pages/DashboardPage.js +6 -16
- package/dist/admin/pages/DashboardPage.js.map +1 -1
- package/dist/admin/pages/EntryPage.d.ts +1 -1
- package/dist/admin/pages/EntryPage.d.ts.map +1 -1
- package/dist/admin/pages/EntryPage.js +13 -17
- package/dist/admin/pages/EntryPage.js.map +1 -1
- package/dist/admin/pages/MediaAssetPage.d.ts +4 -0
- package/dist/admin/pages/MediaAssetPage.d.ts.map +1 -0
- package/dist/admin/pages/MediaAssetPage.js +21 -0
- package/dist/admin/pages/MediaAssetPage.js.map +1 -0
- package/dist/admin/pages/MediaPage.d.ts +1 -3
- package/dist/admin/pages/MediaPage.d.ts.map +1 -1
- package/dist/admin/pages/MediaPage.js +4 -7
- package/dist/admin/pages/MediaPage.js.map +1 -1
- package/dist/admin/provider.js +1 -1
- package/dist/admin/store/contentStore.js +1 -1
- package/dist/admin/store/contentStoreFetch.js +1 -1
- package/dist/admin/theme.js +1 -1
- package/dist/agent/attachments.d.ts +69 -0
- package/dist/agent/attachments.d.ts.map +1 -0
- package/dist/agent/attachments.js +158 -0
- package/dist/agent/attachments.js.map +1 -0
- package/dist/agent/chat.d.ts +70 -0
- package/dist/agent/chat.d.ts.map +1 -0
- package/dist/agent/chat.js +173 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/chatApi.js +238 -0
- package/dist/agent/chatApi.js.map +1 -0
- package/dist/agent/configStore.d.ts +15 -0
- package/dist/agent/configStore.d.ts.map +1 -0
- package/dist/agent/configStore.js +13 -0
- package/dist/agent/configStore.js.map +1 -0
- package/dist/agent/defaults.js +28 -0
- package/dist/agent/defaults.js.map +1 -0
- package/dist/agent/embedText.d.ts +23 -0
- package/dist/agent/embedText.d.ts.map +1 -0
- package/dist/agent/embedText.js +37 -0
- package/dist/agent/embedText.js.map +1 -0
- package/dist/agent/embedder.d.ts +34 -0
- package/dist/agent/embedder.d.ts.map +1 -0
- package/dist/agent/embedder.js +56 -0
- package/dist/agent/embedder.js.map +1 -0
- package/dist/agent/embeddings.d.ts +96 -0
- package/dist/agent/embeddings.d.ts.map +1 -0
- package/dist/agent/embeddings.js +187 -0
- package/dist/agent/embeddings.js.map +1 -0
- package/dist/agent/embeddingsHook.d.ts +47 -0
- package/dist/agent/embeddingsHook.d.ts.map +1 -0
- package/dist/agent/embeddingsHook.js +56 -0
- package/dist/agent/embeddingsHook.js.map +1 -0
- package/dist/agent/featureFlag.d.ts +36 -0
- package/dist/agent/featureFlag.d.ts.map +1 -0
- package/dist/agent/featureFlag.js +47 -0
- package/dist/agent/featureFlag.js.map +1 -0
- package/dist/agent/index.cjs +5313 -0
- package/dist/agent/index.cjs.map +1 -0
- package/dist/agent/index.js +118 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/pricing.d.ts +11 -0
- package/dist/agent/pricing.d.ts.map +1 -0
- package/dist/agent/pricing.js +16 -0
- package/dist/agent/pricing.js.map +1 -0
- package/dist/agent/proposals.d.ts +82 -0
- package/dist/agent/proposals.d.ts.map +1 -0
- package/dist/agent/proposals.js +95 -0
- package/dist/agent/proposals.js.map +1 -0
- package/dist/agent/proposalsApi.js +83 -0
- package/dist/agent/proposalsApi.js.map +1 -0
- package/dist/agent/providers/anthropic.js +198 -0
- package/dist/agent/providers/anthropic.js.map +1 -0
- package/dist/agent/providers/index.js +17 -0
- package/dist/agent/providers/index.js.map +1 -0
- package/dist/agent/providers/openai.js +215 -0
- package/dist/agent/providers/openai.js.map +1 -0
- package/dist/agent/providers/types.d.ts +118 -0
- package/dist/agent/providers/types.d.ts.map +1 -0
- package/dist/agent/providers/types.js +1 -0
- package/dist/agent/search.d.ts +58 -0
- package/dist/agent/search.d.ts.map +1 -0
- package/dist/agent/search.js +97 -0
- package/dist/agent/search.js.map +1 -0
- package/dist/agent/storeFormat.d.ts +19 -0
- package/dist/agent/storeFormat.d.ts.map +1 -0
- package/dist/agent/storeFormat.js +35 -0
- package/dist/agent/storeFormat.js.map +1 -0
- package/dist/agent/systemPrompt.d.ts +26 -0
- package/dist/agent/systemPrompt.d.ts.map +1 -0
- package/dist/agent/systemPrompt.js +49 -0
- package/dist/agent/systemPrompt.js.map +1 -0
- package/dist/agent/tools/index.d.ts +37 -0
- package/dist/agent/tools/index.d.ts.map +1 -0
- package/dist/agent/tools/index.js +467 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/types.d.ts +73 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +1 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent/usage.d.ts +32 -0
- package/dist/agent/usage.d.ts.map +1 -0
- package/dist/agent/usage.js +42 -0
- package/dist/agent/usage.js.map +1 -0
- package/dist/{agentDocs-LIXYC3FH.js → agentDocs-L4RLZCYK.js} +4 -3
- package/dist/{agentDocs-LIXYC3FH.js.map → agentDocs-L4RLZCYK.js.map} +1 -1
- package/dist/chunk-6PHFHGTZ.js +35 -0
- package/dist/{chunk-33PHLOAE.js.map → chunk-6PHFHGTZ.js.map} +1 -1
- package/dist/chunk-B5LE2OEC.js +58 -0
- package/dist/chunk-B5LE2OEC.js.map +1 -0
- package/dist/{chunk-2NMEKWO5.js → chunk-DDAAVRWG.js} +2 -15
- package/dist/chunk-DDAAVRWG.js.map +1 -0
- package/dist/{chunk-JF5J6WWI.js → chunk-SJ3MPCWY.js} +46 -3
- package/dist/chunk-SJ3MPCWY.js.map +1 -0
- package/dist/cli/index.js +37 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/agentDocs.d.ts +15 -0
- package/dist/cli/lib/agentDocs.d.ts.map +1 -0
- package/dist/cli/lib/codegen.d.ts +70 -0
- package/dist/cli/lib/codegen.d.ts.map +1 -0
- package/dist/cli/lib/schemaDocs.d.ts +17 -0
- package/dist/cli/lib/schemaDocs.d.ts.map +1 -0
- package/dist/cli/lib/validateConfig.d.ts +17 -0
- package/dist/cli/lib/validateConfig.d.ts.map +1 -0
- package/dist/components/Chat/ChatPage.d.ts +15 -0
- package/dist/components/Chat/ChatPage.d.ts.map +1 -0
- package/dist/components/Chat/ChatPage.js +203 -0
- package/dist/components/Chat/ChatPage.js.map +1 -0
- package/dist/components/Chat/ChatPage.skeleton.d.ts +3 -0
- package/dist/components/Chat/ChatPage.skeleton.d.ts.map +1 -0
- package/dist/components/Chat/ChatPage.skeleton.js +22 -0
- package/dist/components/Chat/ChatPage.skeleton.js.map +1 -0
- package/dist/components/Chat/Composer.d.ts +15 -0
- package/dist/components/Chat/Composer.d.ts.map +1 -0
- package/dist/components/Chat/Composer.js +179 -0
- package/dist/components/Chat/Composer.js.map +1 -0
- package/dist/components/Chat/Message.d.ts +10 -0
- package/dist/components/Chat/Message.d.ts.map +1 -0
- package/dist/components/Chat/Message.js +73 -0
- package/dist/components/Chat/Message.js.map +1 -0
- package/dist/components/Chat/ProposalCard.d.ts +9 -0
- package/dist/components/Chat/ProposalCard.d.ts.map +1 -0
- package/dist/components/Chat/ProposalCard.js +243 -0
- package/dist/components/Chat/ProposalCard.js.map +1 -0
- package/dist/components/Chat/ToolCallCard.d.ts +7 -0
- package/dist/components/Chat/ToolCallCard.d.ts.map +1 -0
- package/dist/components/Chat/ToolCallCard.js +90 -0
- package/dist/components/Chat/ToolCallCard.js.map +1 -0
- package/dist/components/Chat/types.d.ts +81 -0
- package/dist/components/Chat/types.d.ts.map +1 -0
- package/dist/components/Chat/types.js +1 -0
- package/dist/components/Chat/types.js.map +1 -0
- package/dist/components/Chat/useChatStream.d.ts +44 -0
- package/dist/components/Chat/useChatStream.d.ts.map +1 -0
- package/dist/components/Chat/useChatStream.js +444 -0
- package/dist/components/Chat/useChatStream.js.map +1 -0
- package/dist/components/CommandK/CommandK.d.ts +12 -0
- package/dist/components/CommandK/CommandK.d.ts.map +1 -0
- package/dist/components/CommandK/CommandK.js +229 -0
- package/dist/components/CommandK/CommandK.js.map +1 -0
- package/dist/components/CommandK/parts.d.ts +20 -0
- package/dist/components/CommandK/parts.d.ts.map +1 -0
- package/dist/components/CommandK/parts.js +34 -0
- package/dist/components/CommandK/parts.js.map +1 -0
- package/dist/components/ContentModel/ConditionalBranchesEditor.d.ts +15 -0
- package/dist/components/ContentModel/ConditionalBranchesEditor.d.ts.map +1 -0
- package/dist/components/ContentModel/ConditionalBranchesEditor.js +277 -0
- package/dist/components/ContentModel/ConditionalBranchesEditor.js.map +1 -0
- package/dist/components/ContentModel/ContentModelList.d.ts +8 -0
- package/dist/components/ContentModel/ContentModelList.d.ts.map +1 -0
- package/dist/components/ContentModel/ContentModelList.js +103 -0
- package/dist/components/ContentModel/ContentModelList.js.map +1 -0
- package/dist/components/ContentModel/ContentModelList.skeleton.d.ts +5 -0
- package/dist/components/ContentModel/ContentModelList.skeleton.d.ts.map +1 -0
- package/dist/components/ContentModel/ContentModelList.skeleton.js +16 -0
- package/dist/components/ContentModel/ContentModelList.skeleton.js.map +1 -0
- package/dist/components/ContentModel/ContentTypeDetail.d.ts +9 -0
- package/dist/components/ContentModel/ContentTypeDetail.d.ts.map +1 -0
- package/dist/components/ContentModel/ContentTypeDetail.js +459 -0
- package/dist/components/ContentModel/ContentTypeDetail.js.map +1 -0
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts +5 -0
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts.map +1 -0
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.js +22 -0
- package/dist/components/ContentModel/ContentTypeDetail.skeleton.js.map +1 -0
- package/dist/components/ContentModel/CreateContentTypeDialog.d.ts +9 -0
- package/dist/components/ContentModel/CreateContentTypeDialog.d.ts.map +1 -0
- package/dist/components/ContentModel/CreateContentTypeDialog.js +215 -0
- package/dist/components/ContentModel/CreateContentTypeDialog.js.map +1 -0
- package/dist/components/ContentModel/DeleteContentTypeDialog.d.ts +10 -0
- package/dist/components/ContentModel/DeleteContentTypeDialog.d.ts.map +1 -0
- package/dist/components/ContentModel/DeleteContentTypeDialog.js +143 -0
- package/dist/components/ContentModel/DeleteContentTypeDialog.js.map +1 -0
- package/dist/components/ContentModel/DeleteFieldDialog.d.ts +11 -0
- package/dist/components/ContentModel/DeleteFieldDialog.d.ts.map +1 -0
- package/dist/components/ContentModel/DeleteFieldDialog.js +141 -0
- package/dist/components/ContentModel/DeleteFieldDialog.js.map +1 -0
- package/dist/components/ContentModel/EditContentTypeDialog.d.ts +12 -0
- package/dist/components/ContentModel/EditContentTypeDialog.d.ts.map +1 -0
- package/dist/components/ContentModel/EditContentTypeDialog.js +254 -0
- package/dist/components/ContentModel/EditContentTypeDialog.js.map +1 -0
- package/dist/components/ContentModel/FieldDialog.d.ts +28 -0
- package/dist/components/ContentModel/FieldDialog.d.ts.map +1 -0
- package/dist/components/ContentModel/FieldDialog.js +569 -0
- package/dist/components/ContentModel/FieldDialog.js.map +1 -0
- package/dist/components/ContentModel/RichTextOptionsEditor.d.ts +10 -0
- package/dist/components/ContentModel/RichTextOptionsEditor.d.ts.map +1 -0
- package/dist/components/ContentModel/RichTextOptionsEditor.js +422 -0
- package/dist/components/ContentModel/RichTextOptionsEditor.js.map +1 -0
- package/dist/components/ContentModel/SchemaImpactList.d.ts +19 -0
- package/dist/components/ContentModel/SchemaImpactList.d.ts.map +1 -0
- package/dist/components/ContentModel/SchemaImpactList.js +88 -0
- package/dist/components/ContentModel/SchemaImpactList.js.map +1 -0
- package/dist/components/ContentModel/SchemaOptionFieldInput.d.ts +15 -0
- package/dist/components/ContentModel/SchemaOptionFieldInput.d.ts.map +1 -0
- package/dist/components/ContentModel/SchemaOptionFieldInput.js +386 -0
- package/dist/components/ContentModel/SchemaOptionFieldInput.js.map +1 -0
- package/dist/components/ContentModel/contentTypeKey.d.ts +16 -0
- package/dist/components/ContentModel/contentTypeKey.d.ts.map +1 -0
- package/dist/components/ContentModel/contentTypeKey.js +29 -0
- package/dist/components/ContentModel/contentTypeKey.js.map +1 -0
- package/dist/components/ContentModel/fieldKey.d.ts +17 -0
- package/dist/components/ContentModel/fieldKey.d.ts.map +1 -0
- package/dist/components/ContentModel/fieldKey.js +29 -0
- package/dist/components/ContentModel/fieldKey.js.map +1 -0
- package/dist/components/ContentModel/fieldOptions.d.ts +37 -0
- package/dist/components/ContentModel/fieldOptions.d.ts.map +1 -0
- package/dist/components/ContentModel/fieldOptions.js +261 -0
- package/dist/components/ContentModel/fieldOptions.js.map +1 -0
- package/dist/components/ContentTypes.js +3 -3
- package/dist/components/ContentTypes.js.map +1 -1
- package/dist/components/CreateBranchDialog.js +1 -1
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts +3 -0
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts.map +1 -0
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.js +10 -0
- package/dist/components/Dashboard/DashboardContent.collection.skeleton.js.map +1 -0
- package/dist/components/Dashboard/DashboardContent.d.ts +3 -1
- package/dist/components/Dashboard/DashboardContent.d.ts.map +1 -1
- package/dist/components/Dashboard/DashboardContent.js +270 -120
- package/dist/components/Dashboard/DashboardContent.js.map +1 -1
- package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts +7 -0
- package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts.map +1 -0
- package/dist/components/Dashboard/DashboardContent.list.skeleton.js +22 -0
- package/dist/components/Dashboard/DashboardContent.list.skeleton.js.map +1 -0
- package/dist/components/Dashboard/DashboardContent.skeleton.d.ts +2 -0
- package/dist/components/Dashboard/DashboardContent.skeleton.d.ts.map +1 -0
- package/dist/components/Dashboard/DashboardContent.skeleton.js +13 -0
- package/dist/components/Dashboard/DashboardContent.skeleton.js.map +1 -0
- package/dist/components/DiffView/DiffHunk.d.ts +15 -0
- package/dist/components/DiffView/DiffHunk.d.ts.map +1 -0
- package/dist/components/DiffView/DiffHunk.js +92 -0
- package/dist/components/DiffView/DiffHunk.js.map +1 -0
- package/dist/components/DiffView/DiffView.d.ts +7 -0
- package/dist/components/DiffView/DiffView.d.ts.map +1 -0
- package/dist/components/DiffView/DiffView.js +155 -0
- package/dist/components/DiffView/DiffView.js.map +1 -0
- package/dist/components/DiffView/index.d.ts +3 -0
- package/dist/components/DiffView/index.d.ts.map +1 -0
- package/dist/components/DiffView/index.js +8 -0
- package/dist/components/DiffView/index.js.map +1 -0
- package/dist/components/EditPost/EditPost.d.ts.map +1 -1
- package/dist/components/EditPost/EditPost.js +163 -71
- package/dist/components/EditPost/EditPost.js.map +1 -1
- package/dist/components/EditPost/EditPost.skeleton.d.ts +5 -0
- package/dist/components/EditPost/EditPost.skeleton.d.ts.map +1 -0
- package/dist/components/EditPost/EditPost.skeleton.js +34 -0
- package/dist/components/EditPost/EditPost.skeleton.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +30 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +73 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/FieldHintAndError.js +1 -1
- package/dist/components/FileExplorer/FileExplorer.d.ts.map +1 -1
- package/dist/components/FileExplorer/FileExplorer.js +3 -2
- package/dist/components/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/components/FormBooleanField.js +1 -1
- package/dist/components/FormColorField.js +1 -1
- package/dist/components/FormConditionalField.js +1 -1
- package/dist/components/FormDatetimeField.js +1 -1
- package/dist/components/FormFields.d.ts.map +1 -1
- package/dist/components/FormFields.js +5 -5
- package/dist/components/FormFields.js.map +1 -1
- package/dist/components/FormImageField.js +1 -1
- package/dist/components/FormJsonField.js +1 -1
- package/dist/components/FormMarkdownField.d.ts.map +1 -1
- package/dist/components/FormMarkdownField.js +4 -3
- package/dist/components/FormMarkdownField.js.map +1 -1
- package/dist/components/FormNumberField.js +1 -1
- package/dist/components/FormReferenceField.js +1 -1
- package/dist/components/FormRichTextField.js +1 -1
- package/dist/components/FormSelectField.js +1 -1
- package/dist/components/FormSlugField.js +1 -1
- package/dist/components/FormStringField.js +1 -1
- package/dist/components/FormStringListField.js +1 -1
- package/dist/components/FormTextField.js +1 -1
- package/dist/components/FormUrlField.js +1 -1
- package/dist/components/Header/ThemeToggle.js +1 -1
- package/dist/components/HistorySection/HistorySection.d.ts +6 -0
- package/dist/components/HistorySection/HistorySection.d.ts.map +1 -0
- package/dist/components/HistorySection/HistorySection.js +116 -0
- package/dist/components/HistorySection/HistorySection.js.map +1 -0
- package/dist/components/InlineEntryEditor/InlineEntryEditor.js +1 -1
- package/dist/components/Layout/Layout.d.ts.map +1 -1
- package/dist/components/Layout/Layout.js +9 -5
- package/dist/components/Layout/Layout.js.map +1 -1
- package/dist/components/Layout/LeftNavItem.d.ts +20 -0
- package/dist/components/Layout/LeftNavItem.d.ts.map +1 -0
- package/dist/components/Layout/LeftNavItem.js +24 -0
- package/dist/components/Layout/LeftNavItem.js.map +1 -0
- package/dist/components/Layout/PageBar.d.ts +10 -0
- package/dist/components/Layout/PageBar.d.ts.map +1 -0
- package/dist/components/Layout/PageBar.js +43 -0
- package/dist/components/Layout/PageBar.js.map +1 -0
- package/dist/components/Layout/PageShell.d.ts +30 -0
- package/dist/components/Layout/PageShell.d.ts.map +1 -0
- package/dist/components/Layout/PageShell.js +33 -0
- package/dist/components/Layout/PageShell.js.map +1 -0
- package/dist/components/Layout/TopHeader.d.ts +6 -0
- package/dist/components/Layout/TopHeader.d.ts.map +1 -0
- package/dist/components/Layout/TopHeader.js +291 -0
- package/dist/components/Layout/TopHeader.js.map +1 -0
- package/dist/components/LinkedBySection/LinkedBySection.js +1 -1
- package/dist/components/Loading.js +1 -1
- package/dist/components/MediaAsset/MediaAsset.d.ts +7 -0
- package/dist/components/MediaAsset/MediaAsset.d.ts.map +1 -0
- package/dist/components/MediaAsset/MediaAsset.js +236 -0
- package/dist/components/MediaAsset/MediaAsset.js.map +1 -0
- package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts +3 -0
- package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts.map +1 -0
- package/dist/components/MediaAsset/MediaAsset.skeleton.js +42 -0
- package/dist/components/MediaAsset/MediaAsset.skeleton.js.map +1 -0
- package/dist/components/MediaAsset/findMediaFileByRequestedId.d.ts +4 -0
- package/dist/components/MediaAsset/findMediaFileByRequestedId.d.ts.map +1 -0
- package/dist/components/MediaAsset/findMediaFileByRequestedId.js +15 -0
- package/dist/components/MediaAsset/findMediaFileByRequestedId.js.map +1 -0
- package/dist/components/MediaManager/CreateFolderDialog.d.ts +9 -0
- package/dist/components/MediaManager/CreateFolderDialog.d.ts.map +1 -0
- package/dist/components/MediaManager/CreateFolderDialog.js +68 -0
- package/dist/components/MediaManager/CreateFolderDialog.js.map +1 -0
- package/dist/components/MediaManager/DeleteFolderDialog.d.ts +8 -0
- package/dist/components/MediaManager/DeleteFolderDialog.d.ts.map +1 -0
- package/dist/components/MediaManager/DeleteFolderDialog.js +42 -0
- package/dist/components/MediaManager/DeleteFolderDialog.js.map +1 -0
- package/dist/components/MediaManager/MediaLeftPanel.d.ts +13 -0
- package/dist/components/MediaManager/MediaLeftPanel.d.ts.map +1 -0
- package/dist/components/MediaManager/MediaLeftPanel.js +93 -0
- package/dist/components/MediaManager/MediaLeftPanel.js.map +1 -0
- package/dist/components/MediaManager/MediaListTable.d.ts +6 -0
- package/dist/components/MediaManager/MediaListTable.d.ts.map +1 -0
- package/dist/components/MediaManager/MediaListTable.js +52 -0
- package/dist/components/MediaManager/MediaListTable.js.map +1 -0
- package/dist/components/MediaManager/MediaManager.d.ts +1 -3
- package/dist/components/MediaManager/MediaManager.d.ts.map +1 -1
- package/dist/components/MediaManager/MediaManager.js +240 -496
- package/dist/components/MediaManager/MediaManager.js.map +1 -1
- package/dist/components/MediaManager/MediaManager.skeleton.d.ts +3 -0
- package/dist/components/MediaManager/MediaManager.skeleton.d.ts.map +1 -0
- package/dist/components/MediaManager/MediaManager.skeleton.js +30 -0
- package/dist/components/MediaManager/MediaManager.skeleton.js.map +1 -0
- package/dist/components/MediaManager/MediaUploadBar.d.ts +7 -0
- package/dist/components/MediaManager/MediaUploadBar.d.ts.map +1 -0
- package/dist/components/MediaManager/MediaUploadBar.js +75 -0
- package/dist/components/MediaManager/MediaUploadBar.js.map +1 -0
- package/dist/components/StatusBadge.d.ts +1 -8
- package/dist/components/StatusBadge.d.ts.map +1 -1
- package/dist/components/StatusBadge.js +3 -50
- package/dist/components/StatusBadge.js.map +1 -1
- package/dist/components/public/MarkdownContent.js +1 -1
- package/dist/components/public/RichTextContent.js +1 -1
- package/dist/components/public/SearchBox.js +1 -1
- package/dist/components/public/index.js +1 -1
- package/dist/components/richtext/ComponentEmbedEditor.js +1 -1
- package/dist/components/richtext/ConditionEmbedEditor.js +1 -1
- package/dist/components/richtext/ImageEmbedEditor.js +1 -1
- package/dist/components/richtext/ReferenceEmbedEditor.js +1 -1
- package/dist/components/richtext/SlashCommandMenu.js +1 -1
- package/dist/components/richtext/VariableEmbedEditor.js +1 -1
- package/dist/components/skeletons/AdminGenericSkeleton.d.ts +7 -0
- package/dist/components/skeletons/AdminGenericSkeleton.d.ts.map +1 -0
- package/dist/components/skeletons/AdminGenericSkeleton.js +14 -0
- package/dist/components/skeletons/AdminGenericSkeleton.js.map +1 -0
- package/dist/components/skeletons/SectionSkeleton.d.ts +11 -0
- package/dist/components/skeletons/SectionSkeleton.d.ts.map +1 -0
- package/dist/components/skeletons/SectionSkeleton.js +26 -0
- package/dist/components/skeletons/SectionSkeleton.js.map +1 -0
- package/dist/components/skeletons/index.d.ts +11 -0
- package/dist/components/skeletons/index.d.ts.map +1 -0
- package/dist/components/skeletons/index.js +12 -0
- package/dist/components/skeletons/index.js.map +1 -0
- package/dist/components/skeletons/primitives.d.ts +17 -0
- package/dist/components/skeletons/primitives.d.ts.map +1 -0
- package/dist/components/skeletons/primitives.js +34 -0
- package/dist/components/skeletons/primitives.js.map +1 -0
- package/dist/components/ui/avatar-stack.d.ts +13 -0
- package/dist/components/ui/avatar-stack.d.ts.map +1 -0
- package/dist/components/ui/avatar-stack.js +27 -0
- package/dist/components/ui/avatar-stack.js.map +1 -0
- package/dist/components/ui/avatar.js +1 -1
- package/dist/components/ui/banner.d.ts +13 -0
- package/dist/components/ui/banner.d.ts.map +1 -0
- package/dist/components/ui/banner.js +24 -0
- package/dist/components/ui/banner.js.map +1 -0
- package/dist/components/ui/branch-chip.d.ts +7 -0
- package/dist/components/ui/branch-chip.d.ts.map +1 -0
- package/dist/components/ui/branch-chip.js +58 -0
- package/dist/components/ui/branch-chip.js.map +1 -0
- package/dist/components/ui/button.d.ts +4 -2
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +31 -13
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/card.d.ts +7 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.js +53 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/chip.d.ts +7 -0
- package/dist/components/ui/chip.d.ts.map +1 -0
- package/dist/components/ui/chip.js +44 -0
- package/dist/components/ui/chip.js.map +1 -0
- package/dist/components/ui/dialog.js +1 -1
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu.js +15 -9
- package/dist/components/ui/dropdown-menu.js.map +1 -1
- package/dist/components/ui/empty.d.ts +11 -0
- package/dist/components/ui/empty.d.ts.map +1 -0
- package/dist/components/ui/empty.js +24 -0
- package/dist/components/ui/empty.js.map +1 -0
- package/dist/components/ui/field.d.ts +17 -0
- package/dist/components/ui/field.d.ts.map +1 -0
- package/dist/components/ui/field.js +52 -0
- package/dist/components/ui/field.js.map +1 -0
- package/dist/components/ui/index.d.ts +17 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +31 -1
- package/dist/components/ui/index.js.map +1 -1
- package/dist/components/ui/input.d.ts +5 -1
- package/dist/components/ui/input.d.ts.map +1 -1
- package/dist/components/ui/input.js +27 -4
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/kbd.d.ts +3 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +30 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/label.js +1 -1
- package/dist/components/ui/publish-button.d.ts +7 -0
- package/dist/components/ui/publish-button.d.ts.map +1 -0
- package/dist/components/ui/publish-button.js +50 -0
- package/dist/components/ui/publish-button.js.map +1 -0
- package/dist/components/ui/select.js +5 -5
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/sonner.js +1 -1
- package/dist/components/ui/status-badge.d.ts +15 -0
- package/dist/components/ui/status-badge.d.ts.map +1 -0
- package/dist/components/ui/status-badge.js +60 -0
- package/dist/components/ui/status-badge.js.map +1 -0
- package/dist/components/ui/table.js +1 -1
- package/dist/components/ui/tabs-pill.d.ts +17 -0
- package/dist/components/ui/tabs-pill.d.ts.map +1 -0
- package/dist/components/ui/tabs-pill.js +67 -0
- package/dist/components/ui/tabs-pill.js.map +1 -0
- package/dist/components/ui/tabs.js +1 -1
- package/dist/components/ui/textarea.d.ts +6 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +25 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/toast-card.d.ts +15 -0
- package/dist/components/ui/toast-card.d.ts.map +1 -0
- package/dist/components/ui/toast-card.js +90 -0
- package/dist/components/ui/toast-card.js.map +1 -0
- package/dist/components/ui/toast.d.ts +1 -1
- package/dist/components/ui/toast.js +2 -2
- package/dist/components/ui/toast.js.map +1 -1
- package/dist/components/ui/toaster.js +1 -1
- package/dist/config.js +1 -1
- package/dist/defineConfig.js +1 -1
- package/dist/{dev-W5U5LD4P.js → dev-B6A62PGI.js} +5 -3
- package/dist/{dev-W5U5LD4P.js.map → dev-B6A62PGI.js.map} +1 -1
- package/dist/embeddingsGen-FWXI55MC.js +349 -0
- package/dist/embeddingsGen-FWXI55MC.js.map +1 -0
- package/dist/github-Q7ABLNZF.js +698 -0
- package/dist/github-Q7ABLNZF.js.map +1 -0
- package/dist/github-public.js +1 -1
- package/dist/globals.css +378 -131
- package/dist/hooks/useConfig.js +1 -1
- package/dist/hooks/useEntryStack.js +1 -1
- package/dist/hooks/useFileState.js +1 -1
- package/dist/hooks/useMediaCustomFolders.d.ts +13 -0
- package/dist/hooks/useMediaCustomFolders.d.ts.map +1 -0
- package/dist/hooks/useMediaCustomFolders.js +53 -0
- package/dist/hooks/useMediaCustomFolders.js.map +1 -0
- package/dist/hooks/useToast.js +1 -1
- package/dist/index.cjs +325 -361
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{init-P4ACOEE2.js → init-IKO4CU7H.js} +30 -3
- package/dist/init-IKO4CU7H.js.map +1 -0
- package/dist/lib/blogPublicPath.js +1 -1
- package/dist/lib/branchHistory.js +1 -1
- package/dist/lib/cmsServerLog.js +1 -1
- package/dist/lib/colorField.js +1 -1
- package/dist/lib/companionMarkdown.js +1 -1
- package/dist/lib/conditionalField.js +1 -1
- package/dist/lib/configStore.js +1 -1
- package/dist/lib/contentSourceError.js +1 -1
- package/dist/lib/datetimeField.js +1 -1
- package/dist/lib/deploymentEnv.js +1 -1
- package/dist/lib/entryDiff.d.ts +33 -0
- package/dist/lib/entryDiff.d.ts.map +1 -0
- package/dist/lib/entryDiff.js +75 -0
- package/dist/lib/entryDiff.js.map +1 -0
- package/dist/lib/entryEditUrl.d.ts +10 -0
- package/dist/lib/entryEditUrl.d.ts.map +1 -0
- package/dist/lib/entryEditUrl.js +9 -0
- package/dist/lib/entryEditUrl.js.map +1 -0
- package/dist/lib/extractImageMetadata.js +1 -1
- package/dist/lib/githubContentMode.js +1 -1
- package/dist/lib/initialEntryFields.js +1 -1
- package/dist/lib/jsonField.js +1 -1
- package/dist/lib/localReader.js +1 -1
- package/dist/lib/numberField.js +1 -1
- package/dist/lib/persistedFormFields.js +1 -1
- package/dist/lib/referenceKeys.js +1 -1
- package/dist/lib/relativeTime.d.ts +6 -0
- package/dist/lib/relativeTime.d.ts.map +1 -0
- package/dist/lib/relativeTime.js +17 -0
- package/dist/lib/relativeTime.js.map +1 -0
- package/dist/lib/resolveEntryTitle.d.ts +42 -0
- package/dist/lib/resolveEntryTitle.d.ts.map +1 -0
- package/dist/lib/resolveEntryTitle.js +84 -0
- package/dist/lib/resolveEntryTitle.js.map +1 -0
- package/dist/lib/richtext/parseRichText.js +1 -1
- package/dist/lib/richtextFieldConfig.js +1 -1
- package/dist/lib/searchIndex.d.ts +13 -0
- package/dist/lib/searchIndex.d.ts.map +1 -1
- package/dist/lib/searchIndex.js +8 -3
- package/dist/lib/searchIndex.js.map +1 -1
- package/dist/lib/selectField.js +1 -1
- package/dist/lib/slugField.js +1 -1
- package/dist/lib/stringListField.js +1 -1
- package/dist/lib/suggestedMediaTitle.js +1 -1
- package/dist/lib/urlField.js +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/lib/validateEntryFields.js +1 -1
- package/dist/query.cjs +325 -361
- package/dist/query.cjs.map +1 -1
- package/dist/query.js +1 -1
- package/dist/schema/diffSchema.d.ts +58 -0
- package/dist/schema/diffSchema.d.ts.map +1 -0
- package/dist/schema/fieldFormats.d.ts +24 -0
- package/dist/schema/fieldFormats.d.ts.map +1 -0
- package/dist/schema/migrateContent.d.ts +121 -0
- package/dist/schema/migrateContent.d.ts.map +1 -0
- package/dist/schema/types.d.ts +53 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/{typesGen-RDG5SY5R.js → typesGen-EYRZAA56.js} +8 -5
- package/dist/typesGen-EYRZAA56.js.map +1 -0
- package/dist/update-GBKBWOJX.js +183 -0
- package/dist/update-GBKBWOJX.js.map +1 -0
- package/dist/utils/formatUpdatedAt.d.ts +2 -0
- package/dist/utils/formatUpdatedAt.d.ts.map +1 -0
- package/dist/utils/formatUpdatedAt.js +16 -0
- package/dist/utils/formatUpdatedAt.js.map +1 -0
- package/dist/utils/parseFileName.js +1 -1
- package/dist/{validate-IPA3LKXQ.js → validate-6AFW6U2X.js} +6 -4
- package/dist/{validate-IPA3LKXQ.js.map → validate-6AFW6U2X.js.map} +1 -1
- package/dist/withOctoCMS.js +1 -1
- package/docs/editing-schema.md +188 -0
- package/docs/index.md +5 -3
- package/docs/overview.md +13 -4
- package/docs/schema.md +1 -1
- package/globals.css +378 -131
- package/package.json +33 -1
- package/dist/admin/pages/SearchPage.d.ts +0 -2
- package/dist/admin/pages/SearchPage.d.ts.map +0 -1
- package/dist/admin/pages/SearchPage.js +0 -20
- package/dist/admin/pages/SearchPage.js.map +0 -1
- package/dist/chunk-33PHLOAE.js +0 -57
- package/dist/chunk-JF5J6WWI.js.map +0 -1
- package/dist/components/CMSSidebar/CMSSidebar.d.ts +0 -2
- package/dist/components/CMSSidebar/CMSSidebar.d.ts.map +0 -1
- package/dist/components/CMSSidebar/CMSSidebar.js +0 -104
- package/dist/components/CMSSidebar/CMSSidebar.js.map +0 -1
- package/dist/components/Header/Header.d.ts +0 -6
- package/dist/components/Header/Header.d.ts.map +0 -1
- package/dist/components/Header/Header.js +0 -293
- package/dist/components/Header/Header.js.map +0 -1
- package/dist/components/SearchPage.d.ts +0 -2
- package/dist/components/SearchPage.d.ts.map +0 -1
- package/dist/components/SearchPage.js +0 -97
- package/dist/components/SearchPage.js.map +0 -1
- package/dist/init-P4ACOEE2.js.map +0 -1
- package/dist/typesGen-RDG5SY5R.js.map +0 -1
- package/dist/update-XCWF4M5X.js +0 -80
- package/dist/update-XCWF4M5X.js.map +0 -1
- /package/dist/{chunk-2NMEKWO5.js.map → agent/providers/types.js.map} +0 -0
package/dist/admin/AdminApp.d.ts
CHANGED
|
@@ -4,19 +4,26 @@ type AdminAppProps = {
|
|
|
4
4
|
}>;
|
|
5
5
|
};
|
|
6
6
|
/**
|
|
7
|
-
* Catch-all admin router
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* export { AdminApp as default } from 'octocms/admin/AdminApp';
|
|
7
|
+
* Catch-all admin router. Mounted via a single `src/app/cms/[[...path]]/page.tsx`
|
|
8
|
+
* file in the user app that re-exports this component as the default.
|
|
11
9
|
*
|
|
12
10
|
* Route segments map to admin pages:
|
|
13
|
-
* /cms
|
|
14
|
-
* /cms/
|
|
15
|
-
* /cms/
|
|
16
|
-
* /cms/
|
|
17
|
-
* /cms
|
|
18
|
-
* /cms
|
|
11
|
+
* /cms → DashboardPage (empty home)
|
|
12
|
+
* /cms/content → ContentPage (all entries)
|
|
13
|
+
* /cms/content/<type> → CollectionPage
|
|
14
|
+
* /cms/content/<type>/<id> → EntryPage
|
|
15
|
+
* /cms/chat → ChatPage (gated on `isAgentEnabled(agentConfig)`)
|
|
16
|
+
* /cms/media → MediaPage (library — grid + folders)
|
|
17
|
+
* /cms/media/<id> → MediaAssetPage (full-page asset editor)
|
|
18
|
+
* /cms/model → ContentModelPage
|
|
19
|
+
* /cms/model/<type> → ContentTypePage
|
|
20
|
+
*
|
|
21
|
+
* Streaming model: each branch wraps its page in `<Suspense fallback={<MatchingSkeleton/>}>`.
|
|
22
|
+
* There is **no outer Suspense** around AdminApp itself — Next.js's
|
|
23
|
+
* navigation hold-over keeps the previous page rendered until the new one's
|
|
24
|
+
* `await params` resolves, so the user never sees a generic-shimmer flash
|
|
25
|
+
* between sub-routes. Only the inner per-page skeleton is ever visible.
|
|
19
26
|
*/
|
|
20
|
-
export declare function AdminApp({ params }: AdminAppProps): import("react/jsx-runtime").JSX.Element
|
|
27
|
+
export declare function AdminApp({ params }: AdminAppProps): Promise<import("react/jsx-runtime").JSX.Element>;
|
|
21
28
|
export {};
|
|
22
29
|
//# sourceMappingURL=AdminApp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminApp.d.ts","sourceRoot":"","sources":["../../admin/AdminApp.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AdminApp.d.ts","sourceRoot":"","sources":["../../admin/AdminApp.tsx"],"names":[],"mappings":"AAsBA,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,oDAyEvD"}
|
package/dist/admin/AdminApp.js
CHANGED
|
@@ -1,33 +1,59 @@
|
|
|
1
|
-
import "../chunk-
|
|
1
|
+
import "../chunk-B5LE2OEC.js";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { Suspense } from "react";
|
|
4
|
+
import { ChatPageSkeleton } from "../components/Chat/ChatPage.skeleton";
|
|
5
|
+
import { ContentModelListSkeleton } from "../components/ContentModel/ContentModelList.skeleton";
|
|
6
|
+
import { ContentTypeDetailSkeleton } from "../components/ContentModel/ContentTypeDetail.skeleton";
|
|
7
|
+
import { DashboardCollectionSkeleton } from "../components/Dashboard/DashboardContent.collection.skeleton";
|
|
8
|
+
import { DashboardContentSkeleton } from "../components/Dashboard/DashboardContent.skeleton";
|
|
9
|
+
import { DashboardListSkeleton } from "../components/Dashboard/DashboardContent.list.skeleton";
|
|
10
|
+
import { EditPostSkeleton } from "../components/EditPost/EditPost.skeleton";
|
|
11
|
+
import { MediaAssetSkeleton } from "../components/MediaAsset/MediaAsset.skeleton";
|
|
12
|
+
import { MediaManagerSkeleton } from "../components/MediaManager/MediaManager.skeleton";
|
|
13
|
+
import { ChatPage } from "./pages/ChatPage";
|
|
4
14
|
import { CollectionPage } from "./pages/CollectionPage";
|
|
15
|
+
import { ContentModelPage } from "./pages/ContentModelPage";
|
|
16
|
+
import { ContentPage } from "./pages/ContentPage";
|
|
17
|
+
import { ContentTypePage } from "./pages/ContentTypePage";
|
|
5
18
|
import { DashboardPage } from "./pages/DashboardPage";
|
|
6
19
|
import { EntryPage } from "./pages/EntryPage";
|
|
20
|
+
import { MediaAssetPage } from "./pages/MediaAssetPage";
|
|
7
21
|
import { MediaPage } from "./pages/MediaPage";
|
|
8
|
-
|
|
9
|
-
function AdminApp({ params }) {
|
|
10
|
-
return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(AdminAppRouter, { params }) });
|
|
11
|
-
}
|
|
12
|
-
async function AdminAppRouter({ params }) {
|
|
22
|
+
async function AdminApp({ params }) {
|
|
13
23
|
const { path } = await params;
|
|
14
24
|
const segments = path != null ? path : [];
|
|
15
25
|
if (segments.length === 0) {
|
|
16
26
|
return /* @__PURE__ */ jsx(DashboardPage, {});
|
|
17
27
|
}
|
|
18
|
-
if (segments[0] === "
|
|
19
|
-
return /* @__PURE__ */ jsx(
|
|
28
|
+
if (segments[0] === "chat") {
|
|
29
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ChatPageSkeleton, {}), children: /* @__PURE__ */ jsx(ChatPage, {}) });
|
|
20
30
|
}
|
|
21
31
|
if (segments[0] === "media") {
|
|
22
|
-
|
|
23
|
-
|
|
32
|
+
if (segments.length === 1) {
|
|
33
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(MediaManagerSkeleton, {}), children: /* @__PURE__ */ jsx(MediaPage, {}) });
|
|
34
|
+
}
|
|
35
|
+
const id = segments[1];
|
|
36
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(MediaAssetSkeleton, {}), children: /* @__PURE__ */ jsx(MediaAssetPage, { id }) }, id);
|
|
37
|
+
}
|
|
38
|
+
if (segments[0] === "model") {
|
|
39
|
+
if (segments.length === 1) {
|
|
40
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ContentModelListSkeleton, {}), children: /* @__PURE__ */ jsx(ContentModelPage, {}) });
|
|
41
|
+
}
|
|
42
|
+
const [, type] = segments;
|
|
43
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ContentTypeDetailSkeleton, {}), children: /* @__PURE__ */ jsx(ContentTypePage, { type }) }, type);
|
|
24
44
|
}
|
|
25
|
-
if (segments
|
|
26
|
-
|
|
27
|
-
|
|
45
|
+
if (segments[0] === "content") {
|
|
46
|
+
if (segments.length === 1) {
|
|
47
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(DashboardListSkeleton, {}), children: /* @__PURE__ */ jsx(ContentPage, {}) });
|
|
48
|
+
}
|
|
49
|
+
if (segments.length === 2) {
|
|
50
|
+
const [, type2] = segments;
|
|
51
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(DashboardCollectionSkeleton, {}), children: /* @__PURE__ */ jsx(CollectionPage, { params: Promise.resolve({ type: type2 }) }) }, type2);
|
|
52
|
+
}
|
|
53
|
+
const [, type, id] = segments;
|
|
54
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(EditPostSkeleton, {}), children: /* @__PURE__ */ jsx(EntryPage, { params: Promise.resolve({ type, id }) }) }, `${type}/${id}`);
|
|
28
55
|
}
|
|
29
|
-
|
|
30
|
-
return /* @__PURE__ */ jsx(EntryPage, { params: Promise.resolve({ type, id }) });
|
|
56
|
+
return /* @__PURE__ */ jsx(DashboardContentSkeleton, {});
|
|
31
57
|
}
|
|
32
58
|
export {
|
|
33
59
|
AdminApp
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import React, { Suspense } from 'react';\n\nimport { CollectionPage } from './pages/CollectionPage';\nimport { DashboardPage } from './pages/DashboardPage';\nimport { EntryPage } from './pages/EntryPage';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import React, { Suspense } from 'react';\n\nimport { ChatPageSkeleton } from '../components/Chat/ChatPage.skeleton';\nimport { ContentModelListSkeleton } from '../components/ContentModel/ContentModelList.skeleton';\nimport { ContentTypeDetailSkeleton } from '../components/ContentModel/ContentTypeDetail.skeleton';\nimport { DashboardCollectionSkeleton } from '../components/Dashboard/DashboardContent.collection.skeleton';\nimport { DashboardContentSkeleton } from '../components/Dashboard/DashboardContent.skeleton';\nimport { DashboardListSkeleton } from '../components/Dashboard/DashboardContent.list.skeleton';\nimport { EditPostSkeleton } from '../components/EditPost/EditPost.skeleton';\nimport { MediaAssetSkeleton } from '../components/MediaAsset/MediaAsset.skeleton';\nimport { MediaManagerSkeleton } from '../components/MediaManager/MediaManager.skeleton';\n\nimport { ChatPage } from './pages/ChatPage';\nimport { CollectionPage } from './pages/CollectionPage';\nimport { ContentModelPage } from './pages/ContentModelPage';\nimport { ContentPage } from './pages/ContentPage';\nimport { ContentTypePage } from './pages/ContentTypePage';\nimport { DashboardPage } from './pages/DashboardPage';\nimport { EntryPage } from './pages/EntryPage';\nimport { MediaAssetPage } from './pages/MediaAssetPage';\nimport { MediaPage } from './pages/MediaPage';\n\ntype AdminAppProps = {\n params: Promise<{ path?: string[] }>;\n};\n\n/**\n * Catch-all admin router. Mounted via a single `src/app/cms/[[...path]]/page.tsx`\n * file in the user app that re-exports this component as the default.\n *\n * Route segments map to admin pages:\n * /cms → DashboardPage (empty home)\n * /cms/content → ContentPage (all entries)\n * /cms/content/<type> → CollectionPage\n * /cms/content/<type>/<id> → EntryPage\n * /cms/chat → ChatPage (gated on `isAgentEnabled(agentConfig)`)\n * /cms/media → MediaPage (library — grid + folders)\n * /cms/media/<id> → MediaAssetPage (full-page asset editor)\n * /cms/model → ContentModelPage\n * /cms/model/<type> → ContentTypePage\n *\n * Streaming model: each branch wraps its page in `<Suspense fallback={<MatchingSkeleton/>}>`.\n * There is **no outer Suspense** around AdminApp itself — Next.js's\n * navigation hold-over keeps the previous page rendered until the new one's\n * `await params` resolves, so the user never sees a generic-shimmer flash\n * between sub-routes. Only the inner per-page skeleton is ever visible.\n */\nexport async function AdminApp({ params }: AdminAppProps) {\n const { path } = await params;\n const segments = path ?? [];\n\n if (segments.length === 0) {\n return <DashboardPage />;\n }\n\n if (segments[0] === 'chat') {\n return (\n <Suspense fallback={<ChatPageSkeleton />}>\n <ChatPage />\n </Suspense>\n );\n }\n\n if (segments[0] === 'media') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<MediaManagerSkeleton />}>\n <MediaPage />\n </Suspense>\n );\n }\n const id = segments[1];\n return (\n <Suspense fallback={<MediaAssetSkeleton />} key={id}>\n <MediaAssetPage id={id} />\n </Suspense>\n );\n }\n\n if (segments[0] === 'model') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<ContentModelListSkeleton />}>\n <ContentModelPage />\n </Suspense>\n );\n }\n const [, type] = segments;\n return (\n <Suspense fallback={<ContentTypeDetailSkeleton />} key={type}>\n <ContentTypePage type={type} />\n </Suspense>\n );\n }\n\n if (segments[0] === 'content') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<DashboardListSkeleton />}>\n <ContentPage />\n </Suspense>\n );\n }\n if (segments.length === 2) {\n const [, type] = segments;\n return (\n <Suspense fallback={<DashboardCollectionSkeleton />} key={type}>\n <CollectionPage params={Promise.resolve({ type })} />\n </Suspense>\n );\n }\n const [, type, id] = segments;\n return (\n <Suspense fallback={<EditPostSkeleton />} key={`${type}/${id}`}>\n <EntryPage params={Promise.resolve({ type, id })} />\n </Suspense>\n );\n }\n\n return <DashboardContentSkeleton />;\n}\n"],"mappings":";AAoDW;AApDX,SAAgB,gBAAgB;AAEhC,SAAS,wBAAwB;AACjC,SAAS,gCAAgC;AACzC,SAAS,iCAAiC;AAC1C,SAAS,mCAAmC;AAC5C,SAAS,gCAAgC;AACzC,SAAS,6BAA6B;AACtC,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AACnC,SAAS,4BAA4B;AAErC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AA2B1B,eAAsB,SAAS,EAAE,OAAO,GAAkB;AACxD,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,WAAW,sBAAQ,CAAC;AAE1B,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,oBAAC,iBAAc;AAAA,EACxB;AAEA,MAAI,SAAS,CAAC,MAAM,QAAQ;AAC1B,WACE,oBAAC,YAAS,UAAU,oBAAC,oBAAiB,GACpC,8BAAC,YAAS,GACZ;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,wBAAqB,GACxC,8BAAC,aAAU,GACb;AAAA,IAEJ;AACA,UAAM,KAAK,SAAS,CAAC;AACrB,WACE,oBAAC,YAAS,UAAU,oBAAC,sBAAmB,GACtC,8BAAC,kBAAe,IAAQ,KADuB,EAEjD;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,4BAAyB,GAC5C,8BAAC,oBAAiB,GACpB;AAAA,IAEJ;AACA,UAAM,CAAC,EAAE,IAAI,IAAI;AACjB,WACE,oBAAC,YAAS,UAAU,oBAAC,6BAA0B,GAC7C,8BAAC,mBAAgB,MAAY,KADyB,IAExD;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,WAAW;AAC7B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,yBAAsB,GACzC,8BAAC,eAAY,GACf;AAAA,IAEJ;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,CAAC,EAAEA,KAAI,IAAI;AACjB,aACE,oBAAC,YAAS,UAAU,oBAAC,+BAA4B,GAC/C,8BAAC,kBAAe,QAAQ,QAAQ,QAAQ,EAAE,MAAAA,MAAK,CAAC,GAAG,KADKA,KAE1D;AAAA,IAEJ;AACA,UAAM,CAAC,EAAE,MAAM,EAAE,IAAI;AACrB,WACE,oBAAC,YAAS,UAAU,oBAAC,oBAAiB,GACpC,8BAAC,aAAU,QAAQ,QAAQ,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,KADL,GAAG,IAAI,IAAI,EAAE,EAE5D;AAAA,EAEJ;AAEA,SAAO,oBAAC,4BAAyB;AACnC;","names":["type"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type AgentClientStatus = {
|
|
2
|
+
enabled: false;
|
|
3
|
+
} | {
|
|
4
|
+
enabled: true;
|
|
5
|
+
provider: 'anthropic' | 'openai' | 'local';
|
|
6
|
+
model: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Server-side check exposed to the admin client (Header nav link).
|
|
10
|
+
*
|
|
11
|
+
* Never returns the API key. Returns `{ enabled: false }` when the chat is
|
|
12
|
+
* disabled, so the client can hide the nav link without learning *why* —
|
|
13
|
+
* mirroring the route-handler 404.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getAgentClientStatus(): Promise<AgentClientStatus>;
|
|
16
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../admin/actions/agent.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAClB;IACE,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN;;;;;;GAMG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAOvE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import "../../chunk-B5LE2OEC.js";
|
|
3
|
+
import { getAgentConfig } from "../../agent/configStore";
|
|
4
|
+
import { getAgentStatus, isAgentEnabled } from "../../agent/featureFlag";
|
|
5
|
+
async function getAgentClientStatus() {
|
|
6
|
+
const cfg = getAgentConfig();
|
|
7
|
+
if (!cfg || !isAgentEnabled(cfg)) return { enabled: false };
|
|
8
|
+
const status = getAgentStatus(cfg);
|
|
9
|
+
if (!status.enabled) return { enabled: false };
|
|
10
|
+
return { enabled: true, provider: cfg.provider.type, model: cfg.provider.model };
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
getAgentClientStatus
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../admin/actions/agent.ts"],"sourcesContent":["'use server';\n\nimport { getAgentConfig } from '../../agent/configStore';\nimport { getAgentStatus, isAgentEnabled } from '../../agent/featureFlag';\n\nexport type AgentClientStatus =\n | { enabled: false }\n | {\n enabled: true;\n provider: 'anthropic' | 'openai' | 'local';\n model: string;\n };\n\n/**\n * Server-side check exposed to the admin client (Header nav link).\n *\n * Never returns the API key. Returns `{ enabled: false }` when the chat is\n * disabled, so the client can hide the nav link without learning *why* —\n * mirroring the route-handler 404.\n */\nexport async function getAgentClientStatus(): Promise<AgentClientStatus> {\n const cfg = getAgentConfig();\n if (!cfg || !isAgentEnabled(cfg)) return { enabled: false };\n // Recompute via getAgentStatus so we exercise the same code path the route uses.\n const status = getAgentStatus(cfg);\n if (!status.enabled) return { enabled: false };\n return { enabled: true, provider: cfg.provider.type, model: cfg.provider.model };\n}\n"],"mappings":";;AAEA,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB,sBAAsB;AAiB/C,eAAsB,uBAAmD;AACvE,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAC,OAAO,CAAC,eAAe,GAAG,EAAG,QAAO,EAAE,SAAS,MAAM;AAE1D,QAAM,SAAS,eAAe,GAAG;AACjC,MAAI,CAAC,OAAO,QAAS,QAAO,EAAE,SAAS,MAAM;AAC7C,SAAO,EAAE,SAAS,MAAM,UAAU,IAAI,SAAS,MAAM,OAAO,IAAI,SAAS,MAAM;AACjF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../admin/actions/build.ts"],"names":[],"mappings":"AAaA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAOjE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AA0FF,eAAO,MAAM,UAAU,GAAU,kBAAkB,MAAM,EAAE,UAAU,iBAAiB,KAAG,OAAO,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../admin/actions/build.ts"],"names":[],"mappings":"AAaA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAOjE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AA0FF,eAAO,MAAM,UAAU,GAAU,kBAAkB,MAAM,EAAE,UAAU,iBAAiB,KAAG,OAAO,CAAC,YAAY,CAmC5G,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use server";
|
|
2
|
-
import "../../chunk-
|
|
2
|
+
import "../../chunk-B5LE2OEC.js";
|
|
3
3
|
import fsPromises from "fs/promises";
|
|
4
4
|
import path from "path";
|
|
5
5
|
import { glob } from "glob";
|
|
6
|
-
import { revalidatePath, updateTag } from "next/cache";
|
|
6
|
+
import { revalidatePath, revalidateTag, updateTag } from "next/cache";
|
|
7
7
|
import { getConfig } from "../../lib/configStore";
|
|
8
8
|
import { companionMarkdownPathsForEntry, companionRichTextPathsForEntry } from "../../lib/companionMarkdown";
|
|
9
9
|
import { buildSearchIndex } from "../../lib/searchIndex";
|
|
@@ -85,7 +85,11 @@ const buildJsons = async (_editedFileName, options) => {
|
|
|
85
85
|
var _a;
|
|
86
86
|
try {
|
|
87
87
|
for (const tag of PUBLIC_CACHE_TAGS) {
|
|
88
|
-
|
|
88
|
+
try {
|
|
89
|
+
updateTag(tag);
|
|
90
|
+
} catch (e) {
|
|
91
|
+
revalidateTag(tag, { expire: 0 });
|
|
92
|
+
}
|
|
89
93
|
}
|
|
90
94
|
revalidatePath("/", "layout");
|
|
91
95
|
revalidatePath("/blog", "page");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../admin/actions/build.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { glob } from 'glob';\nimport { revalidatePath, updateTag } from 'next/cache';\n\nimport { getConfig } from '../../lib/configStore';\nimport { companionMarkdownPathsForEntry, companionRichTextPathsForEntry } from '../../lib/companionMarkdown';\nimport { buildSearchIndex, type EntryForSearch } from '../../lib/searchIndex';\n\nimport { isProductionMode, saveGitHubFile } from '../github';\nimport { actionErr, actionOk, type ActionResult } from './utils';\n\n/** Cache tags used by `getHomePage` / `getBlog` / `getPublishedPosts` in `src/app/cms/ssr/getPageContent.ts`. */\nconst PUBLIC_CACHE_TAGS = ['homePage', 'blog'] as const;\n\nconst SEARCH_INDEX_FILE_PATH = 'cms/__generated__/search-index.json';\n\nexport type BuildJsonsOptions = {\n /** Slug-based `/blog/...` paths to revalidate in addition to the dynamic route segment. */\n blogPaths?: string[];\n};\n\n/** Helper: gather all searchable entries from the filesystem. */\nasync function getEntriesForPublicSearch(): Promise<EntryForSearch[]> {\n const config = getConfig();\n const publicCollections = config.search?.publicCollections;\n if (!publicCollections || Object.keys(publicCollections).length === 0) {\n return [];\n }\n\n const files = await glob(`${config.contentFolder}/**/*.json`);\n const entries: EntryForSearch[] = [];\n\n for (const file of files) {\n const normalized = file.replace(/\\\\/g, '/');\n // Skip media entries\n if (normalized.includes('/media/')) continue;\n\n try {\n const filePath = path.join(process.cwd(), normalized);\n const data = await fsPromises.readFile(filePath, { encoding: 'utf8' });\n const content = JSON.parse(data) as Record<string, unknown>;\n const sys = content.sys as { type?: string } | undefined;\n const type = sys?.type;\n\n // Only include entries from publicCollections\n if (!type || !(type in publicCollections)) continue;\n\n // Read companion markdown/richtext files\n const companions: Record<string, string> = {};\n if (type) {\n const mdPaths = companionMarkdownPathsForEntry(normalized, type, config.collections);\n for (const [fieldName, mdPath] of Object.entries(mdPaths)) {\n try {\n const mdFilePath = path.join(process.cwd(), mdPath);\n companions[fieldName] = await fsPromises.readFile(mdFilePath, { encoding: 'utf8' });\n } catch {\n companions[fieldName] = '';\n }\n }\n const rtPaths = companionRichTextPathsForEntry(normalized, type, config.collections);\n for (const [fieldName, rtPath] of Object.entries(rtPaths)) {\n try {\n const rtFilePath = path.join(process.cwd(), rtPath);\n companions[fieldName] = await fsPromises.readFile(rtFilePath, { encoding: 'utf8' });\n } catch {\n companions[fieldName] = '';\n }\n }\n }\n\n entries.push({\n path: normalized.replace(`${config.contentFolder}/`, ''),\n content,\n companionContent: companions,\n });\n } catch {\n // Skip unreadable files\n }\n }\n\n return entries;\n}\n\n/** Build and write the public search index. */\nasync function buildAndWriteSearchIndex(): Promise<void> {\n const config = getConfig();\n const publicCollections = config.search?.publicCollections;\n if (!publicCollections || Object.keys(publicCollections).length === 0) {\n return;\n }\n\n try {\n const entries = await getEntriesForPublicSearch();\n const indexJson = buildSearchIndex(entries, config, Object.keys(publicCollections));\n\n if (isProductionMode()) {\n // Write to GitHub\n await saveGitHubFile(SEARCH_INDEX_FILE_PATH, indexJson, 'CMS: update search index');\n } else {\n // Write to local filesystem\n const filePath = path.join(process.cwd(), SEARCH_INDEX_FILE_PATH);\n await fsPromises.mkdir(path.dirname(filePath), { recursive: true });\n await fsPromises.writeFile(filePath, indexJson, 'utf8');\n }\n } catch {\n // Silently fail search index generation to not block the build\n }\n}\n\nexport const buildJsons = async (_editedFileName?: string, options?: BuildJsonsOptions): Promise<ActionResult> => {\n try {\n for (const tag of PUBLIC_CACHE_TAGS) {\n updateTag(tag);\n }\n\n revalidatePath('/', 'layout');\n revalidatePath('/blog', 'page');\n revalidatePath('/blog/[slug]', 'page');\n\n const seen = new Set<string>();\n for (const p of options?.blogPaths ?? []) {\n if (typeof p === 'string' && p.startsWith('/blog/') && !seen.has(p)) {\n seen.add(p);\n revalidatePath(p);\n }\n }\n\n // Build and write the public search index\n await buildAndWriteSearchIndex();\n\n return actionOk();\n } catch (e) {\n return actionErr(e);\n }\n};\n"],"mappings":";;AAEA,OAAO,gBAAgB;AACvB,OAAO,UAAU;AAEjB,SAAS,YAAY;AACrB,SAAS,gBAAgB,iBAAiB;
|
|
1
|
+
{"version":3,"sources":["../../../admin/actions/build.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { glob } from 'glob';\nimport { revalidatePath, revalidateTag, updateTag } from 'next/cache';\n\nimport { getConfig } from '../../lib/configStore';\nimport { companionMarkdownPathsForEntry, companionRichTextPathsForEntry } from '../../lib/companionMarkdown';\nimport { buildSearchIndex, type EntryForSearch } from '../../lib/searchIndex';\n\nimport { isProductionMode, saveGitHubFile } from '../github';\nimport { actionErr, actionOk, type ActionResult } from './utils';\n\n/** Cache tags used by `getHomePage` / `getBlog` / `getPublishedPosts` in `src/app/cms/ssr/getPageContent.ts`. */\nconst PUBLIC_CACHE_TAGS = ['homePage', 'blog'] as const;\n\nconst SEARCH_INDEX_FILE_PATH = 'cms/__generated__/search-index.json';\n\nexport type BuildJsonsOptions = {\n /** Slug-based `/blog/...` paths to revalidate in addition to the dynamic route segment. */\n blogPaths?: string[];\n};\n\n/** Helper: gather all searchable entries from the filesystem. */\nasync function getEntriesForPublicSearch(): Promise<EntryForSearch[]> {\n const config = getConfig();\n const publicCollections = config.search?.publicCollections;\n if (!publicCollections || Object.keys(publicCollections).length === 0) {\n return [];\n }\n\n const files = await glob(`${config.contentFolder}/**/*.json`);\n const entries: EntryForSearch[] = [];\n\n for (const file of files) {\n const normalized = file.replace(/\\\\/g, '/');\n // Skip media entries\n if (normalized.includes('/media/')) continue;\n\n try {\n const filePath = path.join(process.cwd(), normalized);\n const data = await fsPromises.readFile(filePath, { encoding: 'utf8' });\n const content = JSON.parse(data) as Record<string, unknown>;\n const sys = content.sys as { type?: string } | undefined;\n const type = sys?.type;\n\n // Only include entries from publicCollections\n if (!type || !(type in publicCollections)) continue;\n\n // Read companion markdown/richtext files\n const companions: Record<string, string> = {};\n if (type) {\n const mdPaths = companionMarkdownPathsForEntry(normalized, type, config.collections);\n for (const [fieldName, mdPath] of Object.entries(mdPaths)) {\n try {\n const mdFilePath = path.join(process.cwd(), mdPath);\n companions[fieldName] = await fsPromises.readFile(mdFilePath, { encoding: 'utf8' });\n } catch {\n companions[fieldName] = '';\n }\n }\n const rtPaths = companionRichTextPathsForEntry(normalized, type, config.collections);\n for (const [fieldName, rtPath] of Object.entries(rtPaths)) {\n try {\n const rtFilePath = path.join(process.cwd(), rtPath);\n companions[fieldName] = await fsPromises.readFile(rtFilePath, { encoding: 'utf8' });\n } catch {\n companions[fieldName] = '';\n }\n }\n }\n\n entries.push({\n path: normalized.replace(`${config.contentFolder}/`, ''),\n content,\n companionContent: companions,\n });\n } catch {\n // Skip unreadable files\n }\n }\n\n return entries;\n}\n\n/** Build and write the public search index. */\nasync function buildAndWriteSearchIndex(): Promise<void> {\n const config = getConfig();\n const publicCollections = config.search?.publicCollections;\n if (!publicCollections || Object.keys(publicCollections).length === 0) {\n return;\n }\n\n try {\n const entries = await getEntriesForPublicSearch();\n const indexJson = buildSearchIndex(entries, config, Object.keys(publicCollections));\n\n if (isProductionMode()) {\n // Write to GitHub\n await saveGitHubFile(SEARCH_INDEX_FILE_PATH, indexJson, 'CMS: update search index');\n } else {\n // Write to local filesystem\n const filePath = path.join(process.cwd(), SEARCH_INDEX_FILE_PATH);\n await fsPromises.mkdir(path.dirname(filePath), { recursive: true });\n await fsPromises.writeFile(filePath, indexJson, 'utf8');\n }\n } catch {\n // Silently fail search index generation to not block the build\n }\n}\n\nexport const buildJsons = async (_editedFileName?: string, options?: BuildJsonsOptions): Promise<ActionResult> => {\n try {\n for (const tag of PUBLIC_CACHE_TAGS) {\n // `updateTag` gives read-your-own-writes inside a Server Action (the\n // editor save path). When called from a Route Handler — e.g. the\n // proposal accept endpoint at `/api/agent/proposals/accept` — the\n // runtime throws (\"updateTag can only be called from within a Server\n // Action\"); fall back to `revalidateTag` with immediate expiry, which\n // is allowed everywhere and produces the same fresh-data outcome.\n try {\n updateTag(tag);\n } catch {\n revalidateTag(tag, { expire: 0 });\n }\n }\n\n revalidatePath('/', 'layout');\n revalidatePath('/blog', 'page');\n revalidatePath('/blog/[slug]', 'page');\n\n const seen = new Set<string>();\n for (const p of options?.blogPaths ?? []) {\n if (typeof p === 'string' && p.startsWith('/blog/') && !seen.has(p)) {\n seen.add(p);\n revalidatePath(p);\n }\n }\n\n // Build and write the public search index\n await buildAndWriteSearchIndex();\n\n return actionOk();\n } catch (e) {\n return actionErr(e);\n }\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type FieldDiff } from '../../lib/entryDiff';
|
|
2
|
+
export type EntryDiff = {
|
|
3
|
+
changed: boolean;
|
|
4
|
+
activeBranch: string;
|
|
5
|
+
baseBranch: string;
|
|
6
|
+
/** Per-field diffs derived from the entry JSON `fields` object. */
|
|
7
|
+
fields: Record<string, FieldDiff>;
|
|
8
|
+
/** Raw before/after text for companion markdown/richtext files, keyed by field name. */
|
|
9
|
+
companions: Record<string, {
|
|
10
|
+
before: string | null;
|
|
11
|
+
after: string | null;
|
|
12
|
+
}>;
|
|
13
|
+
/** Resolved `/media/<uuid>.<ext>` URLs for image UUIDs appearing on either side of the diff. */
|
|
14
|
+
imageUrls: Record<string, string>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Compute the diff between the currently active feature branch and the base branch for a
|
|
18
|
+
* single entry's files (JSON + companion `.md` / `.mdx`). Read-only, best-effort: any failure
|
|
19
|
+
* resolves to an empty diff so the UI never throws.
|
|
20
|
+
*/
|
|
21
|
+
export declare const getEntryDiff: (filePath: string) => Promise<EntryDiff>;
|
|
22
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../admin/actions/diff.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOtF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,wFAAwF;IACxF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAC5E,gGAAgG;IAChG,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC,CAAC;AA8CF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,SAAS,CA0GtE,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import "../../chunk-B5LE2OEC.js";
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
import fsPromises from "node:fs/promises";
|
|
5
|
+
import { getConfig } from "../../lib/configStore";
|
|
6
|
+
import { companionFilePathsForEntry } from "../../lib/companionMarkdown";
|
|
7
|
+
import { diffEntryFields, safeParseEntry } from "../../lib/entryDiff";
|
|
8
|
+
import { logCmsServerError } from "../../lib/cmsServerLog";
|
|
9
|
+
import { parseFileName } from "../../utils/parseFileName";
|
|
10
|
+
import { getGitHubFile, isProductionMode } from "../github";
|
|
11
|
+
import { getBranch } from "./git";
|
|
12
|
+
import { getErrorMessage } from "./utils";
|
|
13
|
+
const emptyDiff = (activeBranch = "", baseBranch = "") => ({
|
|
14
|
+
changed: false,
|
|
15
|
+
activeBranch,
|
|
16
|
+
baseBranch,
|
|
17
|
+
fields: {},
|
|
18
|
+
companions: {},
|
|
19
|
+
imageUrls: {}
|
|
20
|
+
});
|
|
21
|
+
async function readFileAtRef(filePath, ref, isProd) {
|
|
22
|
+
if (isProd) {
|
|
23
|
+
const result = await getGitHubFile(filePath, ref);
|
|
24
|
+
return result ? result.content : null;
|
|
25
|
+
}
|
|
26
|
+
return await readFileAtGitRef(filePath, ref);
|
|
27
|
+
}
|
|
28
|
+
function readFileAtGitRef(filePath, ref) {
|
|
29
|
+
return new Promise((resolve) => {
|
|
30
|
+
execFile("git", ["show", `${ref}:${filePath}`], { maxBuffer: 10 * 1024 * 1024 }, (error, stdout) => {
|
|
31
|
+
if (error) {
|
|
32
|
+
resolve(null);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
resolve(stdout.toString());
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async function readWorkingTreeFile(filePath) {
|
|
40
|
+
try {
|
|
41
|
+
return await fsPromises.readFile(filePath, "utf-8");
|
|
42
|
+
} catch (e) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const getEntryDiff = async (filePath) => {
|
|
47
|
+
if (!filePath) return emptyDiff();
|
|
48
|
+
try {
|
|
49
|
+
const config = getConfig();
|
|
50
|
+
const baseBranch = config.git.baseBranch;
|
|
51
|
+
const activeBranch = await getBranch();
|
|
52
|
+
const isProd = isProductionMode();
|
|
53
|
+
if (!activeBranch || activeBranch === baseBranch) {
|
|
54
|
+
return emptyDiff(activeBranch, baseBranch);
|
|
55
|
+
}
|
|
56
|
+
const { type: collectionType } = parseFileName(filePath);
|
|
57
|
+
const [afterJson, beforeJson] = await Promise.all([
|
|
58
|
+
isProd ? readFileAtRef(filePath, activeBranch, true) : readWorkingTreeFile(filePath),
|
|
59
|
+
readFileAtRef(filePath, baseBranch, isProd)
|
|
60
|
+
]);
|
|
61
|
+
const fields = diffEntryFields(safeParseEntry(beforeJson), safeParseEntry(afterJson));
|
|
62
|
+
const companionPaths = companionFilePathsForEntry(filePath, collectionType, config.collections);
|
|
63
|
+
const companionEntries = Object.entries(companionPaths);
|
|
64
|
+
const companionResults = await Promise.all(
|
|
65
|
+
companionEntries.map(async ([fieldName, compPath]) => {
|
|
66
|
+
const [after, before] = await Promise.all([
|
|
67
|
+
isProd ? readFileAtRef(compPath, activeBranch, true) : readWorkingTreeFile(compPath),
|
|
68
|
+
readFileAtRef(compPath, baseBranch, isProd)
|
|
69
|
+
]);
|
|
70
|
+
return [fieldName, { before, after }];
|
|
71
|
+
})
|
|
72
|
+
);
|
|
73
|
+
const companions = {};
|
|
74
|
+
for (const [fieldName, payload] of companionResults) {
|
|
75
|
+
companions[fieldName] = payload;
|
|
76
|
+
}
|
|
77
|
+
const hasFieldChange = Object.values(fields).some((d) => d.kind !== "unchanged");
|
|
78
|
+
const hasCompanionChange = Object.values(companions).some((c) => {
|
|
79
|
+
var _a, _b;
|
|
80
|
+
return ((_a = c.before) != null ? _a : "") !== ((_b = c.after) != null ? _b : "");
|
|
81
|
+
});
|
|
82
|
+
const collectionDef = config.collections[collectionType];
|
|
83
|
+
const imageFieldNames = collectionDef ? Object.entries(collectionDef.fields).filter(([, f]) => f.format === "image").map(([name]) => name) : [];
|
|
84
|
+
const imageUuids = /* @__PURE__ */ new Set();
|
|
85
|
+
for (const name of imageFieldNames) {
|
|
86
|
+
const d = fields[name];
|
|
87
|
+
if (!d) continue;
|
|
88
|
+
if (d.kind === "added" && typeof d.after === "string") imageUuids.add(d.after);
|
|
89
|
+
else if (d.kind === "removed" && typeof d.before === "string") imageUuids.add(d.before);
|
|
90
|
+
else if (d.kind === "changed") {
|
|
91
|
+
if (typeof d.before === "string") imageUuids.add(d.before);
|
|
92
|
+
if (typeof d.after === "string") imageUuids.add(d.after);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const imageUrls = {};
|
|
96
|
+
if (imageUuids.size > 0) {
|
|
97
|
+
const mediaDir = `${config.contentFolder}/media`;
|
|
98
|
+
const resolvePairs = await Promise.all(
|
|
99
|
+
Array.from(imageUuids).map(async (uuid) => {
|
|
100
|
+
var _a, _b, _c;
|
|
101
|
+
if (!uuid || uuid.startsWith("/")) return [uuid, uuid];
|
|
102
|
+
let raw = (_a = await readFileAtRef(`${mediaDir}/media-${uuid}.json`, activeBranch, isProd)) != null ? _a : await readFileAtRef(`${mediaDir}/media-${uuid}.json`, baseBranch, isProd);
|
|
103
|
+
if (!raw) {
|
|
104
|
+
raw = (_b = await readFileAtRef(`${mediaDir}/${uuid}.json`, activeBranch, isProd)) != null ? _b : await readFileAtRef(`${mediaDir}/${uuid}.json`, baseBranch, isProd);
|
|
105
|
+
}
|
|
106
|
+
const parsed = safeParseEntry(raw);
|
|
107
|
+
const ext = parsed && typeof ((_c = parsed.fields) == null ? void 0 : _c.extension) === "string" ? parsed.fields.extension : "";
|
|
108
|
+
return [uuid, ext ? `/media/${uuid}.${ext}` : ""];
|
|
109
|
+
})
|
|
110
|
+
);
|
|
111
|
+
for (const [uuid, url] of resolvePairs) {
|
|
112
|
+
if (url) imageUrls[uuid] = url;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
changed: hasFieldChange || hasCompanionChange,
|
|
117
|
+
activeBranch,
|
|
118
|
+
baseBranch,
|
|
119
|
+
fields,
|
|
120
|
+
companions,
|
|
121
|
+
imageUrls
|
|
122
|
+
};
|
|
123
|
+
} catch (e) {
|
|
124
|
+
logCmsServerError({ operation: "getEntryDiff", message: getErrorMessage(e) });
|
|
125
|
+
return emptyDiff();
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
export {
|
|
129
|
+
getEntryDiff
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../admin/actions/diff.ts"],"sourcesContent":["'use server';\n\nimport { execFile } from 'node:child_process';\nimport fsPromises from 'node:fs/promises';\n\nimport { getConfig } from '../../lib/configStore';\nimport { companionFilePathsForEntry } from '../../lib/companionMarkdown';\nimport { diffEntryFields, safeParseEntry, type FieldDiff } from '../../lib/entryDiff';\nimport { logCmsServerError } from '../../lib/cmsServerLog';\nimport { parseFileName } from '../../utils/parseFileName';\nimport { getGitHubFile, isProductionMode } from '../github';\nimport { getBranch } from './git';\nimport { getErrorMessage } from './utils';\n\nexport type EntryDiff = {\n changed: boolean;\n activeBranch: string;\n baseBranch: string;\n /** Per-field diffs derived from the entry JSON `fields` object. */\n fields: Record<string, FieldDiff>;\n /** Raw before/after text for companion markdown/richtext files, keyed by field name. */\n companions: Record<string, { before: string | null; after: string | null }>;\n /** Resolved `/media/<uuid>.<ext>` URLs for image UUIDs appearing on either side of the diff. */\n imageUrls: Record<string, string>;\n};\n\nconst emptyDiff = (activeBranch = '', baseBranch = ''): EntryDiff => ({\n changed: false,\n activeBranch,\n baseBranch,\n fields: {},\n companions: {},\n imageUrls: {},\n});\n\n/**\n * Read a file at a specific git ref. Returns `null` if the file doesn't exist on that ref.\n * - Production: GitHub API via {@link getGitHubFile}.\n * - Dev: `git show <ref>:<path>` for committed content, or the working-tree file when the ref\n * matches the currently checked-out branch.\n */\nasync function readFileAtRef(filePath: string, ref: string, isProd: boolean): Promise<string | null> {\n if (isProd) {\n const result = await getGitHubFile(filePath, ref);\n return result ? result.content : null;\n }\n return await readFileAtGitRef(filePath, ref);\n}\n\nfunction readFileAtGitRef(filePath: string, ref: string): Promise<string | null> {\n return new Promise((resolve) => {\n execFile('git', ['show', `${ref}:${filePath}`], { maxBuffer: 10 * 1024 * 1024 }, (error, stdout) => {\n if (error) {\n // `git show` exits non-zero if the path doesn't exist on that ref.\n resolve(null);\n return;\n }\n resolve(stdout.toString());\n });\n });\n}\n\nasync function readWorkingTreeFile(filePath: string): Promise<string | null> {\n try {\n return await fsPromises.readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Compute the diff between the currently active feature branch and the base branch for a\n * single entry's files (JSON + companion `.md` / `.mdx`). Read-only, best-effort: any failure\n * resolves to an empty diff so the UI never throws.\n */\nexport const getEntryDiff = async (filePath: string): Promise<EntryDiff> => {\n if (!filePath) return emptyDiff();\n\n try {\n const config = getConfig();\n const baseBranch = config.git.baseBranch;\n const activeBranch = await getBranch();\n const isProd = isProductionMode();\n\n // Same branch on both sides → no unmerged changes.\n if (!activeBranch || activeBranch === baseBranch) {\n return emptyDiff(activeBranch, baseBranch);\n }\n\n const { type: collectionType } = parseFileName(filePath);\n\n // --- Entry JSON ---------------------------------------------------------\n const [afterJson, beforeJson] = await Promise.all([\n isProd ? readFileAtRef(filePath, activeBranch, true) : readWorkingTreeFile(filePath),\n readFileAtRef(filePath, baseBranch, isProd),\n ]);\n\n const fields = diffEntryFields(safeParseEntry(beforeJson), safeParseEntry(afterJson));\n\n // --- Companion files ----------------------------------------------------\n const companionPaths = companionFilePathsForEntry(filePath, collectionType, config.collections);\n const companionEntries = Object.entries(companionPaths);\n\n const companionResults = await Promise.all(\n companionEntries.map(async ([fieldName, compPath]) => {\n const [after, before] = await Promise.all([\n isProd ? readFileAtRef(compPath, activeBranch, true) : readWorkingTreeFile(compPath),\n readFileAtRef(compPath, baseBranch, isProd),\n ]);\n return [fieldName, { before, after }] as const;\n }),\n );\n\n const companions: EntryDiff['companions'] = {};\n for (const [fieldName, payload] of companionResults) {\n companions[fieldName] = payload;\n }\n\n const hasFieldChange = Object.values(fields).some((d) => d.kind !== 'unchanged');\n const hasCompanionChange = Object.values(companions).some((c) => (c.before ?? '') !== (c.after ?? ''));\n\n // Resolve image UUIDs that changed on either side to `/media/<uuid>.<ext>` URLs.\n const collectionDef = (config.collections as Record<string, { fields: Record<string, { format?: string }> }>)[\n collectionType\n ];\n const imageFieldNames = collectionDef\n ? Object.entries(collectionDef.fields)\n .filter(([, f]) => f.format === 'image')\n .map(([name]) => name)\n : [];\n\n const imageUuids = new Set<string>();\n for (const name of imageFieldNames) {\n const d = fields[name];\n if (!d) continue;\n if (d.kind === 'added' && typeof d.after === 'string') imageUuids.add(d.after);\n else if (d.kind === 'removed' && typeof d.before === 'string') imageUuids.add(d.before);\n else if (d.kind === 'changed') {\n if (typeof d.before === 'string') imageUuids.add(d.before);\n if (typeof d.after === 'string') imageUuids.add(d.after);\n }\n }\n\n const imageUrls: Record<string, string> = {};\n if (imageUuids.size > 0) {\n const mediaDir = `${config.contentFolder}/media`;\n const resolvePairs = await Promise.all(\n Array.from(imageUuids).map(async (uuid) => {\n if (!uuid || uuid.startsWith('/')) return [uuid, uuid] as const;\n // Prefer the active-branch media entry; fall back to base branch.\n let raw =\n (await readFileAtRef(`${mediaDir}/media-${uuid}.json`, activeBranch, isProd)) ??\n (await readFileAtRef(`${mediaDir}/media-${uuid}.json`, baseBranch, isProd));\n if (!raw) {\n // Legacy path: {uuid}.json\n raw =\n (await readFileAtRef(`${mediaDir}/${uuid}.json`, activeBranch, isProd)) ??\n (await readFileAtRef(`${mediaDir}/${uuid}.json`, baseBranch, isProd));\n }\n const parsed = safeParseEntry(raw);\n const ext = parsed && typeof parsed.fields?.extension === 'string' ? (parsed.fields.extension as string) : '';\n return [uuid, ext ? `/media/${uuid}.${ext}` : ''] as const;\n }),\n );\n for (const [uuid, url] of resolvePairs) {\n if (url) imageUrls[uuid] = url;\n }\n }\n\n return {\n changed: hasFieldChange || hasCompanionChange,\n activeBranch,\n baseBranch,\n fields,\n companions,\n imageUrls,\n };\n } catch (e) {\n logCmsServerError({ operation: 'getEntryDiff', message: getErrorMessage(e) });\n return emptyDiff();\n }\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../admin/actions/entries.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../admin/actions/entries.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAO9D,eAAO,MAAM,YAAY,GAAU,aAAY,MAAa,KAAG,OAAO,CAAC,aAAa,EAAE,CAsFrF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAU,oBAAoB,MAAM,KAAG,OAAO,CAAC,aAAa,EAAE,CAgE3F,CAAC"}
|
|
@@ -1,16 +1,35 @@
|
|
|
1
1
|
"use server";
|
|
2
|
-
import "../../chunk-
|
|
2
|
+
import "../../chunk-B5LE2OEC.js";
|
|
3
3
|
import fsPromises from "fs/promises";
|
|
4
4
|
import path from "path";
|
|
5
5
|
import { getConfig } from "../../lib/configStore";
|
|
6
6
|
import { getContentFiles, getFile } from "./files";
|
|
7
7
|
import { isProductionMode } from "../github";
|
|
8
|
+
import { getMediaEntries } from "./media";
|
|
8
9
|
import { getEntryTitleField } from "./utils";
|
|
9
10
|
const getEntryList = async (collection = "**") => {
|
|
10
|
-
var _a, _b, _c;
|
|
11
|
+
var _a, _b, _c, _d, _e;
|
|
11
12
|
const config = getConfig();
|
|
12
13
|
const files = await getContentFiles(collection);
|
|
13
14
|
const entries = [];
|
|
15
|
+
const mediaList = await getMediaEntries().catch(() => []);
|
|
16
|
+
const mediaById = /* @__PURE__ */ new Map();
|
|
17
|
+
for (const m of mediaList) {
|
|
18
|
+
mediaById.set(m.id, { ext: m.extension, publicUrl: m.publicUrl });
|
|
19
|
+
}
|
|
20
|
+
const imageFieldKeyByType = /* @__PURE__ */ new Map();
|
|
21
|
+
function firstImageFieldKey(type) {
|
|
22
|
+
var _a2, _b2;
|
|
23
|
+
if (imageFieldKeyByType.has(type)) return (_a2 = imageFieldKeyByType.get(type)) != null ? _a2 : null;
|
|
24
|
+
const collection2 = config.collections[type];
|
|
25
|
+
if (!collection2) {
|
|
26
|
+
imageFieldKeyByType.set(type, null);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const key = (_b2 = Object.keys(collection2.fields).find((k) => collection2.fields[k].format === "image")) != null ? _b2 : null;
|
|
30
|
+
imageFieldKeyByType.set(type, key);
|
|
31
|
+
return key;
|
|
32
|
+
}
|
|
14
33
|
for (const file of files) {
|
|
15
34
|
const nameWithoutFolder = file.replace(`${config.contentFolder}/`, "").replace(".json", "");
|
|
16
35
|
const parts = nameWithoutFolder.split("/");
|
|
@@ -20,6 +39,7 @@ const getEntryList = async (collection = "**") => {
|
|
|
20
39
|
let title = id;
|
|
21
40
|
let status = "merged";
|
|
22
41
|
let updatedAt;
|
|
42
|
+
let thumbnailUrl;
|
|
23
43
|
try {
|
|
24
44
|
const content = await getFile(file);
|
|
25
45
|
if (type === "media") {
|
|
@@ -31,13 +51,25 @@ const getEntryList = async (collection = "**") => {
|
|
|
31
51
|
if (typeof mediaTitle === "string" && mediaTitle.trim() !== "") {
|
|
32
52
|
title = mediaTitle.trim();
|
|
33
53
|
}
|
|
34
|
-
|
|
35
|
-
|
|
54
|
+
const ext = typeof ((_b = content == null ? void 0 : content.fields) == null ? void 0 : _b.extension) === "string" ? content.fields.extension : "";
|
|
55
|
+
if (ext) thumbnailUrl = `/media/${id}.${ext}`;
|
|
56
|
+
} else {
|
|
57
|
+
if (titleField && ((_c = content == null ? void 0 : content.fields) == null ? void 0 : _c[titleField])) {
|
|
58
|
+
title = content.fields[titleField];
|
|
59
|
+
}
|
|
60
|
+
const imgKey = firstImageFieldKey(type);
|
|
61
|
+
if (imgKey) {
|
|
62
|
+
const value = (_d = content == null ? void 0 : content.fields) == null ? void 0 : _d[imgKey];
|
|
63
|
+
if (typeof value === "string" && value.trim()) {
|
|
64
|
+
const hit = mediaById.get(value.trim());
|
|
65
|
+
if (hit) thumbnailUrl = hit.publicUrl;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
36
68
|
}
|
|
37
|
-
if ((
|
|
69
|
+
if ((_e = content == null ? void 0 : content.sys) == null ? void 0 : _e.status) {
|
|
38
70
|
status = content.sys.status;
|
|
39
71
|
}
|
|
40
|
-
} catch (
|
|
72
|
+
} catch (_e2) {
|
|
41
73
|
}
|
|
42
74
|
if (!isProductionMode()) {
|
|
43
75
|
try {
|
|
@@ -46,7 +78,7 @@ const getEntryList = async (collection = "**") => {
|
|
|
46
78
|
} catch (e) {
|
|
47
79
|
}
|
|
48
80
|
}
|
|
49
|
-
entries.push({ type, id, path: file, title, status, updatedAt });
|
|
81
|
+
entries.push({ type, id, path: file, title, status, updatedAt, thumbnailUrl });
|
|
50
82
|
}
|
|
51
83
|
entries.sort((a, b) => a.title.localeCompare(b.title));
|
|
52
84
|
return entries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../admin/actions/entries.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { getConfig } from '../../lib/configStore';\nimport type { Config } from '../types';\nimport type { EntryListItem, EntryStatus } from '../../types';\n\nimport { getContentFiles, getFile } from './files';\nimport { isProductionMode } from '../github';\nimport { getEntryTitleField } from './utils';\n\nexport const getEntryList = async (collection: string = '**'): Promise<EntryListItem[]> => {\n const config = getConfig();\n const files = await getContentFiles(collection);\n const entries: EntryListItem[] = [];\n\n for (const file of files) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const type = parts[0];\n let id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n\n let title = id;\n let status: EntryStatus = 'merged';\n let updatedAt: string | undefined;\n\n try {\n const content = await getFile(file);\n\n if (type === 'media') {\n const sysId = content?.sys && typeof content.sys === 'object' && 'id' in content.sys ? content.sys.id : null;\n if (typeof sysId === 'string' && sysId !== '') {\n id = sysId;\n }\n const mediaTitle = content?.fields?.title;\n if (typeof mediaTitle === 'string' && mediaTitle.trim() !== '') {\n title = mediaTitle.trim();\n }\n } else if (titleField && content?.fields?.[titleField]) {\n
|
|
1
|
+
{"version":3,"sources":["../../../admin/actions/entries.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { getConfig } from '../../lib/configStore';\nimport type { Config } from '../types';\nimport type { EntryListItem, EntryStatus } from '../../types';\n\nimport { getContentFiles, getFile } from './files';\nimport { isProductionMode } from '../github';\nimport { getMediaEntries } from './media';\nimport { getEntryTitleField } from './utils';\n\nexport const getEntryList = async (collection: string = '**'): Promise<EntryListItem[]> => {\n const config = getConfig();\n const files = await getContentFiles(collection);\n const entries: EntryListItem[] = [];\n\n // Build a media lookup so we can resolve thumbnail URLs for any entry that\n // has an `image` field. One batched call regardless of entry count.\n const mediaList = await getMediaEntries().catch(() => []);\n const mediaById = new Map<string, { ext: string; publicUrl: string }>();\n for (const m of mediaList) {\n mediaById.set(m.id, { ext: m.extension, publicUrl: m.publicUrl });\n }\n\n const imageFieldKeyByType = new Map<string, string | null>();\n function firstImageFieldKey(type: string): string | null {\n if (imageFieldKeyByType.has(type)) return imageFieldKeyByType.get(type) ?? null;\n const collection = (config as Config).collections[type as keyof Config['collections']];\n if (!collection) {\n imageFieldKeyByType.set(type, null);\n return null;\n }\n const key = Object.keys(collection.fields).find((k) => collection.fields[k].format === 'image') ?? null;\n imageFieldKeyByType.set(type, key);\n return key;\n }\n\n for (const file of files) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const type = parts[0];\n let id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n\n let title = id;\n let status: EntryStatus = 'merged';\n let updatedAt: string | undefined;\n let thumbnailUrl: string | undefined;\n\n try {\n const content = await getFile(file);\n\n if (type === 'media') {\n const sysId = content?.sys && typeof content.sys === 'object' && 'id' in content.sys ? content.sys.id : null;\n if (typeof sysId === 'string' && sysId !== '') {\n id = sysId;\n }\n const mediaTitle = content?.fields?.title;\n if (typeof mediaTitle === 'string' && mediaTitle.trim() !== '') {\n title = mediaTitle.trim();\n }\n const ext = typeof content?.fields?.extension === 'string' ? content.fields.extension : '';\n if (ext) thumbnailUrl = `/media/${id}.${ext}`;\n } else {\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const imgKey = firstImageFieldKey(type);\n if (imgKey) {\n const value = content?.fields?.[imgKey];\n if (typeof value === 'string' && value.trim()) {\n const hit = mediaById.get(value.trim());\n if (hit) thumbnailUrl = hit.publicUrl;\n }\n }\n }\n if (content?.sys?.status) {\n status = content.sys.status;\n }\n } catch (_e) {\n // Fall back to id as title\n }\n\n if (!isProductionMode()) {\n try {\n const stat = await fsPromises.stat(path.join(process.cwd(), file));\n updatedAt = stat.mtime.toISOString();\n } catch {\n // ignore\n }\n }\n\n entries.push({ type, id, path: file, title, status, updatedAt, thumbnailUrl });\n }\n\n entries.sort((a, b) => a.title.localeCompare(b.title));\n return entries;\n};\n\n/**\n * Find all content entries that reference the given entry via reference fields.\n * Returns entries that contain `targetReferenceKey` in any reference field value.\n */\nexport const getEntryBacklinks = async (targetReferenceKey: string): Promise<EntryListItem[]> => {\n const config = getConfig();\n const allFiles = await getContentFiles('**');\n const backlinks: EntryListItem[] = [];\n\n for (const file of allFiles) {\n // Skip media entries\n if (file.includes('/media/')) continue;\n\n try {\n const content = await getFile(file);\n const type = content?.sys?.type;\n if (!type) continue;\n\n const collection = config.collections[type as keyof Config['collections']];\n if (!collection) continue;\n\n const referenceFieldKeys = Object.keys(collection.fields).filter(\n (k) => collection.fields[k].format === 'reference',\n );\n if (referenceFieldKeys.length === 0) continue;\n\n let found = false;\n for (const fieldKey of referenceFieldKeys) {\n const fieldValue = content?.fields?.[fieldKey];\n if (!fieldValue) continue;\n\n // Reference values can be a single string (cardinality 'one') or a JSON array string (cardinality 'many')\n let keys: string[] = [];\n if (typeof fieldValue === 'string') {\n try {\n const parsed = JSON.parse(fieldValue);\n keys = Array.isArray(parsed) ? parsed : [fieldValue];\n } catch {\n keys = [fieldValue];\n }\n } else if (Array.isArray(fieldValue)) {\n keys = fieldValue;\n }\n\n if (keys.includes(targetReferenceKey)) {\n found = true;\n break;\n }\n }\n\n if (found) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n let title = id;\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const status: EntryStatus = content?.sys?.status || 'merged';\n backlinks.push({ type, id, path: file, title, status });\n }\n } catch (_e) {\n // Skip files that can't be read\n }\n }\n\n return backlinks;\n};\n"],"mappings":"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","names":["_a","_b","collection","_e"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../admin/actions/files.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../admin/actions/files.ts"],"names":[],"mappings":"AA+BA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA6L9C;;GAEG;AACH,eAAO,MAAM,sCAAsC,QAAa,OAAO,CAAC,IAAI,CAQ3E,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAU,UAAU,MAAM,EAAE,iBAAiB,MAAM,EAAE,UAAU,MAAM,kBAyB7G,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,aAAY,MAAa,sBA8B9D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,SAAQ,MAAa,sBAqBxD,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,UAAU,MAAM,iBAgE7C,CAAC;AAqBF,eAAO,MAAM,QAAQ,GACnB,UAAU,GAAG,EACb,UAAU,MAAM,EAChB,UAAU;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,OAAO,CAAC,cAAc,CA4JxB,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,aAAa,CAmDjE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,YAAY,CAgEvE,CAAC"}
|