@carlonicora/nextjs-jsonapi 5.3.0 → 5.4.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 (173) hide show
  1. package/dist/{BlockNoteEditor-UJ6363LC.js → BlockNoteEditor-4YCAIEPT.js} +23 -22
  2. package/dist/BlockNoteEditor-4YCAIEPT.js.map +1 -0
  3. package/dist/{BlockNoteEditor-WTSQANKI.mjs → BlockNoteEditor-YQL2SGFR.mjs} +8 -7
  4. package/dist/BlockNoteEditor-YQL2SGFR.mjs.map +1 -0
  5. package/dist/{BlockNoteViewer-JVKWJZ6J.mjs → BlockNoteViewer-AEJKJ27Q.mjs} +2 -2
  6. package/dist/{BlockNoteViewer-EL4JFB6P.js → BlockNoteViewer-YL3J7J2Y.js} +3 -3
  7. package/dist/{BlockNoteViewer-EL4JFB6P.js.map → BlockNoteViewer-YL3J7J2Y.js.map} +1 -1
  8. package/dist/BlogCategoryFields-DO48vOTE.d.mts +14 -0
  9. package/dist/BlogCategoryFields-DO48vOTE.d.ts +14 -0
  10. package/dist/BlogPostInterface-BB_4wcDR.d.mts +124 -0
  11. package/dist/BlogPostInterface-bWAT1rfR.d.ts +124 -0
  12. package/dist/billing/index.js +441 -441
  13. package/dist/billing/index.mjs +3 -3
  14. package/dist/blog-public.types-BbrzsC1c.d.mts +30 -0
  15. package/dist/blog-public.types-BbrzsC1c.d.ts +30 -0
  16. package/dist/{chunk-3BAM23VA.js → chunk-3NLAXVIN.js} +860 -849
  17. package/dist/chunk-3NLAXVIN.js.map +1 -0
  18. package/dist/{chunk-QKZUE5OF.mjs → chunk-3YW35YHQ.mjs} +1 -101
  19. package/dist/chunk-3YW35YHQ.mjs.map +1 -0
  20. package/dist/{chunk-QQQE3N2X.js → chunk-5PPG6PL7.js} +3 -3
  21. package/dist/{chunk-QQQE3N2X.js.map → chunk-5PPG6PL7.js.map} +1 -1
  22. package/dist/{chunk-FNTQQFLH.mjs → chunk-6DC2WVVB.mjs} +2 -2
  23. package/dist/{chunk-MIZTWBPX.mjs → chunk-EUKTBOI2.mjs} +19 -8
  24. package/dist/chunk-EUKTBOI2.mjs.map +1 -0
  25. package/dist/{chunk-XGTQWBDJ.js → chunk-KSYQEKJX.js} +11 -111
  26. package/dist/chunk-KSYQEKJX.js.map +1 -0
  27. package/dist/{chunk-CRI4T47Y.js → chunk-NFBOSPNJ.js} +756 -41
  28. package/dist/chunk-NFBOSPNJ.js.map +1 -0
  29. package/dist/{chunk-6WU74VFU.mjs → chunk-QMYQRPQC.mjs} +2 -2
  30. package/dist/{chunk-JQWI62NV.mjs → chunk-WC63PJSC.mjs} +716 -1
  31. package/dist/chunk-WC63PJSC.mjs.map +1 -0
  32. package/dist/chunk-XCHSX3VC.mjs +107 -0
  33. package/dist/chunk-XCHSX3VC.mjs.map +1 -0
  34. package/dist/{chunk-EO75CV76.js → chunk-YNCQSWQW.js} +8 -8
  35. package/dist/{chunk-EO75CV76.js.map → chunk-YNCQSWQW.js.map} +1 -1
  36. package/dist/chunk-YW4ZCEWB.js +107 -0
  37. package/dist/chunk-YW4ZCEWB.js.map +1 -0
  38. package/dist/client/index.js +4 -4
  39. package/dist/client/index.mjs +3 -3
  40. package/dist/components/index.d.mts +13 -2
  41. package/dist/components/index.d.ts +13 -2
  42. package/dist/components/index.js +4 -4
  43. package/dist/components/index.mjs +3 -3
  44. package/dist/contexts/index.js +4 -4
  45. package/dist/contexts/index.mjs +3 -3
  46. package/dist/core/index.d.mts +214 -3
  47. package/dist/core/index.d.ts +214 -3
  48. package/dist/core/index.js +36 -2
  49. package/dist/core/index.js.map +1 -1
  50. package/dist/core/index.mjs +35 -1
  51. package/dist/email-automations/index.js +92 -92
  52. package/dist/email-automations/index.mjs +3 -3
  53. package/dist/features/analytics/index.js +122 -122
  54. package/dist/features/analytics/index.mjs +4 -4
  55. package/dist/features/analytics/server.js +6 -5
  56. package/dist/features/analytics/server.js.map +1 -1
  57. package/dist/features/analytics/server.mjs +4 -3
  58. package/dist/features/analytics/server.mjs.map +1 -1
  59. package/dist/features/blog/index.css +30 -0
  60. package/dist/features/blog/index.css.map +1 -0
  61. package/dist/features/blog/index.d.mts +266 -0
  62. package/dist/features/blog/index.d.ts +266 -0
  63. package/dist/features/blog/index.js +1799 -0
  64. package/dist/features/blog/index.js.map +1 -0
  65. package/dist/features/blog/index.mjs +1799 -0
  66. package/dist/features/blog/index.mjs.map +1 -0
  67. package/dist/features/blog/server.d.mts +33 -0
  68. package/dist/features/blog/server.d.ts +33 -0
  69. package/dist/features/blog/server.js +139 -0
  70. package/dist/features/blog/server.js.map +1 -0
  71. package/dist/features/blog/server.mjs +139 -0
  72. package/dist/features/blog/server.mjs.map +1 -0
  73. package/dist/features/help/index.js +37 -37
  74. package/dist/features/help/index.mjs +3 -3
  75. package/dist/features/tokenusage/index.js +125 -125
  76. package/dist/features/tokenusage/index.mjs +4 -4
  77. package/dist/index.d.mts +4 -2
  78. package/dist/index.d.ts +4 -2
  79. package/dist/index.js +37 -3
  80. package/dist/index.js.map +1 -1
  81. package/dist/index.mjs +36 -2
  82. package/dist/{s3.service-CY-jgOAM.d.ts → s3.service-Bz_K-tjz.d.ts} +11 -0
  83. package/dist/{s3.service-Sri0QP7Z.d.mts → s3.service-D5zNCEW3.d.mts} +11 -0
  84. package/dist/server/index.d.mts +1 -1
  85. package/dist/server/index.d.ts +1 -1
  86. package/dist/server/index.js +8 -6
  87. package/dist/server/index.js.map +1 -1
  88. package/dist/server/index.mjs +12 -10
  89. package/messages/en.json +93 -0
  90. package/messages/it.json +93 -0
  91. package/package.json +11 -1
  92. package/src/components/editors/BlockNoteEditor.tsx +13 -3
  93. package/src/components/forms/FormBlockNote.tsx +4 -0
  94. package/src/components/navigations/ContentTitle.tsx +14 -3
  95. package/src/core/index.ts +4 -0
  96. package/src/core/registry/ModuleRegistry.ts +6 -0
  97. package/src/features/blog/BlogModules.ts +49 -0
  98. package/src/features/blog/components/admin/BlogAdminContainer.tsx +32 -0
  99. package/src/features/blog/components/admin/BlogCategoriesList.tsx +56 -0
  100. package/src/features/blog/components/admin/BlogCategoryEditor.tsx +230 -0
  101. package/src/features/blog/components/admin/BlogCoverImageField.tsx +123 -0
  102. package/src/features/blog/components/admin/BlogLayoutSetting.tsx +86 -0
  103. package/src/features/blog/components/admin/BlogPostComparison.tsx +54 -0
  104. package/src/features/blog/components/admin/BlogPostContainer.tsx +102 -0
  105. package/src/features/blog/components/admin/BlogPostDeleter.tsx +35 -0
  106. package/src/features/blog/components/admin/BlogPostEditor.tsx +207 -0
  107. package/src/features/blog/components/admin/BlogPostPublishButton.tsx +50 -0
  108. package/src/features/blog/components/admin/BlogPostTranslationEditor.tsx +110 -0
  109. package/src/features/blog/components/admin/BlogPostTranslationPanel.tsx +136 -0
  110. package/src/features/blog/components/admin/BlogPostsList.tsx +58 -0
  111. package/src/features/blog/components/admin/BlogTranslationStatus.tsx +104 -0
  112. package/src/features/blog/components/admin/__tests__/BlogPostTranslationPanel.spec.tsx +100 -0
  113. package/src/features/blog/components/admin/__tests__/BlogPostsList.spec.tsx +30 -0
  114. package/src/features/blog/components/admin/index.ts +14 -0
  115. package/src/features/blog/components/public/BlogCategoryChips.tsx +59 -0
  116. package/src/features/blog/components/public/BlogList.tsx +21 -0
  117. package/src/features/blog/components/public/BlogListColumn.tsx +53 -0
  118. package/src/features/blog/components/public/BlogListFeatured.tsx +57 -0
  119. package/src/features/blog/components/public/BlogListParts.tsx +74 -0
  120. package/src/features/blog/components/public/BlogListRail.tsx +62 -0
  121. package/src/features/blog/components/public/BlogPostCard.tsx +132 -0
  122. package/src/features/blog/components/public/BlogPostMeta.tsx +49 -0
  123. package/src/features/blog/components/public/BlogPostView.tsx +74 -0
  124. package/src/features/blog/components/public/BlogSearchBox.tsx +52 -0
  125. package/src/features/blog/components/public/__tests__/BlogList.spec.tsx +173 -0
  126. package/src/features/blog/components/public/__tests__/BlogPostView.spec.tsx +128 -0
  127. package/src/features/blog/components/public/blogPublicHelpers.ts +30 -0
  128. package/src/features/blog/components/public/index.ts +3 -0
  129. package/src/features/blog/contexts/BlogPostContext.tsx +66 -0
  130. package/src/features/blog/contexts/index.ts +1 -0
  131. package/src/features/blog/data/BlogCategory.ts +93 -0
  132. package/src/features/blog/data/BlogCategoryFields.ts +4 -0
  133. package/src/features/blog/data/BlogCategoryInterface.ts +24 -0
  134. package/src/features/blog/data/BlogCategoryService.ts +54 -0
  135. package/src/features/blog/data/BlogCategoryTranslation.ts +90 -0
  136. package/src/features/blog/data/BlogCategoryTranslationInterface.ts +22 -0
  137. package/src/features/blog/data/BlogCategoryTranslationService.ts +30 -0
  138. package/src/features/blog/data/BlogPost.spec.ts +123 -0
  139. package/src/features/blog/data/BlogPost.ts +159 -0
  140. package/src/features/blog/data/BlogPostFields.ts +7 -0
  141. package/src/features/blog/data/BlogPostInterface.ts +39 -0
  142. package/src/features/blog/data/BlogPostService.ts +82 -0
  143. package/src/features/blog/data/BlogPostTranslation.spec.ts +73 -0
  144. package/src/features/blog/data/BlogPostTranslation.ts +110 -0
  145. package/src/features/blog/data/BlogPostTranslationInterface.ts +27 -0
  146. package/src/features/blog/data/BlogPostTranslationService.ts +30 -0
  147. package/src/features/blog/data/BlogSettings.ts +37 -0
  148. package/src/features/blog/data/BlogSettingsInterface.ts +11 -0
  149. package/src/features/blog/data/BlogSettingsService.ts +24 -0
  150. package/src/features/blog/data/index.ts +17 -0
  151. package/src/features/blog/hooks/index.ts +3 -0
  152. package/src/features/blog/hooks/useBlogCategoryNames.ts +34 -0
  153. package/src/features/blog/hooks/useBlogCategoryTableStructure.tsx +84 -0
  154. package/src/features/blog/hooks/useBlogPostTableStructure.tsx +126 -0
  155. package/src/features/blog/index.ts +15 -0
  156. package/src/features/blog/server/fetchers.ts +120 -0
  157. package/src/features/blog/server/toPublic.spec.ts +91 -0
  158. package/src/features/blog/server/toPublic.ts +36 -0
  159. package/src/features/blog/server-entry.ts +17 -0
  160. package/src/features/blog/types/blog-public.types.ts +34 -0
  161. package/src/features/blog/types/blog.constants.ts +40 -0
  162. package/src/features/s3/data/s3.service.ts +17 -0
  163. package/dist/BlockNoteEditor-UJ6363LC.js.map +0 -1
  164. package/dist/BlockNoteEditor-WTSQANKI.mjs.map +0 -1
  165. package/dist/chunk-3BAM23VA.js.map +0 -1
  166. package/dist/chunk-CRI4T47Y.js.map +0 -1
  167. package/dist/chunk-JQWI62NV.mjs.map +0 -1
  168. package/dist/chunk-MIZTWBPX.mjs.map +0 -1
  169. package/dist/chunk-QKZUE5OF.mjs.map +0 -1
  170. package/dist/chunk-XGTQWBDJ.js.map +0 -1
  171. /package/dist/{BlockNoteViewer-JVKWJZ6J.mjs.map → BlockNoteViewer-AEJKJ27Q.mjs.map} +0 -0
  172. /package/dist/{chunk-FNTQQFLH.mjs.map → chunk-6DC2WVVB.mjs.map} +0 -0
  173. /package/dist/{chunk-6WU74VFU.mjs.map → chunk-QMYQRPQC.mjs.map} +0 -0
