@sonordev/site-kit 6.4.0 → 6.5.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/agent-manifest.json +1 -1
- package/dist/AnalyticsProvider-44PDLORZ.js +34 -0
- package/dist/{AnalyticsProvider-QXZN5O6D.js.map → AnalyticsProvider-44PDLORZ.js.map} +1 -1
- package/dist/AnalyticsProvider-F6KHEAOX.mjs +13 -0
- package/dist/{AnalyticsProvider-4K5T7OQ7.mjs.map → AnalyticsProvider-F6KHEAOX.mjs.map} +1 -1
- package/dist/{ArticleViewTracker-FFMHR7AY.js → ArticleViewTracker-MGNVIHZ4.js} +6 -6
- package/dist/{ArticleViewTracker-FFMHR7AY.js.map → ArticleViewTracker-MGNVIHZ4.js.map} +1 -1
- package/dist/{ArticleViewTracker-BUG2TOHS.mjs → ArticleViewTracker-NI4UNSY7.mjs} +5 -5
- package/dist/{ArticleViewTracker-BUG2TOHS.mjs.map → ArticleViewTracker-NI4UNSY7.mjs.map} +1 -1
- package/dist/{ChatWidget-CRQPBDEF.mjs → ChatWidget-XSALHDDW.mjs} +7 -7
- package/dist/{ChatWidget-CRQPBDEF.mjs.map → ChatWidget-XSALHDDW.mjs.map} +1 -1
- package/dist/{ChatWidget-XFYLVXAX.js → ChatWidget-YBXJRR2Z.js} +10 -10
- package/dist/{ChatWidget-XFYLVXAX.js.map → ChatWidget-YBXJRR2Z.js.map} +1 -1
- package/dist/EngageWidget-DUEXPVOY.mjs +13 -0
- package/dist/{EngageWidget-SQU4T7CI.mjs.map → EngageWidget-DUEXPVOY.mjs.map} +1 -1
- package/dist/EngageWidget-MDCRS3BN.js +22 -0
- package/dist/{EngageWidget-S234YAT2.js.map → EngageWidget-MDCRS3BN.js.map} +1 -1
- package/dist/{FileField-XG4EYAZW.js → FileField-AXU6KBSV.js} +6 -6
- package/dist/{FileField-XG4EYAZW.js.map → FileField-AXU6KBSV.js.map} +1 -1
- package/dist/{FileField-HNEBEBLB.mjs → FileField-UTLGR5ZN.mjs} +5 -5
- package/dist/{FileField-HNEBEBLB.mjs.map → FileField-UTLGR5ZN.mjs.map} +1 -1
- package/dist/{FormSpotlight-VKD774PZ.mjs → FormSpotlight-NWLCZMOT.mjs} +3 -3
- package/dist/{FormSpotlight-VKD774PZ.mjs.map → FormSpotlight-NWLCZMOT.mjs.map} +1 -1
- package/dist/{FormSpotlight-IODREOPN.js → FormSpotlight-RR5KJDIH.js} +9 -9
- package/dist/{FormSpotlight-IODREOPN.js.map → FormSpotlight-RR5KJDIH.js.map} +1 -1
- package/dist/{FormStage-37KKZQH4.js → FormStage-GFNX4GLU.js} +9 -9
- package/dist/{FormStage-37KKZQH4.js.map → FormStage-GFNX4GLU.js.map} +1 -1
- package/dist/{FormStage-PRZNRYNC.mjs → FormStage-V4XKLI6J.mjs} +3 -3
- package/dist/{FormStage-PRZNRYNC.mjs.map → FormStage-V4XKLI6J.mjs.map} +1 -1
- package/dist/ManagedForm-4AD3LWSC.js +25 -0
- package/dist/{ManagedForm-JCMEE626.js.map → ManagedForm-4AD3LWSC.js.map} +1 -1
- package/dist/ManagedForm-4IWPG6AZ.mjs +16 -0
- package/dist/{ManagedForm-4PZOCKCV.mjs.map → ManagedForm-4IWPG6AZ.mjs.map} +1 -1
- package/dist/{ManagedNewsletterForm-KMZG24OE.mjs → ManagedNewsletterForm-ARSY2VHC.mjs} +6 -6
- package/dist/{ManagedNewsletterForm-KMZG24OE.mjs.map → ManagedNewsletterForm-ARSY2VHC.mjs.map} +1 -1
- package/dist/{ManagedNewsletterForm-CTC33B2U.js → ManagedNewsletterForm-HJZNUABY.js} +7 -7
- package/dist/{ManagedNewsletterForm-CTC33B2U.js.map → ManagedNewsletterForm-HJZNUABY.js.map} +1 -1
- package/dist/{SignalCore-YIPKKIUG.mjs → SignalCore-N2LKG4XN.mjs} +5 -5
- package/dist/{SignalCore-YIPKKIUG.mjs.map → SignalCore-N2LKG4XN.mjs.map} +1 -1
- package/dist/{SignalCore-YHT7WPXV.js → SignalCore-P2JUY2BO.js} +11 -11
- package/dist/{SignalCore-YHT7WPXV.js.map → SignalCore-P2JUY2BO.js.map} +1 -1
- package/dist/SitemapSync-KFY4PJ7G.js +19 -0
- package/dist/{SitemapSync-GN4OXIM2.js.map → SitemapSync-KFY4PJ7G.js.map} +1 -1
- package/dist/SitemapSync-UYDL7T4M.mjs +10 -0
- package/dist/{SitemapSync-NG763CGN.mjs.map → SitemapSync-UYDL7T4M.mjs.map} +1 -1
- package/dist/analytics/index.js +14 -13
- package/dist/analytics/index.mjs +6 -5
- package/dist/articles/index.js +1 -1
- package/dist/articles/index.mjs +1 -1
- package/dist/articles/server-ui.js +1 -1
- package/dist/articles/server-ui.mjs +1 -1
- package/dist/articles/types.d.ts +6 -0
- package/dist/articles/types.d.ts.map +1 -1
- package/dist/{chunk-KZBDH5A3.js → chunk-34XL7TVH.js} +4 -4
- package/dist/{chunk-KZBDH5A3.js.map → chunk-34XL7TVH.js.map} +1 -1
- package/dist/{chunk-5T3J24K4.mjs → chunk-3BLKKF67.mjs} +4 -4
- package/dist/{chunk-5T3J24K4.mjs.map → chunk-3BLKKF67.mjs.map} +1 -1
- package/dist/{chunk-5W4S7XQD.js → chunk-3EAS4PAT.js} +3 -3
- package/dist/{chunk-5W4S7XQD.js.map → chunk-3EAS4PAT.js.map} +1 -1
- package/dist/{chunk-LPDXS2B2.mjs → chunk-42LLFAJQ.mjs} +3 -3
- package/dist/{chunk-LPDXS2B2.mjs.map → chunk-42LLFAJQ.mjs.map} +1 -1
- package/dist/{chunk-TIFVAASU.mjs → chunk-5YA6SI4Z.mjs} +2 -2
- package/dist/{chunk-S5QKNXLQ.js → chunk-5ZMTEK7U.js} +10 -10
- package/dist/{chunk-S5QKNXLQ.js.map → chunk-5ZMTEK7U.js.map} +1 -1
- package/dist/{chunk-YACU35MY.js → chunk-6OQYRVMI.js} +9 -9
- package/dist/{chunk-YACU35MY.js.map → chunk-6OQYRVMI.js.map} +1 -1
- package/dist/{chunk-4C3INRHE.mjs → chunk-7F66Y4MA.mjs} +5 -5
- package/dist/{chunk-4C3INRHE.mjs.map → chunk-7F66Y4MA.mjs.map} +1 -1
- package/dist/{chunk-GSU6VTCZ.mjs → chunk-A2HL22BO.mjs} +3 -3
- package/dist/{chunk-GSU6VTCZ.mjs.map → chunk-A2HL22BO.mjs.map} +1 -1
- package/dist/{chunk-XZHR4E2D.js → chunk-AL4Z6VYF.js} +8 -8
- package/dist/{chunk-XZHR4E2D.js.map → chunk-AL4Z6VYF.js.map} +1 -1
- package/dist/{chunk-ZEBOOUBP.mjs → chunk-B6QPCAEG.mjs} +3 -3
- package/dist/{chunk-ZEBOOUBP.mjs.map → chunk-B6QPCAEG.mjs.map} +1 -1
- package/dist/{chunk-HTCNRTN6.js → chunk-BHZHWXER.js} +8 -8
- package/dist/{chunk-HTCNRTN6.js.map → chunk-BHZHWXER.js.map} +1 -1
- package/dist/{chunk-TPDDSEL3.mjs → chunk-BNKBRLJK.mjs} +3 -3
- package/dist/{chunk-TPDDSEL3.mjs.map → chunk-BNKBRLJK.mjs.map} +1 -1
- package/dist/{chunk-A6UYV475.mjs → chunk-CABEVWKJ.mjs} +4 -24
- package/dist/chunk-CABEVWKJ.mjs.map +1 -0
- package/dist/{chunk-VMNPLCZB.js → chunk-CM4AVKXR.js} +14 -14
- package/dist/{chunk-VMNPLCZB.js.map → chunk-CM4AVKXR.js.map} +1 -1
- package/dist/{chunk-KOPFFKG2.mjs → chunk-D3WJMSTB.mjs} +3 -3
- package/dist/{chunk-KOPFFKG2.mjs.map → chunk-D3WJMSTB.mjs.map} +1 -1
- package/dist/{chunk-JXRGIE3V.mjs → chunk-DWZGW77V.mjs} +4 -4
- package/dist/{chunk-JXRGIE3V.mjs.map → chunk-DWZGW77V.mjs.map} +1 -1
- package/dist/{chunk-USQPRLSG.mjs → chunk-FPVYKSXE.mjs} +13 -10
- package/dist/chunk-FPVYKSXE.mjs.map +1 -0
- package/dist/{chunk-VDEQVXNV.js → chunk-G2KGHIAP.js} +3 -3
- package/dist/{chunk-VDEQVXNV.js.map → chunk-G2KGHIAP.js.map} +1 -1
- package/dist/chunk-GIGUDKLS.mjs +6 -0
- package/dist/{chunk-K3PVUXKB.mjs.map → chunk-GIGUDKLS.mjs.map} +1 -1
- package/dist/{chunk-XXSSUCJB.js → chunk-I7AZC5ZQ.js} +2 -2
- package/dist/{chunk-C7J4XLBN.js → chunk-IO65ROAO.js} +15 -15
- package/dist/{chunk-C7J4XLBN.js.map → chunk-IO65ROAO.js.map} +1 -1
- package/dist/chunk-JCDX37BY.js +58 -0
- package/dist/chunk-JCDX37BY.js.map +1 -0
- package/dist/{chunk-7K6L33BX.mjs → chunk-JOYMIGR2.mjs} +22 -22
- package/dist/{chunk-ATPQ6264.js → chunk-JS75ORH7.js} +24 -24
- package/dist/{chunk-BI7DH42Z.mjs → chunk-MDQLON5R.mjs} +5 -5
- package/dist/{chunk-BI7DH42Z.mjs.map → chunk-MDQLON5R.mjs.map} +1 -1
- package/dist/{chunk-GXSSFQ5D.js → chunk-MHKD34B4.js} +15 -15
- package/dist/{chunk-GXSSFQ5D.js.map → chunk-MHKD34B4.js.map} +1 -1
- package/dist/chunk-MXJOKOFK.mjs +51 -0
- package/dist/chunk-MXJOKOFK.mjs.map +1 -0
- package/dist/{chunk-5RNAUYWE.js → chunk-NH2P27MA.js} +4 -27
- package/dist/chunk-NH2P27MA.js.map +1 -0
- package/dist/{chunk-ZUQSVCMD.js → chunk-NN2YE5WT.js} +3 -3
- package/dist/{chunk-RH4XEXTK.mjs → chunk-NNZDWY3L.mjs} +3 -3
- package/dist/{chunk-SBTA6B6Y.mjs → chunk-OFBEBMXN.mjs} +4 -4
- package/dist/{chunk-SBTA6B6Y.mjs.map → chunk-OFBEBMXN.mjs.map} +1 -1
- package/dist/{chunk-HSLPN3QK.js → chunk-OY3PDIB3.js} +10 -10
- package/dist/{chunk-HSLPN3QK.js.map → chunk-OY3PDIB3.js.map} +1 -1
- package/dist/{chunk-ZOBUA65N.js → chunk-PFDRQJKJ.js} +14 -14
- package/dist/{chunk-ZOBUA65N.js.map → chunk-PFDRQJKJ.js.map} +1 -1
- package/dist/{chunk-YRKWJCML.mjs → chunk-PGYOBEPL.mjs} +3 -3
- package/dist/{chunk-YRKWJCML.mjs.map → chunk-PGYOBEPL.mjs.map} +1 -1
- package/dist/{chunk-U5NFIHLY.js → chunk-PIPGH7GA.js} +4 -4
- package/dist/{chunk-U5NFIHLY.js.map → chunk-PIPGH7GA.js.map} +1 -1
- package/dist/chunk-PURI56RE.js +8 -0
- package/dist/{chunk-CIB3RHNZ.js.map → chunk-PURI56RE.js.map} +1 -1
- package/dist/{chunk-EWDWLY74.js → chunk-QCS7NWMA.js} +15 -12
- package/dist/chunk-QCS7NWMA.js.map +1 -0
- package/dist/{chunk-W7IAG5YD.js → chunk-RMDH2HMW.js} +3 -3
- package/dist/{chunk-W7IAG5YD.js.map → chunk-RMDH2HMW.js.map} +1 -1
- package/dist/{chunk-U4CYO4NG.js → chunk-SUGBIEYQ.js} +9 -9
- package/dist/{chunk-U4CYO4NG.js.map → chunk-SUGBIEYQ.js.map} +1 -1
- package/dist/{chunk-M62L2N5A.mjs → chunk-SVCKJ5KH.mjs} +4 -4
- package/dist/{chunk-M62L2N5A.mjs.map → chunk-SVCKJ5KH.mjs.map} +1 -1
- package/dist/{chunk-6QPKC6XP.mjs → chunk-THO4NS6Z.mjs} +3 -3
- package/dist/{chunk-6QPKC6XP.mjs.map → chunk-THO4NS6Z.mjs.map} +1 -1
- package/dist/{chunk-WIWHM47B.mjs → chunk-TPEPAHU5.mjs} +3 -3
- package/dist/{chunk-WIWHM47B.mjs.map → chunk-TPEPAHU5.mjs.map} +1 -1
- package/dist/{chunk-CUZ3I6CO.js → chunk-U577ITSA.js} +5 -5
- package/dist/{chunk-CUZ3I6CO.js.map → chunk-U577ITSA.js.map} +1 -1
- package/dist/{chunk-5BARLEAI.mjs → chunk-UCQDE5UH.mjs} +3 -3
- package/dist/{chunk-5BARLEAI.mjs.map → chunk-UCQDE5UH.mjs.map} +1 -1
- package/dist/{chunk-QOKMH2TD.mjs → chunk-VA2O5OSV.mjs} +3 -3
- package/dist/{chunk-QOKMH2TD.mjs.map → chunk-VA2O5OSV.mjs.map} +1 -1
- package/dist/{chunk-M3JCHPK3.mjs → chunk-VJTKIKZY.mjs} +5 -5
- package/dist/{chunk-M3JCHPK3.mjs.map → chunk-VJTKIKZY.mjs.map} +1 -1
- package/dist/{chunk-F2GECCK7.js → chunk-VUAGR6VL.js} +12 -12
- package/dist/{chunk-F2GECCK7.js.map → chunk-VUAGR6VL.js.map} +1 -1
- package/dist/{chunk-24LFAQEG.mjs → chunk-XEOIGCUE.mjs} +5 -5
- package/dist/{chunk-24LFAQEG.mjs.map → chunk-XEOIGCUE.mjs.map} +1 -1
- package/dist/{chunk-GGGX54ZE.js → chunk-ZXC56JS3.js} +14 -14
- package/dist/{chunk-GGGX54ZE.js.map → chunk-ZXC56JS3.js.map} +1 -1
- package/dist/cli/index.js +211 -211
- package/dist/cli/index.mjs +151 -151
- package/dist/client/index.js +4 -4
- package/dist/client/index.mjs +3 -3
- package/dist/commerce/index.js +59 -58
- package/dist/commerce/index.mjs +7 -6
- package/dist/engage/index.js +11 -10
- package/dist/engage/index.js.map +1 -1
- package/dist/engage/index.mjs +8 -7
- package/dist/engage/index.mjs.map +1 -1
- package/dist/fleet/index.js +10 -9
- package/dist/fleet/index.mjs +6 -5
- package/dist/forms/index.js +13 -13
- package/dist/forms/index.mjs +7 -7
- package/dist/forms/server.js +2 -2
- package/dist/forms/server.mjs +1 -1
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.js +65 -64
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -10
- package/dist/index.mjs.map +1 -1
- package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
- package/dist/layout/client.d.ts.map +1 -1
- package/dist/layout/client.js +10 -9
- package/dist/layout/client.mjs +9 -8
- package/dist/layout/index.js +12 -11
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/index.mjs +10 -9
- package/dist/layout/index.mjs.map +1 -1
- package/dist/layout/types.d.ts +6 -0
- package/dist/layout/types.d.ts.map +1 -1
- package/dist/{lib-6GWWPDJR.js → lib-6HOOMENJ.js} +7 -7
- package/dist/{lib-WFB5RLEQ.js → lib-BGAWCSUH.js} +8 -8
- package/dist/{lib-N5PD6JNJ.mjs → lib-R7IQ4ZHE.mjs} +2 -2
- package/dist/lib-RSDMEKDQ.mjs +4 -0
- package/dist/maps/index.js +5 -5
- package/dist/maps/index.mjs +3 -3
- package/dist/portfolio/contract.d.ts +93 -0
- package/dist/portfolio/contract.d.ts.map +1 -1
- package/dist/portfolio/contract.js +94 -1
- package/dist/portfolio/contract.js.map +1 -1
- package/dist/portfolio/contract.mjs +79 -2
- package/dist/portfolio/contract.mjs.map +1 -1
- package/dist/search/index.js +4 -4
- package/dist/search/index.mjs +3 -3
- package/dist/seo/client.js +7 -6
- package/dist/seo/client.mjs +6 -5
- package/dist/seo/index.js +7 -6
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +6 -5
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo/register-sitemap-cli.js +2 -2
- package/dist/seo/register-sitemap-cli.mjs +1 -1
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/shared/frame.d.ts +15 -0
- package/dist/shared/frame.d.ts.map +1 -1
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sync/index.js +17 -17
- package/dist/sync/index.mjs +4 -4
- package/dist/{web-vitals.attribution-CHXXWO72.mjs → web-vitals.attribution-7LKLZ5GR.mjs} +3 -3
- package/dist/web-vitals.attribution-7LKLZ5GR.mjs.map +1 -0
- package/dist/{web-vitals.attribution-SQVZNHN3.js → web-vitals.attribution-ONVYQNRB.js} +3 -3
- package/dist/web-vitals.attribution-ONVYQNRB.js.map +1 -0
- package/package.json +19 -21
- package/dist/AnalyticsProvider-4K5T7OQ7.mjs +0 -12
- package/dist/AnalyticsProvider-QXZN5O6D.js +0 -33
- package/dist/EngageWidget-S234YAT2.js +0 -21
- package/dist/EngageWidget-SQU4T7CI.mjs +0 -12
- package/dist/ManagedForm-4PZOCKCV.mjs +0 -16
- package/dist/ManagedForm-JCMEE626.js +0 -25
- package/dist/SitemapSync-GN4OXIM2.js +0 -18
- package/dist/SitemapSync-NG763CGN.mjs +0 -9
- package/dist/chunk-5RNAUYWE.js.map +0 -1
- package/dist/chunk-A6UYV475.mjs.map +0 -1
- package/dist/chunk-CIB3RHNZ.js +0 -8
- package/dist/chunk-EWDWLY74.js.map +0 -1
- package/dist/chunk-K3PVUXKB.mjs +0 -6
- package/dist/chunk-USQPRLSG.mjs.map +0 -1
- package/dist/lib-BD4KKQBI.mjs +0 -4
- package/dist/web-vitals.attribution-CHXXWO72.mjs.map +0 -1
- package/dist/web-vitals.attribution-SQVZNHN3.js.map +0 -1
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
var chunk7THQ4UW3_js = require('./chunk-7THQ4UW3.js');
|
|
5
5
|
var chunkHGNSJXWT_js = require('./chunk-HGNSJXWT.js');
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
6
|
+
var chunkNH2P27MA_js = require('./chunk-NH2P27MA.js');
|
|
7
|
+
var chunkIO65ROAO_js = require('./chunk-IO65ROAO.js');
|
|
8
|
+
var chunkPURI56RE_js = require('./chunk-PURI56RE.js');
|
|
9
9
|
var react = require('react');
|
|
10
10
|
|
|
11
11
|
// src/fleet/heartbeat.ts
|
|
@@ -18,17 +18,17 @@ function detectNextVersion() {
|
|
|
18
18
|
async function sendFleetHeartbeat(opts) {
|
|
19
19
|
const { apiUrl, apiKey } = opts;
|
|
20
20
|
if (!apiUrl || !apiKey) return false;
|
|
21
|
-
const target =
|
|
21
|
+
const target = chunkNH2P27MA_js.resolveAnalyticsTarget(opts);
|
|
22
22
|
if (!target) return false;
|
|
23
23
|
const payload = chunk7THQ4UW3_js.buildFleetHeartbeatPayload({
|
|
24
|
-
kitVersion: opts.kitVersion ||
|
|
24
|
+
kitVersion: opts.kitVersion || chunkPURI56RE_js.SITE_KIT_VERSION,
|
|
25
25
|
nextVersion: opts.nextVersion,
|
|
26
26
|
modules: opts.modules,
|
|
27
27
|
site: opts.site,
|
|
28
28
|
source: opts.source
|
|
29
29
|
});
|
|
30
30
|
try {
|
|
31
|
-
const res = await
|
|
31
|
+
const res = await chunkIO65ROAO_js.sonorFetch(
|
|
32
32
|
`${target.apiUrl.replace(/\/$/, "")}${FLEET_HEARTBEAT_PATH}`,
|
|
33
33
|
{
|
|
34
34
|
method: "POST",
|
|
@@ -67,12 +67,12 @@ function FleetHeartbeat({
|
|
|
67
67
|
if (!ready || sentRef.current) return;
|
|
68
68
|
if (typeof window === "undefined") return;
|
|
69
69
|
const w = window;
|
|
70
|
-
const target =
|
|
70
|
+
const target = chunkNH2P27MA_js.resolveAnalyticsTarget({ apiUrl, apiKey, allowInFrame, allowLocalhost, debug });
|
|
71
71
|
if (!target) return;
|
|
72
72
|
const { apiUrl: url, apiKey: key } = target;
|
|
73
73
|
const resolvedSite = site ?? w.__SITE_KIT_SITE__ ?? window.location.host ?? "";
|
|
74
74
|
if (oncePerSession) {
|
|
75
|
-
const stamp = `${
|
|
75
|
+
const stamp = `${chunkPURI56RE_js.SITE_KIT_VERSION}:${resolvedSite}`;
|
|
76
76
|
try {
|
|
77
77
|
if (sessionStorage.getItem(SESSION_GUARD_KEY) === stamp) {
|
|
78
78
|
sentRef.current = true;
|
|
@@ -102,5 +102,5 @@ exports.FLEET_HEARTBEAT_PATH = FLEET_HEARTBEAT_PATH;
|
|
|
102
102
|
exports.FleetHeartbeat = FleetHeartbeat;
|
|
103
103
|
exports.detectNextVersion = detectNextVersion;
|
|
104
104
|
exports.sendFleetHeartbeat = sendFleetHeartbeat;
|
|
105
|
-
//# sourceMappingURL=chunk-
|
|
106
|
-
//# sourceMappingURL=chunk-
|
|
105
|
+
//# sourceMappingURL=chunk-OY3PDIB3.js.map
|
|
106
|
+
//# sourceMappingURL=chunk-OY3PDIB3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fleet/heartbeat.ts","../src/fleet/FleetHeartbeat.tsx"],"names":["sanitizeFleetVersion","resolveAnalyticsTarget","buildFleetHeartbeatPayload","SITE_KIT_VERSION","sonorFetch","useDeferredActivation","useRef","useEffect"],"mappings":"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","file":"chunk-HSLPN3QK.js","sourcesContent":["/**\n * @sonordev/site-kit/fleet — heartbeat sender (single source of truth for the POST)\n *\n * One place that turns fleet inputs into a validated payload and ships it to\n * `/api/public/fleet/heartbeat`. Used by BOTH the client component\n * (FleetHeartbeat) and any build-time caller, so the send path never forks.\n *\n * It routes through the shared analytics send gate and `sonorFetch`, which stamps\n * the x-sitekit-version header, attaches x-api-key, and honors the auth\n * circuit breaker — a site on a stale/canceled key will not spam the API.\n */\n\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport { sonorFetch } from '../shared/sonorFetch'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport {\n buildFleetHeartbeatPayload,\n sanitizeFleetVersion,\n type FleetHeartbeatPayload,\n type FleetHeartbeatSource,\n type FleetModule,\n} from './contract'\n\n/** Canonical ingest path — resolved against the site's Sonor API origin. */\nexport const FLEET_HEARTBEAT_PATH = '/api/public/fleet/heartbeat'\n\nexport interface SendFleetHeartbeatOptions extends AnalyticsGateOptions {\n /** Sonor API origin (e.g. https://api.sonor.io). Trailing slash tolerated. */\n apiUrl: string\n /** Project API key — scopes the request; the project is resolved server-side. */\n apiKey: string\n /** Client-observable active modules (validated/deduped by the contract). */\n modules?: FleetModule[] | string[]\n /** Normalized host for the multi-site sub-dimension (server re-normalizes). */\n site?: string | null\n /** Installed Next.js version, if the caller can resolve it. */\n nextVersion?: string | null\n /** 'client' (runtime boot) or 'build' (CI). Default 'client'. */\n source?: FleetHeartbeatSource\n /** Override the reported kit version. Defaults to the runtime SITE_KIT_VERSION. */\n kitVersion?: string\n /** Log one info line with the result. Never logs at error level. */\n debug?: boolean\n}\n\n/**\n * Best-effort runtime detection of the host Next.js version. Unreliable by\n * design — Next does not expose its version consistently across app/pages\n * router — so it returns null unless a site injects `__SITE_KIT_NEXT_VERSION__`\n * or `window.next.version` is present. Build-time callers should pass\n * `nextVersion` explicitly (resolvable from `next/package.json`).\n */\nexport function detectNextVersion(): string | null {\n if (typeof window === 'undefined') return null\n const w = window as unknown as {\n __SITE_KIT_NEXT_VERSION__?: string\n next?: { version?: string }\n }\n return sanitizeFleetVersion(w.__SITE_KIT_NEXT_VERSION__ ?? w.next?.version ?? null)\n}\n\n/**\n * Fire one heartbeat. Fire-and-forget by contract: it never throws — a\n * telemetry POST must never break a visitor's page or a site's build. Returns\n * true only when the POST was accepted (2xx).\n */\nexport async function sendFleetHeartbeat(opts: SendFleetHeartbeatOptions): Promise<boolean> {\n const { apiUrl, apiKey } = opts\n if (!apiUrl || !apiKey) return false\n const target = resolveAnalyticsTarget(opts)\n if (!target) return false\n\n const payload: FleetHeartbeatPayload = buildFleetHeartbeatPayload({\n kitVersion: opts.kitVersion || SITE_KIT_VERSION,\n nextVersion: opts.nextVersion,\n modules: opts.modules,\n site: opts.site,\n source: opts.source,\n })\n\n try {\n const res = await sonorFetch(\n `${target.apiUrl.replace(/\\/$/, '')}${FLEET_HEARTBEAT_PATH}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { apiKey: target.apiKey, retries: 0 },\n )\n if (opts.debug) {\n // info, never error: a visitor's console must stay clean (Lighthouse).\n console.info(\n `[Sonor fleet] heartbeat ${res.status} v${payload.kit_version} [${payload.modules.join(',') || 'none'}]`,\n )\n }\n return res.ok\n } catch (err) {\n if (opts.debug) console.info('[Sonor fleet] heartbeat skipped (network)', err)\n return false\n }\n}\n","/**\n * @sonordev/site-kit/fleet — FleetHeartbeat\n *\n * A childless, effect-only client component that reports this site's build\n * fingerprint (kit version, Next.js version, active modules, host) to Sonor\n * exactly once per browser session. It exists so the platform can answer\n * \"which version / modules / key state is each site running\" without shelling\n * into every client repo.\n *\n * It is mounted as a deferred, CHILDLESS SIBLING — never a wrapper — by\n * SiteKitClientProviders, behind the same idle/first-interaction gate as\n * Analytics and Engage, so it never enters the critical hydration path (see\n * CLAUDE.md \"the page must server-render\"). It renders null and carries no\n * visitor data.\n */\n\n'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport { detectNextVersion, sendFleetHeartbeat } from './heartbeat'\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport type { FleetModule } from './contract'\n\n/** Session guard key — one heartbeat per session, re-sent when version/host changes. */\nconst SESSION_GUARD_KEY = '_sk_fleet_hb'\n\nexport interface FleetHeartbeatProps extends AnalyticsGateOptions {\n /** Sonor API origin. Falls back to `window.__SITE_KIT_API_URL__` then api.sonor.io. */\n apiUrl?: string\n /** Project API key. Falls back to `window.__SITE_KIT_API_KEY__`. */\n apiKey?: string\n /** Host for the multi-site sub-dimension. Falls back to `__SITE_KIT_SITE__` then location.host. */\n site?: string | null\n /** Client-observable active modules (SiteKitClientProviders passes the enabled set). */\n modules?: FleetModule[]\n /** Installed Next.js version if known; otherwise best-effort runtime detection. */\n nextVersion?: string | null\n /**\n * Self-defer to idle / first interaction. Default true so standalone use is\n * safe. SiteKitClientProviders already gates the mount and passes false.\n */\n defer?: boolean\n /** Send at most once per browser session per (version, host). Default true. */\n oncePerSession?: boolean\n debug?: boolean\n}\n\nexport function FleetHeartbeat({\n apiUrl,\n apiKey,\n site,\n modules,\n nextVersion,\n defer = true,\n oncePerSession = true,\n debug = false,\n allowInFrame = false,\n allowLocalhost = false,\n}: FleetHeartbeatProps) {\n const ready = useDeferredActivation(defer)\n const sentRef = useRef(false)\n\n useEffect(() => {\n if (!ready || sentRef.current) return\n if (typeof window === 'undefined') return\n\n const w = window as unknown as {\n __SITE_KIT_API_URL__?: string\n __SITE_KIT_API_KEY__?: string\n __SITE_KIT_SITE__?: string\n }\n const target = resolveAnalyticsTarget({ apiUrl, apiKey, allowInFrame, allowLocalhost, debug })\n if (!target) return // Gate before stamping session storage.\n const { apiUrl: url, apiKey: key } = target\n\n const resolvedSite = site ?? w.__SITE_KIT_SITE__ ?? window.location.host ?? ''\n\n // Once-per-session-per-(version,host): keeps heartbeat volume to one POST\n // per visitor session while still re-reporting after an upgrade or on a\n // different sub-site. Storage-disabled browsers simply send once per load.\n if (oncePerSession) {\n const stamp = `${SITE_KIT_VERSION}:${resolvedSite}`\n try {\n if (sessionStorage.getItem(SESSION_GUARD_KEY) === stamp) {\n sentRef.current = true\n return\n }\n sessionStorage.setItem(SESSION_GUARD_KEY, stamp)\n } catch {\n /* storage unavailable — fall through and send this load */\n }\n }\n\n sentRef.current = true\n void sendFleetHeartbeat({\n apiUrl: url,\n apiKey: key,\n site: resolvedSite,\n modules,\n nextVersion: nextVersion ?? detectNextVersion(),\n source: 'client',\n allowInFrame,\n allowLocalhost,\n debug,\n })\n }, [ready, apiUrl, apiKey, site, modules, nextVersion, oncePerSession, debug, allowInFrame, allowLocalhost])\n\n return null\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/fleet/heartbeat.ts","../src/fleet/FleetHeartbeat.tsx"],"names":["sanitizeFleetVersion","resolveAnalyticsTarget","buildFleetHeartbeatPayload","SITE_KIT_VERSION","sonorFetch","useDeferredActivation","useRef","useEffect"],"mappings":"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","file":"chunk-OY3PDIB3.js","sourcesContent":["/**\n * @sonordev/site-kit/fleet — heartbeat sender (single source of truth for the POST)\n *\n * One place that turns fleet inputs into a validated payload and ships it to\n * `/api/public/fleet/heartbeat`. Used by BOTH the client component\n * (FleetHeartbeat) and any build-time caller, so the send path never forks.\n *\n * It routes through the shared analytics send gate and `sonorFetch`, which stamps\n * the x-sitekit-version header, attaches x-api-key, and honors the auth\n * circuit breaker — a site on a stale/canceled key will not spam the API.\n */\n\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport { sonorFetch } from '../shared/sonorFetch'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport {\n buildFleetHeartbeatPayload,\n sanitizeFleetVersion,\n type FleetHeartbeatPayload,\n type FleetHeartbeatSource,\n type FleetModule,\n} from './contract'\n\n/** Canonical ingest path — resolved against the site's Sonor API origin. */\nexport const FLEET_HEARTBEAT_PATH = '/api/public/fleet/heartbeat'\n\nexport interface SendFleetHeartbeatOptions extends AnalyticsGateOptions {\n /** Sonor API origin (e.g. https://api.sonor.io). Trailing slash tolerated. */\n apiUrl: string\n /** Project API key — scopes the request; the project is resolved server-side. */\n apiKey: string\n /** Client-observable active modules (validated/deduped by the contract). */\n modules?: FleetModule[] | string[]\n /** Normalized host for the multi-site sub-dimension (server re-normalizes). */\n site?: string | null\n /** Installed Next.js version, if the caller can resolve it. */\n nextVersion?: string | null\n /** 'client' (runtime boot) or 'build' (CI). Default 'client'. */\n source?: FleetHeartbeatSource\n /** Override the reported kit version. Defaults to the runtime SITE_KIT_VERSION. */\n kitVersion?: string\n /** Log one info line with the result. Never logs at error level. */\n debug?: boolean\n}\n\n/**\n * Best-effort runtime detection of the host Next.js version. Unreliable by\n * design — Next does not expose its version consistently across app/pages\n * router — so it returns null unless a site injects `__SITE_KIT_NEXT_VERSION__`\n * or `window.next.version` is present. Build-time callers should pass\n * `nextVersion` explicitly (resolvable from `next/package.json`).\n */\nexport function detectNextVersion(): string | null {\n if (typeof window === 'undefined') return null\n const w = window as unknown as {\n __SITE_KIT_NEXT_VERSION__?: string\n next?: { version?: string }\n }\n return sanitizeFleetVersion(w.__SITE_KIT_NEXT_VERSION__ ?? w.next?.version ?? null)\n}\n\n/**\n * Fire one heartbeat. Fire-and-forget by contract: it never throws — a\n * telemetry POST must never break a visitor's page or a site's build. Returns\n * true only when the POST was accepted (2xx).\n */\nexport async function sendFleetHeartbeat(opts: SendFleetHeartbeatOptions): Promise<boolean> {\n const { apiUrl, apiKey } = opts\n if (!apiUrl || !apiKey) return false\n const target = resolveAnalyticsTarget(opts)\n if (!target) return false\n\n const payload: FleetHeartbeatPayload = buildFleetHeartbeatPayload({\n kitVersion: opts.kitVersion || SITE_KIT_VERSION,\n nextVersion: opts.nextVersion,\n modules: opts.modules,\n site: opts.site,\n source: opts.source,\n })\n\n try {\n const res = await sonorFetch(\n `${target.apiUrl.replace(/\\/$/, '')}${FLEET_HEARTBEAT_PATH}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { apiKey: target.apiKey, retries: 0 },\n )\n if (opts.debug) {\n // info, never error: a visitor's console must stay clean (Lighthouse).\n console.info(\n `[Sonor fleet] heartbeat ${res.status} v${payload.kit_version} [${payload.modules.join(',') || 'none'}]`,\n )\n }\n return res.ok\n } catch (err) {\n if (opts.debug) console.info('[Sonor fleet] heartbeat skipped (network)', err)\n return false\n }\n}\n","/**\n * @sonordev/site-kit/fleet — FleetHeartbeat\n *\n * A childless, effect-only client component that reports this site's build\n * fingerprint (kit version, Next.js version, active modules, host) to Sonor\n * exactly once per browser session. It exists so the platform can answer\n * \"which version / modules / key state is each site running\" without shelling\n * into every client repo.\n *\n * It is mounted as a deferred, CHILDLESS SIBLING — never a wrapper — by\n * SiteKitClientProviders, behind the same idle/first-interaction gate as\n * Analytics and Engage, so it never enters the critical hydration path (see\n * CLAUDE.md \"the page must server-render\"). It renders null and carries no\n * visitor data.\n */\n\n'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport { detectNextVersion, sendFleetHeartbeat } from './heartbeat'\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport type { FleetModule } from './contract'\n\n/** Session guard key — one heartbeat per session, re-sent when version/host changes. */\nconst SESSION_GUARD_KEY = '_sk_fleet_hb'\n\nexport interface FleetHeartbeatProps extends AnalyticsGateOptions {\n /** Sonor API origin. Falls back to `window.__SITE_KIT_API_URL__` then api.sonor.io. */\n apiUrl?: string\n /** Project API key. Falls back to `window.__SITE_KIT_API_KEY__`. */\n apiKey?: string\n /** Host for the multi-site sub-dimension. Falls back to `__SITE_KIT_SITE__` then location.host. */\n site?: string | null\n /** Client-observable active modules (SiteKitClientProviders passes the enabled set). */\n modules?: FleetModule[]\n /** Installed Next.js version if known; otherwise best-effort runtime detection. */\n nextVersion?: string | null\n /**\n * Self-defer to idle / first interaction. Default true so standalone use is\n * safe. SiteKitClientProviders already gates the mount and passes false.\n */\n defer?: boolean\n /** Send at most once per browser session per (version, host). Default true. */\n oncePerSession?: boolean\n debug?: boolean\n}\n\nexport function FleetHeartbeat({\n apiUrl,\n apiKey,\n site,\n modules,\n nextVersion,\n defer = true,\n oncePerSession = true,\n debug = false,\n allowInFrame = false,\n allowLocalhost = false,\n}: FleetHeartbeatProps) {\n const ready = useDeferredActivation(defer)\n const sentRef = useRef(false)\n\n useEffect(() => {\n if (!ready || sentRef.current) return\n if (typeof window === 'undefined') return\n\n const w = window as unknown as {\n __SITE_KIT_API_URL__?: string\n __SITE_KIT_API_KEY__?: string\n __SITE_KIT_SITE__?: string\n }\n const target = resolveAnalyticsTarget({ apiUrl, apiKey, allowInFrame, allowLocalhost, debug })\n if (!target) return // Gate before stamping session storage.\n const { apiUrl: url, apiKey: key } = target\n\n const resolvedSite = site ?? w.__SITE_KIT_SITE__ ?? window.location.host ?? ''\n\n // Once-per-session-per-(version,host): keeps heartbeat volume to one POST\n // per visitor session while still re-reporting after an upgrade or on a\n // different sub-site. Storage-disabled browsers simply send once per load.\n if (oncePerSession) {\n const stamp = `${SITE_KIT_VERSION}:${resolvedSite}`\n try {\n if (sessionStorage.getItem(SESSION_GUARD_KEY) === stamp) {\n sentRef.current = true\n return\n }\n sessionStorage.setItem(SESSION_GUARD_KEY, stamp)\n } catch {\n /* storage unavailable — fall through and send this load */\n }\n }\n\n sentRef.current = true\n void sendFleetHeartbeat({\n apiUrl: url,\n apiKey: key,\n site: resolvedSite,\n modules,\n nextVersion: nextVersion ?? detectNextVersion(),\n source: 'client',\n allowInFrame,\n allowLocalhost,\n debug,\n })\n }, [ready, apiUrl, apiKey, site, modules, nextVersion, oncePerSession, debug, allowInFrame, allowLocalhost])\n\n return null\n}\n"]}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
var chunk3DWIYCQX_js = require('./chunk-3DWIYCQX.js');
|
|
5
5
|
var chunkRC4WWQXR_js = require('./chunk-RC4WWQXR.js');
|
|
6
6
|
var chunkP4Y75QSU_js = require('./chunk-P4Y75QSU.js');
|
|
7
|
-
var
|
|
8
|
-
var
|
|
7
|
+
var chunkNH2P27MA_js = require('./chunk-NH2P27MA.js');
|
|
8
|
+
var chunkIO65ROAO_js = require('./chunk-IO65ROAO.js');
|
|
9
9
|
var react = require('react');
|
|
10
10
|
var navigation = require('next/navigation');
|
|
11
11
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -67,10 +67,10 @@ function getMeasurementContext(options = {}) {
|
|
|
67
67
|
|
|
68
68
|
// src/analytics/send-gate.ts
|
|
69
69
|
async function analyticsSend(path, body, options = {}) {
|
|
70
|
-
const target =
|
|
70
|
+
const target = chunkNH2P27MA_js.resolveAnalyticsTarget(options);
|
|
71
71
|
if (!target) return null;
|
|
72
72
|
try {
|
|
73
|
-
return await
|
|
73
|
+
return await chunkIO65ROAO_js.sonorFetch(
|
|
74
74
|
`${target.apiUrl}${path}`,
|
|
75
75
|
{
|
|
76
76
|
method: options.method || "POST",
|
|
@@ -85,9 +85,9 @@ async function analyticsSend(path, body, options = {}) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
function analyticsBeacon(path, body, options = {}) {
|
|
88
|
-
const target =
|
|
88
|
+
const target = chunkNH2P27MA_js.resolveAnalyticsTarget(options);
|
|
89
89
|
if (!target) return;
|
|
90
|
-
|
|
90
|
+
chunkIO65ROAO_js.sonorBeacon(`${target.apiUrl}${path}`, body, target.apiKey);
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
// src/analytics/WebVitals.tsx
|
|
@@ -159,12 +159,12 @@ function WebVitals({
|
|
|
159
159
|
react.useEffect(() => {
|
|
160
160
|
let cancelled = false;
|
|
161
161
|
let teardown;
|
|
162
|
-
import('./web-vitals.attribution-
|
|
162
|
+
import('./web-vitals.attribution-ONVYQNRB.js').then(({ onCLS, onLCP, onTTFB, onINP, onFCP }) => {
|
|
163
163
|
if (cancelled) return;
|
|
164
164
|
const { propApiUrl: propApiUrl2, propApiKey: propApiKey2, propSite: propSite2, allowInFrame: allowInFrame2, allowLocalhost: allowLocalhost2, debug: debug2, visitorId: visitorId2, sessionId: sessionId2, sessionTimeout: sessionTimeout2 } = propsRef.current;
|
|
165
165
|
const sent = /* @__PURE__ */ new Map();
|
|
166
166
|
const report = (metric, viaBeacon = false) => {
|
|
167
|
-
if (!
|
|
167
|
+
if (!chunkNH2P27MA_js.resolveAnalyticsTarget({ apiUrl: propApiUrl2, apiKey: propApiKey2, allowInFrame: allowInFrame2, allowLocalhost: allowLocalhost2, debug: debug2 })) return;
|
|
168
168
|
if (sent.get(metric.id) === metric.value) return;
|
|
169
169
|
sent.set(metric.id, metric.value);
|
|
170
170
|
const site = propSite2 || (typeof window !== "undefined" ? window.__SITE_KIT_SITE__ || window.location.host : "");
|
|
@@ -714,7 +714,7 @@ function AnalyticsProvider({
|
|
|
714
714
|
if (normalizedPath === lastPathRef.current) return;
|
|
715
715
|
lastPathRef.current = normalizedPath;
|
|
716
716
|
const trackPageView = async () => {
|
|
717
|
-
if (!
|
|
717
|
+
if (!chunkNH2P27MA_js.resolveAnalyticsTarget(gate)) {
|
|
718
718
|
if (debug) console.warn("[Analytics] Page view skipped (no key, or embedded)");
|
|
719
719
|
return;
|
|
720
720
|
}
|
|
@@ -782,7 +782,7 @@ function AnalyticsProvider({
|
|
|
782
782
|
if (!trackJourneys) return;
|
|
783
783
|
if (!pathname) return;
|
|
784
784
|
if (typeof window === "undefined") return;
|
|
785
|
-
if (!
|
|
785
|
+
if (!chunkNH2P27MA_js.resolveAnalyticsTarget(gate)) return;
|
|
786
786
|
const now = Date.now();
|
|
787
787
|
const previousPath = lastPathRef.current;
|
|
788
788
|
const previousDuration = pageEnterTimeRef.current > 0 ? Math.round((now - pageEnterTimeRef.current) / 1e3) : 0;
|
|
@@ -861,7 +861,7 @@ function AnalyticsProvider({
|
|
|
861
861
|
if (typeof window === "undefined") return;
|
|
862
862
|
if (debug) console.log("[Analytics] Scroll tracking setup:", { trackScrollDepth, hasApiKey: !!propApiKey });
|
|
863
863
|
if (!trackScrollDepth) return;
|
|
864
|
-
if (!
|
|
864
|
+
if (!chunkNH2P27MA_js.resolveAnalyticsTarget(gate)) {
|
|
865
865
|
if (debug) console.warn("[Analytics] Scroll tracking disabled (no key, or embedded)");
|
|
866
866
|
return;
|
|
867
867
|
}
|
|
@@ -940,7 +940,7 @@ function AnalyticsProvider({
|
|
|
940
940
|
react.useEffect(() => {
|
|
941
941
|
if (!trackClicks) return;
|
|
942
942
|
if (typeof window === "undefined") return;
|
|
943
|
-
if (!
|
|
943
|
+
if (!chunkNH2P27MA_js.resolveAnalyticsTarget(gate)) return;
|
|
944
944
|
const handleClick = async (e) => {
|
|
945
945
|
const target = e.target;
|
|
946
946
|
if (!target) return;
|
|
@@ -1075,5 +1075,5 @@ exports.WebVitals = WebVitals;
|
|
|
1075
1075
|
exports.useAnalytics = useAnalytics;
|
|
1076
1076
|
exports.useAnalyticsOptional = useAnalyticsOptional;
|
|
1077
1077
|
exports.useTrackEvent = useTrackEvent;
|
|
1078
|
-
//# sourceMappingURL=chunk-
|
|
1079
|
-
//# sourceMappingURL=chunk-
|
|
1078
|
+
//# sourceMappingURL=chunk-PFDRQJKJ.js.map
|
|
1079
|
+
//# sourceMappingURL=chunk-PFDRQJKJ.js.map
|