@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 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { DatabaseAdapter } from '../types/index.js';
2
+ export interface AuditLogArgs {
3
+ operation: 'create' | 'update' | 'delete';
4
+ collection: string;
5
+ documentId?: string;
6
+ user?: {
7
+ id: string;
8
+ collection: string;
9
+ email?: string;
10
+ };
11
+ /** Full state before the operation (null for create). */
12
+ before?: any;
13
+ /** Full state after the operation (null for delete). */
14
+ after?: any;
15
+ }
16
+ export declare class AuditService {
17
+ /**
18
+ * Writes a single entry to the __audit collection.
19
+ * Called without await — runs asynchronously and never blocks the primary operation.
20
+ */
21
+ static log(db: DatabaseAdapter, args: AuditLogArgs): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=audit.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.service.d.ts","sourceRoot":"","sources":["../../src/services/audit.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,yDAAyD;IACzD,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,wDAAwD;IACxD,KAAK,CAAC,EAAE,GAAG,CAAC;CACb;AAED,qBAAa,YAAY;IACvB;;;OAGG;WACU,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAoBzE"}
@@ -0,0 +1,28 @@
1
+ export class AuditService {
2
+ /**
3
+ * Writes a single entry to the __audit collection.
4
+ * Called without await — runs asynchronously and never blocks the primary operation.
5
+ */
6
+ static async log(db, args) {
7
+ try {
8
+ await db.create({
9
+ collection: '__audit',
10
+ data: {
11
+ collection: args.collection,
12
+ documentId: args.documentId ?? null,
13
+ operation: args.operation,
14
+ user: args.user?.id ?? null,
15
+ timestamp: new Date().toISOString(),
16
+ changes: JSON.stringify({
17
+ before: args.before ?? null,
18
+ after: args.after ?? null,
19
+ }),
20
+ },
21
+ });
22
+ }
23
+ catch (err) {
24
+ console.error('[dyrected/audit] Failed to write audit log:', err);
25
+ }
26
+ }
27
+ }
28
+ //# sourceMappingURL=audit.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.service.js","sourceRoot":"","sources":["../../src/services/audit.service.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,YAAY;IACvB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAmB,EAAE,IAAkB;QACtD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC;gBACd,UAAU,EAAE,SAAS;gBACrB,IAAI,EAAE;oBACJ,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;oBACnC,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI;oBAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACtB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;wBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;qBAC1B,CAAC;iBACH;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { Field } from '../types/index.js';
2
+ export declare class DefaultsService {
3
+ /**
4
+ * Recursively apply default values to a data object based on field definitions.
5
+ */
6
+ static apply(fields: Field[], data?: any): any;
7
+ }
8
+ //# sourceMappingURL=defaults.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.service.d.ts","sourceRoot":"","sources":["../../src/services/defaults.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,qBAAa,eAAe;IAC1B;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,GAAE,GAAQ,GAAG,GAAG;CA6CnD"}
@@ -0,0 +1,55 @@
1
+ export class DefaultsService {
2
+ /**
3
+ * Recursively apply default values to a data object based on field definitions.
4
+ */
5
+ static apply(fields, data = {}) {
6
+ const result = { ...(data || {}) };
7
+ fields.forEach((field) => {
8
+ if (field.type === 'join')
9
+ return;
10
+ if (field.type === 'row' && field.fields) {
11
+ Object.assign(result, this.apply(field.fields, data));
12
+ return;
13
+ }
14
+ if (!field.name)
15
+ return;
16
+ let value = result[field.name];
17
+ // If value is missing, check if it was renamed (migration support)
18
+ if ((value === undefined || value === null) && field.renameTo) {
19
+ const legacyValue = result[field.renameTo];
20
+ if (legacyValue !== undefined && legacyValue !== null) {
21
+ value = legacyValue;
22
+ result[field.name] = legacyValue;
23
+ }
24
+ }
25
+ // If value is missing or null, apply defaultValue
26
+ if (value === undefined || value === null) {
27
+ if (field.defaultValue !== undefined) {
28
+ result[field.name] = field.defaultValue;
29
+ }
30
+ else {
31
+ // Fallback to type-specific defaults if no defaultValue is provided
32
+ if (field.type === 'boolean')
33
+ result[field.name] = false;
34
+ else if (field.type === 'array')
35
+ result[field.name] = [];
36
+ else if (field.type === 'multiSelect')
37
+ result[field.name] = [];
38
+ else if (field.type === 'object') {
39
+ result[field.name] = this.apply(field.fields || [], {});
40
+ }
41
+ }
42
+ }
43
+ else if (field.type === 'object' && field.fields) {
44
+ // Recursively apply to existing object
45
+ result[field.name] = this.apply(field.fields, value);
46
+ }
47
+ else if (field.type === 'array' && field.fields && Array.isArray(value)) {
48
+ // Recursively apply to items in array
49
+ result[field.name] = value.map((item) => this.apply(field.fields, item));
50
+ }
51
+ });
52
+ return result;
53
+ }
54
+ }
55
+ //# sourceMappingURL=defaults.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.service.js","sourceRoot":"","sources":["../../src/services/defaults.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { DyrectedConfig } from '../types/index.js';
2
+ export declare function sendEmail(config: DyrectedConfig, payload: {
3
+ to: string;
4
+ subject: string;
5
+ html: string;
6
+ }): Promise<void>;
7
+ export declare function buildWelcomeEmail(config: DyrectedConfig, args: {
8
+ email: string;
9
+ }): {
10
+ subject: string;
11
+ html: string;
12
+ };
13
+ export declare function buildInviteEmail(config: DyrectedConfig, args: {
14
+ token: string;
15
+ invitedByEmail?: string;
16
+ }): {
17
+ subject: string;
18
+ html: string;
19
+ };
20
+ export declare function buildResetPasswordEmail(config: DyrectedConfig, args: {
21
+ token: string;
22
+ url?: string;
23
+ }): {
24
+ subject: string;
25
+ html: string;
26
+ };
27
+ export declare function buildPasswordChangedEmail(config: DyrectedConfig, args: {
28
+ email: string;
29
+ }): {
30
+ subject: string;
31
+ html: string;
32
+ };
33
+ //# sourceMappingURL=email.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.service.d.ts","sourceRoot":"","sources":["../../src/services/email.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAuCxD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD,OAAO,CAAC,IAAI,CAAC,CASf;AAMD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqCnC;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsCnC;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAkDnC;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA4CnC"}
@@ -0,0 +1,219 @@
1
+ // Lazy Ethereal singleton — created once on first send in dev
2
+ let _devSend = null;
3
+ let _devSendPromise = null;
4
+ async function getDevSend() {
5
+ if (_devSend)
6
+ return _devSend;
7
+ if (_devSendPromise)
8
+ return _devSendPromise;
9
+ _devSendPromise = (async () => {
10
+ try {
11
+ const nodemailer = await import('nodemailer');
12
+ const account = await nodemailer.default.createTestAccount();
13
+ const transport = nodemailer.default.createTransport({
14
+ host: 'smtp.ethereal.email',
15
+ port: 587,
16
+ auth: { user: account.user, pass: account.pass },
17
+ });
18
+ console.log('[dyrected/core] No email config — using Ethereal for dev email preview.');
19
+ console.log(`[dyrected/core] Ethereal login: https://ethereal.email user: ${account.user} pass: ${account.pass}`);
20
+ _devSend = async ({ to, subject, html }) => {
21
+ const info = await transport.sendMail({ from: '"Dyrected Dev" <dev@dyrected.local>', to, subject, html });
22
+ console.log(`[dyrected/core] Email preview URL: ${nodemailer.default.getTestMessageUrl(info)}`);
23
+ };
24
+ return _devSend;
25
+ }
26
+ catch {
27
+ console.warn('[dyrected/core] nodemailer not available — emails will not be sent in dev.');
28
+ return null;
29
+ }
30
+ })();
31
+ return _devSendPromise;
32
+ }
33
+ export async function sendEmail(config, payload) {
34
+ if (config.email) {
35
+ await config.email.send(payload);
36
+ return;
37
+ }
38
+ if (process.env.NODE_ENV !== 'production') {
39
+ const devSend = await getDevSend();
40
+ await devSend?.(payload);
41
+ }
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Default email templates
45
+ // ---------------------------------------------------------------------------
46
+ export function buildWelcomeEmail(config, args) {
47
+ const custom = config.email?.templates?.welcome?.(args);
48
+ return {
49
+ subject: custom?.subject ?? 'Welcome — your account is ready',
50
+ html: custom?.html ?? `
51
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;background-color:#f9fafb;table-layout:fixed">
52
+ <tr>
53
+ <td align="center" style="padding:40px 16px">
54
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;max-width:600px;background-color:#ffffff;border-radius:12px;border:1px solid #e5e7eb;table-layout:fixed">
55
+ <tr>
56
+ <td style="padding:32px 32px 0">
57
+ <p style="margin:0 0 4px;font-size:12px;font-weight:600;color:#6b7280;font-family:sans-serif;text-transform:uppercase;letter-spacing:0.05em">Dyrected</p>
58
+ <h1 style="margin:0 0 24px;font-size:22px;font-weight:700;color:#111827;font-family:sans-serif">Welcome!</h1>
59
+ </td>
60
+ </tr>
61
+ <tr>
62
+ <td style="padding:0 32px">
63
+ <p style="margin:0 0 12px;font-size:14px;color:#4b5563;line-height:1.6;font-family:sans-serif">Your account has been created. You can now log in with:</p>
64
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;background-color:#f3f4f6;border-radius:6px;table-layout:fixed">
65
+ <tr>
66
+ <td style="padding:12px 16px;font-size:14px;font-weight:600;color:#111827;font-family:sans-serif;word-break:break-all">
67
+ ${args.email}
68
+ </td>
69
+ </tr>
70
+ </table>
71
+ </td>
72
+ </tr>
73
+ <tr>
74
+ <td style="padding:32px">
75
+ <p style="margin:0;font-size:12px;color:#9ca3af;font-family:sans-serif">If you didn't create this account, you can safely ignore this email.</p>
76
+ </td>
77
+ </tr>
78
+ </table>
79
+ </td>
80
+ </tr>
81
+ </table>`,
82
+ };
83
+ }
84
+ export function buildInviteEmail(config, args) {
85
+ const custom = config.email?.templates?.invite?.(args);
86
+ return {
87
+ subject: custom?.subject ?? "You've been invited",
88
+ html: custom?.html ?? `
89
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;background-color:#f9fafb;table-layout:fixed">
90
+ <tr>
91
+ <td align="center" style="padding:40px 16px">
92
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;max-width:600px;background-color:#ffffff;border-radius:12px;border:1px solid #e5e7eb;table-layout:fixed">
93
+ <tr>
94
+ <td style="padding:32px 32px 0">
95
+ <p style="margin:0 0 4px;font-size:12px;font-weight:600;color:#6b7280;font-family:sans-serif;text-transform:uppercase;letter-spacing:0.05em">Dyrected</p>
96
+ <h1 style="margin:0 0 24px;font-size:22px;font-weight:700;color:#111827;font-family:sans-serif">You've been invited</h1>
97
+ </td>
98
+ </tr>
99
+ <tr>
100
+ <td style="padding:0 32px">
101
+ ${args.invitedByEmail ? `<p style="margin:0 0 12px;font-size:14px;color:#4b5563;line-height:1.6;font-family:sans-serif">You were invited by <strong style="color:#111827">${args.invitedByEmail}</strong>.</p>` : ''}
102
+ <p style="margin:0 0 16px;font-size:14px;color:#4b5563;line-height:1.6;font-family:sans-serif">Use the token below to accept your invitation. It expires in 7 days.</p>
103
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;background-color:#f3f4f6;border-radius:6px;table-layout:fixed">
104
+ <tr>
105
+ <td style="padding:12px 16px;font-family:monospace;font-size:12px;color:#374151;word-break:break-all;white-space:normal;line-height:1.4">
106
+ ${args.token}
107
+ </td>
108
+ </tr>
109
+ </table>
110
+ </td>
111
+ </tr>
112
+ <tr>
113
+ <td style="padding:32px">
114
+ <p style="margin:0;font-size:12px;color:#9ca3af;font-family:sans-serif">If you weren't expecting this invitation, you can safely ignore this email.</p>
115
+ </td>
116
+ </tr>
117
+ </table>
118
+ </td>
119
+ </tr>
120
+ </table>`,
121
+ };
122
+ }
123
+ export function buildResetPasswordEmail(config, args) {
124
+ const custom = config.email?.templates?.resetPassword?.(args);
125
+ const resetLink = args.url;
126
+ return {
127
+ subject: custom?.subject ?? 'Reset your password',
128
+ html: custom?.html ?? `
129
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;background-color:#f9fafb;table-layout:fixed">
130
+ <tr>
131
+ <td align="center" style="padding:40px 16px">
132
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;max-width:600px;background-color:#ffffff;border-radius:12px;border:1px solid #e5e7eb;table-layout:fixed">
133
+ <tr>
134
+ <td style="padding:32px 32px 0">
135
+ <p style="margin:0 0 4px;font-size:12px;font-weight:600;color:#6b7280;font-family:sans-serif;text-transform:uppercase;letter-spacing:0.05em">Dyrected</p>
136
+ <h1 style="margin:0 0 24px;font-size:22px;font-weight:700;color:#111827;font-family:sans-serif">Reset your password</h1>
137
+ </td>
138
+ </tr>
139
+ <tr>
140
+ <td style="padding:0 32px">
141
+ <p style="margin:0 0 24px;font-size:14px;color:#4b5563;line-height:1.6;font-family:sans-serif">We received a request to reset your password. Use the button below to set a new password. It will expire in 1 hour.</p>
142
+ ${resetLink ? `
143
+ <table cellpadding="0" cellspacing="0" border="0" style="margin-bottom:24px">
144
+ <tr>
145
+ <td style="border-radius:6px;background-color:#111827">
146
+ <a href="${resetLink}" style="display:inline-block;padding:12px 28px;font-size:14px;font-weight:600;color:#ffffff;text-decoration:none;font-family:sans-serif;border-radius:6px">
147
+ Reset Password
148
+ </a>
149
+ </td>
150
+ </tr>
151
+ </table>
152
+ ` : ''}
153
+ <p style="margin:0 0 8px;font-size:12px;color:#9ca3af;font-family:sans-serif">Or copy and paste this token manually in the admin dashboard:</p>
154
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;background-color:#f3f4f6;border-radius:6px;table-layout:fixed">
155
+ <tr>
156
+ <td style="padding:12px 16px;font-family:monospace;font-size:12px;color:#374151;word-break:break-all;white-space:normal;line-height:1.4">
157
+ ${args.token}
158
+ </td>
159
+ </tr>
160
+ </table>
161
+ </td>
162
+ </tr>
163
+ <tr>
164
+ <td style="padding:32px">
165
+ <p style="margin:0;font-size:12px;color:#9ca3af;font-family:sans-serif">If you didn't request a password reset, you can safely ignore this email.</p>
166
+ </td>
167
+ </tr>
168
+ </table>
169
+ </td>
170
+ </tr>
171
+ </table>`,
172
+ };
173
+ }
174
+ export function buildPasswordChangedEmail(config, args) {
175
+ const custom = config.email?.templates?.passwordChanged?.(args);
176
+ return {
177
+ subject: custom?.subject ?? 'Your password has been changed',
178
+ html: custom?.html ?? `
179
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;background-color:#f9fafb;table-layout:fixed">
180
+ <tr>
181
+ <td align="center" style="padding:40px 16px">
182
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;max-width:600px;background-color:#ffffff;border-radius:12px;border:1px solid #e5e7eb;table-layout:fixed">
183
+ <tr>
184
+ <td style="padding:32px 32px 0">
185
+ <p style="margin:0 0 4px;font-size:12px;font-weight:600;color:#6b7280;font-family:sans-serif;text-transform:uppercase;letter-spacing:0.05em">Dyrected</p>
186
+ <h1 style="margin:0 0 24px;font-size:22px;font-weight:700;color:#111827;font-family:sans-serif">Password changed</h1>
187
+ </td>
188
+ </tr>
189
+ <tr>
190
+ <td style="padding:0 32px">
191
+ <p style="margin:0 0 12px;font-size:14px;color:#4b5563;line-height:1.6;font-family:sans-serif">The password for your account was just changed:</p>
192
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;background-color:#f3f4f6;border-radius:6px;table-layout:fixed">
193
+ <tr>
194
+ <td style="padding:12px 16px;font-size:14px;font-weight:600;color:#111827;font-family:sans-serif;word-break:break-all">
195
+ ${args.email}
196
+ </td>
197
+ </tr>
198
+ </table>
199
+ <table cellpadding="0" cellspacing="0" border="0" style="width:100%;margin-top:16px;background-color:#fef2f2;border-radius:6px;border:1px solid #fecaca;table-layout:fixed">
200
+ <tr>
201
+ <td style="padding:12px 16px;font-size:13px;color:#b91c1c;line-height:1.5;font-family:sans-serif">
202
+ If you did not make this change, please contact support immediately.
203
+ </td>
204
+ </tr>
205
+ </table>
206
+ </td>
207
+ </tr>
208
+ <tr>
209
+ <td style="padding:32px">
210
+ <p style="margin:0;font-size:12px;color:#9ca3af;font-family:sans-serif">This is an automated security notification.</p>
211
+ </td>
212
+ </tr>
213
+ </table>
214
+ </td>
215
+ </tr>
216
+ </table>`,
217
+ };
218
+ }
219
+ //# sourceMappingURL=email.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../src/services/email.service.ts"],"names":[],"mappings":"AAIA,8DAA8D;AAC9D,IAAI,QAAQ,GAAkB,IAAI,CAAC;AACnC,IAAI,eAAe,GAAkC,IAAI,CAAC;AAE1D,KAAK,UAAU,UAAU;IACvB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC;gBACnD,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,GAAG;gBACT,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;aACjD,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,iEAAiE,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAEpH,QAAQ,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;gBACzC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1G,OAAO,CAAC,GAAG,CAAC,sCAAsC,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClG,CAAC,CAAC;YACF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;YAC3F,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAsB,EACtB,OAAsD;IAEtD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,IAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,iCAAiC;QAC7D,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI;;;;;;;;;;;;;;;;;0BAiBA,IAAI,CAAC,KAAK;;;;;;;;;;;;;;eAcrB;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAsB,EACtB,IAAgD;IAEhD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,qBAAqB;QACjD,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI;;;;;;;;;;;;;oBAaN,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,oJAAoJ,IAAI,CAAC,cAAc,gBAAgB,CAAC,CAAC,CAAC,EAAE;;;;;0BAK5M,IAAI,CAAC,KAAK;;;;;;;;;;;;;;eAcrB;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAsB,EACtB,IAAqC;IAErC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3B,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,qBAAqB;QACjD,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI;;;;;;;;;;;;;;oBAcN,SAAS,CAAC,CAAC,CAAC;;;;mCAIG,SAAS;;;;;;mBAMzB,CAAC,CAAC,CAAC,EAAE;;;;;0BAKE,IAAI,CAAC,KAAK;;;;;;;;;;;;;;eAcrB;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,MAAsB,EACtB,IAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,gCAAgC;QAC5D,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI;;;;;;;;;;;;;;;;;0BAiBA,IAAI,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;eAqBrB;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * MediaService handles background tasks for media assets,
3
+ * such as extracting metadata from external URLs (YouTube/Vimeo).
4
+ */
5
+ export declare class MediaService {
6
+ /**
7
+ * Fetches metadata for a given URL.
8
+ * Supports YouTube and Vimeo.
9
+ */
10
+ static fetchMetadata(url: string): Promise<{
11
+ provider: string;
12
+ provider_id: string;
13
+ thumbnail: string;
14
+ embedUrl: string;
15
+ type: "video";
16
+ } | null>;
17
+ private static extractYoutubeId;
18
+ private static extractVimeoId;
19
+ }
20
+ //# sourceMappingURL=media.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.service.d.ts","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,YAAY;IACvB;;;OAGG;WACU,aAAa,CAAC,GAAG,EAAE,MAAM;;;;;;;IAgCtC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAM/B,OAAO,CAAC,MAAM,CAAC,cAAc;CAI9B"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * MediaService handles background tasks for media assets,
3
+ * such as extracting metadata from external URLs (YouTube/Vimeo).
4
+ */
5
+ export class MediaService {
6
+ /**
7
+ * Fetches metadata for a given URL.
8
+ * Supports YouTube and Vimeo.
9
+ */
10
+ static async fetchMetadata(url) {
11
+ if (!url)
12
+ return null;
13
+ if (url.includes('youtube.com') || url.includes('youtu.be')) {
14
+ const videoId = this.extractYoutubeId(url);
15
+ if (videoId) {
16
+ return {
17
+ provider: 'youtube',
18
+ provider_id: videoId,
19
+ thumbnail: `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`,
20
+ embedUrl: `https://www.youtube.com/embed/${videoId}`,
21
+ type: 'video',
22
+ };
23
+ }
24
+ }
25
+ if (url.includes('vimeo.com')) {
26
+ const vimeoId = this.extractVimeoId(url);
27
+ if (vimeoId) {
28
+ return {
29
+ provider: 'vimeo',
30
+ provider_id: vimeoId,
31
+ thumbnail: '', // Requires oEmbed API for reliable thumbnails
32
+ embedUrl: `https://player.vimeo.com/video/${vimeoId}`,
33
+ type: 'video',
34
+ };
35
+ }
36
+ }
37
+ return null;
38
+ }
39
+ static extractYoutubeId(url) {
40
+ const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
41
+ const match = url.match(regExp);
42
+ return (match && match[2].length === 11) ? match[2] : null;
43
+ }
44
+ static extractVimeoId(url) {
45
+ const match = url.match(/vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^\/]*)\/videos\/|album\/(?:\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)/);
46
+ return match ? match[1] : null;
47
+ }
48
+ }
49
+ //# sourceMappingURL=media.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,YAAY;IACvB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAW;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;oBACL,QAAQ,EAAE,SAAS;oBACnB,WAAW,EAAE,OAAO;oBACpB,SAAS,EAAE,8BAA8B,OAAO,oBAAoB;oBACpE,QAAQ,EAAE,iCAAiC,OAAO,EAAE;oBACpD,IAAI,EAAE,OAAgB;iBACvB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;oBACL,QAAQ,EAAE,OAAO;oBACjB,WAAW,EAAE,OAAO;oBACpB,SAAS,EAAE,EAAE,EAAE,8CAA8C;oBAC7D,QAAQ,EAAE,kCAAkC,OAAO,EAAE;oBACrD,IAAI,EAAE,OAAgB;iBACvB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,GAAW;QACzC,MAAM,MAAM,GAAG,iEAAiE,CAAC;QACjF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,GAAW;QACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mHAAmH,CAAC,CAAC;QAC7I,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { CollectionConfig, DatabaseAdapter, Field, PaginatedResult } from '../types/index.js';
2
+ export declare class PopulationService {
3
+ private db;
4
+ private collections;
5
+ constructor(db: DatabaseAdapter, collections: CollectionConfig[]);
6
+ /**
7
+ * Recursively populate relationship fields in a document or array of documents.
8
+ */
9
+ populate(args: {
10
+ data: any;
11
+ fields: Field[];
12
+ currentDepth?: number;
13
+ maxDepth?: number;
14
+ }): Promise<any>;
15
+ /**
16
+ * Helper to populate a PaginatedResult
17
+ */
18
+ populateResult(result: PaginatedResult, fields: Field[], maxDepth: number): Promise<PaginatedResult>;
19
+ }
20
+ //# sourceMappingURL=population.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"population.service.d.ts","sourceRoot":"","sources":["../../src/services/population.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGnG,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,WAAW,CAAqB;gBAE5B,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAKhE;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE;QACnB,IAAI,EAAE,GAAG,CAAC;QACV,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,GAAG,CAAC;IA0JhB;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAe3G"}