@woltz/rich-domain 0.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 (178) hide show
  1. package/.github/workflows/ci.yml +40 -0
  2. package/.husky/commit-msg +1 -0
  3. package/.husky/pre-commit +1 -0
  4. package/.versionrc.json +21 -0
  5. package/.vscode/settings.json +3 -0
  6. package/CHANGELOG.md +81 -0
  7. package/LICENSE +21 -0
  8. package/README.md +712 -0
  9. package/commitlint.config.js +23 -0
  10. package/dist/base-entity.d.ts +67 -0
  11. package/dist/base-entity.d.ts.map +1 -0
  12. package/dist/base-entity.js +309 -0
  13. package/dist/base-entity.js.map +1 -0
  14. package/dist/constants.d.ts +3 -0
  15. package/dist/constants.d.ts.map +1 -0
  16. package/dist/constants.js +6 -0
  17. package/dist/constants.js.map +1 -0
  18. package/dist/criteria.d.ts +60 -0
  19. package/dist/criteria.d.ts.map +1 -0
  20. package/dist/criteria.js +214 -0
  21. package/dist/criteria.js.map +1 -0
  22. package/dist/deep-proxy.d.ts +34 -0
  23. package/dist/deep-proxy.d.ts.map +1 -0
  24. package/dist/deep-proxy.js +297 -0
  25. package/dist/deep-proxy.js.map +1 -0
  26. package/dist/domain-event-bus.d.ts +57 -0
  27. package/dist/domain-event-bus.d.ts.map +1 -0
  28. package/dist/domain-event-bus.js +112 -0
  29. package/dist/domain-event-bus.js.map +1 -0
  30. package/dist/domain-event.d.ts +55 -0
  31. package/dist/domain-event.d.ts.map +1 -0
  32. package/dist/domain-event.js +42 -0
  33. package/dist/domain-event.js.map +1 -0
  34. package/dist/entity.d.ts +13 -0
  35. package/dist/entity.d.ts.map +1 -0
  36. package/dist/entity.js +15 -0
  37. package/dist/entity.js.map +1 -0
  38. package/dist/filtering.d.ts +107 -0
  39. package/dist/filtering.d.ts.map +1 -0
  40. package/dist/filtering.js +202 -0
  41. package/dist/filtering.js.map +1 -0
  42. package/dist/id.d.ts +51 -0
  43. package/dist/id.d.ts.map +1 -0
  44. package/dist/id.js +84 -0
  45. package/dist/id.js.map +1 -0
  46. package/dist/index.d.ts +15 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +25 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/ordering.d.ts +93 -0
  51. package/dist/ordering.d.ts.map +1 -0
  52. package/dist/ordering.js +154 -0
  53. package/dist/ordering.js.map +1 -0
  54. package/dist/paginated-result.d.ts +62 -0
  55. package/dist/paginated-result.d.ts.map +1 -0
  56. package/dist/paginated-result.js +201 -0
  57. package/dist/paginated-result.js.map +1 -0
  58. package/dist/pagination.d.ts +218 -0
  59. package/dist/pagination.d.ts.map +1 -0
  60. package/dist/pagination.js +281 -0
  61. package/dist/pagination.js.map +1 -0
  62. package/dist/repository/base-repository.d.ts +77 -0
  63. package/dist/repository/base-repository.d.ts.map +1 -0
  64. package/dist/repository/base-repository.js +80 -0
  65. package/dist/repository/base-repository.js.map +1 -0
  66. package/dist/repository/in-memory-repository.d.ts +46 -0
  67. package/dist/repository/in-memory-repository.d.ts.map +1 -0
  68. package/dist/repository/in-memory-repository.js +85 -0
  69. package/dist/repository/in-memory-repository.js.map +1 -0
  70. package/dist/repository/index.d.ts +42 -0
  71. package/dist/repository/index.d.ts.map +1 -0
  72. package/dist/repository/index.js +47 -0
  73. package/dist/repository/index.js.map +1 -0
  74. package/dist/repository/mapper.d.ts +56 -0
  75. package/dist/repository/mapper.d.ts.map +1 -0
  76. package/dist/repository/mapper.js +15 -0
  77. package/dist/repository/mapper.js.map +1 -0
  78. package/dist/repository/types.d.ts +87 -0
  79. package/dist/repository/types.d.ts.map +1 -0
  80. package/dist/repository/types.js +6 -0
  81. package/dist/repository/types.js.map +1 -0
  82. package/dist/repository/unit-of-work.d.ts +70 -0
  83. package/dist/repository/unit-of-work.d.ts.map +1 -0
  84. package/dist/repository/unit-of-work.js +122 -0
  85. package/dist/repository/unit-of-work.js.map +1 -0
  86. package/dist/repository.d.ts +2 -0
  87. package/dist/repository.d.ts.map +1 -0
  88. package/dist/repository.js +21 -0
  89. package/dist/repository.js.map +1 -0
  90. package/dist/specification.d.ts +102 -0
  91. package/dist/specification.d.ts.map +1 -0
  92. package/dist/specification.js +187 -0
  93. package/dist/specification.js.map +1 -0
  94. package/dist/types/criteria.d.ts +35 -0
  95. package/dist/types/criteria.d.ts.map +1 -0
  96. package/dist/types/criteria.js +17 -0
  97. package/dist/types/criteria.js.map +1 -0
  98. package/dist/types/domain.d.ts +30 -0
  99. package/dist/types/domain.d.ts.map +1 -0
  100. package/dist/types/domain.js +2 -0
  101. package/dist/types/domain.js.map +1 -0
  102. package/dist/types/history-tracker.d.ts +36 -0
  103. package/dist/types/history-tracker.d.ts.map +1 -0
  104. package/dist/types/history-tracker.js +2 -0
  105. package/dist/types/history-tracker.js.map +1 -0
  106. package/dist/types/index.d.ts +8 -0
  107. package/dist/types/index.d.ts.map +1 -0
  108. package/dist/types/index.js +8 -0
  109. package/dist/types/index.js.map +1 -0
  110. package/dist/types/repository.d.ts +43 -0
  111. package/dist/types/repository.d.ts.map +1 -0
  112. package/dist/types/repository.js +2 -0
  113. package/dist/types/repository.js.map +1 -0
  114. package/dist/types/standard-schema.d.ts +15 -0
  115. package/dist/types/standard-schema.d.ts.map +1 -0
  116. package/dist/types/standard-schema.js +2 -0
  117. package/dist/types/standard-schema.js.map +1 -0
  118. package/dist/types/unit-of-work.d.ts +39 -0
  119. package/dist/types/unit-of-work.d.ts.map +1 -0
  120. package/dist/types/unit-of-work.js +2 -0
  121. package/dist/types/unit-of-work.js.map +1 -0
  122. package/dist/types/utils.d.ts +14 -0
  123. package/dist/types/utils.d.ts.map +1 -0
  124. package/dist/types/utils.js +2 -0
  125. package/dist/types/utils.js.map +1 -0
  126. package/dist/types.d.ts +88 -0
  127. package/dist/types.d.ts.map +1 -0
  128. package/dist/types.js +12 -0
  129. package/dist/types.js.map +1 -0
  130. package/dist/validation-error.d.ts +42 -0
  131. package/dist/validation-error.d.ts.map +1 -0
  132. package/dist/validation-error.js +73 -0
  133. package/dist/validation-error.js.map +1 -0
  134. package/dist/value-object.d.ts +47 -0
  135. package/dist/value-object.d.ts.map +1 -0
  136. package/dist/value-object.js +136 -0
  137. package/dist/value-object.js.map +1 -0
  138. package/eslint.config.js +51 -0
  139. package/jest.config.js +21 -0
  140. package/package.json +58 -0
  141. package/src/base-entity.ts +401 -0
  142. package/src/constants.ts +7 -0
  143. package/src/criteria.ts +291 -0
  144. package/src/deep-proxy.ts +339 -0
  145. package/src/domain-event-bus.ts +166 -0
  146. package/src/domain-event.ts +90 -0
  147. package/src/entity.ts +16 -0
  148. package/src/id.ts +94 -0
  149. package/src/index.ts +33 -0
  150. package/src/paginated-result.ts +274 -0
  151. package/src/repository/base-repository.ts +152 -0
  152. package/src/repository/in-memory-repository.ts +104 -0
  153. package/src/repository/index.ts +55 -0
  154. package/src/repository/mapper.ts +74 -0
  155. package/src/repository/unit-of-work.ts +148 -0
  156. package/src/types/criteria.ts +79 -0
  157. package/src/types/domain.ts +37 -0
  158. package/src/types/history-tracker.ts +45 -0
  159. package/src/types/index.ts +7 -0
  160. package/src/types/repository.ts +51 -0
  161. package/src/types/standard-schema.ts +19 -0
  162. package/src/types/unit-of-work.ts +46 -0
  163. package/src/types/utils.ts +29 -0
  164. package/src/validation-error.ts +97 -0
  165. package/src/value-object.ts +187 -0
  166. package/tests/criteria.test.ts +432 -0
  167. package/tests/domain-events.test.ts +445 -0
  168. package/tests/entity-equality.test.ts +487 -0
  169. package/tests/entity-validation.test.ts +339 -0
  170. package/tests/entity.test.ts +33 -0
  171. package/tests/history-tracker.spec.ts +667 -0
  172. package/tests/id.test.ts +341 -0
  173. package/tests/repository.test.ts +641 -0
  174. package/tests/to-json.test.ts +91 -0
  175. package/tests/utils.ts +151 -0
  176. package/tests/value-object-validation.test.ts +228 -0
  177. package/tests/value-objects.test.ts +52 -0
  178. package/tsconfig.json +31 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginated-result.js","sourceRoot":"","sources":["../src/paginated-result.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Type of pagination strategy
