@endora-commerce/mod-transactional-emails 0.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +63 -0
  3. package/dist/admin/api/transactional-emails-client.d.ts +43 -0
  4. package/dist/admin/api/transactional-emails-client.d.ts.map +1 -0
  5. package/dist/admin/api/transactional-emails-client.js +47 -0
  6. package/dist/admin/api/transactional-emails-client.js.map +1 -0
  7. package/dist/admin/components/BrandingPanel.d.ts +10 -0
  8. package/dist/admin/components/BrandingPanel.d.ts.map +1 -0
  9. package/dist/admin/components/BrandingPanel.js +58 -0
  10. package/dist/admin/components/BrandingPanel.js.map +1 -0
  11. package/dist/admin/components/EmailEditorPane.d.ts +7 -0
  12. package/dist/admin/components/EmailEditorPane.d.ts.map +1 -0
  13. package/dist/admin/components/EmailEditorPane.js +48 -0
  14. package/dist/admin/components/EmailEditorPane.js.map +1 -0
  15. package/dist/admin/index.d.ts +46 -0
  16. package/dist/admin/index.d.ts.map +1 -0
  17. package/dist/admin/index.js +92 -0
  18. package/dist/admin/index.js.map +1 -0
  19. package/dist/admin/pages/EmailBlockEditorPage.d.ts +16 -0
  20. package/dist/admin/pages/EmailBlockEditorPage.d.ts.map +1 -0
  21. package/dist/admin/pages/EmailBlockEditorPage.js +19 -0
  22. package/dist/admin/pages/EmailBlockEditorPage.js.map +1 -0
  23. package/dist/admin/pages/EmailBlocksPage.d.ts +8 -0
  24. package/dist/admin/pages/EmailBlocksPage.d.ts.map +1 -0
  25. package/dist/admin/pages/EmailBlocksPage.js +55 -0
  26. package/dist/admin/pages/EmailBlocksPage.js.map +1 -0
  27. package/dist/admin/pages/EmailEditor.d.ts +8 -0
  28. package/dist/admin/pages/EmailEditor.d.ts.map +1 -0
  29. package/dist/admin/pages/EmailEditor.js +126 -0
  30. package/dist/admin/pages/EmailEditor.js.map +1 -0
  31. package/dist/admin/pages/EmailFragmentEditor.d.ts +9 -0
  32. package/dist/admin/pages/EmailFragmentEditor.d.ts.map +1 -0
  33. package/dist/admin/pages/EmailFragmentEditor.js +93 -0
  34. package/dist/admin/pages/EmailFragmentEditor.js.map +1 -0
  35. package/dist/admin/pages/EmailTemplateEditorPage.d.ts +12 -0
  36. package/dist/admin/pages/EmailTemplateEditorPage.d.ts.map +1 -0
  37. package/dist/admin/pages/EmailTemplateEditorPage.js +15 -0
  38. package/dist/admin/pages/EmailTemplateEditorPage.js.map +1 -0
  39. package/dist/admin/pages/EmailTemplatesPage.d.ts +8 -0
  40. package/dist/admin/pages/EmailTemplatesPage.d.ts.map +1 -0
  41. package/dist/admin/pages/EmailTemplatesPage.js +55 -0
  42. package/dist/admin/pages/EmailTemplatesPage.js.map +1 -0
  43. package/dist/admin/pages/EmailsList.d.ts +8 -0
  44. package/dist/admin/pages/EmailsList.d.ts.map +1 -0
  45. package/dist/admin/pages/EmailsList.js +85 -0
  46. package/dist/admin/pages/EmailsList.js.map +1 -0
  47. package/dist/backend/commands/email-activation.commands.d.ts +42 -0
  48. package/dist/backend/commands/email-activation.commands.d.ts.map +1 -0
  49. package/dist/backend/commands/email-activation.commands.js +51 -0
  50. package/dist/backend/commands/email-activation.commands.js.map +1 -0
  51. package/dist/backend/entities/email-block-sales-channel.entity.d.ts +11 -0
  52. package/dist/backend/entities/email-block-sales-channel.entity.d.ts.map +1 -0
  53. package/dist/backend/entities/email-block-sales-channel.entity.js +39 -0
  54. package/dist/backend/entities/email-block-sales-channel.entity.js.map +1 -0
  55. package/dist/backend/entities/email-block.entity.d.ts +24 -0
  56. package/dist/backend/entities/email-block.entity.d.ts.map +1 -0
  57. package/dist/backend/entities/email-block.entity.js +85 -0
  58. package/dist/backend/entities/email-block.entity.js.map +1 -0
  59. package/dist/backend/entities/email-template-sales-channel.entity.d.ts +10 -0
  60. package/dist/backend/entities/email-template-sales-channel.entity.d.ts.map +1 -0
  61. package/dist/backend/entities/email-template-sales-channel.entity.js +38 -0
  62. package/dist/backend/entities/email-template-sales-channel.entity.js.map +1 -0
  63. package/dist/backend/entities/email-template.entity.d.ts +19 -0
  64. package/dist/backend/entities/email-template.entity.d.ts.map +1 -0
  65. package/dist/backend/entities/email-template.entity.js +76 -0
  66. package/dist/backend/entities/email-template.entity.js.map +1 -0
  67. package/dist/backend/entities/transactional-email-content.entity.d.ts +25 -0
  68. package/dist/backend/entities/transactional-email-content.entity.d.ts.map +1 -0
  69. package/dist/backend/entities/transactional-email-content.entity.js +77 -0
  70. package/dist/backend/entities/transactional-email-content.entity.js.map +1 -0
  71. package/dist/backend/entities/transactional-email.entity.d.ts +32 -0
  72. package/dist/backend/entities/transactional-email.entity.d.ts.map +1 -0
  73. package/dist/backend/entities/transactional-email.entity.js +100 -0
  74. package/dist/backend/entities/transactional-email.entity.js.map +1 -0
  75. package/dist/backend/index.d.ts +105 -0
  76. package/dist/backend/index.d.ts.map +1 -0
  77. package/dist/backend/index.js +126 -0
  78. package/dist/backend/index.js.map +1 -0
  79. package/dist/backend/plugin.d.ts +49 -0
  80. package/dist/backend/plugin.d.ts.map +1 -0
  81. package/dist/backend/plugin.js +54 -0
  82. package/dist/backend/plugin.js.map +1 -0
  83. package/dist/backend/routes.admin.d.ts +23 -0
  84. package/dist/backend/routes.admin.d.ts.map +1 -0
  85. package/dist/backend/routes.admin.js +133 -0
  86. package/dist/backend/routes.admin.js.map +1 -0
  87. package/dist/backend/services/branding.service.d.ts +63 -0
  88. package/dist/backend/services/branding.service.d.ts.map +1 -0
  89. package/dist/backend/services/branding.service.js +119 -0
  90. package/dist/backend/services/branding.service.js.map +1 -0
  91. package/dist/backend/services/content-resolver.d.ts +28 -0
  92. package/dist/backend/services/content-resolver.d.ts.map +1 -0
  93. package/dist/backend/services/content-resolver.js +64 -0
  94. package/dist/backend/services/content-resolver.js.map +1 -0
  95. package/dist/backend/services/email-block.service.d.ts +25 -0
  96. package/dist/backend/services/email-block.service.d.ts.map +1 -0
  97. package/dist/backend/services/email-block.service.js +162 -0
  98. package/dist/backend/services/email-block.service.js.map +1 -0
  99. package/dist/backend/services/email-builder-registry.d.ts +9 -0
  100. package/dist/backend/services/email-builder-registry.d.ts.map +1 -0
  101. package/dist/backend/services/email-builder-registry.js +14 -0
  102. package/dist/backend/services/email-builder-registry.js.map +1 -0
  103. package/dist/backend/services/email-defaults-registry.d.ts +63 -0
  104. package/dist/backend/services/email-defaults-registry.d.ts.map +1 -0
  105. package/dist/backend/services/email-defaults-registry.js +60 -0
  106. package/dist/backend/services/email-defaults-registry.js.map +1 -0
  107. package/dist/backend/services/email-template.service.d.ts +23 -0
  108. package/dist/backend/services/email-template.service.d.ts.map +1 -0
  109. package/dist/backend/services/email-template.service.js +155 -0
  110. package/dist/backend/services/email-template.service.js.map +1 -0
  111. package/dist/backend/services/embed-resolver.d.ts +21 -0
  112. package/dist/backend/services/embed-resolver.d.ts.map +1 -0
  113. package/dist/backend/services/embed-resolver.js +68 -0
  114. package/dist/backend/services/embed-resolver.js.map +1 -0
  115. package/dist/backend/services/manifest-reconciler.d.ts +28 -0
  116. package/dist/backend/services/manifest-reconciler.d.ts.map +1 -0
  117. package/dist/backend/services/manifest-reconciler.js +98 -0
  118. package/dist/backend/services/manifest-reconciler.js.map +1 -0
  119. package/dist/backend/services/template-email.d.ts +26 -0
  120. package/dist/backend/services/template-email.d.ts.map +1 -0
  121. package/dist/backend/services/template-email.js +69 -0
  122. package/dist/backend/services/template-email.js.map +1 -0
  123. package/dist/backend/services/transactional-email.service.d.ts +138 -0
  124. package/dist/backend/services/transactional-email.service.d.ts.map +1 -0
  125. package/dist/backend/services/transactional-email.service.js +410 -0
  126. package/dist/backend/services/transactional-email.service.js.map +1 -0
  127. package/dist/manifest.d.ts +195 -0
  128. package/dist/manifest.d.ts.map +1 -0
  129. package/dist/manifest.js +367 -0
  130. package/dist/manifest.js.map +1 -0
  131. package/dist/migrations/20260629T113442_transactional_emails_init.d.ts +6 -0
  132. package/dist/migrations/20260629T113442_transactional_emails_init.d.ts.map +1 -0
  133. package/dist/migrations/20260629T113442_transactional_emails_init.js +133 -0
  134. package/dist/migrations/20260629T113442_transactional_emails_init.js.map +1 -0
  135. package/dist/migrations/20260801T111001_transactional_emails_email_defaults_reseed.d.ts +6 -0
  136. package/dist/migrations/20260801T111001_transactional_emails_email_defaults_reseed.d.ts.map +1 -0
  137. package/dist/migrations/20260801T111001_transactional_emails_email_defaults_reseed.js +49 -0
  138. package/dist/migrations/20260801T111001_transactional_emails_email_defaults_reseed.js.map +1 -0
  139. package/dist/migrations/20260903T101748_transactional_emails_namespace_block_names.d.ts +6 -0
  140. package/dist/migrations/20260903T101748_transactional_emails_namespace_block_names.d.ts.map +1 -0
  141. package/dist/migrations/20260903T101748_transactional_emails_namespace_block_names.js +60 -0
  142. package/dist/migrations/20260903T101748_transactional_emails_namespace_block_names.js.map +1 -0
  143. package/dist/migrations/index.d.ts +29 -0
  144. package/dist/migrations/index.d.ts.map +1 -0
  145. package/dist/migrations/index.js +33 -0
  146. package/dist/migrations/index.js.map +1 -0
  147. package/docs/transactional-emails.md +176 -0
  148. package/i18n/en.json +92 -0
  149. package/i18n/pl.json +92 -0
  150. package/package.json +113 -0
  151. package/tailwind.css +14 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * EmailBlockSalesChannel — feature 047 (US3) bridge. Scopes an email block to a
