import { AnyDocDef, BucketName, CollectionName, CouchbaseClusterTypes, DefaultClusterTypes, DefaultCollectionName, DefaultScopeCollectionName, DefaultScopeName, DocDef, DocDefKeyBodyShape, DocDefMatchingKey, GetKeyspaceOptions, IsNever, JsonDocumentDef, Keyspace, KeyspaceDocDef, MissingDefaultCollection, MissingDefaultScope, ScopeName } from '@cbjsdev/shared'; import { Bucket } from '../bucket.js'; import { Cluster } from '../cluster.js'; import type { Collection } from '../collection.js'; import type { Scope } from '../scope.js'; export type { DocDef }; export type CollectionDocDef = Instance extends Collection ? KeyspaceDocDef : never; export type CollectionDocDefMatchingKey = Instance extends Collection ? DocDefMatchingKey : never; /** * Infer the keyspace from a Collection instance type. */ export type CollectionKeyspace = Instance extends Collection ? T extends CouchbaseClusterTypes ? B extends BucketName ? S extends ScopeName ? C extends CollectionName ? { clusterTypes: T; bucket: B; scope: S; collection: C; } : never : never : never : never : never; export type CollectionJsonDocDef = JsonDocumentDef>; /** * Extract the DocDef in a given collection that match the given key. */ export type ExtractCollectionJsonDocDef = Instance extends Collection ? JsonDocumentDef> : never; export type ExtractCollectionJsonDocBody = Instance extends Collection ? JsonDocumentDef>['Body'] : never; export type ExtractCollectionJsonDocKey = JsonDocumentDef>['Key']; /** * Construct a `CouchbaseClusterTypes` with the given bucket, scope and collection, containing the given documents. */ export type ClusterTypesWith = { [bucket in B | NonNullable]: { [scope in S | NonNullable]: { [collection in C | NonNullable]: Doc; }; }; }; export type CollectionOptions = Instance extends Collection ? GetKeyspaceOptions : never; export type AnyCluster = Cluster; export type AnyBucket = Bucket; export type AnyScope = Scope; export type AnyCollection = Collection; /** * @alias ClusterCollection * @deprecated use {@link ClusterCollection} instead. */ export type CollectionAmong = BucketName, S extends ScopeName = ScopeName, C extends CollectionName = CollectionName> = ClusterCollection; /** * Represent a union of {@link Collection} within a Bucket, Scope and/or a subset of Collection. */ export type ClusterCollection = never, S extends ScopeName = never, C extends CollectionName = never> = IsNever extends true ? AnyCollection : Keyspace extends infer KS extends Keyspace ? KS extends unknown ? KS['bucket'] extends infer KSB extends BucketName ? KS['scope'] extends infer KSS extends ScopeName ? KS['collection'] extends infer KSC extends CollectionName ? Collection : never : never : never : never : never; /** * Represent a union of {@link Scope} within a Bucket, and/or a subset of Scope. */ export type ClusterScope = never, S extends ScopeName = never> = IsNever extends true ? AnyScope : Keyspace extends infer KS extends Keyspace ? KS extends unknown ? KS['bucket'] extends infer KSB extends BucketName ? KS['scope'] extends infer KSS extends ScopeName ? Scope : never : never : never : never; /** * Represent a union of {@link Bucket} within a cluster. */ export type ClusterBucket = never> = IsNever extends true ? AnyBucket : Keyspace extends infer KS extends Keyspace ? KS extends unknown ? KS['bucket'] extends infer KSB extends BucketName ? Bucket : never : never : never; /** * Represent {@link Collection}s that may contain the given document definitions. */ export type CollectionContainingDocDef = ClusterCollection extends infer AllCollections ? AllCollections extends unknown ? ExpectedDocDef extends CollectionDocDef ? AllCollections : never : never : never; /** * Represent {@link Collection}s that may contain the given document bodies. */ export type CollectionContainingDocBody = ClusterCollection extends infer AllCollections ? AllCollections extends unknown ? CollectionDocDef['Body'] extends ExpectedDoc ? AllCollections : never : never : never; export type CollectionMatchingDocDef = ClusterCollection extends infer AllCollections extends AnyCollection ? AllCollections extends unknown ? ExpectedDocDefs extends unknown ? CollectionDocDef extends infer CollectionDocDefs extends DocDefKeyBodyShape ? CollectionDocDefs extends unknown ? CollectionDocDefs['Key'] extends ExpectedDocDefs['Key'] ? CollectionDocDefs['Body'] extends ExpectedDocDefs['Body'] ? AllCollections : never : never : never : never : never : never : never; /** * Represent the runtime type of the default {@Scope} of a bucket. */ export type DefaultScope> = B extends unknown ? DefaultScopeName extends ScopeName ? Scope : MissingDefaultScope : never; /** * Return `true` if the bucket has declared the default scope. */ export type HasDefaultScope> = B extends unknown ? (DefaultScopeName extends ScopeName ? true : false) : never; /** * Represent the runtime type of a {@link Collection} instance of the default collection inside the default scope. * It includes check to ensure the default scope and default collection exists and returns an error type if it doesn't. */ export type DefaultCollection> = B extends BucketName ? DefaultScopeName extends ScopeName ? DefaultCollectionName extends CollectionName ? Collection : MissingDefaultCollection : MissingDefaultScope : never; /** * Represent the runtime type of a {@link Collection} instance of a collection inside the default scope. * It includes check to ensure the default scope exists and returns an error type if it doesn't. */ export type DefaultScopeCollection, C extends DefaultScopeCollectionName> = B extends BucketName ? DefaultScopeName extends ScopeName ? Collection : MissingDefaultScope : never;