@dyrected/core 2.5.25 → 2.5.27

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 (162) hide show
  1. package/dist/__tests__/app.test.d.ts +2 -0
  2. package/dist/__tests__/app.test.d.ts.map +1 -0
  3. package/dist/__tests__/app.test.js +27 -0
  4. package/dist/__tests__/app.test.js.map +1 -0
  5. package/dist/__tests__/config.test.d.ts +2 -0
  6. package/dist/__tests__/config.test.d.ts.map +1 -0
  7. package/dist/__tests__/config.test.js +34 -0
  8. package/dist/__tests__/config.test.js.map +1 -0
  9. package/dist/__tests__/deleteMany.test.d.ts +2 -0
  10. package/dist/__tests__/deleteMany.test.d.ts.map +1 -0
  11. package/dist/__tests__/deleteMany.test.js +75 -0
  12. package/dist/__tests__/deleteMany.test.js.map +1 -0
  13. package/dist/__tests__/depth.test.d.ts +2 -0
  14. package/dist/__tests__/depth.test.d.ts.map +1 -0
  15. package/dist/__tests__/depth.test.js +81 -0
  16. package/dist/__tests__/depth.test.js.map +1 -0
  17. package/dist/__tests__/dynamic-options.test.d.ts +2 -0
  18. package/dist/__tests__/dynamic-options.test.d.ts.map +1 -0
  19. package/dist/__tests__/dynamic-options.test.js +132 -0
  20. package/dist/__tests__/dynamic-options.test.js.map +1 -0
  21. package/dist/__tests__/field-inference.test-types.d.ts +24 -0
  22. package/dist/__tests__/field-inference.test-types.d.ts.map +1 -0
  23. package/dist/__tests__/field-inference.test-types.js +87 -0
  24. package/dist/__tests__/field-inference.test-types.js.map +1 -0
  25. package/dist/__tests__/hooks.test.d.ts +2 -0
  26. package/dist/__tests__/hooks.test.d.ts.map +1 -0
  27. package/dist/__tests__/hooks.test.js +320 -0
  28. package/dist/__tests__/hooks.test.js.map +1 -0
  29. package/dist/__tests__/mocks.d.ts +68 -0
  30. package/dist/__tests__/mocks.d.ts.map +1 -0
  31. package/dist/__tests__/mocks.js +151 -0
  32. package/dist/__tests__/mocks.js.map +1 -0
  33. package/dist/__tests__/router.test.d.ts +2 -0
  34. package/dist/__tests__/router.test.d.ts.map +1 -0
  35. package/dist/__tests__/router.test.js +48 -0
  36. package/dist/__tests__/router.test.js.map +1 -0
  37. package/dist/__tests__/where.test.d.ts +2 -0
  38. package/dist/__tests__/where.test.d.ts.map +1 -0
  39. package/dist/__tests__/where.test.js +97 -0
  40. package/dist/__tests__/where.test.js.map +1 -0
  41. package/dist/app-BOrsS7Tz.d.cts +1771 -0
  42. package/dist/app-BOrsS7Tz.d.ts +1771 -0
  43. package/dist/app.d.ts +21 -0
  44. package/dist/app.d.ts.map +1 -0
  45. package/dist/app.js +56 -0
  46. package/dist/app.js.map +1 -0
  47. package/dist/auth/jexl.d.ts +10 -0
  48. package/dist/auth/jexl.d.ts.map +1 -0
  49. package/dist/auth/jexl.js +22 -0
  50. package/dist/auth/jexl.js.map +1 -0
  51. package/dist/auth/password.d.ts +10 -0
  52. package/dist/auth/password.d.ts.map +1 -0
  53. package/dist/auth/password.js +28 -0
  54. package/dist/auth/password.js.map +1 -0
  55. package/dist/auth/token.d.ts +20 -0
  56. package/dist/auth/token.d.ts.map +1 -0
  57. package/dist/auth/token.js +40 -0
  58. package/dist/auth/token.js.map +1 -0
  59. package/dist/chunk-SUGK7UYL.js +311 -0
  60. package/dist/chunk-ZFAOBRHT.js +2709 -0
  61. package/dist/controllers/auth.controller.d.ts +125 -0
  62. package/dist/controllers/auth.controller.d.ts.map +1 -0
  63. package/dist/controllers/auth.controller.js +323 -0
  64. package/dist/controllers/auth.controller.js.map +1 -0
  65. package/dist/controllers/collection.controller.d.ts +88 -0
  66. package/dist/controllers/collection.controller.d.ts.map +1 -0
  67. package/dist/controllers/collection.controller.js +554 -0
  68. package/dist/controllers/collection.controller.js.map +1 -0
  69. package/dist/controllers/global.controller.d.ts +17 -0
  70. package/dist/controllers/global.controller.d.ts.map +1 -0
  71. package/dist/controllers/global.controller.js +116 -0
  72. package/dist/controllers/global.controller.js.map +1 -0
  73. package/dist/controllers/media.controller.d.ts +36 -0
  74. package/dist/controllers/media.controller.d.ts.map +1 -0
  75. package/dist/controllers/media.controller.js +155 -0
  76. package/dist/controllers/media.controller.js.map +1 -0
  77. package/dist/controllers/preview.controller.d.ts +37 -0
  78. package/dist/controllers/preview.controller.d.ts.map +1 -0
  79. package/dist/controllers/preview.controller.js +48 -0
  80. package/dist/controllers/preview.controller.js.map +1 -0
  81. package/dist/index-Bp7PDOYG.d.cts +1750 -0
  82. package/dist/index-Bp7PDOYG.d.ts +1750 -0
  83. package/dist/index-DfAmTZXk.d.cts +1749 -0
  84. package/dist/index-DfAmTZXk.d.ts +1749 -0
  85. package/dist/index.cjs +2 -2396
  86. package/dist/index.d.cts +2 -4
  87. package/dist/index.d.ts +2 -4
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +3 -5
  90. package/dist/index.js.map +1 -0
  91. package/dist/middleware/auth.d.ts +18 -0
  92. package/dist/middleware/auth.d.ts.map +1 -0
  93. package/dist/middleware/auth.js +45 -0
  94. package/dist/middleware/auth.js.map +1 -0
  95. package/dist/router.d.ts +8 -0
  96. package/dist/router.d.ts.map +1 -0
  97. package/dist/router.js +463 -0
  98. package/dist/router.js.map +1 -0
  99. package/dist/server.cjs +103 -0
  100. package/dist/server.d.cts +22 -4
  101. package/dist/server.d.ts +22 -4
  102. package/dist/server.d.ts.map +1 -0
  103. package/dist/server.js +2429 -8
  104. package/dist/server.js.map +1 -0
  105. package/dist/services/audit.service.d.ts +23 -0
  106. package/dist/services/audit.service.d.ts.map +1 -0
  107. package/dist/services/audit.service.js +28 -0
  108. package/dist/services/audit.service.js.map +1 -0
  109. package/dist/services/defaults.service.d.ts +8 -0
  110. package/dist/services/defaults.service.d.ts.map +1 -0
  111. package/dist/services/defaults.service.js +55 -0
  112. package/dist/services/defaults.service.js.map +1 -0
  113. package/dist/services/email.service.d.ts +33 -0
  114. package/dist/services/email.service.d.ts.map +1 -0
  115. package/dist/services/email.service.js +219 -0
  116. package/dist/services/email.service.js.map +1 -0
  117. package/dist/services/media.service.d.ts +20 -0
  118. package/dist/services/media.service.d.ts.map +1 -0
  119. package/dist/services/media.service.js +49 -0
  120. package/dist/services/media.service.js.map +1 -0
  121. package/dist/services/population.service.d.ts +20 -0
  122. package/dist/services/population.service.d.ts.map +1 -0
  123. package/dist/services/population.service.js +168 -0
  124. package/dist/services/population.service.js.map +1 -0
  125. package/dist/types/index.d.ts +1749 -0
  126. package/dist/types/index.d.ts.map +1 -0
  127. package/dist/types/index.js +3 -0
  128. package/dist/types/index.js.map +1 -0
  129. package/dist/utils/config.d.ts +8 -0
  130. package/dist/utils/config.d.ts.map +1 -0
  131. package/dist/utils/config.js +153 -0
  132. package/dist/utils/config.js.map +1 -0
  133. package/dist/utils/hooks.d.ts +41 -0
  134. package/dist/utils/hooks.d.ts.map +1 -0
  135. package/dist/utils/hooks.js +169 -0
  136. package/dist/utils/hooks.js.map +1 -0
  137. package/dist/utils/openapi.d.ts +6 -0
  138. package/dist/utils/openapi.d.ts.map +1 -0
  139. package/dist/utils/openapi.js +331 -0
  140. package/dist/utils/openapi.js.map +1 -0
  141. package/dist/utils/parse-where.d.ts +63 -0
  142. package/dist/utils/parse-where.d.ts.map +1 -0
  143. package/dist/utils/parse-where.js +196 -0
  144. package/dist/utils/parse-where.js.map +1 -0
  145. package/dist/utils/readonly-db.d.ts +9 -0
  146. package/dist/utils/readonly-db.d.ts.map +1 -0
  147. package/dist/utils/readonly-db.js +21 -0
  148. package/dist/utils/readonly-db.js.map +1 -0
  149. package/dist/utils/setup-prompt.d.ts +11 -0
  150. package/dist/utils/setup-prompt.d.ts.map +1 -0
  151. package/dist/utils/setup-prompt.js +863 -0
  152. package/dist/utils/setup-prompt.js.map +1 -0
  153. package/dist/utils/swagger.d.ts +5 -0
  154. package/dist/utils/swagger.d.ts.map +1 -0
  155. package/dist/utils/swagger.js +51 -0
  156. package/dist/utils/swagger.js.map +1 -0
  157. package/dist/utils/where-sanitizer.d.ts +10 -0
  158. package/dist/utils/where-sanitizer.d.ts.map +1 -0
  159. package/dist/utils/where-sanitizer.js +63 -0
  160. package/dist/utils/where-sanitizer.js.map +1 -0
  161. package/dist/where-sanitizer-DQIWTQZW.js +50 -0
  162. package/package.json +1 -1
