@woltz/rich-domain 0.2.2 → 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 (109) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +37 -20
  3. package/dist/base-entity.d.ts +1 -1
  4. package/dist/base-entity.d.ts.map +1 -1
  5. package/dist/base-entity.js +21 -15
  6. package/dist/base-entity.js.map +1 -1
  7. package/dist/constants.js +4 -1
  8. package/dist/constants.js.map +1 -1
  9. package/dist/criteria.d.ts.map +1 -1
  10. package/dist/criteria.js +7 -3
  11. package/dist/criteria.js.map +1 -1
  12. package/dist/deep-proxy.d.ts +3 -1
  13. package/dist/deep-proxy.d.ts.map +1 -1
  14. package/dist/deep-proxy.js +110 -33
  15. package/dist/deep-proxy.js.map +1 -1
  16. package/dist/domain-event-bus.js +7 -2
  17. package/dist/domain-event-bus.js.map +1 -1
  18. package/dist/domain-event.js +7 -3
  19. package/dist/domain-event.js.map +1 -1
  20. package/dist/entity.js +8 -3
  21. package/dist/entity.js.map +1 -1
  22. package/dist/id.d.ts +3 -3
  23. package/dist/id.d.ts.map +1 -1
  24. package/dist/id.js +10 -6
  25. package/dist/id.js.map +1 -1
  26. package/dist/index.d.ts +0 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +39 -17
  29. package/dist/index.js.map +1 -1
  30. package/dist/mapper.js +5 -1
  31. package/dist/mapper.js.map +1 -1
  32. package/dist/paginated-result.js +7 -3
  33. package/dist/paginated-result.js.map +1 -1
  34. package/dist/repository/base-repository.js +11 -4
  35. package/dist/repository/base-repository.js.map +1 -1
  36. package/dist/repository/in-memory-repository.js +8 -4
  37. package/dist/repository/in-memory-repository.js.map +1 -1
  38. package/dist/repository/index.d.ts +1 -37
  39. package/dist/repository/index.d.ts.map +1 -1
  40. package/dist/repository/index.js +26 -40
  41. package/dist/repository/index.js.map +1 -1
  42. package/dist/repository/unit-of-work.js +9 -3
  43. package/dist/repository/unit-of-work.js.map +1 -1
  44. package/dist/types/criteria.d.ts +2 -2
  45. package/dist/types/criteria.d.ts.map +1 -1
  46. package/dist/types/criteria.js +4 -1
  47. package/dist/types/criteria.js.map +1 -1
  48. package/dist/types/domain.js +2 -1
  49. package/dist/types/history-tracker.js +2 -1
  50. package/dist/types/index.js +22 -6
  51. package/dist/types/index.js.map +1 -1
  52. package/dist/types/standard-schema.js +2 -1
  53. package/dist/types/unit-of-work.js +2 -1
  54. package/dist/types/utils.js +2 -1
  55. package/dist/validation-error.js +9 -3
  56. package/dist/validation-error.js.map +1 -1
  57. package/dist/value-object.js +9 -5
  58. package/dist/value-object.js.map +1 -1
  59. package/package.json +1 -1
  60. package/src/base-entity.ts +3 -2
  61. package/src/criteria.ts +2 -2
  62. package/src/deep-proxy.ts +435 -339
  63. package/src/id.ts +4 -4
  64. package/src/index.ts +1 -3
  65. package/src/repository/index.ts +1 -38
  66. package/src/types/criteria.ts +2 -2
  67. package/tests/entity-validation.test.ts +1 -1
  68. package/tests/history-tracker.spec.ts +57 -17
  69. package/tests/id.test.ts +341 -341
  70. package/tests/repository.test.ts +4 -2
  71. package/tests/to-json.test.ts +103 -91
  72. package/tests/value-objects.test.ts +52 -52
  73. package/tsconfig.json +2 -2
  74. package/dist/filtering.d.ts +0 -107
  75. package/dist/filtering.d.ts.map +0 -1
  76. package/dist/filtering.js +0 -202
  77. package/dist/filtering.js.map +0 -1
  78. package/dist/ordering.d.ts +0 -93
  79. package/dist/ordering.d.ts.map +0 -1
  80. package/dist/ordering.js +0 -154
  81. package/dist/ordering.js.map +0 -1
  82. package/dist/pagination.d.ts +0 -218
  83. package/dist/pagination.d.ts.map +0 -1
  84. package/dist/pagination.js +0 -281
  85. package/dist/pagination.js.map +0 -1
  86. package/dist/repository/mapper.d.ts +0 -56
  87. package/dist/repository/mapper.d.ts.map +0 -1
  88. package/dist/repository/mapper.js +0 -15
  89. package/dist/repository/mapper.js.map +0 -1
  90. package/dist/repository/types.d.ts +0 -87
  91. package/dist/repository/types.d.ts.map +0 -1
  92. package/dist/repository/types.js +0 -6
  93. package/dist/repository/types.js.map +0 -1
  94. package/dist/repository.d.ts +0 -2
  95. package/dist/repository.d.ts.map +0 -1
  96. package/dist/repository.js +0 -21
  97. package/dist/repository.js.map +0 -1
  98. package/dist/specification.d.ts +0 -102
  99. package/dist/specification.d.ts.map +0 -1
  100. package/dist/specification.js +0 -187
  101. package/dist/specification.js.map +0 -1
  102. package/dist/types/repository.d.ts +0 -43
  103. package/dist/types/repository.d.ts.map +0 -1
  104. package/dist/types/repository.js +0 -2
  105. package/dist/types/repository.js.map +0 -1
  106. package/dist/types.d.ts +0 -88
  107. package/dist/types.d.ts.map +0 -1
  108. package/dist/types.js +0 -12
  109. package/dist/types.js.map +0 -1