@@ -6711,6 +6711,679 @@ var EmailAutomationEnrollmentFields = /* @__PURE__ */ ((EmailAutomationEnrollmen
6711
6711
  return EmailAutomationEnrollmentFields2;
6712
6712
  })(EmailAutomationEnrollmentFields || {});
6713
6713
 
6714
+ // src/features/blog/BlogModules.ts
6715
+ import { NewspaperIcon } from "lucide-react";
6716
+
6717
+ // src/features/blog/data/BlogCategory.ts
6718
+ var BlogCategory = class extends AbstractApiData {
6719
+ static {
6720
+ __name(this, "BlogCategory");
6721
+ }
6722
+ _originalLanguage;
6723
+ _image;
6724
+ _translations;
6725
+ _language;
6726
+ _name;
6727
+ _slug;
6728
+ _description;
6729
+ get originalLanguage() {
6730
+ return this._originalLanguage ?? "";
6731
+ }
6732
+ get image() {
6733
+ return this._image;
6734
+ }
6735
+ get translations() {
6736
+ return this._translations ?? [];
6737
+ }
6738
+ get original() {
6739
+ return this.translations.find((translation) => translation.isOriginal);
6740
+ }
6741
+ get language() {
6742
+ return this._language;
6743
+ }
6744
+ get name() {
6745
+ return this._name;
6746
+ }
6747
+ get slug() {
6748
+ return this._slug;
6749
+ }
6750
+ get description() {
6751
+ return this._description;
6752
+ }
6753
+ rehydrate(data) {
6754
+ super.rehydrate(data);
6755
+ const attributes = data.jsonApi.attributes ?? {};
6756
+ const meta = data.jsonApi.meta ?? {};
6757
+ const resolved = /* @__PURE__ */ __name((key) => attributes[key] ?? meta[key] ?? void 0, "resolved");
6758
+ this._originalLanguage = attributes.originalLanguage;
6759
+ this._image = attributes.image ?? void 0;
6760
+ this._language = resolved("language");
6761
+ this._name = resolved("name");
6762
+ this._slug = resolved("slug");
6763
+ this._description = resolved("description");
6764
+ this._translations = this._readIncluded(
6765
+ data,
6766
+ "translations",
6767
+ Modules.BlogCategoryTranslation
6768
+ );
6769
+ return this;
6770
+ }
6771
+ createJsonApi(data) {
6772
+ const response = {
6773
+ data: {
6774
+ type: Modules.BlogCategory.name,
6775
+ id: data.id,
6776
+ attributes: {},
6777
+ meta: {},
6778
+ relationships: {}
6779
+ },
6780
+ included: []
6781
+ };
6782
+ if (data.originalLanguage !== void 0) response.data.attributes.originalLanguage = data.originalLanguage;
6783
+ if (data.name !== void 0) response.data.attributes.name = data.name;
6784
+ if (data.slug !== void 0) response.data.attributes.slug = data.slug;
6785
+ if (data.description !== void 0) response.data.attributes.description = data.description;
6786
+ if (data.image !== void 0) response.data.attributes.image = data.image;
6787
+ return response;
6788
+ }
6789
+ };
6790
+
6791
+ // src/features/blog/data/BlogCategoryTranslation.ts
6792
+ var BlogCategoryTranslation = class extends AbstractApiData {
6793
+ static {
6794
+ __name(this, "BlogCategoryTranslation");
6795
+ }
6796
+ _language;
6797
+ _isOriginal;
6798
+ _source;
6799
+ _aiStatus;
6800
+ _name;
6801
+ _slug;
6802
+ _description;
6803
+ _translatedAt;
6804
+ _category;
6805
+ get language() {
6806
+ return this._language ?? "";
6807
+ }
6808
+ get isOriginal() {
6809
+ return this._isOriginal ?? false;
6810
+ }
6811
+ get source() {
6812
+ return this._source ?? "ai";
6813
+ }
6814
+ get aiStatus() {
6815
+ return this._aiStatus ?? "pending";
6816
+ }
6817
+ get name() {
6818
+ return this._name ?? "";
6819
+ }
6820
+ get slug() {
6821
+ return this._slug ?? "";
6822
+ }
6823
+ get description() {
6824
+ return this._description;
6825
+ }
6826
+ get translatedAt() {
6827
+ return this._translatedAt;
6828
+ }
6829
+ get category() {
6830
+ return this._category;
6831
+ }
6832
+ rehydrate(data) {
6833
+ super.rehydrate(data);
6834
+ const attributes = data.jsonApi.attributes ?? {};
6835
+ this._language = attributes.language;
6836
+ this._isOriginal = attributes.isOriginal === true;
6837
+ this._source = attributes.source;
6838
+ this._aiStatus = attributes.aiStatus;
6839
+ this._name = attributes.name ?? void 0;
6840
+ this._slug = attributes.slug ?? void 0;
6841
+ this._description = attributes.description ?? void 0;
6842
+ this._translatedAt = attributes.translatedAt ? new Date(attributes.translatedAt) : void 0;
6843
+ this._category = this._readIncluded(data, "category", Modules.BlogCategory);
6844
+ return this;
6845
+ }
6846
+ createJsonApi(data) {
6847
+ const response = {
6848
+ data: {
6849
+ type: Modules.BlogCategoryTranslation.name,
6850
+ id: data.id,
6851
+ attributes: {},
6852
+ meta: {},
6853
+ relationships: {}
6854
+ },
6855
+ included: []
6856
+ };
6857
+ if (data.name !== void 0) response.data.attributes.name = data.name;
6858
+ if (data.slug !== void 0) response.data.attributes.slug = data.slug;
6859
+ if (data.description !== void 0) response.data.attributes.description = data.description;
6860
+ return response;
6861
+ }
6862
+ };
6863
+
6864
+ // src/features/blog/data/BlogPost.ts
6865
+ var BlogPost = class extends AbstractApiData {
6866
+ static {
6867
+ __name(this, "BlogPost");
6868
+ }
6869
+ _status;
6870
+ _originalLanguage;
6871
+ _coverImage;
6872
+ _publishedAt;
6873
+ _author;
6874
+ _categories;
6875
+ _translations;
6876
+ _language;
6877
+ _title;
6878
+ _slug;
6879
+ _summary;
6880
+ _body;
6881
+ _coverImageAlt;
6882
+ _readingMinutes;
6883
+ _authorName;
6884
+ _categoryIds;
6885
+ get status() {
6886
+ return this._status ?? "draft";
6887
+ }
6888
+ get originalLanguage() {
6889
+ return this._originalLanguage ?? "";
6890
+ }
6891
+ get coverImage() {
6892
+ return this._coverImage;
6893
+ }
6894
+ get publishedAt() {
6895
+ return this._publishedAt;
6896
+ }
6897
+ get author() {
6898
+ return this._author;
6899
+ }
6900
+ get categories() {
6901
+ return this._categories ?? [];
6902
+ }
6903
+ get translations() {
6904
+ return this._translations ?? [];
6905
+ }
6906
+ get original() {
6907
+ return this.translations.find((translation) => translation.isOriginal);
6908
+ }
6909
+ get language() {
6910
+ return this._language;
6911
+ }
6912
+ get title() {
6913
+ return this._title;
6914
+ }
6915
+ get slug() {
6916
+ return this._slug;
6917
+ }
6918
+ get summary() {
6919
+ return this._summary;
6920
+ }
6921
+ get body() {
6922
+ return this._body ?? [];
6923
+ }
6924
+ get coverImageAlt() {
6925
+ return this._coverImageAlt;
6926
+ }
6927
+ get readingMinutes() {
6928
+ return this._readingMinutes;
6929
+ }
6930
+ get authorName() {
6931
+ return this._authorName;
6932
+ }
6933
+ get categoryIds() {
6934
+ return this._categoryIds ?? [];
6935
+ }
6936
+ rehydrate(data) {
6937
+ super.rehydrate(data);
6938
+ const attributes = data.jsonApi.attributes ?? {};
6939
+ const meta = data.jsonApi.meta ?? {};
6940
+ const resolved = /* @__PURE__ */ __name((key) => attributes[key] ?? meta[key] ?? void 0, "resolved");
6941
+ this._status = attributes.status;
6942
+ this._originalLanguage = attributes.originalLanguage;
6943
+ this._coverImage = attributes.coverImage ?? void 0;
6944
+ this._publishedAt = attributes.publishedAt ? new Date(attributes.publishedAt) : void 0;
6945
+ this._language = resolved("language");
6946
+ this._title = resolved("title");
6947
+ this._slug = resolved("slug");
6948
+ this._summary = resolved("summary");
6949
+ const body = resolved("body");
6950
+ this._body = body ? JSON.parse(body) : void 0;
6951
+ this._coverImageAlt = resolved("coverImageAlt");
6952
+ this._readingMinutes = resolved("readingMinutes");
6953
+ this._authorName = resolved("authorName");
6954
+ this._categoryIds = resolved("categoryIds") ?? [];
6955
+ this._author = this._readIncluded(data, "author", Modules.User);
6956
+ this._categories = this._readIncluded(data, "categories", Modules.BlogCategory);
6957
+ this._translations = this._readIncluded(
6958
+ data,
6959
+ "translations",
6960
+ Modules.BlogPostTranslation
6961
+ );
6962
+ return this;
6963
+ }
6964
+ createJsonApi(data) {
6965
+ const response = {
6966
+ data: {
6967
+ type: Modules.BlogPost.name,
6968
+ id: data.id,
6969
+ attributes: {},
6970
+ meta: {},
6971
+ relationships: {}
6972
+ },
6973
+ included: []
6974
+ };
6975
+ if (data.originalLanguage !== void 0) response.data.attributes.originalLanguage = data.originalLanguage;
6976
+ if (data.title !== void 0) response.data.attributes.title = data.title;
6977
+ if (data.slug !== void 0) response.data.attributes.slug = data.slug;
6978
+ if (data.summary !== void 0) response.data.attributes.summary = data.summary;
6979
+ if (data.body !== void 0) response.data.attributes.body = JSON.stringify(data.body);
6980
+ if (data.coverImage !== void 0) response.data.attributes.coverImage = data.coverImage;
6981
+ if (data.coverImageAlt !== void 0) response.data.attributes.coverImageAlt = data.coverImageAlt;
6982
+ if (data.categoryIds !== void 0) {
6983
+ response.data.relationships.categories = {
6984
+ data: data.categoryIds.map((id) => ({ type: Modules.BlogCategory.name, id }))
6985
+ };
6986
+ }
6987
+ return response;
6988
+ }
6989
+ };
6990
+
6991
+ // src/features/blog/data/BlogPostTranslation.ts
6992
+ var BlogPostTranslation = class extends AbstractApiData {
6993
+ static {
6994
+ __name(this, "BlogPostTranslation");
6995
+ }
6996
+ _language;
6997
+ _isOriginal;
6998
+ _source;
6999
+ _aiStatus;
7000
+ _title;
7001
+ _slug;
7002
+ _summary;
7003
+ _body;
7004
+ _coverImageAlt;
7005
+ _readingMinutes;
7006
+ _translatedAt;
7007
+ _post;
7008
+ get language() {
7009
+ return this._language ?? "";
7010
+ }
7011
+ get isOriginal() {
7012
+ return this._isOriginal ?? false;
7013
+ }
7014
+ get source() {
7015
+ return this._source ?? "ai";
7016
+ }
7017
+ get aiStatus() {
7018
+ return this._aiStatus ?? "pending";
7019
+ }
7020
+ get title() {
7021
+ return this._title ?? "";
7022
+ }
7023
+ get slug() {
7024
+ return this._slug ?? "";
7025
+ }
7026
+ get summary() {
7027
+ return this._summary;
7028
+ }
7029
+ get body() {
7030
+ return this._body ?? [];
7031
+ }
7032
+ get coverImageAlt() {
7033
+ return this._coverImageAlt;
7034
+ }
7035
+ get readingMinutes() {
7036
+ return this._readingMinutes ?? 1;
7037
+ }
7038
+ get translatedAt() {
7039
+ return this._translatedAt;
7040
+ }
7041
+ get post() {
7042
+ return this._post;
7043
+ }
7044
+ rehydrate(data) {
7045
+ super.rehydrate(data);
7046
+ const attributes = data.jsonApi.attributes ?? {};
7047
+ this._language = attributes.language;
7048
+ this._isOriginal = attributes.isOriginal === true;
7049
+ this._source = attributes.source;
7050
+ this._aiStatus = attributes.aiStatus;
7051
+ this._title = attributes.title ?? void 0;
7052
+ this._slug = attributes.slug ?? void 0;
7053
+ this._summary = attributes.summary ?? void 0;
7054
+ this._body = attributes.body ? JSON.parse(attributes.body) : void 0;
7055
+ this._coverImageAlt = attributes.coverImageAlt ?? void 0;
7056
+ this._readingMinutes = attributes.readingMinutes ?? void 0;
7057
+ this._translatedAt = attributes.translatedAt ? new Date(attributes.translatedAt) : void 0;
7058
+ this._post = this._readIncluded(data, "post", Modules.BlogPost);
7059
+ return this;
7060
+ }
7061
+ createJsonApi(data) {
7062
+ const response = {
7063
+ data: {
7064
+ type: Modules.BlogPostTranslation.name,
7065
+ id: data.id,
7066
+ attributes: {},
7067
+ meta: {},
7068
+ relationships: {}
7069
+ },
7070
+ included: []
7071
+ };
7072
+ if (data.title !== void 0) response.data.attributes.title = data.title;
7073
+ if (data.slug !== void 0) response.data.attributes.slug = data.slug;
7074
+ if (data.summary !== void 0) response.data.attributes.summary = data.summary;
7075
+ if (data.body !== void 0) response.data.attributes.body = JSON.stringify(data.body);
7076
+ if (data.coverImageAlt !== void 0) response.data.attributes.coverImageAlt = data.coverImageAlt;
7077
+ return response;
7078
+ }
7079
+ };
7080
+
7081
+ // src/features/blog/types/blog.constants.ts
7082
+ var BLOG_LIST_LAYOUTS = ["featured", "column", "rail"];
7083
+ var BLOG_POST_STATUSES = ["draft", "published", "unpublished"];
7084
+ var BLOG_TRANSLATION_SOURCES = ["original", "ai", "manual"];
7085
+ var BLOG_SETTINGS_ID = "5f3c2a9e-8d41-4b7a-9c2e-1a6b0d4e7f13";
7086
+ var BLOG_MODULE_ID = "c1d0e6a2-4b8f-4f3e-9a7d-2e5b8c6f1a90";
7087
+ var BLOG_UPLOAD_ROOT = "blog";
7088
+ var BLOG_POST_UPLOAD_PREFIX = `${BLOG_UPLOAD_ROOT}/blog-posts`;
7089
+ var BLOG_CATEGORY_UPLOAD_PREFIX = `${BLOG_UPLOAD_ROOT}/blog-categories`;
7090
+ var BLOG_PUBLIC_PREFIX = "public";
7091
+ var BLOG_ACTION = {
7092
+ publish: "publish",
7093
+ unpublish: "unpublish",
7094
+ retranslate: "retranslate",
7095
+ related: "related"
7096
+ };
7097
+
7098
+ // src/features/blog/data/BlogSettings.ts
7099
+ var BlogSettings = class extends AbstractApiData {
7100
+ static {
7101
+ __name(this, "BlogSettings");
7102
+ }
7103
+ _listLayout;
7104
+ get listLayout() {
7105
+ return this._listLayout ?? "featured";
7106
+ }
7107
+ rehydrate(data) {
7108
+ super.rehydrate(data);
7109
+ const listLayout = data.jsonApi.attributes?.listLayout;
7110
+ this._listLayout = BLOG_LIST_LAYOUTS.includes(listLayout) ? listLayout : void 0;
7111
+ return this;
7112
+ }
7113
+ createJsonApi(data) {
7114
+ const response = {
7115
+ data: {
7116
+ type: Modules.BlogSettings.name,
7117
+ id: data.id,
7118
+ attributes: {},
7119
+ meta: {},
7120
+ relationships: {}
7121
+ },
7122
+ included: []
7123
+ };
7124
+ response.data.attributes.listLayout = data.listLayout;
7125
+ return response;
7126
+ }
7127
+ };
7128
+
7129
+ // src/features/blog/BlogModules.ts
7130
+ var BlogPostModule = /* @__PURE__ */ __name((factory) => factory({
7131
+ moduleId: BLOG_MODULE_ID,
7132
+ pageUrl: "/administration/blog",
7133
+ name: "blog-posts",
7134
+ model: BlogPost,
7135
+ icon: NewspaperIcon
7136
+ }), "BlogPostModule");
7137
+ var BlogPostTranslationModule = /* @__PURE__ */ __name((factory) => factory({
7138
+ moduleId: BLOG_MODULE_ID,
7139
+ name: "blog-post-translations",
7140
+ model: BlogPostTranslation,
7141
+ icon: NewspaperIcon
7142
+ }), "BlogPostTranslationModule");
7143
+ var BlogCategoryModule = /* @__PURE__ */ __name((factory) => factory({
7144
+ moduleId: BLOG_MODULE_ID,
7145
+ name: "blog-categories",
7146
+ model: BlogCategory,
7147
+ icon: NewspaperIcon
7148
+ }), "BlogCategoryModule");
7149
+ var BlogCategoryTranslationModule = /* @__PURE__ */ __name((factory) => factory({
7150
+ moduleId: BLOG_MODULE_ID,
7151
+ name: "blog-category-translations",
7152
+ model: BlogCategoryTranslation,
7153
+ icon: NewspaperIcon
7154
+ }), "BlogCategoryTranslationModule");
7155
+ var BlogSettingsModule = /* @__PURE__ */ __name((factory) => factory({
7156
+ moduleId: BLOG_MODULE_ID,
7157
+ name: "blog-settings",
7158
+ model: BlogSettings,
7159
+ icon: NewspaperIcon
7160
+ }), "BlogSettingsModule");
7161
+
7162
+ // src/features/blog/data/BlogPostService.ts
7163
+ var BlogPostService = class extends AbstractService {
7164
+ static {
7165
+ __name(this, "BlogPostService");
7166
+ }
7167
+ static async findMany(params = {}) {
7168
+ const endpoint = new EndpointCreator({ endpoint: Modules.BlogPost });
7169
+ if (params.search) endpoint.addAdditionalParam("search", params.search);
7170
+ return this.callApi({
7171
+ type: Modules.BlogPost,
7172
+ method: "GET" /* GET */,
7173
+ endpoint: endpoint.generate(),
7174
+ next: params.next
7175
+ });
7176
+ }
7177
+ static async findOne(params) {
7178
+ return this.callApi({
7179
+ type: Modules.BlogPost,
7180
+ method: "GET" /* GET */,
7181
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogPost, id: params.id }).generate()
7182
+ });
7183
+ }
7184
+ static async create(params) {
7185
+ return this.callApi({
7186
+ type: Modules.BlogPost,
7187
+ method: "POST" /* POST */,
7188
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogPost }).generate(),
7189
+ input: params
7190
+ });
7191
+ }
7192
+ static async update(params) {
7193
+ return this.callApi({
7194
+ type: Modules.BlogPost,
7195
+ method: "PUT" /* PUT */,
7196
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogPost, id: params.id }).generate(),
7197
+ input: params
7198
+ });
7199
+ }
7200
+ static async delete(params) {
7201
+ await this.callApi({
7202
+ type: Modules.BlogPost,
7203
+ method: "DELETE" /* DELETE */,
7204
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogPost, id: params.id }).generate()
7205
+ });
7206
+ }
7207
+ /**
7208
+ * POST blog-posts/:id/publish. Sends no body; replies with the post.
7209
+ */
7210
+ static async publish(params) {
7211
+ return this.callApi({
7212
+ type: Modules.BlogPost,
7213
+ method: "POST" /* POST */,
7214
+ endpoint: new EndpointCreator({
7215
+ endpoint: Modules.BlogPost,
7216
+ id: params.id,
7217
+ childEndpoint: BLOG_ACTION.publish
7218
+ }).generate()
7219
+ });
7220
+ }
7221
+ /**
7222
+ * POST blog-posts/:id/unpublish. Sends no body; replies with the post.
7223
+ */
7224
+ static async unpublish(params) {
7225
+ return this.callApi({
7226
+ type: Modules.BlogPost,
7227
+ method: "POST" /* POST */,
7228
+ endpoint: new EndpointCreator({
7229
+ endpoint: Modules.BlogPost,
7230
+ id: params.id,
7231
+ childEndpoint: BLOG_ACTION.unpublish
7232
+ }).generate()
7233
+ });
7234
+ }
7235
+ };
7236
+
7237
+ // src/features/blog/data/BlogPostTranslationService.ts
7238
+ var BlogPostTranslationService = class extends AbstractService {
7239
+ static {
7240
+ __name(this, "BlogPostTranslationService");
7241
+ }
7242
+ static async update(params) {
7243
+ return this.callApi({
7244
+ type: Modules.BlogPostTranslation,
7245
+ method: "PUT" /* PUT */,
7246
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogPostTranslation, id: params.id }).generate(),
7247
+ input: params
7248
+ });
7249
+ }
7250
+ /**
7251
+ * POST blog-post-translations/:id/retranslate. Re-queues this one language
7252
+ * from the current original. Replies 204.
7253
+ */
7254
+ static async retranslate(params) {
7255
+ await this.callApi({
7256
+ type: Modules.BlogPostTranslation,
7257
+ method: "POST" /* POST */,
7258
+ endpoint: new EndpointCreator({
7259
+ endpoint: Modules.BlogPostTranslation,
7260
+ id: params.id,
7261
+ childEndpoint: BLOG_ACTION.retranslate
7262
+ }).generate()
7263
+ });
7264
+ }
7265
+ };
7266
+
7267
+ // src/features/blog/data/BlogCategoryService.ts
7268
+ var BlogCategoryService = class extends AbstractService {
7269
+ static {
7270
+ __name(this, "BlogCategoryService");
7271
+ }
7272
+ static async findMany(params = {}) {
7273
+ const endpoint = new EndpointCreator({ endpoint: Modules.BlogCategory });
7274
+ if (params.fetchAll) endpoint.addAdditionalParam("fetchAll", "true");
7275
+ if (params.search) endpoint.addAdditionalParam("search", params.search);
7276
+ return this.callApi({
7277
+ type: Modules.BlogCategory,
7278
+ method: "GET" /* GET */,
7279
+ endpoint: endpoint.generate(),
7280
+ next: params.next
7281
+ });
7282
+ }
7283
+ static async findOne(params) {
7284
+ return this.callApi({
7285
+ type: Modules.BlogCategory,
7286
+ method: "GET" /* GET */,
7287
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogCategory, id: params.id }).generate()
7288
+ });
7289
+ }
7290
+ static async create(params) {
7291
+ return this.callApi({
7292
+ type: Modules.BlogCategory,
7293
+ method: "POST" /* POST */,
7294
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogCategory }).generate(),
7295
+ input: params
7296
+ });
7297
+ }
7298
+ static async update(params) {
7299
+ return this.callApi({
7300
+ type: Modules.BlogCategory,
7301
+ method: "PUT" /* PUT */,
7302
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogCategory, id: params.id }).generate(),
7303
+ input: params
7304
+ });
7305
+ }
7306
+ static async delete(params) {
7307
+ await this.callApi({
7308
+ type: Modules.BlogCategory,
7309
+ method: "DELETE" /* DELETE */,
7310
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogCategory, id: params.id }).generate()
7311
+ });
7312
+ }
7313
+ };
7314
+
7315
+ // src/features/blog/data/BlogCategoryTranslationService.ts
7316
+ var BlogCategoryTranslationService = class extends AbstractService {
7317
+ static {
7318
+ __name(this, "BlogCategoryTranslationService");
7319
+ }
7320
+ static async update(params) {
7321
+ return this.callApi({
7322
+ type: Modules.BlogCategoryTranslation,
7323
+ method: "PUT" /* PUT */,
7324
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogCategoryTranslation, id: params.id }).generate(),
7325
+ input: params
7326
+ });
7327
+ }
7328
+ /**
7329
+ * POST blog-category-translations/:id/retranslate. Re-queues this one
7330
+ * language from the current original. Replies 204.
7331
+ */
7332
+ static async retranslate(params) {
7333
+ await this.callApi({
7334
+ type: Modules.BlogCategoryTranslation,
7335
+ method: "POST" /* POST */,
7336
+ endpoint: new EndpointCreator({
7337
+ endpoint: Modules.BlogCategoryTranslation,
7338
+ id: params.id,
7339
+ childEndpoint: BLOG_ACTION.retranslate
7340
+ }).generate()
7341
+ });
7342
+ }
7343
+ };
7344
+
7345
+ // src/features/blog/data/BlogSettingsService.ts
7346
+ var BlogSettingsService = class extends AbstractService {
7347
+ static {
7348
+ __name(this, "BlogSettingsService");
7349
+ }
7350
+ /**
7351
+ * GET blog-settings: the stored singleton, or the API's default.
7352
+ */
7353
+ static async get() {
7354
+ return this.callApi({
7355
+ type: Modules.BlogSettings,
7356
+ method: "GET" /* GET */,
7357
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogSettings }).generate()
7358
+ });
7359
+ }
7360
+ static async save(params) {
7361
+ return this.callApi({
7362
+ type: Modules.BlogSettings,
7363
+ method: "PUT" /* PUT */,
7364
+ endpoint: new EndpointCreator({ endpoint: Modules.BlogSettings, id: params.id }).generate(),
7365
+ input: params
7366
+ });
7367
+ }
7368
+ };
7369
+
7370
+ // src/features/blog/data/BlogPostFields.ts
7371
+ var BlogPostFields = /* @__PURE__ */ ((BlogPostFields2) => {
7372
+ BlogPostFields2["title"] = "title";
7373
+ BlogPostFields2["status"] = "status";
7374
+ BlogPostFields2["categories"] = "categories";
7375
+ BlogPostFields2["publishedAt"] = "publishedAt";
7376
+ BlogPostFields2["languages"] = "languages";
7377
+ return BlogPostFields2;
7378
+ })(BlogPostFields || {});
7379
+
7380
+ // src/features/blog/data/BlogCategoryFields.ts
7381
+ var BlogCategoryFields = /* @__PURE__ */ ((BlogCategoryFields2) => {
7382
+ BlogCategoryFields2["name"] = "name";
7383
+ BlogCategoryFields2["languages"] = "languages";
7384
+ return BlogCategoryFields2;
7385
+ })(BlogCategoryFields || {});
7386
+
6714
7387
  // src/features/handbook/HandbookPageModule.ts
