@carlonicora/nextjs-jsonapi 6.23.0 → 6.25.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 (250) hide show
  1. package/dist/{BlockNoteEditor-PPRML5CO.js → BlockNoteEditor-TNX77GCD.js} +28 -25
  2. package/dist/BlockNoteEditor-TNX77GCD.js.map +1 -0
  3. package/dist/{BlockNoteEditor-UO4ZRCUM.mjs → BlockNoteEditor-Z5LDF47Z.mjs} +13 -10
  4. package/dist/{BlockNoteEditor-UO4ZRCUM.mjs.map → BlockNoteEditor-Z5LDF47Z.mjs.map} +1 -1
  5. package/dist/{BlockNoteViewer-K2HBF3IP.js → BlockNoteViewer-6KQJODNF.js} +9 -7
  6. package/dist/BlockNoteViewer-6KQJODNF.js.map +1 -0
  7. package/dist/{BlockNoteViewer-2TJZ6JET.mjs → BlockNoteViewer-TQ452ZYW.mjs} +8 -6
  8. package/dist/{BlockNoteViewer-2TJZ6JET.mjs.map → BlockNoteViewer-TQ452ZYW.mjs.map} +1 -1
  9. package/dist/JsonApiRequest-OKNQZLS6.js +26 -0
  10. package/dist/{JsonApiRequest-KC6DOHKT.js.map → JsonApiRequest-OKNQZLS6.js.map} +1 -1
  11. package/dist/{JsonApiRequest-ADLBJ5RX.mjs → JsonApiRequest-WNPDS356.mjs} +2 -2
  12. package/dist/billing/index.js +504 -517
  13. package/dist/billing/index.js.map +1 -1
  14. package/dist/billing/index.mjs +20 -33
  15. package/dist/billing/index.mjs.map +1 -1
  16. package/dist/{chunk-VNUT2D27.mjs → chunk-2PWYG2WJ.mjs} +2 -2
  17. package/dist/{chunk-W4ML6D2X.mjs → chunk-3U7YJ73T.mjs} +7 -7
  18. package/dist/{chunk-BQ2WAG4K.js → chunk-3VNDFKT7.js} +19 -19
  19. package/dist/{chunk-BQ2WAG4K.js.map → chunk-3VNDFKT7.js.map} +1 -1
  20. package/dist/{chunk-BE6UMM5X.mjs → chunk-47HNJQ7U.mjs} +3 -3
  21. package/dist/chunk-5T2AQMQ2.mjs +90 -0
  22. package/dist/chunk-5T2AQMQ2.mjs.map +1 -0
  23. package/dist/{chunk-A5M3MORY.js → chunk-5WM72MLE.js} +3 -3
  24. package/dist/{chunk-A5M3MORY.js.map → chunk-5WM72MLE.js.map} +1 -1
  25. package/dist/{chunk-S7SPAC6X.mjs → chunk-73NKUBMP.mjs} +3 -3
  26. package/dist/chunk-743M4TIB.mjs +76 -0
  27. package/dist/chunk-743M4TIB.mjs.map +1 -0
  28. package/dist/{chunk-HN7L6RRW.js → chunk-CSBQAPHD.js} +903 -955
  29. package/dist/chunk-CSBQAPHD.js.map +1 -0
  30. package/dist/{chunk-YTDGYI62.mjs → chunk-DWPHHUMV.mjs} +3 -3
  31. package/dist/{chunk-53SD4YRF.js → chunk-FBHUUPRV.js} +5 -5
  32. package/dist/{chunk-53SD4YRF.js.map → chunk-FBHUUPRV.js.map} +1 -1
  33. package/dist/{chunk-T6G2F2BK.mjs → chunk-HJT7TXGG.mjs} +16 -68
  34. package/dist/chunk-HJT7TXGG.mjs.map +1 -0
  35. package/dist/chunk-HROKKUBQ.js +156 -0
  36. package/dist/chunk-HROKKUBQ.js.map +1 -0
  37. package/dist/{chunk-TMV7TL7O.mjs → chunk-JELEQV5T.mjs} +8 -6
  38. package/dist/{chunk-TMV7TL7O.mjs.map → chunk-JELEQV5T.mjs.map} +1 -1
  39. package/dist/{chunk-TNTCLVUR.js → chunk-JGL4P3DS.js} +17 -15
  40. package/dist/chunk-JGL4P3DS.js.map +1 -0
  41. package/dist/{chunk-7OIWOPM5.mjs → chunk-K7KLUYS7.mjs} +4 -3
  42. package/dist/chunk-K7KLUYS7.mjs.map +1 -0
  43. package/dist/{chunk-HP6DT6K3.mjs → chunk-KVYYPKRO.mjs} +311 -241
  44. package/dist/chunk-KVYYPKRO.mjs.map +1 -0
  45. package/dist/{chunk-RCOKQ3R4.js → chunk-LNO2JLU3.js} +2 -2
  46. package/dist/{chunk-RCOKQ3R4.js.map → chunk-LNO2JLU3.js.map} +1 -1
  47. package/dist/{chunk-R5722NLL.js → chunk-M6SNTMK6.js} +1388 -1318
  48. package/dist/chunk-M6SNTMK6.js.map +1 -0
  49. package/dist/{chunk-GMMDXINC.js → chunk-N3NQS7X6.js} +12 -12
  50. package/dist/{chunk-GMMDXINC.js.map → chunk-N3NQS7X6.js.map} +1 -1
  51. package/dist/chunk-NP3AFULU.js +76 -0
  52. package/dist/chunk-NP3AFULU.js.map +1 -0
  53. package/dist/{chunk-SO3YUCL6.js → chunk-OOM54Z5Z.js} +6 -5
  54. package/dist/chunk-OOM54Z5Z.js.map +1 -0
  55. package/dist/{chunk-YSE2Z4RB.js → chunk-PQQFOONG.js} +12 -12
  56. package/dist/{chunk-YSE2Z4RB.js.map → chunk-PQQFOONG.js.map} +1 -1
  57. package/dist/chunk-RW6XZGZG.mjs +156 -0
  58. package/dist/chunk-RW6XZGZG.mjs.map +1 -0
  59. package/dist/chunk-SYMI4IDW.js +90 -0
  60. package/dist/chunk-SYMI4IDW.js.map +1 -0
  61. package/dist/{chunk-N2BFT7KI.mjs → chunk-W7U6O3OE.mjs} +2 -71
  62. package/dist/chunk-W7U6O3OE.mjs.map +1 -0
  63. package/dist/{chunk-YMCL3JXZ.mjs → chunk-YPBIPE2B.mjs} +2 -2
  64. package/dist/{chunk-P7L6OFX5.js → chunk-Z6T2575A.js} +12 -81
  65. package/dist/chunk-Z6T2575A.js.map +1 -0
  66. package/dist/client/index.js +13 -10
  67. package/dist/client/index.js.map +1 -1
  68. package/dist/client/index.mjs +17 -14
  69. package/dist/components/forms/DatePickerPopover.d.ts.map +1 -1
  70. package/dist/components/forms/DateRangeSelector.d.ts.map +1 -1
  71. package/dist/components/forms/EditorSheet.d.ts +6 -1
  72. package/dist/components/forms/EditorSheet.d.ts.map +1 -1
  73. package/dist/components/forms/FormDate.d.ts.map +1 -1
  74. package/dist/components/forms/FormDateTime.d.ts.map +1 -1
  75. package/dist/components/forms/time-cycle.d.ts +14 -0
  76. package/dist/components/forms/time-cycle.d.ts.map +1 -0
  77. package/dist/components/index.js +11 -8
  78. package/dist/components/index.js.map +1 -1
  79. package/dist/components/index.mjs +10 -7
  80. package/dist/components/tables/cells/cell.date.d.ts.map +1 -1
  81. package/dist/components/tables/cells/cell.dateTime.d.ts.map +1 -1
  82. package/dist/contexts/DateLocaleContext.d.ts +56 -0
  83. package/dist/contexts/DateLocaleContext.d.ts.map +1 -0
  84. package/dist/contexts/index.d.ts +1 -0
  85. package/dist/contexts/index.d.ts.map +1 -1
  86. package/dist/contexts/index.js +24 -8
  87. package/dist/contexts/index.js.map +1 -1
  88. package/dist/contexts/index.mjs +23 -7
  89. package/dist/core/index.js +17 -6
  90. package/dist/core/index.js.map +1 -1
  91. package/dist/core/index.mjs +19 -8
  92. package/dist/date-locale/index.d.ts +2 -0
  93. package/dist/date-locale/index.d.ts.map +1 -0
  94. package/dist/date-locale/index.js +21 -0
  95. package/dist/date-locale/index.js.map +1 -0
  96. package/dist/date-locale/index.mjs +21 -0
  97. package/dist/email-automations/index.js +131 -123
  98. package/dist/email-automations/index.js.map +1 -1
  99. package/dist/email-automations/index.mjs +23 -15
  100. package/dist/email-automations/index.mjs.map +1 -1
  101. package/dist/features/account-deletion/components/AccountDeletionAdminTrigger.d.ts.map +1 -1
  102. package/dist/features/analytics/components/AnalyticsJourneyContainer.d.ts.map +1 -1
  103. package/dist/features/analytics/components/AnalyticsSessionsTable.d.ts.map +1 -1
  104. package/dist/features/analytics/index.js +154 -147
  105. package/dist/features/analytics/index.js.map +1 -1
  106. package/dist/features/analytics/index.mjs +32 -25
  107. package/dist/features/analytics/index.mjs.map +1 -1
  108. package/dist/features/analytics/server.js +11 -9
  109. package/dist/features/analytics/server.js.map +1 -1
  110. package/dist/features/analytics/server.mjs +9 -7
  111. package/dist/features/analytics/server.mjs.map +1 -1
  112. package/dist/features/billing/components/utils/date.d.ts +3 -3
  113. package/dist/features/billing/components/utils/format-options.d.ts +6 -4
  114. package/dist/features/billing/components/utils/format-options.d.ts.map +1 -1
  115. package/dist/features/billing/components/utils/useBillingFormatOptions.d.ts +5 -1
  116. package/dist/features/billing/components/utils/useBillingFormatOptions.d.ts.map +1 -1
  117. package/dist/features/billing/stripe-usage/components/details/UsageSummaryCard.d.ts.map +1 -1
  118. package/dist/features/billing/stripe-usage/components/lists/UsageHistoryTable.d.ts.map +1 -1
  119. package/dist/features/blog/components/admin/BlogTranslationStatus.d.ts.map +1 -1
  120. package/dist/features/blog/components/public/BlogPostMeta.d.ts.map +1 -1
  121. package/dist/features/blog/hooks/useBlogPostTableStructure.d.ts.map +1 -1
  122. package/dist/features/blog/index.js +168 -162
  123. package/dist/features/blog/index.js.map +1 -1
  124. package/dist/features/blog/index.mjs +25 -19
  125. package/dist/features/blog/index.mjs.map +1 -1
  126. package/dist/features/blog/server.js +29 -27
  127. package/dist/features/blog/server.js.map +1 -1
  128. package/dist/features/blog/server.mjs +8 -6
  129. package/dist/features/blog/server.mjs.map +1 -1
  130. package/dist/features/email-automation/hooks/useEmailAutomationEnrollmentTableStructure.d.ts.map +1 -1
  131. package/dist/features/handbook/components/parts/HandbookIndexStatus.d.ts.map +1 -1
  132. package/dist/features/help/components/HelpArticleBody.d.ts.map +1 -1
  133. package/dist/features/help/index.js +48 -43
  134. package/dist/features/help/index.js.map +1 -1
  135. package/dist/features/help/index.mjs +15 -10
  136. package/dist/features/help/index.mjs.map +1 -1
  137. package/dist/features/notification/components/notifications/Notification.d.ts +2 -1
  138. package/dist/features/notification/components/notifications/Notification.d.ts.map +1 -1
  139. package/dist/features/notification/contexts/NotificationContext.d.ts.map +1 -1
  140. package/dist/features/notification/hooks/useNotificationTableStructure.d.ts.map +1 -1
  141. package/dist/features/oauth/components/OAuthClientCard.d.ts.map +1 -1
  142. package/dist/features/oauth/components/OAuthClientDetail.d.ts.map +1 -1
  143. package/dist/features/tokenusage/index.js +133 -130
  144. package/dist/features/tokenusage/index.js.map +1 -1
  145. package/dist/features/tokenusage/index.mjs +10 -7
  146. package/dist/features/tokenusage/index.mjs.map +1 -1
  147. package/dist/features/tokenusage/lib/formatters.d.ts +6 -3
  148. package/dist/features/tokenusage/lib/formatters.d.ts.map +1 -1
  149. package/dist/index.js +19 -7
  150. package/dist/index.js.map +1 -1
  151. package/dist/index.mjs +23 -11
  152. package/dist/local-transport-AT4TE264.js +15 -0
  153. package/dist/{local-transport-MJPOKPTU.js.map → local-transport-AT4TE264.js.map} +1 -1
  154. package/dist/{local-transport-RVD4FZGA.mjs → local-transport-KWEUZ4GX.mjs} +5 -5
  155. package/dist/offline/index.js +56 -54
  156. package/dist/offline/index.js.map +1 -1
  157. package/dist/offline/index.mjs +23 -21
  158. package/dist/offline/index.mjs.map +1 -1
  159. package/dist/{request-4AWGPIGH.mjs → request-6GAIWWTG.mjs} +2 -2
  160. package/dist/{request-H5FZBZA2.js → request-BWO4Y434.js} +3 -3
  161. package/dist/{request-H5FZBZA2.js.map → request-BWO4Y434.js.map} +1 -1
  162. package/dist/server/ServerSession.d.ts +2 -0
  163. package/dist/server/ServerSession.d.ts.map +1 -1
  164. package/dist/server/index.js +10 -8
  165. package/dist/server/index.js.map +1 -1
  166. package/dist/server/index.mjs +9 -7
  167. package/dist/utils/date-formatter.d.ts +45 -4
  168. package/dist/utils/date-formatter.d.ts.map +1 -1
  169. package/dist/utils/index.d.ts +1 -1
  170. package/dist/utils/index.d.ts.map +1 -1
  171. package/dist/write-through-KNRI5L4V.mjs +15 -0
  172. package/dist/write-through-KNRI5L4V.mjs.map +1 -0
  173. package/dist/write-through-MYHQ6GJU.js +15 -0
  174. package/dist/{write-through-HE2QSOVI.js.map → write-through-MYHQ6GJU.js.map} +1 -1
  175. package/messages/en.json +1 -0
  176. package/messages/it.json +1 -0
  177. package/package.json +6 -1
  178. package/src/components/forms/DatePickerPopover.tsx +5 -3
  179. package/src/components/forms/DateRangeSelector.tsx +9 -7
  180. package/src/components/forms/EditorSheet.tsx +8 -0
  181. package/src/components/forms/FormDate.tsx +5 -3
  182. package/src/components/forms/FormDateTime.tsx +75 -39
  183. package/src/components/forms/__tests__/EditorSheet.spec.tsx +30 -0
  184. package/src/components/forms/__tests__/time-cycle.spec.ts +37 -0
  185. package/src/components/forms/time-cycle.ts +27 -0
  186. package/src/components/tables/cells/cell.date.tsx +3 -5
  187. package/src/components/tables/cells/cell.dateTime.tsx +3 -7
  188. package/src/contexts/DateLocaleContext.tsx +106 -0
  189. package/src/contexts/__tests__/DateLocaleContext.spec.tsx +175 -0
  190. package/src/contexts/index.ts +1 -0
  191. package/src/date-locale/index.ts +12 -0
  192. package/src/features/account-deletion/components/AccountDeletionAdminTrigger.tsx +3 -4
  193. package/src/features/analytics/components/AnalyticsJourneyContainer.tsx +8 -8
  194. package/src/features/analytics/components/AnalyticsSessionsTable.tsx +4 -6
  195. package/src/features/auth/components/two-factor/PasskeyList.tsx +3 -3
  196. package/src/features/auth/components/two-factor/TotpAuthenticatorList.tsx +3 -3
  197. package/src/features/billing/components/utils/__tests__/billing-formatters.spec.ts +14 -6
  198. package/src/features/billing/components/utils/date.ts +5 -5
  199. package/src/features/billing/components/utils/format-options.ts +6 -4
  200. package/src/features/billing/components/utils/useBillingFormatOptions.ts +8 -2
  201. package/src/features/billing/stripe-usage/components/details/UsageSummaryCard.tsx +4 -12
  202. package/src/features/billing/stripe-usage/components/lists/UsageHistoryTable.tsx +4 -17
  203. package/src/features/blog/components/admin/BlogTranslationStatus.tsx +3 -2
  204. package/src/features/blog/components/public/BlogPostMeta.tsx +5 -4
  205. package/src/features/blog/components/public/__tests__/BlogList.spec.tsx +1 -2
  206. package/src/features/blog/components/public/__tests__/BlogPostView.spec.tsx +2 -3
  207. package/src/features/blog/hooks/useBlogPostTableStructure.tsx +4 -8
  208. package/src/features/email-automation/hooks/useEmailAutomationEnrollmentTableStructure.tsx +11 -5
  209. package/src/features/email-blast/components/containers/EmailBlastContainer.tsx +3 -3
  210. package/src/features/email-blast/hooks/useEmailBlastTableStructure.tsx +4 -4
  211. package/src/features/handbook/components/parts/HandbookIndexStatus.tsx +4 -3
  212. package/src/features/help/components/HelpArticleBody.tsx +4 -3
  213. package/src/features/notification/components/notifications/Notification.tsx +38 -7
  214. package/src/features/notification/contexts/NotificationContext.tsx +6 -3
  215. package/src/features/notification/hooks/useNotificationTableStructure.tsx +6 -5
  216. package/src/features/oauth/components/OAuthClientCard.tsx +8 -5
  217. package/src/features/oauth/components/OAuthClientDetail.tsx +3 -6
  218. package/src/features/tokenusage/lib/__tests__/formatters.spec.ts +19 -0
  219. package/src/features/tokenusage/lib/formatters.ts +11 -6
  220. package/src/features/waitlist/hooks/useWaitlistTableStructure.tsx +5 -5
  221. package/src/server/ServerSession.ts +3 -0
  222. package/src/server/__tests__/ServerSession.read.spec.ts +18 -1
  223. package/src/utils/__tests__/date-formatter.spec.ts +134 -10
  224. package/src/utils/date-formatter.ts +200 -44
  225. package/src/utils/index.ts +11 -1
  226. package/dist/BlockNoteEditor-PPRML5CO.js.map +0 -1
  227. package/dist/BlockNoteViewer-K2HBF3IP.js.map +0 -1
  228. package/dist/JsonApiRequest-KC6DOHKT.js +0 -26
  229. package/dist/chunk-7OIWOPM5.mjs.map +0 -1
  230. package/dist/chunk-HN7L6RRW.js.map +0 -1
  231. package/dist/chunk-HP6DT6K3.mjs.map +0 -1
  232. package/dist/chunk-N2BFT7KI.mjs.map +0 -1
  233. package/dist/chunk-P7L6OFX5.js.map +0 -1
  234. package/dist/chunk-R5722NLL.js.map +0 -1
  235. package/dist/chunk-SO3YUCL6.js.map +0 -1
  236. package/dist/chunk-T6G2F2BK.mjs.map +0 -1
  237. package/dist/chunk-TNTCLVUR.js.map +0 -1
  238. package/dist/local-transport-MJPOKPTU.js +0 -15
  239. package/dist/write-through-7I3LA2WN.mjs +0 -15
  240. package/dist/write-through-HE2QSOVI.js +0 -15
  241. /package/dist/{JsonApiRequest-ADLBJ5RX.mjs.map → JsonApiRequest-WNPDS356.mjs.map} +0 -0
  242. /package/dist/{chunk-VNUT2D27.mjs.map → chunk-2PWYG2WJ.mjs.map} +0 -0
  243. /package/dist/{chunk-W4ML6D2X.mjs.map → chunk-3U7YJ73T.mjs.map} +0 -0
  244. /package/dist/{chunk-BE6UMM5X.mjs.map → chunk-47HNJQ7U.mjs.map} +0 -0
  245. /package/dist/{chunk-S7SPAC6X.mjs.map → chunk-73NKUBMP.mjs.map} +0 -0
  246. /package/dist/{chunk-YTDGYI62.mjs.map → chunk-DWPHHUMV.mjs.map} +0 -0
  247. /package/dist/{chunk-YMCL3JXZ.mjs.map → chunk-YPBIPE2B.mjs.map} +0 -0
  248. /package/dist/{local-transport-RVD4FZGA.mjs.map → date-locale/index.mjs.map} +0 -0
  249. /package/dist/{request-4AWGPIGH.mjs.map → local-transport-KWEUZ4GX.mjs.map} +0 -0
  250. /package/dist/{write-through-7I3LA2WN.mjs.map → request-6GAIWWTG.mjs.map} +0 -0
