@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.
Files changed (79) hide show
  1. package/CHANGELOG.md +535 -0
  2. package/LICENSE +20 -20
  3. package/README.md +394 -299
  4. package/README.pt-BR.md +394 -299
  5. package/dist/constants/provider-capabilities.constant.d.ts +17 -0
  6. package/dist/constants/provider-capabilities.constant.js +27 -0
  7. package/dist/index.d.ts +9 -8
  8. package/dist/index.js +1 -7
  9. package/dist/parsers/data.parser.d.ts +3 -33
  10. package/dist/parsers/data.parser.js +70 -69
  11. package/dist/parsers/include.parser.d.ts +1 -1
  12. package/dist/parsers/include.parser.js +3 -7
  13. package/dist/parsers/order-by.parser.d.ts +1 -10
  14. package/dist/parsers/order-by.parser.js +3 -16
  15. package/dist/parsers/select.parser.d.ts +1 -1
  16. package/dist/parsers/select.parser.js +3 -7
  17. package/dist/parsers/where.parser.d.ts +4 -29
  18. package/dist/parsers/where.parser.js +49 -148
  19. package/dist/prisma7.adapter.d.ts +116 -81
  20. package/dist/prisma7.adapter.js +345 -362
  21. package/dist/resolvers/map-prisma-error.resolver.d.ts +0 -11
  22. package/dist/resolvers/map-prisma-error.resolver.js +48 -72
  23. package/dist/resolvers/merge-entities.resolver.d.ts +11 -15
  24. package/dist/resolvers/merge-entities.resolver.js +29 -38
  25. package/dist/resolvers/resolve-provider.resolver.d.ts +2 -22
  26. package/dist/resolvers/resolve-provider.resolver.js +10 -33
  27. package/dist/types/adapter-config.type.d.ts +21 -10
  28. package/dist/types/adapter-config.type.js +1 -3
  29. package/dist/types/adapter-relations.type.d.ts +14 -8
  30. package/dist/types/adapter-relations.type.js +1 -3
  31. package/dist/types/plain-object.type.js +1 -3
  32. package/dist/types/prisma-arg-like.type.js +1 -3
  33. package/dist/types/prisma-client-models.type.d.ts +4 -4
  34. package/dist/types/prisma-client-models.type.js +1 -3
  35. package/dist/types/prisma-provider.type.d.ts +1 -1
  36. package/dist/types/prisma-provider.type.js +1 -3
  37. package/dist/types/prisma-repository-like.type.d.ts +1 -1
  38. package/dist/types/prisma-repository-like.type.js +1 -3
  39. package/dist/types/prisma7-client-like.type.d.ts +1 -8
  40. package/dist/types/prisma7-client-like.type.js +1 -3
  41. package/dist/types/prisma7-global-config.type.d.ts +17 -0
  42. package/dist/types/prisma7-global-config.type.js +1 -0
  43. package/dist/types/prisma7-orm-types.type.d.ts +2 -2
  44. package/dist/types/prisma7-orm-types.type.js +1 -3
  45. package/dist/types/relation.type.d.ts +119 -25
  46. package/dist/types/relation.type.js +1 -3
  47. package/dist/validators/is-decimal.validator.d.ts +2 -5
  48. package/dist/validators/is-decimal.validator.js +3 -6
  49. package/dist/validators/is-plain-object.validator.d.ts +1 -1
  50. package/dist/validators/is-plain-object.validator.js +3 -7
  51. package/dist/validators/validate-prisma-client.validator.d.ts +1 -14
  52. package/dist/validators/validate-prisma-client.validator.js +7 -24
  53. package/package.json +108 -91
  54. package/dist/index.js.map +0 -1
  55. package/dist/parsers/data.parser.js.map +0 -1
  56. package/dist/parsers/include.parser.js.map +0 -1
  57. package/dist/parsers/order-by.parser.js.map +0 -1
  58. package/dist/parsers/select.parser.js.map +0 -1
  59. package/dist/parsers/where.parser.js.map +0 -1
  60. package/dist/prisma7.adapter.js.map +0 -1
  61. package/dist/resolvers/map-prisma-error.resolver.js.map +0 -1
  62. package/dist/resolvers/merge-entities.resolver.js.map +0 -1
  63. package/dist/resolvers/resolve-provider.resolver.js.map +0 -1
  64. package/dist/types/adapter-config.type.js.map +0 -1
  65. package/dist/types/adapter-relations.type.js.map +0 -1
  66. package/dist/types/plain-object.type.js.map +0 -1
  67. package/dist/types/prisma-arg-like.type.js.map +0 -1
  68. package/dist/types/prisma-client-models.type.js.map +0 -1
  69. package/dist/types/prisma-provider.type.js.map +0 -1
  70. package/dist/types/prisma-repository-like.type.js.map +0 -1
  71. package/dist/types/prisma7-client-like.type.js.map +0 -1
  72. package/dist/types/prisma7-orm-types.type.js.map +0 -1
  73. package/dist/types/relation.type.js.map +0 -1
  74. package/dist/validators/is-decimal.validator.js.map +0 -1
  75. package/dist/validators/is-plain-object.validator.js.map +0 -1
  76. package/dist/validators/validate-adapter-config.validator.d.ts +0 -8
  77. package/dist/validators/validate-adapter-config.validator.js +0 -78
  78. package/dist/validators/validate-adapter-config.validator.js.map +0 -1
  79. 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 { VSRepoPrisma7AdapterConfig } from "./types/adapter-config.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
