@merkaly/nest 0.1.6 → 0.1.8

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 (102) hide show
  1. package/README.md +159 -0
  2. package/dist/config/env.d.ts +17 -0
  3. package/dist/config/env.d.ts.map +1 -0
  4. package/dist/config/env.js +67 -0
  5. package/dist/config/env.js.map +1 -0
  6. package/dist/config/index.d.ts +2 -0
  7. package/dist/config/index.d.ts.map +1 -0
  8. package/dist/config/index.js +18 -0
  9. package/dist/config/index.js.map +1 -0
  10. package/dist/events/index.d.ts +3 -0
  11. package/dist/events/index.d.ts.map +1 -0
  12. package/dist/events/index.js +19 -0
  13. package/dist/events/index.js.map +1 -0
  14. package/dist/events/webhook-event.d.ts +12 -0
  15. package/dist/events/webhook-event.d.ts.map +1 -0
  16. package/dist/events/webhook-event.js +11 -0
  17. package/dist/events/webhook-event.js.map +1 -0
  18. package/dist/events/webhook-patterns.d.ts +52 -0
  19. package/dist/events/webhook-patterns.d.ts.map +1 -0
  20. package/dist/events/webhook-patterns.js +49 -0
  21. package/dist/events/webhook-patterns.js.map +1 -0
  22. package/dist/filters/abstract.filter.d.ts +12 -0
  23. package/dist/filters/abstract.filter.d.ts.map +1 -0
  24. package/dist/filters/abstract.filter.js +55 -0
  25. package/dist/filters/abstract.filter.js.map +1 -0
  26. package/dist/filters/exceptions.filter.d.ts +5 -0
  27. package/dist/filters/exceptions.filter.d.ts.map +1 -0
  28. package/dist/filters/exceptions.filter.js +37 -0
  29. package/dist/filters/exceptions.filter.js.map +1 -0
  30. package/dist/filters/index.d.ts +3 -0
  31. package/dist/filters/index.d.ts.map +1 -0
  32. package/dist/filters/index.js +19 -0
  33. package/dist/filters/index.js.map +1 -0
  34. package/dist/http/body-parsers.d.ts +9 -0
  35. package/dist/http/body-parsers.d.ts.map +1 -0
  36. package/dist/http/body-parsers.js +26 -0
  37. package/dist/http/body-parsers.js.map +1 -0
  38. package/dist/http/index.d.ts +3 -0
  39. package/dist/http/index.d.ts.map +1 -0
  40. package/dist/http/index.js +19 -0
  41. package/dist/http/index.js.map +1 -0
  42. package/dist/http/request-logger.d.ts +11 -0
  43. package/dist/http/request-logger.d.ts.map +1 -0
  44. package/dist/http/request-logger.js +30 -0
  45. package/dist/http/request-logger.js.map +1 -0
  46. package/dist/index.d.ts +7 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +21 -0
  49. package/dist/index.js.map +1 -1
  50. package/dist/logger/index.d.ts +5 -0
  51. package/dist/logger/index.d.ts.map +1 -0
  52. package/dist/logger/index.js +21 -0
  53. package/dist/logger/index.js.map +1 -0
  54. package/dist/logger/logger.module.d.ts +8 -0
  55. package/dist/logger/logger.module.d.ts.map +1 -0
  56. package/dist/logger/logger.module.js +43 -0
  57. package/dist/logger/logger.module.js.map +1 -0
  58. package/dist/logger/logger.options.d.ts +22 -0
  59. package/dist/logger/logger.options.d.ts.map +1 -0
  60. package/dist/logger/logger.options.js +5 -0
  61. package/dist/logger/logger.options.js.map +1 -0
  62. package/dist/logger/logger.service.d.ts +18 -0
  63. package/dist/logger/logger.service.d.ts.map +1 -0
  64. package/dist/logger/logger.service.js +90 -0
  65. package/dist/logger/logger.service.js.map +1 -0
  66. package/dist/logger/request-context.d.ts +14 -0
  67. package/dist/logger/request-context.d.ts.map +1 -0
  68. package/dist/logger/request-context.js +38 -0
  69. package/dist/logger/request-context.js.map +1 -0
  70. package/dist/rabbit/events.publisher.d.ts +18 -0
  71. package/dist/rabbit/events.publisher.d.ts.map +1 -0
  72. package/dist/rabbit/events.publisher.js +95 -0
  73. package/dist/rabbit/events.publisher.js.map +1 -0
  74. package/dist/rabbit/index.d.ts +5 -0
  75. package/dist/rabbit/index.d.ts.map +1 -0
  76. package/dist/rabbit/index.js +21 -0
  77. package/dist/rabbit/index.js.map +1 -0
  78. package/dist/rabbit/rabbit.consumer.d.ts +12 -0
  79. package/dist/rabbit/rabbit.consumer.d.ts.map +1 -0
  80. package/dist/rabbit/rabbit.consumer.js +30 -0
  81. package/dist/rabbit/rabbit.consumer.js.map +1 -0
  82. package/dist/rabbit/rabbit.module.d.ts +8 -0
  83. package/dist/rabbit/rabbit.module.d.ts.map +1 -0
  84. package/dist/rabbit/rabbit.module.js +63 -0
  85. package/dist/rabbit/rabbit.module.js.map +1 -0
  86. package/dist/rabbit/rabbit.options.d.ts +19 -0
  87. package/dist/rabbit/rabbit.options.d.ts.map +1 -0
  88. package/dist/rabbit/rabbit.options.js +7 -0
  89. package/dist/rabbit/rabbit.options.js.map +1 -0
  90. package/dist/signature/index.d.ts +3 -0
  91. package/dist/signature/index.d.ts.map +1 -0
  92. package/dist/signature/index.js +19 -0
  93. package/dist/signature/index.js.map +1 -0
  94. package/dist/signature/signature.guard.d.ts +11 -0
  95. package/dist/signature/signature.guard.d.ts.map +1 -0
  96. package/dist/signature/signature.guard.js +23 -0
  97. package/dist/signature/signature.guard.js.map +1 -0
  98. package/dist/signature/signature.util.d.ts +9 -0
  99. package/dist/signature/signature.util.d.ts.map +1 -0
  100. package/dist/signature/signature.util.js +21 -0
  101. package/dist/signature/signature.util.js.map +1 -0
  102. package/package.json +21 -39
