@abejarano/ts-mongodb-criteria 1.2.1

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 (46) hide show
  1. package/README.md +329 -0
  2. package/dist/AggregateRoot.d.ts +4 -0
  3. package/dist/AggregateRoot.js +6 -0
  4. package/dist/criteria/Criteria.d.ts +11 -0
  5. package/dist/criteria/Criteria.js +19 -0
  6. package/dist/criteria/Filter.d.ts +10 -0
  7. package/dist/criteria/Filter.js +24 -0
  8. package/dist/criteria/FilterField.d.ts +4 -0
  9. package/dist/criteria/FilterField.js +10 -0
  10. package/dist/criteria/FilterOperator.d.ts +18 -0
  11. package/dist/criteria/FilterOperator.js +36 -0
  12. package/dist/criteria/FilterValue.d.ts +30 -0
  13. package/dist/criteria/FilterValue.js +74 -0
  14. package/dist/criteria/Filters.d.ts +8 -0
  15. package/dist/criteria/Filters.js +16 -0
  16. package/dist/criteria/Order.d.ts +12 -0
  17. package/dist/criteria/Order.js +30 -0
  18. package/dist/criteria/OrderBy.d.ts +7 -0
  19. package/dist/criteria/OrderBy.js +17 -0
  20. package/dist/criteria/OrderType.d.ts +13 -0
  21. package/dist/criteria/OrderType.js +34 -0
  22. package/dist/criteria/Paginate.d.ts +5 -0
  23. package/dist/criteria/Paginate.js +2 -0
  24. package/dist/criteria/index.d.ts +10 -0
  25. package/dist/criteria/index.js +26 -0
  26. package/dist/exceptions/InvalidArgumentError.exception.d.ts +2 -0
  27. package/dist/exceptions/InvalidArgumentError.exception.js +6 -0
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.js +19 -0
  30. package/dist/mongo/MongoClientFactory.d.ts +17 -0
  31. package/dist/mongo/MongoClientFactory.js +49 -0
  32. package/dist/mongo/MongoCriteriaConverter.d.ts +43 -0
  33. package/dist/mongo/MongoCriteriaConverter.js +115 -0
  34. package/dist/mongo/MongoRepository.d.ts +15 -0
  35. package/dist/mongo/MongoRepository.js +95 -0
  36. package/dist/mongo/index.d.ts +3 -0
  37. package/dist/mongo/index.js +19 -0
  38. package/dist/valueObject/EnumValueObject.d.ts +7 -0
  39. package/dist/valueObject/EnumValueObject.js +16 -0
  40. package/dist/valueObject/StringValueObject.d.ts +8 -0
  41. package/dist/valueObject/StringValueObject.js +24 -0
  42. package/dist/valueObject/ValueObject.d.ts +8 -0
  43. package/dist/valueObject/ValueObject.js +23 -0
  44. package/dist/valueObject/index.d.ts +3 -0
  45. package/dist/valueObject/index.js +19 -0
  46. package/package.json +62 -0
