@vsrepo/prisma7-adapter 1.3.2 → 2.0.0-dev.1
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 +535 -0
- package/LICENSE +20 -20
- package/README.md +394 -299
- package/README.pt-BR.md +394 -299
- package/dist/constants/provider-capabilities.constant.d.ts +17 -0
- package/dist/constants/provider-capabilities.constant.js +27 -0
- package/dist/index.d.ts +9 -8
- package/dist/index.js +1 -7
- package/dist/parsers/data.parser.d.ts +3 -33
- package/dist/parsers/data.parser.js +70 -69
- package/dist/parsers/include.parser.d.ts +1 -1
- package/dist/parsers/include.parser.js +3 -7
- package/dist/parsers/order-by.parser.d.ts +1 -10
- package/dist/parsers/order-by.parser.js +3 -16
- package/dist/parsers/select.parser.d.ts +1 -1
- package/dist/parsers/select.parser.js +3 -7
- package/dist/parsers/where.parser.d.ts +4 -29
- package/dist/parsers/where.parser.js +49 -148
- package/dist/prisma7.adapter.d.ts +116 -81
- package/dist/prisma7.adapter.js +345 -362
- package/dist/resolvers/map-prisma-error.resolver.d.ts +0 -11
- package/dist/resolvers/map-prisma-error.resolver.js +48 -72
- package/dist/resolvers/merge-entities.resolver.d.ts +11 -15
- package/dist/resolvers/merge-entities.resolver.js +29 -38
- package/dist/resolvers/resolve-provider.resolver.d.ts +2 -22
- package/dist/resolvers/resolve-provider.resolver.js +10 -33
- package/dist/types/adapter-config.type.d.ts +21 -10
- package/dist/types/adapter-config.type.js +1 -3
- package/dist/types/adapter-relations.type.d.ts +14 -8
- package/dist/types/adapter-relations.type.js +1 -3
- package/dist/types/plain-object.type.js +1 -3
- package/dist/types/prisma-arg-like.type.js +1 -3
- package/dist/types/prisma-client-models.type.d.ts +4 -4
- package/dist/types/prisma-client-models.type.js +1 -3
- package/dist/types/prisma-provider.type.d.ts +1 -1
- package/dist/types/prisma-provider.type.js +1 -3
- package/dist/types/prisma-repository-like.type.d.ts +1 -1
- package/dist/types/prisma-repository-like.type.js +1 -3
- package/dist/types/prisma7-client-like.type.d.ts +1 -8
- package/dist/types/prisma7-client-like.type.js +1 -3
- package/dist/types/prisma7-global-config.type.d.ts +17 -0
- package/dist/types/prisma7-global-config.type.js +1 -0
- package/dist/types/prisma7-orm-types.type.d.ts +2 -2
- package/dist/types/prisma7-orm-types.type.js +1 -3
- package/dist/types/relation.type.d.ts +119 -25
- package/dist/types/relation.type.js +1 -3
- package/dist/validators/is-decimal.validator.d.ts +2 -5
- package/dist/validators/is-decimal.validator.js +3 -6
- package/dist/validators/is-plain-object.validator.d.ts +1 -1
- package/dist/validators/is-plain-object.validator.js +3 -7
- package/dist/validators/validate-prisma-client.validator.d.ts +1 -14
- package/dist/validators/validate-prisma-client.validator.js +7 -24
- package/package.json +108 -91
- package/dist/index.js.map +0 -1
- package/dist/parsers/data.parser.js.map +0 -1
- package/dist/parsers/include.parser.js.map +0 -1
- package/dist/parsers/order-by.parser.js.map +0 -1
- package/dist/parsers/select.parser.js.map +0 -1
- package/dist/parsers/where.parser.js.map +0 -1
- package/dist/prisma7.adapter.js.map +0 -1
- package/dist/resolvers/map-prisma-error.resolver.js.map +0 -1
- package/dist/resolvers/merge-entities.resolver.js.map +0 -1
- package/dist/resolvers/resolve-provider.resolver.js.map +0 -1
- package/dist/types/adapter-config.type.js.map +0 -1
- package/dist/types/adapter-relations.type.js.map +0 -1
- package/dist/types/plain-object.type.js.map +0 -1
- package/dist/types/prisma-arg-like.type.js.map +0 -1
- package/dist/types/prisma-client-models.type.js.map +0 -1
- package/dist/types/prisma-provider.type.js.map +0 -1
- package/dist/types/prisma-repository-like.type.js.map +0 -1
- package/dist/types/prisma7-client-like.type.js.map +0 -1
- package/dist/types/prisma7-orm-types.type.js.map +0 -1
- package/dist/types/relation.type.js.map +0 -1
- package/dist/validators/is-decimal.validator.js.map +0 -1
- package/dist/validators/is-plain-object.validator.js.map +0 -1
- package/dist/validators/validate-adapter-config.validator.d.ts +0 -8
- package/dist/validators/validate-adapter-config.validator.js +0 -78
- package/dist/validators/validate-adapter-config.validator.js.map +0 -1
- package/dist/validators/validate-prisma-client.validator.js.map +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PrismaProvider } from "../types/prisma-provider.type.js";
|
|
2
|
+
/**
|
|
3
|
+
* Providers where Prisma accepts the `mode: "insensitive"` filter, which is
|
|
4
|
+
* what `ignoreCase` is translated to (see the README's provider support table).
|
|
5
|
+
*/
|
|
6
|
+
export declare const INSENSITIVE_MODE_PROVIDERS: ReadonlySet<PrismaProvider>;
|
|
7
|
+
/**
|
|
8
|
+
* Providers that expose `createManyAndReturn` and `updateManyAndReturn`, which
|
|
9
|
+
* `createManyReturning` and `updateManyReturning` are built on.
|
|
10
|
+
*/
|
|
11
|
+
export declare const RETURNING_MANY_PROVIDERS: ReadonlySet<PrismaProvider>;
|
|
12
|
+
/**
|
|
13
|
+
* Providers that support Prisma's `skipDuplicates` (`INSERT ... ON CONFLICT DO NOTHING`
|
|
14
|
+
* or equivalent), which is what `ignoreConflicts` is translated to on `createMany` and
|
|
15
|
+
* `createManyReturning`.
|
|
16
|
+
*/
|
|
17
|
+
export declare const SKIP_DUPLICATES_PROVIDERS: ReadonlySet<PrismaProvider>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Providers where Prisma accepts the `mode: "insensitive"` filter, which is
|
|
3
|
+
* what `ignoreCase` is translated to (see the README's provider support table).
|
|
4
|
+
*/
|
|
5
|
+
export const INSENSITIVE_MODE_PROVIDERS = new Set([
|
|
6
|
+
"postgresql",
|
|
7
|
+
"cockroachdb",
|
|
8
|
+
]);
|
|
9
|
+
/**
|
|
10
|
+
* Providers that expose `createManyAndReturn` and `updateManyAndReturn`, which
|
|
11
|
+
* `createManyReturning` and `updateManyReturning` are built on.
|
|
12
|
+
*/
|
|
13
|
+
export const RETURNING_MANY_PROVIDERS = new Set([
|
|
14
|
+
"postgresql",
|
|
15
|
+
"cockroachdb",
|
|
16
|
+
"sqlite",
|
|
17
|
+
]);
|
|
18
|
+
/**
|
|
19
|
+
* Providers that support Prisma's `skipDuplicates` (`INSERT ... ON CONFLICT DO NOTHING`
|
|
20
|
+
* or equivalent), which is what `ignoreConflicts` is translated to on `createMany` and
|
|
21
|
+
* `createManyReturning`.
|
|
22
|
+
*/
|
|
23
|
+
export const SKIP_DUPLICATES_PROVIDERS = new Set([
|
|
24
|
+
"postgresql",
|
|
25
|
+
"mysql",
|
|
26
|
+
"cockroachdb",
|
|
27
|
+
]);
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export { VSRepoPrisma7Adapter, VSRepoPrisma7Adapter as Prisma7Adapter } from "./prisma7.adapter";
|
|
2
|
-
export type { Relation } from "./types/relation.type";
|
|
3
|
-
export type { Prisma7OrmTypes } from "./types/prisma7-orm-types.type";
|
|
4
|
-
export type { Prisma7ClientLike } from "./types/prisma7-client-like.type";
|
|
5
|
-
export type { AdapterRelations } from "./types/adapter-relations.type";
|
|
6
|
-
export type {
|
|
7
|
-
export type { PrismaClientModels } from "./types/prisma-client-models.type";
|
|
8
|
-
export type { PrismaProvider } from "./types/prisma-provider.type";
|
|
1
|
+
export { VSRepoPrisma7Adapter, VSRepoPrisma7Adapter as Prisma7Adapter } from "./prisma7.adapter.js";
|
|
2
|
+
export type { Relation, DisconnectStrategy, RelationMode, ToManyStrategy, ToOneStrategy, } from "./types/relation.type.js";
|
|
3
|
+
export type { Prisma7OrmTypes } from "./types/prisma7-orm-types.type.js";
|
|
4
|
+
export type { Prisma7ClientLike } from "./types/prisma7-client-like.type.js";
|
|
5
|
+
export type { AdapterRelations } from "./types/adapter-relations.type.js";
|
|
6
|
+
export type { Prisma7AdapterConfig } from "./types/adapter-config.type.js";
|
|
7
|
+
export type { PrismaClientModels } from "./types/prisma-client-models.type.js";
|
|
8
|
+
export type { PrismaProvider } from "./types/prisma-provider.type.js";
|
|
9
|
+
export type { Prisma7GlobalConfig } from "./types/prisma7-global-config.type.js";
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Prisma7Adapter = exports.VSRepoPrisma7Adapter = void 0;
|
|
4
|
-
var prisma7_adapter_1 = require("./prisma7.adapter");
|
|
5
|
-
Object.defineProperty(exports, "VSRepoPrisma7Adapter", { enumerable: true, get: function () { return prisma7_adapter_1.VSRepoPrisma7Adapter; } });
|
|
6
|
-
Object.defineProperty(exports, "Prisma7Adapter", { enumerable: true, get: function () { return prisma7_adapter_1.VSRepoPrisma7Adapter; } });
|
|
7
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export { VSRepoPrisma7Adapter, VSRepoPrisma7Adapter as Prisma7Adapter } from "./prisma7.adapter.js";
|
|
@@ -1,37 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* payloads `create`/`update` esperados pelo Prisma para escritas com relations,
|
|
4
|
-
* replicando o comportamento da v1 (`resolveCreateUpdatePayloadsWithRelations`).
|
|
5
|
-
*
|
|
6
|
-
* Sem `relations` configurado no adapter, cada campo é repassado como está —
|
|
7
|
-
* exceto `pkName`, que é omitido do `update` (não faz sentido reatribuir a PK
|
|
8
|
-
* num update parcial).
|
|
9
|
-
*
|
|
10
|
-
* Com `relations`, cada campo de relação é resolvido de acordo com seu `mode`/
|
|
11
|
-
* `restriction` (ver `Relation`):
|
|
12
|
-
* - to-one (`oto`/`mto`) sem PK no valor enviado -> `create` (e `upsert` no
|
|
13
|
-
* update, a não ser que `restriction: "add"`, que usa só `create`)
|
|
14
|
-
* - to-one com PK no valor enviado -> `connectOrCreate` (e
|
|
15
|
-
* `upsert` no update, a não ser que `restriction: "add"`)
|
|
16
|
-
* - to-one enviado como `null` com `nullable` -> `delete` (`oto` +
|
|
17
|
-
* `restriction: "set"`) ou `disconnect` (`oto` com `restriction: "add"` /
|
|
18
|
-
* `mto`; um `oto` não "desconecta" no `update`, a linha possuída é apagada)
|
|
19
|
-
* - to-one enviado como `null` sem `nullable` -> lança `VSRepoAdapterError`
|
|
20
|
-
* (code `INVALID_DATA`)
|
|
21
|
-
* - to-many (`otm`/`mtm`) — itens são separados entre "com PK" e "sem PK":
|
|
22
|
-
* os sem PK viram `create`, os com PK viram `connectOrCreate` no create e
|
|
23
|
-
* `upsert` no update; com `restriction: "set"`, itens de `otm` que não
|
|
24
|
-
* vieram no array são removidos (`deleteMany`) e itens de `mtm` têm o
|
|
25
|
-
* vínculo resetado (`set: []`) antes de reconectar
|
|
26
|
-
*
|
|
27
|
-
* Essa mesma saída `{ create, update }` é reaproveitada em todos os métodos de
|
|
28
|
-
* escrita do adapter: `create()` usa só `.create`, `update()`/`updateMany()`
|
|
29
|
-
* usam só `.update`, e `save()`/`upsert()` usam os dois.
|
|
30
|
-
*/
|
|
31
|
-
import { AdapterRelations } from "../types/adapter-relations.type";
|
|
32
|
-
import { PlainObject } from "../types/plain-object.type";
|
|
1
|
+
import { AdapterRelations } from "../types/adapter-relations.type.js";
|
|
2
|
+
import { PlainObject } from "../types/plain-object.type.js";
|
|
33
3
|
export interface PrismaWriteData {
|
|
34
4
|
create: PlainObject;
|
|
35
5
|
update: PlainObject;
|
|
36
6
|
}
|
|
37
|
-
export declare function parsePrismaWriteData<T>(obj: PlainObject, pkName: string, relations?: AdapterRelations<T
|
|
7
|
+
export declare function parsePrismaWriteData<T>(obj: PlainObject, pkName: string, relations?: AdapterRelations<T>, omitPkInUpdate?: boolean, allowOmitPkWhenNeeded?: boolean): PrismaWriteData;
|
|
@@ -1,37 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* Parser que converte um `DeepPartial<T>` (formato "cru" vindo do vsrepo) nos
|
|
4
|
-
* payloads `create`/`update` esperados pelo Prisma para escritas com relations,
|
|
5
|
-
* replicando o comportamento da v1 (`resolveCreateUpdatePayloadsWithRelations`).
|
|
6
|
-
*
|
|
7
|
-
* Sem `relations` configurado no adapter, cada campo é repassado como está —
|
|
8
|
-
* exceto `pkName`, que é omitido do `update` (não faz sentido reatribuir a PK
|
|
9
|
-
* num update parcial).
|
|
10
|
-
*
|
|
11
|
-
* Com `relations`, cada campo de relação é resolvido de acordo com seu `mode`/
|
|
12
|
-
* `restriction` (ver `Relation`):
|
|
13
|
-
* - to-one (`oto`/`mto`) sem PK no valor enviado -> `create` (e `upsert` no
|
|
14
|
-
* update, a não ser que `restriction: "add"`, que usa só `create`)
|
|
15
|
-
* - to-one com PK no valor enviado -> `connectOrCreate` (e
|
|
16
|
-
* `upsert` no update, a não ser que `restriction: "add"`)
|
|
17
|
-
* - to-one enviado como `null` com `nullable` -> `delete` (`oto` +
|
|
18
|
-
* `restriction: "set"`) ou `disconnect` (`oto` com `restriction: "add"` /
|
|
19
|
-
* `mto`; um `oto` não "desconecta" no `update`, a linha possuída é apagada)
|
|
20
|
-
* - to-one enviado como `null` sem `nullable` -> lança `VSRepoAdapterError`
|
|
21
|
-
* (code `INVALID_DATA`)
|
|
22
|
-
* - to-many (`otm`/`mtm`) — itens são separados entre "com PK" e "sem PK":
|
|
23
|
-
* os sem PK viram `create`, os com PK viram `connectOrCreate` no create e
|
|
24
|
-
* `upsert` no update; com `restriction: "set"`, itens de `otm` que não
|
|
25
|
-
* vieram no array são removidos (`deleteMany`) e itens de `mtm` têm o
|
|
26
|
-
* vínculo resetado (`set: []`) antes de reconectar
|
|
27
|
-
*
|
|
28
|
-
* Essa mesma saída `{ create, update }` é reaproveitada em todos os métodos de
|
|
29
|
-
* escrita do adapter: `create()` usa só `.create`, `update()`/`updateMany()`
|
|
30
|
-
* usam só `.update`, e `save()`/`upsert()` usam os dois.
|
|
31
|
-
*/
|
|
32
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
-
exports.parsePrismaWriteData = parsePrismaWriteData;
|
|
34
|
-
const vsrepo_1 = require("vsrepo");
|
|
1
|
+
import { AdapterErrorCode, VSRepoAdapterError } from "vsrepo";
|
|
35
2
|
function omitKey(item, key) {
|
|
36
3
|
const clone = { ...item };
|
|
37
4
|
delete clone[key];
|
|
@@ -45,44 +12,53 @@ function splitByPk(items, pk) {
|
|
|
45
12
|
}
|
|
46
13
|
return { withPk, withoutPk };
|
|
47
14
|
}
|
|
15
|
+
/** `Relation.onUpdate` of a to-one relation when the config doesn't set one. */
|
|
16
|
+
const DEFAULT_TO_ONE_STRATEGY = "connect";
|
|
17
|
+
/** `Relation.onUpdate` of a to-many relation when the config doesn't set one. */
|
|
18
|
+
const DEFAULT_TO_MANY_STRATEGY = "add";
|
|
19
|
+
/** `Relation.onDisconnect` of a to-one relation when the config doesn't set one. */
|
|
20
|
+
const DEFAULT_DISCONNECT_STRATEGY = "disconnect";
|
|
21
|
+
/**
|
|
22
|
+
* `update` half of a to-one relation whose related object has its `pk`,
|
|
23
|
+
* according to the relation's `onUpdate` ({@link ToOneStrategy}).
|
|
24
|
+
*/
|
|
25
|
+
function resolveExistingToOneUpdate(strategy, pk, where, field) {
|
|
26
|
+
switch (strategy) {
|
|
27
|
+
case "connect":
|
|
28
|
+
return { connect: where };
|
|
29
|
+
case "connectOrCreate":
|
|
30
|
+
return { connectOrCreate: { where, create: field } };
|
|
31
|
+
case "upsert":
|
|
32
|
+
return { upsert: { where, create: field, update: omitKey(field, pk) } };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
48
35
|
function parseToOneRelation(field, relation) {
|
|
36
|
+
const updateStrategy = relation.onUpdate ?? DEFAULT_TO_ONE_STRATEGY;
|
|
49
37
|
if (field === null) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return { update: { delete: true } };
|
|
56
|
-
}
|
|
57
|
-
return { update: { disconnect: true } };
|
|
58
|
-
}
|
|
59
|
-
// relation.mode === "mto"
|
|
60
|
-
return { update: { disconnect: true } };
|
|
38
|
+
const disconnectStrategy = relation.onDisconnect ?? DEFAULT_DISCONNECT_STRATEGY;
|
|
39
|
+
return disconnectStrategy === "delete" ? { update: { delete: true } } : { update: { disconnect: true } };
|
|
40
|
+
}
|
|
41
|
+
if (relation.fkThere !== undefined) {
|
|
42
|
+
field = omitKey(field, relation.fkThere);
|
|
61
43
|
}
|
|
62
44
|
const pkValue = field[relation.pk];
|
|
63
|
-
if (pkValue
|
|
45
|
+
if (pkValue === undefined) {
|
|
64
46
|
return {
|
|
65
47
|
create: { create: field },
|
|
66
|
-
update:
|
|
67
|
-
? { create: field }
|
|
68
|
-
: { upsert: { create: field, update: field } },
|
|
48
|
+
update: updateStrategy === "upsert" ? { upsert: { create: field, update: field } } : { create: field },
|
|
69
49
|
};
|
|
70
50
|
}
|
|
71
|
-
const
|
|
51
|
+
const where = { [relation.pk]: pkValue };
|
|
72
52
|
return {
|
|
73
|
-
create: { connectOrCreate },
|
|
74
|
-
update: relation.
|
|
75
|
-
? { connectOrCreate }
|
|
76
|
-
: {
|
|
77
|
-
upsert: {
|
|
78
|
-
where: { [relation.pk]: pkValue },
|
|
79
|
-
create: field,
|
|
80
|
-
update: omitKey(field, relation.pk),
|
|
81
|
-
},
|
|
82
|
-
},
|
|
53
|
+
create: { connectOrCreate: { where, create: field } },
|
|
54
|
+
update: resolveExistingToOneUpdate(updateStrategy, relation.pk, where, field),
|
|
83
55
|
};
|
|
84
56
|
}
|
|
85
57
|
function parseToManyRelation(field, relation) {
|
|
58
|
+
const updateStrategy = relation.onUpdate ?? DEFAULT_TO_MANY_STRATEGY;
|
|
59
|
+
if (relation.fkThere !== undefined) {
|
|
60
|
+
field = field.map(f => omitKey(f, relation.fkThere));
|
|
61
|
+
}
|
|
86
62
|
const { withPk, withoutPk } = splitByPk(field, relation.pk);
|
|
87
63
|
const connectOrCreate = withPk.map(item => ({
|
|
88
64
|
where: { [relation.pk]: item[relation.pk] },
|
|
@@ -96,12 +72,10 @@ function parseToManyRelation(field, relation) {
|
|
|
96
72
|
update: omitKey(item, relation.pk),
|
|
97
73
|
}));
|
|
98
74
|
const create = { create: withoutPk, connectOrCreate };
|
|
99
|
-
if (
|
|
75
|
+
if (updateStrategy === "add") {
|
|
100
76
|
return {
|
|
101
77
|
create,
|
|
102
|
-
update: relation.mode === "mtm"
|
|
103
|
-
? { create: withoutPk, connectOrCreate }
|
|
104
|
-
: { create: withoutPk, upsert },
|
|
78
|
+
update: relation.mode === "mtm" ? { create: withoutPk, connectOrCreate } : { create: withoutPk, upsert },
|
|
105
79
|
};
|
|
106
80
|
}
|
|
107
81
|
return {
|
|
@@ -117,20 +91,29 @@ function parseToManyRelation(field, relation) {
|
|
|
117
91
|
},
|
|
118
92
|
};
|
|
119
93
|
}
|
|
120
|
-
function parsePrismaWriteData(obj, pkName, relations) {
|
|
121
|
-
|
|
122
|
-
|
|
94
|
+
export function parsePrismaWriteData(obj, pkName, relations, omitPkInUpdate = false, allowOmitPkWhenNeeded = false) {
|
|
95
|
+
let create = {};
|
|
96
|
+
let update = {};
|
|
97
|
+
/** Relation fields that hold their FK in this entity, and those FK fields. */
|
|
98
|
+
const fkHereRelations = [];
|
|
99
|
+
const keysToOmit = [];
|
|
123
100
|
for (const [key, field] of Object.entries(obj)) {
|
|
124
101
|
if (field === undefined)
|
|
125
102
|
continue;
|
|
126
103
|
const relation = relations?.[key];
|
|
127
104
|
if (!relation) {
|
|
128
105
|
create[key] = field;
|
|
129
|
-
if (key !== pkName)
|
|
106
|
+
if (!omitPkInUpdate || key !== pkName)
|
|
130
107
|
update[key] = field;
|
|
131
108
|
continue;
|
|
132
109
|
}
|
|
110
|
+
if (relation === "ignore")
|
|
111
|
+
continue;
|
|
133
112
|
if (relation.mode === "oto" || relation.mode === "mto") {
|
|
113
|
+
if (relation.fkHere !== undefined) {
|
|
114
|
+
fkHereRelations.push(key);
|
|
115
|
+
keysToOmit.push(relation.fkHere);
|
|
116
|
+
}
|
|
134
117
|
const parsed = parseToOneRelation(field, relation);
|
|
135
118
|
if (parsed.create !== undefined)
|
|
136
119
|
create[key] = parsed.create;
|
|
@@ -142,6 +125,24 @@ function parsePrismaWriteData(obj, pkName, relations) {
|
|
|
142
125
|
create[key] = parsed.create;
|
|
143
126
|
update[key] = parsed.update;
|
|
144
127
|
}
|
|
128
|
+
if (fkHereRelations.length) {
|
|
129
|
+
if (obj[pkName] !== undefined) {
|
|
130
|
+
if (!allowOmitPkWhenNeeded) {
|
|
131
|
+
const fields = fkHereRelations.map(name => `'${name}'`).join(", ");
|
|
132
|
+
throw new VSRepoAdapterError(`Cannot send the primary key '${pkName}' together with the relation field(s) ${fields}: ` +
|
|
133
|
+
`they hold their foreign key in this same entity, and Prisma rejects the primary key ` +
|
|
134
|
+
`in a nested write of that kind ("Unknown argument"). ` +
|
|
135
|
+
`Either remove '${pkName}' from the payload, or set 'allowOmitPk: true' (in the adapter ` +
|
|
136
|
+
`config, or globally through 'setGlobalConfig') so the adapter drops it. Note that, with ` +
|
|
137
|
+
`'allowOmitPk', a record that doesn't exist yet is created with a database-generated ` +
|
|
138
|
+
`'${pkName}' instead of the one you sent.`, AdapterErrorCode.INVALID_DATA, null);
|
|
139
|
+
}
|
|
140
|
+
keysToOmit.push(pkName);
|
|
141
|
+
}
|
|
142
|
+
for (const key of keysToOmit) {
|
|
143
|
+
create = omitKey(create, key);
|
|
144
|
+
update = omitKey(update, key);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
145
147
|
return { create, update };
|
|
146
148
|
}
|
|
147
|
-
//# sourceMappingURL=data.parser.js.map
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.parsePrismaInclude = parsePrismaInclude;
|
|
4
|
-
const is_plain_object_validator_1 = require("../validators/is-plain-object.validator");
|
|
5
|
-
function parsePrismaInclude(relations) {
|
|
1
|
+
import { isPlainObject } from "../validators/is-plain-object.validator.js";
|
|
2
|
+
export function parsePrismaInclude(relations) {
|
|
6
3
|
const include = {};
|
|
7
4
|
for (const [key, value] of Object.entries(relations)) {
|
|
8
|
-
if (
|
|
5
|
+
if (isPlainObject(value)) {
|
|
9
6
|
include[key] = { include: parsePrismaInclude(value) };
|
|
10
7
|
}
|
|
11
8
|
else {
|
|
@@ -14,4 +11,3 @@ function parsePrismaInclude(relations) {
|
|
|
14
11
|
}
|
|
15
12
|
return include;
|
|
16
13
|
}
|
|
17
|
-
//# sourceMappingURL=include.parser.js.map
|
|
@@ -1,14 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parser que converte um `Ordering<T>` (formato "amigável" do vsrepo) num
|
|
3
|
-
* `orderBy` válido de qualquer modelo do Prisma.
|
|
4
|
-
*
|
|
5
|
-
* Suporta:
|
|
6
|
-
* - Direção em qualquer caixa: { name: "ASC" } / { name: "asc" } -> { name: "asc" }
|
|
7
|
-
* - Ordenação encadeada: [{ name: "asc" }, { createdAt: "desc" }]
|
|
8
|
-
* - Ordenação aninhada em relations to-one: { address: { city: "asc" } }
|
|
9
|
-
*/
|
|
10
1
|
import { Ordering } from "vsrepo";
|
|
11
|
-
import { PlainObject } from "../types/plain-object.type";
|
|
2
|
+
import { PlainObject } from "../types/plain-object.type.js";
|
|
12
3
|
/**
|
|
13
4
|
* Use o segundo generic para tipar o retorno com o `OrderByInput`
|
|
14
5
|
* do Prisma correspondente ao modelo.
|
|
@@ -1,16 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* Parser que converte um `Ordering<T>` (formato "amigável" do vsrepo) num
|
|
4
|
-
* `orderBy` válido de qualquer modelo do Prisma.
|
|
5
|
-
*
|
|
6
|
-
* Suporta:
|
|
7
|
-
* - Direção em qualquer caixa: { name: "ASC" } / { name: "asc" } -> { name: "asc" }
|
|
8
|
-
* - Ordenação encadeada: [{ name: "asc" }, { createdAt: "desc" }]
|
|
9
|
-
* - Ordenação aninhada em relations to-one: { address: { city: "asc" } }
|
|
10
|
-
*/
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.parsePrismaOrderBy = parsePrismaOrderBy;
|
|
13
|
-
const is_plain_object_validator_1 = require("../validators/is-plain-object.validator");
|
|
1
|
+
import { isPlainObject } from "../validators/is-plain-object.validator.js";
|
|
14
2
|
function isSortDirection(value) {
|
|
15
3
|
return value === "asc" || value === "desc" || value === "ASC" || value === "DESC";
|
|
16
4
|
}
|
|
@@ -21,7 +9,7 @@ function parseOrderByField(order) {
|
|
|
21
9
|
continue;
|
|
22
10
|
result[key] = isSortDirection(value)
|
|
23
11
|
? value.toLowerCase()
|
|
24
|
-
:
|
|
12
|
+
: isPlainObject(value)
|
|
25
13
|
? parseOrderByField(value)
|
|
26
14
|
: value;
|
|
27
15
|
}
|
|
@@ -31,9 +19,8 @@ function parseOrderByField(order) {
|
|
|
31
19
|
* Use o segundo generic para tipar o retorno com o `OrderByInput`
|
|
32
20
|
* do Prisma correspondente ao modelo.
|
|
33
21
|
*/
|
|
34
|
-
function parsePrismaOrderBy(order) {
|
|
22
|
+
export function parsePrismaOrderBy(order) {
|
|
35
23
|
if (!order)
|
|
36
24
|
return;
|
|
37
25
|
return Array.isArray(order) ? order.map(o => parseOrderByField(o)) : parseOrderByField(order);
|
|
38
26
|
}
|
|
39
|
-
//# sourceMappingURL=order-by.parser.js.map
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.parsePrismaSelect = parsePrismaSelect;
|
|
4
|
-
const is_plain_object_validator_1 = require("../validators/is-plain-object.validator");
|
|
5
|
-
function parsePrismaSelect(relations) {
|
|
1
|
+
import { isPlainObject } from "../validators/is-plain-object.validator.js";
|
|
2
|
+
export function parsePrismaSelect(relations) {
|
|
6
3
|
const select = {};
|
|
7
4
|
for (const [key, value] of Object.entries(relations)) {
|
|
8
|
-
if (
|
|
5
|
+
if (isPlainObject(value)) {
|
|
9
6
|
select[key] = { select: parsePrismaSelect(value) };
|
|
10
7
|
}
|
|
11
8
|
else {
|
|
@@ -14,4 +11,3 @@ function parsePrismaSelect(relations) {
|
|
|
14
11
|
}
|
|
15
12
|
return select;
|
|
16
13
|
}
|
|
17
|
-
//# sourceMappingURL=select.parser.js.map
|
|
@@ -1,32 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parser que converte um `VSRepoWhere<T>` (formato "amigável" da aplicação)
|
|
3
|
-
* em um `where` válido de qualquer modelo do Prisma.
|
|
4
|
-
*
|
|
5
|
-
* Suporta:
|
|
6
|
-
* - Valor direto: { name: "Ana" }
|
|
7
|
-
* - Operadores de campo: { age: { gte: 18, lte: 65 } }
|
|
8
|
-
* - `between`: { age: { between: [18, 65] } } -> { gte: 18, lte: 65 }
|
|
9
|
-
* - `not` (valor ou operador): { name: { not: "Ana" } }
|
|
10
|
-
* { name: { not: { contains: "an" } } }
|
|
11
|
-
* - Strings case-insensitive: { name: { contains: "ana", ignoreCase: true } }
|
|
12
|
-
* -> { contains: "ana", mode: "insensitive" }
|
|
13
|
-
* - Relação lista (array): { posts: { _some: { title: "x" } } } -> { posts: { some: {...} } }
|
|
14
|
-
* - Relação objeto (to-one): { author: { _with: { id: 1 } } } -> { author: { is: {...} } }
|
|
15
|
-
* { author: { _without: { id: 1 } } } -> { author: { isNot: {...} } }
|
|
16
|
-
* - Lógicos no nível raiz: { AND: [...] , OR: [...], NOT: {...} }
|
|
17
|
-
*
|
|
18
|
-
* Reflete a tipagem atual: `AND`/`OR`/`NOT` só existem em `VSRepoWhere<T>`
|
|
19
|
-
* (nível raiz). Dentro de relações (`_some`/`_every`/`_none`/`_with`/
|
|
20
|
-
* `_without`), o tipo usado é `VSRepoWherePlain<U>`, que NÃO tem esses
|
|
21
|
-
* operadores lógicos — por isso a recursão para relações usa
|
|
22
|
-
* `parsePlainWhere`, e não `parseWhere`.
|
|
23
|
-
*/
|
|
24
1
|
import { VSRepoWhere } from "vsrepo";
|
|
25
|
-
import { PlainObject } from "../types/plain-object.type";
|
|
2
|
+
import { PlainObject } from "../types/plain-object.type.js";
|
|
3
|
+
import { PrismaProvider } from "../types/prisma-provider.type.js";
|
|
26
4
|
/**
|
|
27
|
-
*
|
|
28
|
-
* do Prisma correspondente ao modelo, ex:
|
|
29
|
-
*
|
|
30
|
-
* parseVSRepoWhere<User, Prisma.UserWhereInput>(where)
|
|
5
|
+
* Converts a `VSRepoWhere` into a Prisma `where`.
|
|
31
6
|
*/
|
|
32
|
-
export declare function parsePrismaWhere<T>(where: VSRepoWhere<T> | undefined): PlainObject | undefined;
|
|
7
|
+
export declare function parsePrismaWhere<T>(where: VSRepoWhere<T> | undefined, provider?: PrismaProvider): PlainObject | undefined;
|