vsrepo 1.2.1 → 1.2.3
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/README.md +66 -19
- package/VSRepository/VSRepository.d.ts +879 -834
- package/VSRepository/VSRepository.js +31 -19
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -497,6 +497,8 @@ Os filtros são sufixos aplicados ao nome do campo dentro do método. O campo em
|
|
|
497
497
|
| `GreaterThanEqual` | `gte` | sim |
|
|
498
498
|
| `LessThan` | `lt` | sim |
|
|
499
499
|
| `LessThanEqual` | `lte` | sim |
|
|
500
|
+
| `Between` | `gte` + `lte` | sim (tupla `[min, max]`) |
|
|
501
|
+
| `NotBetween` | `not.gte` + `not.lte` | sim (tupla `[min, max]`) |
|
|
500
502
|
| `IsNull` | `null` | não |
|
|
501
503
|
| `IsNotNull` | `not: null` | não |
|
|
502
504
|
| `IsTrue` | `true` | não |
|
|
@@ -511,6 +513,37 @@ findByEmailStartsWithInsensitive // { email: { startsWith: valor, mode: 'insensi
|
|
|
511
513
|
findByNomeInsensitive // { nome: { equals: valor, mode: 'insensitive' } }
|
|
512
514
|
```
|
|
513
515
|
|
|
516
|
+
`Between` e `NotBetween` recebem uma **tupla `[minValue, maxValue]`** e são ideais para filtros de intervalo em números, datas ou qualquer campo comparável:
|
|
517
|
+
|
|
518
|
+
```ts
|
|
519
|
+
methods: {
|
|
520
|
+
findManyByIdadeBetween: { map: true },
|
|
521
|
+
findManyBySalarioNotBetween: { map: true },
|
|
522
|
+
findManyByCriadoEmBetween: { map: true },
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// Uso
|
|
526
|
+
await usuarioRepository.findManyByIdadeBetween([18, 65]);
|
|
527
|
+
await usuarioRepository.findManyBySalarioNotBetween([1000, 5000]);
|
|
528
|
+
await usuarioRepository.findManyByCriadoEmBetween([new Date("2024-01-01"), new Date("2024-12-31")]);
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
Gera (`findManyByIdadeBetween`):
|
|
532
|
+
|
|
533
|
+
```ts
|
|
534
|
+
{
|
|
535
|
+
idade: { gte: 18, lte: 65 }
|
|
536
|
+
}
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
Gera (`findManyBySalarioNotBetween`):
|
|
540
|
+
|
|
541
|
+
```ts
|
|
542
|
+
{
|
|
543
|
+
salario: { not: { gte: 1000, lte: 5000 } }
|
|
544
|
+
}
|
|
545
|
+
```
|
|
546
|
+
|
|
514
547
|
O sufixo `Optional` pode ser adicionado a qualquer campo para tornar o argumento opcional:
|
|
515
548
|
|
|
516
549
|
```ts
|
|
@@ -621,14 +654,18 @@ Exemplos:
|
|
|
621
654
|
|
|
622
655
|
```ts
|
|
623
656
|
methods: {
|
|
624
|
-
findByPostagensSomeTituloContains: { map: true }, // postagens: { some: { titulo: { contains: valor } } }
|
|
625
|
-
|
|
626
|
-
findByPerfilWithout: { map: true }, // perfil: { isNot: {} }
|
|
627
|
-
findByPostagensSome: { map: true }, // postagens: { some: {} }
|
|
628
|
-
findByPostagensEveryAtivoIsTrue: { map: true }, // postagens: { every: { ativo: true } }
|
|
657
|
+
findByPostagensSomeTituloContains: { map: true }, // postagens: { some: { titulo: { contains: valor } } } >> (Busca usuários que o título de alguma postagem contém um valor)
|
|
658
|
+
findByPerfilWithDescricaoIsNotNull: { map: true }, // perfil: { is: { descricao: { not: null } } } >> (Busca usuários em que a descrição do perfil não é nula)
|
|
659
|
+
findByPerfilWithout: { map: true }, // perfil: { isNot: {} } >> (Busca usuários sem perfil)
|
|
660
|
+
findByPostagensSome: { map: true }, // postagens: { some: {} } >> (Busca usuários com alguma postagem)
|
|
661
|
+
findByPostagensEveryAtivoIsTrue: { map: true }, // postagens: { every: { ativo: true } } >> (Busca usuários que todas as postagens estão ativas)
|
|
662
|
+
findByPostagensNone: { map: true }, // postagens: { none: {} } >> (Busca usuários sem postagens)
|
|
629
663
|
}
|
|
630
664
|
```
|
|
631
665
|
|
|
666
|
+
> [!NOTE]
|
|
667
|
+
> Teoricamente você pode usar `Every` sem `Field` (ele geraria { every: {} }), porém isso não produz um filtro efetivo. A condição é considerada verdadeira para qualquer relação, inclusive quando não existem registros relacionados, tornando o resultado equivalente a não aplicar filtro algum.
|
|
668
|
+
|
|
632
669
|
---
|
|
633
670
|
|
|
634
671
|
### Sufixos de paginação e ordenação
|
|
@@ -1018,8 +1055,9 @@ import type { MethodOptions, MethodOptionsModel } from "../../generated/vsrepo";
|
|
|
1018
1055
|
// S = chave do select model ou false
|
|
1019
1056
|
type Opts = MethodOptions<"public" | "minimal">;
|
|
1020
1057
|
|
|
1021
|
-
// MethodOptionsModel<
|
|
1022
|
-
|
|
1058
|
+
// MethodOptionsModel<TRepo> — derivado diretamente de uma instância VSRepository configurada
|
|
1059
|
+
const usuarioVSRepo = setupVSRepo<Usuario, "usuario">()(config);
|
|
1060
|
+
type OptsModel = MethodOptionsModel<typeof usuarioVSRepo>;
|
|
1023
1061
|
```
|
|
1024
1062
|
|
|
1025
1063
|
### Tipos de configuração
|
|
@@ -1031,7 +1069,6 @@ import type {
|
|
|
1031
1069
|
BuildConfig,
|
|
1032
1070
|
RepositoryRelations,
|
|
1033
1071
|
ExtractRelationConfig,
|
|
1034
|
-
UpsertWithRelations,
|
|
1035
1072
|
} from "../../generated/vsrepo";
|
|
1036
1073
|
|
|
1037
1074
|
// Configuração de um método dinâmico
|
|
@@ -1048,18 +1085,12 @@ type UsuarioRelations = RepositoryRelations<Usuario>;
|
|
|
1048
1085
|
|
|
1049
1086
|
// Configuração de relação inferida a partir de um campo
|
|
1050
1087
|
type PerfilRelationConfig = ExtractRelationConfig<Usuario["perfil"]>;
|
|
1051
|
-
|
|
1052
|
-
// Payload do save com relações
|
|
1053
|
-
type UsuarioComRelacoes = UpsertWithRelations<Usuario, "usuario", typeof relations>;
|
|
1054
1088
|
```
|
|
1055
1089
|
|
|
1056
1090
|
### Tipo do repository construído
|
|
1057
1091
|
|
|
1058
1092
|
```ts
|
|
1059
|
-
import type {
|
|
1060
|
-
|
|
1061
|
-
// Tipo completo de um repository construído
|
|
1062
|
-
type MeuRepo = BuiltRepository<Usuario, "usuario", typeof config, typeof buildConfig>;
|
|
1093
|
+
import type { RepositoryOf } from "../../generated/vsrepo";
|
|
1063
1094
|
|
|
1064
1095
|
// Inferência a partir de uma instância VSRepository (útil para injeção de dependência)
|
|
1065
1096
|
const usuarioVSRepo = setupVSRepo<Usuario, "usuario">()({ ... });
|
|
@@ -1080,15 +1111,31 @@ const extension = { buscarPorDominio: (dominio: string) => Promise<Usuario[]> };
|
|
|
1080
1111
|
type UsuarioRepositoryExtended = RepositoryOf<typeof usuarioVSRepo, undefined, typeof extension>;
|
|
1081
1112
|
```
|
|
1082
1113
|
|
|
1083
|
-
###
|
|
1114
|
+
### Tipos do payload dos métodos `save` e `patch`
|
|
1115
|
+
|
|
1116
|
+
Use `SaveObject` e `PatchObject` para extrair o tipo do payload esperado pelos métodos `save` e `patch` diretamente a partir de uma instância `VSRepository` configurada. Esses tipos já levam em conta as relações configuradas.
|
|
1084
1117
|
|
|
1085
1118
|
```ts
|
|
1086
|
-
import type {
|
|
1119
|
+
import type { SaveObject, PacthObject } from "../../generated/vsrepo";
|
|
1087
1120
|
|
|
1088
|
-
|
|
1089
|
-
|
|
1121
|
+
const usuarioVSRepo = setupVSRepo<Usuario, "usuario">()({
|
|
1122
|
+
tableName: "usuario",
|
|
1123
|
+
pkName: "id",
|
|
1124
|
+
relations: {
|
|
1125
|
+
perfil: { pk: "id", mode: "oto", restriction: "set" },
|
|
1126
|
+
postagens: { pk: "id", mode: "otm", restriction: "add" },
|
|
1127
|
+
},
|
|
1128
|
+
});
|
|
1129
|
+
|
|
1130
|
+
// Tipo do objeto aceito pelo .save()
|
|
1131
|
+
type UsuarioSavePayload = SaveObject<typeof usuarioVSRepo>;
|
|
1132
|
+
|
|
1133
|
+
// Tipo do objeto aceito pelo .patch()
|
|
1134
|
+
type UsuarioPatchPayload = PacthObject<typeof usuarioVSRepo>;
|
|
1090
1135
|
```
|
|
1091
1136
|
|
|
1137
|
+
> Útil para tipar DTOs, funções auxiliares ou serviços que chamam `save`/`patch` e precisam do tipo correto do payload sem referenciar diretamente os tipos internos do Prisma.
|
|
1138
|
+
|
|
1092
1139
|
---
|
|
1093
1140
|
|
|
1094
1141
|
## API Reference
|