@@ -0,0 +1,13 @@
1
+ import { EnumValueObject } from "../valueObject";
2
+ export declare enum OrderTypes {
3
+ ASC = "asc",
4
+ DESC = "desc",
5
+ NONE = "none"
6
+ }
7
+ export declare class OrderType extends EnumValueObject<OrderTypes> {
8
+ constructor(value: OrderTypes);
9
+ static fromValue(value: string): OrderType;
10
+ isNone(): boolean;
11
+ isAsc(): boolean;
12
+ protected throwErrorForInvalidValue(value: OrderTypes): void;
13
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OrderType = exports.OrderTypes = void 0;
4
+ const valueObject_1 = require("../valueObject");
5
+ const InvalidArgumentError_exception_1 = require("../exceptions/InvalidArgumentError.exception");
6
+ var OrderTypes;
7
+ (function (OrderTypes) {
8
+ OrderTypes["ASC"] = "asc";
9
+ OrderTypes["DESC"] = "desc";
10
+ OrderTypes["NONE"] = "none";
11
+ })(OrderTypes || (exports.OrderTypes = OrderTypes = {}));
12
+ class OrderType extends valueObject_1.EnumValueObject {
13
+ constructor(value) {
14
+ super(value, Object.values(OrderTypes));
15
+ }
16
+ static fromValue(value) {
17
+ for (const orderTypeValue of Object.values(OrderTypes)) {
18
+ if (value === orderTypeValue.toString()) {
19
+ return new OrderType(orderTypeValue);
20
+ }
21
+ }
22
+ throw new InvalidArgumentError_exception_1.InvalidArgumentError(`The order type ${value} is invalid`);
23
+ }
24
+ isNone() {
25
+ return this.value === OrderTypes.NONE;
26
+ }
27
+ isAsc() {
28
+ return this.value === OrderTypes.ASC;
29
+ }
30
+ throwErrorForInvalidValue(value) {
31
+ throw new InvalidArgumentError_exception_1.InvalidArgumentError(`The order type ${value} is invalid`);
32
+ }
33
+ }
34
+ exports.OrderType = OrderType;
@@ -0,0 +1,5 @@
1
+ export type Paginate<T> = {
2
+ nextPag: string | number | null;
3
+ count: number;
4
+ results: Array<T>;
5
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ export * from "./FilterField";
2
+ export * from "./FilterOperator";
3
+ export * from "./FilterValue";
4
+ export * from "./OrderBy";
5
+ export * from "./Filter";
6
+ export * from "./Criteria";
7
+ export * from "./Filters";
8
+ export * from "./Order";
9
+ export * from "./Paginate";
10
+ export * from "./OrderType";
@@ -0,0 +1,26 @@
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("./FilterField"), exports);
18
+ __exportStar(require("./FilterOperator"), exports);
19
+ __exportStar(require("./FilterValue"), exports);
20
+ __exportStar(require("./OrderBy"), exports);
21
+ __exportStar(require("./Filter"), exports);
22
+ __exportStar(require("./Criteria"), exports);
23
+ __exportStar(require("./Filters"), exports);
24
+ __exportStar(require("./Order"), exports);
25
+ __exportStar(require("./Paginate"), exports);
26
+ __exportStar(require("./OrderType"), exports);
@@ -0,0 +1,2 @@
1
+ export declare class InvalidArgumentError extends Error {
2
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InvalidArgumentError = void 0;
4
+ class InvalidArgumentError extends Error {
5
+ }
6
+ exports.InvalidArgumentError = InvalidArgumentError;
@@ -0,0 +1,3 @@
1
+ export * from "./criteria";
2
+ export * from "./mongo";
3
+ export * from "./AggregateRoot";
package/dist/index.js ADDED
@@ -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("./criteria"), exports);
18
+ __exportStar(require("./mongo"), exports);
19
+ __exportStar(require("./AggregateRoot"), exports);
@@ -0,0 +1,17 @@
1
+ import { MongoClient } from "mongodb";
2
+ export declare class MongoClientFactory {
3
+ private static client;
4
+ /**
5
+ * Obtiene o crea una instancia de MongoClient.
6
+ * Reutiliza la conexión si ya existe.
7
+ */
8
+ static createClient(): Promise<MongoClient>;
9
+ /**
10
+ * Cierra la conexión a MongoDB.
11
+ */
12
+ static closeClient(): Promise<void>;
13
+ /**
14
+ * Crea y conecta una nueva instancia de MongoClient.
15
+ */
16
+ private static createAndConnectClient;
17
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoClientFactory = void 0;
4
+ const mongodb_1 = require("mongodb");
5
+ class MongoClientFactory {
6
+ /**
7
+ * Obtiene o crea una instancia de MongoClient.
8
+ * Reutiliza la conexión si ya existe.
9
+ */
10
+ static async createClient() {
11
+ if (!MongoClientFactory.client) {
12
+ MongoClientFactory.client =
13
+ await MongoClientFactory.createAndConnectClient();
14
+ }
15
+ return MongoClientFactory.client;
16
+ }
17
+ /**
18
+ * Cierra la conexión a MongoDB.
19
+ */
20
+ static async closeClient() {
21
+ if (MongoClientFactory.client) {
22
+ await MongoClientFactory.client.close();
23
+ MongoClientFactory.client = null; // Limpia la instancia
24
+ }
25
+ }
26
+ /**
27
+ * Crea y conecta una nueva instancia de MongoClient.
28
+ */
29
+ static async createAndConnectClient() {
30
+ const MONGO_PASS = process.env.MONGO_PASS;
31
+ const MONGO_USER = process.env.MONGO_USER;
32
+ const MONGO_DB = process.env.MONGO_DB;
33
+ const MONGO_SERVER = process.env.MONGO_SERVER;
34
+ if (!MONGO_PASS || !MONGO_USER || !MONGO_DB || !MONGO_SERVER) {
35
+ throw new Error("Missing MongoDB environment variables.");
36
+ }
37
+ const uri = `mongodb+srv://${MONGO_USER}:${MONGO_PASS}@${MONGO_SERVER}/${MONGO_DB}?retryWrites=true&w=majority`;
38
+ const client = new mongodb_1.MongoClient(uri, { ignoreUndefined: true });
39
+ try {
40
+ await client.connect();
41
+ return client;
42
+ }
43
+ catch (error) {
44
+ throw error;
45
+ }
46
+ }
47
+ }
48
+ exports.MongoClientFactory = MongoClientFactory;
49
+ MongoClientFactory.client = null;
@@ -0,0 +1,43 @@
1
+ import { Criteria, Filters, Order } from "../criteria";
2
+ type MongoFilterOperator = "$eq" | "$ne" | "$gt" | "$lt" | "$regex" | "$lte" | "$gte" | "$or";
3
+ type MongoFilterValue = boolean | string | number | Date;
4
+ type MongoFilterOperation = {
5
+ [operator in MongoFilterOperator]?: MongoFilterValue;
6
+ };
7
+ type MongoFilter = {
8
+ [field: string]: MongoFilterOperation;
9
+ } | {
10
+ [field: string]: {
11
+ $not: MongoFilterOperation;
12
+ };
13
+ } | {
14
+ $or: any[];
15
+ };
16
+ type MongoDirection = 1 | -1;
17
+ type MongoSort = {
18
+ [field: string]: MongoDirection;
19
+ };
20
+ export interface MongoQuery {
21
+ filter: MongoFilter;
22
+ sort: MongoSort;
23
+ skip: number;
24
+ limit: number;
25
+ }
26
+ export declare class MongoCriteriaConverter {
27
+ private filterTransformers;
28
+ constructor();
29
+ convert(criteria: Criteria): MongoQuery;
30
+ protected generateFilter(filters: Filters): MongoFilter;
31
+ protected generateSort(order: Order): MongoSort;
32
+ private equalFilter;
33
+ private notEqualFilter;
34
+ private greaterThanFilter;
35
+ private greaterThanOrEqualFilter;
36
+ private lowerThanOrEqualFilter;
37
+ private lowerThanFilter;
38
+ private containsFilter;
39
+ private notContainsFilter;
40
+ private orFilter;
41
+ private betweenFilter;
42
+ }
43
+ export {};
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoCriteriaConverter = void 0;
4
+ const criteria_1 = require("../criteria");
5
+ class MongoCriteriaConverter {
6
+ constructor() {
7
+ this.filterTransformers = new Map([
8
+ [criteria_1.Operator.EQUAL, this.equalFilter],
9
+ [criteria_1.Operator.NOT_EQUAL, this.notEqualFilter],
10
+ [criteria_1.Operator.GT, this.greaterThanFilter],
11
+ [criteria_1.Operator.LT, this.lowerThanFilter],
12
+ [criteria_1.Operator.CONTAINS, this.containsFilter],
13
+ [criteria_1.Operator.NOT_CONTAINS, this.notContainsFilter],
14
+ [criteria_1.Operator.GTE, this.greaterThanOrEqualFilter],
15
+ [criteria_1.Operator.LTE, this.lowerThanOrEqualFilter],
16
+ [criteria_1.Operator.BETWEEN, this.betweenFilter],
17
+ [criteria_1.Operator.OR, this.orFilter],
18
+ ]);
19
+ }
20
+ convert(criteria) {
21
+ return {
22
+ filter: criteria.hasFilters()
23
+ ? this.generateFilter(criteria.filters)
24
+ : {},
25
+ sort: criteria.order.hasOrder()
26
+ ? this.generateSort(criteria.order)
27
+ : { _id: -1 },
28
+ skip: criteria.offset || 0,
29
+ limit: criteria.limit || 0,
30
+ };
31
+ }
32
+ generateFilter(filters) {
33
+ const filter = filters.filters.map((filter) => {
34
+ const transformer = this.filterTransformers.get(filter.operator.value);
35
+ if (!transformer) {
36
+ throw Error(`Unexpected operator value ${filter.operator.value}`);
37
+ }
38
+ return transformer(filter);
39
+ });
40
+ return Object.assign({}, ...filter);
41
+ }
42
+ generateSort(order) {
43
+ return {
44
+ [order.orderBy.value === "id" ? "_id" : order.orderBy.value]: order.orderType.isAsc() ? 1 : -1,
45
+ };
46
+ }
47
+ equalFilter(filter) {
48
+ return { [filter.field.value]: { $eq: filter.value.value } };
49
+ }
50
+ notEqualFilter(filter) {
51
+ return { [filter.field.value]: { $ne: filter.value.value } };
52
+ }
53
+ greaterThanFilter(filter) {
54
+ return { [filter.field.value]: { $gt: filter.value.value } };
55
+ }
56
+ greaterThanOrEqualFilter(filter) {
57
+ return { [filter.field.value]: { $gte: filter.value.value } };
58
+ }
59
+ lowerThanOrEqualFilter(filter) {
60
+ return { [filter.field.value]: { $lte: filter.value.value } };
61
+ }
62
+ lowerThanFilter(filter) {
63
+ return { [filter.field.value]: { $lt: filter.value.value } };
64
+ }
65
+ containsFilter(filter) {
66
+ return { [filter.field.value]: { $regex: filter.value.value } };
67
+ }
68
+ notContainsFilter(filter) {
69
+ return {
70
+ [filter.field.value]: { $not: { $regex: filter.value.value } },
71
+ };
72
+ }
73
+ orFilter(filter) {
74
+ if (!filter.value.isOrConditions) {
75
+ throw new Error("OR operator requires an array of OrCondition objects");
76
+ }
77
+ const conditions = filter.value.asOrConditions;
78
+ const orConditions = conditions.map((condition) => {
79
+ switch (condition.operator) {
80
+ case criteria_1.Operator.CONTAINS:
81
+ return { [condition.field]: { $regex: condition.value } };
82
+ case criteria_1.Operator.EQUAL:
83
+ return { [condition.field]: { $eq: condition.value } };
84
+ case criteria_1.Operator.NOT_EQUAL:
85
+ return { [condition.field]: { $ne: condition.value } };
86
+ case criteria_1.Operator.GT:
87
+ return { [condition.field]: { $gt: condition.value } };
88
+ case criteria_1.Operator.LT:
89
+ return { [condition.field]: { $lt: condition.value } };
90
+ case criteria_1.Operator.GTE:
91
+ return { [condition.field]: { $gte: condition.value } };
92
+ case criteria_1.Operator.LTE:
93
+ return { [condition.field]: { $lte: condition.value } };
94
+ case criteria_1.Operator.NOT_CONTAINS:
95
+ return { [condition.field]: { $not: { $regex: condition.value } } };
96
+ default:
97
+ throw new Error(`Unsupported operator in OR condition: ${condition.operator}`);
98
+ }
99
+ });
100
+ return { $or: orConditions };
101
+ }
102
+ betweenFilter(filter) {
103
+ if (!filter.value.isBetween) {
104
+ throw new Error("BETWEEN operator requires an object with start and end values.");
105
+ }
106
+ const { start, end } = filter.value.asBetween;
107
+ return {
108
+ [filter.field.value]: {
109
+ $gte: start,
110
+ $lte: end,
111
+ },
112
+ };
113
+ }
114
+ }
115
+ exports.MongoCriteriaConverter = MongoCriteriaConverter;
@@ -0,0 +1,15 @@
1
+ import { Criteria, Paginate } from "../criteria";
2
+ import { AggregateRoot } from "../AggregateRoot";
3
+ import { Collection, ObjectId, UpdateFilter } from "mongodb";
4
+ export declare abstract class MongoRepository<T extends AggregateRoot> {
5
+ private criteriaConverter;
6
+ private query;
7
+ private criteria;
8
+ protected constructor();
9
+ abstract collectionName(): string;
10
+ paginate<T>(documents: T[]): Promise<Paginate<T>>;
11
+ protected collection<T extends Document>(): Promise<Collection<T>>;
12
+ protected persist(id: string, aggregateRoot: T): Promise<ObjectId | null>;
13
+ protected updateOne(filter: object, update: Document[] | UpdateFilter<any>): Promise<ObjectId | null>;
14
+ protected searchByCriteria<D>(criteria: Criteria, fieldsToExclude?: string[]): Promise<D[]>;
15
+ }
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoRepository = void 0;
4
+ const MongoCriteriaConverter_1 = require("./MongoCriteriaConverter");
5
+ const MongoClientFactory_1 = require("./MongoClientFactory");
6
+ const mongodb_1 = require("mongodb");
7
+ class MongoRepository {
8
+ constructor() {
9
+ this.criteriaConverter = new MongoCriteriaConverter_1.MongoCriteriaConverter();
10
+ }
11
+ // transformationToUpsertInSubDocuments(
12
+ // subDocumentField: string,
13
+ // primitiveData: any,
14
+ // ): {} {
15
+ // const response = {};
16
+ //
17
+ // for (const key in primitiveData) {
18
+ // response[`${subDocumentField}.$.${key}`] = primitiveData[key];
19
+ // }
20
+ //
21
+ // return response;
22
+ // }
23
+ async paginate(documents) {
24
+ const collection = await this.collection();
25
+ const count = await collection.countDocuments(this.query.filter);
26
+ const limit = this.criteria?.limit || 10;
27
+ const currentPage = this.criteria?.currentPage || 1;
28
+ const hasNextPage = currentPage * limit < count;
29
+ if (documents.length === 0) {
30
+ return {
31
+ nextPag: null,
32
+ count: 0,
33
+ results: [],
34
+ };
35
+ }
36
+ return {
37
+ nextPag: hasNextPage ? Number(this.criteria.currentPage) + 1 : null,
38
+ count: count,
39
+ results: documents,
40
+ };
41
+ }
42
+ async collection() {
43
+ return (await MongoClientFactory_1.MongoClientFactory.createClient())
44
+ .db()
45
+ .collection(this.collectionName());
46
+ }
47
+ async persist(id, aggregateRoot) {
48
+ let primitives;
49
+ if (aggregateRoot.toPrimitives() instanceof Promise) {
50
+ primitives = await aggregateRoot.toPrimitives();
51
+ }
52
+ else {
53
+ primitives = aggregateRoot.toPrimitives();
54
+ }
55
+ return await this.updateOne({ _id: new mongodb_1.ObjectId(id) }, {
56
+ $set: {
57
+ ...primitives,
58
+ id: id,
59
+ },
60
+ });
61
+ }
62
+ async updateOne(filter, update) {
63
+ const collection = await this.collection();
64
+ const result = await collection.updateOne(filter, update, {
65
+ upsert: true,
66
+ });
67
+ return result.upsertedId;
68
+ }
69
+ async searchByCriteria(criteria, fieldsToExclude = []) {
70
+ this.criteria = criteria;
71
+ this.query = this.criteriaConverter.convert(criteria);
72
+ const collection = await this.collection();
73
+ if (fieldsToExclude.length === 0) {
74
+ const results = await collection
75
+ .find(this.query.filter, {})
76
+ .sort(this.query.sort)
77
+ .skip(this.query.skip)
78
+ .limit(this.query.limit)
79
+ .toArray();
80
+ return results.map(({ _id, ...rest }) => rest);
81
+ }
82
+ const projection = {};
83
+ fieldsToExclude.forEach((field) => {
84
+ projection[field] = 0;
85
+ });
86
+ const results = await collection
87
+ .find(this.query.filter, { projection })
88
+ .sort(this.query.sort)
89
+ .skip(this.query.skip)
90
+ .limit(this.query.limit)
91
+ .toArray();
92
+ return results.map(({ _id, ...rest }) => rest);
93
+ }
94
+ }
95
+ exports.MongoRepository = MongoRepository;
@@ -0,0 +1,3 @@
1
+ export * from "./MongoCriteriaConverter";
2
+ export * from "./MongoRepository";
3
+ export * from "./MongoClientFactory";
@@ -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("./MongoCriteriaConverter"), exports);
18
+ __exportStar(require("./MongoRepository"), exports);
19
+ __exportStar(require("./MongoClientFactory"), exports);
@@ -0,0 +1,7 @@
1
+ export declare abstract class EnumValueObject<T> {
2
+ readonly validValues: T[];
3
+ readonly value: T;
4
+ constructor(value: T, validValues: T[]);
5
+ checkValueIsValid(value: T): void;
6
+ protected abstract throwErrorForInvalidValue(value: T): void;
7
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnumValueObject = void 0;
4
+ class EnumValueObject {
5
+ constructor(value, validValues) {
6
+ this.validValues = validValues;
7
+ this.value = value;
8
+ this.checkValueIsValid(value);
9
+ }
10
+ checkValueIsValid(value) {
11
+ if (!this.validValues.includes(value)) {
12
+ this.throwErrorForInvalidValue(value);
13
+ }
14
+ }
15
+ }
16
+ exports.EnumValueObject = EnumValueObject;
@@ -0,0 +1,8 @@
1
+ import { ValueObject } from "./ValueObject";
2
+ export declare class StringValueObject extends ValueObject<string> {
3
+ readonly value: any;
4
+ constructor(value: any);
5
+ static create(value: string): StringValueObject;
6
+ getValue(): string;
7
+ private ensureStringIsNotEmpty;
8
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StringValueObject = void 0;
4
+ const ValueObject_1 = require("./ValueObject");
5
+ const InvalidArgumentError_exception_1 = require("../exceptions/InvalidArgumentError.exception");
6
+ class StringValueObject extends ValueObject_1.ValueObject {
7
+ constructor(value) {
8
+ super(value);
9
+ this.value = value;
10
+ this.ensureStringIsNotEmpty();
11
+ }
12
+ static create(value) {
13
+ return new StringValueObject(value);
14
+ }
15
+ getValue() {
16
+ return String(this.value);
17
+ }
18
+ ensureStringIsNotEmpty() {
19
+ if (typeof this.value !== "object" && this.value.length < 1) {
20
+ throw new InvalidArgumentError_exception_1.InvalidArgumentError("String should have a length");
21
+ }
22
+ }
23
+ }
24
+ exports.StringValueObject = StringValueObject;
@@ -0,0 +1,8 @@
1
+ export type Primitives = String | string | number | Boolean | boolean | Date;
2
+ export declare abstract class ValueObject<T extends Primitives> {
3
+ readonly value: T;
4
+ constructor(value: T);
5
+ equals(other: ValueObject<T>): boolean;
6
+ toString(): string;
7
+ private ensureValueIsDefined;
8
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValueObject = void 0;
4
+ const InvalidArgumentError_exception_1 = require("../exceptions/InvalidArgumentError.exception");
5
+ class ValueObject {
6
+ constructor(value) {
7
+ this.value = value;
8
+ this.ensureValueIsDefined(value);
9
+ }
10
+ equals(other) {
11
+ return (other.constructor.name === this.constructor.name &&
12
+ other.value === this.value);
13
+ }
14
+ toString() {
15
+ return this.value.toString();
16
+ }
17
+ ensureValueIsDefined(value) {
18
+ if (value === undefined) {
19
+ throw new InvalidArgumentError_exception_1.InvalidArgumentError("Value must be defined");
20
+ }
21
+ }
22
+ }
23
+ exports.ValueObject = ValueObject;
@@ -0,0 +1,3 @@
1
+ export * from "./EnumValueObject";
2
+ export * from "./StringValueObject";
3
+ export * from "./ValueObject";
@@ -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("./EnumValueObject"), exports);
18
+ __exportStar(require("./StringValueObject"), exports);
19
+ __exportStar(require("./ValueObject"), exports);