@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.
- package/README.md +281 -103
- package/dist/{types/index.d.ts → index.d.ts} +5 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/{esm/index.js → index.js} +4 -1
- package/dist/index.js.map +1 -0
- package/dist/payload-condition/payload-condition.d.ts +8 -0
- package/dist/payload-condition/payload-condition.d.ts.map +1 -0
- package/dist/{esm/payload-condition → payload-condition}/payload-condition.js +13 -10
- package/dist/payload-condition/payload-condition.js.map +1 -0
- package/dist/payload-diff/payload-diff.d.ts +5 -0
- package/dist/payload-diff/payload-diff.d.ts.map +1 -0
- package/dist/payload-diff/payload-diff.example.d.ts +1 -0
- package/dist/payload-diff/payload-diff.example.d.ts.map +1 -0
- package/dist/payload-diff/payload-diff.example.js +2 -0
- package/dist/payload-diff/payload-diff.example.js.map +1 -0
- package/dist/payload-diff/payload-diff.interface.d.ts +13 -0
- package/dist/payload-diff/payload-diff.interface.d.ts.map +1 -0
- package/dist/payload-diff/payload-diff.interface.js +2 -0
- package/dist/payload-diff/payload-diff.interface.js.map +1 -0
- package/dist/payload-diff/payload-diff.js +213 -0
- package/dist/payload-diff/payload-diff.js.map +1 -0
- package/dist/{types/payload-response-interpreter → payload-response-interpreter}/payload-response-interpreter.d.ts +1 -0
- package/dist/payload-response-interpreter/payload-response-interpreter.d.ts.map +1 -0
- package/dist/payload-response-interpreter/payload-response-interpreter.js.map +1 -0
- package/dist/{types/payload-transformation → payload-transformation}/payload-transformation.d.ts +1 -0
- package/dist/payload-transformation/payload-transformation.d.ts.map +1 -0
- package/dist/payload-transformation/payload-transformation.interface.d.ts +1 -0
- package/dist/payload-transformation/payload-transformation.interface.d.ts.map +1 -0
- package/dist/payload-transformation/payload-transformation.interface.js.map +1 -0
- package/dist/payload-transformation/payload-transformation.js.map +1 -0
- package/dist/{types/payload-validation → payload-validation}/payload-validation.d.ts +5 -3
- package/dist/payload-validation/payload-validation.d.ts.map +1 -0
- package/dist/{esm/payload-validation → payload-validation}/payload-validation.js +29 -4
- package/dist/payload-validation/payload-validation.js.map +1 -0
- package/dist/{types/util → util}/payload-comparator.util.d.ts +1 -0
- package/dist/util/payload-comparator.util.d.ts.map +1 -0
- package/dist/util/payload-comparator.util.js.map +1 -0
- package/dist/util/payload-hash.util.d.ts +2 -0
- package/dist/util/payload-hash.util.d.ts.map +1 -0
- package/dist/util/payload-hash.util.js +6 -0
- package/dist/util/payload-hash.util.js.map +1 -0
- package/dist/{types/util → util}/payload-path.util.d.ts +1 -0
- package/dist/util/payload-path.util.d.ts.map +1 -0
- package/dist/util/payload-path.util.js.map +1 -0
- package/dist/{types/util → util}/payload-pointer.util.d.ts +1 -0
- package/dist/util/payload-pointer.util.d.ts.map +1 -0
- package/dist/util/payload-pointer.util.js.map +1 -0
- package/dist/util/payload-variable-resolver.util.d.ts +5 -0
- package/dist/util/payload-variable-resolver.util.d.ts.map +1 -0
- package/dist/util/payload-variable-resolver.util.js +28 -0
- package/dist/util/payload-variable-resolver.util.js.map +1 -0
- package/package.json +25 -34
- package/dist/cjs/index.js +0 -25
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/package.json +0 -1
- package/dist/cjs/payload-condition/payload-condition.js +0 -74
- package/dist/cjs/payload-condition/payload-condition.js.map +0 -1
- package/dist/cjs/payload-response-interpreter/payload-response-interpreter.js +0 -83
- package/dist/cjs/payload-response-interpreter/payload-response-interpreter.js.map +0 -1
- package/dist/cjs/payload-transformation/payload-transformation.interface.js.map +0 -1
- package/dist/cjs/payload-transformation/payload-transformation.js +0 -46
- package/dist/cjs/payload-transformation/payload-transformation.js.map +0 -1
- package/dist/cjs/payload-validation/payload-validation.interface.js +0 -3
- package/dist/cjs/payload-validation/payload-validation.interface.js.map +0 -1
- package/dist/cjs/payload-validation/payload-validation.js +0 -301
- package/dist/cjs/payload-validation/payload-validation.js.map +0 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +0 -1
- package/dist/cjs/util/payload-comparator.util.js +0 -65
- package/dist/cjs/util/payload-comparator.util.js.map +0 -1
- package/dist/cjs/util/payload-path.util.js +0 -25
- package/dist/cjs/util/payload-path.util.js.map +0 -1
- package/dist/cjs/util/payload-pointer.util.js +0 -119
- package/dist/cjs/util/payload-pointer.util.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/payload-condition/payload-condition.js.map +0 -1
- package/dist/esm/payload-response-interpreter/payload-response-interpreter.js.map +0 -1
- package/dist/esm/payload-transformation/payload-transformation.interface.js +0 -2
- package/dist/esm/payload-transformation/payload-transformation.interface.js.map +0 -1
- package/dist/esm/payload-transformation/payload-transformation.js.map +0 -1
- package/dist/esm/payload-validation/payload-validation.interface.js +0 -2
- package/dist/esm/payload-validation/payload-validation.interface.js.map +0 -1
- package/dist/esm/payload-validation/payload-validation.js.map +0 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +0 -1
- package/dist/esm/util/payload-comparator.util.js.map +0 -1
- package/dist/esm/util/payload-path.util.js.map +0 -1
- package/dist/esm/util/payload-pointer.util.js.map +0 -1
- package/dist/types/payload-condition/payload-condition.d.ts +0 -4
- package/dist/types/payload-transformation/payload-transformation.interface.d.ts +0 -0
- package/dist/types/payload-validation/payload-validation.interface.d.ts +0 -33
- /package/dist/{esm/payload-response-interpreter → payload-response-interpreter}/payload-response-interpreter.js +0 -0
- /package/dist/{cjs/payload-transformation → payload-transformation}/payload-transformation.interface.js +0 -0
- /package/dist/{esm/payload-transformation → payload-transformation}/payload-transformation.js +0 -0
- /package/dist/{esm/util → util}/payload-comparator.util.js +0 -0
- /package/dist/{esm/util → util}/payload-path.util.js +0 -0
- /package/dist/{esm/util → util}/payload-pointer.util.js +0 -0
package/README.md
CHANGED
|
@@ -1,148 +1,326 @@
|
|
|
1
|
-
#
|
|
1
|
+
# lib-payload
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
Biblioteca TypeScript para tratamento, validação, transformação, comparação e interpretação de payloads JSON no ecossistema Middleware Cargolift.
|
|
6
9
|
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
77
|
+
`PayloadTransformation` utiliza JSONata para projeções e enriquecimentos de payload.
|
|
49
78
|
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
97
|
+
Parâmetros:
|
|
98
|
+
- `expression`: expressão JSONata.
|
|
99
|
+
- `payload`: entrada a ser transformada.
|
|
61
100
|
|
|
62
|
-
|
|
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
|
-
|
|
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
|
|
76
|
-
const
|
|
113
|
+
const entity = { name: "Cliente A", status: "active" };
|
|
114
|
+
const payload = { name: "Cliente A", status: "inactive" };
|
|
77
115
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
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
|
-
```
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
channel: null,
|
|
90
|
-
};
|
|
190
|
+
```bash
|
|
191
|
+
pnpm install
|
|
192
|
+
```
|
|
91
193
|
|
|
92
|
-
|
|
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
|
-
|
|
111
|
-
|
|
196
|
+
```bash
|
|
197
|
+
pnpm --filter @cargolift-cdi/lib-payload build
|
|
112
198
|
```
|
|
113
199
|
|
|
114
|
-
|
|
200
|
+
3. Rodar testes da biblioteca:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
pnpm --filter @cargolift-cdi/lib-payload test
|
|
204
|
+
```
|
|
115
205
|
|
|
116
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
-
|
|
132
|
-
-
|
|
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
|
-
##
|
|
286
|
+
## 🧪 Testes
|
|
135
287
|
|
|
136
|
-
|
|
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
|
-
|
|
290
|
+
```bash
|
|
291
|
+
pnpm --filter @cargolift-cdi/lib-payload test
|
|
292
|
+
```
|
|
141
293
|
|
|
142
|
-
|
|
294
|
+
### Build e smoke de tipagem
|
|
143
295
|
|
|
144
296
|
```bash
|
|
145
|
-
|
|
297
|
+
pnpm --filter @cargolift-cdi/lib-payload build
|
|
298
|
+
pnpm --filter @cargolift-cdi/lib-payload build:smoke
|
|
146
299
|
```
|
|
147
300
|
|
|
148
|
-
|
|
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
|
|
61
|
-
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"payload-diff.interface.js","sourceRoot":"","sources":["../../src/payload-diff/payload-diff.interface.ts"],"names":[],"mappings":""}
|