@prisma-next/adapter-mongo 0.3.0-dev.135 → 0.3.0-dev.147

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,"file":"index.mjs","names":["#lowerCommand","options: {\n projection?: Document;\n sort?: Document;\n limit?: number;\n skip?: number;\n }","#resolveDocument","_exhaustive: never","#resolveValue","result: Record<string, unknown>"],"sources":["../src/mongo-adapter.ts"],"sourcesContent":["import type {\n AnyMongoCommand,\n AnyMongoWireCommand,\n Document,\n MongoAdapter,\n MongoExecutionPlan,\n MongoExpr,\n MongoLoweringContext,\n MongoQueryPlan,\n MongoValue,\n} from '@prisma-next/mongo-core';\nimport {\n AggregateWireCommand,\n DeleteOneWireCommand,\n FindWireCommand,\n InsertOneWireCommand,\n MongoParamRef,\n UpdateOneWireCommand,\n} from '@prisma-next/mongo-core';\n\nclass MongoAdapterImpl implements MongoAdapter {\n lower<Row>(\n queryPlan: MongoQueryPlan<Row>,\n _context: MongoLoweringContext,\n ): MongoExecutionPlan<Row> {\n const wireCommand = this.#lowerCommand(queryPlan.command);\n return Object.freeze({\n wireCommand,\n command: queryPlan.command,\n meta: queryPlan.meta,\n });\n }\n\n #lowerCommand(command: AnyMongoCommand): AnyMongoWireCommand {\n switch (command.kind) {\n case 'find': {\n const options: {\n projection?: Document;\n sort?: Document;\n limit?: number;\n skip?: number;\n } = {};\n if (command.projection) options.projection = { ...command.projection };\n if (command.sort) options.sort = { ...command.sort };\n if (command.limit !== undefined) options.limit = command.limit;\n if (command.skip !== undefined) options.skip = command.skip;\n return new FindWireCommand(\n command.collection,\n command.filter ? this.#resolveDocument(command.filter) : undefined,\n options,\n );\n }\n case 'insertOne':\n return new InsertOneWireCommand(\n command.collection,\n this.#resolveDocument(command.document),\n );\n case 'updateOne':\n return new UpdateOneWireCommand(\n command.collection,\n this.#resolveDocument(command.filter),\n this.#resolveDocument(command.update),\n );\n case 'deleteOne':\n return new DeleteOneWireCommand(command.collection, this.#resolveDocument(command.filter));\n case 'aggregate':\n return new AggregateWireCommand(\n command.collection,\n command.pipeline.map((stage) => ({ ...stage })),\n );\n default: {\n const _exhaustive: never = command;\n throw new Error(`Unknown command kind: ${(_exhaustive as { kind: string }).kind}`);\n }\n }\n }\n\n #resolveValue(value: MongoValue): unknown {\n if (value instanceof MongoParamRef) {\n return value.value;\n }\n if (value === null || typeof value !== 'object') {\n return value;\n }\n if (value instanceof Date) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v) => this.#resolveValue(v));\n }\n return this.#resolveDocument(value as MongoExpr);\n }\n\n #resolveDocument(expr: MongoExpr): Document {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(expr)) {\n result[key] = this.#resolveValue(val);\n }\n return result;\n }\n}\n\nexport function createMongoAdapter(): MongoAdapter {\n return new MongoAdapterImpl();\n}\n"],"mappings":";;;AAoBA,IAAM,mBAAN,MAA+C;CAC7C,MACE,WACA,UACyB;EACzB,MAAM,cAAc,MAAKA,aAAc,UAAU,QAAQ;AACzD,SAAO,OAAO,OAAO;GACnB;GACA,SAAS,UAAU;GACnB,MAAM,UAAU;GACjB,CAAC;;CAGJ,cAAc,SAA+C;AAC3D,UAAQ,QAAQ,MAAhB;GACE,KAAK,QAAQ;IACX,MAAMC,UAKF,EAAE;AACN,QAAI,QAAQ,WAAY,SAAQ,aAAa,EAAE,GAAG,QAAQ,YAAY;AACtE,QAAI,QAAQ,KAAM,SAAQ,OAAO,EAAE,GAAG,QAAQ,MAAM;AACpD,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AACzD,QAAI,QAAQ,SAAS,OAAW,SAAQ,OAAO,QAAQ;AACvD,WAAO,IAAI,gBACT,QAAQ,YACR,QAAQ,SAAS,MAAKC,gBAAiB,QAAQ,OAAO,GAAG,QACzD,QACD;;GAEH,KAAK,YACH,QAAO,IAAI,qBACT,QAAQ,YACR,MAAKA,gBAAiB,QAAQ,SAAS,CACxC;GACH,KAAK,YACH,QAAO,IAAI,qBACT,QAAQ,YACR,MAAKA,gBAAiB,QAAQ,OAAO,EACrC,MAAKA,gBAAiB,QAAQ,OAAO,CACtC;GACH,KAAK,YACH,QAAO,IAAI,qBAAqB,QAAQ,YAAY,MAAKA,gBAAiB,QAAQ,OAAO,CAAC;GAC5F,KAAK,YACH,QAAO,IAAI,qBACT,QAAQ,YACR,QAAQ,SAAS,KAAK,WAAW,EAAE,GAAG,OAAO,EAAE,CAChD;GACH,SAAS;IACP,MAAMC,cAAqB;AAC3B,UAAM,IAAI,MAAM,yBAA0B,YAAiC,OAAO;;;;CAKxF,cAAc,OAA4B;AACxC,MAAI,iBAAiB,cACnB,QAAO,MAAM;AAEf,MAAI,UAAU,QAAQ,OAAO,UAAU,SACrC,QAAO;AAET,MAAI,iBAAiB,KACnB,QAAO;AAET,MAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,MAAM,MAAKC,aAAc,EAAE,CAAC;AAEhD,SAAO,MAAKF,gBAAiB,MAAmB;;CAGlD,iBAAiB,MAA2B;EAC1C,MAAMG,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,KAAK,CAC3C,QAAO,OAAO,MAAKD,aAAc,IAAI;AAEvC,SAAO;;;AAIX,SAAgB,qBAAmC;AACjD,QAAO,IAAI,kBAAkB"}
1
+ {"version":3,"file":"index.mjs","names":["mongoVectorOperationDescriptors: readonly OperationDescriptor[]","result: Record<string, unknown>","entries: Array<[string, unknown]>","aggExprLoweringVisitor: MongoAggExprVisitor<unknown>","loweredArgs: unknown","vars: Record<string, unknown>","_exhaustive: never","result: Record<string, unknown>","projection: Record<string, unknown>","lookup: Record<string, unknown>","unwind: Record<string, unknown>","group: Record<string, unknown>","unionWith: Record<string, unknown>","bucket: Record<string, unknown>","bucketAuto: Record<string, unknown>","geoNear: Record<string, unknown>","facet: Record<string, unknown>","graphLookup: Record<string, unknown>","merge: Record<string, unknown>","swf: Record<string, unknown>","output: Record<string, unknown>","densify: Record<string, unknown>","fill: Record<string, unknown>","entry: Record<string, unknown>","search: Record<string, unknown>","searchMeta: Record<string, unknown>","vs: Record<string, unknown>","result: Record<string, unknown>","_exhaustive: never"],"sources":["../src/core/operations.ts","../src/resolve-value.ts","../src/lowering.ts","../src/mongo-adapter.ts"],"sourcesContent":["import type { OperationDescriptor } from '@prisma-next/operations';\nimport { MONGO_INT32_CODEC_ID, MONGO_VECTOR_CODEC_ID } from './codec-ids';\n\nexport const mongoVectorNearOperation = Object.freeze({\n method: 'near',\n args: [{ codecId: MONGO_VECTOR_CODEC_ID, nullable: false }],\n returns: { codecId: MONGO_INT32_CODEC_ID, nullable: false },\n}) satisfies OperationDescriptor;\n\nexport const mongoVectorOperationDescriptors: readonly OperationDescriptor[] = [\n mongoVectorNearOperation,\n];\n","import type { MongoValue } from '@prisma-next/mongo-value';\nimport { MongoParamRef } from '@prisma-next/mongo-value';\n\nexport function resolveValue(value: MongoValue): unknown {\n if (value instanceof MongoParamRef) {\n return value.value;\n }\n if (value === null || typeof value !== 'object') {\n return value;\n }\n if (value instanceof Date) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v) => resolveValue(v));\n }\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = resolveValue(val);\n }\n return result;\n}\n","import type {\n MongoAggExpr,\n MongoAggExprVisitor,\n MongoFilterExpr,\n MongoGroupId,\n MongoPipelineStage,\n MongoProjectionValue,\n MongoWindowField,\n} from '@prisma-next/mongo-query-ast';\nimport { isExprArray, isRecordArgs } from '@prisma-next/mongo-query-ast';\nimport type { Document } from '@prisma-next/mongo-value';\nimport { resolveValue } from './resolve-value';\n\n// Biome flags `{ then: ... }` as a thenable object (noThenProperty). Build via Object.fromEntries to avoid.\nconst THEN_KEY = 'then';\n\nfunction condBranch(\n caseOrIf: MongoAggExpr,\n thenExpr: MongoAggExpr,\n elseExpr?: MongoAggExpr,\n): Record<string, unknown> {\n const entries: Array<[string, unknown]> = [\n [elseExpr ? 'if' : 'case', lowerAggExpr(caseOrIf)],\n [THEN_KEY, lowerAggExpr(thenExpr)],\n ];\n if (elseExpr) {\n entries.push(['else', lowerAggExpr(elseExpr)]);\n }\n return Object.fromEntries(entries);\n}\n\nconst aggExprLoweringVisitor: MongoAggExprVisitor<unknown> = {\n fieldRef(expr) {\n return `$${expr.path}`;\n },\n\n literal(expr) {\n return needsLiteralWrap(expr.value) ? { $literal: expr.value } : expr.value;\n },\n\n operator(expr) {\n const { args } = expr;\n let loweredArgs: unknown;\n if (isExprArray(args)) {\n loweredArgs = args.map((a) => lowerAggExpr(a));\n } else if (isRecordArgs(args)) {\n loweredArgs = lowerExprRecord(args);\n } else {\n loweredArgs = lowerAggExpr(args);\n }\n return { [expr.op]: loweredArgs };\n },\n\n accumulator(expr) {\n if (expr.arg === null) {\n return { [expr.op]: {} };\n }\n if (isRecordArgs(expr.arg)) {\n return { [expr.op]: lowerExprRecord(expr.arg) };\n }\n return { [expr.op]: lowerAggExpr(expr.arg) };\n },\n\n cond(expr) {\n return { $cond: condBranch(expr.condition, expr.then_, expr.else_) };\n },\n\n switch_(expr) {\n return {\n $switch: {\n branches: expr.branches.map((b) => condBranch(b.case_, b.then_)),\n default: lowerAggExpr(expr.default_),\n },\n };\n },\n\n filter(expr) {\n return {\n $filter: {\n input: lowerAggExpr(expr.input),\n cond: lowerAggExpr(expr.cond),\n as: expr.as,\n },\n };\n },\n\n map(expr) {\n return {\n $map: {\n input: lowerAggExpr(expr.input),\n in: lowerAggExpr(expr.in_),\n as: expr.as,\n },\n };\n },\n\n reduce(expr) {\n return {\n $reduce: {\n input: lowerAggExpr(expr.input),\n initialValue: lowerAggExpr(expr.initialValue),\n in: lowerAggExpr(expr.in_),\n },\n };\n },\n\n let_(expr) {\n const vars: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(expr.vars)) {\n vars[key] = lowerAggExpr(val);\n }\n return { $let: { vars, in: lowerAggExpr(expr.in_) } };\n },\n\n mergeObjects(expr) {\n return { $mergeObjects: expr.exprs.map((e) => lowerAggExpr(e)) };\n },\n};\n\nfunction needsLiteralWrap(value: unknown): boolean {\n if (typeof value === 'string' && value.startsWith('$')) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.some((v) => needsLiteralWrap(v));\n }\n if (value !== null && typeof value === 'object') {\n return Object.entries(value as Record<string, unknown>).some(\n ([k, v]) => k.startsWith('$') || needsLiteralWrap(v),\n );\n }\n return false;\n}\n\nexport function lowerAggExpr(expr: MongoAggExpr): unknown {\n return expr.accept(aggExprLoweringVisitor);\n}\n\nexport function lowerFilter(filter: MongoFilterExpr): Document {\n switch (filter.kind) {\n case 'field':\n return { [filter.field]: { [filter.op]: resolveValue(filter.value) } };\n case 'and':\n return { $and: filter.exprs.map((e) => lowerFilter(e)) };\n case 'or':\n return { $or: filter.exprs.map((e) => lowerFilter(e)) };\n case 'not':\n return { $nor: [lowerFilter(filter.expr)] };\n case 'exists':\n return { [filter.field]: { $exists: filter.exists } };\n case 'expr':\n return { $expr: lowerAggExpr(filter.aggExpr) };\n default: {\n const _exhaustive: never = filter;\n throw new Error(`Unhandled filter kind: ${(_exhaustive as MongoFilterExpr).kind}`);\n }\n }\n}\n\nfunction isAggExprNode(value: object): value is MongoAggExpr {\n return 'accept' in value && typeof value.accept === 'function';\n}\n\nfunction lowerGroupId(groupId: MongoGroupId): unknown {\n if (groupId === null) return null;\n if (isAggExprNode(groupId)) return lowerAggExpr(groupId);\n return lowerExprRecord(groupId);\n}\n\nfunction lowerExprRecord(\n fields: Readonly<Record<string, MongoAggExpr | ReadonlyArray<MongoAggExpr>>>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(fields)) {\n if (Array.isArray(val)) {\n result[key] = val.map((v: MongoAggExpr) => lowerAggExpr(v));\n } else {\n result[key] = lowerAggExpr(val as MongoAggExpr);\n }\n }\n return result;\n}\n\nfunction lowerProjectionValue(value: MongoProjectionValue): unknown {\n if (typeof value === 'number') return value;\n return lowerAggExpr(value);\n}\n\nfunction lowerWindowField(wf: MongoWindowField): Record<string, unknown> {\n const lowered = lowerAggExpr(wf.operator);\n if (typeof lowered !== 'object' || lowered === null) {\n throw new Error('Window field operator must lower to an object');\n }\n const result: Record<string, unknown> = { ...lowered };\n if (wf.window) {\n result['window'] = { ...wf.window };\n }\n return result;\n}\n\nexport function lowerStage(stage: MongoPipelineStage): Record<string, unknown> {\n switch (stage.kind) {\n case 'match':\n return { $match: lowerFilter(stage.filter) };\n case 'project': {\n const projection: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(stage.projection)) {\n projection[key] = lowerProjectionValue(val);\n }\n return { $project: projection };\n }\n case 'sort':\n return { $sort: { ...stage.sort } };\n case 'limit':\n return { $limit: stage.limit };\n case 'skip':\n return { $skip: stage.skip };\n case 'lookup': {\n const lookup: Record<string, unknown> = {\n from: stage.from,\n as: stage.as,\n };\n if (stage.localField !== undefined) lookup['localField'] = stage.localField;\n if (stage.foreignField !== undefined) lookup['foreignField'] = stage.foreignField;\n if (stage.pipeline) {\n lookup['pipeline'] = stage.pipeline.map((s) => lowerStage(s));\n }\n if (stage.let_) {\n lookup['let'] = lowerExprRecord(stage.let_);\n }\n return { $lookup: lookup };\n }\n case 'unwind': {\n const unwind: Record<string, unknown> = {\n path: stage.path,\n preserveNullAndEmptyArrays: stage.preserveNullAndEmptyArrays,\n };\n if (stage.includeArrayIndex !== undefined) {\n unwind['includeArrayIndex'] = stage.includeArrayIndex;\n }\n return { $unwind: unwind };\n }\n case 'group': {\n const group: Record<string, unknown> = { _id: lowerGroupId(stage.groupId) };\n for (const [key, acc] of Object.entries(stage.accumulators)) {\n group[key] = lowerAggExpr(acc);\n }\n return { $group: group };\n }\n case 'addFields':\n return { $addFields: lowerExprRecord(stage.fields) };\n case 'replaceRoot':\n return { $replaceRoot: { newRoot: lowerAggExpr(stage.newRoot) } };\n case 'count':\n return { $count: stage.field };\n case 'sortByCount':\n return { $sortByCount: lowerAggExpr(stage.expr) };\n case 'sample':\n return { $sample: { size: stage.size } };\n case 'redact':\n return { $redact: lowerAggExpr(stage.expr) };\n case 'out':\n return { $out: stage.db ? { db: stage.db, coll: stage.collection } : stage.collection };\n case 'unionWith': {\n const unionWith: Record<string, unknown> = { coll: stage.collection };\n if (stage.pipeline) {\n unionWith['pipeline'] = stage.pipeline.map((s) => lowerStage(s));\n }\n return { $unionWith: unionWith };\n }\n case 'bucket': {\n const bucket: Record<string, unknown> = {\n groupBy: lowerAggExpr(stage.groupBy),\n boundaries: [...stage.boundaries],\n };\n if (stage.default_ !== undefined) bucket['default'] = stage.default_;\n if (stage.output) bucket['output'] = lowerExprRecord(stage.output);\n return { $bucket: bucket };\n }\n case 'bucketAuto': {\n const bucketAuto: Record<string, unknown> = {\n groupBy: lowerAggExpr(stage.groupBy),\n buckets: stage.buckets,\n };\n if (stage.output) bucketAuto['output'] = lowerExprRecord(stage.output);\n if (stage.granularity !== undefined) bucketAuto['granularity'] = stage.granularity;\n return { $bucketAuto: bucketAuto };\n }\n case 'geoNear': {\n const geoNear: Record<string, unknown> = {\n near: stage.near,\n distanceField: stage.distanceField,\n };\n if (stage.spherical !== undefined) geoNear['spherical'] = stage.spherical;\n if (stage.maxDistance !== undefined) geoNear['maxDistance'] = stage.maxDistance;\n if (stage.minDistance !== undefined) geoNear['minDistance'] = stage.minDistance;\n if (stage.query) geoNear['query'] = lowerFilter(stage.query);\n if (stage.key !== undefined) geoNear['key'] = stage.key;\n if (stage.distanceMultiplier !== undefined)\n geoNear['distanceMultiplier'] = stage.distanceMultiplier;\n if (stage.includeLocs !== undefined) geoNear['includeLocs'] = stage.includeLocs;\n return { $geoNear: geoNear };\n }\n case 'facet': {\n const facet: Record<string, unknown> = {};\n for (const [key, pipeline] of Object.entries(stage.facets)) {\n facet[key] = pipeline.map((s) => lowerStage(s));\n }\n return { $facet: facet };\n }\n case 'graphLookup': {\n const graphLookup: Record<string, unknown> = {\n from: stage.from,\n startWith: lowerAggExpr(stage.startWith),\n connectFromField: stage.connectFromField,\n connectToField: stage.connectToField,\n as: stage.as,\n };\n if (stage.maxDepth !== undefined) graphLookup['maxDepth'] = stage.maxDepth;\n if (stage.depthField !== undefined) graphLookup['depthField'] = stage.depthField;\n if (stage.restrictSearchWithMatch)\n graphLookup['restrictSearchWithMatch'] = lowerFilter(stage.restrictSearchWithMatch);\n return { $graphLookup: graphLookup };\n }\n case 'merge': {\n const merge: Record<string, unknown> = { into: stage.into };\n if (stage.on !== undefined) merge['on'] = stage.on;\n if (stage.whenMatched !== undefined) {\n merge['whenMatched'] = Array.isArray(stage.whenMatched)\n ? stage.whenMatched.map((s) => lowerStage(s))\n : stage.whenMatched;\n }\n if (stage.whenNotMatched !== undefined) merge['whenNotMatched'] = stage.whenNotMatched;\n return { $merge: merge };\n }\n case 'setWindowFields': {\n const swf: Record<string, unknown> = {};\n if (stage.partitionBy) swf['partitionBy'] = lowerAggExpr(stage.partitionBy);\n if (stage.sortBy) swf['sortBy'] = { ...stage.sortBy };\n const output: Record<string, unknown> = {};\n for (const [key, wf] of Object.entries(stage.output)) {\n output[key] = lowerWindowField(wf);\n }\n swf['output'] = output;\n return { $setWindowFields: swf };\n }\n case 'densify': {\n const densify: Record<string, unknown> = {\n field: stage.field,\n range: { ...stage.range },\n };\n if (stage.partitionByFields) densify['partitionByFields'] = [...stage.partitionByFields];\n return { $densify: densify };\n }\n case 'fill': {\n const fill: Record<string, unknown> = {};\n if (stage.partitionBy) fill['partitionBy'] = lowerAggExpr(stage.partitionBy);\n if (stage.partitionByFields) fill['partitionByFields'] = [...stage.partitionByFields];\n if (stage.sortBy) fill['sortBy'] = { ...stage.sortBy };\n const output: Record<string, unknown> = {};\n for (const [key, fo] of Object.entries(stage.output)) {\n const entry: Record<string, unknown> = {};\n if (fo.method !== undefined) entry['method'] = fo.method;\n if (fo.value !== undefined) entry['value'] = lowerAggExpr(fo.value);\n output[key] = entry;\n }\n fill['output'] = output;\n return { $fill: fill };\n }\n case 'search': {\n const search: Record<string, unknown> = { ...stage.config };\n if (stage.index !== undefined) search['index'] = stage.index;\n return { $search: search };\n }\n case 'searchMeta': {\n const searchMeta: Record<string, unknown> = { ...stage.config };\n if (stage.index !== undefined) searchMeta['index'] = stage.index;\n return { $searchMeta: searchMeta };\n }\n case 'vectorSearch': {\n const vs: Record<string, unknown> = {\n index: stage.index,\n path: stage.path,\n queryVector: [...stage.queryVector],\n numCandidates: stage.numCandidates,\n limit: stage.limit,\n };\n if (stage.filter) vs['filter'] = { ...stage.filter };\n return { $vectorSearch: vs };\n }\n default: {\n const _exhaustive: never = stage;\n throw new Error(`Unhandled stage kind: ${(_exhaustive as MongoPipelineStage).kind}`);\n }\n }\n}\n\nexport function lowerPipeline(\n stages: ReadonlyArray<MongoPipelineStage>,\n): Array<Record<string, unknown>> {\n return stages.map(lowerStage);\n}\n","import type { MongoAdapter } from '@prisma-next/mongo-lowering';\nimport type {\n MongoQueryPlan,\n MongoUpdatePipelineStage,\n MongoUpdateSpec,\n} from '@prisma-next/mongo-query-ast';\nimport type { Document, MongoExpr } from '@prisma-next/mongo-value';\nimport type { AnyMongoWireCommand } from '@prisma-next/mongo-wire';\nimport {\n AggregateWireCommand,\n DeleteManyWireCommand,\n DeleteOneWireCommand,\n FindOneAndDeleteWireCommand,\n FindOneAndUpdateWireCommand,\n InsertManyWireCommand,\n InsertOneWireCommand,\n UpdateManyWireCommand,\n UpdateOneWireCommand,\n} from '@prisma-next/mongo-wire';\nimport { lowerFilter, lowerPipeline, lowerStage } from './lowering';\nimport { resolveValue } from './resolve-value';\n\nfunction resolveDocument(expr: MongoExpr): Document {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(expr)) {\n result[key] = resolveValue(val);\n }\n return result;\n}\n\nfunction isUpdatePipeline(\n update: MongoUpdateSpec,\n): update is ReadonlyArray<MongoUpdatePipelineStage> {\n return Array.isArray(update);\n}\n\nfunction lowerUpdate(update: MongoUpdateSpec): Document | ReadonlyArray<Document> {\n if (isUpdatePipeline(update)) {\n return update.map((stage) => lowerStage(stage));\n }\n return resolveDocument(update);\n}\n\nclass MongoAdapterImpl implements MongoAdapter {\n lower(plan: MongoQueryPlan): AnyMongoWireCommand {\n const { command } = plan;\n switch (command.kind) {\n case 'insertOne':\n return new InsertOneWireCommand(command.collection, resolveDocument(command.document));\n case 'updateOne':\n return new UpdateOneWireCommand(\n command.collection,\n lowerFilter(command.filter),\n lowerUpdate(command.update),\n );\n case 'insertMany':\n return new InsertManyWireCommand(\n command.collection,\n command.documents.map((doc) => resolveDocument(doc)),\n );\n case 'updateMany':\n return new UpdateManyWireCommand(\n command.collection,\n lowerFilter(command.filter),\n lowerUpdate(command.update),\n );\n case 'deleteOne':\n return new DeleteOneWireCommand(command.collection, lowerFilter(command.filter));\n case 'deleteMany':\n return new DeleteManyWireCommand(command.collection, lowerFilter(command.filter));\n case 'findOneAndUpdate':\n return new FindOneAndUpdateWireCommand(\n command.collection,\n lowerFilter(command.filter),\n lowerUpdate(command.update),\n command.upsert,\n );\n case 'findOneAndDelete':\n return new FindOneAndDeleteWireCommand(command.collection, lowerFilter(command.filter));\n case 'aggregate':\n return new AggregateWireCommand(command.collection, lowerPipeline(command.pipeline));\n case 'rawAggregate':\n return new AggregateWireCommand(command.collection, command.pipeline);\n case 'rawInsertOne':\n return new InsertOneWireCommand(command.collection, command.document);\n case 'rawInsertMany':\n return new InsertManyWireCommand(command.collection, command.documents);\n case 'rawUpdateOne':\n return new UpdateOneWireCommand(command.collection, command.filter, command.update);\n case 'rawUpdateMany':\n return new UpdateManyWireCommand(command.collection, command.filter, command.update);\n case 'rawDeleteOne':\n return new DeleteOneWireCommand(command.collection, command.filter);\n case 'rawDeleteMany':\n return new DeleteManyWireCommand(command.collection, command.filter);\n case 'rawFindOneAndUpdate':\n return new FindOneAndUpdateWireCommand(\n command.collection,\n command.filter,\n command.update,\n command.upsert,\n );\n case 'rawFindOneAndDelete':\n return new FindOneAndDeleteWireCommand(command.collection, command.filter);\n // v8 ignore next 4\n default: {\n const _exhaustive: never = command;\n throw new Error(`Unknown command kind: ${(_exhaustive as { kind: string }).kind}`);\n }\n }\n }\n}\n\nexport function createMongoAdapter(): MongoAdapter {\n return new MongoAdapterImpl();\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,18 +1,25 @@
1
1
  {
2
2
  "name": "@prisma-next/adapter-mongo",
3
- "version": "0.3.0-dev.135",
3
+ "version": "0.3.0-dev.147",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "MongoDB adapter for Prisma Next (lowers commands to wire format)",
7
7
  "dependencies": {
8
8
  "mongodb": "^6.16.0",
9
- "@prisma-next/mongo-core": "0.3.0-dev.135"
9
+ "@prisma-next/config": "0.3.0-dev.147",
10
+ "@prisma-next/framework-components": "0.3.0-dev.147",
11
+ "@prisma-next/mongo-lowering": "0.3.0-dev.147",
12
+ "@prisma-next/mongo-value": "0.3.0-dev.147",
13
+ "@prisma-next/mongo-codec": "0.3.0-dev.147",
14
+ "@prisma-next/mongo-query-ast": "0.3.0-dev.147",
15
+ "@prisma-next/operations": "0.3.0-dev.147",
16
+ "@prisma-next/mongo-wire": "0.3.0-dev.147"
10
17
  },
11
18
  "devDependencies": {
12
19
  "tsdown": "0.18.4",
13
20
  "typescript": "5.9.3",
14
21
  "vitest": "4.0.17",
15
- "@prisma-next/contract": "0.3.0-dev.135",
22
+ "@prisma-next/contract": "0.3.0-dev.147",
16
23
  "@prisma-next/tsconfig": "0.0.0",
17
24
  "@prisma-next/test-utils": "0.0.1",
18
25
  "@prisma-next/tsdown": "0.0.0"
@@ -24,6 +31,7 @@
24
31
  "exports": {
25
32
  ".": "./dist/index.mjs",
26
33
  "./codec-types": "./dist/codec-types.mjs",
34
+ "./control": "./dist/control.mjs",
27
35
  "./package.json": "./package.json"
28
36
  },
29
37
  "main": "./dist/index.mjs",
@@ -1,5 +1,7 @@
1
1
  export const MONGO_OBJECTID_CODEC_ID = 'mongo/objectId@1' as const;
2
2
  export const MONGO_STRING_CODEC_ID = 'mongo/string@1' as const;
3
+ export const MONGO_DOUBLE_CODEC_ID = 'mongo/double@1' as const;
3
4
  export const MONGO_INT32_CODEC_ID = 'mongo/int32@1' as const;
4
5
  export const MONGO_BOOLEAN_CODEC_ID = 'mongo/bool@1' as const;
5
6
  export const MONGO_DATE_CODEC_ID = 'mongo/date@1' as const;
7
+ export const MONGO_VECTOR_CODEC_ID = 'mongo/vector@1' as const;
@@ -1,16 +1,19 @@
1
- import { mongoCodec } from '@prisma-next/mongo-core';
1
+ import { mongoCodec } from '@prisma-next/mongo-codec';
2
2
  import { ObjectId } from 'mongodb';
3
3
  import {
4
4
  MONGO_BOOLEAN_CODEC_ID,
5
5
  MONGO_DATE_CODEC_ID,
6
+ MONGO_DOUBLE_CODEC_ID,
6
7
  MONGO_INT32_CODEC_ID,
7
8
  MONGO_OBJECTID_CODEC_ID,
8
9
  MONGO_STRING_CODEC_ID,
10
+ MONGO_VECTOR_CODEC_ID,
9
11
  } from './codec-ids';
10
12
 
11
13
  export const mongoObjectIdCodec = mongoCodec({
12
14
  typeId: MONGO_OBJECTID_CODEC_ID,
13
15
  targetTypes: ['objectId'],
16
+ traits: ['equality'],
14
17
  decode: (wire: ObjectId) => wire.toHexString(),
15
18
  encode: (value: string) => new ObjectId(value),
16
19
  });
@@ -18,13 +21,23 @@ export const mongoObjectIdCodec = mongoCodec({
18
21
  export const mongoStringCodec = mongoCodec({
19
22
  typeId: MONGO_STRING_CODEC_ID,
20
23
  targetTypes: ['string'],
24
+ traits: ['equality', 'order', 'textual'],
21
25
  decode: (wire: string) => wire,
22
26
  encode: (value: string) => value,
23
27
  });
24
28
 
29
+ export const mongoDoubleCodec = mongoCodec({
30
+ typeId: MONGO_DOUBLE_CODEC_ID,
31
+ targetTypes: ['float'],
32
+ traits: ['equality', 'order', 'numeric'],
33
+ decode: (wire: number) => wire,
34
+ encode: (value: number) => value,
35
+ });
36
+
25
37
  export const mongoInt32Codec = mongoCodec({
26
38
  typeId: MONGO_INT32_CODEC_ID,
27
39
  targetTypes: ['int'],
40
+ traits: ['equality', 'order', 'numeric'],
28
41
  decode: (wire: number) => wire,
29
42
  encode: (value: number) => value,
30
43
  });
@@ -32,6 +45,7 @@ export const mongoInt32Codec = mongoCodec({
32
45
  export const mongoBooleanCodec = mongoCodec({
33
46
  typeId: MONGO_BOOLEAN_CODEC_ID,
34
47
  targetTypes: ['bool'],
48
+ traits: ['equality', 'boolean'],
35
49
  decode: (wire: boolean) => wire,
36
50
  encode: (value: boolean) => value,
37
51
  });
@@ -39,6 +53,23 @@ export const mongoBooleanCodec = mongoCodec({
39
53
  export const mongoDateCodec = mongoCodec({
40
54
  typeId: MONGO_DATE_CODEC_ID,
41
55
  targetTypes: ['date'],
56
+ traits: ['equality', 'order'],
42
57
  decode: (wire: Date) => wire,
43
58
  encode: (value: Date) => value,
44
59
  });
60
+
61
+ export const mongoVectorCodec = mongoCodec({
62
+ typeId: MONGO_VECTOR_CODEC_ID,
63
+ targetTypes: ['vector'],
64
+ traits: ['equality'],
65
+ decode: (wire: readonly number[]) => wire,
66
+ encode: (value: readonly number[]) => value,
67
+ renderOutputType: (typeParams) => {
68
+ const length = typeParams['length'];
69
+ if (length === undefined) return undefined;
70
+ if (typeof length !== 'number' || !Number.isFinite(length) || !Number.isInteger(length)) {
71
+ throw new Error('renderOutputType: expected positive integer "length" for Vector');
72
+ }
73
+ return `Vector<${length}>`;
74
+ },
75
+ });
@@ -0,0 +1,12 @@
1
+ import type { OperationDescriptor } from '@prisma-next/operations';
2
+ import { MONGO_INT32_CODEC_ID, MONGO_VECTOR_CODEC_ID } from './codec-ids';
3
+
4
+ export const mongoVectorNearOperation = Object.freeze({
5
+ method: 'near',
6
+ args: [{ codecId: MONGO_VECTOR_CODEC_ID, nullable: false }],
7
+ returns: { codecId: MONGO_INT32_CODEC_ID, nullable: false },
8
+ }) satisfies OperationDescriptor;
9
+
10
+ export const mongoVectorOperationDescriptors: readonly OperationDescriptor[] = [
11
+ mongoVectorNearOperation,
12
+ ];
@@ -1,7 +1,16 @@
1
+ export type Vector<N extends number = number> = readonly number[] & {
2
+ readonly __vectorLength?: N;
3
+ };
4
+
1
5
  export type CodecTypes = {
2
6
  readonly 'mongo/objectId@1': { readonly input: string; readonly output: string };
3
7
  readonly 'mongo/string@1': { readonly input: string; readonly output: string };
8
+ readonly 'mongo/double@1': { readonly input: number; readonly output: number };
4
9
  readonly 'mongo/int32@1': { readonly input: number; readonly output: number };
5
10
  readonly 'mongo/bool@1': { readonly input: boolean; readonly output: boolean };
6
11
  readonly 'mongo/date@1': { readonly input: Date; readonly output: Date };
12
+ readonly 'mongo/vector@1': {
13
+ readonly input: readonly number[];
14
+ readonly output: readonly number[];
15
+ };
7
16
  };
@@ -0,0 +1,48 @@
1
+ import type { ControlAdapterDescriptor } from '@prisma-next/framework-components/control';
2
+ import {
3
+ mongoBooleanCodec,
4
+ mongoDateCodec,
5
+ mongoDoubleCodec,
6
+ mongoInt32Codec,
7
+ mongoObjectIdCodec,
8
+ mongoStringCodec,
9
+ mongoVectorCodec,
10
+ } from '../core/codecs';
11
+
12
+ const mongoAdapterDescriptor: ControlAdapterDescriptor<'mongo', 'mongo'> = {
13
+ kind: 'adapter',
14
+ id: 'mongo',
15
+ familyId: 'mongo',
16
+ targetId: 'mongo',
17
+ version: '0.0.1',
18
+ types: {
19
+ codecTypes: {
20
+ codecInstances: [
21
+ mongoObjectIdCodec,
22
+ mongoStringCodec,
23
+ mongoDoubleCodec,
24
+ mongoInt32Codec,
25
+ mongoBooleanCodec,
26
+ mongoDateCodec,
27
+ mongoVectorCodec,
28
+ ],
29
+ import: {
30
+ package: '@prisma-next/adapter-mongo/codec-types',
31
+ named: 'CodecTypes',
32
+ alias: 'MongoCodecTypes',
33
+ },
34
+ typeImports: [
35
+ {
36
+ package: '@prisma-next/adapter-mongo/codec-types',
37
+ named: 'Vector',
38
+ alias: 'Vector',
39
+ },
40
+ ],
41
+ },
42
+ },
43
+ create() {
44
+ return { familyId: 'mongo' as const, targetId: 'mongo' as const };
45
+ },
46
+ };
47
+
48
+ export default mongoAdapterDescriptor;
@@ -1 +1,3 @@
1
+ export { mongoVectorNearOperation, mongoVectorOperationDescriptors } from '../core/operations';
2
+ export { lowerAggExpr, lowerFilter, lowerPipeline, lowerStage } from '../lowering';
1
3
  export { createMongoAdapter } from '../mongo-adapter';