3
+ */
4
+ export type PaginationType = "offset" | "cursor";
5
+ /**
6
+ * Configuration for offset-based pagination
7
+ */
8
+ export interface OffsetPaginationConfig {
9
+ type: "offset";
10
+ page: number;
11
+ pageSize: number;
12
+ }
13
+ /**
14
+ * Configuration for cursor-based pagination
15
+ */
16
+ export interface CursorPaginationConfig {
17
+ type: "cursor";
18
+ cursor?: string;
19
+ pageSize: number;
20
+ direction?: "forward" | "backward";
21
+ }
22
+ /**
23
+ * Union type for all pagination configurations
24
+ */
25
+ export type PaginationConfig = OffsetPaginationConfig | CursorPaginationConfig;
26
+ /**
27
+ * Represents offset-based pagination (traditional page-based pagination)
28
+ * Uses page number and page size to calculate offset
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const pagination = new OffsetPagination(1, 20); // page 1, 20 items per page
33
+ * const { skip, take } = pagination.getSkipTake();
34
+ * ```
35
+ */
36
+ export declare class OffsetPagination {
37
+ private readonly _page;
38
+ private readonly _pageSize;
39
+ constructor(page: number, pageSize: number);
40
+ /**
41
+ * Gets the current page number (1-indexed)
42
+ */
43
+ get page(): number;
44
+ /**
45
+ * Gets the page size
46
+ */
47
+ get pageSize(): number;
48
+ /**
49
+ * Gets the type of pagination
50
+ */
51
+ get type(): PaginationType;
52
+ /**
53
+ * Calculates skip and take values for database queries
54
+ */
55
+ getSkipTake(): {
56
+ skip: number;
57
+ take: number;
58
+ };
59
+ /**
60
+ * Returns configuration object for serialization
61
+ */
62
+ toConfig(): OffsetPaginationConfig;
63
+ /**
64
+ * Applies pagination to an in-memory array
65
+ */
66
+ apply<T>(items: T[]): T[];
67
+ /**
68
+ * Creates a new OffsetPagination for the next page
69
+ */
70
+ nextPage(): OffsetPagination;
71
+ /**
72
+ * Creates a new OffsetPagination for the previous page
73
+ */
74
+ previousPage(): OffsetPagination;
75
+ }
76
+ /**
77
+ * Represents cursor-based pagination
78
+ * Uses a cursor (typically an encoded string) to determine the starting point
79
+ * More efficient for large datasets and real-time data
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const pagination = new CursorPagination('cursor_abc123', 20);
84
+ * ```
85
+ */
86
+ export declare class CursorPagination {
87
+ private readonly _cursor?;
88
+ private readonly _pageSize;
89
+ private readonly _direction;
90
+ constructor(cursor: string | undefined, pageSize: number, direction?: "forward" | "backward");
91
+ /**
92
+ * Gets the cursor (undefined for first page)
93
+ */
94
+ get cursor(): string | undefined;
95
+ /**
96
+ * Gets the page size
97
+ */
98
+ get pageSize(): number;
99
+ /**
100
+ * Gets the pagination direction
101
+ */
102
+ get direction(): "forward" | "backward";
103
+ /**
104
+ * Gets the type of pagination
105
+ */
106
+ get type(): PaginationType;
107
+ /**
108
+ * Checks if this is the first page (no cursor)
109
+ */
110
+ isFirstPage(): boolean;
111
+ /**
112
+ * Returns configuration object for serialization
113
+ */
114
+ toConfig(): CursorPaginationConfig;
115
+ /**
116
+ * Creates a new CursorPagination with a different cursor
117
+ */
118
+ withCursor(cursor: string | undefined): CursorPagination;
119
+ /**
120
+ * Creates a new CursorPagination for backward navigation
121
+ */
122
+ backward(): CursorPagination;
123
+ /**
124
+ * Creates a new CursorPagination for forward navigation
125
+ */
126
+ forward(): CursorPagination;
127
+ }
128
+ /**
129
+ * Metadata for offset-based pagination results
130
+ */
131
+ export interface OffsetPaginationMeta {
132
+ type: "offset";
133
+ page: number;
134
+ pageSize: number;
135
+ total: number;
136
+ totalPages: number;
137
+ hasNextPage: boolean;
138
+ hasPreviousPage: boolean;
139
+ }
140
+ /**
141
+ * Metadata for cursor-based pagination results
142
+ */
143
+ export interface CursorPaginationMeta {
144
+ type: "cursor";
145
+ pageSize: number;
146
+ hasNextPage: boolean;
147
+ hasPreviousPage: boolean;
148
+ nextCursor?: string;
149
+ previousCursor?: string;
150
+ }
151
+ /**
152
+ * Union type for pagination metadata
153
+ */
154
+ export type PaginationMeta = OffsetPaginationMeta | CursorPaginationMeta;
155
+ /**
156
+ * Represents a paginated result set
157
+ * Contains the data items and metadata about the pagination
158
+ *
159
+ * @example
160
+ * ```typescript
161
+ * const result = new PaginatedResult(users, {
162
+ * type: 'offset',
163
+ * page: 1,
164
+ * pageSize: 20,
165
+ * total: 100,
166
+ * totalPages: 5,
167
+ * hasNextPage: true,
168
+ * hasPreviousPage: false
169
+ * });
170
+ * ```
171
+ */
172
+ export declare class PaginatedResult<T> {
173
+ private readonly _data;
174
+ private readonly _meta;
175
+ constructor(data: T[], meta: PaginationMeta);
176
+ /**
177
+ * Gets the data items
178
+ */
179
+ get data(): readonly T[];
180
+ /**
181
+ * Gets the pagination metadata
182
+ */
183
+ get meta(): PaginationMeta;
184
+ /**
185
+ * Gets the count of items in current page
186
+ */
187
+ get count(): number;
188
+ /**
189
+ * Checks if there is a next page
190
+ */
191
+ hasNextPage(): boolean;
192
+ /**
193
+ * Checks if there is a previous page
194
+ */
195
+ hasPreviousPage(): boolean;
196
+ /**
197
+ * Maps the data items to a new type
198
+ */
199
+ map<U>(fn: (item: T) => U): PaginatedResult<U>;
200
+ /**
201
+ * Converts to plain object for serialization
202
+ */
203
+ toJson(): {
204
+ data: T[];
205
+ meta: PaginationMeta;
206
+ };
207
+ /**
208
+ * Creates an offset-based paginated result from an array and pagination config
209
+ * Automatically calculates metadata
210
+ */
211
+ static fromArray<T>(allItems: T[], pagination: OffsetPagination): PaginatedResult<T>;
212
+ /**
213
+ * Creates a cursor-based paginated result
214
+ * Requires cursors to be calculated externally
215
+ */
216
+ static fromCursor<T>(data: T[], pagination: CursorPagination, nextCursor?: string, previousCursor?: string): PaginatedResult<T>;
217
+ }
218
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,281 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { Id } from "../id";
2
+ import type { Aggregate } from "../entity";
3
+ import type { Criteria } from "../criteria";
4
+ import { PaginatedResult } from "../paginated-result";
5
+ import type { IRepository } from "../types";
6
+ import type { IMapper } from "./mapper";
7
+ /**
8
+ * Abstract base repository
9
+ * Implements common logic, delegates persistence to subclasses
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * class UserRepository extends BaseRepository<User, PrismaUser> {
14
+ * constructor(prisma: PrismaClient) {
15
+ * super(new UserMapper());
16
+ * this.prisma = prisma;
17
+ * }
18
+ *
19
+ * protected async insertOne(data: PrismaUser): Promise<PrismaUser> {
20
+ * return this.prisma.user.create({ data });
21
+ * }
22
+ *
23
+ * protected async updateOne(id: string, data: PrismaUser): Promise<PrismaUser> {
24
+ * return this.prisma.user.update({ where: { id }, data });
25
+ * }
26
+ *
27
+ * // ... implement other abstract methods
28
+ * }
29
+ * ```
30
+ */
31
+ export declare abstract class BaseRepository<TDomain extends Aggregate<any>, TPersistence = any> implements IRepository<TDomain> {
32
+ protected readonly mapper: IMapper<TDomain, TPersistence>;
33
+ constructor(mapper: IMapper<TDomain, TPersistence>);
34
+ /**
35
+ * Insert new record in database
36
+ */
37
+ protected abstract insertOne(data: TPersistence): Promise<TPersistence>;
38
+ /**
39
+ * Update existing record in database
40
+ */
41
+ protected abstract updateOne(id: string, data: TPersistence): Promise<TPersistence>;
42
+ /**
43
+ * Delete record from database
44
+ */
45
+ protected abstract deleteOne(id: string): Promise<void>;
46
+ /**
47
+ * Find record by ID in database
48
+ */
49
+ protected abstract findOneById(id: string): Promise<TDomain | null>;
50
+ /**
51
+ * Find all records in database (no filtering)
52
+ */
53
+ protected abstract findMany(): Promise<TDomain[]>;
54
+ /**
55
+ * Apply criteria to query (filtering, ordering, pagination)
56
+ * Returns [data, total]
57
+ */
58
+ protected abstract applyCriteria(criteria: Criteria<TDomain>): Promise<PaginatedResult<TDomain>>;
59
+ /**
60
+ * Count records matching criteria
61
+ */
62
+ protected abstract countByCriteria(criteria?: Criteria<TDomain>): Promise<number>;
63
+ /**
64
+ * Check if record exists by ID
65
+ */
66
+ protected abstract existsById(id: string): Promise<boolean>;
67
+ findById(id: Id): Promise<TDomain | null>;
68
+ find(criteria: Criteria<TDomain>): Promise<PaginatedResult<TDomain>>;
69
+ findAll(criteria?: Criteria<TDomain>): Promise<TDomain[]>;
70
+ findOne(criteria: Criteria<TDomain>): Promise<TDomain | null>;
71
+ save(aggregate: TDomain): Promise<void>;
72
+ delete(aggregate: TDomain): Promise<void>;
73
+ deleteById(id: Id): Promise<void>;
74
+ exists(id: Id): Promise<boolean>;
75
+ count(criteria?: Criteria<TDomain>): Promise<number>;
76
+ }
77
+ //# sourceMappingURL=base-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-repository.d.ts","sourceRoot":"","sources":["../../src/repository/base-repository.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,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,8BAAsB,cAAc,CAClC,OAAO,SAAS,SAAS,CAAC,GAAG,CAAC,EAC9B,YAAY,GAAG,GAAG,CAClB,YAAW,WAAW,CAAC,OAAO,CAAC;IAEnB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC;gBAAtC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC;IAMrE;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAEvE;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAC1B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,YAAY,CAAC;IAExB;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAEnE;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAEjD;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,CAC9B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAC1B,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAEpC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,CAChC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAC3B,OAAO,CAAC,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrD,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAMzC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAIpE,OAAO,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAUzD,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAQ7D,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvC,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAG3D"}
@@ -0,0 +1,80 @@
1
+ // ============================================================================
2
+ // Base Repository - Abstract implementation with common logic
3
+ // ============================================================================
4
+ /**
5
+ * Abstract base repository
6
+ * Implements common logic, delegates persistence to subclasses
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * class UserRepository extends BaseRepository<User, PrismaUser> {
11
+ * constructor(prisma: PrismaClient) {
12
+ * super(new UserMapper());
13
+ * this.prisma = prisma;
14
+ * }
15
+ *
16
+ * protected async insertOne(data: PrismaUser): Promise<PrismaUser> {
17
+ * return this.prisma.user.create({ data });
18
+ * }
19
+ *
20
+ * protected async updateOne(id: string, data: PrismaUser): Promise<PrismaUser> {
21
+ * return this.prisma.user.update({ where: { id }, data });
22
+ * }
23
+ *
24
+ * // ... implement other abstract methods
25
+ * }
26
+ * ```
27
+ */
28
+ export class BaseRepository {
29
+ constructor(mapper) {
30
+ this.mapper = mapper;
31
+ }
32
+ // ============================================================================
33
+ // Public API - Implemented using abstract methods
34
+ // ============================================================================
35
+ async findById(id) {
36
+ const domain = await this.findOneById(id.value);
37
+ if (!domain)
38
+ return null;
39
+ return domain;
40
+ }
41
+ async find(criteria) {
42
+ return await this.applyCriteria(criteria);
43
+ }
44
+ async findAll(criteria) {
45
+ if (criteria) {
46
+ const result = await this.find(criteria);
47
+ return result.data;
48
+ }
49
+ const domains = await this.findMany();
50
+ return domains;
51
+ }
52
+ async findOne(criteria) {
53
+ // Limit to 1 result
54
+ const limitedCriteria = criteria.clone().limit(1);
55
+ const result = await this.find(limitedCriteria);
56
+ return result.data.length > 0 ? result.data[0] : null;
57
+ }
58
+ async save(aggregate) {
59
+ const persistence = this.mapper.toPersistence(aggregate);
60
+ if (aggregate.isNew) {
61
+ await this.insertOne(persistence);
62
+ }
63
+ else {
64
+ await this.updateOne(aggregate.id.value, persistence);
65
+ }
66
+ }
67
+ async delete(aggregate) {
68
+ await this.deleteOne(aggregate.id.value);
69
+ }
70
+ async deleteById(id) {
71
+ await this.deleteOne(id.value);
72
+ }
73
+ async exists(id) {
74
+ return this.existsById(id.value);
75
+ }
76
+ async count(criteria) {
77
+ return this.countByCriteria(criteria);
78
+ }
79
+ }
80
+ //# sourceMappingURL=base-repository.js.map