@uptrademedia/site-kit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +305 -0
- package/dist/analytics/index.js +88 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +70 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/api-N35S3EES.js +57 -0
- package/dist/api-N35S3EES.js.map +1 -0
- package/dist/api-SYBTK7Z7.mjs +4 -0
- package/dist/api-SYBTK7Z7.mjs.map +1 -0
- package/dist/blog/index.js +200 -0
- package/dist/blog/index.js.map +1 -0
- package/dist/blog/index.mjs +194 -0
- package/dist/blog/index.mjs.map +1 -0
- package/dist/chunk-3MUOUXHV.js +3721 -0
- package/dist/chunk-3MUOUXHV.js.map +1 -0
- package/dist/chunk-4HVYXYQL 2.mjs +255 -0
- package/dist/chunk-4HVYXYQL.mjs +255 -0
- package/dist/chunk-4HVYXYQL.mjs.map +1 -0
- package/dist/chunk-7H6I3ECV.mjs +120 -0
- package/dist/chunk-7H6I3ECV.mjs.map +1 -0
- package/dist/chunk-COI6GOX2.mjs +3679 -0
- package/dist/chunk-COI6GOX2.mjs.map +1 -0
- package/dist/chunk-EQCVQC35.js +35 -0
- package/dist/chunk-EQCVQC35.js 2.map +1 -0
- package/dist/chunk-EQCVQC35.js.map +1 -0
- package/dist/chunk-FEBYQGY4 2.mjs +251 -0
- package/dist/chunk-FEBYQGY4.mjs +251 -0
- package/dist/chunk-FEBYQGY4.mjs.map +1 -0
- package/dist/chunk-FKVJOT2F.mjs +796 -0
- package/dist/chunk-FKVJOT2F.mjs.map +1 -0
- package/dist/chunk-GQ6ZOU2N.mjs +134 -0
- package/dist/chunk-GQ6ZOU2N.mjs.map +1 -0
- package/dist/chunk-HCFPU7TU.js +137 -0
- package/dist/chunk-HCFPU7TU.js.map +1 -0
- package/dist/chunk-NYKRE2FL 2.mjs +31 -0
- package/dist/chunk-NYKRE2FL.mjs +31 -0
- package/dist/chunk-NYKRE2FL.mjs 2.map +1 -0
- package/dist/chunk-NYKRE2FL.mjs.map +1 -0
- package/dist/chunk-QP5NCO2E.js +133 -0
- package/dist/chunk-QP5NCO2E.js.map +1 -0
- package/dist/chunk-RV7H3I6J.js +255 -0
- package/dist/chunk-RV7H3I6J.js 2.map +1 -0
- package/dist/chunk-RV7H3I6J.js.map +1 -0
- package/dist/chunk-SBVEYCSV.js +140 -0
- package/dist/chunk-SBVEYCSV.js.map +1 -0
- package/dist/chunk-TUKGA3UK.js +257 -0
- package/dist/chunk-TUKGA3UK.js 2.map +1 -0
- package/dist/chunk-TUKGA3UK.js.map +1 -0
- package/dist/chunk-V3F5J6CV.js +801 -0
- package/dist/chunk-V3F5J6CV.js.map +1 -0
- package/dist/chunk-WPSRS352.mjs +135 -0
- package/dist/chunk-WPSRS352.mjs.map +1 -0
- package/dist/commerce/index.js +157 -0
- package/dist/commerce/index.js.map +1 -0
- package/dist/commerce/index.mjs +4 -0
- package/dist/commerce/index.mjs.map +1 -0
- package/dist/commerce/server.js +186 -0
- package/dist/commerce/server.js.map +1 -0
- package/dist/commerce/server.mjs +176 -0
- package/dist/commerce/server.mjs.map +1 -0
- package/dist/engage/index.js +50 -0
- package/dist/engage/index.js.map +1 -0
- package/dist/engage/index.mjs +44 -0
- package/dist/engage/index.mjs.map +1 -0
- package/dist/forms/index.js +1053 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/index.mjs +1035 -0
- package/dist/forms/index.mjs.map +1 -0
- package/dist/generators-7Y5ABRYV 2.mjs +161 -0
- package/dist/generators-7Y5ABRYV.mjs +161 -0
- package/dist/generators-7Y5ABRYV.mjs 2.map +1 -0
- package/dist/generators-7Y5ABRYV.mjs.map +1 -0
- package/dist/generators-GWIYCA5M.js +171 -0
- package/dist/generators-GWIYCA5M.js 2.map +1 -0
- package/dist/generators-GWIYCA5M.js.map +1 -0
- package/dist/index 2.mjs +74 -0
- package/dist/index.js +326 -0
- package/dist/index.js 2.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +222 -0
- package/dist/index.mjs.map +1 -0
- package/dist/migrator-V6KS75EA 2.mjs +265 -0
- package/dist/migrator-V6KS75EA.mjs +265 -0
- package/dist/migrator-V6KS75EA.mjs 2.map +1 -0
- package/dist/migrator-V6KS75EA.mjs.map +1 -0
- package/dist/migrator-XKM7YQCY.js +272 -0
- package/dist/migrator-XKM7YQCY.js 2.map +1 -0
- package/dist/migrator-XKM7YQCY.js.map +1 -0
- package/dist/scanner-MF7P3CDE 2.mjs +14386 -0
- package/dist/scanner-MF7P3CDE.mjs +14386 -0
- package/dist/scanner-MF7P3CDE.mjs 2.map +1 -0
- package/dist/scanner-MF7P3CDE.mjs.map +1 -0
- package/dist/scanner-NT6YG4TD 2.js +14397 -0
- package/dist/scanner-NT6YG4TD.js +14397 -0
- package/dist/scanner-NT6YG4TD.js 2.map +1 -0
- package/dist/scanner-NT6YG4TD.js.map +1 -0
- package/dist/seo/index.js +447 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/index.mjs +411 -0
- package/dist/seo/index.mjs.map +1 -0
- package/dist/seo/server.js +66 -0
- package/dist/seo/server.js.map +1 -0
- package/dist/seo/server.mjs +5 -0
- package/dist/seo/server.mjs.map +1 -0
- package/dist/setup/index.js +1050 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/index.mjs +1046 -0
- package/dist/setup/index.mjs.map +1 -0
- package/dist/sitemap/index.js +212 -0
- package/dist/sitemap/index.js.map +1 -0
- package/dist/sitemap/index.mjs +206 -0
- package/dist/sitemap/index.mjs.map +1 -0
- package/dist/web-vitals-BH55V7EJ.js +252 -0
- package/dist/web-vitals-BH55V7EJ.js 2.map +1 -0
- package/dist/web-vitals-BH55V7EJ.js.map +1 -0
- package/dist/web-vitals-RJYPWAR3 2.mjs +241 -0
- package/dist/web-vitals-RJYPWAR3.mjs +241 -0
- package/dist/web-vitals-RJYPWAR3.mjs 2.map +1 -0
- package/dist/web-vitals-RJYPWAR3.mjs.map +1 -0
- package/package.json +118 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/setup/SetupWizard.tsx","../../src/setup/api-handlers.ts"],"names":["handleCreateProject","handleScan","handleMigrate","handleConfigure"],"mappings":";;;;;AA6DO,SAAS,WAAA,CAAY,EAAE,MAAA,EAAO,GAAsB,EAAC,EAAG;AAC7D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAe,SAAS,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAwB,IAAI,CAAA;AAGlE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAAyB,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA8B,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAyB,IAAI,CAAA;AAC3E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAS,EAAE,CAAA;AAG3D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA6B,IAAI,CAAA;AAGvE,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,CAAC,CAAA;AAC5D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA,CAAmB,EAAE,CAAA;AAG7D,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,uBAAA;AAG7C,EAAsB,WAAA,CAAY,OAAO,IAAA,EAAc,OAAA,GAAuB,EAAC,KAAM;AACnF,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAI,OAAA,CAAQ,OAAA,IAAqC;AAAC,KACpD;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MACrC,GAAG,OAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,YAAA,EAAc,WAAW,CAAC;AAG9B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,mBAAA,EAAoB;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,eAAe,mBAAA,GAAsB;AACnC,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,sBAAsB,CAAA;AACnD,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,IAAI,UAAU,UAAA,EAAY;AACxB,QAAA,OAAA,CAAQ,UAAU,CAAA;AAClB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,CAAQ,sBAAsB,CAAA;AAC/D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,cAAA,CAAe,WAAW,CAAA;AAE1B,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA,cAAA,CAAA,EAAkB;AAAA,UACvD,OAAA,EAAS,EAAE,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA;AAAG,SACrD,CAAA;AACD,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,IAAI,KAAK,aAAA,EAAe;AACtB,UAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,UAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,UAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAMA,EAAA,SAAS,WAAA,GAAc;AACrB,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,WAAA,EAAE,CAAA;AAAA,wBACjC,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,6BAAA,EAA2B,CAAA;AAAA,wBACnE,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,+CAAA,EAErC;AAAA,OAAA,EACF,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,WAAA;AAAA,YACL,KAAA,EAAM,WAAA;AAAA,YACN,WAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,WAAA;AAAA,YACL,KAAA,EAAM,OAAA;AAAA,YACN,WAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,WAAA;AAAA,YACL,KAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAY;AAAA;AAAA;AACd,OAAA,EACF,CAAA;AAAA,sBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,QAAA,EAAA,oBAAA,EAExC,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAMA,EAAA,SAAS,QAAA,GAAW;AAClB,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,EAAE,CAAA;AAC3C,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAA4B,OAAO,CAAA;AAEnE,IAAA,eAAe,WAAA,GAAc;AAC3B,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,MAAU,CAAC,QAAA,CAAS,MAAK,EAAG;AACvC,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AAEF,QAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,IAAO,0CAAA;AACnC,QAAA,MAAM,WAAA,GAAc,QAAQ,OAAA,IAAW,EAAA;AAEvC,QAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA,kCAAA,CAAA,EAAsC;AAAA,UAC9E,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,QAAA,EAAU;AAAA,WACZ;AAAA,UACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,UAAU;AAAA,SACzC,CAAA;AAED,QAAA,IAAI,CAAC,QAAQ,EAAA,EAAI;AACf,UAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAA,EAAK;AACnC,UAAA,MAAM,IAAI,KAAA,CAAM,OAAA,CAAQ,iBAAA,IAAqB,OAAA,CAAQ,OAAO,cAAc,CAAA;AAAA,QAC5E;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,IAAA,EAAK;AACpC,QAAA,MAAM,QAAQ,QAAA,CAAS,YAAA;AAGvB,QAAA,YAAA,CAAa,OAAA,CAAQ,wBAAwB,KAAK,CAAA;AAClD,QAAA,cAAA,CAAe,KAAK,CAAA;AAGpB,QAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA,cAAA,CAAA,EAAkB;AAAA,UAC9D,OAAA,EAAS,EAAE,eAAA,EAAiB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAG,SAC/C,CAAA;AACD,QAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,IAAA,EAAK;AAEtC,QAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,UAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,UAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,UAAA,MAAM,kBAAkB,KAAK,CAAA;AAC7B,UAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,QACnB,CAAA,MAAO;AACL,UAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,QACpE;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA,CAAU,IAAc,OAAO,CAAA;AAAA,MACjC,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,eAAe,eAAA,GAAkB;AAC/B,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AACnB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,IAAO,0CAAA;AACnC,QAAA,MAAM,WAAA,GAAc,QAAQ,OAAA,IAAW,EAAA;AAGvC,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA,kBAAA,CAAA,EAAsB;AAAA,UAC1D,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,QAAA,EAAU;AAAA,WACZ;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,KAAA;AAAA,YACA,OAAA,EAAS;AAAA,cACP,UAAA,EAAY,OAAO,QAAA,CAAS;AAAA;AAC9B,WACD;AAAA,SACF,CAAA;AAED,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAExD,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,KAAA,CAAM,oCAAoC,CAAA;AAAA,MAC5C,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA,CAAU,IAAc,OAAO,CAAA;AAAA,MACjC,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,wBAC1D,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,0CAAA,EAE7B;AAAA,OAAA,EACF,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,QAAA,KAAa,OAAA,GAAU,gBAAgB,aAAa,CAAA,CAAA;AAAA,YACvF,OAAA,EAAS,MAAM,WAAA,CAAY,OAAO,CAAA;AAAA,YACnC,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,QAAA,KAAa,OAAA,GAAU,gBAAgB,aAAa,CAAA,CAAA;AAAA,YACvF,OAAA,EAAS,MAAM,WAAA,CAAY,OAAO,CAAA;AAAA,YACnC,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,0BACzD,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,KAAA,EAAO,KAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACxC,WAAA,EAAY,iBAAA;AAAA,cACZ,SAAA,EAAU;AAAA;AAAA;AACZ,SAAA,EACF,CAAA;AAAA,QAEC,QAAA,KAAa,OAAA,oBACZ,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,0BAC5D,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,KAAA,EAAO,QAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC3C,WAAA,EAAY,kDAAA;AAAA,cACZ,SAAA,EAAU;AAAA;AAAA;AACZ,SAAA,EACF,CAAA;AAAA,wBAGF,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,QAAA,KAAa,OAAA,GAAU,WAAA,GAAc,eAAA;AAAA,YAC9C,OAAA,EAAS,SAAA;AAAA,YACT,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA,MAAW,QAAA,KAAa,OAAA,IAAW,CAAC,QAAA,CAAS,IAAA,EAAK;AAAA,YAElE,QAAA,EAAA,QAAA,KAAa,UAAU,gBAAA,GAAc;AAAA;AAAA,SACxC;AAAA,wBAEA,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA;AAAA,UAAA,wBAAA;AAAA,UACxB,GAAA;AAAA,0BACvB,GAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,wCAAA;AAAA,cACL,MAAA,EAAO,QAAA;AAAA,cACP,SAAA,EAAU,+BAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MAEC,KAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFACZ,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AAMA,EAAA,eAAe,kBAAkB,KAAA,EAAgB;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,YAAY,KAAA,IAAS,WAAA;AAC3B,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA,oBAAA,CAAA,EAAwB;AAAA,QAC7D,OAAA,EAAS,YAAY,EAAE,eAAA,EAAiB,UAAU,SAAS,CAAA,CAAA,KAAO;AAAC,OACpE,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,gBAAA,CAAiB,MAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,EAAE,CAAA;AAAA,IAClD,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,8BAA8B,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,SAAS,WAAA,GAAc;AACrB,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,EAAE,CAAA;AAgC/C,IAAA,eAAeA,oBAAAA,GAAsB;AACnC,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,cAAA,CAAe,MAAK,EAAG;AAC5C,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA,eAAA,CAAA,EAAmB;AAAA,UACxD,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,GAAI,cAAc,EAAE,eAAA,EAAiB,UAAU,WAAW,CAAA,CAAA,KAAO;AAAC,WACpE;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,OAAO,WAAA,CAAY,EAAA;AAAA,YACnB,IAAA,EAAM,cAAA;AAAA,YACN,MAAA,EAAQ,gBAAA,IAAoB,MAAA,CAAO,QAAA,CAAS;AAAA,WAC7C;AAAA,SACF,CAAA;AAED,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAEvD,QAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAK;AAC/B,QAAA,kBAAA,CAAmB,OAAO,CAAA;AAC1B,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA,CAAU,IAAc,OAAO,CAAA;AAAA,MACjC,CAAA,SAAE;AACA,QAAA,WAAA,CAAY,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,eAAe,oBAAoB,OAAA,EAAkB;AACnD,MAAA,kBAAA,CAAmB,OAAO,CAAA;AAC1B,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB;AAEA,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,wBAC3D,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,gDAAA,EAE7B;AAAA,OAAA,EACF,CAAA;AAAA,sBAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,wBAChE,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,aAAa,EAAA,IAAM,EAAA;AAAA,YAC1B,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,aAAA,CAAc,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,MAAA,CAAO,KAAK,KAAK,IAAI,CAAA;AAAA,YACxF,SAAA,EAAU,gEAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,cACtC,aAAA,CAAc,GAAA,CAAI,CAAA,GAAA,qBACjB,GAAA,CAAC,QAAA,EAAA,EAAoB,KAAA,EAAO,GAAA,CAAI,EAAA,EAAK,QAAA,EAAA,GAAA,CAAI,IAAA,EAAA,EAA5B,GAAA,CAAI,EAA6B,CAC/C;AAAA;AAAA;AAAA;AACH,OAAA,EACF,CAAA;AAAA,MAGC,WAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,0BACjD,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,uCAAA;AAAA,cACV,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,cAErC,sBAAY,iBAAA,GAAoB;AAAA;AAAA;AACnC,SAAA,EACF,CAAA;AAAA,QAEC,SAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,cAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACjD,WAAA,EAAY,cAAA;AAAA,cACZ,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,gBAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACnD,WAAA,EAAa,OAAO,QAAA,CAAS,QAAA;AAAA,cAC7B,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAASA,oBAAAA;AAAA,cACT,OAAA,EAAS,QAAA;AAAA,cACT,QAAA,EAAU,CAAC,cAAA,CAAe,IAAA,EAAK;AAAA,cAChC,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA,mBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,WAAA,CAAY,QAAA,CAAS,MAAA,KAAW,CAAA,mBAC/B,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gCAAA,EAAiC,QAAA,EAAA;AAAA,UAAA,kBAAA;AAAA,UAC3B,GAAA;AAAA,0BACjB,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,+BAAA;AAAA,cACV,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,cACjC,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA,GAEA,WAAA,CAAY,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,qBACvB,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,MAAM,mBAAA,CAAoB,OAAO,CAAA;AAAA,YAC1C,SAAA,EAAU,iHAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,OAAA,CAAQ,IAAA,EAAK,CAAA;AAAA,8BAC3C,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAyB,kBAAQ,MAAA,EAAO;AAAA;AAAA,WAAA;AAAA,UALlD,OAAA,CAAQ;AAAA,SAOhB,CAAA,EAEL;AAAA,OAAA,EAEJ;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AAMA,EAAA,MAAMC,WAAAA,GAAa,YAAY,YAAY;AACzC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,sBAAsB,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAChE,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,cAAA,CAAe;AAAA,QACb,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAqB,EAAE,GAAG,CAAA,EAAG,QAAA,EAAU,IAAA,EAAK,CAAE,CAAA;AAAA,QACrE,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAqB,EAAE,GAAG,CAAA,EAAG,QAAA,EAAU,IAAA,EAAK,CAAE,CAAA;AAAA,QACzE,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAqB,EAAE,GAAG,CAAA,EAAG,QAAA,EAAU,KAAA,EAAM,CAAE;AAAA,OAC7E,CAAA;AACD,MAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,IACnB,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAU,IAAc,OAAO,CAAA;AAAA,IACjC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAS,QAAA,GAAW;AAClB,IAAA,SAAA,CAAU,MAAM;AACd,MAAAA,WAAAA,EAAW;AAAA,IACb,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,QAAA,EAAA,WAAA,EAAE,CAAA;AAAA,sBAC1C,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,sBACzD,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,wDAAA,EAE7B,CAAA;AAAA,sBACA,GAAA,CAAC,SAAI,SAAA,EAAU,qBAAA,EACb,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAkF,CAAA,EACnG;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAMA,EAAA,SAAS,WAAA,GAAc;AACrB,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AAEzB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,GAAG,WAAA,CAAY,KAAA;AAAA,MACf,GAAG,WAAA,CAAY,OAAA;AAAA,MACf,GAAG,WAAA,CAAY;AAAA,KACjB;AACA,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AAEvD,IAAA,SAAS,UAAA,CAAW,MAAwC,KAAA,EAAe;AACzE,MAAA,cAAA,CAAe,CAAA,IAAA,KAAQ;AACrB,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,QAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,EAAK;AAC1B,QAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,CAAC,GAAG,IAAA,CAAK,IAAI,CAAC,CAAA;AAC9B,QAAA,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAK,IAAI,EAAE,GAAG,QAAQ,IAAI,CAAA,CAAE,KAAK,CAAA,EAAG,UAAU,CAAC,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAK,EAAE,QAAA,EAAS;AAC3F,QAAA,OAAO,OAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,eAAeC,cAAAA,GAAgB;AAC7B,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,MAAA,oBAAA,CAAqB,CAAC,CAAA;AAEtB,MAAA,MAAM,KAAA,GAAQ,aAAA;AACd,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,QAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK,IAAI,CAAA,GAAA,CAAK,CAAC,CAAA;AAE9E,QAAA,IAAI;AACF,UAAA,MAAM,MAAM,uBAAA,EAAyB;AAAA,YACnC,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,MAAM,SAAA,EAAW,eAAA,EAAiB,IAAI;AAAA,WAC9D,CAAA;AACD,UAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,mBAAc,IAAA,CAAK,IAAI,EAAE,CAAC,CAAA;AAAA,QAC9D,CAAA,CAAA,MAAQ;AACN,UAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,4BAAuB,IAAA,CAAK,IAAI,EAAE,CAAC,CAAA;AAAA,QACvE;AAEA,QAAA,oBAAA,CAAqB,KAAK,KAAA,CAAA,CAAQ,CAAA,GAAI,KAAK,KAAA,CAAM,MAAA,GAAU,GAAG,CAAC,CAAA;AAAA,MACjE;AAEA,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,WAAW,CAAA;AAAA,IACrB;AAEA,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,wBACxD,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,+CAAA,EAE7B;AAAA,OAAA,EACF,CAAA;AAAA,MAGC,WAAA,CAAY,MAAM,MAAA,GAAS,CAAA,wBACzB,OAAA,EAAA,EAAQ,KAAA,EAAM,iBAAA,EAAW,KAAA,EAAO,WAAA,CAAY,KAAA,CAAM,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAA,EACxE,sBAAY,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAC5B,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAM,IAAA;AAAA,UACN,QAAA,EAAU,MAAM,UAAA,CAAW,OAAA,EAAS,CAAC;AAAA,SAAA;AAAA,QAFhC;AAAA,OAIR,CAAA,EACH,CAAA;AAAA,MAID,WAAA,CAAY,QAAQ,MAAA,GAAS,CAAA,wBAC3B,OAAA,EAAA,EAAQ,KAAA,EAAM,wBAAA,EAAkB,KAAA,EAAO,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAA,EACjF,sBAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,CAAA,qBAChC,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAM,MAAA;AAAA,UACN,QAAA,EAAU,MAAM,UAAA,CAAW,SAAA,EAAW,CAAC;AAAA,SAAA;AAAA,QAFlC;AAAA,OAIR,CAAA,EACH,CAAA;AAAA,MAID,WAAA,CAAY,SAAS,MAAA,GAAS,CAAA,wBAC5B,OAAA,EAAA,EAAQ,KAAA,EAAM,0BAAA,EAAe,KAAA,EAAO,WAAA,CAAY,QAAA,CAAS,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAA,EAC/E,sBAAY,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAC/B,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAM,IAAA;AAAA,UACN,QAAA,EAAU,MAAM,UAAA,CAAW,UAAA,EAAY,CAAC;AAAA,SAAA;AAAA,QAFnC;AAAA,OAIR,CAAA,EACH,CAAA;AAAA,MAID,WAAW,MAAA,KAAW,CAAA,oBACrB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBAChC,GAAA,CAAC,OAAE,QAAA,EAAA,wCAAA,EAAsC,CAAA;AAAA,wBACzC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,wBAAA,EAAsB;AAAA,OAAA,EAC/C,CAAA;AAAA,MAID,YAAA,CAAa,MAAA,GAAS,CAAA,oBACrB,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACZ,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,yBACrB,KAAA,EAAA,EAAY,SAAA,EAAW,GAAA,CAAI,UAAA,CAAW,QAAG,CAAA,GAAI,iBAAiB,gBAAA,EAC5D,QAAA,EAAA,GAAA,EAAA,EADO,CAEV,CACD,CAAA,EACH,CAAA;AAAA,MAID,SAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,gDAAA;AAAA,UACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,iBAAiB,CAAA,CAAA,CAAA;AAAI;AAAA,OAC1C,EACF,CAAA;AAAA,sBAIF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,SAAQ,WAAA,EAAY,OAAA,EAAS,MAAM,OAAA,CAAQ,WAAW,GAAG,QAAA,EAAA,gBAAA,EAEjE,CAAA;AAAA,wBACA,IAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAASA,cAAAA,EAAe,SAAS,SAAA,EAAW,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,UACzC,aAAA,CAAc,MAAA;AAAA,UAAO;AAAA,SAAA,EAChC;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAMA,EAAA,SAAS,aAAA,GAAgB;AACvB,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AAEpD,IAAA,eAAeC,gBAAAA,GAAkB;AAC/B,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,yBAAA,EAA2B;AAAA,UACrC,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAA,EAAW,eAAA,EAAiB,IAAI;AAAA,SACxD,CAAA;AACD,QAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,MACpB,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA,CAAU,IAAc,OAAO,CAAA;AAAA,MACjC,CAAA,SAAE;AACA,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,wBAC1D,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,+EAAA,EAE7B;AAAA,OAAA,EACF,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,uBAAA;AAAA,YACN,WAAA,EAAY,YAAA;AAAA,YACZ,OAAA,EAAS,CAAA,+BAAA,EAAkC,eAAA,EAAiB,EAAA,IAAM,KAAK;AAAA;AAAA;AAAA,sBAAA;AAAA;AAAA,SAIzE;AAAA,wBAEA,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,iBAAA;AAAA,YACN,WAAA,EAAY,gBAAA;AAAA,YACZ,OAAA,EAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA;AAAA;AAAA;AAOX,OAAA,EACF,CAAA;AAAA,sBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAASA,gBAAAA,EAAiB,OAAA,EAAS,WAAA,EAAa,QAAA,EAAA,4BAAA,EAExD,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAMA,EAAA,SAAS,YAAA,GAAe;AACtB,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAE9C,IAAA,eAAe,iBAAA,GAAoB;AACjC,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,CAAM,6BAAA,EAA+B,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAC7D,QAAA,MAAA,CAAO,SAAS,IAAA,GAAO,GAAA;AAAA,MACzB,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA,CAAU,IAAc,OAAO,CAAA;AAC/B,QAAA,WAAA,CAAY,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,QAAA,EAAA,WAAA,EAAE,CAAA;AAAA,sBAC5B,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,sBAClD,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,6CAAA,EAErC,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,WAAA;AAAA,YACL,KAAA,EAAM,gBAAA;AAAA,YACN,IAAA,EAAK;AAAA;AAAA,SACP;AAAA,wBACA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,WAAA;AAAA,YACL,KAAA,EAAM,aAAA;AAAA,YACN,IAAA,EAAK;AAAA;AAAA,SACP;AAAA,wBACA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,WAAA;AAAA,YACL,KAAA,EAAM,eAAA;AAAA,YACN,IAAA,EAAK;AAAA;AAAA,SACP;AAAA,wBACA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,WAAA;AAAA,YACL,KAAA,EAAM,UAAA;AAAA,YACN,IAAA,EAAK;AAAA;AAAA;AACP,OAAA,EACF,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA,6CAAA,EAElC,CAAA;AAAA,wBACA,GAAA,CAAC,UAAO,OAAA,EAAQ,QAAA,EAAS,SAAS,iBAAA,EAAmB,OAAA,EAAS,UAAU,QAAA,EAAA,qBAAA,EAExE,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA,sCAAA,EAE1C;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAMA,EAAA,MAAM,KAAA,GAA2C;AAAA,IAC/C,OAAA,EAAS,WAAA;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,WAAA;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,WAAA;AAAA,IACT,SAAA,EAAW,aAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,WAAA,GAAc,MAAM,IAAI,CAAA;AAE9B,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFAAA,EAEb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4CAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,iFAAA;AAAA,QACV,OAAO,EAAE,KAAA,EAAO,GAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,KAAK,EAAE,MAAA,GAAS,CAAA,CAAA,GAAM,GAAG,CAAA,CAAA,CAAA;AAAI;AAAA,KACnG,EACF,CAAA;AAAA,oBAGA,IAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,6CAAA,EAChB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kEAAA,EAAmE,CAAA;AAAA,wBAClF,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,kBAAA,EAAgB;AAAA,OAAA,EAClD,CAAA;AAAA,MACC,SAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACZ,QAAA,EAAA,SAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,wBAGC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EACd,QAAA,kBAAA,GAAA,CAAC,eAAY,CAAA,EACf,CAAA;AAAA,oBAGA,IAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,2EAAA,EAChB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAE,IAAA,EAAK,0BAAA,EAA2B,QAAO,QAAA,EAAS,SAAA,EAAU,uBAAsB,QAAA,EAAA,eAAA,EAEnF,CAAA;AAAA,MACC,QAAA;AAAA,sBACD,GAAA,CAAC,OAAE,IAAA,EAAK,+BAAA,EAAgC,QAAO,QAAA,EAAS,SAAA,EAAU,uBAAsB,QAAA,EAAA,MAAA,EAExF,CAAA;AAAA,MACC,QAAA;AAAA,sBACD,GAAA,CAAC,OAAE,IAAA,EAAK,0CAAA,EAA2C,QAAO,QAAA,EAAS,SAAA,EAAU,uBAAsB,QAAA,EAAA,QAAA,EAEnG;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAMA,SAAS,MAAA,CAAO;AAAA,EACd,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAMG;AACD,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,OAAA,EAAS,kFAAA;AAAA,IACT,SAAA,EAAW,+BAAA;AAAA,IACX,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,UAAU,OAAA,IAAW,QAAA;AAAA,MACrB,SAAA,EAAW,CAAA,gGAAA,EAAmG,QAAA,CAAS,OAAO,CAAC,CAAA,CAAA;AAAA,MAE9H,QAAA,EAAA,OAAA,mBACC,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gFAAA,EAAiF,CAAA;AAAA,QAAE;AAAA,OAAA,EAErG,CAAA,GACE;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,KAAA,EAAO,aAAY,EAAyD;AACvG,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,oBACrC,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC1C,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,WAAA,EAAY;AAAA,GAAA,EACpD,CAAA;AAEJ;AAEA,SAAS,OAAA,CAAQ,EAAE,KAAA,EAAO,KAAA,EAAO,UAAS,EAAgE;AACxG,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4DAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACrC,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,QAAM;AAAA,OAAA,EAAS;AAAA,KAAA,EAC1D,CAAA;AAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACZ,QAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,OAAA,CAAQ,EAAE,IAAA,EAAM,QAAA,EAAS,EAAiD;AACjF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,SAAS,IAAA,CAAK,QAAA;AAAA,QACd,QAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK,CAAA;AAAA,sBACjD,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAkC,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,IAAA;AAAA,QAAK,GAAA;AAAA,QAAE,IAAA,CAAK;AAAA,OAAA,EAAK;AAAA,KAAA,EACzE;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,WAAA,EAAa,SAAQ,EAA4D;AAC/G,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yDAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACrC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EACvD,CAAA;AAAA,oBACA,GAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EACb,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,OAAA,EAAQ,CAAA,EAC5C;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,KAAA,EAAO,MAAK,EAAkD;AACvF,EAAA,uBACE,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,MAAA,EAAO,QAAA;AAAA,MACP,SAAA,EAAU,kHAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,wBACjC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACvC;AAEJ;ACr+BA,IAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,kBAAA,IAAsB,iCAAA;AACrD,IAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,8BAAA;AAG/C,IAAI,cAKA,EAAC;AAML,eAAsB,YAAA,GAAsC;AAC1D,EAAA,MAAM,aAAa,CAAC,EAClB,QAAQ,GAAA,CAAI,8BAAA,IACZ,QAAQ,GAAA,CAAI,wBAAA,CAAA;AAGd,EAAA,OAAO,aAAa,IAAA,CAAK;AAAA,IACvB,UAAA;AAAA,IACA,aAAA,EAAe,CAAC,CAAC,WAAA,CAAY,WAAA;AAAA,IAC7B,OAAO,WAAA,CAAY;AAAA,GACpB,CAAA;AACH;AAMA,eAAsB,eAAA,GAAyC;AAC7D,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,UAAU,CAAC,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,kDAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,UAAU,CAAA,UAAA,CAAA,GAAe,IAAI,eAAA,CAAgB;AAAA,IAC9D,YAAA,EAAc,WAAA;AAAA,IACd;AAAA,GACD,CAAA;AAED,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,OAAA,EAAS,OAAO,CAAA;AAC7C;AAEA,eAAsB,mBAAmB,GAAA,EAAyC;AAChF,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,IAAI,GAAA,CAAI,IAAI,GAAG,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAEtC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,IAAI,YAAA,CAAa,SAAA,CAAU,uBAAA,EAAyB,KAAK,CAAA,EAAG;AAAA,MACjE,OAAA,EAAS,EAAE,cAAA,EAAgB,WAAA;AAAY,KACxC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAI,YAAA,CAAa,SAAA,CAAU,cAAA,EAAgB,gCAAgC,CAAA,EAAG;AAAA,MACnF,OAAA,EAAS,EAAE,cAAA,EAAgB,WAAA;AAAY,KACxC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,eAAA,CAAA,EAAmB;AAAA,MAC7D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,IAAA;AAAA,QACA,YAAA,EAAc;AAAA,OACf;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,cAAc,EAAA,EAAI;AACrB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,EAAE,YAAA,EAAc,OAAA,EAAS,OAAM,GAAI,MAAM,cAAc,IAAA,EAAK;AAElE,IAAA,WAAA,GAAc;AAAA,MACZ,WAAA,EAAa,YAAA;AAAA,MACb,MAAA,EAAQ,OAAA;AAAA,MACR;AAAA,KACF;AAEA,IAAA,OAAO,IAAI,YAAA,CAAa,WAAA,EAAY,EAAG;AAAA,MACrC,OAAA,EAAS,EAAE,cAAA,EAAgB,WAAA;AAAY,KACxC,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,IAAI,YAAA,CAAa,SAAA,CAAU,uBAAA,EAA0B,GAAA,CAAc,OAAO,CAAA,EAAG;AAAA,MAClF,OAAA,EAAS,EAAE,cAAA,EAAgB,WAAA;AAAY,KACxC,CAAA;AAAA,EACH;AACF;AAEA,eAAsB,gBAAA,GAA0C;AAC9D,EAAA,OAAO,aAAa,IAAA,CAAK;AAAA,IACvB,aAAA,EAAe,CAAC,CAAC,WAAA,CAAY,WAAA;AAAA,IAC7B,OAAO,WAAA,CAAY;AAAA,GACpB,CAAA;AACH;AAEA,eAAsB,iBAAiB,GAAA,EAAyC;AAC9E,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,IAAI,IAAA,EAAK;AAElC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,oBAAA,CAAA,EAAwB;AAAA,MAC7D,OAAA,EAAS,EAAE,eAAA,EAAiB,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAG,KAChD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAO,YAAA,CAAa,KAAK,EAAE,KAAA,EAAO,mBAAkB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,MAAM,SAAS,IAAA,EAAK;AAE/C,IAAA,WAAA,GAAc;AAAA,MACZ,WAAA,EAAa,MAAA;AAAA,MACb,MAAA,EAAQ,OAAA;AAAA,MACR;AAAA,KACF;AAEA,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,YAAA,CAAa,KAAK,EAAE,KAAA,EAAO,yBAAwB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC9E;AACF;AAMA,eAAsB,sBAAA,GAAgD;AACpE,EAAA,IAAI,CAAC,YAAY,WAAA,EAAa;AAC5B,IAAA,OAAO,YAAA,CAAa,KAAK,EAAE,KAAA,EAAO,qBAAoB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC1E;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,cAAA,CAAA,EAAkB;AAAA,MACvD,SAAS,EAAE,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,WAAW,CAAA,CAAA;AAAG,KACjE,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAM,QAAA,CAAS,IAAA,EAAK;AAC1C,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,aAAA,EAAe,CAAA;AAAA,EAC5C,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,KAAA,EAAQ,GAAA,CAAc,SAAQ,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC7E;AACF;AAEA,eAAsB,oBAAoB,GAAA,EAAyC;AACjF,EAAA,IAAI,CAAC,YAAY,WAAA,EAAa;AAC5B,IAAA,OAAO,YAAA,CAAa,KAAK,EAAE,KAAA,EAAO,qBAAoB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,QAAO,GAAI,MAAM,IAAI,IAAA,EAAK;AAE/C,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,SAAA,CAAA,EAAa;AAAA,MACzE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,WAAW,CAAA,CAAA;AAAA,QAClD,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,QAAQ;AAAA,KACtC,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,OAAO,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,EAClC,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,KAAA,EAAQ,GAAA,CAAc,SAAQ,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC7E;AACF;AAMA,eAAsB,UAAA,GAAoC;AACxD,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,MAAM,OAAO,yBAAgB,CAAA;AAEtD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAEhD,IAAA,OAAO,aAAa,IAAA,CAAK;AAAA,MACvB,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC7B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,QAAQ,CAAA,CAAE;AAAA;AACZ,OACF,CAAE,CAAA;AAAA,MACF,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QACjC,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,SAAS;AAAC,OACZ,CAAE,CAAA;AAAA,MACF,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QACnC,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,SAAS;AAAC,OACZ,CAAE;AAAA,KACH,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,KAAA,EAAQ,GAAA,CAAc,SAAQ,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC7E;AACF;AAMA,eAAsB,cAAc,GAAA,EAAyC;AAC3E,EAAA,IAAI,CAAC,YAAY,WAAA,EAAa;AAC5B,IAAA,OAAO,YAAA,CAAa,KAAK,EAAE,KAAA,EAAO,qBAAoB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,MAAM,IAAI,IAAA,EAAK;AAC3C,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,MAAM,OAAO,0BAAiB,CAAA;AAEvD,EAAA,IAAI;AACF,IAAA,MAAM,aAAa,CAAC,IAAI,CAAA,EAAG,SAAA,EAAW,YAAY,WAAW,CAAA;AAC7D,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EAC5C,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,KAAA,EAAQ,GAAA,CAAc,SAAQ,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC7E;AACF;AAMA,eAAsB,gBAAgB,GAAA,EAAyC;AAC7E,EAAA,IAAI,CAAC,YAAY,WAAA,EAAa;AAC5B,IAAA,OAAO,YAAA,CAAa,KAAK,EAAE,KAAA,EAAO,qBAAoB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,IAAI,IAAA,EAAK;AACrC,EAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,EAAiB,GAAI,MAAM,OAAO,4BAAmB,CAAA;AAE9E,EAAA,IAAI;AAEF,IAAA,MAAM,iBAAiB,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,UAAA,EAAa,SAAS,CAAA,OAAA,CAAA,EAAW;AAAA,MAC5E,SAAS,EAAE,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,WAAW,CAAA,CAAA;AAAG,KACjE,CAAA;AAED,IAAA,IAAI,CAAC,eAAe,EAAA,EAAI;AACtB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,IAAA,EAAK;AAGzC,IAAA,MAAM,cAAc,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,UAAA,EAAa,SAAS,CAAA,SAAA,CAAA,EAAa;AAAA,MAC3E,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,WAAW,CAAA,CAAA;AAAA,QAClD,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,kBAAkB;AAAA,KAChD,CAAA;AAED,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,WAAA,CAAY,EAAA,GAAK,MAAM,WAAA,CAAY,IAAA,EAAK,GAAI,EAAE,OAAA,EAAS,QAAA,EAAS;AAGpF,IAAA,MAAM,eAAA,CAAgB;AAAA,MACpB,SAAA;AAAA,MACA,aAAa,MAAA,CAAO,YAAA;AAAA,MACpB,iBAAiB,MAAA,CAAO,iBAAA;AAAA,MACxB,MAAA,EAAQ;AAAA,KACT,CAAA;AAGD,IAAA,MAAM,gBAAA,CAAiB,EAAE,SAAA,EAAW,CAAA;AAEpC,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EAC5C,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,KAAA,EAAQ,GAAA,CAAc,SAAQ,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC7E;AACF;AAMA,eAAsB,kBAAA,GAA4C;AAChE,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,MAAM,OAAO,4BAAmB,CAAA;AAEzD,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,EAAa;AACnB,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EAC5C,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,EAAE,KAAA,EAAQ,GAAA,CAAc,SAAQ,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC7E;AACF;AAMA,SAAS,WAAA,GAAsB;AAC7B,EAAA,OAAO,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,OAAA,CAAA;AA+BT;AAEA,SAAS,SAAA,CAAU,OAAe,OAAA,EAAyB;AACzD,EAAA,OAAO,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,QAAA,EAyBC,KAAK,CAAA;AAAA,OAAA,EACN,OAAO,CAAA;AAAA;AAAA;AAAA,OAAA,CAAA;AAIhB;AAMA,eAAsB,aAAA,CACpB,KACA,KAAA,EACuB;AACvB,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,QAAA;AACH,MAAA,OAAO,YAAA,EAAa;AAAA,IACtB,KAAK,YAAA;AACH,MAAA,OAAO,eAAA,EAAgB;AAAA,IACzB,KAAK,eAAA;AACH,MAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,IAC/B,KAAK,aAAA;AACH,MAAA,OAAO,gBAAA,EAAiB;AAAA,IAC1B,KAAK,aAAA;AACH,MAAA,OAAO,iBAAiB,GAAG,CAAA;AAAA,IAC7B,KAAK,eAAA;AACH,MAAA,OAAO,sBAAA,EAAuB;AAAA,IAChC,KAAK,UAAA;AACH,MAAA,OAAO,oBAAoB,GAAG,CAAA;AAAA,IAChC,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,EAAW;AAAA,IACpB,KAAK,SAAA;AACH,MAAA,OAAO,cAAc,GAAG,CAAA;AAAA,IAC1B,KAAK,WAAA;AACH,MAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA,IAC5B,KAAK,eAAA;AACH,MAAA,OAAO,kBAAA,EAAmB;AAAA,IAC5B;AACE,MAAA,OAAO,YAAA,CAAa,KAAK,EAAE,KAAA,EAAO,aAAY,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA;AAEtE","file":"index.mjs","sourcesContent":["'use client'\n\n/**\n * Uptrade Setup Wizard\n * \n * Visual setup wizard that runs at /_uptrade/setup during development.\n * Guides developers through:\n * 1. Authentication with Uptrade Portal\n * 2. Organization & Project selection\n * 3. Codebase scanning for existing forms, widgets, metadata\n * 4. Migration of detected items to Site-Kit\n * 5. Configuration generation\n * 6. Self-destruction (removal of setup code)\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\n\n// ============================================\n// Types\n// ============================================\n\ntype Step = 'welcome' | 'auth' | 'project' | 'scan' | 'migrate' | 'configure' | 'complete'\n\ninterface ScanResults {\n forms: DetectedItem[]\n widgets: DetectedItem[]\n metadata: DetectedItem[]\n}\n\ninterface DetectedItem {\n type: string\n file: string\n line: number\n details: Record<string, unknown>\n selected: boolean\n}\n\ninterface Project {\n id: string\n name: string\n domain: string\n}\n\ninterface Organization {\n id: string\n name: string\n projects: Project[]\n}\n\ninterface SetupWizardProps {\n config?: {\n url?: string\n anonKey?: string\n portalApiUrl?: string\n }\n}\n\n// ============================================\n// Setup Wizard Component\n// ============================================\n\nexport function SetupWizard({ config }: SetupWizardProps = {}) {\n const [step, setStep] = useState<Step>('welcome')\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n \n // Auth state\n const [isAuthenticated, setIsAuthenticated] = useState(false)\n const [userEmail, setUserEmail] = useState<string | null>(null)\n const [accessToken, setAccessToken] = useState<string | null>(null)\n \n // Organization & Project state\n const [organizations, setOrganizations] = useState<Organization[]>([])\n const [selectedOrg, setSelectedOrg] = useState<Organization | null>(null)\n const [selectedProject, setSelectedProject] = useState<Project | null>(null)\n const [newProjectName, setNewProjectName] = useState('')\n const [newProjectDomain, setNewProjectDomain] = useState('')\n \n // Scan results\n const [scanResults, setScanResults] = useState<ScanResults | null>(null)\n \n // Migration progress\n const [migrationProgress, setMigrationProgress] = useState(0)\n const [migrationLog, setMigrationLog] = useState<string[]>([])\n\n // API URL helpers\n const portalApiUrl = config?.portalApiUrl || 'http://localhost:3002'\n \n // Helper to make Portal API calls\n const callPortalApi = useCallback(async (path: string, options: RequestInit = {}) => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string> || {}),\n }\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`\n }\n return fetch(`${portalApiUrl}${path}`, {\n ...options,\n headers,\n })\n }, [portalApiUrl, accessToken])\n\n // Check if already configured\n useEffect(() => {\n checkExistingConfig()\n }, [])\n\n async function checkExistingConfig() {\n try {\n // Check local status first\n const localRes = await fetch('/_uptrade/api/status')\n const localData = await localRes.json()\n if (localData.configured) {\n setStep('complete')\n return\n }\n \n // Check if we have a token in localStorage\n const storedToken = localStorage.getItem('uptrade_access_token')\n if (storedToken) {\n setAccessToken(storedToken)\n // Validate with Portal API\n const res = await fetch(`${portalApiUrl}/setup/session`, {\n headers: { 'Authorization': `Bearer ${storedToken}` }\n })\n const data = await res.json()\n if (data.authenticated) {\n setIsAuthenticated(true)\n setUserEmail(data.email)\n setStep('project')\n }\n }\n } catch {\n // Not configured yet\n }\n }\n\n // ============================================\n // Step: Welcome\n // ============================================\n\n function WelcomeStep() {\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <div className=\"text-6xl mb-4\">🚀</div>\n <h1 className=\"text-3xl font-bold mb-2\">Welcome to Uptrade Site-Kit</h1>\n <p className=\"text-gray-400 text-lg\">\n Let's set up your project in just a few steps\n </p>\n </div>\n\n <div className=\"grid grid-cols-3 gap-4 my-8\">\n <FeatureCard\n icon=\"📊\"\n title=\"Analytics\"\n description=\"Track page views, events, and user sessions\"\n />\n <FeatureCard\n icon=\"📝\"\n title=\"Forms\"\n description=\"Managed forms with validation and submissions\"\n />\n <FeatureCard\n icon=\"💬\"\n title=\"Engage\"\n description=\"Popups, nudges, and live chat widgets\"\n />\n </div>\n\n <div className=\"flex justify-center\">\n <Button onClick={() => setStep('auth')}>\n Get Started →\n </Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // Step: Authentication\n // ============================================\n\n function AuthStep() {\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [authMode, setAuthMode] = useState<'login' | 'magic'>('login')\n\n async function handleLogin() {\n if (!email.trim() || !password.trim()) return\n setIsLoading(true)\n setError(null)\n try {\n // Sign in via Supabase Auth directly using Uptrade's Supabase\n const supabaseUrl = config?.url || 'https://mwcjtnoqxolplwpkxnfe.supabase.co'\n const supabaseKey = config?.anonKey || ''\n \n const authRes = await fetch(`${supabaseUrl}/auth/v1/token?grant_type=password`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'apikey': supabaseKey,\n },\n body: JSON.stringify({ email, password })\n })\n \n if (!authRes.ok) {\n const errData = await authRes.json()\n throw new Error(errData.error_description || errData.msg || 'Login failed')\n }\n \n const authData = await authRes.json()\n const token = authData.access_token\n \n // Store token\n localStorage.setItem('uptrade_access_token', token)\n setAccessToken(token)\n \n // Validate with Portal API and get user info\n const sessionRes = await fetch(`${portalApiUrl}/setup/session`, {\n headers: { 'Authorization': `Bearer ${token}` }\n })\n const session = await sessionRes.json()\n \n if (session.authenticated) {\n setIsAuthenticated(true)\n setUserEmail(session.email)\n await loadOrganizations(token)\n setStep('project')\n } else {\n throw new Error('Authentication failed - user not found in Portal')\n }\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setIsLoading(false)\n }\n }\n\n async function handleMagicLink() {\n if (!email.trim()) return\n setIsLoading(true)\n setError(null)\n try {\n const supabaseUrl = config?.url || 'https://mwcjtnoqxolplwpkxnfe.supabase.co'\n const supabaseKey = config?.anonKey || ''\n \n // Request magic link\n const res = await fetch(`${supabaseUrl}/auth/v1/magiclink`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'apikey': supabaseKey,\n },\n body: JSON.stringify({ \n email,\n options: {\n redirectTo: window.location.href\n }\n })\n })\n \n if (!res.ok) throw new Error('Failed to send magic link')\n \n setError(null)\n alert('Check your email for a login link!')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setIsLoading(false)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Connect to Uptrade</h2>\n <p className=\"text-gray-400\">\n Sign in with your Uptrade Portal account\n </p>\n </div>\n\n <div className=\"flex gap-4 justify-center mb-6\">\n <button\n className={`px-4 py-2 rounded-lg ${authMode === 'login' ? 'bg-blue-600' : 'bg-gray-700'}`}\n onClick={() => setAuthMode('login')}\n >\n Email & Password\n </button>\n <button\n className={`px-4 py-2 rounded-lg ${authMode === 'magic' ? 'bg-blue-600' : 'bg-gray-700'}`}\n onClick={() => setAuthMode('magic')}\n >\n Magic Link\n </button>\n </div>\n\n <div className=\"max-w-md mx-auto space-y-4\">\n <div>\n <label className=\"block text-sm text-gray-400 mb-2\">Email</label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg focus:outline-none focus:border-blue-500\"\n />\n </div>\n\n {authMode === 'login' && (\n <div>\n <label className=\"block text-sm text-gray-400 mb-2\">Password</label>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"••••••••\"\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg focus:outline-none focus:border-blue-500\"\n />\n </div>\n )}\n\n <Button \n onClick={authMode === 'login' ? handleLogin : handleMagicLink} \n loading={isLoading} \n disabled={!email.trim() || (authMode === 'login' && !password.trim())}\n >\n {authMode === 'login' ? 'Sign In →' : 'Send Magic Link →'}\n </Button>\n\n <p className=\"text-gray-500 text-sm text-center\">\n Don't have an account?{' '}\n <a \n href=\"https://portal.uptrademedia.com/signup\" \n target=\"_blank\"\n className=\"text-blue-400 hover:underline\"\n >\n Sign up at Portal\n </a>\n </p>\n </div>\n\n {error && (\n <div className=\"bg-red-500/10 border border-red-500/30 text-red-400 px-4 py-3 rounded-lg text-center\">\n {error}\n </div>\n )}\n </div>\n )\n }\n\n // ============================================\n // Step: Project Selection\n // ============================================\n\n async function loadOrganizations(token?: string) {\n try {\n const authToken = token || accessToken\n const res = await fetch(`${portalApiUrl}/setup/organizations`, {\n headers: authToken ? { 'Authorization': `Bearer ${authToken}` } : {}\n })\n const data = await res.json()\n setOrganizations(Array.isArray(data) ? data : [])\n } catch (err) {\n setError('Failed to load organizations')\n }\n }\n\n function ProjectStep() {\n const [createNew, setCreateNew] = useState(false)\n const [creating, setCreating] = useState(false)\n const [creatingOrg, setCreatingOrg] = useState(false)\n const [newOrgName, setNewOrgName] = useState('')\n\n async function handleCreateOrg() {\n if (!newOrgName.trim()) return\n setCreatingOrg(true)\n try {\n const res = await fetch(`${portalApiUrl}/setup/organizations`, {\n method: 'POST',\n headers: { \n 'Content-Type': 'application/json',\n ...(accessToken ? { 'Authorization': `Bearer ${accessToken}` } : {})\n },\n body: JSON.stringify({\n name: newOrgName,\n domain: window.location.hostname\n })\n })\n \n if (!res.ok) throw new Error('Failed to create organization')\n \n const org = await res.json()\n // Reload organizations\n await loadOrganizations()\n setSelectedOrg({ ...org, projects: [] })\n setNewOrgName('')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setCreatingOrg(false)\n }\n }\n\n async function handleCreateProject() {\n if (!selectedOrg || !newProjectName.trim()) return\n setCreating(true)\n try {\n const res = await fetch(`${portalApiUrl}/setup/projects`, {\n method: 'POST',\n headers: { \n 'Content-Type': 'application/json',\n ...(accessToken ? { 'Authorization': `Bearer ${accessToken}` } : {})\n },\n body: JSON.stringify({\n orgId: selectedOrg.id,\n name: newProjectName,\n domain: newProjectDomain || window.location.hostname\n })\n })\n \n if (!res.ok) throw new Error('Failed to create project')\n \n const project = await res.json()\n setSelectedProject(project)\n setStep('scan')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setCreating(false)\n }\n }\n\n async function handleSelectProject(project: Project) {\n setSelectedProject(project)\n setStep('scan')\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Select Your Project</h2>\n <p className=\"text-gray-400\">\n Choose an existing project or create a new one\n </p>\n </div>\n\n {/* Organization selector */}\n <div className=\"max-w-lg mx-auto\">\n <label className=\"block text-sm text-gray-400 mb-2\">Organization</label>\n <select\n value={selectedOrg?.id || ''}\n onChange={(e) => setSelectedOrg(organizations.find(o => o.id === e.target.value) || null)}\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg\"\n >\n <option value=\"\">Select organization...</option>\n {organizations.map(org => (\n <option key={org.id} value={org.id}>{org.name}</option>\n ))}\n </select>\n </div>\n\n {/* Project list */}\n {selectedOrg && (\n <div className=\"max-w-lg mx-auto space-y-4\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm text-gray-400\">Projects</label>\n <button\n className=\"text-sm text-blue-400 hover:underline\"\n onClick={() => setCreateNew(!createNew)}\n >\n {createNew ? 'Select existing' : '+ Create new'}\n </button>\n </div>\n\n {createNew ? (\n <div className=\"space-y-4 p-4 bg-gray-800/50 rounded-lg border border-gray-700\">\n <input\n type=\"text\"\n value={newProjectName}\n onChange={(e) => setNewProjectName(e.target.value)}\n placeholder=\"Project name\"\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg\"\n />\n <input\n type=\"text\"\n value={newProjectDomain}\n onChange={(e) => setNewProjectDomain(e.target.value)}\n placeholder={window.location.hostname}\n className=\"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg\"\n />\n <Button \n onClick={handleCreateProject} \n loading={creating}\n disabled={!newProjectName.trim()}\n >\n Create Project\n </Button>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {selectedOrg.projects.length === 0 ? (\n <p className=\"text-gray-500 text-center py-8\">\n No projects yet.{' '}\n <button \n className=\"text-blue-400 hover:underline\"\n onClick={() => setCreateNew(true)}\n >\n Create one\n </button>\n </p>\n ) : (\n selectedOrg.projects.map(project => (\n <button\n key={project.id}\n onClick={() => handleSelectProject(project)}\n className=\"w-full text-left px-4 py-3 bg-gray-800/50 hover:bg-gray-800 border border-gray-700 rounded-lg transition-colors\"\n >\n <div className=\"font-medium\">{project.name}</div>\n <div className=\"text-sm text-gray-400\">{project.domain}</div>\n </button>\n ))\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n }\n\n // ============================================\n // Step: Scan Codebase\n // ============================================\n\n const handleScan = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const res = await fetch('/_uptrade/api/scan', { method: 'POST' })\n const data = await res.json()\n setScanResults({\n forms: data.forms.map((f: DetectedItem) => ({ ...f, selected: true })),\n widgets: data.widgets.map((w: DetectedItem) => ({ ...w, selected: true })),\n metadata: data.metadata.map((m: DetectedItem) => ({ ...m, selected: false }))\n })\n setStep('migrate')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setIsLoading(false)\n }\n }, [])\n\n function ScanStep() {\n useEffect(() => {\n handleScan()\n }, [])\n\n return (\n <div className=\"space-y-6 text-center\">\n <div className=\"text-6xl animate-pulse\">🔍</div>\n <h2 className=\"text-2xl font-bold\">Scanning Your Codebase</h2>\n <p className=\"text-gray-400\">\n Looking for forms, widgets, and metadata to migrate...\n </p>\n <div className=\"flex justify-center\">\n <div className=\"w-8 h-8 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n </div>\n </div>\n )\n }\n\n // ============================================\n // Step: Migration Preview\n // ============================================\n\n function MigrateStep() {\n if (!scanResults) return null\n\n const totalItems = [\n ...scanResults.forms,\n ...scanResults.widgets,\n ...scanResults.metadata\n ]\n const selectedItems = totalItems.filter(i => i.selected)\n\n function toggleItem(type: 'forms' | 'widgets' | 'metadata', index: number) {\n setScanResults(prev => {\n if (!prev) return prev\n const updated = { ...prev }\n updated[type] = [...prev[type]]\n updated[type][index] = { ...updated[type][index], selected: !updated[type][index].selected }\n return updated\n })\n }\n\n async function handleMigrate() {\n setIsLoading(true)\n setMigrationLog([])\n setMigrationProgress(0)\n\n const items = selectedItems\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n setMigrationLog(prev => [...prev, `Migrating ${item.type} in ${item.file}...`])\n \n try {\n await fetch('/_uptrade/api/migrate', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ item, projectId: selectedProject?.id })\n })\n setMigrationLog(prev => [...prev, `✓ Migrated ${item.type}`])\n } catch {\n setMigrationLog(prev => [...prev, `✗ Failed to migrate ${item.type}`])\n }\n \n setMigrationProgress(Math.round(((i + 1) / items.length) * 100))\n }\n\n setIsLoading(false)\n setStep('configure')\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Review & Migrate</h2>\n <p className=\"text-gray-400\">\n Select what you'd like to migrate to Site-Kit\n </p>\n </div>\n\n {/* Forms section */}\n {scanResults.forms.length > 0 && (\n <Section title=\"📝 Forms\" count={scanResults.forms.filter(f => f.selected).length}>\n {scanResults.forms.map((form, i) => (\n <ItemRow\n key={i}\n item={form}\n onToggle={() => toggleItem('forms', i)}\n />\n ))}\n </Section>\n )}\n\n {/* Widgets section */}\n {scanResults.widgets.length > 0 && (\n <Section title=\"💬 Chat Widgets\" count={scanResults.widgets.filter(w => w.selected).length}>\n {scanResults.widgets.map((widget, i) => (\n <ItemRow\n key={i}\n item={widget}\n onToggle={() => toggleItem('widgets', i)}\n />\n ))}\n </Section>\n )}\n\n {/* Metadata section */}\n {scanResults.metadata.length > 0 && (\n <Section title=\"🏷️ Metadata\" count={scanResults.metadata.filter(m => m.selected).length}>\n {scanResults.metadata.map((meta, i) => (\n <ItemRow\n key={i}\n item={meta}\n onToggle={() => toggleItem('metadata', i)}\n />\n ))}\n </Section>\n )}\n\n {/* No items found */}\n {totalItems.length === 0 && (\n <div className=\"text-center py-8 text-gray-400\">\n <div className=\"text-4xl mb-4\">✨</div>\n <p>No existing forms or widgets detected.</p>\n <p className=\"text-sm\">You're starting fresh!</p>\n </div>\n )}\n\n {/* Migration log */}\n {migrationLog.length > 0 && (\n <div className=\"bg-gray-900 rounded-lg p-4 font-mono text-sm max-h-48 overflow-y-auto\">\n {migrationLog.map((log, i) => (\n <div key={i} className={log.startsWith('✗') ? 'text-red-400' : 'text-green-400'}>\n {log}\n </div>\n ))}\n </div>\n )}\n\n {/* Progress bar */}\n {isLoading && (\n <div className=\"h-2 bg-gray-700 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-blue-500 transition-all duration-300\"\n style={{ width: `${migrationProgress}%` }}\n />\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex justify-center gap-4\">\n <Button variant=\"secondary\" onClick={() => setStep('configure')}>\n Skip Migration\n </Button>\n <Button onClick={handleMigrate} loading={isLoading}>\n Migrate {selectedItems.length} Items →\n </Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // Step: Configure\n // ============================================\n\n function ConfigureStep() {\n const [configuring, setConfiguring] = useState(false)\n\n async function handleConfigure() {\n setConfiguring(true)\n try {\n await fetch('/_uptrade/api/configure', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ projectId: selectedProject?.id })\n })\n setStep('complete')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setConfiguring(false)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold mb-2\">Configure Site-Kit</h2>\n <p className=\"text-gray-400\">\n We'll add the SiteKitProvider to your layout and set up environment variables\n </p>\n </div>\n\n <div className=\"max-w-lg mx-auto space-y-4\">\n <ConfigPreview\n title=\"Environment Variables\"\n description=\".env.local\"\n content={`NEXT_PUBLIC_UPTRADE_PROJECT_ID=${selectedProject?.id || 'xxx'}\nNEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co\nNEXT_PUBLIC_SUPABASE_ANON_KEY=xxx\nUPTRADE_API_KEY=ut_xxx`}\n />\n\n <ConfigPreview\n title=\"Layout Provider\"\n description=\"app/layout.tsx\"\n content={`<SiteKitProvider\n projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}\n supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}\n>\n {children}\n</SiteKitProvider>`}\n />\n </div>\n\n <div className=\"flex justify-center\">\n <Button onClick={handleConfigure} loading={configuring}>\n Apply Configuration →\n </Button>\n </div>\n </div>\n )\n }\n\n // ============================================\n // Step: Complete\n // ============================================\n\n function CompleteStep() {\n const [removing, setRemoving] = useState(false)\n\n async function handleRemoveSetup() {\n setRemoving(true)\n try {\n await fetch('/_uptrade/api/self-destruct', { method: 'POST' })\n window.location.href = '/'\n } catch (err) {\n setError((err as Error).message)\n setRemoving(false)\n }\n }\n\n return (\n <div className=\"space-y-6 text-center\">\n <div className=\"text-6xl\">🎉</div>\n <h2 className=\"text-3xl font-bold\">You're All Set!</h2>\n <p className=\"text-gray-400 text-lg\">\n Site-Kit is now configured and ready to use\n </p>\n\n <div className=\"grid grid-cols-2 gap-4 max-w-lg mx-auto my-8\">\n <QuickLink\n icon=\"📊\"\n title=\"View Dashboard\"\n href=\"https://portal.uptrademedia.com/dashboard\"\n />\n <QuickLink\n icon=\"📝\"\n title=\"Create Form\"\n href=\"https://portal.uptrademedia.com/forms/new\"\n />\n <QuickLink\n icon=\"📖\"\n title=\"Documentation\"\n href=\"https://docs.uptrademedia.com/site-kit\"\n />\n <QuickLink\n icon=\"💬\"\n title=\"Get Help\"\n href=\"https://portal.uptrademedia.com/support\"\n />\n </div>\n\n <div className=\"pt-8 border-t border-gray-700\">\n <p className=\"text-gray-400 mb-4\">\n Remove this setup wizard from your project?\n </p>\n <Button variant=\"danger\" onClick={handleRemoveSetup} loading={removing}>\n Remove Setup Wizard\n </Button>\n <p className=\"text-gray-500 text-sm mt-2\">\n This will delete the /_uptrade route\n </p>\n </div>\n </div>\n )\n }\n\n // ============================================\n // Render\n // ============================================\n\n const steps: Record<Step, React.ComponentType> = {\n welcome: WelcomeStep,\n auth: AuthStep,\n project: ProjectStep,\n scan: ScanStep,\n migrate: MigrateStep,\n configure: ConfigureStep,\n complete: CompleteStep,\n }\n\n const CurrentStep = steps[step]\n\n return (\n <div className=\"min-h-screen bg-gradient-to-br from-gray-900 via-gray-900 to-gray-800 text-white\">\n {/* Progress bar */}\n <div className=\"fixed top-0 left-0 right-0 h-1 bg-gray-800\">\n <div\n className=\"h-full bg-gradient-to-r from-blue-500 to-purple-500 transition-all duration-500\"\n style={{ width: `${(Object.keys(steps).indexOf(step) / (Object.keys(steps).length - 1)) * 100}%` }}\n />\n </div>\n\n {/* Header */}\n <header className=\"px-8 py-6 flex justify-between items-center\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-8 h-8 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg\" />\n <span className=\"font-semibold\">Uptrade Site-Kit</span>\n </div>\n {userEmail && (\n <div className=\"text-gray-400 text-sm\">\n {userEmail}\n </div>\n )}\n </header>\n\n {/* Main content */}\n <main className=\"max-w-3xl mx-auto px-8 py-16\">\n <CurrentStep />\n </main>\n\n {/* Footer */}\n <footer className=\"fixed bottom-0 left-0 right-0 px-8 py-4 text-center text-gray-500 text-sm\">\n <a href=\"https://uptrademedia.com\" target=\"_blank\" className=\"hover:text-gray-300\">\n Uptrade Media\n </a>\n {' · '}\n <a href=\"https://docs.uptrademedia.com\" target=\"_blank\" className=\"hover:text-gray-300\">\n Docs\n </a>\n {' · '}\n <a href=\"https://github.com/uptrademedia/site-kit\" target=\"_blank\" className=\"hover:text-gray-300\">\n GitHub\n </a>\n </footer>\n </div>\n )\n}\n\n// ============================================\n// UI Components\n// ============================================\n\nfunction Button({\n children,\n onClick,\n loading,\n disabled,\n variant = 'primary'\n}: {\n children: React.ReactNode\n onClick?: () => void\n loading?: boolean\n disabled?: boolean\n variant?: 'primary' | 'secondary' | 'danger'\n}) {\n const variants = {\n primary: 'bg-gradient-to-r from-blue-500 to-blue-600 hover:from-blue-600 hover:to-blue-700',\n secondary: 'bg-gray-700 hover:bg-gray-600',\n danger: 'bg-red-600/20 border border-red-500/30 text-red-400 hover:bg-red-600/30'\n }\n\n return (\n <button\n onClick={onClick}\n disabled={loading || disabled}\n className={`px-6 py-3 rounded-lg font-medium transition-all disabled:opacity-50 disabled:cursor-not-allowed ${variants[variant]}`}\n >\n {loading ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"w-4 h-4 border-2 border-current border-t-transparent rounded-full animate-spin\" />\n Loading...\n </span>\n ) : children}\n </button>\n )\n}\n\nfunction FeatureCard({ icon, title, description }: { icon: string; title: string; description: string }) {\n return (\n <div className=\"p-6 bg-gray-800/50 rounded-xl border border-gray-700 text-center\">\n <div className=\"text-3xl mb-3\">{icon}</div>\n <h3 className=\"font-semibold mb-1\">{title}</h3>\n <p className=\"text-sm text-gray-400\">{description}</p>\n </div>\n )\n}\n\nfunction Section({ title, count, children }: { title: string; count: number; children: React.ReactNode }) {\n return (\n <div className=\"bg-gray-800/30 rounded-xl border border-gray-700 overflow-hidden\">\n <div className=\"px-4 py-3 bg-gray-800/50 flex justify-between items-center\">\n <span className=\"font-medium\">{title}</span>\n <span className=\"text-sm text-gray-400\">{count} selected</span>\n </div>\n <div className=\"divide-y divide-gray-700\">\n {children}\n </div>\n </div>\n )\n}\n\nfunction ItemRow({ item, onToggle }: { item: DetectedItem; onToggle: () => void }) {\n return (\n <div className=\"flex items-center gap-4 px-4 py-3 hover:bg-gray-800/30 transition-colors\">\n <input\n type=\"checkbox\"\n checked={item.selected}\n onChange={onToggle}\n className=\"w-5 h-5 rounded border-gray-600 bg-gray-700 text-blue-500 focus:ring-blue-500\"\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium truncate\">{item.type}</div>\n <div className=\"text-sm text-gray-400 truncate\">{item.file}:{item.line}</div>\n </div>\n </div>\n )\n}\n\nfunction ConfigPreview({ title, description, content }: { title: string; description: string; content: string }) {\n return (\n <div className=\"bg-gray-800/50 rounded-lg border border-gray-700 overflow-hidden\">\n <div className=\"px-4 py-2 bg-gray-800 flex justify-between items-center\">\n <span className=\"font-medium\">{title}</span>\n <span className=\"text-sm text-gray-400\">{description}</span>\n </div>\n <pre className=\"p-4 text-sm overflow-x-auto\">\n <code className=\"text-green-400\">{content}</code>\n </pre>\n </div>\n )\n}\n\nfunction QuickLink({ icon, title, href }: { icon: string; title: string; href: string }) {\n return (\n <a\n href={href}\n target=\"_blank\"\n className=\"flex items-center gap-3 p-4 bg-gray-800/50 rounded-lg border border-gray-700 hover:bg-gray-800 transition-colors\"\n >\n <span className=\"text-2xl\">{icon}</span>\n <span className=\"font-medium\">{title}</span>\n </a>\n )\n}\n\nexport default SetupWizard\n","/**\n * Setup Wizard API Handlers\n * \n * These are Next.js API route handlers that the SetupWizard component calls.\n * They run on the server and have access to fs for code generation.\n * \n * Usage: Copy these to your app/_uptrade/api/ folder\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\n\n// ============================================\n// Configuration\n// ============================================\n\nconst PORTAL_URL = process.env.UPTRADE_PORTAL_URL || 'https://portal.uptrademedia.com'\nconst API_URL = process.env.UPTRADE_API_URL || 'https://api.uptrademedia.com'\n\n// In-memory session store (for dev server only)\nlet authSession: {\n accessToken?: string\n userId?: string\n email?: string\n pendingCode?: string\n} = {}\n\n// ============================================\n// Status Handler\n// ============================================\n\nexport async function handleStatus(): Promise<NextResponse> {\n const configured = !!(\n process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID &&\n process.env.NEXT_PUBLIC_SUPABASE_URL\n )\n\n return NextResponse.json({\n configured,\n authenticated: !!authSession.accessToken,\n email: authSession.email\n })\n}\n\n// ============================================\n// Auth Handlers\n// ============================================\n\nexport async function handleAuthStart(): Promise<NextResponse> {\n const state = Math.random().toString(36).substring(7)\n const redirectUri = 'http://localhost:3000/_uptrade/api/auth/callback'\n \n const authUrl = `${PORTAL_URL}/auth/cli?` + new URLSearchParams({\n redirect_uri: redirectUri,\n state\n })\n\n return NextResponse.json({ authUrl, state })\n}\n\nexport async function handleAuthCallback(req: NextRequest): Promise<NextResponse> {\n const { searchParams } = new URL(req.url)\n const code = searchParams.get('code')\n const error = searchParams.get('error')\n\n if (error) {\n return new NextResponse(errorHtml('Authentication Failed', error), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n\n if (!code) {\n return new NextResponse(errorHtml('Missing Code', 'No authorization code received'), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n\n try {\n // Exchange code for token\n const tokenResponse = await fetch(`${API_URL}/auth/cli-token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n code,\n redirect_uri: 'http://localhost:3000/_uptrade/api/auth/callback'\n })\n })\n\n if (!tokenResponse.ok) {\n throw new Error('Failed to exchange code for token')\n }\n\n const { access_token, user_id, email } = await tokenResponse.json()\n \n authSession = {\n accessToken: access_token,\n userId: user_id,\n email\n }\n\n return new NextResponse(successHtml(), {\n headers: { 'Content-Type': 'text/html' }\n })\n } catch (err) {\n return new NextResponse(errorHtml('Token Exchange Failed', (err as Error).message), {\n headers: { 'Content-Type': 'text/html' }\n })\n }\n}\n\nexport async function handleAuthStatus(): Promise<NextResponse> {\n return NextResponse.json({\n authenticated: !!authSession.accessToken,\n email: authSession.email\n })\n}\n\nexport async function handleApiKeyAuth(req: NextRequest): Promise<NextResponse> {\n const { apiKey } = await req.json()\n\n try {\n const response = await fetch(`${API_URL}/auth/verify-api-key`, {\n headers: { 'Authorization': `Bearer ${apiKey}` }\n })\n\n if (!response.ok) {\n return NextResponse.json({ error: 'Invalid API key' }, { status: 401 })\n }\n\n const { user_id, email } = await response.json()\n \n authSession = {\n accessToken: apiKey,\n userId: user_id,\n email\n }\n\n return NextResponse.json({ email })\n } catch {\n return NextResponse.json({ error: 'Authentication failed' }, { status: 500 })\n }\n}\n\n// ============================================\n// Organization & Project Handlers\n// ============================================\n\nexport async function handleGetOrganizations(): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n try {\n const response = await fetch(`${API_URL}/organizations`, {\n headers: { 'Authorization': `Bearer ${authSession.accessToken}` }\n })\n\n if (!response.ok) {\n throw new Error('Failed to fetch organizations')\n }\n\n const organizations = await response.json()\n return NextResponse.json({ organizations })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\nexport async function handleCreateProject(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { orgId, name, domain } = await req.json()\n\n try {\n const response = await fetch(`${API_URL}/organizations/${orgId}/projects`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authSession.accessToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ name, domain })\n })\n\n if (!response.ok) {\n throw new Error('Failed to create project')\n }\n\n const project = await response.json()\n return NextResponse.json(project)\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Scan Handler\n// ============================================\n\nexport async function handleScan(): Promise<NextResponse> {\n const { scanCodebase } = await import('../cli/scanner')\n \n try {\n const results = await scanCodebase(process.cwd())\n \n return NextResponse.json({\n forms: results.forms.map(f => ({\n type: f.type,\n file: f.file,\n line: f.line,\n details: {\n fields: f.fields\n }\n })),\n widgets: results.widgets.map(w => ({\n type: w.type,\n file: w.file,\n line: w.line,\n details: {}\n })),\n metadata: results.metadata.map(m => ({\n type: m.type,\n file: m.file,\n line: m.line,\n details: {}\n }))\n })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Migrate Handler\n// ============================================\n\nexport async function handleMigrate(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { item, projectId } = await req.json()\n const { migrateFiles } = await import('../cli/migrator')\n\n try {\n await migrateFiles([item], projectId, authSession.accessToken)\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Configure Handler\n// ============================================\n\nexport async function handleConfigure(req: NextRequest): Promise<NextResponse> {\n if (!authSession.accessToken) {\n return NextResponse.json({ error: 'Not authenticated' }, { status: 401 })\n }\n\n const { projectId } = await req.json()\n const { generateEnvFile, generateProvider } = await import('../cli/generators')\n\n try {\n // Get Supabase config from API\n const configResponse = await fetch(`${API_URL}/projects/${projectId}/config`, {\n headers: { 'Authorization': `Bearer ${authSession.accessToken}` }\n })\n\n if (!configResponse.ok) {\n throw new Error('Failed to fetch project config')\n }\n\n const config = await configResponse.json()\n\n // Generate API key\n const keyResponse = await fetch(`${API_URL}/projects/${projectId}/api-keys`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authSession.accessToken}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ name: 'Site-Kit Setup' })\n })\n\n const { api_key } = keyResponse.ok ? await keyResponse.json() : { api_key: 'ut_xxx' }\n\n // Generate env file\n await generateEnvFile({\n projectId,\n supabaseUrl: config.supabase_url,\n supabaseAnonKey: config.supabase_anon_key,\n apiKey: api_key\n })\n\n // Generate provider in layout\n await generateProvider({ projectId })\n\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// Self-Destruct Handler\n// ============================================\n\nexport async function handleSelfDestruct(): Promise<NextResponse> {\n const { selfDestruct } = await import('../cli/generators')\n\n try {\n await selfDestruct()\n return NextResponse.json({ success: true })\n } catch (err) {\n return NextResponse.json({ error: (err as Error).message }, { status: 500 })\n }\n}\n\n// ============================================\n// HTML Templates\n// ============================================\n\nfunction successHtml(): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Uptrade - Authenticated</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center;\n height: 100vh; margin: 0;\n background: linear-gradient(135deg, #1a1a2e 0%, #0f0f1a 100%);\n color: white;\n }\n .container {\n text-align: center; padding: 3rem;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 1rem; border: 1px solid rgba(255, 255, 255, 0.1);\n }\n .icon { font-size: 4rem; margin-bottom: 1rem; }\n h1 { margin: 0 0 0.5rem; }\n p { color: rgba(255, 255, 255, 0.7); margin: 0; }\n </style>\n <script>setTimeout(() => window.close(), 2000)</script>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✓</div>\n <h1>Authenticated!</h1>\n <p>This window will close automatically...</p>\n </div>\n</body>\n</html>`\n}\n\nfunction errorHtml(title: string, message: string): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Uptrade - Error</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center;\n height: 100vh; margin: 0;\n background: linear-gradient(135deg, #2e1a1a 0%, #1a0f0f 100%);\n color: white;\n }\n .container {\n text-align: center; padding: 3rem;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 1rem; border: 1px solid rgba(255, 100, 100, 0.2);\n }\n .icon { font-size: 4rem; margin-bottom: 1rem; }\n h1 { margin: 0 0 0.5rem; color: #ff6b6b; }\n p { color: rgba(255, 255, 255, 0.7); margin: 0; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✗</div>\n <h1>${title}</h1>\n <p>${message}</p>\n </div>\n</body>\n</html>`\n}\n\n// ============================================\n// Unified Route Handler\n// ============================================\n\nexport async function handleRequest(\n req: NextRequest,\n route: string\n): Promise<NextResponse> {\n switch (route) {\n case 'status':\n return handleStatus()\n case 'auth/start':\n return handleAuthStart()\n case 'auth/callback':\n return handleAuthCallback(req)\n case 'auth/status':\n return handleAuthStatus()\n case 'auth/apikey':\n return handleApiKeyAuth(req)\n case 'organizations':\n return handleGetOrganizations()\n case 'projects':\n return handleCreateProject(req)\n case 'scan':\n return handleScan()\n case 'migrate':\n return handleMigrate(req)\n case 'configure':\n return handleConfigure(req)\n case 'self-destruct':\n return handleSelfDestruct()\n default:\n return NextResponse.json({ error: 'Not found' }, { status: 404 })\n }\n}\n"]}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
require('../chunk-EQCVQC35.js');
|
|
6
|
+
var fs = require('fs');
|
|
7
|
+
var path = require('path');
|
|
8
|
+
|
|
9
|
+
var IGNORED_FOLDERS = [
|
|
10
|
+
"api",
|
|
11
|
+
"admin",
|
|
12
|
+
"_uptrade",
|
|
13
|
+
"%5Fuptrade",
|
|
14
|
+
// URL-encoded _uptrade
|
|
15
|
+
"uptrade-setup",
|
|
16
|
+
"offline"
|
|
17
|
+
];
|
|
18
|
+
var PAGE_FILES = ["page.tsx", "page.jsx", "page.js", "page.ts"];
|
|
19
|
+
function isExcluded(path, patterns) {
|
|
20
|
+
return patterns.some((pattern) => {
|
|
21
|
+
if (pattern.endsWith("/*")) {
|
|
22
|
+
const prefix = pattern.slice(0, -2);
|
|
23
|
+
return path.startsWith(prefix);
|
|
24
|
+
}
|
|
25
|
+
if (pattern.endsWith("*")) {
|
|
26
|
+
const prefix = pattern.slice(0, -1);
|
|
27
|
+
return path.startsWith(prefix);
|
|
28
|
+
}
|
|
29
|
+
return path === pattern;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function discoverPages(appDir, currentPath = "", pages = []) {
|
|
33
|
+
const fullPath = path.join(appDir, currentPath);
|
|
34
|
+
if (!fs.existsSync(fullPath)) {
|
|
35
|
+
return pages;
|
|
36
|
+
}
|
|
37
|
+
const entries = fs.readdirSync(fullPath);
|
|
38
|
+
const hasPage = entries.some((entry) => PAGE_FILES.includes(entry));
|
|
39
|
+
if (hasPage) {
|
|
40
|
+
let urlPath = "/" + currentPath;
|
|
41
|
+
urlPath = urlPath.replace(/\/\([^)]+\)/g, "");
|
|
42
|
+
urlPath = urlPath.replace(/\/+/g, "/");
|
|
43
|
+
if (urlPath !== "/" && urlPath.endsWith("/")) {
|
|
44
|
+
urlPath = urlPath.slice(0, -1);
|
|
45
|
+
}
|
|
46
|
+
pages.push(urlPath);
|
|
47
|
+
}
|
|
48
|
+
for (const entry of entries) {
|
|
49
|
+
const entryPath = path.join(fullPath, entry);
|
|
50
|
+
const stat = fs.statSync(entryPath);
|
|
51
|
+
if (stat.isDirectory()) {
|
|
52
|
+
const folderName = entry.toLowerCase();
|
|
53
|
+
if (IGNORED_FOLDERS.some((ignored) => folderName.includes(ignored))) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (entry.startsWith("[") && entry.endsWith("]")) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (entry.startsWith("_")) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
discoverPages(appDir, path.join(currentPath, entry), pages);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return pages;
|
|
66
|
+
}
|
|
67
|
+
function findAppDir() {
|
|
68
|
+
const cwd = process.cwd();
|
|
69
|
+
const candidates = [
|
|
70
|
+
path.join(cwd, "app"),
|
|
71
|
+
path.join(cwd, "src", "app")
|
|
72
|
+
];
|
|
73
|
+
for (const candidate of candidates) {
|
|
74
|
+
if (fs.existsSync(candidate)) {
|
|
75
|
+
return candidate;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
throw new Error(
|
|
79
|
+
'[site-kit] Could not find app directory. Ensure you have an "app" or "src/app" folder.'
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
function getPriority(path, config) {
|
|
83
|
+
if (config.priorities) {
|
|
84
|
+
for (const [pattern, priority] of Object.entries(config.priorities)) {
|
|
85
|
+
if (pattern.endsWith("/*")) {
|
|
86
|
+
const prefix = pattern.slice(0, -2);
|
|
87
|
+
if (path.startsWith(prefix)) return priority;
|
|
88
|
+
} else if (path === pattern) {
|
|
89
|
+
return priority;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (path === "/") return 1;
|
|
94
|
+
const depth = path.split("/").filter(Boolean).length;
|
|
95
|
+
if (depth === 1) return 0.8;
|
|
96
|
+
if (depth === 2) return 0.6;
|
|
97
|
+
return config.defaultPriority ?? 0.5;
|
|
98
|
+
}
|
|
99
|
+
async function syncSitemapToPortal(entries, apiUrl, apiKey) {
|
|
100
|
+
if (!apiKey) {
|
|
101
|
+
console.warn("[site-kit] No API key provided, skipping sitemap sync");
|
|
102
|
+
return { success: false, created: 0, updated: 0 };
|
|
103
|
+
}
|
|
104
|
+
const normalizedEntries = entries.map((entry) => {
|
|
105
|
+
let path;
|
|
106
|
+
try {
|
|
107
|
+
const url = new URL(entry.url);
|
|
108
|
+
path = url.pathname;
|
|
109
|
+
} catch {
|
|
110
|
+
path = entry.url.startsWith("/") ? entry.url : `/${entry.url}`;
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
path,
|
|
114
|
+
priority: entry.priority,
|
|
115
|
+
changefreq: entry.changeFrequency
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
try {
|
|
119
|
+
const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {
|
|
120
|
+
method: "POST",
|
|
121
|
+
headers: {
|
|
122
|
+
"Content-Type": "application/json",
|
|
123
|
+
"x-api-key": apiKey
|
|
124
|
+
},
|
|
125
|
+
body: JSON.stringify({ entries: normalizedEntries })
|
|
126
|
+
});
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
console.error("[site-kit] Sitemap sync failed:", response.status, await response.text());
|
|
129
|
+
return { success: false, created: 0, updated: 0 };
|
|
130
|
+
}
|
|
131
|
+
const result = await response.json();
|
|
132
|
+
return {
|
|
133
|
+
success: true,
|
|
134
|
+
created: result.created || 0,
|
|
135
|
+
updated: result.updated || 0
|
|
136
|
+
};
|
|
137
|
+
} catch (error) {
|
|
138
|
+
console.error("[site-kit] Sitemap sync error:", error);
|
|
139
|
+
return { success: false, created: 0, updated: 0 };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function createSitemap(config) {
|
|
143
|
+
return async () => {
|
|
144
|
+
const { baseUrl, exclude = [], defaultChangeFrequency = "weekly" } = config;
|
|
145
|
+
const normalizedBaseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
|
|
146
|
+
const allExclusions = [
|
|
147
|
+
"/api/*",
|
|
148
|
+
"/admin/*",
|
|
149
|
+
"/_uptrade/*",
|
|
150
|
+
"/uptrade-setup/*",
|
|
151
|
+
"/offline/*",
|
|
152
|
+
...exclude
|
|
153
|
+
];
|
|
154
|
+
let pages = [];
|
|
155
|
+
try {
|
|
156
|
+
const appDir = findAppDir();
|
|
157
|
+
pages = discoverPages(appDir);
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.warn("[site-kit] Failed to discover pages:", error);
|
|
160
|
+
pages = ["/"];
|
|
161
|
+
}
|
|
162
|
+
pages = pages.filter((page) => !isExcluded(page, allExclusions));
|
|
163
|
+
const entries = pages.map((path) => ({
|
|
164
|
+
url: `${normalizedBaseUrl}${path}`,
|
|
165
|
+
lastModified: /* @__PURE__ */ new Date(),
|
|
166
|
+
changeFrequency: defaultChangeFrequency,
|
|
167
|
+
priority: getPriority(path, config)
|
|
168
|
+
}));
|
|
169
|
+
if (config.additionalPaths) {
|
|
170
|
+
try {
|
|
171
|
+
const additional = await config.additionalPaths();
|
|
172
|
+
for (const item of additional) {
|
|
173
|
+
if (!isExcluded(item.path, allExclusions)) {
|
|
174
|
+
entries.push({
|
|
175
|
+
url: `${normalizedBaseUrl}${item.path}`,
|
|
176
|
+
lastModified: /* @__PURE__ */ new Date(),
|
|
177
|
+
changeFrequency: item.changeFrequency ?? defaultChangeFrequency,
|
|
178
|
+
priority: item.priority ?? getPriority(item.path, config)
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
} catch (error) {
|
|
183
|
+
console.warn("[site-kit] Failed to get additional paths:", error);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
entries.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
187
|
+
console.log(`[site-kit] Generated sitemap with ${entries.length} pages`);
|
|
188
|
+
if (!config.disableSync) {
|
|
189
|
+
const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.uptrademedia.com";
|
|
190
|
+
const apiKey = config.apiKey || process.env.NEXT_PUBLIC_UPTRADE_API_KEY;
|
|
191
|
+
if (apiKey) {
|
|
192
|
+
syncSitemapToPortal(entries, apiUrl, apiKey).then((result) => {
|
|
193
|
+
if (result.success) {
|
|
194
|
+
console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`);
|
|
195
|
+
}
|
|
196
|
+
}).catch((err) => {
|
|
197
|
+
console.warn("[site-kit] Failed to sync sitemap to Portal API:", err.message);
|
|
198
|
+
});
|
|
199
|
+
} else {
|
|
200
|
+
console.log("[site-kit] No API key found, skipping Portal API sync");
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return entries;
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
var sitemap_default = createSitemap;
|
|
207
|
+
|
|
208
|
+
exports.createSitemap = createSitemap;
|
|
209
|
+
exports.default = sitemap_default;
|
|
210
|
+
exports.syncSitemapToPortal = syncSitemapToPortal;
|
|
211
|
+
//# sourceMappingURL=index.js.map
|
|
212
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/sitemap/index.ts"],"names":["join","existsSync","readdirSync","statSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @uptrade/site-kit - Sitemap Generator\n * \n * Automatically generates sitemap.xml from Next.js app directory structure.\n * Works at build time to discover all pages and sync them to Portal API.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com',\n * // Optional: exclude patterns\n * exclude: ['/admin/*', '/api/*'],\n * // Optional: additional dynamic routes\n * additionalPaths: async () => [\n * { path: '/blog/post-1', priority: 0.7 },\n * ]\n * })\n * ```\n */\n\nimport { readdirSync, statSync, existsSync } from 'fs'\nimport { join, relative } from 'path'\n\nexport interface SitemapEntry {\n url: string\n lastModified?: Date | string\n changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never'\n priority?: number\n}\n\nexport interface SitemapConfig {\n /** Base URL for the site (required) */\n baseUrl: string\n /** Glob patterns to exclude (e.g., ['/admin/*', '/api/*']) */\n exclude?: string[]\n /** Default priority for pages */\n defaultPriority?: number\n /** Default change frequency */\n defaultChangeFrequency?: SitemapEntry['changeFrequency']\n /** Additional paths to include (for dynamic routes) */\n additionalPaths?: () => Promise<Array<{ path: string; priority?: number; changeFrequency?: SitemapEntry['changeFrequency'] }>>\n /** Priority overrides by path pattern */\n priorities?: Record<string, number>\n /** Portal API URL for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_URL or https://api.uptrademedia.com) */\n apiUrl?: string\n /** Portal API key for syncing (defaults to NEXT_PUBLIC_UPTRADE_API_KEY) */\n apiKey?: string\n /** Disable auto-sync to Portal API */\n disableSync?: boolean\n}\n\n// Route groups and special folders to ignore\nconst IGNORED_FOLDERS = [\n 'api',\n 'admin',\n '_uptrade',\n '%5Fuptrade', // URL-encoded _uptrade\n 'uptrade-setup',\n 'offline',\n]\n\n// File patterns that indicate a page\nconst PAGE_FILES = ['page.tsx', 'page.jsx', 'page.js', 'page.ts']\n\n/**\n * Check if a path matches any exclude pattern\n */\nfunction isExcluded(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return path.startsWith(prefix)\n }\n if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1)\n return path.startsWith(prefix)\n }\n return path === pattern\n })\n}\n\n/**\n * Recursively discover pages from the app directory\n */\nfunction discoverPages(\n appDir: string,\n currentPath: string = '',\n pages: string[] = []\n): string[] {\n const fullPath = join(appDir, currentPath)\n \n if (!existsSync(fullPath)) {\n return pages\n }\n\n const entries = readdirSync(fullPath)\n \n // Check if this directory has a page file\n const hasPage = entries.some(entry => PAGE_FILES.includes(entry))\n \n if (hasPage) {\n // Convert directory path to URL path\n let urlPath = '/' + currentPath\n \n // Handle route groups (parentheses) - remove them from URL\n urlPath = urlPath.replace(/\\/\\([^)]+\\)/g, '')\n \n // Clean up path\n urlPath = urlPath.replace(/\\/+/g, '/') // Remove double slashes\n if (urlPath !== '/' && urlPath.endsWith('/')) {\n urlPath = urlPath.slice(0, -1) // Remove trailing slash\n }\n \n pages.push(urlPath)\n }\n \n // Recurse into subdirectories\n for (const entry of entries) {\n const entryPath = join(fullPath, entry)\n const stat = statSync(entryPath)\n \n if (stat.isDirectory()) {\n // Skip ignored folders\n const folderName = entry.toLowerCase()\n if (IGNORED_FOLDERS.some(ignored => folderName.includes(ignored))) {\n continue\n }\n \n // Skip dynamic route segments for now (would need runtime data)\n if (entry.startsWith('[') && entry.endsWith(']')) {\n continue\n }\n \n // Skip private folders\n if (entry.startsWith('_')) {\n continue\n }\n \n discoverPages(appDir, join(currentPath, entry), pages)\n }\n }\n \n return pages\n}\n\n/**\n * Find the app directory from the current working directory\n */\nfunction findAppDir(): string {\n const cwd = process.cwd()\n \n // Try common locations\n const candidates = [\n join(cwd, 'app'),\n join(cwd, 'src', 'app'),\n ]\n \n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n \n throw new Error(\n '[site-kit] Could not find app directory. Ensure you have an \"app\" or \"src/app\" folder.'\n )\n}\n\n/**\n * Get priority for a path based on config\n */\nfunction getPriority(path: string, config: SitemapConfig): number {\n // Check priority overrides\n if (config.priorities) {\n for (const [pattern, priority] of Object.entries(config.priorities)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n if (path.startsWith(prefix)) return priority\n } else if (path === pattern) {\n return priority\n }\n }\n }\n \n // Home page gets highest priority\n if (path === '/') return 1.0\n \n // Shallow pages get higher priority\n const depth = path.split('/').filter(Boolean).length\n if (depth === 1) return 0.8\n if (depth === 2) return 0.6\n \n return config.defaultPriority ?? 0.5\n}\n\n/**\n * Sync sitemap entries to Portal API\n * Called automatically by createSitemap at build time\n */\nexport async function syncSitemapToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n console.warn('[site-kit] No API key provided, skipping sitemap sync')\n return { success: false, created: 0, updated: 0 }\n }\n \n const normalizedEntries = entries.map(entry => {\n let path: string\n try {\n const url = new URL(entry.url)\n path = url.pathname\n } catch {\n path = entry.url.startsWith('/') ? entry.url : `/${entry.url}`\n }\n \n return {\n path,\n priority: entry.priority,\n changefreq: entry.changeFrequency,\n }\n })\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ entries: normalizedEntries }),\n })\n \n if (!response.ok) {\n console.error('[site-kit] Sitemap sync failed:', response.status, await response.text())\n return { success: false, created: 0, updated: 0 }\n }\n \n const result = await response.json()\n \n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n console.error('[site-kit] Sitemap sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\n/**\n * Create a sitemap generator function for Next.js\n * Automatically syncs to Portal API at build time.\n * \n * @example\n * ```ts\n * // app/sitemap.ts\n * import { createSitemap } from '@uptrade/site-kit/sitemap'\n * \n * export default createSitemap({\n * baseUrl: 'https://example.com'\n * })\n * ```\n */\nexport function createSitemap(config: SitemapConfig): () => SitemapEntry[] | Promise<SitemapEntry[]> {\n return async () => {\n const { baseUrl, exclude = [], defaultChangeFrequency = 'weekly' } = config\n \n // Normalize base URL\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\n \n // Default exclusions\n const allExclusions = [\n '/api/*',\n '/admin/*',\n '/_uptrade/*',\n '/uptrade-setup/*',\n '/offline/*',\n ...exclude,\n ]\n \n // Discover pages from app directory\n let pages: string[] = []\n try {\n const appDir = findAppDir()\n pages = discoverPages(appDir)\n } catch (error) {\n console.warn('[site-kit] Failed to discover pages:', error)\n // Fall back to just the home page\n pages = ['/']\n }\n \n // Filter out excluded pages\n pages = pages.filter(page => !isExcluded(page, allExclusions))\n \n // Build sitemap entries\n const entries: SitemapEntry[] = pages.map(path => ({\n url: `${normalizedBaseUrl}${path}`,\n lastModified: new Date(),\n changeFrequency: defaultChangeFrequency,\n priority: getPriority(path, config),\n }))\n \n // Add additional dynamic paths if provided\n if (config.additionalPaths) {\n try {\n const additional = await config.additionalPaths()\n for (const item of additional) {\n if (!isExcluded(item.path, allExclusions)) {\n entries.push({\n url: `${normalizedBaseUrl}${item.path}`,\n lastModified: new Date(),\n changeFrequency: item.changeFrequency ?? defaultChangeFrequency,\n priority: item.priority ?? getPriority(item.path, config),\n })\n }\n }\n } catch (error) {\n console.warn('[site-kit] Failed to get additional paths:', error)\n }\n }\n \n // Sort by priority descending\n entries.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n \n console.log(`[site-kit] Generated sitemap with ${entries.length} pages`)\n \n // Auto-sync to Portal API at build time (unless disabled)\n if (!config.disableSync) {\n const apiUrl = config.apiUrl || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\n const apiKey = config.apiKey || process.env.NEXT_PUBLIC_UPTRADE_API_KEY\n \n if (apiKey) {\n // Fire and forget - don't block sitemap generation\n syncSitemapToPortal(entries, apiUrl, apiKey)\n .then(result => {\n if (result.success) {\n console.log(`[site-kit] Synced to Portal API: ${result.created} created, ${result.updated} updated`)\n }\n })\n .catch(err => {\n console.warn('[site-kit] Failed to sync sitemap to Portal API:', err.message)\n })\n } else {\n console.log('[site-kit] No API key found, skipping Portal API sync')\n }\n }\n \n return entries\n }\n}\n\nexport default createSitemap\n"]}
|