6715
7388
  import { BookOpenIcon } from "lucide-react";
6716
7389
 
@@ -8492,6 +9165,20 @@ var S3Service = class extends AbstractService {
8492
9165
  if (params.isPublic) endpoint.addAdditionalParam("isPublic", "true");
8493
9166
  return this.callApi({ type: Modules.S3, method: "GET" /* GET */, endpoint: endpoint.generate() });
8494
9167
  }
9168
+ /**
9169
+ * Presigns `key` and PUTs `file` to the presigned S3 URL. The PUT goes straight
9170
+ * to object storage (not the JSON:API backend), so it cannot use callApi.
9171
+ * Throws when the upload is rejected.
9172
+ */
9173
+ static async upload(params) {
9174
+ const s3 = await this.getPreSignedUrl({
9175
+ key: params.key,
9176
+ contentType: params.contentType,
9177
+ isPublic: params.isPublic
9178
+ });
9179
+ const response = await fetch(s3.url, { method: "PUT", headers: s3.headers, body: params.file });
9180
+ if (!response.ok) throw new Error(`S3 upload failed: ${response.status}`);
9181
+ }
8495
9182
  static async getSignedUrl(params) {
8496
9183
  const endpoint = new EndpointCreator({ endpoint: Modules.S3, id: "sign" }).addAdditionalParam("key", params.key);
8497
9184
  if (params.isPublic) endpoint.addAdditionalParam("isPublic", "true");
@@ -10649,6 +11336,7 @@ export {
10649
11336
  getI18nLink,
10650
11337
  useI18nLocale,
10651
11338
  useI18nDateFnsLocale,
11339
+ getI18nSupportedLocales,
10652
11340
  HttpMethod,
10653
11341
  setGlobalErrorHandler,
10654
11342
  getGlobalErrorHandler,
@@ -10813,6 +11501,33 @@ export {
10813
11501
  EmailAutomationEnrollmentService,
10814
11502
  EmailAutomationFields,
10815
11503
  EmailAutomationEnrollmentFields,
11504
+ BlogCategory,
11505
+ BlogCategoryTranslation,
11506
+ BlogPost,
11507
+ BlogPostTranslation,
11508
+ BLOG_LIST_LAYOUTS,
11509
+ BLOG_POST_STATUSES,
11510
+ BLOG_TRANSLATION_SOURCES,
11511
+ BLOG_SETTINGS_ID,
11512
+ BLOG_MODULE_ID,
11513
+ BLOG_UPLOAD_ROOT,
11514
+ BLOG_POST_UPLOAD_PREFIX,
11515
+ BLOG_CATEGORY_UPLOAD_PREFIX,
11516
+ BLOG_PUBLIC_PREFIX,
11517
+ BLOG_ACTION,
11518
+ BlogSettings,
11519
+ BlogPostModule,
11520
+ BlogPostTranslationModule,
11521
+ BlogCategoryModule,
11522
+ BlogCategoryTranslationModule,
11523
+ BlogSettingsModule,
11524
+ BlogPostService,
11525
+ BlogPostTranslationService,
11526
+ BlogCategoryService,
11527
+ BlogCategoryTranslationService,
11528
+ BlogSettingsService,
11529
+ BlogPostFields,
11530
+ BlogCategoryFields,
10816
11531
  HandbookPage,
10817
11532
  HandbookPageModule,
10818
11533
  HandbookSection,
@@ -10912,4 +11627,4 @@ export {
10912
11627
  AuditLogService,
10913
11628
  AuditLogModule
10914
11629
  };
10915
- //# sourceMappingURL=chunk-JQWI62NV.mjs.map
11630
+ //# sourceMappingURL=chunk-WC63PJSC.mjs.map