@@ -1,22 +1,24 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
- var _chunkGMMDXINCjs = require('../../chunk-GMMDXINC.js');
3
+ var _chunkN3NQS7X6js = require('../../chunk-N3NQS7X6.js');
4
4
  require('../../chunk-6TUB7Y6T.js');
5
5
  require('../../chunk-YUO55Q5A.js');
6
6
 
7
7
 
8
8
 
9
9
 
10
- var _chunkHN7L6RRWjs = require('../../chunk-HN7L6RRW.js');
10
+ var _chunkCSBQAPHDjs = require('../../chunk-CSBQAPHD.js');
11
+ require('../../chunk-HROKKUBQ.js');
11
12
 
12
13
 
13
14
 
14
- var _chunkP7L6OFX5js = require('../../chunk-P7L6OFX5.js');
15
- require('../../chunk-BQ2WAG4K.js');
16
- require('../../chunk-A5M3MORY.js');
15
+ var _chunkZ6T2575Ajs = require('../../chunk-Z6T2575A.js');
16
+ require('../../chunk-3VNDFKT7.js');
17
+ require('../../chunk-5WM72MLE.js');
17
18
  require('../../chunk-WUNSG3IN.js');
18
- require('../../chunk-RCOKQ3R4.js');
19
+ require('../../chunk-LNO2JLU3.js');
19
20
  require('../../chunk-LXKSUWAV.js');