@@ -1,281 +0,0 @@
1
- "use strict";
2
- // ============================================================================
3
- // Pagination System
4
- // ============================================================================
5
- // Provides offset-based and cursor-based pagination capabilities
6
- // Can be used for in-memory pagination or converted to database-specific queries
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.PaginatedResult = exports.CursorPagination = exports.OffsetPagination = void 0;
9
- // ============================================================================
10
- // OffsetPagination Class
11
- // ============================================================================
12
- /**
13
- * Represents offset-based pagination (traditional page-based pagination)
14
- * Uses page number and page size to calculate offset
15
- *
16
- * @example
17
- * ```typescript
18
- * const pagination = new OffsetPagination(1, 20); // page 1, 20 items per page
19
- * const { skip, take } = pagination.getSkipTake();
20
- * ```
21
- */
22
- class OffsetPagination {
23
- constructor(page, pageSize) {
24
- if (page < 1) {
25
- throw new Error("Page must be greater than or equal to 1");
26
- }
27
- if (pageSize < 1) {
28
- throw new Error("Page size must be greater than or equal to 1");
29
- }
30
- this._page = page;
31
- this._pageSize = pageSize;
32
- }
33
- /**
34
- * Gets the current page number (1-indexed)
35
- */
36
- get page() {
37
- return this._page;
38
- }
39
- /**
40
- * Gets the page size
41
- */
42
- get pageSize() {
43
- return this._pageSize;
44
- }
45
- /**
46
- * Gets the type of pagination
47
- */
48
- get type() {
49
- return "offset";
50
- }
51
- /**
52
- * Calculates skip and take values for database queries
53
- */
54
- getSkipTake() {
55
- return {
56
- skip: (this._page - 1) * this._pageSize,
57
- take: this._pageSize,
58
- };
59
- }
60
- /**
61
- * Returns configuration object for serialization
62
- */
63
- toConfig() {
64
- return {
65
- type: "offset",
66
- page: this._page,
67
- pageSize: this._pageSize,
68
- };
69
- }
70
- /**
71
- * Applies pagination to an in-memory array
72
- */
73
- apply(items) {
74
- const { skip, take } = this.getSkipTake();
75
- return items.slice(skip, skip + take);
76
- }
77
- /**
78
- * Creates a new OffsetPagination for the next page
79
- */
80
- nextPage() {
81
- return new OffsetPagination(this._page + 1, this._pageSize);
82
- }
83
- /**
84
- * Creates a new OffsetPagination for the previous page
85
- */
86
- previousPage() {
87
- if (this._page <= 1) {
88
- throw new Error("Already on first page");
89
- }
90
- return new OffsetPagination(this._page - 1, this._pageSize);
91
- }
92
- }
93
- exports.OffsetPagination = OffsetPagination;
94
- // ============================================================================
95
- // CursorPagination Class
96
- // ============================================================================
97
- /**
98
- * Represents cursor-based pagination
99
- * Uses a cursor (typically an encoded string) to determine the starting point
100
- * More efficient for large datasets and real-time data
101
- *
102
- * @example
103
- * ```typescript
104
- * const pagination = new CursorPagination('cursor_abc123', 20);
105
- * ```
106
- */
107
- class CursorPagination {
108
- constructor(cursor, pageSize, direction = "forward") {
109
- if (pageSize < 1) {
110
- throw new Error("Page size must be greater than or equal to 1");
111
- }
112
- this._cursor = cursor;
113
- this._pageSize = pageSize;
114
- this._direction = direction;
115
- }
116
- /**
117
- * Gets the cursor (undefined for first page)
118
- */
119
- get cursor() {
120
- return this._cursor;
121
- }
122
- /**
123
- * Gets the page size
124
- */
125
- get pageSize() {
126
- return this._pageSize;
127
- }
128
- /**
129
- * Gets the pagination direction
130
- */
131
- get direction() {
132
- return this._direction;
133
- }
134
- /**
135
- * Gets the type of pagination
136
- */
137
- get type() {
138
- return "cursor";
139
- }
140
- /**
141
- * Checks if this is the first page (no cursor)
142
- */
143
- isFirstPage() {
144
- return this._cursor === undefined;
145
- }
146
- /**
147
- * Returns configuration object for serialization
148
- */
149
- toConfig() {
150
- return {
151
- type: "cursor",
152
- cursor: this._cursor,
153
- pageSize: this._pageSize,
154
- direction: this._direction,
155
- };
156
- }
157
- /**
158
- * Creates a new CursorPagination with a different cursor
159
- */
160
- withCursor(cursor) {
161
- return new CursorPagination(cursor, this._pageSize, this._direction);
162
- }
163
- /**
164
- * Creates a new CursorPagination for backward navigation
165
- */
166
- backward() {
167
- return new CursorPagination(this._cursor, this._pageSize, "backward");
168
- }
169
- /**
170
- * Creates a new CursorPagination for forward navigation
171
- */
172
- forward() {
173
- return new CursorPagination(this._cursor, this._pageSize, "forward");
174
- }
175
- }
176
- exports.CursorPagination = CursorPagination;
177
- /**
178
- * Represents a paginated result set
179
- * Contains the data items and metadata about the pagination
180
- *
181
- * @example
182
- * ```typescript
183
- * const result = new PaginatedResult(users, {
184
- * type: 'offset',
185
- * page: 1,
186
- * pageSize: 20,
187
- * total: 100,
188
- * totalPages: 5,
189
- * hasNextPage: true,
190
- * hasPreviousPage: false
191
- * });
192
- * ```
193
- */
194
- class PaginatedResult {
195
- constructor(data, meta) {
196
- this._data = data;
197
- this._meta = meta;
198
- }
199
- /**
200
- * Gets the data items
201
- */
202
- get data() {
203
- return this._data;
204
- }
205
- /**
206
- * Gets the pagination metadata
207
- */
208
- get meta() {
209
- return this._meta;
210
- }
211
- /**
212
- * Gets the count of items in current page
213
- */
214
- get count() {
215
- return this._data.length;
216
- }
217
- /**
218
- * Checks if there is a next page
219
- */
220
- hasNextPage() {
221
- return this._meta.hasNextPage;
222
- }
223
- /**
224
- * Checks if there is a previous page
225
- */
226
- hasPreviousPage() {
227
- return this._meta.hasPreviousPage;
228
- }
229
- /**
230
- * Maps the data items to a new type
231
- */
232
- map(fn) {
233
- return new PaginatedResult(this._data.map(fn), this._meta);
234
- }
235
- /**
236
- * Converts to plain object for serialization
237
- */
238
- toJson() {
239
- return {
240
- data: this._data,
241
- meta: this._meta,
242
- };
243
- }
244
- /**
245
- * Creates an offset-based paginated result from an array and pagination config
246
- * Automatically calculates metadata
247
- */
248
- static fromArray(allItems, pagination) {
249
- const { skip, take } = pagination.getSkipTake();
250
- const data = allItems.slice(skip, skip + take);
251
- const total = allItems.length;
252
- const totalPages = Math.ceil(total / pagination.pageSize);
253
- const meta = {
254
- type: "offset",
255
- page: pagination.page,
256
- pageSize: pagination.pageSize,
257
- total,
258
- totalPages,
259
- hasNextPage: pagination.page < totalPages,
260
- hasPreviousPage: pagination.page > 1,
261
- };
262
- return new PaginatedResult(data, meta);
263
- }
264
- /**
265
- * Creates a cursor-based paginated result
266
- * Requires cursors to be calculated externally
267
- */
268
- static fromCursor(data, pagination, nextCursor, previousCursor) {
269
- const meta = {
270
- type: "cursor",
271
- pageSize: pagination.pageSize,
272
- hasNextPage: nextCursor !== undefined,
273
- hasPreviousPage: previousCursor !== undefined,
274
- nextCursor,
275
- previousCursor,
276
- };
277
- return new PaginatedResult(data, meta);
278
- }
279
- }
280
- exports.PaginatedResult = PaginatedResult;
281
- //# sourceMappingURL=pagination.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"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"}
@@ -1,56 +0,0 @@
1
- import type { Aggregate } from "../entity";
2
- /**
3
- * Mapper interface for converting between Domain and Persistence models
4
- *
5
- * @template TDomain - Domain aggregate/entity
6
- * @template TPersistence - Database model (Prisma, TypeORM, etc.)
7
- *
8
- * @example
9
- * ```ts
10
- * class UserMapper implements IMapper<User, PrismaUser> {
11
- * toDomain(persistence: PrismaUser): User {
12
- * return new User({
13
- * id: Id.from(persistence.id),
14
- * name: persistence.name,
15
- * email: persistence.email,
16
- * });
17
- * }
18
- *
19
- * toPersistence(domain: User): PrismaUser {
20
- * return {
21
- * id: domain.id.value,
22
- * name: domain.props.name,
23
- * email: domain.props.email,
24
- * };
25
- * }
26
- * }
27
- * ```
28
- */
29
- export interface IMapper<TDomain extends Aggregate<any>, TPersistence = any> {
30
- /**
31
- * Convert from persistence model to domain aggregate
32
- */
33
- toDomain(persistence: TPersistence): TDomain;
34
- /**
35
- * Convert from domain aggregate to persistence model
36
- */
37
- toPersistence(domain: TDomain): TPersistence;
38
- /**
39
- * Convert array of persistence models to domain aggregates
40
- */
41
- toDomainList?(persistence: TPersistence[]): TDomain[];
42
- /**
43
- * Convert array of domain aggregates to persistence models
44
- */
45
- toPersistenceList?(domain: TDomain[]): TPersistence[];
46
- }
47
- /**
48
- * Base mapper with default array implementations
49
- */
50
- export declare abstract class BaseMapper<TDomain extends Aggregate<any>, TPersistence = any> implements IMapper<TDomain, TPersistence> {
51
- abstract toDomain(persistence: TPersistence): TDomain;
52
- abstract toPersistence(domain: TDomain): TPersistence;
53
- toDomainList(persistence: TPersistence[]): TDomain[];
54
- toPersistenceList(domain: TDomain[]): TPersistence[];
55
- }
56
- //# sourceMappingURL=mapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../src/repository/mapper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,OAAO,CAAC,OAAO,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,GAAG;IACzE;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,YAAY,GAAG,OAAO,CAAC;IAE7C;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,CAAC;IAE7C;;OAEG;IACH,YAAY,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAAC;IAEtD;;OAEG;IACH,iBAAiB,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;CACvD;AAED;;GAEG;AACH,8BAAsB,UAAU,CAC9B,OAAO,SAAS,SAAS,CAAC,GAAG,CAAC,EAC9B,YAAY,GAAG,GAAG,CAClB,YAAW,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC;IAEzC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,GAAG,OAAO;IACrD,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY;IAErD,YAAY,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE;IAIpD,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE;CAGrD"}
@@ -1,15 +0,0 @@
1
- // ============================================================================
2
- // Mapper - Domain ↔ Persistence
3
- // ============================================================================
4
- /**
5
- * Base mapper with default array implementations
6
- */
7
- export class BaseMapper {
8
- toDomainList(persistence) {
9
- return persistence.map((p) => this.toDomain(p));
10
- }
11
- toPersistenceList(domain) {
12
- return domain.map((d) => this.toPersistence(d));
13
- }
14
- }
15
- //# sourceMappingURL=mapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../src/repository/mapper.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAqD/E;;GAEG;AACH,MAAM,OAAgB,UAAU;IAQ9B,YAAY,CAAC,WAA2B;QACtC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,iBAAiB,CAAC,MAAiB;QACjC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -1,87 +0,0 @@
1
- import type { Id } from "../id";
2
- import type { Aggregate } from "../entity";
3
- import type { Criteria } from "../criteria";
4
- import type { PaginatedResult } from "../paginated-result";
5
- /**
6
- * Base repository interface
7
- * Keep it minimal - only what you actually need
8
- */
9
- export interface IRepository<TDomain extends Aggregate<any>> {
10
- /**
11
- * Find by ID
12
- */
13
- findById(id: Id): Promise<TDomain | null>;
14
- /**
15
- * Find using criteria (filtering, ordering, pagination)
16
- */
17
- find(criteria: Criteria<TDomain>): Promise<PaginatedResult<TDomain>>;
18
- /**
19
- * Find all (with optional criteria)
20
- */
21
- findAll(criteria?: Criteria<TDomain>): Promise<TDomain[]>;
22
- /**
23
- * Find one (first matching criteria)
24
- */
25
- findOne(criteria: Criteria<TDomain>): Promise<TDomain | null>;
26
- /**
27
- * Save (insert or update based on aggregate.isNew)
28
- */
29
- save(aggregate: TDomain): Promise<void>;
30
- /**
31
- * Save multiple aggregates
32
- */
33
- saveMany(aggregates: TDomain[]): Promise<void>;
34
- /**
35
- * Delete aggregate
36
- */
37
- delete(aggregate: TDomain): Promise<void>;
38
- /**
39
- * Delete by ID
40
- */
41
- deleteById(id: Id): Promise<void>;
42
- /**
43
- * Check if exists
44
- */
45
- exists(id: Id): Promise<boolean>;
46
- /**
47
- * Count matching criteria
48
- */
49
- count(criteria?: Criteria<TDomain>): Promise<number>;
50
- }
51
- /**
52
- * Transaction context for Unit of Work
53
- */
54
- export interface TransactionContext {
55
- /**
56
- * Commit all changes
57
- */
58
- commit(): Promise<void>;
59
- /**
60
- * Rollback all changes
61
- */
62
- rollback(): Promise<void>;
63
- /**
64
- * Check if transaction is active
65
- */
66
- isActive(): boolean;
67
- }
68
- /**
69
- * Unit of Work interface
70
- * Manages transactions across multiple repositories
71
- */
72
- export interface IUnitOfWork {
73
- /**
74
- * Start a new transaction
75
- */
76
- begin(): Promise<TransactionContext>;
77
- /**
78
- * Execute work within a transaction
79
- * Auto-commits on success, rolls back on error
80
- */
81
- transaction<T>(work: (ctx: TransactionContext) => Promise<T>): Promise<T>;
82
- /**
83
- * Get repository within transaction context
84
- */
85
- getRepository<TDomain extends Aggregate<any>>(repository: new (...args: any[]) => IRepository<TDomain>): IRepository<TDomain>;
86
- }
87
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/repository/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,OAAO,SAAS,SAAS,CAAC,GAAG,CAAC;IACzD;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAErE;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAE1D;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAE9D;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAErC;;;OAGG;IACH,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAE1E;;OAEG;IACH,aAAa,CAAC,OAAO,SAAS,SAAS,CAAC,GAAG,CAAC,EAC1C,UAAU,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,WAAW,CAAC,OAAO,CAAC,GACvD,WAAW,CAAC,OAAO,CAAC,CAAC;CACzB"}
@@ -1,6 +0,0 @@
1
- "use strict";
2
- // ============================================================================
3
- // Repository Types - Simple and Type-Safe
4
- // ============================================================================
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/repository/types.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,0CAA0C;AAC1C,+EAA+E"}
@@ -1,2 +0,0 @@
1
- export * from "./repository/index";
2
- //# sourceMappingURL=repository.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"AAIA,cAAc,oBAAoB,CAAC"}
@@ -1,21 +0,0 @@
1
- "use strict";
2
- // ============================================================================
3
- // Repository - Main export (backward compatibility)
4
- // ============================================================================
5
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- var desc = Object.getOwnPropertyDescriptor(m, k);
8
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
- desc = { enumerable: true, get: function() { return m[k]; } };
10
- }
11
- Object.defineProperty(o, k2, desc);
12
- }) : (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- o[k2] = m[k];
15
- }));
16
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
- };
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- __exportStar(require("./repository/index"), exports);
21
- //# sourceMappingURL=repository.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,oDAAoD;AACpD,+EAA+E;;;;;;;;;;;;;;;;AAE/E,qDAAmC"}
@@ -1,102 +0,0 @@
1
- import type { BaseProps } from "./types";
2
- /**
3
- * Abstract base class for Specification pattern
4
- * Specifications encapsulate business rules and can be composed together
5
- *
6
- * @example
7
- * ```typescript
8
- * class AdultSpecification extends BaseSpecification<User> {
9
- * isSatisfiedBy(user: User): boolean {
10
- * return user.age >= 18;
11
- * }
12
- * }
13
- *
14
- * const spec = new AdultSpecification();
15
- * const adults = users.filter(u => spec.isSatisfiedBy(u));
16
- * ```
17
- */
18
- export declare abstract class BaseSpecification<T extends BaseProps> {
19
- /**
20
- * Checks if the given entity satisfies this specification
21
- * Must be implemented by concrete specifications
22
- */
23
- abstract isSatisfiedBy(entity: T): boolean;
24
- /**
25
- * Combines this specification with another using AND logic
26
- * Both specifications must be satisfied
27
- */
28
- and(other: BaseSpecification<T>): BaseSpecification<T>;
29
- /**
30
- * Combines this specification with another using OR logic
31
- * At least one specification must be satisfied
32
- */
33
- or(other: BaseSpecification<T>): BaseSpecification<T>;
34
- /**
35
- * Negates this specification
36
- * Returns true if this specification is NOT satisfied
37
- */
38
- not(): BaseSpecification<T>;
39
- /**
40
- * Creates a predicate function for use with Array.filter()
41
- */
42
- asPredicate(): (entity: T) => boolean;
43
- }
44
- /**
45
- * Specification that is always satisfied
46
- * Useful as a starting point for building complex specifications
47
- */
48
- export declare class TrueSpecification<T extends BaseProps> extends BaseSpecification<T> {
49
- isSatisfiedBy(_entity: T): boolean;
50
- }
51
- /**
52
- * Specification that is never satisfied
53
- * Useful for testing or as a placeholder
54
- */
55
- export declare class FalseSpecification<T extends BaseProps> extends BaseSpecification<T> {
56
- isSatisfiedBy(_entity: T): boolean;
57
- }
58
- /**
59
- * Specification based on a predicate function
60
- * Allows creating specifications from lambda expressions
61
- *
62
- * @example
63
- * ```typescript
64
- * const adultSpec = new PredicateSpecification<User>(
65
- * user => user.age >= 18
66
- * );
67
- * ```
68
- */
69
- export declare class PredicateSpecification<T extends BaseProps> extends BaseSpecification<T> {
70
- private readonly predicate;
71
- constructor(predicate: (entity: T) => boolean);
72
- isSatisfiedBy(entity: T): boolean;
73
- }
74
- /**
75
- * Specification that checks if a property equals a specific value
76
- *
77
- * @example
78
- * ```typescript
79
- * const activeSpec = new PropertyEqualsSpecification<User>('status', 'active');
80
- * ```
81
- */
82
- export declare class PropertyEqualsSpecification<T extends BaseProps> extends BaseSpecification<T> {
83
- private readonly property;
84
- private readonly value;
85
- constructor(property: keyof T, value: any);
86
- isSatisfiedBy(entity: T): boolean;
87
- }
88
- /**
89
- * Specification that checks if a property is in a set of values
90
- *
91
- * @example
92
- * ```typescript
93
- * const validStatusSpec = new PropertyInSpecification<User>('status', ['active', 'pending']);
94
- * ```
95
- */
96
- export declare class PropertyInSpecification<T extends BaseProps> extends BaseSpecification<T> {
97
- private readonly property;
98
- private readonly values;
99
- constructor(property: keyof T, values: any[]);
100
- isSatisfiedBy(entity: T): boolean;
101
- }
102
- //# sourceMappingURL=specification.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"specification.d.ts","sourceRoot":"","sources":["../src/specification.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMzC;;;;;;;;;;;;;;;GAeG;AACH,8BAAsB,iBAAiB,CAAC,CAAC,SAAS,SAAS;IACzD;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO;IAE1C;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAItD;;;OAGG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAIrD;;;OAGG;IACH,GAAG,IAAI,iBAAiB,CAAC,CAAC,CAAC;IAI3B;;OAEG;IACH,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO;CAGtC;AA4DD;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,iBAAiB,CAAC,CAAC,CAAC;IAC9E,aAAa,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;CAGnC;AAED;;;GAGG;AACH,qBAAa,kBAAkB,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,iBAAiB,CAAC,CAAC,CAAC;IAC/E,aAAa,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;CAGnC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,sBAAsB,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,iBAAiB,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO;IAI9D,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO;CAGlC;AAED;;;;;;;GAOG;AACH,qBAAa,2BAA2B,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,iBAAiB,CAAC,CAAC,CAAC;IAEtF,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,QAAQ,EAAE,MAAM,CAAC,EACjB,KAAK,EAAE,GAAG;IAK7B,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO;CAGlC;AAED;;;;;;;GAOG;AACH,qBAAa,uBAAuB,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,iBAAiB,CAAC,CAAC,CAAC;IAElF,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,QAAQ,EAAE,MAAM,CAAC,EACjB,MAAM,EAAE,GAAG,EAAE;IAKhC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO;CAGlC"}