@squiz/optimization-utils 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/cloudflare/CloudflareKVHttpService.d.ts +11 -0
  2. package/dist/cloudflare/CloudflareKVHttpService.js +19 -0
  3. package/dist/cloudflare/CloudflareKVHttpService.js.map +1 -0
  4. package/dist/cloudflare/ImplCloudflareKVHttpService.d.ts +22 -0
  5. package/dist/cloudflare/ImplCloudflareKVHttpService.js +96 -0
  6. package/dist/cloudflare/ImplCloudflareKVHttpService.js.map +1 -0
  7. package/dist/config/ConfigurationLoader.d.ts +23 -0
  8. package/dist/config/ConfigurationLoader.js +99 -0
  9. package/dist/config/ConfigurationLoader.js.map +1 -0
  10. package/dist/date/DateManipulator.d.ts +6 -0
  11. package/dist/date/DateManipulator.js +21 -0
  12. package/dist/date/DateManipulator.js.map +1 -0
  13. package/dist/event/AggregateRoot.d.ts +4 -0
  14. package/dist/event/AggregateRoot.js +3 -0
  15. package/dist/event/AggregateRoot.js.map +1 -0
  16. package/dist/event/DomainEvent.d.ts +13 -0
  17. package/dist/event/DomainEvent.js +28 -0
  18. package/dist/event/DomainEvent.js.map +1 -0
  19. package/dist/event/DynamoDBEventMapper.d.ts +36 -0
  20. package/dist/event/DynamoDBEventMapper.js +55 -0
  21. package/dist/event/DynamoDBEventMapper.js.map +1 -0
  22. package/dist/event/EventHandler.d.ts +14 -0
  23. package/dist/event/EventHandler.js +43 -0
  24. package/dist/event/EventHandler.js.map +1 -0
  25. package/dist/exception/DomainException.d.ts +18 -0
  26. package/dist/exception/DomainException.js +41 -0
  27. package/dist/exception/DomainException.js.map +1 -0
  28. package/dist/httpClient/FetchHttpClient.d.ts +7 -0
  29. package/dist/httpClient/FetchHttpClient.js +86 -0
  30. package/dist/httpClient/FetchHttpClient.js.map +1 -0
  31. package/dist/httpClient/HttpClient.d.ts +25 -0
  32. package/dist/httpClient/HttpClient.js +45 -0
  33. package/dist/httpClient/HttpClient.js.map +1 -0
  34. package/dist/httpClient/HttpRequestBuilder.d.ts +22 -0
  35. package/dist/httpClient/HttpRequestBuilder.js +126 -0
  36. package/dist/httpClient/HttpRequestBuilder.js.map +1 -0
  37. package/dist/logger/Logger.d.ts +10 -0
  38. package/dist/logger/Logger.js +30 -0
  39. package/dist/logger/Logger.js.map +1 -0
  40. package/dist/logger/LoggerMessage.d.ts +27 -0
  41. package/dist/logger/LoggerMessage.js +94 -0
  42. package/dist/logger/LoggerMessage.js.map +1 -0
  43. package/dist/logger/RemoteLogger.d.ts +30 -0
  44. package/dist/logger/RemoteLogger.js +35 -0
  45. package/dist/logger/RemoteLogger.js.map +1 -0
  46. package/dist/logger/SquizRemoteLogger.d.ts +53 -0
  47. package/dist/logger/SquizRemoteLogger.js +128 -0
  48. package/dist/logger/SquizRemoteLogger.js.map +1 -0
  49. package/dist/package.d.ts +23 -0
  50. package/dist/package.js +40 -0
  51. package/dist/package.js.map +1 -0
  52. package/dist/scheduler/EventBridgeScheduler.d.ts +21 -0
  53. package/dist/scheduler/EventBridgeScheduler.js +131 -0
  54. package/dist/scheduler/EventBridgeScheduler.js.map +1 -0
  55. package/dist/scheduler/Scheduler.d.ts +21 -0
  56. package/dist/scheduler/Scheduler.js +17 -0
  57. package/dist/scheduler/Scheduler.js.map +1 -0
  58. package/dist/testing/mock.d.ts +12 -0
  59. package/dist/testing/mock.js +51 -0
  60. package/dist/testing/mock.js.map +1 -0
  61. package/dist/typesUtils/DynamoDB.d.ts +4 -0
  62. package/dist/typesUtils/DynamoDB.js +3 -0
  63. package/dist/typesUtils/DynamoDB.js.map +1 -0
  64. package/dist/typesUtils/utilities.d.ts +9 -0
  65. package/dist/typesUtils/utilities.js +3 -0
  66. package/dist/typesUtils/utilities.js.map +1 -0
  67. package/dist/validation/handleValidation.d.ts +2 -0
  68. package/dist/validation/handleValidation.js +11 -0
  69. package/dist/validation/handleValidation.js.map +1 -0
  70. package/dist/valueObject/TenantId.d.ts +10 -0
  71. package/dist/valueObject/TenantId.js +23 -0
  72. package/dist/valueObject/TenantId.js.map +1 -0
  73. package/package.json +26 -0
  74. package/src/cloudflare/CloudflareKVHttpService.ts +20 -0
  75. package/src/cloudflare/ImplCloudflareKVHttpService.ts +128 -0
  76. package/src/cloudflare/__tests__/ImplCloudflareKVHttpService.spec.ts +178 -0
  77. package/src/config/ConfigurationLoader.ts +72 -0
  78. package/src/config/__tests__/ConfigurationLoader.spec.ts +62 -0
  79. package/src/date/DateManipulator.ts +29 -0
  80. package/src/date/__tests__/DateManipulator.spec.ts +64 -0
  81. package/src/event/AggregateRoot.ts +5 -0
  82. package/src/event/DomainEvent.ts +52 -0
  83. package/src/event/DynamoDBEventMapper.ts +72 -0
  84. package/src/event/EventHandler.ts +57 -0
  85. package/src/event/__tests__/DynamoDBEventMapper.spec.ts +113 -0
  86. package/src/exception/DomainException.ts +34 -0
  87. package/src/httpClient/FetchHttpClient.ts +92 -0
  88. package/src/httpClient/HttpClient.ts +46 -0
  89. package/src/httpClient/HttpRequestBuilder.ts +120 -0
  90. package/src/httpClient/__tests__/FetchHttpClient.spec.ts +146 -0
  91. package/src/httpClient/__tests__/HttpClient.spec.ts +52 -0
  92. package/src/httpClient/__tests__/httpRequestBuilder.spec.ts +75 -0
  93. package/src/logger/Logger.ts +40 -0
  94. package/src/logger/LoggerMessage.ts +151 -0
  95. package/src/logger/RemoteLogger.ts +32 -0
  96. package/src/logger/SquizRemoteLogger.ts +157 -0
  97. package/src/logger/__tests__/LoggerMessage.spec.ts +133 -0
  98. package/src/logger/__tests__/SquizRemoteLogger.spec.ts +185 -0
  99. package/src/package.ts +23 -0
  100. package/src/scheduler/EventBridgeScheduler.ts +177 -0
  101. package/src/scheduler/Scheduler.ts +32 -0
  102. package/src/scheduler/__tests__/EventBridgeScheduler.spec.ts +310 -0
  103. package/src/testing/mock.ts +62 -0
  104. package/src/typesUtils/DynamoDB.ts +17 -0
  105. package/src/typesUtils/utilities.ts +11 -0
  106. package/src/validation/handleValidation.ts +13 -0
  107. package/src/valueObject/TenantId.ts +27 -0
  108. package/tsconfig.json +13 -0