21
+ require('../../chunk-NP3AFULU.js');
20
22
 
21
23
 
22
24
  var _chunk7QVYU63Ejs = require('../../chunk-7QVYU63E.js');
@@ -54,14 +56,14 @@ _chunk7QVYU63Ejs.__name.call(void 0, toPublicBlogCategory, "toPublicBlogCategory
54
56
 
55
57
  // src/features/blog/server/fetchers.ts
56
58
  var BLOG_PAGE_SIZE = 12;
57
- var publicPostsEndpoint = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, () => `${_chunkHN7L6RRWjs.BLOG_PUBLIC_PREFIX}/${_chunkP7L6OFX5js.Modules.BlogPost.name}`, "publicPostsEndpoint");
59
+ var publicPostsEndpoint = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, () => `${_chunkCSBQAPHDjs.BLOG_PUBLIC_PREFIX}/${_chunkZ6T2575Ajs.Modules.BlogPost.name}`, "publicPostsEndpoint");
58
60
  var asArray = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (data) => Array.isArray(data) ? data : data ? [data] : [], "asArray");
59
61
  async function fetchPublicBlogPosts(params) {
60
62
  if (params.all) return { posts: await fetchEveryPublicBlogPost(params), hasMore: false };
61
63
  const page = Math.min(10, Math.max(1, Math.floor(params.page || 1)));
62
64
  const size = BLOG_PAGE_SIZE * page;
63
- const res = await _chunkGMMDXINCjs.ServerJsonApiGet.call(void 0, {
64
- classKey: { ..._chunkP7L6OFX5js.Modules.BlogPost, cache: "minutes" },
65
+ const res = await _chunkN3NQS7X6js.ServerJsonApiGet.call(void 0, {
66
+ classKey: { ..._chunkZ6T2575Ajs.Modules.BlogPost, cache: "minutes" },
65
67
  endpoint: publicPostsListEndpoint({ ...params, size }),
66
68
  language: params.language
67
69
  });
@@ -73,7 +75,7 @@ async function fetchPublicBlogPosts(params) {
73
75
  }
74
76
  _chunk7QVYU63Ejs.__name.call(void 0, fetchPublicBlogPosts, "fetchPublicBlogPosts");
75
77
  function publicPostsListEndpoint(params) {
76
- const endpoint = new (0, _chunkP7L6OFX5js.EndpointCreator)({ endpoint: publicPostsEndpoint() });
78
+ const endpoint = new (0, _chunkZ6T2575Ajs.EndpointCreator)({ endpoint: publicPostsEndpoint() });
77
79
  endpoint.addAdditionalParam("language", params.language);
78
80
  if (params.categorySlug) endpoint.addAdditionalParam("category", encodeURIComponent(params.categorySlug));
79
81
  if (params.search) endpoint.addAdditionalParam("search", encodeURIComponent(params.search));
@@ -87,8 +89,8 @@ var MAX_ALL_PAGES = 100;
87
89
  async function fetchEveryPublicBlogPost(params) {
88
90
  const posts = [];
89
91
  for (let index = 0; index < MAX_ALL_PAGES; index++) {
90
- const res = await _chunkGMMDXINCjs.ServerJsonApiGet.call(void 0, {
91
- classKey: { ..._chunkP7L6OFX5js.Modules.BlogPost, cache: "minutes" },
92
+ const res = await _chunkN3NQS7X6js.ServerJsonApiGet.call(void 0, {
93
+ classKey: { ..._chunkZ6T2575Ajs.Modules.BlogPost, cache: "minutes" },
92
94
  endpoint: publicPostsListEndpoint({
93
95
  ...params,
94
96
  size: PUBLIC_MAX_PAGE_SIZE,
@@ -105,10 +107,10 @@ async function fetchEveryPublicBlogPost(params) {
105
107
  }
106
108
  _chunk7QVYU63Ejs.__name.call(void 0, fetchEveryPublicBlogPost, "fetchEveryPublicBlogPost");
107
109
  async function fetchPublicBlogPost(params) {
108
- const endpoint = new (0, _chunkP7L6OFX5js.EndpointCreator)({ endpoint: publicPostsEndpoint(), id: encodeURIComponent(params.slug) });
110
+ const endpoint = new (0, _chunkZ6T2575Ajs.EndpointCreator)({ endpoint: publicPostsEndpoint(), id: encodeURIComponent(params.slug) });
109
111
  endpoint.addAdditionalParam("language", params.language);
110
- const res = await _chunkGMMDXINCjs.ServerJsonApiGet.call(void 0, {
111
- classKey: { ..._chunkP7L6OFX5js.Modules.BlogPost, cache: "minutes" },
112
+ const res = await _chunkN3NQS7X6js.ServerJsonApiGet.call(void 0, {
113
+ classKey: { ..._chunkZ6T2575Ajs.Modules.BlogPost, cache: "minutes" },
112
114
  endpoint: endpoint.generate(),
113
115
  language: params.language
114
116
  });
@@ -118,14 +120,14 @@ async function fetchPublicBlogPost(params) {
118
120
  }
119
121
  _chunk7QVYU63Ejs.__name.call(void 0, fetchPublicBlogPost, "fetchPublicBlogPost");
120
122
  async function fetchRelatedBlogPosts(params) {
121
- const endpoint = new (0, _chunkP7L6OFX5js.EndpointCreator)({
123
+ const endpoint = new (0, _chunkZ6T2575Ajs.EndpointCreator)({
122
124
  endpoint: publicPostsEndpoint(),
123
125
  id: encodeURIComponent(params.slug),
124
- childEndpoint: _chunkHN7L6RRWjs.BLOG_ACTION.related
126
+ childEndpoint: _chunkCSBQAPHDjs.BLOG_ACTION.related
125
127
  });
126
128
  endpoint.addAdditionalParam("language", params.language);
127
- const res = await _chunkGMMDXINCjs.ServerJsonApiGet.call(void 0, {
128
- classKey: { ..._chunkP7L6OFX5js.Modules.BlogPost, cache: "minutes" },
129
+ const res = await _chunkN3NQS7X6js.ServerJsonApiGet.call(void 0, {
130
+ classKey: { ..._chunkZ6T2575Ajs.Modules.BlogPost, cache: "minutes" },
129
131
  endpoint: endpoint.generate(),
130
132
  language: params.language
131
133
  });
@@ -134,10 +136,10 @@ async function fetchRelatedBlogPosts(params) {
134
136
  }
135
137
  _chunk7QVYU63Ejs.__name.call(void 0, fetchRelatedBlogPosts, "fetchRelatedBlogPosts");
136
138
  async function fetchPublicBlogCategories(params) {
137
- const endpoint = new (0, _chunkP7L6OFX5js.EndpointCreator)({ endpoint: `${_chunkHN7L6RRWjs.BLOG_PUBLIC_PREFIX}/${_chunkP7L6OFX5js.Modules.BlogCategory.name}` });
139
+ const endpoint = new (0, _chunkZ6T2575Ajs.EndpointCreator)({ endpoint: `${_chunkCSBQAPHDjs.BLOG_PUBLIC_PREFIX}/${_chunkZ6T2575Ajs.Modules.BlogCategory.name}` });
138
140
  endpoint.addAdditionalParam("language", params.language);
139
- const res = await _chunkGMMDXINCjs.ServerJsonApiGet.call(void 0, {
140
- classKey: { ..._chunkP7L6OFX5js.Modules.BlogCategory, cache: "minutes" },
141
+ const res = await _chunkN3NQS7X6js.ServerJsonApiGet.call(void 0, {
142
+ classKey: { ..._chunkZ6T2575Ajs.Modules.BlogCategory, cache: "minutes" },
141
143
  endpoint: endpoint.generate(),
142
144
  language: params.language
143
145
  });
@@ -147,14 +149,14 @@ async function fetchPublicBlogCategories(params) {
147
149
  _chunk7QVYU63Ejs.__name.call(void 0, fetchPublicBlogCategories, "fetchPublicBlogCategories");
148
150
  async function fetchBlogSettings() {
149
151
  const fallback = { listLayout: "featured" };
150
- const res = await _chunkGMMDXINCjs.ServerJsonApiGet.call(void 0, {
151
- classKey: { ..._chunkP7L6OFX5js.Modules.BlogSettings, cache: "minutes" },
152
- endpoint: new (0, _chunkP7L6OFX5js.EndpointCreator)({ endpoint: `${_chunkHN7L6RRWjs.BLOG_PUBLIC_PREFIX}/${_chunkP7L6OFX5js.Modules.BlogSettings.name}` }).generate(),
152
+ const res = await _chunkN3NQS7X6js.ServerJsonApiGet.call(void 0, {
153
+ classKey: { ..._chunkZ6T2575Ajs.Modules.BlogSettings, cache: "minutes" },
154
+ endpoint: new (0, _chunkZ6T2575Ajs.EndpointCreator)({ endpoint: `${_chunkCSBQAPHDjs.BLOG_PUBLIC_PREFIX}/${_chunkZ6T2575Ajs.Modules.BlogSettings.name}` }).generate(),
153
155
  language: "en"
154
156
  });
155
157
  if (!res.ok) return fallback;
156
158
  const settings = asArray(res.data)[0];
157
- if (!settings || !_chunkHN7L6RRWjs.BLOG_LIST_LAYOUTS.includes(settings.listLayout)) return fallback;
159
+ if (!settings || !_chunkCSBQAPHDjs.BLOG_LIST_LAYOUTS.includes(settings.listLayout)) return fallback;
158
160
  return { listLayout: settings.listLayout };
159
161
  }
160
162
  _chunk7QVYU63Ejs.__name.call(void 0, fetchBlogSettings, "fetchBlogSettings");
@@ -167,5 +169,5 @@ _chunk7QVYU63Ejs.__name.call(void 0, fetchBlogSettings, "fetchBlogSettings");
167
169
 
168
170
 
169
171
 
170
- exports.BLOG_LIST_LAYOUTS = _chunkHN7L6RRWjs.BLOG_LIST_LAYOUTS; exports.fetchBlogSettings = fetchBlogSettings; exports.fetchPublicBlogCategories = fetchPublicBlogCategories; exports.fetchPublicBlogPost = fetchPublicBlogPost; exports.fetchPublicBlogPosts = fetchPublicBlogPosts; exports.fetchRelatedBlogPosts = fetchRelatedBlogPosts; exports.toPublicBlogCategory = toPublicBlogCategory; exports.toPublicBlogPost = toPublicBlogPost;
172
+ exports.BLOG_LIST_LAYOUTS = _chunkCSBQAPHDjs.BLOG_LIST_LAYOUTS; exports.fetchBlogSettings = fetchBlogSettings; exports.fetchPublicBlogCategories = fetchPublicBlogCategories; exports.fetchPublicBlogPost = fetchPublicBlogPost; exports.fetchPublicBlogPosts = fetchPublicBlogPosts; exports.fetchRelatedBlogPosts = fetchRelatedBlogPosts; exports.toPublicBlogCategory = toPublicBlogCategory; exports.toPublicBlogPost = toPublicBlogPost;
171
173
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/features/blog/server.js","../../../src/features/blog/server/toPublic.ts","../../../src/features/blog/server/fetchers.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/features/blog/server.js","sourcesContent":[null,"import { BlogCategoryInterface } from \"../data/BlogCategoryInterface\";\nimport { BlogPostInterface } from \"../data/BlogPostInterface\";\nimport { PublicBlogCategory, PublicBlogPost } from \"../types/blog-public.types\";\n\n// Serialisation boundary: a rehydrated model (class instance, Date getters)\n// becomes plain data a server page can pass to the public client components.\n\nexport function toPublicBlogPost(post: BlogPostInterface): PublicBlogPost {\n const publishedAt = post.publishedAt ?? post.createdAt;\n\n return {\n id: post.id,\n language: post.language ?? post.originalLanguage,\n title: post.title ?? \"\",\n slug: post.slug ?? \"\",\n summary: post.summary,\n body: post.body,\n coverImage: post.coverImage,\n coverImageAlt: post.coverImageAlt,\n readingMinutes: post.readingMinutes ?? 1,\n publishedAt: publishedAt.toISOString(),\n updatedAt: post.updatedAt.toISOString(),\n authorName: post.authorName,\n categoryIds: [...post.categoryIds],\n };\n}\n\nexport function toPublicBlogCategory(category: BlogCategoryInterface): PublicBlogCategory {\n return {\n id: category.id,\n name: category.name ?? \"\",\n slug: category.slug ?? \"\",\n description: category.description,\n image: category.image,\n };\n}\n","import { EndpointCreator, Modules } from \"../../../core\";\nimport { ServerJsonApiGet } from \"../../../server/JsonApiServer\";\nimport { BlogCategoryInterface } from \"../data/BlogCategoryInterface\";\nimport { BlogPostInterface } from \"../data/BlogPostInterface\";\nimport { BlogSettingsInterface } from \"../data/BlogSettingsInterface\";\nimport { BLOG_ACTION, BLOG_LIST_LAYOUTS, BLOG_PUBLIC_PREFIX, BlogListLayout } from \"../types/blog.constants\";\nimport { PublicBlogCategory, PublicBlogList, PublicBlogPost } from \"../types/blog-public.types\";\nimport { toPublicBlogCategory, toPublicBlogPost } from \"./toPublic\";\n\n// Public, token-free reads for the marketing blog pages.\n//\n// `cache: \"minutes\"` is a cacheLife profile name: the GET goes through\n// cachedServerGet (\"use cache\"), so an admin change shows up within about a\n// minute. Nothing connects API or worker writes to the web cache, and\n// translations finish asynchronously in the worker, so there is no tag to expire.\n//\n// Each classKey is built INSIDE the function, never at module scope: reading\n// Modules.X while the module evaluates throws \"Module X not registered\" in build\n// workers that never ran the app's bootstrapper (see the app's publicHowTo.ts).\n\nconst BLOG_PAGE_SIZE = 12;\n\nconst publicPostsEndpoint = () => `${BLOG_PUBLIC_PREFIX}/${Modules.BlogPost.name}`;\n\nconst asArray = <T>(data: unknown): T[] => (Array.isArray(data) ? data : data ? [data] : []) as T[];\n\nexport async function fetchPublicBlogPosts(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n /** 1-based list page; ignored with `all`. */\n page?: number;\n /** Every matching post, read in API-sized pages (a sitemap). `hasMore` is then false. */\n all?: boolean;\n}): Promise<PublicBlogList> {\n if (params.all) return { posts: await fetchEveryPublicBlogPost(params), hasMore: false };\n\n // Matches the API cap (120 = 10 pages of 12); a larger ?page= is served as the last allowed one.\n const page = Math.min(10, Math.max(1, Math.floor(params.page || 1)));\n const size = BLOG_PAGE_SIZE * page;\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: publicPostsListEndpoint({ ...params, size }),\n language: params.language,\n });\n if (!res.ok) return { posts: [], hasMore: false };\n\n const posts = asArray<BlogPostInterface>(res.data).map(toPublicBlogPost);\n const total = Number(res.meta?.total);\n const hasMore = Number.isFinite(total) ? total > posts.length : false;\n\n return { posts, hasMore };\n}\n\nfunction publicPostsListEndpoint(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n size: number;\n offset?: number;\n}): string {\n const endpoint = new EndpointCreator({ endpoint: publicPostsEndpoint() });\n endpoint.addAdditionalParam(\"language\", params.language);\n if (params.categorySlug) endpoint.addAdditionalParam(\"category\", encodeURIComponent(params.categorySlug));\n if (params.search) endpoint.addAdditionalParam(\"search\", encodeURIComponent(params.search));\n endpoint.addAdditionalParam(\"page[size]\", String(params.size));\n if (params.offset) endpoint.addAdditionalParam(\"page[offset]\", String(params.offset));\n return endpoint.generate();\n}\n\n// The API serves at most PUBLIC_MAX_PAGE_SIZE posts per request, so \"all\" walks\n// page[offset] until a short page comes back. MAX_ALL_PAGES only stops a runaway loop.\nconst PUBLIC_MAX_PAGE_SIZE = 120;\nconst MAX_ALL_PAGES = 100;\n\nasync function fetchEveryPublicBlogPost(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n}): Promise<PublicBlogPost[]> {\n const posts: PublicBlogPost[] = [];\n\n // In sequence: a failing cached call throws, and parallel failing cached calls\n // never close the response.\n for (let index = 0; index < MAX_ALL_PAGES; index++) {\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: publicPostsListEndpoint({\n ...params,\n size: PUBLIC_MAX_PAGE_SIZE,\n offset: index * PUBLIC_MAX_PAGE_SIZE,\n }),\n language: params.language,\n });\n if (!res.ok) break;\n\n const batch = asArray<BlogPostInterface>(res.data);\n posts.push(...batch.map(toPublicBlogPost));\n if (batch.length < PUBLIC_MAX_PAGE_SIZE) break;\n }\n\n return posts;\n}\n\nexport async function fetchPublicBlogPost(params: { language: string; slug: string }): Promise<PublicBlogPost | null> {\n const endpoint = new EndpointCreator({ endpoint: publicPostsEndpoint(), id: encodeURIComponent(params.slug) });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return null;\n\n const post = asArray<BlogPostInterface>(res.data)[0];\n return post ? toPublicBlogPost(post) : null;\n}\n\nexport async function fetchRelatedBlogPosts(params: { language: string; slug: string }): Promise<PublicBlogPost[]> {\n const endpoint = new EndpointCreator({\n endpoint: publicPostsEndpoint(),\n id: encodeURIComponent(params.slug),\n childEndpoint: BLOG_ACTION.related,\n });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return [];\n\n return asArray<BlogPostInterface>(res.data).map(toPublicBlogPost);\n}\n\nexport async function fetchPublicBlogCategories(params: { language: string }): Promise<PublicBlogCategory[]> {\n const endpoint = new EndpointCreator({ endpoint: `${BLOG_PUBLIC_PREFIX}/${Modules.BlogCategory.name}` });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogCategory, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return [];\n\n return asArray<BlogCategoryInterface>(res.data).map(toPublicBlogCategory);\n}\n\nexport async function fetchBlogSettings(): Promise<{ listLayout: BlogListLayout }> {\n const fallback: { listLayout: BlogListLayout } = { listLayout: \"featured\" };\n\n // The settings are language-neutral; the language only fills the required\n // request header, so one fixed value keeps a single cache entry.\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogSettings, cache: \"minutes\" },\n endpoint: new EndpointCreator({ endpoint: `${BLOG_PUBLIC_PREFIX}/${Modules.BlogSettings.name}` }).generate(),\n language: \"en\",\n });\n if (!res.ok) return fallback;\n\n const settings = asArray<BlogSettingsInterface>(res.data)[0];\n if (!settings || !BLOG_LIST_LAYOUTS.includes(settings.listLayout)) return fallback;\n\n return { listLayout: settings.listLayout };\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/features/blog/server.js","../../../src/features/blog/server/toPublic.ts","../../../src/features/blog/server/fetchers.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/features/blog/server.js","sourcesContent":[null,"import { BlogCategoryInterface } from \"../data/BlogCategoryInterface\";\nimport { BlogPostInterface } from \"../data/BlogPostInterface\";\nimport { PublicBlogCategory, PublicBlogPost } from \"../types/blog-public.types\";\n\n// Serialisation boundary: a rehydrated model (class instance, Date getters)\n// becomes plain data a server page can pass to the public client components.\n\nexport function toPublicBlogPost(post: BlogPostInterface): PublicBlogPost {\n const publishedAt = post.publishedAt ?? post.createdAt;\n\n return {\n id: post.id,\n language: post.language ?? post.originalLanguage,\n title: post.title ?? \"\",\n slug: post.slug ?? \"\",\n summary: post.summary,\n body: post.body,\n coverImage: post.coverImage,\n coverImageAlt: post.coverImageAlt,\n readingMinutes: post.readingMinutes ?? 1,\n publishedAt: publishedAt.toISOString(),\n updatedAt: post.updatedAt.toISOString(),\n authorName: post.authorName,\n categoryIds: [...post.categoryIds],\n };\n}\n\nexport function toPublicBlogCategory(category: BlogCategoryInterface): PublicBlogCategory {\n return {\n id: category.id,\n name: category.name ?? \"\",\n slug: category.slug ?? \"\",\n description: category.description,\n image: category.image,\n };\n}\n","import { EndpointCreator, Modules } from \"../../../core\";\nimport { ServerJsonApiGet } from \"../../../server/JsonApiServer\";\nimport { BlogCategoryInterface } from \"../data/BlogCategoryInterface\";\nimport { BlogPostInterface } from \"../data/BlogPostInterface\";\nimport { BlogSettingsInterface } from \"../data/BlogSettingsInterface\";\nimport { BLOG_ACTION, BLOG_LIST_LAYOUTS, BLOG_PUBLIC_PREFIX, BlogListLayout } from \"../types/blog.constants\";\nimport { PublicBlogCategory, PublicBlogList, PublicBlogPost } from \"../types/blog-public.types\";\nimport { toPublicBlogCategory, toPublicBlogPost } from \"./toPublic\";\n\n// Public, token-free reads for the marketing blog pages.\n//\n// `cache: \"minutes\"` is a cacheLife profile name: the GET goes through\n// cachedServerGet (\"use cache\"), so an admin change shows up within about a\n// minute. Nothing connects API or worker writes to the web cache, and\n// translations finish asynchronously in the worker, so there is no tag to expire.\n//\n// Each classKey is built INSIDE the function, never at module scope: reading\n// Modules.X while the module evaluates throws \"Module X not registered\" in build\n// workers that never ran the app's bootstrapper (see the app's publicHowTo.ts).\n\nconst BLOG_PAGE_SIZE = 12;\n\nconst publicPostsEndpoint = () => `${BLOG_PUBLIC_PREFIX}/${Modules.BlogPost.name}`;\n\nconst asArray = <T>(data: unknown): T[] => (Array.isArray(data) ? data : data ? [data] : []) as T[];\n\nexport async function fetchPublicBlogPosts(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n /** 1-based list page; ignored with `all`. */\n page?: number;\n /** Every matching post, read in API-sized pages (a sitemap). `hasMore` is then false. */\n all?: boolean;\n}): Promise<PublicBlogList> {\n if (params.all) return { posts: await fetchEveryPublicBlogPost(params), hasMore: false };\n\n // Matches the API cap (120 = 10 pages of 12); a larger ?page= is served as the last allowed one.\n const page = Math.min(10, Math.max(1, Math.floor(params.page || 1)));\n const size = BLOG_PAGE_SIZE * page;\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: publicPostsListEndpoint({ ...params, size }),\n language: params.language,\n });\n if (!res.ok) return { posts: [], hasMore: false };\n\n const posts = asArray<BlogPostInterface>(res.data).map(toPublicBlogPost);\n const total = Number(res.meta?.total);\n const hasMore = Number.isFinite(total) ? total > posts.length : false;\n\n return { posts, hasMore };\n}\n\nfunction publicPostsListEndpoint(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n size: number;\n offset?: number;\n}): string {\n const endpoint = new EndpointCreator({ endpoint: publicPostsEndpoint() });\n endpoint.addAdditionalParam(\"language\", params.language);\n if (params.categorySlug) endpoint.addAdditionalParam(\"category\", encodeURIComponent(params.categorySlug));\n if (params.search) endpoint.addAdditionalParam(\"search\", encodeURIComponent(params.search));\n endpoint.addAdditionalParam(\"page[size]\", String(params.size));\n if (params.offset) endpoint.addAdditionalParam(\"page[offset]\", String(params.offset));\n return endpoint.generate();\n}\n\n// The API serves at most PUBLIC_MAX_PAGE_SIZE posts per request, so \"all\" walks\n// page[offset] until a short page comes back. MAX_ALL_PAGES only stops a runaway loop.\nconst PUBLIC_MAX_PAGE_SIZE = 120;\nconst MAX_ALL_PAGES = 100;\n\nasync function fetchEveryPublicBlogPost(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n}): Promise<PublicBlogPost[]> {\n const posts: PublicBlogPost[] = [];\n\n // In sequence: a failing cached call throws, and parallel failing cached calls\n // never close the response.\n for (let index = 0; index < MAX_ALL_PAGES; index++) {\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: publicPostsListEndpoint({\n ...params,\n size: PUBLIC_MAX_PAGE_SIZE,\n offset: index * PUBLIC_MAX_PAGE_SIZE,\n }),\n language: params.language,\n });\n if (!res.ok) break;\n\n const batch = asArray<BlogPostInterface>(res.data);\n posts.push(...batch.map(toPublicBlogPost));\n if (batch.length < PUBLIC_MAX_PAGE_SIZE) break;\n }\n\n return posts;\n}\n\nexport async function fetchPublicBlogPost(params: { language: string; slug: string }): Promise<PublicBlogPost | null> {\n const endpoint = new EndpointCreator({ endpoint: publicPostsEndpoint(), id: encodeURIComponent(params.slug) });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return null;\n\n const post = asArray<BlogPostInterface>(res.data)[0];\n return post ? toPublicBlogPost(post) : null;\n}\n\nexport async function fetchRelatedBlogPosts(params: { language: string; slug: string }): Promise<PublicBlogPost[]> {\n const endpoint = new EndpointCreator({\n endpoint: publicPostsEndpoint(),\n id: encodeURIComponent(params.slug),\n childEndpoint: BLOG_ACTION.related,\n });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return [];\n\n return asArray<BlogPostInterface>(res.data).map(toPublicBlogPost);\n}\n\nexport async function fetchPublicBlogCategories(params: { language: string }): Promise<PublicBlogCategory[]> {\n const endpoint = new EndpointCreator({ endpoint: `${BLOG_PUBLIC_PREFIX}/${Modules.BlogCategory.name}` });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogCategory, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return [];\n\n return asArray<BlogCategoryInterface>(res.data).map(toPublicBlogCategory);\n}\n\nexport async function fetchBlogSettings(): Promise<{ listLayout: BlogListLayout }> {\n const fallback: { listLayout: BlogListLayout } = { listLayout: \"featured\" };\n\n // The settings are language-neutral; the language only fills the required\n // request header, so one fixed value keeps a single cache entry.\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogSettings, cache: \"minutes\" },\n endpoint: new EndpointCreator({ endpoint: `${BLOG_PUBLIC_PREFIX}/${Modules.BlogSettings.name}` }).generate(),\n language: \"en\",\n });\n if (!res.ok) return fallback;\n\n const settings = asArray<BlogSettingsInterface>(res.data)[0];\n if (!settings || !BLOG_LIST_LAYOUTS.includes(settings.listLayout)) return fallback;\n\n return { listLayout: settings.listLayout };\n}\n"]}
@@ -1,22 +1,24 @@
1
1
  import {
2
2
  ServerJsonApiGet
3
- } from "../../chunk-VNUT2D27.mjs";
3
+ } from "../../chunk-2PWYG2WJ.mjs";
4
4
  import "../../chunk-E2LENTUH.mjs";
5
5
  import "../../chunk-F5UNXZ3J.mjs";
6
6
  import {
7
7
  BLOG_ACTION,
8
8
  BLOG_LIST_LAYOUTS,
9
9
  BLOG_PUBLIC_PREFIX
10
- } from "../../chunk-T6G2F2BK.mjs";
10
+ } from "../../chunk-HJT7TXGG.mjs";
11
+ import "../../chunk-RW6XZGZG.mjs";
11
12
  import {
12
13
  EndpointCreator,
13
14
  Modules
14
- } from "../../chunk-N2BFT7KI.mjs";
15
- import "../../chunk-BE6UMM5X.mjs";
16
- import "../../chunk-S7SPAC6X.mjs";
15
+ } from "../../chunk-W7U6O3OE.mjs";
16
+ import "../../chunk-47HNJQ7U.mjs";
17
+ import "../../chunk-73NKUBMP.mjs";
17
18
  import "../../chunk-4ZJIUTIV.mjs";
18
- import "../../chunk-YMCL3JXZ.mjs";
19
+ import "../../chunk-YPBIPE2B.mjs";
19
20
  import "../../chunk-AUXK7QSA.mjs";
21
+ import "../../chunk-743M4TIB.mjs";
20
22
  import {
21
23
  __name
22
24
  } from "../../chunk-PAWJFY3S.mjs";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/features/blog/server/toPublic.ts","../../../src/features/blog/server/fetchers.ts"],"sourcesContent":["import { BlogCategoryInterface } from \"../data/BlogCategoryInterface\";\nimport { BlogPostInterface } from \"../data/BlogPostInterface\";\nimport { PublicBlogCategory, PublicBlogPost } from \"../types/blog-public.types\";\n\n// Serialisation boundary: a rehydrated model (class instance, Date getters)\n// becomes plain data a server page can pass to the public client components.\n\nexport function toPublicBlogPost(post: BlogPostInterface): PublicBlogPost {\n const publishedAt = post.publishedAt ?? post.createdAt;\n\n return {\n id: post.id,\n language: post.language ?? post.originalLanguage,\n title: post.title ?? \"\",\n slug: post.slug ?? \"\",\n summary: post.summary,\n body: post.body,\n coverImage: post.coverImage,\n coverImageAlt: post.coverImageAlt,\n readingMinutes: post.readingMinutes ?? 1,\n publishedAt: publishedAt.toISOString(),\n updatedAt: post.updatedAt.toISOString(),\n authorName: post.authorName,\n categoryIds: [...post.categoryIds],\n };\n}\n\nexport function toPublicBlogCategory(category: BlogCategoryInterface): PublicBlogCategory {\n return {\n id: category.id,\n name: category.name ?? \"\",\n slug: category.slug ?? \"\",\n description: category.description,\n image: category.image,\n };\n}\n","import { EndpointCreator, Modules } from \"../../../core\";\nimport { ServerJsonApiGet } from \"../../../server/JsonApiServer\";\nimport { BlogCategoryInterface } from \"../data/BlogCategoryInterface\";\nimport { BlogPostInterface } from \"../data/BlogPostInterface\";\nimport { BlogSettingsInterface } from \"../data/BlogSettingsInterface\";\nimport { BLOG_ACTION, BLOG_LIST_LAYOUTS, BLOG_PUBLIC_PREFIX, BlogListLayout } from \"../types/blog.constants\";\nimport { PublicBlogCategory, PublicBlogList, PublicBlogPost } from \"../types/blog-public.types\";\nimport { toPublicBlogCategory, toPublicBlogPost } from \"./toPublic\";\n\n// Public, token-free reads for the marketing blog pages.\n//\n// `cache: \"minutes\"` is a cacheLife profile name: the GET goes through\n// cachedServerGet (\"use cache\"), so an admin change shows up within about a\n// minute. Nothing connects API or worker writes to the web cache, and\n// translations finish asynchronously in the worker, so there is no tag to expire.\n//\n// Each classKey is built INSIDE the function, never at module scope: reading\n// Modules.X while the module evaluates throws \"Module X not registered\" in build\n// workers that never ran the app's bootstrapper (see the app's publicHowTo.ts).\n\nconst BLOG_PAGE_SIZE = 12;\n\nconst publicPostsEndpoint = () => `${BLOG_PUBLIC_PREFIX}/${Modules.BlogPost.name}`;\n\nconst asArray = <T>(data: unknown): T[] => (Array.isArray(data) ? data : data ? [data] : []) as T[];\n\nexport async function fetchPublicBlogPosts(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n /** 1-based list page; ignored with `all`. */\n page?: number;\n /** Every matching post, read in API-sized pages (a sitemap). `hasMore` is then false. */\n all?: boolean;\n}): Promise<PublicBlogList> {\n if (params.all) return { posts: await fetchEveryPublicBlogPost(params), hasMore: false };\n\n // Matches the API cap (120 = 10 pages of 12); a larger ?page= is served as the last allowed one.\n const page = Math.min(10, Math.max(1, Math.floor(params.page || 1)));\n const size = BLOG_PAGE_SIZE * page;\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: publicPostsListEndpoint({ ...params, size }),\n language: params.language,\n });\n if (!res.ok) return { posts: [], hasMore: false };\n\n const posts = asArray<BlogPostInterface>(res.data).map(toPublicBlogPost);\n const total = Number(res.meta?.total);\n const hasMore = Number.isFinite(total) ? total > posts.length : false;\n\n return { posts, hasMore };\n}\n\nfunction publicPostsListEndpoint(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n size: number;\n offset?: number;\n}): string {\n const endpoint = new EndpointCreator({ endpoint: publicPostsEndpoint() });\n endpoint.addAdditionalParam(\"language\", params.language);\n if (params.categorySlug) endpoint.addAdditionalParam(\"category\", encodeURIComponent(params.categorySlug));\n if (params.search) endpoint.addAdditionalParam(\"search\", encodeURIComponent(params.search));\n endpoint.addAdditionalParam(\"page[size]\", String(params.size));\n if (params.offset) endpoint.addAdditionalParam(\"page[offset]\", String(params.offset));\n return endpoint.generate();\n}\n\n// The API serves at most PUBLIC_MAX_PAGE_SIZE posts per request, so \"all\" walks\n// page[offset] until a short page comes back. MAX_ALL_PAGES only stops a runaway loop.\nconst PUBLIC_MAX_PAGE_SIZE = 120;\nconst MAX_ALL_PAGES = 100;\n\nasync function fetchEveryPublicBlogPost(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n}): Promise<PublicBlogPost[]> {\n const posts: PublicBlogPost[] = [];\n\n // In sequence: a failing cached call throws, and parallel failing cached calls\n // never close the response.\n for (let index = 0; index < MAX_ALL_PAGES; index++) {\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: publicPostsListEndpoint({\n ...params,\n size: PUBLIC_MAX_PAGE_SIZE,\n offset: index * PUBLIC_MAX_PAGE_SIZE,\n }),\n language: params.language,\n });\n if (!res.ok) break;\n\n const batch = asArray<BlogPostInterface>(res.data);\n posts.push(...batch.map(toPublicBlogPost));\n if (batch.length < PUBLIC_MAX_PAGE_SIZE) break;\n }\n\n return posts;\n}\n\nexport async function fetchPublicBlogPost(params: { language: string; slug: string }): Promise<PublicBlogPost | null> {\n const endpoint = new EndpointCreator({ endpoint: publicPostsEndpoint(), id: encodeURIComponent(params.slug) });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return null;\n\n const post = asArray<BlogPostInterface>(res.data)[0];\n return post ? toPublicBlogPost(post) : null;\n}\n\nexport async function fetchRelatedBlogPosts(params: { language: string; slug: string }): Promise<PublicBlogPost[]> {\n const endpoint = new EndpointCreator({\n endpoint: publicPostsEndpoint(),\n id: encodeURIComponent(params.slug),\n childEndpoint: BLOG_ACTION.related,\n });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return [];\n\n return asArray<BlogPostInterface>(res.data).map(toPublicBlogPost);\n}\n\nexport async function fetchPublicBlogCategories(params: { language: string }): Promise<PublicBlogCategory[]> {\n const endpoint = new EndpointCreator({ endpoint: `${BLOG_PUBLIC_PREFIX}/${Modules.BlogCategory.name}` });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogCategory, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return [];\n\n return asArray<BlogCategoryInterface>(res.data).map(toPublicBlogCategory);\n}\n\nexport async function fetchBlogSettings(): Promise<{ listLayout: BlogListLayout }> {\n const fallback: { listLayout: BlogListLayout } = { listLayout: \"featured\" };\n\n // The settings are language-neutral; the language only fills the required\n // request header, so one fixed value keeps a single cache entry.\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogSettings, cache: \"minutes\" },\n endpoint: new EndpointCreator({ endpoint: `${BLOG_PUBLIC_PREFIX}/${Modules.BlogSettings.name}` }).generate(),\n language: \"en\",\n });\n if (!res.ok) return fallback;\n\n const settings = asArray<BlogSettingsInterface>(res.data)[0];\n if (!settings || !BLOG_LIST_LAYOUTS.includes(settings.listLayout)) return fallback;\n\n return { listLayout: settings.listLayout };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/features/blog/server/toPublic.ts","../../../src/features/blog/server/fetchers.ts"],"sourcesContent":["import { BlogCategoryInterface } from \"../data/BlogCategoryInterface\";\nimport { BlogPostInterface } from \"../data/BlogPostInterface\";\nimport { PublicBlogCategory, PublicBlogPost } from \"../types/blog-public.types\";\n\n// Serialisation boundary: a rehydrated model (class instance, Date getters)\n// becomes plain data a server page can pass to the public client components.\n\nexport function toPublicBlogPost(post: BlogPostInterface): PublicBlogPost {\n const publishedAt = post.publishedAt ?? post.createdAt;\n\n return {\n id: post.id,\n language: post.language ?? post.originalLanguage,\n title: post.title ?? \"\",\n slug: post.slug ?? \"\",\n summary: post.summary,\n body: post.body,\n coverImage: post.coverImage,\n coverImageAlt: post.coverImageAlt,\n readingMinutes: post.readingMinutes ?? 1,\n publishedAt: publishedAt.toISOString(),\n updatedAt: post.updatedAt.toISOString(),\n authorName: post.authorName,\n categoryIds: [...post.categoryIds],\n };\n}\n\nexport function toPublicBlogCategory(category: BlogCategoryInterface): PublicBlogCategory {\n return {\n id: category.id,\n name: category.name ?? \"\",\n slug: category.slug ?? \"\",\n description: category.description,\n image: category.image,\n };\n}\n","import { EndpointCreator, Modules } from \"../../../core\";\nimport { ServerJsonApiGet } from \"../../../server/JsonApiServer\";\nimport { BlogCategoryInterface } from \"../data/BlogCategoryInterface\";\nimport { BlogPostInterface } from \"../data/BlogPostInterface\";\nimport { BlogSettingsInterface } from \"../data/BlogSettingsInterface\";\nimport { BLOG_ACTION, BLOG_LIST_LAYOUTS, BLOG_PUBLIC_PREFIX, BlogListLayout } from \"../types/blog.constants\";\nimport { PublicBlogCategory, PublicBlogList, PublicBlogPost } from \"../types/blog-public.types\";\nimport { toPublicBlogCategory, toPublicBlogPost } from \"./toPublic\";\n\n// Public, token-free reads for the marketing blog pages.\n//\n// `cache: \"minutes\"` is a cacheLife profile name: the GET goes through\n// cachedServerGet (\"use cache\"), so an admin change shows up within about a\n// minute. Nothing connects API or worker writes to the web cache, and\n// translations finish asynchronously in the worker, so there is no tag to expire.\n//\n// Each classKey is built INSIDE the function, never at module scope: reading\n// Modules.X while the module evaluates throws \"Module X not registered\" in build\n// workers that never ran the app's bootstrapper (see the app's publicHowTo.ts).\n\nconst BLOG_PAGE_SIZE = 12;\n\nconst publicPostsEndpoint = () => `${BLOG_PUBLIC_PREFIX}/${Modules.BlogPost.name}`;\n\nconst asArray = <T>(data: unknown): T[] => (Array.isArray(data) ? data : data ? [data] : []) as T[];\n\nexport async function fetchPublicBlogPosts(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n /** 1-based list page; ignored with `all`. */\n page?: number;\n /** Every matching post, read in API-sized pages (a sitemap). `hasMore` is then false. */\n all?: boolean;\n}): Promise<PublicBlogList> {\n if (params.all) return { posts: await fetchEveryPublicBlogPost(params), hasMore: false };\n\n // Matches the API cap (120 = 10 pages of 12); a larger ?page= is served as the last allowed one.\n const page = Math.min(10, Math.max(1, Math.floor(params.page || 1)));\n const size = BLOG_PAGE_SIZE * page;\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: publicPostsListEndpoint({ ...params, size }),\n language: params.language,\n });\n if (!res.ok) return { posts: [], hasMore: false };\n\n const posts = asArray<BlogPostInterface>(res.data).map(toPublicBlogPost);\n const total = Number(res.meta?.total);\n const hasMore = Number.isFinite(total) ? total > posts.length : false;\n\n return { posts, hasMore };\n}\n\nfunction publicPostsListEndpoint(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n size: number;\n offset?: number;\n}): string {\n const endpoint = new EndpointCreator({ endpoint: publicPostsEndpoint() });\n endpoint.addAdditionalParam(\"language\", params.language);\n if (params.categorySlug) endpoint.addAdditionalParam(\"category\", encodeURIComponent(params.categorySlug));\n if (params.search) endpoint.addAdditionalParam(\"search\", encodeURIComponent(params.search));\n endpoint.addAdditionalParam(\"page[size]\", String(params.size));\n if (params.offset) endpoint.addAdditionalParam(\"page[offset]\", String(params.offset));\n return endpoint.generate();\n}\n\n// The API serves at most PUBLIC_MAX_PAGE_SIZE posts per request, so \"all\" walks\n// page[offset] until a short page comes back. MAX_ALL_PAGES only stops a runaway loop.\nconst PUBLIC_MAX_PAGE_SIZE = 120;\nconst MAX_ALL_PAGES = 100;\n\nasync function fetchEveryPublicBlogPost(params: {\n language: string;\n categorySlug?: string;\n search?: string;\n}): Promise<PublicBlogPost[]> {\n const posts: PublicBlogPost[] = [];\n\n // In sequence: a failing cached call throws, and parallel failing cached calls\n // never close the response.\n for (let index = 0; index < MAX_ALL_PAGES; index++) {\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: publicPostsListEndpoint({\n ...params,\n size: PUBLIC_MAX_PAGE_SIZE,\n offset: index * PUBLIC_MAX_PAGE_SIZE,\n }),\n language: params.language,\n });\n if (!res.ok) break;\n\n const batch = asArray<BlogPostInterface>(res.data);\n posts.push(...batch.map(toPublicBlogPost));\n if (batch.length < PUBLIC_MAX_PAGE_SIZE) break;\n }\n\n return posts;\n}\n\nexport async function fetchPublicBlogPost(params: { language: string; slug: string }): Promise<PublicBlogPost | null> {\n const endpoint = new EndpointCreator({ endpoint: publicPostsEndpoint(), id: encodeURIComponent(params.slug) });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return null;\n\n const post = asArray<BlogPostInterface>(res.data)[0];\n return post ? toPublicBlogPost(post) : null;\n}\n\nexport async function fetchRelatedBlogPosts(params: { language: string; slug: string }): Promise<PublicBlogPost[]> {\n const endpoint = new EndpointCreator({\n endpoint: publicPostsEndpoint(),\n id: encodeURIComponent(params.slug),\n childEndpoint: BLOG_ACTION.related,\n });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogPost, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return [];\n\n return asArray<BlogPostInterface>(res.data).map(toPublicBlogPost);\n}\n\nexport async function fetchPublicBlogCategories(params: { language: string }): Promise<PublicBlogCategory[]> {\n const endpoint = new EndpointCreator({ endpoint: `${BLOG_PUBLIC_PREFIX}/${Modules.BlogCategory.name}` });\n endpoint.addAdditionalParam(\"language\", params.language);\n\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogCategory, cache: \"minutes\" },\n endpoint: endpoint.generate(),\n language: params.language,\n });\n if (!res.ok) return [];\n\n return asArray<BlogCategoryInterface>(res.data).map(toPublicBlogCategory);\n}\n\nexport async function fetchBlogSettings(): Promise<{ listLayout: BlogListLayout }> {\n const fallback: { listLayout: BlogListLayout } = { listLayout: \"featured\" };\n\n // The settings are language-neutral; the language only fills the required\n // request header, so one fixed value keeps a single cache entry.\n const res = await ServerJsonApiGet({\n classKey: { ...Modules.BlogSettings, cache: \"minutes\" },\n endpoint: new EndpointCreator({ endpoint: `${BLOG_PUBLIC_PREFIX}/${Modules.BlogSettings.name}` }).generate(),\n language: \"en\",\n });\n if (!res.ok) return fallback;\n\n const settings = asArray<BlogSettingsInterface>(res.data)[0];\n if (!settings || !BLOG_LIST_LAYOUTS.includes(settings.listLayout)) return fallback;\n\n return { listLayout: settings.listLayout };\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useEmailAutomationEnrollmentTableStructure.d.ts","sourceRoot":"","sources":["../../../../src/features/email-automation/hooks/useEmailAutomationEnrollmentTableStructure.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAwC,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE7F,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,kCAAkC,EAAE,MAAM,4CAA4C,CAAC;AAUhG,eAAO,MAAM,0CAA0C,EAAE,qBAAqB,CAC5E,kCAAkC,EAClC,+BAA+B,CAsGhC,CAAC"}
1
+ {"version":3,"file":"useEmailAutomationEnrollmentTableStructure.d.ts","sourceRoot":"","sources":["../../../../src/features/email-automation/hooks/useEmailAutomationEnrollmentTableStructure.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAwC,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAG7F,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,kCAAkC,EAAE,MAAM,4CAA4C,CAAC;AAUhG,eAAO,MAAM,0CAA0C,EAAE,qBAAqB,CAC5E,kCAAkC,EAClC,+BAA+B,CA2GhC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"HandbookIndexStatus.d.ts","sourceRoot":"","sources":["../../../../../src/features/handbook/components/parts/HandbookIndexStatus.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,qBAAqB,EAAE,CAAC;CAChC,CAAC;AASF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,EAAE,wBAAwB,+BAkCtE"}
1
+ {"version":3,"file":"HandbookIndexStatus.d.ts","sourceRoot":"","sources":["../../../../../src/features/handbook/components/parts/HandbookIndexStatus.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,qBAAqB,EAAE,CAAC;CAChC,CAAC;AASF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,EAAE,wBAAwB,+BAkCtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"HelpArticleBody.d.ts","sourceRoot":"","sources":["../../../../src/features/help/components/HelpArticleBody.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKlC,KAAK,OAAO,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;CACrB,+BA4CA"}
1
+ {"version":3,"file":"HelpArticleBody.d.ts","sourceRoot":"","sources":["../../../../src/features/help/components/HelpArticleBody.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMlC,KAAK,OAAO,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;CACrB,+BA4CA"}
@@ -23,22 +23,27 @@ var _chunkYBZVWLPHjs = require('../../chunk-YBZVWLPH.js');
23
23
 
24
24
 
25
25
 
26
- var _chunkR5722NLLjs = require('../../chunk-R5722NLL.js');
26
+ var _chunkM6SNTMK6js = require('../../chunk-M6SNTMK6.js');
27
+
28
+
29
+ var _chunkSYMI4IDWjs = require('../../chunk-SYMI4IDW.js');
27
30
  require('../../chunk-3EPNHTMH.js');
28
31
 
29
32
 
30
- var _chunkTNTCLVURjs = require('../../chunk-TNTCLVUR.js');
33
+ var _chunkJGL4P3DSjs = require('../../chunk-JGL4P3DS.js');
31
34
  require('../../chunk-G4JR3SFV.js');
32
35
 
33
36
 
34
- var _chunkHN7L6RRWjs = require('../../chunk-HN7L6RRW.js');
37
+ var _chunkCSBQAPHDjs = require('../../chunk-CSBQAPHD.js');
38
+ require('../../chunk-HROKKUBQ.js');
35
39
  require('../../chunk-DGN3PR2F.js');
36
- require('../../chunk-P7L6OFX5.js');
37
- require('../../chunk-BQ2WAG4K.js');
38
- require('../../chunk-A5M3MORY.js');
40
+ require('../../chunk-Z6T2575A.js');
41
+ require('../../chunk-3VNDFKT7.js');
42
+ require('../../chunk-5WM72MLE.js');
39
43
  require('../../chunk-WUNSG3IN.js');
40
- require('../../chunk-RCOKQ3R4.js');
44
+ require('../../chunk-LNO2JLU3.js');
41
45
  require('../../chunk-LXKSUWAV.js');
46
+ require('../../chunk-NP3AFULU.js');
42
47
 
43
48
 
44
49
  var _chunk7QVYU63Ejs = require('../../chunk-7QVYU63E.js');
@@ -48,7 +53,7 @@ var _react = require('react');
48
53
  var _jsxruntime = require('react/jsx-runtime');
49
54
  var HelpContext = _react.createContext.call(void 0, null);
50
55
  function HelpProvider({ children }) {
51
- const cfg = _chunkTNTCLVURjs._getStaticHelpContent.call(void 0, );
56
+ const cfg = _chunkJGL4P3DSjs._getStaticHelpContent.call(void 0, );
52
57
  if (!cfg) {
53
58
  throw new Error(
54
59
  "Help content not configured \u2014 call configureJsonApi({ helpContent: {...} }) before importing help components."
@@ -80,29 +85,29 @@ var _lucidereact = require('lucide-react');
80
85
 
81
86
 
82
87
  function HelpAssistantSheet({ open, onOpenChange }) {
83
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.Sheet, { open, onOpenChange, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
84
- _chunkR5722NLLjs.SheetContent,
88
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.Sheet, { open, onOpenChange, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
89
+ _chunkM6SNTMK6js.SheetContent,
85
90
  {
86
91
  side: "end",
87
92
  className: "flex w-full flex-col data-[side=right]:sm:max-w-2xl data-[side=right]:lg:max-w-3xl data-[side=left]:sm:max-w-2xl data-[side=left]:lg:max-w-3xl",
88
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.AssistantProvider, { manageUrl: false, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpAssistantSheetBody, {}) })
93
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.AssistantProvider, { manageUrl: false, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpAssistantSheetBody, {}) })
89
94
  }
90
95
  ) });
91
96
  }
92
97
  _chunk7QVYU63Ejs.__name.call(void 0, HelpAssistantSheet, "HelpAssistantSheet");
93
98
  function HelpAssistantSheetBody() {
94
99
  const t = _nextintl.useTranslations.call(void 0, );
95
- const ctx = _chunkR5722NLLjs.useAssistantContext.call(void 0, );
100
+ const ctx = _chunkM6SNTMK6js.useAssistantContext.call(void 0, );
96
101
  const showThread = !!ctx.assistant || ctx.sending || ctx.messages.length > 0;
97
102
  const send = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (content) => ctx.sendMessage(content, { howToMode: true }), "send");
98
103
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
99
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR5722NLLjs.SheetHeader, { children: [
100
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.SheetTitle, { children: t("help.askAi.sheet.title") }),
101
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.SheetDescription, { children: t("help.askAi.sheet.subtitle") })
104
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkM6SNTMK6js.SheetHeader, { children: [
105
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.SheetTitle, { children: t("help.askAi.sheet.title") }),
106
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.SheetDescription, { children: t("help.askAi.sheet.subtitle") })
102
107
  ] }),
103
- !showThread ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.AssistantEmptyState, { onSend: send }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
108
+ !showThread ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.AssistantEmptyState, { onSend: send }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
104
109
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
105
- _chunkR5722NLLjs.AssistantThread,
110
+ _chunkM6SNTMK6js.AssistantThread,
106
111
  {
107
112
  messages: ctx.messages,
108
113
  sending: ctx.sending,
@@ -112,7 +117,7 @@ function HelpAssistantSheetBody() {
112
117
  onRetry: ctx.retrySend
113
118
  }
114
119
  ),
115
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.AssistantComposer, { onSend: send, disabled: ctx.sending })
120
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.AssistantComposer, { onSend: send, disabled: ctx.sending })
116
121
  ] })
117
122
  ] });
118
123
  }
@@ -122,20 +127,20 @@ _chunk7QVYU63Ejs.__name.call(void 0, HelpAssistantSheetBody, "HelpAssistantSheet
122
127
 
123
128
  function HelpAskAi() {
124
129
  const t = _nextintl.useTranslations.call(void 0, );
125
- const { currentUser } = _chunkR5722NLLjs.useCurrentUserContext.call(void 0, );
130
+ const { currentUser } = _chunkM6SNTMK6js.useCurrentUserContext.call(void 0, );
126
131
  const [open, setOpen] = _react.useState.call(void 0, false);
127
132
  const disabled = !currentUser;
128
133
  if (disabled) {
129
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR5722NLLjs.Tooltip, { children: [
130
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR5722NLLjs.TooltipTrigger, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.Button, { variant: "outline", size: "sm", disabled: true }), children: [
134
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkM6SNTMK6js.Tooltip, { children: [
135
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkM6SNTMK6js.TooltipTrigger, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.Button, { variant: "outline", size: "sm", disabled: true }), children: [
131
136
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.SparklesIcon, { className: "h-4 w-4" }),
132
137
  t("help.askAi.button")
133
138
  ] }),
134
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.TooltipContent, { children: t("help.askAi.loginTooltip") })
139
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.TooltipContent, { children: t("help.askAi.loginTooltip") })
135
140
  ] });
136
141
  }
137
142
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
138
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR5722NLLjs.Button, { variant: "outline", size: "sm", onClick: () => setOpen(true), children: [
143
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkM6SNTMK6js.Button, { variant: "outline", size: "sm", onClick: () => setOpen(true), children: [
139
144
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.SparklesIcon, { className: "h-4 w-4" }),
140
145
  t("help.askAi.button")
141
146
  ] }),
@@ -148,7 +153,7 @@ _chunk7QVYU63Ejs.__name.call(void 0, HelpAskAi, "HelpAskAi");
148
153
 
149
154
  function HelpHeader() {
150
155
  const t = _nextintl.useTranslations.call(void 0, );
151
- const { currentUser } = _chunkR5722NLLjs.useCurrentUserContext.call(void 0, );
156
+ const { currentUser } = _chunkM6SNTMK6js.useCurrentUserContext.call(void 0, );
152
157
  const { brand } = useHelp();
153
158
  const logo = _optionalChain([brand, 'optionalAccess', _ => _.logo]);
154
159
  const label = _nullishCoalesce(_optionalChain([brand, 'optionalAccess', _2 => _2.label]), () => ( t("help.title")));
@@ -164,7 +169,7 @@ function HelpHeader() {
164
169
  ] }),
165
170
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2 max-md:shrink-0", children: [
166
171
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpAskAi, {}),
167
- currentUser ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: appHref, className: _chunkR5722NLLjs.buttonVariants.call(void 0, { variant: "outline", size: "sm" }), children: t("help.header.openApp") }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: "/login", className: _chunkR5722NLLjs.buttonVariants.call(void 0, { variant: "outline", size: "sm" }), children: t("help.header.login") })
172
+ currentUser ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: appHref, className: _chunkM6SNTMK6js.buttonVariants.call(void 0, { variant: "outline", size: "sm" }), children: t("help.header.openApp") }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _link2.default, { href: "/login", className: _chunkM6SNTMK6js.buttonVariants.call(void 0, { variant: "outline", size: "sm" }), children: t("help.header.login") })
168
173
  ] })