@@ -0,0 +1,554 @@
1
+ import { PopulationService } from '../services/population.service.js';
2
+ import { DefaultsService } from '../services/defaults.service.js';
3
+ import { AuditService } from '../services/audit.service.js';
4
+ import { hashPassword, verifyPassword } from '../auth/password.js';
5
+ import { runCollectionHooks, executeFieldBeforeChange, executeFieldAfterRead } from '../utils/hooks.js';
6
+ import { createReadonlyDb } from '../utils/readonly-db.js';
7
+ export class CollectionController {
8
+ collection;
9
+ constructor(collection) {
10
+ this.collection = collection;
11
+ }
12
+ async find(c) {
13
+ const config = c.get('config');
14
+ const db = config.db;
15
+ if (!db)
16
+ return c.json({ message: 'Database not configured' }, 500);
17
+ const readonlyDb = createReadonlyDb(db);
18
+ const limit = Number(c.req.query('limit')) || 10;
19
+ const page = Number(c.req.query('page')) || 1;
20
+ const depth = c.req.query('depth') !== undefined ? Number(c.req.query('depth')) : 2;
21
+ const sort = c.req.query('sort') || undefined;
22
+ const user = c.get('user');
23
+ let where = undefined;
24
+ const whereRaw = c.req.query('where');
25
+ if (whereRaw) {
26
+ try {
27
+ where = JSON.parse(decodeURIComponent(whereRaw));
28
+ }
29
+ catch {
30
+ // Not valid JSON — fall through without a where clause
31
+ }
32
+ }
33
+ if (where) {
34
+ if (this.collection.admin?.filterable === false) {
35
+ where = undefined;
36
+ }
37
+ else {
38
+ const { sanitizeWhereClause } = await import('../utils/where-sanitizer.js');
39
+ where = sanitizeWhereClause(where, this.collection.fields);
40
+ // If where ends up being an empty object after sanitization, drop it
41
+ if (Object.keys(where).length === 0) {
42
+ where = undefined;
43
+ }
44
+ }
45
+ }
46
+ // Run beforeRead collection hook
47
+ const beforeReadResult = await runCollectionHooks(this.collection.hooks?.beforeRead, {
48
+ req: c.req,
49
+ query: where,
50
+ user,
51
+ db: readonlyDb,
52
+ });
53
+ if (beforeReadResult !== undefined) {
54
+ where = beforeReadResult;
55
+ }
56
+ let result = await db.find({
57
+ collection: this.collection.slug,
58
+ limit,
59
+ page,
60
+ sort,
61
+ where,
62
+ });
63
+ // Auto-seeding if empty and initialData is provided
64
+ if (result.total === 0 && this.collection.initialData && !where && page === 1) {
65
+ console.log(`[dyrected/core] Auto-seeding collection "${this.collection.slug}" from config.initialData`);
66
+ for (const data of this.collection.initialData) {
67
+ await db.create({ collection: this.collection.slug, data });
68
+ }
69
+ // Re-fetch result after seeding
70
+ result = await db.find({
71
+ collection: this.collection.slug,
72
+ limit,
73
+ page,
74
+ sort,
75
+ where,
76
+ });
77
+ }
78
+ result.docs = result.docs.map(doc => DefaultsService.apply(this.collection.fields, doc));
79
+ // Run afterRead hooks (both collection and field levels)
80
+ const processedDocs = [];
81
+ for (const doc of result.docs) {
82
+ const docWithCollectionHooks = await runCollectionHooks(this.collection.hooks?.afterRead, {
83
+ doc,
84
+ req: c.req,
85
+ user,
86
+ db: readonlyDb,
87
+ });
88
+ const docWithFieldHooks = await executeFieldAfterRead(this.collection.fields, docWithCollectionHooks, user, readonlyDb);
89
+ processedDocs.push(docWithFieldHooks);
90
+ }
91
+ result.docs = processedDocs;
92
+ if (depth > 0) {
93
+ const populationService = new PopulationService(db, config.collections);
94
+ result = await populationService.populateResult(result, this.collection.fields, depth);
95
+ }
96
+ return c.json(result);
97
+ }
98
+ async findOne(c) {
99
+ const config = c.get('config');
100
+ const db = config.db;
101
+ if (!db)
102
+ return c.json({ message: 'Database not configured' }, 500);
103
+ const readonlyDb = createReadonlyDb(db);
104
+ const id = c.req.param('id');
105
+ const depth = c.req.query('depth') !== undefined ? Number(c.req.query('depth')) : 10;
106
+ const user = c.get('user');
107
+ if (!id)
108
+ return c.json({ message: 'Missing ID' }, 400);
109
+ const doc = await db.findOne({ collection: this.collection.slug, id });
110
+ if (!doc)
111
+ return c.json({ message: 'Not Found' }, 404);
112
+ const docWithDefaults = DefaultsService.apply(this.collection.fields, doc);
113
+ // Run afterRead hooks
114
+ const docWithCollectionHooks = await runCollectionHooks(this.collection.hooks?.afterRead, {
115
+ doc: docWithDefaults,
116
+ req: c.req,
117
+ user,
118
+ db: readonlyDb,
119
+ });
120
+ const docWithFieldHooks = await executeFieldAfterRead(this.collection.fields, docWithCollectionHooks, user, readonlyDb);
121
+ if (depth > 0 && docWithFieldHooks) {
122
+ const populationService = new PopulationService(db, config.collections);
123
+ const populatedDoc = await populationService.populate({
124
+ data: docWithFieldHooks,
125
+ fields: this.collection.fields,
126
+ currentDepth: 0,
127
+ maxDepth: depth,
128
+ });
129
+ return c.json(populatedDoc);
130
+ }
131
+ return c.json(docWithFieldHooks);
132
+ }
133
+ async create(c) {
134
+ const config = c.get('config');
135
+ const db = config.db;
136
+ if (!db)
137
+ return c.json({ message: 'Database not configured' }, 500);
138
+ const readonlyDb = createReadonlyDb(db);
139
+ const contentType = c.req.header('Content-Type') || '';
140
+ if (contentType.toLowerCase().includes('multipart/form-data')) {
141
+ return this.upload(c);
142
+ }
143
+ const body = await c.req.json();
144
+ const user = c.get('user');
145
+ const now = new Date().toISOString();
146
+ let data = {
147
+ ...body,
148
+ createdAt: now,
149
+ updatedAt: now,
150
+ createdBy: user?.sub ?? null,
151
+ updatedBy: user?.sub ?? null,
152
+ };
153
+ if (this.collection.auth && data.password) {
154
+ data.password = await hashPassword(data.password);
155
+ }
156
+ // Run beforeChange hooks (field-level then collection-level)
157
+ data = await executeFieldBeforeChange(this.collection.fields, data, null, user, readonlyDb);
158
+ data = await runCollectionHooks(this.collection.hooks?.beforeChange, {
159
+ data,
160
+ req: c.req,
161
+ user,
162
+ operation: 'create',
163
+ db: readonlyDb,
164
+ });
165
+ const doc = await db.create({ collection: this.collection.slug, data });
166
+ if (this.collection.audit && db) {
167
+ AuditService.log(db, {
168
+ operation: 'create',
169
+ collection: this.collection.slug,
170
+ documentId: doc.id,
171
+ user: user ? { id: user.sub, collection: user.collection, email: user.email } : undefined,
172
+ before: null,
173
+ after: doc,
174
+ });
175
+ }
176
+ // Run afterChange collection hooks (full db access)
177
+ await runCollectionHooks(this.collection.hooks?.afterChange, {
178
+ doc,
179
+ user,
180
+ req: c.req,
181
+ operation: 'create',
182
+ db,
183
+ }, { isolated: true });
184
+ // Run afterRead hooks on the returned doc
185
+ const readDoc = await runCollectionHooks(this.collection.hooks?.afterRead, {
186
+ doc,
187
+ req: c.req,
188
+ user,
189
+ db: readonlyDb,
190
+ });
191
+ const finalDoc = await executeFieldAfterRead(this.collection.fields, readDoc, user, readonlyDb);
192
+ return c.json(finalDoc, 201);
193
+ }
194
+ async upload(c) {
195
+ const config = c.get('config');
196
+ const storage = config.storage;
197
+ if (!storage)
198
+ return c.json({ message: 'Storage not configured' }, 500);
199
+ const db = config.db;
200
+ if (!db)
201
+ return c.json({ message: 'Database not configured' }, 500);
202
+ const readonlyDb = createReadonlyDb(db);
203
+ const formData = await c.req.formData();
204
+ const file = formData.get('file');
205
+ if (!file)
206
+ return c.json({ message: 'No file uploaded' }, 400);
207
+ const buffer = new Uint8Array(await file.arrayBuffer());
208
+ const siteId = c.get('siteId');
209
+ const workspaceId = c.get('workspaceId');
210
+ const prefix = workspaceId ? `${workspaceId}/${siteId}` : siteId;
211
+ const fileData = await storage.upload({
212
+ filename: file.name,
213
+ buffer,
214
+ mimeType: file.type,
215
+ prefix,
216
+ });
217
+ const otherData = {};
218
+ formData.forEach((value, key) => {
219
+ if (key !== 'file' && typeof value === 'string') {
220
+ otherData[key] = value;
221
+ }
222
+ });
223
+ const user = c.get('user');
224
+ const now = new Date().toISOString();
225
+ let data = {
226
+ ...otherData,
227
+ ...fileData,
228
+ createdAt: now,
229
+ updatedAt: now,
230
+ createdBy: user?.sub ?? null,
231
+ updatedBy: user?.sub ?? null,
232
+ };
233
+ // Run beforeChange hooks for upload too
234
+ data = await executeFieldBeforeChange(this.collection.fields, data, null, user, readonlyDb);
235
+ data = await runCollectionHooks(this.collection.hooks?.beforeChange, {
236
+ data,
237
+ req: c.req,
238
+ user,
239
+ operation: 'create',
240
+ db: readonlyDb,
241
+ });
242
+ const doc = await db.create({
243
+ collection: this.collection.slug,
244
+ data,
245
+ });
246
+ // Run afterChange hooks for uploads (full db access)
247
+ await runCollectionHooks(this.collection.hooks?.afterChange, {
248
+ doc,
249
+ user,
250
+ req: c.req,
251
+ operation: 'create',
252
+ db,
253
+ }, { isolated: true });
254
+ // Run afterRead hooks
255
+ const readDoc = await runCollectionHooks(this.collection.hooks?.afterRead, {
256
+ doc,
257
+ req: c.req,
258
+ user,
259
+ db: readonlyDb,
260
+ });
261
+ const finalDoc = await executeFieldAfterRead(this.collection.fields, readDoc, user, readonlyDb);
262
+ return c.json(finalDoc, 201);
263
+ }
264
+ async update(c) {
265
+ const config = c.get('config');
266
+ const db = config.db;
267
+ if (!db)
268
+ return c.json({ message: 'Database not configured' }, 500);
269
+ const readonlyDb = createReadonlyDb(db);
270
+ const id = c.req.param('id');
271
+ if (!id)
272
+ return c.json({ message: 'Missing ID' }, 400);
273
+ const body = await c.req.json();
274
+ const user = c.get('user');
275
+ // Strip auth-only fields from general updates — use /change-password for that
276
+ let data = { ...body };
277
+ if (this.collection.auth) {
278
+ delete data.password;
279
+ delete data.oldPassword;
280
+ delete data.confirmPassword;
281
+ }
282
+ Object.assign(data, {
283
+ updatedAt: new Date().toISOString(),
284
+ updatedBy: user?.sub ?? null,
285
+ });
286
+ const originalDoc = await db.findOne({ collection: this.collection.slug, id });
287
+ if (!originalDoc)
288
+ return c.json({ message: 'Not Found' }, 404);
289
+ let before = null;
290
+ if (this.collection.audit) {
291
+ before = originalDoc;
292
+ }
293
+ // Run beforeChange hooks (field-level then collection-level)
294
+ data = await executeFieldBeforeChange(this.collection.fields, data, originalDoc, user, readonlyDb);
295
+ data = await runCollectionHooks(this.collection.hooks?.beforeChange, {
296
+ data,
297
+ doc: originalDoc,
298
+ req: c.req,
299
+ user,
300
+ operation: 'update',
301
+ db: readonlyDb,
302
+ });
303
+ const doc = await db.update({ collection: this.collection.slug, id, data });
304
+ if (this.collection.audit && db) {
305
+ AuditService.log(db, {
306
+ operation: 'update',
307
+ collection: this.collection.slug,
308
+ documentId: id,
309
+ user: user ? { id: user.sub, collection: user.collection, email: user.email } : undefined,
310
+ before,
311
+ after: doc,
312
+ });
313
+ }
314
+ // Run afterChange collection hooks (full db access)
315
+ await runCollectionHooks(this.collection.hooks?.afterChange, {
316
+ doc,
317
+ previousDoc: originalDoc,
318
+ user,
319
+ req: c.req,
320
+ operation: 'update',
321
+ db,
322
+ }, { isolated: true });
323
+ // Run afterRead hooks
324
+ const readDoc = await runCollectionHooks(this.collection.hooks?.afterRead, {
325
+ doc,
326
+ req: c.req,
327
+ user,
328
+ db: readonlyDb,
329
+ });
330
+ const finalDoc = await executeFieldAfterRead(this.collection.fields, readDoc, user, readonlyDb);
331
+ return c.json(finalDoc);
332
+ }
333
+ /**
334
+ * POST /api/collections/:slug/:id/change-password
335
+ *
336
+ * Dedicated endpoint for password changes. Requires the caller to supply:
337
+ * { oldPassword, newPassword, confirmPassword }
338
+ *
339
+ * Rules:
340
+ * - Only the account owner or an admin may change the password.
341
+ * - Non-admin callers MUST provide a valid oldPassword.
342
+ * - newPassword and confirmPassword must match.
343
+ */
344
+ async changePassword(c) {
345
+ const config = c.get('config');
346
+ const db = config.db;
347
+ if (!db)
348
+ return c.json({ message: 'Database not configured' }, 500);
349
+ if (!this.collection.auth) {
350
+ return c.json({ message: 'This collection does not support authentication' }, 400);
351
+ }
352
+ const id = c.req.param('id');
353
+ if (!id)
354
+ return c.json({ message: 'Missing ID' }, 400);
355
+ const user = c.get('user');
356
+ if (!user)
357
+ return c.json({ message: 'Authentication required' }, 401);
358
+ const body = await c.req.json().catch(() => null);
359
+ const { oldPassword, newPassword, confirmPassword } = body ?? {};
360
+ if (!newPassword) {
361
+ return c.json({ message: 'newPassword is required' }, 400);
362
+ }
363
+ if (newPassword !== confirmPassword) {
364
+ return c.json({ message: 'Passwords do not match' }, 400);
365
+ }
366
+ if (newPassword.length < 8) {
367
+ return c.json({ message: 'Password must be at least 8 characters' }, 400);
368
+ }
369
+ const isAdmin = Array.isArray(user.roles) && user.roles.includes('admin');
370
+ const isSelf = user.sub === id;
371
+ if (!isAdmin && !isSelf) {
372
+ return c.json({ message: 'You are not authorised to change this password' }, 403);
373
+ }
374
+ // Non-admins must verify their current password
375
+ if (!isAdmin) {
376
+ if (!oldPassword) {
377
+ return c.json({ message: 'Current password is required' }, 400);
378
+ }
379
+ const existing = await db.findOne({ collection: this.collection.slug, id });
380
+ if (!existing)
381
+ return c.json({ message: 'User not found' }, 404);
382
+ const valid = await verifyPassword(oldPassword, existing.password);
383
+ if (!valid) {
384
+ return c.json({ message: 'Invalid current password' }, 400);
385
+ }
386
+ }
387
+ const hashed = await hashPassword(newPassword);
388
+ const doc = await db.update({
389
+ collection: this.collection.slug,
390
+ id,
391
+ data: {
392
+ password: hashed,
393
+ updatedAt: new Date().toISOString(),
394
+ updatedBy: user.sub,
395
+ },
396
+ });
397
+ if (this.collection.audit) {
398
+ AuditService.log(db, {
399
+ operation: 'update',
400
+ collection: this.collection.slug,
401
+ documentId: id,
402
+ user: { id: user.sub, collection: user.collection, email: user.email },
403
+ before: null,
404
+ after: { id },
405
+ });
406
+ }
407
+ return c.json({ success: true, message: 'Password updated successfully' });
408
+ }
409
+ async delete(c) {
410
+ const config = c.get('config');
411
+ const db = config.db;
412
+ if (!db)
413
+ return c.json({ message: 'Database not configured' }, 500);
414
+ const readonlyDb = createReadonlyDb(db);
415
+ const id = c.req.param('id');
416
+ if (!id)
417
+ return c.json({ message: 'Missing ID' }, 400);
418
+ const user = c.get('user');
419
+ const doc = await db.findOne({ collection: this.collection.slug, id });
420
+ if (!doc)
421
+ return c.json({ message: 'Not Found' }, 404);
422
+ let before = null;
423
+ if (this.collection.audit) {
424
+ before = doc;
425
+ }
426
+ // Run beforeDelete collection hook
427
+ await runCollectionHooks(this.collection.hooks?.beforeDelete, {
428
+ id,
429
+ doc,
430
+ user,
431
+ req: c.req,
432
+ db: readonlyDb,
433
+ });
434
+ await db.delete({ collection: this.collection.slug, id });
435
+ if (this.collection.audit && db) {
436
+ AuditService.log(db, {
437
+ operation: 'delete',
438
+ collection: this.collection.slug,
439
+ documentId: id,
440
+ user: user ? { id: user.sub, collection: user.collection, email: user.email } : undefined,
441
+ before,
442
+ after: null,
443
+ });
444
+ }
445
+ // Run afterDelete collection hook (full db access)
446
+ await runCollectionHooks(this.collection.hooks?.afterDelete, {
447
+ id,
448
+ doc,
449
+ user,
450
+ req: c.req,
451
+ db,
452
+ }, { isolated: true });
453
+ return c.json({ message: 'Deleted' });
454
+ }
455
+ async deleteMany(c) {
456
+ const config = c.get('config');
457
+ const db = config.db;
458
+ if (!db)
459
+ return c.json({ message: 'Database not configured' }, 500);
460
+ const readonlyDb = createReadonlyDb(db);
461
+ const user = c.get('user');
462
+ // ids may arrive as a query-string array (?ids[]=a&ids[]=b) or JSON body
463
+ let ids = [];
464
+ try {
465
+ const body = await c.req.json().catch(() => null);
466
+ if (body?.ids && Array.isArray(body.ids)) {
467
+ ids = body.ids;
468
+ }
469
+ }
470
+ catch {
471
+ // fall through to query-string
472
+ }
473
+ if (!ids.length) {
474
+ const raw = c.req.queries('ids') ?? c.req.queries('ids[]') ?? [];
475
+ ids = raw.filter(Boolean);
476
+ }
477
+ if (!ids.length)
478
+ return c.json({ message: 'No IDs provided' }, 400);
479
+ const deleted = [];
480
+ const failed = [];
481
+ for (const id of ids) {
482
+ try {
483
+ const doc = await db.findOne({ collection: this.collection.slug, id });
484
+ if (!doc) {
485
+ failed.push({ id, error: 'Not Found' });
486
+ continue;
487
+ }
488
+ let before = null;
489
+ if (this.collection.audit) {
490
+ before = doc;
491
+ }
492
+ // Run beforeDelete hooks
493
+ await runCollectionHooks(this.collection.hooks?.beforeDelete, {
494
+ id,
495
+ doc,
496
+ user,
497
+ req: c.req,
498
+ db: readonlyDb,
499
+ });
500
+ await db.delete({ collection: this.collection.slug, id });
501
+ deleted.push(id);
502
+ if (this.collection.audit) {
503
+ AuditService.log(db, {
504
+ operation: 'delete',
505
+ collection: this.collection.slug,
506
+ documentId: id,
507
+ user: user ? { id: user.sub, collection: user.collection, email: user.email } : undefined,
508
+ before,
509
+ after: null,
510
+ });
511
+ }
512
+ // Run afterDelete hooks (full db access)
513
+ await runCollectionHooks(this.collection.hooks?.afterDelete, {
514
+ id,
515
+ doc,
516
+ user,
517
+ req: c.req,
518
+ db,
519
+ }, { isolated: true });
520
+ }
521
+ catch (err) {
522
+ failed.push({ id, error: err?.message ?? 'Unknown error' });
523
+ }
524
+ }
525
+ return c.json({
526
+ message: `Deleted ${deleted.length} document(s)`,
527
+ deleted,
528
+ ...(failed.length ? { failed } : {}),
529
+ });
530
+ }
531
+ async seed(c) {
532
+ const config = c.get('config');
533
+ const db = config.db;
534
+ if (!db)
535
+ return c.json({ message: 'Database not configured' }, 500);
536
+ const body = await c.req.json();
537
+ const initialData = body.data;
538
+ if (!initialData || !Array.isArray(initialData)) {
539
+ return c.json({ message: 'Invalid initial data' }, 400);
540
+ }
541
+ const result = await db.find({ collection: this.collection.slug, limit: 1 });
542
+ if (result.total > 0) {
543
+ return c.json({ message: 'Collection is not empty, skipping seed' });
544
+ }
545
+ console.log(`[dyrected/core] Auto-seeding collection: ${this.collection.slug}`);
546
+ const createdDocs = [];
547
+ for (const data of initialData) {
548
+ const doc = await db.create({ collection: this.collection.slug, data });
549
+ createdDocs.push(doc);
550
+ }
551
+ return c.json({ message: 'Seed successful', count: createdDocs.length }, 201);
552
+ }
553
+ }
554
+ //# sourceMappingURL=collection.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.controller.js","sourceRoot":"","sources":["../../src/controllers/collection.controller.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,OAAO,oBAAoB;IACvB,UAAU,CAAmB;IAErC,YAAY,UAA4B;QACtC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAA2B;QACpC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;QAC9C,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,KAAK,GAAQ,SAAS,CAAC;QAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,uDAAuD;YACzD,CAAC;QACH,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC;gBAChD,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;gBAC5E,KAAK,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC3D,qEAAqE;gBACrE,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACpC,KAAK,GAAG,SAAS,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE;YACnF,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,KAAK,EAAE,KAAK;YACZ,IAAI;YACJ,EAAE,EAAE,UAAU;SACf,CAAC,CAAC;QACH,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,KAAK,GAAG,gBAAgB,CAAC;QAC3B,CAAC;QAED,IAAI,MAAM,GAAG,MAAM,EAAG,CAAC,IAAI,CAAC;YAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAChC,KAAK;YACL,IAAI;YACJ,IAAI;YACJ,KAAK;SACN,CAAC,CAAC;QAEH,oDAAoD;QACpD,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,4CAA4C,IAAI,CAAC,UAAU,CAAC,IAAI,2BAA2B,CAAC,CAAC;YACzG,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;gBAC/C,MAAM,EAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,gCAAgC;YAChC,MAAM,GAAG,MAAM,EAAG,CAAC,IAAI,CAAC;gBACtB,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;gBAChC,KAAK;gBACL,IAAI;gBACJ,IAAI;gBACJ,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QAEzF,yDAAyD;QACzD,MAAM,aAAa,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,sBAAsB,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE;gBACxF,GAAG;gBACH,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,IAAI;gBACJ,EAAE,EAAE,UAAU;aACf,CAAC,CAAC;YACH,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACxH,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,CAAC,IAAI,GAAG,aAAa,CAAC;QAE5B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,EAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACzE,MAAM,GAAG,MAAM,iBAAiB,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAA2B;QACvC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,EAAG,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QAEvD,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE3E,sBAAsB;QACtB,MAAM,sBAAsB,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE;YACxF,GAAG,EAAE,eAAe;YACpB,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI;YACJ,EAAE,EAAE,UAAU;SACf,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAExH,IAAI,KAAK,GAAG,CAAC,IAAI,iBAAiB,EAAE,CAAC;YACnC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,EAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC;gBACpD,IAAI,EAAE,iBAAiB;gBACvB,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;gBAC9B,YAAY,EAAE,CAAC;gBACf,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAA2B;QACtC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAEvD,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,IAAI,GAAG;YACT,GAAG,IAAI;YACP,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;YAC5B,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;SAC7B,CAAC;QAEF,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAI,CAAC,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;QAED,6DAA6D;QAC7D,IAAI,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5F,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE;YACnE,IAAI;YACJ,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI;YACJ,SAAS,EAAE,QAAQ;YACnB,EAAE,EAAE,UAAU;SACf,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,EAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzE,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YAChC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;gBAChC,UAAU,EAAE,GAAG,CAAC,EAAE;gBAClB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;gBACzF,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;QACL,CAAC;QAED,oDAAoD;QACpD,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE;YAC3D,GAAG;YACH,IAAI;YACJ,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,SAAS,EAAE,QAAQ;YACnB,EAAE;SACH,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvB,0CAA0C;QAC1C,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE;YACzE,GAAG;YACH,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI;YACJ,EAAE,EAAE,UAAU;SACf,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAEhG,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAA2B;QACtC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;QAExE,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAQ,CAAC;QACzC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAEjE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;YACpC,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,SAAS,GAAQ,EAAE,CAAC;QAC1B,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,IAAI,GAAG,KAAK,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAChD,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,IAAI,GAAG;YACT,GAAG,SAAS;YACZ,GAAG,QAAQ;YACX,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;YAC5B,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;SAC7B,CAAC;QAEF,wCAAwC;QACxC,IAAI,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5F,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE;YACnE,IAAI;YACJ,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI;YACJ,SAAS,EAAE,QAAQ;YACnB,EAAE,EAAE,UAAU;SACf,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC;YAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAChC,IAAI;SACL,CAAC,CAAC;QAEH,qDAAqD;QACrD,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE;YAC3D,GAAG;YACH,IAAI;YACJ,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,SAAS,EAAE,QAAQ;YACnB,EAAE;SACH,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvB,sBAAsB;QACtB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE;YACzE,GAAG;YACH,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI;YACJ,EAAE,EAAE,UAAU;SACf,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAEhG,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAA2B;QACtC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,8EAA8E;QAC9E,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,QAAQ,CAAC;YACrB,OAAO,IAAI,CAAC,WAAW,CAAC;YACxB,OAAO,IAAI,CAAC,eAAe,CAAC;QAC9B,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;SAC7B,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAM,EAAG,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QAE/D,IAAI,MAAM,GAAQ,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,GAAG,WAAW,CAAC;QACvB,CAAC;QAED,6DAA6D;QAC7D,IAAI,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACnG,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE;YACnE,IAAI;YACJ,GAAG,EAAE,WAAW;YAChB,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI;YACJ,SAAS,EAAE,QAAQ;YACnB,EAAE,EAAE,UAAU;SACf,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,EAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7E,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YAChC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;gBAChC,UAAU,EAAE,EAAE;gBACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;gBACzF,MAAM;gBACN,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;QACL,CAAC;QAED,oDAAoD;QACpD,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE;YAC3D,GAAG;YACH,WAAW,EAAE,WAAW;YACxB,IAAI;YACJ,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,SAAS,EAAE,QAAQ;YACnB,EAAE;SACH,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvB,sBAAsB;QACtB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE;YACzE,GAAG;YACH,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI;YACJ,EAAE,EAAE,UAAU;SACf,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAEhG,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,cAAc,CAAC,CAA2B;QAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEpE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iDAAiD,EAAE,EAAE,GAAG,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEtE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;QAEjE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;YACpC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wCAAwC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;QAE/B,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gDAAgD,EAAE,EAAE,GAAG,CAAC,CAAC;QACpF,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,8BAA8B,EAAE,EAAE,GAAG,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,EAAG,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;YAEjE,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAkB,CAAC,CAAC;YAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE,GAAG,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;QAE/C,MAAM,GAAG,GAAG,MAAM,EAAG,CAAC,MAAM,CAAC;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAChC,EAAE;YACF,IAAI,EAAE;gBACJ,QAAQ,EAAE,MAAM;gBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EAAE,IAAI,CAAC,GAAG;aACpB;SACF,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC1B,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;gBAChC,UAAU,EAAE,EAAE;gBACd,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;gBACtE,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,EAAE,EAAE,EAAE;aACd,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAA2B;QACtC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,MAAM,GAAG,GAAG,MAAM,EAAG,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QAEvD,IAAI,MAAM,GAAQ,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,CAAC;QACf,CAAC;QAED,mCAAmC;QACnC,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE;YAC5D,EAAE;YACF,GAAG;YACH,IAAI;YACJ,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,EAAE,EAAE,UAAU;SACf,CAAC,CAAC;QAEH,MAAM,EAAG,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAE3D,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YAChC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;gBAChC,UAAU,EAAE,EAAE;gBACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;gBACzF,MAAM;gBACN,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC;QAED,mDAAmD;QACnD,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE;YAC3D,EAAE;YACF,GAAG;YACH,IAAI;YACJ,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,EAAE;SACH,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,CAA2B;QAC1C,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,yEAAyE;QACzE,IAAI,GAAG,GAAa,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACjE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEpE,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAoC,EAAE,CAAC;QAEnD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvE,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;oBACxC,SAAS;gBACX,CAAC;gBAED,IAAI,MAAM,GAAQ,IAAI,CAAC;gBACvB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBAC1B,MAAM,GAAG,GAAG,CAAC;gBACf,CAAC;gBAED,yBAAyB;gBACzB,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE;oBAC5D,EAAE;oBACF,GAAG;oBACH,IAAI;oBACJ,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,EAAE,EAAE,UAAU;iBACf,CAAC,CAAC;gBAEH,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAEjB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBAC1B,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE;wBACnB,SAAS,EAAE,QAAQ;wBACnB,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;wBAChC,UAAU,EAAE,EAAE;wBACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;wBACzF,MAAM;wBACN,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAC;gBACL,CAAC;gBAED,yCAAyC;gBACzC,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE;oBAC3D,EAAE;oBACF,GAAG;oBACH,IAAI;oBACJ,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,EAAE;iBACH,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,WAAW,OAAO,CAAC,MAAM,cAAc;YAChD,OAAO;YACP,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAA2B;QACpC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QAEpE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;QAE9B,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7E,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,4CAA4C,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAChF,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;IAChF,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ import type { Context } from "hono";
2
+ import type { DyrectedContext } from "../app.js";
3
+ import type { GlobalConfig } from "../types/index.js";
4
+ export declare class GlobalController {
5
+ private global;
6
+ constructor(global: GlobalConfig);
7
+ get(c: Context<DyrectedContext>): Promise<Response & import("hono").TypedResponse<any, import("hono/utils/http-status").ContentfulStatusCode, "json">>;
8
+ update(c: Context<DyrectedContext>): Promise<(Response & import("hono").TypedResponse<{
9
+ [x: string]: import("hono/utils/types").JSONValue;
10
+ }, import("hono/utils/http-status").ContentfulStatusCode, "json">) | (Response & import("hono").TypedResponse<{
11
+ message: string;
12
+ }, 500, "json">)>;
13
+ seed(c: Context<DyrectedContext>): Promise<Response & import("hono").TypedResponse<{
14
+ message: string;
15
+ }, import("hono/utils/http-status").ContentfulStatusCode, "json">>;
16
+ }
17
+ //# sourceMappingURL=global.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.controller.d.ts","sourceRoot":"","sources":["../../src/controllers/global.controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMtD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAI1B,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAuD/B,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;;;;;IA8ClC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;;;CAuBvC"}