3
+ * sales channel. No rows for a block => the block is global. `code` is
4
+ * denormalized for per-channel uniqueness (enforced by a unique index).
5
+ */
6
+ export declare class EmailBlockSalesChannel {
7
+ blockId: string;
8
+ salesChannelId: string;
9
+ code: string;
10
+ }
11
+ //# sourceMappingURL=email-block-sales-channel.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-block-sales-channel.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/email-block-sales-channel.entity.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,qBAEa,sBAAsB;IAEjC,OAAO,EAAG,MAAM,CAAC;IAGjB,cAAc,EAAG,MAAM,CAAC;IAGxB,IAAI,EAAG,MAAM,CAAC;CACf"}
@@ -0,0 +1,39 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ /**
13
+ * EmailBlockSalesChannel — feature 047 (US3) bridge. Scopes an email block to a
14
+ * sales channel. No rows for a block => the block is global. `code` is
15
+ * denormalized for per-channel uniqueness (enforced by a unique index).
16
+ */
17
+ let EmailBlockSalesChannel = class EmailBlockSalesChannel {
18
+ blockId;
19
+ salesChannelId;
20
+ code;
21
+ };
22
+ __decorate([
23
+ PrimaryKey({ type: 'uuid', fieldName: 'block_id' }),
24
+ __metadata("design:type", String)
25
+ ], EmailBlockSalesChannel.prototype, "blockId", void 0);
26
+ __decorate([
27
+ PrimaryKey({ type: 'uuid', fieldName: 'sales_channel_id' }),
28
+ __metadata("design:type", String)
29
+ ], EmailBlockSalesChannel.prototype, "salesChannelId", void 0);
30
+ __decorate([
31
+ Property({ type: 'string', length: 180 }),
32
+ __metadata("design:type", String)
33
+ ], EmailBlockSalesChannel.prototype, "code", void 0);
34
+ EmailBlockSalesChannel = __decorate([
35
+ GlobalEntity(),
36
+ Entity({ tableName: 'email_block_sales_channels' })
37
+ ], EmailBlockSalesChannel);
38
+ export { EmailBlockSalesChannel };
39
+ //# sourceMappingURL=email-block-sales-channel.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-block-sales-channel.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/email-block-sales-channel.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE;;;;GAIG;AAGI,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAEjC,OAAO,CAAU;IAGjB,cAAc,CAAU;IAGxB,IAAI,CAAU;CACf,CAAA;AAPC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;uDACnC;AAGjB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;;8DACpC;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;oDAC5B;AARH,sBAAsB;IAFlC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC;GACvC,sBAAsB,CASlC"}
@@ -0,0 +1,24 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * EmailBlock — feature 047 (US3). A reusable, email-safe content fragment
4
+ * embedded by code via the EmailInsertBlock component. May be global (no bridge
5
+ * rows = available to all channels) or channel-scoped (via
6
+ * email_block_sales_channels). System blocks (default header/footer) cannot be
7
+ * deleted.
8
+ */
9
+ export declare class EmailBlock {
10
+ [OptionalProps]?: 'active' | 'isSystem' | 'description' | 'version' | 'createdAt' | 'updatedAt';
11
+ id: string;
12
+ code: string;
13
+ name: string;
14
+ description: string | null;
15
+ active: boolean;
16
+ /** Content envelope: { schema_version, languages: { lang: tree } }. */
17
+ content: Record<string, unknown>;
18
+ languages: string[];
19
+ isSystem: boolean;
20
+ version: number;
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ }
24
+ //# sourceMappingURL=email-block.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-block.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/email-block.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAIrF;;;;;;GAMG;AACH,qBAEa,UAAU;IACrB,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;IAGhG,EAAE,EAAE,MAAM,CAAgB;IAI1B,IAAI,EAAG,MAAM,CAAC;IAGd,IAAI,EAAG,MAAM,CAAC;IAGd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGlC,MAAM,EAAE,OAAO,CAAQ;IAEvB,uEAAuE;IAEvE,OAAO,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGlC,SAAS,EAAG,MAAM,EAAE,CAAC;IAGrB,QAAQ,EAAE,OAAO,CAAS;IAG1B,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
@@ -0,0 +1,85 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, Index, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * EmailBlock — feature 047 (US3). A reusable, email-safe content fragment
15
+ * embedded by code via the EmailInsertBlock component. May be global (no bridge
16
+ * rows = available to all channels) or channel-scoped (via
17
+ * email_block_sales_channels). System blocks (default header/footer) cannot be
18
+ * deleted.
19
+ */
20
+ let EmailBlock = class EmailBlock {
21
+ [OptionalProps];
22
+ id = randomUUID();
23
+ code;
24
+ name;
25
+ description = null;
26
+ active = true;
27
+ /** Content envelope: { schema_version, languages: { lang: tree } }. */
28
+ content;
29
+ languages;
30
+ isSystem = false;
31
+ version = 1;
32
+ createdAt = new Date();
33
+ updatedAt = new Date();
34
+ };
35
+ __decorate([
36
+ PrimaryKey({ type: 'uuid' }),
37
+ __metadata("design:type", String)
38
+ ], EmailBlock.prototype, "id", void 0);
39
+ __decorate([
40
+ Property({ type: 'string', length: 180 }),
41
+ Index(),
42
+ __metadata("design:type", String)
43
+ ], EmailBlock.prototype, "code", void 0);
44
+ __decorate([
45
+ Property({ type: 'string', length: 200 }),
46
+ __metadata("design:type", String)
47
+ ], EmailBlock.prototype, "name", void 0);
48
+ __decorate([
49
+ Property({ type: 'text', nullable: true }),
50
+ __metadata("design:type", Object)
51
+ ], EmailBlock.prototype, "description", void 0);
52
+ __decorate([
53
+ Property({ type: 'boolean' }),
54
+ __metadata("design:type", Boolean)
55
+ ], EmailBlock.prototype, "active", void 0);
56
+ __decorate([
57
+ Property({ type: 'json' }),
58
+ __metadata("design:type", Object)
59
+ ], EmailBlock.prototype, "content", void 0);
60
+ __decorate([
61
+ Property({ type: 'json' }),
62
+ __metadata("design:type", Array)
63
+ ], EmailBlock.prototype, "languages", void 0);
64
+ __decorate([
65
+ Property({ type: 'boolean' }),
66
+ __metadata("design:type", Boolean)
67
+ ], EmailBlock.prototype, "isSystem", void 0);
68
+ __decorate([
69
+ Property({ type: 'integer' }),
70
+ __metadata("design:type", Number)
71
+ ], EmailBlock.prototype, "version", void 0);
72
+ __decorate([
73
+ Property({ type: 'datetime', onCreate: () => new Date() }),
74
+ __metadata("design:type", Date)
75
+ ], EmailBlock.prototype, "createdAt", void 0);
76
+ __decorate([
77
+ Property({ type: 'datetime', onUpdate: () => new Date() }),
78
+ __metadata("design:type", Date)
79
+ ], EmailBlock.prototype, "updatedAt", void 0);
80
+ EmailBlock = __decorate([
81
+ GlobalEntity(),
82
+ Entity({ tableName: 'email_blocks' })
83
+ ], EmailBlock);
84
+ export { EmailBlock };
85
+ //# sourceMappingURL=email-block.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-block.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/email-block.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;;;GAMG;AAGI,IAAM,UAAU,GAAhB,MAAM,UAAU;IACrB,CAAC,aAAa,CAAC,CAAiF;IAGhG,EAAE,GAAW,UAAU,EAAE,CAAC;IAI1B,IAAI,CAAU;IAGd,IAAI,CAAU;IAGd,WAAW,GAAkB,IAAI,CAAC;IAGlC,MAAM,GAAY,IAAI,CAAC;IAEvB,uEAAuE;IAEvE,OAAO,CAA2B;IAGlC,SAAS,CAAY;IAGrB,QAAQ,GAAY,KAAK,CAAC;IAG1B,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AAjCC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sCACH;AAI1B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,KAAK,EAAE;;wCACM;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;wCAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACT;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;0CACP;AAIvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;2CACO;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;6CACN;AAGrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;4CACJ;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;2CACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;6CAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;6CAAc;AApClB,UAAU;IAFtB,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;GACzB,UAAU,CAqCtB"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * EmailTemplateSalesChannel — feature 047 (US3) bridge. Scopes an email
3
+ * template to a sales channel. No rows for a template => global.
4
+ */
5
+ export declare class EmailTemplateSalesChannel {
6
+ templateId: string;
7
+ salesChannelId: string;
8
+ code: string;
9
+ }
10
+ //# sourceMappingURL=email-template-sales-channel.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-template-sales-channel.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/email-template-sales-channel.entity.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAEa,yBAAyB;IAEpC,UAAU,EAAG,MAAM,CAAC;IAGpB,cAAc,EAAG,MAAM,CAAC;IAGxB,IAAI,EAAG,MAAM,CAAC;CACf"}
@@ -0,0 +1,38 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ /**
13
+ * EmailTemplateSalesChannel — feature 047 (US3) bridge. Scopes an email
14
+ * template to a sales channel. No rows for a template => global.
15
+ */
16
+ let EmailTemplateSalesChannel = class EmailTemplateSalesChannel {
17
+ templateId;
18
+ salesChannelId;
19
+ code;
20
+ };
21
+ __decorate([
22
+ PrimaryKey({ type: 'uuid', fieldName: 'template_id' }),
23
+ __metadata("design:type", String)
24
+ ], EmailTemplateSalesChannel.prototype, "templateId", void 0);
25
+ __decorate([
26
+ PrimaryKey({ type: 'uuid', fieldName: 'sales_channel_id' }),
27
+ __metadata("design:type", String)
28
+ ], EmailTemplateSalesChannel.prototype, "salesChannelId", void 0);
29
+ __decorate([
30
+ Property({ type: 'string', length: 180 }),
31
+ __metadata("design:type", String)
32
+ ], EmailTemplateSalesChannel.prototype, "code", void 0);
33
+ EmailTemplateSalesChannel = __decorate([
34
+ GlobalEntity(),
35
+ Entity({ tableName: 'email_template_sales_channels' })
36
+ ], EmailTemplateSalesChannel);
37
+ export { EmailTemplateSalesChannel };
38
+ //# sourceMappingURL=email-template-sales-channel.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-template-sales-channel.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/email-template-sales-channel.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE;;;GAGG;AAGI,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAEpC,UAAU,CAAU;IAGpB,cAAc,CAAU;IAGxB,IAAI,CAAU;CACf,CAAA;AAPC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;;6DACnC;AAGpB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;;iEACpC;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;uDAC5B;AARH,yBAAyB;IAFrC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,+BAA+B,EAAE,CAAC;GAC1C,yBAAyB,CASrC"}
@@ -0,0 +1,19 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * EmailTemplate — feature 047 (US3). Like EmailBlock but without an `active`
4
+ * flag (mirrors CMS templates). Embedded by code via EmailInsertTemplate.
5
+ */
6
+ export declare class EmailTemplate {
7
+ [OptionalProps]?: 'isSystem' | 'description' | 'version' | 'createdAt' | 'updatedAt';
8
+ id: string;
9
+ code: string;
10
+ name: string;
11
+ description: string | null;
12
+ content: Record<string, unknown>;
13
+ languages: string[];
14
+ isSystem: boolean;
15
+ version: number;
16
+ createdAt: Date;
17
+ updatedAt: Date;
18
+ }
19
+ //# sourceMappingURL=email-template.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-template.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/email-template.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAIrF;;;GAGG;AACH,qBAEa,aAAa;IACxB,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;IAGrF,EAAE,EAAE,MAAM,CAAgB;IAI1B,IAAI,EAAG,MAAM,CAAC;IAGd,IAAI,EAAG,MAAM,CAAC;IAGd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGlC,OAAO,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGlC,SAAS,EAAG,MAAM,EAAE,CAAC;IAGrB,QAAQ,EAAE,OAAO,CAAS;IAG1B,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
@@ -0,0 +1,76 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, Index, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * EmailTemplate — feature 047 (US3). Like EmailBlock but without an `active`
15
+ * flag (mirrors CMS templates). Embedded by code via EmailInsertTemplate.
16
+ */
17
+ let EmailTemplate = class EmailTemplate {
18
+ [OptionalProps];
19
+ id = randomUUID();
20
+ code;
21
+ name;
22
+ description = null;
23
+ content;
24
+ languages;
25
+ isSystem = false;
26
+ version = 1;
27
+ createdAt = new Date();
28
+ updatedAt = new Date();
29
+ };
30
+ __decorate([
31
+ PrimaryKey({ type: 'uuid' }),
32
+ __metadata("design:type", String)
33
+ ], EmailTemplate.prototype, "id", void 0);
34
+ __decorate([
35
+ Property({ type: 'string', length: 180 }),
36
+ Index(),
37
+ __metadata("design:type", String)
38
+ ], EmailTemplate.prototype, "code", void 0);
39
+ __decorate([
40
+ Property({ type: 'string', length: 200 }),
41
+ __metadata("design:type", String)
42
+ ], EmailTemplate.prototype, "name", void 0);
43
+ __decorate([
44
+ Property({ type: 'text', nullable: true }),
45
+ __metadata("design:type", Object)
46
+ ], EmailTemplate.prototype, "description", void 0);
47
+ __decorate([
48
+ Property({ type: 'json' }),
49
+ __metadata("design:type", Object)
50
+ ], EmailTemplate.prototype, "content", void 0);
51
+ __decorate([
52
+ Property({ type: 'json' }),
53
+ __metadata("design:type", Array)
54
+ ], EmailTemplate.prototype, "languages", void 0);
55
+ __decorate([
56
+ Property({ type: 'boolean' }),
57
+ __metadata("design:type", Boolean)
58
+ ], EmailTemplate.prototype, "isSystem", void 0);
59
+ __decorate([
60
+ Property({ type: 'integer' }),
61
+ __metadata("design:type", Number)
62
+ ], EmailTemplate.prototype, "version", void 0);
63
+ __decorate([
64
+ Property({ type: 'datetime', onCreate: () => new Date() }),
65
+ __metadata("design:type", Date)
66
+ ], EmailTemplate.prototype, "createdAt", void 0);
67
+ __decorate([
68
+ Property({ type: 'datetime', onUpdate: () => new Date() }),
69
+ __metadata("design:type", Date)
70
+ ], EmailTemplate.prototype, "updatedAt", void 0);
71
+ EmailTemplate = __decorate([
72
+ GlobalEntity(),
73
+ Entity({ tableName: 'email_templates' })
74
+ ], EmailTemplate);
75
+ export { EmailTemplate };
76
+ //# sourceMappingURL=email-template.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-template.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/email-template.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;GAGG;AAGI,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,CAAC,aAAa,CAAC,CAAsE;IAGrF,EAAE,GAAW,UAAU,EAAE,CAAC;IAI1B,IAAI,CAAU;IAGd,IAAI,CAAU;IAGd,WAAW,GAAkB,IAAI,CAAC;IAGlC,OAAO,CAA2B;IAGlC,SAAS,CAAY;IAGrB,QAAQ,GAAY,KAAK,CAAC;IAG1B,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AA7BC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yCACH;AAI1B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,KAAK,EAAE;;2CACM;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;2CAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACT;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8CACO;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDACN;AAGrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;+CACJ;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;gDAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;gDAAc;AAhClB,aAAa;IAFzB,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;GAC5B,aAAa,CAiCzB"}
@@ -0,0 +1,25 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * TransactionalEmailContent — feature 047 (US1/US2).
4
+ *
5
+ * An admin customization of an email's subject + content for one scope and
6
+ * language. `salesChannelId === null` is the global scope; a non-null value is a
7
+ * per-channel override. The absence of a row means "fall back" (resolution:
8
+ * channel -> global -> module default). Reset deletes the row. `version`
9
+ * provides optimistic concurrency. Uniqueness is enforced by two partial
10
+ * indexes in the migration (NULLs are distinct in Postgres unique indexes).
11
+ */
12
+ export declare class TransactionalEmailContent {
13
+ [OptionalProps]?: 'version' | 'salesChannelId' | 'createdAt' | 'updatedAt';
14
+ id: string;
15
+ emailId: string;
16
+ salesChannelId: string | null;
17
+ language: string;
18
+ subject: string;
19
+ /** Single-language Puck data tree. */
20
+ content: Record<string, unknown>;
21
+ version: number;
22
+ createdAt: Date;
23
+ updatedAt: Date;
24
+ }
25
+ //# sourceMappingURL=transactional-email-content.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactional-email-content.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/transactional-email-content.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAI9E;;;;;;;;;GASG;AACH,qBAEa,yBAAyB;IACpC,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,GAAG,gBAAgB,GAAG,WAAW,GAAG,WAAW,CAAC;IAG3E,EAAE,EAAE,MAAM,CAAgB;IAG1B,OAAO,EAAG,MAAM,CAAC;IAGjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGrC,QAAQ,EAAG,MAAM,CAAC;IAGlB,OAAO,EAAG,MAAM,CAAC;IAEjB,sCAAsC;IAEtC,OAAO,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGlC,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
@@ -0,0 +1,77 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * TransactionalEmailContent — feature 047 (US1/US2).
15
+ *
16
+ * An admin customization of an email's subject + content for one scope and
17
+ * language. `salesChannelId === null` is the global scope; a non-null value is a
18
+ * per-channel override. The absence of a row means "fall back" (resolution:
19
+ * channel -> global -> module default). Reset deletes the row. `version`
20
+ * provides optimistic concurrency. Uniqueness is enforced by two partial
21
+ * indexes in the migration (NULLs are distinct in Postgres unique indexes).
22
+ */
23
+ let TransactionalEmailContent = class TransactionalEmailContent {
24
+ [OptionalProps];
25
+ id = randomUUID();
26
+ emailId;
27
+ salesChannelId = null;
28
+ language;
29
+ subject;
30
+ /** Single-language Puck data tree. */
31
+ content;
32
+ version = 1;
33
+ createdAt = new Date();
34
+ updatedAt = new Date();
35
+ };
36
+ __decorate([
37
+ PrimaryKey({ type: 'uuid' }),
38
+ __metadata("design:type", String)
39
+ ], TransactionalEmailContent.prototype, "id", void 0);
40
+ __decorate([
41
+ Property({ type: 'uuid', fieldName: 'email_id' }),
42
+ __metadata("design:type", String)
43
+ ], TransactionalEmailContent.prototype, "emailId", void 0);
44
+ __decorate([
45
+ Property({ type: 'uuid', fieldName: 'sales_channel_id', nullable: true }),
46
+ __metadata("design:type", Object)
47
+ ], TransactionalEmailContent.prototype, "salesChannelId", void 0);
48
+ __decorate([
49
+ Property({ type: 'string', length: 12 }),
50
+ __metadata("design:type", String)
51
+ ], TransactionalEmailContent.prototype, "language", void 0);
52
+ __decorate([
53
+ Property({ type: 'text' }),
54
+ __metadata("design:type", String)
55
+ ], TransactionalEmailContent.prototype, "subject", void 0);
56
+ __decorate([
57
+ Property({ type: 'json' }),
58
+ __metadata("design:type", Object)
59
+ ], TransactionalEmailContent.prototype, "content", void 0);
60
+ __decorate([
61
+ Property({ type: 'integer' }),
62
+ __metadata("design:type", Number)
63
+ ], TransactionalEmailContent.prototype, "version", void 0);
64
+ __decorate([
65
+ Property({ type: 'datetime', onCreate: () => new Date() }),
66
+ __metadata("design:type", Date)
67
+ ], TransactionalEmailContent.prototype, "createdAt", void 0);
68
+ __decorate([
69
+ Property({ type: 'datetime', onUpdate: () => new Date() }),
70
+ __metadata("design:type", Date)
71
+ ], TransactionalEmailContent.prototype, "updatedAt", void 0);
72
+ TransactionalEmailContent = __decorate([
73
+ GlobalEntity(),
74
+ Entity({ tableName: 'transactional_email_contents' })
75
+ ], TransactionalEmailContent);
76
+ export { TransactionalEmailContent };
77
+ //# sourceMappingURL=transactional-email-content.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactional-email-content.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/transactional-email-content.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;;;;;;GASG;AAGI,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACpC,CAAC,aAAa,CAAC,CAA4D;IAG3E,EAAE,GAAW,UAAU,EAAE,CAAC;IAG1B,OAAO,CAAU;IAGjB,cAAc,GAAkB,IAAI,CAAC;IAGrC,QAAQ,CAAU;IAGlB,OAAO,CAAU;IAEjB,sCAAsC;IAEtC,OAAO,CAA2B;IAGlC,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AA1BC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDACH;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;0DACjC;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iEACrC;AAGrC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;2DACvB;AAGlB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DACV;AAIjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DACO;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;0DACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;4DAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;4DAAc;AA7BlB,yBAAyB;IAFrC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,8BAA8B,EAAE,CAAC;GACzC,yBAAyB,CA8BrC"}
@@ -0,0 +1,32 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ import type { EmailVariableDescriptor } from '@endora-commerce/contracts';
3
+ /**
4
+ * TransactionalEmail — feature 047 (US1/US5).
5
+ *
6
+ * The canonical definition of one transactional email plus the CURRENT
7
+ * module-provided defaults. Rows are reconciled at boot from module manifests +
8
+ * the EmailDefaultsRegistry; admin customizations live separately in
9
+ * `transactional_email_contents`, so refreshing defaults here never overwrites
10
+ * customizations. `code` is the stable send key.
11
+ */
12
+ export declare class TransactionalEmail {
13
+ [OptionalProps]?: 'active' | 'description' | 'groupCode' | 'createdAt' | 'updatedAt';
14
+ id: string;
15
+ code: string;
16
+ name: string;
17
+ ownerModule: string;
18
+ description: string | null;
19
+ groupCode: string | null;
20
+ /** Declared variables: [{ key, label, sampleValue?, description? }]. */
21
+ variables: EmailVariableDescriptor[];
22
+ /** Supported BCP-47 language codes. */
23
+ languages: string[];
24
+ /** Module default subject per language: { lang: string }. */
25
+ defaultSubject: Record<string, string>;
26
+ /** Module default content envelope: { schema_version, languages: { lang: tree } }. */
27
+ defaultContent: Record<string, unknown>;
28
+ active: boolean;
29
+ createdAt: Date;
30
+ updatedAt: Date;
31
+ }
32
+ //# sourceMappingURL=transactional-email.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactional-email.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/transactional-email.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAgC,MAAM,iBAAiB,CAAC;AAGtF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E;;;;;;;;GAQG;AACH,qBAEa,kBAAkB;IAC7B,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;IAGrF,EAAE,EAAE,MAAM,CAAgB;IAI1B,IAAI,EAAG,MAAM,CAAC;IAGd,IAAI,EAAG,MAAM,CAAC;IAGd,WAAW,EAAG,MAAM,CAAC;IAGrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGlC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEhC,wEAAwE;IAExE,SAAS,EAAG,uBAAuB,EAAE,CAAC;IAEtC,uCAAuC;IAEvC,SAAS,EAAG,MAAM,EAAE,CAAC;IAErB,6DAA6D;IAE7D,cAAc,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,sFAAsF;IAEtF,cAAc,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGzC,MAAM,EAAE,OAAO,CAAQ;IAGvB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
@@ -0,0 +1,100 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, OptionalProps, PrimaryKey, Property, Unique } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * TransactionalEmail — feature 047 (US1/US5).
15
+ *
16
+ * The canonical definition of one transactional email plus the CURRENT
17
+ * module-provided defaults. Rows are reconciled at boot from module manifests +
18
+ * the EmailDefaultsRegistry; admin customizations live separately in
19
+ * `transactional_email_contents`, so refreshing defaults here never overwrites
20
+ * customizations. `code` is the stable send key.
21
+ */
22
+ let TransactionalEmail = class TransactionalEmail {
23
+ [OptionalProps];
24
+ id = randomUUID();
25
+ code;
26
+ name;
27
+ ownerModule;
28
+ description = null;
29
+ groupCode = null;
30
+ /** Declared variables: [{ key, label, sampleValue?, description? }]. */
31
+ variables;
32
+ /** Supported BCP-47 language codes. */
33
+ languages;
34
+ /** Module default subject per language: { lang: string }. */
35
+ defaultSubject;
36
+ /** Module default content envelope: { schema_version, languages: { lang: tree } }. */
37
+ defaultContent;
38
+ active = true;
39
+ createdAt = new Date();
40
+ updatedAt = new Date();
41
+ };
42
+ __decorate([
43
+ PrimaryKey({ type: 'uuid' }),
44
+ __metadata("design:type", String)
45
+ ], TransactionalEmail.prototype, "id", void 0);
46
+ __decorate([
47
+ Property({ type: 'string', length: 160 }),
48
+ Unique(),
49
+ __metadata("design:type", String)
50
+ ], TransactionalEmail.prototype, "code", void 0);
51
+ __decorate([
52
+ Property({ type: 'string', length: 200 }),
53
+ __metadata("design:type", String)
54
+ ], TransactionalEmail.prototype, "name", void 0);
55
+ __decorate([
56
+ Property({ type: 'string', length: 64 }),
57
+ __metadata("design:type", String)
58
+ ], TransactionalEmail.prototype, "ownerModule", void 0);
59
+ __decorate([
60
+ Property({ type: 'text', nullable: true }),
61
+ __metadata("design:type", Object)
62
+ ], TransactionalEmail.prototype, "description", void 0);
63
+ __decorate([
64
+ Property({ type: 'string', length: 64, nullable: true }),
65
+ __metadata("design:type", Object)
66
+ ], TransactionalEmail.prototype, "groupCode", void 0);
67
+ __decorate([
68
+ Property({ type: 'json' }),
69
+ __metadata("design:type", Array)
70
+ ], TransactionalEmail.prototype, "variables", void 0);
71
+ __decorate([
72
+ Property({ type: 'json' }),
73
+ __metadata("design:type", Array)
74
+ ], TransactionalEmail.prototype, "languages", void 0);
75
+ __decorate([
76
+ Property({ type: 'json' }),
77
+ __metadata("design:type", Object)
78
+ ], TransactionalEmail.prototype, "defaultSubject", void 0);
79
+ __decorate([
80
+ Property({ type: 'json' }),
81
+ __metadata("design:type", Object)
82
+ ], TransactionalEmail.prototype, "defaultContent", void 0);
83
+ __decorate([
84
+ Property({ type: 'boolean' }),
85
+ __metadata("design:type", Boolean)
86
+ ], TransactionalEmail.prototype, "active", void 0);
87
+ __decorate([
88
+ Property({ type: 'datetime', onCreate: () => new Date() }),
89
+ __metadata("design:type", Date)
90
+ ], TransactionalEmail.prototype, "createdAt", void 0);
91
+ __decorate([
92
+ Property({ type: 'datetime', onUpdate: () => new Date() }),
93
+ __metadata("design:type", Date)
94
+ ], TransactionalEmail.prototype, "updatedAt", void 0);
95
+ TransactionalEmail = __decorate([
96
+ GlobalEntity(),
97
+ Entity({ tableName: 'transactional_emails' })
98
+ ], TransactionalEmail);
99
+ export { TransactionalEmail };
100
+ //# sourceMappingURL=transactional-email.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactional-email.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/transactional-email.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC;;;;;;;;GAQG;AAGI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,CAAC,aAAa,CAAC,CAAsE;IAGrF,EAAE,GAAW,UAAU,EAAE,CAAC;IAI1B,IAAI,CAAU;IAGd,IAAI,CAAU;IAGd,WAAW,CAAU;IAGrB,WAAW,GAAkB,IAAI,CAAC;IAGlC,SAAS,GAAkB,IAAI,CAAC;IAEhC,wEAAwE;IAExE,SAAS,CAA6B;IAEtC,uCAAuC;IAEvC,SAAS,CAAY;IAErB,6DAA6D;IAE7D,cAAc,CAA0B;IAExC,sFAAsF;IAEtF,cAAc,CAA2B;IAGzC,MAAM,GAAY,IAAI,CAAC;IAGvB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AA1CC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8CACH;AAI1B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,MAAM,EAAE;;gDACK;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;gDAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;uDACpB;AAGrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDACT;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDACzB;AAIhC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDACW;AAItC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDACN;AAIrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DACa;AAIxC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DACc;AAGzC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;kDACP;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;qDAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;qDAAc;AA7ClB,kBAAkB;IAF9B,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC;GACjC,kBAAkB,CA8C9B"}