169
174
  ] });
170
175
  }
@@ -206,12 +211,12 @@ _chunk7QVYU63Ejs.__name.call(void 0, useHelpFilter, "useHelpFilter");
206
211
 
207
212
  function HelpSideNav() {
208
213
  const t = _nextintl.useTranslations.call(void 0, );
209
- const generateUrl = _chunkR5722NLLjs.usePageUrlGenerator.call(void 0, );
214
+ const generateUrl = _chunkM6SNTMK6js.usePageUrlGenerator.call(void 0, );
210
215
  const pathname = _navigation.usePathname.call(void 0, );
211
216
  const [articles, setArticles] = _react.useState.call(void 0, []);
212
217
  _react.useEffect.call(void 0, () => {
213
218
  let active = true;
214
- _chunkHN7L6RRWjs.HowToService.findPublished().then((list) => active && setArticles(list)).catch(() => active && setArticles([]));
219
+ _chunkCSBQAPHDjs.HowToService.findPublished().then((list) => active && setArticles(list)).catch(() => active && setArticles([]));
215
220
  return () => {
216
221
  active = false;
217
222
  };
@@ -286,8 +291,8 @@ _chunk7QVYU63Ejs.__name.call(void 0, HelpSideNav, "HelpSideNav");
286
291
 
287
292
  function HelpArticleBody(props) {
288
293
  const t = _nextintl.useTranslations.call(void 0, );
289
- const format = _nextintl.useFormatter.call(void 0, );
290
- const generateUrl = _chunkR5722NLLjs.usePageUrlGenerator.call(void 0, );
294
+ const dates = _chunkSYMI4IDWjs.useDateFormatter.call(void 0, );
295
+ const generateUrl = _chunkM6SNTMK6js.usePageUrlGenerator.call(void 0, );
291
296
  const { howToType, title, summary, updatedAt, prev, next, children } = props;
292
297
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "article", { className: "prose dark:prose-invert max-w-none", children: [
293
298
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { className: "text-muted-foreground mb-2 text-xs", children: [
@@ -300,7 +305,7 @@ function HelpArticleBody(props) {
300
305
  children,
301
306
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "hr", { className: "my-6" }),
302
307
  updatedAt ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-muted-foreground text-xs", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: t("help.article.lastUpdated", {
303
- date: format.dateTime(new Date(updatedAt), { dateStyle: "short" })
308
+ date: dates.format(updatedAt, "date")
304
309
  }) }) }) : null,
305
310
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mt-4 flex justify-between text-sm", children: [
306
311
  prev ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _link2.default, { href: generateUrl({ page: `/help/${prev.howToType}/${prev.slug}` }), children: [
@@ -344,7 +349,7 @@ function HelpTOC({ headings }) {
344
349
  }, [headings]);
345
350
  if (headings.length === 0) return null;
346
351
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { "aria-label": t("help.toc.title"), className: "hidden lg:block", children: [
347
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.MicroLabel, { className: "mb-2", children: t("help.toc.title") }),
352
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.MicroLabel, { className: "mb-2", children: t("help.toc.title") }),
348
353
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "ul", { className: "space-y-1 text-sm", children: headings.map((h) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { style: { paddingInlineStart: `${(h.depth - 2) * 0.75}rem` }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
349
354
  "a",
350
355
  {
@@ -365,13 +370,13 @@ _chunk7QVYU63Ejs.__name.call(void 0, HelpTOC, "HelpTOC");
365
370
 
366
371
  function HelpHint({ contextKey }) {
367
372
  const t = _nextintl.useTranslations.call(void 0, );
368
- const generateUrl = _chunkR5722NLLjs.usePageUrlGenerator.call(void 0, );
373
+ const generateUrl = _chunkM6SNTMK6js.usePageUrlGenerator.call(void 0, );
369
374
  const [open, setOpen] = _react.useState.call(void 0, false);
370
375
  const [picked, setPicked] = _react.useState.call(void 0, null);
371
376
  const [articles, setArticles] = _react.useState.call(void 0, []);
372
377
  _react.useEffect.call(void 0, () => {
373
378
  let active2 = true;
374
- _chunkHN7L6RRWjs.HowToService.findPublished().then((list) => active2 && setArticles(list)).catch(() => active2 && setArticles([]));
379
+ _chunkCSBQAPHDjs.HowToService.findPublished().then((list) => active2 && setArticles(list)).catch(() => active2 && setArticles([]));
375
380
  return () => {
376
381
  active2 = false;
377
382
  };
@@ -383,7 +388,7 @@ function HelpHint({ contextKey }) {
383
388
  if (matches.length === 0) return null;
384
389
  const active = _nullishCoalesce(picked, () => ( (matches.length === 1 ? matches[0] : null)));
385
390
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
386
- _chunkR5722NLLjs.Sheet,
391
+ _chunkM6SNTMK6js.Sheet,
387
392
  {
388
393
  open,
389
394
  onOpenChange: (o) => {
@@ -391,11 +396,11 @@ function HelpHint({ contextKey }) {
391
396
  if (!o) setPicked(null);
392
397
  },
393
398
  children: [
394
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.SheetTrigger, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.Button, { variant: "ghost", size: "icon-sm", "aria-label": t("help.hint.trigger") }), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.HelpCircleIcon, { className: "h-4 w-4" }) }),
395
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR5722NLLjs.SheetContent, { side: "end", className: "w-full max-w-md sm:max-w-lg", children: [
396
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR5722NLLjs.SheetHeader, { children: [
397
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.SheetTitle, { children: active ? active.name : t("help.hint.pickArticle") }),
398
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.SheetDescription, { children: _nullishCoalesce(_optionalChain([active, 'optionalAccess', _4 => _4.summary]), () => ( "")) })
399
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.SheetTrigger, { render: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.Button, { variant: "ghost", size: "icon-sm", "aria-label": t("help.hint.trigger") }), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.HelpCircleIcon, { className: "h-4 w-4" }) }),
400
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkM6SNTMK6js.SheetContent, { side: "end", className: "w-full max-w-md sm:max-w-lg", children: [
401
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkM6SNTMK6js.SheetHeader, { children: [
402
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.SheetTitle, { children: active ? active.name : t("help.hint.pickArticle") }),
403
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.SheetDescription, { children: _nullishCoalesce(_optionalChain([active, 'optionalAccess', _4 => _4.summary]), () => ( "")) })
399
404
  ] }),
400
405
  active ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mt-4 space-y-3", children: [
401
406
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: active.summary }),
@@ -427,18 +432,18 @@ _chunk7QVYU63Ejs.__name.call(void 0, HelpHint, "HelpHint");
427
432
 
428
433
  function HelpSearchResultRow({ result, onSelect }) {
429
434
  const t = _nextintl.useTranslations.call(void 0, );
430
- const generateUrl = _chunkR5722NLLjs.usePageUrlGenerator.call(void 0, );
435
+ const generateUrl = _chunkM6SNTMK6js.usePageUrlGenerator.call(void 0, );
431
436
  const [article, setArticle] = _react.useState.call(void 0, null);
432
437
  _react.useEffect.call(void 0, () => {
433
438
  let active = true;
434
- _chunkHN7L6RRWjs.HowToService.findOne({ id: result.id }).then((a) => active && setArticle(a)).catch(() => active && setArticle(null));
439
+ _chunkCSBQAPHDjs.HowToService.findOne({ id: result.id }).then((a) => active && setArticle(a)).catch(() => active && setArticle(null));
435
440
  return () => {
436
441
  active = false;
437
442
  };
438
443
  }, [result.id]);
439
444
  if (!article) {
440
445
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
441
- _chunkR5722NLLjs.CommandItem,
446
+ _chunkM6SNTMK6js.CommandItem,
442
447
  {
443
448
  value: result.id,
444
449
  disabled: true,
@@ -447,7 +452,7 @@ function HelpSearchResultRow({ result, onSelect }) {
447
452
  }
448
453
  );
449
454
  }
450
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5722NLLjs.CommandItem, { value: result.id, onSelect, className: "cursor-pointer p-0", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
455
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkM6SNTMK6js.CommandItem, { value: result.id, onSelect, className: "cursor-pointer p-0", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
451
456
  _link2.default,
452
457
  {
453
458
  href: generateUrl({ page: `/help/${article.howToType}/${article.slug}` }),