@sonordev/site-kit 5.6.0 → 5.8.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/README.md +3 -3
- package/agent-manifest.json +24 -4
- package/dist/AnalyticsProvider-OCXRNIVE.js +33 -0
- package/dist/{AnalyticsProvider-6PXC7UDP.js.map → AnalyticsProvider-OCXRNIVE.js.map} +1 -1
- package/dist/AnalyticsProvider-ZAUONQCX.mjs +12 -0
- package/dist/{AnalyticsProvider-FVQIYSLY.mjs.map → AnalyticsProvider-ZAUONQCX.mjs.map} +1 -1
- package/dist/{BlogViewTracker-S4HSRCW7.js → BlogViewTracker-HK5C7PU6.js} +14 -11
- package/dist/BlogViewTracker-HK5C7PU6.js.map +1 -0
- package/dist/{BlogViewTracker-ZUGLBOVI.mjs → BlogViewTracker-KXRZHN3U.mjs} +13 -10
- package/dist/BlogViewTracker-KXRZHN3U.mjs.map +1 -0
- package/dist/ChatWidget-3OW5LY37.js +24 -0
- package/dist/{ChatWidget-2TQWCXWP.js.map → ChatWidget-3OW5LY37.js.map} +1 -1
- package/dist/ChatWidget-54GVS27I.mjs +15 -0
- package/dist/{ChatWidget-DG52ZIE6.mjs.map → ChatWidget-54GVS27I.mjs.map} +1 -1
- package/dist/EngageWidget-7EUP76WE.mjs +12 -0
- package/dist/{EngageWidget-2VUJADIU.mjs.map → EngageWidget-7EUP76WE.mjs.map} +1 -1
- package/dist/EngageWidget-DDP5UFA4.js +21 -0
- package/dist/{EngageWidget-Z7RC2INM.js.map → EngageWidget-DDP5UFA4.js.map} +1 -1
- package/dist/{FileField-FSQ7W3A5.mjs → FileField-IQLN6E3C.mjs} +5 -5
- package/dist/{FileField-FSQ7W3A5.mjs.map → FileField-IQLN6E3C.mjs.map} +1 -1
- package/dist/{FileField-UOQHL25J.js → FileField-SBPL4JHP.js} +6 -6
- package/dist/{FileField-UOQHL25J.js.map → FileField-SBPL4JHP.js.map} +1 -1
- package/dist/{FormSpotlight-RHL5FWM2.mjs → FormSpotlight-E2LKKHGV.mjs} +11 -7
- package/dist/FormSpotlight-E2LKKHGV.mjs.map +1 -0
- package/dist/{FormSpotlight-TED32NHP.js → FormSpotlight-YTACNE57.js} +25 -21
- package/dist/FormSpotlight-YTACNE57.js.map +1 -0
- package/dist/{FormStage-PFEBKHGY.js → FormStage-S277U2CP.js} +20 -15
- package/dist/FormStage-S277U2CP.js.map +1 -0
- package/dist/{FormStage-DINIRFOX.mjs → FormStage-YSBN5XKL.mjs} +9 -4
- package/dist/FormStage-YSBN5XKL.mjs.map +1 -0
- package/dist/ManagedForm-I3QVRQ53.mjs +16 -0
- package/dist/{ManagedForm-545YAUFC.mjs.map → ManagedForm-I3QVRQ53.mjs.map} +1 -1
- package/dist/ManagedForm-TSYKQFLJ.js +25 -0
- package/dist/{ManagedForm-43WLCUAK.js.map → ManagedForm-TSYKQFLJ.js.map} +1 -1
- package/dist/{ManagedNewsletterForm-ZPY5RRKX.mjs → ManagedNewsletterForm-T3YRAWKZ.mjs} +9 -7
- package/dist/ManagedNewsletterForm-T3YRAWKZ.mjs.map +1 -0
- package/dist/{ManagedNewsletterForm-I3QN57HB.js → ManagedNewsletterForm-YSOPPKS6.js} +10 -8
- package/dist/ManagedNewsletterForm-YSOPPKS6.js.map +1 -0
- package/dist/{SignalCore-EEH5IM4U.mjs → SignalCore-PPSIQ4BW.mjs} +8 -14
- package/dist/SignalCore-PPSIQ4BW.mjs.map +1 -0
- package/dist/{SignalCore-M4AXIMV4.js → SignalCore-SUZH3XWZ.js} +14 -20
- package/dist/SignalCore-SUZH3XWZ.js.map +1 -0
- package/dist/SitemapSync-HSHCOKCL.mjs +9 -0
- package/dist/{SitemapSync-46G7LVZS.mjs.map → SitemapSync-HSHCOKCL.mjs.map} +1 -1
- package/dist/SitemapSync-LH6UVP4P.js +18 -0
- package/dist/{SitemapSync-XK4JKCS7.js.map → SitemapSync-LH6UVP4P.js.map} +1 -1
- package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
- package/dist/analytics/index.js +10 -9
- package/dist/analytics/index.mjs +5 -4
- package/dist/blog/BlogLayout.d.ts +3 -1
- package/dist/blog/BlogLayout.d.ts.map +1 -1
- package/dist/blog/BlogList.d.ts +7 -1
- package/dist/blog/BlogList.d.ts.map +1 -1
- package/dist/blog/BlogPost.d.ts +20 -1
- package/dist/blog/BlogPost.d.ts.map +1 -1
- package/dist/blog/BlogSidebar.d.ts +3 -1
- package/dist/blog/BlogSidebar.d.ts.map +1 -1
- package/dist/blog/BlogViewTracker.d.ts +8 -2
- package/dist/blog/BlogViewTracker.d.ts.map +1 -1
- package/dist/blog/ClusterLandingPage.d.ts +3 -1
- package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
- package/dist/blog/ClusterNavigation.d.ts +5 -2
- package/dist/blog/ClusterNavigation.d.ts.map +1 -1
- package/dist/blog/RelatedPosts.d.ts +3 -1
- package/dist/blog/RelatedPosts.d.ts.map +1 -1
- package/dist/blog/index.d.ts +1 -1
- package/dist/blog/index.d.ts.map +1 -1
- package/dist/blog/index.js +40 -31
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs +11 -6
- package/dist/blog/index.mjs.map +1 -1
- package/dist/blog/metadata-images.test.d.ts +2 -0
- package/dist/blog/metadata-images.test.d.ts.map +1 -0
- package/dist/blog/not-found.test.d.ts +2 -0
- package/dist/blog/not-found.test.d.ts.map +1 -0
- package/dist/blog/processBlogHtml.d.ts +19 -2
- package/dist/blog/processBlogHtml.d.ts.map +1 -1
- package/dist/blog/public-reads.d.ts +27 -0
- package/dist/blog/public-reads.d.ts.map +1 -0
- package/dist/blog/server-core.d.ts +107 -16
- package/dist/blog/server-core.d.ts.map +1 -1
- package/dist/blog/server-ui.js +29 -23
- package/dist/blog/server-ui.js.map +1 -1
- package/dist/blog/server-ui.mjs +12 -6
- package/dist/blog/server-ui.mjs.map +1 -1
- package/dist/blog/server.d.ts +107 -16
- package/dist/blog/server.d.ts.map +1 -1
- package/dist/blog/server.js +54 -47
- package/dist/blog/server.mjs +5 -2
- package/dist/blog/site-scope.test.d.ts +2 -0
- package/dist/blog/site-scope.test.d.ts.map +1 -0
- package/dist/blog/static-params.test.d.ts +2 -0
- package/dist/blog/static-params.test.d.ts.map +1 -0
- package/dist/brand/extract-brand-profile.d.ts +36 -2
- package/dist/brand/extract-brand-profile.d.ts.map +1 -1
- package/dist/brand/extract-brand-profile.test.d.ts +2 -0
- package/dist/brand/extract-brand-profile.test.d.ts.map +1 -0
- package/dist/{chunk-B64AZC6P.js → chunk-2FQG2AHJ.js} +60 -35
- package/dist/chunk-2FQG2AHJ.js.map +1 -0
- package/dist/{chunk-N2PGTPWN.js → chunk-2OQWLXDO.js} +13 -13
- package/dist/{chunk-N2PGTPWN.js.map → chunk-2OQWLXDO.js.map} +1 -1
- package/dist/{chunk-T5VTQUNF.js → chunk-2SCDUVFJ.js} +10 -10
- package/dist/{chunk-T5VTQUNF.js.map → chunk-2SCDUVFJ.js.map} +1 -1
- package/dist/{chunk-S4RC6VAQ.js → chunk-35ERUUH3.js} +6 -6
- package/dist/{chunk-S4RC6VAQ.js.map → chunk-35ERUUH3.js.map} +1 -1
- package/dist/{chunk-VHZ4LHQT.mjs → chunk-3AUFD7KR.mjs} +3 -3
- package/dist/{chunk-VHZ4LHQT.mjs.map → chunk-3AUFD7KR.mjs.map} +1 -1
- package/dist/{chunk-DHIWR7CG.js → chunk-3BVCF4ZF.js} +4 -4
- package/dist/{chunk-DHIWR7CG.js.map → chunk-3BVCF4ZF.js.map} +1 -1
- package/dist/{chunk-EEQYKMGH.mjs → chunk-3EY5E35M.mjs} +57 -86
- package/dist/chunk-3EY5E35M.mjs.map +1 -0
- package/dist/{chunk-JNABXCLY.mjs → chunk-3SLFT453.mjs} +5 -5
- package/dist/{chunk-JNABXCLY.mjs.map → chunk-3SLFT453.mjs.map} +1 -1
- package/dist/{chunk-AJQI3WTN.mjs → chunk-4L7OHRWB.mjs} +12 -9
- package/dist/chunk-4L7OHRWB.mjs.map +1 -0
- package/dist/chunk-4LYW6PMU.mjs +72 -0
- package/dist/chunk-4LYW6PMU.mjs.map +1 -0
- package/dist/{chunk-R3KTBKSW.js → chunk-4OS6M3V4.js} +6 -12
- package/dist/chunk-4OS6M3V4.js.map +1 -0
- package/dist/{chunk-AY7JBGYC.js → chunk-4RY7JETY.js} +14 -14
- package/dist/{chunk-AY7JBGYC.js.map → chunk-4RY7JETY.js.map} +1 -1
- package/dist/chunk-4TLFZ6NR.mjs +16 -0
- package/dist/chunk-4TLFZ6NR.mjs.map +1 -0
- package/dist/{chunk-4B4S56WJ.mjs → chunk-5B4J3IBX.mjs} +75 -21
- package/dist/chunk-5B4J3IBX.mjs.map +1 -0
- package/dist/chunk-5O7JSWT6.js +8 -0
- package/dist/{chunk-KSL3WA2I.js.map → chunk-5O7JSWT6.js.map} +1 -1
- package/dist/chunk-5SANRSX3.mjs +17 -0
- package/dist/chunk-5SANRSX3.mjs.map +1 -0
- package/dist/{chunk-LCSYJXIO.mjs → chunk-5WGMXSCB.mjs} +3 -3
- package/dist/{chunk-LCSYJXIO.mjs.map → chunk-5WGMXSCB.mjs.map} +1 -1
- package/dist/chunk-5XFFUP6D.js +100 -0
- package/dist/chunk-5XFFUP6D.js.map +1 -0
- package/dist/{chunk-AHZR4VGY.mjs → chunk-6HFFTGFP.mjs} +50 -26
- package/dist/chunk-6HFFTGFP.mjs.map +1 -0
- package/dist/{chunk-USKIL6V6.mjs → chunk-6SBTHS6C.mjs} +3 -3
- package/dist/{chunk-USKIL6V6.mjs.map → chunk-6SBTHS6C.mjs.map} +1 -1
- package/dist/{chunk-NZSFOZJV.js → chunk-7TC3GRXQ.js} +73 -38
- package/dist/chunk-7TC3GRXQ.js.map +1 -0
- package/dist/{chunk-HIHAXEPD.mjs → chunk-7THZOAUR.mjs} +4 -4
- package/dist/{chunk-HIHAXEPD.mjs.map → chunk-7THZOAUR.mjs.map} +1 -1
- package/dist/{chunk-YCI36ZUS.mjs → chunk-AOWJP25J.mjs} +4 -4
- package/dist/{chunk-YCI36ZUS.mjs.map → chunk-AOWJP25J.mjs.map} +1 -1
- package/dist/{chunk-H44XZUOV.mjs → chunk-B2VFMPVJ.mjs} +4 -4
- package/dist/{chunk-H44XZUOV.mjs.map → chunk-B2VFMPVJ.mjs.map} +1 -1
- package/dist/{chunk-OA7KKOAK.mjs → chunk-B35OJ7FR.mjs} +4 -4
- package/dist/{chunk-OA7KKOAK.mjs.map → chunk-B35OJ7FR.mjs.map} +1 -1
- package/dist/{chunk-XR32C47O.js → chunk-BER36QXU.js} +9 -9
- package/dist/{chunk-XR32C47O.js.map → chunk-BER36QXU.js.map} +1 -1
- package/dist/{chunk-7C7XO5HX.mjs → chunk-BFZNLTWK.mjs} +3 -3
- package/dist/{chunk-7C7XO5HX.mjs.map → chunk-BFZNLTWK.mjs.map} +1 -1
- package/dist/chunk-BQP6JIE2.mjs +28 -0
- package/dist/chunk-BQP6JIE2.mjs.map +1 -0
- package/dist/{chunk-5KIO6FXE.js → chunk-C3WU45JT.js} +7 -7
- package/dist/{chunk-5KIO6FXE.js.map → chunk-C3WU45JT.js.map} +1 -1
- package/dist/chunk-CUNZAD46.js +53 -0
- package/dist/chunk-CUNZAD46.js.map +1 -0
- package/dist/chunk-CXAXZFFW.js +157 -0
- package/dist/chunk-CXAXZFFW.js.map +1 -0
- package/dist/{chunk-H4OBGC43.mjs → chunk-DA7IANFG.mjs} +14 -3
- package/dist/chunk-DA7IANFG.mjs.map +1 -0
- package/dist/{chunk-BWSMUSDB.js → chunk-EIW6YEPY.js} +8 -8
- package/dist/{chunk-BWSMUSDB.js.map → chunk-EIW6YEPY.js.map} +1 -1
- package/dist/{chunk-UU47DGHE.js → chunk-F6SKG34N.js} +8 -13
- package/dist/chunk-F6SKG34N.js.map +1 -0
- package/dist/{chunk-LC7AM4J5.js → chunk-FHPW7XVH.js} +77 -20
- package/dist/chunk-FHPW7XVH.js.map +1 -0
- package/dist/{chunk-JNRHTZL4.js → chunk-FVW6FT6L.js} +73 -29
- package/dist/chunk-FVW6FT6L.js.map +1 -0
- package/dist/{chunk-KY6M76JW.js → chunk-GNDWTXLU.js} +56 -177
- package/dist/chunk-GNDWTXLU.js.map +1 -0
- package/dist/{chunk-OZ3FU4BT.js → chunk-H5NBFNND.js} +2 -2
- package/dist/chunk-H5NBFNND.js.map +1 -0
- package/dist/{chunk-SYGGZZMU.js → chunk-HAKD27AZ.js} +7 -7
- package/dist/{chunk-SYGGZZMU.js.map → chunk-HAKD27AZ.js.map} +1 -1
- package/dist/chunk-HCN3IKMW.mjs +106 -0
- package/dist/chunk-HCN3IKMW.mjs.map +1 -0
- package/dist/{chunk-QNPVVWR7.mjs → chunk-HCX343AS.mjs} +4 -4
- package/dist/{chunk-QNPVVWR7.mjs.map → chunk-HCX343AS.mjs.map} +1 -1
- package/dist/{chunk-C2MSD2UM.mjs → chunk-HEOQT5SM.mjs} +216 -103
- package/dist/chunk-HEOQT5SM.mjs.map +1 -0
- package/dist/{chunk-RU54J2PY.mjs → chunk-HOJ4J4X2.mjs} +30 -12
- package/dist/chunk-HOJ4J4X2.mjs.map +1 -0
- package/dist/{chunk-H3D3ZGOJ.js → chunk-HQOHB6QF.js} +15 -15
- package/dist/{chunk-H3D3ZGOJ.js.map → chunk-HQOHB6QF.js.map} +1 -1
- package/dist/chunk-HRMGITUZ.mjs +6 -0
- package/dist/{chunk-DQUBETXH.mjs.map → chunk-HRMGITUZ.mjs.map} +1 -1
- package/dist/{chunk-7AUDKXY5.mjs → chunk-HYVEIP2N.mjs} +3 -3
- package/dist/{chunk-7AUDKXY5.mjs.map → chunk-HYVEIP2N.mjs.map} +1 -1
- package/dist/{chunk-46BMNWE6.js → chunk-I3ND4XYW.js} +12 -9
- package/dist/chunk-I3ND4XYW.js.map +1 -0
- package/dist/{chunk-53KMRZT7.js → chunk-JDTU2RWC.js} +3 -3
- package/dist/{chunk-53KMRZT7.js.map → chunk-JDTU2RWC.js.map} +1 -1
- package/dist/{chunk-GZJE23Y5.mjs → chunk-JLVCWC6A.mjs} +2 -2
- package/dist/chunk-JLVCWC6A.mjs.map +1 -0
- package/dist/chunk-K4TCEAUX.js +52 -0
- package/dist/chunk-K4TCEAUX.js.map +1 -0
- package/dist/chunk-KV7XXLJV.mjs +30 -0
- package/dist/chunk-KV7XXLJV.mjs.map +1 -0
- package/dist/{chunk-5UFDHGFE.mjs → chunk-L24RDT6Q.mjs} +3 -3
- package/dist/{chunk-5UFDHGFE.mjs.map → chunk-L24RDT6Q.mjs.map} +1 -1
- package/dist/{chunk-JE5DWAE6.js → chunk-LBZGYF3B.js} +4 -4
- package/dist/{chunk-JE5DWAE6.js.map → chunk-LBZGYF3B.js.map} +1 -1
- package/dist/{chunk-746RKQHA.js → chunk-LMEUYRRR.js} +93 -121
- package/dist/chunk-LMEUYRRR.js.map +1 -0
- package/dist/chunk-LVGSOW2F.js +32 -0
- package/dist/chunk-LVGSOW2F.js.map +1 -0
- package/dist/{chunk-KPKQKFT4.js → chunk-M45AL7EA.js} +37 -19
- package/dist/chunk-M45AL7EA.js.map +1 -0
- package/dist/{chunk-XK5AIWQG.js → chunk-MHX6TOAS.js} +3 -3
- package/dist/{chunk-XK5AIWQG.js.map → chunk-MHX6TOAS.js.map} +1 -1
- package/dist/chunk-MLVHVKFT.mjs +148 -0
- package/dist/chunk-MLVHVKFT.mjs.map +1 -0
- package/dist/{chunk-RIYAMYLV.mjs → chunk-N2NZBPQ5.mjs} +4 -10
- package/dist/chunk-N2NZBPQ5.mjs.map +1 -0
- package/dist/chunk-NRBITVDK.js +114 -0
- package/dist/chunk-NRBITVDK.js.map +1 -0
- package/dist/{chunk-IYCLN3XS.mjs → chunk-O4YBWJHP.mjs} +6 -11
- package/dist/chunk-O4YBWJHP.mjs.map +1 -0
- package/dist/{chunk-5KIEZHVK.mjs → chunk-O5ZSGBQD.mjs} +4 -4
- package/dist/{chunk-5KIEZHVK.mjs.map → chunk-O5ZSGBQD.mjs.map} +1 -1
- package/dist/{chunk-TP7H6BSK.mjs → chunk-OE7CTIOU.mjs} +73 -30
- package/dist/chunk-OE7CTIOU.mjs.map +1 -0
- package/dist/{chunk-UJ6CHZAI.mjs → chunk-OEW2LFOV.js} +169 -25
- package/dist/chunk-OEW2LFOV.js.map +1 -0
- package/dist/chunk-P4Y75QSU.js +19 -0
- package/dist/chunk-P4Y75QSU.js.map +1 -0
- package/dist/{chunk-6OP5XSMM.mjs → chunk-PK2OTGW5.mjs} +6 -12
- package/dist/chunk-PK2OTGW5.mjs.map +1 -0
- package/dist/{chunk-OC7AO7XS.js → chunk-PRTXAIIC.js} +15 -15
- package/dist/{chunk-OC7AO7XS.js.map → chunk-PRTXAIIC.js.map} +1 -1
- package/dist/{chunk-K2V3ZW36.mjs → chunk-PUAXHYBL.mjs} +3 -3
- package/dist/{chunk-K2V3ZW36.mjs.map → chunk-PUAXHYBL.mjs.map} +1 -1
- package/dist/chunk-QRHVMTHF.mjs +94 -0
- package/dist/chunk-QRHVMTHF.mjs.map +1 -0
- package/dist/{chunk-BZLIOT7Q.js → chunk-QTJTDQYR.js} +76 -111
- package/dist/chunk-QTJTDQYR.js.map +1 -0
- package/dist/{chunk-GJ6NOLGC.mjs → chunk-QVHVL7EX.mjs} +3 -3
- package/dist/{chunk-GJ6NOLGC.mjs.map → chunk-QVHVL7EX.mjs.map} +1 -1
- package/dist/chunk-R7GHP3FY.js +81 -0
- package/dist/chunk-R7GHP3FY.js.map +1 -0
- package/dist/chunk-SEP5D4MI.js +116 -0
- package/dist/chunk-SEP5D4MI.js.map +1 -0
- package/dist/{chunk-GPLCPMVD.mjs → chunk-TXMVU4EY.mjs} +62 -97
- package/dist/chunk-TXMVU4EY.mjs.map +1 -0
- package/dist/chunk-U2V542EO.mjs +98 -0
- package/dist/chunk-U2V542EO.mjs.map +1 -0
- package/dist/{chunk-YYN4YZYZ.js → chunk-UWHCHYCX.js} +4 -4
- package/dist/{chunk-YYN4YZYZ.js.map → chunk-UWHCHYCX.js.map} +1 -1
- package/dist/{chunk-473WDGQZ.mjs → chunk-VJ74275U.mjs} +38 -156
- package/dist/chunk-VJ74275U.mjs.map +1 -0
- package/dist/{chunk-H7274TKR.mjs → chunk-VJV7WUR2.mjs} +12 -4
- package/dist/chunk-VJV7WUR2.mjs.map +1 -0
- package/dist/{chunk-CQS5ZYI6.mjs → chunk-VYL6IHJA.mjs} +9 -9
- package/dist/{chunk-CQS5ZYI6.mjs.map → chunk-VYL6IHJA.mjs.map} +1 -1
- package/dist/{chunk-5B4FABFK.js → chunk-WS7MH3GD.js} +14 -2
- package/dist/chunk-WS7MH3GD.js.map +1 -0
- package/dist/{chunk-IPV2TUAT.js → chunk-XA2GJFVM.js} +12 -4
- package/dist/chunk-XA2GJFVM.js.map +1 -0
- package/dist/chunk-XBX2K3GA.js +33 -0
- package/dist/chunk-XBX2K3GA.js.map +1 -0
- package/dist/{chunk-X5TCH7VZ.js → chunk-XCYKM2SA.js} +6 -13
- package/dist/chunk-XCYKM2SA.js.map +1 -0
- package/dist/{chunk-6CJP7BFM.js → chunk-XZO5I4RS.mjs} +147 -20
- package/dist/chunk-XZO5I4RS.mjs.map +1 -0
- package/dist/chunk-Y5QZPUL3.mjs +47 -0
- package/dist/chunk-Y5QZPUL3.mjs.map +1 -0
- package/dist/{chunk-B6O7D5U4.js → chunk-YECDJDDD.js} +10 -10
- package/dist/{chunk-B6O7D5U4.js.map → chunk-YECDJDDD.js.map} +1 -1
- package/dist/chunk-YN7QHLWF.js +19 -0
- package/dist/chunk-YN7QHLWF.js.map +1 -0
- package/dist/chunk-YU7QZ3PP.mjs +45 -0
- package/dist/chunk-YU7QZ3PP.mjs.map +1 -0
- package/dist/{chunk-CQRLKNHQ.js → chunk-ZEOC26LZ.js} +223 -110
- package/dist/chunk-ZEOC26LZ.js.map +1 -0
- package/dist/{chunk-AEARU24Q.mjs → chunk-ZVI7MBVF.mjs} +73 -38
- package/dist/chunk-ZVI7MBVF.mjs.map +1 -0
- package/dist/cli/agent/checks.d.ts +15 -1
- package/dist/cli/agent/checks.d.ts.map +1 -1
- package/dist/cli/agent/sitemap-trailing-slash.test.d.ts +2 -0
- package/dist/cli/agent/sitemap-trailing-slash.test.d.ts.map +1 -0
- package/dist/cli/commands/api-routes.d.ts.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/geo.d.ts +4 -0
- package/dist/cli/commands/geo.d.ts.map +1 -1
- package/dist/cli/commands/geo.test.d.ts +2 -0
- package/dist/cli/commands/geo.test.d.ts.map +1 -0
- package/dist/cli/commands/og.d.ts +31 -4
- package/dist/cli/commands/og.d.ts.map +1 -1
- package/dist/cli/commands/scaffold.d.ts +1 -2
- package/dist/cli/commands/scaffold.d.ts.map +1 -1
- package/dist/cli/commands/sync.d.ts.map +1 -1
- package/dist/cli/generators/index.d.ts +5 -0
- package/dist/cli/generators/index.d.ts.map +1 -1
- package/dist/cli/generators/index.test.d.ts +2 -0
- package/dist/cli/generators/index.test.d.ts.map +1 -0
- package/dist/cli/index.js +921 -466
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +862 -407
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.js +6 -6
- package/dist/client/index.mjs +5 -5
- package/dist/commerce/CheckoutForm.d.ts.map +1 -1
- package/dist/commerce/ProductDetail.d.ts.map +1 -1
- package/dist/commerce/api.d.ts +14 -0
- package/dist/commerce/api.d.ts.map +1 -1
- package/dist/commerce/discount-checkout.test.d.ts +2 -0
- package/dist/commerce/discount-checkout.test.d.ts.map +1 -0
- package/dist/commerce/index.d.ts +1 -1
- package/dist/commerce/index.d.ts.map +1 -1
- package/dist/commerce/index.js +61 -56
- package/dist/commerce/index.mjs +6 -5
- package/dist/config/index.js +3 -3
- package/dist/config/index.mjs +1 -1
- package/dist/discover-CYXYKHZ2.mjs +4 -0
- package/dist/{discover-BEJRYNFF.mjs.map → discover-CYXYKHZ2.mjs.map} +1 -1
- package/dist/discover-NGEPXZOD.js +21 -0
- package/dist/{discover-WVDYDUJX.js.map → discover-NGEPXZOD.js.map} +1 -1
- package/dist/engage/index.js +12 -10
- package/dist/engage/index.js.map +1 -1
- package/dist/engage/index.mjs +9 -7
- package/dist/engage/index.mjs.map +1 -1
- package/dist/fleet/index.js +8 -8
- package/dist/fleet/index.mjs +4 -4
- package/dist/forms/FormClient.d.ts.map +1 -1
- package/dist/forms/FormField.d.ts +7 -1
- package/dist/forms/FormField.d.ts.map +1 -1
- package/dist/forms/FormSpotlight.d.ts +1 -1
- package/dist/forms/FormSpotlight.d.ts.map +1 -1
- package/dist/forms/FormStage.d.ts +1 -1
- package/dist/forms/FormStage.d.ts.map +1 -1
- package/dist/forms/experience-plan.d.ts +0 -1
- package/dist/forms/experience-plan.d.ts.map +1 -1
- package/dist/forms/field-interactions.d.ts +63 -0
- package/dist/forms/field-interactions.d.ts.map +1 -0
- package/dist/forms/field-interactions.test.d.ts +8 -0
- package/dist/forms/field-interactions.test.d.ts.map +1 -0
- package/dist/forms/field-rules.d.ts +41 -0
- package/dist/forms/field-rules.d.ts.map +1 -0
- package/dist/forms/field-rules.test.d.ts +8 -0
- package/dist/forms/field-rules.test.d.ts.map +1 -0
- package/dist/forms/form-field-focus.test.d.ts +8 -0
- package/dist/forms/form-field-focus.test.d.ts.map +1 -0
- package/dist/forms/index.js +25 -23
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +13 -11
- package/dist/forms/index.mjs.map +1 -1
- package/dist/forms/server.js +11 -11
- package/dist/forms/server.mjs +9 -9
- package/dist/forms/static.js +8 -8
- package/dist/forms/static.mjs +7 -7
- package/dist/forms/tracking-session.d.ts +48 -3
- package/dist/forms/tracking-session.d.ts.map +1 -1
- package/dist/forms/types.d.ts +11 -0
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/useForm.d.ts +8 -0
- package/dist/forms/useForm.d.ts.map +1 -1
- package/dist/forms/useFormTracking.d.ts +29 -4
- package/dist/forms/useFormTracking.d.ts.map +1 -1
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.js +72 -68
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +14 -10
- package/dist/index.mjs.map +1 -1
- package/dist/layout/client.js +10 -10
- package/dist/layout/client.mjs +9 -9
- package/dist/layout/index.js +13 -12
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/index.mjs +11 -10
- package/dist/layout/index.mjs.map +1 -1
- package/dist/llms/aiRobots.d.ts +24 -5
- package/dist/llms/aiRobots.d.ts.map +1 -1
- package/dist/llms/api.d.ts +8 -3
- package/dist/llms/api.d.ts.map +1 -1
- package/dist/llms/discovery-headers.d.ts +24 -0
- package/dist/llms/discovery-headers.d.ts.map +1 -1
- package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
- package/dist/llms/handlers.d.ts +20 -2
- package/dist/llms/handlers.d.ts.map +1 -1
- package/dist/llms/index.d.ts +2 -2
- package/dist/llms/index.d.ts.map +1 -1
- package/dist/llms/index.js +54 -98
- package/dist/llms/index.js.map +1 -1
- package/dist/llms/index.mjs +20 -83
- package/dist/llms/index.mjs.map +1 -1
- package/dist/llms/links.d.ts +26 -0
- package/dist/llms/links.d.ts.map +1 -0
- package/dist/llms/links.test.d.ts +2 -0
- package/dist/llms/links.test.d.ts.map +1 -0
- package/dist/llms/types.d.ts +15 -0
- package/dist/llms/types.d.ts.map +1 -1
- package/dist/llms/wiring.d.ts +103 -0
- package/dist/llms/wiring.d.ts.map +1 -0
- package/dist/llms/wiring.test.d.ts +2 -0
- package/dist/llms/wiring.test.d.ts.map +1 -0
- package/dist/llms/writeLLMsTxt.d.ts +9 -0
- package/dist/llms/writeLLMsTxt.d.ts.map +1 -1
- package/dist/maps/index.js +5 -5
- package/dist/maps/index.mjs +3 -3
- package/dist/motion/gsap.d.ts +54 -0
- package/dist/motion/gsap.d.ts.map +1 -1
- package/dist/motion/gsap.js +34 -4
- package/dist/motion/gsap.js.map +1 -1
- package/dist/motion/gsap.mjs +33 -5
- package/dist/motion/gsap.mjs.map +1 -1
- package/dist/motion/gsap.test.d.ts +2 -0
- package/dist/motion/gsap.test.d.ts.map +1 -0
- package/dist/og/config.d.ts +6 -0
- package/dist/og/config.d.ts.map +1 -1
- package/dist/og/contrast.d.ts +33 -0
- package/dist/og/contrast.d.ts.map +1 -0
- package/dist/og/index.d.ts +2 -0
- package/dist/og/index.d.ts.map +1 -1
- package/dist/og/index.js +26 -8
- package/dist/og/index.mjs +3 -1
- package/dist/og/pages.d.ts +101 -0
- package/dist/og/pages.d.ts.map +1 -1
- package/dist/og/route-copy.d.ts +34 -0
- package/dist/og/route-copy.d.ts.map +1 -0
- package/dist/og/route-fit.d.ts +77 -0
- package/dist/og/route-fit.d.ts.map +1 -0
- package/dist/og/route.d.ts +80 -20
- package/dist/og/route.d.ts.map +1 -1
- package/dist/og/route.js +195 -25
- package/dist/og/route.js.map +1 -1
- package/dist/og/route.mjs +193 -26
- package/dist/og/route.mjs.map +1 -1
- package/dist/og/route.test.d.ts +2 -0
- package/dist/og/route.test.d.ts.map +1 -0
- package/dist/og/template.d.ts.map +1 -1
- package/dist/og/wiring.d.ts +48 -4
- package/dist/og/wiring.d.ts.map +1 -1
- package/dist/proxy/index.d.ts +16 -11
- package/dist/proxy/index.d.ts.map +1 -1
- package/dist/proxy/index.js +15 -10
- package/dist/proxy/index.js.map +1 -1
- package/dist/proxy/index.mjs +12 -7
- package/dist/proxy/index.mjs.map +1 -1
- package/dist/proxy/llms-discovery.test.d.ts +2 -0
- package/dist/proxy/llms-discovery.test.d.ts.map +1 -0
- package/dist/redirects/index.d.ts +25 -1
- package/dist/redirects/index.d.ts.map +1 -1
- package/dist/redirects/index.js +11 -8
- package/dist/redirects/index.mjs +4 -1
- package/dist/redirects/index.test.d.ts +2 -0
- package/dist/redirects/index.test.d.ts.map +1 -0
- package/dist/redirects/not-found.d.ts +14 -29
- package/dist/redirects/not-found.d.ts.map +1 -1
- package/dist/redirects/not-found.js +15 -5
- package/dist/redirects/not-found.js.map +1 -1
- package/dist/redirects/not-found.mjs +11 -1
- package/dist/redirects/not-found.mjs.map +1 -1
- package/dist/robots/index.d.ts +7 -1
- package/dist/robots/index.d.ts.map +1 -1
- package/dist/robots/index.js +27 -1
- package/dist/robots/index.js.map +1 -1
- package/dist/robots/index.mjs +4 -1
- package/dist/robots/index.mjs.map +1 -1
- package/dist/robots/index.test.d.ts +2 -0
- package/dist/robots/index.test.d.ts.map +1 -0
- package/dist/robots/next-internals.d.ts +22 -0
- package/dist/robots/next-internals.d.ts.map +1 -0
- package/dist/search/index.js +4 -4
- package/dist/search/index.mjs +3 -3
- package/dist/seo/ManagedContent.d.ts +4 -2
- package/dist/seo/ManagedContent.d.ts.map +1 -1
- package/dist/seo/ManagedFAQ.d.ts.map +1 -1
- package/dist/seo/ManagedInternalLinks.d.ts.map +1 -1
- package/dist/seo/ManagedSchema.d.ts.map +1 -1
- package/dist/seo/client.js +6 -6
- package/dist/seo/client.mjs +5 -5
- package/dist/seo/getManagedMetadata.d.ts.map +1 -1
- package/dist/seo/getManagedMetadata.test.d.ts +2 -0
- package/dist/seo/getManagedMetadata.test.d.ts.map +1 -0
- package/dist/seo/index.js +59 -49
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +29 -19
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo/managed-schema-filter.test.d.ts +2 -0
- package/dist/seo/managed-schema-filter.test.d.ts.map +1 -0
- package/dist/seo/register-sitemap-cli-impl.d.ts +32 -0
- package/dist/seo/register-sitemap-cli-impl.d.ts.map +1 -1
- package/dist/seo/register-sitemap-cli.d.ts +7 -0
- package/dist/seo/register-sitemap-cli.d.ts.map +1 -1
- package/dist/seo/register-sitemap-cli.js +273 -56
- package/dist/seo/register-sitemap-cli.js.map +1 -1
- package/dist/seo/register-sitemap-cli.mjs +269 -52
- package/dist/seo/register-sitemap-cli.mjs.map +1 -1
- package/dist/seo/register-sitemap-request.d.ts +36 -0
- package/dist/seo/register-sitemap-request.d.ts.map +1 -0
- package/dist/seo/register-sitemap-request.test.d.ts +2 -0
- package/dist/seo/register-sitemap-request.test.d.ts.map +1 -0
- package/dist/seo/routing.d.ts +2 -0
- package/dist/seo/routing.d.ts.map +1 -1
- package/dist/seo/schema-filter.d.ts +43 -0
- package/dist/seo/schema-filter.d.ts.map +1 -0
- package/dist/seo/schema-filter.test.d.ts +2 -0
- package/dist/seo/schema-filter.test.d.ts.map +1 -0
- package/dist/seo/server-api.d.ts +15 -2
- package/dist/seo/server-api.d.ts.map +1 -1
- package/dist/seo/server.js +23 -18
- package/dist/seo/server.mjs +7 -2
- package/dist/seo/site-scope.test.d.ts +2 -0
- package/dist/seo/site-scope.test.d.ts.map +1 -0
- package/dist/seo/types.d.ts +30 -0
- package/dist/seo/types.d.ts.map +1 -1
- package/dist/seo-meta/contract.d.ts +60 -0
- package/dist/seo-meta/contract.d.ts.map +1 -0
- package/dist/seo-meta/contract.js +41 -0
- package/dist/seo-meta/contract.js.map +1 -0
- package/dist/seo-meta/contract.mjs +4 -0
- package/dist/seo-meta/contract.mjs.map +1 -0
- package/dist/seo-meta/contract.test.d.ts +2 -0
- package/dist/seo-meta/contract.test.d.ts.map +1 -0
- package/dist/server/index.js +4 -3
- package/dist/server/index.mjs +3 -2
- package/dist/server/mint-site-token.d.ts +2 -32
- package/dist/server/mint-site-token.d.ts.map +1 -1
- package/dist/{server-api-RG3ZL3DV.mjs → server-api-A2EFCTZX.mjs} +7 -3
- package/dist/{server-api-RG3ZL3DV.mjs.map → server-api-A2EFCTZX.mjs.map} +1 -1
- package/dist/{server-api-RYJQAUGO.js → server-api-IWTZ7C3O.js} +25 -21
- package/dist/{server-api-RYJQAUGO.js.map → server-api-IWTZ7C3O.js.map} +1 -1
- package/dist/shared/build-entries.d.ts +2 -0
- package/dist/shared/build-entries.d.ts.map +1 -1
- package/dist/shared/fresh-fetch.d.ts +64 -0
- package/dist/shared/fresh-fetch.d.ts.map +1 -0
- package/dist/shared/fresh-fetch.test.d.ts +2 -0
- package/dist/shared/fresh-fetch.test.d.ts.map +1 -0
- package/dist/shared/next-files.d.ts +42 -0
- package/dist/shared/next-files.d.ts.map +1 -0
- package/dist/shared/next-files.test.d.ts +2 -0
- package/dist/shared/next-files.test.d.ts.map +1 -0
- package/dist/shared/page-leave.d.ts +27 -0
- package/dist/shared/page-leave.d.ts.map +1 -0
- package/dist/shared/page-leave.test.d.ts +2 -0
- package/dist/shared/page-leave.test.d.ts.map +1 -0
- package/dist/shared/source-graph.d.ts +63 -0
- package/dist/shared/source-graph.d.ts.map +1 -0
- package/dist/shared/source-graph.test.d.ts +2 -0
- package/dist/shared/source-graph.test.d.ts.map +1 -0
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/SignalCore.d.ts.map +1 -1
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sitemap/discover.d.ts.map +1 -1
- package/dist/sitemap/index.d.ts +25 -5
- package/dist/sitemap/index.d.ts.map +1 -1
- package/dist/sitemap/index.js +54 -51
- package/dist/sitemap/index.js.map +1 -1
- package/dist/sitemap/index.mjs +39 -36
- package/dist/sitemap/index.mjs.map +1 -1
- package/dist/sitemap/shared.d.ts +65 -0
- package/dist/sitemap/shared.d.ts.map +1 -1
- package/dist/sitemap/trailing-slash.test.d.ts +2 -0
- package/dist/sitemap/trailing-slash.test.d.ts.map +1 -0
- package/dist/sites/resolve.d.ts.map +1 -1
- package/dist/sites/site-param.d.ts +16 -0
- package/dist/sites/site-param.d.ts.map +1 -0
- package/dist/sync/index.js +17 -17
- package/dist/sync/index.mjs +4 -4
- package/dist/writeLLMsTxt-CQ7A4AAL.js +20 -0
- package/dist/writeLLMsTxt-CQ7A4AAL.js.map +1 -0
- package/dist/writeLLMsTxt-NX5MSPYX.mjs +11 -0
- package/dist/writeLLMsTxt-NX5MSPYX.mjs.map +1 -0
- package/package.json +25 -22
- package/dist/AnalyticsProvider-6PXC7UDP.js +0 -32
- package/dist/AnalyticsProvider-FVQIYSLY.mjs +0 -11
- package/dist/BlogViewTracker-S4HSRCW7.js.map +0 -1
- package/dist/BlogViewTracker-ZUGLBOVI.mjs.map +0 -1
- package/dist/ChatWidget-2TQWCXWP.js +0 -22
- package/dist/ChatWidget-DG52ZIE6.mjs +0 -13
- package/dist/EngageWidget-2VUJADIU.mjs +0 -12
- package/dist/EngageWidget-Z7RC2INM.js +0 -21
- package/dist/FormSpotlight-RHL5FWM2.mjs.map +0 -1
- package/dist/FormSpotlight-TED32NHP.js.map +0 -1
- package/dist/FormStage-DINIRFOX.mjs.map +0 -1
- package/dist/FormStage-PFEBKHGY.js.map +0 -1
- package/dist/ManagedForm-43WLCUAK.js +0 -23
- package/dist/ManagedForm-545YAUFC.mjs +0 -14
- package/dist/ManagedNewsletterForm-I3QN57HB.js.map +0 -1
- package/dist/ManagedNewsletterForm-ZPY5RRKX.mjs.map +0 -1
- package/dist/SignalCore-EEH5IM4U.mjs.map +0 -1
- package/dist/SignalCore-M4AXIMV4.js.map +0 -1
- package/dist/SitemapSync-46G7LVZS.mjs +0 -9
- package/dist/SitemapSync-XK4JKCS7.js +0 -18
- package/dist/chunk-46BMNWE6.js.map +0 -1
- package/dist/chunk-473WDGQZ.mjs.map +0 -1
- package/dist/chunk-4B4S56WJ.mjs.map +0 -1
- package/dist/chunk-5B4FABFK.js.map +0 -1
- package/dist/chunk-6CJP7BFM.js.map +0 -1
- package/dist/chunk-6OP5XSMM.mjs.map +0 -1
- package/dist/chunk-746RKQHA.js.map +0 -1
- package/dist/chunk-AEARU24Q.mjs.map +0 -1
- package/dist/chunk-AHZR4VGY.mjs.map +0 -1
- package/dist/chunk-AJQI3WTN.mjs.map +0 -1
- package/dist/chunk-B64AZC6P.js.map +0 -1
- package/dist/chunk-BZLIOT7Q.js.map +0 -1
- package/dist/chunk-C2MSD2UM.mjs.map +0 -1
- package/dist/chunk-CQRLKNHQ.js.map +0 -1
- package/dist/chunk-DQUBETXH.mjs +0 -6
- package/dist/chunk-EEQYKMGH.mjs.map +0 -1
- package/dist/chunk-GPLCPMVD.mjs.map +0 -1
- package/dist/chunk-GZJE23Y5.mjs.map +0 -1
- package/dist/chunk-H4OBGC43.mjs.map +0 -1
- package/dist/chunk-H7274TKR.mjs.map +0 -1
- package/dist/chunk-IPV2TUAT.js.map +0 -1
- package/dist/chunk-IYCLN3XS.mjs.map +0 -1
- package/dist/chunk-JEOKDUPQ.js +0 -45
- package/dist/chunk-JEOKDUPQ.js.map +0 -1
- package/dist/chunk-JNRHTZL4.js.map +0 -1
- package/dist/chunk-KPKQKFT4.js.map +0 -1
- package/dist/chunk-KSL3WA2I.js +0 -8
- package/dist/chunk-KY6M76JW.js.map +0 -1
- package/dist/chunk-LC7AM4J5.js.map +0 -1
- package/dist/chunk-LOS5D6B3.js +0 -72
- package/dist/chunk-LOS5D6B3.js.map +0 -1
- package/dist/chunk-NZSFOZJV.js.map +0 -1
- package/dist/chunk-OZ3FU4BT.js.map +0 -1
- package/dist/chunk-QJU6HBSK.mjs +0 -39
- package/dist/chunk-QJU6HBSK.mjs.map +0 -1
- package/dist/chunk-R3KTBKSW.js.map +0 -1
- package/dist/chunk-RIYAMYLV.mjs.map +0 -1
- package/dist/chunk-RU54J2PY.mjs.map +0 -1
- package/dist/chunk-TP7H6BSK.mjs.map +0 -1
- package/dist/chunk-UJ6CHZAI.mjs.map +0 -1
- package/dist/chunk-UU47DGHE.js.map +0 -1
- package/dist/chunk-X5TCH7VZ.js.map +0 -1
- package/dist/chunk-XIJ4F6IE.mjs +0 -63
- package/dist/chunk-XIJ4F6IE.mjs.map +0 -1
- package/dist/discover-BEJRYNFF.mjs +0 -4
- package/dist/discover-WVDYDUJX.js +0 -21
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// src/seo-meta/contract.ts
|
|
2
|
+
var SEO_META_CONTRACT_VERSION = 1;
|
|
3
|
+
var TITLE_SEPARATOR = " | ";
|
|
4
|
+
var DANGLING_TAIL = /[|,\-–—:;·•]\s*$/;
|
|
5
|
+
var TRAILING_FUNCTION_WORD = /\s(?:for|of|and|or|in|on|at|to|with|from|by|a|an|the|your|our|that|&)$/i;
|
|
6
|
+
var MIN_HOST_FRAGMENT = 8;
|
|
7
|
+
var MIN_NAME_LETTERS = 6;
|
|
8
|
+
var lettersOf = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, "");
|
|
9
|
+
var wordsOf = (s) => ` ${s.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim()} `;
|
|
10
|
+
function metaHost(value) {
|
|
11
|
+
if (!value || typeof value !== "string" || /\s/.test(value.trim())) return null;
|
|
12
|
+
const s = value.trim().toLowerCase().replace(/^[a-z][a-z0-9+.-]*:\/\//, "").split(/[/?#]/)[0].split(":")[0].replace(/\.+$/, "").replace(/^www\./, "");
|
|
13
|
+
return s.includes(".") ? s : null;
|
|
14
|
+
}
|
|
15
|
+
function hostsOf(id) {
|
|
16
|
+
const out = /* @__PURE__ */ new Set();
|
|
17
|
+
for (const h of id.hosts ?? []) {
|
|
18
|
+
const host = metaHost(h);
|
|
19
|
+
if (host) out.add(host);
|
|
20
|
+
}
|
|
21
|
+
return [...out];
|
|
22
|
+
}
|
|
23
|
+
function labelsOf(id) {
|
|
24
|
+
return hostsOf(id).map((h) => lettersOf(h.split(".")[0])).filter((l) => l.length >= MIN_NAME_LETTERS);
|
|
25
|
+
}
|
|
26
|
+
function brandCore(name) {
|
|
27
|
+
let s = name.replace(/^the\s+/i, "").trim();
|
|
28
|
+
let prev;
|
|
29
|
+
do {
|
|
30
|
+
prev = s;
|
|
31
|
+
s = s.replace(/[\s,]+(?:apartments|apts|llc|inc|co|corp|ltd|company)\.?$/i, "").trim();
|
|
32
|
+
} while (s !== prev);
|
|
33
|
+
return s;
|
|
34
|
+
}
|
|
35
|
+
function brandVariants(id) {
|
|
36
|
+
const out = [];
|
|
37
|
+
for (const raw of [id.brand, ...id.brandAliases ?? []]) {
|
|
38
|
+
const name = typeof raw === "string" ? raw.replace(/\s+/g, " ").trim() : "";
|
|
39
|
+
if (!name) continue;
|
|
40
|
+
out.push(name);
|
|
41
|
+
const core = brandCore(name);
|
|
42
|
+
if (core && core !== name) out.push(core);
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
function nameVariants(id) {
|
|
47
|
+
return brandVariants(id).filter((v) => metaHost(v) === null);
|
|
48
|
+
}
|
|
49
|
+
function namesBrand(text, id) {
|
|
50
|
+
const words = wordsOf(text);
|
|
51
|
+
return brandVariants(id).some((v) => wordsOf(v).trim() !== "" && words.includes(wordsOf(v)));
|
|
52
|
+
}
|
|
53
|
+
function titleSuffix(title) {
|
|
54
|
+
const t = title.trim();
|
|
55
|
+
const i = t.lastIndexOf(TITLE_SEPARATOR);
|
|
56
|
+
return i > 0 ? t.slice(i + TITLE_SEPARATOR.length).trim() : null;
|
|
57
|
+
}
|
|
58
|
+
function stripTitleSuffix(title) {
|
|
59
|
+
const t = title.trim();
|
|
60
|
+
const i = t.lastIndexOf(TITLE_SEPARATOR);
|
|
61
|
+
return i > 0 ? t.slice(0, i).trim() : t;
|
|
62
|
+
}
|
|
63
|
+
function namesHost(text, id) {
|
|
64
|
+
const lower = text.toLowerCase();
|
|
65
|
+
const brands = brandVariants(id).map((b) => b.toLowerCase());
|
|
66
|
+
return hostsOf(id).some((host) => lower.includes(host) && !brands.some((b) => b.includes(host)));
|
|
67
|
+
}
|
|
68
|
+
function endsOnTruncatedHost(text, id) {
|
|
69
|
+
const tokens = text.trim().split(/[\s|,()[\]]+/);
|
|
70
|
+
const last = (tokens[tokens.length - 1] ?? "").replace(/^[^a-z0-9]+/i, "");
|
|
71
|
+
if (!last || last !== last.toLowerCase()) return false;
|
|
72
|
+
const stem = lettersOf(last.split(".")[0]);
|
|
73
|
+
return stem.length >= MIN_HOST_FRAGMENT && labelsOf(id).some((l) => l.startsWith(stem));
|
|
74
|
+
}
|
|
75
|
+
function occurrences(hay, needle, step = needle.length) {
|
|
76
|
+
let n = 0;
|
|
77
|
+
for (let i = hay.indexOf(needle); i !== -1; i = hay.indexOf(needle, i + step)) n++;
|
|
78
|
+
return n;
|
|
79
|
+
}
|
|
80
|
+
function respellsBrand(text, id) {
|
|
81
|
+
const letters = lettersOf(text);
|
|
82
|
+
const words = wordsOf(text);
|
|
83
|
+
return nameVariants(id).some((v) => {
|
|
84
|
+
const vl = lettersOf(v);
|
|
85
|
+
if (vl.length < MIN_NAME_LETTERS) return false;
|
|
86
|
+
const vw = wordsOf(v);
|
|
87
|
+
return occurrences(letters, vl) > occurrences(words, vw, vw.length - 1);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function gluesHostLabel(text, id) {
|
|
91
|
+
const variants = nameVariants(id);
|
|
92
|
+
if (!variants.length) return false;
|
|
93
|
+
const labels = labelsOf(id);
|
|
94
|
+
return text.split(/[\s|,()[\]:;]+/).some((token) => {
|
|
95
|
+
const tl = lettersOf(token);
|
|
96
|
+
return tl.length >= MIN_NAME_LETTERS && labels.includes(tl) && !variants.some((v) => wordsOf(v).includes(wordsOf(token)));
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function suffixProblem(suffix, id) {
|
|
100
|
+
const s = suffix.trim();
|
|
101
|
+
if (!s) return null;
|
|
102
|
+
if (namesHost(s, id) || endsOnTruncatedHost(s, id)) return "hostname";
|
|
103
|
+
const variants = nameVariants(id);
|
|
104
|
+
if (!variants.length) return null;
|
|
105
|
+
if (respellsBrand(s, id) || gluesHostLabel(s, id)) return "mangled-brand";
|
|
106
|
+
if (/\s/.test(s)) return null;
|
|
107
|
+
const sl = lettersOf(s);
|
|
108
|
+
const fromLabel = sl.length >= MIN_NAME_LETTERS && labelsOf(id).some((l) => l.startsWith(sl));
|
|
109
|
+
const sw = wordsOf(brandCore(s));
|
|
110
|
+
const isBrand = variants.some((v) => {
|
|
111
|
+
const vw = wordsOf(brandCore(v));
|
|
112
|
+
return vw.startsWith(sw) || sw.startsWith(vw);
|
|
113
|
+
});
|
|
114
|
+
return fromLabel && !isBrand ? "mangled-brand" : null;
|
|
115
|
+
}
|
|
116
|
+
function isPlaceholder(title, path) {
|
|
117
|
+
const t = title.trim();
|
|
118
|
+
if (!path) return false;
|
|
119
|
+
const strip = (s) => s.replace(/\/+$/, "") || "/";
|
|
120
|
+
if (t.startsWith("/") && strip(t.toLowerCase()) === strip(path.trim().toLowerCase())) return true;
|
|
121
|
+
return strip(path.trim()) === "/" && /^(home|index|untitled)$/i.test(t);
|
|
122
|
+
}
|
|
123
|
+
function titleProblem(title, id, opts = {}) {
|
|
124
|
+
const t = (title ?? "").trim();
|
|
125
|
+
if (!t) return "empty";
|
|
126
|
+
if (isPlaceholder(t, opts.path)) return "placeholder";
|
|
127
|
+
if (DANGLING_TAIL.test(t)) return "dangling-separator";
|
|
128
|
+
if (namesHost(t, id) || endsOnTruncatedHost(t, id)) return "hostname";
|
|
129
|
+
const suffix = titleSuffix(t);
|
|
130
|
+
if (suffix !== null) {
|
|
131
|
+
const problem = suffixProblem(suffix, id);
|
|
132
|
+
if (problem) return problem;
|
|
133
|
+
}
|
|
134
|
+
if (respellsBrand(t, id) || gluesHostLabel(t, id)) return "mangled-brand";
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
function descriptionProblem(description, id) {
|
|
138
|
+
const d = (description ?? "").trim();
|
|
139
|
+
if (!d) return "empty";
|
|
140
|
+
if (namesHost(d, id)) return "hostname";
|
|
141
|
+
if (respellsBrand(d, id) || gluesHostLabel(d, id)) return "mangled-brand";
|
|
142
|
+
if (DANGLING_TAIL.test(d) || TRAILING_FUNCTION_WORD.test(d)) return "truncated";
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export { SEO_META_CONTRACT_VERSION, descriptionProblem, metaHost, namesBrand, stripTitleSuffix, suffixProblem, titleProblem, titleSuffix };
|
|
147
|
+
//# sourceMappingURL=chunk-MLVHVKFT.mjs.map
|
|
148
|
+
//# sourceMappingURL=chunk-MLVHVKFT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/seo-meta/contract.ts"],"names":[],"mappings":"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","file":"chunk-MLVHVKFT.mjs","sourcesContent":["/**\n * @sonordev/site-kit/seo-meta/contract — generated title/description quality contract (v1)\n *\n * Single source of truth for \"is this machine-generated seo_pages.managed_title\n * / managed_meta_description fit to ship?\". Same pattern as the other site-kit\n * contracts: site-kit owns the canonical logic and applies it at render time\n * (getManagedMetadata falls back to the page's own title/description), and\n * signal-api keeps a byte-identical inline mirror\n * (`src/shared/utils/seo-meta-quality.util.ts`) that gates every generated\n * title before it is written. The shared drift vectors in `contract.test.ts`\n * and the mirror's spec fail on divergence.\n *\n * Why it exists (2026-09-15): Signal's meta generator used the raw domain as\n * the brand whenever it could not resolve one, so ~500 managed titles across\n * 20+ projects shipped as \"Apartments for Rent | abbeyglenapts.com\", were\n * hard-cut at 60 chars (\"… | reinhartheatingandcooli\"), lost the suffix to a\n * word-boundary cut (\"Contact Reinhart Heating and Cooling |\"), or had the\n * model rebuild a brand out of the domain (\"About SSO Shkosh Apartments | SSO\n * Shkosh\" for ssoshkoshapts.com — the brand is SS Oshkosh Apartments). Sites\n * rendered them verbatim.\n *\n * Every rule derives from the site's own identity (its hosts and brand), so\n * there is no list of bad strings to maintain. Pure string logic — no I/O, no\n * Node built-ins.\n */\n\n/** Bump on breaking changes to what counts as a problem. */\nexport const SEO_META_CONTRACT_VERSION = 1 as const\n\n/** Who the site is. Hosts come from the project/site config, the brand from the resolved business name — never from the domain. */\nexport interface MetaIdentity {\n /** The site's brand, e.g. \"SS Oshkosh Apartments\". */\n brand?: string | null\n /** Other correct spellings of the brand. */\n brandAliases?: Array<string | null | undefined>\n /** Hosts the site answers on, in any spelling (URL, www, port). */\n hosts?: Array<string | null | undefined>\n}\n\nexport type TitleProblem = 'empty' | 'placeholder' | 'dangling-separator' | 'hostname' | 'mangled-brand'\nexport type DescriptionProblem = 'empty' | 'hostname' | 'mangled-brand' | 'truncated'\nexport type SuffixProblem = 'hostname' | 'mangled-brand'\n\nconst TITLE_SEPARATOR = ' | '\n/** A title or description must never end on a separator. */\nconst DANGLING_TAIL = /[|,\\-–—:;·•]\\s*$/\n/** A description ending on one of these was cut mid-sentence (\"…Tall Pines, Westbrooke, and\"). */\nconst TRAILING_FUNCTION_WORD = /\\s(?:for|of|and|or|in|on|at|to|with|from|by|a|an|the|your|our|that|&)$/i\n/** A leaked-host fragment shorter than this is too likely to be an ordinary word. */\nconst MIN_HOST_FRAGMENT = 8\n/** Names shorter than this (letters only) can't be told apart from ordinary words. */\nconst MIN_NAME_LETTERS = 6\n\nconst lettersOf = (s: string) => s.toLowerCase().replace(/[^a-z0-9]+/g, '')\nconst wordsOf = (s: string) => ` ${s.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim()} `\n\n/** \"https://www.AbbeyGlenApts.com:443/x\" → \"abbeyglenapts.com\". Null for anything that isn't a host (no dot, or words). */\nexport function metaHost(value: string | null | undefined): string | null {\n if (!value || typeof value !== 'string' || /\\s/.test(value.trim())) return null\n const s = value\n .trim()\n .toLowerCase()\n .replace(/^[a-z][a-z0-9+.-]*:\\/\\//, '')\n .split(/[/?#]/)[0]\n .split(':')[0]\n .replace(/\\.+$/, '')\n .replace(/^www\\./, '')\n return s.includes('.') ? s : null\n}\n\nfunction hostsOf(id: MetaIdentity): string[] {\n const out = new Set<string>()\n for (const h of id.hosts ?? []) {\n const host = metaHost(h)\n if (host) out.add(host)\n }\n return [...out]\n}\n\n/** First DNS label with punctuation removed: \"reinhartheatingandcooling.com\" → \"reinhartheatingandcooling\". */\nfunction labelsOf(id: MetaIdentity): string[] {\n return hostsOf(id)\n .map((h) => lettersOf(h.split('.')[0]))\n .filter((l) => l.length >= MIN_NAME_LETTERS)\n}\n\n/** \"The Gateway Flats\" → \"Gateway Flats\", \"Moore Canine Co., LLC\" → \"Moore Canine\". */\nfunction brandCore(name: string): string {\n let s = name.replace(/^the\\s+/i, '').trim()\n let prev: string\n do {\n prev = s\n s = s.replace(/[\\s,]+(?:apartments|apts|llc|inc|co|corp|ltd|company)\\.?$/i, '').trim()\n } while (s !== prev)\n return s\n}\n\n/** The brand, its aliases, and the core of each — every spelling a title may legitimately use. */\nfunction brandVariants(id: MetaIdentity): string[] {\n const out: string[] = []\n for (const raw of [id.brand, ...(id.brandAliases ?? [])]) {\n const name = typeof raw === 'string' ? raw.replace(/\\s+/g, ' ').trim() : ''\n if (!name) continue\n out.push(name)\n const core = brandCore(name)\n if (core && core !== name) out.push(core)\n }\n return out\n}\n\n/**\n * Brand spellings that are names, not domains. A project titled with its\n * domain (\"proinnovationsllc.com\") still vouches for that domain appearing in a\n * title, but it can't say how the brand is spelled, so \"| Pro Innovations\" is\n * not a respelling of it.\n */\nfunction nameVariants(id: MetaIdentity): string[] {\n return brandVariants(id).filter((v) => metaHost(v) === null)\n}\n\n/** True when the text names the brand (an alias, or either one's core) word for word. */\nexport function namesBrand(text: string, id: MetaIdentity): boolean {\n const words = wordsOf(text)\n return brandVariants(id).some((v) => wordsOf(v).trim() !== '' && words.includes(wordsOf(v)))\n}\n\n/** Everything after the last \" | \", or null when the title has no suffix. */\nexport function titleSuffix(title: string): string | null {\n const t = title.trim()\n const i = t.lastIndexOf(TITLE_SEPARATOR)\n return i > 0 ? t.slice(i + TITLE_SEPARATOR.length).trim() : null\n}\n\n/** Everything before the last \" | \". */\nexport function stripTitleSuffix(title: string): string {\n const t = title.trim()\n const i = t.lastIndexOf(TITLE_SEPARATOR)\n return i > 0 ? t.slice(0, i).trim() : t\n}\n\n/** The site's full host appears (\"… | abbeyglenapts.com\"). A brand that IS a domain (\"RamseyDeal.com\") may name it. */\nfunction namesHost(text: string, id: MetaIdentity): boolean {\n const lower = text.toLowerCase()\n const brands = brandVariants(id).map((b) => b.toLowerCase())\n return hostsOf(id).some((host) => lower.includes(host) && !brands.some((b) => b.includes(host)))\n}\n\n/**\n * The text ends on a hard-cut host: \"… | reinhartheatingandcooli\",\n * \"… | greenbayapartmentrentals.c\". Only the last token, and only when it is\n * written in lowercase like a host — \"… | Celebrity\" is a word, not a host.\n */\nfunction endsOnTruncatedHost(text: string, id: MetaIdentity): boolean {\n const tokens = text.trim().split(/[\\s|,()[\\]]+/)\n const last = (tokens[tokens.length - 1] ?? '').replace(/^[^a-z0-9]+/i, '')\n if (!last || last !== last.toLowerCase()) return false\n const stem = lettersOf(last.split('.')[0])\n return stem.length >= MIN_HOST_FRAGMENT && labelsOf(id).some((l) => l.startsWith(stem))\n}\n\n/** Occurrences of `needle` in `hay`, resuming `step` chars after each match (default: no overlap). */\nfunction occurrences(hay: string, needle: string, step = needle.length): number {\n let n = 0\n for (let i = hay.indexOf(needle); i !== -1; i = hay.indexOf(needle, i + step)) n++\n return n\n}\n\n/**\n * The brand's letters appear more often than its words: \"SSO Shkosh\" for \"SS\n * Oshkosh\", \"Moore Canine Collc\". Counted, not just tested, so a correctly\n * spelled suffix can't vouch for a respelled lead (\"About SSO Shkosh\n * Apartments | SS Oshkosh Apartments\").\n */\nfunction respellsBrand(text: string, id: MetaIdentity): boolean {\n const letters = lettersOf(text)\n const words = wordsOf(text)\n return nameVariants(id).some((v) => {\n const vl = lettersOf(v)\n if (vl.length < MIN_NAME_LETTERS) return false\n // Word matches are space-padded; resume on the trailing space so two\n // adjacent occurrences can share it.\n const vw = wordsOf(v)\n return occurrences(letters, vl) > occurrences(words, vw, vw.length - 1)\n })\n}\n\n/** A word glued from the host label that isn't how the brand is written: \"TallPinesGB\", \"Westbrookegb\". */\nfunction gluesHostLabel(text: string, id: MetaIdentity): boolean {\n const variants = nameVariants(id)\n if (!variants.length) return false\n const labels = labelsOf(id)\n return text.split(/[\\s|,()[\\]:;]+/).some((token) => {\n const tl = lettersOf(token)\n return (\n tl.length >= MIN_NAME_LETTERS &&\n labels.includes(tl) &&\n !variants.some((v) => wordsOf(v).includes(wordsOf(token)))\n )\n })\n}\n\n/**\n * Why a title's brand suffix (the part after the last \" | \") can't ship, or\n * null when it can. Exposed so a generator can replace a bad suffix with the\n * real brand instead of discarding the whole title.\n */\nexport function suffixProblem(suffix: string, id: MetaIdentity): SuffixProblem | null {\n const s = suffix.trim()\n if (!s) return null\n if (namesHost(s, id) || endsOnTruncatedHost(s, id)) return 'hostname'\n const variants = nameVariants(id)\n if (!variants.length) return null\n if (respellsBrand(s, id) || gluesHostLabel(s, id)) return 'mangled-brand'\n // One glued token spelled from the host label rather than the brand:\n // \"TruePower\" for True Power Systems (truepowersystems.com). Spaced words\n // that read the label (\"Legacy Clay Classic\" for legacyclayclassic.org) are\n // a name, and a whole-word shortening of the brand (\"Celebrity\" for\n // Celebrity Closet Guys, \"The Gateway Flats\" for Gateway Flats) is the brand.\n if (/\\s/.test(s)) return null\n const sl = lettersOf(s)\n const fromLabel = sl.length >= MIN_NAME_LETTERS && labelsOf(id).some((l) => l.startsWith(sl))\n const sw = wordsOf(brandCore(s))\n const isBrand = variants.some((v) => {\n const vw = wordsOf(brandCore(v))\n return vw.startsWith(sw) || sw.startsWith(vw)\n })\n return fromLabel && !isBrand ? 'mangled-brand' : null\n}\n\nfunction isPlaceholder(title: string, path?: string | null): boolean {\n const t = title.trim()\n if (!path) return false\n const strip = (s: string) => s.replace(/\\/+$/, '') || '/'\n if (t.startsWith('/') && strip(t.toLowerCase()) === strip(path.trim().toLowerCase())) return true\n return strip(path.trim()) === '/' && /^(home|index|untitled)$/i.test(t)\n}\n\n/** Why a managed title can't ship, or null when it can. */\nexport function titleProblem(\n title: string | null | undefined,\n id: MetaIdentity,\n opts: { path?: string | null } = {},\n): TitleProblem | null {\n const t = (title ?? '').trim()\n if (!t) return 'empty'\n if (isPlaceholder(t, opts.path)) return 'placeholder'\n if (DANGLING_TAIL.test(t)) return 'dangling-separator'\n if (namesHost(t, id) || endsOnTruncatedHost(t, id)) return 'hostname'\n const suffix = titleSuffix(t)\n if (suffix !== null) {\n const problem = suffixProblem(suffix, id)\n if (problem) return problem\n }\n if (respellsBrand(t, id) || gluesHostLabel(t, id)) return 'mangled-brand'\n return null\n}\n\n/** Why a managed meta description can't ship, or null when it can. */\nexport function descriptionProblem(\n description: string | null | undefined,\n id: MetaIdentity,\n): DescriptionProblem | null {\n const d = (description ?? '').trim()\n if (!d) return 'empty'\n if (namesHost(d, id)) return 'hostname'\n if (respellsBrand(d, id) || gluesHostLabel(d, id)) return 'mangled-brand'\n if (DANGLING_TAIL.test(d) || TRAILING_FUNCTION_WORD.test(d)) return 'truncated'\n return null\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveFetch } from './chunk-BQP6JIE2.mjs';
|
|
2
|
+
import { SITE_KIT_VERSION } from './chunk-HRMGITUZ.mjs';
|
|
2
3
|
import 'server-only';
|
|
3
4
|
|
|
4
5
|
var MINT_PATH = "/api/public/site-token";
|
|
@@ -35,13 +36,6 @@ function failClosed(reason, rawKey, now) {
|
|
|
35
36
|
`site-kit: could not mint a site token (${reason}). Refusing to publish the raw SONOR_API_KEY in page HTML, so this build fails instead. Check that the mint endpoint is reachable and the key is valid, then rebuild. To ship anyway \u2014 which publishes the project secret in public HTML \u2014 set SONOR_SITE_TOKEN_FALLBACK=raw.`
|
|
36
37
|
);
|
|
37
38
|
}
|
|
38
|
-
function resolveFetch() {
|
|
39
|
-
const current = globalThis.fetch;
|
|
40
|
-
if (!current) throw new Error("site-kit: global fetch is unavailable");
|
|
41
|
-
const original = current._nextOriginalFetch;
|
|
42
|
-
if (typeof original === "function") return { fn: original, unpatched: true };
|
|
43
|
-
return { fn: current, unpatched: false };
|
|
44
|
-
}
|
|
45
39
|
function isFrameworkSignal(err) {
|
|
46
40
|
if (!err || typeof err !== "object") return false;
|
|
47
41
|
const e = err;
|
|
@@ -130,5 +124,5 @@ async function mintWithRetry(rawKey, apiUrl) {
|
|
|
130
124
|
}
|
|
131
125
|
|
|
132
126
|
export { resolveClientCredential };
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
134
|
-
//# sourceMappingURL=chunk-
|
|
127
|
+
//# sourceMappingURL=chunk-N2NZBPQ5.mjs.map
|
|
128
|
+
//# sourceMappingURL=chunk-N2NZBPQ5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/mint-site-token.ts"],"names":[],"mappings":"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","file":"chunk-N2NZBPQ5.mjs","sourcesContent":["/**\n * @sonordev/site-kit/server — Client-token minting (server-only)\n *\n * SiteKitLayout holds the raw `SONOR_API_KEY` server-side but must NOT ship it to\n * the browser. This mints a short-lived, project-scoped token (server-to-server,\n * authenticated with the raw key, no browser Origin so it passes domain-binding)\n * and returns THAT for the layout to inject instead.\n *\n * `import 'server-only'` makes importing this into a client bundle a hard build\n * error — the raw key stays on the server.\n *\n * FAILS CLOSED. If minting genuinely fails, this throws and the build fails —\n * it does NOT publish the raw key. A failed deploy is loud and recoverable; a\n * leaked project secret in public HTML is neither. The only paths that still\n * return the raw key are a 404 (an older API that predates the endpoint, an\n * expected state during rollout) and the explicit `SONOR_SITE_TOKEN_FALLBACK=raw`\n * escape hatch, for when shipping beats being blocked.\n *\n * That posture is not academic. Through 3.5.0 a throttled mint (HTTP 429)\n * returned the raw key AND cached it for 60s, so every page rendered in that\n * window shipped the secret: one real build came out with 180 of 272 prerendered\n * pages carrying it. The build \"succeeded\" and nothing downstream noticed.\n * Rate limiting is transient by definition — the fix is to wait and retry, not\n * to downgrade to publishing the key.\n *\n * Two things keep the request count low enough that throttling is rare:\n * - a module-level memo, so a worker mints once and every page reuses the seed;\n * - an in-flight map, because that memo is only populated AFTER the await. Next\n * renders pages concurrently, so without coalescing the first N concurrent\n * renders in a process all miss the cache and all fire a request — a\n * stampede per worker, multiplied by one worker per core. That is how a\n * single site exhausted a 60/min budget.\n *\n * SEED FRESHNESS: a static page's seed carries `iat` = build time, and the API\n * refuses to refresh a seed older than SITE_TOKEN_MAX_REFRESH_AGE_SECONDS\n * (sonor-api common/site-auth/site-token.util.ts — currently 400 days, raised\n * from 30 alongside this fix). A site not rebuilt within that window serves a\n * seed the client cannot refresh, and its forms/analytics/engage start failing\n * for new visitors. Keep that limit comfortably longer than the fleet's\n * realistic redeploy gap; marketing sites routinely go many months untouched.\n */\nimport 'server-only'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport { resolveFetch } from '../shared/fresh-fetch'\n\n// Re-exported for this module's unit tests; the helper lives in shared/fresh-fetch.\nexport { resolveFetch }\n\nconst MINT_PATH = '/api/public/site-token'\nconst MINT_TIMEOUT_MS = 4_000\nconst SITE_TOKEN_PREFIX = 'st1.'\n\n/**\n * Retry budget for transient failures (429 / 5xx / network). Rate limiting is\n * measured per minute, so a few seconds of backoff clears it; the whole ladder\n * costs at most ~20s once per build worker, and only when something is wrong.\n */\nconst MINT_MAX_ATTEMPTS = 4\nconst MINT_BACKOFF_BASE_MS = 500\nconst MINT_BACKOFF_CAP_MS = 8_000\n\ninterface CacheEntry {\n credential: string\n expiresAt: number\n}\nconst cache = new Map<string, CacheEntry>()\n\n/**\n * Requests already in flight, keyed by raw key. The `cache` above is only\n * written after the response lands, so concurrent renders would otherwise each\n * start their own mint. See the module header.\n */\nconst inflight = new Map<string, Promise<string>>()\n\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms))\n\n/**\n * Honour `Retry-After` when the server sends it (delta-seconds or HTTP date),\n * otherwise exponential backoff. Capped so a misconfigured server cannot stall\n * a build indefinitely.\n */\nfunction retryDelayMs(res: Response | null, attempt: number): number {\n const header = res?.headers?.get?.('retry-after')\n if (header) {\n const seconds = Number(header)\n const ms = Number.isFinite(seconds)\n ? seconds * 1000\n : Date.parse(header) - Date.now()\n if (Number.isFinite(ms) && ms > 0) return Math.min(ms, MINT_BACKOFF_CAP_MS)\n }\n return Math.min(MINT_BACKOFF_BASE_MS * 2 ** attempt, MINT_BACKOFF_CAP_MS)\n}\n\n/** 429 and 5xx are transient; waiting is the correct response to both. */\nconst isRetryableStatus = (status: number) => status === 429 || status >= 500\n\n/**\n * The escape hatch, for when a broken mint must not block a release. Opt-in and\n * loud: it re-enables publishing the project secret in page HTML.\n */\nfunction rawFallbackAllowed(): boolean {\n return (\n typeof process !== 'undefined' &&\n process.env?.SONOR_SITE_TOKEN_FALLBACK === 'raw'\n )\n}\n\nfunction failClosed(reason: string, rawKey: string, now: number): string {\n if (rawFallbackAllowed()) {\n console.warn(\n `[SiteKitLayout] Token mint failed (${reason}) and SONOR_SITE_TOKEN_FALLBACK=raw is set; ` +\n 'injecting the RAW API KEY into page HTML. The key is publicly readable wherever ' +\n 'this page is served — unset the escape hatch once the mint is healthy.',\n )\n cache.set(rawKey, { credential: rawKey, expiresAt: now + 60_000 })\n return rawKey\n }\n throw new Error(\n `site-kit: could not mint a site token (${reason}). Refusing to publish the raw ` +\n 'SONOR_API_KEY in page HTML, so this build fails instead. Check that the mint ' +\n 'endpoint is reachable and the key is valid, then rebuild. To ship anyway — ' +\n 'which publishes the project secret in public HTML — set SONOR_SITE_TOKEN_FALLBACK=raw.',\n )\n}\n\n/*\n * The mint uses Next's saved original fetch (resolveFetch, shared/fresh-fetch.ts,\n * which documents why). A credential is not page data: `cache: 'no-store'` would\n * bail a static route before the request goes out (verified on Next 16.2.9: the\n * mint endpoint received zero requests for a static build, and every page\n * shipped the raw key), and a Data Cache entry would let a fresh deploy re-bake a\n * months-old seed. The module-level memo above is the only cache we want: one\n * mint per build process, and a build-fresh seed on every deploy.\n */\n\n/**\n * Next signals \"this render must go dynamic\" by THROWING (DynamicServerError,\n * static-gen bailout, redirect/notFound digests, React's postpone). Those are\n * the framework's control flow, not a mint failure. Swallowing one makes Next\n * believe the render succeeded statically — which is precisely how the raw key\n * ended up stranded in prerendered HTML with no error anywhere. Let them\n * propagate; only real network/HTTP failures fall back to the raw key.\n *\n * @internal Exported for unit tests; not part of the package's public API.\n */\nexport function isFrameworkSignal(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false\n const e = err as { digest?: unknown; code?: unknown; $$typeof?: unknown }\n if (e.digest === 'DYNAMIC_SERVER_USAGE') return true\n if (e.code === 'NEXT_STATIC_GEN_BAILOUT') return true\n if (typeof e.digest === 'string' && e.digest.startsWith('NEXT_')) return true\n if (e.$$typeof === Symbol.for('react.postpone')) return true\n return false\n}\n\nexport async function resolveClientCredential(\n rawKey: string,\n apiUrl: string,\n): Promise<string> {\n if (!rawKey) return ''\n // Env should hold a raw key; if it already looks like a token, pass it through.\n if (rawKey.startsWith(SITE_TOKEN_PREFIX)) return rawKey\n\n const cached = cache.get(rawKey)\n if (cached && cached.expiresAt > Date.now()) return cached.credential\n\n // Collapse concurrent renders onto one request rather than a stampede.\n const pending = inflight.get(rawKey)\n if (pending) return pending\n\n const request = mintWithRetry(rawKey, apiUrl)\n inflight.set(rawKey, request)\n try {\n return await request\n } finally {\n inflight.delete(rawKey)\n }\n}\n\nasync function mintWithRetry(rawKey: string, apiUrl: string): Promise<string> {\n const base = (apiUrl || 'https://api.sonor.io').replace(/\\/+$/, '')\n let lastReason = 'unknown error'\n\n for (let attempt = 0; attempt < MINT_MAX_ATTEMPTS; attempt++) {\n let res: Response | null = null\n try {\n const { fn: fetchFn, unpatched } = resolveFetch()\n res = await fetchFn(`${base}${MINT_PATH}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': rawKey,\n 'x-sitekit-version': SITE_KIT_VERSION,\n },\n // Only meaningful on the fallback path, where a future Next stopped\n // exposing `_nextOriginalFetch` and we're back on the patched fetch.\n // `revalidate: false` is the one setting that neither bails out of static\n // generation nor downgrades the route to ISR; a Data Cache entry is the\n // lesser evil versus shipping the raw key again.\n ...(unpatched ? {} : ({ next: { revalidate: false } } as RequestInit)),\n signal:\n typeof AbortSignal !== 'undefined' && AbortSignal.timeout\n ? AbortSignal.timeout(MINT_TIMEOUT_MS)\n : undefined,\n })\n } catch (err) {\n // Never swallow the framework's own control flow — see isFrameworkSignal.\n if (isFrameworkSignal(err)) throw err\n lastReason = err instanceof Error ? err.message : 'network error'\n if (attempt < MINT_MAX_ATTEMPTS - 1) {\n await sleep(retryDelayMs(null, attempt))\n continue\n }\n break\n }\n\n if (res.ok) {\n const data: any = await res.json().catch(() => null)\n const token = data?.token\n const expiresIn = typeof data?.expiresIn === 'number' ? data.expiresIn : 3600\n if (typeof token === 'string' && token.startsWith(SITE_TOKEN_PREFIX)) {\n cache.set(rawKey, {\n credential: token,\n expiresAt: Date.now() + Math.min((expiresIn * 1000) / 2, 30 * 60_000),\n })\n return token\n }\n lastReason = 'mint returned no usable token'\n break\n }\n\n // 404 = an API older than the endpoint. Expected during rollout, and the raw\n // key is exactly what such an API still expects, so this stays a fallback\n // rather than a build failure.\n if (res.status === 404) {\n cache.set(rawKey, { credential: rawKey, expiresAt: Date.now() + 60_000 })\n return rawKey\n }\n\n lastReason = `HTTP ${res.status}`\n if (isRetryableStatus(res.status) && attempt < MINT_MAX_ATTEMPTS - 1) {\n const delay = retryDelayMs(res, attempt)\n console.warn(\n `[SiteKitLayout] Token mint returned ${res.status}; retrying in ${Math.round(delay)}ms ` +\n `(attempt ${attempt + 2}/${MINT_MAX_ATTEMPTS}).`,\n )\n await sleep(delay)\n continue\n }\n break\n }\n\n return failClosed(lastReason, rawKey, Date.now())\n}\n"]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/robots/next-internals.ts
|
|
4
|
+
var NEXT_INTERNALS_PATH = /^\/?_next(?:[/*?$]|$)/;
|
|
5
|
+
function isNextInternalsPath(path) {
|
|
6
|
+
return NEXT_INTERNALS_PATH.test(path.trim());
|
|
7
|
+
}
|
|
8
|
+
var warned = /* @__PURE__ */ new Set();
|
|
9
|
+
function warnDropped(paths) {
|
|
10
|
+
for (const p of paths) {
|
|
11
|
+
if (warned.has(p)) continue;
|
|
12
|
+
warned.add(p);
|
|
13
|
+
console.warn(
|
|
14
|
+
`[site-kit/robots] Dropped "Disallow: ${p}". Googlebot needs /_next/ to render pages and index images.`
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function stripNextInternals(paths) {
|
|
19
|
+
if (paths === void 0) return void 0;
|
|
20
|
+
const list2 = Array.isArray(paths) ? paths : [paths];
|
|
21
|
+
const dropped = list2.filter(isNextInternalsPath);
|
|
22
|
+
if (dropped.length === 0) return paths;
|
|
23
|
+
warnDropped(dropped);
|
|
24
|
+
const kept = list2.filter((p) => !isNextInternalsPath(p));
|
|
25
|
+
if (kept.length === 0) return void 0;
|
|
26
|
+
return Array.isArray(paths) ? kept : kept[0];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// src/llms/aiRobots.ts
|
|
30
|
+
var AI_RETRIEVAL_CRAWLERS = [
|
|
31
|
+
"OAI-SearchBot",
|
|
32
|
+
"ChatGPT-User",
|
|
33
|
+
"Claude-SearchBot",
|
|
34
|
+
"Claude-User",
|
|
35
|
+
"PerplexityBot",
|
|
36
|
+
"Perplexity-User",
|
|
37
|
+
"GoogleOther",
|
|
38
|
+
"Applebot",
|
|
39
|
+
"DuckAssistBot",
|
|
40
|
+
"MistralAI-User",
|
|
41
|
+
"YouBot"
|
|
42
|
+
];
|
|
43
|
+
var AI_TRAINING_CRAWLERS = [
|
|
44
|
+
"GPTBot",
|
|
45
|
+
"ClaudeBot",
|
|
46
|
+
"Google-Extended",
|
|
47
|
+
"Applebot-Extended",
|
|
48
|
+
"Meta-ExternalAgent",
|
|
49
|
+
"FacebookBot",
|
|
50
|
+
"CCBot",
|
|
51
|
+
"Bytespider",
|
|
52
|
+
"cohere-ai",
|
|
53
|
+
"MistralBot",
|
|
54
|
+
"Amazonbot"
|
|
55
|
+
];
|
|
56
|
+
function buildAiCrawlerRules(options = {}) {
|
|
57
|
+
const { allow = "/", training = "allow" } = options;
|
|
58
|
+
const disallow = stripNextInternals(options.disallow);
|
|
59
|
+
const retrieval = AI_RETRIEVAL_CRAWLERS.map((userAgent) => ({
|
|
60
|
+
userAgent,
|
|
61
|
+
allow,
|
|
62
|
+
...disallow ? { disallow } : {}
|
|
63
|
+
}));
|
|
64
|
+
const trainingRules = AI_TRAINING_CRAWLERS.map(
|
|
65
|
+
(userAgent) => training === "block" ? { userAgent, disallow: "/" } : { userAgent, allow, ...disallow ? { disallow } : {} }
|
|
66
|
+
);
|
|
67
|
+
return [...retrieval, ...trainingRules];
|
|
68
|
+
}
|
|
69
|
+
var yn = (v) => v ? "yes" : "no";
|
|
70
|
+
function formatContentSignals(options = {}) {
|
|
71
|
+
const { search = true, aiInput = true, aiTrain = true } = options;
|
|
72
|
+
return [
|
|
73
|
+
"# Content Signals Policy (https://contentsignals.org): usage preferences",
|
|
74
|
+
"# for this site\u2019s content. Declarative \u2014 a preference, not enforcement.",
|
|
75
|
+
`Content-Signal: search=${yn(search)}, ai-input=${yn(aiInput)}, ai-train=${yn(aiTrain)}`
|
|
76
|
+
].join("\n");
|
|
77
|
+
}
|
|
78
|
+
var list = (v) => v === void 0 ? [] : Array.isArray(v) ? v : [v];
|
|
79
|
+
function createRobotsTxtHandler(options) {
|
|
80
|
+
const { rules, contentSignals, sitemap, host } = options;
|
|
81
|
+
const blocks = [];
|
|
82
|
+
if (contentSignals) blocks.push(formatContentSignals(contentSignals));
|
|
83
|
+
for (const rule of rules) {
|
|
84
|
+
const lines = [`User-Agent: ${rule.userAgent}`];
|
|
85
|
+
for (const p of list(rule.allow)) lines.push(`Allow: ${p}`);
|
|
86
|
+
for (const p of list(stripNextInternals(rule.disallow))) lines.push(`Disallow: ${p}`);
|
|
87
|
+
blocks.push(lines.join("\n"));
|
|
88
|
+
}
|
|
89
|
+
const tail = [];
|
|
90
|
+
for (const s of list(sitemap)) tail.push(`Sitemap: ${s}`);
|
|
91
|
+
if (host) tail.push(`Host: ${host}`);
|
|
92
|
+
if (tail.length) blocks.push(tail.join("\n"));
|
|
93
|
+
const body = `${blocks.join("\n\n")}
|
|
94
|
+
`;
|
|
95
|
+
return async function GET() {
|
|
96
|
+
return new Response(body, {
|
|
97
|
+
status: 200,
|
|
98
|
+
headers: {
|
|
99
|
+
"Content-Type": "text/plain; charset=utf-8",
|
|
100
|
+
"Cache-Control": "public, max-age=3600, s-maxage=86400"
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
exports.AI_RETRIEVAL_CRAWLERS = AI_RETRIEVAL_CRAWLERS;
|
|
107
|
+
exports.AI_TRAINING_CRAWLERS = AI_TRAINING_CRAWLERS;
|
|
108
|
+
exports.buildAiCrawlerRules = buildAiCrawlerRules;
|
|
109
|
+
exports.createRobotsTxtHandler = createRobotsTxtHandler;
|
|
110
|
+
exports.formatContentSignals = formatContentSignals;
|
|
111
|
+
exports.isNextInternalsPath = isNextInternalsPath;
|
|
112
|
+
exports.stripNextInternals = stripNextInternals;
|
|
113
|
+
//# sourceMappingURL=chunk-NRBITVDK.js.map
|
|
114
|
+
//# sourceMappingURL=chunk-NRBITVDK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/robots/next-internals.ts","../src/llms/aiRobots.ts"],"names":["list"],"mappings":"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","file":"chunk-NRBITVDK.js","sourcesContent":["/**\n * Keeps `/_next/` out of every robots.txt site-kit emits.\n *\n * Googlebot renders pages with the CSS, JS chunks and optimized images Next\n * serves from `/_next/`, and `/_next/image` is how a site's photos reach\n * Google Images. A `Disallow: /_next/` makes Google judge an unstyled,\n * image-less page, and a 2026-09 fleet sweep found it on ten sites. Sites\n * passed it in by hand, so the builders drop it on the way out rather than\n * trusting callers to leave it off.\n *\n * Single source of truth for that rule — used by `createRobots`\n * (`robots/index.ts`) and by `buildAiCrawlerRules` + `createRobotsTxtHandler`\n * (`llms/aiRobots.ts`). Route any new robots builder through it.\n */\n\n// `/_next`, `/_next/`, `/_next/*`, `/_next/static/`, `/_next/image`, `/_next$`,\n// and the slashless `_next/` typo. `/_nextjs-docs/` is a real path; leave it.\nconst NEXT_INTERNALS_PATH = /^\\/?_next(?:[/*?$]|$)/\n\nexport function isNextInternalsPath(path: string): boolean {\n return NEXT_INTERNALS_PATH.test(path.trim())\n}\n\nconst warned = new Set<string>()\n\nfunction warnDropped(paths: string[]): void {\n for (const p of paths) {\n if (warned.has(p)) continue\n warned.add(p)\n console.warn(\n `[site-kit/robots] Dropped \"Disallow: ${p}\". Googlebot needs /_next/ to render pages and index images.`,\n )\n }\n}\n\n/**\n * Removes `/_next` paths from a disallow list, keeping its shape: returns the\n * input untouched when there is nothing to drop, and `undefined` when nothing\n * is left.\n */\nexport function stripNextInternals(\n paths: string | string[] | undefined,\n): string | string[] | undefined {\n if (paths === undefined) return undefined\n const list = Array.isArray(paths) ? paths : [paths]\n const dropped = list.filter(isNextInternalsPath)\n if (dropped.length === 0) return paths\n warnDropped(dropped)\n const kept = list.filter((p) => !isNextInternalsPath(p))\n if (kept.length === 0) return undefined\n return Array.isArray(paths) ? kept : kept[0]\n}\n","/**\n * @sonordev/site-kit/llms — AI crawler robots policy\n *\n * 2026 practice separates AI RETRIEVAL crawlers (they fetch pages to answer\n * live queries and cite the source — visibility with attribution) from AI\n * TRAINING crawlers (they ingest content into future model weights). A site\n * can welcome one and decline the other. This module provides:\n *\n * - Curated user-agent lists for both classes (keep current with vendor docs)\n * - buildAiCrawlerRules(): rules for Next's MetadataRoute robots convention\n * - formatContentSignals(): the Cloudflare Content Signals Policy directive\n * (search / ai-input / ai-train) — declarative, not enforcement, and NOT\n * expressible through Next's robots.js convention (it drops unknown\n * directives), hence:\n * - createRobotsTxtHandler(): a plain-text robots.txt route handler for\n * sites that want Content-Signal lines in the emitted file.\n *\n * Every builder here drops `/_next` disallow paths (see\n * robots/next-internals.ts): Googlebot needs them to render pages.\n *\n * Canonical import: `@sonordev/site-kit/llms`. `@sonordev/site-kit/robots`\n * re-exports the same functions, because that's where people look for them.\n * Same code either way; the lists live here once.\n */\n\nimport { stripNextInternals } from '../robots/next-internals'\n\n/**\n * Retrieval/search agents — fetch on demand or index for AI search, cite sources.\n *\n * MistralAI-User (Le Chat fetching a page for a user) and YouBot (You.com's\n * search index) were added 2026-09-15: vsf-consulting-nextjs named them in\n * its own robots.txt and had to keep a NOT_YET_IN_KIT list beside this one.\n */\nexport const AI_RETRIEVAL_CRAWLERS = [\n 'OAI-SearchBot',\n 'ChatGPT-User',\n 'Claude-SearchBot',\n 'Claude-User',\n 'PerplexityBot',\n 'Perplexity-User',\n 'GoogleOther',\n 'Applebot',\n 'DuckAssistBot',\n 'MistralAI-User',\n 'YouBot',\n] as const\n\n/**\n * Training crawlers — content may enter future model training corpora.\n *\n * Amazonbot is here rather than in retrieval: Amazon says what it collects\n * may be used to train its AI models, so `training: 'block'` has to cover it.\n * It also feeds Alexa answers, which is the cost of blocking it.\n */\nexport const AI_TRAINING_CRAWLERS = [\n 'GPTBot',\n 'ClaudeBot',\n 'Google-Extended',\n 'Applebot-Extended',\n 'Meta-ExternalAgent',\n 'FacebookBot',\n 'CCBot',\n 'Bytespider',\n 'cohere-ai',\n 'MistralBot',\n 'Amazonbot',\n] as const\n\nexport interface AiCrawlerRulesOptions {\n /** Paths every AI crawler may fetch (default: everything). */\n allow?: string | string[]\n /** Paths withheld from every AI crawler (default: none). `/_next` paths are dropped. */\n disallow?: string | string[]\n /**\n * Policy for TRAINING crawlers. 'allow' (default) welcomes them — the\n * visibility-maximalist choice for marketing sites that WANT to be in\n * model knowledge. 'block' opts out of training while retrieval crawlers\n * stay welcome, so the site is still cited in AI answers.\n */\n training?: 'allow' | 'block'\n}\n\ninterface RobotsRule {\n userAgent: string\n allow?: string | string[]\n disallow?: string | string[]\n}\n\n/**\n * Rules for Next's MetadataRoute robots convention (app/robots.(js|ts)).\n * Spread into your existing rules array; order relative to your own rules\n * does not matter (robots matching is per-user-agent, most-specific wins).\n */\nexport function buildAiCrawlerRules(\n options: AiCrawlerRulesOptions = {},\n): RobotsRule[] {\n const { allow = '/', training = 'allow' } = options\n const disallow = stripNextInternals(options.disallow)\n const retrieval: RobotsRule[] = AI_RETRIEVAL_CRAWLERS.map((userAgent) => ({\n userAgent,\n allow,\n ...(disallow ? { disallow } : {}),\n }))\n const trainingRules: RobotsRule[] = AI_TRAINING_CRAWLERS.map((userAgent) =>\n training === 'block'\n ? { userAgent, disallow: '/' }\n : { userAgent, allow, ...(disallow ? { disallow } : {}) },\n )\n return [...retrieval, ...trainingRules]\n}\n\nexport interface ContentSignalsOptions {\n /** May the content be indexed for classic search? Default true. */\n search?: boolean\n /** May the content feed a live AI answer (RAG/grounding)? Default true. */\n aiInput?: boolean\n /** May the content train future models? Default true. */\n aiTrain?: boolean\n}\n\nconst yn = (v: boolean) => (v ? 'yes' : 'no')\n\n/**\n * The Cloudflare Content Signals Policy block for robots.txt — a preferences\n * declaration (the IETF AIPREF group is standardizing the same concepts).\n * Emit near the top of the file, before user-agent groups.\n */\nexport function formatContentSignals(\n options: ContentSignalsOptions = {},\n): string {\n const { search = true, aiInput = true, aiTrain = true } = options\n return [\n '# Content Signals Policy (https://contentsignals.org): usage preferences',\n '# for this site’s content. Declarative — a preference, not enforcement.',\n `Content-Signal: search=${yn(search)}, ai-input=${yn(aiInput)}, ai-train=${yn(aiTrain)}`,\n ].join('\\n')\n}\n\nexport interface RobotsTxtHandlerOptions {\n /** Robots rules (same shape as MetadataRoute robots rules). */\n rules: RobotsRule[]\n /** Content Signals preferences; omit to skip the block entirely. */\n contentSignals?: ContentSignalsOptions\n /** Absolute sitemap URL(s). */\n sitemap?: string | string[]\n /** Preferred host (emitted as Host:). */\n host?: string\n}\n\nconst list = (v: string | string[] | undefined): string[] =>\n v === undefined ? [] : Array.isArray(v) ? v : [v]\n\n/**\n * Plain-text robots.txt route handler (app/robots.txt/route.ts) for sites\n * that want Content-Signal lines — Next's MetadataRoute robots convention\n * cannot emit them. Drop-in:\n *\n * import { createRobotsTxtHandler, buildAiCrawlerRules } from '@sonordev/site-kit/llms'\n * export const GET = createRobotsTxtHandler({\n * rules: [{ userAgent: '*', allow: '/' }, ...buildAiCrawlerRules()],\n * contentSignals: { search: true, aiInput: true, aiTrain: true },\n * sitemap: 'https://example.com/sitemap.xml',\n * })\n */\nexport function createRobotsTxtHandler(options: RobotsTxtHandlerOptions) {\n const { rules, contentSignals, sitemap, host } = options\n const blocks: string[] = []\n if (contentSignals) blocks.push(formatContentSignals(contentSignals))\n for (const rule of rules) {\n const lines = [`User-Agent: ${rule.userAgent}`]\n for (const p of list(rule.allow)) lines.push(`Allow: ${p}`)\n for (const p of list(stripNextInternals(rule.disallow))) lines.push(`Disallow: ${p}`)\n blocks.push(lines.join('\\n'))\n }\n const tail: string[] = []\n for (const s of list(sitemap)) tail.push(`Sitemap: ${s}`)\n if (host) tail.push(`Host: ${host}`)\n if (tail.length) blocks.push(tail.join('\\n'))\n const body = `${blocks.join('\\n\\n')}\\n`\n\n return async function GET(): Promise<Response> {\n return new Response(body, {\n status: 200,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': 'public, max-age=3600, s-maxage=86400',\n },\n })\n }\n}\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { registerAnalyticsDispatcher } from './chunk-SHLWA6JY.mjs';
|
|
3
3
|
import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-ZZQAGCSI.mjs';
|
|
4
|
+
import { onPageLeave } from './chunk-5SANRSX3.mjs';
|
|
4
5
|
import { resolveAnalyticsTarget } from './chunk-A6UYV475.mjs';
|
|
5
|
-
import { sonorFetch, sonorBeacon } from './chunk-
|
|
6
|
+
import { sonorFetch, sonorBeacon } from './chunk-7THZOAUR.mjs';
|
|
6
7
|
import { createContext, useRef, useEffect, useState, useMemo, useCallback, useContext } from 'react';
|
|
7
8
|
import { usePathname } from 'next/navigation';
|
|
8
9
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -873,16 +874,10 @@ function AnalyticsProvider({
|
|
|
873
874
|
hasTracked = false;
|
|
874
875
|
window.addEventListener("scroll", handleScroll, { passive: true });
|
|
875
876
|
handleScroll();
|
|
876
|
-
const
|
|
877
|
-
const handleVisibilityChange = () => {
|
|
878
|
-
if (document.visibilityState === "hidden") sendScrollData(true);
|
|
879
|
-
};
|
|
880
|
-
window.addEventListener("pagehide", handlePageHide);
|
|
881
|
-
document.addEventListener("visibilitychange", handleVisibilityChange);
|
|
877
|
+
const stopLeaveListener = onPageLeave(() => sendScrollData(true));
|
|
882
878
|
return () => {
|
|
883
879
|
window.removeEventListener("scroll", handleScroll);
|
|
884
|
-
|
|
885
|
-
document.removeEventListener("visibilitychange", handleVisibilityChange);
|
|
880
|
+
stopLeaveListener();
|
|
886
881
|
sendScrollData(false);
|
|
887
882
|
};
|
|
888
883
|
}, [pathname, gate, trackScrollDepth, debug]);
|
|
@@ -1017,5 +1012,5 @@ function useTrackEvent() {
|
|
|
1017
1012
|
}
|
|
1018
1013
|
|
|
1019
1014
|
export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent };
|
|
1020
|
-
//# sourceMappingURL=chunk-
|
|
1021
|
-
//# sourceMappingURL=chunk-
|
|
1015
|
+
//# sourceMappingURL=chunk-O4YBWJHP.mjs.map
|
|
1016
|
+
//# sourceMappingURL=chunk-O4YBWJHP.mjs.map
|