@cargolift-cdi/lib-payload 0.1.58 → 0.1.60

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 (95) hide show
  1. package/README.md +281 -103
  2. package/dist/{types/index.d.ts → index.d.ts} +5 -1
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/{esm/index.js → index.js} +4 -1
  5. package/dist/index.js.map +1 -0
  6. package/dist/payload-condition/payload-condition.d.ts +8 -0
  7. package/dist/payload-condition/payload-condition.d.ts.map +1 -0
  8. package/dist/{esm/payload-condition → payload-condition}/payload-condition.js +13 -10
  9. package/dist/payload-condition/payload-condition.js.map +1 -0
  10. package/dist/payload-diff/payload-diff.d.ts +5 -0
  11. package/dist/payload-diff/payload-diff.d.ts.map +1 -0
  12. package/dist/payload-diff/payload-diff.example.d.ts +1 -0
  13. package/dist/payload-diff/payload-diff.example.d.ts.map +1 -0
  14. package/dist/payload-diff/payload-diff.example.js +2 -0
  15. package/dist/payload-diff/payload-diff.example.js.map +1 -0
  16. package/dist/payload-diff/payload-diff.interface.d.ts +13 -0
  17. package/dist/payload-diff/payload-diff.interface.d.ts.map +1 -0
  18. package/dist/payload-diff/payload-diff.interface.js +2 -0
  19. package/dist/payload-diff/payload-diff.interface.js.map +1 -0
  20. package/dist/payload-diff/payload-diff.js +213 -0
  21. package/dist/payload-diff/payload-diff.js.map +1 -0
  22. package/dist/{types/payload-response-interpreter → payload-response-interpreter}/payload-response-interpreter.d.ts +1 -0
  23. package/dist/payload-response-interpreter/payload-response-interpreter.d.ts.map +1 -0
  24. package/dist/payload-response-interpreter/payload-response-interpreter.js.map +1 -0
  25. package/dist/{types/payload-transformation → payload-transformation}/payload-transformation.d.ts +1 -0
  26. package/dist/payload-transformation/payload-transformation.d.ts.map +1 -0
  27. package/dist/payload-transformation/payload-transformation.interface.d.ts +1 -0
  28. package/dist/payload-transformation/payload-transformation.interface.d.ts.map +1 -0
  29. package/dist/payload-transformation/payload-transformation.interface.js.map +1 -0
  30. package/dist/payload-transformation/payload-transformation.js.map +1 -0
  31. package/dist/{types/payload-validation → payload-validation}/payload-validation.d.ts +5 -3
  32. package/dist/payload-validation/payload-validation.d.ts.map +1 -0
  33. package/dist/{esm/payload-validation → payload-validation}/payload-validation.js +29 -4
  34. package/dist/payload-validation/payload-validation.js.map +1 -0
  35. package/dist/{types/util → util}/payload-comparator.util.d.ts +1 -0
  36. package/dist/util/payload-comparator.util.d.ts.map +1 -0
  37. package/dist/util/payload-comparator.util.js.map +1 -0
  38. package/dist/util/payload-hash.util.d.ts +2 -0
  39. package/dist/util/payload-hash.util.d.ts.map +1 -0
  40. package/dist/util/payload-hash.util.js +6 -0
  41. package/dist/util/payload-hash.util.js.map +1 -0
  42. package/dist/{types/util → util}/payload-path.util.d.ts +1 -0
  43. package/dist/util/payload-path.util.d.ts.map +1 -0
  44. package/dist/util/payload-path.util.js.map +1 -0
  45. package/dist/{types/util → util}/payload-pointer.util.d.ts +1 -0
  46. package/dist/util/payload-pointer.util.d.ts.map +1 -0
  47. package/dist/util/payload-pointer.util.js.map +1 -0
  48. package/dist/util/payload-variable-resolver.util.d.ts +5 -0
  49. package/dist/util/payload-variable-resolver.util.d.ts.map +1 -0
  50. package/dist/util/payload-variable-resolver.util.js +28 -0
  51. package/dist/util/payload-variable-resolver.util.js.map +1 -0
  52. package/package.json +25 -34
  53. package/dist/cjs/index.js +0 -25
  54. package/dist/cjs/index.js.map +0 -1
  55. package/dist/cjs/package.json +0 -1
  56. package/dist/cjs/payload-condition/payload-condition.js +0 -74
  57. package/dist/cjs/payload-condition/payload-condition.js.map +0 -1
  58. package/dist/cjs/payload-response-interpreter/payload-response-interpreter.js +0 -83
  59. package/dist/cjs/payload-response-interpreter/payload-response-interpreter.js.map +0 -1
  60. package/dist/cjs/payload-transformation/payload-transformation.interface.js.map +0 -1
  61. package/dist/cjs/payload-transformation/payload-transformation.js +0 -46
  62. package/dist/cjs/payload-transformation/payload-transformation.js.map +0 -1
  63. package/dist/cjs/payload-validation/payload-validation.interface.js +0 -3
  64. package/dist/cjs/payload-validation/payload-validation.interface.js.map +0 -1
  65. package/dist/cjs/payload-validation/payload-validation.js +0 -301
  66. package/dist/cjs/payload-validation/payload-validation.js.map +0 -1
  67. package/dist/cjs/tsconfig.cjs.tsbuildinfo +0 -1
  68. package/dist/cjs/util/payload-comparator.util.js +0 -65
  69. package/dist/cjs/util/payload-comparator.util.js.map +0 -1
  70. package/dist/cjs/util/payload-path.util.js +0 -25
  71. package/dist/cjs/util/payload-path.util.js.map +0 -1
  72. package/dist/cjs/util/payload-pointer.util.js +0 -119
  73. package/dist/cjs/util/payload-pointer.util.js.map +0 -1
  74. package/dist/esm/index.js.map +0 -1
  75. package/dist/esm/payload-condition/payload-condition.js.map +0 -1
  76. package/dist/esm/payload-response-interpreter/payload-response-interpreter.js.map +0 -1
  77. package/dist/esm/payload-transformation/payload-transformation.interface.js +0 -2
  78. package/dist/esm/payload-transformation/payload-transformation.interface.js.map +0 -1
  79. package/dist/esm/payload-transformation/payload-transformation.js.map +0 -1
  80. package/dist/esm/payload-validation/payload-validation.interface.js +0 -2
  81. package/dist/esm/payload-validation/payload-validation.interface.js.map +0 -1
  82. package/dist/esm/payload-validation/payload-validation.js.map +0 -1
  83. package/dist/esm/tsconfig.esm.tsbuildinfo +0 -1
  84. package/dist/esm/util/payload-comparator.util.js.map +0 -1
  85. package/dist/esm/util/payload-path.util.js.map +0 -1
  86. package/dist/esm/util/payload-pointer.util.js.map +0 -1
  87. package/dist/types/payload-condition/payload-condition.d.ts +0 -4
  88. package/dist/types/payload-transformation/payload-transformation.interface.d.ts +0 -0
  89. package/dist/types/payload-validation/payload-validation.interface.d.ts +0 -33
  90. /package/dist/{esm/payload-response-interpreter → payload-response-interpreter}/payload-response-interpreter.js +0 -0
  91. /package/dist/{cjs/payload-transformation → payload-transformation}/payload-transformation.interface.js +0 -0
  92. /package/dist/{esm/payload-transformation → payload-transformation}/payload-transformation.js +0 -0
  93. /package/dist/{esm/util → util}/payload-comparator.util.js +0 -0
  94. /package/dist/{esm/util → util}/payload-path.util.js +0 -0
  95. /package/dist/{esm/util → util}/payload-pointer.util.js +0 -0
