@shivaedev/effect-prisma 0.1.0 → 0.2.0
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/CHANGELOG.md +8 -0
- package/README.md +35 -5
- package/dist/internal/recipe.d.ts.map +1 -1
- package/dist/internal/recipe.js +66 -11
- package/dist/internal/recipe.js.map +1 -1
- package/dist/internal/relation-plan.d.ts +8 -0
- package/dist/internal/relation-plan.d.ts.map +1 -0
- package/dist/internal/relation-plan.js +10 -0
- package/dist/internal/relation-plan.js.map +1 -0
- package/dist/internal/relation-runtime.d.ts.map +1 -1
- package/dist/internal/relation-runtime.js +18 -0
- package/dist/internal/relation-runtime.js.map +1 -1
- package/dist/relation/include-metadata.d.ts +34 -0
- package/dist/relation/include-metadata.d.ts.map +1 -0
- package/dist/relation/include-metadata.js +2 -0
- package/dist/relation/include-metadata.js.map +1 -0
- package/dist/relation/include.d.ts +25 -0
- package/dist/relation/include.d.ts.map +1 -0
- package/dist/relation/include.js +2 -0
- package/dist/relation/include.js.map +1 -0
- package/dist/relation/prisma-methods.d.ts +5 -2
- package/dist/relation/prisma-methods.d.ts.map +1 -1
- package/dist/relation.d.ts +8 -1
- package/dist/relation.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/internal/recipe.ts +96 -19
- package/src/internal/relation-plan.ts +22 -0
- package/src/internal/relation-runtime.ts +32 -0
- package/src/relation/include-metadata.ts +102 -0
- package/src/relation/include.ts +169 -0
- package/src/relation/prisma-methods.ts +5 -1
- package/src/relation.ts +15 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.2.0 - 2026-07-26
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Load typed to-one and to-many relations, including nested and refined
|
|
10
|
+
relations and relation counts.
|
|
11
|
+
- Count any filtered relation directly without building an aggregate result.
|
|
12
|
+
|
|
5
13
|
## 0.1.0 - 2026-07-26
|
|
6
14
|
|
|
7
15
|
### Added
|
package/README.md
CHANGED
|
@@ -46,24 +46,54 @@ const program = Effect.gen(function* () {
|
|
|
46
46
|
const users = yield* newest.take(20)
|
|
47
47
|
const first = yield* active.first()
|
|
48
48
|
const exists = yield* active.exists()
|
|
49
|
+
const count = yield* active.count()
|
|
49
50
|
|
|
50
|
-
return { users, first, exists }
|
|
51
|
+
return { users, first, exists, count }
|
|
51
52
|
})
|
|
52
53
|
```
|
|
53
54
|
|
|
54
55
|
Relations are lazy and immutable. Reusing or branching a Relation never changes
|
|
55
56
|
the original, and each execution resolves the active database context again.
|
|
56
57
|
|
|
58
|
+
Relations can be loaded directly or refined with another immutable Relation:
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
const recentPosts = db.Post
|
|
62
|
+
.orderBy((post) => post.createdAt.desc())
|
|
63
|
+
.take(5)
|
|
64
|
+
|
|
65
|
+
const usersWithPosts = yield* db.User.include("posts", recentPosts)
|
|
66
|
+
|
|
67
|
+
const usersWithPostCounts = yield* db.User.include("posts", db.Post.count())
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Includes can be chained and nested. Loaded to-many relations are arrays, and
|
|
71
|
+
nullable to-one relations remain nullable in the result type.
|
|
72
|
+
|
|
73
|
+
Named query records return several projections of the same relation:
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
const publishedPosts = db.Post.where({ published: true })
|
|
77
|
+
const recentPublishedPosts = publishedPosts
|
|
78
|
+
.orderBy((post) => post.createdAt.desc())
|
|
79
|
+
.take(5)
|
|
80
|
+
|
|
81
|
+
const usersWithPostOverview = yield* db.User.include("posts", {
|
|
82
|
+
items: recentPublishedPosts,
|
|
83
|
+
fullCount: publishedPosts.count(),
|
|
84
|
+
})
|
|
85
|
+
```
|
|
86
|
+
|
|
57
87
|
Collections are also cold Effect Streams:
|
|
58
88
|
|
|
59
89
|
```ts
|
|
60
90
|
const stream = db.User.where({ active: true }).stream
|
|
61
91
|
```
|
|
62
92
|
|
|
63
|
-
The
|
|
64
|
-
pagination, distinct queries, aggregates, grouping, and
|
|
65
|
-
terminals.
|
|
66
|
-
|
|
93
|
+
The package covers scalar models, filtering, selection, relation loading,
|
|
94
|
+
ordering, pagination, distinct queries, aggregates, grouping, and
|
|
95
|
+
create/update/delete terminals. Model variants are deliberately deferred rather
|
|
96
|
+
than exposed with weakened types.
|
|
67
97
|
|
|
68
98
|
## Transactions
|
|
69
99
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../src/internal/recipe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../src/internal/recipe.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,cAA6B,CAAC;AAEzE,eAAO,MAAM,eAAe,GAC3B,QAAQ,cAAc,EACtB,MAAM,WAAW,EACjB,YAAY,aAAa,CAAC,OAAO,CAAC,KAChC,cAOD,CAAC;AA8GH,eAAO,MAAM,YAAY,GACxB,QAAQ,MAAM,EACd,QAAQ,cAAc,KACpB,OAQF,CAAC"}
|
package/dist/internal/recipe.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getRelationPlan } from "./relation-plan.js";
|
|
1
2
|
export const rootRecipe = (model) => ({ model });
|
|
2
3
|
export const appendOperation = (parent, name, arguments_) => ({
|
|
3
4
|
model: parent.model,
|
|
@@ -18,20 +19,74 @@ const operations = (recipe) => {
|
|
|
18
19
|
}
|
|
19
20
|
return reversed.reverse();
|
|
20
21
|
};
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
const applyMethod = (current, name, arguments_, model) => {
|
|
23
|
+
if (typeof current !== "object" ||
|
|
24
|
+
current === null ||
|
|
25
|
+
typeof Reflect.get(current, name) !== "function") {
|
|
26
|
+
throw new TypeError(`Cannot call ${String(name)} while replaying ${model}`);
|
|
25
27
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
const method = Reflect.get(current, name);
|
|
29
|
+
return Reflect.apply(method, current, arguments_);
|
|
30
|
+
};
|
|
31
|
+
const replayPlan = (collection, plan) => {
|
|
32
|
+
const relatedModel = typeof collection === "object" && collection !== null
|
|
33
|
+
? Reflect.get(collection, "modelName")
|
|
34
|
+
: undefined;
|
|
35
|
+
if (typeof relatedModel === "string" && relatedModel !== plan.recipe.model) {
|
|
36
|
+
throw new TypeError(`Included relation expects ${relatedModel}, received ${plan.recipe.model}`);
|
|
37
|
+
}
|
|
38
|
+
const refined = replayRecipeFrom(collection, plan.recipe);
|
|
39
|
+
if (plan.terminal !== "count") {
|
|
40
|
+
return refined;
|
|
41
|
+
}
|
|
42
|
+
return applyMethod(refined, "count", [], plan.recipe.model);
|
|
43
|
+
};
|
|
44
|
+
const includeRefinement = (value) => {
|
|
45
|
+
const plan = getRelationPlan(value);
|
|
46
|
+
if (plan !== undefined) {
|
|
47
|
+
return (collection) => replayPlan(collection, plan);
|
|
48
|
+
}
|
|
49
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
50
|
+
throw new TypeError("An included relation must be a Relation or query record");
|
|
51
|
+
}
|
|
52
|
+
const entries = Object.entries(value);
|
|
53
|
+
if (entries.length === 0) {
|
|
54
|
+
throw new TypeError("An included query record cannot be empty");
|
|
55
|
+
}
|
|
56
|
+
const plans = entries.map(([name, query]) => {
|
|
57
|
+
const queryPlan = getRelationPlan(query);
|
|
58
|
+
if (queryPlan === undefined) {
|
|
59
|
+
throw new TypeError(`Included query "${name}" is not a Relation`);
|
|
31
60
|
}
|
|
32
|
-
|
|
33
|
-
|
|
61
|
+
return [name, queryPlan];
|
|
62
|
+
});
|
|
63
|
+
const model = plans[0]?.[1].recipe.model;
|
|
64
|
+
if (plans.some(([, queryPlan]) => queryPlan.recipe.model !== model)) {
|
|
65
|
+
throw new TypeError("Included queries must use the same related model");
|
|
66
|
+
}
|
|
67
|
+
return (collection) => {
|
|
68
|
+
const branches = Object.fromEntries(plans.map(([name, queryPlan]) => [
|
|
69
|
+
name,
|
|
70
|
+
replayPlan(collection, queryPlan),
|
|
71
|
+
]));
|
|
72
|
+
return applyMethod(collection, "combine", [branches], model ?? "relation");
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
const replayRecipeFrom = (root, recipe) => {
|
|
76
|
+
let current = root;
|
|
77
|
+
for (const operation of operations(recipe)) {
|
|
78
|
+
const arguments_ = operation.name === "include" && operation.arguments.length === 2
|
|
79
|
+
? [operation.arguments[0], includeRefinement(operation.arguments[1])]
|
|
80
|
+
: operation.arguments;
|
|
81
|
+
current = applyMethod(current, operation.name, arguments_, recipe.model);
|
|
34
82
|
}
|
|
35
83
|
return current;
|
|
36
84
|
};
|
|
85
|
+
export const replayRecipe = (models, recipe) => {
|
|
86
|
+
const current = Reflect.get(models, recipe.model);
|
|
87
|
+
if (current === undefined) {
|
|
88
|
+
throw new TypeError(`Unknown Prisma model: ${recipe.model}`);
|
|
89
|
+
}
|
|
90
|
+
return replayRecipeFrom(current, recipe);
|
|
91
|
+
};
|
|
37
92
|
//# sourceMappingURL=recipe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../src/internal/recipe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../src/internal/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAqB,MAAM,oBAAoB,CAAC;AAaxE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAkB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAEzE,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,MAAsB,EACtB,IAAiB,EACjB,UAAkC,EACjB,EAAE,CAAC,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,MAAM;IACN,SAAS,EAAE;QACV,IAAI;QACJ,SAAS,EAAE,UAAU;KACrB;CACD,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,CAClB,MAAsB,EACa,EAAE;IACrC,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAC9C,IAAI,OAAO,GAA+B,MAAM,CAAC;IAEjD,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CACnB,OAAgB,EAChB,IAAiB,EACjB,UAAkC,EAClC,KAAa,EACH,EAAE;IACZ,IACC,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,KAAK,IAAI;QAChB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,UAAU,EAC/C,CAAC;QACF,MAAM,IAAI,SAAS,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAE5B,CAAC;IACb,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,UAAmB,EAAE,IAAkB,EAAW,EAAE;IACvE,MAAM,YAAY,GACjB,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI;QACpD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC;QACtC,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5E,MAAM,IAAI,SAAS,CAClB,6BAA6B,YAAY,cAAc,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAC1E,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,OAAO,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACzB,KAAc,EACuB,EAAE;IACvC,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,SAAS,CAClB,yDAAyD,CACzD,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QAC3C,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,SAAS,CAAC,mBAAmB,IAAI,qBAAqB,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,CAAC,IAAI,EAAE,SAAS,CAAU,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IACzC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,CAAC,UAAU,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAClC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI;YACJ,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC;SACjC,CAAC,CACF,CAAC;QACF,OAAO,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,UAAU,CAAC,CAAC;IAC5E,CAAC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,IAAa,EAAE,MAAsB,EAAW,EAAE;IAC3E,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,MAAM,UAAU,GACf,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAC/D,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC;QACxB,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,MAAc,EACd,MAAsB,EACZ,EAAE;IACZ,MAAM,OAAO,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAE3D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,SAAS,CAAC,yBAAyB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RelationRecipe } from "./recipe.js";
|
|
2
|
+
export declare const RelationPlanTypeId: unique symbol;
|
|
3
|
+
export interface RelationPlan {
|
|
4
|
+
readonly recipe: RelationRecipe;
|
|
5
|
+
readonly terminal?: PropertyKey;
|
|
6
|
+
}
|
|
7
|
+
export declare const getRelationPlan: (value: unknown) => RelationPlan | undefined;
|
|
8
|
+
//# sourceMappingURL=relation-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-plan.d.ts","sourceRoot":"","sources":["../../src/internal/relation-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,kBAAkB,eAE9B,CAAC;AAEF,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;CAChC;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,YAAY,GAAG,SAU/D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const RelationPlanTypeId = Symbol.for("@shivaedev/effect-prisma/RelationPlan");
|
|
2
|
+
export const getRelationPlan = (value) => {
|
|
3
|
+
if (typeof value !== "object" ||
|
|
4
|
+
value === null ||
|
|
5
|
+
!Reflect.has(value, RelationPlanTypeId)) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
return Reflect.get(value, RelationPlanTypeId);
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=relation-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-plan.js","sourceRoot":"","sources":["../../src/internal/relation-plan.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAC3C,uCAAuC,CACvC,CAAC;AAOF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAc,EAA4B,EAAE;IAC3E,IACC,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,kBAAkB,CAAC,EACtC,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,kBAAkB,CAAiB,CAAC;AAC/D,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relation-runtime.d.ts","sourceRoot":"","sources":["../../src/internal/relation-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EACX,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"relation-runtime.d.ts","sourceRoot":"","sources":["../../src/internal/relation-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EACX,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,MAAM,eAAe,CAAC;AAkOvB,eAAO,MAAM,iBAAiB,GAC7B,UAAU,EACV,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB,GAAG,mBAAmB,EAE1D,UAAU,OAAO,CAAC,OAAO,CACxB,kBAAkB,CAAC,MAAM,CAAC,EAC1B,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAClC,EACD,OAAO,MAAM,KACX,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAIK,CAAC"}
|
|
@@ -2,7 +2,15 @@ import { Effect, Effectable, Option, Stream } from "effect";
|
|
|
2
2
|
import { isPrismaFailure, toPrismaError } from "../error.js";
|
|
3
3
|
import { fromPrismaPromise } from "./promise.js";
|
|
4
4
|
import { appendOperation, replayRecipe, rootRecipe, } from "./recipe.js";
|
|
5
|
+
import { RelationPlanTypeId } from "./relation-plan.js";
|
|
5
6
|
const evaluateResult = (value, terminal) => {
|
|
7
|
+
if (terminal === "count" &&
|
|
8
|
+
typeof value === "object" &&
|
|
9
|
+
value !== null &&
|
|
10
|
+
typeof Reflect.get(value, "aggregate") === "function") {
|
|
11
|
+
const aggregate = Reflect.apply(Reflect.get(value, "aggregate"), value, [(summary) => ({ count: summary.count() })]);
|
|
12
|
+
return fromPrismaPromise(() => aggregate).pipe(Effect.map((result) => result.count));
|
|
13
|
+
}
|
|
6
14
|
if (terminal === "exists" &&
|
|
7
15
|
typeof value === "object" &&
|
|
8
16
|
value !== null &&
|
|
@@ -57,6 +65,10 @@ const RelationPrototype = {
|
|
|
57
65
|
};
|
|
58
66
|
const makeRelationProxy = (runtime) => {
|
|
59
67
|
const target = Object.assign(Object.create(RelationPrototype), {
|
|
68
|
+
[RelationPlanTypeId]: {
|
|
69
|
+
recipe: runtime.recipe,
|
|
70
|
+
...(runtime.terminal === undefined ? {} : { terminal: runtime.terminal }),
|
|
71
|
+
},
|
|
60
72
|
runtime,
|
|
61
73
|
});
|
|
62
74
|
return new Proxy(target, {
|
|
@@ -73,6 +85,12 @@ const makeRelationProxy = (runtime) => {
|
|
|
73
85
|
terminal: "exists",
|
|
74
86
|
});
|
|
75
87
|
}
|
|
88
|
+
if (property === "count") {
|
|
89
|
+
return () => makeRelationProxy({
|
|
90
|
+
...runtime,
|
|
91
|
+
terminal: "count",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
76
94
|
return (...arguments_) => makeRelationProxy({
|
|
77
95
|
...runtime,
|
|
78
96
|
recipe: appendOperation(runtime.recipe, property, arguments_),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relation-runtime.js","sourceRoot":"","sources":["../../src/internal/relation-runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAO/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACN,eAAe,EAEf,YAAY,EACZ,UAAU,GACV,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"relation-runtime.js","sourceRoot":"","sources":["../../src/internal/relation-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Contract as PrismaContract } from "@prisma-next/contract/types";
|
|
2
|
+
import type { SqlStorage } from "@prisma-next/sql-contract/types";
|
|
3
|
+
import type { RelationsOf } from "@prisma-next/sql-orm-client";
|
|
4
|
+
export type AnyPostgresContract = PrismaContract<SqlStorage>;
|
|
5
|
+
type RelationDefinition<Contract extends AnyPostgresContract, Model extends string, RelationName extends string> = RelationName extends keyof RelationsOf<Contract, Model> ? RelationsOf<Contract, Model>[RelationName] : never;
|
|
6
|
+
type RelationCardinalityOf<Contract extends AnyPostgresContract, Model extends string, RelationName extends string> = RelationDefinition<Contract, Model, RelationName> extends {
|
|
7
|
+
readonly cardinality: infer Cardinality extends string;
|
|
8
|
+
} ? Cardinality : never;
|
|
9
|
+
export type IsToManyRelation<Contract extends AnyPostgresContract, Model extends string, RelationName extends string> = RelationCardinalityOf<Contract, Model, RelationName> extends "1:N" | "N:M" ? true : false;
|
|
10
|
+
export type RelatedModelNameOf<Contract extends AnyPostgresContract, Model extends string, RelationName extends string> = RelationDefinition<Contract, Model, RelationName> extends {
|
|
11
|
+
readonly to: {
|
|
12
|
+
readonly model: infer Related extends string;
|
|
13
|
+
};
|
|
14
|
+
} ? Related : never;
|
|
15
|
+
type RelationLocalFields<Contract extends AnyPostgresContract, Model extends string, RelationName extends string> = RelationDefinition<Contract, Model, RelationName> extends {
|
|
16
|
+
readonly on: {
|
|
17
|
+
readonly localFields: infer Fields extends readonly string[];
|
|
18
|
+
};
|
|
19
|
+
} ? Fields : readonly [];
|
|
20
|
+
type DefaultNamespace<Contract extends AnyPostgresContract> = Contract["domain"]["namespaces"][keyof Contract["domain"]["namespaces"]];
|
|
21
|
+
type ModelFields<Contract extends AnyPostgresContract, Model extends string> = DefaultNamespace<Contract> extends {
|
|
22
|
+
readonly models: infer Models;
|
|
23
|
+
} ? Model extends keyof Models ? Models[Model] extends {
|
|
24
|
+
readonly fields: infer Fields;
|
|
25
|
+
} ? Fields : never : never : never;
|
|
26
|
+
type AnyNullableField<Fields, Names extends readonly string[]> = Names extends readonly [
|
|
27
|
+
infer Head extends string,
|
|
28
|
+
...infer Tail extends readonly string[]
|
|
29
|
+
] ? Head extends keyof Fields ? Fields[Head] extends {
|
|
30
|
+
readonly nullable: true;
|
|
31
|
+
} ? true : AnyNullableField<Fields, Tail> : true : false;
|
|
32
|
+
export type IncludedRelationValue<Contract extends AnyPostgresContract, Model extends string, RelationName extends string, Value> = RelationCardinalityOf<Contract, Model, RelationName> extends "1:N" | "N:M" ? Array<Value> : RelationCardinalityOf<Contract, Model, RelationName> extends "N:1" ? AnyNullableField<ModelFields<Contract, Model>, RelationLocalFields<Contract, Model, RelationName>> extends true ? Value | null : Value : Value | null;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=include-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"include-metadata.d.ts","sourceRoot":"","sources":["../../src/relation/include-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"include-metadata.js","sourceRoot":"","sources":["../../src/relation/include-metadata.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DefaultModelRow, Collection as PrismaCollection, RelationNames } from "@prisma-next/sql-orm-client";
|
|
2
|
+
import type { Relation, RelationQuery } from "../relation.js";
|
|
3
|
+
import type { AnyPostgresContract, IncludedRelationValue, IsToManyRelation, RelatedModelNameOf } from "./include-metadata.js";
|
|
4
|
+
type Simplify<Value> = {
|
|
5
|
+
[Key in keyof Value]: Value[Key];
|
|
6
|
+
};
|
|
7
|
+
type QueryValue<Query> = Query extends RelationQuery<infer Value, infer _Requirement, infer _Contract, infer _Model> ? Value : never;
|
|
8
|
+
type AcceptRelatedQuery<Query, Contract extends AnyPostgresContract, Model extends string> = Query extends RelationQuery<infer _Value, infer _Requirement, infer QueryContract, infer QueryModel> ? [QueryContract] extends [Contract] ? [Contract] extends [QueryContract] ? QueryModel extends Model ? unknown : never : never : never : never;
|
|
9
|
+
type IncludedQueryValue<Query, Contract extends AnyPostgresContract, Model extends string, RelationName extends string> = QueryValue<Query> extends ReadonlyArray<infer Row> ? IncludedRelationValue<Contract, Model, RelationName, Row> : QueryValue<Query>;
|
|
10
|
+
type QueryShapeValue<Shape extends Readonly<Record<string, unknown>>> = {
|
|
11
|
+
readonly [Key in keyof Shape]: QueryValue<Shape[Key]>;
|
|
12
|
+
};
|
|
13
|
+
type AcceptRelatedQueryShape<Shape extends Readonly<Record<string, unknown>>, Contract extends AnyPostgresContract, Model extends string> = {
|
|
14
|
+
readonly [Key in keyof Shape]: Shape[Key] & AcceptRelatedQuery<Shape[Key], Contract, Model>;
|
|
15
|
+
};
|
|
16
|
+
type WithIncludedRelation<Collection, Contract extends AnyPostgresContract, Model extends string, RelationName extends string, Value> = Collection extends PrismaCollection<Contract, Model, infer Row, infer State> ? PrismaCollection<Contract, Model, Simplify<Row & {
|
|
17
|
+
readonly [Key in RelationName]: Value;
|
|
18
|
+
}>, State> : never;
|
|
19
|
+
export type IncludeMethod<Collection, Requirement, Contract, Model extends string> = Contract extends AnyPostgresContract ? Collection extends PrismaCollection<Contract, Model, infer _Row, infer _State> ? {
|
|
20
|
+
include<RelationName extends RelationNames<Contract, Model>>(relationName: RelationName): Relation<WithIncludedRelation<Collection, Contract, Model, RelationName, IncludedRelationValue<Contract, Model, RelationName, DefaultModelRow<Contract, RelatedModelNameOf<Contract, Model, RelationName>>>>, Requirement, Contract, Model>;
|
|
21
|
+
include<RelationName extends RelationNames<Contract, Model>, Query>(relationName: RelationName, query: Query & AcceptRelatedQuery<Query, Contract, RelatedModelNameOf<Contract, Model, RelationName>>): Relation<WithIncludedRelation<Collection, Contract, Model, RelationName, IncludedQueryValue<Query, Contract, Model, RelationName>>, Requirement, Contract, Model>;
|
|
22
|
+
include<RelationName extends RelationNames<Contract, Model>, Shape extends Readonly<Record<string, unknown>>>(relationName: RelationName, shape: IsToManyRelation<Contract, Model, RelationName> extends true ? keyof Shape extends never ? never : Shape & AcceptRelatedQueryShape<Shape, Contract, RelatedModelNameOf<Contract, Model, RelationName>> : never): Relation<WithIncludedRelation<Collection, Contract, Model, RelationName, QueryShapeValue<Shape>>, Requirement, Contract, Model>;
|
|
23
|
+
} : Record<never, never> : Record<never, never>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=include.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"include.d.ts","sourceRoot":"","sources":["../../src/relation/include.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"include.js","sourceRoot":"","sources":["../../src/relation/include.ts"],"names":[],"mappings":""}
|
|
@@ -3,7 +3,8 @@ import type { SqlStorage } from "@prisma-next/sql-contract/types";
|
|
|
3
3
|
import type { AggregateBuilder, AggregateResult, AggregateSpec, DefaultModelRow, GroupedCollection, Collection as PrismaCollection } from "@prisma-next/sql-orm-client";
|
|
4
4
|
import type { Effect, Stream } from "effect";
|
|
5
5
|
import type { PrismaError } from "../error.js";
|
|
6
|
-
import type { CollectionResult, Relation } from "../relation.js";
|
|
6
|
+
import type { CollectionResult, Relation, RelationQuery } from "../relation.js";
|
|
7
|
+
import type { IncludeMethod } from "./include.js";
|
|
7
8
|
type AnyFunction = (...arguments_: ReadonlyArray<never>) => unknown;
|
|
8
9
|
type AnyPostgresContract = PrismaContract<SqlStorage>;
|
|
9
10
|
type FieldTuple<Row> = readonly [keyof Row & string, ...(keyof Row & string)[]];
|
|
@@ -43,11 +44,13 @@ type CollectionMethods<Collection, Requirement, Contract, Model extends string>
|
|
|
43
44
|
} : Record<never, never>) : Record<never, never> : Record<never, never>;
|
|
44
45
|
type CollectionConveniences<Collection, Requirement, Contract, Model extends string> = Contract extends AnyPostgresContract ? Collection extends PrismaCollection<Contract, Model, infer Row, infer _State> ? {
|
|
45
46
|
readonly stream: Stream.Stream<Row, PrismaError, Requirement>;
|
|
47
|
+
count(): RelationQuery<number, Requirement, Contract, Model>;
|
|
46
48
|
exists(): Effect.Effect<boolean, PrismaError, Requirement>;
|
|
47
49
|
} : Record<never, never> : CollectionResult<Collection> extends ReadonlyArray<infer Row> ? {
|
|
48
50
|
readonly stream: Stream.Stream<Row, PrismaError, Requirement>;
|
|
51
|
+
count(): Effect.Effect<number, PrismaError, Requirement>;
|
|
49
52
|
exists(): Effect.Effect<boolean, PrismaError, Requirement>;
|
|
50
53
|
} : Record<never, never>;
|
|
51
|
-
export type PrismaRelationMethods<Collection, Requirement, Contract, Model extends string> = SelectMethod<Collection, Requirement, Contract, Model> & AggregateMethod<Collection, Requirement, Contract, Model> & CollectionMethods<Collection, Requirement, Contract, Model> & CollectionConveniences<Collection, Requirement, Contract, Model>;
|
|
54
|
+
export type PrismaRelationMethods<Collection, Requirement, Contract, Model extends string> = SelectMethod<Collection, Requirement, Contract, Model> & IncludeMethod<Collection, Requirement, Contract, Model> & AggregateMethod<Collection, Requirement, Contract, Model> & CollectionMethods<Collection, Requirement, Contract, Model> & CollectionConveniences<Collection, Requirement, Contract, Model>;
|
|
52
55
|
export {};
|
|
53
56
|
//# sourceMappingURL=prisma-methods.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-methods.d.ts","sourceRoot":"","sources":["../../src/relation/prisma-methods.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EACX,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,UAAU,IAAI,gBAAgB,EAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"prisma-methods.d.ts","sourceRoot":"","sources":["../../src/relation/prisma-methods.ts"],"names":[],"mappings":"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"}
|
package/dist/relation.d.ts
CHANGED
|
@@ -22,6 +22,13 @@ type ExplicitPrismaMethod = "aggregate" | "avg" | "combine" | "count" | "cursor"
|
|
|
22
22
|
type RelationMethods<Collection, Requirement, Contract, Model extends string> = {
|
|
23
23
|
readonly [Key in Exclude<FunctionKeys<Collection>, ExplicitPrismaMethod>]: WrapFunction<Key, Collection[Key], Requirement, Contract, Model>;
|
|
24
24
|
};
|
|
25
|
-
|
|
25
|
+
declare const RelationQueryTypeId: unique symbol;
|
|
26
|
+
export type RelationQuery<Value, Requirement, Contract, Model extends string> = Effect.Effect<Value, PrismaError, Requirement> & {
|
|
27
|
+
readonly [RelationQueryTypeId]: {
|
|
28
|
+
readonly contract: Contract;
|
|
29
|
+
readonly model: Model;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export type Relation<Collection, Requirement, Contract = undefined, Model extends string = string> = RelationQuery<CollectionResult<Collection>, Requirement, Contract, Model> & RelationMethods<Collection, Requirement, Contract, Model> & PrismaRelationMethods<Collection, Requirement, Contract, Model>;
|
|
26
33
|
export {};
|
|
27
34
|
//# sourceMappingURL=relation.d.ts.map
|
package/dist/relation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../src/relation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,KAAK,WAAW,GAAG,CAAC,GAAG,UAAU,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC;AAEpE,MAAM,MAAM,gBAAgB,CAAC,UAAU,IAAI,UAAU,SAAS;IAC7D,GAAG,IAAI,MAAM,MAAM,CAAC;CACpB,GACE,OAAO,CAAC,MAAM,CAAC,GACf,KAAK,CAAC;AAET,KAAK,iBAAiB,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,SAAS,OAAO,GACxD,OAAO,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GACrD,MAAM,CAAC;AAEV,KAAK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,SAAS,MAAM,IACxE,MAAM,SAAS,WAAW,CAAC,MAAM,KAAK,CAAC,GACpC,MAAM,CAAC,MAAM,CACb,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EACvC,WAAW,EACX,WAAW,CACX,GACA,MAAM,SAAS,MAAM,GACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,GAC9C,KAAK,CAAC;AAEX,KAAK,YAAY,CAChB,IAAI,EACJ,SAAS,EACT,WAAW,EACX,QAAQ,EACR,KAAK,SAAS,MAAM,IACjB,SAAS,SAAS;IACrB,CAAC,GAAG,UAAU,EAAE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;IACjD,CAAC,GAAG,UAAU,EAAE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;IACjD,CAAC,GAAG,UAAU,EAAE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;IACjD,CAAC,GAAG,UAAU,EAAE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;IACjD,CAAC,GAAG,UAAU,EAAE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;IACjD,CAAC,GAAG,UAAU,EAAE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;CACjD,GACE,CAAC,CACD,GAAG,UAAU,EAAE,UAAU,KACrB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,GAC5D,CAAC,CACA,GAAG,UAAU,EAAE,UAAU,KACrB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,GAC7D,CAAC,CACA,GAAG,UAAU,EAAE,UAAU,KACrB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,GAC7D,CAAC,CACA,GAAG,UAAU,EAAE,UAAU,KACrB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,GAC7D,CAAC,CACA,GAAG,UAAU,EAAE,UAAU,KACrB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,GAC7D,CAAC,CACA,GAAG,UAAU,EAAE,UAAU,KACrB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,GAC7D,KAAK,CAAC;AAET,KAAK,YAAY,CAAC,KAAK,IAAI;KACzB,GAAG,IAAI,MAAM,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,WAAW,GAAG,GAAG,GAAG,KAAK;CACpE,CAAC,MAAM,KAAK,CAAC,CAAC;AAEf,KAAK,oBAAoB,GACtB,WAAW,GACX,KAAK,GACL,SAAS,GACT,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,aAAa,GACb,UAAU,GACV,YAAY,GACZ,SAAS,GACT,SAAS,GACT,KAAK,GACL,KAAK,GACL,QAAQ,GACR,KAAK,GACL,SAAS,CAAC;AAEb,KAAK,eAAe,CACnB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,KAAK,SAAS,MAAM,IACjB;IACH,QAAQ,EAAE,GAAG,IAAI,OAAO,CACvB,YAAY,CAAC,UAAU,CAAC,EACxB,oBAAoB,CACpB,GAAG,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,QAAQ,CACnB,UAAU,EACV,WAAW,EACX,QAAQ,GAAG,SAAS,EACpB,KAAK,SAAS,MAAM,GAAG,MAAM,IAC1B,
|
|
1
|
+
{"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../src/relation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/internal/recipe.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { getRelationPlan, type RelationPlan } from "./relation-plan.js";
|
|
2
|
+
|
|
1
3
|
export interface RelationOperation {
|
|
2
4
|
readonly name: PropertyKey;
|
|
3
5
|
readonly arguments: ReadonlyArray<unknown>;
|
|
@@ -40,32 +42,107 @@ const operations = (
|
|
|
40
42
|
return reversed.reverse();
|
|
41
43
|
};
|
|
42
44
|
|
|
45
|
+
const applyMethod = (
|
|
46
|
+
current: unknown,
|
|
47
|
+
name: PropertyKey,
|
|
48
|
+
arguments_: ReadonlyArray<unknown>,
|
|
49
|
+
model: string,
|
|
50
|
+
): unknown => {
|
|
51
|
+
if (
|
|
52
|
+
typeof current !== "object" ||
|
|
53
|
+
current === null ||
|
|
54
|
+
typeof Reflect.get(current, name) !== "function"
|
|
55
|
+
) {
|
|
56
|
+
throw new TypeError(`Cannot call ${String(name)} while replaying ${model}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const method = Reflect.get(current, name) as (
|
|
60
|
+
...arguments_: ReadonlyArray<unknown>
|
|
61
|
+
) => unknown;
|
|
62
|
+
return Reflect.apply(method, current, arguments_);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const replayPlan = (collection: unknown, plan: RelationPlan): unknown => {
|
|
66
|
+
const relatedModel =
|
|
67
|
+
typeof collection === "object" && collection !== null
|
|
68
|
+
? Reflect.get(collection, "modelName")
|
|
69
|
+
: undefined;
|
|
70
|
+
if (typeof relatedModel === "string" && relatedModel !== plan.recipe.model) {
|
|
71
|
+
throw new TypeError(
|
|
72
|
+
`Included relation expects ${relatedModel}, received ${plan.recipe.model}`,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const refined = replayRecipeFrom(collection, plan.recipe);
|
|
77
|
+
if (plan.terminal !== "count") {
|
|
78
|
+
return refined;
|
|
79
|
+
}
|
|
80
|
+
return applyMethod(refined, "count", [], plan.recipe.model);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const includeRefinement = (
|
|
84
|
+
value: unknown,
|
|
85
|
+
): ((collection: unknown) => unknown) => {
|
|
86
|
+
const plan = getRelationPlan(value);
|
|
87
|
+
if (plan !== undefined) {
|
|
88
|
+
return (collection) => replayPlan(collection, plan);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
92
|
+
throw new TypeError(
|
|
93
|
+
"An included relation must be a Relation or query record",
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const entries = Object.entries(value);
|
|
98
|
+
if (entries.length === 0) {
|
|
99
|
+
throw new TypeError("An included query record cannot be empty");
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const plans = entries.map(([name, query]) => {
|
|
103
|
+
const queryPlan = getRelationPlan(query);
|
|
104
|
+
if (queryPlan === undefined) {
|
|
105
|
+
throw new TypeError(`Included query "${name}" is not a Relation`);
|
|
106
|
+
}
|
|
107
|
+
return [name, queryPlan] as const;
|
|
108
|
+
});
|
|
109
|
+
const model = plans[0]?.[1].recipe.model;
|
|
110
|
+
if (plans.some(([, queryPlan]) => queryPlan.recipe.model !== model)) {
|
|
111
|
+
throw new TypeError("Included queries must use the same related model");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return (collection) => {
|
|
115
|
+
const branches = Object.fromEntries(
|
|
116
|
+
plans.map(([name, queryPlan]) => [
|
|
117
|
+
name,
|
|
118
|
+
replayPlan(collection, queryPlan),
|
|
119
|
+
]),
|
|
120
|
+
);
|
|
121
|
+
return applyMethod(collection, "combine", [branches], model ?? "relation");
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
const replayRecipeFrom = (root: unknown, recipe: RelationRecipe): unknown => {
|
|
126
|
+
let current = root;
|
|
127
|
+
for (const operation of operations(recipe)) {
|
|
128
|
+
const arguments_ =
|
|
129
|
+
operation.name === "include" && operation.arguments.length === 2
|
|
130
|
+
? [operation.arguments[0], includeRefinement(operation.arguments[1])]
|
|
131
|
+
: operation.arguments;
|
|
132
|
+
current = applyMethod(current, operation.name, arguments_, recipe.model);
|
|
133
|
+
}
|
|
134
|
+
return current;
|
|
135
|
+
};
|
|
136
|
+
|
|
43
137
|
export const replayRecipe = (
|
|
44
138
|
models: object,
|
|
45
139
|
recipe: RelationRecipe,
|
|
46
140
|
): unknown => {
|
|
47
|
-
|
|
141
|
+
const current: unknown = Reflect.get(models, recipe.model);
|
|
48
142
|
|
|
49
143
|
if (current === undefined) {
|
|
50
144
|
throw new TypeError(`Unknown Prisma model: ${recipe.model}`);
|
|
51
145
|
}
|
|
52
146
|
|
|
53
|
-
|
|
54
|
-
if (
|
|
55
|
-
typeof current !== "object" ||
|
|
56
|
-
current === null ||
|
|
57
|
-
typeof Reflect.get(current, operation.name) !== "function"
|
|
58
|
-
) {
|
|
59
|
-
throw new TypeError(
|
|
60
|
-
`Cannot call ${String(operation.name)} while replaying ${recipe.model}`,
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const method = Reflect.get(current, operation.name) as (
|
|
65
|
-
...arguments_: ReadonlyArray<unknown>
|
|
66
|
-
) => unknown;
|
|
67
|
-
current = Reflect.apply(method, current, operation.arguments);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return current;
|
|
147
|
+
return replayRecipeFrom(current, recipe);
|
|
71
148
|
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { RelationRecipe } from "./recipe.js";
|
|
2
|
+
|
|
3
|
+
export const RelationPlanTypeId = Symbol.for(
|
|
4
|
+
"@shivaedev/effect-prisma/RelationPlan",
|
|
5
|
+
);
|
|
6
|
+
|
|
7
|
+
export interface RelationPlan {
|
|
8
|
+
readonly recipe: RelationRecipe;
|
|
9
|
+
readonly terminal?: PropertyKey;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const getRelationPlan = (value: unknown): RelationPlan | undefined => {
|
|
13
|
+
if (
|
|
14
|
+
typeof value !== "object" ||
|
|
15
|
+
value === null ||
|
|
16
|
+
!Reflect.has(value, RelationPlanTypeId)
|
|
17
|
+
) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return Reflect.get(value, RelationPlanTypeId) as RelationPlan;
|
|
22
|
+
};
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
replayRecipe,
|
|
15
15
|
rootRecipe,
|
|
16
16
|
} from "./recipe.js";
|
|
17
|
+
import { RelationPlanTypeId } from "./relation-plan.js";
|
|
17
18
|
|
|
18
19
|
type AnyFunction = (...arguments_: ReadonlyArray<never>) => unknown;
|
|
19
20
|
|
|
@@ -33,6 +34,22 @@ const evaluateResult = (
|
|
|
33
34
|
value: unknown,
|
|
34
35
|
terminal: PropertyKey | undefined,
|
|
35
36
|
): Effect.Effect<unknown, PrismaError> => {
|
|
37
|
+
if (
|
|
38
|
+
terminal === "count" &&
|
|
39
|
+
typeof value === "object" &&
|
|
40
|
+
value !== null &&
|
|
41
|
+
typeof Reflect.get(value, "aggregate") === "function"
|
|
42
|
+
) {
|
|
43
|
+
const aggregate = Reflect.apply(
|
|
44
|
+
Reflect.get(value, "aggregate") as AnyFunction,
|
|
45
|
+
value,
|
|
46
|
+
[(summary: { count(): unknown }) => ({ count: summary.count() })],
|
|
47
|
+
);
|
|
48
|
+
return fromPrismaPromise(
|
|
49
|
+
() => aggregate as PromiseLike<{ count: number }>,
|
|
50
|
+
).pipe(Effect.map((result) => result.count));
|
|
51
|
+
}
|
|
52
|
+
|
|
36
53
|
if (
|
|
37
54
|
terminal === "exists" &&
|
|
38
55
|
typeof value === "object" &&
|
|
@@ -75,6 +92,10 @@ interface RelationValue<
|
|
|
75
92
|
Models extends object,
|
|
76
93
|
Contract extends AnyPostgresContract,
|
|
77
94
|
> extends Effect.Effect<unknown, PrismaError, ExecutorIdentifier<Models>> {
|
|
95
|
+
readonly [RelationPlanTypeId]: {
|
|
96
|
+
readonly recipe: RelationRecipe;
|
|
97
|
+
readonly terminal?: PropertyKey;
|
|
98
|
+
};
|
|
78
99
|
readonly runtime: RelationRuntime<Models, Contract>;
|
|
79
100
|
readonly stream: Stream.Stream<
|
|
80
101
|
unknown,
|
|
@@ -172,6 +193,10 @@ const makeRelationProxy = <
|
|
|
172
193
|
runtime: RelationRuntime<Models, Contract>,
|
|
173
194
|
): unknown => {
|
|
174
195
|
const target = Object.assign(Object.create(RelationPrototype), {
|
|
196
|
+
[RelationPlanTypeId]: {
|
|
197
|
+
recipe: runtime.recipe,
|
|
198
|
+
...(runtime.terminal === undefined ? {} : { terminal: runtime.terminal }),
|
|
199
|
+
},
|
|
175
200
|
runtime,
|
|
176
201
|
}) as RelationValue<Models, Contract>;
|
|
177
202
|
|
|
@@ -190,6 +215,13 @@ const makeRelationProxy = <
|
|
|
190
215
|
terminal: "exists",
|
|
191
216
|
});
|
|
192
217
|
}
|
|
218
|
+
if (property === "count") {
|
|
219
|
+
return () =>
|
|
220
|
+
makeRelationProxy({
|
|
221
|
+
...runtime,
|
|
222
|
+
terminal: "count",
|
|
223
|
+
});
|
|
224
|
+
}
|
|
193
225
|
return (...arguments_: ReadonlyArray<unknown>) =>
|
|
194
226
|
makeRelationProxy({
|
|
195
227
|
...runtime,
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { Contract as PrismaContract } from "@prisma-next/contract/types";
|
|
2
|
+
import type { SqlStorage } from "@prisma-next/sql-contract/types";
|
|
3
|
+
import type { RelationsOf } from "@prisma-next/sql-orm-client";
|
|
4
|
+
|
|
5
|
+
export type AnyPostgresContract = PrismaContract<SqlStorage>;
|
|
6
|
+
|
|
7
|
+
type RelationDefinition<
|
|
8
|
+
Contract extends AnyPostgresContract,
|
|
9
|
+
Model extends string,
|
|
10
|
+
RelationName extends string,
|
|
11
|
+
> = RelationName extends keyof RelationsOf<Contract, Model>
|
|
12
|
+
? RelationsOf<Contract, Model>[RelationName]
|
|
13
|
+
: never;
|
|
14
|
+
|
|
15
|
+
type RelationCardinalityOf<
|
|
16
|
+
Contract extends AnyPostgresContract,
|
|
17
|
+
Model extends string,
|
|
18
|
+
RelationName extends string,
|
|
19
|
+
> =
|
|
20
|
+
RelationDefinition<Contract, Model, RelationName> extends {
|
|
21
|
+
readonly cardinality: infer Cardinality extends string;
|
|
22
|
+
}
|
|
23
|
+
? Cardinality
|
|
24
|
+
: never;
|
|
25
|
+
|
|
26
|
+
export type IsToManyRelation<
|
|
27
|
+
Contract extends AnyPostgresContract,
|
|
28
|
+
Model extends string,
|
|
29
|
+
RelationName extends string,
|
|
30
|
+
> =
|
|
31
|
+
RelationCardinalityOf<Contract, Model, RelationName> extends "1:N" | "N:M"
|
|
32
|
+
? true
|
|
33
|
+
: false;
|
|
34
|
+
|
|
35
|
+
export type RelatedModelNameOf<
|
|
36
|
+
Contract extends AnyPostgresContract,
|
|
37
|
+
Model extends string,
|
|
38
|
+
RelationName extends string,
|
|
39
|
+
> =
|
|
40
|
+
RelationDefinition<Contract, Model, RelationName> extends {
|
|
41
|
+
readonly to: { readonly model: infer Related extends string };
|
|
42
|
+
}
|
|
43
|
+
? Related
|
|
44
|
+
: never;
|
|
45
|
+
|
|
46
|
+
type RelationLocalFields<
|
|
47
|
+
Contract extends AnyPostgresContract,
|
|
48
|
+
Model extends string,
|
|
49
|
+
RelationName extends string,
|
|
50
|
+
> =
|
|
51
|
+
RelationDefinition<Contract, Model, RelationName> extends {
|
|
52
|
+
readonly on: {
|
|
53
|
+
readonly localFields: infer Fields extends readonly string[];
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
? Fields
|
|
57
|
+
: readonly [];
|
|
58
|
+
|
|
59
|
+
type DefaultNamespace<Contract extends AnyPostgresContract> =
|
|
60
|
+
Contract["domain"]["namespaces"][keyof Contract["domain"]["namespaces"]];
|
|
61
|
+
|
|
62
|
+
type ModelFields<Contract extends AnyPostgresContract, Model extends string> =
|
|
63
|
+
DefaultNamespace<Contract> extends {
|
|
64
|
+
readonly models: infer Models;
|
|
65
|
+
}
|
|
66
|
+
? Model extends keyof Models
|
|
67
|
+
? Models[Model] extends { readonly fields: infer Fields }
|
|
68
|
+
? Fields
|
|
69
|
+
: never
|
|
70
|
+
: never
|
|
71
|
+
: never;
|
|
72
|
+
|
|
73
|
+
type AnyNullableField<
|
|
74
|
+
Fields,
|
|
75
|
+
Names extends readonly string[],
|
|
76
|
+
> = Names extends readonly [
|
|
77
|
+
infer Head extends string,
|
|
78
|
+
...infer Tail extends readonly string[],
|
|
79
|
+
]
|
|
80
|
+
? Head extends keyof Fields
|
|
81
|
+
? Fields[Head] extends { readonly nullable: true }
|
|
82
|
+
? true
|
|
83
|
+
: AnyNullableField<Fields, Tail>
|
|
84
|
+
: true
|
|
85
|
+
: false;
|
|
86
|
+
|
|
87
|
+
export type IncludedRelationValue<
|
|
88
|
+
Contract extends AnyPostgresContract,
|
|
89
|
+
Model extends string,
|
|
90
|
+
RelationName extends string,
|
|
91
|
+
Value,
|
|
92
|
+
> =
|
|
93
|
+
RelationCardinalityOf<Contract, Model, RelationName> extends "1:N" | "N:M"
|
|
94
|
+
? Array<Value>
|
|
95
|
+
: RelationCardinalityOf<Contract, Model, RelationName> extends "N:1"
|
|
96
|
+
? AnyNullableField<
|
|
97
|
+
ModelFields<Contract, Model>,
|
|
98
|
+
RelationLocalFields<Contract, Model, RelationName>
|
|
99
|
+
> extends true
|
|
100
|
+
? Value | null
|
|
101
|
+
: Value
|
|
102
|
+
: Value | null;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DefaultModelRow,
|
|
3
|
+
Collection as PrismaCollection,
|
|
4
|
+
RelationNames,
|
|
5
|
+
} from "@prisma-next/sql-orm-client";
|
|
6
|
+
import type { Relation, RelationQuery } from "../relation.js";
|
|
7
|
+
import type {
|
|
8
|
+
AnyPostgresContract,
|
|
9
|
+
IncludedRelationValue,
|
|
10
|
+
IsToManyRelation,
|
|
11
|
+
RelatedModelNameOf,
|
|
12
|
+
} from "./include-metadata.js";
|
|
13
|
+
|
|
14
|
+
type Simplify<Value> = { [Key in keyof Value]: Value[Key] };
|
|
15
|
+
|
|
16
|
+
type QueryValue<Query> =
|
|
17
|
+
Query extends RelationQuery<
|
|
18
|
+
infer Value,
|
|
19
|
+
infer _Requirement,
|
|
20
|
+
infer _Contract,
|
|
21
|
+
infer _Model
|
|
22
|
+
>
|
|
23
|
+
? Value
|
|
24
|
+
: never;
|
|
25
|
+
|
|
26
|
+
type AcceptRelatedQuery<
|
|
27
|
+
Query,
|
|
28
|
+
Contract extends AnyPostgresContract,
|
|
29
|
+
Model extends string,
|
|
30
|
+
> =
|
|
31
|
+
Query extends RelationQuery<
|
|
32
|
+
infer _Value,
|
|
33
|
+
infer _Requirement,
|
|
34
|
+
infer QueryContract,
|
|
35
|
+
infer QueryModel
|
|
36
|
+
>
|
|
37
|
+
? [QueryContract] extends [Contract]
|
|
38
|
+
? [Contract] extends [QueryContract]
|
|
39
|
+
? QueryModel extends Model
|
|
40
|
+
? unknown
|
|
41
|
+
: never
|
|
42
|
+
: never
|
|
43
|
+
: never
|
|
44
|
+
: never;
|
|
45
|
+
|
|
46
|
+
type IncludedQueryValue<
|
|
47
|
+
Query,
|
|
48
|
+
Contract extends AnyPostgresContract,
|
|
49
|
+
Model extends string,
|
|
50
|
+
RelationName extends string,
|
|
51
|
+
> =
|
|
52
|
+
QueryValue<Query> extends ReadonlyArray<infer Row>
|
|
53
|
+
? IncludedRelationValue<Contract, Model, RelationName, Row>
|
|
54
|
+
: QueryValue<Query>;
|
|
55
|
+
|
|
56
|
+
type QueryShapeValue<Shape extends Readonly<Record<string, unknown>>> = {
|
|
57
|
+
readonly [Key in keyof Shape]: QueryValue<Shape[Key]>;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
type AcceptRelatedQueryShape<
|
|
61
|
+
Shape extends Readonly<Record<string, unknown>>,
|
|
62
|
+
Contract extends AnyPostgresContract,
|
|
63
|
+
Model extends string,
|
|
64
|
+
> = {
|
|
65
|
+
readonly [Key in keyof Shape]: Shape[Key] &
|
|
66
|
+
AcceptRelatedQuery<Shape[Key], Contract, Model>;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
type WithIncludedRelation<
|
|
70
|
+
Collection,
|
|
71
|
+
Contract extends AnyPostgresContract,
|
|
72
|
+
Model extends string,
|
|
73
|
+
RelationName extends string,
|
|
74
|
+
Value,
|
|
75
|
+
> =
|
|
76
|
+
Collection extends PrismaCollection<Contract, Model, infer Row, infer State>
|
|
77
|
+
? PrismaCollection<
|
|
78
|
+
Contract,
|
|
79
|
+
Model,
|
|
80
|
+
Simplify<Row & { readonly [Key in RelationName]: Value }>,
|
|
81
|
+
State
|
|
82
|
+
>
|
|
83
|
+
: never;
|
|
84
|
+
|
|
85
|
+
export type IncludeMethod<
|
|
86
|
+
Collection,
|
|
87
|
+
Requirement,
|
|
88
|
+
Contract,
|
|
89
|
+
Model extends string,
|
|
90
|
+
> = Contract extends AnyPostgresContract
|
|
91
|
+
? Collection extends PrismaCollection<
|
|
92
|
+
Contract,
|
|
93
|
+
Model,
|
|
94
|
+
infer _Row,
|
|
95
|
+
infer _State
|
|
96
|
+
>
|
|
97
|
+
? {
|
|
98
|
+
include<RelationName extends RelationNames<Contract, Model>>(
|
|
99
|
+
relationName: RelationName,
|
|
100
|
+
): Relation<
|
|
101
|
+
WithIncludedRelation<
|
|
102
|
+
Collection,
|
|
103
|
+
Contract,
|
|
104
|
+
Model,
|
|
105
|
+
RelationName,
|
|
106
|
+
IncludedRelationValue<
|
|
107
|
+
Contract,
|
|
108
|
+
Model,
|
|
109
|
+
RelationName,
|
|
110
|
+
DefaultModelRow<
|
|
111
|
+
Contract,
|
|
112
|
+
RelatedModelNameOf<Contract, Model, RelationName>
|
|
113
|
+
>
|
|
114
|
+
>
|
|
115
|
+
>,
|
|
116
|
+
Requirement,
|
|
117
|
+
Contract,
|
|
118
|
+
Model
|
|
119
|
+
>;
|
|
120
|
+
include<RelationName extends RelationNames<Contract, Model>, Query>(
|
|
121
|
+
relationName: RelationName,
|
|
122
|
+
query: Query &
|
|
123
|
+
AcceptRelatedQuery<
|
|
124
|
+
Query,
|
|
125
|
+
Contract,
|
|
126
|
+
RelatedModelNameOf<Contract, Model, RelationName>
|
|
127
|
+
>,
|
|
128
|
+
): Relation<
|
|
129
|
+
WithIncludedRelation<
|
|
130
|
+
Collection,
|
|
131
|
+
Contract,
|
|
132
|
+
Model,
|
|
133
|
+
RelationName,
|
|
134
|
+
IncludedQueryValue<Query, Contract, Model, RelationName>
|
|
135
|
+
>,
|
|
136
|
+
Requirement,
|
|
137
|
+
Contract,
|
|
138
|
+
Model
|
|
139
|
+
>;
|
|
140
|
+
include<
|
|
141
|
+
RelationName extends RelationNames<Contract, Model>,
|
|
142
|
+
Shape extends Readonly<Record<string, unknown>>,
|
|
143
|
+
>(
|
|
144
|
+
relationName: RelationName,
|
|
145
|
+
shape: IsToManyRelation<Contract, Model, RelationName> extends true
|
|
146
|
+
? keyof Shape extends never
|
|
147
|
+
? never
|
|
148
|
+
: Shape &
|
|
149
|
+
AcceptRelatedQueryShape<
|
|
150
|
+
Shape,
|
|
151
|
+
Contract,
|
|
152
|
+
RelatedModelNameOf<Contract, Model, RelationName>
|
|
153
|
+
>
|
|
154
|
+
: never,
|
|
155
|
+
): Relation<
|
|
156
|
+
WithIncludedRelation<
|
|
157
|
+
Collection,
|
|
158
|
+
Contract,
|
|
159
|
+
Model,
|
|
160
|
+
RelationName,
|
|
161
|
+
QueryShapeValue<Shape>
|
|
162
|
+
>,
|
|
163
|
+
Requirement,
|
|
164
|
+
Contract,
|
|
165
|
+
Model
|
|
166
|
+
>;
|
|
167
|
+
}
|
|
168
|
+
: Record<never, never>
|
|
169
|
+
: Record<never, never>;
|
|
@@ -10,7 +10,8 @@ import type {
|
|
|
10
10
|
} from "@prisma-next/sql-orm-client";
|
|
11
11
|
import type { Effect, Stream } from "effect";
|
|
12
12
|
import type { PrismaError } from "../error.js";
|
|
13
|
-
import type { CollectionResult, Relation } from "../relation.js";
|
|
13
|
+
import type { CollectionResult, Relation, RelationQuery } from "../relation.js";
|
|
14
|
+
import type { IncludeMethod } from "./include.js";
|
|
14
15
|
|
|
15
16
|
type AnyFunction = (...arguments_: ReadonlyArray<never>) => unknown;
|
|
16
17
|
type AnyPostgresContract = PrismaContract<SqlStorage>;
|
|
@@ -171,12 +172,14 @@ type CollectionConveniences<
|
|
|
171
172
|
>
|
|
172
173
|
? {
|
|
173
174
|
readonly stream: Stream.Stream<Row, PrismaError, Requirement>;
|
|
175
|
+
count(): RelationQuery<number, Requirement, Contract, Model>;
|
|
174
176
|
exists(): Effect.Effect<boolean, PrismaError, Requirement>;
|
|
175
177
|
}
|
|
176
178
|
: Record<never, never>
|
|
177
179
|
: CollectionResult<Collection> extends ReadonlyArray<infer Row>
|
|
178
180
|
? {
|
|
179
181
|
readonly stream: Stream.Stream<Row, PrismaError, Requirement>;
|
|
182
|
+
count(): Effect.Effect<number, PrismaError, Requirement>;
|
|
180
183
|
exists(): Effect.Effect<boolean, PrismaError, Requirement>;
|
|
181
184
|
}
|
|
182
185
|
: Record<never, never>;
|
|
@@ -187,6 +190,7 @@ export type PrismaRelationMethods<
|
|
|
187
190
|
Contract,
|
|
188
191
|
Model extends string,
|
|
189
192
|
> = SelectMethod<Collection, Requirement, Contract, Model> &
|
|
193
|
+
IncludeMethod<Collection, Requirement, Contract, Model> &
|
|
190
194
|
AggregateMethod<Collection, Requirement, Contract, Model> &
|
|
191
195
|
CollectionMethods<Collection, Requirement, Contract, Model> &
|
|
192
196
|
CollectionConveniences<Collection, Requirement, Contract, Model>;
|
package/src/relation.ts
CHANGED
|
@@ -94,11 +94,25 @@ type RelationMethods<
|
|
|
94
94
|
>]: WrapFunction<Key, Collection[Key], Requirement, Contract, Model>;
|
|
95
95
|
};
|
|
96
96
|
|
|
97
|
+
declare const RelationQueryTypeId: unique symbol;
|
|
98
|
+
|
|
99
|
+
export type RelationQuery<
|
|
100
|
+
Value,
|
|
101
|
+
Requirement,
|
|
102
|
+
Contract,
|
|
103
|
+
Model extends string,
|
|
104
|
+
> = Effect.Effect<Value, PrismaError, Requirement> & {
|
|
105
|
+
readonly [RelationQueryTypeId]: {
|
|
106
|
+
readonly contract: Contract;
|
|
107
|
+
readonly model: Model;
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
|
|
97
111
|
export type Relation<
|
|
98
112
|
Collection,
|
|
99
113
|
Requirement,
|
|
100
114
|
Contract = undefined,
|
|
101
115
|
Model extends string = string,
|
|
102
|
-
> =
|
|
116
|
+
> = RelationQuery<CollectionResult<Collection>, Requirement, Contract, Model> &
|
|
103
117
|
RelationMethods<Collection, Requirement, Contract, Model> &
|
|
104
118
|
PrismaRelationMethods<Collection, Requirement, Contract, Model>;
|