@burdenoff/be-sdk 2026.510.79

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 (220) hide show
  1. package/README.md +173 -0
  2. package/configs/eslint/index.js +492 -0
  3. package/configs/tsconfig/tsconfig.json +53 -0
  4. package/dist/EventQueueFactory-6NMSGECR.js +8 -0
  5. package/dist/EventQueueFactory-6NMSGECR.js.map +1 -0
  6. package/dist/auth/index.d.ts +66 -0
  7. package/dist/auth/index.js +8 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/cache/index.d.ts +2 -0
  10. package/dist/cache/index.js +6 -0
  11. package/dist/cache/index.js.map +1 -0
  12. package/dist/captcha/index.d.ts +1 -0
  13. package/dist/captcha/index.js +4 -0
  14. package/dist/captcha/index.js.map +1 -0
  15. package/dist/chunk-2HANKZZM.js +245 -0
  16. package/dist/chunk-2HANKZZM.js.map +1 -0
  17. package/dist/chunk-2SD5L2F2.js +816 -0
  18. package/dist/chunk-2SD5L2F2.js.map +1 -0
  19. package/dist/chunk-3O2RQOPV.js +1068 -0
  20. package/dist/chunk-3O2RQOPV.js.map +1 -0
  21. package/dist/chunk-4B43DZIS.js +560 -0
  22. package/dist/chunk-4B43DZIS.js.map +1 -0
  23. package/dist/chunk-4XAEES25.js +2444 -0
  24. package/dist/chunk-4XAEES25.js.map +1 -0
  25. package/dist/chunk-4XGGWW36.js +1405 -0
  26. package/dist/chunk-4XGGWW36.js.map +1 -0
  27. package/dist/chunk-5LXDPGDH.js +245 -0
  28. package/dist/chunk-5LXDPGDH.js.map +1 -0
  29. package/dist/chunk-AI7L22ZJ.js +472 -0
  30. package/dist/chunk-AI7L22ZJ.js.map +1 -0
  31. package/dist/chunk-CBZNP6RF.js +286 -0
  32. package/dist/chunk-CBZNP6RF.js.map +1 -0
  33. package/dist/chunk-ELLX3K54.js +613 -0
  34. package/dist/chunk-ELLX3K54.js.map +1 -0
  35. package/dist/chunk-F5XEAGHQ.js +1875 -0
  36. package/dist/chunk-F5XEAGHQ.js.map +1 -0
  37. package/dist/chunk-FNZEQOJY.js +628 -0
  38. package/dist/chunk-FNZEQOJY.js.map +1 -0
  39. package/dist/chunk-GTEMQXCA.js +516 -0
  40. package/dist/chunk-GTEMQXCA.js.map +1 -0
  41. package/dist/chunk-HIWTWIGQ.js +226 -0
  42. package/dist/chunk-HIWTWIGQ.js.map +1 -0
  43. package/dist/chunk-IYE2NTRX.js +764 -0
  44. package/dist/chunk-IYE2NTRX.js.map +1 -0
  45. package/dist/chunk-J26YGR2U.js +1484 -0
  46. package/dist/chunk-J26YGR2U.js.map +1 -0
  47. package/dist/chunk-JG2FTZPI.js +509 -0
  48. package/dist/chunk-JG2FTZPI.js.map +1 -0
  49. package/dist/chunk-JVBTNSPG.js +1551 -0
  50. package/dist/chunk-JVBTNSPG.js.map +1 -0
  51. package/dist/chunk-L7ZMN2FJ.js +12 -0
  52. package/dist/chunk-L7ZMN2FJ.js.map +1 -0
  53. package/dist/chunk-M5IMU3US.js +473 -0
  54. package/dist/chunk-M5IMU3US.js.map +1 -0
  55. package/dist/chunk-MLW2HPS5.js +1267 -0
  56. package/dist/chunk-MLW2HPS5.js.map +1 -0
  57. package/dist/chunk-MNCGUYLJ.js +269 -0
  58. package/dist/chunk-MNCGUYLJ.js.map +1 -0
  59. package/dist/chunk-MOCUBSTW.js +373 -0
  60. package/dist/chunk-MOCUBSTW.js.map +1 -0
  61. package/dist/chunk-NGMEI42S.js +103 -0
  62. package/dist/chunk-NGMEI42S.js.map +1 -0
  63. package/dist/chunk-NUB5GQTU.js +270 -0
  64. package/dist/chunk-NUB5GQTU.js.map +1 -0
  65. package/dist/chunk-OVSYMNCI.js +145 -0
  66. package/dist/chunk-OVSYMNCI.js.map +1 -0
  67. package/dist/chunk-QLVKMWFA.js +94 -0
  68. package/dist/chunk-QLVKMWFA.js.map +1 -0
  69. package/dist/chunk-SAG6ZYWQ.js +89 -0
  70. package/dist/chunk-SAG6ZYWQ.js.map +1 -0
  71. package/dist/chunk-SAK2JCA7.js +198 -0
  72. package/dist/chunk-SAK2JCA7.js.map +1 -0
  73. package/dist/chunk-SBS4S2PJ.js +100 -0
  74. package/dist/chunk-SBS4S2PJ.js.map +1 -0
  75. package/dist/chunk-SNEOLWXT.js +148 -0
  76. package/dist/chunk-SNEOLWXT.js.map +1 -0
  77. package/dist/chunk-TKBD2ONF.js +564 -0
  78. package/dist/chunk-TKBD2ONF.js.map +1 -0
  79. package/dist/chunk-UBXFIIAW.js +127 -0
  80. package/dist/chunk-UBXFIIAW.js.map +1 -0
  81. package/dist/chunk-VI4VSNTI.js +57 -0
  82. package/dist/chunk-VI4VSNTI.js.map +1 -0
  83. package/dist/chunk-VWCN5PMD.js +268 -0
  84. package/dist/chunk-VWCN5PMD.js.map +1 -0
  85. package/dist/chunk-XC2YD6CF.js +913 -0
  86. package/dist/chunk-XC2YD6CF.js.map +1 -0
  87. package/dist/chunk-XE4OXN2W.js +10 -0
  88. package/dist/chunk-XE4OXN2W.js.map +1 -0
  89. package/dist/chunk-YMZEUTD2.js +110 -0
  90. package/dist/chunk-YMZEUTD2.js.map +1 -0
  91. package/dist/chunk-Z4IRLBWO.js +758 -0
  92. package/dist/chunk-Z4IRLBWO.js.map +1 -0
  93. package/dist/client/internal-client.d.ts +7 -0
  94. package/dist/client/internal-client.js +5 -0
  95. package/dist/client/internal-client.js.map +1 -0
  96. package/dist/client-CSjIrYKS.d.ts +77 -0
  97. package/dist/config-UKE2E3BW.js +4 -0
  98. package/dist/config-UKE2E3BW.js.map +1 -0
  99. package/dist/crypto/index.d.ts +1 -0
  100. package/dist/crypto/index.js +4 -0
  101. package/dist/crypto/index.js.map +1 -0
  102. package/dist/database/index.d.ts +117 -0
  103. package/dist/database/index.js +7 -0
  104. package/dist/database/index.js.map +1 -0
  105. package/dist/dataloader/index.d.ts +1 -0
  106. package/dist/dataloader/index.js +4 -0
  107. package/dist/dataloader/index.js.map +1 -0
  108. package/dist/esm-K6H7EIWK.js +1450 -0
  109. package/dist/esm-K6H7EIWK.js.map +1 -0
  110. package/dist/event-queue/index.d.ts +6 -0
  111. package/dist/event-queue/index.js +10 -0
  112. package/dist/event-queue/index.js.map +1 -0
  113. package/dist/export/index.d.ts +2 -0
  114. package/dist/export/index.js +9 -0
  115. package/dist/export/index.js.map +1 -0
  116. package/dist/feature-flags/index.d.ts +1 -0
  117. package/dist/feature-flags/index.js +4 -0
  118. package/dist/feature-flags/index.js.map +1 -0
  119. package/dist/gateway/index.d.ts +4 -0
  120. package/dist/gateway/index.js +8 -0
  121. package/dist/gateway/index.js.map +1 -0
  122. package/dist/gateway/security/index.d.ts +2 -0
  123. package/dist/gateway/security/index.js +5 -0
  124. package/dist/gateway/security/index.js.map +1 -0
  125. package/dist/graph/index.d.ts +9 -0
  126. package/dist/graph/index.js +13 -0
  127. package/dist/graph/index.js.map +1 -0
  128. package/dist/graph-emitter-Bk0FqD53.d.ts +47 -0
  129. package/dist/graphql/index.d.ts +2 -0
  130. package/dist/graphql/index.js +7 -0
  131. package/dist/graphql/index.js.map +1 -0
  132. package/dist/graphql/services/index.d.ts +24 -0
  133. package/dist/graphql/services/index.js +5 -0
  134. package/dist/graphql/services/index.js.map +1 -0
  135. package/dist/graphql-BAVrUgBF.d.ts +22 -0
  136. package/dist/i18n/index.d.ts +2 -0
  137. package/dist/i18n/index.js +5 -0
  138. package/dist/i18n/index.js.map +1 -0
  139. package/dist/i18n-DA6IPnYy.d.ts +101 -0
  140. package/dist/index-4gKQKZ2B.d.ts +71 -0
  141. package/dist/index-B18rrFru.d.ts +42 -0
  142. package/dist/index-B70b5mYS.d.ts +33 -0
  143. package/dist/index-BMq3lFjj.d.ts +247 -0
  144. package/dist/index-BODgvRtL.d.ts +316 -0
  145. package/dist/index-BS2idbnr.d.ts +874 -0
  146. package/dist/index-BV3G48cH.d.ts +124 -0
  147. package/dist/index-CHbVw5M7.d.ts +73 -0
  148. package/dist/index-Cq_xNjcv.d.ts +602 -0
  149. package/dist/index-CrQgidpx.d.ts +77 -0
  150. package/dist/index-CyVEg86m.d.ts +309 -0
  151. package/dist/index-DOcBnmMe.d.ts +166 -0
  152. package/dist/index-DSOpj8DI.d.ts +17 -0
  153. package/dist/index-DW9q22GH.d.ts +75 -0
  154. package/dist/index-DlFDFyWD.d.ts +55 -0
  155. package/dist/index-DoK0bjhH.d.ts +607 -0
  156. package/dist/index-Dtf6FBaD.d.ts +199 -0
  157. package/dist/index-KVWGHMbS.d.ts +415 -0
  158. package/dist/index-PaojfSdd.d.ts +71 -0
  159. package/dist/index-RU_M5c74.d.ts +163 -0
  160. package/dist/index-UhkH2eaB.d.ts +192 -0
  161. package/dist/index-e_18DzAg.d.ts +18 -0
  162. package/dist/index-jOuh_TKn.d.ts +59 -0
  163. package/dist/index.d.ts +584 -0
  164. package/dist/index.js +2626 -0
  165. package/dist/index.js.map +1 -0
  166. package/dist/init/index.d.ts +2 -0
  167. package/dist/init/index.js +12 -0
  168. package/dist/init/index.js.map +1 -0
  169. package/dist/instrumentation/index.d.ts +3 -0
  170. package/dist/instrumentation/index.js +5 -0
  171. package/dist/instrumentation/index.js.map +1 -0
  172. package/dist/layer/index.d.ts +2 -0
  173. package/dist/layer/index.js +6 -0
  174. package/dist/layer/index.js.map +1 -0
  175. package/dist/layer-DDip18KY.d.ts +67 -0
  176. package/dist/logger/index.d.ts +2 -0
  177. package/dist/logger/index.js +4 -0
  178. package/dist/logger/index.js.map +1 -0
  179. package/dist/middleware/index.d.ts +3 -0
  180. package/dist/middleware/index.js +5 -0
  181. package/dist/middleware/index.js.map +1 -0
  182. package/dist/notifications/index.d.ts +4 -0
  183. package/dist/notifications/index.js +7 -0
  184. package/dist/notifications/index.js.map +1 -0
  185. package/dist/observability/index.d.ts +3 -0
  186. package/dist/observability/index.js +5 -0
  187. package/dist/observability/index.js.map +1 -0
  188. package/dist/pino-logger-RYLGXPHZ.js +5 -0
  189. package/dist/pino-logger-RYLGXPHZ.js.map +1 -0
  190. package/dist/prisma/generator/index.d.ts +1 -0
  191. package/dist/prisma/generator/index.js +228 -0
  192. package/dist/prisma/generator/index.js.map +1 -0
  193. package/dist/prisma/index.d.ts +5 -0
  194. package/dist/prisma/index.js +12 -0
  195. package/dist/prisma/index.js.map +1 -0
  196. package/dist/prisma-extension-krXnYnrN.d.ts +30 -0
  197. package/dist/rbac/index.d.ts +116 -0
  198. package/dist/rbac/index.js +7 -0
  199. package/dist/rbac/index.js.map +1 -0
  200. package/dist/sdk-THO3IWEE.js +136 -0
  201. package/dist/sdk-THO3IWEE.js.map +1 -0
  202. package/dist/server/index.d.ts +359 -0
  203. package/dist/server/index.js +884 -0
  204. package/dist/server/index.js.map +1 -0
  205. package/dist/telemetry/index.d.ts +83 -0
  206. package/dist/telemetry/index.js +209 -0
  207. package/dist/telemetry/index.js.map +1 -0
  208. package/dist/temporal/index.d.ts +148 -0
  209. package/dist/temporal/index.js +6 -0
  210. package/dist/temporal/index.js.map +1 -0
  211. package/dist/tracker/index.d.ts +5 -0
  212. package/dist/tracker/index.js +9 -0
  213. package/dist/tracker/index.js.map +1 -0
  214. package/dist/types-Bo2wkjSP.d.ts +35 -0
  215. package/dist/utils/index.d.ts +1 -0
  216. package/dist/utils/index.js +4 -0
  217. package/dist/utils/index.js.map +1 -0
  218. package/dist/workspace-guard-LHBNK4TG.js +5 -0
  219. package/dist/workspace-guard-LHBNK4TG.js.map +1 -0
  220. package/package.json +241 -0
