@prisma-next/mongo-orm 0.3.0-dev.130 → 0.3.0-dev.132
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +9 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/src/mongo-orm.ts +1 -1
- package/src/types.ts +38 -17
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ExtractMongoCodecTypes, InferModelRow, MongoContract, MongoContractWithTypeMaps, MongoQueryPlan, MongoTypeMaps } from "@prisma-next/mongo-core";
|
|
2
|
-
import { DomainReferenceRelation
|
|
2
|
+
import { DomainReferenceRelation } from "@prisma-next/contract/types";
|
|
3
3
|
import { AsyncIterableResult } from "@prisma-next/runtime-executor";
|
|
4
4
|
|
|
5
5
|
//#region src/types.d.ts
|
|
@@ -11,11 +11,14 @@ interface MongoOrmOptions<TContract extends MongoContract> {
|
|
|
11
11
|
readonly executor: MongoQueryExecutor;
|
|
12
12
|
}
|
|
13
13
|
type Simplify<T> = T extends unknown ? { [K in keyof T]: T[K] } : never;
|
|
14
|
-
type
|
|
14
|
+
type ModelRelations<TContract extends MongoContract, ModelName extends string & keyof TContract['models']> = NonNullable<TContract['models'][ModelName]['relations']>;
|
|
15
|
+
type ReferenceRelationKeys<TContract extends MongoContract, ModelName extends string & keyof TContract['models']> = { [K in keyof ModelRelations<TContract, ModelName>]: ModelRelations<TContract, ModelName>[K] extends DomainReferenceRelation ? K : never }[keyof ModelRelations<TContract, ModelName>];
|
|
16
|
+
type EmbedRelationKeys<TContract extends MongoContract, ModelName extends string & keyof TContract['models']> = { [K in keyof ModelRelations<TContract, ModelName>]: ModelRelations<TContract, ModelName>[K] extends DomainReferenceRelation ? never : K }[keyof ModelRelations<TContract, ModelName>];
|
|
17
|
+
type EmbedRelationRowType<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models'], RelKey extends keyof ModelRelations<TContract, ModelName>> = ModelRelations<TContract, ModelName>[RelKey] extends {
|
|
15
18
|
readonly to: infer To extends string & keyof TContract['models'];
|
|
16
19
|
readonly cardinality: infer C;
|
|
17
|
-
} ? TContract
|
|
18
|
-
type InferFullRow<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models']> = EmbedRelationKeys<TContract, ModelName> extends never ? InferModelRow<TContract, ModelName> : InferModelRow<TContract, ModelName> & { -readonly [K in EmbedRelationKeys<TContract, ModelName> & keyof TContract
|
|
20
|
+
} ? ModelRelations<TContract, ModelName>[RelKey] extends DomainReferenceRelation ? never : C extends '1:N' ? InferModelRow<TContract, To>[] : InferModelRow<TContract, To> : never;
|
|
21
|
+
type InferFullRow<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models']> = EmbedRelationKeys<TContract, ModelName> extends never ? InferModelRow<TContract, ModelName> : InferModelRow<TContract, ModelName> & { -readonly [K in EmbedRelationKeys<TContract, ModelName> & keyof ModelRelations<TContract, ModelName>]: EmbedRelationRowType<TContract, ModelName, K> };
|
|
19
22
|
type VariantRow<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models']> = TContract['models'][ModelName] extends {
|
|
20
23
|
readonly discriminator: {
|
|
21
24
|
readonly field: infer DiscField extends string;
|
|
@@ -25,11 +28,11 @@ type VariantRow<TContract extends MongoContractWithTypeMaps<MongoContract, Mongo
|
|
|
25
28
|
readonly value: string;
|
|
26
29
|
}> ? { [VK in keyof V]: VK extends string & keyof TContract['models'] ? Simplify<Omit<InferFullRow<TContract, ModelName>, DiscField> & InferFullRow<TContract, VK> & Record<DiscField, V[VK]['value']>> : never }[keyof V] : InferFullRow<TContract, ModelName> : InferFullRow<TContract, ModelName>;
|
|
27
30
|
type InferRootRow<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models']> = VariantRow<TContract, ModelName>;
|
|
28
|
-
type IncludeRelationRowType<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models'], RelKey extends keyof TContract
|
|
31
|
+
type IncludeRelationRowType<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models'], RelKey extends keyof ModelRelations<TContract, ModelName>> = ModelRelations<TContract, ModelName>[RelKey] extends DomainReferenceRelation ? ModelRelations<TContract, ModelName>[RelKey] extends {
|
|
29
32
|
readonly to: infer To extends string & keyof TContract['models'];
|
|
30
33
|
readonly cardinality: infer C;
|
|
31
34
|
} ? C extends 'N:1' | '1:1' ? InferFullRow<TContract, To> | null : InferFullRow<TContract, To>[] : never : never;
|
|
32
|
-
type IncludeResultFields<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models'], TInclude extends MongoIncludeSpec<TContract, ModelName>> = { -readonly [K in keyof TInclude & string as TInclude[K] extends true ? K : never]: K extends keyof TContract
|
|
35
|
+
type IncludeResultFields<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models'], TInclude extends MongoIncludeSpec<TContract, ModelName>> = { -readonly [K in keyof TInclude & string as TInclude[K] extends true ? K : never]: K extends keyof ModelRelations<TContract, ModelName> ? IncludeRelationRowType<TContract, ModelName, K> : never };
|
|
33
36
|
type MongoWhereFilter<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models'], TCodecTypes extends Record<string, {
|
|
34
37
|
output: unknown;
|
|
35
38
|
}> = ExtractMongoCodecTypes<TContract>> = { readonly [K in keyof TContract['models'][ModelName]['fields']]?: TContract['models'][ModelName]['fields'][K] extends {
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/mongo-orm.ts"],"sourcesContent":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/mongo-orm.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -14,7 +14,7 @@ function buildLookupStages(contract, model, include) {
|
|
|
14
14
|
const stages = [];
|
|
15
15
|
for (const [relName, shouldInclude] of Object.entries(include)) {
|
|
16
16
|
if (!shouldInclude) continue;
|
|
17
|
-
const relation = model.relations[relName];
|
|
17
|
+
const relation = model.relations?.[relName];
|
|
18
18
|
if (!relation) continue;
|
|
19
19
|
const targetModel = contract.models[relation.to];
|
|
20
20
|
if (!targetModel || targetModel.owner) continue;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["stubMeta: PlanMeta","stages: Record<string, unknown>[]","#contract","#modelName","#executor","plan: MongoQueryPlan","pipeline: Record<string, unknown>[]","client: Record<string, unknown>"],"sources":["../src/mongo-orm.ts"],"sourcesContent":["import type { DomainReferenceRelation, PlanMeta } from '@prisma-next/contract/types';\nimport {\n AggregateCommand,\n FindCommand,\n type MongoContract,\n type MongoContractWithTypeMaps,\n type MongoExpr,\n type MongoModelDefinition,\n type MongoQueryPlan,\n type MongoTypeMaps,\n} from '@prisma-next/mongo-core';\nimport type { AsyncIterableResult } from '@prisma-next/runtime-executor';\nimport type {\n MongoFindManyOptions,\n MongoIncludeSpec,\n MongoOrmClient,\n MongoOrmOptions,\n MongoQueryExecutor,\n} from './types';\n\nconst stubMeta: PlanMeta = {\n target: 'mongo',\n storageHash: 'orm',\n lane: 'mongo-orm',\n paramDescriptors: [],\n};\n\nfunction resolveCollection(model: MongoModelDefinition, modelName: string): string {\n return model.storage.collection ?? modelName;\n}\n\nfunction buildLookupStages(\n contract: MongoContract,\n model: MongoModelDefinition,\n include: Record<string, true>,\n): Record<string, unknown>[] {\n const stages: Record<string, unknown>[] = [];\n\n for (const [relName, shouldInclude] of Object.entries(include)) {\n if (!shouldInclude) continue;\n\n const relation = model.relations[relName];\n if (!relation) continue;\n\n const targetModel = contract.models[relation.to];\n if (!targetModel || targetModel.owner) continue;\n\n const ref = relation as DomainReferenceRelation;\n\n if (ref.on.localFields.length !== 1 || ref.on.targetFields.length !== 1) {\n throw new Error(\n `Compound references are not yet supported: relation \"${relName}\" has ${ref.on.localFields.length} local field(s) and ${ref.on.targetFields.length} target field(s)`,\n );\n }\n\n const targetCollection = resolveCollection(targetModel, ref.to);\n\n stages.push({\n $lookup: {\n from: targetCollection,\n localField: ref.on.localFields[0],\n foreignField: ref.on.targetFields[0],\n as: relName,\n },\n });\n\n if (ref.cardinality === 'N:1' || ref.cardinality === '1:1') {\n stages.push({\n $unwind: {\n path: `$${relName}`,\n preserveNullAndEmptyArrays: true,\n },\n });\n }\n }\n\n return stages;\n}\n\nclass MongoCollectionImpl<\n TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>,\n ModelName extends string & keyof TContract['models'],\n> {\n readonly #contract: TContract;\n readonly #modelName: ModelName;\n readonly #executor: MongoQueryExecutor;\n\n constructor(contract: TContract, modelName: ModelName, executor: MongoQueryExecutor) {\n this.#contract = contract;\n this.#modelName = modelName;\n this.#executor = executor;\n }\n\n findMany<TInclude extends MongoIncludeSpec<TContract, ModelName> = Record<string, never>>(\n options?: MongoFindManyOptions<TContract, ModelName, TInclude>,\n ): AsyncIterableResult<unknown> {\n const model = this.#contract.models[this.#modelName] as MongoModelDefinition;\n const collection = resolveCollection(model, this.#modelName as string);\n const filter = options?.where ? (options.where as unknown as MongoExpr) : undefined;\n const include = options?.include as Record<string, true> | undefined;\n\n const hasIncludes = include && Object.keys(include).length > 0;\n\n let plan: MongoQueryPlan;\n if (hasIncludes) {\n const pipeline: Record<string, unknown>[] = [];\n\n if (filter && Object.keys(filter as Record<string, unknown>).length > 0) {\n pipeline.push({ $match: filter });\n }\n\n pipeline.push(...buildLookupStages(this.#contract, model, include));\n\n plan = {\n command: new AggregateCommand(collection, pipeline),\n meta: stubMeta,\n };\n } else {\n plan = {\n command: new FindCommand(collection, filter),\n meta: stubMeta,\n };\n }\n\n return this.#executor.execute(plan);\n }\n}\n\nexport function mongoOrm<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>>(\n options: MongoOrmOptions<TContract>,\n): MongoOrmClient<TContract> {\n const { contract, executor } = options;\n const client: Record<string, unknown> = {};\n\n for (const [rootName, modelName] of Object.entries(contract.roots)) {\n client[rootName] = new MongoCollectionImpl(\n contract,\n modelName as string & keyof TContract['models'],\n executor,\n );\n }\n\n return client as MongoOrmClient<TContract>;\n}\n"],"mappings":";;;AAoBA,MAAMA,WAAqB;CACzB,QAAQ;CACR,aAAa;CACb,MAAM;CACN,kBAAkB,EAAE;CACrB;AAED,SAAS,kBAAkB,OAA6B,WAA2B;AACjF,QAAO,MAAM,QAAQ,cAAc;;AAGrC,SAAS,kBACP,UACA,OACA,SAC2B;CAC3B,MAAMC,SAAoC,EAAE;AAE5C,MAAK,MAAM,CAAC,SAAS,kBAAkB,OAAO,QAAQ,QAAQ,EAAE;AAC9D,MAAI,CAAC,cAAe;EAEpB,MAAM,WAAW,MAAM,
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["stubMeta: PlanMeta","stages: Record<string, unknown>[]","#contract","#modelName","#executor","plan: MongoQueryPlan","pipeline: Record<string, unknown>[]","client: Record<string, unknown>"],"sources":["../src/mongo-orm.ts"],"sourcesContent":["import type { DomainReferenceRelation, PlanMeta } from '@prisma-next/contract/types';\nimport {\n AggregateCommand,\n FindCommand,\n type MongoContract,\n type MongoContractWithTypeMaps,\n type MongoExpr,\n type MongoModelDefinition,\n type MongoQueryPlan,\n type MongoTypeMaps,\n} from '@prisma-next/mongo-core';\nimport type { AsyncIterableResult } from '@prisma-next/runtime-executor';\nimport type {\n MongoFindManyOptions,\n MongoIncludeSpec,\n MongoOrmClient,\n MongoOrmOptions,\n MongoQueryExecutor,\n} from './types';\n\nconst stubMeta: PlanMeta = {\n target: 'mongo',\n storageHash: 'orm',\n lane: 'mongo-orm',\n paramDescriptors: [],\n};\n\nfunction resolveCollection(model: MongoModelDefinition, modelName: string): string {\n return model.storage.collection ?? modelName;\n}\n\nfunction buildLookupStages(\n contract: MongoContract,\n model: MongoModelDefinition,\n include: Record<string, true>,\n): Record<string, unknown>[] {\n const stages: Record<string, unknown>[] = [];\n\n for (const [relName, shouldInclude] of Object.entries(include)) {\n if (!shouldInclude) continue;\n\n const relation = model.relations?.[relName];\n if (!relation) continue;\n\n const targetModel = contract.models[relation.to];\n if (!targetModel || targetModel.owner) continue;\n\n const ref = relation as DomainReferenceRelation;\n\n if (ref.on.localFields.length !== 1 || ref.on.targetFields.length !== 1) {\n throw new Error(\n `Compound references are not yet supported: relation \"${relName}\" has ${ref.on.localFields.length} local field(s) and ${ref.on.targetFields.length} target field(s)`,\n );\n }\n\n const targetCollection = resolveCollection(targetModel, ref.to);\n\n stages.push({\n $lookup: {\n from: targetCollection,\n localField: ref.on.localFields[0],\n foreignField: ref.on.targetFields[0],\n as: relName,\n },\n });\n\n if (ref.cardinality === 'N:1' || ref.cardinality === '1:1') {\n stages.push({\n $unwind: {\n path: `$${relName}`,\n preserveNullAndEmptyArrays: true,\n },\n });\n }\n }\n\n return stages;\n}\n\nclass MongoCollectionImpl<\n TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>,\n ModelName extends string & keyof TContract['models'],\n> {\n readonly #contract: TContract;\n readonly #modelName: ModelName;\n readonly #executor: MongoQueryExecutor;\n\n constructor(contract: TContract, modelName: ModelName, executor: MongoQueryExecutor) {\n this.#contract = contract;\n this.#modelName = modelName;\n this.#executor = executor;\n }\n\n findMany<TInclude extends MongoIncludeSpec<TContract, ModelName> = Record<string, never>>(\n options?: MongoFindManyOptions<TContract, ModelName, TInclude>,\n ): AsyncIterableResult<unknown> {\n const model = this.#contract.models[this.#modelName] as MongoModelDefinition;\n const collection = resolveCollection(model, this.#modelName as string);\n const filter = options?.where ? (options.where as unknown as MongoExpr) : undefined;\n const include = options?.include as Record<string, true> | undefined;\n\n const hasIncludes = include && Object.keys(include).length > 0;\n\n let plan: MongoQueryPlan;\n if (hasIncludes) {\n const pipeline: Record<string, unknown>[] = [];\n\n if (filter && Object.keys(filter as Record<string, unknown>).length > 0) {\n pipeline.push({ $match: filter });\n }\n\n pipeline.push(...buildLookupStages(this.#contract, model, include));\n\n plan = {\n command: new AggregateCommand(collection, pipeline),\n meta: stubMeta,\n };\n } else {\n plan = {\n command: new FindCommand(collection, filter),\n meta: stubMeta,\n };\n }\n\n return this.#executor.execute(plan);\n }\n}\n\nexport function mongoOrm<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>>(\n options: MongoOrmOptions<TContract>,\n): MongoOrmClient<TContract> {\n const { contract, executor } = options;\n const client: Record<string, unknown> = {};\n\n for (const [rootName, modelName] of Object.entries(contract.roots)) {\n client[rootName] = new MongoCollectionImpl(\n contract,\n modelName as string & keyof TContract['models'],\n executor,\n );\n }\n\n return client as MongoOrmClient<TContract>;\n}\n"],"mappings":";;;AAoBA,MAAMA,WAAqB;CACzB,QAAQ;CACR,aAAa;CACb,MAAM;CACN,kBAAkB,EAAE;CACrB;AAED,SAAS,kBAAkB,OAA6B,WAA2B;AACjF,QAAO,MAAM,QAAQ,cAAc;;AAGrC,SAAS,kBACP,UACA,OACA,SAC2B;CAC3B,MAAMC,SAAoC,EAAE;AAE5C,MAAK,MAAM,CAAC,SAAS,kBAAkB,OAAO,QAAQ,QAAQ,EAAE;AAC9D,MAAI,CAAC,cAAe;EAEpB,MAAM,WAAW,MAAM,YAAY;AACnC,MAAI,CAAC,SAAU;EAEf,MAAM,cAAc,SAAS,OAAO,SAAS;AAC7C,MAAI,CAAC,eAAe,YAAY,MAAO;EAEvC,MAAM,MAAM;AAEZ,MAAI,IAAI,GAAG,YAAY,WAAW,KAAK,IAAI,GAAG,aAAa,WAAW,EACpE,OAAM,IAAI,MACR,wDAAwD,QAAQ,QAAQ,IAAI,GAAG,YAAY,OAAO,sBAAsB,IAAI,GAAG,aAAa,OAAO,kBACpJ;EAGH,MAAM,mBAAmB,kBAAkB,aAAa,IAAI,GAAG;AAE/D,SAAO,KAAK,EACV,SAAS;GACP,MAAM;GACN,YAAY,IAAI,GAAG,YAAY;GAC/B,cAAc,IAAI,GAAG,aAAa;GAClC,IAAI;GACL,EACF,CAAC;AAEF,MAAI,IAAI,gBAAgB,SAAS,IAAI,gBAAgB,MACnD,QAAO,KAAK,EACV,SAAS;GACP,MAAM,IAAI;GACV,4BAA4B;GAC7B,EACF,CAAC;;AAIN,QAAO;;AAGT,IAAM,sBAAN,MAGE;CACA,CAASC;CACT,CAASC;CACT,CAASC;CAET,YAAY,UAAqB,WAAsB,UAA8B;AACnF,QAAKF,WAAY;AACjB,QAAKC,YAAa;AAClB,QAAKC,WAAY;;CAGnB,SACE,SAC8B;EAC9B,MAAM,QAAQ,MAAKF,SAAU,OAAO,MAAKC;EACzC,MAAM,aAAa,kBAAkB,OAAO,MAAKA,UAAqB;EACtE,MAAM,SAAS,SAAS,QAAS,QAAQ,QAAiC;EAC1E,MAAM,UAAU,SAAS;EAEzB,MAAM,cAAc,WAAW,OAAO,KAAK,QAAQ,CAAC,SAAS;EAE7D,IAAIE;AACJ,MAAI,aAAa;GACf,MAAMC,WAAsC,EAAE;AAE9C,OAAI,UAAU,OAAO,KAAK,OAAkC,CAAC,SAAS,EACpE,UAAS,KAAK,EAAE,QAAQ,QAAQ,CAAC;AAGnC,YAAS,KAAK,GAAG,kBAAkB,MAAKJ,UAAW,OAAO,QAAQ,CAAC;AAEnE,UAAO;IACL,SAAS,IAAI,iBAAiB,YAAY,SAAS;IACnD,MAAM;IACP;QAED,QAAO;GACL,SAAS,IAAI,YAAY,YAAY,OAAO;GAC5C,MAAM;GACP;AAGH,SAAO,MAAKE,SAAU,QAAQ,KAAK;;;AAIvC,SAAgB,SACd,SAC2B;CAC3B,MAAM,EAAE,UAAU,aAAa;CAC/B,MAAMG,SAAkC,EAAE;AAE1C,MAAK,MAAM,CAAC,UAAU,cAAc,OAAO,QAAQ,SAAS,MAAM,CAChE,QAAO,YAAY,IAAI,oBACrB,UACA,WACA,SACD;AAGH,QAAO"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/mongo-orm",
|
|
3
|
-
"version": "0.3.0-dev.
|
|
3
|
+
"version": "0.3.0-dev.132",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "MongoDB ORM client for Prisma Next",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@prisma-next/contract": "0.3.0-dev.
|
|
9
|
-
"@prisma-next/mongo-core": "0.3.0-dev.
|
|
10
|
-
"@prisma-next/runtime-executor": "0.3.0-dev.
|
|
8
|
+
"@prisma-next/contract": "0.3.0-dev.132",
|
|
9
|
+
"@prisma-next/mongo-core": "0.3.0-dev.132",
|
|
10
|
+
"@prisma-next/runtime-executor": "0.3.0-dev.132"
|
|
11
11
|
},
|
|
12
12
|
"devDependencies": {
|
|
13
13
|
"tsdown": "0.18.4",
|
|
14
14
|
"typescript": "5.9.3",
|
|
15
15
|
"vitest": "4.0.17",
|
|
16
|
-
"@prisma-next/tsconfig": "0.0.0",
|
|
17
16
|
"@prisma-next/test-utils": "0.0.1",
|
|
18
|
-
"@prisma-next/tsdown": "0.0.0"
|
|
17
|
+
"@prisma-next/tsdown": "0.0.0",
|
|
18
|
+
"@prisma-next/tsconfig": "0.0.0"
|
|
19
19
|
},
|
|
20
20
|
"files": [
|
|
21
21
|
"dist",
|
package/src/mongo-orm.ts
CHANGED
|
@@ -39,7 +39,7 @@ function buildLookupStages(
|
|
|
39
39
|
for (const [relName, shouldInclude] of Object.entries(include)) {
|
|
40
40
|
if (!shouldInclude) continue;
|
|
41
41
|
|
|
42
|
-
const relation = model.relations[relName];
|
|
42
|
+
const relation = model.relations?.[relName];
|
|
43
43
|
if (!relation) continue;
|
|
44
44
|
|
|
45
45
|
const targetModel = contract.models[relation.to];
|
package/src/types.ts
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
DomainReferenceRelation,
|
|
3
|
-
EmbedRelationKeys,
|
|
4
|
-
ReferenceRelationKeys,
|
|
5
|
-
} from '@prisma-next/contract/types';
|
|
1
|
+
import type { DomainReferenceRelation } from '@prisma-next/contract/types';
|
|
6
2
|
import type {
|
|
7
3
|
ExtractMongoCodecTypes,
|
|
8
4
|
InferModelRow,
|
|
@@ -24,15 +20,44 @@ export interface MongoOrmOptions<TContract extends MongoContract> {
|
|
|
24
20
|
|
|
25
21
|
type Simplify<T> = T extends unknown ? { [K in keyof T]: T[K] } : never;
|
|
26
22
|
|
|
23
|
+
type ModelRelations<
|
|
24
|
+
TContract extends MongoContract,
|
|
25
|
+
ModelName extends string & keyof TContract['models'],
|
|
26
|
+
> = NonNullable<TContract['models'][ModelName]['relations']>;
|
|
27
|
+
|
|
28
|
+
export type ReferenceRelationKeys<
|
|
29
|
+
TContract extends MongoContract,
|
|
30
|
+
ModelName extends string & keyof TContract['models'],
|
|
31
|
+
> = {
|
|
32
|
+
[K in keyof ModelRelations<TContract, ModelName>]: ModelRelations<
|
|
33
|
+
TContract,
|
|
34
|
+
ModelName
|
|
35
|
+
>[K] extends DomainReferenceRelation
|
|
36
|
+
? K
|
|
37
|
+
: never;
|
|
38
|
+
}[keyof ModelRelations<TContract, ModelName>];
|
|
39
|
+
|
|
40
|
+
export type EmbedRelationKeys<
|
|
41
|
+
TContract extends MongoContract,
|
|
42
|
+
ModelName extends string & keyof TContract['models'],
|
|
43
|
+
> = {
|
|
44
|
+
[K in keyof ModelRelations<TContract, ModelName>]: ModelRelations<
|
|
45
|
+
TContract,
|
|
46
|
+
ModelName
|
|
47
|
+
>[K] extends DomainReferenceRelation
|
|
48
|
+
? never
|
|
49
|
+
: K;
|
|
50
|
+
}[keyof ModelRelations<TContract, ModelName>];
|
|
51
|
+
|
|
27
52
|
type EmbedRelationRowType<
|
|
28
53
|
TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>,
|
|
29
54
|
ModelName extends string & keyof TContract['models'],
|
|
30
|
-
RelKey extends keyof TContract
|
|
31
|
-
> = TContract
|
|
55
|
+
RelKey extends keyof ModelRelations<TContract, ModelName>,
|
|
56
|
+
> = ModelRelations<TContract, ModelName>[RelKey] extends {
|
|
32
57
|
readonly to: infer To extends string & keyof TContract['models'];
|
|
33
58
|
readonly cardinality: infer C;
|
|
34
59
|
}
|
|
35
|
-
? TContract
|
|
60
|
+
? ModelRelations<TContract, ModelName>[RelKey] extends DomainReferenceRelation
|
|
36
61
|
? never
|
|
37
62
|
: C extends '1:N'
|
|
38
63
|
? InferModelRow<TContract, To>[]
|
|
@@ -46,11 +71,7 @@ export type InferFullRow<
|
|
|
46
71
|
? InferModelRow<TContract, ModelName>
|
|
47
72
|
: InferModelRow<TContract, ModelName> & {
|
|
48
73
|
-readonly [K in EmbedRelationKeys<TContract, ModelName> &
|
|
49
|
-
keyof TContract
|
|
50
|
-
TContract,
|
|
51
|
-
ModelName,
|
|
52
|
-
K
|
|
53
|
-
>;
|
|
74
|
+
keyof ModelRelations<TContract, ModelName>]: EmbedRelationRowType<TContract, ModelName, K>;
|
|
54
75
|
};
|
|
55
76
|
|
|
56
77
|
type VariantRow<
|
|
@@ -81,9 +102,9 @@ export type InferRootRow<
|
|
|
81
102
|
type IncludeRelationRowType<
|
|
82
103
|
TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>,
|
|
83
104
|
ModelName extends string & keyof TContract['models'],
|
|
84
|
-
RelKey extends keyof TContract
|
|
85
|
-
> = TContract
|
|
86
|
-
? TContract
|
|
105
|
+
RelKey extends keyof ModelRelations<TContract, ModelName>,
|
|
106
|
+
> = ModelRelations<TContract, ModelName>[RelKey] extends DomainReferenceRelation
|
|
107
|
+
? ModelRelations<TContract, ModelName>[RelKey] extends {
|
|
87
108
|
readonly to: infer To extends string & keyof TContract['models'];
|
|
88
109
|
readonly cardinality: infer C;
|
|
89
110
|
}
|
|
@@ -100,7 +121,7 @@ export type IncludeResultFields<
|
|
|
100
121
|
> = {
|
|
101
122
|
-readonly [K in keyof TInclude & string as TInclude[K] extends true
|
|
102
123
|
? K
|
|
103
|
-
: never]: K extends keyof TContract
|
|
124
|
+
: never]: K extends keyof ModelRelations<TContract, ModelName>
|
|
104
125
|
? IncludeRelationRowType<TContract, ModelName, K>
|
|
105
126
|
: never;
|
|
106
127
|
};
|