@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
package/dist/cli/index.js
CHANGED
|
@@ -3,15 +3,17 @@
|
|
|
3
3
|
|
|
4
4
|
var chunkJS75ORH7_js = require('../chunk-JS75ORH7.js');
|
|
5
5
|
var chunkI7AZC5ZQ_js = require('../chunk-I7AZC5ZQ.js');
|
|
6
|
-
var
|
|
6
|
+
var chunkOEW2LFOV_js = require('../chunk-OEW2LFOV.js');
|
|
7
|
+
var chunkCUNZAD46_js = require('../chunk-CUNZAD46.js');
|
|
7
8
|
var chunkNN2YE5WT_js = require('../chunk-NN2YE5WT.js');
|
|
8
|
-
var
|
|
9
|
-
var
|
|
9
|
+
var chunkSEP5D4MI_js = require('../chunk-SEP5D4MI.js');
|
|
10
|
+
var chunkR7GHP3FY_js = require('../chunk-R7GHP3FY.js');
|
|
11
|
+
var chunk5O7JSWT6_js = require('../chunk-5O7JSWT6.js');
|
|
10
12
|
var chunkSNAQBZPT_js = require('../chunk-SNAQBZPT.js');
|
|
11
13
|
var events = require('events');
|
|
12
14
|
var childProcess = require('child_process');
|
|
13
15
|
var path12 = require('path');
|
|
14
|
-
var
|
|
16
|
+
var fs20 = require('fs');
|
|
15
17
|
var process2 = require('process');
|
|
16
18
|
var util = require('util');
|
|
17
19
|
var os = require('os');
|
|
@@ -49,7 +51,7 @@ function _interopNamespace(e) {
|
|
|
49
51
|
|
|
50
52
|
var childProcess__default = /*#__PURE__*/_interopDefault(childProcess);
|
|
51
53
|
var path12__default = /*#__PURE__*/_interopDefault(path12);
|
|
52
|
-
var
|
|
54
|
+
var fs20__namespace = /*#__PURE__*/_interopNamespace(fs20);
|
|
53
55
|
var process2__default = /*#__PURE__*/_interopDefault(process2);
|
|
54
56
|
var os__default = /*#__PURE__*/_interopDefault(os);
|
|
55
57
|
var tty__default = /*#__PURE__*/_interopDefault(tty);
|
|
@@ -6234,10 +6236,10 @@ var require_lib2 = chunkSNAQBZPT_js.__commonJS({
|
|
|
6234
6236
|
exports.analyse = analyse;
|
|
6235
6237
|
var detectFile = (filepath, opts = {}) => new Promise((resolve, reject) => {
|
|
6236
6238
|
let fd;
|
|
6237
|
-
const
|
|
6239
|
+
const fs31 = (0, node_1.default)();
|
|
6238
6240
|
const handler = (err, buffer) => {
|
|
6239
6241
|
if (fd) {
|
|
6240
|
-
|
|
6242
|
+
fs31.closeSync(fd);
|
|
6241
6243
|
}
|
|
6242
6244
|
if (err) {
|
|
6243
6245
|
reject(err);
|
|
@@ -6249,9 +6251,9 @@ var require_lib2 = chunkSNAQBZPT_js.__commonJS({
|
|
|
6249
6251
|
};
|
|
6250
6252
|
const sampleSize = (opts === null || opts === void 0 ? void 0 : opts.sampleSize) || 0;
|
|
6251
6253
|
if (sampleSize > 0) {
|
|
6252
|
-
fd =
|
|
6254
|
+
fd = fs31.openSync(filepath, "r");
|
|
6253
6255
|
let sample = Buffer.allocUnsafe(sampleSize);
|
|
6254
|
-
|
|
6256
|
+
fs31.read(fd, sample, 0, sampleSize, opts.offset, (err, bytesRead) => {
|
|
6255
6257
|
if (err) {
|
|
6256
6258
|
handler(err, null);
|
|
6257
6259
|
} else {
|
|
@@ -6263,22 +6265,22 @@ var require_lib2 = chunkSNAQBZPT_js.__commonJS({
|
|
|
6263
6265
|
});
|
|
6264
6266
|
return;
|
|
6265
6267
|
}
|
|
6266
|
-
|
|
6268
|
+
fs31.readFile(filepath, handler);
|
|
6267
6269
|
});
|
|
6268
6270
|
exports.detectFile = detectFile;
|
|
6269
6271
|
var detectFileSync = (filepath, opts = {}) => {
|
|
6270
|
-
const
|
|
6272
|
+
const fs31 = (0, node_1.default)();
|
|
6271
6273
|
if (opts && opts.sampleSize) {
|
|
6272
|
-
const fd =
|
|
6274
|
+
const fd = fs31.openSync(filepath, "r");
|
|
6273
6275
|
let sample = Buffer.allocUnsafe(opts.sampleSize);
|
|
6274
|
-
const bytesRead =
|
|
6276
|
+
const bytesRead = fs31.readSync(fd, sample, 0, opts.sampleSize, opts.offset);
|
|
6275
6277
|
if (bytesRead < opts.sampleSize) {
|
|
6276
6278
|
sample = sample.subarray(0, bytesRead);
|
|
6277
6279
|
}
|
|
6278
|
-
|
|
6280
|
+
fs31.closeSync(fd);
|
|
6279
6281
|
return (0, exports.detect)(sample);
|
|
6280
6282
|
}
|
|
6281
|
-
return (0, exports.detect)(
|
|
6283
|
+
return (0, exports.detect)(fs31.readFileSync(filepath));
|
|
6282
6284
|
};
|
|
6283
6285
|
exports.detectFileSync = detectFileSync;
|
|
6284
6286
|
exports.default = {
|
|
@@ -12279,7 +12281,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
12279
12281
|
* @param {string} subcommandName
|
|
12280
12282
|
*/
|
|
12281
12283
|
_checkForMissingExecutable(executableFile, executableDir, subcommandName) {
|
|
12282
|
-
if (
|
|
12284
|
+
if (fs20__namespace.default.existsSync(executableFile)) return;
|
|
12283
12285
|
const executableDirMessage = executableDir ? `searched for local subcommand relative to directory '${executableDir}'` : "no directory for search for local subcommand, use .executableDir() to supply a custom directory";
|
|
12284
12286
|
const executableMissing = `'${executableFile}' does not exist
|
|
12285
12287
|
- if '${subcommandName}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
|
|
@@ -12297,10 +12299,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
12297
12299
|
const sourceExt = [".js", ".ts", ".tsx", ".mjs", ".cjs"];
|
|
12298
12300
|
function findFile(baseDir, baseName) {
|
|
12299
12301
|
const localBin = path12__default.default.resolve(baseDir, baseName);
|
|
12300
|
-
if (
|
|
12302
|
+
if (fs20__namespace.default.existsSync(localBin)) return localBin;
|
|
12301
12303
|
if (sourceExt.includes(path12__default.default.extname(baseName))) return void 0;
|
|
12302
12304
|
const foundExt = sourceExt.find(
|
|
12303
|
-
(ext2) =>
|
|
12305
|
+
(ext2) => fs20__namespace.default.existsSync(`${localBin}${ext2}`)
|
|
12304
12306
|
);
|
|
12305
12307
|
if (foundExt) return `${localBin}${foundExt}`;
|
|
12306
12308
|
return void 0;
|
|
@@ -12312,7 +12314,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
12312
12314
|
if (this._scriptPath) {
|
|
12313
12315
|
let resolvedScriptPath;
|
|
12314
12316
|
try {
|
|
12315
|
-
resolvedScriptPath =
|
|
12317
|
+
resolvedScriptPath = fs20__namespace.default.realpathSync(this._scriptPath);
|
|
12316
12318
|
} catch {
|
|
12317
12319
|
resolvedScriptPath = this._scriptPath;
|
|
12318
12320
|
}
|
|
@@ -13268,9 +13270,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
13268
13270
|
* @param {string} [path]
|
|
13269
13271
|
* @return {(string|null|Command)}
|
|
13270
13272
|
*/
|
|
13271
|
-
executableDir(
|
|
13272
|
-
if (
|
|
13273
|
-
this._executableDir =
|
|
13273
|
+
executableDir(path31) {
|
|
13274
|
+
if (path31 === void 0) return this._executableDir;
|
|
13275
|
+
this._executableDir = path31;
|
|
13274
13276
|
return this;
|
|
13275
13277
|
}
|
|
13276
13278
|
/**
|
|
@@ -13543,7 +13545,7 @@ function buildEnvelope(input, nowMs = Date.now()) {
|
|
|
13543
13545
|
ok: exitCode === 0 /* OK */,
|
|
13544
13546
|
command,
|
|
13545
13547
|
schemaVersion: 1,
|
|
13546
|
-
siteKitVersion:
|
|
13548
|
+
siteKitVersion: chunk5O7JSWT6_js.SITE_KIT_VERSION,
|
|
13547
13549
|
exitCode,
|
|
13548
13550
|
status: statusForCode(exitCode),
|
|
13549
13551
|
summary,
|
|
@@ -19159,7 +19161,7 @@ var ExternalEditor = class {
|
|
|
19159
19161
|
if (!this.tempDir)
|
|
19160
19162
|
return;
|
|
19161
19163
|
try {
|
|
19162
|
-
|
|
19164
|
+
fs20.rmSync(this.tempDir, { force: true, recursive: true });
|
|
19163
19165
|
this.tempFile = "";
|
|
19164
19166
|
this.tempDir = "";
|
|
19165
19167
|
} catch (removeFileError) {
|
|
@@ -19169,7 +19171,7 @@ var ExternalEditor = class {
|
|
|
19169
19171
|
createTempFile() {
|
|
19170
19172
|
try {
|
|
19171
19173
|
const baseDir = path12__default.default.resolve(this.fileOptions.dir ?? os__default.default.tmpdir());
|
|
19172
|
-
this.tempDir =
|
|
19174
|
+
this.tempDir = fs20.mkdtempSync(path12__default.default.join(baseDir, "inquirer-editor-"));
|
|
19173
19175
|
const id = crypto.randomUUID();
|
|
19174
19176
|
const prefix = sanitizeAffix(this.fileOptions.prefix);
|
|
19175
19177
|
const postfix = sanitizeAffix(this.fileOptions.postfix);
|
|
@@ -19179,7 +19181,7 @@ var ExternalEditor = class {
|
|
|
19179
19181
|
if (Object.prototype.hasOwnProperty.call(this.fileOptions, "mode")) {
|
|
19180
19182
|
opt.mode = this.fileOptions.mode;
|
|
19181
19183
|
}
|
|
19182
|
-
|
|
19184
|
+
fs20.writeFileSync(this.tempFile, this.text, opt);
|
|
19183
19185
|
} catch (createFileError) {
|
|
19184
19186
|
throw new CreateFileError(createFileError);
|
|
19185
19187
|
}
|
|
@@ -19189,7 +19191,7 @@ var ExternalEditor = class {
|
|
|
19189
19191
|
}
|
|
19190
19192
|
readTemporaryFile() {
|
|
19191
19193
|
try {
|
|
19192
|
-
const tempFileBuffer =
|
|
19194
|
+
const tempFileBuffer = fs20.readFileSync(this.tempFile);
|
|
19193
19195
|
if (tempFileBuffer.length === 0) {
|
|
19194
19196
|
this.text = "";
|
|
19195
19197
|
} else {
|
|
@@ -20377,9 +20379,9 @@ function observableToAsyncIterable(source) {
|
|
|
20377
20379
|
|
|
20378
20380
|
// node_modules/.pnpm/inquirer@14.0.2_@types+node@26.2.0/node_modules/inquirer/dist/ui/prompt.js
|
|
20379
20381
|
var _ = {
|
|
20380
|
-
set: (obj,
|
|
20382
|
+
set: (obj, path31 = "", value) => {
|
|
20381
20383
|
let pointer = obj;
|
|
20382
|
-
|
|
20384
|
+
path31.split(".").forEach((key, index, arr) => {
|
|
20383
20385
|
if (key === "__proto__" || key === "constructor")
|
|
20384
20386
|
return;
|
|
20385
20387
|
if (index === arr.length - 1) {
|
|
@@ -20390,8 +20392,8 @@ var _ = {
|
|
|
20390
20392
|
pointer = pointer[key];
|
|
20391
20393
|
});
|
|
20392
20394
|
},
|
|
20393
|
-
get: (obj,
|
|
20394
|
-
const travel = (regexp) => String.prototype.split.call(
|
|
20395
|
+
get: (obj, path31 = "", defaultValue) => {
|
|
20396
|
+
const travel = (regexp) => String.prototype.split.call(path31, regexp).filter(Boolean).reduce(
|
|
20395
20397
|
// @ts-expect-error implicit any on res[key]
|
|
20396
20398
|
(res, key) => res == null ? res : res[key],
|
|
20397
20399
|
obj
|
|
@@ -20748,18 +20750,18 @@ function scanForForms(ast, content, filePath) {
|
|
|
20748
20750
|
const forms = [];
|
|
20749
20751
|
content.split("\n");
|
|
20750
20752
|
chunkJS75ORH7_js.traverse(ast, {
|
|
20751
|
-
JSXElement(
|
|
20752
|
-
const opening =
|
|
20753
|
+
JSXElement(path31) {
|
|
20754
|
+
const opening = path31.node.openingElement;
|
|
20753
20755
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && opening.name.name === "form") {
|
|
20754
|
-
const fields = extractFieldsFromForm(
|
|
20756
|
+
const fields = extractFieldsFromForm(path31);
|
|
20755
20757
|
const hasOnSubmit = opening.attributes.some(
|
|
20756
20758
|
(attr) => chunkJS75ORH7_js.isJSXAttribute(attr) && chunkJS75ORH7_js.isJSXIdentifier(attr.name) && attr.name.name === "onSubmit"
|
|
20757
20759
|
);
|
|
20758
20760
|
if (hasOnSubmit && fields.length > 0) {
|
|
20759
|
-
const startLine =
|
|
20760
|
-
const endLine =
|
|
20761
|
+
const startLine = path31.node.loc?.start.line || 0;
|
|
20762
|
+
const endLine = path31.node.loc?.end.line || 0;
|
|
20761
20763
|
let componentName = "UnknownForm";
|
|
20762
|
-
let current =
|
|
20764
|
+
let current = path31.parentPath;
|
|
20763
20765
|
while (current) {
|
|
20764
20766
|
if (chunkJS75ORH7_js.isFunctionDeclaration(current.node) && current.node.id) {
|
|
20765
20767
|
componentName = current.node.id.name;
|
|
@@ -20792,7 +20794,7 @@ function scanForForms(ast, content, filePath) {
|
|
|
20792
20794
|
}
|
|
20793
20795
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && opening.name.name === "Form") {
|
|
20794
20796
|
if (content.includes("Formik") || content.includes("formik")) {
|
|
20795
|
-
const fields = extractFieldsFromFormik(
|
|
20797
|
+
const fields = extractFieldsFromFormik(path31);
|
|
20796
20798
|
if (fields.length > 0) {
|
|
20797
20799
|
forms.push({
|
|
20798
20800
|
filePath,
|
|
@@ -20803,8 +20805,8 @@ function scanForForms(ast, content, filePath) {
|
|
|
20803
20805
|
submitsTo: null,
|
|
20804
20806
|
complexity: "moderate",
|
|
20805
20807
|
suggestedAction: "assisted",
|
|
20806
|
-
startLine:
|
|
20807
|
-
endLine:
|
|
20808
|
+
startLine: path31.node.loc?.start.line || 0,
|
|
20809
|
+
endLine: path31.node.loc?.end.line || 0
|
|
20808
20810
|
});
|
|
20809
20811
|
}
|
|
20810
20812
|
}
|
|
@@ -20822,8 +20824,8 @@ function extractFieldsFromForm(formPath) {
|
|
|
20822
20824
|
const radioGroups = /* @__PURE__ */ new Map();
|
|
20823
20825
|
const checkboxGroups = /* @__PURE__ */ new Map();
|
|
20824
20826
|
formPath.traverse({
|
|
20825
|
-
JSXElement(
|
|
20826
|
-
const opening =
|
|
20827
|
+
JSXElement(path31) {
|
|
20828
|
+
const opening = path31.node.openingElement;
|
|
20827
20829
|
const tagName = chunkJS75ORH7_js.isJSXIdentifier(opening.name) ? opening.name.name : null;
|
|
20828
20830
|
if (["input", "textarea", "select"].includes(tagName || "")) {
|
|
20829
20831
|
const attrs = opening.attributes;
|
|
@@ -20870,7 +20872,7 @@ function extractFieldsFromForm(formPath) {
|
|
|
20870
20872
|
}
|
|
20871
20873
|
if (tagName === "select") {
|
|
20872
20874
|
const selectOptions = [];
|
|
20873
|
-
|
|
20875
|
+
path31.traverse({
|
|
20874
20876
|
JSXElement(optionPath) {
|
|
20875
20877
|
const optOpening = optionPath.node.openingElement;
|
|
20876
20878
|
const optTagName = chunkJS75ORH7_js.isJSXIdentifier(optOpening.name) ? optOpening.name.name : null;
|
|
@@ -20945,8 +20947,8 @@ function extractFieldsFromForm(formPath) {
|
|
|
20945
20947
|
function extractFieldsFromFormik(formPath, content) {
|
|
20946
20948
|
const fields = [];
|
|
20947
20949
|
formPath.traverse({
|
|
20948
|
-
JSXElement(
|
|
20949
|
-
const opening =
|
|
20950
|
+
JSXElement(path31) {
|
|
20951
|
+
const opening = path31.node.openingElement;
|
|
20950
20952
|
const tagName = chunkJS75ORH7_js.isJSXIdentifier(opening.name) ? opening.name.name : null;
|
|
20951
20953
|
if (tagName === "Field" || tagName === "FastField") {
|
|
20952
20954
|
const attrs = opening.attributes;
|
|
@@ -21065,11 +21067,11 @@ function scanForMetadata(ast, content, filePath) {
|
|
|
21065
21067
|
}
|
|
21066
21068
|
let hasHeadComponent = false;
|
|
21067
21069
|
chunkJS75ORH7_js.traverse(ast, {
|
|
21068
|
-
JSXElement(
|
|
21069
|
-
const opening =
|
|
21070
|
+
JSXElement(path31) {
|
|
21071
|
+
const opening = path31.node.openingElement;
|
|
21070
21072
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && opening.name.name === "Head") {
|
|
21071
21073
|
hasHeadComponent = true;
|
|
21072
|
-
|
|
21074
|
+
path31.stop();
|
|
21073
21075
|
}
|
|
21074
21076
|
}
|
|
21075
21077
|
});
|
|
@@ -21104,8 +21106,8 @@ function scanForWidgets(ast, content, filePath) {
|
|
|
21104
21106
|
for (const { pattern, type } of widgetPatterns) {
|
|
21105
21107
|
if (pattern.test(content)) {
|
|
21106
21108
|
chunkJS75ORH7_js.traverse(ast, {
|
|
21107
|
-
JSXElement(
|
|
21108
|
-
const opening =
|
|
21109
|
+
JSXElement(path31) {
|
|
21110
|
+
const opening = path31.node.openingElement;
|
|
21109
21111
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && (opening.name.name === "script" || opening.name.name === "Script")) {
|
|
21110
21112
|
const srcAttr = opening.attributes.find(
|
|
21111
21113
|
(attr) => chunkJS75ORH7_js.isJSXAttribute(attr) && chunkJS75ORH7_js.isJSXIdentifier(attr.name) && attr.name.name === "src"
|
|
@@ -21120,8 +21122,8 @@ function scanForWidgets(ast, content, filePath) {
|
|
|
21120
21122
|
filePath,
|
|
21121
21123
|
widgetType: type,
|
|
21122
21124
|
scriptTag: src,
|
|
21123
|
-
startLine:
|
|
21124
|
-
endLine:
|
|
21125
|
+
startLine: path31.node.loc?.start.line || 0,
|
|
21126
|
+
endLine: path31.node.loc?.end.line || 0
|
|
21125
21127
|
});
|
|
21126
21128
|
}
|
|
21127
21129
|
}
|
|
@@ -21260,8 +21262,8 @@ function scanForSchemas(ast, content, filePath) {
|
|
|
21260
21262
|
return schemas;
|
|
21261
21263
|
}
|
|
21262
21264
|
chunkJS75ORH7_js.traverse(ast, {
|
|
21263
|
-
JSXElement(
|
|
21264
|
-
const opening =
|
|
21265
|
+
JSXElement(path31) {
|
|
21266
|
+
const opening = path31.node.openingElement;
|
|
21265
21267
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && (opening.name.name === "script" || opening.name.name === "Script")) {
|
|
21266
21268
|
const typeAttr = opening.attributes.find(
|
|
21267
21269
|
(attr) => chunkJS75ORH7_js.isJSXAttribute(attr) && chunkJS75ORH7_js.isJSXIdentifier(attr.name) && attr.name.name === "type"
|
|
@@ -21288,8 +21290,8 @@ function scanForSchemas(ast, content, filePath) {
|
|
|
21288
21290
|
filePath,
|
|
21289
21291
|
type: detectedType,
|
|
21290
21292
|
schemaType,
|
|
21291
|
-
startLine:
|
|
21292
|
-
endLine:
|
|
21293
|
+
startLine: path31.node.loc?.start.line || 0,
|
|
21294
|
+
endLine: path31.node.loc?.end.line || 0
|
|
21293
21295
|
});
|
|
21294
21296
|
}
|
|
21295
21297
|
}
|
|
@@ -21322,8 +21324,8 @@ function scanForFAQs(ast, content, filePath) {
|
|
|
21322
21324
|
/questions?\s*(?:and|&)?\s*answers?/i
|
|
21323
21325
|
];
|
|
21324
21326
|
chunkJS75ORH7_js.traverse(ast, {
|
|
21325
|
-
JSXElement(
|
|
21326
|
-
const opening =
|
|
21327
|
+
JSXElement(path31) {
|
|
21328
|
+
const opening = path31.node.openingElement;
|
|
21327
21329
|
let tagName = "";
|
|
21328
21330
|
if (chunkJS75ORH7_js.isJSXIdentifier(opening.name)) {
|
|
21329
21331
|
tagName = opening.name.name;
|
|
@@ -21336,8 +21338,8 @@ function scanForFAQs(ast, content, filePath) {
|
|
|
21336
21338
|
faqs.push({
|
|
21337
21339
|
filePath,
|
|
21338
21340
|
type: "details-summary",
|
|
21339
|
-
startLine:
|
|
21340
|
-
endLine:
|
|
21341
|
+
startLine: path31.node.loc?.start.line || 0,
|
|
21342
|
+
endLine: path31.node.loc?.end.line || 0,
|
|
21341
21343
|
hasSchema: content.includes("FAQPage") || content.includes("application/ld+json")
|
|
21342
21344
|
});
|
|
21343
21345
|
return;
|
|
@@ -21345,7 +21347,7 @@ function scanForFAQs(ast, content, filePath) {
|
|
|
21345
21347
|
for (const pattern of faqPatterns) {
|
|
21346
21348
|
if (pattern.test(tagName)) {
|
|
21347
21349
|
let itemCount = 0;
|
|
21348
|
-
|
|
21350
|
+
path31.traverse({
|
|
21349
21351
|
JSXElement(itemPath) {
|
|
21350
21352
|
const itemOpening = itemPath.node.openingElement;
|
|
21351
21353
|
if (chunkJS75ORH7_js.isJSXIdentifier(itemOpening.name)) {
|
|
@@ -21361,8 +21363,8 @@ function scanForFAQs(ast, content, filePath) {
|
|
|
21361
21363
|
type: "accordion",
|
|
21362
21364
|
componentName: tagName,
|
|
21363
21365
|
itemCount: itemCount || void 0,
|
|
21364
|
-
startLine:
|
|
21365
|
-
endLine:
|
|
21366
|
+
startLine: path31.node.loc?.start.line || 0,
|
|
21367
|
+
endLine: path31.node.loc?.end.line || 0,
|
|
21366
21368
|
hasSchema: content.includes("FAQPage") || content.includes("application/ld+json")
|
|
21367
21369
|
});
|
|
21368
21370
|
return;
|
|
@@ -21485,8 +21487,8 @@ function scanForImages(ast, content, filePath) {
|
|
|
21485
21487
|
return images;
|
|
21486
21488
|
}
|
|
21487
21489
|
chunkJS75ORH7_js.traverse(ast, {
|
|
21488
|
-
JSXElement(
|
|
21489
|
-
const opening =
|
|
21490
|
+
JSXElement(path31) {
|
|
21491
|
+
const opening = path31.node.openingElement;
|
|
21490
21492
|
if (!chunkJS75ORH7_js.isJSXIdentifier(opening.name)) return;
|
|
21491
21493
|
const tagName = opening.name.name;
|
|
21492
21494
|
if (tagName === "img" || tagName === "Image") {
|
|
@@ -21514,8 +21516,8 @@ function scanForImages(ast, content, filePath) {
|
|
|
21514
21516
|
src: src || void 0,
|
|
21515
21517
|
alt: alt || void 0,
|
|
21516
21518
|
isLocal,
|
|
21517
|
-
startLine:
|
|
21518
|
-
endLine:
|
|
21519
|
+
startLine: path31.node.loc?.start.line || 0,
|
|
21520
|
+
endLine: path31.node.loc?.end.line || 0
|
|
21519
21521
|
});
|
|
21520
21522
|
}
|
|
21521
21523
|
}
|
|
@@ -22406,18 +22408,18 @@ async function migrateFile(filePath, options) {
|
|
|
22406
22408
|
let componentName = "Form";
|
|
22407
22409
|
const traverse2 = (await import('../lib-BGAWCSUH.js')).default;
|
|
22408
22410
|
traverse2(ast, {
|
|
22409
|
-
ExportNamedDeclaration(
|
|
22410
|
-
const decl =
|
|
22411
|
+
ExportNamedDeclaration(path31) {
|
|
22412
|
+
const decl = path31.node.declaration;
|
|
22411
22413
|
if (decl && decl.type === "FunctionDeclaration" && decl.id) {
|
|
22412
22414
|
componentName = decl.id.name;
|
|
22413
|
-
|
|
22415
|
+
path31.stop();
|
|
22414
22416
|
}
|
|
22415
22417
|
},
|
|
22416
|
-
ExportDefaultDeclaration(
|
|
22417
|
-
const decl =
|
|
22418
|
+
ExportDefaultDeclaration(path31) {
|
|
22419
|
+
const decl = path31.node.declaration;
|
|
22418
22420
|
if (decl && decl.type === "FunctionDeclaration" && decl.id) {
|
|
22419
22421
|
componentName = decl.id.name;
|
|
22420
|
-
|
|
22422
|
+
path31.stop();
|
|
22421
22423
|
}
|
|
22422
22424
|
}
|
|
22423
22425
|
});
|
|
@@ -22533,7 +22535,7 @@ function addImportSafely2(content, importStatement) {
|
|
|
22533
22535
|
async function generateLayout() {
|
|
22534
22536
|
const layoutPath = await findLayoutFile();
|
|
22535
22537
|
if (!layoutPath) {
|
|
22536
|
-
throw new Error("Could not find layout.tsx
|
|
22538
|
+
throw new Error("Could not find a root layout (app/layout.tsx, .jsx, .ts or .js)");
|
|
22537
22539
|
}
|
|
22538
22540
|
const content = await fs3__default.default.readFile(layoutPath, "utf-8");
|
|
22539
22541
|
if (content.includes("SiteKitLayout") || content.includes("SiteKitProvider")) {
|
|
@@ -22567,27 +22569,12 @@ async function generateLayout() {
|
|
|
22567
22569
|
await fs3__default.default.writeFile(layoutPath, newContent, "utf-8");
|
|
22568
22570
|
}
|
|
22569
22571
|
async function findLayoutFile() {
|
|
22570
|
-
|
|
22571
|
-
"src/app/layout.tsx",
|
|
22572
|
-
"app/layout.tsx",
|
|
22573
|
-
"src/app/layout.jsx",
|
|
22574
|
-
"app/layout.jsx"
|
|
22575
|
-
];
|
|
22576
|
-
for (const relativePath of possiblePaths) {
|
|
22577
|
-
const fullPath = path12__default.default.join(process.cwd(), relativePath);
|
|
22578
|
-
try {
|
|
22579
|
-
await fs3__default.default.access(fullPath);
|
|
22580
|
-
return fullPath;
|
|
22581
|
-
} catch {
|
|
22582
|
-
continue;
|
|
22583
|
-
}
|
|
22584
|
-
}
|
|
22585
|
-
return null;
|
|
22572
|
+
return chunkSEP5D4MI_js.findRootLayout(process.cwd());
|
|
22586
22573
|
}
|
|
22587
22574
|
var isDockerCached;
|
|
22588
22575
|
function hasDockerEnv() {
|
|
22589
22576
|
try {
|
|
22590
|
-
|
|
22577
|
+
fs20__namespace.default.statSync("/.dockerenv");
|
|
22591
22578
|
return true;
|
|
22592
22579
|
} catch {
|
|
22593
22580
|
return false;
|
|
@@ -22595,7 +22582,7 @@ function hasDockerEnv() {
|
|
|
22595
22582
|
}
|
|
22596
22583
|
function hasDockerCGroup() {
|
|
22597
22584
|
try {
|
|
22598
|
-
return
|
|
22585
|
+
return fs20__namespace.default.readFileSync("/proc/self/cgroup", "utf8").includes("docker");
|
|
22599
22586
|
} catch {
|
|
22600
22587
|
return false;
|
|
22601
22588
|
}
|
|
@@ -22611,7 +22598,7 @@ function isDocker() {
|
|
|
22611
22598
|
var cachedResult;
|
|
22612
22599
|
var hasContainerEnv = () => {
|
|
22613
22600
|
try {
|
|
22614
|
-
|
|
22601
|
+
fs20__namespace.default.statSync("/run/.containerenv");
|
|
22615
22602
|
return true;
|
|
22616
22603
|
} catch {
|
|
22617
22604
|
return false;
|
|
@@ -22636,12 +22623,12 @@ var isWsl = () => {
|
|
|
22636
22623
|
return true;
|
|
22637
22624
|
}
|
|
22638
22625
|
try {
|
|
22639
|
-
if (
|
|
22626
|
+
if (fs20__namespace.default.readFileSync("/proc/version", "utf8").toLowerCase().includes("microsoft")) {
|
|
22640
22627
|
return !isInsideContainer();
|
|
22641
22628
|
}
|
|
22642
22629
|
} catch {
|
|
22643
22630
|
}
|
|
22644
|
-
if (
|
|
22631
|
+
if (fs20__namespace.default.existsSync("/proc/sys/fs/binfmt_misc/WSLInterop") || fs20__namespace.default.existsSync("/run/WSL")) {
|
|
22645
22632
|
return !isInsideContainer();
|
|
22646
22633
|
}
|
|
22647
22634
|
return false;
|
|
@@ -22744,15 +22731,15 @@ var wslDefaultBrowser = async () => {
|
|
|
22744
22731
|
const { stdout } = await executePowerShell(command, { powerShellPath: psPath });
|
|
22745
22732
|
return stdout.trim();
|
|
22746
22733
|
};
|
|
22747
|
-
var convertWslPathToWindows = async (
|
|
22748
|
-
if (/^[a-z]+:\/\//i.test(
|
|
22749
|
-
return
|
|
22734
|
+
var convertWslPathToWindows = async (path31) => {
|
|
22735
|
+
if (/^[a-z]+:\/\//i.test(path31)) {
|
|
22736
|
+
return path31;
|
|
22750
22737
|
}
|
|
22751
22738
|
try {
|
|
22752
|
-
const { stdout } = await execFile2("wslpath", ["-aw",
|
|
22739
|
+
const { stdout } = await execFile2("wslpath", ["-aw", path31], { encoding: "utf8" });
|
|
22753
22740
|
return stdout.trim();
|
|
22754
22741
|
} catch {
|
|
22755
|
-
return
|
|
22742
|
+
return path31;
|
|
22756
22743
|
}
|
|
22757
22744
|
};
|
|
22758
22745
|
|
|
@@ -23162,7 +23149,7 @@ function resolveImageManifestReadPath(root) {
|
|
|
23162
23149
|
return preferCurrent(path12__default.default.join(root, IMAGE_MANIFEST), path12__default.default.join(root, LEGACY_IMAGE_MANIFEST));
|
|
23163
23150
|
}
|
|
23164
23151
|
function preferCurrent(current, legacy) {
|
|
23165
|
-
return
|
|
23152
|
+
return fs20.existsSync(current) || !fs20.existsSync(legacy) ? current : legacy;
|
|
23166
23153
|
}
|
|
23167
23154
|
async function listLocalTemplates(root = process.cwd()) {
|
|
23168
23155
|
const names = /* @__PURE__ */ new Set();
|
|
@@ -24860,7 +24847,7 @@ function detectCriticalImage(filename, relPath, usages, fileSize) {
|
|
|
24860
24847
|
return { isCritical: false };
|
|
24861
24848
|
}
|
|
24862
24849
|
async function uploadImageToPortal(localPath, image, config2) {
|
|
24863
|
-
const fileBuffer =
|
|
24850
|
+
const fileBuffer = fs20.readFileSync(localPath);
|
|
24864
24851
|
const blob = new Blob([fileBuffer], { type: image.mimeType });
|
|
24865
24852
|
const form = new FormData();
|
|
24866
24853
|
form.append("file", blob, image.filename);
|
|
@@ -25228,11 +25215,11 @@ async function templateCommand(sourcePath, options) {
|
|
|
25228
25215
|
const spinner = ora("Analyzing source page...").start();
|
|
25229
25216
|
try {
|
|
25230
25217
|
const resolvedPath = path12__default.default.resolve(sourcePath);
|
|
25231
|
-
if (!
|
|
25218
|
+
if (!fs20.existsSync(resolvedPath)) {
|
|
25232
25219
|
spinner.fail(`File not found: ${sourcePath}`);
|
|
25233
25220
|
return;
|
|
25234
25221
|
}
|
|
25235
|
-
const sourceCode =
|
|
25222
|
+
const sourceCode = fs20.readFileSync(resolvedPath, "utf-8");
|
|
25236
25223
|
const ast = chunkI7AZC5ZQ_js.parse(sourceCode, {
|
|
25237
25224
|
sourceType: "module",
|
|
25238
25225
|
plugins: ["jsx", "typescript"]
|
|
@@ -25240,8 +25227,8 @@ async function templateCommand(sourcePath, options) {
|
|
|
25240
25227
|
const slots = [];
|
|
25241
25228
|
const componentNames = [];
|
|
25242
25229
|
chunkJS75ORH7_js.traverse(ast, {
|
|
25243
|
-
JSXElement(
|
|
25244
|
-
const openingElement =
|
|
25230
|
+
JSXElement(path31) {
|
|
25231
|
+
const openingElement = path31.node.openingElement;
|
|
25245
25232
|
if (chunkJS75ORH7_js.isJSXIdentifier(openingElement.name)) {
|
|
25246
25233
|
const componentName = openingElement.name.name;
|
|
25247
25234
|
if (componentName[0] === componentName[0].toUpperCase()) {
|
|
@@ -25391,12 +25378,12 @@ async function uploadCommand(templateName, config2) {
|
|
|
25391
25378
|
const spinner = ora("Uploading template to Portal...").start();
|
|
25392
25379
|
try {
|
|
25393
25380
|
const templatePath = resolveStateReadPath(path12__default.default.join("templates", `${templateName}.json`));
|
|
25394
|
-
if (!
|
|
25381
|
+
if (!fs20.existsSync(templatePath)) {
|
|
25395
25382
|
spinner.fail(`Template not found: ${templatePath}`);
|
|
25396
25383
|
console.log(source_default.gray(` Run: npx sonor-setup locations template <page> --name ${templateName}`));
|
|
25397
25384
|
return;
|
|
25398
25385
|
}
|
|
25399
|
-
const template = JSON.parse(
|
|
25386
|
+
const template = JSON.parse(fs20.readFileSync(templatePath, "utf-8"));
|
|
25400
25387
|
const response = await fetch(`${config2.apiUrl}/seo/location-templates`, {
|
|
25401
25388
|
method: "POST",
|
|
25402
25389
|
headers: {
|
|
@@ -25451,7 +25438,7 @@ async function generateCommand(options, config2) {
|
|
|
25451
25438
|
let locationList = locations || [];
|
|
25452
25439
|
if (locationsFile) {
|
|
25453
25440
|
try {
|
|
25454
|
-
const fileContent =
|
|
25441
|
+
const fileContent = fs20.readFileSync(locationsFile, "utf-8");
|
|
25455
25442
|
const parsed = JSON.parse(fileContent);
|
|
25456
25443
|
locationList = Array.isArray(parsed) ? parsed : parsed.locations || [];
|
|
25457
25444
|
} catch (e) {
|
|
@@ -25615,7 +25602,7 @@ async function extractCommand(options, config2) {
|
|
|
25615
25602
|
const extensions = ["", ".js", ".ts", ".jsx", ".tsx", ".json"];
|
|
25616
25603
|
for (const ext2 of extensions) {
|
|
25617
25604
|
const tryPath = resolvedPath + ext2;
|
|
25618
|
-
if (
|
|
25605
|
+
if (fs20.existsSync(tryPath)) {
|
|
25619
25606
|
try {
|
|
25620
25607
|
importedFiles[importPath] = await fs3__default.default.readFile(tryPath, "utf-8");
|
|
25621
25608
|
} catch {
|
|
@@ -26075,7 +26062,7 @@ async function scanForPageFiles(rootDir) {
|
|
|
26075
26062
|
const srcPagesDir = path12__default.default.join(rootDir, "src", "pages");
|
|
26076
26063
|
const dirs = [appDir, srcAppDir, pagesDir, srcPagesDir];
|
|
26077
26064
|
for (const dir of dirs) {
|
|
26078
|
-
if (
|
|
26065
|
+
if (fs20.existsSync(dir)) {
|
|
26079
26066
|
await scanDirectory(dir, dir, pages);
|
|
26080
26067
|
}
|
|
26081
26068
|
}
|
|
@@ -26124,7 +26111,7 @@ async function gatherImportedFiles(page, rootDir) {
|
|
|
26124
26111
|
const extensions = ["", ".js", ".ts", ".jsx", ".tsx", ".json"];
|
|
26125
26112
|
for (const ext2 of extensions) {
|
|
26126
26113
|
const tryPath = resolvedPath + ext2;
|
|
26127
|
-
if (
|
|
26114
|
+
if (fs20.existsSync(tryPath)) {
|
|
26128
26115
|
try {
|
|
26129
26116
|
page.importedFiles[importPath] = await fs3__default.default.readFile(tryPath, "utf-8");
|
|
26130
26117
|
} catch {
|
|
@@ -26193,7 +26180,7 @@ async function findDynamicRouteData(page, parentPath, rootDir) {
|
|
|
26193
26180
|
const routeSegment = parentPath.replace(/^\//, "").split("/")[0];
|
|
26194
26181
|
const routeSegmentNormalized = routeSegment.replace(/-/g, "");
|
|
26195
26182
|
for (const dataFile of dataFilePaths) {
|
|
26196
|
-
if (!
|
|
26183
|
+
if (!fs20.existsSync(dataFile)) continue;
|
|
26197
26184
|
try {
|
|
26198
26185
|
const content = await fs3__default.default.readFile(dataFile, "utf-8");
|
|
26199
26186
|
const exportPattern = new RegExp(
|
|
@@ -26365,11 +26352,230 @@ async function uploadSchemas(pages, globalSchema, config2) {
|
|
|
26365
26352
|
}
|
|
26366
26353
|
}
|
|
26367
26354
|
}
|
|
26368
|
-
var
|
|
26369
|
-
|
|
26355
|
+
var SOURCE_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"];
|
|
26356
|
+
function stripComments(source) {
|
|
26357
|
+
return source.replace(
|
|
26358
|
+
/("(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*'|`(?:\\.|[^`\\])*`)|\/\*[\s\S]*?\*\/|\/\/[^\n]*/g,
|
|
26359
|
+
(match, literal) => literal ?? (match.startsWith("/*") ? match.replace(/[^\n]/g, "") : "")
|
|
26360
|
+
);
|
|
26361
|
+
}
|
|
26362
|
+
function readText(file) {
|
|
26363
|
+
try {
|
|
26364
|
+
return fs20__namespace.default.readFileSync(file, "utf-8");
|
|
26365
|
+
} catch {
|
|
26366
|
+
return null;
|
|
26367
|
+
}
|
|
26368
|
+
}
|
|
26369
|
+
function isFile(p) {
|
|
26370
|
+
try {
|
|
26371
|
+
return fs20__namespace.default.statSync(p).isFile();
|
|
26372
|
+
} catch {
|
|
26373
|
+
return false;
|
|
26374
|
+
}
|
|
26375
|
+
}
|
|
26376
|
+
function realpath(p) {
|
|
26377
|
+
try {
|
|
26378
|
+
return fs20__namespace.default.realpathSync(p);
|
|
26379
|
+
} catch {
|
|
26380
|
+
return null;
|
|
26381
|
+
}
|
|
26382
|
+
}
|
|
26383
|
+
function resolveFile(base) {
|
|
26384
|
+
if (isFile(base) && SOURCE_EXTENSIONS.includes(path12__default.default.extname(base))) return base;
|
|
26385
|
+
const stem = base.replace(/\.(m|c)?js$/, "");
|
|
26386
|
+
for (const ext2 of SOURCE_EXTENSIONS) {
|
|
26387
|
+
if (isFile(stem + ext2)) return stem + ext2;
|
|
26388
|
+
}
|
|
26389
|
+
for (const ext2 of SOURCE_EXTENSIONS) {
|
|
26390
|
+
const index = path12__default.default.join(base, `index${ext2}`);
|
|
26391
|
+
if (isFile(index)) return index;
|
|
26392
|
+
}
|
|
26393
|
+
return null;
|
|
26394
|
+
}
|
|
26395
|
+
function importSpecifiers(source) {
|
|
26396
|
+
const found = /* @__PURE__ */ new Set();
|
|
26397
|
+
const patterns = [
|
|
26398
|
+
/\b(?:import|export)\s+(?:type\s+)?[^'"`;]*?\bfrom\s*['"]([^'"]+)['"]/g,
|
|
26399
|
+
/\bimport\s*['"]([^'"]+)['"]/g,
|
|
26400
|
+
/\bimport\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
|
|
26401
|
+
/\brequire\s*\(\s*['"]([^'"]+)['"]\s*\)/g
|
|
26402
|
+
];
|
|
26403
|
+
for (const re2 of patterns) {
|
|
26404
|
+
for (const m of source.matchAll(re2)) found.add(m[1]);
|
|
26405
|
+
}
|
|
26406
|
+
return [...found];
|
|
26407
|
+
}
|
|
26408
|
+
function readLooseJson(file) {
|
|
26409
|
+
const text = readText(file);
|
|
26410
|
+
if (!text) return null;
|
|
26411
|
+
try {
|
|
26412
|
+
return JSON.parse(text);
|
|
26413
|
+
} catch {
|
|
26414
|
+
try {
|
|
26415
|
+
const stripped = text.replace(/("(?:\\.|[^"\\])*")|\/\*[\s\S]*?\*\/|\/\/[^\n]*/g, (_m4, str) => str ?? "").replace(/,(\s*[}\]])/g, "$1");
|
|
26416
|
+
return JSON.parse(stripped);
|
|
26417
|
+
} catch {
|
|
26418
|
+
return null;
|
|
26419
|
+
}
|
|
26420
|
+
}
|
|
26421
|
+
}
|
|
26422
|
+
function loadScope(root) {
|
|
26423
|
+
const tsconfig = readLooseJson(path12__default.default.join(root, "tsconfig.json")) ?? readLooseJson(path12__default.default.join(root, "jsconfig.json"));
|
|
26424
|
+
const options = tsconfig?.compilerOptions ?? {};
|
|
26425
|
+
const baseUrl = path12__default.default.resolve(root, options.baseUrl ?? ".");
|
|
26426
|
+
const aliases = [];
|
|
26427
|
+
for (const [key, value] of Object.entries(options.paths ?? {})) {
|
|
26428
|
+
const star = key.indexOf("*");
|
|
26429
|
+
aliases.push({
|
|
26430
|
+
prefix: star === -1 ? key : key.slice(0, star),
|
|
26431
|
+
suffix: star === -1 ? "" : key.slice(star + 1),
|
|
26432
|
+
exact: star === -1,
|
|
26433
|
+
targets: (Array.isArray(value) ? value : [value]).map((t) => path12__default.default.resolve(baseUrl, t))
|
|
26434
|
+
});
|
|
26435
|
+
}
|
|
26436
|
+
return { root, aliases };
|
|
26437
|
+
}
|
|
26438
|
+
function packageRoot(dir) {
|
|
26439
|
+
let current = dir;
|
|
26440
|
+
for (; ; ) {
|
|
26441
|
+
if (["package.json", "tsconfig.json", "jsconfig.json"].some((f) => isFile(path12__default.default.join(current, f)))) return current;
|
|
26442
|
+
const parent = path12__default.default.dirname(current);
|
|
26443
|
+
if (parent === current) return dir;
|
|
26444
|
+
current = parent;
|
|
26445
|
+
}
|
|
26446
|
+
}
|
|
26447
|
+
function pickExportTarget(value) {
|
|
26448
|
+
if (typeof value === "string") return value;
|
|
26449
|
+
if (Array.isArray(value)) {
|
|
26450
|
+
for (const v2 of value) {
|
|
26451
|
+
const t = pickExportTarget(v2);
|
|
26452
|
+
if (t) return t;
|
|
26453
|
+
}
|
|
26454
|
+
return null;
|
|
26455
|
+
}
|
|
26456
|
+
if (value && typeof value === "object") {
|
|
26457
|
+
const conditions = value;
|
|
26458
|
+
for (const key of ["source", "import", "default", "require", "node", "types"]) {
|
|
26459
|
+
if (key in conditions) {
|
|
26460
|
+
const t = pickExportTarget(conditions[key]);
|
|
26461
|
+
if (t) return t;
|
|
26462
|
+
}
|
|
26463
|
+
}
|
|
26464
|
+
}
|
|
26465
|
+
return null;
|
|
26466
|
+
}
|
|
26467
|
+
function resolvePackageSubpath(pkgRoot, subpath) {
|
|
26468
|
+
const pkg = readLooseJson(path12__default.default.join(pkgRoot, "package.json")) ?? {};
|
|
26469
|
+
const exportsField = pkg.exports;
|
|
26470
|
+
if (exportsField !== void 0) {
|
|
26471
|
+
const map = typeof exportsField === "string" || Array.isArray(exportsField) || !Object.keys(exportsField).some((k2) => k2.startsWith(".")) ? { ".": exportsField } : exportsField;
|
|
26472
|
+
if (subpath in map) {
|
|
26473
|
+
const target = pickExportTarget(map[subpath]);
|
|
26474
|
+
if (target) return resolveFile(path12__default.default.resolve(pkgRoot, target));
|
|
26475
|
+
}
|
|
26476
|
+
for (const [key, value] of Object.entries(map)) {
|
|
26477
|
+
const star = key.indexOf("*");
|
|
26478
|
+
if (star === -1) continue;
|
|
26479
|
+
const prefix = key.slice(0, star);
|
|
26480
|
+
const suffix = key.slice(star + 1);
|
|
26481
|
+
if (subpath.startsWith(prefix) && subpath.endsWith(suffix) && subpath.length >= prefix.length + suffix.length) {
|
|
26482
|
+
const matched = subpath.slice(prefix.length, subpath.length - suffix.length);
|
|
26483
|
+
const target = pickExportTarget(value);
|
|
26484
|
+
if (target) return resolveFile(path12__default.default.resolve(pkgRoot, target.replace("*", matched)));
|
|
26485
|
+
}
|
|
26486
|
+
}
|
|
26487
|
+
}
|
|
26488
|
+
if (subpath === ".") {
|
|
26489
|
+
const main = pkg.source ?? pkg.module ?? pkg.main;
|
|
26490
|
+
if (typeof main === "string") {
|
|
26491
|
+
const hit = resolveFile(path12__default.default.resolve(pkgRoot, main));
|
|
26492
|
+
if (hit) return hit;
|
|
26493
|
+
}
|
|
26494
|
+
return resolveFile(path12__default.default.join(pkgRoot, "index"));
|
|
26495
|
+
}
|
|
26496
|
+
return resolveFile(path12__default.default.resolve(pkgRoot, subpath));
|
|
26497
|
+
}
|
|
26498
|
+
function workspacePackage(fromDir, name) {
|
|
26499
|
+
let current = fromDir;
|
|
26500
|
+
for (; ; ) {
|
|
26501
|
+
const candidate = path12__default.default.join(current, "node_modules", name);
|
|
26502
|
+
if (fs20__namespace.default.existsSync(candidate)) {
|
|
26503
|
+
const real = realpath(candidate);
|
|
26504
|
+
if (!real || real.split(path12__default.default.sep).includes("node_modules")) return null;
|
|
26505
|
+
return real;
|
|
26506
|
+
}
|
|
26507
|
+
const parent = path12__default.default.dirname(current);
|
|
26508
|
+
if (parent === current) return null;
|
|
26509
|
+
current = parent;
|
|
26510
|
+
}
|
|
26511
|
+
}
|
|
26512
|
+
function splitBare(specifier) {
|
|
26513
|
+
const parts = specifier.split("/");
|
|
26514
|
+
const nameParts = specifier.startsWith("@") ? parts.slice(0, 2) : parts.slice(0, 1);
|
|
26515
|
+
const rest = parts.slice(nameParts.length);
|
|
26516
|
+
return { name: nameParts.join("/"), subpath: rest.length ? `./${rest.join("/")}` : "." };
|
|
26517
|
+
}
|
|
26518
|
+
function readSourceGraph(entries, options = {}) {
|
|
26519
|
+
const { maxDepth = 4, maxFiles = 300 } = options;
|
|
26520
|
+
const scopes = /* @__PURE__ */ new Map();
|
|
26521
|
+
const scopeFor = (file) => {
|
|
26522
|
+
const root = packageRoot(path12__default.default.dirname(file));
|
|
26523
|
+
let scope = scopes.get(root);
|
|
26524
|
+
if (!scope) {
|
|
26525
|
+
scope = loadScope(root);
|
|
26526
|
+
scopes.set(root, scope);
|
|
26527
|
+
}
|
|
26528
|
+
return scope;
|
|
26529
|
+
};
|
|
26530
|
+
const resolve = (specifier, fromFile) => {
|
|
26531
|
+
const fromDir = path12__default.default.dirname(fromFile);
|
|
26532
|
+
if (specifier.startsWith(".")) return resolveFile(path12__default.default.resolve(fromDir, specifier));
|
|
26533
|
+
if (specifier.startsWith("/") || /^[a-z]+:/i.test(specifier)) return null;
|
|
26534
|
+
const scope = scopeFor(fromFile);
|
|
26535
|
+
for (const alias of scope.aliases) {
|
|
26536
|
+
const hit = alias.exact ? specifier === alias.prefix : specifier.startsWith(alias.prefix) && specifier.endsWith(alias.suffix);
|
|
26537
|
+
if (!hit) continue;
|
|
26538
|
+
const matched = alias.exact ? "" : specifier.slice(alias.prefix.length, specifier.length - alias.suffix.length);
|
|
26539
|
+
for (const target of alias.targets) {
|
|
26540
|
+
const hit2 = resolveFile(target.replace("*", matched));
|
|
26541
|
+
if (hit2) return hit2;
|
|
26542
|
+
}
|
|
26543
|
+
}
|
|
26544
|
+
const { name, subpath } = splitBare(specifier);
|
|
26545
|
+
const pkg = workspacePackage(fromDir, name);
|
|
26546
|
+
return pkg ? resolvePackageSubpath(pkg, subpath) : null;
|
|
26547
|
+
};
|
|
26548
|
+
const seen = /* @__PURE__ */ new Set();
|
|
26549
|
+
const out = [];
|
|
26550
|
+
let frontier = entries.map((e) => path12__default.default.resolve(e));
|
|
26551
|
+
for (let depth = 0; depth <= maxDepth && frontier.length && out.length < maxFiles; depth++) {
|
|
26552
|
+
const next = [];
|
|
26553
|
+
for (const file of frontier) {
|
|
26554
|
+
if (seen.has(file) || out.length >= maxFiles) continue;
|
|
26555
|
+
seen.add(file);
|
|
26556
|
+
const raw = readText(file);
|
|
26557
|
+
if (raw === null) continue;
|
|
26558
|
+
const source = stripComments(raw);
|
|
26559
|
+
out.push({ file, source });
|
|
26560
|
+
if (depth === maxDepth) continue;
|
|
26561
|
+
for (const specifier of importSpecifiers(source)) {
|
|
26562
|
+
const hit = resolve(specifier, file);
|
|
26563
|
+
if (hit && !seen.has(hit)) next.push(hit);
|
|
26564
|
+
}
|
|
26565
|
+
}
|
|
26566
|
+
frontier = next;
|
|
26567
|
+
}
|
|
26568
|
+
return out;
|
|
26569
|
+
}
|
|
26570
|
+
function readWithImports(cwd, rel, options) {
|
|
26571
|
+
return readSourceGraph([path12__default.default.join(cwd, rel)], options).map((f) => f.source).join("\n");
|
|
26572
|
+
}
|
|
26573
|
+
|
|
26574
|
+
// src/og/wiring.ts
|
|
26575
|
+
var CARD_FILE = /^(opengraph-image|twitter-image)\b.*\.(png|jpe?g|gif|webp|tsx|ts|jsx|js)$/i;
|
|
26370
26576
|
function safeExists(p) {
|
|
26371
26577
|
try {
|
|
26372
|
-
return
|
|
26578
|
+
return fs20__namespace.default.existsSync(p);
|
|
26373
26579
|
} catch {
|
|
26374
26580
|
return false;
|
|
26375
26581
|
}
|
|
@@ -26379,7 +26585,7 @@ function findPageCards(cwd) {
|
|
|
26379
26585
|
const walk = (dir) => {
|
|
26380
26586
|
let entries;
|
|
26381
26587
|
try {
|
|
26382
|
-
entries =
|
|
26588
|
+
entries = fs20__namespace.default.readdirSync(dir, { withFileTypes: true });
|
|
26383
26589
|
} catch {
|
|
26384
26590
|
return;
|
|
26385
26591
|
}
|
|
@@ -26390,34 +26596,97 @@ function findPageCards(cwd) {
|
|
|
26390
26596
|
else if (CARD_FILE.test(entry.name)) found.push(full);
|
|
26391
26597
|
}
|
|
26392
26598
|
};
|
|
26393
|
-
for (const rel of
|
|
26599
|
+
for (const rel of chunkSEP5D4MI_js.NEXT_APP_DIRS) walk(path12__default.default.join(cwd, rel));
|
|
26600
|
+
return found;
|
|
26601
|
+
}
|
|
26602
|
+
function findPageFiles(cwd) {
|
|
26603
|
+
const found = [];
|
|
26604
|
+
const pageFile = new RegExp(`^page\\.(${chunkSEP5D4MI_js.NEXT_SOURCE_EXTENSIONS.join("|")})$`);
|
|
26605
|
+
const walk = (dir) => {
|
|
26606
|
+
let entries;
|
|
26607
|
+
try {
|
|
26608
|
+
entries = fs20__namespace.default.readdirSync(dir, { withFileTypes: true });
|
|
26609
|
+
} catch {
|
|
26610
|
+
return;
|
|
26611
|
+
}
|
|
26612
|
+
for (const entry of entries) {
|
|
26613
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
|
|
26614
|
+
const full = path12__default.default.join(dir, entry.name);
|
|
26615
|
+
if (entry.isDirectory()) walk(full);
|
|
26616
|
+
else if (pageFile.test(entry.name)) found.push(full);
|
|
26617
|
+
}
|
|
26618
|
+
};
|
|
26619
|
+
for (const rel of chunkSEP5D4MI_js.NEXT_APP_DIRS) walk(path12__default.default.join(cwd, rel));
|
|
26394
26620
|
return found;
|
|
26395
26621
|
}
|
|
26396
|
-
function
|
|
26622
|
+
function routeOf(cwd, dir) {
|
|
26623
|
+
const appRoot = chunkSEP5D4MI_js.NEXT_APP_DIRS.map((rel2) => path12__default.default.join(cwd, rel2)).find((root) => dir === root || dir.startsWith(root + path12__default.default.sep));
|
|
26624
|
+
const rel = appRoot ? path12__default.default.relative(appRoot, dir) : dir;
|
|
26625
|
+
const segments = rel.split(path12__default.default.sep).filter((s) => s && !(s.startsWith("(") && s.endsWith(")"))).map((s) => s.startsWith("[") && s.endsWith("]") ? "*" : s);
|
|
26626
|
+
return `/${segments.join("/")}`;
|
|
26627
|
+
}
|
|
26628
|
+
function readCodeCards(cwd, pageCards) {
|
|
26629
|
+
const code = pageCards.filter((f) => /^opengraph-image\.(tsx|ts|jsx|js)$/.test(path12__default.default.basename(f)));
|
|
26630
|
+
return code.map((file) => {
|
|
26631
|
+
const dir = path12__default.default.dirname(file);
|
|
26632
|
+
const page = chunkSEP5D4MI_js.findConventionFile(dir, "page");
|
|
26633
|
+
const source = page ? readSourceGraph([page], { maxDepth: 2, maxFiles: 40 }).map((f) => f.source).join("\n") : "";
|
|
26634
|
+
const pageOwn = page ? readSourceGraph([page], { maxDepth: 0 })[0]?.source ?? "" : "";
|
|
26635
|
+
return {
|
|
26636
|
+
file: path12__default.default.relative(cwd, file),
|
|
26637
|
+
route: routeOf(cwd, dir),
|
|
26638
|
+
declaresUrl: /\bcodeCardImage\s*\(/.test(source),
|
|
26639
|
+
// A page that deletes the key itself (the pre-`images: false` workaround)
|
|
26640
|
+
// is fine too.
|
|
26641
|
+
blogDeclaresImages: /\bgenerateBlogPostMetadata\s*\(/.test(pageOwn) && !/\bimages\s*:\s*false\b/.test(pageOwn) && !/\bdelete\s+[\w.]+\.images\b/.test(pageOwn)
|
|
26642
|
+
};
|
|
26643
|
+
});
|
|
26644
|
+
}
|
|
26645
|
+
function readTrailingSlash(cwd) {
|
|
26646
|
+
const rel = chunkSEP5D4MI_js.findNextConfig(cwd);
|
|
26647
|
+
if (!rel) return false;
|
|
26648
|
+
try {
|
|
26649
|
+
return /\btrailingSlash\s*:\s*true\b/.test(fs20__namespace.default.readFileSync(path12__default.default.join(cwd, rel), "utf-8"));
|
|
26650
|
+
} catch {
|
|
26651
|
+
return false;
|
|
26652
|
+
}
|
|
26653
|
+
}
|
|
26654
|
+
function readOgWiring(cwd, known = {}) {
|
|
26397
26655
|
const siteCard = ["public/og.png", "public/og.jpg", "public/opengraph.png"].some(
|
|
26398
26656
|
(rel) => safeExists(path12__default.default.join(cwd, rel))
|
|
26399
26657
|
);
|
|
26400
|
-
const layoutPath =
|
|
26658
|
+
const layoutPath = chunkSEP5D4MI_js.findRootLayout(cwd);
|
|
26401
26659
|
let layout = "";
|
|
26402
26660
|
if (layoutPath) {
|
|
26403
26661
|
try {
|
|
26404
|
-
layout =
|
|
26662
|
+
layout = fs20__namespace.default.readFileSync(layoutPath, "utf-8");
|
|
26405
26663
|
} catch {
|
|
26406
26664
|
}
|
|
26407
26665
|
}
|
|
26666
|
+
const pageCards = findPageCards(cwd);
|
|
26667
|
+
const entries = [...layoutPath ? [layoutPath] : [], ...findPageFiles(cwd)];
|
|
26668
|
+
const largeCard = /summary_large_image/.test(layout) || pageCards.some((f) => /^twitter-image\b/.test(path12__default.default.basename(f))) || readSourceGraph(entries, { maxDepth: 3, maxFiles: 400 }).some((f) => /summary_large_image/.test(f.source));
|
|
26408
26669
|
return {
|
|
26409
26670
|
siteCard,
|
|
26410
|
-
pageCards
|
|
26671
|
+
pageCards,
|
|
26411
26672
|
layoutDeclaresImages: /images:\s*\[/.test(layout),
|
|
26412
|
-
largeCard
|
|
26673
|
+
largeCard,
|
|
26413
26674
|
referencesImage: /og\.png|opengraph-image|og:image|images:\s*\[/.test(layout),
|
|
26414
|
-
layoutFound: !!layoutPath
|
|
26675
|
+
layoutFound: !!layoutPath,
|
|
26676
|
+
trailingSlash: readTrailingSlash(cwd),
|
|
26677
|
+
codeCards: readCodeCards(cwd, pageCards),
|
|
26678
|
+
...known.managedOgImages && { managedOgImages: known.managedOgImages }
|
|
26415
26679
|
};
|
|
26416
26680
|
}
|
|
26417
26681
|
function judgeOgWiring(facts) {
|
|
26418
26682
|
const problems = [];
|
|
26419
26683
|
if (!facts.layoutFound) {
|
|
26420
|
-
return [
|
|
26684
|
+
return [
|
|
26685
|
+
{
|
|
26686
|
+
message: "no root layout (app/layout.{tsx,ts,jsx,js} or src/app/layout.*) found to verify metadata",
|
|
26687
|
+
fix: "Run this from the site root."
|
|
26688
|
+
}
|
|
26689
|
+
];
|
|
26421
26690
|
}
|
|
26422
26691
|
if (!facts.siteCard && !facts.pageCards.length) {
|
|
26423
26692
|
return [
|
|
@@ -26434,10 +26703,13 @@ function judgeOgWiring(facts) {
|
|
|
26434
26703
|
fix: "Remove the images arrays from the root layout metadata and let Next serve each route its own opengraph-image file."
|
|
26435
26704
|
});
|
|
26436
26705
|
}
|
|
26437
|
-
|
|
26438
|
-
|
|
26439
|
-
|
|
26440
|
-
|
|
26706
|
+
const managed = facts.managedOgImages ?? [];
|
|
26707
|
+
if (managed.length) {
|
|
26708
|
+
problems.push({
|
|
26709
|
+
message: `seo_pages.managed_og_image is set for ${managed.length} page${managed.length === 1 ? "" : "s"} (${managed.slice(0, 5).join(", ")}${managed.length > 5 ? ", \u2026" : ""}), which overrides ${managed.length === 1 ? "its" : "their"} own card`,
|
|
26710
|
+
fix: "Clear managed_og_image on those pages in Sonor so each serves its own card."
|
|
26711
|
+
});
|
|
26712
|
+
}
|
|
26441
26713
|
} else if (!facts.referencesImage) {
|
|
26442
26714
|
problems.push({
|
|
26443
26715
|
message: "card asset exists but layout metadata never references it",
|
|
@@ -26450,10 +26722,24 @@ function judgeOgWiring(facts) {
|
|
|
26450
26722
|
fix: "Set twitter: { card: 'summary_large_image' } in the root layout metadata."
|
|
26451
26723
|
});
|
|
26452
26724
|
}
|
|
26725
|
+
for (const card of facts.codeCards ?? []) {
|
|
26726
|
+
if (card.blogDeclaresImages) {
|
|
26727
|
+
problems.push({
|
|
26728
|
+
message: `${card.route} has its own card (${card.file}), but its page's generateBlogPostMetadata declares the featured image, which beats the card`,
|
|
26729
|
+
fix: "Pass images: false to generateBlogPostMetadata in that page."
|
|
26730
|
+
});
|
|
26731
|
+
}
|
|
26732
|
+
if (facts.trailingSlash && !card.declaresUrl) {
|
|
26733
|
+
problems.push({
|
|
26734
|
+
message: `${card.route}'s card (${card.file}) is served at \u2026/opengraph-image with no extension, which trailingSlash: true 308-redirects`,
|
|
26735
|
+
fix: "Declare the slashed URL from the page's metadata: openGraph.images = [codeCardImage(path)] from @sonordev/site-kit/og. Or, for cards that can be rendered ahead of time, key them in og.config.ts `cards` by URL and use paramCardImage."
|
|
26736
|
+
});
|
|
26737
|
+
}
|
|
26738
|
+
}
|
|
26453
26739
|
return problems;
|
|
26454
26740
|
}
|
|
26455
|
-
function checkOgWiring(cwd) {
|
|
26456
|
-
return judgeOgWiring(readOgWiring(cwd));
|
|
26741
|
+
function checkOgWiring(cwd, known = {}) {
|
|
26742
|
+
return judgeOgWiring(readOgWiring(cwd, known));
|
|
26457
26743
|
}
|
|
26458
26744
|
|
|
26459
26745
|
// src/cli/agent/ssr-bailout.ts
|
|
@@ -26472,26 +26758,6 @@ async function readFileOrNull(p) {
|
|
|
26472
26758
|
return null;
|
|
26473
26759
|
}
|
|
26474
26760
|
}
|
|
26475
|
-
async function findFirst(cwd, candidates) {
|
|
26476
|
-
for (const rel of candidates) {
|
|
26477
|
-
const full = path12__default.default.join(cwd, rel);
|
|
26478
|
-
if (await readFileOrNull(full)) return full;
|
|
26479
|
-
}
|
|
26480
|
-
return null;
|
|
26481
|
-
}
|
|
26482
|
-
var LAYOUT_CANDIDATES = [
|
|
26483
|
-
"app/layout.tsx",
|
|
26484
|
-
"app/layout.jsx",
|
|
26485
|
-
"src/app/layout.tsx",
|
|
26486
|
-
"src/app/layout.jsx"
|
|
26487
|
-
];
|
|
26488
|
-
var SITEMAP_CANDIDATES = [
|
|
26489
|
-
"app/sitemap.ts",
|
|
26490
|
-
"app/sitemap.tsx",
|
|
26491
|
-
"app/sitemap.js",
|
|
26492
|
-
"src/app/sitemap.ts",
|
|
26493
|
-
"src/app/sitemap.tsx"
|
|
26494
|
-
];
|
|
26495
26761
|
function checkApiKeyEnv() {
|
|
26496
26762
|
const key = process.env.SONOR_API_KEY;
|
|
26497
26763
|
if (key && key.startsWith("sonor_")) {
|
|
@@ -26578,7 +26844,7 @@ async function checkPackageInstalled(cwd) {
|
|
|
26578
26844
|
};
|
|
26579
26845
|
}
|
|
26580
26846
|
async function checkSiteKitLayout(cwd) {
|
|
26581
|
-
const layoutPath =
|
|
26847
|
+
const layoutPath = chunkSEP5D4MI_js.findRootLayout(cwd);
|
|
26582
26848
|
if (!layoutPath) {
|
|
26583
26849
|
return {
|
|
26584
26850
|
id: "layout.sitekit",
|
|
@@ -26622,8 +26888,8 @@ async function checkSiteKitLayout(cwd) {
|
|
|
26622
26888
|
};
|
|
26623
26889
|
}
|
|
26624
26890
|
async function checkSitemap(cwd) {
|
|
26625
|
-
const
|
|
26626
|
-
if (!
|
|
26891
|
+
const sitemapRel = chunkSEP5D4MI_js.findSitemapRoute(cwd);
|
|
26892
|
+
if (!sitemapRel) {
|
|
26627
26893
|
return {
|
|
26628
26894
|
id: "sitemap.managed",
|
|
26629
26895
|
title: "Sitemap",
|
|
@@ -26633,7 +26899,7 @@ async function checkSitemap(cwd) {
|
|
|
26633
26899
|
fixCommand: "npx sonor-setup scaffold --yes"
|
|
26634
26900
|
};
|
|
26635
26901
|
}
|
|
26636
|
-
const content = await readFileOrNull(
|
|
26902
|
+
const content = await readFileOrNull(path12__default.default.join(cwd, sitemapRel)) || "";
|
|
26637
26903
|
if (content.includes("createSitemap") || content.includes("@sonordev/site-kit")) {
|
|
26638
26904
|
return { id: "sitemap.managed", title: "Sitemap", level: "ok", message: "Using Site-Kit sitemap" };
|
|
26639
26905
|
}
|
|
@@ -26680,6 +26946,90 @@ async function checkPostbuildSitemap(cwd) {
|
|
|
26680
26946
|
fix: 'Add "postbuild": "sonor-register-sitemap --auto-discover || true" to package.json scripts.'
|
|
26681
26947
|
};
|
|
26682
26948
|
}
|
|
26949
|
+
var TRAILING_SLASH_ON = /\btrailingSlash\s*:\s*true\b/;
|
|
26950
|
+
async function readBuiltSitemaps(cwd) {
|
|
26951
|
+
const appDir = path12__default.default.join(cwd, ".next", "server", "app");
|
|
26952
|
+
const single = await readFileOrNull(path12__default.default.join(appDir, "sitemap.xml.body"));
|
|
26953
|
+
if (single !== null) return [single];
|
|
26954
|
+
let shards;
|
|
26955
|
+
try {
|
|
26956
|
+
shards = (await fs3__default.default.readdir(path12__default.default.join(appDir, "sitemap"))).filter((f) => f.endsWith(".xml.body"));
|
|
26957
|
+
} catch {
|
|
26958
|
+
return null;
|
|
26959
|
+
}
|
|
26960
|
+
if (shards.length === 0) return null;
|
|
26961
|
+
const bodies = await Promise.all(shards.map((f) => readFileOrNull(path12__default.default.join(appDir, "sitemap", f))));
|
|
26962
|
+
return bodies.filter((b) => b !== null);
|
|
26963
|
+
}
|
|
26964
|
+
function locPath(loc) {
|
|
26965
|
+
try {
|
|
26966
|
+
return new URL(loc).pathname;
|
|
26967
|
+
} catch {
|
|
26968
|
+
return loc;
|
|
26969
|
+
}
|
|
26970
|
+
}
|
|
26971
|
+
async function checkSitemapTrailingSlash(cwd) {
|
|
26972
|
+
const id = "sitemap.trailing-slash";
|
|
26973
|
+
const title = "Sitemap trailing slash";
|
|
26974
|
+
const configRel = chunkSEP5D4MI_js.findNextConfig(cwd);
|
|
26975
|
+
const config2 = configRel ? await readFileOrNull(path12__default.default.join(cwd, configRel)) || "" : "";
|
|
26976
|
+
if (!TRAILING_SLASH_ON.test(config2)) {
|
|
26977
|
+
return { id, title, level: "ok", message: "next.config leaves trailingSlash off" };
|
|
26978
|
+
}
|
|
26979
|
+
const sitemapRel = chunkSEP5D4MI_js.findSitemapRoute(cwd);
|
|
26980
|
+
const source = sitemapRel ? await readFileOrNull(path12__default.default.join(cwd, sitemapRel)) || "" : "";
|
|
26981
|
+
const forcesOff = /\btrailingSlash\s*:\s*false\b/.test(source);
|
|
26982
|
+
const removeForcedOff = `Remove trailingSlash: false from ${sitemapRel}. createSitemap follows next.config.`;
|
|
26983
|
+
const built = await readBuiltSitemaps(cwd);
|
|
26984
|
+
if (built) {
|
|
26985
|
+
const locs = built.flatMap((xml) => [...xml.matchAll(/<loc>\s*([^<\s]+)\s*<\/loc>/g)].map((m) => m[1]));
|
|
26986
|
+
const unslashed = locs.filter((loc) => {
|
|
26987
|
+
const p = locPath(loc);
|
|
26988
|
+
return chunkR7GHP3FY_js.applyTrailingSlash(p, true) !== p;
|
|
26989
|
+
});
|
|
26990
|
+
if (unslashed.length === 0) {
|
|
26991
|
+
return { id, title, level: "ok", message: `All ${locs.length} URLs in the built sitemap match trailingSlash: true` };
|
|
26992
|
+
}
|
|
26993
|
+
const fix = forcesOff ? removeForcedOff : source.includes("createSitemap") ? "Upgrade @sonordev/site-kit: createSitemap now follows next.config trailingSlash. If it's already current, something loads the kit outside Next's bundler (serverExternalPackages), so pass createSitemap({ trailingSlash: true })." : `End every <loc> except / and files like /llms.txt in "/", or switch ${sitemapRel ?? "the sitemap route"} to createSitemap.`;
|
|
26994
|
+
return {
|
|
26995
|
+
id,
|
|
26996
|
+
title,
|
|
26997
|
+
level: "warn",
|
|
26998
|
+
message: `${unslashed.length} of ${locs.length} built sitemap URLs lack the trailing slash ${configRel} requires`,
|
|
26999
|
+
detail: `Each one 308-redirects. ${unslashed.slice(0, 5).join(", ")}`,
|
|
27000
|
+
fix: `${fix} Then rebuild.`
|
|
27001
|
+
};
|
|
27002
|
+
}
|
|
27003
|
+
if (!sitemapRel) {
|
|
27004
|
+
return { id, title, level: "skip", message: "No sitemap route to check" };
|
|
27005
|
+
}
|
|
27006
|
+
if (forcesOff) {
|
|
27007
|
+
return {
|
|
27008
|
+
id,
|
|
27009
|
+
title,
|
|
27010
|
+
level: "warn",
|
|
27011
|
+
message: `${sitemapRel} passes trailingSlash: false but ${configRel} sets trailingSlash: true`,
|
|
27012
|
+
detail: "Every sitemap URL except / will 308-redirect.",
|
|
27013
|
+
fix: removeForcedOff
|
|
27014
|
+
};
|
|
27015
|
+
}
|
|
27016
|
+
if (source.includes("createSitemap")) {
|
|
27017
|
+
return {
|
|
27018
|
+
id,
|
|
27019
|
+
title,
|
|
27020
|
+
level: "ok",
|
|
27021
|
+
message: "createSitemap follows next.config trailingSlash",
|
|
27022
|
+
detail: "No build to confirm against. Run `next build`, then doctor again to check the emitted URLs."
|
|
27023
|
+
};
|
|
27024
|
+
}
|
|
27025
|
+
return {
|
|
27026
|
+
id,
|
|
27027
|
+
title,
|
|
27028
|
+
level: "skip",
|
|
27029
|
+
message: "Custom sitemap and no build to check",
|
|
27030
|
+
fix: 'Run `next build`, then doctor again. Every <loc> except / and files like /llms.txt must end in "/".'
|
|
27031
|
+
};
|
|
27032
|
+
}
|
|
26683
27033
|
async function checkApiReachable(timeoutMs = 5e3) {
|
|
26684
27034
|
const key = process.env.SONOR_API_KEY;
|
|
26685
27035
|
try {
|
|
@@ -27011,8 +27361,7 @@ async function checkSsrRenderFromBuild(cwd) {
|
|
|
27011
27361
|
}
|
|
27012
27362
|
async function checkNetlifyMiddleware(cwd) {
|
|
27013
27363
|
const runtimeRe = /runtime\s*[:=]\s*['"](nodejs|edge)['"]/;
|
|
27014
|
-
const
|
|
27015
|
-
for (const rel of proxyFiles) {
|
|
27364
|
+
for (const rel of chunkSEP5D4MI_js.NEXT_PROXY_FILES) {
|
|
27016
27365
|
const content = await readFileOrNull(path12__default.default.join(cwd, rel));
|
|
27017
27366
|
if (content === null) continue;
|
|
27018
27367
|
if (runtimeRe.test(content)) {
|
|
@@ -27028,8 +27377,7 @@ async function checkNetlifyMiddleware(cwd) {
|
|
|
27028
27377
|
}
|
|
27029
27378
|
return { id: "middleware.netlify", title: "Proxy / middleware", level: "ok", message: `${rel} present` };
|
|
27030
27379
|
}
|
|
27031
|
-
const
|
|
27032
|
-
for (const rel of middlewareFiles) {
|
|
27380
|
+
for (const rel of chunkSEP5D4MI_js.NEXT_MIDDLEWARE_FILES) {
|
|
27033
27381
|
const content = await readFileOrNull(path12__default.default.join(cwd, rel));
|
|
27034
27382
|
if (content === null) continue;
|
|
27035
27383
|
if (/runtime\s*[:=]\s*['"]nodejs['"]/.test(content)) {
|
|
@@ -27125,8 +27473,8 @@ async function checkImageDimsDrift(cwd) {
|
|
|
27125
27473
|
}
|
|
27126
27474
|
return { id: "images.dims-drift", title: "Image dims vs SVG", level: "ok", message: "Declared dims match SVG viewBoxes" };
|
|
27127
27475
|
}
|
|
27128
|
-
async function checkOgCard(cwd) {
|
|
27129
|
-
const problems = judgeOgWiring(readOgWiring(cwd));
|
|
27476
|
+
async function checkOgCard(cwd, known = {}) {
|
|
27477
|
+
const problems = judgeOgWiring(readOgWiring(cwd, known));
|
|
27130
27478
|
if (!problems.length) {
|
|
27131
27479
|
return { id: "og.card", title: "Open Graph card", level: "ok", message: "Cards present and wired" };
|
|
27132
27480
|
}
|
|
@@ -27147,12 +27495,59 @@ async function staticChecks(cwd) {
|
|
|
27147
27495
|
await checkSiteKitLayout(cwd),
|
|
27148
27496
|
await checkSitemap(cwd),
|
|
27149
27497
|
await checkPostbuildSitemap(cwd),
|
|
27498
|
+
await checkSitemapTrailingSlash(cwd),
|
|
27150
27499
|
await checkNetlifyMiddleware(cwd),
|
|
27151
27500
|
await checkImageDimsDrift(cwd),
|
|
27152
27501
|
await checkOgCard(cwd)
|
|
27153
27502
|
];
|
|
27154
27503
|
}
|
|
27155
27504
|
|
|
27505
|
+
// src/og/route-copy.ts
|
|
27506
|
+
var RENDER_CONCURRENCY = 4;
|
|
27507
|
+
async function pooled(items, limit, fn) {
|
|
27508
|
+
const results = new Array(items.length);
|
|
27509
|
+
let cursor = 0;
|
|
27510
|
+
const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
|
|
27511
|
+
while (cursor < items.length) {
|
|
27512
|
+
const i = cursor++;
|
|
27513
|
+
results[i] = await fn(items[i], i);
|
|
27514
|
+
}
|
|
27515
|
+
});
|
|
27516
|
+
await Promise.all(workers);
|
|
27517
|
+
return results;
|
|
27518
|
+
}
|
|
27519
|
+
async function resolveRouteCopy(paths) {
|
|
27520
|
+
let getSEOPageData = null;
|
|
27521
|
+
try {
|
|
27522
|
+
if (process.env.SONOR_API_KEY) {
|
|
27523
|
+
;
|
|
27524
|
+
({ getSEOPageData } = await import('../api-XR5APCH3.js'));
|
|
27525
|
+
}
|
|
27526
|
+
} catch {
|
|
27527
|
+
getSEOPageData = null;
|
|
27528
|
+
}
|
|
27529
|
+
if (!getSEOPageData) return paths.map((p) => ({ path: p }));
|
|
27530
|
+
return pooled(paths, RENDER_CONCURRENCY, async (p) => {
|
|
27531
|
+
try {
|
|
27532
|
+
const page = await getSEOPageData("", p);
|
|
27533
|
+
const title = page?.managed_title ?? page?.managed_og_title;
|
|
27534
|
+
const description = page?.managed_meta_description ?? page?.managed_og_description;
|
|
27535
|
+
const managedOgImage = page?.managed_og_image || void 0;
|
|
27536
|
+
return { path: p, title: title || void 0, description: description || void 0, managedOgImage };
|
|
27537
|
+
} catch {
|
|
27538
|
+
return { path: p };
|
|
27539
|
+
}
|
|
27540
|
+
});
|
|
27541
|
+
}
|
|
27542
|
+
async function readManagedOgImages(cwd) {
|
|
27543
|
+
if (!process.env.SONOR_API_KEY) return void 0;
|
|
27544
|
+
const appDir = chunkSEP5D4MI_js.findAppDirForDiscovery(cwd);
|
|
27545
|
+
if (!appDir) return void 0;
|
|
27546
|
+
const routes = [...new Set(chunkSEP5D4MI_js.discoverNextJsRoutes(appDir).map((r) => r.path))];
|
|
27547
|
+
const copy = await resolveRouteCopy(routes);
|
|
27548
|
+
return copy.filter((r) => r.managedOgImage).map((r) => r.path);
|
|
27549
|
+
}
|
|
27550
|
+
|
|
27156
27551
|
// src/cli/commands/doctor.ts
|
|
27157
27552
|
function countLevels(checks) {
|
|
27158
27553
|
return {
|
|
@@ -27165,6 +27560,11 @@ function countLevels(checks) {
|
|
|
27165
27560
|
async function collectChecks(cwd, online) {
|
|
27166
27561
|
const checks = await staticChecks(cwd);
|
|
27167
27562
|
if (online) {
|
|
27563
|
+
const managedOgImages = await readManagedOgImages(cwd).catch(() => void 0);
|
|
27564
|
+
if (managedOgImages) {
|
|
27565
|
+
const i = checks.findIndex((c) => c.id === "og.card");
|
|
27566
|
+
if (i !== -1) checks[i] = await checkOgCard(cwd, { managedOgImages });
|
|
27567
|
+
}
|
|
27168
27568
|
checks.push(await checkApiReachable(), await checkKeyValid(), await checkLlmsTxt());
|
|
27169
27569
|
checks.push(...await checkClientAuth());
|
|
27170
27570
|
}
|
|
@@ -27221,87 +27621,7 @@ async function statusCommand(options) {
|
|
|
27221
27621
|
const online = options.offline ? false : true;
|
|
27222
27622
|
await runCommand(ctx, (c) => run2(c, online), renderChecksHuman("Site-Kit Integration Status"));
|
|
27223
27623
|
}
|
|
27224
|
-
|
|
27225
|
-
// src/og/pages.ts
|
|
27226
|
-
var DYNAMIC = "*";
|
|
27227
|
-
function pathSegments(path29) {
|
|
27228
|
-
return path29.split("/").filter(Boolean);
|
|
27229
|
-
}
|
|
27230
|
-
function stripBrandSuffix(title, brand) {
|
|
27231
|
-
const cleaned = title.replace(/\s*[|–—-]\s*[^|–—-]+$/, "").trim();
|
|
27232
|
-
if (!cleaned) return title.trim();
|
|
27233
|
-
if (brand && cleaned.toLowerCase() === brand.toLowerCase()) return title.trim();
|
|
27234
|
-
return cleaned;
|
|
27235
|
-
}
|
|
27236
|
-
function titleFromPath(path29) {
|
|
27237
|
-
const last = pathSegments(path29).filter((s) => s !== DYNAMIC).pop();
|
|
27238
|
-
if (!last) return "Home";
|
|
27239
|
-
return last.replace(/[-_]+/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()).trim();
|
|
27240
|
-
}
|
|
27241
|
-
function kickerFromPath(path29, fallback) {
|
|
27242
|
-
const parts = pathSegments(path29);
|
|
27243
|
-
const section = parts.includes(DYNAMIC) ? parts.filter((s) => s !== DYNAMIC) : parts.slice(0, -1);
|
|
27244
|
-
if (!section.length) return fallback;
|
|
27245
|
-
return section.join(" / ").replace(/[-_]+/g, " ");
|
|
27246
|
-
}
|
|
27247
|
-
function clampSubtitle(text, max = 100) {
|
|
27248
|
-
if (!text) return void 0;
|
|
27249
|
-
const flat = text.replace(/\s+/g, " ").trim();
|
|
27250
|
-
if (!flat) return void 0;
|
|
27251
|
-
if (flat.length <= max) return flat;
|
|
27252
|
-
const sentence = flat.slice(0, max + 1).match(/^.*[.!?](?=\s|$)/)?.[0];
|
|
27253
|
-
if (sentence && sentence.length >= 30) return sentence.trim();
|
|
27254
|
-
return void 0;
|
|
27255
|
-
}
|
|
27256
|
-
function kickerIsRedundant(kicker, title) {
|
|
27257
|
-
if (!kicker) return false;
|
|
27258
|
-
const norm = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
|
|
27259
|
-
const k2 = norm(kicker);
|
|
27260
|
-
const t = norm(title);
|
|
27261
|
-
if (!k2) return true;
|
|
27262
|
-
if (t.includes(k2) || k2.includes(t)) return true;
|
|
27263
|
-
const titleWords = new Set(t.split(" "));
|
|
27264
|
-
return k2.split(" ").every((w) => titleWords.has(w));
|
|
27265
|
-
}
|
|
27266
|
-
function slugForPath(path29) {
|
|
27267
|
-
const segments = pathSegments(path29);
|
|
27268
|
-
if (!segments.length) return "home";
|
|
27269
|
-
return segments.map((s) => s === DYNAMIC ? "any" : s).join("-").replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "").toLowerCase();
|
|
27270
|
-
}
|
|
27271
|
-
function unmatchedCardKeys(cards, paths) {
|
|
27272
|
-
if (!cards) return [];
|
|
27273
|
-
const known = new Set(paths.flatMap((p) => [p, slugForPath(p)]));
|
|
27274
|
-
return Object.keys(cards).filter((key) => !known.has(key));
|
|
27275
|
-
}
|
|
27276
|
-
function pageCardConfig(base, route, brand) {
|
|
27277
|
-
const override = base.cards?.[route.path] ?? base.cards?.[slugForPath(route.path)];
|
|
27278
|
-
const isHome = route.path === "/";
|
|
27279
|
-
const derived = isHome ? { ...base, cards: void 0 } : (() => {
|
|
27280
|
-
const title = route.title ? stripBrandSuffix(route.title, brand) : titleFromPath(route.path);
|
|
27281
|
-
const kicker = kickerFromPath(route.path, base.content.kicker);
|
|
27282
|
-
return {
|
|
27283
|
-
...base,
|
|
27284
|
-
// `cards` is a build-time instruction, not part of a rendered card.
|
|
27285
|
-
cards: void 0,
|
|
27286
|
-
content: {
|
|
27287
|
-
...base.content,
|
|
27288
|
-
kicker: kickerIsRedundant(kicker, title) ? void 0 : kicker,
|
|
27289
|
-
title,
|
|
27290
|
-
subtitle: clampSubtitle(route.description) ?? base.content.subtitle
|
|
27291
|
-
}
|
|
27292
|
-
};
|
|
27293
|
-
})();
|
|
27294
|
-
if (!override) return derived;
|
|
27295
|
-
return {
|
|
27296
|
-
...derived,
|
|
27297
|
-
...override,
|
|
27298
|
-
content: { ...derived.content, ...override.content }
|
|
27299
|
-
};
|
|
27300
|
-
}
|
|
27301
|
-
|
|
27302
|
-
// src/cli/commands/og.ts
|
|
27303
27624
|
var execFileAsync5 = util.promisify(childProcess.execFile);
|
|
27304
|
-
var RENDER_CONCURRENCY = 4;
|
|
27305
27625
|
var CARD_KEY_FIX = "Key `cards` by route path (`/services/garage`) or slug (`services-garage`). A dynamic route is one `*` per dynamic level \u2014 `/services/*` for `[slug]`, plus a star for each nested `[param]`.";
|
|
27306
27626
|
var CHROME_CANDIDATES = [
|
|
27307
27627
|
process.env.SONOR_CHROME_PATH,
|
|
@@ -27314,7 +27634,7 @@ var CHROME_CANDIDATES = [
|
|
|
27314
27634
|
].filter((p) => !!p);
|
|
27315
27635
|
function findChrome() {
|
|
27316
27636
|
for (const candidate of CHROME_CANDIDATES) {
|
|
27317
|
-
if (
|
|
27637
|
+
if (fs20.existsSync(candidate)) return candidate;
|
|
27318
27638
|
}
|
|
27319
27639
|
return null;
|
|
27320
27640
|
}
|
|
@@ -27322,7 +27642,7 @@ async function loadConfig2(cwd) {
|
|
|
27322
27642
|
const candidates = ["og.config.ts", "og.config.mts", "og.config.mjs", "og.config.js"];
|
|
27323
27643
|
for (const rel of candidates) {
|
|
27324
27644
|
const full = path12__default.default.join(cwd, rel);
|
|
27325
|
-
if (!
|
|
27645
|
+
if (!fs20.existsSync(full)) continue;
|
|
27326
27646
|
try {
|
|
27327
27647
|
const mod = await import(
|
|
27328
27648
|
/* @vite-ignore */
|
|
@@ -27359,7 +27679,7 @@ async function seedConfig(cwd) {
|
|
|
27359
27679
|
} catch {
|
|
27360
27680
|
}
|
|
27361
27681
|
for (const candidate of ["/logo-mark.svg", "/logo.svg", "/logohorizontal.svg"]) {
|
|
27362
|
-
if (
|
|
27682
|
+
if (fs20.existsSync(path12__default.default.join(cwd, "public", candidate))) {
|
|
27363
27683
|
logo = candidate;
|
|
27364
27684
|
break;
|
|
27365
27685
|
}
|
|
@@ -27374,14 +27694,14 @@ async function seedConfig(cwd) {
|
|
|
27374
27694
|
function inlinePublicPaths(html, cwd) {
|
|
27375
27695
|
return html.replace(/src="(\/[^"]+)"/g, (_3, p) => {
|
|
27376
27696
|
const full = path12__default.default.join(cwd, "public", p);
|
|
27377
|
-
return
|
|
27697
|
+
return fs20.existsSync(full) ? `src="file://${full}"` : `src="${p}"`;
|
|
27378
27698
|
});
|
|
27379
27699
|
}
|
|
27380
27700
|
async function renderCard(config2, outPath, cwd, chrome, tmpSuffix) {
|
|
27381
27701
|
const tmpHtml = path12__default.default.join(cwd, `.sonor-og-${tmpSuffix}.html`);
|
|
27382
27702
|
try {
|
|
27383
27703
|
await fs3__default.default.mkdir(path12__default.default.dirname(outPath), { recursive: true });
|
|
27384
|
-
await fs3__default.default.writeFile(tmpHtml, inlinePublicPaths(
|
|
27704
|
+
await fs3__default.default.writeFile(tmpHtml, inlinePublicPaths(chunkOEW2LFOV_js.buildOgHtml(config2), cwd));
|
|
27385
27705
|
const { stdout } = await execFileAsync5(
|
|
27386
27706
|
chrome,
|
|
27387
27707
|
[
|
|
@@ -27402,15 +27722,15 @@ async function renderCard(config2, outPath, cwd, chrome, tmpSuffix) {
|
|
|
27402
27722
|
}
|
|
27403
27723
|
}
|
|
27404
27724
|
function parseReport(dom) {
|
|
27405
|
-
const raw = dom.match(new RegExp(`${
|
|
27725
|
+
const raw = dom.match(new RegExp(`${chunkCUNZAD46_js.OG_REPORT_ATTR}="([^"]*)"`))?.[1];
|
|
27406
27726
|
if (!raw) {
|
|
27407
|
-
return { fits: true, titlePx:
|
|
27727
|
+
return { fits: true, titlePx: chunkCUNZAD46_js.TITLE_MAX_PX, issues: ["card rendered but could not be measured (fitter did not run)"] };
|
|
27408
27728
|
}
|
|
27409
27729
|
try {
|
|
27410
27730
|
const decoded = raw.replace(/"/g, '"').replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
27411
27731
|
return JSON.parse(decoded);
|
|
27412
27732
|
} catch {
|
|
27413
|
-
return { fits: true, titlePx:
|
|
27733
|
+
return { fits: true, titlePx: chunkCUNZAD46_js.TITLE_MAX_PX, issues: ["card rendered but the fit report was unreadable"] };
|
|
27414
27734
|
}
|
|
27415
27735
|
}
|
|
27416
27736
|
async function compressCard(pngPath, cwd) {
|
|
@@ -27425,10 +27745,13 @@ async function compressCard(pngPath, cwd) {
|
|
|
27425
27745
|
return pngPath;
|
|
27426
27746
|
}
|
|
27427
27747
|
}
|
|
27748
|
+
function codeOgImageFile(dir) {
|
|
27749
|
+
return chunkSEP5D4MI_js.findConventionFile(dir, "opengraph-image") ?? chunkSEP5D4MI_js.findConventionFile(path12__default.default.join(dir, "opengraph-image"), "route");
|
|
27750
|
+
}
|
|
27428
27751
|
function discoverDynamicSegments(appDir) {
|
|
27429
27752
|
const found = [];
|
|
27430
27753
|
const walk = (dir, urlSegments, pattern) => {
|
|
27431
|
-
for (const entry of
|
|
27754
|
+
for (const entry of fs20.readdirSync(dir, { withFileTypes: true })) {
|
|
27432
27755
|
if (!entry.isDirectory()) continue;
|
|
27433
27756
|
if (entry.name.startsWith("_") || entry.name.startsWith(".")) continue;
|
|
27434
27757
|
if (entry.name === "api" || entry.name === "node_modules") continue;
|
|
@@ -27436,12 +27759,13 @@ function discoverDynamicSegments(appDir) {
|
|
|
27436
27759
|
const isGroup = entry.name.startsWith("(") && entry.name.endsWith(")");
|
|
27437
27760
|
const isDynamic = entry.name.startsWith("[") && entry.name.endsWith("]");
|
|
27438
27761
|
const nextUrl = isGroup || isDynamic ? urlSegments : [...urlSegments, entry.name];
|
|
27439
|
-
const nextPattern = isGroup ? pattern : [...pattern, isDynamic ? DYNAMIC : entry.name];
|
|
27762
|
+
const nextPattern = isGroup ? pattern : [...pattern, isDynamic ? chunkOEW2LFOV_js.DYNAMIC : entry.name];
|
|
27440
27763
|
if (isDynamic) {
|
|
27441
|
-
|
|
27442
|
-
if (hasPage) {
|
|
27764
|
+
if (chunkSEP5D4MI_js.hasPageFile(full)) {
|
|
27443
27765
|
found.push({ dir: full, path: `/${nextPattern.join("/")}`, parent: `/${urlSegments.join("/")}` });
|
|
27444
27766
|
}
|
|
27767
|
+
} else if (!isGroup && nextPattern.includes(chunkOEW2LFOV_js.DYNAMIC) && chunkSEP5D4MI_js.hasPageFile(full)) {
|
|
27768
|
+
found.push({ dir: full, path: `/${nextPattern.join("/")}`, parent: null });
|
|
27445
27769
|
}
|
|
27446
27770
|
walk(full, nextUrl, nextPattern);
|
|
27447
27771
|
}
|
|
@@ -27449,43 +27773,9 @@ function discoverDynamicSegments(appDir) {
|
|
|
27449
27773
|
walk(appDir, [], []);
|
|
27450
27774
|
return found;
|
|
27451
27775
|
}
|
|
27452
|
-
async function pooled(items, limit, fn) {
|
|
27453
|
-
const results = new Array(items.length);
|
|
27454
|
-
let cursor = 0;
|
|
27455
|
-
const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
|
|
27456
|
-
while (cursor < items.length) {
|
|
27457
|
-
const i = cursor++;
|
|
27458
|
-
results[i] = await fn(items[i], i);
|
|
27459
|
-
}
|
|
27460
|
-
});
|
|
27461
|
-
await Promise.all(workers);
|
|
27462
|
-
return results;
|
|
27463
|
-
}
|
|
27464
|
-
async function resolveRouteCopy(paths) {
|
|
27465
|
-
let getSEOPageData = null;
|
|
27466
|
-
try {
|
|
27467
|
-
if (process.env.SONOR_API_KEY) {
|
|
27468
|
-
;
|
|
27469
|
-
({ getSEOPageData } = await import('../api-XR5APCH3.js'));
|
|
27470
|
-
}
|
|
27471
|
-
} catch {
|
|
27472
|
-
getSEOPageData = null;
|
|
27473
|
-
}
|
|
27474
|
-
if (!getSEOPageData) return paths.map((p) => ({ path: p }));
|
|
27475
|
-
return pooled(paths, RENDER_CONCURRENCY, async (p) => {
|
|
27476
|
-
try {
|
|
27477
|
-
const page = await getSEOPageData("", p);
|
|
27478
|
-
const title = page?.managed_title ?? page?.managed_og_title;
|
|
27479
|
-
const description = page?.managed_meta_description ?? page?.managed_og_description;
|
|
27480
|
-
return { path: p, title: title || void 0, description: description || void 0 };
|
|
27481
|
-
} catch {
|
|
27482
|
-
return { path: p };
|
|
27483
|
-
}
|
|
27484
|
-
});
|
|
27485
|
-
}
|
|
27486
27776
|
function reportCard(label, report) {
|
|
27487
27777
|
if (report.fits && !report.issues.length) {
|
|
27488
|
-
const shrunk = report.titlePx <
|
|
27778
|
+
const shrunk = report.titlePx < chunkCUNZAD46_js.TITLE_MAX_PX ? source_default.gray(` (title fitted to ${report.titlePx}px)`) : "";
|
|
27489
27779
|
console.log(` ${source_default.green("\u2713")} ${label}${shrunk}`);
|
|
27490
27780
|
return true;
|
|
27491
27781
|
}
|
|
@@ -27527,6 +27817,7 @@ async function runOg(options) {
|
|
|
27527
27817
|
let cardKeyFix = null;
|
|
27528
27818
|
let pageCardsWritten = 0;
|
|
27529
27819
|
let totalCardBytes = 0;
|
|
27820
|
+
let managedOgImages;
|
|
27530
27821
|
const spinner = ora("Rendering the site card...").start();
|
|
27531
27822
|
try {
|
|
27532
27823
|
const report = await renderCard(config2, outPath, cwd, chrome, "site");
|
|
@@ -27544,11 +27835,11 @@ async function runOg(options) {
|
|
|
27544
27835
|
};
|
|
27545
27836
|
}
|
|
27546
27837
|
if (options.pages !== false) {
|
|
27547
|
-
const appDir =
|
|
27838
|
+
const appDir = chunkSEP5D4MI_js.findAppDirForDiscovery(cwd);
|
|
27548
27839
|
if (!appDir) {
|
|
27549
27840
|
console.log(source_default.yellow(" ! No app/ directory found \u2014 skipped per-page cards."));
|
|
27550
27841
|
} else {
|
|
27551
|
-
const routes = [...new Set(
|
|
27842
|
+
const routes = [...new Set(chunkSEP5D4MI_js.discoverNextJsRoutes(appDir).map((r) => r.path))];
|
|
27552
27843
|
if (!routes.length) {
|
|
27553
27844
|
console.log(source_default.yellow(" ! No static routes discovered \u2014 skipped per-page cards."));
|
|
27554
27845
|
} else {
|
|
@@ -27558,6 +27849,9 @@ async function runOg(options) {
|
|
|
27558
27849
|
const withCopy = await resolveRouteCopy(routes);
|
|
27559
27850
|
const named = withCopy.filter((r) => r.title).length;
|
|
27560
27851
|
copySpinner.stop();
|
|
27852
|
+
if (process.env.SONOR_API_KEY) {
|
|
27853
|
+
managedOgImages = withCopy.filter((r) => r.managedOgImage).map((r) => r.path);
|
|
27854
|
+
}
|
|
27561
27855
|
if (named) {
|
|
27562
27856
|
console.log(source_default.gray(` ${named}/${routes.length} titled from Sonor, the rest from the route path`));
|
|
27563
27857
|
} else {
|
|
@@ -27566,14 +27860,16 @@ async function runOg(options) {
|
|
|
27566
27860
|
const brand = config2.content.title.replace(/\n/g, " ").trim();
|
|
27567
27861
|
const copyByPath = new Map(withCopy.map((r) => [r.path, r]));
|
|
27568
27862
|
const dynamic = discoverDynamicSegments(appDir).map((seg) => ({
|
|
27569
|
-
...copyByPath.get(seg.parent)
|
|
27863
|
+
...seg.parent !== null && copyByPath.get(seg.parent) || {},
|
|
27570
27864
|
path: seg.path,
|
|
27571
27865
|
dir: seg.dir
|
|
27572
27866
|
}));
|
|
27573
27867
|
const targets = [...withCopy, ...dynamic];
|
|
27574
|
-
const
|
|
27868
|
+
const paramKeys = chunkOEW2LFOV_js.paramCardKeys(config2.cards, targets.map((t) => t.path));
|
|
27869
|
+
const paramRoutes = paramKeys.length ? await resolveRouteCopy(paramKeys.map((k2) => k2.path)) : [];
|
|
27870
|
+
const strayKeys = chunkOEW2LFOV_js.unmatchedCardKeys(config2.cards, targets.map((t) => t.path));
|
|
27575
27871
|
if (strayKeys.length) {
|
|
27576
|
-
const patterns = targets.filter((t) => t.path.includes(DYNAMIC)).map((t) => t.path);
|
|
27872
|
+
const patterns = targets.filter((t) => t.path.includes(chunkOEW2LFOV_js.DYNAMIC)).map((t) => t.path);
|
|
27577
27873
|
console.log(
|
|
27578
27874
|
source_default.yellow(
|
|
27579
27875
|
` ! ${strayKeys.length} \`cards\` key${strayKeys.length === 1 ? "" : "s"} in og.config.ts matched no route: ${strayKeys.join(", ")}`
|
|
@@ -27592,9 +27888,19 @@ async function runOg(options) {
|
|
|
27592
27888
|
});
|
|
27593
27889
|
cardKeyFix = CARD_KEY_FIX;
|
|
27594
27890
|
}
|
|
27595
|
-
const
|
|
27596
|
-
|
|
27597
|
-
|
|
27891
|
+
const placed = targets.map((route) => ({ ...route, dir: route.dir ?? routeOutputDir(appDir, route.path) }));
|
|
27892
|
+
const toRender = placed.filter((route) => !codeOgImageFile(route.dir));
|
|
27893
|
+
for (const route of placed.filter((r) => codeOgImageFile(r.dir))) {
|
|
27894
|
+
for (const ext2 of ["png", "jpg", "jpeg"]) {
|
|
27895
|
+
await fs3__default.default.rm(path12__default.default.join(route.dir, `opengraph-image.${ext2}`), { force: true });
|
|
27896
|
+
}
|
|
27897
|
+
const file = path12__default.default.relative(cwd, codeOgImageFile(route.dir));
|
|
27898
|
+
console.log(source_default.gray(` \u21B7 ${route.path} keeps its own ${file}`));
|
|
27899
|
+
checks.push({ id: "og.code-card", title: route.path, level: "ok", message: `Code-based card kept: ${file}` });
|
|
27900
|
+
}
|
|
27901
|
+
const reports = await pooled(toRender, RENDER_CONCURRENCY, async (route, i) => {
|
|
27902
|
+
const pageConfig = chunkOEW2LFOV_js.pageCardConfig(config2, route, brand);
|
|
27903
|
+
const dir = route.dir;
|
|
27598
27904
|
for (const ext2 of ["png", "jpg", "jpeg"]) {
|
|
27599
27905
|
await fs3__default.default.rm(path12__default.default.join(dir, `opengraph-image.${ext2}`), { force: true });
|
|
27600
27906
|
}
|
|
@@ -27607,10 +27913,36 @@ async function runOg(options) {
|
|
|
27607
27913
|
clean = reportCard(`${route.path} ${source_default.gray(path12__default.default.relative(cwd, file))}`, report) && clean;
|
|
27608
27914
|
checks.push(cardCheck(route.path, path12__default.default.relative(cwd, file), report));
|
|
27609
27915
|
}
|
|
27610
|
-
|
|
27611
|
-
|
|
27916
|
+
const paramDir = path12__default.default.join(cwd, "public", chunkOEW2LFOV_js.PARAM_CARD_DIR);
|
|
27917
|
+
await fs3__default.default.rm(paramDir, { recursive: true, force: true });
|
|
27918
|
+
let paramReports = [];
|
|
27919
|
+
if (paramRoutes.length) {
|
|
27920
|
+
console.log("");
|
|
27921
|
+
console.log(source_default.bold(" Per-URL cards") + source_default.gray(` public/${chunkOEW2LFOV_js.PARAM_CARD_DIR}/, declare with paramCardImage()`));
|
|
27922
|
+
paramReports = await pooled(paramRoutes, RENDER_CONCURRENCY, async (route, i) => {
|
|
27923
|
+
const pageConfig = chunkOEW2LFOV_js.pageCardConfig(config2, route, brand);
|
|
27924
|
+
const jpg = path12__default.default.join(cwd, "public", chunkOEW2LFOV_js.paramCardUrl(route.path));
|
|
27925
|
+
const png = jpg.replace(/\.jpg$/, ".png");
|
|
27926
|
+
const report = await renderCard(pageConfig, png, cwd, chrome, `param-${i}`);
|
|
27927
|
+
const file = await compressCard(png, cwd);
|
|
27928
|
+
if (file !== jpg) {
|
|
27929
|
+
report.fits = false;
|
|
27930
|
+
report.issues = [...report.issues, "sharp is needed to write per-URL cards as .jpg. Add it: pnpm add -D sharp"];
|
|
27931
|
+
}
|
|
27932
|
+
return { route, file, report };
|
|
27933
|
+
});
|
|
27934
|
+
for (const { route, file, report } of paramReports) {
|
|
27935
|
+
clean = reportCard(`${route.path} ${source_default.gray(path12__default.default.relative(cwd, file))}`, report) && clean;
|
|
27936
|
+
checks.push(cardCheck(route.path, path12__default.default.relative(cwd, file), report));
|
|
27937
|
+
}
|
|
27938
|
+
}
|
|
27939
|
+
pageCardsWritten = reports.length + paramReports.length;
|
|
27940
|
+
const bytes = await totalBytes([...reports, ...paramReports].map((r) => r.file));
|
|
27612
27941
|
totalCardBytes = bytes;
|
|
27613
|
-
console.log(source_default.gray(` ${(bytes / 1024 / 1024).toFixed(1)} MB of cards. Next serves
|
|
27942
|
+
console.log(source_default.gray(` ${(bytes / 1024 / 1024).toFixed(1)} MB of cards. Next serves the route cards automatically \u2014 no per-page metadata needed.`));
|
|
27943
|
+
if (paramReports.length) {
|
|
27944
|
+
console.log(source_default.gray(" Per-URL cards need the page to declare them: openGraph.images = [paramCardImage(path, { config })]."));
|
|
27945
|
+
}
|
|
27614
27946
|
}
|
|
27615
27947
|
}
|
|
27616
27948
|
}
|
|
@@ -27627,7 +27959,7 @@ async function runOg(options) {
|
|
|
27627
27959
|
console.log(source_default.gray(" (sharp not resolvable \u2014 skipped the 300px preview)"));
|
|
27628
27960
|
}
|
|
27629
27961
|
}
|
|
27630
|
-
const problems = checkOgWiring(cwd);
|
|
27962
|
+
const problems = checkOgWiring(cwd, { managedOgImages });
|
|
27631
27963
|
console.log("");
|
|
27632
27964
|
if (problems.length) {
|
|
27633
27965
|
console.log(source_default.yellow(" Metadata wiring:"));
|
|
@@ -27682,12 +28014,12 @@ function routeOutputDir(appDir, urlPath) {
|
|
|
27682
28014
|
let dir = appDir;
|
|
27683
28015
|
for (const segment of segments) {
|
|
27684
28016
|
const direct = path12__default.default.join(dir, segment);
|
|
27685
|
-
if (
|
|
28017
|
+
if (fs20.existsSync(direct)) {
|
|
27686
28018
|
dir = direct;
|
|
27687
28019
|
continue;
|
|
27688
28020
|
}
|
|
27689
|
-
const group =
|
|
27690
|
-
(e) => e.isDirectory() && e.name.startsWith("(") && e.name.endsWith(")") &&
|
|
28021
|
+
const group = fs20.existsSync(dir) ? fs20.readdirSync(dir, { withFileTypes: true }).find(
|
|
28022
|
+
(e) => e.isDirectory() && e.name.startsWith("(") && e.name.endsWith(")") && fs20.existsSync(path12__default.default.join(dir, e.name, segment))
|
|
27691
28023
|
) : void 0;
|
|
27692
28024
|
dir = group ? path12__default.default.join(dir, group.name, segment) : direct;
|
|
27693
28025
|
}
|
|
@@ -27705,7 +28037,7 @@ async function totalBytes(files) {
|
|
|
27705
28037
|
}
|
|
27706
28038
|
async function siteDomain(cwd) {
|
|
27707
28039
|
const envFile = path12__default.default.join(cwd, ".env.local");
|
|
27708
|
-
if (
|
|
28040
|
+
if (fs20.existsSync(envFile)) {
|
|
27709
28041
|
const env3 = await fs3__default.default.readFile(envFile, "utf-8").catch(() => "");
|
|
27710
28042
|
const url = env3.match(/^NEXT_PUBLIC_SITE_URL=(.+)$/m)?.[1]?.trim();
|
|
27711
28043
|
if (url) return url.replace(/\/+$/, "");
|
|
@@ -27829,14 +28161,14 @@ var hs = new RegExp(pe, "g");
|
|
|
27829
28161
|
var as = /\\\\/g;
|
|
27830
28162
|
var ls = /\\{/g;
|
|
27831
28163
|
var cs = /\\}/g;
|
|
27832
|
-
var
|
|
28164
|
+
var fs23 = /\\,/g;
|
|
27833
28165
|
var us = /\\./g;
|
|
27834
28166
|
var ds = 1e5;
|
|
27835
28167
|
function Ht(n5) {
|
|
27836
28168
|
return isNaN(n5) ? n5.charCodeAt(0) : parseInt(n5, 10);
|
|
27837
28169
|
}
|
|
27838
28170
|
function ps(n5) {
|
|
27839
|
-
return n5.replace(as, fe).replace(ls, ue).replace(cs, qt).replace(
|
|
28171
|
+
return n5.replace(as, fe).replace(ls, ue).replace(cs, qt).replace(fs23, de).replace(us, pe);
|
|
27840
28172
|
}
|
|
27841
28173
|
function ms(n5) {
|
|
27842
28174
|
return n5.replace(is, "\\").replace(rs, "{").replace(ns, "}").replace(os5, ",").replace(hs, ".");
|
|
@@ -29456,9 +29788,9 @@ var V = class extends events.EventEmitter {
|
|
|
29456
29788
|
return oi;
|
|
29457
29789
|
}
|
|
29458
29790
|
};
|
|
29459
|
-
var vi =
|
|
29460
|
-
var wt = { lstatSync:
|
|
29461
|
-
var Ue = (n5) => !n5 || n5 === wt || n5 ===
|
|
29791
|
+
var vi = fs20.realpathSync.native;
|
|
29792
|
+
var wt = { lstatSync: fs20.lstatSync, readdir: fs20.readdir, readdirSync: fs20.readdirSync, readlinkSync: fs20.readlinkSync, realpathSync: vi, promises: { lstat: fs3.lstat, readdir: fs3.readdir, readlink: fs3.readlink, realpath: fs3.realpath } };
|
|
29793
|
+
var Ue = (n5) => !n5 || n5 === wt || n5 === fs20__namespace ? wt : { ...wt, ...n5, promises: { ...wt.promises, ...n5.promises || {} } };
|
|
29462
29794
|
var $e = /^\\\\\?\\([a-z]:)\\?$/i;
|
|
29463
29795
|
var Ri = (n5) => n5.replace(/\//g, "\\").replace($e, "$1\\");
|
|
29464
29796
|
var Oi = /[\\\/]/;
|
|
@@ -31187,7 +31519,7 @@ function findManifestPath() {
|
|
|
31187
31519
|
let dir = baseDir;
|
|
31188
31520
|
for (let i = 0; i < 8; i++) {
|
|
31189
31521
|
const candidate = path12__default.default.join(dir, "agent-manifest.json");
|
|
31190
|
-
if (
|
|
31522
|
+
if (fs20__namespace.default.existsSync(candidate)) return candidate;
|
|
31191
31523
|
const parent = path12__default.default.dirname(dir);
|
|
31192
31524
|
if (parent === dir) break;
|
|
31193
31525
|
dir = parent;
|
|
@@ -31203,7 +31535,7 @@ async function run5(ctx, options) {
|
|
|
31203
31535
|
"Reinstall @sonordev/site-kit, or run `npm run build` if working from source."
|
|
31204
31536
|
);
|
|
31205
31537
|
}
|
|
31206
|
-
const manifest = JSON.parse(
|
|
31538
|
+
const manifest = JSON.parse(fs20__namespace.default.readFileSync(manifestPath, "utf-8"));
|
|
31207
31539
|
if (options.section) {
|
|
31208
31540
|
const section = options.section;
|
|
31209
31541
|
if (!(section in manifest)) {
|
|
@@ -31267,7 +31599,7 @@ async function syncCommand2(options) {
|
|
|
31267
31599
|
}
|
|
31268
31600
|
async function syncPagesToPortal(apiUrl, apiKey, dryRun) {
|
|
31269
31601
|
const spinner = ora("Discovering pages...").start();
|
|
31270
|
-
const appDir =
|
|
31602
|
+
const appDir = chunkSEP5D4MI_js.findAppDirForDiscovery();
|
|
31271
31603
|
if (!appDir) {
|
|
31272
31604
|
spinner.fail("Could not find app directory");
|
|
31273
31605
|
return;
|
|
@@ -31328,24 +31660,12 @@ async function syncPagesToPortal(apiUrl, apiKey, dryRun) {
|
|
|
31328
31660
|
syncSpinner.fail(`Sync failed: ${error2.message}`);
|
|
31329
31661
|
}
|
|
31330
31662
|
}
|
|
31331
|
-
function findAppDir() {
|
|
31332
|
-
const candidates = [
|
|
31333
|
-
path12__default.default.join(process.cwd(), "app"),
|
|
31334
|
-
path12__default.default.join(process.cwd(), "src", "app")
|
|
31335
|
-
];
|
|
31336
|
-
for (const candidate of candidates) {
|
|
31337
|
-
if (fs.existsSync(candidate)) {
|
|
31338
|
-
return candidate;
|
|
31339
|
-
}
|
|
31340
|
-
}
|
|
31341
|
-
return null;
|
|
31342
|
-
}
|
|
31343
31663
|
function discoverPages(appDir, currentPath = "", pages = []) {
|
|
31344
31664
|
const fullPath = path12__default.default.join(appDir, currentPath);
|
|
31345
|
-
if (!
|
|
31665
|
+
if (!fs20.existsSync(fullPath)) {
|
|
31346
31666
|
return pages;
|
|
31347
31667
|
}
|
|
31348
|
-
const entries =
|
|
31668
|
+
const entries = fs20.readdirSync(fullPath);
|
|
31349
31669
|
const hasPage = entries.some((entry) => PAGE_FILES.includes(entry));
|
|
31350
31670
|
if (hasPage) {
|
|
31351
31671
|
let urlPath = "/" + currentPath;
|
|
@@ -31364,7 +31684,7 @@ function discoverPages(appDir, currentPath = "", pages = []) {
|
|
|
31364
31684
|
}
|
|
31365
31685
|
for (const entry of entries) {
|
|
31366
31686
|
const entryPath = path12__default.default.join(fullPath, entry);
|
|
31367
|
-
const stat =
|
|
31687
|
+
const stat = fs20.statSync(entryPath);
|
|
31368
31688
|
if (stat.isDirectory()) {
|
|
31369
31689
|
const folderName = entry.toLowerCase();
|
|
31370
31690
|
if (IGNORED_FOLDERS.some((ignored) => folderName.includes(ignored))) {
|
|
@@ -31384,7 +31704,7 @@ function discoverPages(appDir, currentPath = "", pages = []) {
|
|
|
31384
31704
|
function findNextBuildDir() {
|
|
31385
31705
|
const cwd = process.cwd();
|
|
31386
31706
|
const candidate = path12__default.default.join(cwd, ".next", "server", "app");
|
|
31387
|
-
return
|
|
31707
|
+
return fs20.existsSync(candidate) ? candidate : null;
|
|
31388
31708
|
}
|
|
31389
31709
|
function extractPageContent(buildDir, pagePath) {
|
|
31390
31710
|
const baseName = pagePath === "/" ? "index" : pagePath.replace(/^\//, "");
|
|
@@ -31394,9 +31714,9 @@ function extractPageContent(buildDir, pagePath) {
|
|
|
31394
31714
|
];
|
|
31395
31715
|
let html = null;
|
|
31396
31716
|
for (const candidate of htmlCandidates) {
|
|
31397
|
-
if (
|
|
31717
|
+
if (fs20.existsSync(candidate)) {
|
|
31398
31718
|
try {
|
|
31399
|
-
html =
|
|
31719
|
+
html = fs20.readFileSync(candidate, "utf-8");
|
|
31400
31720
|
break;
|
|
31401
31721
|
} catch {
|
|
31402
31722
|
continue;
|
|
@@ -31409,9 +31729,9 @@ function extractPageContent(buildDir, pagePath) {
|
|
|
31409
31729
|
];
|
|
31410
31730
|
let rsc = null;
|
|
31411
31731
|
for (const candidate of rscCandidates) {
|
|
31412
|
-
if (
|
|
31732
|
+
if (fs20.existsSync(candidate)) {
|
|
31413
31733
|
try {
|
|
31414
|
-
rsc =
|
|
31734
|
+
rsc = fs20.readFileSync(candidate, "utf-8");
|
|
31415
31735
|
break;
|
|
31416
31736
|
} catch {
|
|
31417
31737
|
continue;
|
|
@@ -31517,17 +31837,17 @@ function findBlogDir() {
|
|
|
31517
31837
|
const cwd = process.cwd();
|
|
31518
31838
|
for (const dir of BLOG_DIRS) {
|
|
31519
31839
|
const full = path12__default.default.join(cwd, dir);
|
|
31520
|
-
if (
|
|
31840
|
+
if (fs20.existsSync(full)) return full;
|
|
31521
31841
|
}
|
|
31522
31842
|
return null;
|
|
31523
31843
|
}
|
|
31524
31844
|
async function discoverBlogPosts(dir) {
|
|
31525
31845
|
const posts = [];
|
|
31526
31846
|
async function walk(currentDir) {
|
|
31527
|
-
const entries =
|
|
31847
|
+
const entries = fs20.readdirSync(currentDir);
|
|
31528
31848
|
for (const entry of entries) {
|
|
31529
31849
|
const fullPath = path12__default.default.join(currentDir, entry);
|
|
31530
|
-
const stat =
|
|
31850
|
+
const stat = fs20.statSync(fullPath);
|
|
31531
31851
|
if (stat.isDirectory()) {
|
|
31532
31852
|
await walk(fullPath);
|
|
31533
31853
|
continue;
|
|
@@ -31591,10 +31911,10 @@ async function syncBlogToPortal(_apiUrl, _apiKey, _dryRun) {
|
|
|
31591
31911
|
async function discoverSchemaUsage(appDir) {
|
|
31592
31912
|
const usages = [];
|
|
31593
31913
|
async function walk(currentDir, currentPath = "") {
|
|
31594
|
-
const entries =
|
|
31914
|
+
const entries = fs20.readdirSync(currentDir);
|
|
31595
31915
|
for (const entry of entries) {
|
|
31596
31916
|
const fullPath = path12__default.default.join(currentDir, entry);
|
|
31597
|
-
const stat =
|
|
31917
|
+
const stat = fs20.statSync(fullPath);
|
|
31598
31918
|
if (stat.isDirectory()) {
|
|
31599
31919
|
if (entry.startsWith(".") || entry === "node_modules") continue;
|
|
31600
31920
|
await walk(fullPath, path12__default.default.join(currentPath, entry));
|
|
@@ -31639,7 +31959,7 @@ async function discoverSchemaUsage(appDir) {
|
|
|
31639
31959
|
return usages;
|
|
31640
31960
|
}
|
|
31641
31961
|
async function syncSchemasToPortal(apiUrl, apiKey, dryRun) {
|
|
31642
|
-
const appDir =
|
|
31962
|
+
const appDir = chunkSEP5D4MI_js.findAppDirForDiscovery();
|
|
31643
31963
|
if (!appDir) {
|
|
31644
31964
|
console.log(source_default.gray(" No app directory found"));
|
|
31645
31965
|
return;
|
|
@@ -31682,7 +32002,7 @@ async function apiRoutesCommand(options) {
|
|
|
31682
32002
|
console.log("");
|
|
31683
32003
|
console.log(source_default.bold(" Site-Kit API Routes"));
|
|
31684
32004
|
console.log("");
|
|
31685
|
-
const appDir =
|
|
32005
|
+
const appDir = chunkSEP5D4MI_js.findAppDirForDiscovery();
|
|
31686
32006
|
if (!appDir) {
|
|
31687
32007
|
console.log(source_default.red(" \u2717 Could not find app directory"));
|
|
31688
32008
|
console.log(source_default.gray(" Make sure you are in a Next.js project with an app directory"));
|
|
@@ -31691,7 +32011,7 @@ async function apiRoutesCommand(options) {
|
|
|
31691
32011
|
}
|
|
31692
32012
|
const routeDir = path12__default.default.join(appDir, "_uptrade", "api", "[...path]");
|
|
31693
32013
|
const routeFile = path12__default.default.join(routeDir, "route.ts");
|
|
31694
|
-
if (
|
|
32014
|
+
if (fs20.existsSync(routeFile) && !options.force) {
|
|
31695
32015
|
console.log(source_default.yellow(" \u26A0 API routes already exist"));
|
|
31696
32016
|
console.log(source_default.gray(` ${routeFile}`));
|
|
31697
32017
|
console.log("");
|
|
@@ -31725,18 +32045,6 @@ async function apiRoutesCommand(options) {
|
|
|
31725
32045
|
spinner.fail(`Failed to create API routes: ${error2.message}`);
|
|
31726
32046
|
}
|
|
31727
32047
|
}
|
|
31728
|
-
function findAppDir2() {
|
|
31729
|
-
const candidates = [
|
|
31730
|
-
path12__default.default.join(process.cwd(), "app"),
|
|
31731
|
-
path12__default.default.join(process.cwd(), "src", "app")
|
|
31732
|
-
];
|
|
31733
|
-
for (const candidate of candidates) {
|
|
31734
|
-
if (fs.existsSync(candidate)) {
|
|
31735
|
-
return candidate;
|
|
31736
|
-
}
|
|
31737
|
-
}
|
|
31738
|
-
return null;
|
|
31739
|
-
}
|
|
31740
32048
|
function generateRouteHandler() {
|
|
31741
32049
|
return `/**
|
|
31742
32050
|
* Sonor API Proxy
|
|
@@ -31841,12 +32149,12 @@ async function handleRequest(
|
|
|
31841
32149
|
`;
|
|
31842
32150
|
}
|
|
31843
32151
|
function detectPackageManager(cwd) {
|
|
31844
|
-
if (
|
|
31845
|
-
if (
|
|
32152
|
+
if (fs20.existsSync(path12__default.default.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
|
|
32153
|
+
if (fs20.existsSync(path12__default.default.join(cwd, "yarn.lock"))) return "yarn";
|
|
31846
32154
|
return "npm";
|
|
31847
32155
|
}
|
|
31848
32156
|
async function run6(ctx, options) {
|
|
31849
|
-
if (!
|
|
32157
|
+
if (!fs20.existsSync(path12__default.default.join(ctx.cwd, "package.json"))) {
|
|
31850
32158
|
throw new UsageError(
|
|
31851
32159
|
"NO_PACKAGE_JSON",
|
|
31852
32160
|
"No package.json found",
|
|
@@ -31891,18 +32199,18 @@ async function installCommand(options) {
|
|
|
31891
32199
|
await runCommand(ctx, (c) => run6(c, options), renderHuman4);
|
|
31892
32200
|
}
|
|
31893
32201
|
function detectPackageManager2(cwd) {
|
|
31894
|
-
if (
|
|
31895
|
-
if (
|
|
32202
|
+
if (fs20.existsSync(path12__default.default.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
|
|
32203
|
+
if (fs20.existsSync(path12__default.default.join(cwd, "yarn.lock"))) return "yarn";
|
|
31896
32204
|
return "npm";
|
|
31897
32205
|
}
|
|
31898
32206
|
async function run7(ctx, options) {
|
|
31899
32207
|
const pkgPath = path12__default.default.join(ctx.cwd, "package.json");
|
|
31900
|
-
if (!
|
|
32208
|
+
if (!fs20.existsSync(pkgPath)) {
|
|
31901
32209
|
throw new UsageError("NO_PACKAGE_JSON", "No package.json found", "Run this from your project root.");
|
|
31902
32210
|
}
|
|
31903
32211
|
let fromVersion = "unknown";
|
|
31904
32212
|
try {
|
|
31905
|
-
const pkg = JSON.parse(
|
|
32213
|
+
const pkg = JSON.parse(fs20.readFileSync(pkgPath, "utf-8"));
|
|
31906
32214
|
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
31907
32215
|
if (deps["@sonordev/site-kit"]) fromVersion = String(deps["@sonordev/site-kit"]).replace(/[\^~]/, "");
|
|
31908
32216
|
} catch {
|
|
@@ -31951,7 +32259,7 @@ async function scaffoldCommand(options) {
|
|
|
31951
32259
|
);
|
|
31952
32260
|
console.log("");
|
|
31953
32261
|
const cwd = process.cwd();
|
|
31954
|
-
const appDir =
|
|
32262
|
+
const appDir = chunkSEP5D4MI_js.findAppDirForDiscovery(cwd);
|
|
31955
32263
|
if (!appDir) {
|
|
31956
32264
|
console.log(source_default.red(" \u2717 No app directory found (app/ or src/app/)"));
|
|
31957
32265
|
process.exit(1);
|
|
@@ -31964,8 +32272,8 @@ async function scaffoldCommand(options) {
|
|
|
31964
32272
|
|
|
31965
32273
|
export default createSitemap({
|
|
31966
32274
|
// baseUrl auto-resolved from Portal via API key
|
|
31967
|
-
|
|
31968
|
-
|
|
32275
|
+
// llms.txt stays out of the sitemap on purpose: it's a plain-text duplicate
|
|
32276
|
+
// of these pages, and AI crawlers find it at /llms.txt anyway.
|
|
31969
32277
|
// optimizedLLMsTxt: true, // optional: static build writes optimized llms (CI)
|
|
31970
32278
|
// llmsPublicSummaryOnly: true, // optional: page list from Portal public summaries only
|
|
31971
32279
|
// additionalPaths: async () => [...],
|
|
@@ -32001,13 +32309,13 @@ export const GET = createLLMsFullTxtHandler({ preferStatic: true })
|
|
|
32001
32309
|
files.push(
|
|
32002
32310
|
{
|
|
32003
32311
|
path: path12__default.default.join(cwd, "proxy.ts"),
|
|
32004
|
-
label: "Proxy (security headers
|
|
32312
|
+
label: "Proxy (security headers, managed redirects)",
|
|
32005
32313
|
content: `import { createProxy } from '@sonordev/site-kit/proxy'
|
|
32006
32314
|
|
|
32007
|
-
// redirects
|
|
32008
|
-
//
|
|
32009
|
-
//
|
|
32010
|
-
export default createProxy({ redirects:
|
|
32315
|
+
// Sonor-managed redirects apply here. The rule list is cached in memory for
|
|
32316
|
+
// five minutes, so page loads rarely wait on it. Don't move them into
|
|
32317
|
+
// app/not-found.tsx: reading request headers there makes every page dynamic.
|
|
32318
|
+
export default createProxy({ redirects: true })
|
|
32011
32319
|
|
|
32012
32320
|
// Inlined on purpose: Next statically parses \`config.matcher\` at build time
|
|
32013
32321
|
// and rejects an imported value (Turbopack build error). Keep in sync with
|
|
@@ -32029,18 +32337,11 @@ export const GET = createManifest()
|
|
|
32029
32337
|
},
|
|
32030
32338
|
{
|
|
32031
32339
|
path: path12__default.default.join(appDir, "not-found.tsx"),
|
|
32032
|
-
label: "404 Page
|
|
32033
|
-
content:
|
|
32034
|
-
|
|
32035
|
-
|
|
32036
|
-
export default
|
|
32037
|
-
// Sonor-managed redirects resolve here, at the only place they can matter:
|
|
32038
|
-
// a URL that would otherwise 404. Successful page loads pay nothing.
|
|
32039
|
-
const managed = await resolveManagedRedirect()
|
|
32040
|
-
if (managed) {
|
|
32041
|
-
;(managed.permanent ? permanentRedirect : redirect)(managed.destination)
|
|
32042
|
-
}
|
|
32043
|
-
|
|
32340
|
+
label: "404 Page",
|
|
32341
|
+
content: `// Keep this component free of request APIs (headers, cookies). Next
|
|
32342
|
+
// renders the root 404 inside every page, so one headers() call here makes
|
|
32343
|
+
// the whole site dynamic. Managed redirects run in proxy.ts instead.
|
|
32344
|
+
export default function NotFound() {
|
|
32044
32345
|
return (
|
|
32045
32346
|
<div style={{ textAlign: 'center', padding: '4rem 1rem' }}>
|
|
32046
32347
|
<h1 style={{ fontSize: '3rem', fontWeight: 700, marginBottom: '0.5rem' }}>404</h1>
|
|
@@ -32160,9 +32461,9 @@ SONOR_API_KEY=sonor_your-project-uuid_your-secret-key
|
|
|
32160
32461
|
console.log(source_default.yellow(" [DRY RUN] Would create:"));
|
|
32161
32462
|
for (const f of files) {
|
|
32162
32463
|
const rel = path12__default.default.relative(cwd, f.path);
|
|
32163
|
-
const
|
|
32464
|
+
const exists2 = fs20.existsSync(f.path);
|
|
32164
32465
|
console.log(
|
|
32165
|
-
source_default.gray(` ${rel}`) + (
|
|
32466
|
+
source_default.gray(` ${rel}`) + (exists2 ? source_default.yellow(" (exists, would skip)") : "")
|
|
32166
32467
|
);
|
|
32167
32468
|
}
|
|
32168
32469
|
console.log("");
|
|
@@ -32173,7 +32474,7 @@ SONOR_API_KEY=sonor_your-project-uuid_your-secret-key
|
|
|
32173
32474
|
let skipped = 0;
|
|
32174
32475
|
for (const f of files) {
|
|
32175
32476
|
try {
|
|
32176
|
-
if (
|
|
32477
|
+
if (fs20.existsSync(f.path) && !options.force) {
|
|
32177
32478
|
spinner.warn(`Skipped (exists): ${path12__default.default.relative(cwd, f.path)}`);
|
|
32178
32479
|
skipped++;
|
|
32179
32480
|
continue;
|
|
@@ -32226,17 +32527,217 @@ SONOR_API_KEY=sonor_your-project-uuid_your-secret-key
|
|
|
32226
32527
|
console.log("");
|
|
32227
32528
|
}
|
|
32228
32529
|
}
|
|
32229
|
-
|
|
32230
|
-
|
|
32231
|
-
|
|
32232
|
-
|
|
32233
|
-
|
|
32234
|
-
|
|
32235
|
-
|
|
32236
|
-
|
|
32530
|
+
var LLMS_FILES = [
|
|
32531
|
+
{ path: "/llms.txt", handler: "createLLMsTxtHandler" },
|
|
32532
|
+
{ path: "/llms-full.txt", handler: "createLLMsFullTxtHandler" }
|
|
32533
|
+
];
|
|
32534
|
+
function read(cwd, rel) {
|
|
32535
|
+
try {
|
|
32536
|
+
return fs20__namespace.default.readFileSync(path12__default.default.join(cwd, rel), "utf-8");
|
|
32537
|
+
} catch {
|
|
32538
|
+
return "";
|
|
32237
32539
|
}
|
|
32540
|
+
}
|
|
32541
|
+
function exists(cwd, rel) {
|
|
32542
|
+
try {
|
|
32543
|
+
return fs20__namespace.default.existsSync(path12__default.default.join(cwd, rel));
|
|
32544
|
+
} catch {
|
|
32545
|
+
return false;
|
|
32546
|
+
}
|
|
32547
|
+
}
|
|
32548
|
+
function patternMatches(pattern, urlPath) {
|
|
32549
|
+
const re2 = pattern.trim().split(/\(\.\*\)|:\w+\*|\*/).map((part) => part.replace(/[.+?^${}()|[\]\\]/g, "\\$&")).join(".*");
|
|
32550
|
+
return new RegExp(`^${re2}$`).test(urlPath);
|
|
32551
|
+
}
|
|
32552
|
+
var NOINDEX = /noindex/i;
|
|
32553
|
+
function netlifyTomlNoindex(toml, urlPath) {
|
|
32554
|
+
const blocks = [];
|
|
32555
|
+
for (const line of toml.split("\n")) {
|
|
32556
|
+
const header = line.match(/^\s*\[\[?\s*([^\]]+?)\s*\]\]?\s*$/);
|
|
32557
|
+
if (header && header[1] !== "headers.values") blocks.push(line);
|
|
32558
|
+
else if (blocks.length) blocks[blocks.length - 1] += `
|
|
32559
|
+
${line}`;
|
|
32560
|
+
}
|
|
32561
|
+
return blocks.some((block) => {
|
|
32562
|
+
if (!/^\s*\[\[\s*headers\s*\]\]/.test(block)) return false;
|
|
32563
|
+
const pattern = block.match(/^\s*for\s*=\s*["']([^"']+)["']/m)?.[1];
|
|
32564
|
+
const value = block.match(/^\s*["']?X-Robots-Tag["']?\s*=\s*["']([^"']*)["']/im)?.[1];
|
|
32565
|
+
return !!pattern && !!value && NOINDEX.test(value) && patternMatches(pattern, urlPath);
|
|
32566
|
+
});
|
|
32567
|
+
}
|
|
32568
|
+
function headersFileNoindex(text, urlPath) {
|
|
32569
|
+
let current = null;
|
|
32570
|
+
for (const line of text.split("\n")) {
|
|
32571
|
+
if (!line.trim() || line.trim().startsWith("#")) continue;
|
|
32572
|
+
if (!/^\s/.test(line)) {
|
|
32573
|
+
current = line.trim();
|
|
32574
|
+
continue;
|
|
32575
|
+
}
|
|
32576
|
+
const m = line.match(/^\s+X-Robots-Tag\s*:\s*(.+)$/i);
|
|
32577
|
+
if (current && m && NOINDEX.test(m[1]) && patternMatches(current, urlPath)) return true;
|
|
32578
|
+
}
|
|
32579
|
+
return false;
|
|
32580
|
+
}
|
|
32581
|
+
function vercelJsonNoindex(text, urlPath) {
|
|
32582
|
+
try {
|
|
32583
|
+
const json = JSON.parse(text);
|
|
32584
|
+
return (json.headers ?? []).some(
|
|
32585
|
+
(rule) => !!rule.source && patternMatches(rule.source, urlPath) && (rule.headers ?? []).some((h) => /^x-robots-tag$/i.test(h.key ?? "") && NOINDEX.test(h.value ?? ""))
|
|
32586
|
+
);
|
|
32587
|
+
} catch {
|
|
32588
|
+
return false;
|
|
32589
|
+
}
|
|
32590
|
+
}
|
|
32591
|
+
function findHostNoindex(cwd, urlPath) {
|
|
32592
|
+
const toml = read(cwd, "netlify.toml");
|
|
32593
|
+
if (toml && netlifyTomlNoindex(toml, urlPath)) return "netlify.toml";
|
|
32594
|
+
const headers = read(cwd, "public/_headers");
|
|
32595
|
+
if (headers && headersFileNoindex(headers, urlPath)) return "public/_headers";
|
|
32596
|
+
const vercel = read(cwd, "vercel.json");
|
|
32597
|
+
if (vercel && vercelJsonNoindex(vercel, urlPath)) return "vercel.json";
|
|
32238
32598
|
return null;
|
|
32239
32599
|
}
|
|
32600
|
+
function readGraph(cwd, rel) {
|
|
32601
|
+
return exists(cwd, rel) ? readWithImports(cwd, rel, { maxDepth: 3, maxFiles: 60 }) : "";
|
|
32602
|
+
}
|
|
32603
|
+
var LINK_DISCOVERY_LINE = /^.*\bLink\b.*(llms[^\n]*describedby|describedby[^\n]*llms).*$/im;
|
|
32604
|
+
function findDiscoverySource(cwd) {
|
|
32605
|
+
for (const rel of chunkSEP5D4MI_js.findProxyFiles(cwd)) {
|
|
32606
|
+
const src = readGraph(cwd, rel);
|
|
32607
|
+
const viaFactory = /\bcreate(Proxy|Middleware)\s*\(/.test(src) && /\bllmsDiscovery\b(?!\s*:\s*false\b)/.test(src);
|
|
32608
|
+
if (viaFactory) return `${rel} (createProxy llmsDiscovery)`;
|
|
32609
|
+
if (src.includes("buildAiDiscoveryHeaders")) return `${rel} (buildAiDiscoveryHeaders)`;
|
|
32610
|
+
}
|
|
32611
|
+
const nextConfig = chunkSEP5D4MI_js.findNextConfig(cwd);
|
|
32612
|
+
if (nextConfig) {
|
|
32613
|
+
const src = read(cwd, nextConfig);
|
|
32614
|
+
if (/\bllmsTxtDiscoveryLink\s*:(?!\s*false\b)/.test(src)) return `${nextConfig} (llmsTxtDiscoveryLink)`;
|
|
32615
|
+
if (src.includes("buildAiDiscoveryHeaders")) return `${nextConfig} (buildAiDiscoveryHeaders)`;
|
|
32616
|
+
}
|
|
32617
|
+
for (const rel of ["netlify.toml", "public/_headers"]) {
|
|
32618
|
+
if (LINK_DISCOVERY_LINE.test(read(cwd, rel))) return rel;
|
|
32619
|
+
}
|
|
32620
|
+
return null;
|
|
32621
|
+
}
|
|
32622
|
+
function findLayoutHeadersAttempt(cwd) {
|
|
32623
|
+
const layout = chunkSEP5D4MI_js.findRootLayout(cwd);
|
|
32624
|
+
if (!layout) return null;
|
|
32625
|
+
const src = read(cwd, path12__default.default.relative(cwd, layout));
|
|
32626
|
+
return src.includes("buildAiDiscoveryHeaders") || /\bexport\s+(async\s+)?function\s+headers\b/.test(src) ? path12__default.default.relative(cwd, layout) : null;
|
|
32627
|
+
}
|
|
32628
|
+
function readGeoWiring(cwd) {
|
|
32629
|
+
const appDir = chunkSEP5D4MI_js.NEXT_APP_DIRS.find((rel) => exists(cwd, rel)) ?? null;
|
|
32630
|
+
const sitemap = chunkSEP5D4MI_js.findSitemapRoute(cwd);
|
|
32631
|
+
const sitemapSrc = sitemap ? readGraph(cwd, sitemap) : "";
|
|
32632
|
+
const sitemapListsLlms = /\bincludeLlms(Full)?TxtInSitemap\s*:\s*true\b/.test(sitemapSrc) || /['"`/]llms(-full)?\.txt['"`]/.test(sitemapSrc);
|
|
32633
|
+
const sitemapWritesStatic = /\bcreateSitemap\s*\(/.test(sitemapSrc);
|
|
32634
|
+
const writesLlms = sitemapWritesStatic && !/\boptimizedLLMsTxt\s*:\s*false\b/.test(sitemapSrc);
|
|
32635
|
+
const writesLlmsFull = writesLlms && /\boptimizedLLMsFullTxt\s*:\s*true\b/.test(sitemapSrc);
|
|
32636
|
+
const llms = LLMS_FILES.map(({ path: urlPath, handler }) => {
|
|
32637
|
+
const file = urlPath.slice(1);
|
|
32638
|
+
const routeAbs = appDir ? chunkSEP5D4MI_js.findConventionFile(path12__default.default.join(cwd, appDir, file), "route") : null;
|
|
32639
|
+
const route = routeAbs ? path12__default.default.relative(cwd, routeAbs) : null;
|
|
32640
|
+
const routeSrc = route ? readGraph(cwd, route) : "";
|
|
32641
|
+
const publicFile = exists(cwd, path12__default.default.join("public", file));
|
|
32642
|
+
const built = urlPath === "/llms.txt" ? writesLlms : writesLlmsFull;
|
|
32643
|
+
return {
|
|
32644
|
+
path: urlPath,
|
|
32645
|
+
route,
|
|
32646
|
+
routeUsesKitHandler: routeSrc.includes(handler),
|
|
32647
|
+
routeOptsOutOfNoindex: /\bnoindex\s*:\s*false\b/.test(routeSrc),
|
|
32648
|
+
routeSetsNoindex: /X-Robots-Tag/i.test(routeSrc) && NOINDEX.test(routeSrc),
|
|
32649
|
+
servedStatic: publicFile || built,
|
|
32650
|
+
staticReason: publicFile ? `public/${file}` : built ? `public/${file} (written by createSitemap at build)` : null,
|
|
32651
|
+
hostNoindex: findHostNoindex(cwd, urlPath)
|
|
32652
|
+
};
|
|
32653
|
+
});
|
|
32654
|
+
const discovery = findDiscoverySource(cwd);
|
|
32655
|
+
return {
|
|
32656
|
+
appDir,
|
|
32657
|
+
llms,
|
|
32658
|
+
sitemap,
|
|
32659
|
+
sitemapListsLlms,
|
|
32660
|
+
discovery,
|
|
32661
|
+
layoutHeadersAttempt: discovery ? null : findLayoutHeadersAttempt(cwd)
|
|
32662
|
+
};
|
|
32663
|
+
}
|
|
32664
|
+
var DISCOVERY_FIX = "Add llmsDiscovery to the proxy: createProxy({ llmsDiscovery: { siteUrl } }) in proxy.ts. Or withSiteKitConfig({ llmsTxtDiscoveryLink: true }) in next.config.";
|
|
32665
|
+
var SITEMAP_FIX = "Drop includeLlmsTxtInSitemap / includeLlmsFullTxtInSitemap (and any hand-added /llms*.txt entry) from the sitemap. A sitemap lists indexable HTML pages; AI crawlers find llms.txt at /llms.txt.";
|
|
32666
|
+
function hostNoindexFix(urlPath) {
|
|
32667
|
+
return `The CDN serves it before any route handler runs, so set the header in host config. netlify.toml: [[headers]] for = "${urlPath}" [headers.values] X-Robots-Tag = "noindex"`;
|
|
32668
|
+
}
|
|
32669
|
+
function judgeGeoWiring(facts) {
|
|
32670
|
+
const rows = [];
|
|
32671
|
+
for (const f of facts.llms) {
|
|
32672
|
+
const name = f.path.slice(1);
|
|
32673
|
+
const id = f.path === "/llms.txt" ? "llms" : "llms-full";
|
|
32674
|
+
const served = !!f.route || f.servedStatic;
|
|
32675
|
+
rows.push(
|
|
32676
|
+
served ? { id: `${id}.served`, label: `${name} served`, level: "ok", detail: f.route ?? f.staticReason ?? void 0 } : {
|
|
32677
|
+
id: `${id}.served`,
|
|
32678
|
+
label: `${name} served`,
|
|
32679
|
+
level: "fail",
|
|
32680
|
+
detail: `no ${facts.appDir ?? "app"}/${name}/route.* and no public/${name}`,
|
|
32681
|
+
fix: "Run: sonor-setup geo --ensure-routes"
|
|
32682
|
+
}
|
|
32683
|
+
);
|
|
32684
|
+
}
|
|
32685
|
+
if (!facts.sitemap) {
|
|
32686
|
+
rows.push({ id: "geo.sitemap", label: "sitemap leaves llms files out", level: "info", detail: "no sitemap route to check" });
|
|
32687
|
+
} else if (facts.sitemapListsLlms) {
|
|
32688
|
+
rows.push({
|
|
32689
|
+
id: "geo.sitemap",
|
|
32690
|
+
label: "sitemap leaves llms files out",
|
|
32691
|
+
level: "warn",
|
|
32692
|
+
detail: `${facts.sitemap} lists /llms.txt, inviting search engines to index a thin plain-text duplicate`,
|
|
32693
|
+
fix: SITEMAP_FIX
|
|
32694
|
+
});
|
|
32695
|
+
} else {
|
|
32696
|
+
rows.push({ id: "geo.sitemap", label: "sitemap leaves llms files out", level: "ok", detail: facts.sitemap });
|
|
32697
|
+
}
|
|
32698
|
+
rows.push(
|
|
32699
|
+
facts.discovery ? { id: "geo.discovery", label: 'discovery header (Link rel="describedby")', level: "ok", detail: facts.discovery } : {
|
|
32700
|
+
id: "geo.discovery",
|
|
32701
|
+
label: 'discovery header (Link rel="describedby")',
|
|
32702
|
+
level: "fail",
|
|
32703
|
+
detail: facts.layoutHeadersAttempt ? `${facts.layoutHeadersAttempt} exports headers(), which is a next.config API: from a layout it's never called and sends nothing` : "not wired in proxy, next.config, or host config",
|
|
32704
|
+
fix: DISCOVERY_FIX
|
|
32705
|
+
}
|
|
32706
|
+
);
|
|
32707
|
+
for (const f of facts.llms) {
|
|
32708
|
+
if (!f.route && !f.servedStatic) continue;
|
|
32709
|
+
const name = f.path.slice(1);
|
|
32710
|
+
const id = `${f.path === "/llms.txt" ? "llms" : "llms-full"}.noindex`;
|
|
32711
|
+
const label = `${name} sends X-Robots-Tag: noindex`;
|
|
32712
|
+
if (f.servedStatic) {
|
|
32713
|
+
rows.push(
|
|
32714
|
+
f.hostNoindex ? { id, label, level: "ok", detail: f.hostNoindex } : { id, label, level: "warn", detail: `${f.staticReason} is served without it`, fix: hostNoindexFix(f.path) }
|
|
32715
|
+
);
|
|
32716
|
+
continue;
|
|
32717
|
+
}
|
|
32718
|
+
if (f.hostNoindex) {
|
|
32719
|
+
rows.push({ id, label, level: "ok", detail: f.hostNoindex });
|
|
32720
|
+
} else if (f.routeUsesKitHandler && !f.routeOptsOutOfNoindex) {
|
|
32721
|
+
rows.push({ id, label, level: "ok", detail: `${f.route} (site-kit handler default)` });
|
|
32722
|
+
} else if (f.routeSetsNoindex) {
|
|
32723
|
+
rows.push({ id, label, level: "ok", detail: f.route });
|
|
32724
|
+
} else {
|
|
32725
|
+
rows.push({
|
|
32726
|
+
id,
|
|
32727
|
+
label,
|
|
32728
|
+
level: "warn",
|
|
32729
|
+
detail: f.routeOptsOutOfNoindex ? `${f.route} passes noindex: false` : `${f.route} doesn't set it`,
|
|
32730
|
+
fix: f.routeOptsOutOfNoindex ? "Drop noindex: false unless you want llms.txt in search results." : "Serve it with createLLMsTxtHandler (sends the header by default), or add X-Robots-Tag: noindex to the response."
|
|
32731
|
+
});
|
|
32732
|
+
}
|
|
32733
|
+
}
|
|
32734
|
+
return rows;
|
|
32735
|
+
}
|
|
32736
|
+
function checkGeoWiring(cwd) {
|
|
32737
|
+
return judgeGeoWiring(readGeoWiring(cwd));
|
|
32738
|
+
}
|
|
32739
|
+
|
|
32740
|
+
// src/cli/commands/geo.ts
|
|
32240
32741
|
var LLMS_ROUTE = `import { createLLMsTxtHandler } from '@sonordev/site-kit/llms'
|
|
32241
32742
|
|
|
32242
32743
|
export const GET = createLLMsTxtHandler({ preferStatic: true })
|
|
@@ -32245,40 +32746,36 @@ var LLMS_FULL_ROUTE = `import { createLLMsFullTxtHandler } from '@sonordev/site-
|
|
|
32245
32746
|
|
|
32246
32747
|
export const GET = createLLMsFullTxtHandler({ preferStatic: true })
|
|
32247
32748
|
`;
|
|
32248
|
-
|
|
32249
|
-
|
|
32250
|
-
|
|
32251
|
-
|
|
32252
|
-
|
|
32253
|
-
|
|
32254
|
-
}
|
|
32255
|
-
}
|
|
32749
|
+
var ICON = {
|
|
32750
|
+
ok: source_default.green(" \u2713 "),
|
|
32751
|
+
info: source_default.gray(" \xB7 "),
|
|
32752
|
+
warn: source_default.yellow(" ! "),
|
|
32753
|
+
fail: source_default.red(" \u2717 ")
|
|
32754
|
+
};
|
|
32256
32755
|
async function ensureLlmsRouteFiles(appDir, dryRun) {
|
|
32257
|
-
const llms = path12__default.default.join(appDir, "llms.txt", "route.ts");
|
|
32258
|
-
const llmsFull = path12__default.default.join(appDir, "llms-full.txt", "route.ts");
|
|
32259
32756
|
let n5 = 0;
|
|
32260
32757
|
if (dryRun) return 0;
|
|
32261
|
-
|
|
32262
|
-
|
|
32263
|
-
|
|
32264
|
-
|
|
32265
|
-
|
|
32266
|
-
|
|
32267
|
-
await fs3__default.default.mkdir(path12__default.default.dirname(
|
|
32268
|
-
await fs3__default.default.writeFile(
|
|
32758
|
+
for (const [dir, source] of [
|
|
32759
|
+
["llms.txt", LLMS_ROUTE],
|
|
32760
|
+
["llms-full.txt", LLMS_FULL_ROUTE]
|
|
32761
|
+
]) {
|
|
32762
|
+
if (chunkSEP5D4MI_js.findConventionFile(path12__default.default.join(appDir, dir), "route")) continue;
|
|
32763
|
+
const file = path12__default.default.join(appDir, dir, "route.ts");
|
|
32764
|
+
await fs3__default.default.mkdir(path12__default.default.dirname(file), { recursive: true });
|
|
32765
|
+
await fs3__default.default.writeFile(file, source, "utf-8");
|
|
32269
32766
|
n5++;
|
|
32270
32767
|
}
|
|
32271
32768
|
return n5;
|
|
32272
32769
|
}
|
|
32273
32770
|
async function geoCommand(options) {
|
|
32274
32771
|
if (options.forInstall) {
|
|
32275
|
-
const appDir2 =
|
|
32772
|
+
const appDir2 = chunkSEP5D4MI_js.findAppDirForDiscovery();
|
|
32276
32773
|
if (!appDir2) return;
|
|
32277
32774
|
const created = await ensureLlmsRouteFiles(appDir2, options.dryRun);
|
|
32278
32775
|
if (created > 0) {
|
|
32279
32776
|
console.log(
|
|
32280
32777
|
source_default.cyan(
|
|
32281
|
-
`[@sonordev/site-kit] Created ${created} llms route file(s). Set NEXT_PUBLIC_SITE_URL
|
|
32778
|
+
`[@sonordev/site-kit] Created ${created} llms route file(s). Set NEXT_PUBLIC_SITE_URL and add createProxy({ llmsDiscovery: { siteUrl } }) to proxy.ts when ready.`
|
|
32282
32779
|
)
|
|
32283
32780
|
);
|
|
32284
32781
|
}
|
|
@@ -32293,59 +32790,20 @@ async function geoCommand(options) {
|
|
|
32293
32790
|
)
|
|
32294
32791
|
);
|
|
32295
32792
|
console.log("");
|
|
32296
|
-
const appDir =
|
|
32793
|
+
const appDir = chunkSEP5D4MI_js.findAppDirForDiscovery();
|
|
32297
32794
|
if (!appDir) {
|
|
32298
32795
|
console.log(source_default.red(" \u2717 No app directory (app/ or src/app/)"));
|
|
32299
32796
|
process.exit(1);
|
|
32300
32797
|
}
|
|
32301
|
-
const llms = path12__default.default.join(appDir, "llms.txt", "route.ts");
|
|
32302
|
-
const llmsFull = path12__default.default.join(appDir, "llms-full.txt", "route.ts");
|
|
32303
|
-
const sitemap = path12__default.default.join(appDir, "sitemap.ts");
|
|
32304
32798
|
let allOk = true;
|
|
32305
|
-
const row
|
|
32306
|
-
if (
|
|
32307
|
-
|
|
32308
|
-
|
|
32309
|
-
)
|
|
32310
|
-
|
|
32311
|
-
row("llms.txt route", fs.existsSync(llms));
|
|
32312
|
-
row("llms-full.txt route", fs.existsSync(llmsFull));
|
|
32313
|
-
let sitemapHasLlms = false;
|
|
32314
|
-
if (fs.existsSync(sitemap)) {
|
|
32315
|
-
const txt = await readIfExists(sitemap);
|
|
32316
|
-
sitemapHasLlms = txt.includes("includeLlmsTxtInSitemap") || txt.includes("includeLlmsFullTxtInSitemap");
|
|
32317
|
-
row("sitemap.ts lists llms URLs", sitemapHasLlms);
|
|
32318
|
-
} else {
|
|
32319
|
-
row("sitemap.ts lists llms URLs", false);
|
|
32320
|
-
}
|
|
32321
|
-
const nextConfigs = [
|
|
32322
|
-
path12__default.default.join(cwd, "next.config.ts"),
|
|
32323
|
-
path12__default.default.join(cwd, "next.config.mjs"),
|
|
32324
|
-
path12__default.default.join(cwd, "next.config.js")
|
|
32325
|
-
];
|
|
32326
|
-
let nextCfg = "";
|
|
32327
|
-
for (const p of nextConfigs) {
|
|
32328
|
-
if (fs.existsSync(p)) {
|
|
32329
|
-
nextCfg = await readIfExists(p);
|
|
32330
|
-
break;
|
|
32799
|
+
for (const row of checkGeoWiring(cwd)) {
|
|
32800
|
+
if (row.level === "fail") allOk = false;
|
|
32801
|
+
const detail = row.detail ? source_default.gray(` ${row.detail}`) : "";
|
|
32802
|
+
console.log(`${ICON[row.level]}${row.label}${detail}`);
|
|
32803
|
+
if (row.fix && (row.level === "fail" || row.level === "warn")) {
|
|
32804
|
+
console.log(source_default.gray(` ${row.fix}`));
|
|
32331
32805
|
}
|
|
32332
32806
|
}
|
|
32333
|
-
const layoutCandidates = [
|
|
32334
|
-
path12__default.default.join(appDir, "layout.tsx"),
|
|
32335
|
-
path12__default.default.join(appDir, "layout.jsx"),
|
|
32336
|
-
path12__default.default.join(appDir, "layout.js")
|
|
32337
|
-
];
|
|
32338
|
-
let layoutTxt = "";
|
|
32339
|
-
for (const p of layoutCandidates) {
|
|
32340
|
-
layoutTxt = await readIfExists(p);
|
|
32341
|
-
if (layoutTxt) break;
|
|
32342
|
-
}
|
|
32343
|
-
const hasLayoutDiscovery = layoutTxt.includes("buildAiDiscoveryHeaders") || layoutTxt.includes("llmsTxtDiscoveryLink");
|
|
32344
|
-
const hasConfigDiscovery = nextCfg.includes("llmsTxtDiscoveryLink");
|
|
32345
|
-
row(
|
|
32346
|
-
"discovery header (next.config or root layout)",
|
|
32347
|
-
hasConfigDiscovery || hasLayoutDiscovery
|
|
32348
|
-
);
|
|
32349
32807
|
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL?.trim() || process.env.SITE_BASE_URL?.trim() || (process.env.VERCEL_URL?.trim() ? `https://${process.env.VERCEL_URL.replace(/\/$/, "")}` : "");
|
|
32350
32808
|
if (siteUrl) {
|
|
32351
32809
|
console.log(source_default.gray(` Public origin (env): ${siteUrl}`));
|
|
@@ -32371,19 +32829,16 @@ async function geoCommand(options) {
|
|
|
32371
32829
|
console.log(source_default.bold(" Automation"));
|
|
32372
32830
|
console.log("");
|
|
32373
32831
|
console.log(
|
|
32374
|
-
source_default.gray(
|
|
32375
|
-
" \u2022 next.config: withSiteKitConfig({ llmsTxtDiscoveryLink: true })"
|
|
32376
|
-
)
|
|
32832
|
+
source_default.gray(' \u2022 proxy.ts: createProxy({ llmsDiscovery: { siteUrl } }) (Link rel="describedby")')
|
|
32377
32833
|
);
|
|
32378
32834
|
console.log(
|
|
32379
|
-
source_default.gray(
|
|
32380
|
-
" (If you define your own headers() on nextConfig, merge Link manually.)"
|
|
32381
|
-
)
|
|
32835
|
+
source_default.gray(" or next.config: withSiteKitConfig({ llmsTxtDiscoveryLink: true })")
|
|
32382
32836
|
);
|
|
32383
32837
|
console.log(
|
|
32384
|
-
source_default.gray(
|
|
32385
|
-
|
|
32386
|
-
|
|
32838
|
+
source_default.gray(" \u2022 createLLMsTxtHandler sends X-Robots-Tag: noindex; a static public/llms.txt needs it in netlify.toml")
|
|
32839
|
+
);
|
|
32840
|
+
console.log(
|
|
32841
|
+
source_default.gray(" \u2022 Keep llms.txt out of the sitemap: AI crawlers find it at /llms.txt")
|
|
32387
32842
|
);
|
|
32388
32843
|
console.log(
|
|
32389
32844
|
source_default.gray(" \u2022 npx sonor-setup scaffold --minimal (routes + sitemap template)")
|
|
@@ -32396,7 +32851,7 @@ async function geoCommand(options) {
|
|
|
32396
32851
|
(0, import_dotenv2.config)({ path: ".env.local", quiet: true });
|
|
32397
32852
|
(0, import_dotenv2.config)({ path: ".env", quiet: true });
|
|
32398
32853
|
var program2 = new Command();
|
|
32399
|
-
program2.name("sonor-setup").description("Setup + verification toolchain for @sonordev/site-kit").version(
|
|
32854
|
+
program2.name("sonor-setup").description("Setup + verification toolchain for @sonordev/site-kit").version(chunk5O7JSWT6_js.SITE_KIT_VERSION);
|
|
32400
32855
|
withAgentFlags(
|
|
32401
32856
|
program2.command("verify").description("Verify the integration actually works (health + key + SSR) \u2014 exit 0 = done").option("--url <url>", "Verify a running/deployed URL server-renders (recommended for agents)").option("--offline", "Skip the network key-validity ping").option("--strict", "Treat warnings as failures")
|
|
32402
32857
|
).action(verifyCommand);
|