wsp-ms-core 1.0.0 → 1.0.2
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/dist/index.cjs +639 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +265 -0
- package/dist/index.d.ts +265 -0
- package/dist/index.js +598 -0
- package/dist/index.js.map +1 -0
- package/package.json +4 -22
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/index.ts
|
|
20
|
+
var src_exports = {};
|
|
21
|
+
__export(src_exports, {
|
|
22
|
+
Currency: () => Currency,
|
|
23
|
+
DateTime: () => DateTime,
|
|
24
|
+
DomainEntity: () => DomainEntity,
|
|
25
|
+
DomainError: () => DomainError,
|
|
26
|
+
DomainEvent: () => DomainEvent,
|
|
27
|
+
Email: () => Email,
|
|
28
|
+
ErrorManager: () => ErrorManager,
|
|
29
|
+
FatalError: () => FatalError,
|
|
30
|
+
InternalError: () => InternalError,
|
|
31
|
+
Language: () => Language,
|
|
32
|
+
MysqlConnection: () => MysqlConnection,
|
|
33
|
+
MysqlConnector: () => MysqlConnector,
|
|
34
|
+
Price: () => Price,
|
|
35
|
+
UUID: () => UUID,
|
|
36
|
+
UsageError: () => UsageError,
|
|
37
|
+
ValueObject: () => ValueObject
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(src_exports);
|
|
40
|
+
|
|
41
|
+
// src/domain/value-objects/DateTime.ts
|
|
42
|
+
var import_luxon = require("luxon");
|
|
43
|
+
|
|
44
|
+
// src/domain/contracts/ValueObject.ts
|
|
45
|
+
var ValueObject = class {
|
|
46
|
+
constructor(value) {
|
|
47
|
+
this.validate(value);
|
|
48
|
+
this._value = Object.freeze(value);
|
|
49
|
+
}
|
|
50
|
+
get value() {
|
|
51
|
+
return this._value;
|
|
52
|
+
}
|
|
53
|
+
toString() {
|
|
54
|
+
return String(this._value);
|
|
55
|
+
}
|
|
56
|
+
equals(vo) {
|
|
57
|
+
if (vo === null || vo === void 0)
|
|
58
|
+
return false;
|
|
59
|
+
if (vo.constructor !== this.constructor)
|
|
60
|
+
return false;
|
|
61
|
+
return vo.value === this._value;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// src/domain/value-objects/DateTime.ts
|
|
66
|
+
var _DateTime = class _DateTime extends ValueObject {
|
|
67
|
+
constructor(value) {
|
|
68
|
+
super(value);
|
|
69
|
+
this._dt = import_luxon.DateTime.fromFormat(value, _DateTime.DEFAULT_FORMAT, { zone: "utc" });
|
|
70
|
+
}
|
|
71
|
+
static fromLuxon(dt) {
|
|
72
|
+
return new _DateTime(_DateTime.toUtcFormat(dt));
|
|
73
|
+
}
|
|
74
|
+
static toUtcFormat(dt) {
|
|
75
|
+
return dt.setZone("utc").toFormat(_DateTime.DEFAULT_FORMAT);
|
|
76
|
+
}
|
|
77
|
+
validate(value) {
|
|
78
|
+
const q = import_luxon.DateTime.fromFormat(value, _DateTime.DEFAULT_FORMAT, { zone: "utc" });
|
|
79
|
+
if (!q.isValid) {
|
|
80
|
+
throw new Error(`Invalid DateTime: ${q.invalidExplanation}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
plusYears(years) {
|
|
84
|
+
return _DateTime.fromLuxon(this._dt.plus({ years }));
|
|
85
|
+
}
|
|
86
|
+
plusMonths(months) {
|
|
87
|
+
return _DateTime.fromLuxon(this._dt.plus({ months }));
|
|
88
|
+
}
|
|
89
|
+
plusDays(days) {
|
|
90
|
+
return _DateTime.fromLuxon(this._dt.plus({ days }));
|
|
91
|
+
}
|
|
92
|
+
plusHours(hours) {
|
|
93
|
+
return _DateTime.fromLuxon(this._dt.plus({ hours }));
|
|
94
|
+
}
|
|
95
|
+
plusMinutes(minutes) {
|
|
96
|
+
return _DateTime.fromLuxon(this._dt.plus({ minutes }));
|
|
97
|
+
}
|
|
98
|
+
plusSeconds(seconds) {
|
|
99
|
+
return _DateTime.fromLuxon(this._dt.plus({ seconds }));
|
|
100
|
+
}
|
|
101
|
+
minusYears(years) {
|
|
102
|
+
return _DateTime.fromLuxon(this._dt.minus({ years }));
|
|
103
|
+
}
|
|
104
|
+
minusMonths(months) {
|
|
105
|
+
return _DateTime.fromLuxon(this._dt.minus({ months }));
|
|
106
|
+
}
|
|
107
|
+
minusDays(days) {
|
|
108
|
+
return _DateTime.fromLuxon(this._dt.minus({ days }));
|
|
109
|
+
}
|
|
110
|
+
minusHours(hours) {
|
|
111
|
+
return _DateTime.fromLuxon(this._dt.minus({ hours }));
|
|
112
|
+
}
|
|
113
|
+
minusMinutes(minutes) {
|
|
114
|
+
return _DateTime.fromLuxon(this._dt.minus({ minutes }));
|
|
115
|
+
}
|
|
116
|
+
minusSeconds(seconds) {
|
|
117
|
+
return _DateTime.fromLuxon(this._dt.minus({ seconds }));
|
|
118
|
+
}
|
|
119
|
+
get year() {
|
|
120
|
+
return this._dt.year;
|
|
121
|
+
}
|
|
122
|
+
get month() {
|
|
123
|
+
return this._dt.month;
|
|
124
|
+
}
|
|
125
|
+
get day() {
|
|
126
|
+
return this._dt.day;
|
|
127
|
+
}
|
|
128
|
+
get hour() {
|
|
129
|
+
return this._dt.hour;
|
|
130
|
+
}
|
|
131
|
+
get minute() {
|
|
132
|
+
return this._dt.minute;
|
|
133
|
+
}
|
|
134
|
+
get second() {
|
|
135
|
+
return this._dt.second;
|
|
136
|
+
}
|
|
137
|
+
getMonthName(locale = "en") {
|
|
138
|
+
return this._dt.setLocale(locale).toFormat("LLLL");
|
|
139
|
+
}
|
|
140
|
+
getWeekdayName(locale = "en") {
|
|
141
|
+
return this._dt.setLocale(locale).toFormat("cccc");
|
|
142
|
+
}
|
|
143
|
+
static create(input) {
|
|
144
|
+
if (input === void 0) {
|
|
145
|
+
return new _DateTime(_DateTime.toUtcFormat(import_luxon.DateTime.now()));
|
|
146
|
+
}
|
|
147
|
+
if (typeof input === "number") {
|
|
148
|
+
return new _DateTime(
|
|
149
|
+
_DateTime.toUtcFormat(import_luxon.DateTime.fromMillis(input, { zone: "utc" }))
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
const iso = import_luxon.DateTime.fromISO(input, { zone: "utc" });
|
|
153
|
+
if (iso.isValid) {
|
|
154
|
+
return new _DateTime(_DateTime.toUtcFormat(iso));
|
|
155
|
+
}
|
|
156
|
+
return new _DateTime(input);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
_DateTime.DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
|
160
|
+
var DateTime = _DateTime;
|
|
161
|
+
|
|
162
|
+
// src/domain/contracts/DomainEntity.ts
|
|
163
|
+
var DomainEntity = class {
|
|
164
|
+
constructor(uuid, props, audit) {
|
|
165
|
+
this.uuid = uuid;
|
|
166
|
+
this.props = props;
|
|
167
|
+
this._createdAt = audit?.createdAt ?? DateTime.create();
|
|
168
|
+
this._updatedAt = audit?.updatedAt ?? this.createdAt;
|
|
169
|
+
this._deletedAt = audit?.deletedAt;
|
|
170
|
+
}
|
|
171
|
+
touch() {
|
|
172
|
+
this._updatedAt = DateTime.create();
|
|
173
|
+
}
|
|
174
|
+
get createdAt() {
|
|
175
|
+
return this._createdAt;
|
|
176
|
+
}
|
|
177
|
+
get updatedAt() {
|
|
178
|
+
return this._updatedAt;
|
|
179
|
+
}
|
|
180
|
+
get deletedAt() {
|
|
181
|
+
return this._deletedAt;
|
|
182
|
+
}
|
|
183
|
+
get isDeleted() {
|
|
184
|
+
return Boolean(this._deletedAt);
|
|
185
|
+
}
|
|
186
|
+
softDelete() {
|
|
187
|
+
if (!this._deletedAt) {
|
|
188
|
+
this._deletedAt = DateTime.create();
|
|
189
|
+
this.touch();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
// src/domain/contracts/DomainError.ts
|
|
195
|
+
var DomainError = class extends Error {
|
|
196
|
+
constructor(type, message = "") {
|
|
197
|
+
super(message);
|
|
198
|
+
this.type = type;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
// src/domain/contracts/DomainEvent.ts
|
|
203
|
+
var DomainEvent = class {
|
|
204
|
+
constructor(payload) {
|
|
205
|
+
this._payload = payload;
|
|
206
|
+
this._occurredAt = DateTime.create();
|
|
207
|
+
}
|
|
208
|
+
get payload() {
|
|
209
|
+
return this._payload;
|
|
210
|
+
}
|
|
211
|
+
get occurredAt() {
|
|
212
|
+
return this._occurredAt;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
// src/domain/errors/FatalError.ts
|
|
217
|
+
var FatalError = class extends DomainError {
|
|
218
|
+
constructor(type, message = "") {
|
|
219
|
+
super(type, message);
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
// src/domain/errors/InternalError.ts
|
|
224
|
+
var InternalError = class extends DomainError {
|
|
225
|
+
constructor(type, message = "") {
|
|
226
|
+
super(type, message);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
// src/domain/errors/UsageError.ts
|
|
231
|
+
var UsageError = class extends DomainError {
|
|
232
|
+
constructor(type, vars = {}) {
|
|
233
|
+
super(type);
|
|
234
|
+
this.vars = vars;
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// src/domain/value-objects/Currency.ts
|
|
239
|
+
var _Currency = class _Currency extends ValueObject {
|
|
240
|
+
constructor(alpha) {
|
|
241
|
+
super(alpha.toUpperCase().trim());
|
|
242
|
+
this.numeric = _Currency.ALPHA_TO_NUM[this.value];
|
|
243
|
+
}
|
|
244
|
+
validate(alpha) {
|
|
245
|
+
const code = alpha.toUpperCase().trim();
|
|
246
|
+
if (!_Currency.ALPHA_REGEX.test(code)) {
|
|
247
|
+
throw new Error(`Currency code <${alpha}> is not a valid ISO\u20114217 alpha value`);
|
|
248
|
+
}
|
|
249
|
+
if (!(code in _Currency.ALPHA_TO_NUM)) {
|
|
250
|
+
throw new Error(`Currency <${code}> is not supported`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
static create(raw) {
|
|
254
|
+
if (typeof raw === "number" || _Currency.NUM_REGEX.test(raw)) {
|
|
255
|
+
const num = Number(raw);
|
|
256
|
+
const alpha = _Currency.NUM_TO_ALPHA[num];
|
|
257
|
+
if (!alpha) {
|
|
258
|
+
throw new Error(`Numeric currency <${raw}> is not supported`);
|
|
259
|
+
}
|
|
260
|
+
return new _Currency(alpha);
|
|
261
|
+
}
|
|
262
|
+
return new _Currency(String(raw));
|
|
263
|
+
}
|
|
264
|
+
static isValid(raw) {
|
|
265
|
+
try {
|
|
266
|
+
_Currency.create(raw);
|
|
267
|
+
return true;
|
|
268
|
+
} catch {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
_Currency.ALPHA_REGEX = /^[A-Z]{3}$/u;
|
|
274
|
+
_Currency.NUM_REGEX = /^\d{3}$/u;
|
|
275
|
+
_Currency.ALPHA_TO_NUM = {
|
|
276
|
+
USD: 840,
|
|
277
|
+
EUR: 978,
|
|
278
|
+
UYU: 858,
|
|
279
|
+
ARS: 32,
|
|
280
|
+
BRL: 986
|
|
281
|
+
};
|
|
282
|
+
_Currency.NUM_TO_ALPHA = Object.entries(_Currency.ALPHA_TO_NUM).reduce(
|
|
283
|
+
(acc, [alpha, num]) => {
|
|
284
|
+
acc[num] = alpha;
|
|
285
|
+
return acc;
|
|
286
|
+
},
|
|
287
|
+
{}
|
|
288
|
+
);
|
|
289
|
+
_Currency.USD = new _Currency("USD");
|
|
290
|
+
_Currency.EUR = new _Currency("EUR");
|
|
291
|
+
_Currency.UYU = new _Currency("UYU");
|
|
292
|
+
_Currency.ARS = new _Currency("ARS");
|
|
293
|
+
_Currency.BRL = new _Currency("BRL");
|
|
294
|
+
var Currency = _Currency;
|
|
295
|
+
|
|
296
|
+
// src/domain/value-objects/Email.ts
|
|
297
|
+
var _Email = class _Email extends ValueObject {
|
|
298
|
+
constructor(email) {
|
|
299
|
+
super(email.trim());
|
|
300
|
+
}
|
|
301
|
+
validate(value) {
|
|
302
|
+
if (!_Email.REGEX.test(value)) {
|
|
303
|
+
throw new Error(`Email <${value}> is not a valid address`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
static create(raw) {
|
|
307
|
+
return new _Email(raw);
|
|
308
|
+
}
|
|
309
|
+
static isValid(raw) {
|
|
310
|
+
return _Email.REGEX.test(raw.trim());
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
_Email.REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/u;
|
|
314
|
+
var Email = _Email;
|
|
315
|
+
|
|
316
|
+
// src/domain/value-objects/Language.ts
|
|
317
|
+
var _Language = class _Language extends ValueObject {
|
|
318
|
+
constructor(code) {
|
|
319
|
+
super(code.trim().toLowerCase());
|
|
320
|
+
}
|
|
321
|
+
validate(value) {
|
|
322
|
+
if (!_Language.SUPPORTED.includes(value)) {
|
|
323
|
+
throw new Error(`Language <${value}> is not supported`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
base() {
|
|
327
|
+
return this.value.split("-")[0];
|
|
328
|
+
}
|
|
329
|
+
static create(raw) {
|
|
330
|
+
const normalized = raw.trim().toLowerCase().replace("_", "-");
|
|
331
|
+
return new _Language(normalized);
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
_Language.SUPPORTED = [
|
|
335
|
+
"es",
|
|
336
|
+
"en",
|
|
337
|
+
"en-us",
|
|
338
|
+
"en-gb",
|
|
339
|
+
"en-au",
|
|
340
|
+
"en-ca",
|
|
341
|
+
"en-nz",
|
|
342
|
+
"en-ie",
|
|
343
|
+
"en-za",
|
|
344
|
+
"en-jm",
|
|
345
|
+
"en-bz",
|
|
346
|
+
"en-tt",
|
|
347
|
+
"pt-br",
|
|
348
|
+
"pt",
|
|
349
|
+
"es",
|
|
350
|
+
"es-ar",
|
|
351
|
+
"es-gt",
|
|
352
|
+
"es-cr",
|
|
353
|
+
"es-pa",
|
|
354
|
+
"es-do",
|
|
355
|
+
"es-mx",
|
|
356
|
+
"es-ve",
|
|
357
|
+
"es-co",
|
|
358
|
+
"es-pe",
|
|
359
|
+
"es-ec",
|
|
360
|
+
"es-cl",
|
|
361
|
+
"es-uy",
|
|
362
|
+
"es-py",
|
|
363
|
+
"es-bo",
|
|
364
|
+
"es-sv",
|
|
365
|
+
"es-hn",
|
|
366
|
+
"es-ni",
|
|
367
|
+
"es-pr"
|
|
368
|
+
];
|
|
369
|
+
_Language.DEFAULT = new _Language("es");
|
|
370
|
+
_Language.ENGLISH = new _Language("en");
|
|
371
|
+
_Language.ENGLISH_UNITED_STATES = new _Language("en-us");
|
|
372
|
+
_Language.ENGLISH_UNITED_KINGDOM = new _Language("en-gb");
|
|
373
|
+
_Language.ENGLISH_AUSTRALIA = new _Language("en-au");
|
|
374
|
+
_Language.ENGLISH_CANADA = new _Language("en-ca");
|
|
375
|
+
_Language.ENGLISH_NEW_ZEALAND = new _Language("en-nz");
|
|
376
|
+
_Language.ENGLISH_IRELAND = new _Language("en-ie");
|
|
377
|
+
_Language.ENGLISH_SOUTH_AFRICA = new _Language("en-za");
|
|
378
|
+
_Language.ENGLISH_JAMAICA = new _Language("en-jm");
|
|
379
|
+
_Language.ENGLISH_BELIZE = new _Language("en-bz");
|
|
380
|
+
_Language.ENGLISH_TRINIDAD = new _Language("en-tt");
|
|
381
|
+
_Language.PORTUGUESE_BRAZIL = new _Language("pt-br");
|
|
382
|
+
_Language.PORTUGUESE_PORTUGAL = new _Language("pt");
|
|
383
|
+
_Language.SPANISH = new _Language("es");
|
|
384
|
+
_Language.SPANISH_ARGENTINA = new _Language("es-ar");
|
|
385
|
+
_Language.SPANISH_GUATEMALA = new _Language("es-gt");
|
|
386
|
+
_Language.SPANISH_COSTA_RICA = new _Language("es-cr");
|
|
387
|
+
_Language.SPANISH_PANAMA = new _Language("es-pa");
|
|
388
|
+
_Language.SPANISH_REPUBLICA_DOMINICANA = new _Language("es-do");
|
|
389
|
+
_Language.SPANISH_MEXICO = new _Language("es-mx");
|
|
390
|
+
_Language.SPANISH_VENEZUELA = new _Language("es-ve");
|
|
391
|
+
_Language.SPANISH_COLOMBIA = new _Language("es-co");
|
|
392
|
+
_Language.SPANISH_PERU = new _Language("es-pe");
|
|
393
|
+
_Language.SPANISH_ECUADOR = new _Language("es-ec");
|
|
394
|
+
_Language.SPANISH_CHILE = new _Language("es-cl");
|
|
395
|
+
_Language.SPANISH_URUGUAY = new _Language("es-uy");
|
|
396
|
+
_Language.SPANISH_PARAGUAY = new _Language("es-py");
|
|
397
|
+
_Language.SPANISH_BOLIVIA = new _Language("es-bo");
|
|
398
|
+
_Language.SPANISH_EL_SALVADOR = new _Language("es-sv");
|
|
399
|
+
_Language.SPANISH_HONDURAS = new _Language("es-hn");
|
|
400
|
+
_Language.SPANISH_NICARAGUA = new _Language("es-ni");
|
|
401
|
+
_Language.SPANISH_PUERTO_RICO = new _Language("es-pr");
|
|
402
|
+
var Language = _Language;
|
|
403
|
+
|
|
404
|
+
// src/domain/value-objects/Price.ts
|
|
405
|
+
var _Price = class _Price extends ValueObject {
|
|
406
|
+
constructor(amount, currency) {
|
|
407
|
+
super({ amount, currency });
|
|
408
|
+
this.amount = amount;
|
|
409
|
+
this.currency = currency;
|
|
410
|
+
}
|
|
411
|
+
validate(props) {
|
|
412
|
+
const { amount, currency } = props;
|
|
413
|
+
if (typeof amount !== "number" || Number.isNaN(amount) || !Number.isFinite(amount)) {
|
|
414
|
+
throw new Error(`Price amount <${amount}> is not a valid number`);
|
|
415
|
+
}
|
|
416
|
+
if (amount < _Price.MIN_AMOUNT) {
|
|
417
|
+
throw new Error(`Price amount <${amount}> must be \u2265 ${_Price.MIN_AMOUNT}`);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
equals(other) {
|
|
421
|
+
if (!other)
|
|
422
|
+
return false;
|
|
423
|
+
return this.amount === other.amount && this.currency.equals(other.currency);
|
|
424
|
+
}
|
|
425
|
+
assertSameCurrency(other) {
|
|
426
|
+
if (!this.currency.equals(other.currency)) {
|
|
427
|
+
throw new Error("Cannot operate on Price objects with different currencies");
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
add(other) {
|
|
431
|
+
this.assertSameCurrency(other);
|
|
432
|
+
return _Price.create(this.amount + other.amount, this.currency);
|
|
433
|
+
}
|
|
434
|
+
subtract(other) {
|
|
435
|
+
this.assertSameCurrency(other);
|
|
436
|
+
return _Price.create(this.amount - other.amount, this.currency);
|
|
437
|
+
}
|
|
438
|
+
static create(amount, currency) {
|
|
439
|
+
const cur = currency instanceof Currency ? currency : Currency.create(currency);
|
|
440
|
+
return new _Price(amount, cur);
|
|
441
|
+
}
|
|
442
|
+
};
|
|
443
|
+
_Price.MIN_AMOUNT = -1e6;
|
|
444
|
+
var Price = _Price;
|
|
445
|
+
|
|
446
|
+
// src/domain/value-objects/UUID.ts
|
|
447
|
+
var UUID = class _UUID extends ValueObject {
|
|
448
|
+
constructor(value) {
|
|
449
|
+
super(value);
|
|
450
|
+
}
|
|
451
|
+
validate(uuid) {
|
|
452
|
+
if (!_UUID.isValid(uuid)) {
|
|
453
|
+
throw new Error(`Invalid uuid ${uuid}`);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
static create(uuid) {
|
|
457
|
+
return new _UUID(uuid ?? crypto.randomUUID());
|
|
458
|
+
}
|
|
459
|
+
static isValid(uuid) {
|
|
460
|
+
return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);
|
|
461
|
+
}
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
// src/utils/StringVars.ts
|
|
465
|
+
var StringVars = class {
|
|
466
|
+
static parse(str, ob) {
|
|
467
|
+
const regex = /{{(.*?)}}/g;
|
|
468
|
+
return str.replace(regex, (match, variable) => {
|
|
469
|
+
if (ob.hasOwnProperty(variable.trim())) {
|
|
470
|
+
return ob[variable.trim()];
|
|
471
|
+
} else {
|
|
472
|
+
return match;
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
|
|
478
|
+
// src/infrastructure/errors/ErrorManager.ts
|
|
479
|
+
var _ErrorManager = class _ErrorManager {
|
|
480
|
+
constructor(logger = null) {
|
|
481
|
+
this.logger = logger;
|
|
482
|
+
}
|
|
483
|
+
getDefaultMessage(lang) {
|
|
484
|
+
return _ErrorManager.DEFAULT_MESSAGES[lang.value] || _ErrorManager.DEFAULT_MESSAGES[lang.base()] || "error";
|
|
485
|
+
}
|
|
486
|
+
onFatal(err, lang) {
|
|
487
|
+
this.logger?.fatal(err.type, err.message);
|
|
488
|
+
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
489
|
+
}
|
|
490
|
+
onInternal(err, lang) {
|
|
491
|
+
this.logger?.error(err.type, err.message);
|
|
492
|
+
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
493
|
+
}
|
|
494
|
+
onUsage(err, lang) {
|
|
495
|
+
const tmpl = _ErrorManager.TEMPLATES.get(err.type);
|
|
496
|
+
if (!tmpl) {
|
|
497
|
+
this.logger?.error("TEMPLATE_NOT_FOUND", `${err.type}`);
|
|
498
|
+
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
499
|
+
}
|
|
500
|
+
const code = lang.value;
|
|
501
|
+
const base = lang.base();
|
|
502
|
+
const rawMsg = tmpl.languages[code] ?? tmpl.languages[base] ?? this.getDefaultMessage(lang);
|
|
503
|
+
return {
|
|
504
|
+
status: "ERROR",
|
|
505
|
+
message: StringVars.parse(rawMsg, err.vars)
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
onUnknown(err, lang) {
|
|
509
|
+
this.logger?.error("UNKNOWN_ERROR", err.message);
|
|
510
|
+
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
511
|
+
}
|
|
512
|
+
handle(err, lang) {
|
|
513
|
+
if (["local", "dev"].includes(process.env.ENVIRONMENT ?? "")) {
|
|
514
|
+
console.log(err);
|
|
515
|
+
}
|
|
516
|
+
if (err instanceof FatalError) {
|
|
517
|
+
return this.onFatal(err, lang);
|
|
518
|
+
}
|
|
519
|
+
if (err instanceof InternalError) {
|
|
520
|
+
return this.onInternal(err, lang);
|
|
521
|
+
}
|
|
522
|
+
if (err instanceof UsageError) {
|
|
523
|
+
return this.onUsage(err, lang);
|
|
524
|
+
}
|
|
525
|
+
return this.onUnknown(err, lang);
|
|
526
|
+
}
|
|
527
|
+
static addTemplate(template) {
|
|
528
|
+
_ErrorManager.TEMPLATES.set(template.type, template);
|
|
529
|
+
}
|
|
530
|
+
};
|
|
531
|
+
_ErrorManager.DEFAULT_MESSAGES = {
|
|
532
|
+
"es": "Ups, hemos encontrado un error. Nuestro equipo ya est\xE1 trabajando para solucionarlo",
|
|
533
|
+
"en": "Ups, we found an error. Our team is working on it.",
|
|
534
|
+
"pt": "Ops, encontramos um bug. Nossa equipe j\xE1 est\xE1 trabalhando para resolver isso."
|
|
535
|
+
};
|
|
536
|
+
_ErrorManager.APP_ERRORS = {
|
|
537
|
+
UNDEFINED: "UNDEFINED_ERROR",
|
|
538
|
+
PROCESS: "PROCESS_ERROR",
|
|
539
|
+
DATABASE: "DATABASE_ERROR"
|
|
540
|
+
};
|
|
541
|
+
_ErrorManager.TEMPLATES = /* @__PURE__ */ new Map();
|
|
542
|
+
var ErrorManager = _ErrorManager;
|
|
543
|
+
|
|
544
|
+
// src/infrastructure/mysql/MysqlConnector.ts
|
|
545
|
+
var import_promise = require("mysql2/promise");
|
|
546
|
+
|
|
547
|
+
// src/infrastructure/mysql/MysqlConnection.ts
|
|
548
|
+
var MysqlConnection = class {
|
|
549
|
+
constructor(conn) {
|
|
550
|
+
this._conn = conn;
|
|
551
|
+
}
|
|
552
|
+
async query(statement, params = []) {
|
|
553
|
+
const [rows] = await this._conn.query(statement, params);
|
|
554
|
+
return rows;
|
|
555
|
+
}
|
|
556
|
+
async begin() {
|
|
557
|
+
await this._conn.beginTransaction();
|
|
558
|
+
}
|
|
559
|
+
async commit() {
|
|
560
|
+
await this._conn.commit();
|
|
561
|
+
}
|
|
562
|
+
async rollback() {
|
|
563
|
+
await this._conn.rollback();
|
|
564
|
+
}
|
|
565
|
+
async transaction(fn) {
|
|
566
|
+
await this.begin();
|
|
567
|
+
try {
|
|
568
|
+
const result = await fn(this);
|
|
569
|
+
await this.commit();
|
|
570
|
+
return result;
|
|
571
|
+
} catch (err) {
|
|
572
|
+
await this.rollback();
|
|
573
|
+
throw err;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
async close() {
|
|
577
|
+
this._conn.release();
|
|
578
|
+
}
|
|
579
|
+
};
|
|
580
|
+
|
|
581
|
+
// src/infrastructure/mysql/MysqlConnector.ts
|
|
582
|
+
var _MysqlConnector = class _MysqlConnector {
|
|
583
|
+
constructor(pool) {
|
|
584
|
+
this._pool = pool ?? (0, import_promise.createPool)({
|
|
585
|
+
host: process.env.DB_HOST,
|
|
586
|
+
port: Number(process.env.DB_PORT ?? 3306),
|
|
587
|
+
user: process.env.DB_USER,
|
|
588
|
+
password: process.env.DB_PASSWORD,
|
|
589
|
+
database: process.env.DB_NAME,
|
|
590
|
+
connectionLimit: Number(process.env.DB_POOL_SIZE) || _MysqlConnector.DEFAULT_POOL_SIZE,
|
|
591
|
+
decimalNumbers: true
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
async wrap(conn) {
|
|
595
|
+
return new MysqlConnection(conn);
|
|
596
|
+
}
|
|
597
|
+
async getConnection() {
|
|
598
|
+
const conn = await this._pool.getConnection();
|
|
599
|
+
return this.wrap(conn);
|
|
600
|
+
}
|
|
601
|
+
async closePool() {
|
|
602
|
+
await this._pool.end();
|
|
603
|
+
}
|
|
604
|
+
static async ping() {
|
|
605
|
+
const connector = new _MysqlConnector();
|
|
606
|
+
try {
|
|
607
|
+
const conn = await connector._pool.getConnection();
|
|
608
|
+
await conn.ping();
|
|
609
|
+
conn.release();
|
|
610
|
+
return true;
|
|
611
|
+
} catch {
|
|
612
|
+
return false;
|
|
613
|
+
} finally {
|
|
614
|
+
await connector.closePool();
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
};
|
|
618
|
+
_MysqlConnector.DEFAULT_POOL_SIZE = 10;
|
|
619
|
+
var MysqlConnector = _MysqlConnector;
|
|
620
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
621
|
+
0 && (module.exports = {
|
|
622
|
+
Currency,
|
|
623
|
+
DateTime,
|
|
624
|
+
DomainEntity,
|
|
625
|
+
DomainError,
|
|
626
|
+
DomainEvent,
|
|
627
|
+
Email,
|
|
628
|
+
ErrorManager,
|
|
629
|
+
FatalError,
|
|
630
|
+
InternalError,
|
|
631
|
+
Language,
|
|
632
|
+
MysqlConnection,
|
|
633
|
+
MysqlConnector,
|
|
634
|
+
Price,
|
|
635
|
+
UUID,
|
|
636
|
+
UsageError,
|
|
637
|
+
ValueObject
|
|
638
|
+
});
|
|
639
|
+
//# sourceMappingURL=index.cjs.map
|