@uptrademedia/site-kit 1.0.4 → 1.0.7
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 +96 -25
- package/dist/analytics/index.js +7 -7
- package/dist/analytics/index.mjs +3 -3
- package/dist/api-QUIPJJCX.js +77 -0
- package/dist/api-QUIPJJCX.js.map +1 -0
- package/dist/api-V3BA5PMX.mjs +4 -0
- package/dist/api-V3BA5PMX.mjs.map +1 -0
- package/dist/blog/index.d.mts +160 -5
- package/dist/blog/index.d.ts +160 -5
- package/dist/blog/index.js +1166 -18
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs +1156 -18
- package/dist/blog/index.mjs.map +1 -1
- package/dist/blog/server.d.mts +229 -0
- package/dist/blog/server.d.ts +229 -0
- package/dist/blog/server.js +692 -0
- package/dist/blog/server.js.map +1 -0
- package/dist/blog/server.mjs +666 -0
- package/dist/blog/server.mjs.map +1 -0
- package/dist/{chunk-FKVJOT2F.mjs → chunk-42EXHJTC.mjs} +196 -7
- package/dist/chunk-42EXHJTC.mjs.map +1 -0
- package/dist/{scanner-AZV5I6US.mjs → chunk-44OMJFCG.mjs} +354 -14
- package/dist/chunk-44OMJFCG.mjs.map +1 -0
- package/dist/chunk-4TGJYNHV.js +981 -0
- package/dist/chunk-4TGJYNHV.js.map +1 -0
- package/dist/chunk-4XPGGLVP.mjs +53 -0
- package/dist/{chunk-NYKRE2FL.mjs.map → chunk-4XPGGLVP.mjs.map} +1 -1
- package/dist/{generators-TO2FKJR6.mjs → chunk-6ONUXZDO.mjs} +26 -9
- package/dist/chunk-6ONUXZDO.mjs.map +1 -0
- package/dist/chunk-CG53ASWX.mjs +729 -0
- package/dist/chunk-CG53ASWX.mjs.map +1 -0
- package/dist/{scanner-ETJAMIT7.js → chunk-DERI27QC.js} +448 -102
- package/dist/chunk-DERI27QC.js.map +1 -0
- package/dist/chunk-DYM5ML2V.mjs +1518 -0
- package/dist/chunk-DYM5ML2V.mjs.map +1 -0
- package/dist/chunk-FLZZOX44.js +1526 -0
- package/dist/chunk-FLZZOX44.js.map +1 -0
- package/dist/{chunk-7H6I3ECV.mjs → chunk-FQVGK746.mjs} +63 -3
- package/dist/chunk-FQVGK746.mjs.map +1 -0
- package/dist/{chunk-GQ6ZOU2N.mjs → chunk-JGQPAXTL.mjs} +4 -4
- package/dist/{chunk-GQ6ZOU2N.mjs.map → chunk-JGQPAXTL.mjs.map} +1 -1
- package/dist/{chunk-V3F5J6CV.js → chunk-JUEVN4Q4.js} +196 -7
- package/dist/chunk-JUEVN4Q4.js.map +1 -0
- package/dist/chunk-KKMGTT7F.mjs +968 -0
- package/dist/chunk-KKMGTT7F.mjs.map +1 -0
- package/dist/{chunk-XQJX252G.mjs → chunk-MB3WR5KJ.mjs} +28 -18
- package/dist/chunk-MB3WR5KJ.mjs.map +1 -0
- package/dist/{chunk-2IHTEKHU.mjs → chunk-QD5CN2OI.mjs} +16 -7
- package/dist/chunk-QD5CN2OI.mjs.map +1 -0
- package/dist/chunk-QD66FTXZ.mjs +278 -0
- package/dist/chunk-QD66FTXZ.mjs.map +1 -0
- package/dist/{chunk-SBVEYCSV.js → chunk-QQB4FO4Q.js} +7 -7
- package/dist/{chunk-SBVEYCSV.js.map → chunk-QQB4FO4Q.js.map} +1 -1
- package/dist/{generators-YZWIGHCO.js → chunk-S2GXR5HY.js} +26 -9
- package/dist/chunk-S2GXR5HY.js.map +1 -0
- package/dist/{chunk-O2OHHBUD.js → chunk-TDK7DLCH.js} +30 -20
- package/dist/chunk-TDK7DLCH.js.map +1 -0
- package/dist/chunk-UJQ73OS6.js +282 -0
- package/dist/chunk-UJQ73OS6.js.map +1 -0
- package/dist/{chunk-QP5NCO2E.js → chunk-VDI7KYME.js} +67 -2
- package/dist/chunk-VDI7KYME.js.map +1 -0
- package/dist/chunk-VOR53RUR.js +753 -0
- package/dist/chunk-VOR53RUR.js.map +1 -0
- package/dist/{chunk-GAJLEDRD.js → chunk-ZKJ7JKFV.js} +16 -7
- package/dist/chunk-ZKJ7JKFV.js.map +1 -0
- package/dist/chunk-ZSMWDLMK.js +63 -0
- package/dist/{chunk-EQCVQC35.js.map → chunk-ZSMWDLMK.js.map} +1 -1
- package/dist/cli/index.js +37269 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +37233 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/commerce/index.js +1 -1
- package/dist/commerce/index.mjs +1 -1
- package/dist/commerce/server.d.mts +12 -3
- package/dist/commerce/server.d.ts +12 -3
- package/dist/commerce/server.js +71 -70
- package/dist/commerce/server.js.map +1 -1
- package/dist/commerce/server.mjs +71 -70
- package/dist/commerce/server.mjs.map +1 -1
- package/dist/engage/index.d.mts +6 -4
- package/dist/engage/index.d.ts +6 -4
- package/dist/engage/index.js +8 -4
- package/dist/engage/index.mjs +2 -2
- package/dist/forms/index.js +1 -1
- package/dist/forms/index.mjs +1 -1
- package/dist/generators-5EU4PTVF.js +33 -0
- package/dist/generators-5EU4PTVF.js.map +1 -0
- package/dist/generators-TYPILCWD.mjs +4 -0
- package/dist/generators-TYPILCWD.mjs.map +1 -0
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.d.mts +155 -5
- package/dist/index.d.ts +155 -5
- package/dist/index.js +979 -50
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +821 -8
- package/dist/index.mjs.map +1 -1
- package/dist/llms/index.d.mts +657 -0
- package/dist/llms/index.d.ts +657 -0
- package/dist/llms/index.js +101 -0
- package/dist/llms/index.js.map +1 -0
- package/dist/llms/index.mjs +4 -0
- package/dist/llms/index.mjs.map +1 -0
- package/dist/migrator-ARLHUNB3.mjs +4 -0
- package/dist/migrator-ARLHUNB3.mjs.map +1 -0
- package/dist/migrator-VZLBH3VY.js +37 -0
- package/dist/migrator-VZLBH3VY.js.map +1 -0
- package/dist/redirects/index.js +1 -1
- package/dist/redirects/index.mjs +1 -1
- package/dist/reputation/index.d.mts +57 -0
- package/dist/reputation/index.d.ts +57 -0
- package/dist/reputation/index.js +21 -0
- package/dist/reputation/index.js.map +1 -0
- package/dist/reputation/index.mjs +4 -0
- package/dist/reputation/index.mjs.map +1 -0
- package/dist/{routing-BWjUF7lp.d.ts → routing-CF91y6NO.d.ts} +1 -1
- package/dist/{routing-CgmRi9tD.d.mts → routing-CIOFpFCB.d.mts} +1 -1
- package/dist/scanner-7ZMUM2P5.mjs +4 -0
- package/dist/scanner-7ZMUM2P5.mjs.map +1 -0
- package/dist/scanner-OY7UF3WA.js +53 -0
- package/dist/scanner-OY7UF3WA.js.map +1 -0
- package/dist/seo/index.d.mts +267 -7
- package/dist/seo/index.d.ts +267 -7
- package/dist/seo/index.js +432 -24
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +400 -11
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo/server.d.mts +11 -4
- package/dist/seo/server.d.ts +11 -4
- package/dist/seo/server.js +17 -17
- package/dist/seo/server.mjs +3 -3
- package/dist/setup/client.js +1 -1
- package/dist/setup/client.mjs +1 -1
- package/dist/setup/index.js +3 -3
- package/dist/setup/index.mjs +2 -2
- package/dist/setup/server.js +3 -3
- package/dist/setup/server.mjs +2 -2
- package/dist/sitemap/index.js +2 -2
- package/dist/sitemap/index.js.map +1 -1
- package/dist/sitemap/index.mjs +2 -2
- package/dist/sitemap/index.mjs.map +1 -1
- package/dist/{types-C0pJGfbH.d.mts → types-D6FHAVWX.d.mts} +99 -3
- package/dist/{types-C0pJGfbH.d.ts → types-D6FHAVWX.d.ts} +99 -3
- package/dist/{types-BDojCvvL.d.mts → types-DI0jnhjJ.d.mts} +31 -8
- package/dist/{types-BDojCvvL.d.ts → types-DI0jnhjJ.d.ts} +31 -8
- package/dist/{types-BmzutFwy.d.ts → types-j8X4vUhB.d.mts} +19 -2
- package/dist/{types-BmzutFwy.d.mts → types-j8X4vUhB.d.ts} +19 -2
- package/dist/{web-vitals-BH55V7EJ.js → web-vitals-444RLW3B.js} +11 -11
- package/dist/{web-vitals-BH55V7EJ.js.map → web-vitals-444RLW3B.js.map} +1 -1
- package/dist/{web-vitals-RJYPWAR3.mjs → web-vitals-KPICZIEF.mjs} +3 -3
- package/dist/{web-vitals-RJYPWAR3.mjs.map → web-vitals-KPICZIEF.mjs.map} +1 -1
- package/package.json +22 -10
- package/dist/api-N35S3EES.js +0 -57
- package/dist/api-N35S3EES.js.map +0 -1
- package/dist/api-SYBTK7Z7.mjs +0 -4
- package/dist/api-SYBTK7Z7.mjs.map +0 -1
- package/dist/chunk-2IHTEKHU.mjs.map +0 -1
- package/dist/chunk-7H6I3ECV.mjs.map +0 -1
- package/dist/chunk-BGJLOJ7T.mjs +0 -605
- package/dist/chunk-BGJLOJ7T.mjs.map +0 -1
- package/dist/chunk-EQCVQC35.js +0 -35
- package/dist/chunk-FKVJOT2F.mjs.map +0 -1
- package/dist/chunk-GAJLEDRD.js.map +0 -1
- package/dist/chunk-NYKRE2FL.mjs +0 -31
- package/dist/chunk-O2OHHBUD.js.map +0 -1
- package/dist/chunk-QAYJV4KK.js +0 -608
- package/dist/chunk-QAYJV4KK.js.map +0 -1
- package/dist/chunk-QP5NCO2E.js.map +0 -1
- package/dist/chunk-V3F5J6CV.js.map +0 -1
- package/dist/chunk-XQJX252G.mjs.map +0 -1
- package/dist/generators-TO2FKJR6.mjs.map +0 -1
- package/dist/generators-YZWIGHCO.js.map +0 -1
- package/dist/migrator-V6KS75EA.mjs +0 -265
- package/dist/migrator-V6KS75EA.mjs.map +0 -1
- package/dist/migrator-XKM7YQCY.js +0 -272
- package/dist/migrator-XKM7YQCY.js.map +0 -1
- package/dist/scanner-AZV5I6US.mjs.map +0 -1
- package/dist/scanner-ETJAMIT7.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/generators/index.ts"],"names":["path","fs"],"mappings":";;;;;;;;;;;AA0BA,eAAsB,gBAAgB,OAAA,EAAoC;AACxE,EAAA,MAAM,UAAUA,qBAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,YAAY,CAAA;AAGrD,EAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,EAAA,IAAI;AACF,IAAA,eAAA,GAAkB,MAAMC,mBAAA,CAAG,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,kCAAkC,OAAA,CAAQ,SAAA;AAAA,IAC1C,4BAA4B,OAAA,CAAQ,WAAA;AAAA,IACpC,iCAAiC,OAAA,CAAQ,eAAA;AAAA,IACzC,mBAAmB,OAAA,CAAQ;AAAA,GAC7B;AAGA,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA;AACxC,EAAA,MAAM,eAAuC,EAAC;AAG9C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAK,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAE9C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,UAAU,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAC3C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,GAAI,WAAW,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AAAA,IACvD;AAAA,EACF;AAMA,EAAA,IAAI,UAAA,GAAa,CAAA;AAAA;;AAAA;AAAA,+BAAA,EAIc,OAAA,CAAQ,gCAAgC,CAAC;;AAAA;AAAA,yBAAA,EAG/C,OAAA,CAAQ,0BAA0B,CAAC;AAAA,8BAAA,EAC9B,OAAA,CAAQ,+BAA+B,CAAC;;AAAA;AAAA,gBAAA,EAGtD,OAAA,CAAQ,iBAAiB,CAAC;;AAAA,CAAA;AAK1C,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,YAAY,EAC1C,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,CAAC,WAAA,CAAY,QAAA,CAAS,GAAG,CAAC,CAAA;AAE/C,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,UAAA,IAAc,iCAAA;AACd,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,SAAA,EAAW;AACpC,MAAA,UAAA,IAAc,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK;AAAA,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAMA,mBAAA,CAAG,SAAA,CAAU,OAAA,EAAS,UAAA,EAAY,OAAO,CAAA;AACjD;AAMA,eAAsB,iBAAiB,OAAA,EAAyC;AAE9E,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AACxC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,OAAA,GAAU,MAAMA,mBAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA;AAGrD,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACvC,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,GAAa,OAAA;AAGjB,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA;AACrD,EAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,eAAe,CAAA;AAEhE,EAAA,MAAM,eAAA,GAAkB;AAAA,mDAAA,CAAA;AACxB,EAAA,UAAA,GACE,OAAA,CAAQ,MAAM,CAAA,EAAG,kBAAkB,IACnC,eAAA,GACA,OAAA,CAAQ,MAAM,kBAAkB,CAAA;AAIlC,EAAA,MAAM,eAAA,GAAkB,iBAAA;AACxB,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,KAAA,CAAM,eAAe,CAAA;AAEtD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,CAAC,CAAA,IAAK,UAAA;AACnC,IAAA,MAAM,YAAA,GAAe;AAAA,EACvB,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA;AAAA,EACN,MAAM,CAAA,kBAAA,CAAA;AAEJ,IAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,eAAA,EAAiB,YAAY,CAAA;AAAA,EAC/D,CAAA,MAAO;AAEL,IAAA,MAAM,WAAA,GAAc,mCAAA;AACpB,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,WAAW,CAAA;AAE9C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,WAAA,GAAc,UAAU,CAAC,CAAA;AAC/B,MAAA,MAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EASf,WAAA,CAAY,MAAM;AAAA;AAAA,QAAA,CAAA;AAI1B,MAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,WAAA,EAAa,CAAA,EAAA,EAAK,cAAc,CAAA,EAAA,CAAI,CAAA;AAAA,IACtE;AAAA,EACF;AAEA,EAAA,MAAMA,mBAAA,CAAG,SAAA,CAAU,UAAA,EAAY,UAAA,EAAY,OAAO,CAAA;AACpD;AAMA,eAAe,cAAA,GAAyC;AACtD,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,oBAAA;AAAA,IACA,gBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,IAAA,MAAM,WAAWD,qBAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,YAAY,CAAA;AACtD,IAAA,IAAI;AACF,MAAA,MAAMC,mBAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,eAAsB,kBAAA,GAAoC;AACxD,EAAA,MAAM,QAAA,GAAWD,sBAAK,IAAA,CAAK,OAAA,CAAQ,KAAI,EAAG,KAAA,EAAO,YAAY,OAAO,CAAA;AAGpE,EAAA,MAAMC,oBAAG,KAAA,CAAM,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAG5C,EAAA,MAAM,WAAA,GAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAcpB,EAAA,MAAMA,mBAAA,CAAG,UAAUD,qBAAA,CAAK,IAAA,CAAK,UAAU,UAAU,CAAA,EAAG,aAAa,OAAO,CAAA;AAC1E;AAMA,eAAsB,YAAA,GAA8B;AAElD,EAAA,MAAM,WAAWA,qBAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,OAAO,UAAU,CAAA;AAC3D,EAAA,IAAI;AACF,IAAA,MAAMC,mBAAA,CAAG,GAAG,QAAA,EAAU,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAe;AACxC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI,OAAA,GAAU,MAAMA,mBAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA;AAGnD,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,iFAAA,EAAmF,EAAE,CAAA;AAG/G,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,wFAAA,EAA0F,IAAI,CAAA;AACxH,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,sBAAA,EAAwB,EAAE,CAAA;AAEpD,IAAA,MAAMA,mBAAA,CAAG,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAAA,EACjD;AACF;AAmBA,eAAsB,eAAe,OAAA,EAGlC;AACD,EAAA,MAAM,UAAoB,EAAC;AAG3B,EAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,IAAA,KAAA,MAAW,QAAA,IAAY,QAAQ,gBAAA,EAAkB;AAE/C,MAAA,IAAI,QAAA,CAAS,cAAc,UAAA,EAAY;AAEvC,MAAA,MAAM,WAAWD,qBAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,SAAS,QAAQ,CAAA;AAC3D,MAAA,IAAI;AACF,QAAA,MAAMC,mBAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,wBAAA;AAAA,MACA,yBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,MAAM,WAAWD,qBAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,MAAM,CAAA;AAChD,MAAA,IAAI;AACF,QAAA,MAAMC,mBAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,QAAA,MAAMA,mBAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MACrB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,MAAM,gBAAgBD,qBAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,UAAU,aAAa,CAAA;AACtE,IAAA,IAAI;AACF,MAAA,MAAMC,mBAAA,CAAG,OAAO,aAAa,CAAA;AAC7B,MAAA,MAAMA,mBAAA,CAAG,OAAO,aAAa,CAAA;AAC7B,MAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,MAAM,qBAAqBD,qBAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,UAAU,eAAe,CAAA;AAC7E,IAAA,IAAI;AACF,MAAA,MAAMC,mBAAA,CAAG,OAAO,kBAAkB,CAAA;AAElC,MAAA,MAAM,YAAYD,qBAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,QAAQ,CAAA;AACnD,MAAA,MAAM,KAAA,GAAQ,MAAMC,mBAAA,CAAG,OAAA,CAAQ,SAAS,CAAA;AACxC,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,oBAAoB,CAAA,EAAG;AACpC,UAAA,MAAMA,oBAAG,MAAA,CAAOD,qBAAA,CAAK,IAAA,CAAK,SAAA,EAAW,IAAI,CAAC,CAAA;AAC1C,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,mBAAA,EAAoB;AAC9C,EAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,OAAA,CAAQ,OAAO,CAAA;AAE7D,EAAA,MAAMC,mBAAA,CAAG,MAAMD,qBAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC7D,EAAA,MAAMC,mBAAA,CAAG,SAAA,CAAU,WAAA,EAAa,cAAA,EAAgB,OAAO,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAASD,qBAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,IAAO,WAAW;AAAA,GACnD;AACF;AAKA,eAAe,mBAAA,GAAuC;AAEpD,EAAA,MAAM,MAAA,GAASA,sBAAK,IAAA,CAAK,OAAA,CAAQ,KAAI,EAAG,KAAA,EAAO,OAAO,YAAY,CAAA;AAClE,EAAA,MAAM,MAAMA,qBAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,OAAO,YAAY,CAAA;AAExD,EAAA,IAAI;AACF,IAAA,MAAMC,mBAAA,CAAG,OAAOD,qBAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,EAAI,EAAG,KAAA,EAAO,KAAK,CAAC,CAAA;AACtD,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAKA,SAAS,uBAAuB,OAAA,EAAyB;AACvD,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,YAAA,EAYK,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqBrB;AAKA,eAAsB,2BAAA,GAAgD;AACpE,EAAA,MAAM,kBAAkBA,qBAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,cAAc,CAAA;AAE/D,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMC,mBAAA,CAAG,QAAA,CAAS,iBAAiB,OAAO,CAAA;AAC1D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAE9B,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,IAAI,GAAA,CAAI,YAAA,GAAe,cAAc,CAAA,EAAG;AACtC,MAAA,OAAO,GAAA,CAAI,aAAa,cAAc,CAAA;AACtC,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAEA,IAAA,IAAI,GAAA,CAAI,eAAA,GAAkB,cAAc,CAAA,EAAG;AACzC,MAAA,OAAO,GAAA,CAAI,gBAAgB,cAAc,CAAA;AACzC,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAGA,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACtD,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,cAAc,CAAA,EAAG;AAC/D,UAAA,OAAO,GAAA,CAAI,QAAQ,GAAG,CAAA;AACtB,UAAA,QAAA,GAAW,IAAA;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAMA,mBAAA,CAAG,SAAA,CAAU,eAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA;AAAA,IAClF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF","file":"generators-YZWIGHCO.js","sourcesContent":["/**\n * Code Generators - Creates SiteKitProvider setup and env files\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\n\n// ============================================\n// Types\n// ============================================\n\ninterface EnvOptions {\n projectId: string\n supabaseUrl: string\n supabaseAnonKey: string\n apiKey: string\n}\n\ninterface ProviderOptions {\n projectId: string\n}\n\n// ============================================\n// Env File Generator\n// ============================================\n\nexport async function generateEnvFile(options: EnvOptions): Promise<void> {\n const envPath = path.join(process.cwd(), '.env.local')\n \n // Check if file exists and read existing content\n let existingContent = ''\n try {\n existingContent = await fs.readFile(envPath, 'utf-8')\n } catch {\n // File doesn't exist, that's fine\n }\n\n // Build new env vars\n const newVars: Record<string, string> = {\n 'NEXT_PUBLIC_UPTRADE_PROJECT_ID': options.projectId,\n 'NEXT_PUBLIC_SUPABASE_URL': options.supabaseUrl,\n 'NEXT_PUBLIC_SUPABASE_ANON_KEY': options.supabaseAnonKey,\n 'UPTRADE_API_KEY': options.apiKey,\n }\n\n // Parse existing content\n const lines = existingContent.split('\\n')\n const existingVars: Record<string, string> = {}\n const comments: string[] = []\n\n for (const line of lines) {\n if (line.startsWith('#') || line.trim() === '') {\n comments.push(line)\n continue\n }\n const [key, ...valueParts] = line.split('=')\n if (key) {\n existingVars[key.trim()] = valueParts.join('=').trim()\n }\n }\n\n // Merge vars (new vars take precedence)\n const mergedVars = { ...existingVars, ...newVars }\n\n // Generate new content\n let newContent = `# Uptrade Site-Kit Configuration\n# Generated by @uptrade/site-kit setup wizard\n\n# Project ID from Uptrade Portal\nNEXT_PUBLIC_UPTRADE_PROJECT_ID=${newVars['NEXT_PUBLIC_UPTRADE_PROJECT_ID']}\n\n# Supabase Configuration\nNEXT_PUBLIC_SUPABASE_URL=${newVars['NEXT_PUBLIC_SUPABASE_URL']}\nNEXT_PUBLIC_SUPABASE_ANON_KEY=${newVars['NEXT_PUBLIC_SUPABASE_ANON_KEY']}\n\n# Uptrade API Key (for server-side operations)\nUPTRADE_API_KEY=${newVars['UPTRADE_API_KEY']}\n\n`\n\n // Add any existing vars that aren't Uptrade-related\n const uptradeKeys = Object.keys(newVars)\n const otherVars = Object.entries(existingVars)\n .filter(([key]) => !uptradeKeys.includes(key))\n \n if (otherVars.length > 0) {\n newContent += '# Other Environment Variables\\n'\n for (const [key, value] of otherVars) {\n newContent += `${key}=${value}\\n`\n }\n }\n\n await fs.writeFile(envPath, newContent, 'utf-8')\n}\n\n// ============================================\n// Provider Generator\n// ============================================\n\nexport async function generateProvider(options: ProviderOptions): Promise<void> {\n // Find the layout file\n const layoutPath = await findLayoutFile()\n if (!layoutPath) {\n throw new Error('Could not find layout.tsx file')\n }\n\n const content = await fs.readFile(layoutPath, 'utf-8')\n\n // Check if SiteKitProvider is already added\n if (content.includes('SiteKitProvider')) {\n return // Already configured\n }\n\n // Add import\n let newContent = content\n\n // Find where to add import (after other imports)\n const lastImportIndex = content.lastIndexOf('import ')\n const lastImportEndIndex = content.indexOf('\\n', lastImportIndex)\n \n const importStatement = `\\nimport { SiteKitProvider } from '@uptrade/site-kit'`\n newContent = \n content.slice(0, lastImportEndIndex) + \n importStatement + \n content.slice(lastImportEndIndex)\n\n // Wrap children with SiteKitProvider\n // Look for {children} and wrap it\n const childrenPattern = /(\\s*){children}/\n const childrenMatch = newContent.match(childrenPattern)\n \n if (childrenMatch) {\n const indent = childrenMatch[1] || ' '\n const providerWrap = `\n${indent}<SiteKitProvider\n${indent} projectId={process.env.NEXT_PUBLIC_UPTRADE_PROJECT_ID!}\n${indent} supabaseUrl={process.env.NEXT_PUBLIC_SUPABASE_URL!}\n${indent} supabaseAnonKey={process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!}\n${indent} analytics={{ enabled: true }}\n${indent} engage={{ enabled: true }}\n${indent} forms={{ enabled: true }}\n${indent}>\n${indent} {children}\n${indent}</SiteKitProvider>`\n\n newContent = newContent.replace(childrenPattern, providerWrap)\n } else {\n // Try alternative pattern for layouts that use a different structure\n const bodyPattern = /(<body[^>]*>)([\\s\\S]*?)(<\\/body>)/\n const bodyMatch = newContent.match(bodyPattern)\n \n if (bodyMatch) {\n const bodyContent = bodyMatch[2]\n const wrappedContent = `\n <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 analytics={{ enabled: true }}\n engage={{ enabled: true }}\n forms={{ enabled: true }}\n >\n ${bodyContent.trim()}\n </SiteKitProvider>\n `\n \n newContent = newContent.replace(bodyPattern, `$1${wrappedContent}$3`)\n }\n }\n\n await fs.writeFile(layoutPath, newContent, 'utf-8')\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nasync function findLayoutFile(): Promise<string | null> {\n const possiblePaths = [\n 'src/app/layout.tsx',\n 'app/layout.tsx',\n 'src/app/layout.jsx',\n 'app/layout.jsx',\n ]\n\n for (const relativePath of possiblePaths) {\n const fullPath = path.join(process.cwd(), relativePath)\n try {\n await fs.access(fullPath)\n return fullPath\n } catch {\n continue\n }\n }\n\n return null\n}\n\n// ============================================\n// Setup Route Generator (for visual wizard)\n// ============================================\n\nexport async function generateSetupRoute(): Promise<void> {\n const routeDir = path.join(process.cwd(), 'app', '_uptrade', 'setup')\n \n // Create directory\n await fs.mkdir(routeDir, { recursive: true })\n\n // Create page.tsx\n const pageContent = `/**\n * Uptrade Setup Wizard\n * \n * This route is automatically removed after setup is complete.\n * Visit /_uptrade/setup to configure Site-Kit.\n */\n\nimport { SetupWizard } from '@uptrade/site-kit/setup'\n\nexport default function SetupPage() {\n return <SetupWizard />\n}\n`\n\n await fs.writeFile(path.join(routeDir, 'page.tsx'), pageContent, 'utf-8')\n}\n\n// ============================================\n// Self-Destruct\n// ============================================\n\nexport async function selfDestruct(): Promise<void> {\n // Remove setup route\n const setupDir = path.join(process.cwd(), 'app', '_uptrade')\n try {\n await fs.rm(setupDir, { recursive: true, force: true })\n } catch {\n // Directory might not exist\n }\n\n // Remove UptradeSetup from layout if present\n const layoutPath = await findLayoutFile()\n if (layoutPath) {\n let content = await fs.readFile(layoutPath, 'utf-8')\n \n // Remove import\n content = content.replace(/import\\s*{\\s*UptradeSetup\\s*}\\s*from\\s*['\"]@uptrade\\/site-kit\\/setup['\"][;\\n]?/g, '')\n \n // Remove component usage\n content = content.replace(/\\s*{process\\.env\\.NODE_ENV\\s*===\\s*['\"]development['\"]\\s*&&\\s*<UptradeSetup\\s*\\/>}\\s*/g, '\\n')\n content = content.replace(/<UptradeSetup\\s*\\/>/g, '')\n \n await fs.writeFile(layoutPath, content, 'utf-8')\n }\n}\n\n// ============================================\n// Sitemap Generator\n// ============================================\n\ninterface SitemapMigrationOptions {\n baseUrl: string\n existingSitemaps: Array<{\n filePath: string\n type: string\n generator?: string\n }>\n deleteExisting: boolean\n}\n\n/**\n * Generate site-kit sitemap and optionally remove existing sitemap files\n */\nexport async function migrateSitemap(options: SitemapMigrationOptions): Promise<{\n deleted: string[]\n created: string\n}> {\n const deleted: string[] = []\n\n // Delete existing sitemap files if requested\n if (options.deleteExisting) {\n for (const existing of options.existingSitemaps) {\n // Skip if it's already site-kit\n if (existing.generator === 'site-kit') continue\n\n const fullPath = path.join(process.cwd(), existing.filePath)\n try {\n await fs.unlink(fullPath)\n deleted.push(existing.filePath)\n } catch {\n // File might not exist or be locked\n }\n }\n\n // Also delete next-sitemap config files\n const configFiles = [\n 'next-sitemap.config.js',\n 'next-sitemap.config.mjs', \n 'next-sitemap.config.ts',\n ]\n for (const config of configFiles) {\n const fullPath = path.join(process.cwd(), config)\n try {\n await fs.access(fullPath)\n await fs.unlink(fullPath)\n deleted.push(config)\n } catch {\n // File doesn't exist\n }\n }\n\n // Delete static sitemap.xml if it exists in public\n const staticSitemap = path.join(process.cwd(), 'public', 'sitemap.xml')\n try {\n await fs.access(staticSitemap)\n await fs.unlink(staticSitemap)\n deleted.push('public/sitemap.xml')\n } catch {\n // File doesn't exist\n }\n\n // Delete sitemap index if exists\n const staticSitemapIndex = path.join(process.cwd(), 'public', 'sitemap-0.xml')\n try {\n await fs.access(staticSitemapIndex)\n // Find all sitemap-N.xml files\n const publicDir = path.join(process.cwd(), 'public')\n const files = await fs.readdir(publicDir)\n for (const file of files) {\n if (file.match(/^sitemap-\\d+\\.xml$/)) {\n await fs.unlink(path.join(publicDir, file))\n deleted.push(`public/${file}`)\n }\n }\n } catch {\n // File doesn't exist\n }\n }\n\n // Generate new sitemap.ts using site-kit\n const sitemapPath = await findSitemapLocation()\n const sitemapContent = generateSitemapContent(options.baseUrl)\n\n await fs.mkdir(path.dirname(sitemapPath), { recursive: true })\n await fs.writeFile(sitemapPath, sitemapContent, 'utf-8')\n\n return {\n deleted,\n created: path.relative(process.cwd(), sitemapPath),\n }\n}\n\n/**\n * Find where to put the sitemap file\n */\nasync function findSitemapLocation(): Promise<string> {\n // Check if using src/app or app\n const srcApp = path.join(process.cwd(), 'src', 'app', 'sitemap.ts')\n const app = path.join(process.cwd(), 'app', 'sitemap.ts')\n\n try {\n await fs.access(path.join(process.cwd(), 'src', 'app'))\n return srcApp\n } catch {\n return app\n }\n}\n\n/**\n * Generate sitemap.ts content\n */\nfunction generateSitemapContent(baseUrl: string): string {\n return `/**\n * Sitemap Generator - Powered by @uptrade/site-kit\n * \n * Automatically discovers pages from the app directory and syncs\n * them to Portal API for SEO tracking and analytics validation.\n * \n * Generated by Uptrade Site-Kit Setup Wizard\n */\n\nimport { createSitemap } from '@uptrade/site-kit/sitemap'\n\nexport default createSitemap({\n baseUrl: '${baseUrl}',\n \n // Optional: Exclude patterns (these are excluded by default)\n // exclude: ['/admin/*', '/api/*'],\n \n // Optional: Override priorities for specific paths\n // priorities: {\n // '/': 1.0,\n // '/about': 0.8,\n // '/contact': 0.7,\n // },\n \n // Optional: Add dynamic routes not discoverable from file system\n // additionalPaths: async () => {\n // // Example: Fetch blog posts from database\n // // const posts = await getBlogPosts()\n // // return posts.map(post => ({ path: \\`/blog/\\${post.slug}\\`, priority: 0.7 }))\n // return []\n // },\n})\n`\n}\n\n/**\n * Remove next-sitemap from package.json dependencies\n */\nexport async function removeNextSitemapDependency(): Promise<boolean> {\n const packageJsonPath = path.join(process.cwd(), 'package.json')\n \n try {\n const content = await fs.readFile(packageJsonPath, 'utf-8')\n const pkg = JSON.parse(content)\n \n let modified = false\n \n if (pkg.dependencies?.['next-sitemap']) {\n delete pkg.dependencies['next-sitemap']\n modified = true\n }\n \n if (pkg.devDependencies?.['next-sitemap']) {\n delete pkg.devDependencies['next-sitemap']\n modified = true\n }\n\n // Also remove from scripts if present\n if (pkg.scripts) {\n for (const [key, value] of Object.entries(pkg.scripts)) {\n if (typeof value === 'string' && value.includes('next-sitemap')) {\n delete pkg.scripts[key]\n modified = true\n }\n }\n }\n\n if (modified) {\n await fs.writeFile(packageJsonPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8')\n }\n\n return modified\n } catch {\n return false\n }\n}\n\n"]}
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
import './chunk-NYKRE2FL.mjs';
|
|
2
|
-
import fs from 'fs/promises';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
|
|
5
|
-
async function migrateFiles(scanResults, options) {
|
|
6
|
-
const results = [];
|
|
7
|
-
for (const form of scanResults.forms) {
|
|
8
|
-
if (form.suggestedAction === "manual") {
|
|
9
|
-
results.push({
|
|
10
|
-
filePath: form.filePath,
|
|
11
|
-
success: false,
|
|
12
|
-
changes: [],
|
|
13
|
-
error: "Form too complex for auto-migration"
|
|
14
|
-
});
|
|
15
|
-
continue;
|
|
16
|
-
}
|
|
17
|
-
try {
|
|
18
|
-
const result = await migrateForm(form, options);
|
|
19
|
-
results.push(result);
|
|
20
|
-
} catch (error) {
|
|
21
|
-
results.push({
|
|
22
|
-
filePath: form.filePath,
|
|
23
|
-
success: false,
|
|
24
|
-
changes: [],
|
|
25
|
-
error: error.message
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
for (const widget of scanResults.widgets) {
|
|
30
|
-
try {
|
|
31
|
-
const result = await migrateWidget(widget.filePath, widget, options);
|
|
32
|
-
results.push(result);
|
|
33
|
-
} catch (error) {
|
|
34
|
-
results.push({
|
|
35
|
-
filePath: widget.filePath,
|
|
36
|
-
success: false,
|
|
37
|
-
changes: [],
|
|
38
|
-
error: error.message
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return results;
|
|
43
|
-
}
|
|
44
|
-
async function migrateForm(form, options) {
|
|
45
|
-
const changes = [];
|
|
46
|
-
const fullPath = path.resolve(process.cwd(), form.filePath);
|
|
47
|
-
const formSlug = generateSlug(form.componentName);
|
|
48
|
-
const formId = await createFormInUptrade(form, formSlug, options);
|
|
49
|
-
changes.push(`Created managed form: ${formSlug}`);
|
|
50
|
-
if (options.dryRun) {
|
|
51
|
-
changes.push("[DRY RUN] Would update file");
|
|
52
|
-
return { filePath: form.filePath, success: true, changes, formId };
|
|
53
|
-
}
|
|
54
|
-
await fs.readFile(fullPath, "utf-8");
|
|
55
|
-
const newCode = generateMigratedFormCode(form, formSlug);
|
|
56
|
-
await fs.writeFile(fullPath, newCode, "utf-8");
|
|
57
|
-
changes.push("Updated component to use useForm hook");
|
|
58
|
-
return {
|
|
59
|
-
filePath: form.filePath,
|
|
60
|
-
success: true,
|
|
61
|
-
changes,
|
|
62
|
-
formId
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
function generateMigratedFormCode(form, formSlug) {
|
|
66
|
-
const componentName = form.componentName || "MigratedForm";
|
|
67
|
-
return `/**
|
|
68
|
-
* ${componentName}
|
|
69
|
-
*
|
|
70
|
-
* Migrated to @uptrade/site-kit
|
|
71
|
-
* Managed form: ${formSlug}
|
|
72
|
-
*/
|
|
73
|
-
|
|
74
|
-
'use client'
|
|
75
|
-
|
|
76
|
-
import { useForm } from '@uptrade/site-kit/forms'
|
|
77
|
-
|
|
78
|
-
export function ${componentName}({ className }: { className?: string }) {
|
|
79
|
-
const {
|
|
80
|
-
form,
|
|
81
|
-
fields,
|
|
82
|
-
values,
|
|
83
|
-
errors,
|
|
84
|
-
setFieldValue,
|
|
85
|
-
submit,
|
|
86
|
-
isSubmitting,
|
|
87
|
-
isComplete
|
|
88
|
-
} = useForm('${formSlug}')
|
|
89
|
-
|
|
90
|
-
if (isComplete) {
|
|
91
|
-
return (
|
|
92
|
-
<div className={className}>
|
|
93
|
-
<p className="text-green-600">{form?.successMessage || 'Thanks for your submission!'}</p>
|
|
94
|
-
</div>
|
|
95
|
-
)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return (
|
|
99
|
-
<form
|
|
100
|
-
onSubmit={(e) => { e.preventDefault(); submit() }}
|
|
101
|
-
className={className}
|
|
102
|
-
>
|
|
103
|
-
{fields.map(field => (
|
|
104
|
-
<div key={field.slug} className="mb-4">
|
|
105
|
-
<label className="block text-sm font-medium mb-1">
|
|
106
|
-
{field.label}
|
|
107
|
-
{field.isRequired && <span className="text-red-500 ml-1">*</span>}
|
|
108
|
-
</label>
|
|
109
|
-
|
|
110
|
-
{field.fieldType === 'textarea' ? (
|
|
111
|
-
<textarea
|
|
112
|
-
name={field.slug}
|
|
113
|
-
placeholder={field.placeholder}
|
|
114
|
-
value={String(values[field.slug] || '')}
|
|
115
|
-
onChange={(e) => setFieldValue(field.slug, e.target.value)}
|
|
116
|
-
className="w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
117
|
-
rows={4}
|
|
118
|
-
/>
|
|
119
|
-
) : field.fieldType === 'select' && field.options ? (
|
|
120
|
-
<select
|
|
121
|
-
name={field.slug}
|
|
122
|
-
value={String(values[field.slug] || '')}
|
|
123
|
-
onChange={(e) => setFieldValue(field.slug, e.target.value)}
|
|
124
|
-
className="w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
125
|
-
>
|
|
126
|
-
<option value="">Select...</option>
|
|
127
|
-
{field.options.map(opt => (
|
|
128
|
-
<option key={opt.value} value={opt.value}>{opt.label}</option>
|
|
129
|
-
))}
|
|
130
|
-
</select>
|
|
131
|
-
) : (
|
|
132
|
-
<input
|
|
133
|
-
type={field.fieldType}
|
|
134
|
-
name={field.slug}
|
|
135
|
-
placeholder={field.placeholder}
|
|
136
|
-
value={String(values[field.slug] || '')}
|
|
137
|
-
onChange={(e) => setFieldValue(field.slug, e.target.value)}
|
|
138
|
-
className="w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
139
|
-
/>
|
|
140
|
-
)}
|
|
141
|
-
|
|
142
|
-
{errors[field.slug] && (
|
|
143
|
-
<p className="mt-1 text-sm text-red-500">{errors[field.slug]}</p>
|
|
144
|
-
)}
|
|
145
|
-
|
|
146
|
-
{field.helpText && (
|
|
147
|
-
<p className="mt-1 text-xs text-gray-500">{field.helpText}</p>
|
|
148
|
-
)}
|
|
149
|
-
</div>
|
|
150
|
-
))}
|
|
151
|
-
|
|
152
|
-
<button
|
|
153
|
-
type="submit"
|
|
154
|
-
disabled={isSubmitting}
|
|
155
|
-
className="w-full py-2 px-4 bg-blue-600 text-white rounded hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
156
|
-
>
|
|
157
|
-
{isSubmitting ? 'Submitting...' : (form?.submitButtonText || 'Submit')}
|
|
158
|
-
</button>
|
|
159
|
-
</form>
|
|
160
|
-
)
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export default ${componentName}
|
|
164
|
-
`;
|
|
165
|
-
}
|
|
166
|
-
async function createFormInUptrade(form, slug, options) {
|
|
167
|
-
const response = await fetch("https://api.uptrademedia.com/forms", {
|
|
168
|
-
method: "POST",
|
|
169
|
-
headers: {
|
|
170
|
-
"Content-Type": "application/json",
|
|
171
|
-
"Authorization": `Bearer ${options.apiKey}`
|
|
172
|
-
},
|
|
173
|
-
body: JSON.stringify({
|
|
174
|
-
projectId: options.projectId,
|
|
175
|
-
slug,
|
|
176
|
-
name: formatName(form.componentName),
|
|
177
|
-
formType: detectFormType(form),
|
|
178
|
-
successMessage: "Thanks for your submission!",
|
|
179
|
-
submitButtonText: "Submit",
|
|
180
|
-
fields: form.fields.map((f, i) => ({
|
|
181
|
-
slug: f.name,
|
|
182
|
-
label: formatLabel(f.name),
|
|
183
|
-
fieldType: mapFieldType(f.type),
|
|
184
|
-
placeholder: f.placeholder,
|
|
185
|
-
isRequired: f.required,
|
|
186
|
-
sortOrder: i,
|
|
187
|
-
width: "full"
|
|
188
|
-
}))
|
|
189
|
-
})
|
|
190
|
-
});
|
|
191
|
-
if (!response.ok) {
|
|
192
|
-
const error = await response.json();
|
|
193
|
-
throw new Error(error.message || "Failed to create form");
|
|
194
|
-
}
|
|
195
|
-
const data = await response.json();
|
|
196
|
-
return data.id;
|
|
197
|
-
}
|
|
198
|
-
async function migrateWidget(filePath, widget, options) {
|
|
199
|
-
const changes = [];
|
|
200
|
-
if (options.dryRun) {
|
|
201
|
-
changes.push(`[DRY RUN] Would remove ${widget.widgetType} script`);
|
|
202
|
-
changes.push("[DRY RUN] Would enable Engage in SiteKitProvider");
|
|
203
|
-
return { filePath, success: true, changes };
|
|
204
|
-
}
|
|
205
|
-
const fullPath = path.resolve(process.cwd(), filePath);
|
|
206
|
-
let content = await fs.readFile(fullPath, "utf-8");
|
|
207
|
-
switch (widget.widgetType) {
|
|
208
|
-
case "intercom":
|
|
209
|
-
content = content.replace(/<Script[^>]*intercom[^>]*\/?>(?:<\/Script>)?/gi, "{/* Intercom replaced with Uptrade Engage */}");
|
|
210
|
-
content = content.replace(/window\.Intercom\s*=\s*[^;]+;/g, "");
|
|
211
|
-
break;
|
|
212
|
-
case "crisp":
|
|
213
|
-
content = content.replace(/<Script[^>]*crisp[^>]*\/?>(?:<\/Script>)?/gi, "{/* Crisp replaced with Uptrade Engage */}");
|
|
214
|
-
break;
|
|
215
|
-
case "drift":
|
|
216
|
-
content = content.replace(/<Script[^>]*drift[^>]*\/?>(?:<\/Script>)?/gi, "{/* Drift replaced with Uptrade Engage */}");
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
await fs.writeFile(fullPath, content, "utf-8");
|
|
220
|
-
changes.push(`Removed ${widget.widgetType} script`);
|
|
221
|
-
changes.push("Enable Engage in SiteKitProvider to add chat widget");
|
|
222
|
-
return { filePath, success: true, changes };
|
|
223
|
-
}
|
|
224
|
-
function generateSlug(name) {
|
|
225
|
-
return name.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "").replace(/form$/i, "").replace(/-+/g, "-").replace(/-$/, "") || "form";
|
|
226
|
-
}
|
|
227
|
-
function formatName(name) {
|
|
228
|
-
return name.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase()).trim();
|
|
229
|
-
}
|
|
230
|
-
function formatLabel(name) {
|
|
231
|
-
return name.replace(/([A-Z])/g, " $1").replace(/_/g, " ").replace(/^./, (str) => str.toUpperCase()).trim();
|
|
232
|
-
}
|
|
233
|
-
function mapFieldType(type) {
|
|
234
|
-
const mapping = {
|
|
235
|
-
"text": "text",
|
|
236
|
-
"email": "email",
|
|
237
|
-
"tel": "phone",
|
|
238
|
-
"phone": "phone",
|
|
239
|
-
"number": "number",
|
|
240
|
-
"textarea": "textarea",
|
|
241
|
-
"select": "select",
|
|
242
|
-
"checkbox": "checkbox",
|
|
243
|
-
"radio": "radio",
|
|
244
|
-
"date": "date",
|
|
245
|
-
"file": "file",
|
|
246
|
-
"url": "url",
|
|
247
|
-
"password": "text"
|
|
248
|
-
// Don't use password for managed forms
|
|
249
|
-
};
|
|
250
|
-
return mapping[type] || "text";
|
|
251
|
-
}
|
|
252
|
-
function detectFormType(form) {
|
|
253
|
-
const name = form.componentName.toLowerCase();
|
|
254
|
-
const fields = form.fields.map((f) => f.name.toLowerCase()).join(" ");
|
|
255
|
-
if (name.includes("contact") || fields.includes("message")) return "contact";
|
|
256
|
-
if (name.includes("newsletter") || name.includes("subscribe")) return "newsletter";
|
|
257
|
-
if (name.includes("quote") || name.includes("estimate")) return "prospect";
|
|
258
|
-
if (name.includes("support") || name.includes("help")) return "support";
|
|
259
|
-
if (name.includes("feedback")) return "feedback";
|
|
260
|
-
return "contact";
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
export { migrateFiles };
|
|
264
|
-
//# sourceMappingURL=migrator-V6KS75EA.mjs.map
|
|
265
|
-
//# sourceMappingURL=migrator-V6KS75EA.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/migrator/index.ts"],"names":[],"mappings":"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","file":"migrator-V6KS75EA.mjs","sourcesContent":["/**\n * Code Migrator - Transforms existing forms to Site-Kit managed forms\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport { parse } from '@babel/parser'\nimport generate from '@babel/generator'\nimport traverse from '@babel/traverse'\nimport * as t from '@babel/types'\nimport type { ScanResults, DetectedForm, DetectedField } from '../scanner/index.js'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface MigrationResult {\n filePath: string\n success: boolean\n changes: string[]\n error?: string\n formId?: string\n}\n\nexport interface MigrationOptions {\n projectId: string\n apiKey: string\n dryRun?: boolean\n}\n\n// ============================================\n// Main Migrator\n// ============================================\n\nexport async function migrateFiles(\n scanResults: ScanResults,\n options: MigrationOptions\n): Promise<MigrationResult[]> {\n const results: MigrationResult[] = []\n\n // Migrate forms\n for (const form of scanResults.forms) {\n if (form.suggestedAction === 'manual') {\n results.push({\n filePath: form.filePath,\n success: false,\n changes: [],\n error: 'Form too complex for auto-migration',\n })\n continue\n }\n\n try {\n const result = await migrateForm(form, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: form.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n // Migrate widgets (simpler - just remove and add provider flag)\n for (const widget of scanResults.widgets) {\n try {\n const result = await migrateWidget(widget.filePath, widget, options)\n results.push(result)\n } catch (error: any) {\n results.push({\n filePath: widget.filePath,\n success: false,\n changes: [],\n error: error.message,\n })\n }\n }\n\n return results\n}\n\n// ============================================\n// Form Migration\n// ============================================\n\nasync function migrateForm(\n form: DetectedForm,\n options: MigrationOptions\n): Promise<MigrationResult> {\n const changes: string[] = []\n const fullPath = path.resolve(process.cwd(), form.filePath)\n\n // Step 1: Create the form in Uptrade\n const formSlug = generateSlug(form.componentName)\n const formId = await createFormInUptrade(form, formSlug, options)\n changes.push(`Created managed form: ${formSlug}`)\n\n if (options.dryRun) {\n changes.push('[DRY RUN] Would update file')\n return { filePath: form.filePath, success: true, changes, formId }\n }\n\n // Step 2: Read the file\n const content = await fs.readFile(fullPath, 'utf-8')\n \n // Step 3: Generate new code\n const newCode = generateMigratedFormCode(form, formSlug)\n\n // Step 4: Write the file\n await fs.writeFile(fullPath, newCode, 'utf-8')\n changes.push('Updated component to use useForm hook')\n\n return {\n filePath: form.filePath,\n success: true,\n changes,\n formId,\n }\n}\n\nfunction generateMigratedFormCode(form: DetectedForm, formSlug: string): string {\n // Generate a clean, migrated component\n const componentName = form.componentName || 'MigratedForm'\n\n return `/**\n * ${componentName}\n * \n * Migrated to @uptrade/site-kit\n * Managed form: ${formSlug}\n */\n\n'use client'\n\nimport { useForm } from '@uptrade/site-kit/forms'\n\nexport function ${componentName}({ className }: { className?: string }) {\n const { \n form,\n fields, \n values, \n errors, \n setFieldValue, \n submit, \n isSubmitting,\n isComplete \n } = useForm('${formSlug}')\n\n if (isComplete) {\n return (\n <div className={className}>\n <p className=\"text-green-600\">{form?.successMessage || 'Thanks for your submission!'}</p>\n </div>\n )\n }\n\n return (\n <form \n onSubmit={(e) => { e.preventDefault(); submit() }} \n className={className}\n >\n {fields.map(field => (\n <div key={field.slug} className=\"mb-4\">\n <label className=\"block text-sm font-medium mb-1\">\n {field.label}\n {field.isRequired && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n \n {field.fieldType === 'textarea' ? (\n <textarea\n name={field.slug}\n placeholder={field.placeholder}\n value={String(values[field.slug] || '')}\n onChange={(e) => setFieldValue(field.slug, e.target.value)}\n className=\"w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n rows={4}\n />\n ) : field.fieldType === 'select' && field.options ? (\n <select\n name={field.slug}\n value={String(values[field.slug] || '')}\n onChange={(e) => setFieldValue(field.slug, e.target.value)}\n className=\"w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n >\n <option value=\"\">Select...</option>\n {field.options.map(opt => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n ) : (\n <input\n type={field.fieldType}\n name={field.slug}\n placeholder={field.placeholder}\n value={String(values[field.slug] || '')}\n onChange={(e) => setFieldValue(field.slug, e.target.value)}\n className=\"w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n )}\n \n {errors[field.slug] && (\n <p className=\"mt-1 text-sm text-red-500\">{errors[field.slug]}</p>\n )}\n \n {field.helpText && (\n <p className=\"mt-1 text-xs text-gray-500\">{field.helpText}</p>\n )}\n </div>\n ))}\n \n <button \n type=\"submit\" \n disabled={isSubmitting}\n className=\"w-full py-2 px-4 bg-blue-600 text-white rounded hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isSubmitting ? 'Submitting...' : (form?.submitButtonText || 'Submit')}\n </button>\n </form>\n )\n}\n\nexport default ${componentName}\n`\n}\n\nasync function createFormInUptrade(\n form: DetectedForm,\n slug: string,\n options: MigrationOptions\n): Promise<string> {\n // Call Portal API to create the form\n const response = await fetch('https://api.uptrademedia.com/forms', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${options.apiKey}`,\n },\n body: JSON.stringify({\n projectId: options.projectId,\n slug,\n name: formatName(form.componentName),\n formType: detectFormType(form),\n successMessage: 'Thanks for your submission!',\n submitButtonText: 'Submit',\n fields: form.fields.map((f, i) => ({\n slug: f.name,\n label: formatLabel(f.name),\n fieldType: mapFieldType(f.type),\n placeholder: f.placeholder,\n isRequired: f.required,\n sortOrder: i,\n width: 'full',\n })),\n }),\n })\n\n if (!response.ok) {\n const error = await response.json()\n throw new Error(error.message || 'Failed to create form')\n }\n\n const data = await response.json()\n return data.id\n}\n\n// ============================================\n// Widget Migration\n// ============================================\n\nasync function migrateWidget(\n filePath: string,\n widget: any,\n options: MigrationOptions\n): Promise<MigrationResult> {\n const changes: string[] = []\n\n if (options.dryRun) {\n changes.push(`[DRY RUN] Would remove ${widget.widgetType} script`)\n changes.push('[DRY RUN] Would enable Engage in SiteKitProvider')\n return { filePath, success: true, changes }\n }\n\n const fullPath = path.resolve(process.cwd(), filePath)\n let content = await fs.readFile(fullPath, 'utf-8')\n\n // Remove the widget script based on type\n switch (widget.widgetType) {\n case 'intercom':\n content = content.replace(/<Script[^>]*intercom[^>]*\\/?>(?:<\\/Script>)?/gi, '{/* Intercom replaced with Uptrade Engage */}')\n content = content.replace(/window\\.Intercom\\s*=\\s*[^;]+;/g, '')\n break\n case 'crisp':\n content = content.replace(/<Script[^>]*crisp[^>]*\\/?>(?:<\\/Script>)?/gi, '{/* Crisp replaced with Uptrade Engage */}')\n break\n case 'drift':\n content = content.replace(/<Script[^>]*drift[^>]*\\/?>(?:<\\/Script>)?/gi, '{/* Drift replaced with Uptrade Engage */}')\n break\n }\n\n await fs.writeFile(fullPath, content, 'utf-8')\n changes.push(`Removed ${widget.widgetType} script`)\n changes.push('Enable Engage in SiteKitProvider to add chat widget')\n\n return { filePath, success: true, changes }\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nfunction generateSlug(name: string): string {\n return name\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/form$/i, '')\n .replace(/-+/g, '-')\n .replace(/-$/, '') || 'form'\n}\n\nfunction formatName(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim()\n}\n\nfunction formatLabel(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .replace(/^./, str => str.toUpperCase())\n .trim()\n}\n\nfunction mapFieldType(type: string): string {\n const mapping: Record<string, string> = {\n 'text': 'text',\n 'email': 'email',\n 'tel': 'phone',\n 'phone': 'phone',\n 'number': 'number',\n 'textarea': 'textarea',\n 'select': 'select',\n 'checkbox': 'checkbox',\n 'radio': 'radio',\n 'date': 'date',\n 'file': 'file',\n 'url': 'url',\n 'password': 'text', // Don't use password for managed forms\n }\n return mapping[type] || 'text'\n}\n\nfunction detectFormType(form: DetectedForm): string {\n const name = form.componentName.toLowerCase()\n const fields = form.fields.map(f => f.name.toLowerCase()).join(' ')\n\n if (name.includes('contact') || fields.includes('message')) return 'contact'\n if (name.includes('newsletter') || name.includes('subscribe')) return 'newsletter'\n if (name.includes('quote') || name.includes('estimate')) return 'prospect'\n if (name.includes('support') || name.includes('help')) return 'support'\n if (name.includes('feedback')) return 'feedback'\n\n return 'contact'\n}\n"]}
|
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
require('./chunk-EQCVQC35.js');
|
|
4
|
-
var fs = require('fs/promises');
|
|
5
|
-
var path = require('path');
|
|
6
|
-
|
|
7
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
-
|
|
9
|
-
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
10
|
-
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
11
|
-
|
|
12
|
-
async function migrateFiles(scanResults, options) {
|
|
13
|
-
const results = [];
|
|
14
|
-
for (const form of scanResults.forms) {
|
|
15
|
-
if (form.suggestedAction === "manual") {
|
|
16
|
-
results.push({
|
|
17
|
-
filePath: form.filePath,
|
|
18
|
-
success: false,
|
|
19
|
-
changes: [],
|
|
20
|
-
error: "Form too complex for auto-migration"
|
|
21
|
-
});
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
|
-
try {
|
|
25
|
-
const result = await migrateForm(form, options);
|
|
26
|
-
results.push(result);
|
|
27
|
-
} catch (error) {
|
|
28
|
-
results.push({
|
|
29
|
-
filePath: form.filePath,
|
|
30
|
-
success: false,
|
|
31
|
-
changes: [],
|
|
32
|
-
error: error.message
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
for (const widget of scanResults.widgets) {
|
|
37
|
-
try {
|
|
38
|
-
const result = await migrateWidget(widget.filePath, widget, options);
|
|
39
|
-
results.push(result);
|
|
40
|
-
} catch (error) {
|
|
41
|
-
results.push({
|
|
42
|
-
filePath: widget.filePath,
|
|
43
|
-
success: false,
|
|
44
|
-
changes: [],
|
|
45
|
-
error: error.message
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return results;
|
|
50
|
-
}
|
|
51
|
-
async function migrateForm(form, options) {
|
|
52
|
-
const changes = [];
|
|
53
|
-
const fullPath = path__default.default.resolve(process.cwd(), form.filePath);
|
|
54
|
-
const formSlug = generateSlug(form.componentName);
|
|
55
|
-
const formId = await createFormInUptrade(form, formSlug, options);
|
|
56
|
-
changes.push(`Created managed form: ${formSlug}`);
|
|
57
|
-
if (options.dryRun) {
|
|
58
|
-
changes.push("[DRY RUN] Would update file");
|
|
59
|
-
return { filePath: form.filePath, success: true, changes, formId };
|
|
60
|
-
}
|
|
61
|
-
await fs__default.default.readFile(fullPath, "utf-8");
|
|
62
|
-
const newCode = generateMigratedFormCode(form, formSlug);
|
|
63
|
-
await fs__default.default.writeFile(fullPath, newCode, "utf-8");
|
|
64
|
-
changes.push("Updated component to use useForm hook");
|
|
65
|
-
return {
|
|
66
|
-
filePath: form.filePath,
|
|
67
|
-
success: true,
|
|
68
|
-
changes,
|
|
69
|
-
formId
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
function generateMigratedFormCode(form, formSlug) {
|
|
73
|
-
const componentName = form.componentName || "MigratedForm";
|
|
74
|
-
return `/**
|
|
75
|
-
* ${componentName}
|
|
76
|
-
*
|
|
77
|
-
* Migrated to @uptrade/site-kit
|
|
78
|
-
* Managed form: ${formSlug}
|
|
79
|
-
*/
|
|
80
|
-
|
|
81
|
-
'use client'
|
|
82
|
-
|
|
83
|
-
import { useForm } from '@uptrade/site-kit/forms'
|
|
84
|
-
|
|
85
|
-
export function ${componentName}({ className }: { className?: string }) {
|
|
86
|
-
const {
|
|
87
|
-
form,
|
|
88
|
-
fields,
|
|
89
|
-
values,
|
|
90
|
-
errors,
|
|
91
|
-
setFieldValue,
|
|
92
|
-
submit,
|
|
93
|
-
isSubmitting,
|
|
94
|
-
isComplete
|
|
95
|
-
} = useForm('${formSlug}')
|
|
96
|
-
|
|
97
|
-
if (isComplete) {
|
|
98
|
-
return (
|
|
99
|
-
<div className={className}>
|
|
100
|
-
<p className="text-green-600">{form?.successMessage || 'Thanks for your submission!'}</p>
|
|
101
|
-
</div>
|
|
102
|
-
)
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return (
|
|
106
|
-
<form
|
|
107
|
-
onSubmit={(e) => { e.preventDefault(); submit() }}
|
|
108
|
-
className={className}
|
|
109
|
-
>
|
|
110
|
-
{fields.map(field => (
|
|
111
|
-
<div key={field.slug} className="mb-4">
|
|
112
|
-
<label className="block text-sm font-medium mb-1">
|
|
113
|
-
{field.label}
|
|
114
|
-
{field.isRequired && <span className="text-red-500 ml-1">*</span>}
|
|
115
|
-
</label>
|
|
116
|
-
|
|
117
|
-
{field.fieldType === 'textarea' ? (
|
|
118
|
-
<textarea
|
|
119
|
-
name={field.slug}
|
|
120
|
-
placeholder={field.placeholder}
|
|
121
|
-
value={String(values[field.slug] || '')}
|
|
122
|
-
onChange={(e) => setFieldValue(field.slug, e.target.value)}
|
|
123
|
-
className="w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
124
|
-
rows={4}
|
|
125
|
-
/>
|
|
126
|
-
) : field.fieldType === 'select' && field.options ? (
|
|
127
|
-
<select
|
|
128
|
-
name={field.slug}
|
|
129
|
-
value={String(values[field.slug] || '')}
|
|
130
|
-
onChange={(e) => setFieldValue(field.slug, e.target.value)}
|
|
131
|
-
className="w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
132
|
-
>
|
|
133
|
-
<option value="">Select...</option>
|
|
134
|
-
{field.options.map(opt => (
|
|
135
|
-
<option key={opt.value} value={opt.value}>{opt.label}</option>
|
|
136
|
-
))}
|
|
137
|
-
</select>
|
|
138
|
-
) : (
|
|
139
|
-
<input
|
|
140
|
-
type={field.fieldType}
|
|
141
|
-
name={field.slug}
|
|
142
|
-
placeholder={field.placeholder}
|
|
143
|
-
value={String(values[field.slug] || '')}
|
|
144
|
-
onChange={(e) => setFieldValue(field.slug, e.target.value)}
|
|
145
|
-
className="w-full p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
146
|
-
/>
|
|
147
|
-
)}
|
|
148
|
-
|
|
149
|
-
{errors[field.slug] && (
|
|
150
|
-
<p className="mt-1 text-sm text-red-500">{errors[field.slug]}</p>
|
|
151
|
-
)}
|
|
152
|
-
|
|
153
|
-
{field.helpText && (
|
|
154
|
-
<p className="mt-1 text-xs text-gray-500">{field.helpText}</p>
|
|
155
|
-
)}
|
|
156
|
-
</div>
|
|
157
|
-
))}
|
|
158
|
-
|
|
159
|
-
<button
|
|
160
|
-
type="submit"
|
|
161
|
-
disabled={isSubmitting}
|
|
162
|
-
className="w-full py-2 px-4 bg-blue-600 text-white rounded hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
163
|
-
>
|
|
164
|
-
{isSubmitting ? 'Submitting...' : (form?.submitButtonText || 'Submit')}
|
|
165
|
-
</button>
|
|
166
|
-
</form>
|
|
167
|
-
)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export default ${componentName}
|
|
171
|
-
`;
|
|
172
|
-
}
|
|
173
|
-
async function createFormInUptrade(form, slug, options) {
|
|
174
|
-
const response = await fetch("https://api.uptrademedia.com/forms", {
|
|
175
|
-
method: "POST",
|
|
176
|
-
headers: {
|
|
177
|
-
"Content-Type": "application/json",
|
|
178
|
-
"Authorization": `Bearer ${options.apiKey}`
|
|
179
|
-
},
|
|
180
|
-
body: JSON.stringify({
|
|
181
|
-
projectId: options.projectId,
|
|
182
|
-
slug,
|
|
183
|
-
name: formatName(form.componentName),
|
|
184
|
-
formType: detectFormType(form),
|
|
185
|
-
successMessage: "Thanks for your submission!",
|
|
186
|
-
submitButtonText: "Submit",
|
|
187
|
-
fields: form.fields.map((f, i) => ({
|
|
188
|
-
slug: f.name,
|
|
189
|
-
label: formatLabel(f.name),
|
|
190
|
-
fieldType: mapFieldType(f.type),
|
|
191
|
-
placeholder: f.placeholder,
|
|
192
|
-
isRequired: f.required,
|
|
193
|
-
sortOrder: i,
|
|
194
|
-
width: "full"
|
|
195
|
-
}))
|
|
196
|
-
})
|
|
197
|
-
});
|
|
198
|
-
if (!response.ok) {
|
|
199
|
-
const error = await response.json();
|
|
200
|
-
throw new Error(error.message || "Failed to create form");
|
|
201
|
-
}
|
|
202
|
-
const data = await response.json();
|
|
203
|
-
return data.id;
|
|
204
|
-
}
|
|
205
|
-
async function migrateWidget(filePath, widget, options) {
|
|
206
|
-
const changes = [];
|
|
207
|
-
if (options.dryRun) {
|
|
208
|
-
changes.push(`[DRY RUN] Would remove ${widget.widgetType} script`);
|
|
209
|
-
changes.push("[DRY RUN] Would enable Engage in SiteKitProvider");
|
|
210
|
-
return { filePath, success: true, changes };
|
|
211
|
-
}
|
|
212
|
-
const fullPath = path__default.default.resolve(process.cwd(), filePath);
|
|
213
|
-
let content = await fs__default.default.readFile(fullPath, "utf-8");
|
|
214
|
-
switch (widget.widgetType) {
|
|
215
|
-
case "intercom":
|
|
216
|
-
content = content.replace(/<Script[^>]*intercom[^>]*\/?>(?:<\/Script>)?/gi, "{/* Intercom replaced with Uptrade Engage */}");
|
|
217
|
-
content = content.replace(/window\.Intercom\s*=\s*[^;]+;/g, "");
|
|
218
|
-
break;
|
|
219
|
-
case "crisp":
|
|
220
|
-
content = content.replace(/<Script[^>]*crisp[^>]*\/?>(?:<\/Script>)?/gi, "{/* Crisp replaced with Uptrade Engage */}");
|
|
221
|
-
break;
|
|
222
|
-
case "drift":
|
|
223
|
-
content = content.replace(/<Script[^>]*drift[^>]*\/?>(?:<\/Script>)?/gi, "{/* Drift replaced with Uptrade Engage */}");
|
|
224
|
-
break;
|
|
225
|
-
}
|
|
226
|
-
await fs__default.default.writeFile(fullPath, content, "utf-8");
|
|
227
|
-
changes.push(`Removed ${widget.widgetType} script`);
|
|
228
|
-
changes.push("Enable Engage in SiteKitProvider to add chat widget");
|
|
229
|
-
return { filePath, success: true, changes };
|
|
230
|
-
}
|
|
231
|
-
function generateSlug(name) {
|
|
232
|
-
return name.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "").replace(/form$/i, "").replace(/-+/g, "-").replace(/-$/, "") || "form";
|
|
233
|
-
}
|
|
234
|
-
function formatName(name) {
|
|
235
|
-
return name.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase()).trim();
|
|
236
|
-
}
|
|
237
|
-
function formatLabel(name) {
|
|
238
|
-
return name.replace(/([A-Z])/g, " $1").replace(/_/g, " ").replace(/^./, (str) => str.toUpperCase()).trim();
|
|
239
|
-
}
|
|
240
|
-
function mapFieldType(type) {
|
|
241
|
-
const mapping = {
|
|
242
|
-
"text": "text",
|
|
243
|
-
"email": "email",
|
|
244
|
-
"tel": "phone",
|
|
245
|
-
"phone": "phone",
|
|
246
|
-
"number": "number",
|
|
247
|
-
"textarea": "textarea",
|
|
248
|
-
"select": "select",
|
|
249
|
-
"checkbox": "checkbox",
|
|
250
|
-
"radio": "radio",
|
|
251
|
-
"date": "date",
|
|
252
|
-
"file": "file",
|
|
253
|
-
"url": "url",
|
|
254
|
-
"password": "text"
|
|
255
|
-
// Don't use password for managed forms
|
|
256
|
-
};
|
|
257
|
-
return mapping[type] || "text";
|
|
258
|
-
}
|
|
259
|
-
function detectFormType(form) {
|
|
260
|
-
const name = form.componentName.toLowerCase();
|
|
261
|
-
const fields = form.fields.map((f) => f.name.toLowerCase()).join(" ");
|
|
262
|
-
if (name.includes("contact") || fields.includes("message")) return "contact";
|
|
263
|
-
if (name.includes("newsletter") || name.includes("subscribe")) return "newsletter";
|
|
264
|
-
if (name.includes("quote") || name.includes("estimate")) return "prospect";
|
|
265
|
-
if (name.includes("support") || name.includes("help")) return "support";
|
|
266
|
-
if (name.includes("feedback")) return "feedback";
|
|
267
|
-
return "contact";
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
exports.migrateFiles = migrateFiles;
|
|
271
|
-
//# sourceMappingURL=migrator-XKM7YQCY.js.map
|
|
272
|
-
//# sourceMappingURL=migrator-XKM7YQCY.js.map
|