{"version":3,"sources":["../src/index.ts","../src/mongo.ts","../src/utils/object-id-utils.ts","../src/filters/filter-helpers.ts","../src/repo/mongo-repo-impl.ts"],"sourcesContent":["export {mongodb, collection} from \"./mongo\"\nexport {ObjectIdUtils} from \"./utils/object-id-utils\"\nexport {type MongoRepository} from \"./repo/mongo-repository\"","import {CollectionOption, Entity, MongoDatabase} from \"./types\";\nimport {MongoClient, MongoClientOptions} from \"mongodb\";\nimport {mongoRepoImplFn} from \"./repo/mongo-repo-impl\";\n\nexport const collection = <E extends Entity>(option: CollectionOption<E>) => option\n\nexport async function mongodb<\n    Collections extends { [K in string]: CollectionOption<any> }\n>(\n    options: {\n        url: string,\n        clientOptions?: MongoClientOptions,\n        collections: Collections\n    }\n): Promise<MongoDatabase<Collections>> {\n    const client = new MongoClient(options.url, options.clientOptions)\n    await client.connect()\n\n    const db = client.db()\n\n    for (let collectionsKey in options.collections) {\n        const option = options.collections[collectionsKey]\n        const collection = await db.createCollection(option.name, option.createOption)\n        await Promise.all((option.indexes ?? []).map(index => collection.createIndex({[index.key]: index.type}, index.option)))\n    }\n\n    const repos: any = {\n        db\n    }\n\n    const fn = mongoRepoImplFn(db)\n\n    for (let collectionsKey in options.collections) {\n        const option = options.collections[collectionsKey]\n        repos[collectionsKey] = fn(option)\n    }\n\n    return repos\n}","import {ObjectId} from \"mongodb\";\n\nexport namespace ObjectIdUtils {\n    export function generate(): string {\n        return new ObjectId().toHexString()\n    }\n\n    export function isValid(id: string): boolean {\n        return ObjectId.isValid(id)\n    }\n\n    export function fromString(id: string): ObjectId {\n        return new ObjectId(id)\n    }\n\n    export function fromStringSafe(id: string): ObjectId | string {\n        return ObjectId.isValid(id) ? new ObjectId(id) : id\n    }\n\n    export function toString(id: ObjectId): string {\n        return id.toHexString()\n    }\n\n    export function toStringSafe(id: any): string {\n        if (id instanceof ObjectId) return id.toHexString()\n        return id.toString()\n    }\n}","import {WhereOptions} from \"./filter\";\nimport {Filter} from \"mongodb\";\nimport {ObjectIdUtils} from \"../utils/object-id-utils\";\nimport {an} from \"vitest/dist/chunks/reporters.anwo7Y6a\";\n\nexport function mapWhereOptionToMongoFilter(where: WhereOptions<any>, objectIdKeys: string[]): any {\n    if (\"and\" in where) {\n        const and = where.and as WhereOptions<any> []\n        return {$and: and.map(it => mapWhereOptionToMongoFilter(it, objectIdKeys))}\n    } else if (\"or\" in where) {\n        const or = where.or as WhereOptions<any> []\n        return {$or: or.map(it => mapWhereOptionToMongoFilter(it, objectIdKeys))}\n    } else {\n        //if key is id, convert it to _id\n        return Object.fromEntries(\n            Object.entries(where)\n                .map(([key, value]) => {\n                    if (key === \"id\") {\n                        return [\"_id\", mapFilterToMongoFilter(value as Filter<any>, it => ObjectIdUtils.fromStringSafe(it))]\n                    }\n                    if (objectIdKeys.includes(key)) {\n                        return [key, mapFilterToMongoFilter(value as Filter<any>, it => ObjectIdUtils.fromStringSafe(it))]\n                    }\n                    return [key, mapFilterToMongoFilter(value as Filter<any>)]\n                })\n        )\n    }\n}\n\nfunction mapFilterToMongoFilter(filter: Filter<any>, transform: (v: any) => any = it => it): any {\n    if (typeof filter === \"object\") {\n        const mongoFilter: any = {}\n        if (\"eq\" in filter) mongoFilter.$eq = transform(filter.eq)\n        if (\"ne\" in filter) mongoFilter.$ne = transform(filter.ne)\n        if (\"regex\" in filter) mongoFilter.$regex = new RegExp(filter.regex, filter.flags);\n        if (\"gt\" in filter) mongoFilter.$gt = transform(filter.gt);\n        if (\"gte\" in filter) mongoFilter.$gte = transform(filter.gte);\n        if (\"lt\" in filter) mongoFilter.$lt = transform(filter.lt);\n        if (\"lte\" in filter) mongoFilter.$lte = transform(filter.lte);\n        if (\"in\" in filter) mongoFilter.$in = filter.in?.map(transform) ?? [];\n        if (\"nin\" in filter) mongoFilter.$nin = filter.nin?.map(transform) ?? [];\n\n        return mongoFilter\n    }\n    return transform(filter)\n}","import {Db, Document, ObjectId} from \"mongodb\";\nimport {ObjectIdUtils} from \"../utils/object-id-utils\";\nimport {mapWhereOptionToMongoFilter} from \"../filters/filter-helpers\";\nimport {FindOptions, SortDirection, WhereOptions} from \"../filters/filter\";\nimport {MongoRepository} from \"./mongo-repository\";\nimport {CollectionOption, Entity, PartialEntity} from \"../types\";\n\nexport function mongoRepoImplFn(db: Db) {\n    return function <E extends Entity>(options: CollectionOption<E>): MongoRepository<E> {\n        const collection = db.collection(options.name)\n        const objectIdKeys = (options.objectIdKeys ?? []) as string[]\n        const toDocument = (entity: E): Document => {\n            const result: Document = {}\n\n            for (let key in entity) {\n                if (key == 'id') result['_id'] = ObjectIdUtils.fromStringSafe(entity['id'] as string);\n                else if (objectIdKeys.includes(key as any)) result[key] = ObjectIdUtils.fromStringSafe(entity[key] as string);\n                else result[key] = entity[key];\n            }\n            return result\n        }\n        const toEntity = (document: Document): E => {\n            const entity: any = {}\n            for (let key in document) {\n                if (key == '_id') entity['id'] = ObjectIdUtils.toStringSafe(document['_id'] as ObjectId);\n                else if (objectIdKeys.includes(key as any)) entity[key] = ObjectIdUtils.toStringSafe(document[key]);\n                else entity[key] = document[key];\n            }\n\n            return options.documentToEntityMapper?.(entity) ?? (entity as E)\n        }\n\n\n        const nullableToEntity = (document: Document | null): E | null => {\n            return document == null ? null : toEntity(document)\n        }\n\n        const mapWhere = (where: any) => mapWhereOptionToMongoFilter(where ?? {}, objectIdKeys)\n\n        return {\n\n            async findById(id: string) {\n                return collection\n                    .findOne({_id: ObjectIdUtils.fromStringSafe(id) as any})\n                    .then(nullableToEntity)\n            },\n            async findOneBy(where: WhereOptions<E>) {\n                return collection\n                    .findOne(mapWhere(where))\n                    .then(nullableToEntity)\n            },\n            async find(options: FindOptions<E>) {\n                if (options.limit == 0) return []\n                let query = collection.find(mapWhere(options.where))\n                if (options.sort != null) {\n                    const r: [string, SortDirection][] = Object.entries(options.sort).map(([key, value]) => [key as string, value])\n                    query = query.sort(r)\n                }\n                if (options.skip) query = query.skip(options.skip)\n                if (options.limit != null) query = query.limit(options.limit)\n                return query.toArray().then(it => it.map(toEntity))\n            },\n            async insert(entity: E) {\n                const document = toDocument(entity)\n                await collection.insertOne(document)\n            },\n            async insertMany(entity: E[], options: { ordered: boolean }) {\n                const documents = entity.map(toDocument)\n                await collection.insertMany(documents, {\n                    ordered: options.ordered ?? false\n                })\n            },\n            async updateById(id: string, update: PartialEntity<E>) {\n                await collection.updateOne(\n                    {_id: ObjectIdUtils.fromStringSafe(id) as any},\n                    {$set: update},\n                )\n            },\n            async updateOneBy(where: WhereOptions<E>, update: PartialEntity<E>) {\n                await collection.updateOne(\n                    mapWhere(where),\n                    {$set: update},\n                )\n            },\n            async updateMany(where: WhereOptions<E>, update: PartialEntity<E>) {\n                return collection\n                    .updateMany(mapWhere(where), {$set: update})\n                    .then(it => ({matched: it.matchedCount, modified: it.modifiedCount}))\n            },\n\n            async count(where: WhereOptions<E>) {\n                return collection.countDocuments(mapWhere(where))\n            },\n            async exists(where: WhereOptions<E>) {\n                return collection.countDocuments(mapWhere(where)).then(it => it > 0)\n            },\n            async deleteById(id: string) {\n                return collection\n                    .deleteOne({_id: ObjectIdUtils.fromStringSafe(id) as any})\n                    .then(it => it.deletedCount > 0)\n            },\n            async deleteBy(where: WhereOptions<E>) {\n                return collection\n                    .deleteMany(mapWhere(where))\n                    .then(it => it.deletedCount)\n            },\n            async aggregate(stages) {\n                return collection.aggregate(stages).toArray()\n            },\n            async* watch(options) {\n                throw new Error(`Not implemented ${options}`)\n            }\n        }\n    }\n}"],"mappings":"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","names":["import_mongodb","ObjectIdUtils","collection","options","collection"]}