prisma-power-types 1.0.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/README.md ADDED
@@ -0,0 +1,367 @@
1
+ ![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge&logo=typescript&logoColor=white)
2
+
3
+ # Prisma Power Types 🚀
4
+
5
+ Uma coleção de utilitários de TypeScript de alto nível para transformar de forma prática os modelos do Prisma em DTOs (Data Transfer Objects) seguros, dinâmicos e legíveis.
6
+
7
+ ## 📋 Pré-requisitos
8
+
9
+ Apesar de esta biblioteca não utilizar diretamente nenhuma dependência, seu uso não faz muito sentido fora de ecossistemas que não utilizem o Prisma. Portanto, você vai precisar:
10
+
11
+ - **TypeScript 4.5+:** Necessário para o suporte a Template Literal Types.
12
+
13
+ - **Prisma:** Instalado e gerado no projeto (confira a documentação oficial do [Prisma](https://www.prisma.io/docs/)).
14
+
15
+ ## ✨ Motivação
16
+
17
+ O Prisma gera tipos excelentes, mas criar interfaces de Criação, Atualização ou Filtros manualmente geralmente resulta em código repetitivo ou tipos "sujos" no IntelliSense. Esta biblioteca fornece utilitários que:
18
+
19
+ 1. **Automatizam metadados:** Removem `id` e _timestamps_ (`created_at`, `updated_at`, `deleted_at`).
20
+
21
+ 2. **Refinam a tipagem:** Transformam campos anuláveis em opcionais ou obrigatórios sob demanda.
22
+
23
+ 3. **Melhoram a DX:** Utilizam o utilitário `Prettify` para que você veja o objeto real ao passar o mouse, e não uma colcha de retalhos de `Omit` e `Pick`.
24
+
25
+ ## 📦 Instalação
26
+
27
+ ```bash
28
+ npm i prisma-power-types
29
+ # OU
30
+ yarn add prisma-power-types
31
+ ```
32
+
33
+ ## 🛠️ Principais Utilitários
34
+
35
+ Vamos primeiro definir o seguinte `schema` para os exemplos:
36
+
37
+ ```ini
38
+ enum UserRole {
39
+ administrator
40
+ moderator
41
+ user
42
+ }
43
+
44
+ model User {
45
+ id String @id @default(uuid()) @db.Uuid
46
+
47
+ cpf String @unique @db.VarChar(11)
48
+ name String @db.VarChar(100)
49
+ email String? @unique @db.VarChar(255)
50
+ password String @db.Char(60)
51
+ role UserRole @default(user)
52
+ is_active Boolean @default(true)
53
+
54
+ created_at DateTime @default(now())
55
+ updated_at DateTime @updatedAt
56
+ deleted_at DateTime?
57
+ }
58
+
59
+ # Os timestamps precisam terminar com '_at' ou 'At' para que a omissão automática funcione (e.g. 'created_at', 'createdAt'). Eu particularmente prefiro o formato 'snake_case' para Banco de Dados.
60
+ ```
61
+
62
+ > 💡 Aqui definimos `email` como opcional para um sistema de _"soft delete"_. Ao inativar um usuário, tornamos seu email nulo para que possamos reutilizá-lo no registro de novas contas. Isso é útil para empresas que utilizam emails institucionais.
63
+
64
+ ---
65
+
66
+ ### `PrismaElementCreate`
67
+
68
+ Este utilitário gera um tipo para criação de registros, removendo metadados e permitindo ajustes finos de obrigatoriedade.
69
+
70
+ ```ts
71
+ import { PrismaElementCreate } from 'prisma-power-types';
72
+ import { User } from 'generated/prisma/client';
73
+
74
+ // As chaves `id` e os timestamps são omitidas automaticamente.
75
+ export type IUserCreate = PrismaElementCreate<
76
+ User,
77
+ 'password' | 'is_active', // (opcional) Chaves que DEVEM ser para omitidas
78
+ 'email', // (opcional) Chaves que DEVEM ser obrigatórias
79
+ 'role' // (opcional) Chaves que DEVEM ser opcionais
80
+ >;
81
+
82
+ /**
83
+ * O resultado é:
84
+ *
85
+ * type IUserCreate = {
86
+ * cpf: string;
87
+ * name: string;
88
+ * email: string; // Note que o `null` é removido.
89
+ * role?: UserRole;
90
+ * };
91
+ */
92
+ ```
93
+
94
+ > **OBS:** O `PrismaElementCreate` substitui o tipo `null` por `undefined` de todas as propriedades restantes, tornando-as opcionais.
95
+
96
+ ### `PrismaElementIdentifier`
97
+
98
+ Este utilitário gera um tipo que garante que uma busca seja feita exatamente pelo `id` **OU** por um campo único (como CPF ou email), mas nunca ambos ou nenhum.
99
+
100
+ ```ts
101
+ import { PrismaElementIdentifier } from 'prisma-power-types';
102
+ import { User } from 'generated/prisma/client';
103
+
104
+ export type IUserIdentifier = PrismaElementIdentifier<User, 'cpf' | 'email'>;
105
+
106
+ /**
107
+ * O resultado fica assim:
108
+ *
109
+ * type IUserIdentifier =
110
+ * | { id: string }
111
+ * | { cpf: string }
112
+ * | { email: string };
113
+ */
114
+ ```
115
+
116
+ > 💡 O mais legal aqui é que é totalmente seguro a transformação de `IUserIdentifier` em `Prisma.UserWhereUniqueInput` via _Type Assertion_.
117
+
118
+ ### `PrismaElementUpdate`
119
+
120
+ Gera um tipo de atualização onde todos os campos (exceto metadados que são omitidos) são opcionais.
121
+
122
+ ```ts
123
+ import { PrismaElementUpdate } from 'prisma-power-types';
124
+ import { User } from 'generated/prisma/client';
125
+
126
+ export type IUserUpdate = PrismaElementUpdate<User>;
127
+
128
+ /**
129
+ * O IUserUpdate fica assim:
130
+ *
131
+ * type IUserUpdate = {
132
+ * cpf?: string;
133
+ * name?: string;
134
+ * email?: string | null;
135
+ * password?: string;
136
+ * role?: UserRole;
137
+ * is_active?: boolean;
138
+ * };
139
+ */
140
+ ```
141
+
142
+ ### `PrismaElementOrderBy` & `PrismaPagination`
143
+
144
+ Tipagem inteligente para ordenação, incluindo suporte a nulls: 'first' | 'last' apenas para campos que permitem valores nulos no banco. Além de uma interface pré-definida para suporte a paginação.
145
+
146
+ ```ts
147
+ import { PrismaElementOrderBy, PrismaPagination } from 'prisma-power-types';
148
+ import { User } from 'generated/prisma/client';
149
+
150
+ export type IUserOrderBy = PrismaElementOrderBy<
151
+ User,
152
+ 'cpf' | 'name' | 'email' | 'is_active' // Campos que serão ordenáveis
153
+ >;
154
+
155
+ /**
156
+ * O IUserOrderBy fica assim:
157
+ *
158
+ * type IUserOrderBy = {
159
+ * cpf: Prisma.SortOrder,
160
+ * name: Prisma.SortOrder,
161
+ * email: Prisma.SortOrderInput,
162
+ * is_active: Prisma.SortOrder,
163
+ * }
164
+ */
165
+
166
+ export interface IUserFilters extends PrismaPagination {
167
+ orderBy?: IUserOrderBy;
168
+ }
169
+
170
+ /**
171
+ * O IUserFilters fica assim:
172
+ *
173
+ * interface IUserFilters {
174
+ * orderBy: IUserOrderBy;
175
+ * page?: number;
176
+ * limit?: number;
177
+ * }
178
+ */
179
+ ```
180
+
181
+ ## 🚀 Recomendações de Uso
182
+
183
+ Para manter um projeto escalável e organizado, recomendo centralizar as transformações de tipos em arquivos dedicados e utilizá-los como contratos para seus DTOs.
184
+
185
+ ### Estrutura de Pastas Sugerida
186
+
187
+ Organize seus tipos por domínio dentro de cada rota. Isso evita referências circulares e facilita a localização de definições:
188
+
189
+ ```text
190
+ src/
191
+ └─ routes/
192
+ └─ users/
193
+ ├─ dto/
194
+ │ ├─ users-create.dto.ts
195
+ │ └─ users-update.dto.ts
196
+ ├─ types/
197
+ │ └─ users.types.ts
198
+ ├─ users.service.ts
199
+ └─ users.controller.ts
200
+ ```
201
+
202
+ ### 1. Centralize as Definições (`users.types.ts`)
203
+
204
+ Neste arquivo, você consome os modelos do Prisma e exporta as interfaces processadas pela biblioteca:
205
+
206
+ ```ts
207
+ import { User } from 'generated/prisma/client';
208
+ import { PrismaElementCreate, PrismaElementUpdate } from 'prisma-power-types';
209
+
210
+ export type IUserCreate = PrismaElementCreate<
211
+ User,
212
+ 'password' | 'is_active', // Removidos da criação
213
+ 'email', // Torna obrigatório
214
+ 'role' // Torna opcional
215
+ >;
216
+
217
+ export type IUserUpdate = PrismaElementUpdate<User>;
218
+ ```
219
+
220
+ ### 2. Implemente nos DTOs (`users-create.dto.ts`)
221
+
222
+ Ao implementar os tipos gerados no seu DTO, o TypeScript garantirá que sua classe de validação (no exemplo estou usando o `class-validator`) esteja sempre em sincronia com as regras de negócio definidas nos seus tipos.
223
+
224
+ ```ts
225
+ import { IsEmail, IsEnum, IsString, IsOptional, Length } from 'class-validator';
226
+ import { UserRole } from 'generated/prisma/client';
227
+ import { IUserCreate } from '../types/users.types';
228
+
229
+ export class CreateUserDto implements IUserCreate {
230
+ @IsString()
231
+ @Length(11, 11)
232
+ cpf: string;
233
+
234
+ @IsString()
235
+ name: string;
236
+
237
+ @IsEmail()
238
+ email: string; // O TS exigirá que seja obrigatório conforme IUserCreate
239
+
240
+ @IsOptional()
241
+ @IsEnum(UserRole)
242
+ role?: UserRole; // O TS exigirá que seja opcional conforme IUserCreate
243
+ }
244
+ ```
245
+
246
+ > **Vantagem desta abordagem:** Se você alterar a obrigatoriedade de um campo no arquivo de tipos, o TypeScript apontará imediatamente um erro no seu DTO, evitando que você esqueça de atualizar as validações de entrada da API.
247
+
248
+ ## 🧬 Estrutura Base
249
+
250
+ Para utilizar os utilitários, seus modelos devem ser compatíveis com a interface `PrismaElement`:
251
+
252
+ ```ts
253
+ export interface PrismaElement {
254
+ id: string | number;
255
+ [key: string]: unknown;
256
+ }
257
+ ```
258
+
259
+ ## 🔍 Utilitários de String (Low-level)
260
+
261
+ ### Filtros por Nome de Chave
262
+
263
+ Utilizam _Template Literal Types_ para filtrar propriedades do objeto dinamicamente.
264
+
265
+ | Utilitário | Descrição |
266
+ | ----------------------- | -------------------------------------------------------------- |
267
+ | `PickByPrefix<T, S>` | Seleciona propriedades cujas chaves começam com o prefixo `S`. |
268
+ | `PickBySubstring<T, S>` | Seleciona propriedades cujas chaves contêm a substring `S`. |
269
+ | `PickBySuffix<T, S>` | Seleciona propriedades cujas chaves terminam com o sufixo `S`. |
270
+ | `OmitByPrefix<T, S>` | Remove propriedades cujas chaves começam com o prefixo `S`. |
271
+ | `OmitBySubstring<T, S>` | Remove propriedades cujas chaves contêm a substring `S`. |
272
+ | `OmitBySuffix<T, S>` | Remove propriedades cujas chaves terminam com o sufixo `S`. |
273
+
274
+ > Todos seguem o padrão: `<T extends object, S extends string>`.
275
+
276
+ ```ts
277
+ type OnlyTimestamps = PickBySuffix<User, '_at'>;
278
+
279
+ /**
280
+ * type OnlyTimestamps = {
281
+ * created_at: Date;
282
+ * updated_at: Date;
283
+ * deleted_at: Date | null;
284
+ * }
285
+ ```
286
+
287
+ ### Filtros por Tipo de Valor
288
+
289
+ | Utilitário | Descrição |
290
+ | --------------------- | ---------------------------------------------------------------- |
291
+ | `PickByType<T, Type>` | Seleciona propriedades onde o valor é atribuível ao tipo `Type`. |
292
+ | `OmitByType<T, Type>` | Remove propriedades onde o valor é atribuível ao tipo `Type`. |
293
+
294
+ > Os dois seguem o padrão: `<T extends object, Type>`.
295
+
296
+ ```ts
297
+ // Seleciona apenas campos que podem ser nulos
298
+
299
+ type NullableFields = PickByType<User, null>;
300
+
301
+ /**
302
+ * type NullableFields = {
303
+ * email: string | null;
304
+ * deleted_at: Date | null;
305
+ * }
306
+ */
307
+ ```
308
+
309
+ ### Utilitários de Composição
310
+
311
+ | Utilitário | Descrição |
312
+ | ----------------- | ------------------------------------------------------------------------------------------ |
313
+ | `PickOneOf<T, K>` | Cria um tipo onde **exatamente uma** das chaves em `K` é obrigatória, proibindo as outras. |
314
+ | `PickReq<T, K>` | Seleciona as chaves `K` e as torna obrigatórias. |
315
+ | `PickOpt<T, K>` | Seleciona as chaves `K` e as torna opcionais. |
316
+
317
+ ### `Prettify`
318
+
319
+ Esse tipo merece um destaque especial por ser o segredo por trás da experiência do desenvolvedor (DX) nesta biblioteca.
320
+
321
+ Ao trabalhar com utilitários complexos como Omit, Pick e interseções (&), o TypeScript tende a exibir o "processo" e não o "resultado" no IntelliSense da sua IDE. Em vez de ver as propriedades reais do objeto, você acaba vendo algo como `Pick<User, "name"> & { role?: UserRole }`. O Prettify resolve isso "achatando" o tipo em um objeto literal único e legível.
322
+
323
+ **O que o torna único:**
324
+
325
+ - **Preservação de Tipos Nativos:** Diferente de versões simplificadas, nossa implementação não tenta "expandir" objetos nativos como `Date`, `Map`, `Set`, `Promise` ou `RegExp`. Isso evita que sua IDE exiba centenas de propriedades internas globais do JavaScript.
326
+
327
+ - **Recursividade Inteligente:** Ele percorre toda a árvore de objetos, limpando tipos aninhados para que a legibilidade seja mantida em qualquer profundidade.
328
+
329
+ - **Controle de Exclusão (Template E):** Este é o grande diferencial. O parâmetro genérico `E` permite definir tipos customizados que não devem ser expandidos.
330
+
331
+ **Exemplo:** Se você tem um tipo `Decimal` (muito comum no Prisma para campos monetários), você pode passar `Prettify<SeuTipo, Decimal>`. Isso instrui o utilitário a tratar o `Decimal` como um valor atômico, impedindo que a IDE tente detalhar sua estrutura interna complexa.
332
+
333
+ ---
334
+
335
+ ## 💡 Dicas de Uso
336
+
337
+ ### Otimizando a Visualização (DX)
338
+
339
+ O TypeScript tende a mostrar tipos complexos como `Pick<User, "name"> & Omit<...>` ao passar o mouse. Todos os utilitários de alto nível desta biblioteca já utilizam o `Prettify` internamente para garantir que você veja a estrutura final do objeto.
340
+
341
+ ---
342
+
343
+ ## 🤝 Contribuição
344
+
345
+ Contribuições são muito bem-vindas! Se você encontrou um bug ou tem uma ideia para um novo utilitário:
346
+
347
+ 1. Faça um **Fork** do projeto.
348
+ 2. Crie uma **Branch** para sua feature (`git checkout -b feature/minha-feature`).
349
+ 3. Faça o **Commit** das alterações (`git commit -m 'Adicionando nova funcionalidade'`).
350
+ 4. Envie o **Push** para a branch (`git push origin feature/minha-feature`).
351
+ 5. Abra um **Pull Request**.
352
+
353
+ ---
354
+
355
+ ## 📄 Licença
356
+
357
+ Distribuído sob a licença MIT.
358
+
359
+ - Você é livre para utilizar essa biblioteca em projetos pessoais ou empresariais;
360
+ - Fique a vontade para modificar os códigos de acordo com suas necessidades;
361
+ - Você também pode distribuir versões modificadas desse projeto, só peço que mencione este repositório.
362
+
363
+ ---
364
+
365
+ Criado por Bianca Maxine.
366
+
367
+ Se este pacote te ajudou, considere dar uma ⭐️ no [Repositório do GitHub](https://github.com/biamaxine/prisma-power-types)!
@@ -0,0 +1,5 @@
1
+ export * from './types/pick.types';
2
+ export * from './types/omit.types';
3
+ export * from './types/prettify.type';
4
+ export * from './types/prisma/prisma.types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AAEtC,cAAc,6BAA6B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types/pick.types"), exports);
18
+ __exportStar(require("./types/omit.types"), exports);
19
+ __exportStar(require("./types/prettify.type"), exports);
20
+ __exportStar(require("./types/prisma/prisma.types"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,qDAAmC;AACnC,wDAAsC;AAEtC,8DAA4C"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Omite as propriedades de `T` cujas chaves começam com o prefixo `S`.
3
+ *
4
+ * @template T extends `object` - O tipo do objeto de origem.
5
+ * @template S extends `string` - O prefixo a ser correspondido nas chaves.
6
+ */
7
+ export type OmitByPrefix<T extends object, S extends string> = {
8
+ [K in keyof T as K extends `${S}${string}` ? never : K]: T[K];
9
+ };
10
+ /**
11
+ * Omite as propriedades de `T` cujas chaves contêm a substring `S`.
12
+ *
13
+ * @template T extends `object` - O tipo do objeto de origem.
14
+ * @template S extends `string` - A substring a ser buscada nas chaves.
15
+ */
16
+ export type OmitBySubstring<T extends object, S extends string> = {
17
+ [K in keyof T as K extends `${string}${S}${string}` ? never : K]: T[K];
18
+ };
19
+ /**
20
+ * Omite as propriedades de `T` cujas chaves terminam com o sufixo `S`.
21
+ *
22
+ * @template T extends `object` - O tipo do objeto de origem.
23
+ * @template S extends `string` - O sufixo a ser correspondido nas chaves.
24
+ */
25
+ export type OmitBySuffix<T extends object, S extends string> = {
26
+ [K in keyof T as K extends `${string}${S}` ? never : K]: T[K];
27
+ };
28
+ /**
29
+ * Omite as propriedades de `T` onde o tipo `Type` é atribuível ao valor da propriedade.
30
+ *
31
+ * @template T extends `object` - O tipo do objeto de origem.
32
+ * @template Type O tipo a ser verificado contra as propriedades de T.
33
+ */
34
+ export type OmitByType<T extends object, Type> = {
35
+ [K in keyof T as Type extends T[K] ? never : K]: T[K];
36
+ };
37
+ /**
38
+ * Omite um subconjunto de propriedades `K` de `T` e torna as restantes obrigatórias (Required).
39
+ *
40
+ * @template T extends `object` - O tipo do objeto de origem.
41
+ * @template K extends `keyof T` - As chaves a serem omitidas.
42
+ */
43
+ export type OmitReq<T extends object, K extends keyof T> = Required<Omit<T, K>>;
44
+ /**
45
+ * Omite um subconjunto de propriedades `K` de `T` e torna as restantes opcionais (Partial).
46
+ *
47
+ * @template T extends `object` - O tipo do objeto de origem.
48
+ * @template K extends `keyof T` - As chaves a serem omitidas.
49
+ */
50
+ export type OmitOpt<T extends object, K extends keyof T> = Partial<Omit<T, K>>;
51
+ //# sourceMappingURL=omit.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omit.types.d.ts","sourceRoot":"","sources":["../../src/types/omit.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI;KAC5D,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI;KAC/D,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACvE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI;KAC5D,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,IAAI;KAC9C,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=omit.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omit.types.js","sourceRoot":"","sources":["../../src/types/omit.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Seleciona as propriedades de `T` cujas chaves começam com o prefixo `S`.
3
+ *
4
+ * @template T extends `object` - O tipo do objeto de origem.
5
+ * @template S extends `string` - O prefixo a ser correspondido nas chaves.
6
+ */
7
+ export type PickByPrefix<T extends object, S extends string> = {
8
+ [K in keyof T as K extends `${S}${string}` ? K : never]: T[K];
9
+ };
10
+ /**
11
+ * Seleciona as propriedades de `T` cujas chaves contêm a substring `S`.
12
+ *
13
+ * @template T extends `object` - O tipo do objeto de origem.
14
+ * @template S extends `string` - A substring a ser buscada nas chaves.
15
+ */
16
+ export type PickBySubstring<T extends object, S extends string> = {
17
+ [K in keyof T as K extends `${string}${S}${string}` ? K : never]: T[K];
18
+ };
19
+ /**
20
+ * Seleciona as propriedades de `T` cujas chaves terminam com o sufixo `S`.
21
+ *
22
+ * @template T extends `object` - O tipo do objeto de origem.
23
+ * @template S extends `string` - O sufixo a ser correspondido nas chaves.
24
+ */
25
+ export type PickBySuffix<T extends object, S extends string> = {
26
+ [K in keyof T as K extends `${string}${S}` ? K : never]: T[K];
27
+ };
28
+ /**
29
+ * Cria um tipo onde exatamente uma das chaves em `K` é obrigatória (e não nula),
30
+ * enquanto as outras chaves especificadas são proibidas.
31
+ *
32
+ * @template T extends `object` - O tipo do objeto de origem.
33
+ * @template K extends `keyof T` - As chaves a serem consideradas (padrão: todas as chaves de T).
34
+ */
35
+ export type PickOneOf<T extends object, K extends keyof T = keyof T> = {
36
+ [P in K]: Required<Record<P, NonNullable<T[P]>>> & Partial<Record<Exclude<K, P>, never>>;
37
+ }[K];
38
+ /**
39
+ * Seleciona as propriedades de `T` onde o tipo `Type` é atribuível ao valor da propriedade.
40
+ *
41
+ * @template T extends `object` - O tipo do objeto de origem.
42
+ * @template Type O tipo a ser verificado contra as propriedades de T.
43
+ */
44
+ export type PickByType<T extends object, Type> = {
45
+ [K in keyof T as Type extends T[K] ? K : never]: T[K];
46
+ };
47
+ /**
48
+ * Seleciona um subconjunto de propriedades `K` de `T` e as torna obrigatórias (Required).
49
+ *
50
+ * @template T extends `object` - O tipo do objeto de origem.
51
+ * @template K extends `keyof T` - As chaves a serem selecionadas.
52
+ */
53
+ export type PickReq<T extends object, K extends keyof T> = Required<Pick<T, K>>;
54
+ /**
55
+ * Seleciona um subconjunto de propriedades `K` de `T` e as torna opcionais (Partial).
56
+ *
57
+ * @template T extends `object` - O tipo do objeto de origem.
58
+ * @template K extends `keyof T` - As chaves a serem selecionadas.
59
+ */
60
+ export type PickOpt<T extends object, K extends keyof T> = Partial<Pick<T, K>>;
61
+ //# sourceMappingURL=pick.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick.types.d.ts","sourceRoot":"","sources":["../../src/types/pick.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI;KAC5D,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI;KAC/D,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;CACvE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI;KAC5D,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI;KACpE,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC9C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;CACxC,CAAC,CAAC,CAAC,CAAC;AAEL;;;;;GAKG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,IAAI;KAC9C,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=pick.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick.types.js","sourceRoot":"","sources":["../../src/types/pick.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ type NativeObjects<T> = unknown[] | Set<unknown> | Map<unknown, unknown> | Iterable<unknown> | Promise<unknown> | Function | Date | RegExp | Error | T;
2
+ /**
3
+ * Expande recursivamente as propriedades de um tipo para melhorar a legibilidade em tooltips de IDEs.
4
+ *
5
+ * Este utilitário percorre a estrutura do objeto e "achata" as interseções e propriedades herdadas,
6
+ * facilitando a inspeção visual do tipo final. Tipos nativos e o tipo especificado em `E` são preservados.
7
+ *
8
+ * @template T - O tipo a ser processado/expandido.
9
+ * @template E - Um tipo que, se encontrado, interrompe a expansão recursiva (útil para evitar loops ou preservar definições).
10
+ */
11
+ export type Prettify<T, E = never> = T extends NativeObjects<E> ? T : T extends object ? {
12
+ [K in keyof T]: Prettify<T[K], E>;
13
+ } : T;
14
+ export {};
15
+ //# sourceMappingURL=prettify.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prettify.type.d.ts","sourceRoot":"","sources":["../../src/types/prettify.type.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,CAAC,CAAC,IAChB,OAAO,EAAE,GACT,GAAG,CAAC,OAAO,CAAC,GACZ,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,GACrB,QAAQ,CAAC,OAAO,CAAC,GACjB,OAAO,CAAC,OAAO,CAAC,GAEhB,QAAQ,GACR,IAAI,GACJ,MAAM,GACN,KAAK,GACL,CAAC,CAAC;AAEN;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,IAC/B,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,GACtB,CAAC,GACD,CAAC,SAAS,MAAM,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;CAAE,GACrC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=prettify.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prettify.type.js","sourceRoot":"","sources":["../../src/types/prettify.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,113 @@
1
+ import { PickBySuffix, PickByType, PickOneOf } from '../pick.types';
2
+ import { Prettify } from '../prettify.type';
3
+ /**
4
+ * Interface base que todo modelo Prisma deve estender para ser compatível com estes utilitários.
5
+ *
6
+ * Garante a presença de um `id` e permite indexação por string.
7
+ */
8
+ export interface PrismaElement {
9
+ /**
10
+ * Apesar de a propriedade aceitar ambos, é comum utilizarmos um único tipo para IDs no banco de dados.
11
+ *
12
+ * @type {string | number} - Suporte para UUID e autoincrement
13
+ */
14
+ id: string | number;
15
+ [key: string]: unknown;
16
+ }
17
+ declare const SortOrder: {
18
+ readonly asc: "asc";
19
+ readonly desc: "desc";
20
+ };
21
+ type SortOrder = keyof typeof SortOrder;
22
+ declare const NullsOrder: {
23
+ readonly first: "first";
24
+ readonly last: "last";
25
+ };
26
+ type NullsOrder = keyof typeof NullsOrder;
27
+ /**
28
+ * Estrutura para definir a ordenação de campos que podem ser nulos.
29
+ */
30
+ interface SortOrderInput {
31
+ sort: SortOrder;
32
+ nulls?: NullsOrder;
33
+ }
34
+ /**
35
+ * Identifica as chaves de metadados padrão do Prisma que geralmente não devem ser manipuladas manualmente.
36
+ *
37
+ * Inclui 'id' e quaisquer chaves terminadas em '_at' (ex: created_at).
38
+ *
39
+ * @template T - O tipo do objeto de origem.
40
+ */
41
+ type PrismaElementMetadata<T extends PrismaElement> = 'id' | keyof PickBySuffix<T, '_at' | 'At'>;
42
+ /**
43
+ * Omite os metadados padrão e chaves adicionais especificadas de um tipo Prisma.
44
+ *
45
+ * @template T - O tipo do objeto de origem.
46
+ * @template K - Chaves adicionais a serem omitidas.
47
+ */
48
+ type OmitElementMetadatas<T extends PrismaElement, K extends Exclude<keyof T, PrismaElementMetadata<T>> = never> = Omit<T, PrismaElementMetadata<T> | K>;
49
+ /**
50
+ * Utilitário interno para modificar as propriedades de um tipo Prisma para operações de criação.
51
+ *
52
+ * @template T - O tipo do objeto de origem.
53
+ * @template O - Chaves a serem omitidas.
54
+ * @template R - Chaves a serem tornadas obrigatórias (não nulas).
55
+ * @template P - Chaves a serem tornadas opcionais.
56
+ * @template M - O tipo base com metadados já omitidos.
57
+ */
58
+ type Modify<T extends PrismaElement, O extends Exclude<keyof T, PrismaElementMetadata<T>>, R extends Exclude<keyof T, PrismaElementMetadata<T> | O>, P extends Exclude<keyof T, PrismaElementMetadata<T> | O | R>, M = OmitElementMetadatas<T, O>> = {
59
+ [K in keyof M as K extends R ? K : never]: Exclude<M[K], null>;
60
+ } & {
61
+ [K in keyof M as K extends P ? K : never]?: Exclude<M[K], null>;
62
+ } & {
63
+ [K in keyof M as K extends R | P ? never : null extends M[K] ? K : never]?: Exclude<M[K], null>;
64
+ } & {
65
+ [K in keyof M as K extends R | P ? never : null extends M[K] ? never : K]: M[K];
66
+ };
67
+ /**
68
+ * Cria um tipo otimizado para a criação de registros Prisma.
69
+ *
70
+ * Remove metadados automáticos e permite ajustar a obrigatoriedade dos campos.
71
+ *
72
+ * @template T - O tipo do modelo Prisma.
73
+ * @template O - Chaves a serem omitidas (além dos metadados padrão).
74
+ * @template R - Chaves que devem ser obrigatórias (remove `null`/`undefined`).
75
+ * @template P - Chaves que devem ser opcionais.
76
+ */
77
+ export type PrismaElementCreate<T extends PrismaElement, O extends Exclude<keyof T, PrismaElementMetadata<T>> = never, R extends Exclude<keyof PickByType<T, null>, PrismaElementMetadata<T> | O> = never, P extends Exclude<keyof T, PrismaElementMetadata<T> | O | R> = never> = Prettify<Modify<T, O, R, P>>;
78
+ /**
79
+ * Define um tipo que exige o `id` OU uma das chaves únicas especificadas.
80
+ *
81
+ * Útil para operações que buscam um registro por identificador único.
82
+ *
83
+ * @template T - O tipo do modelo Prisma.
84
+ * @template K - Chaves únicas adicionais (ex: 'email', 'uuid').
85
+ */
86
+ export type PrismaElementIdentifier<T extends PrismaElement, K extends Exclude<keyof T, 'id'>> = Prettify<PickOneOf<T, 'id' | K>>;
87
+ /**
88
+ * Interface padrão para parâmetros de paginação.
89
+ */
90
+ export interface PrismaPagination {
91
+ page?: number;
92
+ limit?: number;
93
+ }
94
+ /**
95
+ * Define a estrutura de ordenação para consultas Prisma.
96
+ *
97
+ * @template T - O tipo do modelo Prisma.
98
+ * @template K - As chaves pelas quais a ordenação é permitida.
99
+ */
100
+ export type PrismaElementOrderBy<T extends PrismaElement, K extends keyof T> = {
101
+ [P in K]?: null extends T[P] ? SortOrderInput | SortOrder : SortOrder;
102
+ };
103
+ /**
104
+ * Cria um tipo para atualização de registros Prisma.
105
+ *
106
+ * Remove metadados e torna todas as propriedades restantes opcionais.
107
+ *
108
+ * @template T - O tipo do modelo Prisma.
109
+ * @template O - Chaves adicionais a serem omitidas.
110
+ */
111
+ export type PrismaElementUpdate<T extends PrismaElement, O extends Exclude<keyof T, PrismaElementMetadata<T>> = never> = Partial<OmitElementMetadatas<T, O>>;
112
+ export {};
113
+ //# sourceMappingURL=prisma.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.types.d.ts","sourceRoot":"","sources":["../../../src/types/prisma/prisma.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const SortOrder = {
4
+ asc: 'asc',
5
+ desc: 'desc',
6
+ };
7
+ const NullsOrder = {
8
+ first: 'first',
9
+ last: 'last',
10
+ };
11
+ //# sourceMappingURL=prisma.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.types.js","sourceRoot":"","sources":["../../../src/types/prisma/prisma.types.ts"],"names":[],"mappings":";;AAoBA,MAAM,SAAS,GAAG;IAChB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;CACJ,CAAC;AAIX,MAAM,UAAU,GAAG;IACjB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;CACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "prisma-power-types",
3
+ "version": "1.0.0",
4
+ "description": "Uma coleção de TS Utility Types para transformar de forma prática os modelos do Prisma em DTOs seguros, dinâmicos e legíveis.",
5
+ "author": "Bianca Maxine",
6
+ "github": "https://github.com/biamaxine",
7
+ "linkedin": "https://linkedin.com/in/biamaxine",
8
+ "email": "biamaxine.v@gmail.com",
9
+ "keywords": [
10
+ "prisma",
11
+ "typescript"
12
+ ],
13
+ "license": "MIT",
14
+ "main": "dist/index.js",
15
+ "types": "dist/index.d.ts",
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "scripts": {
22
+ "start": "node dist/index.js",
23
+ "build": "tsc",
24
+ "dev": "nodemon",
25
+ "lint": "eslint --fix"
26
+ },
27
+ "devDependencies": {
28
+ "@eslint/js": "^9.39.2",
29
+ "@types/node": "^25.2.1",
30
+ "eslint": "^9.39.2",
31
+ "eslint-config-prettier": "^10.1.8",
32
+ "eslint-plugin-prettier": "^5.5.5",
33
+ "globals": "^17.3.0",
34
+ "nodemon": "^3.1.11",
35
+ "prettier": "^3.8.1",
36
+ "ts-node": "^10.9.2",
37
+ "typescript": "^5.9.3",
38
+ "typescript-eslint": "^8.54.0"
39
+ },
40
+ "exports": {
41
+ ".": {
42
+ "types": "./dist/index.d.ts",
43
+ "import": "./dist/index.js",
44
+ "default": "./dist/index.js"
45
+ }
46
+ },
47
+ "publishConfig": {
48
+ "access": "public"
49
+ }
50
+ }