package/README.md ADDED
@@ -0,0 +1,159 @@
1
+ # @merkaly/nest
2
+
3
+ Pacote compartilhado dos backends NestJS da Merkaly (api, webhooks, payments). Faz duas coisas:
4
+
5
+ 1. **Fonte única de versões**: fixa `@nestjs/*`, rxjs, amqplib, class-validator, dotenv e também o tooling de desenvolvimento (ESLint, Prettier, TypeScript, typescript-eslint, Nest CLI, ts-node, `@types/node`).
6
+ 2. **Infraestrutura comum**: RabbitMQ (publisher + consumidor), contrato de eventos de webhook, logger, filtro de exceções, env e assinaturas.
7
+
8
+ Proposta e motivação: [docs/proposal.md](docs/proposal.md).
9
+
10
+ ## Regra de versões
11
+
12
+ - O app **nunca** declara pacotes que `@merkaly/nest` já fornece (veja `dependencies` no `package.json`). Eles chegam ao app pelo `shamefully-hoist`.
13
+ - Tudo o que o app importa e **não** está nesse pacote (ex.: `mongoose`, `stripe`, `express`, `@nestjs/mongoose`, `@nestjs/swagger`) é declarado no próprio app. Nunca dependa de um pacote transitivo que não esteja na lista.
14
+
15
+ ## Uso em um app
16
+
17
+ `.npmrc`
18
+
19
+ ```ini
20
+ shamefully-hoist=true
21
+ strict-peer-dependencies=false
22
+ ```
23
+
24
+ `package.json`
25
+
26
+ ```json
27
+ {
28
+ "dependencies": {
29
+ "@merkaly/nest": "^0.1.7"
30
+ }
31
+ }
32
+ ```
33
+
34
+ `eslint.config.mjs`, `.prettierrc`, `tsconfig.json` e `nest-cli.json` continuam no app (mesmo conteúdo do api).
35
+
36
+ ## API
37
+
38
+ ```ts
39
+ import {
40
+ env, loadEnv, // config
41
+ LoggerModule, LoggerService, // logger
42
+ requestLogger, requestOrigin, requestContext, bodyParsers, bodyParserReason, // uma linha por request
43
+ AbstractExceptionFilter, ExceptionsFilter, rememberError, // filtros (motivo do erro para o log)
44
+ RabbitModule, EventsPublisher, rabbitConsumerOptions, OnRabbitEvent, ackMessage, nackMessage,
45
+ WebhookEvent, WebhookPatterns, WebhookPattern, AliexpressOrderStatus, createWebhookEvent, toPattern,
46
+ SignatureGuard, safeCompare, hmacDigest, verifyHmac,
47
+ } from '@merkaly/nest';
48
+ ```
49
+
50
+ ### Módulos
51
+
52
+ ```ts
53
+ @Module({
54
+ imports: [
55
+ LoggerModule.forRoot({ service: 'webhooks.merkaly.io' }), // global
56
+ RabbitModule.forRoot({
57
+ url: env.string('RABBITMQ_URL'), // sem url: publish rejeita com 503
58
+ queue: env.string('RABBITMQ_QUEUE', 'api.merkaly.io-queue'), // <repo>-queue
59
+ routes: { [WebhookPatterns.asaas.PAYMENT_CONFIRMED]: 'payments.merkaly.io-queue' }, // opcional
60
+ timeout: env.number('RABBITMQ_PUBLISH_TIMEOUT', 5000),
61
+ required: env.isProduction, // produção não sobe sem url
62
+ }),
63
+ ],
64
+ providers: [{ provide: APP_FILTER, useClass: ExceptionsFilter }],
65
+ })
66
+ export class AppModule {}
67
+ ```
68
+
69
+ `RabbitModule.forRootAsync({ imports, inject, useFactory })` aceita a config injetada.
70
+
71
+ **Filas**: o nome é o do repositório do serviço que consome, `<repo>-queue` (ex.: `api.merkaly.io-queue`, `payments.merkaly.io-queue`). O pacote não tem fila padrão: cada app passa a sua.
72
+
73
+ **Health check**: o pacote não registra controllers. O Swagger servido em `/` responde 200 e funciona como health check.
74
+
75
+ ### Logger e requests
76
+
77
+ Todas as linhas têm as mesmas colunas, com largura fixa (`-` quando falta o valor, `…` quando passa da largura), e a mensagem começa sempre na mesma posição:
78
+
79
+ ```
80
+ LEVEL ORIGIN SCOPE KIND MESSAGE
81
+ 08:02:05 657 DEBUG api.merkaly.io - MongoService connected
82
+ 08:02:08 410 LOG admin.merkaly.io org_6sflVH0jykwUzj8z OrderService order created
83
+ 08:02:08 410 LOG admin.merkaly.io org_6sflVH0jykwUzj8z POST /admin/orders 201 15ms
84
+ 08:02:08 423 WARN 203.0.113.7 - GET /wp-login.php 404 2ms "Cannot GET /wp-login.php"
85
+ 08:02:08 439 ERROR admin.merkaly.io org_6sflVH0jykwUzj8z GET /admin/boom 500 0ms "boom"
86
+ Error: boom
87
+ at ...
88
+ ```
89
+
90
+ - **ORIGIN** (24): quem fez o request, nas linhas de request e nos logs internos emitidos durante ele: `x-merkaly-host`, senão o host do `Origin`, `cf-connecting-ip`, o primeiro `x-forwarded-for` ou o socket (`requestOrigin`). Fora de um request, o `service`.
91
+ - **SCOPE** (22): contexto de negócio definido pelo app (`requestLogger({ scope })` ou `LoggerModule({ scope })`, ex.: id da organização). Nas linhas de request é resolvido ao terminar a resposta, então pega o que os guards definiram.
92
+ - **KIND** (16): método HTTP nas linhas de request; nos logs internos, o `group` de quem loga.
93
+ - **MESSAGE**: `/path STATUS Nms "motivo"` (motivo cortado em 200, sem query, body nem headers) ou o texto. Nível: `ERROR` em 5xx com o stack embaixo, `WARN` em 4xx, `LOG` no resto.
94
+
95
+ ```ts
96
+ // main.ts
97
+ app.use(requestLogger(app)); // antes do Swagger; opcional { scope: (req) => 'stripe' }
98
+ bodyParsers(app, { raw: ['/webhook/stripe'] }); // json + urlencoded com motivo seguro ("Invalid JSON body")
99
+ SwaggerModule.setup('/', app, document);
100
+ ```
101
+
102
+ - O ORIGIN do request fica num `AsyncLocalStorage` do pacote (`requestContext`). O `requestLogger` cria o contexto e o `LoggerModule` registra um middleware que volta a entrar nele depois dos body parsers (que podem perder o contexto assíncrono), igual ao `nestjs-cls`.
103
+ - `bodyParsers(app, { raw?, rawBody? })`: `raw` mantém o body como Buffer nesses paths; `rawBody: true` preenche `req.rawBody` (igual ao `NestFactory.create(..., { rawBody: true })`, que deixa de registrar os próprios parsers).
104
+ - SCOPE com CLS, sem o pacote depender de `nestjs-cls`:
105
+
106
+ ```ts
107
+ LoggerModule.forRootAsync({
108
+ inject: [ClsService],
109
+ useFactory: (cls: ClsService) => ({ service: 'api.merkaly.io', scope: () => cls.get('identity') }),
110
+ });
111
+ ```
112
+
113
+ **Filtros**: o filtro não loga; guarda o motivo (e o stack de 5xx) em `response.locals` e o `requestLogger` imprime. `ExceptionsFilter` responde `{ statusCode, message, path, timestamp }`. Para filtros próprios, estender `AbstractExceptionFilter` (resposta padrão do Nest, sem o log duplicado do `ExceptionsHandler`) e usar `this.remember(response, motivo, trace?)` quando responder por conta própria.
114
+
115
+ ### Eventos
116
+
117
+ Envelope `WebhookEvent<T>`: `{ id, source, type, receivedAt, organization?, data }`. Padrão do nome: `<source>.<evento>` em minúsculas (`toPattern('asaas', 'PAYMENT_CONFIRMED')` = `asaas.payment_confirmed`). Os padrões conhecidos ficam em `WebhookPatterns` e são a fonte única para produtores e consumidores, iguais ao que o webhooks publica:
118
+
119
+ - Asaas: `asaas.<evento em minúsculas>` (ex.: `asaas.payment_received`).
120
+ - Stripe: tipo pontuado original (ex.: `stripe.invoice.paid`, `stripe.customer.subscription.updated`).
121
+ - Auth0: nome legível do código de log (ex.: `auth0.success_signup`, `auth0.success_login`, `auth0.user_deleted`) e `auth0.user_login` da Action.
122
+ - AliExpress: tópico do `message_type` (53 `aliexpress.dropshipper_order_status_update`, 18 `aliexpress.waybill_changed`, 15 `aliexpress.product_deleted`); status do pedido DS em `AliexpressOrderStatus`.
123
+
124
+ ```ts
125
+ await this.events.publish(
126
+ WebhookPatterns.asaas.PAYMENT_CONFIRMED,
127
+ createWebhookEvent({ id: body.id, source: 'asaas', type: body.event, data: body.payment }),
128
+ ); // resolve só com ack do broker; timeout ou falha: ServiceUnavailableException
129
+ ```
130
+
131
+ Consumidor (quando o api ou o payments passarem a consumir):
132
+
133
+ ```ts
134
+ app.connectMicroservice(rabbitConsumerOptions({ url, queue: 'api.merkaly.io-queue' }));
135
+ await app.startAllMicroservices();
136
+
137
+ @OnRabbitEvent(WebhookPatterns.asaas.PAYMENT_CONFIRMED)
138
+ handle(@Payload() event: WebhookEvent, @Ctx() context: RmqContext) {
139
+ return this.service.confirm(event).then(() => ackMessage(context));
140
+ }
141
+ ```
142
+
143
+ ### Env
144
+
145
+ `env.string`, `env.number`, `env.boolean`, `env.list`, `env.required`, `env.isProduction`. Carrega o `.env` (dotenv) no primeiro acesso. Valor obrigatório ausente ou inválido: **erro em produção**, aviso no log fora dela.
146
+
147
+ ### Assinaturas
148
+
149
+ `safeCompare` (timing-safe, vazio nunca bate), `hmacDigest`/`verifyHmac` (sha256 hex por padrão) e `SignatureGuard` abstrato (exige `NestFactory.create(AppModule, { rawBody: true })`).
150
+
151
+ ## Desenvolvimento
152
+
153
+ ```bash
154
+ pnpm install
155
+ pnpm lint
156
+ pnpm build
157
+ ```
158
+
159
+ Release: tag `vX.Y.Z` (igual à versão do `package.json`) publica no npm.
@@ -0,0 +1,17 @@
1
+ import { DotenvConfigOptions } from 'dotenv';
2
+ export declare function loadEnv(options?: DotenvConfigOptions): void;
3
+ export declare const env: {
4
+ readonly isProduction: boolean;
5
+ string: {
6
+ (name: string, fallback: string): string;
7
+ (name: string, fallback?: string): string | undefined;
8
+ };
9
+ required(name: string): string | undefined;
10
+ number: {
11
+ (name: string, fallback: number): number;
12
+ (name: string, fallback?: number): number | undefined;
13
+ };
14
+ boolean(name: string, fallback?: boolean): boolean;
15
+ list(name: string, fallback?: string[]): string[];
16
+ };
17
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAIrD,wBAAgB,OAAO,CAAC,OAAO,GAAE,mBAAwB,QAKxD;AAoBD,eAAO,MAAM,GAAG;;YAK0D;QACtE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;QACzC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACvD;mBAEc,MAAM,GAAG,MAAM,GAAG,SAAS;YAiBpC;QACJ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;QACzC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACvD;kBAEa,MAAM,uBAAqB,OAAO;eAYrC,MAAM,aAAY,MAAM,EAAE,GAAQ,MAAM,EAAE;CAUtD,CAAC"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.env = void 0;
4
+ exports.loadEnv = loadEnv;
5
+ const common_1 = require("@nestjs/common");
6
+ const dotenv_1 = require("dotenv");
7
+ let loaded = false;
8
+ function loadEnv(options = {}) {
9
+ if (loaded)
10
+ return;
11
+ (0, dotenv_1.config)({ quiet: true, ...options });
12
+ loaded = true;
13
+ }
14
+ const isProduction = () => process.env.NODE_ENV === 'production';
15
+ function raw(name) {
16
+ loadEnv();
17
+ const value = process.env[name];
18
+ return value === undefined || value.trim() === '' ? undefined : value;
19
+ }
20
+ function invalid(name, reason) {
21
+ const message = `Env ${name}: ${reason}`;
22
+ if (isProduction())
23
+ throw new Error(message);
24
+ common_1.Logger.warn(message, 'Env');
25
+ }
26
+ exports.env = {
27
+ get isProduction() {
28
+ return isProduction();
29
+ },
30
+ string: ((name, fallback) => raw(name) ?? fallback),
31
+ required(name) {
32
+ const value = raw(name);
33
+ if (value === undefined)
34
+ invalid(name, 'is required');
35
+ return value;
36
+ },
37
+ number: ((name, fallback) => {
38
+ const value = raw(name);
39
+ if (value === undefined)
40
+ return fallback;
41
+ if (Number.isFinite(Number(value)))
42
+ return Number(value);
43
+ invalid(name, `"${value}" is not a number`);
44
+ return fallback;
45
+ }),
46
+ boolean(name, fallback = false) {
47
+ const value = raw(name)?.toLowerCase();
48
+ if (value === undefined)
49
+ return fallback;
50
+ if (['true', '1', 'yes'].includes(value))
51
+ return true;
52
+ if (['false', '0', 'no'].includes(value))
53
+ return false;
54
+ invalid(name, `"${value}" is not a boolean`);
55
+ return fallback;
56
+ },
57
+ list(name, fallback = []) {
58
+ const value = raw(name);
59
+ return value === undefined
60
+ ? fallback
61
+ : value
62
+ .split(',')
63
+ .map((item) => item.trim())
64
+ .filter(Boolean);
65
+ },
66
+ };
67
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './env';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC"}
@@ -0,0 +1,18 @@
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("./env"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB"}
@@ -0,0 +1,3 @@
1
+ export * from './webhook-event';
2
+ export * from './webhook-patterns';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,19 @@
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("./webhook-event"), exports);
18
+ __exportStar(require("./webhook-patterns"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,qDAAmC"}
@@ -0,0 +1,12 @@
1
+ export type WebhookSource = 'asaas' | 'stripe' | 'auth0' | 'aliexpress';
2
+ export interface WebhookEvent<T = unknown> {
3
+ id: string;
4
+ source: WebhookSource;
5
+ type: string;
6
+ receivedAt: string;
7
+ organization?: string;
8
+ data: T;
9
+ }
10
+ export declare function toPattern(source: WebhookSource, event: string): string;
11
+ export declare function createWebhookEvent<T>(event: Omit<WebhookEvent<T>, 'receivedAt'>): WebhookEvent<T>;
12
+ //# sourceMappingURL=webhook-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-event.d.ts","sourceRoot":"","sources":["../../src/events/webhook-event.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;AAExE,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC;CACT;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,UAE7D;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAEjG"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toPattern = toPattern;
4
+ exports.createWebhookEvent = createWebhookEvent;
5
+ function toPattern(source, event) {
6
+ return `${source}.${event.toLowerCase()}`;
7
+ }
8
+ function createWebhookEvent(event) {
9
+ return { ...event, receivedAt: new Date().toISOString() };
10
+ }
11
+ //# sourceMappingURL=webhook-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-event.js","sourceRoot":"","sources":["../../src/events/webhook-event.ts"],"names":[],"mappings":";;AAWA,8BAEC;AAED,gDAEC;AAND,SAAgB,SAAS,CAAC,MAAqB,EAAE,KAAa;IAC5D,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;AAC5C,CAAC;AAED,SAAgB,kBAAkB,CAAI,KAA0C;IAC9E,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,52 @@
1
+ export declare const WebhookPatterns: {
2
+ readonly asaas: {
3
+ readonly PAYMENT_CREATED: "asaas.payment_created";
4
+ readonly PAYMENT_AUTHORIZED: "asaas.payment_authorized";
5
+ readonly PAYMENT_UPDATED: "asaas.payment_updated";
6
+ readonly PAYMENT_CONFIRMED: "asaas.payment_confirmed";
7
+ readonly PAYMENT_RECEIVED: "asaas.payment_received";
8
+ readonly PAYMENT_OVERDUE: "asaas.payment_overdue";
9
+ readonly PAYMENT_DELETED: "asaas.payment_deleted";
10
+ readonly PAYMENT_REFUNDED: "asaas.payment_refunded";
11
+ readonly PAYMENT_PARTIALLY_REFUNDED: "asaas.payment_partially_refunded";
12
+ readonly PAYMENT_CHARGEBACK_REQUESTED: "asaas.payment_chargeback_requested";
13
+ readonly PAYMENT_CHARGEBACK_DISPUTE: "asaas.payment_chargeback_dispute";
14
+ readonly ACCOUNT_APPROVED: "asaas.account_status_general_approval_approved";
15
+ readonly ACCOUNT_REJECTED: "asaas.account_status_general_approval_rejected";
16
+ };
17
+ readonly stripe: {
18
+ readonly SUBSCRIPTION_CREATED: "stripe.customer.subscription.created";
19
+ readonly SUBSCRIPTION_UPDATED: "stripe.customer.subscription.updated";
20
+ readonly SUBSCRIPTION_DELETED: "stripe.customer.subscription.deleted";
21
+ readonly INVOICE_PAID: "stripe.invoice.paid";
22
+ readonly INVOICE_PAYMENT_FAILED: "stripe.invoice.payment_failed";
23
+ };
24
+ readonly auth0: {
25
+ readonly SUCCESS_SIGNUP: "auth0.success_signup";
26
+ readonly SUCCESS_LOGIN: "auth0.success_login";
27
+ readonly FAILED_LOGIN: "auth0.failed_login";
28
+ readonly USER_DELETED: "auth0.user_deleted";
29
+ readonly BLOCKED_ACCOUNT: "auth0.blocked_account";
30
+ readonly USER_LOGIN: "auth0.user_login";
31
+ };
32
+ readonly aliexpress: {
33
+ readonly DS_ORDER_STATUS_UPDATE: "aliexpress.dropshipper_order_status_update";
34
+ readonly WAYBILL_CHANGED: "aliexpress.waybill_changed";
35
+ readonly PRODUCT_DELETED: "aliexpress.product_deleted";
36
+ };
37
+ };
38
+ export declare const AliexpressOrderStatus: {
39
+ readonly CREATED: "OrderCreated";
40
+ readonly PAYMENT_AUTHORIZED: "PaymentAuthorized";
41
+ readonly PAYMENT_FAILED: "paymentFailedEvent";
42
+ readonly SHIPPED: "OrderShipped";
43
+ readonly CONFIRMED: "OrderConfirmed";
44
+ readonly CLOSED: "OrderClosed";
45
+ };
46
+ type Values<T> = T[keyof T];
47
+ export type WebhookPattern = Values<{
48
+ [S in keyof typeof WebhookPatterns]: Values<(typeof WebhookPatterns)[S]>;
49
+ }>;
50
+ export type AliexpressOrderStatus = Values<typeof AliexpressOrderStatus>;
51
+ export {};
52
+ //# sourceMappingURL=webhook-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-patterns.d.ts","sourceRoot":"","sources":["../../src/events/webhook-patterns.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoClB,CAAC;AAEX,eAAO,MAAM,qBAAqB;;;;;;;CAOxB,CAAC;AAEX,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5B,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;KACjC,CAAC,IAAI,MAAM,OAAO,eAAe,GAAG,MAAM,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;CACzE,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AliexpressOrderStatus = exports.WebhookPatterns = void 0;
4
+ exports.WebhookPatterns = {
5
+ asaas: {
6
+ PAYMENT_CREATED: 'asaas.payment_created',
7
+ PAYMENT_AUTHORIZED: 'asaas.payment_authorized',
8
+ PAYMENT_UPDATED: 'asaas.payment_updated',
9
+ PAYMENT_CONFIRMED: 'asaas.payment_confirmed',
10
+ PAYMENT_RECEIVED: 'asaas.payment_received',
11
+ PAYMENT_OVERDUE: 'asaas.payment_overdue',
12
+ PAYMENT_DELETED: 'asaas.payment_deleted',
13
+ PAYMENT_REFUNDED: 'asaas.payment_refunded',
14
+ PAYMENT_PARTIALLY_REFUNDED: 'asaas.payment_partially_refunded',
15
+ PAYMENT_CHARGEBACK_REQUESTED: 'asaas.payment_chargeback_requested',
16
+ PAYMENT_CHARGEBACK_DISPUTE: 'asaas.payment_chargeback_dispute',
17
+ ACCOUNT_APPROVED: 'asaas.account_status_general_approval_approved',
18
+ ACCOUNT_REJECTED: 'asaas.account_status_general_approval_rejected',
19
+ },
20
+ stripe: {
21
+ SUBSCRIPTION_CREATED: 'stripe.customer.subscription.created',
22
+ SUBSCRIPTION_UPDATED: 'stripe.customer.subscription.updated',
23
+ SUBSCRIPTION_DELETED: 'stripe.customer.subscription.deleted',
24
+ INVOICE_PAID: 'stripe.invoice.paid',
25
+ INVOICE_PAYMENT_FAILED: 'stripe.invoice.payment_failed',
26
+ },
27
+ auth0: {
28
+ SUCCESS_SIGNUP: 'auth0.success_signup',
29
+ SUCCESS_LOGIN: 'auth0.success_login',
30
+ FAILED_LOGIN: 'auth0.failed_login',
31
+ USER_DELETED: 'auth0.user_deleted',
32
+ BLOCKED_ACCOUNT: 'auth0.blocked_account',
33
+ USER_LOGIN: 'auth0.user_login',
34
+ },
35
+ aliexpress: {
36
+ DS_ORDER_STATUS_UPDATE: 'aliexpress.dropshipper_order_status_update',
37
+ WAYBILL_CHANGED: 'aliexpress.waybill_changed',
38
+ PRODUCT_DELETED: 'aliexpress.product_deleted',
39
+ },
40
+ };
41
+ exports.AliexpressOrderStatus = {
42
+ CREATED: 'OrderCreated',
43
+ PAYMENT_AUTHORIZED: 'PaymentAuthorized',
44
+ PAYMENT_FAILED: 'paymentFailedEvent',
45
+ SHIPPED: 'OrderShipped',
46
+ CONFIRMED: 'OrderConfirmed',
47
+ CLOSED: 'OrderClosed',
48
+ };
49
+ //# sourceMappingURL=webhook-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-patterns.js","sourceRoot":"","sources":["../../src/events/webhook-patterns.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG;IAC7B,KAAK,EAAE;QACL,eAAe,EAAE,uBAAuB;QACxC,kBAAkB,EAAE,0BAA0B;QAC9C,eAAe,EAAE,uBAAuB;QACxC,iBAAiB,EAAE,yBAAyB;QAC5C,gBAAgB,EAAE,wBAAwB;QAC1C,eAAe,EAAE,uBAAuB;QACxC,eAAe,EAAE,uBAAuB;QACxC,gBAAgB,EAAE,wBAAwB;QAC1C,0BAA0B,EAAE,kCAAkC;QAC9D,4BAA4B,EAAE,oCAAoC;QAClE,0BAA0B,EAAE,kCAAkC;QAC9D,gBAAgB,EAAE,gDAAgD;QAClE,gBAAgB,EAAE,gDAAgD;KACnE;IACD,MAAM,EAAE;QACN,oBAAoB,EAAE,sCAAsC;QAC5D,oBAAoB,EAAE,sCAAsC;QAC5D,oBAAoB,EAAE,sCAAsC;QAC5D,YAAY,EAAE,qBAAqB;QACnC,sBAAsB,EAAE,+BAA+B;KACxD;IACD,KAAK,EAAE;QACL,cAAc,EAAE,sBAAsB;QACtC,aAAa,EAAE,qBAAqB;QACpC,YAAY,EAAE,oBAAoB;QAClC,YAAY,EAAE,oBAAoB;QAClC,eAAe,EAAE,uBAAuB;QACxC,UAAU,EAAE,kBAAkB;KAC/B;IACD,UAAU,EAAE;QACV,sBAAsB,EAAE,4CAA4C;QACpE,eAAe,EAAE,4BAA4B;QAC7C,eAAe,EAAE,4BAA4B;KAC9C;CACO,CAAC;AAEE,QAAA,qBAAqB,GAAG;IACnC,OAAO,EAAE,cAAc;IACvB,kBAAkB,EAAE,mBAAmB;IACvC,cAAc,EAAE,oBAAoB;IACpC,OAAO,EAAE,cAAc;IACvB,SAAS,EAAE,gBAAgB;IAC3B,MAAM,EAAE,aAAa;CACb,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { BaseExceptionFilter } from '@nestjs/core';
2
+ import type { ArgumentsHost, HttpServer } from '@nestjs/common';
3
+ import type { Response } from 'express';
4
+ export declare const exceptionStatus: (exception: unknown) => number;
5
+ export declare const exceptionReason: (exception: unknown) => string;
6
+ export declare function rememberError(response: Response, error: string, trace?: unknown): void;
7
+ export declare abstract class AbstractExceptionFilter<T = unknown> extends BaseExceptionFilter<T> {
8
+ protected remember(response: Response, error: string, trace?: unknown): void;
9
+ catch(exception: T, host: ArgumentsHost): void;
10
+ handleUnknownError(exception: T, host: ArgumentsHost, applicationRef: HttpServer): any;
11
+ }
12
+ //# sourceMappingURL=abstract.filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract.filter.d.ts","sourceRoot":"","sources":["../../src/filters/abstract.filter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOxC,eAAO,MAAM,eAAe,GAAI,WAAW,OAAO,KAAG,MAKpD,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,WAAW,OAAO,KAAG,MAWpD,CAAC;AAGF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,QAI/E;AAGD,8BAAsB,uBAAuB,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,mBAAmB,CAAC,CAAC,CAAC;IACvF,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAI9D,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa;IAavC,kBAAkB,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU;CAWxF"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractExceptionFilter = exports.exceptionReason = exports.exceptionStatus = void 0;
4
+ exports.rememberError = rememberError;
5
+ const common_1 = require("@nestjs/common");
6
+ const core_1 = require("@nestjs/core");
7
+ const isHttpError = (error) => !!error?.statusCode && !!error?.message;
8
+ const exceptionStatus = (exception) => {
9
+ if (exception instanceof common_1.HttpException)
10
+ return exception.getStatus();
11
+ if (isHttpError(exception))
12
+ return exception.statusCode;
13
+ return common_1.HttpStatus.INTERNAL_SERVER_ERROR;
14
+ };
15
+ exports.exceptionStatus = exceptionStatus;
16
+ const exceptionReason = (exception) => {
17
+ const body = exception instanceof common_1.HttpException ? exception.getResponse() : undefined;
18
+ const message = typeof body === 'object' ? body?.message : body;
19
+ const text = Array.isArray(message)
20
+ ? message.join('; ')
21
+ : typeof message === 'string'
22
+ ? message
23
+ : '';
24
+ const reason = text || exception?.message || 'Unknown error';
25
+ return reason.replace(/\?\S*/g, '');
26
+ };
27
+ exports.exceptionReason = exceptionReason;
28
+ function rememberError(response, error, trace) {
29
+ const locals = response.locals;
30
+ Object.assign(locals, { error: locals.error ?? error, trace });
31
+ }
32
+ class AbstractExceptionFilter extends core_1.BaseExceptionFilter {
33
+ remember(response, error, trace) {
34
+ rememberError(response, error, trace);
35
+ }
36
+ catch(exception, host) {
37
+ if (host.getType() === 'http') {
38
+ const status = (0, exports.exceptionStatus)(exception);
39
+ const trace = status >= 500 && !(exception instanceof common_1.IntrinsicException) ? exception : undefined;
40
+ this.remember(host.switchToHttp().getResponse(), (0, exports.exceptionReason)(exception), trace);
41
+ }
42
+ return super.catch(exception, host);
43
+ }
44
+ handleUnknownError(exception, host, applicationRef) {
45
+ const body = isHttpError(exception)
46
+ ? { statusCode: exception.statusCode, message: exception.message }
47
+ : { statusCode: common_1.HttpStatus.INTERNAL_SERVER_ERROR, message: 'Internal server error' };
48
+ const response = host.getArgByIndex(1);
49
+ if (applicationRef.isHeadersSent(response))
50
+ return applicationRef.end(response);
51
+ return applicationRef.reply(response, body, body.statusCode);
52
+ }
53
+ }
54
+ exports.AbstractExceptionFilter = AbstractExceptionFilter;
55
+ //# sourceMappingURL=abstract.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract.filter.js","sourceRoot":"","sources":["../../src/filters/abstract.filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
2
+ export declare class ExceptionsFilter implements ExceptionFilter {
3
+ catch(exception: unknown, host: ArgumentsHost): void;
4
+ }
5
+ //# sourceMappingURL=exceptions.filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exceptions.filter.d.ts","sourceRoot":"","sources":["../../src/filters/exceptions.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,eAAe,EAGhB,MAAM,gBAAgB,CAAC;AAKxB,qBACa,gBAAiB,YAAW,eAAe;IACtD,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa;CAuB9C"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ExceptionsFilter = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const abstract_filter_1 = require("./abstract.filter");
12
+ let ExceptionsFilter = class ExceptionsFilter {
13
+ catch(exception, host) {
14
+ if (host.getType() !== 'http')
15
+ throw exception;
16
+ const http = host.switchToHttp();
17
+ const request = http.getRequest();
18
+ const response = http.getResponse();
19
+ const statusCode = (0, abstract_filter_1.exceptionStatus)(exception);
20
+ const isHttp = exception instanceof common_1.HttpException;
21
+ const body = isHttp ? exception.getResponse() : 'Internal server error';
22
+ const message = typeof body === 'string' ? body : body.message;
23
+ const trace = statusCode >= 500 && !(exception instanceof common_1.IntrinsicException) ? exception : undefined;
24
+ (0, abstract_filter_1.rememberError)(response, (0, abstract_filter_1.exceptionReason)(exception), trace);
25
+ response.status(statusCode).json({
26
+ statusCode,
27
+ message,
28
+ path: request.url,
29
+ timestamp: new Date().toISOString(),
30
+ });
31
+ }
32
+ };
33
+ exports.ExceptionsFilter = ExceptionsFilter;
34
+ exports.ExceptionsFilter = ExceptionsFilter = __decorate([
35
+ (0, common_1.Catch)()
36
+ ], ExceptionsFilter);
37
+ //# sourceMappingURL=exceptions.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exceptions.filter.js","sourceRoot":"","sources":["../../src/filters/exceptions.filter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAMwB;AACxB,uDAAoF;AAK7E,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,KAAK,CAAC,SAAkB,EAAE,IAAmB;QAC3C,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM;YAAE,MAAM,SAAS,CAAC;QAE/C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAW,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAY,CAAC;QAE9C,MAAM,UAAU,GAAG,IAAA,iCAAe,EAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,SAAS,YAAY,sBAAa,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,uBAAuB,CAAC;QACxE,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,IAA8B,CAAC,OAAO,CAAC;QAC1F,MAAM,KAAK,GACT,UAAU,IAAI,GAAG,IAAI,CAAC,CAAC,SAAS,YAAY,2BAAkB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1F,IAAA,+BAAa,EAAC,QAAQ,EAAE,IAAA,iCAAe,EAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QAE3D,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC/B,UAAU;YACV,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,GAAG;YACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAxBY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,cAAK,GAAE;GACK,gBAAgB,CAwB5B"}
@@ -0,0 +1,3 @@
1
+ export * from './abstract.filter';
2
+ export * from './exceptions.filter';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,19 @@
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("./abstract.filter"), exports);
18
+ __exportStar(require("./exceptions.filter"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,sDAAoC"}