- "use strict";
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
- * Parser que converte um `DeepPartial<T>` (formato "cru" vindo do vsrepo) nos
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>): PrismaWriteData;
7
+ export declare function parsePrismaWriteData<T>(obj: PlainObject, pkName: string, relations?: AdapterRelations<T>, omitPkInUpdate?: boolean, allowOmitPkWhenNeeded?: boolean): PrismaWriteData;
@@ -1,37 +1,4 @@
1
- "use strict";
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
- if (!relation.nullable) {
51
- throw new vsrepo_1.VSRepoAdapterError(`You cannot provide null for a to-one relation when it is not nullable.`, vsrepo_1.AdapterErrorCode.INVALID_DATA, null);
52
- }
53
- if (relation.mode === "oto") {
54
- if (relation.restriction === "set") {
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 == undefined) {
45
+ if (pkValue === undefined) {
64
46
  return {
65
47
  create: { create: field },
66
- update: relation.restriction === "add"
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 connectOrCreate = { where: { [relation.pk]: pkValue }, create: field };
51
+ const where = { [relation.pk]: pkValue };
72
52
  return {
73
- create: { connectOrCreate },
74
- update: relation.restriction === "add"
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 (relation.restriction === "add") {
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
- const create = {};
122
- const update = {};
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,3 +1,3 @@
1
1
  import { VSRepoRelations } from "vsrepo";
2
- import { PlainObject } from "../types/plain-object.type";
2
+ import { PlainObject } from "../types/plain-object.type.js";
3
3
  export declare function parsePrismaInclude<T>(relations: VSRepoRelations<T>): PlainObject;
@@ -1,11 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
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 ((0, is_plain_object_validator_1.isPlainObject)(value)) {
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
- "use strict";
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
- : (0, is_plain_object_validator_1.isPlainObject)(value)
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,3 +1,3 @@
1
1
  import { VSRepoSelect } from "vsrepo";
2
- import { PlainObject } from "../types/plain-object.type";
2
+ import { PlainObject } from "../types/plain-object.type.js";
3
3
  export declare function parsePrismaSelect<T>(relations: VSRepoSelect<T>): PlainObject;
@@ -1,11 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
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 ((0, is_plain_object_validator_1.isPlainObject)(value)) {
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
- * Use o segundo generic para tipar o retorno com o `WhereInput`
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;