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 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
- findByPerfilWith: { map: true }, // perfil: { is: {} }
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<T> — versão derivada do tipo do repository
1022
- type OptsModel = MethodOptionsModel<typeof usuarioSelectModels>;
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 { BuiltRepository, RepositoryOf } from "../../generated/vsrepo";
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
- ### Tipo auxiliar
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 { DistributiveOmit } from "../../generated/vsrepo";
1119
+ import type { SaveObject, PacthObject } from "../../generated/vsrepo";
1087
1120
 
1088
- // Omit distributivo — preserva unions ao omitir propriedades
1089
- type SemEmail = DistributiveOmit<Usuario | Perfil, "email">;
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