@carlonicora/nextjs-jsonapi 6.24.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.
- package/dist/{BlockNoteEditor-MONT74RQ.js → BlockNoteEditor-TNX77GCD.js} +28 -25
- package/dist/BlockNoteEditor-TNX77GCD.js.map +1 -0
- package/dist/{BlockNoteEditor-ENDOVTAW.mjs → BlockNoteEditor-Z5LDF47Z.mjs} +13 -10
- package/dist/{BlockNoteEditor-ENDOVTAW.mjs.map → BlockNoteEditor-Z5LDF47Z.mjs.map} +1 -1
- package/dist/{BlockNoteViewer-K2HBF3IP.js → BlockNoteViewer-6KQJODNF.js} +9 -7
- package/dist/BlockNoteViewer-6KQJODNF.js.map +1 -0
- package/dist/{BlockNoteViewer-2TJZ6JET.mjs → BlockNoteViewer-TQ452ZYW.mjs} +8 -6
- package/dist/{BlockNoteViewer-2TJZ6JET.mjs.map → BlockNoteViewer-TQ452ZYW.mjs.map} +1 -1
- package/dist/JsonApiRequest-OKNQZLS6.js +26 -0
- package/dist/{JsonApiRequest-KC6DOHKT.js.map → JsonApiRequest-OKNQZLS6.js.map} +1 -1
- package/dist/{JsonApiRequest-ADLBJ5RX.mjs → JsonApiRequest-WNPDS356.mjs} +2 -2
- package/dist/billing/index.js +504 -517
- package/dist/billing/index.js.map +1 -1
- package/dist/billing/index.mjs +20 -33
- package/dist/billing/index.mjs.map +1 -1
- package/dist/{chunk-VNUT2D27.mjs → chunk-2PWYG2WJ.mjs} +2 -2
- package/dist/{chunk-W4ML6D2X.mjs → chunk-3U7YJ73T.mjs} +7 -7
- package/dist/{chunk-BQ2WAG4K.js → chunk-3VNDFKT7.js} +19 -19
- package/dist/{chunk-BQ2WAG4K.js.map → chunk-3VNDFKT7.js.map} +1 -1
- package/dist/{chunk-BE6UMM5X.mjs → chunk-47HNJQ7U.mjs} +3 -3
- package/dist/chunk-5T2AQMQ2.mjs +90 -0
- package/dist/chunk-5T2AQMQ2.mjs.map +1 -0
- package/dist/{chunk-A5M3MORY.js → chunk-5WM72MLE.js} +3 -3
- package/dist/{chunk-A5M3MORY.js.map → chunk-5WM72MLE.js.map} +1 -1
- package/dist/{chunk-S7SPAC6X.mjs → chunk-73NKUBMP.mjs} +3 -3
- package/dist/chunk-743M4TIB.mjs +76 -0
- package/dist/chunk-743M4TIB.mjs.map +1 -0
- package/dist/{chunk-HN7L6RRW.js → chunk-CSBQAPHD.js} +903 -955
- package/dist/chunk-CSBQAPHD.js.map +1 -0
- package/dist/{chunk-YTDGYI62.mjs → chunk-DWPHHUMV.mjs} +3 -3
- package/dist/{chunk-53SD4YRF.js → chunk-FBHUUPRV.js} +5 -5
- package/dist/{chunk-53SD4YRF.js.map → chunk-FBHUUPRV.js.map} +1 -1
- package/dist/{chunk-T6G2F2BK.mjs → chunk-HJT7TXGG.mjs} +16 -68
- package/dist/chunk-HJT7TXGG.mjs.map +1 -0
- package/dist/chunk-HROKKUBQ.js +156 -0
- package/dist/chunk-HROKKUBQ.js.map +1 -0
- package/dist/{chunk-TMV7TL7O.mjs → chunk-JELEQV5T.mjs} +8 -6
- package/dist/{chunk-TMV7TL7O.mjs.map → chunk-JELEQV5T.mjs.map} +1 -1
- package/dist/{chunk-TNTCLVUR.js → chunk-JGL4P3DS.js} +17 -15
- package/dist/chunk-JGL4P3DS.js.map +1 -0
- package/dist/{chunk-7OIWOPM5.mjs → chunk-K7KLUYS7.mjs} +4 -3
- package/dist/chunk-K7KLUYS7.mjs.map +1 -0
- package/dist/{chunk-OZADFYE7.mjs → chunk-KVYYPKRO.mjs} +308 -241
- package/dist/chunk-KVYYPKRO.mjs.map +1 -0
- package/dist/{chunk-RCOKQ3R4.js → chunk-LNO2JLU3.js} +2 -2
- package/dist/{chunk-RCOKQ3R4.js.map → chunk-LNO2JLU3.js.map} +1 -1
- package/dist/{chunk-BDWV4KYR.js → chunk-M6SNTMK6.js} +1386 -1319
- package/dist/chunk-M6SNTMK6.js.map +1 -0
- package/dist/{chunk-GMMDXINC.js → chunk-N3NQS7X6.js} +12 -12
- package/dist/{chunk-GMMDXINC.js.map → chunk-N3NQS7X6.js.map} +1 -1
- package/dist/chunk-NP3AFULU.js +76 -0
- package/dist/chunk-NP3AFULU.js.map +1 -0
- package/dist/{chunk-SO3YUCL6.js → chunk-OOM54Z5Z.js} +6 -5
- package/dist/chunk-OOM54Z5Z.js.map +1 -0
- package/dist/{chunk-YSE2Z4RB.js → chunk-PQQFOONG.js} +12 -12
- package/dist/{chunk-YSE2Z4RB.js.map → chunk-PQQFOONG.js.map} +1 -1
- package/dist/chunk-RW6XZGZG.mjs +156 -0
- package/dist/chunk-RW6XZGZG.mjs.map +1 -0
- package/dist/chunk-SYMI4IDW.js +90 -0
- package/dist/chunk-SYMI4IDW.js.map +1 -0
- package/dist/{chunk-N2BFT7KI.mjs → chunk-W7U6O3OE.mjs} +2 -71
- package/dist/chunk-W7U6O3OE.mjs.map +1 -0
- package/dist/{chunk-YMCL3JXZ.mjs → chunk-YPBIPE2B.mjs} +2 -2
- package/dist/{chunk-P7L6OFX5.js → chunk-Z6T2575A.js} +12 -81
- package/dist/chunk-Z6T2575A.js.map +1 -0
- package/dist/client/index.js +13 -10
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +17 -14
- package/dist/components/forms/DatePickerPopover.d.ts.map +1 -1
- package/dist/components/forms/DateRangeSelector.d.ts.map +1 -1
- package/dist/components/forms/FormDate.d.ts.map +1 -1
- package/dist/components/forms/FormDateTime.d.ts.map +1 -1
- package/dist/components/forms/time-cycle.d.ts +14 -0
- package/dist/components/forms/time-cycle.d.ts.map +1 -0
- package/dist/components/index.js +11 -8
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +10 -7
- package/dist/components/tables/cells/cell.date.d.ts.map +1 -1
- package/dist/components/tables/cells/cell.dateTime.d.ts.map +1 -1
- package/dist/contexts/DateLocaleContext.d.ts +56 -0
- package/dist/contexts/DateLocaleContext.d.ts.map +1 -0
- package/dist/contexts/index.d.ts +1 -0
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/contexts/index.js +24 -8
- package/dist/contexts/index.js.map +1 -1
- package/dist/contexts/index.mjs +23 -7
- package/dist/core/index.js +17 -6
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +19 -8
- package/dist/date-locale/index.d.ts +2 -0
- package/dist/date-locale/index.d.ts.map +1 -0
- package/dist/date-locale/index.js +21 -0
- package/dist/date-locale/index.js.map +1 -0
- package/dist/date-locale/index.mjs +21 -0
- package/dist/email-automations/index.js +131 -123
- package/dist/email-automations/index.js.map +1 -1
- package/dist/email-automations/index.mjs +23 -15
- package/dist/email-automations/index.mjs.map +1 -1
- package/dist/features/account-deletion/components/AccountDeletionAdminTrigger.d.ts.map +1 -1
- package/dist/features/analytics/components/AnalyticsJourneyContainer.d.ts.map +1 -1
- package/dist/features/analytics/components/AnalyticsSessionsTable.d.ts.map +1 -1
- package/dist/features/analytics/index.js +154 -147
- package/dist/features/analytics/index.js.map +1 -1
- package/dist/features/analytics/index.mjs +32 -25
- package/dist/features/analytics/index.mjs.map +1 -1
- package/dist/features/analytics/server.js +11 -9
- package/dist/features/analytics/server.js.map +1 -1
- package/dist/features/analytics/server.mjs +9 -7
- package/dist/features/analytics/server.mjs.map +1 -1
- package/dist/features/billing/components/utils/date.d.ts +3 -3
- package/dist/features/billing/components/utils/format-options.d.ts +6 -4
- package/dist/features/billing/components/utils/format-options.d.ts.map +1 -1
- package/dist/features/billing/components/utils/useBillingFormatOptions.d.ts +5 -1
- package/dist/features/billing/components/utils/useBillingFormatOptions.d.ts.map +1 -1
- package/dist/features/billing/stripe-usage/components/details/UsageSummaryCard.d.ts.map +1 -1
- package/dist/features/billing/stripe-usage/components/lists/UsageHistoryTable.d.ts.map +1 -1
- package/dist/features/blog/components/admin/BlogTranslationStatus.d.ts.map +1 -1
- package/dist/features/blog/components/public/BlogPostMeta.d.ts.map +1 -1
- package/dist/features/blog/hooks/useBlogPostTableStructure.d.ts.map +1 -1
- package/dist/features/blog/index.js +168 -162
- package/dist/features/blog/index.js.map +1 -1
- package/dist/features/blog/index.mjs +25 -19
- package/dist/features/blog/index.mjs.map +1 -1
- package/dist/features/blog/server.js +29 -27
- package/dist/features/blog/server.js.map +1 -1
- package/dist/features/blog/server.mjs +8 -6
- package/dist/features/blog/server.mjs.map +1 -1
- package/dist/features/email-automation/hooks/useEmailAutomationEnrollmentTableStructure.d.ts.map +1 -1
- package/dist/features/handbook/components/parts/HandbookIndexStatus.d.ts.map +1 -1
- package/dist/features/help/components/HelpArticleBody.d.ts.map +1 -1
- package/dist/features/help/index.js +48 -43
- package/dist/features/help/index.js.map +1 -1
- package/dist/features/help/index.mjs +15 -10
- package/dist/features/help/index.mjs.map +1 -1
- package/dist/features/notification/components/notifications/Notification.d.ts +2 -1
- package/dist/features/notification/components/notifications/Notification.d.ts.map +1 -1
- package/dist/features/notification/contexts/NotificationContext.d.ts.map +1 -1
- package/dist/features/notification/hooks/useNotificationTableStructure.d.ts.map +1 -1
- package/dist/features/oauth/components/OAuthClientCard.d.ts.map +1 -1
- package/dist/features/oauth/components/OAuthClientDetail.d.ts.map +1 -1
- package/dist/features/tokenusage/index.js +133 -130
- package/dist/features/tokenusage/index.js.map +1 -1
- package/dist/features/tokenusage/index.mjs +10 -7
- package/dist/features/tokenusage/index.mjs.map +1 -1
- package/dist/features/tokenusage/lib/formatters.d.ts +6 -3
- package/dist/features/tokenusage/lib/formatters.d.ts.map +1 -1
- package/dist/index.js +19 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +23 -11
- package/dist/local-transport-AT4TE264.js +15 -0
- package/dist/{local-transport-MJPOKPTU.js.map → local-transport-AT4TE264.js.map} +1 -1
- package/dist/{local-transport-RVD4FZGA.mjs → local-transport-KWEUZ4GX.mjs} +5 -5
- package/dist/offline/index.js +56 -54
- package/dist/offline/index.js.map +1 -1
- package/dist/offline/index.mjs +23 -21
- package/dist/offline/index.mjs.map +1 -1
- package/dist/{request-4AWGPIGH.mjs → request-6GAIWWTG.mjs} +2 -2
- package/dist/{request-H5FZBZA2.js → request-BWO4Y434.js} +3 -3
- package/dist/{request-H5FZBZA2.js.map → request-BWO4Y434.js.map} +1 -1
- package/dist/server/ServerSession.d.ts +2 -0
- package/dist/server/ServerSession.d.ts.map +1 -1
- package/dist/server/index.js +10 -8
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +9 -7
- package/dist/utils/date-formatter.d.ts +45 -4
- package/dist/utils/date-formatter.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/write-through-KNRI5L4V.mjs +15 -0
- package/dist/write-through-KNRI5L4V.mjs.map +1 -0
- package/dist/write-through-MYHQ6GJU.js +15 -0
- package/dist/{write-through-HE2QSOVI.js.map → write-through-MYHQ6GJU.js.map} +1 -1
- package/messages/en.json +1 -0
- package/messages/it.json +1 -0
- package/package.json +6 -1
- package/src/components/forms/DatePickerPopover.tsx +5 -3
- package/src/components/forms/DateRangeSelector.tsx +9 -7
- package/src/components/forms/FormDate.tsx +5 -3
- package/src/components/forms/FormDateTime.tsx +75 -39
- package/src/components/forms/__tests__/time-cycle.spec.ts +37 -0
- package/src/components/forms/time-cycle.ts +27 -0
- package/src/components/tables/cells/cell.date.tsx +3 -5
- package/src/components/tables/cells/cell.dateTime.tsx +3 -7
- package/src/contexts/DateLocaleContext.tsx +106 -0
- package/src/contexts/__tests__/DateLocaleContext.spec.tsx +175 -0
- package/src/contexts/index.ts +1 -0
- package/src/date-locale/index.ts +12 -0
- package/src/features/account-deletion/components/AccountDeletionAdminTrigger.tsx +3 -4
- package/src/features/analytics/components/AnalyticsJourneyContainer.tsx +8 -8
- package/src/features/analytics/components/AnalyticsSessionsTable.tsx +4 -6
- package/src/features/auth/components/two-factor/PasskeyList.tsx +3 -3
- package/src/features/auth/components/two-factor/TotpAuthenticatorList.tsx +3 -3
- package/src/features/billing/components/utils/__tests__/billing-formatters.spec.ts +14 -6
- package/src/features/billing/components/utils/date.ts +5 -5
- package/src/features/billing/components/utils/format-options.ts +6 -4
- package/src/features/billing/components/utils/useBillingFormatOptions.ts +8 -2
- package/src/features/billing/stripe-usage/components/details/UsageSummaryCard.tsx +4 -12
- package/src/features/billing/stripe-usage/components/lists/UsageHistoryTable.tsx +4 -17
- package/src/features/blog/components/admin/BlogTranslationStatus.tsx +3 -2
- package/src/features/blog/components/public/BlogPostMeta.tsx +5 -4
- package/src/features/blog/components/public/__tests__/BlogList.spec.tsx +1 -2
- package/src/features/blog/components/public/__tests__/BlogPostView.spec.tsx +2 -3
- package/src/features/blog/hooks/useBlogPostTableStructure.tsx +4 -8
- package/src/features/email-automation/hooks/useEmailAutomationEnrollmentTableStructure.tsx +11 -5
- package/src/features/email-blast/components/containers/EmailBlastContainer.tsx +3 -3
- package/src/features/email-blast/hooks/useEmailBlastTableStructure.tsx +4 -4
- package/src/features/handbook/components/parts/HandbookIndexStatus.tsx +4 -3
- package/src/features/help/components/HelpArticleBody.tsx +4 -3
- package/src/features/notification/components/notifications/Notification.tsx +38 -7
- package/src/features/notification/contexts/NotificationContext.tsx +6 -3
- package/src/features/notification/hooks/useNotificationTableStructure.tsx +6 -5
- package/src/features/oauth/components/OAuthClientCard.tsx +8 -5
- package/src/features/oauth/components/OAuthClientDetail.tsx +3 -6
- package/src/features/tokenusage/lib/__tests__/formatters.spec.ts +19 -0
- package/src/features/tokenusage/lib/formatters.ts +11 -6
- package/src/features/waitlist/hooks/useWaitlistTableStructure.tsx +5 -5
- package/src/server/ServerSession.ts +3 -0
- package/src/server/__tests__/ServerSession.read.spec.ts +18 -1
- package/src/utils/__tests__/date-formatter.spec.ts +134 -10
- package/src/utils/date-formatter.ts +200 -44
- package/src/utils/index.ts +11 -1
- package/dist/BlockNoteEditor-MONT74RQ.js.map +0 -1
- package/dist/BlockNoteViewer-K2HBF3IP.js.map +0 -1
- package/dist/JsonApiRequest-KC6DOHKT.js +0 -26
- package/dist/chunk-7OIWOPM5.mjs.map +0 -1
- package/dist/chunk-BDWV4KYR.js.map +0 -1
- package/dist/chunk-HN7L6RRW.js.map +0 -1
- package/dist/chunk-N2BFT7KI.mjs.map +0 -1
- package/dist/chunk-OZADFYE7.mjs.map +0 -1
- package/dist/chunk-P7L6OFX5.js.map +0 -1
- package/dist/chunk-SO3YUCL6.js.map +0 -1
- package/dist/chunk-T6G2F2BK.mjs.map +0 -1
- package/dist/chunk-TNTCLVUR.js.map +0 -1
- package/dist/local-transport-MJPOKPTU.js +0 -15
- package/dist/write-through-7I3LA2WN.mjs +0 -15
- package/dist/write-through-HE2QSOVI.js +0 -15
- /package/dist/{JsonApiRequest-ADLBJ5RX.mjs.map → JsonApiRequest-WNPDS356.mjs.map} +0 -0
- /package/dist/{chunk-VNUT2D27.mjs.map → chunk-2PWYG2WJ.mjs.map} +0 -0
- /package/dist/{chunk-W4ML6D2X.mjs.map → chunk-3U7YJ73T.mjs.map} +0 -0
- /package/dist/{chunk-BE6UMM5X.mjs.map → chunk-47HNJQ7U.mjs.map} +0 -0
- /package/dist/{chunk-S7SPAC6X.mjs.map → chunk-73NKUBMP.mjs.map} +0 -0
- /package/dist/{chunk-YTDGYI62.mjs.map → chunk-DWPHHUMV.mjs.map} +0 -0
- /package/dist/{chunk-YMCL3JXZ.mjs.map → chunk-YPBIPE2B.mjs.map} +0 -0
- /package/dist/{local-transport-RVD4FZGA.mjs.map → date-locale/index.mjs.map} +0 -0
- /package/dist/{request-4AWGPIGH.mjs.map → local-transport-KWEUZ4GX.mjs.map} +0 -0
- /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
|
|
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
|
|
10
|
+
var _chunkCSBQAPHDjs = require('../../chunk-CSBQAPHD.js');
|
|
11
|
+
require('../../chunk-HROKKUBQ.js');
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
|
|
14
|
-
var
|
|
15
|
-
require('../../chunk-
|
|
16
|
-
require('../../chunk-
|
|
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-
|
|
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, () => `${
|
|
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
|
|
64
|
-
classKey: { ...
|
|
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,
|
|
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
|
|
91
|
-
classKey: { ...
|
|
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,
|
|
110
|
+
const endpoint = new (0, _chunkZ6T2575Ajs.EndpointCreator)({ endpoint: publicPostsEndpoint(), id: encodeURIComponent(params.slug) });
|
|
109
111
|
endpoint.addAdditionalParam("language", params.language);
|
|
110
|
-
const res = await
|
|
111
|
-
classKey: { ...
|
|
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,
|
|
123
|
+
const endpoint = new (0, _chunkZ6T2575Ajs.EndpointCreator)({
|
|
122
124
|
endpoint: publicPostsEndpoint(),
|
|
123
125
|
id: encodeURIComponent(params.slug),
|
|
124
|
-
childEndpoint:
|
|
126
|
+
childEndpoint: _chunkCSBQAPHDjs.BLOG_ACTION.related
|
|
125
127
|
});
|
|
126
128
|
endpoint.addAdditionalParam("language", params.language);
|
|
127
|
-
const res = await
|
|
128
|
-
classKey: { ...
|
|
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,
|
|
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
|
|
140
|
-
classKey: { ...
|
|
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
|
|
151
|
-
classKey: { ...
|
|
152
|
-
endpoint: new (0,
|
|
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 || !
|
|
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 =
|
|
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-
|
|
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-
|
|
10
|
+
} from "../../chunk-HJT7TXGG.mjs";
|
|
11
|
+
import "../../chunk-RW6XZGZG.mjs";
|
|
11
12
|
import {
|
|
12
13
|
EndpointCreator,
|
|
13
14
|
Modules
|
|
14
|
-
} from "../../chunk-
|
|
15
|
-
import "../../chunk-
|
|
16
|
-
import "../../chunk-
|
|
15
|
+
} from "../../chunk-W7U6O3OE.mjs";
|
|
16
|
+
import "../../chunk-47HNJQ7U.mjs";
|
|
17
|
+
import "../../chunk-73NKUBMP.mjs";
|
|
17
18
|
import "../../chunk-4ZJIUTIV.mjs";
|
|
18
|
-
import "../../chunk-
|
|
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":[]}
|
package/dist/features/email-automation/hooks/useEmailAutomationEnrollmentTableStructure.d.ts.map
CHANGED
|
@@ -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;
|
|
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":"
|
|
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;
|
|
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
|
|
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
|
|
33
|
+
var _chunkJGL4P3DSjs = require('../../chunk-JGL4P3DS.js');
|
|
31
34
|
require('../../chunk-G4JR3SFV.js');
|
|
32
35
|
|
|
33
36
|
|
|
34
|
-
var
|
|
37
|
+
var _chunkCSBQAPHDjs = require('../../chunk-CSBQAPHD.js');
|
|
38
|
+
require('../../chunk-HROKKUBQ.js');
|
|
35
39
|
require('../../chunk-DGN3PR2F.js');
|
|
36
|
-
require('../../chunk-
|
|
37
|
-
require('../../chunk-
|
|
38
|
-
require('../../chunk-
|
|
40
|
+
require('../../chunk-Z6T2575A.js');
|
|
41
|
+
require('../../chunk-3VNDFKT7.js');
|
|
42
|
+
require('../../chunk-5WM72MLE.js');
|
|
39
43
|
require('../../chunk-WUNSG3IN.js');
|
|
40
|
-
require('../../chunk-
|
|
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 =
|
|
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,
|
|
84
|
-
|
|
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,
|
|
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 =
|
|
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,
|
|
100
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
101
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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 } =
|
|
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,
|
|
130
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
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,
|
|
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,
|
|
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 } =
|
|
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:
|
|
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 =
|
|
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
|
-
|
|
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
|
|
290
|
-
const generateUrl =
|
|
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
|
|
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,
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
395
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
396
|
-
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
397
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
398
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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}` }),
|