@endora-commerce/mod-blog 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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/admin/api/blog-client.d.ts +70 -0
  4. package/dist/admin/api/blog-client.d.ts.map +1 -0
  5. package/dist/admin/api/blog-client.js +137 -0
  6. package/dist/admin/api/blog-client.js.map +1 -0
  7. package/dist/admin/components/CategoryTreeNode.d.ts +25 -0
  8. package/dist/admin/components/CategoryTreeNode.d.ts.map +1 -0
  9. package/dist/admin/components/CategoryTreeNode.js +14 -0
  10. package/dist/admin/components/CategoryTreeNode.js.map +1 -0
  11. package/dist/admin/components/PostStatusBadge.d.ts +7 -0
  12. package/dist/admin/components/PostStatusBadge.d.ts.map +1 -0
  13. package/dist/admin/components/PostStatusBadge.js +16 -0
  14. package/dist/admin/components/PostStatusBadge.js.map +1 -0
  15. package/dist/admin/components/RelatedPostsPicker.d.ts +11 -0
  16. package/dist/admin/components/RelatedPostsPicker.d.ts.map +1 -0
  17. package/dist/admin/components/RelatedPostsPicker.js +77 -0
  18. package/dist/admin/components/RelatedPostsPicker.js.map +1 -0
  19. package/dist/admin/components/RelatedProductsPicker.d.ts +9 -0
  20. package/dist/admin/components/RelatedProductsPicker.d.ts.map +1 -0
  21. package/dist/admin/components/RelatedProductsPicker.js +66 -0
  22. package/dist/admin/components/RelatedProductsPicker.js.map +1 -0
  23. package/dist/admin/components/TagPicker.d.ts +9 -0
  24. package/dist/admin/components/TagPicker.d.ts.map +1 -0
  25. package/dist/admin/components/TagPicker.js +66 -0
  26. package/dist/admin/components/TagPicker.js.map +1 -0
  27. package/dist/admin/index.d.ts +33 -0
  28. package/dist/admin/index.d.ts.map +1 -0
  29. package/dist/admin/index.js +114 -0
  30. package/dist/admin/index.js.map +1 -0
  31. package/dist/admin/pages/BlogCategoryEditor.d.ts +9 -0
  32. package/dist/admin/pages/BlogCategoryEditor.d.ts.map +1 -0
  33. package/dist/admin/pages/BlogCategoryEditor.js +196 -0
  34. package/dist/admin/pages/BlogCategoryEditor.js.map +1 -0
  35. package/dist/admin/pages/BlogCategoryTreePage.d.ts +9 -0
  36. package/dist/admin/pages/BlogCategoryTreePage.d.ts.map +1 -0
  37. package/dist/admin/pages/BlogCategoryTreePage.js +122 -0
  38. package/dist/admin/pages/BlogCategoryTreePage.js.map +1 -0
  39. package/dist/admin/pages/BlogPostEditor.d.ts +9 -0
  40. package/dist/admin/pages/BlogPostEditor.d.ts.map +1 -0
  41. package/dist/admin/pages/BlogPostEditor.js +314 -0
  42. package/dist/admin/pages/BlogPostEditor.js.map +1 -0
  43. package/dist/admin/pages/BlogPostListPage.d.ts +9 -0
  44. package/dist/admin/pages/BlogPostListPage.d.ts.map +1 -0
  45. package/dist/admin/pages/BlogPostListPage.js +75 -0
  46. package/dist/admin/pages/BlogPostListPage.js.map +1 -0
  47. package/dist/admin/pages/BlogTagListPage.d.ts +9 -0
  48. package/dist/admin/pages/BlogTagListPage.d.ts.map +1 -0
  49. package/dist/admin/pages/BlogTagListPage.js +145 -0
  50. package/dist/admin/pages/BlogTagListPage.js.map +1 -0
  51. package/dist/backend/entities/blog-category-language.entity.d.ts +11 -0
  52. package/dist/backend/entities/blog-category-language.entity.d.ts.map +1 -0
  53. package/dist/backend/entities/blog-category-language.entity.js +35 -0
  54. package/dist/backend/entities/blog-category-language.entity.js.map +1 -0
  55. package/dist/backend/entities/blog-category-sales-channel.entity.d.ts +17 -0
  56. package/dist/backend/entities/blog-category-sales-channel.entity.d.ts.map +1 -0
  57. package/dist/backend/entities/blog-category-sales-channel.entity.js +48 -0
  58. package/dist/backend/entities/blog-category-sales-channel.entity.js.map +1 -0
  59. package/dist/backend/entities/blog-category.entity.d.ts +32 -0
  60. package/dist/backend/entities/blog-category.entity.d.ts.map +1 -0
  61. package/dist/backend/entities/blog-category.entity.js +113 -0
  62. package/dist/backend/entities/blog-category.entity.js.map +1 -0
  63. package/dist/backend/entities/blog-post-category.entity.d.ts +10 -0
  64. package/dist/backend/entities/blog-post-category.entity.d.ts.map +1 -0
  65. package/dist/backend/entities/blog-post-category.entity.js +34 -0
  66. package/dist/backend/entities/blog-post-category.entity.js.map +1 -0
  67. package/dist/backend/entities/blog-post-language.entity.d.ts +9 -0
  68. package/dist/backend/entities/blog-post-language.entity.d.ts.map +1 -0
  69. package/dist/backend/entities/blog-post-language.entity.js +33 -0
  70. package/dist/backend/entities/blog-post-language.entity.js.map +1 -0
  71. package/dist/backend/entities/blog-post-related-post.entity.d.ts +15 -0
  72. package/dist/backend/entities/blog-post-related-post.entity.d.ts.map +1 -0
  73. package/dist/backend/entities/blog-post-related-post.entity.js +42 -0
  74. package/dist/backend/entities/blog-post-related-post.entity.js.map +1 -0
  75. package/dist/backend/entities/blog-post-related-product.entity.d.ts +14 -0
  76. package/dist/backend/entities/blog-post-related-product.entity.d.ts.map +1 -0
  77. package/dist/backend/entities/blog-post-related-product.entity.js +41 -0
  78. package/dist/backend/entities/blog-post-related-product.entity.js.map +1 -0
  79. package/dist/backend/entities/blog-post-sales-channel.entity.d.ts +16 -0
  80. package/dist/backend/entities/blog-post-sales-channel.entity.d.ts.map +1 -0
  81. package/dist/backend/entities/blog-post-sales-channel.entity.js +47 -0
  82. package/dist/backend/entities/blog-post-sales-channel.entity.js.map +1 -0
  83. package/dist/backend/entities/blog-post-tag.entity.d.ts +14 -0
  84. package/dist/backend/entities/blog-post-tag.entity.d.ts.map +1 -0
  85. package/dist/backend/entities/blog-post-tag.entity.js +41 -0
  86. package/dist/backend/entities/blog-post-tag.entity.js.map +1 -0
  87. package/dist/backend/entities/blog-post.entity.d.ts +31 -0
  88. package/dist/backend/entities/blog-post.entity.d.ts.map +1 -0
  89. package/dist/backend/entities/blog-post.entity.js +106 -0
  90. package/dist/backend/entities/blog-post.entity.js.map +1 -0
  91. package/dist/backend/entities/blog-tag.entity.d.ts +18 -0
  92. package/dist/backend/entities/blog-tag.entity.d.ts.map +1 -0
  93. package/dist/backend/entities/blog-tag.entity.js +66 -0
  94. package/dist/backend/entities/blog-tag.entity.js.map +1 -0
  95. package/dist/backend/index.d.ts +100 -0
  96. package/dist/backend/index.d.ts.map +1 -0
  97. package/dist/backend/index.js +182 -0
  98. package/dist/backend/index.js.map +1 -0
  99. package/dist/backend/routes.admin.d.ts +12 -0
  100. package/dist/backend/routes.admin.d.ts.map +1 -0
  101. package/dist/backend/routes.admin.js +148 -0
  102. package/dist/backend/routes.admin.js.map +1 -0
  103. package/dist/backend/routes.storefront.d.ts +6 -0
  104. package/dist/backend/routes.storefront.d.ts.map +1 -0
  105. package/dist/backend/routes.storefront.js +72 -0
  106. package/dist/backend/routes.storefront.js.map +1 -0
  107. package/dist/backend/services/blog-asset-references.d.ts +4 -0
  108. package/dist/backend/services/blog-asset-references.d.ts.map +1 -0
  109. package/dist/backend/services/blog-asset-references.js +79 -0
  110. package/dist/backend/services/blog-asset-references.js.map +1 -0
  111. package/dist/backend/services/blog-cache.d.ts +55 -0
  112. package/dist/backend/services/blog-cache.d.ts.map +1 -0
  113. package/dist/backend/services/blog-cache.js +111 -0
  114. package/dist/backend/services/blog-cache.js.map +1 -0
  115. package/dist/backend/services/blog-category-service.d.ts +53 -0
  116. package/dist/backend/services/blog-category-service.d.ts.map +1 -0
  117. package/dist/backend/services/blog-category-service.js +446 -0
  118. package/dist/backend/services/blog-category-service.js.map +1 -0
  119. package/dist/backend/services/blog-language-reference.d.ts +18 -0
  120. package/dist/backend/services/blog-language-reference.d.ts.map +1 -0
  121. package/dist/backend/services/blog-language-reference.js +43 -0
  122. package/dist/backend/services/blog-language-reference.js.map +1 -0
  123. package/dist/backend/services/blog-post-service.d.ts +79 -0
  124. package/dist/backend/services/blog-post-service.d.ts.map +1 -0
  125. package/dist/backend/services/blog-post-service.js +539 -0
  126. package/dist/backend/services/blog-post-service.js.map +1 -0
  127. package/dist/backend/services/blog-settings-resolver.d.ts +36 -0
  128. package/dist/backend/services/blog-settings-resolver.d.ts.map +1 -0
  129. package/dist/backend/services/blog-settings-resolver.js +68 -0
  130. package/dist/backend/services/blog-settings-resolver.js.map +1 -0
  131. package/dist/backend/services/blog-slug-collision.d.ts +35 -0
  132. package/dist/backend/services/blog-slug-collision.d.ts.map +1 -0
  133. package/dist/backend/services/blog-slug-collision.js +84 -0
  134. package/dist/backend/services/blog-slug-collision.js.map +1 -0
  135. package/dist/backend/services/blog-storefront-resolver.d.ts +107 -0
  136. package/dist/backend/services/blog-storefront-resolver.d.ts.map +1 -0
  137. package/dist/backend/services/blog-storefront-resolver.js +492 -0
  138. package/dist/backend/services/blog-storefront-resolver.js.map +1 -0
  139. package/dist/backend/services/blog-tag-service.d.ts +45 -0
  140. package/dist/backend/services/blog-tag-service.d.ts.map +1 -0
  141. package/dist/backend/services/blog-tag-service.js +198 -0
  142. package/dist/backend/services/blog-tag-service.js.map +1 -0
  143. package/dist/backend/services/seed-default-category.d.ts +25 -0
  144. package/dist/backend/services/seed-default-category.d.ts.map +1 -0
  145. package/dist/backend/services/seed-default-category.js +48 -0
  146. package/dist/backend/services/seed-default-category.js.map +1 -0
  147. package/dist/backend/services/seed-roles.d.ts +41 -0
  148. package/dist/backend/services/seed-roles.d.ts.map +1 -0
  149. package/dist/backend/services/seed-roles.js +98 -0
  150. package/dist/backend/services/seed-roles.js.map +1 -0
  151. package/dist/manifest.d.ts +226 -0
  152. package/dist/manifest.d.ts.map +1 -0
  153. package/dist/manifest.js +236 -0
  154. package/dist/manifest.js.map +1 -0
  155. package/dist/migrations/20260506T081055_blog_init.d.ts +33 -0
  156. package/dist/migrations/20260506T081055_blog_init.d.ts.map +1 -0
  157. package/dist/migrations/20260506T081055_blog_init.js +260 -0
  158. package/dist/migrations/20260506T081055_blog_init.js.map +1 -0
  159. package/dist/migrations/20260903T101744_blog_namespace_block_names.d.ts +6 -0
  160. package/dist/migrations/20260903T101744_blog_namespace_block_names.d.ts.map +1 -0
  161. package/dist/migrations/20260903T101744_blog_namespace_block_names.js +58 -0
  162. package/dist/migrations/20260903T101744_blog_namespace_block_names.js.map +1 -0
  163. package/dist/migrations/index.d.ts +34 -0
  164. package/dist/migrations/index.d.ts.map +1 -0
  165. package/dist/migrations/index.js +37 -0
  166. package/dist/migrations/index.js.map +1 -0
  167. package/docs/blog/index.md +199 -0
  168. package/i18n/en.json +166 -0
  169. package/i18n/pl.json +166 -0
  170. package/package.json +108 -0
  171. package/tailwind.css +14 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post-related-post.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/blog-post-related-post.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;AAEjE;;;;;;GAMG;AAGI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,CAAC,aAAa,CAAC,CAAc;IAG7B,YAAY,CAAU;IAGtB,aAAa,CAAU;IAGvB,QAAQ,GAAW,CAAC,CAAC;CACtB,CAAA;AAPC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;;yDACpC;AAGtB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;;0DACpC;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;qDACT;AAVV,mBAAmB;IAF/B,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAAC;GACpC,mBAAmB,CAW/B"}
