convex-cms 0.0.1
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/cli/commands/admin.d.ts +16 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +88 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/detectConvexUrl.d.ts +13 -0
- package/dist/cli/utils/detectConvexUrl.d.ts.map +1 -0
- package/dist/cli/utils/detectConvexUrl.js +48 -0
- package/dist/cli/utils/detectConvexUrl.js.map +1 -0
- package/dist/cli/utils/openBrowser.d.ts +7 -0
- package/dist/cli/utils/openBrowser.d.ts.map +1 -0
- package/dist/cli/utils/openBrowser.js +17 -0
- package/dist/cli/utils/openBrowser.js.map +1 -0
- package/dist/client/admin-config.d.ts +126 -0
- package/dist/client/admin-config.d.ts.map +1 -0
- package/dist/client/admin-config.js +117 -0
- package/dist/client/admin-config.js.map +1 -0
- package/dist/client/adminApi.d.ts +2273 -0
- package/dist/client/adminApi.d.ts.map +1 -0
- package/dist/client/adminApi.js +716 -0
- package/dist/client/adminApi.js.map +1 -0
- package/dist/client/agentTools.d.ts +933 -0
- package/dist/client/agentTools.d.ts.map +1 -0
- package/dist/client/agentTools.js +1004 -0
- package/dist/client/agentTools.js.map +1 -0
- package/dist/client/argTypes.d.ts +212 -0
- package/dist/client/argTypes.d.ts.map +1 -0
- package/dist/client/argTypes.js +5 -0
- package/dist/client/argTypes.js.map +1 -0
- package/dist/client/field-types.d.ts +55 -0
- package/dist/client/field-types.d.ts.map +1 -0
- package/dist/client/field-types.js +152 -0
- package/dist/client/field-types.js.map +1 -0
- package/dist/client/index.d.ts +189 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +668 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/queryBuilder.d.ts +765 -0
- package/dist/client/queryBuilder.d.ts.map +1 -0
- package/dist/client/queryBuilder.js +970 -0
- package/dist/client/queryBuilder.js.map +1 -0
- package/dist/client/schema/codegen.d.ts +128 -0
- package/dist/client/schema/codegen.d.ts.map +1 -0
- package/dist/client/schema/codegen.js +318 -0
- package/dist/client/schema/codegen.js.map +1 -0
- package/dist/client/schema/defineContentType.d.ts +221 -0
- package/dist/client/schema/defineContentType.d.ts.map +1 -0
- package/dist/client/schema/defineContentType.js +380 -0
- package/dist/client/schema/defineContentType.js.map +1 -0
- package/dist/client/schema/index.d.ts +85 -0
- package/dist/client/schema/index.d.ts.map +1 -0
- package/dist/client/schema/index.js +92 -0
- package/dist/client/schema/index.js.map +1 -0
- package/dist/client/schema/schemaDrift.d.ts +199 -0
- package/dist/client/schema/schemaDrift.d.ts.map +1 -0
- package/dist/client/schema/schemaDrift.js +340 -0
- package/dist/client/schema/schemaDrift.js.map +1 -0
- package/dist/client/schema/typedClient.d.ts +401 -0
- package/dist/client/schema/typedClient.d.ts.map +1 -0
- package/dist/client/schema/typedClient.js +269 -0
- package/dist/client/schema/typedClient.js.map +1 -0
- package/dist/client/schema/types.d.ts +477 -0
- package/dist/client/schema/types.d.ts.map +1 -0
- package/dist/client/schema/types.js +39 -0
- package/dist/client/schema/types.js.map +1 -0
- package/dist/client/types.d.ts +449 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +149 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/workflows.d.ts +51 -0
- package/dist/client/workflows.d.ts.map +1 -0
- package/dist/client/workflows.js +103 -0
- package/dist/client/workflows.js.map +1 -0
- package/dist/client/wrapper.d.ts +2198 -0
- package/dist/client/wrapper.d.ts.map +1 -0
- package/dist/client/wrapper.js +2651 -0
- package/dist/client/wrapper.js.map +1 -0
- package/dist/component/_generated/api.d.ts +124 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +4321 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/auditLog.d.ts +410 -0
- package/dist/component/auditLog.d.ts.map +1 -0
- package/dist/component/auditLog.js +607 -0
- package/dist/component/auditLog.js.map +1 -0
- package/dist/component/authorization.d.ts +323 -0
- package/dist/component/authorization.d.ts.map +1 -0
- package/dist/component/authorization.js +464 -0
- package/dist/component/authorization.js.map +1 -0
- package/dist/component/authorizationHooks.d.ts +184 -0
- package/dist/component/authorizationHooks.d.ts.map +1 -0
- package/dist/component/authorizationHooks.js +521 -0
- package/dist/component/authorizationHooks.js.map +1 -0
- package/dist/component/bulkOperations.d.ts +200 -0
- package/dist/component/bulkOperations.d.ts.map +1 -0
- package/dist/component/bulkOperations.js +568 -0
- package/dist/component/bulkOperations.js.map +1 -0
- package/dist/component/contentEntries.d.ts +719 -0
- package/dist/component/contentEntries.d.ts.map +1 -0
- package/dist/component/contentEntries.js +1617 -0
- package/dist/component/contentEntries.js.map +1 -0
- package/dist/component/contentEntryMutations.d.ts +505 -0
- package/dist/component/contentEntryMutations.d.ts.map +1 -0
- package/dist/component/contentEntryMutations.js +1009 -0
- package/dist/component/contentEntryMutations.js.map +1 -0
- package/dist/component/contentEntryValidation.d.ts +115 -0
- package/dist/component/contentEntryValidation.d.ts.map +1 -0
- package/dist/component/contentEntryValidation.js +546 -0
- package/dist/component/contentEntryValidation.js.map +1 -0
- package/dist/component/contentLock.d.ts +328 -0
- package/dist/component/contentLock.d.ts.map +1 -0
- package/dist/component/contentLock.js +471 -0
- package/dist/component/contentLock.js.map +1 -0
- package/dist/component/contentTypeMigration.d.ts +411 -0
- package/dist/component/contentTypeMigration.d.ts.map +1 -0
- package/dist/component/contentTypeMigration.js +805 -0
- package/dist/component/contentTypeMigration.js.map +1 -0
- package/dist/component/contentTypeMutations.d.ts +975 -0
- package/dist/component/contentTypeMutations.d.ts.map +1 -0
- package/dist/component/contentTypeMutations.js +768 -0
- package/dist/component/contentTypeMutations.js.map +1 -0
- package/dist/component/contentTypes.d.ts +538 -0
- package/dist/component/contentTypes.d.ts.map +1 -0
- package/dist/component/contentTypes.js +304 -0
- package/dist/component/contentTypes.js.map +1 -0
- package/dist/component/convex.config.d.ts +42 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +43 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/documentTypes.d.ts +186 -0
- package/dist/component/documentTypes.d.ts.map +1 -0
- package/dist/component/documentTypes.js +23 -0
- package/dist/component/documentTypes.js.map +1 -0
- package/dist/component/eventEmitter.d.ts +281 -0
- package/dist/component/eventEmitter.d.ts.map +1 -0
- package/dist/component/eventEmitter.js +300 -0
- package/dist/component/eventEmitter.js.map +1 -0
- package/dist/component/exportImport.d.ts +1120 -0
- package/dist/component/exportImport.d.ts.map +1 -0
- package/dist/component/exportImport.js +931 -0
- package/dist/component/exportImport.js.map +1 -0
- package/dist/component/index.d.ts +28 -0
- package/dist/component/index.d.ts.map +1 -0
- package/dist/component/index.js +142 -0
- package/dist/component/index.js.map +1 -0
- package/dist/component/lib/deepReferenceResolver.d.ts +252 -0
- package/dist/component/lib/deepReferenceResolver.d.ts.map +1 -0
- package/dist/component/lib/deepReferenceResolver.js +601 -0
- package/dist/component/lib/deepReferenceResolver.js.map +1 -0
- package/dist/component/lib/errors.d.ts +306 -0
- package/dist/component/lib/errors.d.ts.map +1 -0
- package/dist/component/lib/errors.js +407 -0
- package/dist/component/lib/errors.js.map +1 -0
- package/dist/component/lib/index.d.ts +10 -0
- package/dist/component/lib/index.d.ts.map +1 -0
- package/dist/component/lib/index.js +33 -0
- package/dist/component/lib/index.js.map +1 -0
- package/dist/component/lib/mediaReferenceResolver.d.ts +217 -0
- package/dist/component/lib/mediaReferenceResolver.d.ts.map +1 -0
- package/dist/component/lib/mediaReferenceResolver.js +326 -0
- package/dist/component/lib/mediaReferenceResolver.js.map +1 -0
- package/dist/component/lib/metadataExtractor.d.ts +245 -0
- package/dist/component/lib/metadataExtractor.d.ts.map +1 -0
- package/dist/component/lib/metadataExtractor.js +548 -0
- package/dist/component/lib/metadataExtractor.js.map +1 -0
- package/dist/component/lib/mutationAuth.d.ts +95 -0
- package/dist/component/lib/mutationAuth.d.ts.map +1 -0
- package/dist/component/lib/mutationAuth.js +146 -0
- package/dist/component/lib/mutationAuth.js.map +1 -0
- package/dist/component/lib/queries.d.ts +17 -0
- package/dist/component/lib/queries.d.ts.map +1 -0
- package/dist/component/lib/queries.js +49 -0
- package/dist/component/lib/queries.js.map +1 -0
- package/dist/component/lib/ragContentChunker.d.ts +423 -0
- package/dist/component/lib/ragContentChunker.d.ts.map +1 -0
- package/dist/component/lib/ragContentChunker.js +897 -0
- package/dist/component/lib/ragContentChunker.js.map +1 -0
- package/dist/component/lib/referenceResolver.d.ts +175 -0
- package/dist/component/lib/referenceResolver.d.ts.map +1 -0
- package/dist/component/lib/referenceResolver.js +293 -0
- package/dist/component/lib/referenceResolver.js.map +1 -0
- package/dist/component/lib/slugGenerator.d.ts +71 -0
- package/dist/component/lib/slugGenerator.d.ts.map +1 -0
- package/dist/component/lib/slugGenerator.js +207 -0
- package/dist/component/lib/slugGenerator.js.map +1 -0
- package/dist/component/lib/slugUniqueness.d.ts +131 -0
- package/dist/component/lib/slugUniqueness.d.ts.map +1 -0
- package/dist/component/lib/slugUniqueness.js +229 -0
- package/dist/component/lib/slugUniqueness.js.map +1 -0
- package/dist/component/lib/softDelete.d.ts +18 -0
- package/dist/component/lib/softDelete.d.ts.map +1 -0
- package/dist/component/lib/softDelete.js +29 -0
- package/dist/component/lib/softDelete.js.map +1 -0
- package/dist/component/localeFallbackChain.d.ts +410 -0
- package/dist/component/localeFallbackChain.d.ts.map +1 -0
- package/dist/component/localeFallbackChain.js +467 -0
- package/dist/component/localeFallbackChain.js.map +1 -0
- package/dist/component/localeFields.d.ts +508 -0
- package/dist/component/localeFields.d.ts.map +1 -0
- package/dist/component/localeFields.js +592 -0
- package/dist/component/localeFields.js.map +1 -0
- package/dist/component/mediaAssetMutations.d.ts +235 -0
- package/dist/component/mediaAssetMutations.d.ts.map +1 -0
- package/dist/component/mediaAssetMutations.js +558 -0
- package/dist/component/mediaAssetMutations.js.map +1 -0
- package/dist/component/mediaAssets.d.ts +168 -0
- package/dist/component/mediaAssets.d.ts.map +1 -0
- package/dist/component/mediaAssets.js +618 -0
- package/dist/component/mediaAssets.js.map +1 -0
- package/dist/component/mediaFolderMutations.d.ts +642 -0
- package/dist/component/mediaFolderMutations.d.ts.map +1 -0
- package/dist/component/mediaFolderMutations.js +849 -0
- package/dist/component/mediaFolderMutations.js.map +1 -0
- package/dist/component/mediaUploadMutations.d.ts +136 -0
- package/dist/component/mediaUploadMutations.d.ts.map +1 -0
- package/dist/component/mediaUploadMutations.js +205 -0
- package/dist/component/mediaUploadMutations.js.map +1 -0
- package/dist/component/mediaVariantMutations.d.ts +468 -0
- package/dist/component/mediaVariantMutations.d.ts.map +1 -0
- package/dist/component/mediaVariantMutations.js +737 -0
- package/dist/component/mediaVariantMutations.js.map +1 -0
- package/dist/component/mediaVariants.d.ts +525 -0
- package/dist/component/mediaVariants.d.ts.map +1 -0
- package/dist/component/mediaVariants.js +661 -0
- package/dist/component/mediaVariants.js.map +1 -0
- package/dist/component/ragContentIndexer.d.ts +595 -0
- package/dist/component/ragContentIndexer.d.ts.map +1 -0
- package/dist/component/ragContentIndexer.js +794 -0
- package/dist/component/ragContentIndexer.js.map +1 -0
- package/dist/component/rateLimitHooks.d.ts +266 -0
- package/dist/component/rateLimitHooks.d.ts.map +1 -0
- package/dist/component/rateLimitHooks.js +412 -0
- package/dist/component/rateLimitHooks.js.map +1 -0
- package/dist/component/roles.d.ts +649 -0
- package/dist/component/roles.d.ts.map +1 -0
- package/dist/component/roles.js +884 -0
- package/dist/component/roles.js.map +1 -0
- package/dist/component/scheduledPublish.d.ts +182 -0
- package/dist/component/scheduledPublish.d.ts.map +1 -0
- package/dist/component/scheduledPublish.js +304 -0
- package/dist/component/scheduledPublish.js.map +1 -0
- package/dist/component/schema.d.ts +4114 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +469 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/component/taxonomies.d.ts +476 -0
- package/dist/component/taxonomies.d.ts.map +1 -0
- package/dist/component/taxonomies.js +785 -0
- package/dist/component/taxonomies.js.map +1 -0
- package/dist/component/taxonomyMutations.d.ts +206 -0
- package/dist/component/taxonomyMutations.d.ts.map +1 -0
- package/dist/component/taxonomyMutations.js +1001 -0
- package/dist/component/taxonomyMutations.js.map +1 -0
- package/dist/component/trash.d.ts +265 -0
- package/dist/component/trash.d.ts.map +1 -0
- package/dist/component/trash.js +621 -0
- package/dist/component/trash.js.map +1 -0
- package/dist/component/types.d.ts +4 -0
- package/dist/component/types.d.ts.map +1 -0
- package/dist/component/types.js +2 -0
- package/dist/component/types.js.map +1 -0
- package/dist/component/userContext.d.ts +508 -0
- package/dist/component/userContext.d.ts.map +1 -0
- package/dist/component/userContext.js +615 -0
- package/dist/component/userContext.js.map +1 -0
- package/dist/component/validation.d.ts +387 -0
- package/dist/component/validation.d.ts.map +1 -0
- package/dist/component/validation.js +1052 -0
- package/dist/component/validation.js.map +1 -0
- package/dist/component/validators.d.ts +4645 -0
- package/dist/component/validators.d.ts.map +1 -0
- package/dist/component/validators.js +641 -0
- package/dist/component/validators.js.map +1 -0
- package/dist/component/versionMutations.d.ts +216 -0
- package/dist/component/versionMutations.d.ts.map +1 -0
- package/dist/component/versionMutations.js +321 -0
- package/dist/component/versionMutations.js.map +1 -0
- package/dist/component/webhookTrigger.d.ts +770 -0
- package/dist/component/webhookTrigger.d.ts.map +1 -0
- package/dist/component/webhookTrigger.js +1413 -0
- package/dist/component/webhookTrigger.js.map +1 -0
- package/dist/react/index.d.ts +316 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +558 -0
- package/dist/react/index.js.map +1 -0
- package/dist/test.d.ts +2230 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +1107 -0
- package/dist/test.js.map +1 -0
- package/package.json +95 -0
- package/src/cli/commands/admin.ts +104 -0
- package/src/cli/index.ts +21 -0
- package/src/cli/utils/detectConvexUrl.ts +54 -0
- package/src/cli/utils/openBrowser.ts +16 -0
- package/src/client/admin-config.ts +138 -0
- package/src/client/adminApi.ts +942 -0
- package/src/client/agentTools.ts +1311 -0
- package/src/client/argTypes.ts +316 -0
- package/src/client/field-types.ts +187 -0
- package/src/client/index.ts +1301 -0
- package/src/client/queryBuilder.ts +1100 -0
- package/src/client/schema/codegen.ts +500 -0
- package/src/client/schema/defineContentType.ts +501 -0
- package/src/client/schema/index.ts +169 -0
- package/src/client/schema/schemaDrift.ts +574 -0
- package/src/client/schema/typedClient.ts +688 -0
- package/src/client/schema/types.ts +666 -0
- package/src/client/types.ts +723 -0
- package/src/client/workflows.ts +141 -0
- package/src/client/wrapper.ts +4304 -0
- package/src/component/_generated/api.ts +140 -0
- package/src/component/_generated/component.ts +5029 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +156 -0
- package/src/component/authorization.ts +647 -0
- package/src/component/authorizationHooks.ts +668 -0
- package/src/component/bulkOperations.ts +687 -0
- package/src/component/contentEntries.ts +1976 -0
- package/src/component/contentEntryMutations.ts +1223 -0
- package/src/component/contentEntryValidation.ts +707 -0
- package/src/component/contentLock.ts +550 -0
- package/src/component/contentTypeMigration.ts +1064 -0
- package/src/component/contentTypeMutations.ts +969 -0
- package/src/component/contentTypes.ts +346 -0
- package/src/component/convex.config.ts +44 -0
- package/src/component/documentTypes.ts +240 -0
- package/src/component/eventEmitter.ts +485 -0
- package/src/component/exportImport.ts +1169 -0
- package/src/component/index.ts +491 -0
- package/src/component/lib/deepReferenceResolver.ts +999 -0
- package/src/component/lib/errors.ts +816 -0
- package/src/component/lib/index.ts +145 -0
- package/src/component/lib/mediaReferenceResolver.ts +495 -0
- package/src/component/lib/metadataExtractor.ts +792 -0
- package/src/component/lib/mutationAuth.ts +199 -0
- package/src/component/lib/queries.ts +79 -0
- package/src/component/lib/ragContentChunker.ts +1371 -0
- package/src/component/lib/referenceResolver.ts +430 -0
- package/src/component/lib/slugGenerator.ts +262 -0
- package/src/component/lib/slugUniqueness.ts +333 -0
- package/src/component/lib/softDelete.ts +44 -0
- package/src/component/localeFallbackChain.ts +673 -0
- package/src/component/localeFields.ts +896 -0
- package/src/component/mediaAssetMutations.ts +725 -0
- package/src/component/mediaAssets.ts +932 -0
- package/src/component/mediaFolderMutations.ts +1046 -0
- package/src/component/mediaUploadMutations.ts +224 -0
- package/src/component/mediaVariantMutations.ts +900 -0
- package/src/component/mediaVariants.ts +793 -0
- package/src/component/ragContentIndexer.ts +1067 -0
- package/src/component/rateLimitHooks.ts +572 -0
- package/src/component/roles.ts +1360 -0
- package/src/component/scheduledPublish.ts +358 -0
- package/src/component/schema.ts +617 -0
- package/src/component/taxonomies.ts +949 -0
- package/src/component/taxonomyMutations.ts +1210 -0
- package/src/component/trash.ts +724 -0
- package/src/component/userContext.ts +898 -0
- package/src/component/validation.ts +1388 -0
- package/src/component/validators.ts +949 -0
- package/src/component/versionMutations.ts +392 -0
- package/src/component/webhookTrigger.ts +1922 -0
- package/src/react/index.ts +898 -0
- package/src/test.ts +1580 -0
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Entry Query Functions
|
|
3
|
+
*
|
|
4
|
+
* Provides query functions for retrieving content entries from the CMS.
|
|
5
|
+
* Content entries are instances of content types that hold the actual content data.
|
|
6
|
+
*
|
|
7
|
+
* Uses convex-helpers paginator for robust cursor-based pagination.
|
|
8
|
+
*/
|
|
9
|
+
import { type Infer } from "convex/values";
|
|
10
|
+
/**
|
|
11
|
+
* Comparison operators for field filtering.
|
|
12
|
+
*
|
|
13
|
+
* - `eq`: Exact equality (works with all field types)
|
|
14
|
+
* - `ne`: Not equal (works with all field types)
|
|
15
|
+
* - `gt`: Greater than (numbers, dates)
|
|
16
|
+
* - `gte`: Greater than or equal (numbers, dates)
|
|
17
|
+
* - `lt`: Less than (numbers, dates)
|
|
18
|
+
* - `lte`: Less than or equal (numbers, dates)
|
|
19
|
+
* - `contains`: String contains substring, or array contains value
|
|
20
|
+
* - `startsWith`: String starts with prefix
|
|
21
|
+
* - `endsWith`: String ends with suffix
|
|
22
|
+
* - `in`: Value is in array of allowed values
|
|
23
|
+
* - `notIn`: Value is not in array of disallowed values
|
|
24
|
+
*/
|
|
25
|
+
export declare const filterOperatorValidator: import("convex/values").VUnion<"endsWith" | "startsWith" | "in" | "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "contains" | "notIn", [import("convex/values").VLiteral<"eq", "required">, import("convex/values").VLiteral<"ne", "required">, import("convex/values").VLiteral<"gt", "required">, import("convex/values").VLiteral<"gte", "required">, import("convex/values").VLiteral<"lt", "required">, import("convex/values").VLiteral<"lte", "required">, import("convex/values").VLiteral<"contains", "required">, import("convex/values").VLiteral<"startsWith", "required">, import("convex/values").VLiteral<"endsWith", "required">, import("convex/values").VLiteral<"in", "required">, import("convex/values").VLiteral<"notIn", "required">], "required", never>;
|
|
26
|
+
export type FilterOperator = Infer<typeof filterOperatorValidator>;
|
|
27
|
+
/**
|
|
28
|
+
* A single field filter condition.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // Filter by exact title match
|
|
33
|
+
* { field: "title", operator: "eq", value: "My Post" }
|
|
34
|
+
*
|
|
35
|
+
* // Filter by price range
|
|
36
|
+
* { field: "price", operator: "gte", value: 100 }
|
|
37
|
+
*
|
|
38
|
+
* // Filter by category (in list)
|
|
39
|
+
* { field: "category", operator: "in", value: ["tech", "science"] }
|
|
40
|
+
*
|
|
41
|
+
* // Filter by tag contains
|
|
42
|
+
* { field: "tags", operator: "contains", value: "javascript" }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare const fieldFilterValidator: import("convex/values").VObject<{
|
|
46
|
+
value: any;
|
|
47
|
+
field: string;
|
|
48
|
+
operator: "endsWith" | "startsWith" | "in" | "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "contains" | "notIn";
|
|
49
|
+
}, {
|
|
50
|
+
/** The name of the field in the content entry's data object */
|
|
51
|
+
field: import("convex/values").VString<string, "required">;
|
|
52
|
+
/** The comparison operator to use */
|
|
53
|
+
operator: import("convex/values").VUnion<"endsWith" | "startsWith" | "in" | "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "contains" | "notIn", [import("convex/values").VLiteral<"eq", "required">, import("convex/values").VLiteral<"ne", "required">, import("convex/values").VLiteral<"gt", "required">, import("convex/values").VLiteral<"gte", "required">, import("convex/values").VLiteral<"lt", "required">, import("convex/values").VLiteral<"lte", "required">, import("convex/values").VLiteral<"contains", "required">, import("convex/values").VLiteral<"startsWith", "required">, import("convex/values").VLiteral<"endsWith", "required">, import("convex/values").VLiteral<"in", "required">, import("convex/values").VLiteral<"notIn", "required">], "required", never>;
|
|
54
|
+
/** The value to compare against (type depends on field type and operator) */
|
|
55
|
+
value: import("convex/values").VAny<any, "required", string>;
|
|
56
|
+
}, "required", "value" | "field" | "operator" | `value.${string}`>;
|
|
57
|
+
export type FieldFilter = Infer<typeof fieldFilterValidator>;
|
|
58
|
+
/**
|
|
59
|
+
* Sort direction for query results.
|
|
60
|
+
*/
|
|
61
|
+
export declare const sortDirectionValidator: import("convex/values").VUnion<"asc" | "desc", [import("convex/values").VLiteral<"asc", "required">, import("convex/values").VLiteral<"desc", "required">], "required", never>;
|
|
62
|
+
export type SortDirection = Infer<typeof sortDirectionValidator>;
|
|
63
|
+
/**
|
|
64
|
+
* Sortable system fields for content entries.
|
|
65
|
+
* These are fields that exist on all content entries.
|
|
66
|
+
*/
|
|
67
|
+
export declare const systemSortFieldValidator: import("convex/values").VUnion<"_creationTime" | "version" | "scheduledPublishAt" | "firstPublishedAt" | "lastPublishedAt" | "_id", [import("convex/values").VLiteral<"_creationTime", "required">, import("convex/values").VLiteral<"_id", "required">, import("convex/values").VLiteral<"firstPublishedAt", "required">, import("convex/values").VLiteral<"lastPublishedAt", "required">, import("convex/values").VLiteral<"scheduledPublishAt", "required">, import("convex/values").VLiteral<"version", "required">], "required", never>;
|
|
68
|
+
export type SystemSortField = Infer<typeof systemSortFieldValidator>;
|
|
69
|
+
/**
|
|
70
|
+
* Sort field can be a system field or a custom data field (prefixed with "data.").
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* // System field sorting
|
|
75
|
+
* sortField: "_creationTime"
|
|
76
|
+
* sortField: "firstPublishedAt"
|
|
77
|
+
*
|
|
78
|
+
* // Custom data field sorting (prefix with "data.")
|
|
79
|
+
* sortField: "data.title"
|
|
80
|
+
* sortField: "data.price"
|
|
81
|
+
* sortField: "data.sortOrder"
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export declare const sortFieldValidator: import("convex/values").VString<string, "required">;
|
|
85
|
+
export type SortField = string;
|
|
86
|
+
/**
|
|
87
|
+
* Sort options for content entry queries.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* // Sort by creation time (newest first)
|
|
92
|
+
* { sortField: "_creationTime", sortDirection: "desc" }
|
|
93
|
+
*
|
|
94
|
+
* // Sort by publish date (oldest published first)
|
|
95
|
+
* { sortField: "firstPublishedAt", sortDirection: "asc" }
|
|
96
|
+
*
|
|
97
|
+
* // Sort by custom field (e.g., price low to high)
|
|
98
|
+
* { sortField: "data.price", sortDirection: "asc" }
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export declare const sortOptionsValidator: import("convex/values").VObject<{
|
|
102
|
+
sortField: string;
|
|
103
|
+
sortDirection: "asc" | "desc";
|
|
104
|
+
}, {
|
|
105
|
+
/** The field to sort by (system field or "data.fieldName" for custom fields) */
|
|
106
|
+
sortField: import("convex/values").VString<string, "required">;
|
|
107
|
+
/** The sort direction ("asc" for ascending, "desc" for descending) */
|
|
108
|
+
sortDirection: import("convex/values").VUnion<"asc" | "desc", [import("convex/values").VLiteral<"asc", "required">, import("convex/values").VLiteral<"desc", "required">], "required", never>;
|
|
109
|
+
}, "required", "sortField" | "sortDirection">;
|
|
110
|
+
export type SortOptions = Infer<typeof sortOptionsValidator>;
|
|
111
|
+
/**
|
|
112
|
+
* Apply a single field filter to a content entry.
|
|
113
|
+
*
|
|
114
|
+
* @param entryData - The content entry's data object
|
|
115
|
+
* @param filter - The filter condition to apply
|
|
116
|
+
* @returns true if the entry matches the filter, false otherwise
|
|
117
|
+
*/
|
|
118
|
+
export declare function matchesFieldFilter(entryData: Record<string, unknown>, filter: FieldFilter): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Apply multiple field filters to a content entry.
|
|
121
|
+
* All filters must match (AND logic).
|
|
122
|
+
*
|
|
123
|
+
* @param entryData - The content entry's data object
|
|
124
|
+
* @param filters - Array of filter conditions
|
|
125
|
+
* @returns true if the entry matches all filters, false otherwise
|
|
126
|
+
*/
|
|
127
|
+
export declare function matchesAllFieldFilters(entryData: Record<string, unknown>, filters: FieldFilter[]): boolean;
|
|
128
|
+
/**
|
|
129
|
+
* Query to retrieve a single content entry by ID.
|
|
130
|
+
*
|
|
131
|
+
* Returns full content data including metadata and status.
|
|
132
|
+
* Optionally includes the latest version info when `includeVersion` is true.
|
|
133
|
+
*
|
|
134
|
+
* @param id - The content entry ID to retrieve
|
|
135
|
+
* @param includeVersion - Whether to include version info (default: false)
|
|
136
|
+
* @returns The content entry document, or null if not found or deleted
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* // Basic usage - get entry by ID
|
|
141
|
+
* const entry = await ctx.runQuery(api.contentEntries.get, {
|
|
142
|
+
* id: entryId,
|
|
143
|
+
* });
|
|
144
|
+
*
|
|
145
|
+
* // With version info
|
|
146
|
+
* const entryWithVersion = await ctx.runQuery(api.contentEntries.get, {
|
|
147
|
+
* id: entryId,
|
|
148
|
+
* includeVersion: true,
|
|
149
|
+
* });
|
|
150
|
+
* if (entryWithVersion?.latestVersion) {
|
|
151
|
+
* console.log("Current version:", entryWithVersion.latestVersion.versionNumber);
|
|
152
|
+
* }
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export declare const get: import("convex/server").RegisteredQuery<"public", {
|
|
156
|
+
includeVersion?: boolean | undefined;
|
|
157
|
+
id: import("convex/values").GenericId<"contentEntries">;
|
|
158
|
+
}, Promise<{
|
|
159
|
+
latestVersion: {
|
|
160
|
+
_id: import("convex/values").GenericId<"contentVersions">;
|
|
161
|
+
_creationTime: number;
|
|
162
|
+
createdBy?: string | undefined;
|
|
163
|
+
changeDescription?: string | undefined;
|
|
164
|
+
publishedAt?: number | undefined;
|
|
165
|
+
slug: string;
|
|
166
|
+
status: string;
|
|
167
|
+
data: any;
|
|
168
|
+
entryId: import("convex/values").GenericId<"contentEntries">;
|
|
169
|
+
versionNumber: number;
|
|
170
|
+
wasPublished: boolean;
|
|
171
|
+
} | undefined;
|
|
172
|
+
_id: import("convex/values").GenericId<"contentEntries">;
|
|
173
|
+
_creationTime: number;
|
|
174
|
+
deletedAt?: number | undefined;
|
|
175
|
+
createdBy?: string | undefined;
|
|
176
|
+
updatedBy?: string | undefined;
|
|
177
|
+
searchText?: string | undefined;
|
|
178
|
+
locale?: string | undefined;
|
|
179
|
+
primaryEntryId?: import("convex/values").GenericId<"contentEntries"> | undefined;
|
|
180
|
+
scheduledPublishAt?: number | undefined;
|
|
181
|
+
firstPublishedAt?: number | undefined;
|
|
182
|
+
lastPublishedAt?: number | undefined;
|
|
183
|
+
lockedBy?: string | undefined;
|
|
184
|
+
lockExpiresAt?: number | undefined;
|
|
185
|
+
contentTypeId: import("convex/values").GenericId<"contentTypes">;
|
|
186
|
+
slug: string;
|
|
187
|
+
status: string;
|
|
188
|
+
data: any;
|
|
189
|
+
version: number;
|
|
190
|
+
} | null>>;
|
|
191
|
+
/**
|
|
192
|
+
* Query to retrieve a content entry by its slug and content type ID.
|
|
193
|
+
*
|
|
194
|
+
* This is the primary lookup function for frontend routing and SEO-friendly URLs.
|
|
195
|
+
* It uses the `by_content_type_and_slug` index for efficient O(1) lookups.
|
|
196
|
+
*
|
|
197
|
+
* @param contentTypeId - The ID of the content type to search within
|
|
198
|
+
* @param slug - The URL-friendly slug to look up
|
|
199
|
+
* @param status - Optional status filter (defaults to returning any status)
|
|
200
|
+
* @param includeDeleted - Whether to include soft-deleted entries (defaults to false)
|
|
201
|
+
*
|
|
202
|
+
* @returns The content entry if found, or null if not found
|
|
203
|
+
*
|
|
204
|
+
* @example
|
|
205
|
+
* ```typescript
|
|
206
|
+
* // From parent app - basic usage:
|
|
207
|
+
* const blogPost = await ctx.runQuery(components.convexCms.contentEntries.getBySlug, {
|
|
208
|
+
* contentTypeId: blogTypeId,
|
|
209
|
+
* slug: "my-first-post",
|
|
210
|
+
* });
|
|
211
|
+
*
|
|
212
|
+
* // With status filter for published content only (common for public sites):
|
|
213
|
+
* const publishedPost = await ctx.runQuery(components.convexCms.contentEntries.getBySlug, {
|
|
214
|
+
* contentTypeId: blogTypeId,
|
|
215
|
+
* slug: "my-first-post",
|
|
216
|
+
* status: "published",
|
|
217
|
+
* });
|
|
218
|
+
*
|
|
219
|
+
* // Frontend routing example:
|
|
220
|
+
* // URL: /blog/my-first-post
|
|
221
|
+
* // -> Extract slug "my-first-post" from URL
|
|
222
|
+
* // -> Query: getBySlug({ contentTypeId: blogTypeId, slug: "my-first-post", status: "published" })
|
|
223
|
+
* ```
|
|
224
|
+
*/
|
|
225
|
+
export declare const getBySlug: import("convex/server").RegisteredQuery<"public", {
|
|
226
|
+
status?: string | undefined;
|
|
227
|
+
includeDeleted?: boolean | undefined;
|
|
228
|
+
contentTypeId: import("convex/values").GenericId<"contentTypes">;
|
|
229
|
+
slug: string;
|
|
230
|
+
}, Promise<{
|
|
231
|
+
_id: import("convex/values").GenericId<"contentEntries">;
|
|
232
|
+
_creationTime: number;
|
|
233
|
+
deletedAt?: number | undefined;
|
|
234
|
+
createdBy?: string | undefined;
|
|
235
|
+
updatedBy?: string | undefined;
|
|
236
|
+
searchText?: string | undefined;
|
|
237
|
+
locale?: string | undefined;
|
|
238
|
+
primaryEntryId?: import("convex/values").GenericId<"contentEntries"> | undefined;
|
|
239
|
+
scheduledPublishAt?: number | undefined;
|
|
240
|
+
firstPublishedAt?: number | undefined;
|
|
241
|
+
lastPublishedAt?: number | undefined;
|
|
242
|
+
lockedBy?: string | undefined;
|
|
243
|
+
lockExpiresAt?: number | undefined;
|
|
244
|
+
contentTypeId: import("convex/values").GenericId<"contentTypes">;
|
|
245
|
+
slug: string;
|
|
246
|
+
status: string;
|
|
247
|
+
data: any;
|
|
248
|
+
version: number;
|
|
249
|
+
} | null>>;
|
|
250
|
+
/**
|
|
251
|
+
* Query to retrieve a content entry by its slug and content type name.
|
|
252
|
+
*
|
|
253
|
+
* This is a convenience function that looks up the content type by name first,
|
|
254
|
+
* then retrieves the entry by slug. Useful when you have the content type name
|
|
255
|
+
* (e.g., "blog_post") but not its ID.
|
|
256
|
+
*
|
|
257
|
+
* Note: This performs two index lookups (content type by name, then entry by slug),
|
|
258
|
+
* so `getBySlug` is more efficient if you already have the content type ID cached.
|
|
259
|
+
*
|
|
260
|
+
* @param contentTypeName - The machine-readable name of the content type (e.g., "blog_post")
|
|
261
|
+
* @param slug - The URL-friendly slug to look up
|
|
262
|
+
* @param status - Optional status filter (defaults to returning any status)
|
|
263
|
+
* @param includeDeleted - Whether to include soft-deleted entries (defaults to false)
|
|
264
|
+
*
|
|
265
|
+
* @returns The content entry if found, or null if not found (including if content type doesn't exist)
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* ```typescript
|
|
269
|
+
* // From parent app - using content type name instead of ID:
|
|
270
|
+
* const blogPost = await ctx.runQuery(components.convexCms.contentEntries.getBySlugAndTypeName, {
|
|
271
|
+
* contentTypeName: "blog_post",
|
|
272
|
+
* slug: "my-first-post",
|
|
273
|
+
* status: "published",
|
|
274
|
+
* });
|
|
275
|
+
*
|
|
276
|
+
* // Useful for static routes where content type is known at build time:
|
|
277
|
+
* // /blog/[slug] -> contentTypeName: "blog_post"
|
|
278
|
+
* // /products/[slug] -> contentTypeName: "product"
|
|
279
|
+
* // /pages/[slug] -> contentTypeName: "page"
|
|
280
|
+
* ```
|
|
281
|
+
*/
|
|
282
|
+
export declare const getBySlugAndTypeName: import("convex/server").RegisteredQuery<"public", {
|
|
283
|
+
status?: string | undefined;
|
|
284
|
+
includeDeleted?: boolean | undefined;
|
|
285
|
+
slug: string;
|
|
286
|
+
contentTypeName: string;
|
|
287
|
+
}, Promise<{
|
|
288
|
+
_id: import("convex/values").GenericId<"contentEntries">;
|
|
289
|
+
_creationTime: number;
|
|
290
|
+
deletedAt?: number | undefined;
|
|
291
|
+
createdBy?: string | undefined;
|
|
292
|
+
updatedBy?: string | undefined;
|
|
293
|
+
searchText?: string | undefined;
|
|
294
|
+
locale?: string | undefined;
|
|
295
|
+
primaryEntryId?: import("convex/values").GenericId<"contentEntries"> | undefined;
|
|
296
|
+
scheduledPublishAt?: number | undefined;
|
|
297
|
+
firstPublishedAt?: number | undefined;
|
|
298
|
+
lastPublishedAt?: number | undefined;
|
|
299
|
+
lockedBy?: string | undefined;
|
|
300
|
+
lockExpiresAt?: number | undefined;
|
|
301
|
+
contentTypeId: import("convex/values").GenericId<"contentTypes">;
|
|
302
|
+
slug: string;
|
|
303
|
+
status: string;
|
|
304
|
+
data: any;
|
|
305
|
+
version: number;
|
|
306
|
+
} | null>>;
|
|
307
|
+
/**
|
|
308
|
+
* Query to list content entries with filtering, search, and cursor-based pagination.
|
|
309
|
+
*
|
|
310
|
+
* This is the primary function for retrieving multiple content entries.
|
|
311
|
+
* It uses the convex-helpers paginator for robust cursor-based pagination that
|
|
312
|
+
* integrates seamlessly with Convex's usePaginatedQuery hook.
|
|
313
|
+
*
|
|
314
|
+
* The query intelligently selects the most efficient index based on the
|
|
315
|
+
* provided filters:
|
|
316
|
+
* - Full-text search: Uses the `search_content` search index
|
|
317
|
+
* - Type + Status filter: Uses the `by_content_type_and_status` index
|
|
318
|
+
* - Type only: Uses the `by_content_type` index
|
|
319
|
+
* - Status only: Uses the `by_status` index
|
|
320
|
+
* - Locale filter: Uses the `by_locale` index
|
|
321
|
+
* - Field filters: Applied as post-processing filters on entry data
|
|
322
|
+
*
|
|
323
|
+
* @param contentTypeId - Optional content type ID to filter by
|
|
324
|
+
* @param contentTypeName - Optional content type name (resolved to ID internally)
|
|
325
|
+
* @param status - Optional status filter (draft, published, archived, scheduled)
|
|
326
|
+
* @param statusIn - Optional array of statuses to filter by (for admin views)
|
|
327
|
+
* @param locale - Optional locale code to filter by
|
|
328
|
+
* @param search - Optional full-text search query
|
|
329
|
+
* @param fieldFilters - Optional array of field filters (combined with AND logic)
|
|
330
|
+
* @param includeDeleted - Whether to include soft-deleted entries (default: false)
|
|
331
|
+
* @param paginationOpts - Standard Convex pagination options (numItems, cursor)
|
|
332
|
+
*
|
|
333
|
+
* @returns PaginationResult with page, continueCursor, and isDone
|
|
334
|
+
*
|
|
335
|
+
* @example
|
|
336
|
+
* ```typescript
|
|
337
|
+
* // List all published blog posts (frontend use case)
|
|
338
|
+
* const { page, continueCursor, isDone } = await ctx.runQuery(
|
|
339
|
+
* components.convexCms.contentEntries.list,
|
|
340
|
+
* {
|
|
341
|
+
* contentTypeName: "blog_post",
|
|
342
|
+
* status: "published",
|
|
343
|
+
* paginationOpts: { numItems: 10 },
|
|
344
|
+
* }
|
|
345
|
+
* );
|
|
346
|
+
*
|
|
347
|
+
* // List entries with multiple statuses (admin use case)
|
|
348
|
+
* // Shows draft and scheduled content for editorial workflow
|
|
349
|
+
* const editorialContent = await ctx.runQuery(
|
|
350
|
+
* components.convexCms.contentEntries.list,
|
|
351
|
+
* {
|
|
352
|
+
* contentTypeName: "blog_post",
|
|
353
|
+
* statusIn: ["draft", "scheduled"],
|
|
354
|
+
* paginationOpts: { numItems: 20 },
|
|
355
|
+
* }
|
|
356
|
+
* );
|
|
357
|
+
*
|
|
358
|
+
* // Filter by field values (e.g., category)
|
|
359
|
+
* const techPosts = await ctx.runQuery(
|
|
360
|
+
* components.convexCms.contentEntries.list,
|
|
361
|
+
* {
|
|
362
|
+
* contentTypeName: "blog_post",
|
|
363
|
+
* status: "published",
|
|
364
|
+
* fieldFilters: [
|
|
365
|
+
* { field: "category", operator: "eq", value: "tech" }
|
|
366
|
+
* ],
|
|
367
|
+
* paginationOpts: { numItems: 10 },
|
|
368
|
+
* }
|
|
369
|
+
* );
|
|
370
|
+
*
|
|
371
|
+
* // Filter by numeric range (e.g., price)
|
|
372
|
+
* const affordableProducts = await ctx.runQuery(
|
|
373
|
+
* components.convexCms.contentEntries.list,
|
|
374
|
+
* {
|
|
375
|
+
* contentTypeName: "product",
|
|
376
|
+
* status: "published",
|
|
377
|
+
* fieldFilters: [
|
|
378
|
+
* { field: "price", operator: "gte", value: 10 },
|
|
379
|
+
* { field: "price", operator: "lte", value: 100 }
|
|
380
|
+
* ],
|
|
381
|
+
* paginationOpts: { numItems: 20 },
|
|
382
|
+
* }
|
|
383
|
+
* );
|
|
384
|
+
*
|
|
385
|
+
* // Filter by array contains (e.g., tags)
|
|
386
|
+
* const featuredPosts = await ctx.runQuery(
|
|
387
|
+
* components.convexCms.contentEntries.list,
|
|
388
|
+
* {
|
|
389
|
+
* contentTypeName: "blog_post",
|
|
390
|
+
* fieldFilters: [
|
|
391
|
+
* { field: "tags", operator: "contains", value: "featured" }
|
|
392
|
+
* ],
|
|
393
|
+
* paginationOpts: { numItems: 10 },
|
|
394
|
+
* }
|
|
395
|
+
* );
|
|
396
|
+
*
|
|
397
|
+
* // Paginate through results using continueCursor
|
|
398
|
+
* const page2 = await ctx.runQuery(
|
|
399
|
+
* components.convexCms.contentEntries.list,
|
|
400
|
+
* {
|
|
401
|
+
* contentTypeName: "blog_post",
|
|
402
|
+
* paginationOpts: {
|
|
403
|
+
* numItems: 10,
|
|
404
|
+
* cursor: previousResult.continueCursor,
|
|
405
|
+
* },
|
|
406
|
+
* }
|
|
407
|
+
* );
|
|
408
|
+
*
|
|
409
|
+
* // Full-text search with pagination
|
|
410
|
+
* const results = await ctx.runQuery(
|
|
411
|
+
* components.convexCms.contentEntries.list,
|
|
412
|
+
* {
|
|
413
|
+
* search: "typescript tutorial",
|
|
414
|
+
* status: "published",
|
|
415
|
+
* paginationOpts: { numItems: 10 },
|
|
416
|
+
* }
|
|
417
|
+
* );
|
|
418
|
+
*
|
|
419
|
+
* // Use with usePaginatedQuery React hook
|
|
420
|
+
* const { results, status, loadMore } = usePaginatedQuery(
|
|
421
|
+
* api.contentEntries.list,
|
|
422
|
+
* { contentTypeName: "blog_post", status: "published" },
|
|
423
|
+
* { initialNumItems: 10 }
|
|
424
|
+
* );
|
|
425
|
+
* ```
|
|
426
|
+
*/
|
|
427
|
+
export declare const list: import("convex/server").RegisteredQuery<"public", {
|
|
428
|
+
contentTypeId?: import("convex/values").GenericId<"contentTypes"> | undefined;
|
|
429
|
+
status?: string | undefined;
|
|
430
|
+
locale?: string | undefined;
|
|
431
|
+
includeDeleted?: boolean | undefined;
|
|
432
|
+
search?: string | undefined;
|
|
433
|
+
contentTypeName?: string | undefined;
|
|
434
|
+
statusIn?: string[] | undefined;
|
|
435
|
+
sortField?: string | undefined;
|
|
436
|
+
sortDirection?: "asc" | "desc" | undefined;
|
|
437
|
+
fieldFilters?: {
|
|
438
|
+
value: any;
|
|
439
|
+
field: string;
|
|
440
|
+
operator: "endsWith" | "startsWith" | "in" | "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "contains" | "notIn";
|
|
441
|
+
}[] | undefined;
|
|
442
|
+
paginationOpts: {
|
|
443
|
+
id?: number;
|
|
444
|
+
endCursor?: string | null;
|
|
445
|
+
maximumRowsRead?: number;
|
|
446
|
+
maximumBytesRead?: number;
|
|
447
|
+
numItems: number;
|
|
448
|
+
cursor: string | null;
|
|
449
|
+
};
|
|
450
|
+
}, Promise<ContentEntryPaginationResult>>;
|
|
451
|
+
interface ContentEntryPaginationResult {
|
|
452
|
+
page: any[];
|
|
453
|
+
continueCursor: string | null;
|
|
454
|
+
isDone: boolean;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Query to retrieve version history for a content entry.
|
|
458
|
+
*
|
|
459
|
+
* Returns a paginated list of version snapshots ordered by version number
|
|
460
|
+
* descending (newest versions first). Each version includes:
|
|
461
|
+
* - versionNumber: The version at the time of the snapshot
|
|
462
|
+
* - data: Snapshot of the content data
|
|
463
|
+
* - slug: Snapshot of the slug
|
|
464
|
+
* - status: Status when the version was created
|
|
465
|
+
* - changeDescription: Optional description of changes
|
|
466
|
+
* - createdBy: User who created this version
|
|
467
|
+
* - wasPublished: Whether this version was published
|
|
468
|
+
* - publishedAt: When this version was published (if ever)
|
|
469
|
+
*
|
|
470
|
+
* @param entryId - The content entry ID to get version history for
|
|
471
|
+
* @param paginationOpts - Standard Convex pagination options (numItems, cursor)
|
|
472
|
+
*
|
|
473
|
+
* @returns PaginationResult with version documents, or null if entry not found
|
|
474
|
+
*
|
|
475
|
+
* @example
|
|
476
|
+
* ```typescript
|
|
477
|
+
* // Get first page of version history
|
|
478
|
+
* const history = await ctx.runQuery(
|
|
479
|
+
* components.convexCms.contentEntries.getVersionHistory,
|
|
480
|
+
* {
|
|
481
|
+
* entryId: entryId,
|
|
482
|
+
* paginationOpts: { numItems: 10 },
|
|
483
|
+
* }
|
|
484
|
+
* );
|
|
485
|
+
*
|
|
486
|
+
* // Get published versions only
|
|
487
|
+
* const publishedVersions = history?.page.filter(v => v.wasPublished);
|
|
488
|
+
*
|
|
489
|
+
* // Paginate through history
|
|
490
|
+
* if (!history.isDone) {
|
|
491
|
+
* const nextPage = await ctx.runQuery(
|
|
492
|
+
* components.convexCms.contentEntries.getVersionHistory,
|
|
493
|
+
* {
|
|
494
|
+
* entryId: entryId,
|
|
495
|
+
* paginationOpts: {
|
|
496
|
+
* numItems: 10,
|
|
497
|
+
* cursor: history.continueCursor,
|
|
498
|
+
* },
|
|
499
|
+
* }
|
|
500
|
+
* );
|
|
501
|
+
* }
|
|
502
|
+
*
|
|
503
|
+
* // Compare versions
|
|
504
|
+
* const [current, previous] = history.page;
|
|
505
|
+
* console.log("Changes from v" + previous.versionNumber + " to v" + current.versionNumber);
|
|
506
|
+
* ```
|
|
507
|
+
*/
|
|
508
|
+
export declare const getVersionHistory: import("convex/server").RegisteredQuery<"public", {
|
|
509
|
+
entryId: import("convex/values").GenericId<"contentEntries">;
|
|
510
|
+
paginationOpts: {
|
|
511
|
+
id?: number;
|
|
512
|
+
endCursor?: string | null;
|
|
513
|
+
maximumRowsRead?: number;
|
|
514
|
+
maximumBytesRead?: number;
|
|
515
|
+
numItems: number;
|
|
516
|
+
cursor: string | null;
|
|
517
|
+
};
|
|
518
|
+
}, Promise<{
|
|
519
|
+
page: {
|
|
520
|
+
_id: import("convex/values").GenericId<"contentVersions">;
|
|
521
|
+
_creationTime: number;
|
|
522
|
+
createdBy?: string | undefined;
|
|
523
|
+
changeDescription?: string | undefined;
|
|
524
|
+
publishedAt?: number | undefined;
|
|
525
|
+
slug: string;
|
|
526
|
+
status: string;
|
|
527
|
+
data: any;
|
|
528
|
+
entryId: import("convex/values").GenericId<"contentEntries">;
|
|
529
|
+
versionNumber: number;
|
|
530
|
+
wasPublished: boolean;
|
|
531
|
+
}[];
|
|
532
|
+
continueCursor: string;
|
|
533
|
+
isDone: boolean;
|
|
534
|
+
} | null>>;
|
|
535
|
+
/**
|
|
536
|
+
* Retrieve a specific version of a content entry by version ID or number.
|
|
537
|
+
*
|
|
538
|
+
* This query allows fetching the complete content state at a specific version,
|
|
539
|
+
* which is useful for:
|
|
540
|
+
* - Version comparison/diff views
|
|
541
|
+
* - Previewing historical content states
|
|
542
|
+
* - Rollback preparation (viewing what content looked like)
|
|
543
|
+
* - Audit trail investigation
|
|
544
|
+
*
|
|
545
|
+
* ## Lookup Methods
|
|
546
|
+
*
|
|
547
|
+
* You can retrieve a version by either:
|
|
548
|
+
* 1. **Version ID** (`versionId`): Direct document lookup using the `_id` field
|
|
549
|
+
* 2. **Version Number** (`versionNumber`): Uses the compound index for efficient lookup
|
|
550
|
+
*
|
|
551
|
+
* At least one of `versionId` or `versionNumber` must be provided.
|
|
552
|
+
* If both are provided, `versionId` takes precedence.
|
|
553
|
+
*
|
|
554
|
+
* ## Security
|
|
555
|
+
*
|
|
556
|
+
* - Returns `null` if the parent entry doesn't exist or has been soft-deleted
|
|
557
|
+
* - Validates that the version belongs to the specified entry (prevents cross-entry access)
|
|
558
|
+
*
|
|
559
|
+
* ## Example Usage
|
|
560
|
+
*
|
|
561
|
+
* ```typescript
|
|
562
|
+
* // Get version by version number
|
|
563
|
+
* const versionByNumber = await ctx.runQuery(
|
|
564
|
+
* api.contentEntries.getVersion,
|
|
565
|
+
* {
|
|
566
|
+
* entryId: entryId,
|
|
567
|
+
* versionNumber: 3
|
|
568
|
+
* }
|
|
569
|
+
* );
|
|
570
|
+
*
|
|
571
|
+
* // Get version by version ID
|
|
572
|
+
* const versionById = await ctx.runQuery(
|
|
573
|
+
* api.contentEntries.getVersion,
|
|
574
|
+
* {
|
|
575
|
+
* entryId: entryId,
|
|
576
|
+
* versionId: someVersionId
|
|
577
|
+
* }
|
|
578
|
+
* );
|
|
579
|
+
*
|
|
580
|
+
* // Access version data
|
|
581
|
+
* if (versionByNumber) {
|
|
582
|
+
* console.log("Content at v3:", versionByNumber.data);
|
|
583
|
+
* console.log("Slug at v3:", versionByNumber.slug);
|
|
584
|
+
* console.log("Status at v3:", versionByNumber.status);
|
|
585
|
+
* console.log("Was published:", versionByNumber.wasPublished);
|
|
586
|
+
* }
|
|
587
|
+
* ```
|
|
588
|
+
*/
|
|
589
|
+
export declare const getVersion: import("convex/server").RegisteredQuery<"public", {
|
|
590
|
+
versionNumber?: number | undefined;
|
|
591
|
+
versionId?: import("convex/values").GenericId<"contentVersions"> | undefined;
|
|
592
|
+
entryId: import("convex/values").GenericId<"contentEntries">;
|
|
593
|
+
}, Promise<{
|
|
594
|
+
_id: import("convex/values").GenericId<"contentVersions">;
|
|
595
|
+
_creationTime: number;
|
|
596
|
+
createdBy?: string | undefined;
|
|
597
|
+
changeDescription?: string | undefined;
|
|
598
|
+
publishedAt?: number | undefined;
|
|
599
|
+
slug: string;
|
|
600
|
+
status: string;
|
|
601
|
+
data: any;
|
|
602
|
+
entryId: import("convex/values").GenericId<"contentEntries">;
|
|
603
|
+
versionNumber: number;
|
|
604
|
+
wasPublished: boolean;
|
|
605
|
+
} | null>>;
|
|
606
|
+
/**
|
|
607
|
+
* Compare two versions of a content entry and return field-level differences.
|
|
608
|
+
*
|
|
609
|
+
* This query retrieves two version snapshots by version number and computes
|
|
610
|
+
* a detailed diff showing which fields changed, what the before/after values
|
|
611
|
+
* are, and whether metadata like slug and status also changed.
|
|
612
|
+
*
|
|
613
|
+
* @example
|
|
614
|
+
* ```typescript
|
|
615
|
+
* // Compare version 2 to version 5 of an entry
|
|
616
|
+
* const diff = await ctx.runQuery(api.contentEntries.compareVersions, {
|
|
617
|
+
* entryId: entryId,
|
|
618
|
+
* fromVersionNumber: 2,
|
|
619
|
+
* toVersionNumber: 5,
|
|
620
|
+
* });
|
|
621
|
+
*
|
|
622
|
+
* if (diff.hasChanges) {
|
|
623
|
+
* console.log("Changes:", diff.changeSummary);
|
|
624
|
+
* for (const fieldDiff of diff.fieldDiffs) {
|
|
625
|
+
* console.log(`Field: ${fieldDiff.field}`);
|
|
626
|
+
* console.log(` Change type: ${fieldDiff.changeType}`);
|
|
627
|
+
* console.log(` From: ${JSON.stringify(fieldDiff.fromValue)}`);
|
|
628
|
+
* console.log(` To: ${JSON.stringify(fieldDiff.toValue)}`);
|
|
629
|
+
* }
|
|
630
|
+
* }
|
|
631
|
+
* ```
|
|
632
|
+
*
|
|
633
|
+
* @param entryId - The ID of the content entry to compare versions for
|
|
634
|
+
* @param fromVersionNumber - The version number of the "from" (older/base) version
|
|
635
|
+
* @param toVersionNumber - The version number of the "to" (newer/target) version
|
|
636
|
+
* @returns Detailed comparison result or null if entry is deleted or versions don't exist
|
|
637
|
+
*/
|
|
638
|
+
export declare const compareVersions: import("convex/server").RegisteredQuery<"public", {
|
|
639
|
+
entryId: import("convex/values").GenericId<"contentEntries">;
|
|
640
|
+
fromVersionNumber: number;
|
|
641
|
+
toVersionNumber: number;
|
|
642
|
+
}, Promise<{
|
|
643
|
+
hasChanges: boolean;
|
|
644
|
+
fromVersion: {
|
|
645
|
+
versionNumber: number;
|
|
646
|
+
status: string;
|
|
647
|
+
slug: string;
|
|
648
|
+
wasPublished: boolean;
|
|
649
|
+
createdAt: number;
|
|
650
|
+
};
|
|
651
|
+
toVersion: {
|
|
652
|
+
versionNumber: number;
|
|
653
|
+
status: string;
|
|
654
|
+
slug: string;
|
|
655
|
+
wasPublished: boolean;
|
|
656
|
+
createdAt: number;
|
|
657
|
+
};
|
|
658
|
+
changedFields: string[];
|
|
659
|
+
fieldDiffs: {
|
|
660
|
+
fromValue?: any;
|
|
661
|
+
toValue?: any;
|
|
662
|
+
field: string;
|
|
663
|
+
changeType: "added" | "removed" | "modified";
|
|
664
|
+
}[];
|
|
665
|
+
slugChanged: boolean;
|
|
666
|
+
statusChanged: boolean;
|
|
667
|
+
changeSummary: string;
|
|
668
|
+
} | null>>;
|
|
669
|
+
/**
|
|
670
|
+
* Query to count content entries matching the given filters.
|
|
671
|
+
*
|
|
672
|
+
* This query efficiently counts entries without loading all entry data.
|
|
673
|
+
* It uses database indexes for filtering and iterates through matching
|
|
674
|
+
* entries to provide an accurate count regardless of the number of entries.
|
|
675
|
+
*
|
|
676
|
+
* Unlike the `list` query which is limited by pagination, this query
|
|
677
|
+
* counts ALL matching entries and returns the total.
|
|
678
|
+
*
|
|
679
|
+
* @param contentTypeId - Optional content type ID to filter by
|
|
680
|
+
* @param contentTypeName - Optional content type name (resolved to ID internally)
|
|
681
|
+
* @param status - Optional single status filter
|
|
682
|
+
* @param statusIn - Optional array of statuses to filter by
|
|
683
|
+
* @param includeDeleted - Whether to include soft-deleted entries (default: false)
|
|
684
|
+
*
|
|
685
|
+
* @returns Object containing the count of matching entries
|
|
686
|
+
*
|
|
687
|
+
* @example
|
|
688
|
+
* ```typescript
|
|
689
|
+
* // Count all entries for a content type
|
|
690
|
+
* const { count } = await ctx.runQuery(
|
|
691
|
+
* components.convexCms.contentEntries.count,
|
|
692
|
+
* { contentTypeId: blogTypeId }
|
|
693
|
+
* );
|
|
694
|
+
* console.log(`Blog posts: ${count}`);
|
|
695
|
+
*
|
|
696
|
+
* // Count published entries only
|
|
697
|
+
* const { count: publishedCount } = await ctx.runQuery(
|
|
698
|
+
* components.convexCms.contentEntries.count,
|
|
699
|
+
* { contentTypeId: blogTypeId, status: "published" }
|
|
700
|
+
* );
|
|
701
|
+
*
|
|
702
|
+
* // Count entries by content type name
|
|
703
|
+
* const { count: productCount } = await ctx.runQuery(
|
|
704
|
+
* components.convexCms.contentEntries.count,
|
|
705
|
+
* { contentTypeName: "product" }
|
|
706
|
+
* );
|
|
707
|
+
* ```
|
|
708
|
+
*/
|
|
709
|
+
export declare const count: import("convex/server").RegisteredQuery<"public", {
|
|
710
|
+
contentTypeId?: import("convex/values").GenericId<"contentTypes"> | undefined;
|
|
711
|
+
status?: string | undefined;
|
|
712
|
+
includeDeleted?: boolean | undefined;
|
|
713
|
+
contentTypeName?: string | undefined;
|
|
714
|
+
statusIn?: string[] | undefined;
|
|
715
|
+
}, Promise<{
|
|
716
|
+
count: number;
|
|
717
|
+
}>>;
|
|
718
|
+
export {};
|
|
719
|
+
//# sourceMappingURL=contentEntries.d.ts.map
|