@prisma-next/mongo-orm 0.3.0-dev.128 → 0.3.0-dev.130
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 +5 -12
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +9 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/src/exports/index.ts +0 -2
- package/src/mongo-orm.ts +12 -13
- package/src/types.ts +19 -46
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ExtractMongoCodecTypes, InferModelRow, MongoContract, MongoContractWithTypeMaps, MongoQueryPlan, MongoTypeMaps } from "@prisma-next/mongo-core";
|
|
2
|
+
import { DomainReferenceRelation, EmbedRelationKeys, ReferenceRelationKeys } from "@prisma-next/contract/types";
|
|
2
3
|
import { AsyncIterableResult } from "@prisma-next/runtime-executor";
|
|
3
4
|
|
|
4
5
|
//#region src/types.d.ts
|
|
@@ -10,17 +11,10 @@ interface MongoOrmOptions<TContract extends MongoContract> {
|
|
|
10
11
|
readonly executor: MongoQueryExecutor;
|
|
11
12
|
}
|
|
12
13
|
type Simplify<T> = T extends unknown ? { [K in keyof T]: T[K] } : never;
|
|
13
|
-
type ReferenceRelationKeys<TContract extends MongoContract, ModelName extends string & keyof TContract['models']> = { [K in keyof TContract['models'][ModelName]['relations']]: TContract['models'][ModelName]['relations'][K] extends {
|
|
14
|
-
readonly strategy: 'reference';
|
|
15
|
-
} ? K : never }[keyof TContract['models'][ModelName]['relations']];
|
|
16
|
-
type EmbedRelationKeys<TContract extends MongoContract, ModelName extends string & keyof TContract['models']> = { [K in keyof TContract['models'][ModelName]['relations']]: TContract['models'][ModelName]['relations'][K] extends {
|
|
17
|
-
readonly strategy: 'embed';
|
|
18
|
-
} ? K : never }[keyof TContract['models'][ModelName]['relations']];
|
|
19
14
|
type EmbedRelationRowType<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models'], RelKey extends keyof TContract['models'][ModelName]['relations']> = TContract['models'][ModelName]['relations'][RelKey] extends {
|
|
20
15
|
readonly to: infer To extends string & keyof TContract['models'];
|
|
21
16
|
readonly cardinality: infer C;
|
|
22
|
-
|
|
23
|
-
} ? C extends '1:N' ? InferModelRow<TContract, To>[] : InferModelRow<TContract, To> : never;
|
|
17
|
+
} ? TContract['models'][ModelName]['relations'][RelKey] extends DomainReferenceRelation ? never : C extends '1:N' ? InferModelRow<TContract, To>[] : InferModelRow<TContract, To> : never;
|
|
24
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['models'][ModelName]['relations']]: EmbedRelationRowType<TContract, ModelName, K> };
|
|
25
19
|
type VariantRow<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models']> = TContract['models'][ModelName] extends {
|
|
26
20
|
readonly discriminator: {
|
|
@@ -31,11 +25,10 @@ type VariantRow<TContract extends MongoContractWithTypeMaps<MongoContract, Mongo
|
|
|
31
25
|
readonly value: string;
|
|
32
26
|
}> ? { [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>;
|
|
33
27
|
type InferRootRow<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models']> = VariantRow<TContract, ModelName>;
|
|
34
|
-
type IncludeRelationRowType<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models'], RelKey extends keyof TContract['models'][ModelName]['relations']> = TContract['models'][ModelName]['relations'][RelKey] extends {
|
|
28
|
+
type IncludeRelationRowType<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models'], RelKey extends keyof TContract['models'][ModelName]['relations']> = TContract['models'][ModelName]['relations'][RelKey] extends DomainReferenceRelation ? TContract['models'][ModelName]['relations'][RelKey] extends {
|
|
35
29
|
readonly to: infer To extends string & keyof TContract['models'];
|
|
36
30
|
readonly cardinality: infer C;
|
|
37
|
-
|
|
38
|
-
} ? C extends 'N:1' | '1:1' ? InferFullRow<TContract, To> | null : InferFullRow<TContract, To>[] : never;
|
|
31
|
+
} ? C extends 'N:1' | '1:1' ? InferFullRow<TContract, To> | null : InferFullRow<TContract, To>[] : never : never;
|
|
39
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['models'][ModelName]['relations'] ? IncludeRelationRowType<TContract, ModelName, K> : never };
|
|
40
33
|
type MongoWhereFilter<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>, ModelName extends string & keyof TContract['models'], TCodecTypes extends Record<string, {
|
|
41
34
|
output: unknown;
|
|
@@ -55,5 +48,5 @@ interface MongoCollection<TContract extends MongoContractWithTypeMaps<MongoContr
|
|
|
55
48
|
//#region src/mongo-orm.d.ts
|
|
56
49
|
declare function mongoOrm<TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>>(options: MongoOrmOptions<TContract>): MongoOrmClient<TContract>;
|
|
57
50
|
//#endregion
|
|
58
|
-
export { type
|
|
51
|
+
export { type IncludeResultFields, type InferFullRow, type InferRootRow, type MongoCollection, type MongoFindManyOptions, type MongoIncludeSpec, type MongoOrmClient, type MongoOrmOptions, type MongoQueryExecutor, type MongoWhereFilter, mongoOrm };
|
|
59
52
|
//# sourceMappingURL=index.d.mts.map
|
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
|
@@ -15,19 +15,19 @@ function buildLookupStages(contract, model, include) {
|
|
|
15
15
|
for (const [relName, shouldInclude] of Object.entries(include)) {
|
|
16
16
|
if (!shouldInclude) continue;
|
|
17
17
|
const relation = model.relations[relName];
|
|
18
|
-
if (!relation
|
|
19
|
-
const
|
|
20
|
-
if (
|
|
21
|
-
const
|
|
22
|
-
if (
|
|
23
|
-
const targetCollection = resolveCollection(targetModel,
|
|
18
|
+
if (!relation) continue;
|
|
19
|
+
const targetModel = contract.models[relation.to];
|
|
20
|
+
if (!targetModel || targetModel.owner) continue;
|
|
21
|
+
const ref = relation;
|
|
22
|
+
if (ref.on.localFields.length !== 1 || ref.on.targetFields.length !== 1) throw new Error(`Compound references are not yet supported: relation "${relName}" has ${ref.on.localFields.length} local field(s) and ${ref.on.targetFields.length} target field(s)`);
|
|
23
|
+
const targetCollection = resolveCollection(targetModel, ref.to);
|
|
24
24
|
stages.push({ $lookup: {
|
|
25
25
|
from: targetCollection,
|
|
26
|
-
localField:
|
|
27
|
-
foreignField:
|
|
26
|
+
localField: ref.on.localFields[0],
|
|
27
|
+
foreignField: ref.on.targetFields[0],
|
|
28
28
|
as: relName
|
|
29
29
|
} });
|
|
30
|
-
if (
|
|
30
|
+
if (ref.cardinality === "N:1" || ref.cardinality === "1:1") stages.push({ $unwind: {
|
|
31
31
|
path: `$${relName}`,
|
|
32
32
|
preserveNullAndEmptyArrays: true
|
|
33
33
|
} });
|
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 { 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
|
|
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,UAAU;AACjC,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.130",
|
|
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.130",
|
|
9
|
+
"@prisma-next/mongo-core": "0.3.0-dev.130",
|
|
10
|
+
"@prisma-next/runtime-executor": "0.3.0-dev.130"
|
|
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",
|
|
16
17
|
"@prisma-next/test-utils": "0.0.1",
|
|
17
|
-
"@prisma-next/tsdown": "0.0.0"
|
|
18
|
-
"@prisma-next/tsconfig": "0.0.0"
|
|
18
|
+
"@prisma-next/tsdown": "0.0.0"
|
|
19
19
|
},
|
|
20
20
|
"files": [
|
|
21
21
|
"dist",
|
package/src/exports/index.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export { mongoOrm } from '../mongo-orm';
|
|
2
2
|
export type {
|
|
3
|
-
EmbedRelationKeys,
|
|
4
3
|
IncludeResultFields,
|
|
5
4
|
InferFullRow,
|
|
6
5
|
InferRootRow,
|
|
@@ -11,5 +10,4 @@ export type {
|
|
|
11
10
|
MongoOrmOptions,
|
|
12
11
|
MongoQueryExecutor,
|
|
13
12
|
MongoWhereFilter,
|
|
14
|
-
ReferenceRelationKeys,
|
|
15
13
|
} from '../types';
|
package/src/mongo-orm.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PlanMeta } from '@prisma-next/contract/types';
|
|
1
|
+
import type { DomainReferenceRelation, PlanMeta } from '@prisma-next/contract/types';
|
|
2
2
|
import {
|
|
3
3
|
AggregateCommand,
|
|
4
4
|
FindCommand,
|
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
type MongoExpr,
|
|
8
8
|
type MongoModelDefinition,
|
|
9
9
|
type MongoQueryPlan,
|
|
10
|
-
type MongoReferenceRelation,
|
|
11
10
|
type MongoTypeMaps,
|
|
12
11
|
} from '@prisma-next/mongo-core';
|
|
13
12
|
import type { AsyncIterableResult } from '@prisma-next/runtime-executor';
|
|
@@ -41,31 +40,31 @@ function buildLookupStages(
|
|
|
41
40
|
if (!shouldInclude) continue;
|
|
42
41
|
|
|
43
42
|
const relation = model.relations[relName];
|
|
44
|
-
if (!relation
|
|
43
|
+
if (!relation) continue;
|
|
45
44
|
|
|
46
|
-
const
|
|
45
|
+
const targetModel = contract.models[relation.to];
|
|
46
|
+
if (!targetModel || targetModel.owner) continue;
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
const ref = relation as DomainReferenceRelation;
|
|
49
|
+
|
|
50
|
+
if (ref.on.localFields.length !== 1 || ref.on.targetFields.length !== 1) {
|
|
49
51
|
throw new Error(
|
|
50
|
-
`Compound references are not yet supported: relation "${relName}" has ${
|
|
52
|
+
`Compound references are not yet supported: relation "${relName}" has ${ref.on.localFields.length} local field(s) and ${ref.on.targetFields.length} target field(s)`,
|
|
51
53
|
);
|
|
52
54
|
}
|
|
53
55
|
|
|
54
|
-
const
|
|
55
|
-
if (!targetModel) continue;
|
|
56
|
-
|
|
57
|
-
const targetCollection = resolveCollection(targetModel, refRelation.to);
|
|
56
|
+
const targetCollection = resolveCollection(targetModel, ref.to);
|
|
58
57
|
|
|
59
58
|
stages.push({
|
|
60
59
|
$lookup: {
|
|
61
60
|
from: targetCollection,
|
|
62
|
-
localField:
|
|
63
|
-
foreignField:
|
|
61
|
+
localField: ref.on.localFields[0],
|
|
62
|
+
foreignField: ref.on.targetFields[0],
|
|
64
63
|
as: relName,
|
|
65
64
|
},
|
|
66
65
|
});
|
|
67
66
|
|
|
68
|
-
if (
|
|
67
|
+
if (ref.cardinality === 'N:1' || ref.cardinality === '1:1') {
|
|
69
68
|
stages.push({
|
|
70
69
|
$unwind: {
|
|
71
70
|
path: `$${relName}`,
|
package/src/types.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DomainReferenceRelation,
|
|
3
|
+
EmbedRelationKeys,
|
|
4
|
+
ReferenceRelationKeys,
|
|
5
|
+
} from '@prisma-next/contract/types';
|
|
1
6
|
import type {
|
|
2
7
|
ExtractMongoCodecTypes,
|
|
3
8
|
InferModelRow,
|
|
@@ -19,32 +24,6 @@ export interface MongoOrmOptions<TContract extends MongoContract> {
|
|
|
19
24
|
|
|
20
25
|
type Simplify<T> = T extends unknown ? { [K in keyof T]: T[K] } : never;
|
|
21
26
|
|
|
22
|
-
// --- Relation type helpers ---
|
|
23
|
-
|
|
24
|
-
export type ReferenceRelationKeys<
|
|
25
|
-
TContract extends MongoContract,
|
|
26
|
-
ModelName extends string & keyof TContract['models'],
|
|
27
|
-
> = {
|
|
28
|
-
[K in keyof TContract['models'][ModelName]['relations']]: TContract['models'][ModelName]['relations'][K] extends {
|
|
29
|
-
readonly strategy: 'reference';
|
|
30
|
-
}
|
|
31
|
-
? K
|
|
32
|
-
: never;
|
|
33
|
-
}[keyof TContract['models'][ModelName]['relations']];
|
|
34
|
-
|
|
35
|
-
export type EmbedRelationKeys<
|
|
36
|
-
TContract extends MongoContract,
|
|
37
|
-
ModelName extends string & keyof TContract['models'],
|
|
38
|
-
> = {
|
|
39
|
-
[K in keyof TContract['models'][ModelName]['relations']]: TContract['models'][ModelName]['relations'][K] extends {
|
|
40
|
-
readonly strategy: 'embed';
|
|
41
|
-
}
|
|
42
|
-
? K
|
|
43
|
-
: never;
|
|
44
|
-
}[keyof TContract['models'][ModelName]['relations']];
|
|
45
|
-
|
|
46
|
-
// --- Embedded field types ---
|
|
47
|
-
|
|
48
27
|
type EmbedRelationRowType<
|
|
49
28
|
TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>,
|
|
50
29
|
ModelName extends string & keyof TContract['models'],
|
|
@@ -52,11 +31,12 @@ type EmbedRelationRowType<
|
|
|
52
31
|
> = TContract['models'][ModelName]['relations'][RelKey] extends {
|
|
53
32
|
readonly to: infer To extends string & keyof TContract['models'];
|
|
54
33
|
readonly cardinality: infer C;
|
|
55
|
-
readonly strategy: 'embed';
|
|
56
34
|
}
|
|
57
|
-
?
|
|
58
|
-
?
|
|
59
|
-
:
|
|
35
|
+
? TContract['models'][ModelName]['relations'][RelKey] extends DomainReferenceRelation
|
|
36
|
+
? never
|
|
37
|
+
: C extends '1:N'
|
|
38
|
+
? InferModelRow<TContract, To>[]
|
|
39
|
+
: InferModelRow<TContract, To>
|
|
60
40
|
: never;
|
|
61
41
|
|
|
62
42
|
export type InferFullRow<
|
|
@@ -73,8 +53,6 @@ export type InferFullRow<
|
|
|
73
53
|
>;
|
|
74
54
|
};
|
|
75
55
|
|
|
76
|
-
// --- Polymorphic row type ---
|
|
77
|
-
|
|
78
56
|
type VariantRow<
|
|
79
57
|
TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>,
|
|
80
58
|
ModelName extends string & keyof TContract['models'],
|
|
@@ -100,20 +78,19 @@ export type InferRootRow<
|
|
|
100
78
|
ModelName extends string & keyof TContract['models'],
|
|
101
79
|
> = VariantRow<TContract, ModelName>;
|
|
102
80
|
|
|
103
|
-
// --- Include result type augmentation ---
|
|
104
|
-
|
|
105
81
|
type IncludeRelationRowType<
|
|
106
82
|
TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>,
|
|
107
83
|
ModelName extends string & keyof TContract['models'],
|
|
108
84
|
RelKey extends keyof TContract['models'][ModelName]['relations'],
|
|
109
|
-
> = TContract['models'][ModelName]['relations'][RelKey] extends
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
85
|
+
> = TContract['models'][ModelName]['relations'][RelKey] extends DomainReferenceRelation
|
|
86
|
+
? TContract['models'][ModelName]['relations'][RelKey] extends {
|
|
87
|
+
readonly to: infer To extends string & keyof TContract['models'];
|
|
88
|
+
readonly cardinality: infer C;
|
|
89
|
+
}
|
|
90
|
+
? C extends 'N:1' | '1:1'
|
|
91
|
+
? InferFullRow<TContract, To> | null
|
|
92
|
+
: InferFullRow<TContract, To>[]
|
|
93
|
+
: never
|
|
117
94
|
: never;
|
|
118
95
|
|
|
119
96
|
export type IncludeResultFields<
|
|
@@ -128,8 +105,6 @@ export type IncludeResultFields<
|
|
|
128
105
|
: never;
|
|
129
106
|
};
|
|
130
107
|
|
|
131
|
-
// --- Query options ---
|
|
132
|
-
|
|
133
108
|
export type MongoWhereFilter<
|
|
134
109
|
TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>,
|
|
135
110
|
ModelName extends string & keyof TContract['models'],
|
|
@@ -158,8 +133,6 @@ export interface MongoFindManyOptions<
|
|
|
158
133
|
readonly include?: TInclude;
|
|
159
134
|
}
|
|
160
135
|
|
|
161
|
-
// --- Client types ---
|
|
162
|
-
|
|
163
136
|
export type MongoOrmClient<
|
|
164
137
|
TContract extends MongoContractWithTypeMaps<MongoContract, MongoTypeMaps>,
|
|
165
138
|
> = {
|