@@ -0,0 +1,14 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * BlogPostRelatedProduct — composite-key M2M between blog_posts and
4
+ * catalog products, ordered by `position`. The product FK uses ON DELETE
5
+ * NO ACTION; soft-deleted products are filtered out of the storefront
6
+ * resolver per R6 (no generic ProductReferenceRegistry exists yet at v1).
7
+ */
8
+ export declare class BlogPostRelatedProduct {
9
+ [OptionalProps]?: 'position';
10
+ blogPostId: string;
11
+ productId: string;
12
+ position: number;
13
+ }
14
+ //# sourceMappingURL=blog-post-related-product.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post-related-product.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/blog-post-related-product.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAG9E;;;;;GAKG;AACH,qBAEa,sBAAsB;IACjC,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,CAAC;IAG7B,UAAU,EAAG,MAAM,CAAC;IAGpB,SAAS,EAAG,MAAM,CAAC;IAGnB,QAAQ,EAAE,MAAM,CAAK;CACtB"}
@@ -0,0 +1,41 @@
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
+ /**
13
+ * BlogPostRelatedProduct — composite-key M2M between blog_posts and
14
+ * catalog products, ordered by `position`. The product FK uses ON DELETE
15
+ * NO ACTION; soft-deleted products are filtered out of the storefront
16
+ * resolver per R6 (no generic ProductReferenceRegistry exists yet at v1).
17
+ */
18
+ let BlogPostRelatedProduct = class BlogPostRelatedProduct {
19
+ [OptionalProps];
20
+ blogPostId;
21
+ productId;
22
+ position = 0;
23
+ };
24
+ __decorate([
25
+ PrimaryKey({ type: 'uuid', fieldName: 'blog_post_id' }),
26
+ __metadata("design:type", String)
27
+ ], BlogPostRelatedProduct.prototype, "blogPostId", void 0);
28
+ __decorate([
29
+ PrimaryKey({ type: 'uuid', fieldName: 'product_id' }),
30
+ __metadata("design:type", String)
31
+ ], BlogPostRelatedProduct.prototype, "productId", void 0);
32
+ __decorate([
33
+ Property({ type: 'integer' }),
34
+ __metadata("design:type", Number)
35
+ ], BlogPostRelatedProduct.prototype, "position", void 0);
36
+ BlogPostRelatedProduct = __decorate([
37
+ GlobalEntity(),
38
+ Entity({ tableName: 'blog_post_related_products' })
39
+ ], BlogPostRelatedProduct);
40
+ export { BlogPostRelatedProduct };
41
+ //# sourceMappingURL=blog-post-related-product.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post-related-product.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/blog-post-related-product.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;AAEjE;;;;;GAKG;AAGI,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,CAAC,aAAa,CAAC,CAAc;IAG7B,UAAU,CAAU;IAGpB,SAAS,CAAU;IAGnB,QAAQ,GAAW,CAAC,CAAC;CACtB,CAAA;AAPC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;;0DACpC;AAGpB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;;yDACnC;AAGnB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wDACT;AAVV,sBAAsB;IAFlC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC;GACvC,sBAAsB,CAWlC"}
@@ -0,0 +1,16 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * BlogPostSalesChannel — composite-key M2M between blog_posts and
4
+ * sales_channels. Same denormalised-slug-mirror pattern as
5
+ * BlogCategorySalesChannel (R3): the `slug` column drives the partial
6
+ * unique index `idx_blog_posts_slug_per_channel_uniq` and the service
7
+ * layer keeps it in sync.
8
+ */
9
+ export declare class BlogPostSalesChannel {
10
+ [OptionalProps]?: 'deletedAt';
11
+ blogPostId: string;
12
+ salesChannelId: string;
13
+ slug: string;
14
+ deletedAt?: Date | null;
15
+ }
16
+ //# sourceMappingURL=blog-post-sales-channel.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post-sales-channel.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/blog-post-sales-channel.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAG9E;;;;;;GAMG;AACH,qBAEa,oBAAoB;IAC/B,CAAC,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC;IAG9B,UAAU,EAAG,MAAM,CAAC;IAGpB,cAAc,EAAG,MAAM,CAAC;IAGxB,IAAI,EAAG,MAAM,CAAC;IAGd,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB"}
@@ -0,0 +1,47 @@
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
+ /**
13
+ * BlogPostSalesChannel — composite-key M2M between blog_posts and
14
+ * sales_channels. Same denormalised-slug-mirror pattern as
15
+ * BlogCategorySalesChannel (R3): the `slug` column drives the partial
16
+ * unique index `idx_blog_posts_slug_per_channel_uniq` and the service
17
+ * layer keeps it in sync.
18
+ */
19
+ let BlogPostSalesChannel = class BlogPostSalesChannel {
20
+ [OptionalProps];
21
+ blogPostId;
22
+ salesChannelId;
23
+ slug;
24
+ deletedAt;
25
+ };
26
+ __decorate([
27
+ PrimaryKey({ type: 'uuid', fieldName: 'blog_post_id' }),
28
+ __metadata("design:type", String)
29
+ ], BlogPostSalesChannel.prototype, "blogPostId", void 0);
30
+ __decorate([
31
+ PrimaryKey({ type: 'uuid', fieldName: 'sales_channel_id' }),
32
+ __metadata("design:type", String)
33
+ ], BlogPostSalesChannel.prototype, "salesChannelId", void 0);
34
+ __decorate([
35
+ Property({ type: 'string', length: 160 }),
36
+ __metadata("design:type", String)
37
+ ], BlogPostSalesChannel.prototype, "slug", void 0);
38
+ __decorate([
39
+ Property({ type: 'datetime', fieldName: 'deleted_at', nullable: true }),
40
+ __metadata("design:type", Object)
41
+ ], BlogPostSalesChannel.prototype, "deletedAt", void 0);
42
+ BlogPostSalesChannel = __decorate([
43
+ GlobalEntity(),
44
+ Entity({ tableName: 'blog_post_sales_channels' })
45
+ ], BlogPostSalesChannel);
46
+ export { BlogPostSalesChannel };
47
+ //# sourceMappingURL=blog-post-sales-channel.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post-sales-channel.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/blog-post-sales-channel.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;AAEjE;;;;;;GAMG;AAGI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,CAAC,aAAa,CAAC,CAAe;IAG9B,UAAU,CAAU;IAGpB,cAAc,CAAU;IAGxB,IAAI,CAAU;IAGd,SAAS,CAAe;CACzB,CAAA;AAVC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;;wDACpC;AAGpB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;;4DACpC;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;kDAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDAChD;AAbb,oBAAoB;IAFhC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC;GACrC,oBAAoB,CAchC"}
@@ -0,0 +1,14 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * BlogPostTag — composite-key M2M between blog_posts and blog_tags,
4
+ * ordered by `position` (drives the storefront chip strip order). Block-
5
+ * on-delete is enforced at the service layer in BlogTagService.remove
6
+ * (FR-018, R14).
7
+ */
8
+ export declare class BlogPostTag {
9
+ [OptionalProps]?: 'position';
10
+ blogPostId: string;
11
+ blogTagId: string;
12
+ position: number;
13
+ }
14
+ //# sourceMappingURL=blog-post-tag.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post-tag.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/blog-post-tag.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAG9E;;;;;GAKG;AACH,qBAEa,WAAW;IACtB,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,CAAC;IAG7B,UAAU,EAAG,MAAM,CAAC;IAGpB,SAAS,EAAG,MAAM,CAAC;IAGnB,QAAQ,EAAE,MAAM,CAAK;CACtB"}
@@ -0,0 +1,41 @@
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
+ /**
13
+ * BlogPostTag — composite-key M2M between blog_posts and blog_tags,
14
+ * ordered by `position` (drives the storefront chip strip order). Block-
15
+ * on-delete is enforced at the service layer in BlogTagService.remove
16
+ * (FR-018, R14).
17
+ */
18
+ let BlogPostTag = class BlogPostTag {
19
+ [OptionalProps];
20
+ blogPostId;
21
+ blogTagId;
22
+ position = 0;
23
+ };
24
+ __decorate([
25
+ PrimaryKey({ type: 'uuid', fieldName: 'blog_post_id' }),
26
+ __metadata("design:type", String)
27
+ ], BlogPostTag.prototype, "blogPostId", void 0);
28
+ __decorate([
29
+ PrimaryKey({ type: 'uuid', fieldName: 'blog_tag_id' }),
30
+ __metadata("design:type", String)
31
+ ], BlogPostTag.prototype, "blogTagId", void 0);
32
+ __decorate([
33
+ Property({ type: 'integer' }),
34
+ __metadata("design:type", Number)
35
+ ], BlogPostTag.prototype, "position", void 0);
36
+ BlogPostTag = __decorate([
37
+ GlobalEntity(),
38
+ Entity({ tableName: 'blog_post_tags' })
39
+ ], BlogPostTag);
40
+ export { BlogPostTag };
41
+ //# sourceMappingURL=blog-post-tag.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post-tag.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/blog-post-tag.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;AAEjE;;;;;GAKG;AAGI,IAAM,WAAW,GAAjB,MAAM,WAAW;IACtB,CAAC,aAAa,CAAC,CAAc;IAG7B,UAAU,CAAU;IAGpB,SAAS,CAAU;IAGnB,QAAQ,GAAW,CAAC,CAAC;CACtB,CAAA;AAPC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;;+CACpC;AAGpB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;;8CACpC;AAGnB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;6CACT;AAVV,WAAW;IAFvB,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;GAC3B,WAAW,CAWvB"}
@@ -0,0 +1,31 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ export type BlogPostStatus = 'draft' | 'published' | 'archived';
3
+ /**
4
+ * BlogPost — the editorial article. Same field shape as `cms_pages`
5
+ * (feature 014) plus blog-specific lifecycle fields (`published_at`).
6
+ * `name`, `meta_*` are jsonb maps (per language); `content` is the
7
+ * Page Builder envelope per language (re-using feature 014's schema).
8
+ *
9
+ * The status state machine + slug-uniqueness + related-posts detach-on-
10
+ * delete contracts live at the service layer (see
11
+ * `services/blog-post-service.ts` once it lands in Phase 3).
12
+ */
13
+ export declare class BlogPost {
14
+ [OptionalProps]?: 'id' | 'createdAt' | 'updatedAt' | 'deletedAt' | 'active' | 'status' | 'publishedAt' | 'description' | 'version' | 'name' | 'content' | 'metaTitle' | 'metaDescription' | 'metaKeywords';
15
+ id: string;
16
+ name: Record<string, string>;
17
+ slug: string;
18
+ active: boolean;
19
+ status: BlogPostStatus;
20
+ publishedAt?: Date | null;
21
+ description?: string | null;
22
+ metaTitle?: Record<string, string> | null;
23
+ metaDescription?: Record<string, string> | null;
24
+ metaKeywords?: Record<string, string> | null;
25
+ content: Record<string, unknown>;
26
+ version: number;
27
+ createdAt: Date;
28
+ updatedAt: Date;
29
+ deletedAt?: Date | null;
30
+ }
31
+ //# sourceMappingURL=blog-post.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/blog-post.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAI9E,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;AAEhE;;;;;;;;;GASG;AACH,qBAEa,QAAQ;IACnB,CAAC,aAAa,CAAC,CAAC,EACZ,IAAI,GACJ,WAAW,GACX,WAAW,GACX,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,aAAa,GACb,SAAS,GACT,MAAM,GACN,SAAS,GACT,WAAW,GACX,iBAAiB,GACjB,cAAc,CAAC;IAGnB,EAAE,EAAE,MAAM,CAAgB;IAG1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAGlC,IAAI,EAAG,MAAM,CAAC;IAGd,MAAM,EAAE,OAAO,CAAQ;IAGvB,MAAM,EAAE,cAAc,CAAW;IAGjC,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAG1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAG1C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAGhD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAG7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAGtC,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB"}
@@ -0,0 +1,106 @@
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
+ * BlogPost — the editorial article. Same field shape as `cms_pages`
15
+ * (feature 014) plus blog-specific lifecycle fields (`published_at`).
16
+ * `name`, `meta_*` are jsonb maps (per language); `content` is the
17
+ * Page Builder envelope per language (re-using feature 014's schema).
18
+ *
19
+ * The status state machine + slug-uniqueness + related-posts detach-on-
20
+ * delete contracts live at the service layer (see
21
+ * `services/blog-post-service.ts` once it lands in Phase 3).
22
+ */
23
+ let BlogPost = class BlogPost {
24
+ [OptionalProps];
25
+ id = randomUUID();
26
+ name = {};
27
+ slug;
28
+ active = true;
29
+ status = 'draft';
30
+ publishedAt;
31
+ description;
32
+ metaTitle;
33
+ metaDescription;
34
+ metaKeywords;
35
+ content = {};
36
+ version = 1;
37
+ createdAt = new Date();
38
+ updatedAt = new Date();
39
+ deletedAt;
40
+ };
41
+ __decorate([
42
+ PrimaryKey({ type: 'uuid' }),
43
+ __metadata("design:type", String)
44
+ ], BlogPost.prototype, "id", void 0);
45
+ __decorate([
46
+ Property({ type: 'json' }),
47
+ __metadata("design:type", Object)
48
+ ], BlogPost.prototype, "name", void 0);
49
+ __decorate([
50
+ Property({ type: 'string', length: 160 }),
51
+ __metadata("design:type", String)
52
+ ], BlogPost.prototype, "slug", void 0);
53
+ __decorate([
54
+ Property({ type: 'boolean' }),
55
+ __metadata("design:type", Boolean)
56
+ ], BlogPost.prototype, "active", void 0);
57
+ __decorate([
58
+ Property({ type: 'string', length: 16 }),
59
+ __metadata("design:type", String)
60
+ ], BlogPost.prototype, "status", void 0);
61
+ __decorate([
62
+ Property({ type: 'datetime', fieldName: 'published_at', nullable: true }),
63
+ __metadata("design:type", Object)
64
+ ], BlogPost.prototype, "publishedAt", void 0);
65
+ __decorate([
66
+ Property({ type: 'text', nullable: true }),
67
+ __metadata("design:type", Object)
68
+ ], BlogPost.prototype, "description", void 0);
69
+ __decorate([
70
+ Property({ type: 'json', fieldName: 'meta_title', nullable: true }),
71
+ __metadata("design:type", Object)
72
+ ], BlogPost.prototype, "metaTitle", void 0);
73
+ __decorate([
74
+ Property({ type: 'json', fieldName: 'meta_description', nullable: true }),
75
+ __metadata("design:type", Object)
76
+ ], BlogPost.prototype, "metaDescription", void 0);
77
+ __decorate([
78
+ Property({ type: 'json', fieldName: 'meta_keywords', nullable: true }),
79
+ __metadata("design:type", Object)
80
+ ], BlogPost.prototype, "metaKeywords", void 0);
81
+ __decorate([
82
+ Property({ type: 'json' }),
83
+ __metadata("design:type", Object)
84
+ ], BlogPost.prototype, "content", void 0);
85
+ __decorate([
86
+ Property({ type: 'integer' }),
87
+ __metadata("design:type", Number)
88
+ ], BlogPost.prototype, "version", void 0);
89
+ __decorate([
90
+ Property({ type: 'datetime', onCreate: () => new Date() }),
91
+ __metadata("design:type", Date)
92
+ ], BlogPost.prototype, "createdAt", void 0);
93
+ __decorate([
94
+ Property({ type: 'datetime', onUpdate: () => new Date() }),
95
+ __metadata("design:type", Date)
96
+ ], BlogPost.prototype, "updatedAt", void 0);
97
+ __decorate([
98
+ Property({ type: 'datetime', fieldName: 'deleted_at', nullable: true }),
99
+ __metadata("design:type", Object)
100
+ ], BlogPost.prototype, "deletedAt", void 0);
101
+ BlogPost = __decorate([
102
+ GlobalEntity(),
103
+ Entity({ tableName: 'blog_posts' })
104
+ ], BlogPost);
105
+ export { BlogPost };
106
+ //# sourceMappingURL=blog-post.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/blog-post.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;AAIpC;;;;;;;;;GASG;AAGI,IAAM,QAAQ,GAAd,MAAM,QAAQ;IACnB,CAAC,aAAa,CAAC,CAcI;IAGnB,EAAE,GAAW,UAAU,EAAE,CAAC;IAG1B,IAAI,GAA2B,EAAE,CAAC;IAGlC,IAAI,CAAU;IAGd,MAAM,GAAY,IAAI,CAAC;IAGvB,MAAM,GAAmB,OAAO,CAAC;IAGjC,WAAW,CAAe;IAG1B,WAAW,CAAiB;IAG5B,SAAS,CAAiC;IAG1C,eAAe,CAAiC;IAGhD,YAAY,CAAiC;IAG7C,OAAO,GAA4B,EAAE,CAAC;IAGtC,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,CAAe;CACzB,CAAA;AA3CC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;oCACH;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sCACO;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;sCAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wCACP;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;wCACR;AAGjC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CAChD;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACf;AAG5B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CAC1B;AAG1C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC1B;AAGhD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC1B;AAG7C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yCACW;AAGtC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;yCACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;2CAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;2CAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CAChD;AA5Db,QAAQ;IAFpB,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;GACvB,QAAQ,CA6DpB"}
@@ -0,0 +1,18 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * BlogTag — horizontal label attached to Posts. `code` is globally unique
4
+ * across the whole platform (R14) — no per-channel scope. Block-on-delete
5
+ * contract is enforced at the service layer (see `BlogTagService.remove`).
6
+ */
7
+ export declare class BlogTag {
8
+ [OptionalProps]?: 'id' | 'createdAt' | 'updatedAt' | 'deletedAt' | 'description' | 'version' | 'name';
9
+ id: string;
10
+ name: Record<string, string>;
11
+ description?: Record<string, string> | null;
12
+ code: string;
13
+ version: number;
14
+ createdAt: Date;
15
+ updatedAt: Date;
16
+ deletedAt?: Date | null;
17
+ }
18
+ //# sourceMappingURL=blog-tag.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-tag.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/blog-tag.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAI9E;;;;GAIG;AACH,qBAEa,OAAO;IAClB,CAAC,aAAa,CAAC,CAAC,EACZ,IAAI,GACJ,WAAW,GACX,WAAW,GACX,WAAW,GACX,aAAa,GACb,SAAS,GACT,MAAM,CAAC;IAGX,EAAE,EAAE,MAAM,CAAgB;IAG1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAGlC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAG5C,IAAI,EAAG,MAAM,CAAC;IAGd,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB"}
@@ -0,0 +1,66 @@
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
+ * BlogTag — horizontal label attached to Posts. `code` is globally unique
15
+ * across the whole platform (R14) — no per-channel scope. Block-on-delete
16
+ * contract is enforced at the service layer (see `BlogTagService.remove`).
17
+ */
18
+ let BlogTag = class BlogTag {
19
+ [OptionalProps];
20
+ id = randomUUID();
21
+ name = {};
22
+ description;
23
+ code;
24
+ version = 1;
25
+ createdAt = new Date();
26
+ updatedAt = new Date();
27
+ deletedAt;
28
+ };
29
+ __decorate([
30
+ PrimaryKey({ type: 'uuid' }),
31
+ __metadata("design:type", String)
32
+ ], BlogTag.prototype, "id", void 0);
33
+ __decorate([
34
+ Property({ type: 'json' }),
35
+ __metadata("design:type", Object)
36
+ ], BlogTag.prototype, "name", void 0);
37
+ __decorate([
38
+ Property({ type: 'json', nullable: true }),
39
+ __metadata("design:type", Object)
40
+ ], BlogTag.prototype, "description", void 0);
41
+ __decorate([
42
+ Property({ type: 'string', length: 64 }),
43
+ __metadata("design:type", String)
44
+ ], BlogTag.prototype, "code", void 0);
45
+ __decorate([
46
+ Property({ type: 'integer' }),
47
+ __metadata("design:type", Number)
48
+ ], BlogTag.prototype, "version", void 0);
49
+ __decorate([
50
+ Property({ type: 'datetime', onCreate: () => new Date() }),
51
+ __metadata("design:type", Date)
52
+ ], BlogTag.prototype, "createdAt", void 0);
53
+ __decorate([
54
+ Property({ type: 'datetime', onUpdate: () => new Date() }),
55
+ __metadata("design:type", Date)
56
+ ], BlogTag.prototype, "updatedAt", void 0);
57
+ __decorate([
58
+ Property({ type: 'datetime', fieldName: 'deleted_at', nullable: true }),
59
+ __metadata("design:type", Object)
60
+ ], BlogTag.prototype, "deletedAt", void 0);
61
+ BlogTag = __decorate([
62
+ GlobalEntity(),
63
+ Entity({ tableName: 'blog_tags' })
64
+ ], BlogTag);
65
+ export { BlogTag };
66
+ //# sourceMappingURL=blog-tag.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-tag.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/blog-tag.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;;;;GAIG;AAGI,IAAM,OAAO,GAAb,MAAM,OAAO;IAClB,CAAC,aAAa,CAAC,CAOJ;IAGX,EAAE,GAAW,UAAU,EAAE,CAAC;IAG1B,IAAI,GAA2B,EAAE,CAAC;IAGlC,WAAW,CAAiC;IAG5C,IAAI,CAAU;IAGd,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,CAAe;CACzB,CAAA;AAtBC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mCACH;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qCACO;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACC;AAG5C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;qCAC3B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wCACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;0CAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;0CAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CAChD;AAhCb,OAAO;IAFnB,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;GACtB,OAAO,CAiCnB"}
@@ -0,0 +1,100 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import type { Redis } from 'ioredis';
3
+ import type { AssetReferenceRegistryPort, DictionaryValidator } from '@endora-commerce/contracts';
4
+ import type { ModuleContext, RequireAdminFactory } from '@endora-commerce/platform/kernel';
5
+ import { BlogCacheService } from './services/blog-cache.js';
6
+ import { BlogSettingsResolver, type SettingsServicePort } from './services/blog-settings-resolver.js';
7
+ import { BlogCategoryService } from './services/blog-category-service.js';
8
+ import { BlogPostService } from './services/blog-post-service.js';
9
+ import { BlogTagService } from './services/blog-tag-service.js';
10
+ import { BlogStorefrontResolver, type BlogStorefrontDeps } from './services/blog-storefront-resolver.js';
11
+ import { BlogCategory } from './entities/blog-category.entity.js';
12
+ import { BlogCategoryLanguage } from './entities/blog-category-language.entity.js';
13
+ import { BlogCategorySalesChannel } from './entities/blog-category-sales-channel.entity.js';
14
+ import { BlogPost } from './entities/blog-post.entity.js';
15
+ import { BlogPostCategory } from './entities/blog-post-category.entity.js';
16
+ import { BlogPostLanguage } from './entities/blog-post-language.entity.js';
17
+ import { BlogPostRelatedPost } from './entities/blog-post-related-post.entity.js';
18
+ import { BlogPostRelatedProduct } from './entities/blog-post-related-product.entity.js';
19
+ import { BlogPostSalesChannel } from './entities/blog-post-sales-channel.entity.js';
20
+ import { BlogPostTag } from './entities/blog-post-tag.entity.js';
21
+ import { BlogTag } from './entities/blog-tag.entity.js';
22
+ /**
23
+ * The Blog module's backend entry point — feature 016, converted to feature
24
+ * 072's `registerModule` contract.
25
+ *
26
+ * One function declares the whole module: its services, its two route
27
+ * surfaces, its event subscription and its boot work. Nothing about `blog`
28
+ * appears in a composition root any more, which is what makes removing it a
29
+ * deletion rather than a search.
30
+ */
31
+ /**
32
+ * What `blog` resolves from the container: the names it owns, plus the shapes
33
+ * it needs from the platform and from other modules.
34
+ *
35
+ * The cross-module names are declared **structurally, here**, not imported from
36
+ * the providing module's service class — that is the port rule (FR-040). The
37
+ * container is the runtime authority: a name nothing registered throws at
38
+ * resolution rather than arriving as `undefined`.
39
+ */
40
+ export interface BlogCradle {
41
+ /** Kernel-owned: a fresh `EntityManager` fork per call. */
42
+ readonly emFactory: () => EntityManager;
43
+ /** Platform-owned. Absent in a deployment that runs without Redis. */
44
+ readonly redis: Redis | undefined;
45
+ /** Kernel port (`kernel/ports/require-admin.ts`), implemented by `auth`. */
46
+ readonly requireAdmin: RequireAdminFactory | undefined;
47
+ /** Kernel port — the narrow read slice of the settings store this module uses. */
48
+ readonly settingsReadPort: SettingsServicePort;
49
+ /**
50
+ * Owned by `assets_library`: the registry that blocks deleting a referenced
51
+ * asset, as the shape that module publishes (feature 075, Phase C). It used
52
+ * to be a type-only import of the provider's own interface — a real edge,
53
+ * since types resolve at build time, and the one `cms` and `megamenu` cut to
54
+ * the same contract before this.
55
+ */
56
+ readonly assetReferenceRegistry: AssetReferenceRegistryPort;
57
+ /** Owned by `dictionaries`: validates language-scope fields (feature 017). */
58
+ readonly dictionaryValidator: DictionaryValidator | undefined;
59
+ /** Cross-module storefront ports (asset URL signing, product cards). */
60
+ readonly blogStorefrontDeps: BlogStorefrontDeps | undefined;
61
+ readonly blogCacheService: BlogCacheService | undefined;
62
+ readonly blogSettingsResolver: BlogSettingsResolver;
63
+ readonly blogPostService: BlogPostService;
64
+ readonly blogCategoryService: BlogCategoryService;
65
+ readonly blogTagService: BlogTagService;
66
+ readonly blogStorefrontResolver: BlogStorefrontResolver;
67
+ }
68
+ export declare function registerModule(ctx: ModuleContext): void;
69
+ /**
70
+ * The module's persisted entity classes, on the `./backend` subpath, as one
71
+ * array and **no named class export** (D-168).
72
+ *
73
+ * This is the shape the platform already reads, in two places: the boot-time
74
+ * loader (`src/packages/package-runtime.ts`, `exported['entities']`) and the
75
+ * static declaration reader (`scripts/lib/package-declarations.ts`), which is
76
+ * the third source of the `table→owner` map and the package pass of
77
+ * `check-entity-tenant-classification`. Until D-168 this file published eleven
78
+ * `export *` lines instead, which satisfied only the committed host registry —
79
+ * the one path that stops being taken the day this module is *installed*
80
+ * rather than linked, at which point the loader read `undefined`, returned
81
+ * `[]`, and registered zero entities without a word.
82
+ *
83
+ * The absence of a named export is the load-bearing half. With it,
84
+ * `import type { BlogPost } from '@endora-commerce/mod-blog/backend'` compiles
85
+ * in any consumer — ours, a deployment's, a stranger's — and only a check whose
86
+ * population is *this* repository could ever object. Without it, that import is
87
+ * TS2305 in the consumer's own tree, which is Principle I holding by
88
+ * construction. Nothing legitimate is lost: D-32 already forbids an ORM
89
+ * relation from another module into these classes, and every other cross-module
90
+ * read goes through a contract type. An `EntityClassLike[]` is a value the
91
+ * host's ORM registers and nothing else can usefully name.
92
+ *
93
+ * Identity matters more here than anywhere else in the package: MikroORM keys
94
+ * its metadata on the class, so a consumer that reached these files by a second
95
+ * specifier would register a second `BlogPost` and lose one of them at
96
+ * discovery (D-160.6, measured). One array behind one declared subpath is the
97
+ * only way in.
98
+ */
99
+ export declare const entities: (typeof BlogCategory | typeof BlogCategoryLanguage | typeof BlogCategorySalesChannel | typeof BlogPost | typeof BlogPostCategory | typeof BlogPostLanguage | typeof BlogPostRelatedPost | typeof BlogPostRelatedProduct | typeof BlogPostSalesChannel | typeof BlogPostTag | typeof BlogTag)[];
100
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAEV,0BAA0B,EAC1B,mBAAmB,EAGpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAG3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EACL,oBAAoB,EACpB,KAAK,mBAAmB,EACzB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACL,sBAAsB,EACtB,KAAK,kBAAkB,EACxB,MAAM,wCAAwC,CAAC;AAOhD,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD;;;;;;;;GAQG;AAEH;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,EAAE,MAAM,aAAa,CAAC;IACxC,sEAAsE;IACtE,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACvD,kFAAkF;IAClF,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;IAC/C;;;;;;OAMG;IACH,QAAQ,CAAC,sBAAsB,EAAE,0BAA0B,CAAC;IAC5D,8EAA8E;IAC9E,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC9D,wEAAwE;IACxE,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAE5D,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;IACpD,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAClD,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;CACzD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CA8JvD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,QAAQ,gSAYpB,CAAC"}