@orion-js/mongodb 4.2.3 → 4.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/connect/connections.ts","../src/connect/getDBName.ts","../src/connect/getMongoURLFromEnv.ts","../src/connect/getMongoConnection.ts","../src/types/index.ts","../src/service/index.ts","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/_internals/isArray.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/_internals/isInteger.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/_internals/createPath.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/equals.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isType.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/_internals/compare.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/_internals/includes.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/omit.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/flatten.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isEmpty.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isNil.js","../src/createCollection/getMethods/getSelector.ts","../src/createCollection/getMethods/find.ts","../src/createCollection/getMethods/findOne.ts","../src/createCollection/getMethods/validateModifier/validatePush.ts","../src/helpers/fromDot.ts","../src/helpers/toDot.ts","../src/createCollection/getMethods/validateModifier/validateUnset.ts","../src/createCollection/getMethods/validateModifier/validateInc.ts","../src/createCollection/getMethods/validateModifier/validateSet.ts","../src/createCollection/getMethods/validateModifier/validateOperator.ts","../src/createCollection/getMethods/validateModifier/index.ts","../src/createCollection/getMethods/validateModifier/validateUpsert.ts","../src/createCollection/getMethods/cleanModifier.ts","../src/createCollection/getMethods/wrapErrors.ts","../src/createCollection/getMethods/upsert.ts","../src/createCollection/getMethods/findOneAndUpdate.ts","../src/createCollection/getMethods/updateOne.ts","../src/createCollection/getMethods/updateMany.ts","../src/createCollection/getMethods/updateAndFind.ts","../src/createCollection/getMethods/deleteOne.ts","../src/createCollection/getMethods/deleteMany.ts","../src/createCollection/getMethods/insertOne.ts","../src/createCollection/getMethods/insertMany.ts","../src/createCollection/getMethods/updateItem.ts","../src/createCollection/getMethods/countDocuments.ts","../src/createCollection/getMethods/estimatedDocumentCount.ts","../src/createCollection/getMethods/insertAndFind.ts","../src/createCollection/getMethods/dataLoader/loadById.ts","../src/createCollection/getMethods/dataLoader/loadMany.ts","../src/createCollection/getMethods/dataLoader/loadOne.ts","../src/createCollection/getMethods/dataLoader/loadData.ts","../src/createCollection/getMethods/dataLoader/dataLoad/getDataLoader.ts","../src/createCollection/getMethods/dataLoader/dataLoad/index.ts","../src/createCollection/generateId.ts","../src/createCollection/createIndexes.ts","../src/createCollection/deleteUnusedIndexes.ts","../src/createCollection/getIndexOptions.ts","../src/createCollection/collectionsRegistry.ts","../src/createCollection/getSchemaAndModel.ts","../src/createCollection/wrapMethods.ts","../src/createCollection/index.ts","../src/encrypted/getOrCreateEncryptionKey.ts"],"sourcesContent":["export * from './connect'\nexport * from './types'\nexport * from './service'\nexport * from './createCollection'\nexport * from './createCollection/collectionsRegistry'\nexport * from './encrypted/getOrCreateEncryptionKey'\n","import {EventEmitter} from 'node:events'\nimport {MongoClient, Db, MongoClientOptions} from 'mongodb'\nimport getDBName from './getDBName'\nimport {nextTick} from 'node:process'\nimport {logger} from '@orion-js/logger'\nimport {sleep} from '@orion-js/helpers'\nimport {getMongoURLFromEnv} from './getMongoURLFromEnv'\n\nexport interface OrionMongoClient {\n client: MongoClient\n db: Db\n uri: string\n dbName: string\n /**\n * @deprecated Use startConnection() instead. This property is not guaranteed to be resolved if the connection is not started.\n * When using async calls startConnection or connectionPromise is no longer needed. Orion will automatically start the connection if it is not already started.\n * Kept for backwards compatibility. startConnection does not re-start the connection if it is already started, so it is safe to use.\n */\n connectionPromise: Promise<MongoClient>\n connectionName: string\n encrypted: {client: MongoClient; db: Db}\n /**\n * Starts the connection if it is not already started.\n * If the connection is already started, it resolves immediately.\n */\n startConnection: () => Promise<MongoClient>\n closeConnection: () => Promise<void>\n}\n\n// globalThis.myModuleMap ??= {}\nexport const connectionWrappers: {[key: string]: OrionMongoDatabaseWrapper} = {} //globalThis.myModuleMap\n\nclass OrionMongoDatabaseWrapper implements OrionMongoClient {\n uri: string\n dbName: string\n connectionName: string\n connectionPromise: Promise<MongoClient>\n private mongoOptions: MongoClientOptions\n private connectionEvent: EventEmitter = new EventEmitter()\n private state: 'disconnected' | 'connecting' | 'connected' | 'disconnecting' = 'disconnected'\n client: MongoClient\n db: Db\n configured = false\n readonly encrypted: {client: MongoClient; db: Db} = {client: null, db: null}\n readonly configTimeout: NodeJS.Timeout\n\n constructor(connectionName: string) {\n this.connectionName = connectionName\n logger.info('New connection requested', {\n connectionName,\n })\n\n this.connectionEvent.setMaxListeners(Number.POSITIVE_INFINITY)\n this.connectionPromise = new Promise((resolve, reject) => {\n if (this.state === 'connected') {\n resolve(this.client)\n }\n this.connectionEvent.once('connected', resolve)\n this.connectionEvent.once('error', reject)\n })\n this.configTimeout = setTimeout(() => {\n logger.error(\n 'Connection was required but never configured, call configureConnection() or unset the env variable MONGO_EXPLICIT_SETUP',\n {\n connectionName,\n },\n )\n this.connectionEvent.emit('error', new Error('Connection was required but never configured'))\n }, 30 * 1000)\n }\n\n config(mongoURL: string, mongoOptions: MongoClientOptions) {\n this.uri = mongoURL\n this.mongoOptions = mongoOptions\n this.configured = true\n if (this.mongoOptions?.autoEncryption) {\n this.encrypted.client = new MongoClient(mongoURL, {\n retryReads: true,\n ...this.mongoOptions,\n })\n this.encrypted.db = this.encrypted.client.db(getDBName(this.uri))\n }\n this.client = new MongoClient(mongoURL, {\n retryReads: true,\n ...this.mongoOptions,\n autoEncryption: null,\n })\n this.db = this.client.db(getDBName(this.uri))\n clearTimeout(this.configTimeout)\n }\n\n async awaitConnection() {\n if (this.state === 'connected') return this\n if (this.state === 'connecting' || !this.configured) {\n // Wait for the connection to be configured and established\n await this.connectionPromise\n return this\n }\n this.state = 'connecting'\n const censoredURI = this.uri.replace(/\\/\\/.*:.*@/, '//') // remove user and password from URL\n logger.info('Connecting to mongo', {\n uri: censoredURI,\n connectionName: this.connectionName,\n })\n if (this.encrypted.client) {\n await this.connectWithRetry(this.encrypted.client)\n logger.info('Successfully connected to encrypted mongo', {\n uri: censoredURI,\n connectionName: this.connectionName,\n })\n }\n await this.connectWithRetry(this.client)\n this.state = 'connected'\n this.connectionEvent.emit('connected', this.client)\n logger.info('Successfully connected to mongo', {\n uri: censoredURI,\n connectionName: this.connectionName,\n })\n nextTick(() => {\n this.connectionEvent.removeAllListeners()\n this.connectionEvent = null\n })\n return this\n }\n\n async connectWithRetry(client: MongoClient) {\n try {\n return await client.connect()\n } catch (error) {\n logger.error('Error connecting to mongo. Will retry in 5s', {\n error,\n connectionName: this.connectionName,\n })\n await sleep(5000)\n return this.connectWithRetry(client)\n }\n }\n\n async startConnection() {\n return this.awaitConnection().then(() => this.client)\n }\n\n async closeConnection() {\n if (this.state === 'disconnected' || this.state === 'disconnecting') return\n this.state = 'disconnecting'\n await this.client?.close()\n await this.encrypted?.client?.close()\n this.state = 'disconnected'\n }\n}\n\nexport function configureConnection(connectionName: string, mongoOptions: MongoClientOptions) {\n connectionWrappers[connectionName] =\n connectionWrappers[connectionName] || new OrionMongoDatabaseWrapper(connectionName)\n const connectionWrapper = connectionWrappers[connectionName]\n if (connectionWrapper.configured) {\n throw new Error('Connection already configured')\n }\n connectionWrapper.config(getMongoURLFromEnv(connectionName), mongoOptions)\n return connectionWrapper.awaitConnection()\n}\n\nexport function getExistingConnection(connectionName: string) {\n connectionWrappers[connectionName] =\n connectionWrappers[connectionName] || new OrionMongoDatabaseWrapper(connectionName)\n\n return connectionWrappers[connectionName]\n}\n\nexport const connections = connectionWrappers\n","export default function getDBName(url: string): string {\n let dbName = 'admin'\n let connectionPart = ''\n\n const startConnectionPart = url.indexOf('//') + 2\n\n if (url.indexOf('?') !== -1) {\n connectionPart = url.substring(startConnectionPart, url.indexOf('?'))\n } else {\n connectionPart = url.substring(startConnectionPart)\n }\n\n if (connectionPart.indexOf('.sock') !== -1) {\n if (connectionPart.indexOf('.sock/') !== -1) {\n dbName = connectionPart.split('.sock/')[1]\n }\n } else if (connectionPart.indexOf('/') !== -1) {\n dbName = connectionPart.split('/')[1]\n }\n\n return dbName\n}\n","import {internalGetEnv} from '@orion-js/env'\n\nexport const getMongoURLFromEnv = (connectionName: string): string => {\n if (connectionName === 'main') {\n if (!internalGetEnv('mongo_url', 'MONGO_URL')) {\n throw new Error('MONGO_URL is required')\n }\n return internalGetEnv('mongo_url', 'MONGO_URL')\n }\n\n const envName = `mongo_url_${connectionName.toLowerCase()}`\n const processEnvName = `MONGO_URL_${connectionName.toUpperCase()}`\n const uri = internalGetEnv(envName, processEnvName)\n if (!uri) {\n throw new Error(\n `To use the connection \"${connectionName}\" you must initialize it first calling getMongoConnection({name: \"${connectionName}\", uri: \"MONGOURI\"}) or setting the environment variable ${processEnvName}.`,\n )\n }\n\n return uri\n}\n\nexport const requiresExplicitSetup = (connectionName: string): boolean => {\n if (connectionName === 'main') {\n const value = internalGetEnv('mongo_explicit_setup', 'MONGO_EXPLICIT_SETUP')\n return typeof value === 'boolean' ? value : value === 'true'\n }\n\n const envName = `mongo_explicit_setup_${connectionName.toLowerCase()}`\n const processEnvName = `MONGO_EXPLICIT_SETUP_${connectionName.toUpperCase()}`\n const value = internalGetEnv(envName, processEnvName)\n return typeof value === 'boolean' ? value : value === 'true'\n}\n","import {getExistingConnection} from './connections'\nimport type {OrionMongoClient} from './connections'\nimport {getMongoURLFromEnv, requiresExplicitSetup} from './getMongoURLFromEnv'\nexport const allConnectionPromises = []\n\ninterface MongoConnectOptions {\n name: string\n uri?: string\n}\n\nexport const getMongoConnection = ({name, uri}: MongoConnectOptions): OrionMongoClient => {\n uri = uri || getMongoURLFromEnv(name)\n const connection = getExistingConnection(name)\n\n if (!connection.configured && !requiresExplicitSetup(name)) {\n connection.config(uri, {})\n }\n allConnectionPromises.push(connection.connectionPromise)\n return connection\n}\n","import * as MongoDB from 'mongodb'\nimport {\n FieldType,\n fieldTypes,\n InferSchemaType,\n Schema,\n SchemaInAnyOrionForm,\n StrictInferSchemaType,\n TypedSchemaOnSchema,\n} from '@orion-js/schema'\nimport {OrionMongoClient} from '../connect/connections'\nimport {EnhancedOmit} from 'mongodb'\nimport {generateUUIDWithPrefix} from '@orion-js/helpers'\n\nexport {MongoDB}\n\nexport type OptionalId<T> = MongoDB.OptionalId<T>\n\nexport declare type InferIdType<TSchema> = TSchema extends {\n _id: infer IdType\n}\n ? Record<any, never> extends IdType\n ? never\n : IdType\n : TSchema extends {\n _id?: infer IdType\n }\n ? unknown extends IdType\n ? string\n : IdType\n : string\n\nexport type DocumentWithId<TSchema> = EnhancedOmit<TSchema, '_id'> & {\n _id: InferIdType<TSchema>\n}\n\nexport type ModelClassBase = DocumentWithId<MongoDB.Document>\n\n/**\n * Index definition for a MongoDB collection.\n * Supports flat options (recommended) or nested options object (deprecated).\n *\n * @example New format (recommended):\n * ```ts\n * { keys: { email: 1 }, unique: true, sparse: true }\n * ```\n *\n * @example Old format (deprecated):\n * ```ts\n * { keys: { email: 1 }, options: { unique: true, sparse: true } }\n * ```\n */\nexport interface CollectionIndex extends Partial<MongoDB.CreateIndexesOptions> {\n keys: MongoDB.IndexSpecification\n /**\n * @deprecated Use flat options instead. Example: `{ keys: { email: 1 }, unique: true }`\n * instead of `{ keys: { email: 1 }, options: { unique: true } }`\n */\n options?: MongoDB.CreateIndexesOptions\n}\n\nexport namespace DataLoader {\n interface LoadDataOptionsBase<ModelClass extends ModelClassBase> {\n key: keyof ModelClass\n match?: MongoFilter<ModelClass>\n sort?: MongoDB.Sort\n project?: MongoDB.Document\n timeout?: number\n debug?: boolean\n }\n\n export interface LoadDataOptions<ModelClass extends ModelClassBase>\n extends LoadDataOptionsBase<ModelClass> {\n value?: any\n values?: Array<any>\n }\n\n export interface LoadOneOptions<ModelClass extends ModelClassBase>\n extends LoadDataOptionsBase<ModelClass> {\n value: any\n }\n\n export type LoadData<ModelClass extends ModelClassBase> = (\n options: LoadDataOptions<ModelClass>,\n ) => Promise<Array<ModelClass>>\n export type LoadOne<ModelClass extends ModelClassBase> = (\n options: LoadOneOptions<ModelClass>,\n ) => Promise<ModelClass>\n export type LoadMany<ModelClass extends ModelClassBase> = (\n options: LoadDataOptions<ModelClass>,\n ) => Promise<Array<ModelClass>>\n export type LoadById<ModelClass extends ModelClassBase> = (\n id: ModelClass['_id'],\n ) => Promise<ModelClass>\n}\n\nexport type MongoFilter<ModelClass extends ModelClassBase = ModelClassBase> =\n MongoDB.Filter<ModelClass>\n\nexport type MongoSelector<ModelClass extends ModelClassBase = ModelClassBase> =\n | ModelClass['_id']\n | MongoFilter<ModelClass>\n\nexport interface FindCursor<ModelClass> extends MongoDB.FindCursor {\n toArray: () => Promise<Array<ModelClass>>\n}\n\nexport interface UpdateOptions {\n clean?: boolean\n validate?: boolean\n mongoOptions?: MongoDB.UpdateOptions\n}\n\nexport interface FindOneAndUpdateUpdateOptions {\n clean?: boolean\n validate?: boolean\n mongoOptions?: MongoDB.FindOneAndUpdateOptions\n}\n\nexport interface InsertOptions {\n clean?: boolean\n validate?: boolean\n mongoOptions?: MongoDB.InsertOneOptions\n}\n\nexport interface InsertManyOptions {\n clean?: boolean\n validate?: boolean\n mongoOptions?: MongoDB.BulkWriteOptions\n}\n\nexport type InitItem<ModelClass extends ModelClassBase> = (doc: any) => ModelClass\n\nexport type ModelToMongoSelector<ModelClass extends ModelClassBase> =\n | MongoDB.Filter<ModelClass>\n | DocumentWithId<ModelClass>['_id']\n\nexport type FindOne<ModelClass extends ModelClassBase> = (\n selector?: ModelToMongoSelector<ModelClass>,\n options?: MongoDB.FindOptions<ModelClass>,\n) => Promise<ModelClass>\n\nexport type Find<ModelClass extends ModelClassBase> = (\n selector?: ModelToMongoSelector<ModelClass>,\n options?: MongoDB.FindOptions<ModelClass>,\n) => FindCursor<ModelClass>\n\nexport type FindOneAndUpdate<ModelClass extends ModelClassBase> = <\n TSelector extends ModelToMongoSelector<ModelClass>,\n TFilter extends MongoDB.UpdateFilter<ModelClass>,\n TOptions extends FindOneAndUpdateUpdateOptions,\n>(\n selector: TSelector,\n modifier: TFilter,\n options?: TOptions,\n) => ReturnType<MongoDB.Collection<ModelClass>['findOneAndUpdate']>\n\nexport type UpdateAndFind<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n modifier: MongoDB.UpdateFilter<ModelClass>,\n options?: FindOneAndUpdateUpdateOptions,\n) => Promise<ModelClass>\n\nexport type UpdateItem<ModelClass extends ModelClassBase> = (\n item: ModelClass,\n modifier: MongoDB.UpdateFilter<ModelClass>,\n options?: FindOneAndUpdateUpdateOptions,\n) => Promise<void>\n\nexport type InsertOne<ModelClass extends ModelClassBase> = (\n doc: MongoDB.OptionalId<ModelClass>,\n options?: InsertOptions,\n) => Promise<ModelClass['_id']>\n\nexport type InsertMany<ModelClass extends ModelClassBase> = (\n doc: Array<MongoDB.OptionalId<ModelClass>>,\n options?: InsertManyOptions,\n) => Promise<Array<ModelClass['_id']>>\n\nexport type InsertAndFind<ModelClass extends ModelClassBase> = (\n doc: MongoDB.OptionalId<ModelClass>,\n options?: InsertOptions,\n) => Promise<ModelClass>\n\nexport type DeleteMany<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n options?: MongoDB.DeleteOptions,\n) => Promise<MongoDB.DeleteResult>\n\nexport type DeleteOne<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n options?: MongoDB.DeleteOptions,\n) => Promise<MongoDB.DeleteResult>\n\nexport type UpdateOne<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n modifier: MongoDB.UpdateFilter<ModelClass>,\n options?: UpdateOptions,\n) => Promise<MongoDB.UpdateResult>\n\nexport type UpdateMany<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n modifier: MongoDB.UpdateFilter<ModelClass>,\n options?: UpdateOptions,\n) => Promise<MongoDB.UpdateResult | MongoDB.Document>\n\nexport type Upsert<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n modifier: MongoDB.UpdateFilter<ModelClass>,\n options?: UpdateOptions,\n) => Promise<MongoDB.UpdateResult>\n\nexport interface CreateCollectionOptions<ModelClass extends ModelClassBase = ModelClassBase> {\n /**\n * The name of the collection on the Mongo Database\n */\n name: string\n /**\n * The name of the connection to use. The Mongo URL of this connection will be search on env variables.\n * If not found, the connection url will be `env.mongo_url`\n * If defined, the connection url will be `env.mongo_url_${name}`\n */\n connectionName?: string\n /**\n * The schema used for cleaning and validation of the documents\n */\n schema?: SchemaInAnyOrionForm\n /**\n * The indexes to use\n */\n indexes?: Array<CollectionIndex>\n /**\n * Select between random id generation o mongo (time based) id generation\n */\n idGeneration?: 'mongo' | 'random' | 'uuid'\n /**\n * ID prefix. idGeneration will be forced to random. Recommended for type checking\n */\n idPrefix?: ModelClass['_id']\n}\n\nexport type EstimatedDocumentCount<_ModelClass extends ModelClassBase> = (\n options?: MongoDB.EstimatedDocumentCountOptions,\n) => Promise<number>\n\nexport type CountDocuments<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n options?: MongoDB.CountDocumentsOptions,\n) => Promise<number>\n\nexport type SchemaWithRequiredId = Schema & {_id: {type: any}}\n\nexport type InferSchemaTypeWithId<TSchema extends SchemaWithRequiredId> = DocumentWithId<\n StrictInferSchemaType<TSchema>\n>\n\nexport type CreateCollectionOptionsWithSchemaType<T extends SchemaWithRequiredId> = {\n schema: T\n} & Omit<CreateCollectionOptions<InferSchemaTypeWithId<T>>, 'schema'>\n\nexport type CreateCollectionOptionsWithTypedSchema<\n T extends TypedSchemaOnSchema & {prototype: {_id: string}},\n> = {\n schema: T\n} & Omit<CreateCollectionOptions<InferSchemaType<T>>, 'schema'>\n\nexport class BaseCollection<ModelClass extends ModelClassBase = ModelClassBase> {\n name: string\n connectionName?: string\n schema?: Schema\n generateId: () => ModelClass['_id']\n getSchema: () => Schema\n\n db: MongoDB.Db\n client: OrionMongoClient\n /**\n * @deprecated Use getRawCollection() instead. This property is not guaranteed to be defined if the connection has not been started.\n */\n rawCollection: MongoDB.Collection<ModelClass>\n getRawCollection: () => Promise<MongoDB.Collection<ModelClass>>\n\n findOne: FindOne<ModelClass>\n find: Find<ModelClass>\n\n insertOne: InsertOne<ModelClass>\n insertMany: InsertMany<ModelClass>\n insertAndFind: InsertAndFind<ModelClass>\n\n deleteMany: DeleteMany<ModelClass>\n deleteOne: DeleteOne<ModelClass>\n\n updateOne: UpdateOne<ModelClass>\n updateMany: UpdateMany<ModelClass>\n\n upsert: Upsert<ModelClass>\n findOneAndUpdate: FindOneAndUpdate<ModelClass>\n\n /**\n * Updates a document and returns the updated document with the changes\n */\n updateAndFind: UpdateAndFind<ModelClass>\n updateItem: UpdateItem<ModelClass>\n\n estimatedDocumentCount: EstimatedDocumentCount<ModelClass>\n countDocuments: CountDocuments<ModelClass>\n\n aggregate: <T = MongoDB.Document>(\n pipeline?: MongoDB.Document[],\n options?: MongoDB.AggregateOptions,\n ) => MongoDB.AggregationCursor<T>\n watch: <T = MongoDB.Document>(\n pipeline?: MongoDB.Document[],\n options?: MongoDB.ChangeStreamOptions,\n ) => MongoDB.ChangeStream<T>\n\n loadData: DataLoader.LoadData<ModelClass>\n loadOne: DataLoader.LoadOne<ModelClass>\n loadMany: DataLoader.LoadMany<ModelClass>\n loadById: DataLoader.LoadById<ModelClass>\n\n /**\n * Use this function if you are using tests and you pass the\n * env var DONT_CREATE_INDEXES_AUTOMATICALLY and you need to\n * create the indexes for this collection\n */\n createIndexes: () => Promise<string[]>\n createIndexesPromise: Promise<string[]>\n /**\n * Deletes indexes that exist in MongoDB but are not defined in the collection configuration.\n * This helps clean up stale indexes that are no longer needed.\n * Always preserves the _id_ index.\n */\n deleteUnusedIndexes: () => Promise<{deletedIndexes: string[]; collectionName: string}>\n /**\n * @deprecated Use startConnection() instead. This property is not guaranteed to be resolved if the connection is not started.\n * When using async calls startConnection or connectionPromise is no longer needed. Orion will automatically start the connection if it is not already started.\n * Kept for backwards compatibility. startConnection does not re-start the connection if it is already started, so it is safe to use.\n */\n connectionPromise: Promise<MongoDB.MongoClient>\n startConnection: () => Promise<MongoDB.MongoClient>\n}\n\nexport class Collection<\n ModelClass extends ModelClassBase = ModelClassBase,\n> extends BaseCollection<ModelClass> {\n indexes: Array<CollectionIndex>\n encrypted?: BaseCollection<ModelClass>\n}\n\nexport type DistinctDocumentId<DistinctId extends string> = string & {\n __TYPE__: `DistinctDocumentId<${DistinctId}>`\n}\n\nexport type TypedId<TPrefix extends string> = `${TPrefix}-${string}`\n\n/**\n * Use this function to create unique types for the ids of mongodb documents.\n * You should set it as the type of the _id field in your schema.\n *\n * @example\n * ```ts\n * type UserId = TypedId<'user'>\n *\n * const userSchema = {\n * _id: {\n * type: TypedId('user'),\n * },\n * }\n *\n * ```\n */\nexport function typedId<const TPrefix extends string>(\n prefix: TPrefix,\n): FieldType<TypedId<TPrefix>> & {generateId: () => TypedId<TPrefix>} {\n return {\n ...fieldTypes.string,\n name: `typedId:${prefix}`,\n toSerializedType: async () => 'string',\n generateId: () => generateUUIDWithPrefix(prefix),\n } as any\n}\n","import {Service} from '@orion-js/services'\nimport {createCollection} from '../createCollection'\nimport {CreateCollectionOptions, ModelClassBase} from '../types'\n\n// Define metadata storage using WeakMaps\nconst serviceMetadata = new WeakMap<any, {_serviceType: string}>()\n\nexport function Repository() {\n return (target: any, context: ClassDecoratorContext<any>) => {\n Service()(target, context)\n\n context.addInitializer(function (this) {\n serviceMetadata.set(this, {_serviceType: 'repo'})\n })\n }\n}\n\nexport function MongoCollection<ModelClass extends ModelClassBase = ModelClassBase>(\n options: CreateCollectionOptions<ModelClass>,\n) {\n return (_target: any, context: ClassFieldDecoratorContext) => {\n const propertyKey = String(context.name)\n context.addInitializer(function (this) {\n const repo = serviceMetadata.get(this.constructor)\n if (!repo || repo._serviceType !== 'repo') {\n throw new Error(\n 'You must pass a class decorated with @Repository if you want to use @MongoCollection',\n )\n }\n\n const collection = createCollection(options)\n this[propertyKey] = collection\n })\n }\n}\n","export function type(input){\n if (input === null){\n return 'Null'\n } else if (input === undefined){\n return 'Undefined'\n } else if (Number.isNaN(input)){\n return 'NaN'\n }\n const typeResult = Object.prototype.toString.call(input).slice(8, -1)\n\n return typeResult === 'AsyncFunction' ? 'Promise' : typeResult\n}\n","export const { isArray } = Array\n","function _isInteger(n){\n return n << 0 === n\n}\n\nexport const isInteger = Number.isInteger || _isInteger\n\n/**\n * Check if `index` is integer even if it is a string.\n */\nexport const isIndexInteger = index => Number.isInteger(Number(index))\n","import { isInteger } from './isInteger.js'\n\nexport function createPath(path, delimiter = '.'){\n return typeof path === 'string' ?\n path.split(delimiter).map(x => isInteger(x) ? Number(x) : x) :\n path\n}\n","import { isArray } from './_internals/isArray.js'\nimport { type } from './type.js'\n\nexport function _lastIndexOf(valueToFind, list){\n if (!isArray(list))\n throw new Error(`Cannot read property 'indexOf' of ${ list }`)\n\n const typeOfValue = type(valueToFind)\n if (![ 'Array', 'NaN', 'Object', 'RegExp' ].includes(typeOfValue))\n return list.lastIndexOf(valueToFind)\n\n const { length } = list\n let index = length\n let foundIndex = -1\n\n while (--index > -1 && foundIndex === -1)\n if (equals(list[ index ], valueToFind))\n foundIndex = index\n\n return foundIndex\n}\n\nexport function _indexOf(valueToFind, list){\n if (!isArray(list))\n throw new Error(`Cannot read property 'indexOf' of ${ list }`)\n\n const typeOfValue = type(valueToFind)\n if (![ 'Array', 'NaN', 'Object', 'RegExp' ].includes(typeOfValue))\n return list.indexOf(valueToFind)\n\n let index = -1\n let foundIndex = -1\n const { length } = list\n\n while (++index < length && foundIndex === -1)\n if (equals(list[ index ], valueToFind))\n foundIndex = index\n\n return foundIndex\n}\n\nfunction _arrayFromIterator(iter){\n const list = []\n let next\n while (!(next = iter.next()).done)\n list.push(next.value)\n\n return list\n}\n\nfunction _compareSets(a, b){\n if (a.size !== b.size)\n return false\n\n const aList = _arrayFromIterator(a.values())\n const bList = _arrayFromIterator(b.values())\n\n const filtered = aList.filter(aInstance => _indexOf(aInstance, bList) === -1)\n\n return filtered.length === 0\n}\n\nfunction compareErrors(a, b){\n if (a.message !== b.message) return false\n if (a.toString !== b.toString) return false\n\n return a.toString() === b.toString()\n}\n\nfunction parseDate(maybeDate){\n if (!maybeDate.toDateString) return [ false ]\n\n return [ true, maybeDate.getTime() ]\n}\n\nfunction parseRegex(maybeRegex){\n if (maybeRegex.constructor !== RegExp) return [ false ]\n\n return [ true, maybeRegex.toString() ]\n}\n\nexport function equals(a, b){\n if (arguments.length === 1) return _b => equals(a, _b)\n\n if (Object.is(a, b)) return true\n\n const aType = type(a)\n\n if (aType !== type(b)) return false\n if (aType === 'Function')\n return a.name === undefined ? false : a.name === b.name\n\n if ([ 'NaN', 'Null', 'Undefined' ].includes(aType)) return true\n\n if ([ 'BigInt', 'Number' ].includes(aType)){\n if (Object.is(-0, a) !== Object.is(-0, b)) return false\n\n return a.toString() === b.toString()\n }\n\n if ([ 'Boolean', 'String' ].includes(aType))\n return a.toString() === b.toString()\n\n if (aType === 'Array'){\n const aClone = Array.from(a)\n const bClone = Array.from(b)\n\n if (aClone.toString() !== bClone.toString())\n return false\n\n let loopArrayFlag = true\n aClone.forEach((aCloneInstance, aCloneIndex) => {\n if (loopArrayFlag)\n if (\n aCloneInstance !== bClone[ aCloneIndex ] &&\n !equals(aCloneInstance, bClone[ aCloneIndex ])\n )\n loopArrayFlag = false\n\n })\n\n return loopArrayFlag\n }\n\n const aRegex = parseRegex(a)\n const bRegex = parseRegex(b)\n\n if (aRegex[ 0 ])\n return bRegex[ 0 ] ? aRegex[ 1 ] === bRegex[ 1 ] : false\n else if (bRegex[ 0 ]) return false\n\n const aDate = parseDate(a)\n const bDate = parseDate(b)\n\n if (aDate[ 0 ])\n return bDate[ 0 ] ? aDate[ 1 ] === bDate[ 1 ] : false\n else if (bDate[ 0 ]) return false\n\n if (a instanceof Error){\n if (!(b instanceof Error)) return false\n\n return compareErrors(a, b)\n }\n\n if (aType === 'Set')\n return _compareSets(a, b)\n\n if (aType === 'Object'){\n const aKeys = Object.keys(a)\n\n if (aKeys.length !== Object.keys(b).length)\n return false\n\n let loopObjectFlag = true\n aKeys.forEach(aKeyInstance => {\n if (loopObjectFlag){\n const aValue = a[ aKeyInstance ]\n const bValue = b[ aKeyInstance ]\n\n if (aValue !== bValue && !equals(aValue, bValue))\n loopObjectFlag = false\n\n }\n })\n\n return loopObjectFlag\n }\n\n return false\n}\n","import { type } from './type.js'\n\nexport function isType(xType, x){\n if (arguments.length === 1){\n return xHolder => isType(xType, xHolder)\n }\n\n return type(x) === xType\n}\n","export function compare(a, b){\n return String(a) === String(b)\n}\n","import { compare } from './compare.js'\n\nexport function includes(a, list){\n let index = -1\n const { length } = list\n\n while (++index < length)\n if (compare(list[ index ], a))\n return true\n\n return false\n}\n","import { createPath } from './_internals/createPath.js'\nimport { includes } from './_internals/includes.js'\n\nexport function omit(propsToOmit, obj){\n if (arguments.length === 1) return _obj => omit(propsToOmit, _obj)\n\n if (obj === null || obj === undefined)\n return undefined\n\n const propsToOmitValue = createPath(propsToOmit, ',')\n const willReturn = {}\n\n for (const key in obj)\n if (!includes(key, propsToOmitValue))\n willReturn[ key ] = obj[ key ]\n\n return willReturn\n}\n","import { isArray } from './_internals/isArray.js'\n\nexport function flatten(list, input){\n const willReturn = input === undefined ? [] : input\n\n for (let i = 0; i < list.length; i++){\n if (isArray(list[ i ])){\n flatten(list[ i ], willReturn)\n } else {\n willReturn.push(list[ i ])\n }\n }\n\n return willReturn\n}\n","import { type } from './type.js'\n\nexport function isEmpty(input){\n const inputType = type(input)\n if ([ 'Undefined', 'NaN', 'Number', 'Null' ].includes(inputType))\n return false\n if (!input) return true\n\n if (inputType === 'Object'){\n return Object.keys(input).length === 0\n }\n\n if (inputType === 'Array'){\n return input.length === 0\n }\n\n return false\n}\n","export function isNil(x){\n return x === undefined || x === null\n}\n","import {type} from 'rambdax'\nimport {Filter} from 'mongodb'\nimport {ModelClassBase, ModelToMongoSelector} from '../../types'\n\nexport default function getSelector<ModelClass extends ModelClassBase>(\n args: IArguments | any[],\n): Filter<ModelClass> {\n if (args.length === 0) return {}\n\n const selector = args[0] as ModelToMongoSelector<ModelClass>\n\n if (typeof selector === 'string') {\n return {_id: selector} as Filter<ModelClass>\n }\n\n if (type(selector) === 'Object') {\n return selector as Filter<ModelClass>\n }\n\n return {\n _id: 'shouldReturnNull',\n } as Filter<ModelClass>\n}\n","import {Collection, Find, ModelClassBase} from '../../types'\nimport getSelector from './getSelector'\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const find: Find<DocumentType> = (...args: any[]) => {\n const selector = getSelector(args)\n const options = args[1]\n\n return collection.rawCollection.find(selector, options) as any\n }\n\n return find\n}\n","import getSelector from './getSelector'\nimport {Collection, FindOne, ModelClassBase} from '../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const findOne: FindOne<DocumentType> = async (...args: any[]) => {\n const options = args[1]\n await collection.connectionPromise\n const selector = getSelector<DocumentType>(args)\n const item = (await collection.rawCollection.findOne(selector, options)) as DocumentType\n\n if (!item) return item\n return item\n }\n\n return findOne\n}\n","import {validate} from '@orion-js/schema'\nimport fromDot from '../../../helpers/fromDot'\n\n/**\n * Validates $push and $addToSet\n */\nexport default async function ({schema, operationDoc, operation}) {\n for (const key of Object.keys(operationDoc)) {\n const value = operationDoc[key]\n let toValidate = null\n if (operation === '$push' || operation === '$addToSet') {\n if (typeof value === 'object' && '$each' in value) {\n toValidate = value.$each\n } else {\n toValidate = [value]\n }\n }\n const validationObject = fromDot({[key]: toValidate})\n await validate(schema, validationObject, {omitRequired: true})\n }\n}\n","import dot from 'dot-object'\nimport toDot from './toDot'\n\nexport default function fromDot(doc: any): any {\n doc = toDot(doc)\n return dot.object(doc)\n}\n","import Dot from 'dot-object'\n\nvar dot = new Dot('.', false, true, false)\n\nexport default function (doc) {\n return dot.dot(doc)\n}\n","import {validateKey, ValidationError} from '@orion-js/schema'\n\n/**\n * Validates $unset\n */\nexport default async function ({schema, operationDoc}) {\n const errors = {}\n for (const key of Object.keys(operationDoc)) {\n const error = await validateKey(schema, key, null)\n if (error) {\n errors[key] = error\n }\n }\n if (Object.keys(errors).length) {\n throw new ValidationError(errors)\n }\n}\n","import {validateKey, ValidationError} from '@orion-js/schema'\n\n/**\n * Validates $inc\n */\nexport default async function ({schema, operationDoc}) {\n const errors = {}\n for (const key of Object.keys(operationDoc)) {\n const value = operationDoc[key]\n const error = await validateKey(schema, key, value)\n if (error) {\n errors[key] = error\n }\n }\n if (Object.keys(errors).length) {\n throw new ValidationError(errors)\n }\n}\n","import {validate} from '@orion-js/schema'\nimport fromDot from '../../../helpers/fromDot'\nimport toDot from '../../../helpers/toDot'\n\n/**\n * Validates $set\n */\nexport default async function ({schema, operationDoc}) {\n let cleaned = toDot(operationDoc)\n\n const transformedObj = {}\n Object.keys(cleaned).map(key => {\n const newKey = key.replace('$.', '0.')\n transformedObj[newKey] = cleaned[key]\n })\n\n cleaned = fromDot(transformedObj)\n\n await validate(schema, cleaned, {omitRequired: true})\n}\n","import validatePush from './validatePush'\nimport validateUnset from './validateUnset'\nimport validateInc from './validateInc'\nimport validateSet from './validateSet'\n\nconst shouldCheck = function (key: string): boolean {\n if (key === '$pushAll') throw new Error('$pushAll is not supported, use $push + $each')\n return ['$pull', '$pullAll', '$pop', '$slice'].indexOf(key) === -1\n}\n\nexport default async function ({schema, operationDoc, operation}) {\n if (!shouldCheck(operation)) return\n\n if (operation === '$set') {\n await validateSet({schema, operationDoc})\n } else if (operation === '$unset') {\n await validateUnset({schema, operationDoc})\n } else if (operation === '$inc') {\n await validateInc({schema, operationDoc})\n } else if (operation === '$push' || operation === '$addToSet') {\n await validatePush({schema, operationDoc, operation})\n } else {\n throw new Error(operation + ' operation is not supported yet')\n }\n}\n","// inspired by https://github.com/aldeed/simple-schema-js\nimport validateOperator from './validateOperator'\n\nexport default async function validateModifier(schema, modifier) {\n for (const operation of Object.keys(modifier)) {\n const operationDoc = modifier[operation]\n // If non-operators are mixed in, throw error\n if (operation.slice(0, 1) !== '$') {\n throw new Error(`Expected '${operation}' to be a modifier operator like '$set'`)\n }\n\n await validateOperator({schema, operationDoc, operation})\n }\n}\n","import validateModifier from './index'\nimport {validate} from '@orion-js/schema'\nimport {omit} from 'rambdax'\nimport fromDot from '../../../helpers/fromDot'\n\nconst getPushSimulation = $push => {\n if (!$push) return {}\n const simulation = {}\n for (const key of Object.keys($push)) {\n const value = $push[key]\n if (typeof value === 'object' && '$each' in value) {\n simulation[key] = value.$each\n } else {\n simulation[key] = [value]\n }\n }\n return simulation\n}\n\nconst simulateNewDoc = (selector, modifier) =>\n fromDot({\n ...selector,\n ...modifier.$set,\n ...modifier.$inc,\n ...getPushSimulation(modifier.$push),\n ...getPushSimulation(modifier.$addToSet),\n ...modifier.$setOnInsert,\n })\n\nconst validateNewDoc = async (schema, selector, modifier) => {\n const doc = simulateNewDoc(selector, modifier)\n await validate(schema, doc)\n}\n\nexport default async function (schema, selector, modifier) {\n await validateNewDoc(schema, selector, modifier)\n await validateModifier(schema, omit(['$setOnInsert'], modifier))\n}\n","import {cleanKey, clean} from '@orion-js/schema'\nimport {isEmpty, isNil, equals} from 'rambdax'\nimport * as MongoDB from 'mongodb'\nimport fromDot from '../../helpers/fromDot'\nimport {ModelClassBase} from '../../types'\n\nconst shouldCheck = key => {\n if (key === '$pushAll') throw new Error('$pushAll is not supported; use $push + $each')\n return ['$pull', '$pullAll', '$pop', '$slice'].indexOf(key) === -1\n}\n\nexport default async function cleanModifier<\n ModelClass extends ModelClassBase,\n TFilter extends MongoDB.UpdateFilter<ModelClass>,\n>(schema, modifier: TFilter, {isUpsert} = {isUpsert: false}) {\n const cleanedModifier: MongoDB.UpdateFilter<MongoDB.Document> = {}\n for (const operation of Object.keys(modifier)) {\n const operationDoc = modifier[operation]\n cleanedModifier[operation] = {}\n // If non-operators are mixed in, throw error\n if (operation.slice(0, 1) !== '$') {\n throw new Error(`Expected '${operation}' to be a modifier operator like '$set'`)\n }\n if (!shouldCheck(operation)) {\n cleanedModifier[operation] = operationDoc\n continue\n }\n\n for (const key of Object.keys(operationDoc)) {\n const value = operationDoc[key]\n const cleanOptions = {forceDoc: operationDoc}\n\n let cleaned = null\n if (operation === '$push' || operation === '$addToSet') {\n if (typeof value === 'object' && '$each' in value) {\n const $each = await cleanKey(schema, key, value.$each, cleanOptions)\n cleaned = {...value, $each}\n } else {\n cleaned = await cleanKey(schema, `${key}.0`, value, cleanOptions)\n }\n }\n\n if (operation === '$set') {\n cleaned = await cleanKey(schema, key, value, cleanOptions)\n }\n\n if (operation === '$setOnInsert') {\n cleaned = await cleanKey(schema, key, value, cleanOptions)\n }\n\n if (operation === '$inc') {\n cleaned = await cleanKey(schema, key, value, cleanOptions)\n }\n\n if (operation === '$unset') {\n const isPresent = await cleanKey(schema, key, 'anyvalue', cleanOptions)\n cleaned = !isNil(isPresent) ? '' : null\n }\n\n if (cleaned !== undefined) {\n cleanedModifier[operation][key] = cleaned\n }\n }\n\n if (isEmpty(cleanedModifier[operation])) {\n delete cleanedModifier[operation]\n }\n }\n\n if (isUpsert) {\n const cleanedSetOnInsert = await clean(schema, fromDot(cleanedModifier.$setOnInsert || {}))\n\n if (!isEmpty(cleanedSetOnInsert)) {\n cleanedModifier.$setOnInsert = cleanedSetOnInsert\n }\n }\n\n if (equals(cleanedModifier, {})) {\n throw new Error('After cleaning your modifier is empty')\n }\n\n return cleanedModifier as TFilter\n}\n","import {ValidationError} from '@orion-js/schema'\n\nexport const wrapErrors = async <TFunc extends () => Promise<any>>(\n operation: TFunc,\n): Promise<ReturnType<TFunc>> => {\n try {\n return await operation()\n } catch (error) {\n if (error.code === 11000) {\n const regex = /index: (?:.*\\.)?\\$?(?:([_a-z0-9]*)(?:_\\d*)|([_a-z0-9]*))\\s*dup key/i\n const match = error.message.match(regex)\n\n if (!match) {\n throw new ValidationError({\n unknownKey: 'notUnique',\n })\n }\n\n const indexNameText = match[1] || match[2]\n const names = indexNameText.split(/_[_a-z0-9]_/)\n const errors = {}\n for (const name of names) {\n errors[name] = 'notUnique'\n }\n\n throw new ValidationError(errors)\n }\n\n throw error\n }\n}\n","import getSelector from './getSelector'\nimport validateUpsert from './validateModifier/validateUpsert'\nimport cleanModifier from './cleanModifier'\nimport {Collection, ModelClassBase, Upsert} from '../../types'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const upsert: Upsert<DocumentType> = async function (selectorArg, modifierArg, options = {}) {\n await collection.connectionPromise\n let modifier = modifierArg as any\n let selector = getSelector(arguments)\n\n modifier.$setOnInsert = {...modifier.$setOnInsert, _id: collection.generateId()}\n\n if (collection.schema) {\n const schema = collection.getSchema()\n\n if (options.clean !== false) {\n selector = (await cleanModifier(schema, {$set: selector})).$set\n modifier = await cleanModifier(schema, modifier, {isUpsert: true})\n }\n if (options.validate !== false) await validateUpsert(schema, selector, modifier)\n }\n\n const result = await wrapErrors(() => {\n return collection.rawCollection.updateOne(selector, modifier, {\n ...options.mongoOptions,\n upsert: true,\n })\n })\n\n return result\n }\n\n return upsert\n}\n","import getSelector from './getSelector'\nimport validateModifier from './validateModifier'\nimport cleanModifier from './cleanModifier'\nimport {Collection, FindOneAndUpdate, ModelClassBase} from '../../types'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const findOneAndUpdate: FindOneAndUpdate<DocumentType> = async (selector, modifier, options) => {\n await collection.connectionPromise\n const finalSelector = getSelector<DocumentType>([selector])\n\n if (!modifier) {\n throw new Error('Modifier is required when making an update')\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n modifier = options?.clean !== false ? await cleanModifier(schema, modifier) : modifier\n if (options?.validate !== false) await validateModifier(schema, modifier)\n }\n\n const result = await collection.rawCollection.findOneAndUpdate(\n finalSelector,\n modifier,\n options?.mongoOptions,\n )\n\n if (!result) return null\n return result\n }\n\n return findOneAndUpdate\n}\n","import getSelector from './getSelector'\nimport {Collection, ModelClassBase, UpdateOne} from '../../types'\nimport cleanModifier from './cleanModifier'\nimport validateModifier from './validateModifier'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const updateOne: UpdateOne<DocumentType> = async function (\n selectorArg,\n modifierArg,\n options = {},\n ) {\n await collection.connectionPromise\n let modifier = modifierArg as any\n const selector = getSelector(arguments)\n\n if (!modifier) {\n throw new Error('Modifier is required when making an update')\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n modifier = options.clean !== false ? await cleanModifier(schema, modifier) : modifier\n if (options.validate !== false) await validateModifier(schema, modifier)\n }\n\n const result = await wrapErrors(() => {\n return collection.rawCollection.updateOne(selector, modifier, options.mongoOptions)\n })\n\n return result\n }\n\n return updateOne\n}\n","import getSelector from './getSelector'\nimport {Collection, ModelClassBase, UpdateMany} from '../../types'\nimport cleanModifier from './cleanModifier'\nimport validateModifier from './validateModifier'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const updateMany: UpdateMany<DocumentType> = async function (\n selectorArg,\n modifierArg,\n options = {},\n ) {\n await collection.connectionPromise\n let modifier = modifierArg as any\n const selector = getSelector(arguments)\n\n if (!modifier) {\n throw new Error('Modifier is required when making an update')\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n modifier = options.clean !== false ? await cleanModifier(schema, modifier) : modifier\n if (options.validate !== false) await validateModifier(schema, modifier)\n }\n\n const result = await wrapErrors(() => {\n return collection.rawCollection.updateMany(selector, modifier, options.mongoOptions)\n })\n\n return result\n }\n\n return updateMany\n}\n","import {Collection, ModelClassBase, UpdateAndFind} from '../../types'\nimport getSelector from './getSelector'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const updateAndFind: UpdateAndFind<DocumentType> = async function (\n selector,\n modifier,\n options = {},\n ) {\n await collection.connectionPromise\n return await wrapErrors(async () => {\n return await collection.findOneAndUpdate(selector, modifier, {\n ...options,\n mongoOptions: {\n ...options.mongoOptions,\n returnDocument: 'after',\n },\n })\n })\n }\n return updateAndFind\n}\n","import getSelector from './getSelector'\nimport {Collection, DeleteOne, ModelClassBase} from '../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const func: DeleteOne<DocumentType> = async function (selectorArg, options) {\n await collection.connectionPromise\n const selector = getSelector(arguments)\n const result = await collection.rawCollection.deleteOne(selector, options)\n\n return result\n }\n\n return func\n}\n","import getSelector from './getSelector'\nimport {Collection, DeleteMany, ModelClassBase} from '../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const func: DeleteMany<DocumentType> = async function (selectorArg, options) {\n await collection.connectionPromise\n const selector = getSelector(arguments)\n const result = await collection.rawCollection.deleteMany(selector, options)\n\n return result\n }\n\n return func\n}\n","import {Collection, InsertOne, ModelClassBase} from '../../types'\nimport fromDot from '../../helpers/fromDot'\nimport {clean, validate} from '@orion-js/schema'\nimport {wrapErrors} from './wrapErrors'\nimport {isType} from 'rambdax'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const insertOne: InsertOne<DocumentType> = async (insertDoc, options = {}) => {\n await collection.connectionPromise\n let doc = insertDoc as DocumentType\n if (!doc || !isType('Object', doc)) {\n throw new Error('Insert must receive a document')\n }\n\n if (!doc._id) {\n doc._id = collection.generateId()\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n doc = await clean(schema, fromDot(doc))\n await validate(schema, doc)\n }\n\n await wrapErrors(async () => {\n await collection.rawCollection.insertOne(doc, options.mongoOptions)\n })\n\n return doc._id\n }\n\n return insertOne\n}\n","import {type} from 'rambdax'\nimport {clone} from '@orion-js/helpers'\nimport {Collection, InsertMany, ModelClassBase} from '../../types'\nimport * as MongoDB from 'mongodb'\nimport fromDot from '../../helpers/fromDot'\nimport {clean, validate} from '@orion-js/schema'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const insertMany: InsertMany<DocumentType> = async (docs, options = {}) => {\n await collection.connectionPromise\n for (let index = 0; index < docs.length; index++) {\n let doc = clone(docs[index]) as any\n\n if (!doc || type(doc) !== 'Object') {\n throw new Error(`Item at index ${index} is not a document`)\n }\n\n if (!doc._id) {\n doc._id = collection.generateId()\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n doc = await clean(schema, fromDot(doc))\n await validate(schema, doc)\n }\n\n docs[index] = doc\n }\n const {insertedIds} = await wrapErrors(() => {\n return collection.rawCollection.insertMany(docs as any, options.mongoOptions)\n })\n\n const ids: Array<MongoDB.ObjectId> = Object.values(insertedIds)\n\n return ids.map(id => id.toString())\n }\n\n return insertMany\n}\n","import {Collection, ModelClassBase, UpdateItem} from '../../types'\nimport {wrapErrors} from './wrapErrors'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const updateItem: UpdateItem<DocumentType> = async function (item, modifier, options = {}) {\n await collection.connectionPromise\n const updated = await wrapErrors(async () => {\n return await collection.updateAndFind(item._id, modifier, options)\n })\n\n for (const key in item) {\n delete item[key]\n }\n\n for (const key in updated) {\n item[key] = updated[key]\n }\n }\n return updateItem\n}\n","import getSelector from './getSelector'\nimport {Collection, CountDocuments, DeleteOne, ModelClassBase} from '../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const func: CountDocuments<DocumentType> = async function (selectorArg, options) {\n await collection.connectionPromise\n const selector = getSelector(arguments)\n const result = await collection.rawCollection.countDocuments(selector, options)\n\n return result\n }\n\n return func\n}\n","import {Collection, EstimatedDocumentCount, ModelClassBase} from '../../types'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const func: EstimatedDocumentCount<DocumentType> = async function (options) {\n await collection.connectionPromise\n const result = await collection.rawCollection.estimatedDocumentCount(options)\n return result\n }\n\n return func\n}\n","import {type} from 'rambdax'\nimport {Collection, InsertAndFind, ModelClassBase} from '../../types'\nimport fromDot from '../../helpers/fromDot'\nimport {clean, validate} from '@orion-js/schema'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const insertAndFind: InsertAndFind<DocumentType> = async (insertDoc, options = {}) => {\n await collection.connectionPromise\n let doc = insertDoc as any\n if (!doc || type(doc) !== 'Object') {\n throw new Error('Insert must receive a document')\n }\n\n if (!doc._id) {\n doc._id = collection.generateId()\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n doc = await clean(schema, fromDot(doc))\n await validate(schema, doc)\n }\n\n await wrapErrors(async () => {\n await collection.rawCollection.insertOne(doc, options.mongoOptions)\n })\n\n return doc\n }\n\n return insertAndFind\n}\n","import {Collection, DataLoader, ModelClassBase} from '../../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const loadById: DataLoader.LoadById<DocumentType> = async id => {\n const result = await collection.loadOne({\n key: '_id',\n value: id,\n })\n\n return result\n }\n\n return loadById\n}\n","import {Collection, DataLoader, ModelClassBase} from '../../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const loadMany: DataLoader.LoadMany<DocumentType> = async options => {\n const results = await collection.loadData(options)\n return results\n }\n\n return loadMany\n}\n","import {Collection, DataLoader, ModelClassBase} from '../../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const loadOne: DataLoader.LoadOne<DocumentType> = async options => {\n const [result] = await collection.loadData(options)\n return result\n }\n\n return loadOne\n}\n","import {createMapArray, clone} from '@orion-js/helpers'\nimport {DataLoader, Collection, ModelClassBase, ModelToMongoSelector} from '../../../types'\nimport dataLoad from './dataLoad'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const loadData: DataLoader.LoadData<DocumentType> = async options => {\n await collection.connectionPromise\n\n const result = await dataLoad({\n loaderKey: {\n key: options.key,\n match: options.match,\n sort: options.sort,\n project: options.project,\n collectionName: collection.name,\n },\n id: options.value,\n ids: options.values,\n timeout: options.timeout,\n load: async values => {\n const query = {\n ...clone(options.match),\n [options.key]: {$in: values},\n } as ModelToMongoSelector<DocumentType>\n\n // Use secondaryPreferred to distribute read load across replicas\n const cursor = collection.find(query, {readPreference: 'secondaryPreferred'})\n\n if (options.sort) {\n cursor.sort(options.sort)\n }\n\n if (options.project) {\n cursor.project(options.project)\n }\n\n if (options.debug) {\n console.info(`Will execute data loading query now on ${collection.name}: `, query)\n }\n\n const items = await cursor.toArray()\n\n const itemsMap = createMapArray(items, options.key as string)\n return values.map(value => {\n return itemsMap[value] || []\n })\n },\n })\n\n return result\n }\n\n return loadData\n}\n","import DataLoader from 'dataloader'\n\nexport const cache = new Map()\n\ninterface Options {\n key: string\n func: (ids: Array<string>) => Promise<any>\n timeout: number\n}\n\nexport const getDataLoader = (params: Options): DataLoader<any, any> => {\n const {key, func, timeout} = params\n\n const existing = cache.get(key)\n if (existing) return existing\n\n const load = async (ids: Array<string>) => {\n cache.delete(key)\n return await func(ids)\n }\n\n const options = {\n batchScheduleFn: callback => setTimeout(callback, timeout),\n }\n\n const dataLoader = new DataLoader(load, options)\n\n cache.set(key, dataLoader)\n\n return dataLoader\n}\n","import {getDataLoader} from './getDataLoader'\nimport {flatten} from 'rambdax'\nimport {hashObject} from '@orion-js/helpers'\n\ninterface Options {\n loaderKey: any\n load: (values: Array<string>) => Promise<any>\n timeout?: number\n ids?: Array<string>\n id?: string\n}\n\nconst dataLoad = async (options: Options) => {\n const dataLoader = getDataLoader({\n key: hashObject(options.loaderKey),\n func: options.load,\n timeout: options.timeout || 5,\n })\n\n if (options.ids) {\n const resultArray = await dataLoader.loadMany(options.ids)\n return flatten(resultArray)\n }\n\n return await dataLoader.load(options.id)\n}\n\nexport default dataLoad\n","import {generateId, generateUUID} from '@orion-js/helpers'\nimport {ObjectId} from 'bson'\nimport {CreateCollectionOptions, ModelClassBase} from '..'\nimport {FieldType} from '@orion-js/schema'\n\nconst getIdGenerator = <DocumentType extends ModelClassBase>(\n options: CreateCollectionOptions,\n): (() => DocumentType['_id']) => {\n if (!options.idPrefix && options?.schema?._id) {\n const idField = options.schema._id.type as FieldType\n if (idField.name?.startsWith('typedId:')) {\n return () => {\n return (idField as any).generateId()\n }\n }\n }\n\n if (options.idPrefix || options.idGeneration === 'uuid') {\n return () => {\n const prefix = options.idPrefix || ''\n const random = generateUUID()\n return `${prefix}${random}`\n }\n }\n\n if (options.idGeneration === 'random') {\n return () => {\n const prefix = options.idPrefix || ''\n const random = generateId()\n return `${prefix}${random}`\n }\n }\n\n return () => {\n const id = new ObjectId()\n\n return id.toString()\n }\n}\n\nexport default getIdGenerator\n","import {MongoExpiredSessionError, MongoNotConnectedError} from 'mongodb'\nimport {Collection, ModelClassBase} from '..'\nimport {logger} from '@orion-js/logger'\nimport {isIndexDefined} from './deleteUnusedIndexes'\nimport {getIndexOptions} from './getIndexOptions'\n\nexport interface MongoDBIndex {\n key: Record<string, unknown>\n name: string\n}\n\n/**\n * Checks for indexes in the database that are not defined in the collection configuration.\n * Logs a warning if unexpected indexes are found.\n */\nexport async function checkIndexes<DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n): Promise<void> {\n await collection.connectionPromise\n\n // Get current indexes from MongoDB\n let currentIndexes: Array<{key: Record<string, unknown>; name: string}> = []\n try {\n currentIndexes = (await collection.rawCollection.indexes()) as MongoDBIndex[]\n } catch (error) {\n if ((error as {codeName?: string}).codeName !== 'NamespaceNotFound') throw error\n return\n }\n\n // If no indexes defined, skip the check (don't warn about all indexes)\n if (!collection.indexes || collection.indexes.length === 0) {\n return\n }\n\n // Find unexpected indexes using the safer key-based matching\n const unexpectedIndexes = currentIndexes.filter(\n index => index.name !== '_id_' && !isIndexDefined(collection.indexes, index),\n )\n\n if (unexpectedIndexes.length > 0) {\n logger.warn(\n `${unexpectedIndexes.length} unexpected indexes found in collection \"${\n collection.name\n }\": ${unexpectedIndexes\n .map(i => i.name)\n .join(', ')} | Delete the index or fix the collection definition`,\n )\n }\n}\nexport async function loadIndexes<DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n): Promise<string[]> {\n if (!collection.indexes) return\n if (!collection.indexes.length) return\n\n await collection.connectionPromise\n\n const results = Promise.all(\n collection.indexes.map(async indexDef => {\n const {keys} = indexDef\n // Support both flat options and deprecated nested options\n const options = getIndexOptions(indexDef)\n\n try {\n return await collection.rawCollection.createIndex(keys, options)\n } catch (error) {\n if (error.code === 85 || error.code === 86) {\n console.info('Will delete index to create the new version')\n const indexName = (() => {\n const message = error.errorResponse.errmsg\n const indexName = message.split('name: \"')[1].split('\"')[0]\n return indexName\n })()\n await collection.rawCollection.dropIndex(indexName)\n console.info('Index was deleted, creating new index')\n const result = await collection.rawCollection.createIndex(keys, options)\n console.info('Index updated correctly')\n return result\n }\n if (error instanceof MongoExpiredSessionError || error instanceof MongoNotConnectedError) {\n // this errors is thrown when we are on tests environment\n // but it's not a problem never, index will be created on the next connection\n } else {\n console.error(`Error creating index for collection ${collection.name}: ${error.message}`)\n console.error(error)\n return error.message\n }\n }\n }),\n )\n\n await checkIndexes(collection)\n\n return results\n}\n","import {logger} from '@orion-js/logger'\nimport {Collection, CollectionIndex, ModelClassBase} from '../types'\nimport {getIndexName} from './getIndexOptions'\n\n/**\n * Represents a MongoDB index as returned by the indexes() method\n */\ninterface MongoDBIndex {\n key: Record<string, unknown>\n name: string\n}\n\n/**\n * Compares two index key specifications for equality.\n * Handles key order and special index types (text, 2dsphere, hashed, etc.)\n * @param definitionKeys - The keys from the collection index definition\n * @param currentIndexKey - The keys from the current MongoDB index\n * @returns true if the keys match exactly in order and values\n */\nexport function keysMatch(\n definitionKeys: Record<string, unknown>,\n currentIndexKey: Record<string, unknown>,\n): boolean {\n const defEntries = Object.entries(definitionKeys)\n const curEntries = Object.entries(currentIndexKey)\n\n // Different number of keys means no match\n if (defEntries.length !== curEntries.length) return false\n\n // Compare each key-value pair in order (order matters for compound indexes)\n for (let i = 0; i < defEntries.length; i++) {\n const [defKey, defValue] = defEntries[i]\n const [curKey, curValue] = curEntries[i]\n if (defKey !== curKey || defValue !== curValue) return false\n }\n\n return true\n}\n\n/**\n * Checks if a current database index matches any of the defined indexes.\n * First checks by custom name if provided (supports both flat and deprecated formats),\n * then by key specification.\n * @param definedIndexes - Array of index definitions from the collection\n * @param currentIndex - The index from MongoDB to check\n * @returns true if the index is defined in the collection configuration\n */\nexport function isIndexDefined(\n definedIndexes: CollectionIndex[],\n currentIndex: MongoDBIndex,\n): boolean {\n return definedIndexes.some(defIndex => {\n // Match by custom name if provided (handles both flat and deprecated options formats)\n const customName = getIndexName(defIndex)\n if (customName && customName === currentIndex.name) return true\n // Match by key specification (safer than name comparison)\n return keysMatch(defIndex.keys as Record<string, unknown>, currentIndex.key)\n })\n}\n\n/**\n * Result of the deleteUnusedIndexes operation\n */\nexport interface DeleteUnusedIndexesResult {\n /** Names of the indexes that were deleted */\n deletedIndexes: string[]\n /** Name of the collection that was cleaned */\n collectionName: string\n}\n\n/**\n * Deletes indexes that exist in MongoDB but are not defined in the collection configuration.\n * This helps clean up stale indexes that are no longer needed.\n * Always preserves the _id_ index.\n * @param collection - The collection to clean unused indexes from\n * @returns Information about which indexes were deleted\n */\nexport async function deleteUnusedIndexes<DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n): Promise<DeleteUnusedIndexesResult> {\n await collection.connectionPromise\n\n const result: DeleteUnusedIndexesResult = {\n deletedIndexes: [],\n collectionName: collection.name,\n }\n\n // Get current indexes from MongoDB\n let currentIndexes: MongoDBIndex[] = []\n try {\n currentIndexes = (await collection.rawCollection.indexes()) as MongoDBIndex[]\n } catch (error) {\n // Collection doesn't exist yet, nothing to delete\n if ((error as {codeName?: string}).codeName === 'NamespaceNotFound') {\n return result\n }\n throw error\n }\n\n // If no indexes are defined, we don't delete anything (safety measure)\n if (!collection.indexes || collection.indexes.length === 0) {\n return result\n }\n\n // Find indexes that are not defined in the collection configuration\n const unusedIndexes = currentIndexes.filter(\n index => index.name !== '_id_' && !isIndexDefined(collection.indexes, index),\n )\n\n // Delete each unused index\n for (const index of unusedIndexes) {\n try {\n await collection.rawCollection.dropIndex(index.name)\n result.deletedIndexes.push(index.name)\n logger.info(`Deleted unused index \"${index.name}\" from collection \"${collection.name}\"`)\n } catch (error) {\n logger.error(`Failed to delete index \"${index.name}\" from collection \"${collection.name}\"`, {\n error,\n })\n }\n }\n\n return result\n}\n","import type {CreateIndexesOptions} from 'mongodb'\nimport type {CollectionIndex} from '../types'\n\n/**\n * Extracts the index options from a CollectionIndex definition.\n * Handles both the new flat format and the deprecated nested options format.\n *\n * @example New format (recommended):\n * ```ts\n * { keys: { email: 1 }, unique: true, sparse: true }\n * // Returns: { unique: true, sparse: true }\n * ```\n *\n * @example Old format (deprecated):\n * ```ts\n * { keys: { email: 1 }, options: { unique: true } }\n * // Returns: { unique: true }\n * ```\n *\n * @param indexDef - The index definition from the collection configuration\n * @returns The MongoDB CreateIndexesOptions to pass to createIndex()\n */\nexport function getIndexOptions(indexDef: CollectionIndex): CreateIndexesOptions | undefined {\n // Extract all properties except 'keys' and 'options' as flat options\n const {keys: _keys, options: deprecatedOptions, ...flatOptions} = indexDef\n\n // If deprecated options exist, merge them with flat options (flat takes precedence)\n if (deprecatedOptions) {\n return {...deprecatedOptions, ...flatOptions}\n }\n\n // Return flat options if any exist, otherwise undefined\n return Object.keys(flatOptions).length > 0 ? flatOptions : undefined\n}\n\n/**\n * Gets the custom name from an index definition if one was specified.\n * Handles both flat format and deprecated nested options format.\n *\n * @param indexDef - The index definition from the collection configuration\n * @returns The custom index name if specified, undefined otherwise\n */\nexport function getIndexName(indexDef: CollectionIndex): string | undefined {\n // Flat format takes precedence\n if (indexDef.name) {\n return indexDef.name\n }\n\n // Fall back to deprecated options\n return indexDef.options?.name\n}\n","import {logger} from '@orion-js/logger'\nimport type {Collection, CollectionIndex, ModelClassBase} from '../types'\nimport {DeleteUnusedIndexesResult, keysMatch} from './deleteUnusedIndexes'\nimport {getIndexName} from './getIndexOptions'\nimport {createIndexesPromises} from './index'\n\n/**\n * Registry that tracks all collections created via createCollection().\n * Maps connection name to a map of collection name to collection instance.\n * When the same collection is registered multiple times, indexes are merged.\n */\nexport const collectionsRegistry = new Map<string, Map<string, Collection<ModelClassBase>>>()\n\n/**\n * Checks if two index definitions are equivalent (same keys or same custom name).\n */\nfunction indexesAreEqual(indexA: CollectionIndex, indexB: CollectionIndex): boolean {\n const nameA = getIndexName(indexA)\n const nameB = getIndexName(indexB)\n\n // If both have custom names, compare by name\n if (nameA && nameB) {\n return nameA === nameB\n }\n\n // Otherwise compare by keys\n return keysMatch(\n indexA.keys as Record<string, unknown>,\n indexB.keys as Record<string, unknown>,\n )\n}\n\n/**\n * Merges two arrays of index definitions, avoiding duplicates.\n * @param existingIndexes - The indexes already registered\n * @param newIndexes - The new indexes to merge in\n * @returns Merged array of unique indexes\n */\nfunction mergeIndexes(\n existingIndexes: CollectionIndex[],\n newIndexes: CollectionIndex[],\n): CollectionIndex[] {\n const merged = [...existingIndexes]\n\n for (const newIndex of newIndexes) {\n const isDuplicate = existingIndexes.some(existing => indexesAreEqual(existing, newIndex))\n if (!isDuplicate) {\n merged.push(newIndex)\n }\n }\n\n return merged\n}\n\n/**\n * Registers a collection in the registry.\n * Called automatically when a collection is created via createCollection().\n * If the same collection name is registered multiple times, indexes are merged\n * to support multiple createCollection() calls for the same collection.\n * @param connectionName - The name of the MongoDB connection\n * @param collection - The collection instance to register\n */\nexport function registerCollection(\n connectionName: string,\n collection: Collection<ModelClassBase>,\n): void {\n if (!collectionsRegistry.has(connectionName)) {\n collectionsRegistry.set(connectionName, new Map())\n }\n\n const connectionMap = collectionsRegistry.get(connectionName)\n const existingCollection = connectionMap.get(collection.name)\n\n if (existingCollection) {\n // Merge indexes from multiple createCollection calls for the same collection\n existingCollection.indexes = mergeIndexes(existingCollection.indexes, collection.indexes)\n } else {\n connectionMap.set(collection.name, collection)\n }\n}\n\n/**\n * Gets all registered collections for a specific connection.\n * @param connectionName - The name of the MongoDB connection (defaults to 'main')\n * @returns Array of registered collections for the connection\n */\nexport function getRegisteredCollections(\n connectionName = 'main',\n): Array<Collection<ModelClassBase>> {\n const connectionCollections = collectionsRegistry.get(connectionName)\n if (!connectionCollections) {\n return []\n }\n return Array.from(connectionCollections.values())\n}\n\n/**\n * Deletes unused indexes from all registered collections for a connection.\n * Iterates over all collections registered via createCollection() and\n * removes indexes that exist in MongoDB but are not defined in the collection configuration.\n *\n * **Important**: This function waits for all pending index creation to complete before\n * deleting any indexes, to avoid race conditions where an index being created might\n * be incorrectly identified as unused.\n *\n * @param connectionName - The name of the MongoDB connection (defaults to 'main')\n * @returns Array of results for each collection that had indexes deleted\n *\n * @example\n * ```ts\n * // Delete unused indexes from all collections on the main connection\n * const results = await deleteAllUnusedIndexes()\n *\n * // Delete unused indexes from all collections on a specific connection\n * const results = await deleteAllUnusedIndexes('secondary')\n *\n * // Log results\n * for (const result of results) {\n * console.log(`${result.collectionName}: deleted ${result.deletedIndexes.length} indexes`)\n * }\n * ```\n */\nexport async function deleteAllUnusedIndexes(\n connectionName = 'main',\n): Promise<DeleteUnusedIndexesResult[]> {\n const collections = getRegisteredCollections(connectionName)\n\n if (collections.length === 0) {\n logger.warn(`No collections registered for connection \"${connectionName}\"`)\n return []\n }\n\n // Wait for all pending index creation to complete before deleting\n // This prevents race conditions where we might delete an index that's being created\n if (createIndexesPromises.length > 0) {\n logger.info('Waiting for pending index creation to complete before deleting unused indexes...')\n await Promise.all(createIndexesPromises)\n }\n\n logger.info(\n `Deleting unused indexes from ${collections.length} collections on connection \"${connectionName}\"`,\n )\n\n const results: DeleteUnusedIndexesResult[] = []\n\n for (const collection of collections) {\n const result = await collection.deleteUnusedIndexes()\n if (result.deletedIndexes.length > 0) {\n results.push(result)\n }\n }\n\n const totalDeleted = results.reduce((sum, r) => sum + r.deletedIndexes.length, 0)\n logger.info(`Deleted ${totalDeleted} unused indexes from ${results.length} collections`)\n\n return results\n}\n","import {Schema} from '@orion-js/schema'\nimport {type} from 'rambdax'\nimport {clone} from '@orion-js/helpers'\nimport {CreateCollectionOptions} from '../types'\n\n// @ts-ignore polyfill for Symbol.metadata // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#decorator-metadata\nSymbol.metadata ??= Symbol('Symbol.metadata')\n\nexport function prepareShema(schema: Schema): Schema {\n if (!schema._id) {\n schema._id = {\n type: String,\n }\n }\n return schema\n}\n\nexport function getSchema(options: CreateCollectionOptions): Schema {\n if (!options.schema) return\n\n if (options.schema[Symbol.metadata]?._getModel) {\n return options.schema[Symbol.metadata]._getModel().getSchema()\n }\n\n // schema is a model\n if (options.schema.getSchema) {\n const schema = options.schema.getSchema()\n return prepareShema(schema)\n }\n\n // schema is a typed model\n if (options.schema.getModel) {\n const model = options.schema.getModel()\n const schema = model ? clone(model.getSchema()) : {}\n return prepareShema(schema)\n }\n\n if (type(options.schema) === 'Object') {\n return prepareShema(options.schema)\n }\n}\n","import {Collection} from '../types'\nimport {logger} from '@orion-js/logger'\n\nexport function wrapMethods(collection: Partial<Collection>) {\n // Wrap all collection methods to ensure connection is started\n const methodsWithPromises = [\n 'findOne',\n 'findOneAndUpdate',\n 'insertOne',\n 'insertMany',\n 'insertAndFind',\n 'updateOne',\n 'updateMany',\n 'deleteMany',\n 'deleteOne',\n 'upsert',\n 'estimatedDocumentCount',\n 'countDocuments',\n 'updateAndFind',\n 'updateItem',\n 'loadData',\n 'loadById',\n 'loadOne',\n 'loadMany',\n ]\n\n const methodsWithoutPromises = ['aggregate', 'find', 'watch']\n\n const originalMethods = {...collection}\n\n for (const methodName of methodsWithPromises) {\n if (typeof collection[methodName] === 'function') {\n collection[methodName] = async (...args: any[]) => {\n await collection.startConnection()\n return originalMethods[methodName](...args)\n }\n }\n\n for (const methodName of methodsWithoutPromises) {\n if (typeof collection[methodName] === 'function') {\n collection[methodName] = (...args: any[]) => {\n collection.startConnection()\n if (!collection.rawCollection) {\n logger.error('Method called before connection was initialized', {\n collectionName: collection.name,\n connectionName: collection.connectionName,\n methodName,\n })\n throw new Error('Method called before connection was initialized')\n }\n return originalMethods[methodName](...args)\n }\n }\n }\n }\n}\n","import {\n BaseCollection,\n Collection,\n CreateCollectionOptions,\n CreateCollectionOptionsWithSchemaType,\n CreateCollectionOptionsWithTypedSchema,\n InferSchemaTypeWithId,\n ModelClassBase,\n SchemaWithRequiredId,\n} from '../types'\nimport {\n countDocuments,\n deleteMany,\n deleteOne,\n estimatedDocumentCount,\n find,\n findOne,\n findOneAndUpdate,\n insertMany,\n insertOne,\n updateAndFind,\n updateItem,\n updateMany,\n updateOne,\n upsert,\n insertAndFind,\n} from './getMethods'\nimport {loadById, loadOne, loadMany, loadData} from './getMethods/dataLoader'\nimport getIdGenerator from './generateId'\nimport {loadIndexes} from './createIndexes'\nimport {deleteUnusedIndexes} from './deleteUnusedIndexes'\nimport {registerCollection} from './collectionsRegistry'\nimport {getMongoConnection} from '..'\nimport {getSchema} from './getSchemaAndModel'\nimport {wrapMethods} from './wrapMethods'\nimport {InferSchemaType, TypedSchemaOnSchema} from '@orion-js/schema'\nimport {MongoClient} from 'mongodb'\n\nexport const createIndexesPromises = []\n\nexport function createCollection<T extends SchemaWithRequiredId>(\n options: CreateCollectionOptionsWithSchemaType<T>,\n): Collection<InferSchemaTypeWithId<T>>\n\nexport function createCollection<T extends TypedSchemaOnSchema & {prototype: {_id: string}}>(\n options: CreateCollectionOptionsWithTypedSchema<T>,\n): Collection<InferSchemaType<T>>\n\nexport function createCollection<T extends ModelClassBase>(\n options: CreateCollectionOptions<T>,\n): Collection<T>\n\nexport function createCollection(options: CreateCollectionOptions) {\n const connectionName = options.connectionName || 'main'\n\n const orionConnection = getMongoConnection({name: connectionName})\n if (!orionConnection) {\n throw new Error(`The connection to MongoDB \"${connectionName}\" was not found`)\n }\n\n const schema = getSchema(options)\n\n let resolveCollectionPromise: (MongoClient) => void\n const collectionPromise = new Promise<MongoClient>(resolve => {\n resolveCollectionPromise = resolve\n })\n\n const baseCollection: Partial<Collection<any>> = {\n name: options.name,\n connectionName,\n schema,\n indexes: options.indexes || [],\n client: orionConnection,\n connectionPromise: collectionPromise,\n startConnection: () => orionConnection.startConnection(),\n generateId: getIdGenerator(options),\n getRawCollection: async () => {\n await orionConnection.startConnection()\n return orionConnection.db.collection(options.name)\n },\n getSchema: () => schema,\n }\n\n const encryptedCollection: Partial<Collection<any>> = {\n ...baseCollection,\n getRawCollection: async () => {\n await orionConnection.startConnection()\n return orionConnection.encrypted.db.collection(options.name)\n },\n }\n\n const mainCollection: Partial<Collection<any>> = {\n ...baseCollection,\n encrypted: encryptedCollection as BaseCollection<ModelClassBase>,\n }\n\n const defineCollectionProperties = () => {\n if (orionConnection.db) {\n mainCollection.db = orionConnection.db\n mainCollection.rawCollection = orionConnection.db.collection(options.name)\n }\n\n if (orionConnection.encrypted.db) {\n encryptedCollection.db = orionConnection.encrypted.db\n encryptedCollection.rawCollection = orionConnection.encrypted.db.collection(options.name)\n }\n }\n\n defineCollectionProperties()\n\n orionConnection.connectionPromise.then(() => {\n defineCollectionProperties()\n resolveCollectionPromise(orionConnection.client)\n })\n\n const collections = [mainCollection, encryptedCollection]\n\n for (const collection of collections) {\n // modified orion methods\n collection.findOne = findOne(collection)\n collection.find = find(collection)\n collection.findOneAndUpdate = findOneAndUpdate(collection)\n collection.insertOne = insertOne(collection)\n collection.insertMany = insertMany(collection)\n collection.insertAndFind = insertAndFind(collection)\n collection.updateOne = updateOne(collection)\n collection.updateMany = updateMany(collection)\n collection.deleteMany = deleteMany(collection)\n collection.deleteOne = deleteOne(collection)\n collection.upsert = upsert(collection)\n\n // counts\n collection.estimatedDocumentCount = estimatedDocumentCount(collection)\n collection.countDocuments = countDocuments(collection)\n\n // update and find\n collection.updateAndFind = updateAndFind(collection)\n collection.updateItem = updateItem(collection)\n\n // plain passed methods\n collection.aggregate = (pipeline, options) =>\n collection.rawCollection.aggregate(pipeline, options)\n collection.watch = (pipeline, options) => collection.rawCollection.watch(pipeline, options)\n\n // data loader\n collection.loadData = loadData(collection)\n collection.loadById = loadById(collection)\n collection.loadOne = loadOne(collection)\n collection.loadMany = loadMany(collection)\n collection.createIndexes = async () => []\n }\n\n const createIndexes = async () => {\n await orionConnection.startConnection()\n const createIndexPromise = loadIndexes(mainCollection)\n createIndexesPromises.push(createIndexPromise)\n mainCollection.createIndexesPromise = createIndexPromise\n return createIndexPromise\n }\n\n mainCollection.createIndexes = createIndexes\n mainCollection.deleteUnusedIndexes = async () => {\n await orionConnection.startConnection()\n return deleteUnusedIndexes(mainCollection)\n }\n\n if (!process.env.DONT_CREATE_INDEXES_AUTOMATICALLY) {\n createIndexes()\n }\n\n wrapMethods(mainCollection as any)\n wrapMethods(encryptedCollection as any)\n\n // Register collection for deleteAllUnusedIndexes() support\n registerCollection(connectionName, mainCollection as Collection<ModelClassBase>)\n\n return mainCollection as Collection<ModelClassBase>\n}\n","import {logger} from '@orion-js/logger'\nimport {AWSEncryptionKeyOptions, ClientEncryption, KMSProviders, MongoClient, UUID} from 'mongodb'\nimport {getMongoURLFromEnv} from '../connect/getMongoURLFromEnv'\n\nexport async function getOrCreateEncryptionKey({\n keyAltName,\n kmsProvider,\n masterKey,\n connectionName = 'main',\n keyVaultDatabase = 'encryption',\n keyVaultCollection = '__keyVault',\n kmsProviders,\n}: {\n keyAltName: string\n kmsProvider: keyof KMSProviders\n masterKey?: AWSEncryptionKeyOptions\n connectionName?: string\n keyVaultDatabase?: string\n keyVaultCollection?: string\n kmsProviders: KMSProviders\n}): Promise<{key: UUID; keyVaultNamespace: string}> {\n const keyVaultNamespace = `${keyVaultDatabase}.${keyVaultCollection}`\n\n logger.info('Connecting to database to get or create the encryption key', {\n keyVaultNamespace,\n keyAltName,\n })\n const client = new MongoClient(getMongoURLFromEnv(connectionName))\n await client.connect()\n const db = client.db(keyVaultDatabase)\n const collection = db.collection(keyVaultCollection)\n await collection.createIndex(\n {keyAltName: 1},\n {unique: true, partialFilterExpression: {keyAltName: {$exists: true}}},\n )\n const clientEncryption = new ClientEncryption(client, {\n keyVaultNamespace,\n kmsProviders,\n })\n\n const key = await clientEncryption.getKeyByAltName(keyAltName)\n if (key) {\n logger.info('Key found on the key vault', {\n keyVaultNamespace,\n keyAltName,\n UUID: key._id,\n })\n return {key: key._id, keyVaultNamespace}\n }\n\n logger.info('Key not found on the key vault, creating a new one', {\n keyVaultNamespace,\n keyAltName,\n })\n\n const newKey = await clientEncryption.createDataKey(kmsProvider, {\n keyAltNames: [keyAltName],\n ...(masterKey ? {masterKey} : {}),\n })\n\n logger.info('New encryption key created', {\n keyVaultNamespace,\n keyAltName,\n UUID: newKey,\n })\n\n return {key: newKey, keyVaultNamespace}\n}\n\nexport const ENCRYPTION_ALGORITHMS = {\n DETERMINISTIC: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic',\n RANDOM: 'AEAD_AES_256_CBC_HMAC_SHA_512-Random',\n}\n"],"mappings":"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","names":["value","import_helpers","import_schema","import_dot_object","Dot","dot","import_schema","import_schema","import_schema","import_schema","import_schema","shouldCheck","import_schema","import_schema","import_helpers","import_schema","import_schema","import_helpers","DataLoader","import_helpers","import_helpers","import_mongodb","import_logger","import_logger","indexName","import_logger","import_helpers","import_logger","methodName","options","import_logger","import_mongodb"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/connect/connections.ts","../src/connect/getDBName.ts","../src/connect/getMongoURLFromEnv.ts","../src/connect/getMongoConnection.ts","../src/types/index.ts","../src/service/index.ts","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/_internals/isArray.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/_internals/isInteger.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/_internals/createPath.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/equals.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isType.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/_internals/compare.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/_internals/includes.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/omit.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/flatten.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isEmpty.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isNil.js","../src/createCollection/getMethods/getSelector.ts","../src/createCollection/getMethods/find.ts","../src/createCollection/getMethods/findOne.ts","../src/createCollection/getMethods/validateModifier/validatePush.ts","../src/helpers/fromDot.ts","../src/helpers/toDot.ts","../src/createCollection/getMethods/validateModifier/validateUnset.ts","../src/createCollection/getMethods/validateModifier/validateInc.ts","../src/createCollection/getMethods/validateModifier/validateSet.ts","../src/createCollection/getMethods/validateModifier/validateOperator.ts","../src/createCollection/getMethods/validateModifier/index.ts","../src/createCollection/getMethods/validateModifier/validateUpsert.ts","../src/createCollection/getMethods/cleanModifier.ts","../src/createCollection/getMethods/wrapErrors.ts","../src/createCollection/getMethods/upsert.ts","../src/createCollection/getMethods/findOneAndUpdate.ts","../src/createCollection/getMethods/updateOne.ts","../src/createCollection/getMethods/updateMany.ts","../src/createCollection/getMethods/updateAndFind.ts","../src/createCollection/getMethods/deleteOne.ts","../src/createCollection/getMethods/deleteMany.ts","../src/createCollection/getMethods/insertOne.ts","../src/createCollection/getMethods/insertMany.ts","../src/createCollection/getMethods/updateItem.ts","../src/createCollection/getMethods/countDocuments.ts","../src/createCollection/getMethods/estimatedDocumentCount.ts","../src/createCollection/getMethods/insertAndFind.ts","../src/createCollection/getMethods/dataLoader/loadById.ts","../src/createCollection/getMethods/dataLoader/loadMany.ts","../src/createCollection/getMethods/dataLoader/loadOne.ts","../src/createCollection/getMethods/dataLoader/loadData.ts","../src/createCollection/getMethods/dataLoader/dataLoad/getDataLoader.ts","../src/createCollection/getMethods/dataLoader/dataLoad/index.ts","../src/createCollection/generateId.ts","../src/createCollection/createIndexes.ts","../src/createCollection/deleteUnusedIndexes.ts","../src/createCollection/getIndexOptions.ts","../src/createCollection/collectionsRegistry.ts","../src/createCollection/getSchemaAndModel.ts","../src/createCollection/wrapMethods.ts","../src/createCollection/index.ts","../src/encrypted/getOrCreateEncryptionKey.ts"],"sourcesContent":["export * from './connect'\nexport * from './types'\nexport * from './service'\nexport * from './createCollection'\nexport * from './createCollection/collectionsRegistry'\nexport * from './encrypted/getOrCreateEncryptionKey'\n","import {EventEmitter} from 'node:events'\nimport {MongoClient, Db, MongoClientOptions} from 'mongodb'\nimport getDBName from './getDBName'\nimport {nextTick} from 'node:process'\nimport {logger} from '@orion-js/logger'\nimport {sleep} from '@orion-js/helpers'\nimport {getMongoURLFromEnv} from './getMongoURLFromEnv'\n\nexport interface OrionMongoClient {\n client: MongoClient\n db: Db\n uri: string\n dbName: string\n /**\n * @deprecated Use startConnection() instead. This property is not guaranteed to be resolved if the connection is not started.\n * When using async calls startConnection or connectionPromise is no longer needed. Orion will automatically start the connection if it is not already started.\n * Kept for backwards compatibility. startConnection does not re-start the connection if it is already started, so it is safe to use.\n */\n connectionPromise: Promise<MongoClient>\n connectionName: string\n encrypted: {client: MongoClient; db: Db}\n /**\n * Starts the connection if it is not already started.\n * If the connection is already started, it resolves immediately.\n */\n startConnection: () => Promise<MongoClient>\n closeConnection: () => Promise<void>\n}\n\n// globalThis.myModuleMap ??= {}\nexport const connectionWrappers: {[key: string]: OrionMongoDatabaseWrapper} = {} //globalThis.myModuleMap\n\nclass OrionMongoDatabaseWrapper implements OrionMongoClient {\n uri: string\n dbName: string\n connectionName: string\n connectionPromise: Promise<MongoClient>\n private mongoOptions: MongoClientOptions\n private connectionEvent: EventEmitter = new EventEmitter()\n private state: 'disconnected' | 'connecting' | 'connected' | 'disconnecting' = 'disconnected'\n client: MongoClient\n db: Db\n configured = false\n readonly encrypted: {client: MongoClient; db: Db} = {client: null, db: null}\n readonly configTimeout: NodeJS.Timeout\n\n constructor(connectionName: string) {\n this.connectionName = connectionName\n logger.info('New connection requested', {\n connectionName,\n })\n\n this.connectionEvent.setMaxListeners(Number.POSITIVE_INFINITY)\n this.connectionPromise = new Promise((resolve, reject) => {\n if (this.state === 'connected') {\n resolve(this.client)\n }\n this.connectionEvent.once('connected', resolve)\n this.connectionEvent.once('error', reject)\n })\n this.configTimeout = setTimeout(() => {\n logger.error(\n 'Connection was required but never configured, call configureConnection() or unset the env variable MONGO_EXPLICIT_SETUP',\n {\n connectionName,\n },\n )\n this.connectionEvent.emit('error', new Error('Connection was required but never configured'))\n }, 30 * 1000)\n }\n\n config(mongoURL: string, mongoOptions: MongoClientOptions) {\n this.uri = mongoURL\n this.mongoOptions = mongoOptions\n this.configured = true\n if (this.mongoOptions?.autoEncryption) {\n this.encrypted.client = new MongoClient(mongoURL, {\n retryReads: true,\n ...this.mongoOptions,\n })\n this.encrypted.db = this.encrypted.client.db(getDBName(this.uri))\n }\n this.client = new MongoClient(mongoURL, {\n retryReads: true,\n ...this.mongoOptions,\n autoEncryption: null,\n })\n this.db = this.client.db(getDBName(this.uri))\n clearTimeout(this.configTimeout)\n }\n\n async awaitConnection() {\n if (this.state === 'connected') return this\n if (this.state === 'connecting' || !this.configured) {\n // Wait for the connection to be configured and established\n await this.connectionPromise\n return this\n }\n this.state = 'connecting'\n const censoredURI = this.uri.replace(/\\/\\/.*:.*@/, '//') // remove user and password from URL\n logger.info('Connecting to mongo', {\n uri: censoredURI,\n connectionName: this.connectionName,\n })\n if (this.encrypted.client) {\n await this.connectWithRetry(this.encrypted.client)\n logger.info('Successfully connected to encrypted mongo', {\n uri: censoredURI,\n connectionName: this.connectionName,\n })\n }\n await this.connectWithRetry(this.client)\n this.state = 'connected'\n this.connectionEvent.emit('connected', this.client)\n logger.info('Successfully connected to mongo', {\n uri: censoredURI,\n connectionName: this.connectionName,\n })\n nextTick(() => {\n this.connectionEvent.removeAllListeners()\n this.connectionEvent = null\n })\n return this\n }\n\n async connectWithRetry(client: MongoClient) {\n try {\n return await client.connect()\n } catch (error) {\n logger.error('Error connecting to mongo. Will retry in 5s', {\n error,\n connectionName: this.connectionName,\n })\n await sleep(5000)\n return this.connectWithRetry(client)\n }\n }\n\n async startConnection() {\n return this.awaitConnection().then(() => this.client)\n }\n\n async closeConnection() {\n if (this.state === 'disconnected' || this.state === 'disconnecting') return\n this.state = 'disconnecting'\n await this.client?.close()\n await this.encrypted?.client?.close()\n this.state = 'disconnected'\n }\n}\n\nexport function configureConnection(connectionName: string, mongoOptions: MongoClientOptions) {\n connectionWrappers[connectionName] =\n connectionWrappers[connectionName] || new OrionMongoDatabaseWrapper(connectionName)\n const connectionWrapper = connectionWrappers[connectionName]\n if (connectionWrapper.configured) {\n throw new Error('Connection already configured')\n }\n connectionWrapper.config(getMongoURLFromEnv(connectionName), mongoOptions)\n return connectionWrapper.awaitConnection()\n}\n\nexport function getExistingConnection(connectionName: string) {\n connectionWrappers[connectionName] =\n connectionWrappers[connectionName] || new OrionMongoDatabaseWrapper(connectionName)\n\n return connectionWrappers[connectionName]\n}\n\nexport const connections = connectionWrappers\n","export default function getDBName(url: string): string {\n let dbName = 'admin'\n let connectionPart = ''\n\n const startConnectionPart = url.indexOf('//') + 2\n\n if (url.indexOf('?') !== -1) {\n connectionPart = url.substring(startConnectionPart, url.indexOf('?'))\n } else {\n connectionPart = url.substring(startConnectionPart)\n }\n\n if (connectionPart.indexOf('.sock') !== -1) {\n if (connectionPart.indexOf('.sock/') !== -1) {\n dbName = connectionPart.split('.sock/')[1]\n }\n } else if (connectionPart.indexOf('/') !== -1) {\n dbName = connectionPart.split('/')[1]\n }\n\n return dbName\n}\n","import {internalGetEnv} from '@orion-js/env'\n\nexport const getMongoURLFromEnv = (connectionName: string): string => {\n if (connectionName === 'main') {\n if (!internalGetEnv('mongo_url', 'MONGO_URL')) {\n throw new Error('MONGO_URL is required')\n }\n return internalGetEnv('mongo_url', 'MONGO_URL')\n }\n\n const envName = `mongo_url_${connectionName.toLowerCase()}`\n const processEnvName = `MONGO_URL_${connectionName.toUpperCase()}`\n const uri = internalGetEnv(envName, processEnvName)\n if (!uri) {\n throw new Error(\n `To use the connection \"${connectionName}\" you must initialize it first calling getMongoConnection({name: \"${connectionName}\", uri: \"MONGOURI\"}) or setting the environment variable ${processEnvName}.`,\n )\n }\n\n return uri\n}\n\nexport const requiresExplicitSetup = (connectionName: string): boolean => {\n if (connectionName === 'main') {\n const value = internalGetEnv('mongo_explicit_setup', 'MONGO_EXPLICIT_SETUP')\n return typeof value === 'boolean' ? value : value === 'true'\n }\n\n const envName = `mongo_explicit_setup_${connectionName.toLowerCase()}`\n const processEnvName = `MONGO_EXPLICIT_SETUP_${connectionName.toUpperCase()}`\n const value = internalGetEnv(envName, processEnvName)\n return typeof value === 'boolean' ? value : value === 'true'\n}\n","import {getExistingConnection} from './connections'\nimport type {OrionMongoClient} from './connections'\nimport {getMongoURLFromEnv, requiresExplicitSetup} from './getMongoURLFromEnv'\nexport const allConnectionPromises = []\n\ninterface MongoConnectOptions {\n name: string\n uri?: string\n}\n\nexport const getMongoConnection = ({name, uri}: MongoConnectOptions): OrionMongoClient => {\n uri = uri || getMongoURLFromEnv(name)\n const connection = getExistingConnection(name)\n\n if (!connection.configured && !requiresExplicitSetup(name)) {\n connection.config(uri, {})\n }\n allConnectionPromises.push(connection.connectionPromise)\n return connection\n}\n","import * as MongoDB from 'mongodb'\nimport {\n FieldType,\n fieldTypes,\n InferSchemaType,\n Schema,\n SchemaInAnyOrionForm,\n StrictInferSchemaType,\n TypedSchemaOnSchema,\n} from '@orion-js/schema'\nimport {OrionMongoClient} from '../connect/connections'\nimport {EnhancedOmit} from 'mongodb'\nimport {generateUUIDWithPrefix} from '@orion-js/helpers'\n\nexport {MongoDB}\n\nexport type OptionalId<T> = MongoDB.OptionalId<T>\n\nexport declare type InferIdType<TSchema> = TSchema extends {\n _id: infer IdType\n}\n ? Record<any, never> extends IdType\n ? never\n : IdType\n : TSchema extends {\n _id?: infer IdType\n }\n ? unknown extends IdType\n ? string\n : IdType\n : string\n\nexport type DocumentWithId<TSchema> = EnhancedOmit<TSchema, '_id'> & {\n _id: InferIdType<TSchema>\n}\n\nexport type ModelClassBase = DocumentWithId<MongoDB.Document>\n\n/**\n * Index definition for a MongoDB collection.\n * Supports flat options (recommended) or nested options object (deprecated).\n *\n * @example New format (recommended):\n * ```ts\n * { keys: { email: 1 }, unique: true, sparse: true }\n * ```\n *\n * @example Old format (deprecated):\n * ```ts\n * { keys: { email: 1 }, options: { unique: true, sparse: true } }\n * ```\n */\nexport interface CollectionIndex extends Partial<MongoDB.CreateIndexesOptions> {\n keys: MongoDB.IndexSpecification\n /**\n * @deprecated Use flat options instead. Example: `{ keys: { email: 1 }, unique: true }`\n * instead of `{ keys: { email: 1 }, options: { unique: true } }`\n */\n options?: MongoDB.CreateIndexesOptions\n}\n\nexport namespace DataLoader {\n interface LoadDataOptionsBase<ModelClass extends ModelClassBase> {\n key: keyof ModelClass\n match?: MongoFilter<ModelClass>\n sort?: MongoDB.Sort\n project?: MongoDB.Document\n timeout?: number\n debug?: boolean\n }\n\n export interface LoadDataOptions<ModelClass extends ModelClassBase>\n extends LoadDataOptionsBase<ModelClass> {\n value?: any\n values?: Array<any>\n }\n\n export interface LoadOneOptions<ModelClass extends ModelClassBase>\n extends LoadDataOptionsBase<ModelClass> {\n value: any\n }\n\n export type LoadData<ModelClass extends ModelClassBase> = (\n options: LoadDataOptions<ModelClass>,\n ) => Promise<Array<ModelClass>>\n export type LoadOne<ModelClass extends ModelClassBase> = (\n options: LoadOneOptions<ModelClass>,\n ) => Promise<ModelClass>\n export type LoadMany<ModelClass extends ModelClassBase> = (\n options: LoadDataOptions<ModelClass>,\n ) => Promise<Array<ModelClass>>\n export type LoadById<ModelClass extends ModelClassBase> = (\n id: ModelClass['_id'],\n ) => Promise<ModelClass>\n}\n\nexport type MongoFilter<ModelClass extends ModelClassBase = ModelClassBase> =\n MongoDB.Filter<ModelClass>\n\nexport type MongoSelector<ModelClass extends ModelClassBase = ModelClassBase> =\n | ModelClass['_id']\n | MongoFilter<ModelClass>\n\nexport interface FindCursor<ModelClass> extends MongoDB.FindCursor {\n toArray: () => Promise<Array<ModelClass>>\n}\n\nexport interface UpdateOptions {\n clean?: boolean\n validate?: boolean\n mongoOptions?: MongoDB.UpdateOptions\n}\n\nexport interface FindOneAndUpdateUpdateOptions {\n clean?: boolean\n validate?: boolean\n mongoOptions?: MongoDB.FindOneAndUpdateOptions\n}\n\nexport interface InsertOptions {\n clean?: boolean\n validate?: boolean\n mongoOptions?: MongoDB.InsertOneOptions\n}\n\nexport interface InsertManyOptions {\n clean?: boolean\n validate?: boolean\n mongoOptions?: MongoDB.BulkWriteOptions\n}\n\nexport type InitItem<ModelClass extends ModelClassBase> = (doc: any) => ModelClass\n\nexport type ModelToMongoSelector<ModelClass extends ModelClassBase> =\n | MongoDB.Filter<ModelClass>\n | DocumentWithId<ModelClass>['_id']\n\nexport type FindOne<ModelClass extends ModelClassBase> = (\n selector?: ModelToMongoSelector<ModelClass>,\n options?: MongoDB.FindOptions<ModelClass>,\n) => Promise<ModelClass>\n\nexport type Find<ModelClass extends ModelClassBase> = (\n selector?: ModelToMongoSelector<ModelClass>,\n options?: MongoDB.FindOptions<ModelClass>,\n) => FindCursor<ModelClass>\n\nexport type FindOneAndUpdate<ModelClass extends ModelClassBase> = <\n TSelector extends ModelToMongoSelector<ModelClass>,\n TFilter extends MongoDB.UpdateFilter<ModelClass>,\n TOptions extends FindOneAndUpdateUpdateOptions,\n>(\n selector: TSelector,\n modifier: TFilter,\n options?: TOptions,\n) => ReturnType<MongoDB.Collection<ModelClass>['findOneAndUpdate']>\n\nexport type UpdateAndFind<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n modifier: MongoDB.UpdateFilter<ModelClass>,\n options?: FindOneAndUpdateUpdateOptions,\n) => Promise<ModelClass>\n\nexport type UpdateItem<ModelClass extends ModelClassBase> = (\n item: ModelClass,\n modifier: MongoDB.UpdateFilter<ModelClass>,\n options?: FindOneAndUpdateUpdateOptions,\n) => Promise<void>\n\nexport type InsertOne<ModelClass extends ModelClassBase> = (\n doc: MongoDB.OptionalId<ModelClass>,\n options?: InsertOptions,\n) => Promise<ModelClass['_id']>\n\nexport type InsertMany<ModelClass extends ModelClassBase> = (\n doc: Array<MongoDB.OptionalId<ModelClass>>,\n options?: InsertManyOptions,\n) => Promise<Array<ModelClass['_id']>>\n\nexport type InsertAndFind<ModelClass extends ModelClassBase> = (\n doc: MongoDB.OptionalId<ModelClass>,\n options?: InsertOptions,\n) => Promise<ModelClass>\n\nexport type DeleteMany<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n options?: MongoDB.DeleteOptions,\n) => Promise<MongoDB.DeleteResult>\n\nexport type DeleteOne<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n options?: MongoDB.DeleteOptions,\n) => Promise<MongoDB.DeleteResult>\n\nexport type UpdateOne<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n modifier: MongoDB.UpdateFilter<ModelClass>,\n options?: UpdateOptions,\n) => Promise<MongoDB.UpdateResult>\n\nexport type UpdateMany<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n modifier: MongoDB.UpdateFilter<ModelClass>,\n options?: UpdateOptions,\n) => Promise<MongoDB.UpdateResult | MongoDB.Document>\n\nexport type Upsert<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n modifier: MongoDB.UpdateFilter<ModelClass>,\n options?: UpdateOptions,\n) => Promise<MongoDB.UpdateResult>\n\nexport interface CreateCollectionOptions<ModelClass extends ModelClassBase = ModelClassBase> {\n /**\n * The name of the collection on the Mongo Database\n */\n name: string\n /**\n * The name of the connection to use. The Mongo URL of this connection will be search on env variables.\n * If not found, the connection url will be `env.mongo_url`\n * If defined, the connection url will be `env.mongo_url_${name}`\n */\n connectionName?: string\n /**\n * The schema used for cleaning and validation of the documents\n */\n schema?: SchemaInAnyOrionForm\n /**\n * The indexes to use\n */\n indexes?: Array<CollectionIndex>\n /**\n * Select between random id generation o mongo (time based) id generation\n */\n idGeneration?: 'mongo' | 'random' | 'uuid'\n /**\n * ID prefix. idGeneration will be forced to random. Recommended for type checking\n */\n idPrefix?: ModelClass['_id']\n}\n\nexport type EstimatedDocumentCount<_ModelClass extends ModelClassBase> = (\n options?: MongoDB.EstimatedDocumentCountOptions,\n) => Promise<number>\n\nexport type CountDocuments<ModelClass extends ModelClassBase> = (\n selector: ModelToMongoSelector<ModelClass>,\n options?: MongoDB.CountDocumentsOptions,\n) => Promise<number>\n\nexport type SchemaWithRequiredId = Schema & {_id: {type: any}}\n\nexport type InferSchemaTypeWithId<TSchema extends SchemaWithRequiredId> = DocumentWithId<\n StrictInferSchemaType<TSchema>\n>\n\nexport type CreateCollectionOptionsWithSchemaType<T extends SchemaWithRequiredId> = {\n schema: T\n} & Omit<CreateCollectionOptions<InferSchemaTypeWithId<T>>, 'schema'>\n\nexport type CreateCollectionOptionsWithTypedSchema<\n T extends TypedSchemaOnSchema & {prototype: {_id: string}},\n> = {\n schema: T\n} & Omit<CreateCollectionOptions<InferSchemaType<T>>, 'schema'>\n\nexport class BaseCollection<ModelClass extends ModelClassBase = ModelClassBase> {\n name: string\n connectionName?: string\n schema?: Schema\n generateId: () => ModelClass['_id']\n getSchema: () => Schema\n\n db: MongoDB.Db\n client: OrionMongoClient\n /**\n * @deprecated Use getRawCollection() instead. This property is not guaranteed to be defined if the connection has not been started.\n */\n rawCollection: MongoDB.Collection<ModelClass>\n getRawCollection: () => Promise<MongoDB.Collection<ModelClass>>\n\n findOne: FindOne<ModelClass>\n find: Find<ModelClass>\n\n insertOne: InsertOne<ModelClass>\n insertMany: InsertMany<ModelClass>\n insertAndFind: InsertAndFind<ModelClass>\n\n deleteMany: DeleteMany<ModelClass>\n deleteOne: DeleteOne<ModelClass>\n\n updateOne: UpdateOne<ModelClass>\n updateMany: UpdateMany<ModelClass>\n\n upsert: Upsert<ModelClass>\n findOneAndUpdate: FindOneAndUpdate<ModelClass>\n\n /**\n * Updates a document and returns the updated document with the changes\n */\n updateAndFind: UpdateAndFind<ModelClass>\n updateItem: UpdateItem<ModelClass>\n\n estimatedDocumentCount: EstimatedDocumentCount<ModelClass>\n countDocuments: CountDocuments<ModelClass>\n\n aggregate: <T = MongoDB.Document>(\n pipeline?: MongoDB.Document[],\n options?: MongoDB.AggregateOptions,\n ) => MongoDB.AggregationCursor<T>\n watch: <T = MongoDB.Document>(\n pipeline?: MongoDB.Document[],\n options?: MongoDB.ChangeStreamOptions,\n ) => MongoDB.ChangeStream<T>\n\n loadData: DataLoader.LoadData<ModelClass>\n loadOne: DataLoader.LoadOne<ModelClass>\n loadMany: DataLoader.LoadMany<ModelClass>\n loadById: DataLoader.LoadById<ModelClass>\n\n /**\n * Use this function if you are using tests and you pass the\n * env var DONT_CREATE_INDEXES_AUTOMATICALLY and you need to\n * create the indexes for this collection\n */\n createIndexes: () => Promise<string[]>\n createIndexesPromise: Promise<string[]>\n /**\n * Deletes indexes that exist in MongoDB but are not defined in the collection configuration.\n * This helps clean up stale indexes that are no longer needed.\n * Always preserves the _id_ index.\n */\n deleteUnusedIndexes: () => Promise<{deletedIndexes: string[]; collectionName: string}>\n /**\n * @deprecated Use startConnection() instead. This property is not guaranteed to be resolved if the connection is not started.\n * When using async calls startConnection or connectionPromise is no longer needed. Orion will automatically start the connection if it is not already started.\n * Kept for backwards compatibility. startConnection does not re-start the connection if it is already started, so it is safe to use.\n */\n connectionPromise: Promise<MongoDB.MongoClient>\n startConnection: () => Promise<MongoDB.MongoClient>\n}\n\nexport class Collection<\n ModelClass extends ModelClassBase = ModelClassBase,\n> extends BaseCollection<ModelClass> {\n indexes: Array<CollectionIndex>\n encrypted?: BaseCollection<ModelClass>\n}\n\nexport type DistinctDocumentId<DistinctId extends string> = string & {\n __TYPE__: `DistinctDocumentId<${DistinctId}>`\n}\n\nexport type TypedId<TPrefix extends string> = `${TPrefix}-${string}`\n\n/**\n * Use this function to create unique types for the ids of mongodb documents.\n * You should set it as the type of the _id field in your schema.\n *\n * @example\n * ```ts\n * type UserId = TypedId<'user'>\n *\n * const userSchema = {\n * _id: {\n * type: TypedId('user'),\n * },\n * }\n *\n * ```\n */\nexport function typedId<const TPrefix extends string>(\n prefix: TPrefix,\n): FieldType<TypedId<TPrefix>> & {generateId: () => TypedId<TPrefix>} {\n return {\n ...fieldTypes.string,\n name: `typedId:${prefix}`,\n toSerializedType: async () => 'string',\n generateId: () => generateUUIDWithPrefix(prefix),\n } as any\n}\n","import {Service} from '@orion-js/services'\nimport {createCollection} from '../createCollection'\nimport {CreateCollectionOptions, ModelClassBase} from '../types'\n\n// Define metadata storage using WeakMaps\nconst serviceMetadata = new WeakMap<any, {_serviceType: string}>()\n\nexport function Repository() {\n return (target: any, context: ClassDecoratorContext<any>) => {\n Service()(target, context)\n\n context.addInitializer(function (this) {\n serviceMetadata.set(this, {_serviceType: 'repo'})\n })\n }\n}\n\nexport function MongoCollection<ModelClass extends ModelClassBase = ModelClassBase>(\n options: CreateCollectionOptions<ModelClass>,\n) {\n return (_target: any, context: ClassFieldDecoratorContext) => {\n const propertyKey = String(context.name)\n context.addInitializer(function (this) {\n const repo = serviceMetadata.get(this.constructor)\n if (!repo || repo._serviceType !== 'repo') {\n throw new Error(\n 'You must pass a class decorated with @Repository if you want to use @MongoCollection',\n )\n }\n\n const collection = createCollection(options)\n this[propertyKey] = collection\n })\n }\n}\n","export function type(input){\n if (input === null){\n return 'Null'\n } else if (input === undefined){\n return 'Undefined'\n } else if (Number.isNaN(input)){\n return 'NaN'\n }\n const typeResult = Object.prototype.toString.call(input).slice(8, -1)\n\n return typeResult === 'AsyncFunction' ? 'Promise' : typeResult\n}\n","export const { isArray } = Array\n","function _isInteger(n){\n return n << 0 === n\n}\n\nexport const isInteger = Number.isInteger || _isInteger\n\n/**\n * Check if `index` is integer even if it is a string.\n */\nexport const isIndexInteger = index => Number.isInteger(Number(index))\n","import { isInteger } from './isInteger.js'\n\nexport function createPath(path, delimiter = '.'){\n return typeof path === 'string' ?\n path.split(delimiter).map(x => isInteger(x) ? Number(x) : x) :\n path\n}\n","import { isArray } from './_internals/isArray.js'\nimport { type } from './type.js'\n\nexport function _lastIndexOf(valueToFind, list){\n if (!isArray(list))\n throw new Error(`Cannot read property 'indexOf' of ${ list }`)\n\n const typeOfValue = type(valueToFind)\n if (![ 'Array', 'NaN', 'Object', 'RegExp' ].includes(typeOfValue))\n return list.lastIndexOf(valueToFind)\n\n const { length } = list\n let index = length\n let foundIndex = -1\n\n while (--index > -1 && foundIndex === -1)\n if (equals(list[ index ], valueToFind))\n foundIndex = index\n\n return foundIndex\n}\n\nexport function _indexOf(valueToFind, list){\n if (!isArray(list))\n throw new Error(`Cannot read property 'indexOf' of ${ list }`)\n\n const typeOfValue = type(valueToFind)\n if (![ 'Array', 'NaN', 'Object', 'RegExp' ].includes(typeOfValue))\n return list.indexOf(valueToFind)\n\n let index = -1\n let foundIndex = -1\n const { length } = list\n\n while (++index < length && foundIndex === -1)\n if (equals(list[ index ], valueToFind))\n foundIndex = index\n\n return foundIndex\n}\n\nfunction _arrayFromIterator(iter){\n const list = []\n let next\n while (!(next = iter.next()).done)\n list.push(next.value)\n\n return list\n}\n\nfunction _compareSets(a, b){\n if (a.size !== b.size)\n return false\n\n const aList = _arrayFromIterator(a.values())\n const bList = _arrayFromIterator(b.values())\n\n const filtered = aList.filter(aInstance => _indexOf(aInstance, bList) === -1)\n\n return filtered.length === 0\n}\n\nfunction compareErrors(a, b){\n if (a.message !== b.message) return false\n if (a.toString !== b.toString) return false\n\n return a.toString() === b.toString()\n}\n\nfunction parseDate(maybeDate){\n if (!maybeDate.toDateString) return [ false ]\n\n return [ true, maybeDate.getTime() ]\n}\n\nfunction parseRegex(maybeRegex){\n if (maybeRegex.constructor !== RegExp) return [ false ]\n\n return [ true, maybeRegex.toString() ]\n}\n\nexport function equals(a, b){\n if (arguments.length === 1) return _b => equals(a, _b)\n\n if (Object.is(a, b)) return true\n\n const aType = type(a)\n\n if (aType !== type(b)) return false\n if (aType === 'Function')\n return a.name === undefined ? false : a.name === b.name\n\n if ([ 'NaN', 'Null', 'Undefined' ].includes(aType)) return true\n\n if ([ 'BigInt', 'Number' ].includes(aType)){\n if (Object.is(-0, a) !== Object.is(-0, b)) return false\n\n return a.toString() === b.toString()\n }\n\n if ([ 'Boolean', 'String' ].includes(aType))\n return a.toString() === b.toString()\n\n if (aType === 'Array'){\n const aClone = Array.from(a)\n const bClone = Array.from(b)\n\n if (aClone.toString() !== bClone.toString())\n return false\n\n let loopArrayFlag = true\n aClone.forEach((aCloneInstance, aCloneIndex) => {\n if (loopArrayFlag)\n if (\n aCloneInstance !== bClone[ aCloneIndex ] &&\n !equals(aCloneInstance, bClone[ aCloneIndex ])\n )\n loopArrayFlag = false\n\n })\n\n return loopArrayFlag\n }\n\n const aRegex = parseRegex(a)\n const bRegex = parseRegex(b)\n\n if (aRegex[ 0 ])\n return bRegex[ 0 ] ? aRegex[ 1 ] === bRegex[ 1 ] : false\n else if (bRegex[ 0 ]) return false\n\n const aDate = parseDate(a)\n const bDate = parseDate(b)\n\n if (aDate[ 0 ])\n return bDate[ 0 ] ? aDate[ 1 ] === bDate[ 1 ] : false\n else if (bDate[ 0 ]) return false\n\n if (a instanceof Error){\n if (!(b instanceof Error)) return false\n\n return compareErrors(a, b)\n }\n\n if (aType === 'Set')\n return _compareSets(a, b)\n\n if (aType === 'Object'){\n const aKeys = Object.keys(a)\n\n if (aKeys.length !== Object.keys(b).length)\n return false\n\n let loopObjectFlag = true\n aKeys.forEach(aKeyInstance => {\n if (loopObjectFlag){\n const aValue = a[ aKeyInstance ]\n const bValue = b[ aKeyInstance ]\n\n if (aValue !== bValue && !equals(aValue, bValue))\n loopObjectFlag = false\n\n }\n })\n\n return loopObjectFlag\n }\n\n return false\n}\n","import { type } from './type.js'\n\nexport function isType(xType, x){\n if (arguments.length === 1){\n return xHolder => isType(xType, xHolder)\n }\n\n return type(x) === xType\n}\n","export function compare(a, b){\n return String(a) === String(b)\n}\n","import { compare } from './compare.js'\n\nexport function includes(a, list){\n let index = -1\n const { length } = list\n\n while (++index < length)\n if (compare(list[ index ], a))\n return true\n\n return false\n}\n","import { createPath } from './_internals/createPath.js'\nimport { includes } from './_internals/includes.js'\n\nexport function omit(propsToOmit, obj){\n if (arguments.length === 1) return _obj => omit(propsToOmit, _obj)\n\n if (obj === null || obj === undefined)\n return undefined\n\n const propsToOmitValue = createPath(propsToOmit, ',')\n const willReturn = {}\n\n for (const key in obj)\n if (!includes(key, propsToOmitValue))\n willReturn[ key ] = obj[ key ]\n\n return willReturn\n}\n","import { isArray } from './_internals/isArray.js'\n\nexport function flatten(list, input){\n const willReturn = input === undefined ? [] : input\n\n for (let i = 0; i < list.length; i++){\n if (isArray(list[ i ])){\n flatten(list[ i ], willReturn)\n } else {\n willReturn.push(list[ i ])\n }\n }\n\n return willReturn\n}\n","import { type } from './type.js'\n\nexport function isEmpty(input){\n const inputType = type(input)\n if ([ 'Undefined', 'NaN', 'Number', 'Null' ].includes(inputType))\n return false\n if (!input) return true\n\n if (inputType === 'Object'){\n return Object.keys(input).length === 0\n }\n\n if (inputType === 'Array'){\n return input.length === 0\n }\n\n return false\n}\n","export function isNil(x){\n return x === undefined || x === null\n}\n","import {type} from 'rambdax'\nimport {Filter} from 'mongodb'\nimport {ModelClassBase, ModelToMongoSelector} from '../../types'\n\nexport default function getSelector<ModelClass extends ModelClassBase>(\n args: IArguments | any[],\n): Filter<ModelClass> {\n if (args.length === 0) return {}\n\n const selector = args[0] as ModelToMongoSelector<ModelClass>\n\n if (typeof selector === 'string') {\n return {_id: selector} as Filter<ModelClass>\n }\n\n if (type(selector) === 'Object') {\n return selector as Filter<ModelClass>\n }\n\n return {\n _id: 'shouldReturnNull',\n } as Filter<ModelClass>\n}\n","import {Collection, Find, ModelClassBase} from '../../types'\nimport getSelector from './getSelector'\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const find: Find<DocumentType> = (...args: any[]) => {\n const selector = getSelector(args)\n const options = args[1]\n\n return collection.rawCollection.find(selector, options) as any\n }\n\n return find\n}\n","import getSelector from './getSelector'\nimport {Collection, FindOne, ModelClassBase} from '../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const findOne: FindOne<DocumentType> = async (...args: any[]) => {\n const options = args[1]\n await collection.connectionPromise\n const selector = getSelector<DocumentType>(args)\n const item = (await collection.rawCollection.findOne(selector, options)) as DocumentType\n\n if (!item) return item\n return item\n }\n\n return findOne\n}\n","import {validate} from '@orion-js/schema'\nimport fromDot from '../../../helpers/fromDot'\n\n/**\n * Validates $push and $addToSet\n */\nexport default async function ({schema, operationDoc, operation}) {\n for (const key of Object.keys(operationDoc)) {\n const value = operationDoc[key]\n let toValidate = null\n if (operation === '$push' || operation === '$addToSet') {\n if (typeof value === 'object' && '$each' in value) {\n toValidate = value.$each\n } else {\n toValidate = [value]\n }\n }\n const validationObject = fromDot({[key]: toValidate})\n await validate(schema, validationObject, {omitRequired: true})\n }\n}\n","import dot from 'dot-object'\nimport toDot from './toDot'\n\nexport default function fromDot(doc: any): any {\n doc = toDot(doc)\n return dot.object(doc)\n}\n","import Dot from 'dot-object'\n\nvar dot = new Dot('.', false, true, false)\n\nexport default function (doc) {\n return dot.dot(doc)\n}\n","import {validateKey, ValidationError} from '@orion-js/schema'\n\n/**\n * Validates $unset\n */\nexport default async function ({schema, operationDoc}) {\n const errors = {}\n for (const key of Object.keys(operationDoc)) {\n const error = await validateKey(schema, key, null)\n if (error) {\n errors[key] = error\n }\n }\n if (Object.keys(errors).length) {\n throw new ValidationError(errors)\n }\n}\n","import {validateKey, ValidationError} from '@orion-js/schema'\n\n/**\n * Validates $inc\n */\nexport default async function ({schema, operationDoc}) {\n const errors = {}\n for (const key of Object.keys(operationDoc)) {\n const value = operationDoc[key]\n const error = await validateKey(schema, key, value)\n if (error) {\n errors[key] = error\n }\n }\n if (Object.keys(errors).length) {\n throw new ValidationError(errors)\n }\n}\n","import {validate} from '@orion-js/schema'\nimport fromDot from '../../../helpers/fromDot'\nimport toDot from '../../../helpers/toDot'\n\n/**\n * Validates $set\n */\nexport default async function ({schema, operationDoc}) {\n let cleaned = toDot(operationDoc)\n\n const transformedObj = {}\n Object.keys(cleaned).map(key => {\n const newKey = key.replace('$.', '0.')\n transformedObj[newKey] = cleaned[key]\n })\n\n cleaned = fromDot(transformedObj)\n\n await validate(schema, cleaned, {omitRequired: true})\n}\n","import validatePush from './validatePush'\nimport validateUnset from './validateUnset'\nimport validateInc from './validateInc'\nimport validateSet from './validateSet'\n\nconst shouldCheck = function (key: string): boolean {\n if (key === '$pushAll') throw new Error('$pushAll is not supported, use $push + $each')\n return ['$pull', '$pullAll', '$pop', '$slice'].indexOf(key) === -1\n}\n\nexport default async function ({schema, operationDoc, operation}) {\n if (!shouldCheck(operation)) return\n\n if (operation === '$set') {\n await validateSet({schema, operationDoc})\n } else if (operation === '$unset') {\n await validateUnset({schema, operationDoc})\n } else if (operation === '$inc') {\n await validateInc({schema, operationDoc})\n } else if (operation === '$push' || operation === '$addToSet') {\n await validatePush({schema, operationDoc, operation})\n } else {\n throw new Error(operation + ' operation is not supported yet')\n }\n}\n","// inspired by https://github.com/aldeed/simple-schema-js\nimport validateOperator from './validateOperator'\n\nexport default async function validateModifier(schema, modifier) {\n for (const operation of Object.keys(modifier)) {\n const operationDoc = modifier[operation]\n // If non-operators are mixed in, throw error\n if (operation.slice(0, 1) !== '$') {\n throw new Error(`Expected '${operation}' to be a modifier operator like '$set'`)\n }\n\n await validateOperator({schema, operationDoc, operation})\n }\n}\n","import validateModifier from './index'\nimport {validate} from '@orion-js/schema'\nimport {omit} from 'rambdax'\nimport fromDot from '../../../helpers/fromDot'\n\nconst getPushSimulation = $push => {\n if (!$push) return {}\n const simulation = {}\n for (const key of Object.keys($push)) {\n const value = $push[key]\n if (typeof value === 'object' && '$each' in value) {\n simulation[key] = value.$each\n } else {\n simulation[key] = [value]\n }\n }\n return simulation\n}\n\nconst simulateNewDoc = (selector, modifier) =>\n fromDot({\n ...selector,\n ...modifier.$set,\n ...modifier.$inc,\n ...getPushSimulation(modifier.$push),\n ...getPushSimulation(modifier.$addToSet),\n ...modifier.$setOnInsert,\n })\n\nconst validateNewDoc = async (schema, selector, modifier) => {\n const doc = simulateNewDoc(selector, modifier)\n await validate(schema, doc)\n}\n\nexport default async function (schema, selector, modifier) {\n await validateNewDoc(schema, selector, modifier)\n await validateModifier(schema, omit(['$setOnInsert'], modifier))\n}\n","import {cleanKey, clean} from '@orion-js/schema'\nimport {isEmpty, isNil, equals} from 'rambdax'\nimport * as MongoDB from 'mongodb'\nimport fromDot from '../../helpers/fromDot'\nimport {ModelClassBase} from '../../types'\n\nconst shouldCheck = key => {\n if (key === '$pushAll') throw new Error('$pushAll is not supported; use $push + $each')\n return ['$pull', '$pullAll', '$pop', '$slice'].indexOf(key) === -1\n}\n\nexport default async function cleanModifier<\n ModelClass extends ModelClassBase,\n TFilter extends MongoDB.UpdateFilter<ModelClass>,\n>(schema, modifier: TFilter, {isUpsert} = {isUpsert: false}) {\n const cleanedModifier: MongoDB.UpdateFilter<MongoDB.Document> = {}\n for (const operation of Object.keys(modifier)) {\n const operationDoc = modifier[operation]\n cleanedModifier[operation] = {}\n // If non-operators are mixed in, throw error\n if (operation.slice(0, 1) !== '$') {\n throw new Error(`Expected '${operation}' to be a modifier operator like '$set'`)\n }\n if (!shouldCheck(operation)) {\n cleanedModifier[operation] = operationDoc\n continue\n }\n\n for (const key of Object.keys(operationDoc)) {\n const value = operationDoc[key]\n const cleanOptions = {forceDoc: operationDoc}\n\n let cleaned = null\n if (operation === '$push' || operation === '$addToSet') {\n if (typeof value === 'object' && '$each' in value) {\n const $each = await cleanKey(schema, key, value.$each, cleanOptions)\n cleaned = {...value, $each}\n } else {\n cleaned = await cleanKey(schema, `${key}.0`, value, cleanOptions)\n }\n }\n\n if (operation === '$set') {\n cleaned = await cleanKey(schema, key, value, cleanOptions)\n }\n\n if (operation === '$setOnInsert') {\n cleaned = await cleanKey(schema, key, value, cleanOptions)\n }\n\n if (operation === '$inc') {\n cleaned = await cleanKey(schema, key, value, cleanOptions)\n }\n\n if (operation === '$unset') {\n const isPresent = await cleanKey(schema, key, 'anyvalue', cleanOptions)\n cleaned = !isNil(isPresent) ? '' : null\n }\n\n if (cleaned !== undefined) {\n cleanedModifier[operation][key] = cleaned\n }\n }\n\n if (isEmpty(cleanedModifier[operation])) {\n delete cleanedModifier[operation]\n }\n }\n\n if (isUpsert) {\n const cleanedSetOnInsert = await clean(schema, fromDot(cleanedModifier.$setOnInsert || {}))\n\n if (!isEmpty(cleanedSetOnInsert)) {\n cleanedModifier.$setOnInsert = cleanedSetOnInsert\n }\n }\n\n if (equals(cleanedModifier, {})) {\n throw new Error('After cleaning your modifier is empty')\n }\n\n return cleanedModifier as TFilter\n}\n","import {ValidationError} from '@orion-js/schema'\n\nexport const wrapErrors = async <TFunc extends () => Promise<any>>(\n operation: TFunc,\n): Promise<ReturnType<TFunc>> => {\n try {\n return await operation()\n } catch (error) {\n if (error.code === 11000) {\n const regex = /index: (?:.*\\.)?\\$?(?:([_a-z0-9]*)(?:_\\d*)|([_a-z0-9]*))\\s*dup key/i\n const match = error.message.match(regex)\n\n if (!match) {\n throw new ValidationError({\n unknownKey: 'notUnique',\n })\n }\n\n const indexNameText = match[1] || match[2]\n const names = indexNameText.split(/_[_a-z0-9]_/)\n const errors = {}\n for (const name of names) {\n errors[name] = 'notUnique'\n }\n\n throw new ValidationError(errors)\n }\n\n throw error\n }\n}\n","import getSelector from './getSelector'\nimport validateUpsert from './validateModifier/validateUpsert'\nimport cleanModifier from './cleanModifier'\nimport {Collection, ModelClassBase, Upsert} from '../../types'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const upsert: Upsert<DocumentType> = async function (selectorArg, modifierArg, options = {}) {\n await collection.connectionPromise\n let modifier = modifierArg as any\n let selector = getSelector(arguments)\n\n modifier.$setOnInsert = {...modifier.$setOnInsert, _id: collection.generateId()}\n\n if (collection.schema) {\n const schema = collection.getSchema()\n\n if (options.clean !== false) {\n selector = (await cleanModifier(schema, {$set: selector})).$set\n modifier = await cleanModifier(schema, modifier, {isUpsert: true})\n }\n if (options.validate !== false) await validateUpsert(schema, selector, modifier)\n }\n\n const result = await wrapErrors(() => {\n return collection.rawCollection.updateOne(selector, modifier, {\n ...options.mongoOptions,\n upsert: true,\n })\n })\n\n return result\n }\n\n return upsert\n}\n","import getSelector from './getSelector'\nimport validateModifier from './validateModifier'\nimport cleanModifier from './cleanModifier'\nimport {Collection, FindOneAndUpdate, ModelClassBase} from '../../types'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const findOneAndUpdate: FindOneAndUpdate<DocumentType> = async (selector, modifier, options) => {\n await collection.connectionPromise\n const finalSelector = getSelector<DocumentType>([selector])\n\n if (!modifier) {\n throw new Error('Modifier is required when making an update')\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n modifier = options?.clean !== false ? await cleanModifier(schema, modifier) : modifier\n if (options?.validate !== false) await validateModifier(schema, modifier)\n }\n\n const result = await collection.rawCollection.findOneAndUpdate(\n finalSelector,\n modifier,\n options?.mongoOptions,\n )\n\n if (!result) return null\n return result\n }\n\n return findOneAndUpdate\n}\n","import getSelector from './getSelector'\nimport {Collection, ModelClassBase, UpdateOne} from '../../types'\nimport cleanModifier from './cleanModifier'\nimport validateModifier from './validateModifier'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const updateOne: UpdateOne<DocumentType> = async function (\n selectorArg,\n modifierArg,\n options = {},\n ) {\n await collection.connectionPromise\n let modifier = modifierArg as any\n const selector = getSelector(arguments)\n\n if (!modifier) {\n throw new Error('Modifier is required when making an update')\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n modifier = options.clean !== false ? await cleanModifier(schema, modifier) : modifier\n if (options.validate !== false) await validateModifier(schema, modifier)\n }\n\n const result = await wrapErrors(() => {\n return collection.rawCollection.updateOne(selector, modifier, options.mongoOptions)\n })\n\n return result\n }\n\n return updateOne\n}\n","import getSelector from './getSelector'\nimport {Collection, ModelClassBase, UpdateMany} from '../../types'\nimport cleanModifier from './cleanModifier'\nimport validateModifier from './validateModifier'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const updateMany: UpdateMany<DocumentType> = async function (\n selectorArg,\n modifierArg,\n options = {},\n ) {\n await collection.connectionPromise\n let modifier = modifierArg as any\n const selector = getSelector(arguments)\n\n if (!modifier) {\n throw new Error('Modifier is required when making an update')\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n modifier = options.clean !== false ? await cleanModifier(schema, modifier) : modifier\n if (options.validate !== false) await validateModifier(schema, modifier)\n }\n\n const result = await wrapErrors(() => {\n return collection.rawCollection.updateMany(selector, modifier, options.mongoOptions)\n })\n\n return result\n }\n\n return updateMany\n}\n","import {Collection, ModelClassBase, UpdateAndFind} from '../../types'\nimport getSelector from './getSelector'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const updateAndFind: UpdateAndFind<DocumentType> = async function (\n selector,\n modifier,\n options = {},\n ) {\n await collection.connectionPromise\n return await wrapErrors(async () => {\n return await collection.findOneAndUpdate(selector, modifier, {\n ...options,\n mongoOptions: {\n ...options.mongoOptions,\n returnDocument: 'after',\n },\n })\n })\n }\n return updateAndFind\n}\n","import getSelector from './getSelector'\nimport {Collection, DeleteOne, ModelClassBase} from '../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const func: DeleteOne<DocumentType> = async function (selectorArg, options) {\n await collection.connectionPromise\n const selector = getSelector(arguments)\n const result = await collection.rawCollection.deleteOne(selector, options)\n\n return result\n }\n\n return func\n}\n","import getSelector from './getSelector'\nimport {Collection, DeleteMany, ModelClassBase} from '../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const func: DeleteMany<DocumentType> = async function (selectorArg, options) {\n await collection.connectionPromise\n const selector = getSelector(arguments)\n const result = await collection.rawCollection.deleteMany(selector, options)\n\n return result\n }\n\n return func\n}\n","import {Collection, InsertOne, ModelClassBase} from '../../types'\nimport fromDot from '../../helpers/fromDot'\nimport {clean, validate} from '@orion-js/schema'\nimport {wrapErrors} from './wrapErrors'\nimport {isType} from 'rambdax'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const insertOne: InsertOne<DocumentType> = async (insertDoc, options = {}) => {\n await collection.connectionPromise\n let doc = insertDoc as DocumentType\n if (!doc || !isType('Object', doc)) {\n throw new Error('Insert must receive a document')\n }\n\n if (!doc._id) {\n doc._id = collection.generateId()\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n doc = await clean(schema, fromDot(doc))\n await validate(schema, doc)\n }\n\n await wrapErrors(async () => {\n await collection.rawCollection.insertOne(doc, options.mongoOptions)\n })\n\n return doc._id\n }\n\n return insertOne\n}\n","import {type} from 'rambdax'\nimport {clone} from '@orion-js/helpers'\nimport {Collection, InsertMany, ModelClassBase} from '../../types'\nimport * as MongoDB from 'mongodb'\nimport fromDot from '../../helpers/fromDot'\nimport {clean, validate} from '@orion-js/schema'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const insertMany: InsertMany<DocumentType> = async (docs, options = {}) => {\n await collection.connectionPromise\n for (let index = 0; index < docs.length; index++) {\n let doc = clone(docs[index]) as any\n\n if (!doc || type(doc) !== 'Object') {\n throw new Error(`Item at index ${index} is not a document`)\n }\n\n if (!doc._id) {\n doc._id = collection.generateId()\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n doc = await clean(schema, fromDot(doc))\n await validate(schema, doc)\n }\n\n docs[index] = doc\n }\n const {insertedIds} = await wrapErrors(() => {\n return collection.rawCollection.insertMany(docs as any, options.mongoOptions)\n })\n\n const ids: Array<MongoDB.ObjectId> = Object.values(insertedIds)\n\n return ids.map(id => id.toString())\n }\n\n return insertMany\n}\n","import {Collection, ModelClassBase, UpdateItem} from '../../types'\nimport {wrapErrors} from './wrapErrors'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const updateItem: UpdateItem<DocumentType> = async function (item, modifier, options = {}) {\n await collection.connectionPromise\n const updated = await wrapErrors(async () => {\n return await collection.updateAndFind(item._id, modifier, options)\n })\n\n for (const key in item) {\n delete item[key]\n }\n\n for (const key in updated) {\n item[key] = updated[key]\n }\n }\n return updateItem\n}\n","import getSelector from './getSelector'\nimport {Collection, CountDocuments, DeleteOne, ModelClassBase} from '../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const func: CountDocuments<DocumentType> = async function (selectorArg, options) {\n await collection.connectionPromise\n const selector = getSelector(arguments)\n const result = await collection.rawCollection.countDocuments(selector, options)\n\n return result\n }\n\n return func\n}\n","import {Collection, EstimatedDocumentCount, ModelClassBase} from '../../types'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const func: EstimatedDocumentCount<DocumentType> = async function (options) {\n await collection.connectionPromise\n const result = await collection.rawCollection.estimatedDocumentCount(options)\n return result\n }\n\n return func\n}\n","import {type} from 'rambdax'\nimport {Collection, InsertAndFind, ModelClassBase} from '../../types'\nimport fromDot from '../../helpers/fromDot'\nimport {clean, validate} from '@orion-js/schema'\nimport {wrapErrors} from './wrapErrors'\n\nexport default <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) => {\n const insertAndFind: InsertAndFind<DocumentType> = async (insertDoc, options = {}) => {\n await collection.connectionPromise\n let doc = insertDoc as any\n if (!doc || type(doc) !== 'Object') {\n throw new Error('Insert must receive a document')\n }\n\n if (!doc._id) {\n doc._id = collection.generateId()\n }\n\n if (collection.schema) {\n const schema = collection.getSchema()\n doc = await clean(schema, fromDot(doc))\n await validate(schema, doc)\n }\n\n await wrapErrors(async () => {\n await collection.rawCollection.insertOne(doc, options.mongoOptions)\n })\n\n return doc\n }\n\n return insertAndFind\n}\n","import {Collection, DataLoader, ModelClassBase} from '../../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const loadById: DataLoader.LoadById<DocumentType> = async id => {\n const result = await collection.loadOne({\n key: '_id',\n value: id,\n })\n\n return result\n }\n\n return loadById\n}\n","import {Collection, DataLoader, ModelClassBase} from '../../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const loadMany: DataLoader.LoadMany<DocumentType> = async options => {\n const results = await collection.loadData(options)\n return results\n }\n\n return loadMany\n}\n","import {Collection, DataLoader, ModelClassBase} from '../../../types'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const loadOne: DataLoader.LoadOne<DocumentType> = async options => {\n const [result] = await collection.loadData(options)\n return result\n }\n\n return loadOne\n}\n","import {createMapArray, clone} from '@orion-js/helpers'\nimport {DataLoader, Collection, ModelClassBase, ModelToMongoSelector} from '../../../types'\nimport dataLoad from './dataLoad'\n\nexport default function <DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n) {\n const loadData: DataLoader.LoadData<DocumentType> = async options => {\n await collection.connectionPromise\n\n const result = await dataLoad({\n loaderKey: {\n key: options.key,\n match: options.match,\n sort: options.sort,\n project: options.project,\n collectionName: collection.name,\n },\n id: options.value,\n ids: options.values,\n timeout: options.timeout,\n load: async values => {\n const query = {\n ...clone(options.match),\n [options.key]: {$in: values},\n } as ModelToMongoSelector<DocumentType>\n\n // Use secondaryPreferred to distribute read load across replicas\n const cursor = collection.find(query, {readPreference: 'secondaryPreferred'})\n\n if (options.sort) {\n cursor.sort(options.sort)\n }\n\n if (options.project) {\n cursor.project(options.project)\n }\n\n if (options.debug) {\n console.info(`Will execute data loading query now on ${collection.name}: `, query)\n }\n\n const items = await cursor.toArray()\n\n const itemsMap = createMapArray(items, options.key as string)\n return values.map(value => {\n return itemsMap[value] || []\n })\n },\n })\n\n return result\n }\n\n return loadData\n}\n","import DataLoader from 'dataloader'\n\nexport const cache = new Map()\n\ninterface Options {\n key: string\n func: (ids: Array<string>) => Promise<any>\n timeout: number\n}\n\nexport const getDataLoader = (params: Options): DataLoader<any, any> => {\n const {key, func, timeout} = params\n\n const existing = cache.get(key)\n if (existing) return existing\n\n const load = async (ids: Array<string>) => {\n cache.delete(key)\n return await func(ids)\n }\n\n const options = {\n batchScheduleFn: callback => setTimeout(callback, timeout),\n }\n\n const dataLoader = new DataLoader(load, options)\n\n cache.set(key, dataLoader)\n\n return dataLoader\n}\n","import {getDataLoader} from './getDataLoader'\nimport {flatten} from 'rambdax'\nimport {hashObject} from '@orion-js/helpers'\n\ninterface Options {\n loaderKey: any\n load: (values: Array<string>) => Promise<any>\n timeout?: number\n ids?: Array<string>\n id?: string\n}\n\nconst dataLoad = async (options: Options) => {\n const dataLoader = getDataLoader({\n key: hashObject(options.loaderKey),\n func: options.load,\n timeout: options.timeout || 5,\n })\n\n if (options.ids) {\n const resultArray = await dataLoader.loadMany(options.ids)\n return flatten(resultArray)\n }\n\n return await dataLoader.load(options.id)\n}\n\nexport default dataLoad\n","import {generateId, generateUUID} from '@orion-js/helpers'\nimport {ObjectId} from 'bson'\nimport {CreateCollectionOptions, ModelClassBase} from '..'\nimport {FieldType} from '@orion-js/schema'\n\nconst getIdGenerator = <DocumentType extends ModelClassBase>(\n options: CreateCollectionOptions,\n): (() => DocumentType['_id']) => {\n if (!options.idPrefix && options?.schema?._id) {\n const idField = options.schema._id.type as FieldType\n if (idField.name?.startsWith('typedId:')) {\n return () => {\n return (idField as any).generateId()\n }\n }\n }\n\n if (options.idPrefix || options.idGeneration === 'uuid') {\n return () => {\n const prefix = options.idPrefix || ''\n const random = generateUUID()\n return `${prefix}${random}`\n }\n }\n\n if (options.idGeneration === 'random') {\n return () => {\n const prefix = options.idPrefix || ''\n const random = generateId()\n return `${prefix}${random}`\n }\n }\n\n return () => {\n const id = new ObjectId()\n\n return id.toString()\n }\n}\n\nexport default getIdGenerator\n","import {MongoExpiredSessionError, MongoNotConnectedError} from 'mongodb'\nimport {Collection, ModelClassBase} from '..'\nimport {logger} from '@orion-js/logger'\nimport {isIndexDefined} from './deleteUnusedIndexes'\nimport {getIndexOptions} from './getIndexOptions'\nimport {getMergedIndexes} from './collectionsRegistry'\n\nexport interface MongoDBIndex {\n key: Record<string, unknown>\n name: string\n}\n\n/**\n * Checks for indexes in the database that are not defined in the collection configuration.\n * Uses merged indexes from all createCollection() calls for the same collection name.\n * Logs a warning if unexpected indexes are found.\n */\nexport async function checkIndexes<DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n): Promise<void> {\n await collection.connectionPromise\n\n // Get current indexes from MongoDB\n let currentIndexes: Array<{key: Record<string, unknown>; name: string}> = []\n try {\n currentIndexes = (await collection.rawCollection.indexes()) as MongoDBIndex[]\n } catch (error) {\n if ((error as {codeName?: string}).codeName !== 'NamespaceNotFound') throw error\n return\n }\n\n // Get merged indexes from all createCollection() calls for this collection\n const mergedIndexes = getMergedIndexes(collection.connectionName, collection.name)\n\n // If no indexes defined anywhere, skip the check\n if (mergedIndexes.length === 0) {\n return\n }\n\n // Find unexpected indexes using the merged indexes from the registry\n const unexpectedIndexes = currentIndexes.filter(\n index => index.name !== '_id_' && !isIndexDefined(mergedIndexes, index),\n )\n\n if (unexpectedIndexes.length > 0) {\n logger.warn(\n `${unexpectedIndexes.length} unexpected indexes found in collection \"${\n collection.name\n }\": ${unexpectedIndexes\n .map(i => i.name)\n .join(', ')} | Delete the index or fix the collection definition`,\n )\n }\n}\nexport async function loadIndexes<DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n): Promise<string[]> {\n if (!collection.indexes) return\n if (!collection.indexes.length) return\n\n await collection.connectionPromise\n\n const results = Promise.all(\n collection.indexes.map(async indexDef => {\n const {keys} = indexDef\n // Support both flat options and deprecated nested options\n const options = getIndexOptions(indexDef)\n\n try {\n return await collection.rawCollection.createIndex(keys, options)\n } catch (error) {\n if (error.code === 85 || error.code === 86) {\n console.info('Will delete index to create the new version')\n const indexName = (() => {\n const message = error.errorResponse.errmsg\n const indexName = message.split('name: \"')[1].split('\"')[0]\n return indexName\n })()\n await collection.rawCollection.dropIndex(indexName)\n console.info('Index was deleted, creating new index')\n const result = await collection.rawCollection.createIndex(keys, options)\n console.info('Index updated correctly')\n return result\n }\n if (error instanceof MongoExpiredSessionError || error instanceof MongoNotConnectedError) {\n // this errors is thrown when we are on tests environment\n // but it's not a problem never, index will be created on the next connection\n } else {\n console.error(`Error creating index for collection ${collection.name}: ${error.message}`)\n console.error(error)\n return error.message\n }\n }\n }),\n )\n\n await checkIndexes(collection)\n\n return results\n}\n","import {logger} from '@orion-js/logger'\nimport {Collection, CollectionIndex, ModelClassBase} from '../types'\nimport {getIndexName} from './getIndexOptions'\n\n/**\n * Represents a MongoDB index as returned by the indexes() method\n */\ninterface MongoDBIndex {\n key: Record<string, unknown>\n name: string\n}\n\n/**\n * Checks if an index definition contains a text index field.\n * Text indexes have the value \"text\" for their field.\n */\nfunction isTextIndexDefinition(keys: Record<string, unknown>): boolean {\n return Object.values(keys).some(value => value === 'text')\n}\n\n/**\n * Checks if a MongoDB index is a text index.\n * Text indexes have special keys _fts and _ftsx.\n */\nfunction isMongoDBTextIndex(key: Record<string, unknown>): boolean {\n return '_fts' in key && '_ftsx' in key\n}\n\n/**\n * Generates the expected MongoDB index name from a definition.\n * MongoDB uses the pattern: field1_value1_field2_value2\n */\nfunction generateIndexName(keys: Record<string, unknown>): string {\n return Object.entries(keys)\n .map(([field, value]) => `${field}_${value}`)\n .join('_')\n}\n\n/**\n * Compares two index key specifications for equality.\n * Handles key order and special index types (2dsphere, hashed, etc.)\n * Note: Text indexes are handled separately due to their special structure.\n * @param definitionKeys - The keys from the collection index definition\n * @param currentIndexKey - The keys from the current MongoDB index\n * @returns true if the keys match exactly in order and values\n */\nexport function keysMatch(\n definitionKeys: Record<string, unknown>,\n currentIndexKey: Record<string, unknown>,\n): boolean {\n const defEntries = Object.entries(definitionKeys)\n const curEntries = Object.entries(currentIndexKey)\n\n // Different number of keys means no match\n if (defEntries.length !== curEntries.length) return false\n\n // Compare each key-value pair in order (order matters for compound indexes)\n for (let i = 0; i < defEntries.length; i++) {\n const [defKey, defValue] = defEntries[i]\n const [curKey, curValue] = curEntries[i]\n if (defKey !== curKey || defValue !== curValue) return false\n }\n\n return true\n}\n\n/**\n * Checks if a current database index matches any of the defined indexes.\n * First checks by custom name if provided (supports both flat and deprecated formats),\n * then by key specification. Handles text indexes specially since MongoDB stores\n * them with different key structure (_fts, _ftsx).\n * @param definedIndexes - Array of index definitions from the collection\n * @param currentIndex - The index from MongoDB to check\n * @returns true if the index is defined in the collection configuration\n */\nexport function isIndexDefined(\n definedIndexes: CollectionIndex[],\n currentIndex: MongoDBIndex,\n): boolean {\n return definedIndexes.some(defIndex => {\n // Match by custom name if provided (handles both flat and deprecated options formats)\n const customName = getIndexName(defIndex)\n if (customName && customName === currentIndex.name) return true\n\n const defKeys = defIndex.keys as Record<string, unknown>\n\n // Special handling for text indexes: MongoDB stores them with _fts/_ftsx keys\n // instead of the original field names, so we compare by generated name\n if (isTextIndexDefinition(defKeys) && isMongoDBTextIndex(currentIndex.key)) {\n const expectedName = generateIndexName(defKeys)\n return currentIndex.name === expectedName\n }\n\n // Match by key specification for regular indexes\n return keysMatch(defKeys, currentIndex.key)\n })\n}\n\n/**\n * Result of the deleteUnusedIndexes operation\n */\nexport interface DeleteUnusedIndexesResult {\n /** Names of the indexes that were deleted */\n deletedIndexes: string[]\n /** Name of the collection that was cleaned */\n collectionName: string\n}\n\n/**\n * Deletes indexes that exist in MongoDB but are not defined in the collection configuration.\n * This helps clean up stale indexes that are no longer needed.\n * Always preserves the _id_ index.\n * @param collection - The collection to clean unused indexes from\n * @returns Information about which indexes were deleted\n */\nexport async function deleteUnusedIndexes<DocumentType extends ModelClassBase>(\n collection: Partial<Collection<DocumentType>>,\n): Promise<DeleteUnusedIndexesResult> {\n await collection.connectionPromise\n\n const result: DeleteUnusedIndexesResult = {\n deletedIndexes: [],\n collectionName: collection.name,\n }\n\n // Get current indexes from MongoDB\n let currentIndexes: MongoDBIndex[] = []\n try {\n currentIndexes = (await collection.rawCollection.indexes()) as MongoDBIndex[]\n } catch (error) {\n // Collection doesn't exist yet, nothing to delete\n if ((error as {codeName?: string}).codeName === 'NamespaceNotFound') {\n return result\n }\n throw error\n }\n\n // If no indexes are defined, we don't delete anything (safety measure)\n if (!collection.indexes || collection.indexes.length === 0) {\n return result\n }\n\n // Find indexes that are not defined in the collection configuration\n const unusedIndexes = currentIndexes.filter(\n index => index.name !== '_id_' && !isIndexDefined(collection.indexes, index),\n )\n\n // Delete each unused index\n for (const index of unusedIndexes) {\n try {\n await collection.rawCollection.dropIndex(index.name)\n result.deletedIndexes.push(index.name)\n logger.info(`Deleted unused index \"${index.name}\" from collection \"${collection.name}\"`)\n } catch (error) {\n logger.error(`Failed to delete index \"${index.name}\" from collection \"${collection.name}\"`, {\n error,\n })\n }\n }\n\n return result\n}\n","import type {CreateIndexesOptions} from 'mongodb'\nimport type {CollectionIndex} from '../types'\n\n/**\n * Extracts the index options from a CollectionIndex definition.\n * Handles both the new flat format and the deprecated nested options format.\n *\n * @example New format (recommended):\n * ```ts\n * { keys: { email: 1 }, unique: true, sparse: true }\n * // Returns: { unique: true, sparse: true }\n * ```\n *\n * @example Old format (deprecated):\n * ```ts\n * { keys: { email: 1 }, options: { unique: true } }\n * // Returns: { unique: true }\n * ```\n *\n * @param indexDef - The index definition from the collection configuration\n * @returns The MongoDB CreateIndexesOptions to pass to createIndex()\n */\nexport function getIndexOptions(indexDef: CollectionIndex): CreateIndexesOptions | undefined {\n // Extract all properties except 'keys' and 'options' as flat options\n const {keys: _keys, options: deprecatedOptions, ...flatOptions} = indexDef\n\n // If deprecated options exist, merge them with flat options (flat takes precedence)\n if (deprecatedOptions) {\n return {...deprecatedOptions, ...flatOptions}\n }\n\n // Return flat options if any exist, otherwise undefined\n return Object.keys(flatOptions).length > 0 ? flatOptions : undefined\n}\n\n/**\n * Gets the custom name from an index definition if one was specified.\n * Handles both flat format and deprecated nested options format.\n *\n * @param indexDef - The index definition from the collection configuration\n * @returns The custom index name if specified, undefined otherwise\n */\nexport function getIndexName(indexDef: CollectionIndex): string | undefined {\n // Flat format takes precedence\n if (indexDef.name) {\n return indexDef.name\n }\n\n // Fall back to deprecated options\n return indexDef.options?.name\n}\n","import {logger} from '@orion-js/logger'\nimport type {Collection, CollectionIndex, ModelClassBase} from '../types'\nimport {DeleteUnusedIndexesResult, keysMatch} from './deleteUnusedIndexes'\nimport {getIndexName} from './getIndexOptions'\nimport {createIndexesPromises} from './index'\n\n/**\n * Registry that tracks all collections created via createCollection().\n * Maps connection name to a map of collection name to collection instance.\n * When the same collection is registered multiple times, indexes are merged.\n */\nexport const collectionsRegistry = new Map<string, Map<string, Collection<ModelClassBase>>>()\n\n/**\n * Checks if two index definitions are equivalent (same keys or same custom name).\n */\nfunction indexesAreEqual(indexA: CollectionIndex, indexB: CollectionIndex): boolean {\n const nameA = getIndexName(indexA)\n const nameB = getIndexName(indexB)\n\n // If both have custom names, compare by name\n if (nameA && nameB) {\n return nameA === nameB\n }\n\n // Otherwise compare by keys\n return keysMatch(\n indexA.keys as Record<string, unknown>,\n indexB.keys as Record<string, unknown>,\n )\n}\n\n/**\n * Merges two arrays of index definitions, avoiding duplicates.\n * @param existingIndexes - The indexes already registered\n * @param newIndexes - The new indexes to merge in\n * @returns Merged array of unique indexes\n */\nfunction mergeIndexes(\n existingIndexes: CollectionIndex[],\n newIndexes: CollectionIndex[],\n): CollectionIndex[] {\n const merged = [...existingIndexes]\n\n for (const newIndex of newIndexes) {\n const isDuplicate = existingIndexes.some(existing => indexesAreEqual(existing, newIndex))\n if (!isDuplicate) {\n merged.push(newIndex)\n }\n }\n\n return merged\n}\n\n/**\n * Registers a collection in the registry.\n * Called automatically when a collection is created via createCollection().\n * If the same collection name is registered multiple times, indexes are merged\n * to support multiple createCollection() calls for the same collection.\n * @param connectionName - The name of the MongoDB connection\n * @param collection - The collection instance to register\n */\nexport function registerCollection(\n connectionName: string,\n collection: Collection<ModelClassBase>,\n): void {\n if (!collectionsRegistry.has(connectionName)) {\n collectionsRegistry.set(connectionName, new Map())\n }\n\n const connectionMap = collectionsRegistry.get(connectionName)\n const existingCollection = connectionMap.get(collection.name)\n\n if (existingCollection) {\n // Merge indexes from multiple createCollection calls for the same collection\n existingCollection.indexes = mergeIndexes(existingCollection.indexes, collection.indexes)\n } else {\n connectionMap.set(collection.name, collection)\n }\n}\n\n/**\n * Gets all registered collections for a specific connection.\n * @param connectionName - The name of the MongoDB connection (defaults to 'main')\n * @returns Array of registered collections for the connection\n */\nexport function getRegisteredCollections(\n connectionName = 'main',\n): Array<Collection<ModelClassBase>> {\n const connectionCollections = collectionsRegistry.get(connectionName)\n if (!connectionCollections) {\n return []\n }\n return Array.from(connectionCollections.values())\n}\n\n/**\n * Gets the merged indexes for a specific collection from the registry.\n * This includes all indexes from all createCollection() calls for the same collection name.\n * @param connectionName - The name of the MongoDB connection\n * @param collectionName - The name of the collection\n * @returns Array of merged index definitions, or empty array if collection not registered\n */\nexport function getMergedIndexes(connectionName: string, collectionName: string): CollectionIndex[] {\n const connectionCollections = collectionsRegistry.get(connectionName)\n if (!connectionCollections) {\n return []\n }\n\n const collection = connectionCollections.get(collectionName)\n if (!collection) {\n return []\n }\n\n return collection.indexes || []\n}\n\n/**\n * Deletes unused indexes from all registered collections for a connection.\n * Iterates over all collections registered via createCollection() and\n * removes indexes that exist in MongoDB but are not defined in the collection configuration.\n *\n * **Important**: This function waits for all pending index creation to complete before\n * deleting any indexes, to avoid race conditions where an index being created might\n * be incorrectly identified as unused.\n *\n * @param connectionName - The name of the MongoDB connection (defaults to 'main')\n * @returns Array of results for each collection that had indexes deleted\n *\n * @example\n * ```ts\n * // Delete unused indexes from all collections on the main connection\n * const results = await deleteAllUnusedIndexes()\n *\n * // Delete unused indexes from all collections on a specific connection\n * const results = await deleteAllUnusedIndexes('secondary')\n *\n * // Log results\n * for (const result of results) {\n * console.log(`${result.collectionName}: deleted ${result.deletedIndexes.length} indexes`)\n * }\n * ```\n */\nexport async function deleteAllUnusedIndexes(\n connectionName = 'main',\n): Promise<DeleteUnusedIndexesResult[]> {\n const collections = getRegisteredCollections(connectionName)\n\n if (collections.length === 0) {\n logger.warn(`No collections registered for connection \"${connectionName}\"`)\n return []\n }\n\n // Wait for all pending index creation to complete before deleting\n // This prevents race conditions where we might delete an index that's being created\n if (createIndexesPromises.length > 0) {\n logger.info('Waiting for pending index creation to complete before deleting unused indexes...')\n await Promise.all(createIndexesPromises)\n }\n\n logger.info(\n `Deleting unused indexes from ${collections.length} collections on connection \"${connectionName}\"`,\n )\n\n const results: DeleteUnusedIndexesResult[] = []\n\n for (const collection of collections) {\n const result = await collection.deleteUnusedIndexes()\n if (result.deletedIndexes.length > 0) {\n results.push(result)\n }\n }\n\n const totalDeleted = results.reduce((sum, r) => sum + r.deletedIndexes.length, 0)\n logger.info(`Deleted ${totalDeleted} unused indexes from ${results.length} collections`)\n\n return results\n}\n","import {Schema} from '@orion-js/schema'\nimport {type} from 'rambdax'\nimport {clone} from '@orion-js/helpers'\nimport {CreateCollectionOptions} from '../types'\n\n// @ts-ignore polyfill for Symbol.metadata // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#decorator-metadata\nSymbol.metadata ??= Symbol('Symbol.metadata')\n\nexport function prepareShema(schema: Schema): Schema {\n if (!schema._id) {\n schema._id = {\n type: String,\n }\n }\n return schema\n}\n\nexport function getSchema(options: CreateCollectionOptions): Schema {\n if (!options.schema) return\n\n if (options.schema[Symbol.metadata]?._getModel) {\n return options.schema[Symbol.metadata]._getModel().getSchema()\n }\n\n // schema is a model\n if (options.schema.getSchema) {\n const schema = options.schema.getSchema()\n return prepareShema(schema)\n }\n\n // schema is a typed model\n if (options.schema.getModel) {\n const model = options.schema.getModel()\n const schema = model ? clone(model.getSchema()) : {}\n return prepareShema(schema)\n }\n\n if (type(options.schema) === 'Object') {\n return prepareShema(options.schema)\n }\n}\n","import {Collection} from '../types'\nimport {logger} from '@orion-js/logger'\n\nexport function wrapMethods(collection: Partial<Collection>) {\n // Wrap all collection methods to ensure connection is started\n const methodsWithPromises = [\n 'findOne',\n 'findOneAndUpdate',\n 'insertOne',\n 'insertMany',\n 'insertAndFind',\n 'updateOne',\n 'updateMany',\n 'deleteMany',\n 'deleteOne',\n 'upsert',\n 'estimatedDocumentCount',\n 'countDocuments',\n 'updateAndFind',\n 'updateItem',\n 'loadData',\n 'loadById',\n 'loadOne',\n 'loadMany',\n ]\n\n const methodsWithoutPromises = ['aggregate', 'find', 'watch']\n\n const originalMethods = {...collection}\n\n for (const methodName of methodsWithPromises) {\n if (typeof collection[methodName] === 'function') {\n collection[methodName] = async (...args: any[]) => {\n await collection.startConnection()\n return originalMethods[methodName](...args)\n }\n }\n\n for (const methodName of methodsWithoutPromises) {\n if (typeof collection[methodName] === 'function') {\n collection[methodName] = (...args: any[]) => {\n collection.startConnection()\n if (!collection.rawCollection) {\n logger.error('Method called before connection was initialized', {\n collectionName: collection.name,\n connectionName: collection.connectionName,\n methodName,\n })\n throw new Error('Method called before connection was initialized')\n }\n return originalMethods[methodName](...args)\n }\n }\n }\n }\n}\n","import {\n BaseCollection,\n Collection,\n CreateCollectionOptions,\n CreateCollectionOptionsWithSchemaType,\n CreateCollectionOptionsWithTypedSchema,\n InferSchemaTypeWithId,\n ModelClassBase,\n SchemaWithRequiredId,\n} from '../types'\nimport {\n countDocuments,\n deleteMany,\n deleteOne,\n estimatedDocumentCount,\n find,\n findOne,\n findOneAndUpdate,\n insertMany,\n insertOne,\n updateAndFind,\n updateItem,\n updateMany,\n updateOne,\n upsert,\n insertAndFind,\n} from './getMethods'\nimport {loadById, loadOne, loadMany, loadData} from './getMethods/dataLoader'\nimport getIdGenerator from './generateId'\nimport {loadIndexes} from './createIndexes'\nimport {deleteUnusedIndexes} from './deleteUnusedIndexes'\nimport {registerCollection} from './collectionsRegistry'\nimport {getMongoConnection} from '..'\nimport {getSchema} from './getSchemaAndModel'\nimport {wrapMethods} from './wrapMethods'\nimport {InferSchemaType, TypedSchemaOnSchema} from '@orion-js/schema'\nimport {MongoClient} from 'mongodb'\n\nexport const createIndexesPromises = []\n\nexport function createCollection<T extends SchemaWithRequiredId>(\n options: CreateCollectionOptionsWithSchemaType<T>,\n): Collection<InferSchemaTypeWithId<T>>\n\nexport function createCollection<T extends TypedSchemaOnSchema & {prototype: {_id: string}}>(\n options: CreateCollectionOptionsWithTypedSchema<T>,\n): Collection<InferSchemaType<T>>\n\nexport function createCollection<T extends ModelClassBase>(\n options: CreateCollectionOptions<T>,\n): Collection<T>\n\nexport function createCollection(options: CreateCollectionOptions) {\n const connectionName = options.connectionName || 'main'\n\n const orionConnection = getMongoConnection({name: connectionName})\n if (!orionConnection) {\n throw new Error(`The connection to MongoDB \"${connectionName}\" was not found`)\n }\n\n const schema = getSchema(options)\n\n let resolveCollectionPromise: (MongoClient) => void\n const collectionPromise = new Promise<MongoClient>(resolve => {\n resolveCollectionPromise = resolve\n })\n\n const baseCollection: Partial<Collection<any>> = {\n name: options.name,\n connectionName,\n schema,\n indexes: options.indexes || [],\n client: orionConnection,\n connectionPromise: collectionPromise,\n startConnection: () => orionConnection.startConnection(),\n generateId: getIdGenerator(options),\n getRawCollection: async () => {\n await orionConnection.startConnection()\n return orionConnection.db.collection(options.name)\n },\n getSchema: () => schema,\n }\n\n const encryptedCollection: Partial<Collection<any>> = {\n ...baseCollection,\n getRawCollection: async () => {\n await orionConnection.startConnection()\n return orionConnection.encrypted.db.collection(options.name)\n },\n }\n\n const mainCollection: Partial<Collection<any>> = {\n ...baseCollection,\n encrypted: encryptedCollection as BaseCollection<ModelClassBase>,\n }\n\n const defineCollectionProperties = () => {\n if (orionConnection.db) {\n mainCollection.db = orionConnection.db\n mainCollection.rawCollection = orionConnection.db.collection(options.name)\n }\n\n if (orionConnection.encrypted.db) {\n encryptedCollection.db = orionConnection.encrypted.db\n encryptedCollection.rawCollection = orionConnection.encrypted.db.collection(options.name)\n }\n }\n\n defineCollectionProperties()\n\n orionConnection.connectionPromise.then(() => {\n defineCollectionProperties()\n resolveCollectionPromise(orionConnection.client)\n })\n\n const collections = [mainCollection, encryptedCollection]\n\n for (const collection of collections) {\n // modified orion methods\n collection.findOne = findOne(collection)\n collection.find = find(collection)\n collection.findOneAndUpdate = findOneAndUpdate(collection)\n collection.insertOne = insertOne(collection)\n collection.insertMany = insertMany(collection)\n collection.insertAndFind = insertAndFind(collection)\n collection.updateOne = updateOne(collection)\n collection.updateMany = updateMany(collection)\n collection.deleteMany = deleteMany(collection)\n collection.deleteOne = deleteOne(collection)\n collection.upsert = upsert(collection)\n\n // counts\n collection.estimatedDocumentCount = estimatedDocumentCount(collection)\n collection.countDocuments = countDocuments(collection)\n\n // update and find\n collection.updateAndFind = updateAndFind(collection)\n collection.updateItem = updateItem(collection)\n\n // plain passed methods\n collection.aggregate = (pipeline, options) =>\n collection.rawCollection.aggregate(pipeline, options)\n collection.watch = (pipeline, options) => collection.rawCollection.watch(pipeline, options)\n\n // data loader\n collection.loadData = loadData(collection)\n collection.loadById = loadById(collection)\n collection.loadOne = loadOne(collection)\n collection.loadMany = loadMany(collection)\n collection.createIndexes = async () => []\n }\n\n const createIndexes = async () => {\n await orionConnection.startConnection()\n const createIndexPromise = loadIndexes(mainCollection)\n createIndexesPromises.push(createIndexPromise)\n mainCollection.createIndexesPromise = createIndexPromise\n return createIndexPromise\n }\n\n mainCollection.createIndexes = createIndexes\n mainCollection.deleteUnusedIndexes = async () => {\n await orionConnection.startConnection()\n return deleteUnusedIndexes(mainCollection)\n }\n\n if (!process.env.DONT_CREATE_INDEXES_AUTOMATICALLY) {\n createIndexes()\n }\n\n wrapMethods(mainCollection as any)\n wrapMethods(encryptedCollection as any)\n\n // Register collection for deleteAllUnusedIndexes() support\n registerCollection(connectionName, mainCollection as Collection<ModelClassBase>)\n\n return mainCollection as Collection<ModelClassBase>\n}\n","import {logger} from '@orion-js/logger'\nimport {AWSEncryptionKeyOptions, ClientEncryption, KMSProviders, MongoClient, UUID} from 'mongodb'\nimport {getMongoURLFromEnv} from '../connect/getMongoURLFromEnv'\n\nexport async function getOrCreateEncryptionKey({\n keyAltName,\n kmsProvider,\n masterKey,\n connectionName = 'main',\n keyVaultDatabase = 'encryption',\n keyVaultCollection = '__keyVault',\n kmsProviders,\n}: {\n keyAltName: string\n kmsProvider: keyof KMSProviders\n masterKey?: AWSEncryptionKeyOptions\n connectionName?: string\n keyVaultDatabase?: string\n keyVaultCollection?: string\n kmsProviders: KMSProviders\n}): Promise<{key: UUID; keyVaultNamespace: string}> {\n const keyVaultNamespace = `${keyVaultDatabase}.${keyVaultCollection}`\n\n logger.info('Connecting to database to get or create the encryption key', {\n keyVaultNamespace,\n keyAltName,\n })\n const client = new MongoClient(getMongoURLFromEnv(connectionName))\n await client.connect()\n const db = client.db(keyVaultDatabase)\n const collection = db.collection(keyVaultCollection)\n await collection.createIndex(\n {keyAltName: 1},\n {unique: true, partialFilterExpression: {keyAltName: {$exists: true}}},\n )\n const clientEncryption = new ClientEncryption(client, {\n keyVaultNamespace,\n kmsProviders,\n })\n\n const key = await clientEncryption.getKeyByAltName(keyAltName)\n if (key) {\n logger.info('Key found on the key vault', {\n keyVaultNamespace,\n keyAltName,\n UUID: key._id,\n })\n return {key: key._id, keyVaultNamespace}\n }\n\n logger.info('Key not found on the key vault, creating a new one', {\n keyVaultNamespace,\n keyAltName,\n })\n\n const newKey = await clientEncryption.createDataKey(kmsProvider, {\n keyAltNames: [keyAltName],\n ...(masterKey ? {masterKey} : {}),\n })\n\n logger.info('New encryption key created', {\n keyVaultNamespace,\n keyAltName,\n UUID: newKey,\n })\n\n return {key: newKey, keyVaultNamespace}\n}\n\nexport const ENCRYPTION_ALGORITHMS = {\n DETERMINISTIC: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic',\n RANDOM: 'AEAD_AES_256_CBC_HMAC_SHA_512-Random',\n}\n"],"mappings":"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","names":["value","import_helpers","import_schema","import_dot_object","Dot","dot","import_schema","import_schema","import_schema","import_schema","import_schema","shouldCheck","import_schema","import_schema","import_helpers","import_schema","import_schema","import_helpers","DataLoader","import_helpers","import_helpers","import_mongodb","import_logger","import_logger","import_logger","indexName","import_helpers","import_logger","methodName","options","import_logger","import_mongodb"]}