@@ -0,0 +1,270 @@
1
+ import { __export, __name } from './chunk-XE4OXN2W.js';
2
+
3
+ // src/dataloader/index.ts
4
+ var dataloader_exports = {};
5
+ __export(dataloader_exports, {
6
+ DataLoaderFactory: () => DataLoaderFactory,
7
+ SimpleDataLoader: () => SimpleDataLoader,
8
+ createCompositeKeyLoader: () => createCompositeKeyLoader,
9
+ createDataLoaderFactory: () => createDataLoaderFactory,
10
+ createEntityLoader: () => createEntityLoader,
11
+ createRelationLoader: () => createRelationLoader
12
+ });
13
+ var SimpleDataLoader = class {
14
+ static {
15
+ __name(this, "SimpleDataLoader");
16
+ }
17
+ config;
18
+ cache = /* @__PURE__ */ new Map();
19
+ pendingBatch = [];
20
+ pendingPromises = /* @__PURE__ */ new Map();
21
+ batchScheduled = false;
22
+ constructor(config) {
23
+ this.config = config;
24
+ }
25
+ /**
26
+ * Load a single value by key
27
+ */
28
+ async load(key) {
29
+ const cacheKey = this.getCacheKey(key);
30
+ if (this.config.cache !== false && this.cache.has(cacheKey)) {
31
+ const cached = this.cache.get(cacheKey);
32
+ if (cached instanceof Error) {
33
+ throw cached;
34
+ }
35
+ return cached;
36
+ }
37
+ return new Promise((resolve, reject) => {
38
+ this.pendingBatch.push(key);
39
+ const promises = this.pendingPromises.get(cacheKey) || [];
40
+ promises.push({
41
+ resolve,
42
+ reject
43
+ });
44
+ this.pendingPromises.set(cacheKey, promises);
45
+ this.scheduleBatch();
46
+ });
47
+ }
48
+ /**
49
+ * Load multiple values by keys
50
+ */
51
+ async loadMany(keys) {
52
+ return Promise.all(keys.map((key) => this.load(key)));
53
+ }
54
+ /**
55
+ * Clear a specific key from cache
56
+ */
57
+ clear(key) {
58
+ const cacheKey = this.getCacheKey(key);
59
+ this.cache.delete(cacheKey);
60
+ return this;
61
+ }
62
+ /**
63
+ * Clear all cached values
64
+ */
65
+ clearAll() {
66
+ this.cache.clear();
67
+ return this;
68
+ }
69
+ /**
70
+ * Prime the cache with a value
71
+ */
72
+ prime(key, value) {
73
+ const cacheKey = this.getCacheKey(key);
74
+ if (!this.cache.has(cacheKey)) {
75
+ this.cache.set(cacheKey, value);
76
+ }
77
+ return this;
78
+ }
79
+ getCacheKey(key) {
80
+ if (this.config.cacheKeyFn) {
81
+ return this.config.cacheKeyFn(key);
82
+ }
83
+ return String(key);
84
+ }
85
+ scheduleBatch() {
86
+ if (this.batchScheduled) return;
87
+ this.batchScheduled = true;
88
+ queueMicrotask(() => {
89
+ void this.executeBatch();
90
+ });
91
+ }
92
+ /**
93
+ * Deduplicate batch keys to avoid redundant loads
94
+ */
95
+ deduplicateKeys(batch) {
96
+ const uniqueKeys = [];
97
+ const keySet = /* @__PURE__ */ new Set();
98
+ for (const key of batch) {
99
+ const cacheKey = this.getCacheKey(key);
100
+ if (!keySet.has(cacheKey)) {
101
+ keySet.add(cacheKey);
102
+ uniqueKeys.push(key);
103
+ }
104
+ }
105
+ return uniqueKeys;
106
+ }
107
+ /**
108
+ * Resolve promises for a single result
109
+ */
110
+ resolvePromisesForKey(cacheKey, result, promisesMap) {
111
+ const promises = promisesMap.get(cacheKey);
112
+ if (!promises) return;
113
+ for (const { resolve, reject } of promises) {
114
+ if (result instanceof Error) {
115
+ reject(result);
116
+ } else {
117
+ resolve(result);
118
+ }
119
+ }
120
+ }
121
+ /**
122
+ * Cache and resolve results for all keys
123
+ */
124
+ processResults(uniqueKeys, results, promisesMap) {
125
+ for (let i = 0; i < uniqueKeys.length; i++) {
126
+ const key = uniqueKeys[i];
127
+ const cacheKey = this.getCacheKey(key);
128
+ const result = results[i] ?? null;
129
+ if (this.config.cache !== false) {
130
+ this.cache.set(cacheKey, result);
131
+ }
132
+ this.resolvePromisesForKey(cacheKey, result, promisesMap);
133
+ }
134
+ }
135
+ /**
136
+ * Reject all pending promises with an error
137
+ */
138
+ rejectAllPromises(promisesMap, error) {
139
+ const errorObj = error instanceof Error ? error : new Error(String(error));
140
+ for (const [, promises] of promisesMap) {
141
+ for (const { reject } of promises) {
142
+ reject(errorObj);
143
+ }
144
+ }
145
+ }
146
+ async executeBatch() {
147
+ const batch = this.pendingBatch;
148
+ const promisesMap = new Map(this.pendingPromises);
149
+ this.pendingBatch = [];
150
+ this.pendingPromises.clear();
151
+ this.batchScheduled = false;
152
+ if (batch.length === 0) return;
153
+ try {
154
+ const uniqueKeys = this.deduplicateKeys(batch);
155
+ const results = await this.config.batchLoadFn(uniqueKeys);
156
+ this.processResults(uniqueKeys, results, promisesMap);
157
+ } catch (error) {
158
+ this.rejectAllPromises(promisesMap, error);
159
+ }
160
+ }
161
+ };
162
+ function createEntityLoader(options) {
163
+ return new SimpleDataLoader({
164
+ batchLoadFn: /* @__PURE__ */ __name(async (keys) => {
165
+ const items = await options.batchFn(keys);
166
+ const itemMap = /* @__PURE__ */ new Map();
167
+ for (const item of items) {
168
+ const key = options.getKey(item);
169
+ itemMap.set(key, item);
170
+ }
171
+ return keys.map((key) => itemMap.get(key) || null);
172
+ }, "batchLoadFn"),
173
+ cacheKeyFn: options.cacheKeyFn
174
+ });
175
+ }
176
+ __name(createEntityLoader, "createEntityLoader");
177
+ function createRelationLoader(options) {
178
+ return new SimpleDataLoader({
179
+ batchLoadFn: /* @__PURE__ */ __name(async (keys) => {
180
+ const items = await options.batchFn(keys);
181
+ const itemMap = /* @__PURE__ */ new Map();
182
+ for (const key of keys) {
183
+ itemMap.set(key, []);
184
+ }
185
+ for (const item of items) {
186
+ const key = options.getKey(item);
187
+ if (key != null) {
188
+ const existing = itemMap.get(key) || [];
189
+ existing.push(item);
190
+ itemMap.set(key, existing);
191
+ }
192
+ }
193
+ return keys.map((key) => itemMap.get(key) || []);
194
+ }, "batchLoadFn"),
195
+ cacheKeyFn: options.cacheKeyFn
196
+ });
197
+ }
198
+ __name(createRelationLoader, "createRelationLoader");
199
+ function createCompositeKeyLoader(options) {
200
+ return new SimpleDataLoader({
201
+ batchLoadFn: /* @__PURE__ */ __name(async (keys) => {
202
+ const items = await options.batchFn(keys);
203
+ const itemMap = /* @__PURE__ */ new Map();
204
+ for (const key of keys) {
205
+ itemMap.set(key, []);
206
+ }
207
+ for (const item of items) {
208
+ const key = options.getKey(item);
209
+ const existing = itemMap.get(key) || [];
210
+ existing.push(item);
211
+ itemMap.set(key, existing);
212
+ }
213
+ return keys.map((key) => itemMap.get(key) || []);
214
+ }, "batchLoadFn"),
215
+ cacheKeyFn: options.cacheKeyFn
216
+ });
217
+ }
218
+ __name(createCompositeKeyLoader, "createCompositeKeyLoader");
219
+ var DataLoaderFactory = class {
220
+ static {
221
+ __name(this, "DataLoaderFactory");
222
+ }
223
+ loaders = /* @__PURE__ */ new Map();
224
+ /**
225
+ * Register an entity loader
226
+ */
227
+ registerEntityLoader(name, options) {
228
+ const loader = createEntityLoader(options);
229
+ this.loaders.set(name, loader);
230
+ return loader;
231
+ }
232
+ /**
233
+ * Register a relation loader
234
+ */
235
+ registerRelationLoader(name, options) {
236
+ const loader = createRelationLoader(options);
237
+ this.loaders.set(name, loader);
238
+ return loader;
239
+ }
240
+ /**
241
+ * Register a composite key loader
242
+ */
243
+ registerCompositeKeyLoader(name, options) {
244
+ const loader = createCompositeKeyLoader(options);
245
+ this.loaders.set(name, loader);
246
+ return loader;
247
+ }
248
+ /**
249
+ * Get a registered loader
250
+ */
251
+ get(name) {
252
+ return this.loaders.get(name);
253
+ }
254
+ /**
255
+ * Clear all loader caches
256
+ */
257
+ clearAll() {
258
+ for (const loader of this.loaders.values()) {
259
+ loader.clearAll();
260
+ }
261
+ }
262
+ };
263
+ function createDataLoaderFactory() {
264
+ return new DataLoaderFactory();
265
+ }
266
+ __name(createDataLoaderFactory, "createDataLoaderFactory");
267
+
268
+ export { DataLoaderFactory, SimpleDataLoader, createCompositeKeyLoader, createDataLoaderFactory, createEntityLoader, createRelationLoader, dataloader_exports };
269
+ //# sourceMappingURL=chunk-NUB5GQTU.js.map
270
+ //# sourceMappingURL=chunk-NUB5GQTU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dataloader/index.ts"],"names":["SimpleDataLoader","cache","Map","pendingBatch","pendingPromises","batchScheduled","config","load","key","cacheKey","getCacheKey","has","cached","get","Error","Promise","resolve","reject","push","promises","set","scheduleBatch","loadMany","keys","all","map","clear","delete","clearAll","prime","value","cacheKeyFn","String","queueMicrotask","executeBatch","deduplicateKeys","batch","uniqueKeys","keySet","Set","add","resolvePromisesForKey","result","promisesMap","processResults","results","i","length","rejectAllPromises","error","errorObj","batchLoadFn","createEntityLoader","options","items","batchFn","itemMap","item","getKey","createRelationLoader","existing","createCompositeKeyLoader","DataLoaderFactory","loaders","registerEntityLoader","name","loader","registerRelationLoader","registerCompositeKeyLoader","values","createDataLoaderFactory"],"mappings":"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","file":"chunk-NUB5GQTU.js","sourcesContent":["/**\n * DataLoader Module\n *\n * Provides utilities for creating DataLoaders with common patterns\n * used across Burdenoff microservices.\n *\n * @module dataloader\n * @category Data\n *\n * @example\n * ```typescript\n * import {\n * createEntityLoader,\n * createRelationLoader,\n * createCompositeKeyLoader,\n * DataLoaderFactory,\n * } from '@burdenoff/be-sdk/dataloader';\n *\n * // Create a simple entity loader\n * const tagLoader = createEntityLoader<Tag, string>({\n * batchFn: async (ids) => db.tag.findMany({ where: { id: { in: [...ids] } } }),\n * getKey: (tag) => tag.id,\n * });\n *\n * // Create a relation loader (one-to-many)\n * const tagChildrenLoader = createRelationLoader<Tag, string>({\n * batchFn: async (parentIds) => db.tag.findMany({ where: { parentId: { in: [...parentIds] } } }),\n * getKey: (tag) => tag.parentId,\n * });\n *\n * // Create a composite key loader (e.g., entityType:entityId)\n * const entityTagsLoader = createCompositeKeyLoader<TagAssignment>({\n * batchFn: async (keys) => {\n * const parsed = keys.map(parseKey);\n * return db.tagAssignment.findMany({ where: { OR: parsed } });\n * },\n * getKey: (assignment) => `${assignment.entityType}:${assignment.entityId}`,\n * });\n * ```\n */\n\n/**\n * DataLoader-like batch function type\n */\nexport type BatchFunction<K, V> = (keys: readonly K[]) => Promise<(V | Error | null)[]>;\n\n/**\n * Simple batch function that returns items\n */\nexport type SimpleBatchFunction<K, V> = (keys: readonly K[]) => Promise<V[]>;\n\n/**\n * Options for creating an entity loader\n */\nexport interface EntityLoaderOptions<T, K extends string | number = string> {\n /** Batch function to fetch entities by keys */\n batchFn: SimpleBatchFunction<K, T>;\n /** Function to extract the key from an entity */\n getKey: (entity: T) => K;\n /** Cache key normalization function */\n cacheKeyFn?: (key: K) => string;\n}\n\n/**\n * Options for creating a relation loader (one-to-many)\n */\nexport interface RelationLoaderOptions<T, K extends string | number = string> {\n /** Batch function to fetch related entities by foreign keys */\n batchFn: SimpleBatchFunction<K, T>;\n /** Function to extract the foreign key from an entity */\n getKey: (entity: T) => K | null | undefined;\n /** Cache key normalization function */\n cacheKeyFn?: (key: K) => string;\n}\n\n/**\n * Options for creating a composite key loader\n */\nexport interface CompositeKeyLoaderOptions<T> {\n /** Batch function to fetch entities by composite keys */\n batchFn: SimpleBatchFunction<string, T>;\n /** Function to extract the composite key from an entity */\n getKey: (entity: T) => string;\n /** Cache key normalization function */\n cacheKeyFn?: (key: string) => string;\n}\n\n/**\n * Internal cache value type - can be a value, null, or an error\n */\ntype CacheValue<V> = V | null | Error;\n\n/**\n * Internal promise handlers type - array of resolve/reject functions\n */\ntype PromiseHandlers<V> = Array<{\n resolve: (value: V | null) => void;\n reject: (error: Error) => void;\n}>;\n\n/**\n * DataLoader configuration\n */\nexport interface DataLoaderConfig<K, V> {\n /** Batch function */\n batchLoadFn: BatchFunction<K, V>;\n /** Maximum batch size */\n maxBatchSize?: number;\n /** Whether to cache results */\n cache?: boolean;\n /** Cache key function */\n cacheKeyFn?: (key: K) => string;\n}\n\n/**\n * Simple DataLoader implementation\n *\n * Note: For production use, consider using the 'dataloader' npm package.\n * This is a simplified implementation for basic use cases.\n */\nexport class SimpleDataLoader<K, V> {\n private cache: Map<string, CacheValue<V>> = new Map();\n private pendingBatch: K[] = [];\n private pendingPromises: Map<string, PromiseHandlers<V>> = new Map();\n private batchScheduled = false;\n\n constructor(private config: DataLoaderConfig<K, V>) {}\n\n /**\n * Load a single value by key\n */\n async load(key: K): Promise<V | null> {\n const cacheKey = this.getCacheKey(key);\n\n // Check cache\n if (this.config.cache !== false && this.cache.has(cacheKey)) {\n const cached = this.cache.get(cacheKey);\n if (cached instanceof Error) {\n throw cached;\n }\n return cached as V | null;\n }\n\n // Add to pending batch\n return new Promise<V | null>((resolve, reject) => {\n this.pendingBatch.push(key);\n\n const promises = this.pendingPromises.get(cacheKey) || [];\n promises.push({ resolve, reject });\n this.pendingPromises.set(cacheKey, promises);\n\n this.scheduleBatch();\n });\n }\n\n /**\n * Load multiple values by keys\n */\n async loadMany(keys: K[]): Promise<(V | null)[]> {\n return Promise.all(keys.map((key) => this.load(key)));\n }\n\n /**\n * Clear a specific key from cache\n */\n clear(key: K): this {\n const cacheKey = this.getCacheKey(key);\n this.cache.delete(cacheKey);\n return this;\n }\n\n /**\n * Clear all cached values\n */\n clearAll(): this {\n this.cache.clear();\n return this;\n }\n\n /**\n * Prime the cache with a value\n */\n prime(key: K, value: V | Error | null): this {\n const cacheKey = this.getCacheKey(key);\n if (!this.cache.has(cacheKey)) {\n this.cache.set(cacheKey, value);\n }\n return this;\n }\n\n private getCacheKey(key: K): string {\n if (this.config.cacheKeyFn) {\n return this.config.cacheKeyFn(key);\n }\n return String(key);\n }\n\n private scheduleBatch(): void {\n if (this.batchScheduled) return;\n this.batchScheduled = true;\n\n // Use queueMicrotask for batching\n queueMicrotask(() => {\n void this.executeBatch();\n });\n }\n\n /**\n * Deduplicate batch keys to avoid redundant loads\n */\n private deduplicateKeys(batch: K[]): K[] {\n const uniqueKeys: K[] = [];\n const keySet = new Set<string>();\n\n for (const key of batch) {\n const cacheKey = this.getCacheKey(key);\n if (!keySet.has(cacheKey)) {\n keySet.add(cacheKey);\n uniqueKeys.push(key);\n }\n }\n\n return uniqueKeys;\n }\n\n /**\n * Resolve promises for a single result\n */\n private resolvePromisesForKey(\n cacheKey: string,\n result: CacheValue<V>,\n promisesMap: Map<string, PromiseHandlers<V>>\n ): void {\n const promises = promisesMap.get(cacheKey);\n if (!promises) return;\n\n for (const { resolve, reject } of promises) {\n if (result instanceof Error) {\n reject(result);\n } else {\n // Type assertion removed - TypeScript infers V | null from the else branch\n resolve(result);\n }\n }\n }\n\n /**\n * Cache and resolve results for all keys\n */\n private processResults(\n uniqueKeys: K[],\n results: readonly CacheValue<V>[],\n promisesMap: Map<string, PromiseHandlers<V>>\n ): void {\n for (let i = 0; i < uniqueKeys.length; i++) {\n const key = uniqueKeys[i]!;\n const cacheKey = this.getCacheKey(key);\n const result = results[i] ?? null;\n\n // Cache result if caching is enabled\n if (this.config.cache !== false) {\n this.cache.set(cacheKey, result);\n }\n\n // Resolve promises for this key\n this.resolvePromisesForKey(cacheKey, result, promisesMap);\n }\n }\n\n /**\n * Reject all pending promises with an error\n */\n private rejectAllPromises(promisesMap: Map<string, PromiseHandlers<V>>, error: unknown): void {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n for (const [, promises] of promisesMap) {\n for (const { reject } of promises) {\n reject(errorObj);\n }\n }\n }\n\n private async executeBatch(): Promise<void> {\n const batch = this.pendingBatch;\n const promisesMap = new Map(this.pendingPromises);\n\n this.pendingBatch = [];\n this.pendingPromises.clear();\n this.batchScheduled = false;\n\n if (batch.length === 0) return;\n\n try {\n const uniqueKeys = this.deduplicateKeys(batch);\n const results = await this.config.batchLoadFn(uniqueKeys);\n this.processResults(uniqueKeys, results, promisesMap);\n } catch (error) {\n this.rejectAllPromises(promisesMap, error);\n }\n }\n}\n\n/**\n * Create an entity loader (many entities by primary key)\n *\n * @example\n * ```typescript\n * const tagLoader = createEntityLoader<Tag, string>({\n * batchFn: async (ids) => db.tag.findMany({ where: { id: { in: [...ids] } } }),\n * getKey: (tag) => tag.id,\n * });\n *\n * const tag = await tagLoader.load('tag-123');\n * ```\n */\nexport function createEntityLoader<T, K extends string | number = string>(\n options: EntityLoaderOptions<T, K>\n): SimpleDataLoader<K, T> {\n return new SimpleDataLoader<K, T>({\n batchLoadFn: async (keys: readonly K[]): Promise<(T | null)[]> => {\n const items = await options.batchFn(keys);\n const itemMap = new Map<K, T>();\n\n for (const item of items) {\n const key = options.getKey(item);\n itemMap.set(key, item);\n }\n\n return keys.map((key) => itemMap.get(key) || null);\n },\n cacheKeyFn: options.cacheKeyFn,\n });\n}\n\n/**\n * Create a relation loader (one-to-many relationships)\n *\n * @example\n * ```typescript\n * const tagChildrenLoader = createRelationLoader<Tag, string>({\n * batchFn: async (parentIds) => db.tag.findMany({\n * where: { parentId: { in: [...parentIds] } }\n * }),\n * getKey: (tag) => tag.parentId,\n * });\n *\n * const children = await tagChildrenLoader.load('parent-123');\n * ```\n */\nexport function createRelationLoader<T, K extends string | number = string>(\n options: RelationLoaderOptions<T, K>\n): SimpleDataLoader<K, T[]> {\n return new SimpleDataLoader<K, T[]>({\n batchLoadFn: async (keys: readonly K[]): Promise<T[][]> => {\n const items = await options.batchFn(keys);\n const itemMap = new Map<K, T[]>();\n\n // Initialize with empty arrays\n for (const key of keys) {\n itemMap.set(key, []);\n }\n\n // Group items by foreign key\n for (const item of items) {\n const key = options.getKey(item);\n if (key != null) {\n const existing = itemMap.get(key) || [];\n existing.push(item);\n itemMap.set(key, existing);\n }\n }\n\n return keys.map((key) => itemMap.get(key) || []);\n },\n cacheKeyFn: options.cacheKeyFn,\n });\n}\n\n/**\n * Create a composite key loader\n *\n * @example\n * ```typescript\n * const entityTagsLoader = createCompositeKeyLoader<TagAssignment>({\n * batchFn: async (keys) => {\n * const parsed = keys.map((k) => {\n * const [entityType, entityId] = k.split(':');\n * return { entityType, entityId };\n * });\n * return db.tagAssignment.findMany({ where: { OR: parsed } });\n * },\n * getKey: (assignment) => `${assignment.entityType}:${assignment.entityId}`,\n * });\n *\n * const tags = await entityTagsLoader.load('User:user-123');\n * ```\n */\nexport function createCompositeKeyLoader<T>(options: CompositeKeyLoaderOptions<T>): SimpleDataLoader<string, T[]> {\n return new SimpleDataLoader<string, T[]>({\n batchLoadFn: async (keys: readonly string[]): Promise<T[][]> => {\n const items = await options.batchFn(keys);\n const itemMap = new Map<string, T[]>();\n\n // Initialize with empty arrays\n for (const key of keys) {\n itemMap.set(key, []);\n }\n\n // Group items by composite key\n for (const item of items) {\n const key = options.getKey(item);\n const existing = itemMap.get(key) || [];\n existing.push(item);\n itemMap.set(key, existing);\n }\n\n return keys.map((key) => itemMap.get(key) || []);\n },\n cacheKeyFn: options.cacheKeyFn,\n });\n}\n\n/**\n * DataLoader factory for creating multiple loaders with shared configuration\n */\nexport class DataLoaderFactory {\n private loaders: Map<string, SimpleDataLoader<unknown, unknown>> = new Map();\n\n /**\n * Register an entity loader\n */\n registerEntityLoader<T, K extends string | number = string>(\n name: string,\n options: EntityLoaderOptions<T, K>\n ): SimpleDataLoader<K, T> {\n const loader = createEntityLoader(options);\n this.loaders.set(name, loader as SimpleDataLoader<unknown, unknown>);\n return loader;\n }\n\n /**\n * Register a relation loader\n */\n registerRelationLoader<T, K extends string | number = string>(\n name: string,\n options: RelationLoaderOptions<T, K>\n ): SimpleDataLoader<K, T[]> {\n const loader = createRelationLoader(options);\n this.loaders.set(name, loader as SimpleDataLoader<unknown, unknown>);\n return loader;\n }\n\n /**\n * Register a composite key loader\n */\n registerCompositeKeyLoader<T>(name: string, options: CompositeKeyLoaderOptions<T>): SimpleDataLoader<string, T[]> {\n const loader = createCompositeKeyLoader(options);\n this.loaders.set(name, loader as SimpleDataLoader<unknown, unknown>);\n return loader;\n }\n\n /**\n * Get a registered loader\n */\n get<K, V>(name: string): SimpleDataLoader<K, V> | undefined {\n return this.loaders.get(name) as SimpleDataLoader<K, V> | undefined;\n }\n\n /**\n * Clear all loader caches\n */\n clearAll(): void {\n for (const loader of this.loaders.values()) {\n loader.clearAll();\n }\n }\n}\n\n/**\n * Create a new DataLoader factory\n */\nexport function createDataLoaderFactory(): DataLoaderFactory {\n return new DataLoaderFactory();\n}\n"]}
@@ -0,0 +1,145 @@
1
+ import { logger } from './chunk-CBZNP6RF.js';
2
+ import { __name } from './chunk-XE4OXN2W.js';
3
+ import { connect } from 'nats';
4
+
5
+ var NatsConnectionManager = class {
6
+ static {
7
+ __name(this, "NatsConnectionManager");
8
+ }
9
+ config;
10
+ nc = null;
11
+ js = null;
12
+ jsm = null;
13
+ connected = false;
14
+ connectionPromise = null;
15
+ constructor(config) {
16
+ this.config = config;
17
+ }
18
+ /**
19
+ * Connect to NATS server
20
+ */
21
+ async connect() {
22
+ if (this.connectionPromise) {
23
+ return this.connectionPromise;
24
+ }
25
+ if (this.connected) {
26
+ logger.debug("[NatsConnection] Already connected");
27
+ return;
28
+ }
29
+ this.connectionPromise = this._doConnect();
30
+ try {
31
+ await this.connectionPromise;
32
+ } finally {
33
+ this.connectionPromise = null;
34
+ }
35
+ }
36
+ /**
37
+ * Internal connection logic
38
+ */
39
+ async _doConnect() {
40
+ try {
41
+ const connectionOptions = {
42
+ servers: this.config.url,
43
+ name: this.config.name,
44
+ user: this.config.user,
45
+ pass: this.config.password,
46
+ token: this.config.token,
47
+ maxReconnectAttempts: this.config.maxReconnectAttempts ?? -1,
48
+ reconnectTimeWait: this.config.reconnectTimeWait ?? 2e3
49
+ };
50
+ this.nc = await connect(connectionOptions);
51
+ this.js = this.nc.jetstream();
52
+ this.jsm = await this.nc.jetstreamManager();
53
+ this.connected = true;
54
+ logger.info("[NatsConnection] Connected to NATS", {
55
+ url: this.config.url,
56
+ name: this.config.name
57
+ });
58
+ this.setupEventHandlers();
59
+ } catch (error) {
60
+ logger.error("[NatsConnection] Failed to connect to NATS", {
61
+ error: error instanceof Error ? error.message : "Unknown error",
62
+ url: this.config.url
63
+ });
64
+ throw error;
65
+ }
66
+ }
67
+ /**
68
+ * Setup connection event handlers
69
+ */
70
+ setupEventHandlers() {
71
+ if (!this.nc) return;
72
+ (async () => {
73
+ if (!this.nc) return;
74
+ for await (const status of this.nc.status()) {
75
+ if (status.type === "disconnect") {
76
+ this.connected = false;
77
+ } else if (status.type === "reconnect") {
78
+ this.connected = true;
79
+ }
80
+ }
81
+ })().catch((error) => {
82
+ logger.error("[NatsConnection] Error handling connection events", {
83
+ error: error instanceof Error ? error.message : "Unknown error"
84
+ });
85
+ });
86
+ }
87
+ /**
88
+ * Disconnect from NATS
89
+ */
90
+ async disconnect() {
91
+ if (!this.connected || !this.nc) {
92
+ return;
93
+ }
94
+ try {
95
+ await this.nc.drain();
96
+ await this.nc.close();
97
+ this.connected = false;
98
+ this.nc = null;
99
+ this.js = null;
100
+ this.jsm = null;
101
+ logger.info("[NatsConnection] Disconnected from NATS");
102
+ } catch (error) {
103
+ logger.error("[NatsConnection] Error disconnecting from NATS", {
104
+ error: error instanceof Error ? error.message : "Unknown error"
105
+ });
106
+ }
107
+ }
108
+ /**
109
+ * Check if connected
110
+ */
111
+ isConnected() {
112
+ return this.connected && this.nc !== null && !this.nc.isClosed();
113
+ }
114
+ /**
115
+ * Get JetStream client
116
+ */
117
+ getJetStream() {
118
+ if (!this.js) {
119
+ throw new Error("NATS not connected - call connect() first");
120
+ }
121
+ return this.js;
122
+ }
123
+ /**
124
+ * Get JetStream Manager
125
+ */
126
+ getJetStreamManager() {
127
+ if (!this.jsm) {
128
+ throw new Error("NATS not connected - call connect() first");
129
+ }
130
+ return this.jsm;
131
+ }
132
+ /**
133
+ * Get NATS connection
134
+ */
135
+ getNatsConnection() {
136
+ if (!this.nc) {
137
+ throw new Error("NATS not connected - call connect() first");
138
+ }
139
+ return this.nc;
140
+ }
141
+ };
142
+
143
+ export { NatsConnectionManager };
144
+ //# sourceMappingURL=chunk-OVSYMNCI.js.map
145
+ //# sourceMappingURL=chunk-OVSYMNCI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/event-queue/implementations/nats/NatsConnection.ts"],"names":["NatsConnectionManager","nc","js","jsm","connected","connectionPromise","config","connect","logger","debug","_doConnect","connectionOptions","servers","url","name","user","pass","password","token","maxReconnectAttempts","reconnectTimeWait","jetstream","jetstreamManager","info","setupEventHandlers","error","Error","message","status","type","catch","disconnect","drain","close","isConnected","isClosed","getJetStream","getJetStreamManager","getNatsConnection"],"mappings":"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","file":"chunk-OVSYMNCI.js","sourcesContent":["/**\n * NATS JetStream Connection Manager\n * Handles connection lifecycle and provides access to NATS clients\n */\nimport { logger } from '../../../logger/index.js';\nimport {\n type ConnectionOptions,\n type JetStreamClient,\n type JetStreamManager,\n type NatsConnection,\n connect,\n} from 'nats';\n\nimport type { BaseQueueConfig } from '../../types/config.js';\n\n/**\n * Internal connection manager for NATS JetStream\n * Shared between NatsEventPublisher and NatsEventConsumer\n */\nexport class NatsConnectionManager {\n private nc: NatsConnection | null = null;\n private js: JetStreamClient | null = null;\n private jsm: JetStreamManager | null = null;\n private connected: boolean = false;\n private connectionPromise: Promise<void> | null = null;\n\n constructor(private config: BaseQueueConfig) {}\n\n /**\n * Connect to NATS server\n */\n async connect(): Promise<void> {\n // Prevent multiple concurrent connections\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n if (this.connected) {\n logger.debug('[NatsConnection] Already connected');\n return;\n }\n\n this.connectionPromise = this._doConnect();\n try {\n await this.connectionPromise;\n } finally {\n this.connectionPromise = null;\n }\n }\n\n /**\n * Internal connection logic\n */\n private async _doConnect(): Promise<void> {\n try {\n const connectionOptions: ConnectionOptions = {\n servers: this.config.url,\n name: this.config.name,\n user: this.config.user,\n pass: this.config.password,\n token: this.config.token,\n maxReconnectAttempts: this.config.maxReconnectAttempts ?? -1,\n reconnectTimeWait: this.config.reconnectTimeWait ?? 2000,\n };\n\n this.nc = await connect(connectionOptions);\n this.js = this.nc.jetstream();\n this.jsm = await this.nc.jetstreamManager();\n this.connected = true;\n\n logger.info('[NatsConnection] Connected to NATS', {\n url: this.config.url,\n name: this.config.name,\n });\n\n // Handle connection events\n this.setupEventHandlers();\n } catch (error) {\n logger.error('[NatsConnection] Failed to connect to NATS', {\n error: error instanceof Error ? error.message : 'Unknown error',\n url: this.config.url,\n });\n throw error;\n }\n }\n\n /**\n * Setup connection event handlers\n */\n private setupEventHandlers(): void {\n if (!this.nc) return;\n\n (async (): Promise<void> => {\n if (!this.nc) return;\n\n for await (const status of this.nc.status()) {\n if (status.type === 'disconnect') {\n this.connected = false;\n } else if (status.type === 'reconnect') {\n this.connected = true;\n }\n }\n })().catch((error) => {\n logger.error('[NatsConnection] Error handling connection events', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n });\n }\n\n /**\n * Disconnect from NATS\n */\n async disconnect(): Promise<void> {\n if (!this.connected || !this.nc) {\n return;\n }\n\n try {\n await this.nc.drain();\n await this.nc.close();\n this.connected = false;\n this.nc = null;\n this.js = null;\n this.jsm = null;\n\n logger.info('[NatsConnection] Disconnected from NATS');\n } catch (error) {\n logger.error('[NatsConnection] Error disconnecting from NATS', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected && this.nc !== null && !this.nc.isClosed();\n }\n\n /**\n * Get JetStream client\n */\n getJetStream(): JetStreamClient {\n if (!this.js) {\n throw new Error('NATS not connected - call connect() first');\n }\n return this.js;\n }\n\n /**\n * Get JetStream Manager\n */\n getJetStreamManager(): JetStreamManager {\n if (!this.jsm) {\n throw new Error('NATS not connected - call connect() first');\n }\n return this.jsm;\n }\n\n /**\n * Get NATS connection\n */\n getNatsConnection(): NatsConnection {\n if (!this.nc) {\n throw new Error('NATS not connected - call connect() first');\n }\n return this.nc;\n }\n}\n"]}
@@ -0,0 +1,94 @@
1
+ import { logger } from './chunk-CBZNP6RF.js';
2
+ import { __name } from './chunk-XE4OXN2W.js';
3
+
4
+ // src/graphql/services/Logger.ts
5
+ var Logger = class {
6
+ static {
7
+ __name(this, "Logger");
8
+ }
9
+ /**
10
+ * Log a message at INFO level
11
+ */
12
+ log(message, ...args) {
13
+ logger.info(message, ...args);
14
+ }
15
+ /**
16
+ * Log a message at INFO level
17
+ */
18
+ info(message, ...args) {
19
+ logger.info(message, ...args);
20
+ }
21
+ /**
22
+ * Log a message at WARN level
23
+ */
24
+ warn(message, ...args) {
25
+ logger.warn(message, ...args);
26
+ }
27
+ /**
28
+ * Log a message at ERROR level
29
+ */
30
+ error(message, error, ...args) {
31
+ logger.error(message, error, ...args);
32
+ }
33
+ /**
34
+ * Log a message at DEBUG level
35
+ */
36
+ debug(message, ...args) {
37
+ logger.debug(message, ...args);
38
+ }
39
+ /**
40
+ * Log a message at TRACE level
41
+ */
42
+ trace(message, ...args) {
43
+ if ("trace" in logger && typeof logger.trace === "function") {
44
+ logger.trace(message, ...args);
45
+ } else {
46
+ logger.debug(message, ...args);
47
+ }
48
+ }
49
+ };
50
+
51
+ // src/graphql/services/Database.ts
52
+ function createDatabaseService(prismaClient) {
53
+ let Database = class Database {
54
+ static {
55
+ __name(this, "Database");
56
+ }
57
+ /**
58
+ * Get the Prisma client instance
59
+ */
60
+ get client() {
61
+ return prismaClient;
62
+ }
63
+ /**
64
+ * Execute a transaction
65
+ *
66
+ * @param fn - Transaction callback function
67
+ * @returns Promise resolving to transaction result
68
+ */
69
+ async transaction(fn) {
70
+ return prismaClient.$transaction(fn);
71
+ }
72
+ /**
73
+ * Check if database is connected
74
+ *
75
+ * @returns Promise resolving to true if connected, false otherwise
76
+ */
77
+ async isConnected() {
78
+ try {
79
+ if ("$queryRaw" in prismaClient && typeof prismaClient.$queryRaw === "function") {
80
+ await prismaClient.$queryRaw`SELECT 1`;
81
+ }
82
+ return true;
83
+ } catch {
84
+ return false;
85
+ }
86
+ }
87
+ };
88
+ return Database;
89
+ }
90
+ __name(createDatabaseService, "createDatabaseService");
91
+
92
+ export { Logger, createDatabaseService };
93
+ //# sourceMappingURL=chunk-QLVKMWFA.js.map
94
+ //# sourceMappingURL=chunk-QLVKMWFA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/graphql/services/Logger.ts","../src/graphql/services/Database.ts"],"names":["Logger","log","message","args","sdkLogger","info","warn","error","debug","trace","createDatabaseService","prismaClient","Database","client","transaction","fn","$transaction","isConnected","$queryRaw"],"mappings":";;;;AAmBO,IAAMA,SAAN,MAAMA;EAnBb;;;;;;AAuBEC,EAAAA,GAAAA,CAAIC,YAAoBC,IAAAA,EAAuB;AAC7CC,IAAAA,MAAAA,CAAUC,IAAAA,CAAKH,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;AAC7B,EAAA;;;;AAKAE,EAAAA,IAAAA,CAAKH,YAAoBC,IAAAA,EAAuB;AAC9CC,IAAAA,MAAAA,CAAUC,IAAAA,CAAKH,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;AAC7B,EAAA;;;;AAKAG,EAAAA,IAAAA,CAAKJ,YAAoBC,IAAAA,EAAuB;AAC9CC,IAAAA,MAAAA,CAAUE,IAAAA,CAAKJ,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;AAC7B,EAAA;;;;EAKAI,KAAAA,CAAML,OAAAA,EAAiBK,UAA4BJ,IAAAA,EAAuB;AACxEC,IAAAA,MAAAA,CAAUG,KAAAA,CAAML,OAAAA,EAASK,KAAAA,EAAAA,GAAUJ,IAAAA,CAAAA;AACrC,EAAA;;;;AAKAK,EAAAA,KAAAA,CAAMN,YAAoBC,IAAAA,EAAuB;AAC/CC,IAAAA,MAAAA,CAAUI,KAAAA,CAAMN,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;AAC9B,EAAA;;;;AAKAM,EAAAA,KAAAA,CAAMP,YAAoBC,IAAAA,EAAuB;AAC/C,IAAA,IAAI,OAAA,IAAWC,MAAAA,IAAa,OAAOA,MAAAA,CAAUK,UAAU,UAAA,EAAY;AACjEL,MAAAA,MAAAA,CAAUK,KAAAA,CAAMP,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;IAC9B,CAAA,MAAO;AACLC,MAAAA,MAAAA,CAAUI,KAAAA,CAAMN,OAAAA,EAAAA,GAAYC,IAAAA,CAAAA;AAC9B,IAAA;AACF,EAAA;AACF;;;ACzBO,SAASO,sBACdC,YAAAA,EAA2B;AAQ3B,EAAA,IAAMC,QAAAA,GAAN,MAAMA,QAAAA,CAAAA;IAjDR;;;;;;AAqDI,IAAA,IAAIC,MAAAA,GAAwB;AAC1B,MAAA,OAAOF,YAAAA;AACT,IAAA;;;;;;;AAQA,IAAA,MAAMG,YAAeC,EAAAA,EAA4E;AAC/F,MAAA,OAAOJ,YAAAA,CAAaK,aAAaD,EAAAA,CAAAA;AACnC,IAAA;;;;;;AAOA,IAAA,MAAME,WAAAA,GAAgC;AACpC,MAAA,IAAI;AAEF,QAAA,IAAI,WAAA,IAAeN,YAAAA,IAAgB,OAAOA,YAAAA,CAAaO,cAAc,UAAA,EAAY;AAC/E,UAAA,MAAOP,YAAAA,CAAaO,SAAAA,CAAAA,QAAAA,CAAAA;AACtB,QAAA;AACA,QAAA,OAAO,IAAA;MACT,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AACT,MAAA;AACF,IAAA;AACF,GAAA;AAEA,EAAA,OAAON,QAAAA;AACT;AA9CgBF,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA","file":"chunk-QLVKMWFA.js","sourcesContent":["/**\n * Logger Service - Utility class for logging\n *\n * Provides structured logging functionality.\n * Wrap this class with decorators in your microservice for DI.\n *\n * @example\n * ```typescript\n * import { Logger } from '@burdenoff/be-sdk/graphql/services';\n * import { Injectable, Scope } from 'graphql-modules';\n *\n * // In your microservice\n * @Injectable({ scope: Scope.Singleton, global: true })\n * export class LoggerProvider extends Logger {}\n * ```\n */\n\nimport { logger as sdkLogger } from '../../logger/index.js';\n\nexport class Logger {\n /**\n * Log a message at INFO level\n */\n log(message: string, ...args: unknown[]): void {\n sdkLogger.info(message, ...args);\n }\n\n /**\n * Log a message at INFO level\n */\n info(message: string, ...args: unknown[]): void {\n sdkLogger.info(message, ...args);\n }\n\n /**\n * Log a message at WARN level\n */\n warn(message: string, ...args: unknown[]): void {\n sdkLogger.warn(message, ...args);\n }\n\n /**\n * Log a message at ERROR level\n */\n error(message: string, error?: Error | unknown, ...args: unknown[]): void {\n sdkLogger.error(message, error, ...args);\n }\n\n /**\n * Log a message at DEBUG level\n */\n debug(message: string, ...args: unknown[]): void {\n sdkLogger.debug(message, ...args);\n }\n\n /**\n * Log a message at TRACE level\n */\n trace(message: string, ...args: unknown[]): void {\n if ('trace' in sdkLogger && typeof sdkLogger.trace === 'function') {\n sdkLogger.trace(message, ...args);\n } else {\n sdkLogger.debug(message, ...args);\n }\n }\n}\n","/**\n * Database Service - Utility class for database operations\n *\n * Provides access to Prisma client for database operations.\n * Each microservice creates its own Database instance with its Prisma client.\n * Wrap the returned class with decorators in your microservice for DI.\n *\n * @example\n * ```typescript\n * // In your module definition:\n * import { createDatabaseService } from '@burdenoff/be-sdk/graphql/services';\n * import { prisma } from './utils/prisma.js';\n *\n * // Create base Database class from SDK\n * const BaseDatabaseService = createDatabaseService(prisma);\n *\n * // Wrap with decorators in your microservice\n * @Injectable({ scope: Scope.Singleton, global: true })\n * class DatabaseProvider extends BaseDatabaseService {}\n *\n * export const myModule = createModule({\n * providers: [DatabaseProvider, MyProvider, ...],\n * });\n * ```\n */\n\n/**\n * Type for Prisma client transaction\n */\nexport type PrismaTransactionClient<TPrismaClient> = Omit<\n TPrismaClient,\n '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends'\n>;\n\n/**\n * Create a Database service class with the provided Prisma client\n *\n * @param prismaClient - The Prisma client instance for this microservice\n * @returns Database service class (without decorators - add them in your microservice)\n */\nexport function createDatabaseService<TPrismaClient extends { $transaction: (...args: unknown[]) => Promise<unknown> }>(\n prismaClient: TPrismaClient\n): {\n new (): {\n readonly client: TPrismaClient;\n transaction<T>(fn: (tx: PrismaTransactionClient<TPrismaClient>) => Promise<T>): Promise<T>;\n isConnected(): Promise<boolean>;\n };\n} {\n class Database {\n /**\n * Get the Prisma client instance\n */\n get client(): TPrismaClient {\n return prismaClient;\n }\n\n /**\n * Execute a transaction\n *\n * @param fn - Transaction callback function\n * @returns Promise resolving to transaction result\n */\n async transaction<T>(fn: (tx: PrismaTransactionClient<TPrismaClient>) => Promise<T>): Promise<T> {\n return prismaClient.$transaction(fn) as Promise<T>;\n }\n\n /**\n * Check if database is connected\n *\n * @returns Promise resolving to true if connected, false otherwise\n */\n async isConnected(): Promise<boolean> {\n try {\n // Use $queryRaw if available, otherwise assume connected\n if ('$queryRaw' in prismaClient && typeof prismaClient.$queryRaw === 'function') {\n await (prismaClient.$queryRaw as (query: TemplateStringsArray) => Promise<unknown>)`SELECT 1`;\n }\n return true;\n } catch {\n return false;\n }\n }\n }\n\n return Database;\n}\n\n/**\n * Type helper to extract Database service type\n */\nexport type DatabaseService<TPrismaClient extends { $transaction: (...args: unknown[]) => Promise<unknown> }> =\n InstanceType<ReturnType<typeof createDatabaseService<TPrismaClient>>>;\n"]}