@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.
Files changed (632) hide show
  1. package/README.md +3 -3
  2. package/agent-manifest.json +24 -4
  3. package/dist/AnalyticsProvider-OCXRNIVE.js +33 -0
  4. package/dist/{AnalyticsProvider-6PXC7UDP.js.map → AnalyticsProvider-OCXRNIVE.js.map} +1 -1
  5. package/dist/AnalyticsProvider-ZAUONQCX.mjs +12 -0
  6. package/dist/{AnalyticsProvider-FVQIYSLY.mjs.map → AnalyticsProvider-ZAUONQCX.mjs.map} +1 -1
  7. package/dist/{BlogViewTracker-S4HSRCW7.js → BlogViewTracker-HK5C7PU6.js} +14 -11
  8. package/dist/BlogViewTracker-HK5C7PU6.js.map +1 -0
  9. package/dist/{BlogViewTracker-ZUGLBOVI.mjs → BlogViewTracker-KXRZHN3U.mjs} +13 -10
  10. package/dist/BlogViewTracker-KXRZHN3U.mjs.map +1 -0
  11. package/dist/ChatWidget-3OW5LY37.js +24 -0
  12. package/dist/{ChatWidget-2TQWCXWP.js.map → ChatWidget-3OW5LY37.js.map} +1 -1
  13. package/dist/ChatWidget-54GVS27I.mjs +15 -0
  14. package/dist/{ChatWidget-DG52ZIE6.mjs.map → ChatWidget-54GVS27I.mjs.map} +1 -1
  15. package/dist/EngageWidget-7EUP76WE.mjs +12 -0
  16. package/dist/{EngageWidget-2VUJADIU.mjs.map → EngageWidget-7EUP76WE.mjs.map} +1 -1
  17. package/dist/EngageWidget-DDP5UFA4.js +21 -0
  18. package/dist/{EngageWidget-Z7RC2INM.js.map → EngageWidget-DDP5UFA4.js.map} +1 -1
  19. package/dist/{FileField-FSQ7W3A5.mjs → FileField-IQLN6E3C.mjs} +5 -5
  20. package/dist/{FileField-FSQ7W3A5.mjs.map → FileField-IQLN6E3C.mjs.map} +1 -1
  21. package/dist/{FileField-UOQHL25J.js → FileField-SBPL4JHP.js} +6 -6
  22. package/dist/{FileField-UOQHL25J.js.map → FileField-SBPL4JHP.js.map} +1 -1
  23. package/dist/{FormSpotlight-RHL5FWM2.mjs → FormSpotlight-E2LKKHGV.mjs} +11 -7
  24. package/dist/FormSpotlight-E2LKKHGV.mjs.map +1 -0
  25. package/dist/{FormSpotlight-TED32NHP.js → FormSpotlight-YTACNE57.js} +25 -21
  26. package/dist/FormSpotlight-YTACNE57.js.map +1 -0
  27. package/dist/{FormStage-PFEBKHGY.js → FormStage-S277U2CP.js} +20 -15
  28. package/dist/FormStage-S277U2CP.js.map +1 -0
  29. package/dist/{FormStage-DINIRFOX.mjs → FormStage-YSBN5XKL.mjs} +9 -4
  30. package/dist/FormStage-YSBN5XKL.mjs.map +1 -0
  31. package/dist/ManagedForm-I3QVRQ53.mjs +16 -0
  32. package/dist/{ManagedForm-545YAUFC.mjs.map → ManagedForm-I3QVRQ53.mjs.map} +1 -1
  33. package/dist/ManagedForm-TSYKQFLJ.js +25 -0
  34. package/dist/{ManagedForm-43WLCUAK.js.map → ManagedForm-TSYKQFLJ.js.map} +1 -1
  35. package/dist/{ManagedNewsletterForm-ZPY5RRKX.mjs → ManagedNewsletterForm-T3YRAWKZ.mjs} +9 -7
  36. package/dist/ManagedNewsletterForm-T3YRAWKZ.mjs.map +1 -0
  37. package/dist/{ManagedNewsletterForm-I3QN57HB.js → ManagedNewsletterForm-YSOPPKS6.js} +10 -8
  38. package/dist/ManagedNewsletterForm-YSOPPKS6.js.map +1 -0
  39. package/dist/{SignalCore-EEH5IM4U.mjs → SignalCore-PPSIQ4BW.mjs} +8 -14
  40. package/dist/SignalCore-PPSIQ4BW.mjs.map +1 -0
  41. package/dist/{SignalCore-M4AXIMV4.js → SignalCore-SUZH3XWZ.js} +14 -20
  42. package/dist/SignalCore-SUZH3XWZ.js.map +1 -0
  43. package/dist/SitemapSync-HSHCOKCL.mjs +9 -0
  44. package/dist/{SitemapSync-46G7LVZS.mjs.map → SitemapSync-HSHCOKCL.mjs.map} +1 -1
  45. package/dist/SitemapSync-LH6UVP4P.js +18 -0
  46. package/dist/{SitemapSync-XK4JKCS7.js.map → SitemapSync-LH6UVP4P.js.map} +1 -1
  47. package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
  48. package/dist/analytics/index.js +10 -9
  49. package/dist/analytics/index.mjs +5 -4
  50. package/dist/blog/BlogLayout.d.ts +3 -1
  51. package/dist/blog/BlogLayout.d.ts.map +1 -1
  52. package/dist/blog/BlogList.d.ts +7 -1
  53. package/dist/blog/BlogList.d.ts.map +1 -1
  54. package/dist/blog/BlogPost.d.ts +20 -1
  55. package/dist/blog/BlogPost.d.ts.map +1 -1
  56. package/dist/blog/BlogSidebar.d.ts +3 -1
  57. package/dist/blog/BlogSidebar.d.ts.map +1 -1
  58. package/dist/blog/BlogViewTracker.d.ts +8 -2
  59. package/dist/blog/BlogViewTracker.d.ts.map +1 -1
  60. package/dist/blog/ClusterLandingPage.d.ts +3 -1
  61. package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
  62. package/dist/blog/ClusterNavigation.d.ts +5 -2
  63. package/dist/blog/ClusterNavigation.d.ts.map +1 -1
  64. package/dist/blog/RelatedPosts.d.ts +3 -1
  65. package/dist/blog/RelatedPosts.d.ts.map +1 -1
  66. package/dist/blog/index.d.ts +1 -1
  67. package/dist/blog/index.d.ts.map +1 -1
  68. package/dist/blog/index.js +40 -31
  69. package/dist/blog/index.js.map +1 -1
  70. package/dist/blog/index.mjs +11 -6
  71. package/dist/blog/index.mjs.map +1 -1
  72. package/dist/blog/metadata-images.test.d.ts +2 -0
  73. package/dist/blog/metadata-images.test.d.ts.map +1 -0
  74. package/dist/blog/not-found.test.d.ts +2 -0
  75. package/dist/blog/not-found.test.d.ts.map +1 -0
  76. package/dist/blog/processBlogHtml.d.ts +19 -2
  77. package/dist/blog/processBlogHtml.d.ts.map +1 -1
  78. package/dist/blog/public-reads.d.ts +27 -0
  79. package/dist/blog/public-reads.d.ts.map +1 -0
  80. package/dist/blog/server-core.d.ts +107 -16
  81. package/dist/blog/server-core.d.ts.map +1 -1
  82. package/dist/blog/server-ui.js +29 -23
  83. package/dist/blog/server-ui.js.map +1 -1
  84. package/dist/blog/server-ui.mjs +12 -6
  85. package/dist/blog/server-ui.mjs.map +1 -1
  86. package/dist/blog/server.d.ts +107 -16
  87. package/dist/blog/server.d.ts.map +1 -1
  88. package/dist/blog/server.js +54 -47
  89. package/dist/blog/server.mjs +5 -2
  90. package/dist/blog/site-scope.test.d.ts +2 -0
  91. package/dist/blog/site-scope.test.d.ts.map +1 -0
  92. package/dist/blog/static-params.test.d.ts +2 -0
  93. package/dist/blog/static-params.test.d.ts.map +1 -0
  94. package/dist/brand/extract-brand-profile.d.ts +36 -2
  95. package/dist/brand/extract-brand-profile.d.ts.map +1 -1
  96. package/dist/brand/extract-brand-profile.test.d.ts +2 -0
  97. package/dist/brand/extract-brand-profile.test.d.ts.map +1 -0
  98. package/dist/{chunk-B64AZC6P.js → chunk-2FQG2AHJ.js} +60 -35
  99. package/dist/chunk-2FQG2AHJ.js.map +1 -0
  100. package/dist/{chunk-N2PGTPWN.js → chunk-2OQWLXDO.js} +13 -13
  101. package/dist/{chunk-N2PGTPWN.js.map → chunk-2OQWLXDO.js.map} +1 -1
  102. package/dist/{chunk-T5VTQUNF.js → chunk-2SCDUVFJ.js} +10 -10
  103. package/dist/{chunk-T5VTQUNF.js.map → chunk-2SCDUVFJ.js.map} +1 -1
  104. package/dist/{chunk-S4RC6VAQ.js → chunk-35ERUUH3.js} +6 -6
  105. package/dist/{chunk-S4RC6VAQ.js.map → chunk-35ERUUH3.js.map} +1 -1
  106. package/dist/{chunk-VHZ4LHQT.mjs → chunk-3AUFD7KR.mjs} +3 -3
  107. package/dist/{chunk-VHZ4LHQT.mjs.map → chunk-3AUFD7KR.mjs.map} +1 -1
  108. package/dist/{chunk-DHIWR7CG.js → chunk-3BVCF4ZF.js} +4 -4
  109. package/dist/{chunk-DHIWR7CG.js.map → chunk-3BVCF4ZF.js.map} +1 -1
  110. package/dist/{chunk-EEQYKMGH.mjs → chunk-3EY5E35M.mjs} +57 -86
  111. package/dist/chunk-3EY5E35M.mjs.map +1 -0
  112. package/dist/{chunk-JNABXCLY.mjs → chunk-3SLFT453.mjs} +5 -5
  113. package/dist/{chunk-JNABXCLY.mjs.map → chunk-3SLFT453.mjs.map} +1 -1
  114. package/dist/{chunk-AJQI3WTN.mjs → chunk-4L7OHRWB.mjs} +12 -9
  115. package/dist/chunk-4L7OHRWB.mjs.map +1 -0
  116. package/dist/chunk-4LYW6PMU.mjs +72 -0
  117. package/dist/chunk-4LYW6PMU.mjs.map +1 -0
  118. package/dist/{chunk-R3KTBKSW.js → chunk-4OS6M3V4.js} +6 -12
  119. package/dist/chunk-4OS6M3V4.js.map +1 -0
  120. package/dist/{chunk-AY7JBGYC.js → chunk-4RY7JETY.js} +14 -14
  121. package/dist/{chunk-AY7JBGYC.js.map → chunk-4RY7JETY.js.map} +1 -1
  122. package/dist/chunk-4TLFZ6NR.mjs +16 -0
  123. package/dist/chunk-4TLFZ6NR.mjs.map +1 -0
  124. package/dist/{chunk-4B4S56WJ.mjs → chunk-5B4J3IBX.mjs} +75 -21
  125. package/dist/chunk-5B4J3IBX.mjs.map +1 -0
  126. package/dist/chunk-5O7JSWT6.js +8 -0
  127. package/dist/{chunk-KSL3WA2I.js.map → chunk-5O7JSWT6.js.map} +1 -1
  128. package/dist/chunk-5SANRSX3.mjs +17 -0
  129. package/dist/chunk-5SANRSX3.mjs.map +1 -0
  130. package/dist/{chunk-LCSYJXIO.mjs → chunk-5WGMXSCB.mjs} +3 -3
  131. package/dist/{chunk-LCSYJXIO.mjs.map → chunk-5WGMXSCB.mjs.map} +1 -1
  132. package/dist/chunk-5XFFUP6D.js +100 -0
  133. package/dist/chunk-5XFFUP6D.js.map +1 -0
  134. package/dist/{chunk-AHZR4VGY.mjs → chunk-6HFFTGFP.mjs} +50 -26
  135. package/dist/chunk-6HFFTGFP.mjs.map +1 -0
  136. package/dist/{chunk-USKIL6V6.mjs → chunk-6SBTHS6C.mjs} +3 -3
  137. package/dist/{chunk-USKIL6V6.mjs.map → chunk-6SBTHS6C.mjs.map} +1 -1
  138. package/dist/{chunk-NZSFOZJV.js → chunk-7TC3GRXQ.js} +73 -38
  139. package/dist/chunk-7TC3GRXQ.js.map +1 -0
  140. package/dist/{chunk-HIHAXEPD.mjs → chunk-7THZOAUR.mjs} +4 -4
  141. package/dist/{chunk-HIHAXEPD.mjs.map → chunk-7THZOAUR.mjs.map} +1 -1
  142. package/dist/{chunk-YCI36ZUS.mjs → chunk-AOWJP25J.mjs} +4 -4
  143. package/dist/{chunk-YCI36ZUS.mjs.map → chunk-AOWJP25J.mjs.map} +1 -1
  144. package/dist/{chunk-H44XZUOV.mjs → chunk-B2VFMPVJ.mjs} +4 -4
  145. package/dist/{chunk-H44XZUOV.mjs.map → chunk-B2VFMPVJ.mjs.map} +1 -1
  146. package/dist/{chunk-OA7KKOAK.mjs → chunk-B35OJ7FR.mjs} +4 -4
  147. package/dist/{chunk-OA7KKOAK.mjs.map → chunk-B35OJ7FR.mjs.map} +1 -1
  148. package/dist/{chunk-XR32C47O.js → chunk-BER36QXU.js} +9 -9
  149. package/dist/{chunk-XR32C47O.js.map → chunk-BER36QXU.js.map} +1 -1
  150. package/dist/{chunk-7C7XO5HX.mjs → chunk-BFZNLTWK.mjs} +3 -3
  151. package/dist/{chunk-7C7XO5HX.mjs.map → chunk-BFZNLTWK.mjs.map} +1 -1
  152. package/dist/chunk-BQP6JIE2.mjs +28 -0
  153. package/dist/chunk-BQP6JIE2.mjs.map +1 -0
  154. package/dist/{chunk-5KIO6FXE.js → chunk-C3WU45JT.js} +7 -7
  155. package/dist/{chunk-5KIO6FXE.js.map → chunk-C3WU45JT.js.map} +1 -1
  156. package/dist/chunk-CUNZAD46.js +53 -0
  157. package/dist/chunk-CUNZAD46.js.map +1 -0
  158. package/dist/chunk-CXAXZFFW.js +157 -0
  159. package/dist/chunk-CXAXZFFW.js.map +1 -0
  160. package/dist/{chunk-H4OBGC43.mjs → chunk-DA7IANFG.mjs} +14 -3
  161. package/dist/chunk-DA7IANFG.mjs.map +1 -0
  162. package/dist/{chunk-BWSMUSDB.js → chunk-EIW6YEPY.js} +8 -8
  163. package/dist/{chunk-BWSMUSDB.js.map → chunk-EIW6YEPY.js.map} +1 -1
  164. package/dist/{chunk-UU47DGHE.js → chunk-F6SKG34N.js} +8 -13
  165. package/dist/chunk-F6SKG34N.js.map +1 -0
  166. package/dist/{chunk-LC7AM4J5.js → chunk-FHPW7XVH.js} +77 -20
  167. package/dist/chunk-FHPW7XVH.js.map +1 -0
  168. package/dist/{chunk-JNRHTZL4.js → chunk-FVW6FT6L.js} +73 -29
  169. package/dist/chunk-FVW6FT6L.js.map +1 -0
  170. package/dist/{chunk-KY6M76JW.js → chunk-GNDWTXLU.js} +56 -177
  171. package/dist/chunk-GNDWTXLU.js.map +1 -0
  172. package/dist/{chunk-OZ3FU4BT.js → chunk-H5NBFNND.js} +2 -2
  173. package/dist/chunk-H5NBFNND.js.map +1 -0
  174. package/dist/{chunk-SYGGZZMU.js → chunk-HAKD27AZ.js} +7 -7
  175. package/dist/{chunk-SYGGZZMU.js.map → chunk-HAKD27AZ.js.map} +1 -1
  176. package/dist/chunk-HCN3IKMW.mjs +106 -0
  177. package/dist/chunk-HCN3IKMW.mjs.map +1 -0
  178. package/dist/{chunk-QNPVVWR7.mjs → chunk-HCX343AS.mjs} +4 -4
  179. package/dist/{chunk-QNPVVWR7.mjs.map → chunk-HCX343AS.mjs.map} +1 -1
  180. package/dist/{chunk-C2MSD2UM.mjs → chunk-HEOQT5SM.mjs} +216 -103
  181. package/dist/chunk-HEOQT5SM.mjs.map +1 -0
  182. package/dist/{chunk-RU54J2PY.mjs → chunk-HOJ4J4X2.mjs} +30 -12
  183. package/dist/chunk-HOJ4J4X2.mjs.map +1 -0
  184. package/dist/{chunk-H3D3ZGOJ.js → chunk-HQOHB6QF.js} +15 -15
  185. package/dist/{chunk-H3D3ZGOJ.js.map → chunk-HQOHB6QF.js.map} +1 -1
  186. package/dist/chunk-HRMGITUZ.mjs +6 -0
  187. package/dist/{chunk-DQUBETXH.mjs.map → chunk-HRMGITUZ.mjs.map} +1 -1
  188. package/dist/{chunk-7AUDKXY5.mjs → chunk-HYVEIP2N.mjs} +3 -3
  189. package/dist/{chunk-7AUDKXY5.mjs.map → chunk-HYVEIP2N.mjs.map} +1 -1
  190. package/dist/{chunk-46BMNWE6.js → chunk-I3ND4XYW.js} +12 -9
  191. package/dist/chunk-I3ND4XYW.js.map +1 -0
  192. package/dist/{chunk-53KMRZT7.js → chunk-JDTU2RWC.js} +3 -3
  193. package/dist/{chunk-53KMRZT7.js.map → chunk-JDTU2RWC.js.map} +1 -1
  194. package/dist/{chunk-GZJE23Y5.mjs → chunk-JLVCWC6A.mjs} +2 -2
  195. package/dist/chunk-JLVCWC6A.mjs.map +1 -0
  196. package/dist/chunk-K4TCEAUX.js +52 -0
  197. package/dist/chunk-K4TCEAUX.js.map +1 -0
  198. package/dist/chunk-KV7XXLJV.mjs +30 -0
  199. package/dist/chunk-KV7XXLJV.mjs.map +1 -0
  200. package/dist/{chunk-5UFDHGFE.mjs → chunk-L24RDT6Q.mjs} +3 -3
  201. package/dist/{chunk-5UFDHGFE.mjs.map → chunk-L24RDT6Q.mjs.map} +1 -1
  202. package/dist/{chunk-JE5DWAE6.js → chunk-LBZGYF3B.js} +4 -4
  203. package/dist/{chunk-JE5DWAE6.js.map → chunk-LBZGYF3B.js.map} +1 -1
  204. package/dist/{chunk-746RKQHA.js → chunk-LMEUYRRR.js} +93 -121
  205. package/dist/chunk-LMEUYRRR.js.map +1 -0
  206. package/dist/chunk-LVGSOW2F.js +32 -0
  207. package/dist/chunk-LVGSOW2F.js.map +1 -0
  208. package/dist/{chunk-KPKQKFT4.js → chunk-M45AL7EA.js} +37 -19
  209. package/dist/chunk-M45AL7EA.js.map +1 -0
  210. package/dist/{chunk-XK5AIWQG.js → chunk-MHX6TOAS.js} +3 -3
  211. package/dist/{chunk-XK5AIWQG.js.map → chunk-MHX6TOAS.js.map} +1 -1
  212. package/dist/chunk-MLVHVKFT.mjs +148 -0
  213. package/dist/chunk-MLVHVKFT.mjs.map +1 -0
  214. package/dist/{chunk-RIYAMYLV.mjs → chunk-N2NZBPQ5.mjs} +4 -10
  215. package/dist/chunk-N2NZBPQ5.mjs.map +1 -0
  216. package/dist/chunk-NRBITVDK.js +114 -0
  217. package/dist/chunk-NRBITVDK.js.map +1 -0
  218. package/dist/{chunk-IYCLN3XS.mjs → chunk-O4YBWJHP.mjs} +6 -11
  219. package/dist/chunk-O4YBWJHP.mjs.map +1 -0
  220. package/dist/{chunk-5KIEZHVK.mjs → chunk-O5ZSGBQD.mjs} +4 -4
  221. package/dist/{chunk-5KIEZHVK.mjs.map → chunk-O5ZSGBQD.mjs.map} +1 -1
  222. package/dist/{chunk-TP7H6BSK.mjs → chunk-OE7CTIOU.mjs} +73 -30
  223. package/dist/chunk-OE7CTIOU.mjs.map +1 -0
  224. package/dist/{chunk-UJ6CHZAI.mjs → chunk-OEW2LFOV.js} +169 -25
  225. package/dist/chunk-OEW2LFOV.js.map +1 -0
  226. package/dist/chunk-P4Y75QSU.js +19 -0
  227. package/dist/chunk-P4Y75QSU.js.map +1 -0
  228. package/dist/{chunk-6OP5XSMM.mjs → chunk-PK2OTGW5.mjs} +6 -12
  229. package/dist/chunk-PK2OTGW5.mjs.map +1 -0
  230. package/dist/{chunk-OC7AO7XS.js → chunk-PRTXAIIC.js} +15 -15
  231. package/dist/{chunk-OC7AO7XS.js.map → chunk-PRTXAIIC.js.map} +1 -1
  232. package/dist/{chunk-K2V3ZW36.mjs → chunk-PUAXHYBL.mjs} +3 -3
  233. package/dist/{chunk-K2V3ZW36.mjs.map → chunk-PUAXHYBL.mjs.map} +1 -1
  234. package/dist/chunk-QRHVMTHF.mjs +94 -0
  235. package/dist/chunk-QRHVMTHF.mjs.map +1 -0
  236. package/dist/{chunk-BZLIOT7Q.js → chunk-QTJTDQYR.js} +76 -111
  237. package/dist/chunk-QTJTDQYR.js.map +1 -0
  238. package/dist/{chunk-GJ6NOLGC.mjs → chunk-QVHVL7EX.mjs} +3 -3
  239. package/dist/{chunk-GJ6NOLGC.mjs.map → chunk-QVHVL7EX.mjs.map} +1 -1
  240. package/dist/chunk-R7GHP3FY.js +81 -0
  241. package/dist/chunk-R7GHP3FY.js.map +1 -0
  242. package/dist/chunk-SEP5D4MI.js +116 -0
  243. package/dist/chunk-SEP5D4MI.js.map +1 -0
  244. package/dist/{chunk-GPLCPMVD.mjs → chunk-TXMVU4EY.mjs} +62 -97
  245. package/dist/chunk-TXMVU4EY.mjs.map +1 -0
  246. package/dist/chunk-U2V542EO.mjs +98 -0
  247. package/dist/chunk-U2V542EO.mjs.map +1 -0
  248. package/dist/{chunk-YYN4YZYZ.js → chunk-UWHCHYCX.js} +4 -4
  249. package/dist/{chunk-YYN4YZYZ.js.map → chunk-UWHCHYCX.js.map} +1 -1
  250. package/dist/{chunk-473WDGQZ.mjs → chunk-VJ74275U.mjs} +38 -156
  251. package/dist/chunk-VJ74275U.mjs.map +1 -0
  252. package/dist/{chunk-H7274TKR.mjs → chunk-VJV7WUR2.mjs} +12 -4
  253. package/dist/chunk-VJV7WUR2.mjs.map +1 -0
  254. package/dist/{chunk-CQS5ZYI6.mjs → chunk-VYL6IHJA.mjs} +9 -9
  255. package/dist/{chunk-CQS5ZYI6.mjs.map → chunk-VYL6IHJA.mjs.map} +1 -1
  256. package/dist/{chunk-5B4FABFK.js → chunk-WS7MH3GD.js} +14 -2
  257. package/dist/chunk-WS7MH3GD.js.map +1 -0
  258. package/dist/{chunk-IPV2TUAT.js → chunk-XA2GJFVM.js} +12 -4
  259. package/dist/chunk-XA2GJFVM.js.map +1 -0
  260. package/dist/chunk-XBX2K3GA.js +33 -0
  261. package/dist/chunk-XBX2K3GA.js.map +1 -0
  262. package/dist/{chunk-X5TCH7VZ.js → chunk-XCYKM2SA.js} +6 -13
  263. package/dist/chunk-XCYKM2SA.js.map +1 -0
  264. package/dist/{chunk-6CJP7BFM.js → chunk-XZO5I4RS.mjs} +147 -20
  265. package/dist/chunk-XZO5I4RS.mjs.map +1 -0
  266. package/dist/chunk-Y5QZPUL3.mjs +47 -0
  267. package/dist/chunk-Y5QZPUL3.mjs.map +1 -0
  268. package/dist/{chunk-B6O7D5U4.js → chunk-YECDJDDD.js} +10 -10
  269. package/dist/{chunk-B6O7D5U4.js.map → chunk-YECDJDDD.js.map} +1 -1
  270. package/dist/chunk-YN7QHLWF.js +19 -0
  271. package/dist/chunk-YN7QHLWF.js.map +1 -0
  272. package/dist/chunk-YU7QZ3PP.mjs +45 -0
  273. package/dist/chunk-YU7QZ3PP.mjs.map +1 -0
  274. package/dist/{chunk-CQRLKNHQ.js → chunk-ZEOC26LZ.js} +223 -110
  275. package/dist/chunk-ZEOC26LZ.js.map +1 -0
  276. package/dist/{chunk-AEARU24Q.mjs → chunk-ZVI7MBVF.mjs} +73 -38
  277. package/dist/chunk-ZVI7MBVF.mjs.map +1 -0
  278. package/dist/cli/agent/checks.d.ts +15 -1
  279. package/dist/cli/agent/checks.d.ts.map +1 -1
  280. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts +2 -0
  281. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts.map +1 -0
  282. package/dist/cli/commands/api-routes.d.ts.map +1 -1
  283. package/dist/cli/commands/doctor.d.ts.map +1 -1
  284. package/dist/cli/commands/geo.d.ts +4 -0
  285. package/dist/cli/commands/geo.d.ts.map +1 -1
  286. package/dist/cli/commands/geo.test.d.ts +2 -0
  287. package/dist/cli/commands/geo.test.d.ts.map +1 -0
  288. package/dist/cli/commands/og.d.ts +31 -4
  289. package/dist/cli/commands/og.d.ts.map +1 -1
  290. package/dist/cli/commands/scaffold.d.ts +1 -2
  291. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  292. package/dist/cli/commands/sync.d.ts.map +1 -1
  293. package/dist/cli/generators/index.d.ts +5 -0
  294. package/dist/cli/generators/index.d.ts.map +1 -1
  295. package/dist/cli/generators/index.test.d.ts +2 -0
  296. package/dist/cli/generators/index.test.d.ts.map +1 -0
  297. package/dist/cli/index.js +921 -466
  298. package/dist/cli/index.js.map +1 -1
  299. package/dist/cli/index.mjs +862 -407
  300. package/dist/cli/index.mjs.map +1 -1
  301. package/dist/client/index.js +6 -6
  302. package/dist/client/index.mjs +5 -5
  303. package/dist/commerce/CheckoutForm.d.ts.map +1 -1
  304. package/dist/commerce/ProductDetail.d.ts.map +1 -1
  305. package/dist/commerce/api.d.ts +14 -0
  306. package/dist/commerce/api.d.ts.map +1 -1
  307. package/dist/commerce/discount-checkout.test.d.ts +2 -0
  308. package/dist/commerce/discount-checkout.test.d.ts.map +1 -0
  309. package/dist/commerce/index.d.ts +1 -1
  310. package/dist/commerce/index.d.ts.map +1 -1
  311. package/dist/commerce/index.js +61 -56
  312. package/dist/commerce/index.mjs +6 -5
  313. package/dist/config/index.js +3 -3
  314. package/dist/config/index.mjs +1 -1
  315. package/dist/discover-CYXYKHZ2.mjs +4 -0
  316. package/dist/{discover-BEJRYNFF.mjs.map → discover-CYXYKHZ2.mjs.map} +1 -1
  317. package/dist/discover-NGEPXZOD.js +21 -0
  318. package/dist/{discover-WVDYDUJX.js.map → discover-NGEPXZOD.js.map} +1 -1
  319. package/dist/engage/index.js +12 -10
  320. package/dist/engage/index.js.map +1 -1
  321. package/dist/engage/index.mjs +9 -7
  322. package/dist/engage/index.mjs.map +1 -1
  323. package/dist/fleet/index.js +8 -8
  324. package/dist/fleet/index.mjs +4 -4
  325. package/dist/forms/FormClient.d.ts.map +1 -1
  326. package/dist/forms/FormField.d.ts +7 -1
  327. package/dist/forms/FormField.d.ts.map +1 -1
  328. package/dist/forms/FormSpotlight.d.ts +1 -1
  329. package/dist/forms/FormSpotlight.d.ts.map +1 -1
  330. package/dist/forms/FormStage.d.ts +1 -1
  331. package/dist/forms/FormStage.d.ts.map +1 -1
  332. package/dist/forms/experience-plan.d.ts +0 -1
  333. package/dist/forms/experience-plan.d.ts.map +1 -1
  334. package/dist/forms/field-interactions.d.ts +63 -0
  335. package/dist/forms/field-interactions.d.ts.map +1 -0
  336. package/dist/forms/field-interactions.test.d.ts +8 -0
  337. package/dist/forms/field-interactions.test.d.ts.map +1 -0
  338. package/dist/forms/field-rules.d.ts +41 -0
  339. package/dist/forms/field-rules.d.ts.map +1 -0
  340. package/dist/forms/field-rules.test.d.ts +8 -0
  341. package/dist/forms/field-rules.test.d.ts.map +1 -0
  342. package/dist/forms/form-field-focus.test.d.ts +8 -0
  343. package/dist/forms/form-field-focus.test.d.ts.map +1 -0
  344. package/dist/forms/index.js +25 -23
  345. package/dist/forms/index.js.map +1 -1
  346. package/dist/forms/index.mjs +13 -11
  347. package/dist/forms/index.mjs.map +1 -1
  348. package/dist/forms/server.js +11 -11
  349. package/dist/forms/server.mjs +9 -9
  350. package/dist/forms/static.js +8 -8
  351. package/dist/forms/static.mjs +7 -7
  352. package/dist/forms/tracking-session.d.ts +48 -3
  353. package/dist/forms/tracking-session.d.ts.map +1 -1
  354. package/dist/forms/types.d.ts +11 -0
  355. package/dist/forms/types.d.ts.map +1 -1
  356. package/dist/forms/useForm.d.ts +8 -0
  357. package/dist/forms/useForm.d.ts.map +1 -1
  358. package/dist/forms/useFormTracking.d.ts +29 -4
  359. package/dist/forms/useFormTracking.d.ts.map +1 -1
  360. package/dist/images/index.js +11 -11
  361. package/dist/images/index.mjs +4 -4
  362. package/dist/index.js +72 -68
  363. package/dist/index.js.map +1 -1
  364. package/dist/index.mjs +14 -10
  365. package/dist/index.mjs.map +1 -1
  366. package/dist/layout/client.js +10 -10
  367. package/dist/layout/client.mjs +9 -9
  368. package/dist/layout/index.js +13 -12
  369. package/dist/layout/index.js.map +1 -1
  370. package/dist/layout/index.mjs +11 -10
  371. package/dist/layout/index.mjs.map +1 -1
  372. package/dist/llms/aiRobots.d.ts +24 -5
  373. package/dist/llms/aiRobots.d.ts.map +1 -1
  374. package/dist/llms/api.d.ts +8 -3
  375. package/dist/llms/api.d.ts.map +1 -1
  376. package/dist/llms/discovery-headers.d.ts +24 -0
  377. package/dist/llms/discovery-headers.d.ts.map +1 -1
  378. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  379. package/dist/llms/handlers.d.ts +20 -2
  380. package/dist/llms/handlers.d.ts.map +1 -1
  381. package/dist/llms/index.d.ts +2 -2
  382. package/dist/llms/index.d.ts.map +1 -1
  383. package/dist/llms/index.js +54 -98
  384. package/dist/llms/index.js.map +1 -1
  385. package/dist/llms/index.mjs +20 -83
  386. package/dist/llms/index.mjs.map +1 -1
  387. package/dist/llms/links.d.ts +26 -0
  388. package/dist/llms/links.d.ts.map +1 -0
  389. package/dist/llms/links.test.d.ts +2 -0
  390. package/dist/llms/links.test.d.ts.map +1 -0
  391. package/dist/llms/types.d.ts +15 -0
  392. package/dist/llms/types.d.ts.map +1 -1
  393. package/dist/llms/wiring.d.ts +103 -0
  394. package/dist/llms/wiring.d.ts.map +1 -0
  395. package/dist/llms/wiring.test.d.ts +2 -0
  396. package/dist/llms/wiring.test.d.ts.map +1 -0
  397. package/dist/llms/writeLLMsTxt.d.ts +9 -0
  398. package/dist/llms/writeLLMsTxt.d.ts.map +1 -1
  399. package/dist/maps/index.js +5 -5
  400. package/dist/maps/index.mjs +3 -3
  401. package/dist/motion/gsap.d.ts +54 -0
  402. package/dist/motion/gsap.d.ts.map +1 -1
  403. package/dist/motion/gsap.js +34 -4
  404. package/dist/motion/gsap.js.map +1 -1
  405. package/dist/motion/gsap.mjs +33 -5
  406. package/dist/motion/gsap.mjs.map +1 -1
  407. package/dist/motion/gsap.test.d.ts +2 -0
  408. package/dist/motion/gsap.test.d.ts.map +1 -0
  409. package/dist/og/config.d.ts +6 -0
  410. package/dist/og/config.d.ts.map +1 -1
  411. package/dist/og/contrast.d.ts +33 -0
  412. package/dist/og/contrast.d.ts.map +1 -0
  413. package/dist/og/index.d.ts +2 -0
  414. package/dist/og/index.d.ts.map +1 -1
  415. package/dist/og/index.js +26 -8
  416. package/dist/og/index.mjs +3 -1
  417. package/dist/og/pages.d.ts +101 -0
  418. package/dist/og/pages.d.ts.map +1 -1
  419. package/dist/og/route-copy.d.ts +34 -0
  420. package/dist/og/route-copy.d.ts.map +1 -0
  421. package/dist/og/route-fit.d.ts +77 -0
  422. package/dist/og/route-fit.d.ts.map +1 -0
  423. package/dist/og/route.d.ts +80 -20
  424. package/dist/og/route.d.ts.map +1 -1
  425. package/dist/og/route.js +195 -25
  426. package/dist/og/route.js.map +1 -1
  427. package/dist/og/route.mjs +193 -26
  428. package/dist/og/route.mjs.map +1 -1
  429. package/dist/og/route.test.d.ts +2 -0
  430. package/dist/og/route.test.d.ts.map +1 -0
  431. package/dist/og/template.d.ts.map +1 -1
  432. package/dist/og/wiring.d.ts +48 -4
  433. package/dist/og/wiring.d.ts.map +1 -1
  434. package/dist/proxy/index.d.ts +16 -11
  435. package/dist/proxy/index.d.ts.map +1 -1
  436. package/dist/proxy/index.js +15 -10
  437. package/dist/proxy/index.js.map +1 -1
  438. package/dist/proxy/index.mjs +12 -7
  439. package/dist/proxy/index.mjs.map +1 -1
  440. package/dist/proxy/llms-discovery.test.d.ts +2 -0
  441. package/dist/proxy/llms-discovery.test.d.ts.map +1 -0
  442. package/dist/redirects/index.d.ts +25 -1
  443. package/dist/redirects/index.d.ts.map +1 -1
  444. package/dist/redirects/index.js +11 -8
  445. package/dist/redirects/index.mjs +4 -1
  446. package/dist/redirects/index.test.d.ts +2 -0
  447. package/dist/redirects/index.test.d.ts.map +1 -0
  448. package/dist/redirects/not-found.d.ts +14 -29
  449. package/dist/redirects/not-found.d.ts.map +1 -1
  450. package/dist/redirects/not-found.js +15 -5
  451. package/dist/redirects/not-found.js.map +1 -1
  452. package/dist/redirects/not-found.mjs +11 -1
  453. package/dist/redirects/not-found.mjs.map +1 -1
  454. package/dist/robots/index.d.ts +7 -1
  455. package/dist/robots/index.d.ts.map +1 -1
  456. package/dist/robots/index.js +27 -1
  457. package/dist/robots/index.js.map +1 -1
  458. package/dist/robots/index.mjs +4 -1
  459. package/dist/robots/index.mjs.map +1 -1
  460. package/dist/robots/index.test.d.ts +2 -0
  461. package/dist/robots/index.test.d.ts.map +1 -0
  462. package/dist/robots/next-internals.d.ts +22 -0
  463. package/dist/robots/next-internals.d.ts.map +1 -0
  464. package/dist/search/index.js +4 -4
  465. package/dist/search/index.mjs +3 -3
  466. package/dist/seo/ManagedContent.d.ts +4 -2
  467. package/dist/seo/ManagedContent.d.ts.map +1 -1
  468. package/dist/seo/ManagedFAQ.d.ts.map +1 -1
  469. package/dist/seo/ManagedInternalLinks.d.ts.map +1 -1
  470. package/dist/seo/ManagedSchema.d.ts.map +1 -1
  471. package/dist/seo/client.js +6 -6
  472. package/dist/seo/client.mjs +5 -5
  473. package/dist/seo/getManagedMetadata.d.ts.map +1 -1
  474. package/dist/seo/getManagedMetadata.test.d.ts +2 -0
  475. package/dist/seo/getManagedMetadata.test.d.ts.map +1 -0
  476. package/dist/seo/index.js +59 -49
  477. package/dist/seo/index.js.map +1 -1
  478. package/dist/seo/index.mjs +29 -19
  479. package/dist/seo/index.mjs.map +1 -1
  480. package/dist/seo/managed-schema-filter.test.d.ts +2 -0
  481. package/dist/seo/managed-schema-filter.test.d.ts.map +1 -0
  482. package/dist/seo/register-sitemap-cli-impl.d.ts +32 -0
  483. package/dist/seo/register-sitemap-cli-impl.d.ts.map +1 -1
  484. package/dist/seo/register-sitemap-cli.d.ts +7 -0
  485. package/dist/seo/register-sitemap-cli.d.ts.map +1 -1
  486. package/dist/seo/register-sitemap-cli.js +273 -56
  487. package/dist/seo/register-sitemap-cli.js.map +1 -1
  488. package/dist/seo/register-sitemap-cli.mjs +269 -52
  489. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  490. package/dist/seo/register-sitemap-request.d.ts +36 -0
  491. package/dist/seo/register-sitemap-request.d.ts.map +1 -0
  492. package/dist/seo/register-sitemap-request.test.d.ts +2 -0
  493. package/dist/seo/register-sitemap-request.test.d.ts.map +1 -0
  494. package/dist/seo/routing.d.ts +2 -0
  495. package/dist/seo/routing.d.ts.map +1 -1
  496. package/dist/seo/schema-filter.d.ts +43 -0
  497. package/dist/seo/schema-filter.d.ts.map +1 -0
  498. package/dist/seo/schema-filter.test.d.ts +2 -0
  499. package/dist/seo/schema-filter.test.d.ts.map +1 -0
  500. package/dist/seo/server-api.d.ts +15 -2
  501. package/dist/seo/server-api.d.ts.map +1 -1
  502. package/dist/seo/server.js +23 -18
  503. package/dist/seo/server.mjs +7 -2
  504. package/dist/seo/site-scope.test.d.ts +2 -0
  505. package/dist/seo/site-scope.test.d.ts.map +1 -0
  506. package/dist/seo/types.d.ts +30 -0
  507. package/dist/seo/types.d.ts.map +1 -1
  508. package/dist/seo-meta/contract.d.ts +60 -0
  509. package/dist/seo-meta/contract.d.ts.map +1 -0
  510. package/dist/seo-meta/contract.js +41 -0
  511. package/dist/seo-meta/contract.js.map +1 -0
  512. package/dist/seo-meta/contract.mjs +4 -0
  513. package/dist/seo-meta/contract.mjs.map +1 -0
  514. package/dist/seo-meta/contract.test.d.ts +2 -0
  515. package/dist/seo-meta/contract.test.d.ts.map +1 -0
  516. package/dist/server/index.js +4 -3
  517. package/dist/server/index.mjs +3 -2
  518. package/dist/server/mint-site-token.d.ts +2 -32
  519. package/dist/server/mint-site-token.d.ts.map +1 -1
  520. package/dist/{server-api-RG3ZL3DV.mjs → server-api-A2EFCTZX.mjs} +7 -3
  521. package/dist/{server-api-RG3ZL3DV.mjs.map → server-api-A2EFCTZX.mjs.map} +1 -1
  522. package/dist/{server-api-RYJQAUGO.js → server-api-IWTZ7C3O.js} +25 -21
  523. package/dist/{server-api-RYJQAUGO.js.map → server-api-IWTZ7C3O.js.map} +1 -1
  524. package/dist/shared/build-entries.d.ts +2 -0
  525. package/dist/shared/build-entries.d.ts.map +1 -1
  526. package/dist/shared/fresh-fetch.d.ts +64 -0
  527. package/dist/shared/fresh-fetch.d.ts.map +1 -0
  528. package/dist/shared/fresh-fetch.test.d.ts +2 -0
  529. package/dist/shared/fresh-fetch.test.d.ts.map +1 -0
  530. package/dist/shared/next-files.d.ts +42 -0
  531. package/dist/shared/next-files.d.ts.map +1 -0
  532. package/dist/shared/next-files.test.d.ts +2 -0
  533. package/dist/shared/next-files.test.d.ts.map +1 -0
  534. package/dist/shared/page-leave.d.ts +27 -0
  535. package/dist/shared/page-leave.d.ts.map +1 -0
  536. package/dist/shared/page-leave.test.d.ts +2 -0
  537. package/dist/shared/page-leave.test.d.ts.map +1 -0
  538. package/dist/shared/source-graph.d.ts +63 -0
  539. package/dist/shared/source-graph.d.ts.map +1 -0
  540. package/dist/shared/source-graph.test.d.ts +2 -0
  541. package/dist/shared/source-graph.test.d.ts.map +1 -0
  542. package/dist/shared/version.d.ts +1 -1
  543. package/dist/signal/SignalCore.d.ts.map +1 -1
  544. package/dist/signal/index.js +11 -11
  545. package/dist/signal/index.mjs +2 -2
  546. package/dist/sitemap/discover.d.ts.map +1 -1
  547. package/dist/sitemap/index.d.ts +25 -5
  548. package/dist/sitemap/index.d.ts.map +1 -1
  549. package/dist/sitemap/index.js +54 -51
  550. package/dist/sitemap/index.js.map +1 -1
  551. package/dist/sitemap/index.mjs +39 -36
  552. package/dist/sitemap/index.mjs.map +1 -1
  553. package/dist/sitemap/shared.d.ts +65 -0
  554. package/dist/sitemap/shared.d.ts.map +1 -1
  555. package/dist/sitemap/trailing-slash.test.d.ts +2 -0
  556. package/dist/sitemap/trailing-slash.test.d.ts.map +1 -0
  557. package/dist/sites/resolve.d.ts.map +1 -1
  558. package/dist/sites/site-param.d.ts +16 -0
  559. package/dist/sites/site-param.d.ts.map +1 -0
  560. package/dist/sync/index.js +17 -17
  561. package/dist/sync/index.mjs +4 -4
  562. package/dist/writeLLMsTxt-CQ7A4AAL.js +20 -0
  563. package/dist/writeLLMsTxt-CQ7A4AAL.js.map +1 -0
  564. package/dist/writeLLMsTxt-NX5MSPYX.mjs +11 -0
  565. package/dist/writeLLMsTxt-NX5MSPYX.mjs.map +1 -0
  566. package/package.json +25 -22
  567. package/dist/AnalyticsProvider-6PXC7UDP.js +0 -32
  568. package/dist/AnalyticsProvider-FVQIYSLY.mjs +0 -11
  569. package/dist/BlogViewTracker-S4HSRCW7.js.map +0 -1
  570. package/dist/BlogViewTracker-ZUGLBOVI.mjs.map +0 -1
  571. package/dist/ChatWidget-2TQWCXWP.js +0 -22
  572. package/dist/ChatWidget-DG52ZIE6.mjs +0 -13
  573. package/dist/EngageWidget-2VUJADIU.mjs +0 -12
  574. package/dist/EngageWidget-Z7RC2INM.js +0 -21
  575. package/dist/FormSpotlight-RHL5FWM2.mjs.map +0 -1
  576. package/dist/FormSpotlight-TED32NHP.js.map +0 -1
  577. package/dist/FormStage-DINIRFOX.mjs.map +0 -1
  578. package/dist/FormStage-PFEBKHGY.js.map +0 -1
  579. package/dist/ManagedForm-43WLCUAK.js +0 -23
  580. package/dist/ManagedForm-545YAUFC.mjs +0 -14
  581. package/dist/ManagedNewsletterForm-I3QN57HB.js.map +0 -1
  582. package/dist/ManagedNewsletterForm-ZPY5RRKX.mjs.map +0 -1
  583. package/dist/SignalCore-EEH5IM4U.mjs.map +0 -1
  584. package/dist/SignalCore-M4AXIMV4.js.map +0 -1
  585. package/dist/SitemapSync-46G7LVZS.mjs +0 -9
  586. package/dist/SitemapSync-XK4JKCS7.js +0 -18
  587. package/dist/chunk-46BMNWE6.js.map +0 -1
  588. package/dist/chunk-473WDGQZ.mjs.map +0 -1
  589. package/dist/chunk-4B4S56WJ.mjs.map +0 -1
  590. package/dist/chunk-5B4FABFK.js.map +0 -1
  591. package/dist/chunk-6CJP7BFM.js.map +0 -1
  592. package/dist/chunk-6OP5XSMM.mjs.map +0 -1
  593. package/dist/chunk-746RKQHA.js.map +0 -1
  594. package/dist/chunk-AEARU24Q.mjs.map +0 -1
  595. package/dist/chunk-AHZR4VGY.mjs.map +0 -1
  596. package/dist/chunk-AJQI3WTN.mjs.map +0 -1
  597. package/dist/chunk-B64AZC6P.js.map +0 -1
  598. package/dist/chunk-BZLIOT7Q.js.map +0 -1
  599. package/dist/chunk-C2MSD2UM.mjs.map +0 -1
  600. package/dist/chunk-CQRLKNHQ.js.map +0 -1
  601. package/dist/chunk-DQUBETXH.mjs +0 -6
  602. package/dist/chunk-EEQYKMGH.mjs.map +0 -1
  603. package/dist/chunk-GPLCPMVD.mjs.map +0 -1
  604. package/dist/chunk-GZJE23Y5.mjs.map +0 -1
  605. package/dist/chunk-H4OBGC43.mjs.map +0 -1
  606. package/dist/chunk-H7274TKR.mjs.map +0 -1
  607. package/dist/chunk-IPV2TUAT.js.map +0 -1
  608. package/dist/chunk-IYCLN3XS.mjs.map +0 -1
  609. package/dist/chunk-JEOKDUPQ.js +0 -45
  610. package/dist/chunk-JEOKDUPQ.js.map +0 -1
  611. package/dist/chunk-JNRHTZL4.js.map +0 -1
  612. package/dist/chunk-KPKQKFT4.js.map +0 -1
  613. package/dist/chunk-KSL3WA2I.js +0 -8
  614. package/dist/chunk-KY6M76JW.js.map +0 -1
  615. package/dist/chunk-LC7AM4J5.js.map +0 -1
  616. package/dist/chunk-LOS5D6B3.js +0 -72
  617. package/dist/chunk-LOS5D6B3.js.map +0 -1
  618. package/dist/chunk-NZSFOZJV.js.map +0 -1
  619. package/dist/chunk-OZ3FU4BT.js.map +0 -1
  620. package/dist/chunk-QJU6HBSK.mjs +0 -39
  621. package/dist/chunk-QJU6HBSK.mjs.map +0 -1
  622. package/dist/chunk-R3KTBKSW.js.map +0 -1
  623. package/dist/chunk-RIYAMYLV.mjs.map +0 -1
  624. package/dist/chunk-RU54J2PY.mjs.map +0 -1
  625. package/dist/chunk-TP7H6BSK.mjs.map +0 -1
  626. package/dist/chunk-UJ6CHZAI.mjs.map +0 -1
  627. package/dist/chunk-UU47DGHE.js.map +0 -1
  628. package/dist/chunk-X5TCH7VZ.js.map +0 -1
  629. package/dist/chunk-XIJ4F6IE.mjs +0 -63
  630. package/dist/chunk-XIJ4F6IE.mjs.map +0 -1
  631. package/dist/discover-BEJRYNFF.mjs +0 -4
  632. 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 chunk6CJP7BFM_js = require('../chunk-6CJP7BFM.js');
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 chunkLOS5D6B3_js = require('../chunk-LOS5D6B3.js');
9
- var chunkKSL3WA2I_js = require('../chunk-KSL3WA2I.js');
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 fs = require('fs');
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 fs__namespace = /*#__PURE__*/_interopNamespace(fs);
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 fs29 = (0, node_1.default)();
6239
+ const fs31 = (0, node_1.default)();
6238
6240
  const handler = (err, buffer) => {
6239
6241
  if (fd) {
6240
- fs29.closeSync(fd);
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 = fs29.openSync(filepath, "r");
6254
+ fd = fs31.openSync(filepath, "r");
6253
6255
  let sample = Buffer.allocUnsafe(sampleSize);
6254
- fs29.read(fd, sample, 0, sampleSize, opts.offset, (err, bytesRead) => {
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
- fs29.readFile(filepath, handler);
6268
+ fs31.readFile(filepath, handler);
6267
6269
  });
6268
6270
  exports.detectFile = detectFile;
6269
6271
  var detectFileSync = (filepath, opts = {}) => {
6270
- const fs29 = (0, node_1.default)();
6272
+ const fs31 = (0, node_1.default)();
6271
6273
  if (opts && opts.sampleSize) {
6272
- const fd = fs29.openSync(filepath, "r");
6274
+ const fd = fs31.openSync(filepath, "r");
6273
6275
  let sample = Buffer.allocUnsafe(opts.sampleSize);
6274
- const bytesRead = fs29.readSync(fd, sample, 0, opts.sampleSize, opts.offset);
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
- fs29.closeSync(fd);
6280
+ fs31.closeSync(fd);
6279
6281
  return (0, exports.detect)(sample);
6280
6282
  }
6281
- return (0, exports.detect)(fs29.readFileSync(filepath));
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 (fs__namespace.default.existsSync(executableFile)) return;
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 (fs__namespace.default.existsSync(localBin)) return localBin;
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) => fs__namespace.default.existsSync(`${localBin}${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 = fs__namespace.default.realpathSync(this._scriptPath);
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(path29) {
13272
- if (path29 === void 0) return this._executableDir;
13273
- this._executableDir = path29;
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: chunkKSL3WA2I_js.SITE_KIT_VERSION,
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
- fs.rmSync(this.tempDir, { force: true, recursive: true });
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 = fs.mkdtempSync(path12__default.default.join(baseDir, "inquirer-editor-"));
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
- fs.writeFileSync(this.tempFile, this.text, opt);
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 = fs.readFileSync(this.tempFile);
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, path29 = "", value) => {
20382
+ set: (obj, path31 = "", value) => {
20381
20383
  let pointer = obj;
20382
- path29.split(".").forEach((key, index, arr) => {
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, path29 = "", defaultValue) => {
20394
- const travel = (regexp) => String.prototype.split.call(path29, regexp).filter(Boolean).reduce(
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(path29) {
20752
- const opening = path29.node.openingElement;
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(path29);
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 = path29.node.loc?.start.line || 0;
20760
- const endLine = path29.node.loc?.end.line || 0;
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 = path29.parentPath;
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(path29);
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: path29.node.loc?.start.line || 0,
20807
- endLine: path29.node.loc?.end.line || 0
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(path29) {
20826
- const opening = path29.node.openingElement;
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
- path29.traverse({
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(path29) {
20949
- const opening = path29.node.openingElement;
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(path29) {
21069
- const opening = path29.node.openingElement;
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
- path29.stop();
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(path29) {
21108
- const opening = path29.node.openingElement;
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: path29.node.loc?.start.line || 0,
21124
- endLine: path29.node.loc?.end.line || 0
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(path29) {
21264
- const opening = path29.node.openingElement;
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: path29.node.loc?.start.line || 0,
21292
- endLine: path29.node.loc?.end.line || 0
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(path29) {
21326
- const opening = path29.node.openingElement;
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: path29.node.loc?.start.line || 0,
21340
- endLine: path29.node.loc?.end.line || 0,
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
- path29.traverse({
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: path29.node.loc?.start.line || 0,
21365
- endLine: path29.node.loc?.end.line || 0,
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(path29) {
21489
- const opening = path29.node.openingElement;
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: path29.node.loc?.start.line || 0,
21518
- endLine: path29.node.loc?.end.line || 0
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(path29) {
22410
- const decl = path29.node.declaration;
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
- path29.stop();
22415
+ path31.stop();
22414
22416
  }
22415
22417
  },
22416
- ExportDefaultDeclaration(path29) {
22417
- const decl = path29.node.declaration;
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
- path29.stop();
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 file");
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
- const possiblePaths = [
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
- fs__namespace.default.statSync("/.dockerenv");
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 fs__namespace.default.readFileSync("/proc/self/cgroup", "utf8").includes("docker");
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
- fs__namespace.default.statSync("/run/.containerenv");
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 (fs__namespace.default.readFileSync("/proc/version", "utf8").toLowerCase().includes("microsoft")) {
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 (fs__namespace.default.existsSync("/proc/sys/fs/binfmt_misc/WSLInterop") || fs__namespace.default.existsSync("/run/WSL")) {
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 (path29) => {
22748
- if (/^[a-z]+:\/\//i.test(path29)) {
22749
- return path29;
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", path29], { encoding: "utf8" });
22739
+ const { stdout } = await execFile2("wslpath", ["-aw", path31], { encoding: "utf8" });
22753
22740
  return stdout.trim();
22754
22741
  } catch {
22755
- return path29;
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 fs.existsSync(current) || !fs.existsSync(legacy) ? current : legacy;
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 = fs.readFileSync(localPath);
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 (!fs.existsSync(resolvedPath)) {
25218
+ if (!fs20.existsSync(resolvedPath)) {
25232
25219
  spinner.fail(`File not found: ${sourcePath}`);
25233
25220
  return;
25234
25221
  }
25235
- const sourceCode = fs.readFileSync(resolvedPath, "utf-8");
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(path29) {
25244
- const openingElement = path29.node.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 (!fs.existsSync(templatePath)) {
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(fs.readFileSync(templatePath, "utf-8"));
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 = fs.readFileSync(locationsFile, "utf-8");
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 (fs.existsSync(tryPath)) {
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 (fs.existsSync(dir)) {
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 (fs.existsSync(tryPath)) {
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 (!fs.existsSync(dataFile)) continue;
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 APP_DIRS = ["app", path12__default.default.join("src", "app")];
26369
- var CARD_FILE = /^(opengraph-image|twitter-image)\b.*\.(png|jpe?g|gif|webp)$/i;
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 fs__namespace.default.existsSync(p);
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 = fs__namespace.default.readdirSync(dir, { withFileTypes: true });
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 APP_DIRS) walk(path12__default.default.join(cwd, rel));
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 readOgWiring(cwd) {
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 = ["app/layout.tsx", "src/app/layout.tsx"].map((rel) => path12__default.default.join(cwd, rel)).find(safeExists);
26658
+ const layoutPath = chunkSEP5D4MI_js.findRootLayout(cwd);
26401
26659
  let layout = "";
26402
26660
  if (layoutPath) {
26403
26661
  try {
26404
- layout = fs__namespace.default.readFileSync(layoutPath, "utf-8");
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: findPageCards(cwd),
26671
+ pageCards,
26411
26672
  layoutDeclaresImages: /images:\s*\[/.test(layout),
26412
- largeCard: /summary_large_image/.test(layout),
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 [{ message: "no app/layout.tsx found to verify metadata", fix: "Run this from the site root." }];
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
- problems.push({
26438
- message: "seo_pages.managed_og_image (if set in Sonor) overrides per-page cards the same way",
26439
- fix: "Clear managed_og_image for this project so each page serves its own card."
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 = await findFirst(cwd, LAYOUT_CANDIDATES);
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 sitemapPath = await findFirst(cwd, SITEMAP_CANDIDATES);
26626
- if (!sitemapPath) {
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(sitemapPath) || "";
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 proxyFiles = ["proxy.ts", "proxy.js", "src/proxy.ts", "src/proxy.js"];
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 middlewareFiles = ["middleware.ts", "middleware.js", "src/middleware.ts", "src/middleware.js"];
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 (fs.existsSync(candidate)) return candidate;
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 (!fs.existsSync(full)) continue;
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 (fs.existsSync(path12__default.default.join(cwd, "public", candidate))) {
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 fs.existsSync(full) ? `src="file://${full}"` : `src="${p}"`;
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(chunk6CJP7BFM_js.buildOgHtml(config2), cwd));
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(`${chunk6CJP7BFM_js.OG_REPORT_ATTR}="([^"]*)"`))?.[1];
27725
+ const raw = dom.match(new RegExp(`${chunkCUNZAD46_js.OG_REPORT_ATTR}="([^"]*)"`))?.[1];
27406
27726
  if (!raw) {
27407
- return { fits: true, titlePx: chunk6CJP7BFM_js.TITLE_MAX_PX, issues: ["card rendered but could not be measured (fitter did not run)"] };
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(/&quot;/g, '"').replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">");
27411
27731
  return JSON.parse(decoded);
27412
27732
  } catch {
27413
- return { fits: true, titlePx: chunk6CJP7BFM_js.TITLE_MAX_PX, issues: ["card rendered but the fit report was unreadable"] };
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 fs.readdirSync(dir, { withFileTypes: true })) {
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
- const hasPage = ["tsx", "jsx", "ts", "js"].some((ext2) => fs.existsSync(path12__default.default.join(full, `page.${ext2}`)));
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 < chunk6CJP7BFM_js.TITLE_MAX_PX ? source_default.gray(` (title fitted to ${report.titlePx}px)`) : "";
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 = chunkLOS5D6B3_js.findAppDirForDiscovery(cwd);
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(chunkLOS5D6B3_js.discoverNextJsRoutes(appDir).map((r) => r.path))];
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 strayKeys = unmatchedCardKeys(config2.cards, targets.map((t) => t.path));
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 reports = await pooled(targets, RENDER_CONCURRENCY, async (route, i) => {
27596
- const pageConfig = pageCardConfig(config2, route, brand);
27597
- const dir = route.dir ?? routeOutputDir(appDir, route.path);
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
- pageCardsWritten = reports.length;
27611
- const bytes = await totalBytes(reports.map((r) => r.file));
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 these automatically \u2014 no per-page metadata needed.`));
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 (fs.existsSync(direct)) {
28017
+ if (fs20.existsSync(direct)) {
27686
28018
  dir = direct;
27687
28019
  continue;
27688
28020
  }
27689
- const group = fs.existsSync(dir) ? fs.readdirSync(dir, { withFileTypes: true }).find(
27690
- (e) => e.isDirectory() && e.name.startsWith("(") && e.name.endsWith(")") && fs.existsSync(path12__default.default.join(dir, e.name, segment))
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 (fs.existsSync(envFile)) {
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 fs22 = /\\,/g;
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(fs22, de).replace(us, pe);
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 = fs.realpathSync.native;
29460
- var wt = { lstatSync: fs.lstatSync, readdir: fs.readdir, readdirSync: fs.readdirSync, readlinkSync: fs.readlinkSync, realpathSync: vi, promises: { lstat: fs3.lstat, readdir: fs3.readdir, readlink: fs3.readlink, realpath: fs3.realpath } };
29461
- var Ue = (n5) => !n5 || n5 === wt || n5 === fs__namespace ? wt : { ...wt, ...n5, promises: { ...wt.promises, ...n5.promises || {} } };
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 (fs__namespace.default.existsSync(candidate)) return candidate;
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(fs__namespace.default.readFileSync(manifestPath, "utf-8"));
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 = findAppDir();
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 (!fs.existsSync(fullPath)) {
31665
+ if (!fs20.existsSync(fullPath)) {
31346
31666
  return pages;
31347
31667
  }
31348
- const entries = fs.readdirSync(fullPath);
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 = fs.statSync(entryPath);
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 fs.existsSync(candidate) ? candidate : null;
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 (fs.existsSync(candidate)) {
31717
+ if (fs20.existsSync(candidate)) {
31398
31718
  try {
31399
- html = fs.readFileSync(candidate, "utf-8");
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 (fs.existsSync(candidate)) {
31732
+ if (fs20.existsSync(candidate)) {
31413
31733
  try {
31414
- rsc = fs.readFileSync(candidate, "utf-8");
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 (fs.existsSync(full)) return full;
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 = fs.readdirSync(currentDir);
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 = fs.statSync(fullPath);
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 = fs.readdirSync(currentDir);
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 = fs.statSync(fullPath);
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 = findAppDir();
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 = findAppDir2();
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 (fs.existsSync(routeFile) && !options.force) {
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 (fs.existsSync(path12__default.default.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
31845
- if (fs.existsSync(path12__default.default.join(cwd, "yarn.lock"))) return "yarn";
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 (!fs.existsSync(path12__default.default.join(ctx.cwd, "package.json"))) {
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 (fs.existsSync(path12__default.default.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
31895
- if (fs.existsSync(path12__default.default.join(cwd, "yarn.lock"))) return "yarn";
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 (!fs.existsSync(pkgPath)) {
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(fs.readFileSync(pkgPath, "utf-8"));
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 = await findAppDir3();
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
- includeLlmsTxtInSitemap: true,
31968
- includeLlmsFullTxtInSitemap: true,
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; redirects resolve at the 404 boundary)",
32312
+ label: "Proxy (security headers, managed redirects)",
32005
32313
  content: `import { createProxy } from '@sonordev/site-kit/proxy'
32006
32314
 
32007
- // redirects: false \u2014 managed redirects resolve in app/not-found.tsx via
32008
- // resolveManagedRedirect() instead of on every request. The proxy still
32009
- // stamps x-sk-path so the 404 boundary knows the requested URL.
32010
- export default createProxy({ redirects: false })
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 (resolves managed redirects)",
32033
- content: `import { redirect, permanentRedirect } from 'next/navigation'
32034
- import { resolveManagedRedirect } from '@sonordev/site-kit/redirects/not-found'
32035
-
32036
- export default async function NotFound() {
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 exists = fs.existsSync(f.path);
32464
+ const exists2 = fs20.existsSync(f.path);
32164
32465
  console.log(
32165
- source_default.gray(` ${rel}`) + (exists ? source_default.yellow(" (exists, would skip)") : "")
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 (fs.existsSync(f.path) && !options.force) {
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
- async function findAppDir3() {
32230
- const cwd = process.cwd();
32231
- const candidates = [
32232
- path12__default.default.join(cwd, "app"),
32233
- path12__default.default.join(cwd, "src", "app")
32234
- ];
32235
- for (const dir of candidates) {
32236
- if (fs.existsSync(dir)) return dir;
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
- async function readIfExists(p) {
32249
- if (!fs.existsSync(p)) return "";
32250
- try {
32251
- return await fs3__default.default.readFile(p, "utf-8");
32252
- } catch {
32253
- return "";
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
- if (!fs.existsSync(llms)) {
32262
- await fs3__default.default.mkdir(path12__default.default.dirname(llms), { recursive: true });
32263
- await fs3__default.default.writeFile(llms, LLMS_ROUTE, "utf-8");
32264
- n5++;
32265
- }
32266
- if (!fs.existsSync(llmsFull)) {
32267
- await fs3__default.default.mkdir(path12__default.default.dirname(llmsFull), { recursive: true });
32268
- await fs3__default.default.writeFile(llmsFull, LLMS_FULL_ROUTE, "utf-8");
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 = await findAppDir3();
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, use createSitemap({ includeLlmsTxtInSitemap: true }), and withSiteKitConfig({ llmsTxtDiscoveryLink: true }) when ready.`
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 = await findAppDir3();
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 = (label, pass) => {
32306
- if (!pass) allOk = false;
32307
- console.log(
32308
- (pass ? source_default.green(" \u2713 ") : source_default.red(" \u2717 ")) + label
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
- " \u2022 createSitemap({ includeLlmsTxtInSitemap: true, includeLlmsFullTxtInSitemap: true })"
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(chunkKSL3WA2I_js.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);