package/README.md CHANGED
@@ -1,148 +1,326 @@
1
- # @cargolift-cdi/lib-payload · PayloadValidation
1
+ # lib-payload
2
2
 
3
- Biblioteca utilizada pelos serviços do middleware para validar payloads antes de publicá-los ou processá-los. O `PayloadValidation` aplica regras declarativas, suporta objetos ou strings JSON e retorna um relatório padronizado com todos os erros encontrados.
3
+ ![Build Status](https://img.shields.io/badge/build-local-blue)
4
+ ![Versão](https://img.shields.io/badge/version-0.1.59-green)
5
+ ![Licença](https://img.shields.io/badge/license-MIT-lightgrey)
6
+ ![Cobertura de Testes](https://img.shields.io/badge/coverage-vitest-yellowgreen)
4
7
 
5
- ## Instalação
8
+ Biblioteca TypeScript para tratamento, validação, transformação, comparação e interpretação de payloads JSON no ecossistema Middleware Cargolift.
6
9
 
7
- ```bash
8
- npm install @cargolift-cdi/lib-payload
9
- ```
10
+ ---
11
+
12
+ ## 📌 Objetivo
13
+
14
+ Este repositório centraliza utilitários e componentes reutilizáveis para lidar com payloads de integração, reduzindo duplicação de lógica entre serviços e padronizando comportamentos críticos de validação e auditoria.
15
+
16
+ No contexto do Middleware, a lib apoia fluxos de integração com foco em **resiliência**, **rastreabilidade**, **consistência de dados** e **facilidade de manutenção**.
17
+
18
+ Público-alvo:
19
+ Desenvolvedores de bibliotecas e serviços do monorepo middleware.
20
+
21
+ ---
22
+
23
+ ## ✨ Funcionalidades
10
24
 
11
- ## Uso rápido
25
+ - **PayloadValidation:** valida payloads por schema declarativo (tipos, obrigatoriedade, ranges, padrões e listas permitidas).
26
+ - **PayloadTransformation:** transforma estruturas JSON usando expressões JSONata.
27
+ - **PayloadDiff:** compara entidade x payload e retorna apenas mudanças efetivas, com changelog para auditoria.
28
+ - **PayloadCondition:** avalia árvores de condições lógicas (`all`/`any`) com suporte a variáveis dinâmicas.
29
+ - **PayloadResponseInterpreter:** interpreta respostas de APIs externas para padronizar sucesso/erro e mensagens.
30
+ - **Utilitários de payload:** navegação por path, comparação, JSON pointer, resolução de variáveis e hash.
31
+
32
+ Diferenciais técnicos:
33
+ - API agnóstica de framework.
34
+ - Cobertura por testes com Vitest.
35
+ - Foco em uso em pipelines de integração e processamento de mensagens.
36
+
37
+ ---
38
+
39
+ ## 🔍 Detalhamento
40
+
41
+ ### Validação de Payload
42
+
43
+ `PayloadValidation` executa validação declarativa e retorna relatório estruturado sem interromper o fluxo por exceções de negócio.
44
+
45
+ #### Exemplo de uso
12
46
 
13
47
  ```ts
14
- import { PayloadValidation, Schema } from "@cargolift-cdi/lib-payload";
15
-
16
- const schema: Schema = {
17
- validations: [
18
- { field: "order/id", required: true, type: "string", length: { min: 3, max: 36 } },
19
- { field: "items", type: "array", minItems: 1 },
20
- { field: "items/qty", type: "number", range: { min: 1 }, message: "Quantidade mínima por item é 1" },
21
- ],
22
- };
48
+ import { PayloadValidation } from "@cargolift-cdi/lib-payload";
23
49
 
24
50
  const validator = new PayloadValidation();
25
- const result = await validator.run(payloadOuJson, schema);
51
+
52
+ const schema = {
53
+ "order/id": { required: true, type: "string" },
54
+ "items": { type: "array", minItems: 1 },
55
+ "items/qty": { type: "number", range: { min: 1 } },
56
+ };
57
+
58
+ const result = await validator.validate(
59
+ { order: { id: "ORD-1" }, items: [{ qty: 2 }] },
60
+ schema,
61
+ );
26
62
 
27
63
  if (!result.success) {
28
64
  console.error(result.errorsList);
29
65
  }
30
66
  ```
31
67
 
32
- ## Campos disponíveis no schema
68
+ Parâmetros:
69
+ - `rawPayload`: objeto ou string JSON.
70
+ - `schema`: mapa de regras por caminho de campo.
71
+
72
+ Retorno:
73
+ - `SchemaValidationResult` com `success`, `errors` e `errorsList`.
33
74
 
34
- | Propriedade | Uso |
35
- | --- | --- |
36
- | `field` | Caminho do campo. Use `/` para navegar entre níveis (ex.: `address/city`). Arrays são percorridos automaticamente: `items/qty` valida cada `qty` dentro de `items`. |
37
- | `required` | Garante presença do campo. |
38
- | `allowNull` | Quando `false`, recusa valores `null` mesmo que o campo exista. |
39
- | `type` | Valida o tipo do conteúdo. Tipos suportados: `string`, `number`, `boolean`, `date`, `dateISO`, `object`, `array`, `email`. |
40
- | `length` | Restrições para strings (`min`, `max`). |
41
- | `range` | Faixas para números (`min`, `max`). |
42
- | `minItems` / `maxItems` | Controle de tamanho de arrays. |
43
- | `allowedValues` | Lista de valores aceitos. Combina com `ignoreCase` para strings. |
44
- | `ignoreCase` | Quando `true`, compara `allowedValues` sem diferenciar maiúsculas/minúsculas. |
45
- | `pattern` | Expressão regular aplicada ao valor (somente strings). |
46
- | `message` | Mensagem personalizada exibida quando a regra falhar. |
75
+ ### Transformação de Payload
47
76
 
48
- ## Como os caminhos são avaliados
77
+ `PayloadTransformation` utiliza JSONata para projeções e enriquecimentos de payload.
49
78
 
50
- - `customer/name` acessa propriedades aninhadas.
51
- - `contacts/type` aplica a regra a cada item da coleção `contacts`.
52
- - Valores inexistentes retornam `undefined`, permitindo diferenciar campos ausentes de campos nulos (`allowNull`).
79
+ #### Exemplo de uso
53
80
 
54
- ## Tipos especiais
81
+ ```ts
82
+ import { PayloadTransformation } from "@cargolift-cdi/lib-payload";
83
+
84
+ const expression = `{
85
+ "orderId": order.id,
86
+ "total": $sum(items.(qty * price))
87
+ }`;
55
88
 
56
- - `date`: aceita objetos `Date` ou strings `DD/MM/YYYY`, `DD-MM-YYYY` e formatos reconhecidos por `Date.parse`.
57
- - `dateISO`: exige ISO 8601 (`2025-11-05T14:48:00.000Z`).
58
- - `email`: aplica regex simples `user@domain`.
89
+ const result = await PayloadTransformation.transform(expression, {
90
+ order: { id: "ORD-10" },
91
+ items: [{ qty: 2, price: 10 }, { qty: 1, price: 5 }],
92
+ });
93
+
94
+ console.log(result.result);
95
+ ```
59
96
 
60
- ## Exemplos práticos
97
+ Parâmetros:
98
+ - `expression`: expressão JSONata.
99
+ - `payload`: entrada a ser transformada.
61
100
 
62
- ### 1. Validando um payload bruto (string JSON)
101
+ Retorno:
102
+ - `PayloadTransformationResult` com `success`, `result` e `error?`.
103
+
104
+ ### Diff para Auditoria
105
+
106
+ `PayloadDiff` compara entidade existente com payload recebido e retorna `sanitizedPayload` contendo somente alterações relevantes.
107
+
108
+ #### Exemplo de uso
63
109
 
64
110
  ```ts
65
- const rawPayload = '{"order":{"id":"ORD-9","value":0},"items":[]}';
66
-
67
- const schema: Schema = {
68
- validations: [
69
- { field: "order/id", required: true, type: "string" },
70
- { field: "order/value", type: "number", range: { min: 1 }, message: "Valor mínimo do pedido é 1" },
71
- { field: "items", type: "array", minItems: 1 },
72
- ],
73
- };
111
+ import { PayloadDiff } from "@cargolift-cdi/lib-payload";
74
112
 
75
- const validation = new PayloadValidation();
76
- const result = await validation.run(rawPayload, schema);
113
+ const entity = { name: "Cliente A", status: "active" };
114
+ const payload = { name: "Cliente A", status: "inactive" };
77
115
 
78
- /* result.errors => [
79
- { field: 'order/value', value: 0, error: 'Valor mínimo do pedido é 1' },
80
- { field: 'items', value: [], error: "Campo 'items' deve conter ao menos 1 itens" }
81
- ] */
116
+ const diff = PayloadDiff.diff(entity, payload);
117
+
118
+ if (diff.hasChanges) {
119
+ console.log(diff.sanitizedPayload); // { status: "inactive" }
120
+ console.log(diff.changes);
121
+ }
82
122
  ```
83
123
 
84
- ### 2. AllowedValues com ignoreCase e campos opcionais
124
+ Parâmetros:
125
+ - `entity`: estado atual persistido.
126
+ - `payload`: estado recebido para atualização.
127
+ - `options?`: campos ignorados e separador de path.
128
+
129
+ Retorno:
130
+ - `ResultPayloadDiff<T>` com `hasChanges`, `changes` e `sanitizedPayload`.
131
+
132
+ ---
133
+
134
+ ## 🛠 Tecnologias e Dependências
135
+
136
+ <table>
137
+ <thead>
138
+ <tr>
139
+ <th>Tecnologia</th>
140
+ <th>Versão</th>
141
+ <th>Finalidade</th>
142
+ </tr>
143
+ </thead>
144
+ <tbody>
145
+ <tr>
146
+ <td>TypeScript</td>
147
+ <td>^5.9.3</td>
148
+ <td>Implementação tipada da biblioteca</td>
149
+ </tr>
150
+ <tr>
151
+ <td>Vitest</td>
152
+ <td>^3.2.4</td>
153
+ <td>Testes unitários e validação de comportamento</td>
154
+ </tr>
155
+ <tr>
156
+ <td>JSONata</td>
157
+ <td>^2.1.0</td>
158
+ <td>Transformação declarativa de payloads</td>
159
+ </tr>
160
+ <tr>
161
+ <td>@cargolift-cdi/lib-common</td>
162
+ <td>workspace:*</td>
163
+ <td>Tipos e utilitários compartilhados</td>
164
+ </tr>
165
+ <tr>
166
+ <td>@cargolift-cdi/types</td>
167
+ <td>workspace:*</td>
168
+ <td>Tipos de domínio usados em validação/condições</td>
169
+ </tr>
170
+ </tbody>
171
+ </table>
172
+
173
+ Dependências internas:
174
+ - `@cargolift-cdi/lib-common`
175
+ - `@cargolift-cdi/types`
176
+
177
+ ---
178
+
179
+ ## 🚀 Instalação
180
+
181
+ ### Pré-requisitos
182
+
183
+ - Node.js: >= 18
184
+ - pnpm: recomendado para o monorepo
185
+
186
+ ### Passos de instalação
187
+
188
+ 1. Instalar dependências do workspace:
85
189
 
86
- ```ts
87
- const payload = {
88
- status: "APPROVED",
89
- channel: null,
90
- };
190
+ ```bash
191
+ pnpm install
192
+ ```
91
193
 
92
- const schema: Schema = {
93
- validations: [
94
- {
95
- field: "status",
96
- type: "string",
97
- allowedValues: ["pending", "approved", "rejected"],
98
- ignoreCase: true,
99
- },
100
- {
101
- field: "channel",
102
- allowNull: false,
103
- required: false,
104
- type: "string",
105
- message: "Canal precisa ser informado quando enviado",
106
- },
107
- ],
108
- };
194
+ 2. Build da biblioteca:
109
195
 
110
- const { success, errors } = await new PayloadValidation().run(payload, schema);
111
- // success === false porque allowNull=false e channel veio como null
196
+ ```bash
197
+ pnpm --filter @cargolift-cdi/lib-payload build
112
198
  ```
113
199
 
114
- ## Estrutura do resultado
200
+ 3. Rodar testes da biblioteca:
201
+
202
+ ```bash
203
+ pnpm --filter @cargolift-cdi/lib-payload test
204
+ ```
115
205
 
116
- `PayloadValidation.run()` retorna `ValidationResult`:
206
+ ### Variáveis de ambiente
207
+
208
+ Não há variáveis de ambiente obrigatórias para uso base da biblioteca.
209
+
210
+ <table>
211
+ <thead>
212
+ <tr>
213
+ <th>Variável</th>
214
+ <th>Descrição</th>
215
+ <th>Obrigatória</th>
216
+ <th>Valor padrão</th>
217
+ </tr>
218
+ </thead>
219
+ <tbody>
220
+ <tr>
221
+ <td><code>N/A</code></td>
222
+ <td>Sem configuração obrigatória por ambiente para uso padrão</td>
223
+ <td>Não</td>
224
+ <td><code>N/A</code></td>
225
+ </tr>
226
+ </tbody>
227
+ </table>
228
+
229
+ ---
230
+
231
+ ## 💡 Como Usar
232
+
233
+ ### Quickstart
117
234
 
118
235
  ```ts
119
- {
120
- success: boolean;
121
- errors: Array<{
122
- field: string;
123
- value: any; // valor que falhou
124
- error: string; // mensagem final
125
- rule?: SchemaValidation; // regra original (útil para auditorias)
126
- }>;
127
- errorsList: string[]; // mensagens simples
128
- }
236
+ import {
237
+ PayloadValidation,
238
+ PayloadTransformation,
239
+ PayloadDiff,
240
+ } from "@cargolift-cdi/lib-payload";
241
+
242
+ const validator = new PayloadValidation();
243
+ const validation = await validator.validate({ id: "1" }, { id: { required: true, type: "string" } });
244
+
245
+ const transformed = await PayloadTransformation.transform('{"id": id}', { id: "1" });
246
+
247
+ const diff = PayloadDiff.diff({ status: "A" }, { status: "I" });
248
+ ```
249
+
250
+ ### Casos de uso avançados
251
+
252
+ - **Pré-validação de payload canônico no ESB:** aplicar `PayloadValidation` antes de regras de negócio.
253
+ - **Detecção de alterações para update parcial:** usar `PayloadDiff` para evitar writes desnecessários e registrar changelog.
254
+ - **Projeções de integração entre sistemas:** usar JSONata em `PayloadTransformation` para adaptar contratos.
255
+
256
+ ---
257
+
258
+ ## 📁 Estrutura do Projeto
259
+
260
+ ```text
261
+ .
262
+ ├── src/
263
+ │ ├── index.ts
264
+ │ ├── payload-validation/
265
+ │ ├── payload-transformation/
266
+ │ ├── payload-diff/
267
+ │ ├── payload-condition/
268
+ │ ├── payload-response-interpreter/
269
+ │ ├── util/
270
+ │ └── __tests__/
271
+ ├── package.json
272
+ ├── tsconfig.json
273
+ ├── vitest.config.ts
274
+ └── README.md
129
275
  ```
130
276
 
131
- - Em caso de payload malformado (JSON inválido), o erro é registrado com `field = "_schema"` e `value` contém o conteúdo bruto.
132
- - Nenhuma exceção é propagada para regras inválidas; a execução continua e todos os erros são agregados.
277
+ - `src/payload-validation/`: validações declarativas por schema.
278
+ - `src/payload-transformation/`: transformações com JSONata.
279
+ - `src/payload-diff/`: comparação e sanitização de alterações.
280
+ - `src/payload-condition/`: avaliação de regras condicionais.
281
+ - `src/payload-response-interpreter/`: interpretação de respostas externas.
282
+ - `src/util/`: funções auxiliares reutilizáveis.
283
+
284
+ ---
133
285
 
134
- ## Tratamento do payload
286
+ ## 🧪 Testes
135
287
 
136
- - Aceita objetos JavaScript ou strings JSON.
137
- - Caso receba string, a biblioteca detecta o formato e tenta fazer `JSON.parse` (XML pode ser suportado futuramente, ver `detectType`).
138
- - Falhas de parsing disparam `BusinessError` com código `INVALID_PAYLOAD`, permitindo padronizar a resposta HTTP ou o nack de mensagens.
288
+ ### Como rodar os testes
139
289
 
140
- ## Testes
290
+ ```bash
291
+ pnpm --filter @cargolift-cdi/lib-payload test
292
+ ```
141
293
 
142
- A suíte usa Vitest e cobre cenários básicos de schema, tipos e parsing.
294
+ ### Build e smoke de tipagem
143
295
 
144
296
  ```bash
145
- npm test
297
+ pnpm --filter @cargolift-cdi/lib-payload build
298
+ pnpm --filter @cargolift-cdi/lib-payload build:smoke
146
299
  ```
147
300
 
148
- Execute os testes antes de publicar (`npm prepublishOnly`) para garantir que regressões sejam detectadas.
301
+ ---
302
+
303
+ ## 🤝 Contribuindo
304
+
305
+ Padrão de branches:
306
+ - `main`: branch principal.
307
+ - `feature/*`: novas funcionalidades.
308
+ - `bugfix/*`: correções.
309
+
310
+ Padrão de commits:
311
+ - Conventional Commits.
312
+ - Exemplos:
313
+ - `feat(payload-validation): adiciona suporte a dateISO`
314
+ - `fix(payload-diff): corrige comparação de arrays aninhados`
315
+
316
+ Processo de PR:
317
+ 1. Criar branch a partir de `main`.
318
+ 2. Implementar alteração com testes.
319
+ 3. Executar `test` e `build` da lib.
320
+ 4. Abrir PR com descrição técnica e impacto.
321
+
322
+ ---
323
+
324
+ ## 📄 Licença
325
+
326
+ Este projeto é distribuído sob a licença MIT.
@@ -1,8 +1,12 @@
1
1
  export * from "./payload-validation/payload-validation.js";
2
- export * from "./payload-validation/payload-validation.interface.js";
3
2
  export * from "./payload-response-interpreter/payload-response-interpreter.js";
4
3
  export * from "./payload-transformation/payload-transformation.js";
5
4
  export * from "./payload-condition/payload-condition.js";
5
+ export * from "./payload-diff/payload-diff.js";
6
+ export * from "./payload-diff/payload-diff.interface.js";
6
7
  export * from "./util/payload-path.util.js";
7
8
  export * from "./util/payload-comparator.util.js";
8
9
  export * from "./util/payload-pointer.util.js";
10
+ export * from "./util/payload-variable-resolver.util.js";
11
+ export * from "./util/payload-hash.util.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gEAAgE,CAAC;AAC/E,cAAc,oDAAoD,CAAC;AACnE,cAAc,0CAA0C,CAAC;AACzD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0CAA0C,CAAC;AACzD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0CAA0C,CAAC;AACzD,cAAc,6BAA6B,CAAC"}
@@ -1,9 +1,12 @@
1
1
  export * from "./payload-validation/payload-validation.js";
2
- export * from "./payload-validation/payload-validation.interface.js";
3
2
  export * from "./payload-response-interpreter/payload-response-interpreter.js";
4
3
  export * from "./payload-transformation/payload-transformation.js";
5
4
  export * from "./payload-condition/payload-condition.js";
5
+ export * from "./payload-diff/payload-diff.js";
6
+ export * from "./payload-diff/payload-diff.interface.js";
6
7
  export * from "./util/payload-path.util.js";
7
8
  export * from "./util/payload-comparator.util.js";
8
9
  export * from "./util/payload-pointer.util.js";
10
+ export * from "./util/payload-variable-resolver.util.js";
11
+ export * from "./util/payload-hash.util.js";
9
12
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gEAAgE,CAAC;AAC/E,cAAc,oDAAoD,CAAC;AACnE,cAAc,0CAA0C,CAAC;AACzD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0CAA0C,CAAC;AACzD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0CAA0C,CAAC;AACzD,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ErrorType, PayloadConditionResult, PayloadConditions } from "@cargolift-cdi/types";
2
+ export interface PayloadConditionVariables {
3
+ [key: string]: any;
4
+ }
5
+ export declare class PayloadCondition {
6
+ static evaluate(conditions: PayloadConditions, payload: any, variables?: PayloadConditionVariables, exceptionErrorType?: ErrorType): Promise<PayloadConditionResult>;
7
+ }
8
+ //# sourceMappingURL=payload-condition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-condition.d.ts","sourceRoot":"","sources":["../../src/payload-condition/payload-condition.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwD,SAAS,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGlJ,MAAM,WAAW,yBAAyB;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,gBAAgB;WACd,QAAQ,CAAC,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,GAAE,yBAA8B,EAAE,kBAAkB,GAAE,SAA8B,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAqCnM"}
@@ -1,9 +1,10 @@
1
1
  import { PayloadPath } from "../util/payload-path.util.js";
2
2
  import { PayloadComparator } from "../util/payload-comparator.util.js";
3
+ import { PayloadVariableResolver } from "../util/payload-variable-resolver.util.js";
3
4
  import { ErrorType } from "@cargolift-cdi/types";
4
5
  import { PayloadUtil } from "@cargolift-cdi/lib-common";
5
6
  export class PayloadCondition {
6
- static async evaluate(conditions, payload, exceptionErrorType = ErrorType.BUSINESS) {
7
+ static async evaluate(conditions, payload, variables = {}, exceptionErrorType = ErrorType.BUSINESS) {
7
8
  if (conditions === undefined || conditions === null) {
8
9
  return { success: false, error: "Regras de condições não fornecidas", errorType: ErrorType.NONE };
9
10
  }
@@ -27,7 +28,7 @@ export class PayloadCondition {
27
28
  if (normalizedPayload === undefined) {
28
29
  return { success: false, error: "Payload invalido para avaliacao de condicoes", errorType: exceptionErrorType };
29
30
  }
30
- const success = ConditionEvaluator.evaluate(conditions.conditions, normalizedPayload);
31
+ const success = ConditionEvaluator.evaluate(conditions.conditions, normalizedPayload, variables);
31
32
  if (success) {
32
33
  return { success: true, errorType: ErrorType.NONE };
33
34
  }
@@ -41,24 +42,26 @@ export class PayloadCondition {
41
42
  }
42
43
  }
43
44
  class ConditionEvaluator {
44
- static evaluate(condition, payload) {
45
+ static evaluate(condition, payload, variables = {}) {
45
46
  if (Array.isArray(condition)) {
46
- return condition.every((c) => this.evaluate(c, payload));
47
+ return condition.every((c) => this.evaluate(c, payload, variables));
47
48
  }
48
49
  if (this.isAll(condition)) {
49
- return condition.all.every((c) => this.evaluate(c, payload));
50
+ return condition.all.every((c) => this.evaluate(c, payload, variables));
50
51
  }
51
52
  if (this.isAny(condition)) {
52
- return condition.any.some((c) => this.evaluate(c, payload));
53
+ return condition.any.some((c) => this.evaluate(c, payload, variables));
53
54
  }
54
- return this.evaluateBase(condition, payload);
55
+ return this.evaluateBase(condition, payload, variables);
55
56
  }
56
- static evaluateBase(condition, payload) {
57
+ static evaluateBase(condition, payload, variables = {}) {
57
58
  if (!condition.left || !condition.operator) {
58
59
  return false;
59
60
  }
60
- const leftValue = PayloadPath.get(payload, condition.left);
61
- return PayloadComparator.compare(leftValue, condition.operator, condition.right);
61
+ const resolvedLeft = PayloadVariableResolver.resolve(condition.left, variables);
62
+ const resolvedRight = PayloadVariableResolver.resolve(condition.right, variables);
63
+ const leftValue = PayloadPath.get(payload, resolvedLeft);
64
+ return PayloadComparator.compare(leftValue, condition.operator, resolvedRight);
62
65
  }
63
66
  static isAll(condition) {
64
67
  return condition.all !== undefined;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-condition.js","sourceRoot":"","sources":["../../src/payload-condition/payload-condition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { DiffOptions, ResultPayloadDiff } from "./payload-diff.interface.js";
2
+ export declare class PayloadDiff {
3
+ static diff<T extends Record<string, unknown>>(entity: T | null | undefined, payload: Partial<T> | null | undefined, options?: DiffOptions): ResultPayloadDiff<T>;
4
+ }
5
+ //# sourceMappingURL=payload-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-diff.d.ts","sourceRoot":"","sources":["../../src/payload-diff/payload-diff.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAuQlF,qBAAa,WAAW;WAWR,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClD,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC5B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,EACtC,OAAO,CAAC,EAAE,WAAW,GACpB,iBAAiB,CAAC,CAAC,CAAC;CAyDxB"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=payload-diff.example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-diff.example.d.ts","sourceRoot":"","sources":["../../src/payload-diff/payload-diff.example.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=payload-diff.example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-diff.example.js","sourceRoot":"","sources":["../../src/payload-diff/payload-diff.example.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { DiffChangeLog } from "@cargolift-cdi/types";
2
+ export interface ResultPayloadDiff<T> {
3
+ success: boolean;
4
+ hasChanges: boolean;
5
+ error?: string;
6
+ sanitizedPayload: Partial<T>;
7
+ changes: DiffChangeLog[];
8
+ }
9
+ export interface DiffOptions {
10
+ ignoreFields?: string[];
11
+ pathSeparator?: string;
12
+ }
13
+ //# sourceMappingURL=payload-diff.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-diff.interface.d.ts","sourceRoot":"","sources":["../../src/payload-diff/payload-diff.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAKrD,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAElC,OAAO,EAAE,OAAO,CAAC;IAEjB,UAAU,EAAE,OAAO,CAAC;IAEpB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAE7B,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAKD,MAAM,WAAW,WAAW;IAK1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAMxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=payload-diff.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-diff.interface.js","sourceRoot":"","sources":["../../src/payload-diff/payload-diff.interface.ts"],"names":[],"mappings":""}