@@ -0,0 +1,11 @@
1
+ export type CloudflareKey = string;
2
+ export type BatchValueData<T> = Array<{
3
+ key: CloudflareKey;
4
+ value: T;
5
+ }>;
6
+ export declare const MAX_BATCH_DATA_ITEMS = 10000;
7
+ export declare abstract class CloudflareKVHttpService<TSchema> {
8
+ abstract getValues(key: CloudflareKey): Promise<TSchema>;
9
+ abstract putBulk(batchData: BatchValueData<TSchema>): Promise<void>;
10
+ abstract deleteBulk(keys: Array<CloudflareKey>): Promise<void>;
11
+ }
@@ -0,0 +1,19 @@
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.CloudflareKVHttpService = exports.MAX_BATCH_DATA_ITEMS = void 0;
10
+ const inversify_1 = require("inversify");
11
+ // https://developers.cloudflare.com/api/operations/workers-kv-namespace-write-multiple-key-value-pairs
12
+ exports.MAX_BATCH_DATA_ITEMS = 10_000;
13
+ let CloudflareKVHttpService = class CloudflareKVHttpService {
14
+ };
15
+ exports.CloudflareKVHttpService = CloudflareKVHttpService;
16
+ exports.CloudflareKVHttpService = CloudflareKVHttpService = __decorate([
17
+ (0, inversify_1.injectable)()
18
+ ], CloudflareKVHttpService);
19
+ //# sourceMappingURL=CloudflareKVHttpService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareKVHttpService.js","sourceRoot":"","sources":["../../src/cloudflare/CloudflareKVHttpService.ts"],"names":[],"mappings":";;;;;;;;;AAAA,yCAAuC;AASvC,uGAAuG;AAC1F,QAAA,oBAAoB,GAAG,MAAM,CAAC;AAGpC,IAAe,uBAAuB,GAAtC,MAAe,uBAAuB;CAM5C,CAAA;AANqB,0DAAuB;kCAAvB,uBAAuB;IAD5C,IAAA,sBAAU,GAAE;GACS,uBAAuB,CAM5C"}
@@ -0,0 +1,22 @@
1
+ import { BatchValueData, CloudflareKey, CloudflareKVHttpService } from './CloudflareKVHttpService';
2
+ import { ZodType } from 'zod';
3
+ import { HttpRequestBuilderFactory } from '../httpClient/HttpRequestBuilder';
4
+ import { Logger } from '../logger/Logger';
5
+ export type CloudflareConfig = {
6
+ domain: string;
7
+ accountId: string;
8
+ namespace: string;
9
+ apiKey: string;
10
+ };
11
+ export type CloudflareConfigProvider = () => Promise<CloudflareConfig>;
12
+ export declare class ImplCloudflareKVHttpService<TSchema> implements CloudflareKVHttpService<TSchema> {
13
+ private readonly cloudflareConfigProvider;
14
+ private readonly httpRequestBuilderFactory;
15
+ private readonly logger;
16
+ private readonly schema;
17
+ constructor(cloudflareConfigProvider: CloudflareConfigProvider, httpRequestBuilderFactory: HttpRequestBuilderFactory, logger: Logger, schema: TSchema extends ZodType ? TSchema : never);
18
+ getValues(key: string): Promise<TSchema>;
19
+ putBulk(batchData: BatchValueData<TSchema>): Promise<void>;
20
+ deleteBulk(keys: Array<CloudflareKey>): Promise<void>;
21
+ private callApi;
22
+ }
@@ -0,0 +1,96 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ImplCloudflareKVHttpService = void 0;
13
+ const inversify_1 = require("inversify");
14
+ const util_1 = require("util");
15
+ const CloudflareKVHttpService_1 = require("./CloudflareKVHttpService");
16
+ const HttpRequestBuilder_1 = require("../httpClient/HttpRequestBuilder");
17
+ const Logger_1 = require("../logger/Logger");
18
+ const HttpClient_1 = require("../httpClient/HttpClient");
19
+ const LoggerMessage_1 = require("../logger/LoggerMessage");
20
+ let ImplCloudflareKVHttpService = class ImplCloudflareKVHttpService {
21
+ cloudflareConfigProvider;
22
+ httpRequestBuilderFactory;
23
+ logger;
24
+ schema;
25
+ constructor(cloudflareConfigProvider, httpRequestBuilderFactory, logger, schema) {
26
+ this.cloudflareConfigProvider = cloudflareConfigProvider;
27
+ this.httpRequestBuilderFactory = httpRequestBuilderFactory;
28
+ this.logger = logger;
29
+ this.schema = schema;
30
+ }
31
+ async getValues(key) {
32
+ const response = await this.callApi({
33
+ path: `/values/${key}`,
34
+ method: HttpClient_1.HttpMethod.GET,
35
+ handleNotFoundAsEmpty: true,
36
+ });
37
+ return this.schema.parse(typeof response === 'string' ? JSON.parse(response) : {});
38
+ }
39
+ async putBulk(batchData) {
40
+ if (!batchData.length) {
41
+ return;
42
+ }
43
+ if (batchData.length > CloudflareKVHttpService_1.MAX_BATCH_DATA_ITEMS) {
44
+ throw new Error(`The max items count has been exceeded. The max items count is ${CloudflareKVHttpService_1.MAX_BATCH_DATA_ITEMS}`);
45
+ }
46
+ await this.callApi({
47
+ method: HttpClient_1.HttpMethod.PUT,
48
+ body: batchData.map((data) => ({
49
+ ...data,
50
+ value: JSON.stringify(data.value),
51
+ })),
52
+ path: `/bulk`,
53
+ });
54
+ }
55
+ async deleteBulk(keys) {
56
+ if (!keys.length) {
57
+ return;
58
+ }
59
+ await this.callApi({
60
+ method: HttpClient_1.HttpMethod.DELETE,
61
+ body: keys,
62
+ path: `/bulk`,
63
+ });
64
+ }
65
+ async callApi({ path, body, method, handleNotFoundAsEmpty = false, }) {
66
+ const config = await this.cloudflareConfigProvider();
67
+ const baseUrl = `https://${config.domain}/client/v4/accounts/` +
68
+ `${config.accountId}/storage/kv/namespaces/` +
69
+ `${config.namespace}`;
70
+ const url = baseUrl + path;
71
+ const logMessage = (0, LoggerMessage_1.createLog)()
72
+ .attachMetadata({ path, method, url })
73
+ .create(this);
74
+ this.logger.debug(...logMessage('started calling http endpoint'));
75
+ this.logger.debug(...logMessage(`the request body: ${(0, util_1.inspect)(body, { depth: 4 })}`));
76
+ const httpBuilder = this.httpRequestBuilderFactory
77
+ .create()
78
+ .url(url)
79
+ .method(method)
80
+ .body(body)
81
+ .applicationJson()
82
+ .authorizationByBearer(config.apiKey);
83
+ handleNotFoundAsEmpty && httpBuilder.handleNotFound();
84
+ const response = await httpBuilder.sendRequest();
85
+ this.logger.debug(...logMessage('finished calling http endpoint'));
86
+ this.logger.debug(...logMessage(`returned type: ${typeof response.body}, type: returned: ${(0, util_1.inspect)(response.body, { depth: 4 })}`));
87
+ return response.body;
88
+ }
89
+ };
90
+ exports.ImplCloudflareKVHttpService = ImplCloudflareKVHttpService;
91
+ exports.ImplCloudflareKVHttpService = ImplCloudflareKVHttpService = __decorate([
92
+ (0, inversify_1.injectable)(),
93
+ __metadata("design:paramtypes", [Function, HttpRequestBuilder_1.HttpRequestBuilderFactory,
94
+ Logger_1.Logger, Object])
95
+ ], ImplCloudflareKVHttpService);
96
+ //# sourceMappingURL=ImplCloudflareKVHttpService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImplCloudflareKVHttpService.js","sourceRoot":"","sources":["../../src/cloudflare/ImplCloudflareKVHttpService.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAAuC;AACvC,+BAA+B;AAC/B,uEAKmC;AAEnC,yEAA6E;AAC7E,6CAA0C;AAC1C,yDAAsD;AACtD,2DAAoD;AAW7C,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAInB;IACA;IACA;IACA;IAJnB,YACmB,wBAAkD,EAClD,yBAAoD,EACpD,MAAc,EACd,MAAiD;QAHjD,6BAAwB,GAAxB,wBAAwB,CAA0B;QAClD,8BAAyB,GAAzB,yBAAyB,CAA2B;QACpD,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAA2C;IACjE,CAAC;IAEJ,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAClC,IAAI,EAAE,WAAW,GAAG,EAAE;YACtB,MAAM,EAAE,uBAAU,CAAC,GAAG;YACtB,qBAAqB,EAAE,IAAI;SAC5B,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CACtB,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CACzD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAkC;QAC9C,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,8CAAoB,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,iEAAiE,8CAAoB,EAAE,CACxF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC;YACjB,MAAM,EAAE,uBAAU,CAAC,GAAG;YACtB,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7B,GAAG,IAAI;gBACP,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAA0B;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC;YACjB,MAAM,EAAE,uBAAU,CAAC,MAAM;YACzB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,EACpB,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,qBAAqB,GAAG,KAAK,GAM9B;QACC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACrD,MAAM,OAAO,GACX,WAAW,MAAM,CAAC,MAAM,sBAAsB;YAC9C,GAAG,MAAM,CAAC,SAAS,yBAAyB;YAC5C,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC;QAE3B,MAAM,UAAU,GAAG,IAAA,yBAAS,GAAE;aAC3B,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;aACrC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEhB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,GAAG,UAAU,CAAC,qBAAqB,IAAA,cAAO,EAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAClE,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,CAAC,yBAAyB;aAC/C,MAAM,EAAE;aACR,GAAG,CAAC,GAAG,CAAC;aACR,MAAM,CAAC,MAAM,CAAC;aACd,IAAI,CAAC,IAAI,CAAC;aACV,eAAe,EAAE;aACjB,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAExC,qBAAqB,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;QAEtD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,GAAG,UAAU,CACX,kBAAkB,OAAO,QAAQ,CAAC,IAAI,qBAAqB,IAAA,cAAO,EAChE,QAAQ,CAAC,IAAI,EACb,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,EAAE,CACJ,CACF,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF,CAAA;AAxGY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,sBAAU,GAAE;+CAMmC,8CAAyB;QAC5C,eAAM;GANtB,2BAA2B,CAwGvC"}
@@ -0,0 +1,23 @@
1
+ import { z, ZodType } from 'zod';
2
+ import { HttpRequestBuilderFactory } from '../httpClient/HttpRequestBuilder';
3
+ export declare abstract class ConfigurationLoader<TSchema extends ZodType> {
4
+ abstract load(): Promise<z.infer<TSchema>>;
5
+ }
6
+ export declare class DotEnvConfigurationLoader<TSchema extends ZodType> implements ConfigurationLoader<TSchema> {
7
+ private readonly schema;
8
+ constructor(schema: TSchema);
9
+ load(): Promise<z.infer<TSchema>>;
10
+ }
11
+ export type LambdaLayerAppConfigConfigurationLoaderConfig = {
12
+ appConfigName: string;
13
+ env: string;
14
+ configurationName: string;
15
+ };
16
+ export declare class LambdaLayerAppConfigConfigurationLoader<TSchema extends ZodType> implements ConfigurationLoader<TSchema> {
17
+ private readonly opts;
18
+ private readonly httpRequestBuilderFactory;
19
+ private readonly schema;
20
+ constructor(opts: LambdaLayerAppConfigConfigurationLoaderConfig, httpRequestBuilderFactory: HttpRequestBuilderFactory, schema: TSchema);
21
+ load(): Promise<z.infer<TSchema>>;
22
+ private fetchFromApi;
23
+ }
@@ -0,0 +1,99 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ var __metadata = (this && this.__metadata) || function (k, v) {
32
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.LambdaLayerAppConfigConfigurationLoader = exports.DotEnvConfigurationLoader = exports.ConfigurationLoader = void 0;
36
+ const dotenv_1 = require("dotenv");
37
+ const process = __importStar(require("process"));
38
+ const path = __importStar(require("path"));
39
+ const inversify_1 = require("inversify");
40
+ const HttpRequestBuilder_1 = require("../httpClient/HttpRequestBuilder");
41
+ const HttpClient_1 = require("../httpClient/HttpClient");
42
+ class ConfigurationLoader {
43
+ }
44
+ exports.ConfigurationLoader = ConfigurationLoader;
45
+ let DotEnvConfigurationLoader = class DotEnvConfigurationLoader {
46
+ schema;
47
+ constructor(schema) {
48
+ this.schema = schema;
49
+ }
50
+ async load() {
51
+ const output = (0, dotenv_1.config)({
52
+ path: path.join(__dirname, '../../../../env/.env'),
53
+ });
54
+ if (output.error) {
55
+ throw output.error;
56
+ }
57
+ return this.schema.parse(process.env);
58
+ }
59
+ };
60
+ exports.DotEnvConfigurationLoader = DotEnvConfigurationLoader;
61
+ exports.DotEnvConfigurationLoader = DotEnvConfigurationLoader = __decorate([
62
+ (0, inversify_1.injectable)(),
63
+ __metadata("design:paramtypes", [Object])
64
+ ], DotEnvConfigurationLoader);
65
+ let LambdaLayerAppConfigConfigurationLoader = class LambdaLayerAppConfigConfigurationLoader {
66
+ opts;
67
+ httpRequestBuilderFactory;
68
+ schema;
69
+ constructor(opts, httpRequestBuilderFactory, schema) {
70
+ this.opts = opts;
71
+ this.httpRequestBuilderFactory = httpRequestBuilderFactory;
72
+ this.schema = schema;
73
+ }
74
+ async load() {
75
+ const configuration = await this.fetchFromApi();
76
+ return this.schema.parse(configuration);
77
+ }
78
+ async fetchFromApi() {
79
+ const application = this.opts.appConfigName;
80
+ const environment = this.opts.env;
81
+ const configuration = this.opts.configurationName;
82
+ // the http://localhost:2772 represents the URL to the AWS AppConfig Lambda layer
83
+ // the documentation: https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-integration-lambda-extensions.html
84
+ const url = `http://localhost:2772` +
85
+ `/applications/${application}/environments/${environment}/configurations/${configuration}`;
86
+ const response = await this.httpRequestBuilderFactory
87
+ .create()
88
+ .url(url)
89
+ .method(HttpClient_1.HttpMethod.GET)
90
+ .sendRequest();
91
+ return response.body;
92
+ }
93
+ };
94
+ exports.LambdaLayerAppConfigConfigurationLoader = LambdaLayerAppConfigConfigurationLoader;
95
+ exports.LambdaLayerAppConfigConfigurationLoader = LambdaLayerAppConfigConfigurationLoader = __decorate([
96
+ (0, inversify_1.injectable)(),
97
+ __metadata("design:paramtypes", [Object, HttpRequestBuilder_1.HttpRequestBuilderFactory, Object])
98
+ ], LambdaLayerAppConfigConfigurationLoader);
99
+ //# sourceMappingURL=ConfigurationLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigurationLoader.js","sourceRoot":"","sources":["../../src/config/ConfigurationLoader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAgC;AAChC,iDAAmC;AACnC,2CAA6B;AAC7B,yCAAuC;AAEvC,yEAA6E;AAC7E,yDAAsD;AAEtD,MAAsB,mBAAmB;CAExC;AAFD,kDAEC;AAGM,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAGP;IAA7B,YAA6B,MAAe;QAAf,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IAEhD,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,IAAA,eAAM,EAAC;YACpB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC;SACnD,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,MAAM,CAAC,KAAK,CAAC;QACrB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;CACF,CAAA;AAhBY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,sBAAU,GAAE;;GACA,yBAAyB,CAgBrC;AASM,IAAM,uCAAuC,GAA7C,MAAM,uCAAuC;IAI/B;IACA;IACA;IAHnB,YACmB,IAAmD,EACnD,yBAAoD,EACpD,MAAe;QAFf,SAAI,GAAJ,IAAI,CAA+C;QACnD,8BAAyB,GAAzB,yBAAyB,CAA2B;QACpD,WAAM,GAAN,MAAM,CAAS;IAC/B,CAAC;IAEJ,KAAK,CAAC,IAAI;QACR,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAEhD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAClD,iFAAiF;QACjF,yHAAyH;QACzH,MAAM,GAAG,GACP,uBAAuB;YACvB,iBAAiB,WAAW,iBAAiB,WAAW,mBAAmB,aAAa,EAAE,CAAC;QAE7F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,yBAAyB;aAClD,MAAM,EAAE;aACR,GAAG,CAAC,GAAG,CAAC;aACR,MAAM,CAAC,uBAAU,CAAC,GAAG,CAAC;aACtB,WAAW,EAAE,CAAC;QAEjB,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF,CAAA;AAjCY,0FAAuC;kDAAvC,uCAAuC;IADnD,IAAA,sBAAU,GAAE;6CAMmC,8CAAyB;GAL5D,uCAAuC,CAiCnD"}
@@ -0,0 +1,6 @@
1
+ export type DateManipulator = {
2
+ addDays(days: number): DateManipulator;
3
+ addMonths(months: number): DateManipulator;
4
+ valueOf(): Date;
5
+ };
6
+ export declare function DateManipulator(input: Date): DateManipulator;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DateManipulator = DateManipulator;
4
+ function DateManipulator(input) {
5
+ const addDays = (days) => {
6
+ const copiedDate = new Date(input);
7
+ copiedDate.setDate(copiedDate.getDate() + days);
8
+ return DateManipulator(copiedDate);
9
+ };
10
+ const addMonths = (months) => {
11
+ const copiedDate = new Date(input);
12
+ copiedDate.setMonth(copiedDate.getMonth() + months);
13
+ return DateManipulator(copiedDate);
14
+ };
15
+ return {
16
+ addDays,
17
+ addMonths,
18
+ valueOf: () => new Date(input),
19
+ };
20
+ }
21
+ //# sourceMappingURL=DateManipulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateManipulator.js","sourceRoot":"","sources":["../../src/date/DateManipulator.ts"],"names":[],"mappings":";;AAMA,0CAsBC;AAtBD,SAAgB,eAAe,CAAC,KAAW;IACzC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAmB,EAAE;QAChD,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;QAEhD,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,MAAc,EAAmB,EAAE;QACpD,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC;QAEpD,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,OAAO;QACL,OAAO;QACP,SAAS;QACT,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;KAC/B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { DomainEvent } from './DomainEvent';
2
+ export interface AggregateRoot {
3
+ events(): Array<DomainEvent>;
4
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=AggregateRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AggregateRoot.js","sourceRoot":"","sources":["../../src/event/AggregateRoot.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import 'reflect-metadata';
2
+ export interface DomainEvent<TData extends Record<string, unknown> = Record<string, unknown>> {
3
+ readonly eventId: string;
4
+ readonly name: string;
5
+ readonly detail: TData;
6
+ readonly time: Date;
7
+ readonly version: string;
8
+ }
9
+ export type DomainEventConstructor = new (...any: Array<any>) => DomainEvent;
10
+ export type DomainEventName = string;
11
+ export declare function getDomainEventType(name: DomainEventName): DomainEventConstructor | undefined;
12
+ export declare function getDomainMetadata(): Array<DomainEventConstructor>;
13
+ export declare function AsDomainEvent(): ClassDecorator;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDomainEventType = getDomainEventType;
4
+ exports.getDomainMetadata = getDomainMetadata;
5
+ exports.AsDomainEvent = AsDomainEvent;
6
+ require("reflect-metadata");
7
+ const DOMAIN_EVENT_SYMBOL = Symbol();
8
+ function getDomainEventType(name) {
9
+ const domainEvents = getDomainMetadata();
10
+ return domainEvents.find((d) => d.name === name);
11
+ }
12
+ function getDomainMetadata() {
13
+ return Reflect.getMetadata(DOMAIN_EVENT_SYMBOL, Object) ?? [];
14
+ }
15
+ function setDomainMetadata(domainEvent) {
16
+ const metadata = getDomainMetadata();
17
+ const isDomainEventExist = getDomainEventType(domainEvent.name);
18
+ if (isDomainEventExist) {
19
+ throw new Error(`The DomainEvent Name has been used two times: "${domainEvent.name}". Each event name should be uniq`);
20
+ }
21
+ Reflect.defineMetadata(DOMAIN_EVENT_SYMBOL, [...metadata, domainEvent], Object);
22
+ }
23
+ function AsDomainEvent() {
24
+ return (target) => {
25
+ setDomainMetadata(target);
26
+ };
27
+ }
28
+ //# sourceMappingURL=DomainEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DomainEvent.js","sourceRoot":"","sources":["../../src/event/DomainEvent.ts"],"names":[],"mappings":";;AAkBA,gDAMC;AAED,8CAEC;AAmBD,sCAIC;AAnDD,4BAA0B;AAY1B,MAAM,mBAAmB,GAAG,MAAM,EAAE,CAAC;AAMrC,SAAgB,kBAAkB,CAChC,IAAqB;IAErB,MAAM,YAAY,GAAG,iBAAiB,EAAE,CAAC;IAEzC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAmC;IAC5D,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAEhE,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,kDAAkD,WAAW,CAAC,IAAI,mCAAmC,CACtG,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,cAAc,CACpB,mBAAmB,EACnB,CAAC,GAAG,QAAQ,EAAE,WAAW,CAAC,EAC1B,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa;IAC3B,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,iBAAiB,CAAC,MAA2C,CAAC,CAAC;IACjE,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { DomainEvent } from './DomainEvent';
2
+ import { z } from 'zod';
3
+ import { MarshalledResult } from '../typesUtils/DynamoDB';
4
+ import { AttributeValue } from '@aws-sdk/client-dynamodb';
5
+ declare const EVENT_DYNAMO_DB_MODEL_SCHEMA: z.ZodObject<{
6
+ eventId: z.ZodString;
7
+ name: z.ZodString;
8
+ detail: z.ZodObject<{}, "strip", z.ZodAny, z.objectOutputType<{}, z.ZodAny, "strip">, z.objectInputType<{}, z.ZodAny, "strip">>;
9
+ time: z.ZodString;
10
+ version: z.ZodString;
11
+ ttl: z.ZodNumber;
12
+ }, "strip", z.ZodTypeAny, {
13
+ eventId: string;
14
+ name: string;
15
+ detail: {} & {
16
+ [k: string]: any;
17
+ };
18
+ time: string;
19
+ version: string;
20
+ ttl: number;
21
+ }, {
22
+ eventId: string;
23
+ name: string;
24
+ detail: {} & {
25
+ [k: string]: any;
26
+ };
27
+ time: string;
28
+ version: string;
29
+ ttl: number;
30
+ }>;
31
+ export type EventDynamoDBModel = z.infer<typeof EVENT_DYNAMO_DB_MODEL_SCHEMA>;
32
+ type EventDynamoMarshalledModel = MarshalledResult<EventDynamoDBModel>;
33
+ export declare const eventToDynamoDB: (event: DomainEvent) => EventDynamoMarshalledModel;
34
+ export declare const toEventFromDynamoDb: <TData extends DomainEvent>(dynamoItem: Record<string, AttributeValue>) => TData;
35
+ export declare const toEventFromPlain: <TData extends DomainEvent>(plainObject: Record<string, unknown>) => TData;
36
+ export {};
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toEventFromPlain = exports.toEventFromDynamoDb = exports.eventToDynamoDB = void 0;
4
+ const DomainEvent_1 = require("./DomainEvent");
5
+ const zod_1 = require("zod");
6
+ const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
7
+ const DateManipulator_1 = require("../date/DateManipulator");
8
+ const notEmptyString = zod_1.z.string().min(1);
9
+ const EVENT_DYNAMO_DB_MODEL_SCHEMA = zod_1.z.object({
10
+ eventId: notEmptyString,
11
+ name: notEmptyString,
12
+ detail: zod_1.z.object({}).catchall(zod_1.z.any()),
13
+ time: zod_1.z.string().datetime(),
14
+ version: notEmptyString,
15
+ ttl: zod_1.z.number(),
16
+ });
17
+ const eventToDynamoDB = (event) => {
18
+ const timestampPlus30Days = (0, DateManipulator_1.DateManipulator)(event.time)
19
+ .addDays(30)
20
+ .valueOf()
21
+ .getTime();
22
+ const dynamoDBModel = {
23
+ eventId: event.eventId,
24
+ name: event.name,
25
+ detail: JSON.parse(JSON.stringify(event.detail)),
26
+ time: event.time.toISOString(),
27
+ version: event.version,
28
+ ttl: timestampPlus30Days / 1000,
29
+ };
30
+ return (0, util_dynamodb_1.marshall)(dynamoDBModel, {
31
+ removeUndefinedValues: true,
32
+ });
33
+ };
34
+ exports.eventToDynamoDB = eventToDynamoDB;
35
+ const toEventFromDynamoDb = (dynamoItem) => {
36
+ const unmarshalled = (0, util_dynamodb_1.unmarshall)(dynamoItem);
37
+ return (0, exports.toEventFromPlain)(unmarshalled);
38
+ };
39
+ exports.toEventFromDynamoDb = toEventFromDynamoDb;
40
+ const toEventFromPlain = (plainObject) => {
41
+ const dynamoDBModel = EVENT_DYNAMO_DB_MODEL_SCHEMA.omit({ ttl: true }).parse(plainObject);
42
+ const eventType = (0, DomainEvent_1.getDomainEventType)(dynamoDBModel.name);
43
+ if (!eventType) {
44
+ throw new Error(`Cannot map the event "${dynamoDBModel.name}" because does not exist`);
45
+ }
46
+ return Object.assign(new eventType({}), {
47
+ eventId: dynamoDBModel.eventId,
48
+ detail: dynamoDBModel.detail,
49
+ time: new Date(dynamoDBModel.time),
50
+ version: dynamoDBModel.version,
51
+ name: dynamoDBModel.name,
52
+ });
53
+ };
54
+ exports.toEventFromPlain = toEventFromPlain;
55
+ //# sourceMappingURL=DynamoDBEventMapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoDBEventMapper.js","sourceRoot":"","sources":["../../src/event/DynamoDBEventMapper.ts"],"names":[],"mappings":";;;AAAA,+CAAgE;AAChE,6BAAwB;AAExB,0DAA8D;AAE9D,6DAA0D;AAE1D,MAAM,cAAc,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,4BAA4B,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,cAAc;IACvB,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC;IACtC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,cAAc;IACvB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAKI,MAAM,eAAe,GAAG,CAC7B,KAAkB,EACU,EAAE;IAC9B,MAAM,mBAAmB,GAAG,IAAA,iCAAe,EAAC,KAAK,CAAC,IAAI,CAAC;SACpD,OAAO,CAAC,EAAE,CAAC;SACX,OAAO,EAAE;SACT,OAAO,EAAE,CAAC;IAEb,MAAM,aAAa,GAAuB;QACxC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,EAAE,mBAAmB,GAAG,IAAI;KAChC,CAAC;IAEF,OAAO,IAAA,wBAAQ,EAAC,aAAa,EAAE;QAC7B,qBAAqB,EAAE,IAAI;KAC5B,CAA+B,CAAC;AACnC,CAAC,CAAC;AApBW,QAAA,eAAe,mBAoB1B;AAEK,MAAM,mBAAmB,GAAG,CACjC,UAA0C,EACnC,EAAE;IACT,MAAM,YAAY,GAAG,IAAA,0BAAU,EAAC,UAAU,CAAC,CAAC;IAE5C,OAAO,IAAA,wBAAgB,EAAC,YAAY,CAAC,CAAC;AACxC,CAAC,CAAC;AANW,QAAA,mBAAmB,uBAM9B;AAEK,MAAM,gBAAgB,GAAG,CAC9B,WAAoC,EAC7B,EAAE;IACT,MAAM,aAAa,GAAG,4BAA4B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAC1E,WAAW,CACZ,CAAC;IACF,MAAM,SAAS,GAAG,IAAA,gCAAkB,EAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAEzD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,yBAAyB,aAAa,CAAC,IAAI,0BAA0B,CACtE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE;QACtC,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,MAAM,EAAE,aAAa,CAAC,MAAM;QAC5B,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAClC,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,IAAI,EAAE,aAAa,CAAC,IAAI;KACzB,CAAU,CAAC;AACd,CAAC,CAAC;AArBW,QAAA,gBAAgB,oBAqB3B"}
@@ -0,0 +1,14 @@
1
+ import { DomainEvent } from './DomainEvent';
2
+ export declare abstract class EventHandler<TEvent extends DomainEvent = DomainEvent> {
3
+ abstract execute(event: TEvent): Promise<void>;
4
+ }
5
+ type Constructor = new (...args: Array<any>) => any;
6
+ type EventConstructor = Constructor;
7
+ type EventHandlerConstructor = Constructor;
8
+ type EventHandlerMetadata = Array<{
9
+ eventHandler: EventHandlerConstructor;
10
+ event: EventConstructor;
11
+ }>;
12
+ export declare function getEventHandlerMetadata(): EventHandlerMetadata;
13
+ export declare function AsEventHandler(event: EventConstructor): ClassDecorator;
14
+ export {};
@@ -0,0 +1,43 @@
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.EventHandler = void 0;
10
+ exports.getEventHandlerMetadata = getEventHandlerMetadata;
11
+ exports.AsEventHandler = AsEventHandler;
12
+ const inversify_1 = require("inversify");
13
+ let EventHandler = class EventHandler {
14
+ };
15
+ exports.EventHandler = EventHandler;
16
+ exports.EventHandler = EventHandler = __decorate([
17
+ (0, inversify_1.injectable)()
18
+ ], EventHandler);
19
+ const EVENT_HANDLER_SYMBOL = Symbol();
20
+ function getEventHandlerMetadata() {
21
+ return Reflect.getMetadata(EVENT_HANDLER_SYMBOL, Object) ?? [];
22
+ }
23
+ function setEventHandlerMetadata({ event, eventHandler, }) {
24
+ const metadata = getEventHandlerMetadata();
25
+ const handlerExists = metadata.find((m) => m.eventHandler.name === eventHandler.name);
26
+ if (handlerExists) {
27
+ throw new Error(`The EventHandler has been used two times: ${eventHandler.name}. The EventHandler has to have uniq name`);
28
+ }
29
+ const newMetadata = [
30
+ ...getEventHandlerMetadata(),
31
+ { eventHandler, event },
32
+ ];
33
+ Reflect.defineMetadata(EVENT_HANDLER_SYMBOL, newMetadata, Object);
34
+ }
35
+ function AsEventHandler(event) {
36
+ return (target) => {
37
+ setEventHandlerMetadata({
38
+ event,
39
+ eventHandler: target,
40
+ });
41
+ };
42
+ }
43
+ //# sourceMappingURL=EventHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventHandler.js","sourceRoot":"","sources":["../../src/event/EventHandler.ts"],"names":[],"mappings":";;;;;;;;;AAmBA,0DAEC;AA4BD,wCAOC;AAxDD,yCAAuC;AAIhC,IAAe,YAAY,GAA3B,MAAe,YAAY;CAEjC,CAAA;AAFqB,oCAAY;uBAAZ,YAAY;IADjC,IAAA,sBAAU,GAAE;GACS,YAAY,CAEjC;AAWD,MAAM,oBAAoB,GAAG,MAAM,EAAE,CAAC;AAEtC,SAAgB,uBAAuB;IACrC,OAAO,OAAO,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,uBAAuB,CAAC,EAC/B,KAAK,EACL,YAAY,GAIb;IACC,MAAM,QAAQ,GAAG,uBAAuB,EAAE,CAAC;IAC3C,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CACjD,CAAC;IAEF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,6CAA6C,YAAY,CAAC,IAAI,0CAA0C,CACzG,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAyB;QACxC,GAAG,uBAAuB,EAAE;QAC5B,EAAE,YAAY,EAAE,KAAK,EAAE;KACxB,CAAC;IAEF,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,cAAc,CAAC,KAAuB;IACpD,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,uBAAuB,CAAC;YACtB,KAAK;YACL,YAAY,EAAE,MAA4C;SAC3D,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare abstract class DomainException extends Error {
2
+ protected constructor(message: string);
3
+ }
4
+ export declare class ValidationException extends DomainException {
5
+ readonly message: string;
6
+ readonly details?: unknown | undefined;
7
+ constructor(message?: string, details?: unknown | undefined);
8
+ }
9
+ export declare class UnprocessableEntityException extends DomainException {
10
+ readonly message: string;
11
+ readonly details?: unknown | undefined;
12
+ constructor(message?: string, details?: unknown | undefined);
13
+ }
14
+ export declare class NotFoundException extends DomainException {
15
+ readonly message: string;
16
+ readonly details?: unknown | undefined;
17
+ constructor(message?: string, details?: unknown | undefined);
18
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotFoundException = exports.UnprocessableEntityException = exports.ValidationException = exports.DomainException = void 0;
4
+ class DomainException extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ Error.captureStackTrace(this, this.constructor);
8
+ }
9
+ }
10
+ exports.DomainException = DomainException;
11
+ class ValidationException extends DomainException {
12
+ message;
13
+ details;
14
+ constructor(message = 'Validation failed', details) {
15
+ super(message);
16
+ this.message = message;
17
+ this.details = details;
18
+ }
19
+ }
20
+ exports.ValidationException = ValidationException;
21
+ class UnprocessableEntityException extends DomainException {
22
+ message;
23
+ details;
24
+ constructor(message = 'Unprocessable entity', details) {
25
+ super(message);
26
+ this.message = message;
27
+ this.details = details;
28
+ }
29
+ }
30
+ exports.UnprocessableEntityException = UnprocessableEntityException;
31
+ class NotFoundException extends DomainException {
32
+ message;
33
+ details;
34
+ constructor(message = 'Not found', details) {
35
+ super(message);
36
+ this.message = message;
37
+ this.details = details;
38
+ }
39
+ }
40
+ exports.NotFoundException = NotFoundException;
41
+ //# sourceMappingURL=DomainException.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DomainException.js","sourceRoot":"","sources":["../../src/exception/DomainException.ts"],"names":[],"mappings":";;;AAAA,MAAsB,eAAgB,SAAQ,KAAK;IACjD,YAAsB,OAAe;QACnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACF;AAND,0CAMC;AAED,MAAa,mBAAoB,SAAQ,eAAe;IAE3C;IACA;IAFX,YACW,UAAU,mBAAmB,EAC7B,OAAiB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,YAAO,GAAP,OAAO,CAAsB;QAC7B,YAAO,GAAP,OAAO,CAAU;IAG5B,CAAC;CACF;AAPD,kDAOC;AAED,MAAa,4BAA6B,SAAQ,eAAe;IAEpD;IACA;IAFX,YACW,UAAU,sBAAsB,EAChC,OAAiB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,YAAO,GAAP,OAAO,CAAyB;QAChC,YAAO,GAAP,OAAO,CAAU;IAG5B,CAAC;CACF;AAPD,oEAOC;AAED,MAAa,iBAAkB,SAAQ,eAAe;IAEzC;IACA;IAFX,YACW,UAAU,WAAW,EACrB,OAAiB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,YAAO,GAAP,OAAO,CAAc;QACrB,YAAO,GAAP,OAAO,CAAU;IAG5B,CAAC;CACF;AAPD,8CAOC"}
@@ -0,0 +1,7 @@
1
+ import { Logger } from '../logger/Logger';
2
+ import { HttpClient, HttpRequestOptions, HttpResponse } from '../httpClient/HttpClient';
3
+ export declare class FetchHttpClient implements HttpClient {
4
+ private readonly logger;
5
+ constructor(logger: Logger);
6
+ sendRequest({ headers, url, method, body, handleHttpErrorStatusCodes, }: HttpRequestOptions): Promise<HttpResponse>;
7
+ }