@407dev/cms-astro 0.1.0 → 0.2.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 (145) hide show
  1. package/README.md +4 -4
  2. package/dist/{chunk-7E3XJLKX.js → chunk-SGHAANOW.js} +30 -3
  3. package/dist/chunk-SGHAANOW.js.map +1 -0
  4. package/dist/{chunk-QYUVAKMC.js → chunk-YCQMH2T7.js} +51 -10
  5. package/dist/chunk-YCQMH2T7.js.map +1 -0
  6. package/dist/fields/collections.js +1 -1
  7. package/dist/index.d.ts +8 -1
  8. package/dist/index.js +32 -31
  9. package/dist/index.js.map +1 -1
  10. package/dist/middleware/index.js +2 -2
  11. package/package.json +5 -5
  12. package/src/client.ts +0 -1
  13. package/src/fields/attrs.ts +4 -0
  14. package/src/fields/collection.ts +8 -0
  15. package/src/fields/entryScope.test.ts +22 -1
  16. package/src/fields/index.ts +10 -1
  17. package/src/index.test.ts +117 -1
  18. package/src/integration.ts +29 -7
  19. package/src/middleware/preview.test.ts +39 -7
  20. package/src/middleware/preview.ts +18 -4
  21. package/src/preview/bridge-script.test.ts +81 -2
  22. package/src/preview/bridge-script.ts +30 -1
  23. package/dist/chunk-53OQ5RXJ.js +0 -912
  24. package/dist/chunk-53OQ5RXJ.js.map +0 -1
  25. package/dist/chunk-56OMNQLH.js +0 -1013
  26. package/dist/chunk-56OMNQLH.js.map +0 -1
  27. package/dist/chunk-5AOOMQ7K.js +0 -1031
  28. package/dist/chunk-5AOOMQ7K.js.map +0 -1
  29. package/dist/chunk-5XRUCFDC.js +0 -743
  30. package/dist/chunk-5XRUCFDC.js.map +0 -1
  31. package/dist/chunk-62ZHCOLZ.js +0 -25
  32. package/dist/chunk-62ZHCOLZ.js.map +0 -1
  33. package/dist/chunk-6AZLRSYA.js +0 -126
  34. package/dist/chunk-6AZLRSYA.js.map +0 -1
  35. package/dist/chunk-6L3ZTCFB.js +0 -14
  36. package/dist/chunk-6L3ZTCFB.js.map +0 -1
  37. package/dist/chunk-6O7ZNNDT.js +0 -697
  38. package/dist/chunk-6O7ZNNDT.js.map +0 -1
  39. package/dist/chunk-6PQIXTMK.js +0 -697
  40. package/dist/chunk-6PQIXTMK.js.map +0 -1
  41. package/dist/chunk-7AW6M7QW.js +0 -1013
  42. package/dist/chunk-7AW6M7QW.js.map +0 -1
  43. package/dist/chunk-7E3XJLKX.js.map +0 -1
  44. package/dist/chunk-7LM54OTA.js +0 -1031
  45. package/dist/chunk-7LM54OTA.js.map +0 -1
  46. package/dist/chunk-A3OGL4OX.js +0 -706
  47. package/dist/chunk-A3OGL4OX.js.map +0 -1
  48. package/dist/chunk-AO4UAWOV.js +0 -1030
  49. package/dist/chunk-AO4UAWOV.js.map +0 -1
  50. package/dist/chunk-BDFVGXM2.js +0 -697
  51. package/dist/chunk-BDFVGXM2.js.map +0 -1
  52. package/dist/chunk-CXM7NZVX.js +0 -1031
  53. package/dist/chunk-CXM7NZVX.js.map +0 -1
  54. package/dist/chunk-DXJSYGS6.js +0 -743
  55. package/dist/chunk-DXJSYGS6.js.map +0 -1
  56. package/dist/chunk-EFUSAQZM.js +0 -72
  57. package/dist/chunk-EFUSAQZM.js.map +0 -1
  58. package/dist/chunk-F7KDGPBN.js +0 -1013
  59. package/dist/chunk-F7KDGPBN.js.map +0 -1
  60. package/dist/chunk-FBSQT45X.js +0 -126
  61. package/dist/chunk-FBSQT45X.js.map +0 -1
  62. package/dist/chunk-FEPDOMVH.js +0 -697
  63. package/dist/chunk-FEPDOMVH.js.map +0 -1
  64. package/dist/chunk-FQDOL2QW.js +0 -25
  65. package/dist/chunk-FQDOL2QW.js.map +0 -1
  66. package/dist/chunk-GB3LGQJM.js +0 -109
  67. package/dist/chunk-GB3LGQJM.js.map +0 -1
  68. package/dist/chunk-HCNP6R3P.js +0 -736
  69. package/dist/chunk-HCNP6R3P.js.map +0 -1
  70. package/dist/chunk-J6WEJDRI.js +0 -743
  71. package/dist/chunk-J6WEJDRI.js.map +0 -1
  72. package/dist/chunk-JHEAPNJ2.js +0 -117
  73. package/dist/chunk-JHEAPNJ2.js.map +0 -1
  74. package/dist/chunk-JOJDJ6GW.js +0 -25
  75. package/dist/chunk-JOJDJ6GW.js.map +0 -1
  76. package/dist/chunk-KTDV6WYB.js +0 -202
  77. package/dist/chunk-KTDV6WYB.js.map +0 -1
  78. package/dist/chunk-KZWJBKPC.js +0 -734
  79. package/dist/chunk-KZWJBKPC.js.map +0 -1
  80. package/dist/chunk-LEAQBGL6.js +0 -109
  81. package/dist/chunk-LEAQBGL6.js.map +0 -1
  82. package/dist/chunk-LGZJL2Q7.js +0 -697
  83. package/dist/chunk-LGZJL2Q7.js.map +0 -1
  84. package/dist/chunk-LQPBU46R.js +0 -109
  85. package/dist/chunk-LQPBU46R.js.map +0 -1
  86. package/dist/chunk-M55NNUTY.js +0 -1013
  87. package/dist/chunk-M55NNUTY.js.map +0 -1
  88. package/dist/chunk-M6NCYCC3.js +0 -1013
  89. package/dist/chunk-M6NCYCC3.js.map +0 -1
  90. package/dist/chunk-MGN7OZAU.js +0 -109
  91. package/dist/chunk-MGN7OZAU.js.map +0 -1
  92. package/dist/chunk-MGYZOX4K.js +0 -1013
  93. package/dist/chunk-MGYZOX4K.js.map +0 -1
  94. package/dist/chunk-MY4IEKJS.js +0 -1031
  95. package/dist/chunk-MY4IEKJS.js.map +0 -1
  96. package/dist/chunk-NCQRGAB4.js +0 -705
  97. package/dist/chunk-NCQRGAB4.js.map +0 -1
  98. package/dist/chunk-NI4NHXI4.js +0 -697
  99. package/dist/chunk-NI4NHXI4.js.map +0 -1
  100. package/dist/chunk-NPI5N7AU.js +0 -14
  101. package/dist/chunk-NPI5N7AU.js.map +0 -1
  102. package/dist/chunk-QN4CPMJF.js +0 -126
  103. package/dist/chunk-QN4CPMJF.js.map +0 -1
  104. package/dist/chunk-QYUVAKMC.js.map +0 -1
  105. package/dist/chunk-RAAT6PDT.js +0 -25
  106. package/dist/chunk-RAAT6PDT.js.map +0 -1
  107. package/dist/chunk-RDPO5VPS.js +0 -1013
  108. package/dist/chunk-RDPO5VPS.js.map +0 -1
  109. package/dist/chunk-RQHIW2PF.js +0 -25
  110. package/dist/chunk-RQHIW2PF.js.map +0 -1
  111. package/dist/chunk-RREVHA52.js +0 -722
  112. package/dist/chunk-RREVHA52.js.map +0 -1
  113. package/dist/chunk-S7PT4PZN.js +0 -25
  114. package/dist/chunk-S7PT4PZN.js.map +0 -1
  115. package/dist/chunk-SUXV5M32.js +0 -109
  116. package/dist/chunk-SUXV5M32.js.map +0 -1
  117. package/dist/chunk-SZEORUY6.js +0 -696
  118. package/dist/chunk-SZEORUY6.js.map +0 -1
  119. package/dist/chunk-T7NGGWGY.js +0 -25
  120. package/dist/chunk-T7NGGWGY.js.map +0 -1
  121. package/dist/chunk-UEVWP5VE.js +0 -696
  122. package/dist/chunk-UEVWP5VE.js.map +0 -1
  123. package/dist/chunk-UJNKNP7U.js +0 -748
  124. package/dist/chunk-UJNKNP7U.js.map +0 -1
  125. package/dist/chunk-V4XVFWFI.js +0 -1013
  126. package/dist/chunk-V4XVFWFI.js.map +0 -1
  127. package/dist/chunk-VJU2CIKZ.js +0 -729
  128. package/dist/chunk-VJU2CIKZ.js.map +0 -1
  129. package/dist/chunk-VRQUP5L3.js +0 -202
  130. package/dist/chunk-VRQUP5L3.js.map +0 -1
  131. package/dist/chunk-WBJ5E7CL.js +0 -742
  132. package/dist/chunk-WBJ5E7CL.js.map +0 -1
  133. package/dist/chunk-Y3Q65C7R.js +0 -14
  134. package/dist/chunk-Y3Q65C7R.js.map +0 -1
  135. package/dist/chunk-YHEGFPTR.js +0 -1030
  136. package/dist/chunk-YHEGFPTR.js.map +0 -1
  137. package/dist/chunk-ZDLBN46C.js +0 -697
  138. package/dist/chunk-ZDLBN46C.js.map +0 -1
  139. package/dist/preview-BEkLMD6N.d.ts +0 -23
  140. package/dist/preview-DJEA4fj7.d.ts +0 -23
  141. package/dist/preview-DeD1Jn7U.d.ts +0 -23
  142. package/dist/types-15jfCQKb.d.ts +0 -141
  143. package/dist/types-BREdL9Gx.d.ts +0 -140
  144. package/dist/types-C6sUZNa2.d.ts +0 -104
  145. package/dist/types-DpeHpobR.d.ts +0 -104
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client.ts","../src/preview/bridge-script.ts","../src/middleware/preview.ts"],"names":["globalWithCms"],"mappings":";;;;;AASO,SAAS,gBAAgB,MAAA,EAAoC;AAClE,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACvD,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,IAAS,KAAA;AAGhC,EAAA,IAAI,qBAAA,GAA8C,IAAA;AAElD,EAAA,MAAM,MAAA,GAAoB;AAAA,IACxB,MAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAe,MAAA,CAAO,aAAA;AAAA,IAEtB,MAAM,UAAU,OAAA,EAAoD;AAClE,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,EAAS,YAAY,CAAA;AAE7C,MAAA,IAAI,CAAC,WAAW,qBAAA,EAAuB;AACrC,QAAA,OAAO,qBAAA;AAAA,MACT;AAEA,MAAA,MAAM,GAAA,GAAM,OAAA,GACR,CAAA,EAAG,UAAU,CAAA,OAAA,EAAU,MAAM,CAAA,OAAA,CAAA,GAC7B,CAAA,EAAG,UAAU,CAAA,SAAA,EAAY,MAAM,CAAA,OAAA,CAAA;AAEnC,MAAA,MAAM,UAAkC,EAAC;AACzC,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,OAAA,CAAQ,iBAAiB,IAAI,OAAA,CAAQ,YAAA;AAAA,MACvC;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAA,EAAK;AAAA,QAC7B,OAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,2CAA2C,GAAG,CAAA,SAAA,EAAY,IAAI,MAAM,CAAA,GAAA,EAAM,IAAI,UAAU,CAAA;AAAA,SAC1F;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAK;AAE/B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,qBAAA,GAAwB,MAAA;AAAA,MAC1B;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,UAAU,OAAA,EAA8D;AAC5E,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC3C,MAAA,OAAO,MAAA,CAAO,UAAU,EAAC;AAAA,IAC3B,CAAA;AAAA,IAEA,MAAM,QAAA,CAAsB,GAAA,EAAa,OAAA,EAA+C;AACtF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC3C,MAAA,OAAQ,MAAA,CAAO,GAAG,CAAA,IAAW,IAAA;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAM,eAAe,OAAA,EAAmE;AACtF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC3C,MAAA,OAAO,MAAA,CAAO,eAAe,EAAC;AAAA,IAChC,CAAA;AAAA,IAEA,MAAM,UAAA,CACJ,aAAA,EACA,OAAA,EAC2C;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC3C,MAAA,OAAO,MAAA,CAAO,OAAA,GAAU,aAAa,CAAA,IAAK,EAAC;AAAA,IAC7C,CAAA;AAAA,IAEA,MAAM,QAAA,CACJ,aAAA,EACA,IAAA,EACA,OAAA,EAC0D;AAC1D,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,eAAe,OAAO,CAAA;AAC5D,MAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,IAAK,IAAA;AAAA,IACjD,CAAA;AAAA,IAEA,MAAM,UAAU,OAAA,EAA8D;AAC5E,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC3C,MAAA,OAAO,MAAA,CAAO,UAAU,EAAC;AAAA,IAC3B,CAAA;AAAA,IAEA,MAAM,cAAc,OAAA,EAAoD;AACtE,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC3C,MAAA,OAAO;AAAA,QACL,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,QAChC,MAAA,EAAQ,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,EAAC;AAAA,QACpC,WAAA,EAAa,MAAA,CAAO,QAAA,EAAU,WAAA,IAAe,EAAC;AAAA,QAC9C,OAAA,EAAS,MAAA,CAAO,QAAA,EAAU,OAAA,IAAW,EAAC;AAAA,QACtC,cAAA,EAAgB,MAAA,CAAO,QAAA,EAAU,cAAA,IAAkB;AAAA,OACrD;AAAA,IACF,CAAA;AAAA,IAEA,UAAA,GAAmB;AACjB,MAAA,qBAAA,GAAwB,IAAA;AAAA,IAC1B;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,aAAA,GAAgB,UAAA;AAItB,IAAI,YAAA,GACD,OAAO,UAAA,KAAe,WAAA,IAAe,cAAc,cAAA,IAAmB,IAAA;AAElE,SAAS,cAAc,OAAA,EAKhB;AACZ,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,YAAA,GAAe,OAAA,CAAQ,MAAA;AACvB,IAAA,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,MAAA,aAAA,CAAc,iBAAiB,OAAA,CAAQ,MAAA;AAAA,IACzC;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,YAAA,GAAe,eAAA,CAAgB;AAAA,IAC7B,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,WAAA,IAAe,EAAA;AAAA,IACrD,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,IAAI,eAAA,IAAmB,uBAAA;AAAA,IACjE,aAAA,EAAe,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,GAAA,CAAI;AAAA,GACrD,CAAA;AACD,EAAA,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,IAAA,aAAA,CAAc,cAAA,GAAiB,YAAA;AAAA,EACjC;AAEA,EAAA,OAAO,YAAA;AACT;AAEO,SAAS,SAAA,GAA8B;AAC5C,EAAA,OACE,YAAA,IAAiB,OAAO,UAAA,KAAe,WAAA,IAAe,cAAc,cAAA,IAAmB,IAAA;AAE3F;AAEO,SAAS,UAAU,MAAA,EAAgC;AACxD,EAAA,YAAA,GAAe,MAAA;AACf,EAAA,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,IAAA,aAAA,CAAc,cAAA,GAAiB,MAAA;AAAA,EACjC;AACF;;;AC5JO,IAAM,uBAAA,GAA0B,CAAA;AAMhC,SAAS,iBAAA,CAAkB,OAAA,GAA+B,EAAC,EAAW;AAC3E,EAAA,MAAM,cAAA,GAAiB,oBAAA,CAAqB,OAAA,CAAQ,aAAa,CAAA;AACjE,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAExD,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA,yBAAA,EAKkB,uBAAuB,CAAA;AAAA,uBAAA,EACzB,kBAAkB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAA,CAAA;AAuc3C;;;AC7bO,SAAS,uBAAA,CAAwB,OAAA,GAAoC,EAAC,EAAG;AAC9E,EAAA,IAAI,SAAS,OAAA,CAAQ,MAAA;AAErB,EAAA,OAAO,OACL,SACA,IAAA,KACsB;AACtB,IAAA,MAAMA,cAAAA,GAAgB,UAAA;AAKtB,IAAA,IACG,OAAO,eAAe,WAAA,IAAeA,cAAAA,CAAc,wBACpD,WAAA,EAAY,IACZ,OAAA,CAAQ,MAAA,EAAQ,cAAA,EAChB;AACA,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,MAAM,SAAS,OAAA,CAAQ,GAAA;AACvB,IAAA,MAAM,GAAA,GACJ,UAAU,OAAO,MAAA,CAAO,SAAS,QAAA,GAC7B,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,GACnB,UAAU,OAAQ,MAAA,CAA4C,QAAA,KAAa,QAAA,GACzE,MAAA,GACA,IAAI,IAAI,OAAA,CAAQ,OAAA,EAAS,GAAA,IAAO,GAAA,EAAK,kBAAkB,CAAA;AAC/D,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,IAAY,GAAA;AACjC,IAAA,MAAM,cAAA,GAAiB,QAAA,KAAa,WAAA,IAAe,QAAA,CAAS,WAAW,YAAY,CAAA;AAEnF,IAAA,MAAM,YAAA,GAAA,CACH,MAAA,EAAQ,YAAA,EAAc,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,eAAe,CAAA,GAAI,IAAA,MACvE,GAAA,EAAK,YAAA,EAAc,GAAA,GAAM,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,eAAe,CAAA,GAAI,IAAA,CAAA,KACjE,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA,GAAI,IAAA,CAAA;AAEpF,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,YAAA,EAAc;AACpC,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,GAAS,WAAU,IAAK,MAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,UAAW,MAAA,CAAA,IAAA,CAAwE,GAAA;AACzF,MAAA,MAAM,MAAA,GACJ,OAAA,CAAQ,MAAA,IACP,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK,WAAA,IAC/C,OAAO,MAAA,CAAA,IAAA,KAAgB,WAAA,IAAe,SAAS,WAAA,IAChD,EAAA;AACF,MAAA,MAAM,UAAA,GACJ,OAAA,CAAQ,UAAA,IACP,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK,eAAA,IAC/C,OAAO,MAAA,CAAA,IAAA,KAAgB,WAAA,IAAe,SAAS,eAAA,IAChD,EAAA;AACF,MAAA,MAAM,aAAA,GACJ,OAAA,CAAQ,aAAA,KACP,OAAO,OAAA,KAAY,cAChB,OAAA,CAAQ,GAAA,EAAK,kBAAA,IACb,OAAA,CAAQ,GAAA,EAAK,oBAAA,IACb,QAAQ,GAAA,EAAK,UAAA,GACb,MAAA,CAAA,KACH,OAAO,MAAA,CAAA,IAAA,KAAgB,WAAA,GACpB,SAAS,kBAAA,IAAsB,OAAA,EAAS,oBAAA,IAAwB,OAAA,EAAS,UAAA,GACzE,MAAA,CAAA;AAEN,MAAA,IAAI,UAAU,UAAA,EAAY;AACxB,QAAA,MAAA,GAAS,eAAA,CAAgB;AAAA,UACvB,MAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,IAAI,SAAS,0BAAA,EAA4B;AAAA,QAC9C,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,mBAAA;AAAA,UACjB,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAI,SAAS,yCAAA,EAA2C;AAAA,QAC7D,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,mBAAA;AAAA,UACjB,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,MAAA,GACF,OAAA,CAAQ,aAAA,IACR,MAAA,CAAO,iBACN,OAAO,OAAA,KAAY,WAAA,KACjB,OAAA,CAAQ,KAAK,kBAAA,IACZ,OAAA,CAAQ,GAAA,EAAK,oBAAA,IACb,QAAQ,GAAA,EAAK,UAAA,CAAA;AAEnB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,YAAA,EAAa;AAAA,MACxB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAI,SAAS,+BAAA,EAAiC;AAAA,UACnD,MAAA,EAAQ,GAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,eAAA,EAAiB,mBAAA;AAAA,YACjB,cAAA,EAAgB;AAAA;AAClB,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,MAAM,kBAAA,CAAmB,YAAA,EAAc,MAAA,EAAQ,OAAO,MAAM,CAAA;AAChF,IAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACtB,MAAA,OAAO,IAAI,QAAA,CAAS,WAAA,CAAY,KAAA,IAAS,kCAAA,EAAoC;AAAA,QAC3E,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,mBAAA;AAAA,UACjB,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,MAAM,MAAA,CAAO,SAAA,CAAU,EAAE,cAAc,CAAA;AAAA,IACvD,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,IAAI,QAAA;AAAA,QACT,iCAAiC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,QACjF;AAAA,UACE,MAAA,EAAQ,GAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,eAAA,EAAiB,mBAAA;AAAA,YACjB,cAAA,EAAgB;AAAA;AAClB;AACF,OACF;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAA,CAAQ,OAAO,cAAA,GAAiB,IAAA;AAChC,MAAA,OAAA,CAAQ,OAAO,kBAAA,GAAqB,WAAA;AAAA,IACtC;AAEA,IAAA,IAAI,aAAA;AACJ,IAAA,oBAAA,CAAqB,WAAW,CAAA;AAChC,IAAA,IAAI;AACF,MAAA,aAAA,GAAgB,MAAM,kBAAA,CAAmB,WAAA,EAAa,YAAY;AAChE,QAAA,IAAI,QAAA;AACJ,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA,IAAK,GAAA;AACxD,UAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,KAAY,UAAA,EAAY;AACzC,YAAA,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,cAAAA,eAAc,oBAAA,GAAuB,IAAA;AAAA,YACvC;AACA,YAAA,IAAI;AACF,cAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAChD,cAAA,IAAI,SAAA,EAAW;AACb,gBAAA,QAAA,GAAW,SAAA;AAAA,cACb,CAAA,MAAO;AACL,gBAAA,QAAA,GAAW,MAAM,IAAA,EAAK;AAAA,cACxB;AAAA,YACF,CAAA,SAAE;AACA,cAAA,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,gBAAAA,eAAc,oBAAA,GAAuB,KAAA;AAAA,cACvC;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,QAAA,GAAW,MAAM,IAAA,EAAK;AAAA,UACxB;AAAA,QACF,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,MAAM,IAAA,EAAK;AAAA,QACxB;AAEA,QAAA,MAAM,WAAA,GAAc,UAAU,OAAA,EAAS,GAAA,GAAM,SAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,GAAI,EAAA;AACpF,QAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,UACpB,QAAA,CAAS,MAAM,oEAAoE;AAAA,SACrF;AACA,QAAA,MAAM,MAAA,GACH,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAA,CAAY,SAAS,WAAW,CAAA,IACnE,CAAC,WAAA,IAAe,CAAC,aAAA;AAEpB,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,UAAA,MAAM,eAAe,iBAAA,CAAkB,EAAE,aAAA,EAAe,OAAA,CAAQ,eAAe,CAAA;AAC/E,UAAA,MAAM,SAAA,GAAY,WAAW,YAAY,CAAA,SAAA,CAAA;AACzC,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,SAAS,IACxC,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA,OAAA,CAAS,CAAA,GAC7C,CAAA,EAAG,IAAI,GAAG,SAAS,CAAA,CAAA;AAEvB,UAAA,MAAM,UAAA,GAAa,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAC/C,UAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA,EAAG;AACnC,YAAA,UAAA,CAAW,GAAA,CAAI,gBAAgB,0BAA0B,CAAA;AAAA,UAC3D;AACA,UAAA,UAAA,CAAW,OAAO,gBAAgB,CAAA;AAClC,UAAA,UAAA,CAAW,GAAA,CAAI,iBAAiB,8CAA8C,CAAA;AAC9E,UAAA,UAAA,CAAW,GAAA,CAAI,gBAAgB,mBAAmB,CAAA;AAElD,UAAA,OAAO,IAAI,SAAS,YAAA,EAAc;AAAA,YAChC,QAAQ,QAAA,CAAS,MAAA;AAAA,YACjB,YAAY,QAAA,CAAS,UAAA;AAAA,YACrB,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAEA,QAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AACnD,QAAA,cAAA,CAAe,GAAA,CAAI,iBAAiB,8CAA8C,CAAA;AAClF,QAAA,cAAA,CAAe,GAAA,CAAI,gBAAgB,mBAAmB,CAAA;AACtD,QAAA,OAAO,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM;AAAA,UACjC,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,aAAA;AAAA,EACT,CAAA;AACF","file":"chunk-WBJ5E7CL.js","sourcesContent":["import { DEFAULT_DEV_CONTENT_URL } from '@407dev/config';\nimport type {\n CmsClient,\n CmsClientConfig,\n CmsSiteConfig,\n ContentBundle,\n GetBundleOptions,\n} from './types';\n\nexport function createCmsClient(config: CmsClientConfig): CmsClient {\n const siteId = config.siteId;\n const contentUrl = config.contentUrl.replace(/\\/+$/, '');\n const fetchFn = config.fetch || fetch;\n\n // In-memory cache for published bundle to ensure build determinism\n let cachedPublishedBundle: ContentBundle | null = null;\n\n const client: CmsClient = {\n siteId,\n contentUrl,\n previewSecret: config.previewSecret,\n\n async getBundle(options?: GetBundleOptions): Promise<ContentBundle> {\n const isDraft = Boolean(options?.previewToken);\n\n if (!isDraft && cachedPublishedBundle) {\n return cachedPublishedBundle;\n }\n\n const url = isDraft\n ? `${contentUrl}/draft/${siteId}/bundle`\n : `${contentUrl}/content/${siteId}/bundle`;\n\n const headers: Record<string, string> = {};\n if (options?.previewToken) {\n headers['x-preview-token'] = options.previewToken;\n }\n\n const res = await fetchFn(url, {\n headers,\n cache: 'no-store',\n });\n if (!res.ok) {\n throw new Error(\n `CMS Client: Failed to fetch bundle from ${url} (status ${res.status}): ${res.statusText}`,\n );\n }\n\n const bundle = (await res.json()) as ContentBundle;\n\n if (!isDraft) {\n cachedPublishedBundle = bundle;\n }\n\n return bundle;\n },\n\n async getFields(options?: GetBundleOptions): Promise<ContentBundle['fields']> {\n const bundle = await this.getBundle(options);\n return bundle.fields || {};\n },\n\n async getField<T = unknown>(key: string, options?: GetBundleOptions): Promise<T | null> {\n const fields = await this.getFields(options);\n return (fields[key] as T) ?? null;\n },\n\n async getCollections(options?: GetBundleOptions): Promise<ContentBundle['collections']> {\n const bundle = await this.getBundle(options);\n return bundle.collections || {};\n },\n\n async getEntries(\n collectionKey: string,\n options?: GetBundleOptions,\n ): Promise<ContentBundle['entries'][string]> {\n const bundle = await this.getBundle(options);\n return bundle.entries?.[collectionKey] || [];\n },\n\n async getEntry(\n collectionKey: string,\n slug: string,\n options?: GetBundleOptions,\n ): Promise<ContentBundle['entries'][string][number] | null> {\n const entries = await this.getEntries(collectionKey, options);\n return entries.find((e) => e.slug === slug) || null;\n },\n\n async getRoutes(options?: GetBundleOptions): Promise<ContentBundle['routes']> {\n const bundle = await this.getBundle(options);\n return bundle.routes || [];\n },\n\n async getSiteConfig(options?: GetBundleOptions): Promise<CmsSiteConfig> {\n const bundle = await this.getBundle(options);\n return {\n site_id: bundle.site_id,\n redirects: bundle.redirects || [],\n robots: bundle.settings?.robots || {},\n default_seo: bundle.settings?.default_seo || {},\n sitemap: bundle.settings?.sitemap || {},\n not_found_path: bundle.settings?.not_found_path || null,\n };\n },\n\n clearCache(): void {\n cachedPublishedBundle = null;\n },\n };\n\n return client;\n}\n\nconst globalWithCms = globalThis as typeof globalThis & {\n __CMS_CLIENT__?: CmsClient | null;\n};\n\nlet globalClient: CmsClient | null =\n (typeof globalThis !== 'undefined' && globalWithCms.__CMS_CLIENT__) || null;\n\nexport function initCmsClient(options: {\n siteId?: string;\n contentUrl?: string;\n previewSecret?: string;\n client?: CmsClient;\n}): CmsClient {\n if (options.client) {\n globalClient = options.client;\n if (typeof globalThis !== 'undefined') {\n globalWithCms.__CMS_CLIENT__ = options.client;\n }\n return globalClient;\n }\n\n globalClient = createCmsClient({\n siteId: options.siteId || process.env.CMS_SITE_ID || '',\n contentUrl: options.contentUrl || process.env.CMS_CONTENT_URL || DEFAULT_DEV_CONTENT_URL,\n previewSecret: options.previewSecret || process.env.CMS_PREVIEW_SECRET,\n });\n if (typeof globalThis !== 'undefined') {\n globalWithCms.__CMS_CLIENT__ = globalClient;\n }\n\n return globalClient;\n}\n\nexport function getClient(): CmsClient | null {\n return (\n globalClient || (typeof globalThis !== 'undefined' && globalWithCms.__CMS_CLIENT__) || null\n );\n}\n\nexport function setClient(client: CmsClient | null): void {\n globalClient = client;\n if (typeof globalThis !== 'undefined') {\n globalWithCms.__CMS_CLIENT__ = client;\n }\n}\n","import { resolveEditorOrigins } from './origins';\n\nexport const BRIDGE_PROTOCOL_VERSION = 1;\n\nexport interface BridgeScriptOptions {\n editorOrigins?: string[];\n}\n\nexport function buildBridgeScript(options: BridgeScriptOptions = {}): string {\n const allowedOrigins = resolveEditorOrigins(options.editorOrigins);\n const allowedOriginsJson = JSON.stringify(allowedOrigins);\n\n return `(function() {\n if (typeof window === 'undefined') return;\n if (window.__CMS_BRIDGE_INITIALIZED__) return;\n window.__CMS_BRIDGE_INITIALIZED__ = true;\n\n var PROTOCOL_VERSION = ${BRIDGE_PROTOCOL_VERSION};\n var allowedOrigins = ${allowedOriginsJson};\n var connectedOrigin = null;\n var connectedSource = null;\n var activeKey = null;\n var rafScheduled = false;\n var isPatchingDom = false;\n var debounceRescanTimer = null;\n\n function normalizeOrigin(raw) {\n if (!raw || typeof raw !== 'string') return null;\n var trimmed = raw.trim();\n if (!trimmed) return null;\n try {\n var withScheme = /^[a-zA-Z][a-zA-Z0-9+.-]*:\\\\/\\\\//.test(trimmed) ? trimmed : 'https://' + trimmed;\n var url = new URL(withScheme);\n if (!url.protocol || !url.host) return null;\n return (url.protocol + '//' + url.host).toLowerCase();\n } catch (e) {\n return null;\n }\n }\n\n var normalizedAllowed = allowedOrigins.map(normalizeOrigin).filter(Boolean);\n\n function isOriginAllowed(origin) {\n var norm = normalizeOrigin(origin);\n if (!norm) return false;\n return normalizedAllowed.indexOf(norm) !== -1;\n }\n\n function postToEditor(msg) {\n if (!connectedSource || !connectedOrigin) return;\n try {\n connectedSource.postMessage(msg, connectedOrigin);\n } catch (err) {\n // Failed to post\n }\n }\n\n // Inject Bridge Styles\n var isEmbedded = false;\n try {\n isEmbedded = window.self !== window.top || window.parent !== window;\n } catch (_e) {\n isEmbedded = true;\n }\n\n var toolbarTag = 'astro-' + 'dev-toolbar';\n\n function ensureBridgeStyles() {\n if (typeof document === 'undefined' || !document || typeof document.getElementById !== 'function') return;\n if (document.getElementById('cms-bridge-styles')) return;\n var style = document.createElement('style');\n style.id = 'cms-bridge-styles';\n style.textContent = [\n isEmbedded ? toolbarTag + ' { display: none !important; }' : '',\n 'html[data-cms-edit-mode] [data-cms-field],',\n 'html[data-cms-edit-mode] [data-cms-entry-field] {',\n ' cursor: pointer !important;',\n ' outline: 1px dashed rgba(59, 130, 246, 0.5) !important;',\n ' outline-offset: 2px !important;',\n ' transition: outline 0.15s ease-in-out !important;',\n '}',\n 'html[data-cms-edit-mode] [data-cms-field]:hover,',\n 'html[data-cms-edit-mode] [data-cms-entry-field]:hover {',\n ' outline: 2px solid #3b82f6 !important;',\n ' outline-offset: 2px !important;',\n '}',\n 'html[data-cms-edit-mode] [data-cms-group] {',\n ' outline: 1px dashed rgba(16, 185, 129, 0.4) !important;',\n ' outline-offset: 3px !important;',\n '}',\n 'html[data-cms-edit-mode] [data-cms-group]:hover {',\n ' outline: 2px solid #10b981 !important;',\n ' outline-offset: 3px !important;',\n '}'\n ].filter(Boolean).join('\\\\n');\n\n var target = document.head || document.documentElement;\n if (target) {\n target.appendChild(style);\n }\n }\n\n function hideDevToolbar() {\n if (!isEmbedded) return;\n ensureBridgeStyles();\n if (typeof document === 'undefined' || !document || typeof document.querySelector !== 'function') return;\n try {\n var tb = document.querySelector(toolbarTag);\n if (tb && tb instanceof HTMLElement) {\n tb.style.setProperty('display', 'none', 'important');\n }\n } catch (_e) {}\n }\n\n ensureBridgeStyles();\n hideDevToolbar();\n\n function inferFieldKind(el) {\n if (!el) return 'unknown';\n var tag = el.tagName ? el.tagName.toLowerCase() : '';\n if (tag === 'img') return 'image';\n if (tag === 'video') return 'video';\n var explicitKind = el.getAttribute('data-cms-kind');\n if (explicitKind) return explicitKind;\n if (el.classList.contains('rich-body') || el.classList.contains('cms-richtext') || el.getAttribute('data-cms-richtext') === 'true') {\n return 'richtext';\n }\n return 'text';\n }\n\n function getElementRect(el) {\n var r = el.getBoundingClientRect();\n return {\n top: r.top,\n left: r.left,\n width: r.width,\n height: r.height\n };\n }\n\n function parseGroupAttr(raw) {\n if (!raw) return undefined;\n var idx = raw.indexOf(':');\n if (idx === -1) return { group: raw, scope: '' };\n return {\n group: raw.slice(0, idx),\n scope: raw.slice(idx + 1)\n };\n }\n\n function scanRenderedFields() {\n var fieldEls = document.querySelectorAll('[data-cms-field], [data-cms-entry-field]');\n var fieldMap = {};\n\n for (var i = 0; i < fieldEls.length; i++) {\n var el = fieldEls[i];\n var key = el.getAttribute('data-cms-field') || el.getAttribute('data-cms-entry-field') || '';\n if (!key) continue;\n\n var isEntry = el.hasAttribute('data-cms-entry-field');\n var groupEl = el.closest('[data-cms-group]');\n var collectionEl = el.closest('[data-cms-collection]');\n var groupName = undefined;\n if (groupEl) {\n var g = parseGroupAttr(groupEl.getAttribute('data-cms-group'));\n if (g) groupName = g.group;\n }\n\n var entryRef = undefined;\n if (isEntry || collectionEl) {\n entryRef = {\n collection: collectionEl ? collectionEl.getAttribute('data-cms-collection') || '' : '',\n slug: collectionEl ? collectionEl.getAttribute('data-cms-entry') || '' : '',\n path: isEntry ? key : key\n };\n }\n\n var uniqueId = (isEntry && entryRef ? entryRef.collection + ':' + entryRef.slug + ':' : '') + key;\n\n if (!fieldMap[uniqueId]) {\n fieldMap[uniqueId] = {\n key: key,\n kind: inferFieldKind(el),\n group: groupName,\n entryRef: entryRef,\n instances: 1\n };\n } else {\n fieldMap[uniqueId].instances++;\n }\n }\n\n var fields = [];\n for (var k in fieldMap) {\n if (Object.prototype.hasOwnProperty.call(fieldMap, k)) {\n fields.push(fieldMap[k]);\n }\n }\n\n window.__CMS_FIELDS__ = fields;\n window.__CMS_RESCAN__ = scanRenderedFields;\n\n try {\n document.dispatchEvent(new CustomEvent('cms:fields-updated', { detail: fields }));\n } catch (_e) {}\n\n postToEditor({\n source: 'cms-preview',\n v: PROTOCOL_VERSION,\n type: 'rendered-fields',\n fields: fields\n });\n }\n\n function debouncedRescan() {\n if (isPatchingDom) return;\n if (debounceRescanTimer) clearTimeout(debounceRescanTimer);\n debounceRescanTimer = setTimeout(function() {\n scanRenderedFields();\n scheduleRectsUpdate();\n }, 150);\n }\n\n var currentObserver = null;\n function setupMutationObserver() {\n if (typeof MutationObserver === 'undefined' || !document.body) return;\n if (currentObserver) {\n try {\n currentObserver.disconnect();\n } catch (_e) {}\n }\n currentObserver = new MutationObserver(function(mutations) {\n if (isPatchingDom) return;\n hideDevToolbar();\n debouncedRescan();\n });\n currentObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributeFilter: ['data-cms-field', 'data-cms-entry-field', 'data-cms-group', 'data-cms-collection', 'data-cms-entry']\n });\n }\n\n function scheduleRectsUpdate() {\n if (rafScheduled) return;\n rafScheduled = true;\n requestAnimationFrame(function() {\n rafScheduled = false;\n var rects = {};\n if (activeKey) {\n var el = document.querySelector('[data-cms-field=\"' + activeKey + '\"], [data-cms-entry-field=\"' + activeKey + '\"]');\n if (el) {\n rects[activeKey] = getElementRect(el);\n }\n }\n postToEditor({\n source: 'cms-preview',\n v: PROTOCOL_VERSION,\n type: 'rects-update',\n rects: rects,\n scrollY: window.scrollY || window.pageYOffset || 0\n });\n });\n }\n\n // Click handler\n document.addEventListener('click', function(e) {\n if (!document.documentElement.hasAttribute('data-cms-edit-mode')) return;\n var target = e.target;\n if (!target || !(target instanceof Element)) return;\n\n var fieldEl = target.closest('[data-cms-field], [data-cms-entry-field]');\n var groupEl = target.closest('[data-cms-group]');\n\n if (fieldEl) {\n e.preventDefault();\n e.stopPropagation();\n\n var isEntry = fieldEl.hasAttribute('data-cms-entry-field');\n var key = fieldEl.getAttribute('data-cms-field') || fieldEl.getAttribute('data-cms-entry-field') || '';\n var kind = inferFieldKind(fieldEl);\n var rect = getElementRect(fieldEl);\n activeKey = key;\n\n var selector = isEntry ? '[data-cms-entry-field=\"' + key + '\"]' : '[data-cms-field=\"' + key + '\"]';\n var all = Array.prototype.slice.call(document.querySelectorAll(selector));\n var instance = Math.max(0, all.indexOf(fieldEl));\n\n var collectionEl = fieldEl.closest('[data-cms-collection]');\n var entryRef = (isEntry || collectionEl) ? {\n collection: collectionEl ? collectionEl.getAttribute('data-cms-collection') || '' : '',\n slug: collectionEl ? collectionEl.getAttribute('data-cms-entry') || '' : '',\n path: isEntry ? key : key\n } : undefined;\n\n var groupPath = groupEl ? parseGroupAttr(groupEl.getAttribute('data-cms-group')) : undefined;\n\n try {\n document.dispatchEvent(new CustomEvent('cms:field-selected', {\n detail: {\n key: key,\n kind: kind,\n entryRef: entryRef,\n groupPath: groupPath\n }\n }));\n } catch (_e) {}\n\n postToEditor({\n source: 'cms-preview',\n v: PROTOCOL_VERSION,\n type: 'field-click',\n key: key,\n kind: kind,\n rect: rect,\n instance: instance,\n entryRef: entryRef,\n groupPath: groupPath\n });\n return;\n }\n\n if (groupEl) {\n e.preventDefault();\n e.stopPropagation();\n\n var g = parseGroupAttr(groupEl.getAttribute('data-cms-group'));\n if (g) {\n var gRect = getElementRect(groupEl);\n postToEditor({\n source: 'cms-preview',\n v: PROTOCOL_VERSION,\n type: 'group-click',\n group: g.group,\n scope: g.scope,\n rect: gRect\n });\n }\n }\n }, true);\n\n // Message handler\n window.addEventListener('message', function(e) {\n var data = e.data;\n if (!data || typeof data !== 'object') return;\n if (data.source !== 'cms-editor') return;\n\n if (data.type === 'hello') {\n if (!isOriginAllowed(e.origin)) return;\n connectedOrigin = e.origin;\n connectedSource = e.source;\n\n postToEditor({\n source: 'cms-preview',\n v: PROTOCOL_VERSION,\n type: 'ready',\n protocolVersion: PROTOCOL_VERSION\n });\n\n scanRenderedFields();\n return;\n }\n\n if (!connectedOrigin || e.origin !== connectedOrigin) return;\n\n if (data.type === 'highlight-mode') {\n if (data.on) {\n document.documentElement.setAttribute('data-cms-edit-mode', 'true');\n } else {\n document.documentElement.removeAttribute('data-cms-edit-mode');\n }\n return;\n }\n\n if (data.type === 'patch') {\n isPatchingDom = true;\n var patchKey = data.key;\n var patchKind = data.kind;\n var patchVal = data.value;\n var patchEntry = data.entryRef;\n\n var patchSelector;\n var fPath = patchEntry && patchEntry.path ? patchEntry.path : patchKey;\n if (patchEntry && (patchEntry.collection || patchEntry.slug)) {\n var colAttr = patchEntry.collection ? '[data-cms-collection=\"' + patchEntry.collection + '\"]' : '';\n var entryAttr = patchEntry.slug ? '[data-cms-entry=\"' + patchEntry.slug + '\"]' : '';\n var scopeSel = colAttr + entryAttr;\n patchSelector = scopeSel + ' [data-cms-entry-field=\"' + fPath + '\"], ' +\n scopeSel + '[data-cms-entry-field=\"' + fPath + '\"]';\n } else if (patchEntry) {\n patchSelector = '[data-cms-entry-field=\"' + fPath + '\"]';\n } else {\n patchSelector = '[data-cms-field=\"' + patchKey + '\"]';\n }\n\n var matchingEls = document.querySelectorAll(patchSelector);\n for (var j = 0; j < matchingEls.length; j++) {\n var isStructured = patchKind === 'geo.area' || patchKind === 'geoArea' ||\n patchKind === 'address' || patchKind === 'address.list' ||\n patchKind === 'media.videoList' || patchKind === 'videoList' ||\n mEl.getAttribute('data-cms-kind') === 'geo.area' ||\n mEl.getAttribute('data-cms-kind') === 'address.list' ||\n mEl.getAttribute('data-cms-kind') === 'media.videoList';\n\n if (patchKind === 'image' || mEl.tagName.toLowerCase() === 'img') {\n if (patchVal && typeof patchVal === 'object') {\n if (patchVal.url) mEl.setAttribute('src', patchVal.url);\n if (patchVal.alt !== undefined) mEl.setAttribute('alt', patchVal.alt);\n } else if (typeof patchVal === 'string') {\n mEl.setAttribute('src', patchVal);\n }\n } else if (patchKind === 'video' || mEl.tagName.toLowerCase() === 'video') {\n if (patchVal && typeof patchVal === 'object') {\n if (patchVal.url) mEl.setAttribute('src', patchVal.url);\n if (patchVal.poster !== undefined) mEl.setAttribute('poster', patchVal.poster);\n } else if (typeof patchVal === 'string') {\n mEl.setAttribute('src', patchVal);\n }\n if (typeof mEl.load === 'function') mEl.load();\n } else if (isStructured || (patchVal && typeof patchVal === 'object')) {\n // Structured non-image field values (e.g. videoList, geoArea, address) cannot be rendered\n // via simple textContent replacement without producing [object Object].\n // Skip the text write and leave server-rendered markup intact; structured fields refresh via reload.\n } else {\n mEl.textContent = patchVal !== null && patchVal !== undefined ? String(patchVal) : '';\n }\n }\n\n isPatchingDom = false;\n scanRenderedFields();\n scheduleRectsUpdate();\n return;\n }\n\n if (data.type === 'scroll-to') {\n var scrollKey = data.key;\n var scrollInstance = typeof data.instance === 'number' ? data.instance : 0;\n var scrollEls = document.querySelectorAll('[data-cms-field=\"' + scrollKey + '\"], [data-cms-entry-field=\"' + scrollKey + '\"]');\n if (scrollEls.length > scrollInstance) {\n scrollEls[scrollInstance].scrollIntoView({ behavior: 'smooth', block: 'center' });\n activeKey = scrollKey;\n scheduleRectsUpdate();\n }\n return;\n }\n\n if (data.type === 'reload') {\n window.location.reload();\n return;\n }\n });\n\n function handlePageTransition() {\n hideDevToolbar();\n scanRenderedFields();\n setupMutationObserver();\n }\n\n window.addEventListener('scroll', scheduleRectsUpdate, { passive: true });\n window.addEventListener('resize', scheduleRectsUpdate, { passive: true });\n\n document.addEventListener('astro:page-load', handlePageTransition);\n document.addEventListener('astro:after-swap', handlePageTransition);\n window.addEventListener('popstate', handlePageTransition);\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', function() {\n handlePageTransition();\n });\n } else {\n handlePageTransition();\n }\n})();`;\n}\n","import { getJwtSecret } from '@407dev/config';\nimport { createCmsClient, getClient } from '../client';\nimport { verifyPreviewToken } from '../jwt';\nimport { buildBridgeScript } from '../preview/bridge-script';\nimport { isDraftMode, runWithDraftBundle, setActiveDraftBundle } from '../runtime/store';\nimport type { CmsClient, ContentBundle } from '../types';\n\nexport interface PreviewMiddlewareOptions {\n client?: CmsClient;\n siteId?: string;\n contentUrl?: string;\n previewSecret?: string;\n editorOrigins?: string[];\n}\n\ninterface PreviewContextLocals {\n __cms_is_draft?: boolean;\n __cms_draft_bundle?: ContentBundle;\n [key: string]: unknown;\n}\n\nexport interface PreviewMiddlewareContext {\n request: Request;\n url?: URL;\n locals?: PreviewContextLocals;\n rewrite?: (path: string) => Promise<Response> | undefined;\n}\n\nexport function createPreviewMiddleware(options: PreviewMiddlewareOptions = {}) {\n let client = options.client;\n\n return async (\n context: PreviewMiddlewareContext,\n next: () => Promise<Response>,\n ): Promise<Response> => {\n const globalWithCms = globalThis as typeof globalThis & {\n __CMS_IS_REWRITING__?: boolean;\n };\n\n // If already running within an active draft bundle context or internal rewrite, pass through\n if (\n (typeof globalThis !== 'undefined' && globalWithCms.__CMS_IS_REWRITING__) ||\n isDraftMode() ||\n context.locals?.__cms_is_draft\n ) {\n return next();\n }\n\n const rawUrl = context.url;\n const url =\n rawUrl && typeof rawUrl.href === 'string'\n ? new URL(rawUrl.href)\n : rawUrl && typeof (rawUrl as unknown as { pathname?: string }).pathname === 'string'\n ? rawUrl\n : new URL(context.request?.url || '/', 'http://localhost');\n const pathname = url.pathname || '/';\n const isPreviewRoute = pathname === '/_preview' || pathname.startsWith('/_preview/');\n\n const previewToken =\n (rawUrl?.searchParams?.get ? rawUrl.searchParams.get('preview_token') : null) ||\n (url?.searchParams?.get ? url.searchParams.get('preview_token') : null) ||\n (context.request?.headers?.get ? context.request.headers.get('x-preview-token') : null);\n\n if (!isPreviewRoute && !previewToken) {\n return next();\n }\n\n if (!client) {\n client = getClient() || undefined;\n }\n\n if (!client) {\n const metaEnv = (import.meta as unknown as { env?: Record<string, string | undefined> }).env;\n const siteId =\n options.siteId ||\n (typeof process !== 'undefined' && process.env?.CMS_SITE_ID) ||\n (typeof import.meta !== 'undefined' && metaEnv?.CMS_SITE_ID) ||\n '';\n const contentUrl =\n options.contentUrl ||\n (typeof process !== 'undefined' && process.env?.CMS_CONTENT_URL) ||\n (typeof import.meta !== 'undefined' && metaEnv?.CMS_CONTENT_URL) ||\n '';\n const previewSecret =\n options.previewSecret ||\n (typeof process !== 'undefined'\n ? process.env?.CMS_PREVIEW_SECRET ||\n process.env?.PREVIEW_TOKEN_SECRET ||\n process.env?.JWT_SECRET\n : undefined) ||\n (typeof import.meta !== 'undefined'\n ? metaEnv?.CMS_PREVIEW_SECRET || metaEnv?.PREVIEW_TOKEN_SECRET || metaEnv?.JWT_SECRET\n : undefined);\n\n if (siteId && contentUrl) {\n client = createCmsClient({\n siteId,\n contentUrl,\n previewSecret,\n });\n }\n }\n\n if (!previewToken) {\n return new Response('Preview token is missing', {\n status: 400,\n headers: {\n 'Cache-Control': 'private, no-store',\n 'X-Robots-Tag': 'noindex, nofollow',\n },\n });\n }\n\n if (!client) {\n return new Response('CMS client is missing or not configured', {\n status: 500,\n headers: {\n 'Cache-Control': 'private, no-store',\n 'X-Robots-Tag': 'noindex, nofollow',\n },\n });\n }\n\n let secret =\n options.previewSecret ||\n client.previewSecret ||\n (typeof process !== 'undefined' &&\n (process.env?.CMS_PREVIEW_SECRET ||\n process.env?.PREVIEW_TOKEN_SECRET ||\n process.env?.JWT_SECRET));\n\n if (!secret) {\n try {\n secret = getJwtSecret();\n } catch {\n return new Response('Preview secret not configured', {\n status: 404,\n headers: {\n 'Cache-Control': 'private, no-store',\n 'X-Robots-Tag': 'noindex, nofollow',\n },\n });\n }\n }\n\n const tokenResult = await verifyPreviewToken(previewToken, secret, client.siteId);\n if (!tokenResult.valid) {\n return new Response(tokenResult.error || 'Invalid or expired preview token', {\n status: 404,\n headers: {\n 'Cache-Control': 'private, no-store',\n 'X-Robots-Tag': 'noindex, nofollow',\n },\n });\n }\n\n let draftBundle: ContentBundle;\n try {\n draftBundle = await client.getBundle({ previewToken });\n } catch (err) {\n return new Response(\n `Failed to fetch draft bundle: ${err instanceof Error ? err.message : String(err)}`,\n {\n status: 404,\n headers: {\n 'Cache-Control': 'private, no-store',\n 'X-Robots-Tag': 'noindex, nofollow',\n },\n },\n );\n }\n\n // Run downstream request within the draft bundle context\n if (context.locals) {\n context.locals.__cms_is_draft = true;\n context.locals.__cms_draft_bundle = draftBundle;\n }\n\n let finalResponse: Response;\n setActiveDraftBundle(draftBundle);\n try {\n finalResponse = await runWithDraftBundle(draftBundle, async () => {\n let response: Response;\n if (isPreviewRoute) {\n const basePath = pathname.replace(/^\\/_preview/, '') || '/';\n if (typeof context.rewrite === 'function') {\n if (typeof globalThis !== 'undefined') {\n globalWithCms.__CMS_IS_REWRITING__ = true;\n }\n try {\n const rewritten = await context.rewrite(basePath);\n if (rewritten) {\n response = rewritten as Response;\n } else {\n response = await next();\n }\n } finally {\n if (typeof globalThis !== 'undefined') {\n globalWithCms.__CMS_IS_REWRITING__ = false;\n }\n }\n } else {\n response = await next();\n }\n } else {\n response = await next();\n }\n\n const contentType = response?.headers?.get ? response.headers.get('content-type') : '';\n const isStaticAsset = Boolean(\n pathname.match(/\\.(js|css|png|jpg|jpeg|gif|svg|ico|webp|woff|woff2|ttf|json|map)$/i),\n );\n const isHtml =\n (typeof contentType === 'string' && contentType.includes('text/html')) ||\n (!contentType && !isStaticAsset);\n\n if (isHtml) {\n const html = await response.text();\n const bridgeScript = buildBridgeScript({ editorOrigins: options.editorOrigins });\n const scriptTag = `<script>${bridgeScript}</script>`;\n const modifiedHtml = html.includes('</body>')\n ? html.replace('</body>', `${scriptTag}</body>`)\n : `${html}${scriptTag}`;\n\n const newHeaders = new Headers(response.headers);\n if (!newHeaders.has('content-type')) {\n newHeaders.set('content-type', 'text/html; charset=utf-8');\n }\n newHeaders.delete('content-length');\n newHeaders.set('Cache-Control', 'private, no-store, no-cache, must-revalidate');\n newHeaders.set('X-Robots-Tag', 'noindex, nofollow');\n\n return new Response(modifiedHtml, {\n status: response.status,\n statusText: response.statusText,\n headers: newHeaders,\n });\n }\n\n const nonHtmlHeaders = new Headers(response.headers);\n nonHtmlHeaders.set('Cache-Control', 'private, no-store, no-cache, must-revalidate');\n nonHtmlHeaders.set('X-Robots-Tag', 'noindex, nofollow');\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: nonHtmlHeaders,\n });\n });\n } finally {\n setActiveDraftBundle(null);\n }\n\n return finalResponse;\n };\n}\n"]}
@@ -1,14 +0,0 @@
1
- // ../config/src/index.ts
2
- function getJwtSecret(env) {
3
- const secret = env?.JWT_SECRET || typeof process !== "undefined" && process.env?.JWT_SECRET;
4
- if (!secret) {
5
- throw new Error("JWT_SECRET is required");
6
- }
7
- return secret;
8
- }
9
- var DEFAULT_DEV_API_URL = "http://127.0.0.1:8787";
10
- var DEFAULT_DEV_CONTENT_URL = "http://127.0.0.1:8788";
11
-
12
- export { DEFAULT_DEV_API_URL, DEFAULT_DEV_CONTENT_URL, getJwtSecret };
13
- //# sourceMappingURL=chunk-Y3Q65C7R.js.map
14
- //# sourceMappingURL=chunk-Y3Q65C7R.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../config/src/index.ts"],"names":[],"mappings":";AAsBO,SAAS,aAAa,GAAA,EAA4B;AACvD,EAAA,MAAM,SACJ,GAAA,EAAK,UAAA,IACJ,OAAO,OAAA,KAAY,WAAA,IAAe,QAAQ,GAAA,EAAK,UAAA;AAClD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,MAAA;AACT;AA+BO,IAAM,mBAAA,GAAsB;AAC5B,IAAM,uBAAA,GAA0B","file":"chunk-Y3Q65C7R.js","sourcesContent":["export const configVersion = '1.0.0';\n\nexport * from './preview-token.js';\n\nexport interface JwtSecretEnv {\n JWT_SECRET?: string;\n}\n\nexport interface PreviewTokenSecretEnv {\n PREVIEW_TOKEN_SECRET?: string;\n}\n\n// Local dev JWT secret used consistently across dev environments (.dev.vars, demo-site)\nexport const DEFAULT_DEV_JWT_SECRET =\n 'f44b0b9bf64e28c3b12e3c7ec5cec7b79f139d50f43655138caafe6b890565ce';\n\nexport const DEFAULT_DEV_ORCHESTRATOR_SECRET =\n 'dev-orchestrator-secret-f44b0b9bf64e28c3b12e3c7ec5cec7b79';\n\nexport const DEFAULT_DEV_ANALYTICS_QUERY_INTERNAL_SECRET =\n 'dev-analytics-query-internal-secret-b12e3c7ec5cec7b79f139d5';\n\nexport function getJwtSecret(env?: JwtSecretEnv): string {\n const secret =\n env?.JWT_SECRET ||\n (typeof process !== 'undefined' && process.env?.JWT_SECRET);\n if (!secret) {\n throw new Error('JWT_SECRET is required');\n }\n return secret;\n}\n\nexport function getPreviewTokenSecret(env?: PreviewTokenSecretEnv): string {\n const secret =\n env?.PREVIEW_TOKEN_SECRET ||\n (typeof process !== 'undefined' && process.env?.PREVIEW_TOKEN_SECRET);\n if (!secret) {\n throw new Error('PREVIEW_TOKEN_SECRET is required');\n }\n return secret;\n}\n\n// Leading slash, no trailing slash (except root '/'), lowercase, duplicate slashes collapsed\nexport function normalizePath(rawPath?: string): string {\n if (!rawPath || rawPath.trim() === '') {\n return '/';\n }\n let p = rawPath.trim().toLowerCase();\n if (!p.startsWith('/')) {\n p = `/${p}`;\n }\n p = p.replace(/\\/{2,}/g, '/');\n if (p.length > 1 && p.endsWith('/')) {\n p = p.replace(/\\/+$/, '');\n }\n return p;\n}\n\n// Local Supabase URL fallback\nexport const DEFAULT_SUPABASE_URL = 'http://127.0.0.1:54321';\n\nexport const DEFAULT_DEV_API_URL = 'http://127.0.0.1:8787';\nexport const DEFAULT_DEV_CONTENT_URL = 'http://127.0.0.1:8788';\nexport const DEFAULT_DEV_ANALYTICS_QUERY_URL = 'http://127.0.0.1:8791';\nexport const DEFAULT_DEV_WEB_URL = 'https://web.localhost';\nexport const DEFAULT_DEV_FALLBACK_WEB_URL = 'http://localhost:5173';\nexport const DEFAULT_DEV_DEMO_SITE_URL = 'https://demo.localhost';\nexport const DEFAULT_DEV_FALLBACK_DEMO_SITE_URL = 'http://localhost:4321';\n\n// Canonical local development origins allowlist across both portless names and raw loopback ports\nexport const LOCAL_DEV_ORIGINS: string[] = [\n 'http://localhost:4321',\n 'http://localhost:3000',\n 'http://localhost:5173',\n 'http://localhost:8787',\n 'http://localhost:8788',\n 'http://localhost:8789',\n 'http://localhost:8790',\n 'http://localhost:8791',\n 'http://127.0.0.1:4321',\n 'http://127.0.0.1:3000',\n 'http://127.0.0.1:5173',\n 'http://127.0.0.1:8787',\n 'http://127.0.0.1:8788',\n 'http://127.0.0.1:8789',\n 'http://127.0.0.1:8790',\n 'http://127.0.0.1:8791',\n 'https://web.localhost',\n 'https://api.localhost',\n 'https://content.localhost',\n 'https://builds.localhost',\n 'https://analytics.localhost',\n 'https://analytics-query.localhost',\n 'https://demo.localhost',\n];\n\n// Local Supabase demo anon key, used only when SUPABASE_ANON_KEY is unset\nexport const DEFAULT_SUPABASE_ANON_KEY =\n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0';\n\nexport const DEFAULT_SUPABASE_SERVICE_ROLE_KEY =\n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU';\n\nexport function normalizeOrigin(raw?: string | null): string | null {\n if (!raw || typeof raw !== 'string') return null;\n const trimmed = raw.trim();\n if (!trimmed) return null;\n\n try {\n const withScheme = /^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(trimmed)\n ? trimmed\n : `https://${trimmed}`;\n const url = new URL(withScheme);\n if (!url.protocol || !url.host) return null;\n return `${url.protocol}//${url.host}`.toLowerCase();\n } catch {\n return null;\n }\n}\n\nexport function deriveSiteOrigins(\n domain?: string | null,\n customDomain?: string | null,\n opts?: { includeLocalhost?: boolean },\n): string[] {\n const origins = new Set<string>();\n\n const normDomain = normalizeOrigin(domain);\n if (normDomain) origins.add(normDomain);\n\n const normCustom = normalizeOrigin(customDomain);\n if (normCustom) origins.add(normCustom);\n\n if (opts?.includeLocalhost) {\n for (const origin of LOCAL_DEV_ORIGINS) {\n origins.add(origin);\n }\n }\n\n return Array.from(origins);\n}\n"]}