@shivaedev/effect-prisma 0.0.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 +22 -0
- package/LICENSE +21 -0
- package/README.md +150 -2
- package/dist/database.d.ts +35 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +83 -0
- package/dist/database.js.map +1 -0
- package/dist/error.d.ts +52 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +48 -0
- package/dist/error.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/client-lifecycle.d.ts +7 -0
- package/dist/internal/client-lifecycle.d.ts.map +1 -0
- package/dist/internal/client-lifecycle.js +19 -0
- package/dist/internal/client-lifecycle.js.map +1 -0
- package/dist/internal/executor.d.ts +16 -0
- package/dist/internal/executor.d.ts.map +1 -0
- package/dist/internal/executor.js +2 -0
- package/dist/internal/executor.js.map +1 -0
- package/dist/internal/promise.d.ts +4 -0
- package/dist/internal/promise.d.ts.map +1 -0
- package/dist/internal/promise.js +9 -0
- package/dist/internal/promise.js.map +1 -0
- package/dist/internal/recipe.d.ts +13 -0
- package/dist/internal/recipe.d.ts.map +1 -0
- package/dist/internal/recipe.js +92 -0
- package/dist/internal/recipe.js.map +1 -0
- 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 +5 -0
- package/dist/internal/relation-runtime.d.ts.map +1 -0
- package/dist/internal/relation-runtime.js +106 -0
- package/dist/internal/relation-runtime.js.map +1 -0
- package/dist/internal/testing.d.ts +11 -0
- package/dist/internal/testing.d.ts.map +1 -0
- package/dist/internal/testing.js +9 -0
- package/dist/internal/testing.js.map +1 -0
- package/dist/internal/transaction.d.ts +14 -0
- package/dist/internal/transaction.d.ts.map +1 -0
- package/dist/internal/transaction.js +79 -0
- package/dist/internal/transaction.js.map +1 -0
- package/dist/internal/vitest-database.d.ts +18 -0
- package/dist/internal/vitest-database.d.ts.map +1 -0
- package/dist/internal/vitest-database.js +73 -0
- package/dist/internal/vitest-database.js.map +1 -0
- 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 +56 -0
- package/dist/relation/prisma-methods.d.ts.map +1 -0
- package/dist/relation/prisma-methods.js +2 -0
- package/dist/relation/prisma-methods.js.map +1 -0
- package/dist/relation.d.ts +34 -0
- package/dist/relation.d.ts.map +1 -0
- package/dist/relation.js +2 -0
- package/dist/relation.js.map +1 -0
- package/dist/testing/transaction.d.ts +10 -0
- package/dist/testing/transaction.d.ts.map +1 -0
- package/dist/testing/transaction.js +6 -0
- package/dist/testing/transaction.js.map +1 -0
- package/dist/testing/types.d.ts +29 -0
- package/dist/testing/types.d.ts.map +1 -0
- package/dist/testing/types.js +2 -0
- package/dist/testing/types.js.map +1 -0
- package/dist/testing/vitest.d.ts +6 -0
- package/dist/testing/vitest.d.ts.map +1 -0
- package/dist/testing/vitest.js +28 -0
- package/dist/testing/vitest.js.map +1 -0
- package/dist/testing.d.ts +4 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +3 -0
- package/dist/testing.js.map +1 -0
- package/package.json +69 -4
- package/src/database.ts +232 -0
- package/src/error.ts +89 -0
- package/src/index.ts +14 -0
- package/src/internal/client-lifecycle.ts +31 -0
- package/src/internal/executor.ts +28 -0
- package/src/internal/promise.ts +16 -0
- package/src/internal/recipe.ts +148 -0
- package/src/internal/relation-plan.ts +22 -0
- package/src/internal/relation-runtime.ts +249 -0
- package/src/internal/testing.ts +32 -0
- package/src/internal/transaction.ts +149 -0
- package/src/internal/vitest-database.ts +210 -0
- package/src/relation/include-metadata.ts +102 -0
- package/src/relation/include.ts +169 -0
- package/src/relation/prisma-methods.ts +196 -0
- package/src/relation.ts +118 -0
- package/src/testing/transaction.ts +28 -0
- package/src/testing/types.ts +67 -0
- package/src/testing/vitest.ts +67 -0
- package/src/testing.ts +8 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { getRelationPlan } from "./relation-plan.js";
|
|
2
|
+
export const rootRecipe = (model) => ({ model });
|
|
3
|
+
export const appendOperation = (parent, name, arguments_) => ({
|
|
4
|
+
model: parent.model,
|
|
5
|
+
parent,
|
|
6
|
+
operation: {
|
|
7
|
+
name,
|
|
8
|
+
arguments: arguments_,
|
|
9
|
+
},
|
|
10
|
+
});
|
|
11
|
+
const operations = (recipe) => {
|
|
12
|
+
const reversed = [];
|
|
13
|
+
let current = recipe;
|
|
14
|
+
while (current !== undefined) {
|
|
15
|
+
if (current.operation !== undefined) {
|
|
16
|
+
reversed.push(current.operation);
|
|
17
|
+
}
|
|
18
|
+
current = current.parent;
|
|
19
|
+
}
|
|
20
|
+
return reversed.reverse();
|
|
21
|
+
};
|
|
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}`);
|
|
27
|
+
}
|
|
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`);
|
|
60
|
+
}
|
|
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);
|
|
82
|
+
}
|
|
83
|
+
return current;
|
|
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
|
+
};
|
|
92
|
+
//# sourceMappingURL=recipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../src/internal/recipe.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Context } from "effect";
|
|
2
|
+
import type { Relation } from "../relation.js";
|
|
3
|
+
import type { AnyPostgresContract, DatabaseExecutor, ExecutorIdentifier } from "./executor.js";
|
|
4
|
+
export declare const makeModelRelation: <Collection, Models extends object, Contract extends AnyPostgresContract = AnyPostgresContract>(executor: Context.Service<ExecutorIdentifier<Models>, DatabaseExecutor<Models, Contract>>, model: string) => Relation<Collection, ExecutorIdentifier<Models>>;
|
|
5
|
+
//# sourceMappingURL=relation-runtime.d.ts.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Effect, Effectable, Option, Stream } from "effect";
|
|
2
|
+
import { isPrismaFailure, toPrismaError } from "../error.js";
|
|
3
|
+
import { fromPrismaPromise } from "./promise.js";
|
|
4
|
+
import { appendOperation, replayRecipe, rootRecipe, } from "./recipe.js";
|
|
5
|
+
import { RelationPlanTypeId } from "./relation-plan.js";
|
|
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
|
+
}
|
|
14
|
+
if (terminal === "exists" &&
|
|
15
|
+
typeof value === "object" &&
|
|
16
|
+
value !== null &&
|
|
17
|
+
typeof Reflect.get(value, "first") === "function") {
|
|
18
|
+
const first = Reflect.apply(Reflect.get(value, "first"), value, []);
|
|
19
|
+
return fromPrismaPromise(() => first).pipe(Effect.map((result) => result !== null));
|
|
20
|
+
}
|
|
21
|
+
const executable = typeof value === "object" &&
|
|
22
|
+
value !== null &&
|
|
23
|
+
typeof Reflect.get(value, "all") === "function"
|
|
24
|
+
? Reflect.apply(Reflect.get(value, "all"), value, [])
|
|
25
|
+
: value;
|
|
26
|
+
if (typeof executable === "object" &&
|
|
27
|
+
executable !== null &&
|
|
28
|
+
"then" in executable) {
|
|
29
|
+
return fromPrismaPromise(() => executable).pipe(Effect.map((result) => terminal === "first" ? Option.fromNullishOr(result) : result));
|
|
30
|
+
}
|
|
31
|
+
return Effect.succeed(executable);
|
|
32
|
+
};
|
|
33
|
+
const relationEffect = (self) => Effect.flatMap(self.runtime.executor, (executor) => Effect.suspend(() => evaluateResult(replayRecipe(executor.models, self.runtime.recipe), self.runtime.terminal))).pipe(Effect.withSpan(`prisma.${self.runtime.recipe.model}.${String(self.runtime.terminal ?? "all")}`, {
|
|
34
|
+
kind: "client",
|
|
35
|
+
attributes: {
|
|
36
|
+
"db.system": "postgresql",
|
|
37
|
+
"db.model": self.runtime.recipe.model,
|
|
38
|
+
"db.operation": String(self.runtime.terminal ?? "all"),
|
|
39
|
+
},
|
|
40
|
+
}));
|
|
41
|
+
const relationStream = (self) => {
|
|
42
|
+
const result = Effect.map(self.runtime.executor, (executor) => {
|
|
43
|
+
const collection = replayRecipe(executor.models, self.runtime.recipe);
|
|
44
|
+
if (typeof collection !== "object" ||
|
|
45
|
+
collection === null ||
|
|
46
|
+
typeof Reflect.get(collection, "all") !== "function") {
|
|
47
|
+
throw new TypeError("Only collection Relations can be streamed");
|
|
48
|
+
}
|
|
49
|
+
return Reflect.apply(Reflect.get(collection, "all"), collection, []);
|
|
50
|
+
});
|
|
51
|
+
return Stream.unwrap(Effect.map(result, (iterable) => Stream.fromAsyncIterable(iterable, (error) => error).pipe(Stream.catch((error) => isPrismaFailure(error)
|
|
52
|
+
? Stream.fail(toPrismaError(error))
|
|
53
|
+
: Stream.die(error)))));
|
|
54
|
+
};
|
|
55
|
+
const RelationPrototype = {
|
|
56
|
+
...Effectable.Prototype({
|
|
57
|
+
label: "EffectPrismaRelation",
|
|
58
|
+
evaluate() {
|
|
59
|
+
return relationEffect(this);
|
|
60
|
+
},
|
|
61
|
+
}),
|
|
62
|
+
get stream() {
|
|
63
|
+
return relationStream(this);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
const makeRelationProxy = (runtime) => {
|
|
67
|
+
const target = Object.assign(Object.create(RelationPrototype), {
|
|
68
|
+
[RelationPlanTypeId]: {
|
|
69
|
+
recipe: runtime.recipe,
|
|
70
|
+
...(runtime.terminal === undefined ? {} : { terminal: runtime.terminal }),
|
|
71
|
+
},
|
|
72
|
+
runtime,
|
|
73
|
+
});
|
|
74
|
+
return new Proxy(target, {
|
|
75
|
+
get(self, property, receiver) {
|
|
76
|
+
if (property === "then") {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
if (Reflect.has(self, property)) {
|
|
80
|
+
return Reflect.get(self, property, receiver);
|
|
81
|
+
}
|
|
82
|
+
if (property === "exists") {
|
|
83
|
+
return () => makeRelationProxy({
|
|
84
|
+
...runtime,
|
|
85
|
+
terminal: "exists",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (property === "count") {
|
|
89
|
+
return () => makeRelationProxy({
|
|
90
|
+
...runtime,
|
|
91
|
+
terminal: "count",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return (...arguments_) => makeRelationProxy({
|
|
95
|
+
...runtime,
|
|
96
|
+
recipe: appendOperation(runtime.recipe, property, arguments_),
|
|
97
|
+
terminal: property,
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
export const makeModelRelation = (executor, model) => makeRelationProxy({
|
|
103
|
+
executor,
|
|
104
|
+
recipe: rootRecipe(model),
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=relation-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-runtime.js","sourceRoot":"","sources":["../../src/internal/relation-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Effect } from "effect";
|
|
2
|
+
import type { PrismaError } from "../error.js";
|
|
3
|
+
export declare const DatabaseTestingTypeId: unique symbol;
|
|
4
|
+
export interface DatabaseTesting<Requirement> {
|
|
5
|
+
readonly withTestTransaction: <A, E, R>(program: Effect.Effect<A, E, R>) => Effect.Effect<A, E | PrismaError, R | Requirement>;
|
|
6
|
+
}
|
|
7
|
+
export interface DatabaseWithTesting<Requirement> {
|
|
8
|
+
readonly [DatabaseTestingTypeId]: DatabaseTesting<Requirement>;
|
|
9
|
+
}
|
|
10
|
+
export declare const getDatabaseTesting: <Requirement>(database: object) => DatabaseTesting<Requirement>;
|
|
11
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/internal/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,eAAO,MAAM,qBAAqB,EAAE,OAAO,MAE1C,CAAC;AAEF,MAAM,WAAW,eAAe,CAAC,WAAW;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACrC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB,CAAC,WAAW;IAC/C,QAAQ,CAAC,CAAC,qBAAqB,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;CAC/D;AAED,eAAO,MAAM,kBAAkB,GAAI,WAAW,EAC7C,UAAU,MAAM,KACd,eAAe,CAAC,WAAW,CAY7B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const DatabaseTestingTypeId = Symbol.for("@shivaedev/effect-prisma/DatabaseTesting");
|
|
2
|
+
export const getDatabaseTesting = (database) => {
|
|
3
|
+
const testing = Reflect.get(database, DatabaseTestingTypeId);
|
|
4
|
+
if (testing === undefined) {
|
|
5
|
+
throw new TypeError("The database was not created by this copy of @shivaedev/effect-prisma");
|
|
6
|
+
}
|
|
7
|
+
return testing;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/internal/testing.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,qBAAqB,GAAkB,MAAM,CAAC,GAAG,CAC7D,0CAA0C,CAC1C,CAAC;AAYF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,QAAgB,EACe,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,qBAAqB,CAE/C,CAAC;IAEb,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,SAAS,CAClB,uEAAuE,CACvE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PostgresClient } from "@prisma-next/postgres/runtime";
|
|
2
|
+
import type { RuntimeConnection, RuntimeTransaction } from "@prisma-next/sql-runtime";
|
|
3
|
+
import { Effect, Exit } from "effect";
|
|
4
|
+
import type { PrismaError } from "../error.js";
|
|
5
|
+
import type { AnyPostgresContract, DatabaseExecutor } from "./executor.js";
|
|
6
|
+
export interface TransactionResource<Models extends object, Contract extends AnyPostgresContract> {
|
|
7
|
+
readonly connection: RuntimeConnection;
|
|
8
|
+
readonly transaction: RuntimeTransaction;
|
|
9
|
+
readonly executor: DatabaseExecutor<Models, Contract>;
|
|
10
|
+
}
|
|
11
|
+
export declare const acquireTransaction: <Models extends object, Contract extends AnyPostgresContract>(current: DatabaseExecutor<Models, Contract>, models: (orm: PostgresClient<Contract>["orm"]) => Models) => Effect.Effect<TransactionResource<Models, Contract>, PrismaError>;
|
|
12
|
+
export declare const releaseTransaction: <Models extends object, Contract extends AnyPostgresContract, A, E>(resource: TransactionResource<Models, Contract>, exit: Exit.Exit<A, E>) => Effect.Effect<void, PrismaError>;
|
|
13
|
+
export declare const releaseTestTransaction: <Models extends object, Contract extends AnyPostgresContract, A, E>(resource: TransactionResource<Models, Contract>, exit: Exit.Exit<A, E>) => Effect.Effect<void, PrismaError>;
|
|
14
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/internal/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EACX,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG3E,MAAM,WAAW,mBAAmB,CACnC,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB;IAEpC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACtD;AASD,eAAO,MAAM,kBAAkB,GAC9B,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB,EAEpC,SAAS,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC3C,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,MAAM,KACtD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,CAwBhE,CAAC;AAEJ,eAAO,MAAM,kBAAkB,GAC9B,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB,EACpC,CAAC,EACD,CAAC,EAED,UAAU,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/C,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAA4C,CAAC;AAE/E,eAAO,MAAM,sBAAsB,GAClC,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB,EACpC,CAAC,EACD,CAAC,EAED,UAAU,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/C,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAA6C,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { orm } from "@prisma-next/sql-orm-client";
|
|
2
|
+
import { Effect, Exit } from "effect";
|
|
3
|
+
import { fromPrismaPromise } from "./promise.js";
|
|
4
|
+
const runtimeFailure = (code, cause, details) => Object.assign(new Error(code, { cause }), { code, ...details });
|
|
5
|
+
export const acquireTransaction = (current, models) => fromPrismaPromise(async () => {
|
|
6
|
+
const connection = await current.client.runtime().connection();
|
|
7
|
+
try {
|
|
8
|
+
const transaction = await connection.transaction();
|
|
9
|
+
const transactionOrm = orm({
|
|
10
|
+
runtime: transaction,
|
|
11
|
+
context: current.client.context,
|
|
12
|
+
});
|
|
13
|
+
return {
|
|
14
|
+
connection,
|
|
15
|
+
transaction,
|
|
16
|
+
executor: {
|
|
17
|
+
client: current.client,
|
|
18
|
+
models: models(transactionOrm),
|
|
19
|
+
transactional: true,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
await connection.destroy(error).catch(() => undefined);
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
export const releaseTransaction = (resource, exit) => settleTransaction(resource, exit, true);
|
|
29
|
+
export const releaseTestTransaction = (resource, exit) => settleTransaction(resource, exit, false);
|
|
30
|
+
const settleTransaction = (resource, exit, commitOnSuccess) => Effect.uninterruptible(fromPrismaPromise(async () => {
|
|
31
|
+
let disposed = false;
|
|
32
|
+
let failure;
|
|
33
|
+
const destroy = async (reason) => {
|
|
34
|
+
if (disposed) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
disposed = true;
|
|
38
|
+
await resource.connection.destroy(reason).catch(() => undefined);
|
|
39
|
+
};
|
|
40
|
+
if (commitOnSuccess && Exit.isSuccess(exit)) {
|
|
41
|
+
try {
|
|
42
|
+
await resource.transaction.commit();
|
|
43
|
+
}
|
|
44
|
+
catch (commitError) {
|
|
45
|
+
try {
|
|
46
|
+
await resource.transaction.rollback();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
await destroy(commitError);
|
|
50
|
+
}
|
|
51
|
+
failure = runtimeFailure("RUNTIME.TRANSACTION_COMMIT_FAILED", commitError);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
try {
|
|
56
|
+
await resource.transaction.rollback();
|
|
57
|
+
}
|
|
58
|
+
catch (rollbackError) {
|
|
59
|
+
await destroy(rollbackError);
|
|
60
|
+
failure = runtimeFailure("RUNTIME.TRANSACTION_ROLLBACK_FAILED", rollbackError);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (!disposed) {
|
|
64
|
+
try {
|
|
65
|
+
await resource.connection.release();
|
|
66
|
+
}
|
|
67
|
+
catch (releaseError) {
|
|
68
|
+
await destroy(releaseError);
|
|
69
|
+
if (failure !== undefined) {
|
|
70
|
+
throw runtimeFailure("RUNTIME.TRANSACTION_RELEASE_FAILED", failure, { releaseError });
|
|
71
|
+
}
|
|
72
|
+
throw releaseError;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (failure !== undefined) {
|
|
76
|
+
throw failure;
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
//# sourceMappingURL=transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/internal/transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TestContext, TestOptions } from "@effect/vitest";
|
|
2
|
+
import { type Context, Effect } from "effect";
|
|
3
|
+
import type { AnyDatabase, DatabaseRequirement, DatabaseTester } from "../testing/types.js";
|
|
4
|
+
export declare const fixtureName = "__effectPrismaContext";
|
|
5
|
+
export type DatabaseFixture<Provided> = TestContext & {
|
|
6
|
+
readonly [fixtureName]: Context.Context<Provided>;
|
|
7
|
+
};
|
|
8
|
+
export interface FixtureTestApi<Provided> {
|
|
9
|
+
(name: string, options: TestOptions, body: (context: DatabaseFixture<Provided>) => Promise<unknown>): void;
|
|
10
|
+
readonly skip: FixtureTestApi<Provided>;
|
|
11
|
+
readonly skipIf: (condition: unknown) => FixtureTestApi<Provided>;
|
|
12
|
+
readonly runIf: (condition: unknown) => FixtureTestApi<Provided>;
|
|
13
|
+
readonly only: FixtureTestApi<Provided>;
|
|
14
|
+
readonly fails: FixtureTestApi<Provided>;
|
|
15
|
+
readonly for: <Item>(cases: ReadonlyArray<Item>) => (name: string, options: TestOptions, body: (item: Item, context: DatabaseFixture<Provided>) => Promise<unknown>) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare const makeDatabaseTester: <Database extends AnyDatabase, Provided>(fixtureIt: FixtureTestApi<Provided | DatabaseRequirement<Database> | Effect.Services<Database>>, database: Database) => DatabaseTester<Database, Provided | DatabaseRequirement<Database> | Effect.Services<Database>>;
|
|
18
|
+
//# sourceMappingURL=vitest-database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest-database.d.ts","sourceRoot":"","sources":["../../src/internal/vitest-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,EAA2B,MAAM,QAAQ,CAAC;AAI9E,OAAO,KAAK,EACX,WAAW,EACX,mBAAmB,EAGnB,cAAc,EACd,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,WAAW,0BAA0B,CAAC;AAEnD,MAAM,MAAM,eAAe,CAAC,QAAQ,IAAI,WAAW,GAAG;IACrD,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,WAAW,cAAc,CAAC,QAAQ;IACvC,CACC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5D,IAAI,CAAC;IACR,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClE,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAClB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,KACtB,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,KACtE,IAAI,CAAC;CACV;AAwCD,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,WAAW,EAAE,QAAQ,EACxE,WAAW,cAAc,CACxB,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACpE,EACD,UAAU,QAAQ,KAChB,cAAc,CAChB,QAAQ,EACR,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CA6HpE,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Cause, Effect, Exit, Layer } from "effect";
|
|
2
|
+
import * as TestClock from "effect/testing/TestClock";
|
|
3
|
+
import * as TestConsole from "effect/testing/TestConsole";
|
|
4
|
+
import { withTestTransaction } from "../testing/transaction.js";
|
|
5
|
+
export const fixtureName = "__effectPrismaContext";
|
|
6
|
+
const TestEnvironment = Layer.mergeAll(TestConsole.layer, TestClock.layer());
|
|
7
|
+
const contextFrom = (context) => context[fixtureName];
|
|
8
|
+
const runEffectTest = (effect, context) => Effect.runPromise(Effect.gen(function* () {
|
|
9
|
+
const exit = yield* Effect.exit(effect);
|
|
10
|
+
if (Exit.isFailure(exit)) {
|
|
11
|
+
for (const error of Cause.prettyErrors(exit.cause)) {
|
|
12
|
+
yield* Effect.logError(error);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return yield* exit;
|
|
16
|
+
}).pipe(Effect.scoped, Effect.provide(TestEnvironment)), { signal: context.signal });
|
|
17
|
+
const normalizeTestOptions = (options) => typeof options === "number" ? { timeout: options } : (options ?? {});
|
|
18
|
+
const restoreContext = (fixture, context) => ({
|
|
19
|
+
...context,
|
|
20
|
+
[fixtureName]: fixture,
|
|
21
|
+
});
|
|
22
|
+
export const makeDatabaseTester = (fixtureIt, database) => {
|
|
23
|
+
const run = (body, context) => {
|
|
24
|
+
const effect = withTestTransaction(database, Effect.gen(function* () {
|
|
25
|
+
const service = yield* database;
|
|
26
|
+
return yield* Effect.gen(() => body(service, context));
|
|
27
|
+
})).pipe(Effect.provide(contextFrom(context)));
|
|
28
|
+
// The callback constraint proves that its services are in the built
|
|
29
|
+
// Layer. TypeScript cannot reduce that generic Exclude after
|
|
30
|
+
// Effect.provide, so the runner closes the type at this private boundary.
|
|
31
|
+
return effect;
|
|
32
|
+
};
|
|
33
|
+
const register = (current) => (name, body, options) => current(name, normalizeTestOptions(options), ({ __effectPrismaContext, task, signal, onTestFailed, onTestFinished, skip, annotate, expect, _local, }) => {
|
|
34
|
+
const testContext = restoreContext(__effectPrismaContext, {
|
|
35
|
+
task,
|
|
36
|
+
signal,
|
|
37
|
+
onTestFailed,
|
|
38
|
+
onTestFinished,
|
|
39
|
+
skip,
|
|
40
|
+
annotate,
|
|
41
|
+
expect,
|
|
42
|
+
_local,
|
|
43
|
+
});
|
|
44
|
+
return runEffectTest(run(body, testContext), testContext);
|
|
45
|
+
});
|
|
46
|
+
const make = (current) => {
|
|
47
|
+
const test = register(current);
|
|
48
|
+
return Object.assign(test, {
|
|
49
|
+
skip: register(current.skip),
|
|
50
|
+
skipIf: (condition) => register(current.skipIf(condition)),
|
|
51
|
+
runIf: (condition) => register(current.runIf(condition)),
|
|
52
|
+
only: register(current.only),
|
|
53
|
+
each: (cases) => {
|
|
54
|
+
return (name, body, options) => fixtureIt.for(cases)(name, normalizeTestOptions(options), (item, { __effectPrismaContext, task, signal, onTestFailed, onTestFinished, skip, annotate, expect, _local, }) => {
|
|
55
|
+
const testContext = restoreContext(__effectPrismaContext, {
|
|
56
|
+
task,
|
|
57
|
+
signal,
|
|
58
|
+
onTestFailed,
|
|
59
|
+
onTestFinished,
|
|
60
|
+
skip,
|
|
61
|
+
annotate,
|
|
62
|
+
expect,
|
|
63
|
+
_local,
|
|
64
|
+
});
|
|
65
|
+
return runEffectTest(run((service, testContext) => body(item, service, testContext), testContext), testContext);
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
fails: register(current.fails),
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
return make(fixtureIt);
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=vitest-database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest-database.js","sourceRoot":"","sources":["../../src/internal/vitest-database.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":"AAAA,OAAO,KAAK,EACX,eAAe,EACf,UAAU,IAAI,gBAAgB,EAC9B,aAAa,EACb,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EACX,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,MAAM,uBAAuB,CAAC;AAE/B,KAAK,QAAQ,CAAC,KAAK,IAAI;KAAG,GAAG,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;CAAE,CAAC;AAE5D,KAAK,UAAU,CAAC,KAAK,IACpB,KAAK,SAAS,aAAa,CAC1B,MAAM,KAAK,EACX,MAAM,YAAY,EAClB,MAAM,SAAS,EACf,MAAM,MAAM,CACZ,GACE,KAAK,GACL,KAAK,CAAC;AAEV,KAAK,kBAAkB,CACtB,KAAK,EACL,QAAQ,SAAS,mBAAmB,EACpC,KAAK,SAAS,MAAM,IAEpB,KAAK,SAAS,aAAa,CAC1B,MAAM,MAAM,EACZ,MAAM,YAAY,EAClB,MAAM,aAAa,EACnB,MAAM,UAAU,CAChB,GACE,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,GACjC,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,GACjC,UAAU,SAAS,KAAK,GACvB,OAAO,GACP,KAAK,GACN,KAAK,GACN,KAAK,GACN,KAAK,CAAC;AAEV,KAAK,kBAAkB,CACtB,KAAK,EACL,QAAQ,SAAS,mBAAmB,EACpC,KAAK,SAAS,MAAM,EACpB,YAAY,SAAS,MAAM,IAE3B,UAAU,CAAC,KAAK,CAAC,SAAS,aAAa,CAAC,MAAM,GAAG,CAAC,GAC/C,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,CAAC,GACzD,UAAU,CAAC,KAAK,CAAC,CAAC;AAEtB,KAAK,eAAe,CAAC,KAAK,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI;IACvE,QAAQ,EAAE,GAAG,IAAI,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;CACrD,CAAC;AAEF,KAAK,uBAAuB,CAC3B,KAAK,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC/C,QAAQ,SAAS,mBAAmB,EACpC,KAAK,SAAS,MAAM,IACjB;IACH,QAAQ,EAAE,GAAG,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GACxC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC;CAChD,CAAC;AAEF,KAAK,oBAAoB,CACxB,UAAU,EACV,QAAQ,SAAS,mBAAmB,EACpC,KAAK,SAAS,MAAM,EACpB,YAAY,SAAS,MAAM,EAC3B,KAAK,IAEL,UAAU,SAAS,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC,GACzE,gBAAgB,CAChB,QAAQ,EACR,KAAK,EACL,QAAQ,CAAC,GAAG,GAAG;IAAE,QAAQ,EAAE,GAAG,IAAI,YAAY,GAAG,KAAK;CAAE,CAAC,EACzD,KAAK,CACL,GACA,KAAK,CAAC;AAEV,MAAM,MAAM,aAAa,CACxB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,KAAK,SAAS,MAAM,IACjB,QAAQ,SAAS,mBAAmB,GACrC,UAAU,SAAS,gBAAgB,CACnC,QAAQ,EACR,KAAK,EACL,MAAM,IAAI,EACV,MAAM,MAAM,CACZ,GACC;IACA,OAAO,CAAC,YAAY,SAAS,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,EAC1D,YAAY,EAAE,YAAY,GACxB,QAAQ,CACV,oBAAoB,CACnB,UAAU,EACV,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,qBAAqB,CACpB,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,eAAe,CACd,QAAQ,EACR,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,CACjD,CACD,CACD,EACD,WAAW,EACX,QAAQ,EACR,KAAK,CACL,CAAC;IACF,OAAO,CAAC,YAAY,SAAS,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,KAAK,EACjE,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,KAAK,GACX,kBAAkB,CACjB,KAAK,EACL,QAAQ,EACR,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,CACjD,GACA,QAAQ,CACV,oBAAoB,CACnB,UAAU,EACV,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,CACxD,EACD,WAAW,EACX,QAAQ,EACR,KAAK,CACL,CAAC;IACF,OAAO,CACN,YAAY,SAAS,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,EACnD,KAAK,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAE/C,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,SAAS,IAAI,GAChE,MAAM,KAAK,SAAS,KAAK,GACxB,KAAK,GACL,KAAK,GACL,uBAAuB,CACtB,KAAK,EACL,QAAQ,EACR,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,CACjD,GACF,KAAK,GACN,QAAQ,CACV,oBAAoB,CACnB,UAAU,EACV,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,eAAe,CAAC,KAAK,CAAC,CACtB,EACD,WAAW,EACX,QAAQ,EACR,KAAK,CACL,CAAC;CACF,GACA,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GACrB,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"include.js","sourceRoot":"","sources":["../../src/relation/include.ts"],"names":[],"mappings":""}
|