@sentry/wizard 3.12.0 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/lib/Steps/ChooseIntegration.js +1 -0
  3. package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
  4. package/dist/package.json +2 -2
  5. package/dist/src/android/android-wizard.js +8 -8
  6. package/dist/src/android/android-wizard.js.map +1 -1
  7. package/dist/src/apple/apple-wizard.js +1 -1
  8. package/dist/src/apple/apple-wizard.js.map +1 -1
  9. package/dist/src/nextjs/nextjs-wizard.d.ts +1 -0
  10. package/dist/src/nextjs/nextjs-wizard.js +257 -163
  11. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  12. package/dist/src/nextjs/templates.d.ts +1 -1
  13. package/dist/src/nextjs/templates.js +2 -2
  14. package/dist/src/nextjs/templates.js.map +1 -1
  15. package/dist/src/nextjs/utils.d.ts +1 -0
  16. package/dist/src/nextjs/utils.js +25 -0
  17. package/dist/src/nextjs/utils.js.map +1 -0
  18. package/dist/src/remix/remix-wizard.js +13 -11
  19. package/dist/src/remix/remix-wizard.js.map +1 -1
  20. package/dist/src/remix/sdk-setup.d.ts +5 -1
  21. package/dist/src/remix/sdk-setup.js +13 -6
  22. package/dist/src/remix/sdk-setup.js.map +1 -1
  23. package/dist/src/sourcemaps/sourcemaps-wizard.js +1 -1
  24. package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
  25. package/dist/src/sourcemaps/tools/sentry-cli.d.ts +9 -0
  26. package/dist/src/sourcemaps/tools/sentry-cli.js +26 -22
  27. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  28. package/dist/src/sourcemaps/tools/tsc.d.ts +6 -0
  29. package/dist/src/sourcemaps/tools/tsc.js +98 -17
  30. package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
  31. package/dist/src/sourcemaps/tools/vite.js +3 -13
  32. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  33. package/dist/src/sourcemaps/tools/webpack.js +3 -13
  34. package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
  35. package/dist/src/sveltekit/sdk-setup.js +122 -48
  36. package/dist/src/sveltekit/sdk-setup.js.map +1 -1
  37. package/dist/src/sveltekit/sveltekit-wizard.d.ts +1 -0
  38. package/dist/src/sveltekit/sveltekit-wizard.js +113 -42
  39. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  40. package/dist/src/sveltekit/utils.d.ts +2 -0
  41. package/dist/src/sveltekit/utils.js +48 -0
  42. package/dist/src/sveltekit/utils.js.map +1 -0
  43. package/dist/src/telemetry.d.ts +1 -0
  44. package/dist/src/telemetry.js +27 -12
  45. package/dist/src/telemetry.js.map +1 -1
  46. package/dist/src/utils/ast-utils.d.ts +70 -0
  47. package/dist/src/utils/ast-utils.js +152 -1
  48. package/dist/src/utils/ast-utils.js.map +1 -1
  49. package/dist/src/utils/clack-utils.d.ts +49 -7
  50. package/dist/src/utils/clack-utils.js +238 -168
  51. package/dist/src/utils/clack-utils.js.map +1 -1
  52. package/dist/src/utils/package-manager.d.ts +5 -0
  53. package/dist/src/utils/package-manager.js +23 -14
  54. package/dist/src/utils/package-manager.js.map +1 -1
  55. package/dist/test/sourcemaps/tools/sentry-cli.test.d.ts +1 -0
  56. package/dist/test/sourcemaps/tools/sentry-cli.test.js +112 -0
  57. package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -0
  58. package/dist/test/sourcemaps/tools/tsc.test.d.ts +1 -0
  59. package/dist/test/sourcemaps/tools/tsc.test.js +121 -0
  60. package/dist/test/sourcemaps/tools/tsc.test.js.map +1 -0
  61. package/dist/test/utils/ast-utils.test.js +157 -26
  62. package/dist/test/utils/ast-utils.test.js.map +1 -1
  63. package/lib/Steps/ChooseIntegration.ts +1 -0
  64. package/package.json +2 -2
  65. package/src/android/android-wizard.ts +12 -10
  66. package/src/apple/apple-wizard.ts +2 -2
  67. package/src/nextjs/nextjs-wizard.ts +277 -198
  68. package/src/nextjs/templates.ts +3 -2
  69. package/src/nextjs/utils.ts +21 -0
  70. package/src/remix/remix-wizard.ts +15 -20
  71. package/src/remix/sdk-setup.ts +20 -5
  72. package/src/sourcemaps/sourcemaps-wizard.ts +2 -2
  73. package/src/sourcemaps/tools/sentry-cli.ts +16 -9
  74. package/src/sourcemaps/tools/tsc.ts +133 -28
  75. package/src/sourcemaps/tools/vite.ts +15 -39
  76. package/src/sourcemaps/tools/webpack.ts +16 -39
  77. package/src/sveltekit/sdk-setup.ts +109 -37
  78. package/src/sveltekit/sveltekit-wizard.ts +86 -21
  79. package/src/sveltekit/utils.ts +50 -0
  80. package/src/telemetry.ts +22 -11
  81. package/src/utils/ast-utils.ts +180 -0
  82. package/src/utils/clack-utils.ts +238 -149
  83. package/src/utils/package-manager.ts +24 -12
  84. package/test/sourcemaps/tools/sentry-cli.test.ts +51 -0
  85. package/test/sourcemaps/tools/tsc.test.ts +181 -0
  86. package/test/utils/ast-utils.test.ts +233 -32
@@ -1 +1 @@
1
- {"version":3,"file":"webpack.js","sourceRoot":"","sources":["../../../../src/sourcemaps/tools/webpack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA6B;AAC7B,qCAAyB;AAEzB,yEAAyE;AACzE,oDAAwC;AACxC,gDAA0B;AAE1B,6CAAiC;AAIjC,mDAAuC;AAEvC,uDAQiC;AACjC,yDAA+D;AAO/D,mDAAmE;AACnE,2CAA0C;AAE1C,IAAM,cAAc,GAAG,UACrB,OAAgD,EAChD,MAAe;IAEf,IAAM,aAAa,GACjB,oEAAoE,CAAC;IACvE,IAAM,2BAA2B,GAC/B,mEAAmE,CAAC;IACtE,IAAM,8BAA8B,GAAG,+FAE3B,OAAO,CAAC,OAAO,mCACX,OAAO,CAAC,WAAW,gBACjC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAiB,OAAO,CAAC,GAAG,QAAI,CAAC,CAAC,CAAC,EAAE,aAEvD,CAAC;IAEN,IAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IAC7E,IAAM,wBAAwB,GAAG,MAAM;QACrC,CAAC,CAAC,eAAK,CAAC,WAAW,CAAC,2BAA2B,CAAC;QAChD,CAAC,CAAC,2BAA2B,CAAC;IAChC,IAAM,2BAA2B,GAAG,MAAM;QACxC,CAAC,CAAC,eAAK,CAAC,WAAW,CAAC,8BAA8B,CAAC;QACnD,CAAC,CAAC,8BAA8B,CAAC;IAEnC,IAAM,IAAI,GAAG,uBAAuB,CAClC,UAAU,EACV,wBAAwB,EACxB,2BAA2B,CAC5B,CAAC;IAEF,OAAO,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC,CAAC;AAEF,IAAM,uBAAuB,GAAG,UAC9B,UAAkB,EAClB,wBAAgC,EAChC,2BAAmC,IAChC,OAAA,UAAG,UAAU,+DAId,wBAAwB,gGAGtB,2BAA2B,iBAGhC,EAVI,CAUJ,CAAC;AAEK,IAAM,sBAAsB,GACjC,UAAO,OAAO;;;;;;;gBACN,KAAA,4BAAc,CAAA;;oBAClB,WAAW,EAAE,wBAAwB;;gBACnB,KAAA,kCAAmB,CAAA;sBACnC,wBAAwB;gBACxB,qBAAM,IAAA,+BAAiB,GAAE,EAAA;oBAJ7B,qBAAM,mBAEJ,mBAAgB,GAAE,4BAEhB,SAAyB,GAC1B;6BACD,EAAA;;gBANF,SAME,CAAC;4BAGD,IAAA,oBAAQ,EAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;;;oBACtD,qBAAM,IAAA,kCAAoB,EAAC,SAAS,EAAE,mBAAmB,CAAC,EAAA;;gBAA3D,KAAA,CAAC,SAA0D,CAAC,CAAA;;;gBAFxD,iBAAiB,KAEuC;gBAE1D,iBAAiB,GAAG,KAAK,CAAC;qBAC1B,iBAAiB,EAAjB,wBAAiB;gBACC,qBAAM,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAA;;gBAAzE,iBAAiB,GAAG,SAAqD,CAAC;;oBAEtD,qBAAM,IAAA,iCAAmB,EAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,EAC7C,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,EAC9B,oEAAoE,CACrE,EAAA;;gBAJD,iBAAiB,GAAG,SAInB,CAAC;gBACF,MAAM,CAAC,MAAM,CACX,oBAAoB,EACpB,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CACvC,CAAC;;;qBAGA,iBAAiB,EAAjB,yBAAiB;gBACnB,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,oCACE,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,8EACiC,CAC5E,CAAC;gBAEF,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;;;gBAEpC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACjC,qBAAM,IAAA,uCAAyB,EAC7B,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,mBAAmB,CAAC,EACvD,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAC9B,EAAA;;gBAHD,SAGC,CAAC;;qBAGJ,qBAAM,IAAA,4CAA8B,EAAC,OAAO,CAAC,SAAS,CAAC,EAAA;;gBAAvD,SAAuD,CAAC;;;;KACzD,CAAC;AA9CS,QAAA,sBAAsB,0BA8C/B;AAEJ;;;GAGG;AACH,SAAsB,mBAAmB,CACvC,iBAAyB,EACzB,OAAgD;;;;;;;oBAGxB,qBAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE;4BAClE,QAAQ,EAAE,OAAO;yBAClB,CAAC,EAAA;;oBAFI,aAAa,GAAG,SAEpB;oBAEI,oBAAoB,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;oBAIpE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAoB,CAAC;oBAEtE,qBAAM,yBAAyB,CAAC,OAAO,EAAE,oBAAoB,CAAC,EAAA;;oBAApE,IAAI,CAAC,CAAC,SAA8D,CAAC,EAAE;wBACrE,iDAAiD;wBACjD,sBAAO,KAAK,EAAC;qBACd;oBAEK,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;oBAChD,IAAI,CAAC,UAAU,EAAE;wBACf,4GAA4G;wBAC5G,IAAA,aAAK,EAAC,mDAA4C,iBAAiB,MAAG,CAAC,CAAC;wBACxE,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC;wBAChE,sBAAO,KAAK,EAAC;qBACd;oBAEK,YAAY,GAAG,sBAAsB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAEjE,IAAI,CAAC,YAAY,EAAE;wBACjB,IAAA,aAAK,EAAC,yCAAkC,iBAAiB,CAAE,CAAC,CAAC;wBAC7D,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC;wBAChE,sBAAO,KAAK,EAAC;qBACd;oBAEK,iBAAiB,GAAG,0BAA0B,CAAC,YAAY,CAAC,CAAC;oBAEnE,IAAI,iBAAiB,EAAE;wBACrB,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,2CAAoC,oBAAoB,MAAG,CAC5D,CAAC;qBACH;yBAAM;wBACL,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,oDAA6C,oBAAoB,2CAAwC,CAC1G,CAAC;wBACF,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;wBACvD,sBAAO,KAAK,EAAC;qBACd;oBAEK,WAAW,GAAG,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;oBAC3E,IAAI,WAAW,EAAE;wBACf,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,yCAAkC,oBAAoB,MAAG,CAC1D,CAAC;qBACH;yBAAM;wBACL,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,gDAAyC,oBAAoB,4CAAyC,CACvG,CAAC;wBACF,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;wBACvD,sBAAO,KAAK,EAAC;qBACd;oBAEK,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;oBACxC,qBAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAA;;oBAApD,SAAoD,CAAC;oBAErD,sBAAO,IAAI,EAAC;;;oBAEZ,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;oBACvD,IAAA,aAAK,EAAC,GAAC,CAAC,CAAC;oBACT,sBAAO,KAAK,EAAC;;;;;CAEhB;AAxED,kDAwEC;AAED,SAAe,yBAAyB,CACtC,OAAkB,EAClB,oBAA4B;;;;;;yBAExB,IAAA,4BAAgB,EAAC,OAAO,CAAC,EAAzB,wBAAyB;oBACJ,qBAAM,IAAA,8BAAgB,EAC3C,KAAK,CAAC,MAAM,CAAC;4BACX,OAAO,EAAE,qBAAc,oBAAoB,+EAA4E;4BACvH,OAAO,EAAE;gCACP;oCACE,KAAK,EAAE,oCAAoC;oCAC3C,KAAK,EAAE,IAAI;iCACZ;gCACD;oCACE,KAAK,EAAE,qDAAqD;oCAC5D,KAAK,EAAE,KAAK;iCACb;6BACF;4BACD,YAAY,EAAE,IAAI;yBACnB,CAAC,CACH,EAAA;;oBAfK,cAAc,GAAG,SAetB;oBAED,IAAI,CAAC,cAAc,EAAE;wBACnB,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;wBAC3D,sBAAO,KAAK,EAAC;qBACd;;wBAGH,sBAAO,IAAI,EAAC;;;;CACb;AAED,SAAS,sBAAsB,CAC7B,OAAkB,EAClB,SAA6B,EAC7B,OAAgD;IAEhD,IAAM,CAAC,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAEhD,IAAM,gBAAgB,GAAG,CAAC,CAAC,cAAc,CACvC,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,EACnC;QACE,CAAC,CAAC,gBAAgB;YAChB,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,EACzB,CAAC,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAC9C;YACD,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACvE,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EACvB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CACrC;WACE,CAAC,OAAO,CAAC,UAAU;YACpB,CAAC,CAAC;gBACE,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EACnB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAC7B;aACF;YACH,CAAC,CAAC,EAAE,CAAC,QACP;KACH,CACF,CAAC;IAEF,IAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAC3C,UAAC,CAAC;QACA,OAAA,CAAC,CAAC,IAAI,KAAK,UAAU;YACrB,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY;YAC3B,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS;IAFxB,CAEwB,CAC3B,CAAC;IAEF,IAAI,WAAW,EAAE;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE;YAChD,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACnD;aAAM;YACL,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;SAC3D;QACD,OAAO,IAAI,CAAC;KACb;IAED,SAAS,CAAC,UAAU,CAAC,IAAI,CACvB,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EACvB,CAAC,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC,CAAC,CACtC,CACF,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAkB;IACtD,IAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;IAEhC,IAAM,uBAAuB,GAAG,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE;QAC7D,CAAC,CAAC,kBAAkB,CAClB,CAAC,CAAC,aAAa,CAAC;YACd,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;gBACpB,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC;gBACxC,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC;gBAC1C,SAAS,EAAE,IAAI;aAChB,CAAC;SACH,CAAC,EACF,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YACxC,CAAC,CAAC,aAAa,CAAC,wBAAwB,CAAC;SAC1C,CAAC,CACH;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC9C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,0BAA0B,CAAC,SAA6B;;IAC/D,IAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;IAEhC,IAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAC3C,UAAC,CAAC;QACA,OAAA,CAAC,CAAC,IAAI,KAAK,UAAU;YACrB,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY;YAC3B,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS;IAFxB,CAEwB,CAC3B,CAAC;IAEF,IAAI,WAAW,EAAE;QACf,sDAAsD;QACtD,6DAA6D;QAC7D,mFAAmF;QACnF,aAAa;QACb,wEAAwE;QACxE,iDAAiD;QACjD,IACE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;YACnC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC;aAC7C,MAAA,WAAW,CAAC,KAAK,CAAC,KAAK,0CAAE,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA,EACzD;YACA,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;SAC1D;aAAM;YACL,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;SACnD;QACD,OAAO,IAAI,CAAC;KACb;IAED,SAAS,CAAC,UAAU,CAAC,IAAI,CACvB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CACzE,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAC7B,aAAqC,EACrC,OAAkB;;IAElB,IAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC;IAChC,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,EAAE;QACnC,OAAO,GAAG,CAAC;KACZ;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE;QAC7B,IAAM,UAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;QAE1B,IAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CACzC,UAAC,CAAC;YACA,OAAA,CAAC,CAAC,IAAI,KAAK,qBAAqB;gBAChC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CACnB,UAAC,CAAC;oBACA,OAAA,CAAC,CAAC,IAAI,KAAK,oBAAoB;wBAC/B,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY;wBAC1B,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,UAAQ;gBAFtB,CAEsB,CACzB;QAND,CAMC,CACJ,CAAC;QAEF,IAAM,UAAU,GAAG,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,YAAY,CAAC,IAAI,CACrD,UAAC,CAAC;YACA,OAAA,CAAC,CAAC,IAAI,KAAK,oBAAoB;gBAC/B,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY;gBAC1B,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,UAAQ;QAFtB,CAEsB,CACzB,CAAC;QAEF,OAAO,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,0CAAE,IAAI,MAAK,kBAAkB;YAClD,CAAC,CAAC,UAAU,CAAC,IAAI;YACjB,CAAC,CAAC,SAAS,CAAC;KACf;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAAkB;IAElB,IAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CACrC,UAAC,CAAC;QACA,OAAA,CAAC,CAAC,IAAI,KAAK,qBAAqB;YAChC,CAAC,CAAC,UAAU,CAAC,IAAI,KAAK,sBAAsB;YAC5C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,kBAAkB;YAC7C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;YAC9C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC1C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;YAChD,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;IAN7C,CAM6C,CAChD,CAAC;IACF,OAAO,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,UAAoC,CAAC;AAC7D,CAAC","sourcesContent":["import * as path from 'path';\nimport * as fs from 'fs';\n\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nimport * as recast from 'recast';\nimport x = recast.types;\nimport t = x.namedTypes;\n\nimport * as Sentry from '@sentry/node';\n\nimport {\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askForToolConfigPath,\n createNewConfigFile,\n getPackageDotJson,\n installPackage,\n showCopyPasteInstructions,\n} from '../../utils/clack-utils';\nimport { hasPackageInstalled } from '../../utils/package-json';\n\nimport {\n SourceMapUploadToolConfigurationFunction,\n SourceMapUploadToolConfigurationOptions,\n} from './types';\n\nimport { findFile, hasSentryContent } from '../../utils/ast-utils';\nimport { debug } from '../../utils/debug';\n\nconst getCodeSnippet = (\n options: SourceMapUploadToolConfigurationOptions,\n colors: boolean,\n) => {\n const rawImportStmt =\n 'const { sentryWebpackPlugin } = require(\"@sentry/webpack-plugin\");';\n const rawGenerateSourceMapsOption =\n 'devtool: \"source-map\", // Source map generation must be turned on';\n const rawSentryWebpackPluginFunction = `sentryWebpackPlugin({\n authToken: process.env.SENTRY_AUTH_TOKEN,\n org: \"${options.orgSlug}\",\n project: \"${options.projectSlug}\",${\n options.selfHosted ? `\\n url: \"${options.url}\",` : ''\n }\n })`;\n\n const importStmt = colors ? chalk.greenBright(rawImportStmt) : rawImportStmt;\n const generateSourceMapsOption = colors\n ? chalk.greenBright(rawGenerateSourceMapsOption)\n : rawGenerateSourceMapsOption;\n const sentryWebpackPluginFunction = colors\n ? chalk.greenBright(rawSentryWebpackPluginFunction)\n : rawSentryWebpackPluginFunction;\n\n const code = getWebpackConfigContent(\n importStmt,\n generateSourceMapsOption,\n sentryWebpackPluginFunction,\n );\n\n return colors ? chalk.gray(code) : code;\n};\n\nconst getWebpackConfigContent = (\n importStmt: string,\n generateSourceMapsOption: string,\n sentryWebpackPluginFunction: string,\n) => `${importStmt}\n\nmodule.exports = {\n // ... other options\n ${generateSourceMapsOption},\n plugins: [\n // Put the Sentry Webpack plugin after all other plugins\n ${sentryWebpackPluginFunction},\n ],\n}\n`;\n\nexport const configureWebPackPlugin: SourceMapUploadToolConfigurationFunction =\n async (options) => {\n await installPackage({\n packageName: '@sentry/webpack-plugin',\n alreadyInstalled: hasPackageInstalled(\n '@sentry/webpack-plugin',\n await getPackageDotJson(),\n ),\n });\n\n const webpackConfigPath =\n findFile(path.resolve(process.cwd(), 'webpack.config')) ??\n (await askForToolConfigPath('Webpack', 'webpack.config.js'));\n\n let successfullyAdded = false;\n if (webpackConfigPath) {\n successfullyAdded = await modifyWebpackConfig(webpackConfigPath, options);\n } else {\n successfullyAdded = await createNewConfigFile(\n path.join(process.cwd(), 'webpack.config.js'),\n getCodeSnippet(options, false),\n 'More information about Webpack configs: https://vitejs.dev/config/',\n );\n Sentry.setTag(\n 'created-new-config',\n successfullyAdded ? 'success' : 'fail',\n );\n }\n\n if (successfullyAdded) {\n clack.log.info(\n `We recommend checking the ${\n webpackConfigPath ? 'modified' : 'added'\n } file after the wizard finished to ensure it works with your build setup.`,\n );\n\n Sentry.setTag('ast-mod', 'success');\n } else {\n Sentry.setTag('ast-mod', 'fail');\n await showCopyPasteInstructions(\n path.basename(webpackConfigPath || 'webpack.config.js'),\n getCodeSnippet(options, true),\n );\n }\n\n await addDotEnvSentryBuildPluginFile(options.authToken);\n };\n\n/**\n * Modifies a webpack config file to enable source map generation and add the Sentry webpack plugin\n * exported only for testing\n */\nexport async function modifyWebpackConfig(\n webpackConfigPath: string,\n options: SourceMapUploadToolConfigurationOptions,\n): Promise<boolean> {\n try {\n const webpackConfig = await fs.promises.readFile(webpackConfigPath, {\n encoding: 'utf-8',\n });\n\n const prettyConfigFilename = chalk.cyan(path.basename(webpackConfigPath));\n\n // no idea why recast returns any here, this is dumb :/\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const program = recast.parse(webpackConfig.toString()).program as t.Program;\n\n if (!(await shouldModifyWebpackConfig(program, prettyConfigFilename))) {\n // Sentry tag is set in shouldModifyWebpackConfig\n return false;\n }\n\n const exportStmt = getCjsModuleExports(program);\n if (!exportStmt) {\n // We only care about CJS at the moment since it's probably the most widely used format for webpack configs.\n debug(`Could not find module.exports = {...} in ${webpackConfigPath}.`);\n Sentry.setTag('ast-mod-fail-reason', 'config-object-not-found');\n return false;\n }\n\n const configObject = getWebpackConfigObject(exportStmt, program);\n\n if (!configObject) {\n debug(`Couldn't find config object in ${webpackConfigPath}`);\n Sentry.setTag('ast-mod-fail-reason', 'config-object-not-found');\n return false;\n }\n\n const enabledSourcemaps = enableSourcemapsGeneration(configObject);\n\n if (enabledSourcemaps) {\n clack.log.success(\n `Enabled source map generation in ${prettyConfigFilename}.`,\n );\n } else {\n clack.log.warn(\n `Couldn't enable source maps generation in ${prettyConfigFilename} Please follow the instructions below.`,\n );\n Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');\n return false;\n }\n\n const addedPlugin = addSentryWebpackPlugin(program, configObject, options);\n if (addedPlugin) {\n clack.log.success(\n `Added Sentry webpack plugin to ${prettyConfigFilename}.`,\n );\n } else {\n clack.log.warn(\n `Couldn't add Sentry webpack plugin to ${prettyConfigFilename}. Please follow the instructions below.`,\n );\n Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');\n return false;\n }\n\n const code = recast.print(program).code;\n await fs.promises.writeFile(webpackConfigPath, code);\n\n return true;\n } catch (e) {\n Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');\n debug(e);\n return false;\n }\n}\n\nasync function shouldModifyWebpackConfig(\n program: t.Program,\n prettyConfigFilename: string,\n) {\n if (hasSentryContent(program)) {\n const shouldContinue = await abortIfCancelled(\n clack.select({\n message: `Seems like ${prettyConfigFilename} already contains Sentry-related code. Should the wizard modify it anyway?`,\n options: [\n {\n label: 'Yes, add the Sentry Webpack plugin',\n value: true,\n },\n {\n label: 'No, show me instructions to manually add the plugin',\n value: false,\n },\n ],\n initialValue: true,\n }),\n );\n\n if (!shouldContinue) {\n Sentry.setTag('ast-mod-fail-reason', 'has-sentry-content');\n return false;\n }\n }\n\n return true;\n}\n\nfunction addSentryWebpackPlugin(\n program: t.Program,\n configObj: t.ObjectExpression,\n options: SourceMapUploadToolConfigurationOptions,\n) {\n const b = addSentryWebpackPluginImport(program);\n\n const sentryPluginCall = b.callExpression(\n b.identifier('sentryWebpackPlugin'),\n [\n b.objectExpression([\n b.objectProperty(\n b.identifier('authToken'),\n b.identifier('process.env.SENTRY_AUTH_TOKEN'),\n ),\n b.objectProperty(b.identifier('org'), b.stringLiteral(options.orgSlug)),\n b.objectProperty(\n b.identifier('project'),\n b.stringLiteral(options.projectSlug),\n ),\n ...(options.selfHosted\n ? [\n b.objectProperty(\n b.identifier('url'),\n b.stringLiteral(options.url),\n ),\n ]\n : []),\n ]),\n ],\n );\n\n const pluginsProp = configObj.properties.find(\n (p): p is t.Property =>\n p.type === 'Property' &&\n p.key.type === 'Identifier' &&\n p.key.name === 'plugins',\n );\n\n if (pluginsProp) {\n if (pluginsProp.value.type === 'ArrayExpression') {\n pluginsProp.value.elements.push(sentryPluginCall);\n } else {\n pluginsProp.value = b.arrayExpression([sentryPluginCall]);\n }\n return true;\n }\n\n configObj.properties.push(\n b.objectProperty(\n b.identifier('plugins'),\n b.arrayExpression([sentryPluginCall]),\n ),\n );\n\n return true;\n}\n\nfunction addSentryWebpackPluginImport(program: t.Program) {\n const b = recast.types.builders;\n\n const sentryPluginRequireStmt = b.variableDeclaration('const', [\n b.variableDeclarator(\n b.objectPattern([\n b.objectProperty.from({\n key: b.identifier('sentryWebpackPlugin'),\n value: b.identifier('sentryWebpackPlugin'),\n shorthand: true,\n }),\n ]),\n b.callExpression(b.identifier('require'), [\n b.stringLiteral('@sentry/webpack-plugin'),\n ]),\n ),\n ]);\n\n program.body.unshift(sentryPluginRequireStmt);\n return b;\n}\n\nfunction enableSourcemapsGeneration(configObj: t.ObjectExpression): boolean {\n const b = recast.types.builders;\n\n const devtoolProp = configObj.properties.find(\n (p): p is t.Property =>\n p.type === 'Property' &&\n p.key.type === 'Identifier' &&\n p.key.name === 'devtool',\n );\n\n if (devtoolProp) {\n // devtool can have quite a lot of source maps values.\n // see: https://webpack.js.org/configuration/devtool/#devtool\n // For Sentry to work best, we should set it to \"source-map\" or \"hidden-source-map\"\n // Heuristic:\n // - all values that contain \"hidden\" will be set to \"hidden-source-map\"\n // - all other values will be set to \"source-map\"\n if (\n (devtoolProp.value.type === 'Literal' ||\n devtoolProp.value.type === 'StringLiteral') &&\n devtoolProp.value.value?.toString().startsWith('hidden-')\n ) {\n devtoolProp.value = b.stringLiteral('hidden-source-map');\n } else {\n devtoolProp.value = b.stringLiteral('source-map');\n }\n return true;\n }\n\n configObj.properties.push(\n b.objectProperty(b.identifier('devtool'), b.stringLiteral('source-map')),\n );\n\n return true;\n}\n\nfunction getWebpackConfigObject(\n moduleExports: t.AssignmentExpression,\n program: t.Program,\n): t.ObjectExpression | undefined {\n const rhs = moduleExports.right;\n if (rhs.type === 'ObjectExpression') {\n return rhs;\n }\n if (rhs.type === 'Identifier') {\n const configId = rhs.name;\n\n const configDeclaration = program.body.find(\n (s): s is t.VariableDeclaration =>\n s.type === 'VariableDeclaration' &&\n !!s.declarations.find(\n (d) =>\n d.type === 'VariableDeclarator' &&\n d.id.type === 'Identifier' &&\n d.id.name === configId,\n ),\n );\n\n const declarator = configDeclaration?.declarations.find(\n (d): d is t.VariableDeclarator =>\n d.type === 'VariableDeclarator' &&\n d.id.type === 'Identifier' &&\n d.id.name === configId,\n );\n\n return declarator?.init?.type === 'ObjectExpression'\n ? declarator.init\n : undefined;\n }\n\n return undefined;\n}\n\nfunction getCjsModuleExports(\n program: t.Program,\n): t.AssignmentExpression | undefined {\n const moduleExports = program.body.find(\n (s): s is t.ExpressionStatement =>\n s.type === 'ExpressionStatement' &&\n s.expression.type === 'AssignmentExpression' &&\n s.expression.left.type === 'MemberExpression' &&\n s.expression.left.object.type === 'Identifier' &&\n s.expression.left.object.name === 'module' &&\n s.expression.left.property.type === 'Identifier' &&\n s.expression.left.property.name === 'exports',\n );\n return moduleExports?.expression as t.AssignmentExpression;\n}\n"]}
1
+ {"version":3,"file":"webpack.js","sourceRoot":"","sources":["../../../../src/sourcemaps/tools/webpack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA6B;AAC7B,qCAAyB;AAEzB,yEAAyE;AACzE,oDAAwC;AACxC,gDAA0B;AAE1B,6CAAiC;AAIjC,mDAAuC;AAEvC,uDASiC;AACjC,yDAA+D;AAO/D,mDAAmE;AACnE,2CAA0C;AAE1C,IAAM,cAAc,GAAG,UACrB,OAAgD,EAChD,MAAe;IAEf,OAAA,IAAA,6BAAe,EAAC,MAAM,EAAE,UAAC,SAAS,EAAE,IAAI;QACtC,OAAA,SAAS,CAAC,UAAG,IAAI,CACf,oEAAoE,CACrE,+DAID,IAAI,CAAC,mEAAmE,CAAC,+FAGvE,IAAI,CAAC,+FAEG,OAAO,CAAC,OAAO,mCACX,OAAO,CAAC,WAAW,gBAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAiB,OAAO,CAAC,GAAG,QAAI,CAAC,CAAC,CAAC,EAAE,cAExD,CAAC,cAEP,CAAC;IAjBC,CAiBD,CACA;AAnBD,CAmBC,CAAC;AAEG,IAAM,sBAAsB,GACjC,UAAO,OAAO;;;;;;;gBACN,KAAA,4BAAc,CAAA;;oBAClB,WAAW,EAAE,wBAAwB;;gBACnB,KAAA,kCAAmB,CAAA;sBACnC,wBAAwB;gBACxB,qBAAM,IAAA,+BAAiB,GAAE,EAAA;oBAJ7B,qBAAM,mBAEJ,mBAAgB,GAAE,4BAEhB,SAAyB,GAC1B;6BACD,EAAA;;gBANF,SAME,CAAC;4BAGD,IAAA,oBAAQ,EAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;;;oBACtD,qBAAM,IAAA,kCAAoB,EAAC,SAAS,EAAE,mBAAmB,CAAC,EAAA;;gBAA3D,KAAA,CAAC,SAA0D,CAAC,CAAA;;;gBAFxD,iBAAiB,KAEuC;gBAE1D,iBAAiB,GAAG,KAAK,CAAC;qBAC1B,iBAAiB,EAAjB,wBAAiB;gBACC,qBAAM,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAA;;gBAAzE,iBAAiB,GAAG,SAAqD,CAAC;;oBAEtD,qBAAM,IAAA,iCAAmB,EAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,EAC7C,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,EAC9B,oEAAoE,CACrE,EAAA;;gBAJD,iBAAiB,GAAG,SAInB,CAAC;gBACF,MAAM,CAAC,MAAM,CACX,oBAAoB,EACpB,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CACvC,CAAC;;;qBAGA,iBAAiB,EAAjB,yBAAiB;gBACnB,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,oCACE,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,8EACiC,CAC5E,CAAC;gBAEF,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;;;gBAEpC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACjC,qBAAM,IAAA,uCAAyB,EAC7B,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,mBAAmB,CAAC,EACvD,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAC9B,EAAA;;gBAHD,SAGC,CAAC;;qBAGJ,qBAAM,IAAA,4CAA8B,EAAC,OAAO,CAAC,SAAS,CAAC,EAAA;;gBAAvD,SAAuD,CAAC;;;;KACzD,CAAC;AA9CS,QAAA,sBAAsB,0BA8C/B;AAEJ;;;GAGG;AACH,SAAsB,mBAAmB,CACvC,iBAAyB,EACzB,OAAgD;;;;;;;oBAGxB,qBAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE;4BAClE,QAAQ,EAAE,OAAO;yBAClB,CAAC,EAAA;;oBAFI,aAAa,GAAG,SAEpB;oBAEI,oBAAoB,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;oBAIpE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAoB,CAAC;oBAEtE,qBAAM,yBAAyB,CAAC,OAAO,EAAE,oBAAoB,CAAC,EAAA;;oBAApE,IAAI,CAAC,CAAC,SAA8D,CAAC,EAAE;wBACrE,iDAAiD;wBACjD,sBAAO,KAAK,EAAC;qBACd;oBAEK,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;oBAChD,IAAI,CAAC,UAAU,EAAE;wBACf,4GAA4G;wBAC5G,IAAA,aAAK,EAAC,mDAA4C,iBAAiB,MAAG,CAAC,CAAC;wBACxE,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC;wBAChE,sBAAO,KAAK,EAAC;qBACd;oBAEK,YAAY,GAAG,sBAAsB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAEjE,IAAI,CAAC,YAAY,EAAE;wBACjB,IAAA,aAAK,EAAC,yCAAkC,iBAAiB,CAAE,CAAC,CAAC;wBAC7D,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC;wBAChE,sBAAO,KAAK,EAAC;qBACd;oBAEK,iBAAiB,GAAG,0BAA0B,CAAC,YAAY,CAAC,CAAC;oBAEnE,IAAI,iBAAiB,EAAE;wBACrB,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,2CAAoC,oBAAoB,MAAG,CAC5D,CAAC;qBACH;yBAAM;wBACL,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,oDAA6C,oBAAoB,2CAAwC,CAC1G,CAAC;wBACF,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;wBACvD,sBAAO,KAAK,EAAC;qBACd;oBAEK,WAAW,GAAG,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;oBAC3E,IAAI,WAAW,EAAE;wBACf,KAAK,CAAC,GAAG,CAAC,OAAO,CACf,yCAAkC,oBAAoB,MAAG,CAC1D,CAAC;qBACH;yBAAM;wBACL,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,gDAAyC,oBAAoB,4CAAyC,CACvG,CAAC;wBACF,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;wBACvD,sBAAO,KAAK,EAAC;qBACd;oBAEK,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;oBACxC,qBAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAA;;oBAApD,SAAoD,CAAC;oBAErD,sBAAO,IAAI,EAAC;;;oBAEZ,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;oBACvD,IAAA,aAAK,EAAC,GAAC,CAAC,CAAC;oBACT,sBAAO,KAAK,EAAC;;;;;CAEhB;AAxED,kDAwEC;AAED,SAAe,yBAAyB,CACtC,OAAkB,EAClB,oBAA4B;;;;;;yBAExB,IAAA,4BAAgB,EAAC,OAAO,CAAC,EAAzB,wBAAyB;oBACJ,qBAAM,IAAA,8BAAgB,EAC3C,KAAK,CAAC,MAAM,CAAC;4BACX,OAAO,EAAE,qBAAc,oBAAoB,+EAA4E;4BACvH,OAAO,EAAE;gCACP;oCACE,KAAK,EAAE,oCAAoC;oCAC3C,KAAK,EAAE,IAAI;iCACZ;gCACD;oCACE,KAAK,EAAE,qDAAqD;oCAC5D,KAAK,EAAE,KAAK;iCACb;6BACF;4BACD,YAAY,EAAE,IAAI;yBACnB,CAAC,CACH,EAAA;;oBAfK,cAAc,GAAG,SAetB;oBAED,IAAI,CAAC,cAAc,EAAE;wBACnB,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;wBAC3D,sBAAO,KAAK,EAAC;qBACd;;wBAGH,sBAAO,IAAI,EAAC;;;;CACb;AAED,SAAS,sBAAsB,CAC7B,OAAkB,EAClB,SAA6B,EAC7B,OAAgD;IAEhD,IAAM,CAAC,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAEhD,IAAM,gBAAgB,GAAG,CAAC,CAAC,cAAc,CACvC,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,EACnC;QACE,CAAC,CAAC,gBAAgB;YAChB,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,EACzB,CAAC,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAC9C;YACD,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACvE,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EACvB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CACrC;WACE,CAAC,OAAO,CAAC,UAAU;YACpB,CAAC,CAAC;gBACE,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EACnB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAC7B;aACF;YACH,CAAC,CAAC,EAAE,CAAC,QACP;KACH,CACF,CAAC;IAEF,IAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAC3C,UAAC,CAAC;QACA,OAAA,CAAC,CAAC,IAAI,KAAK,UAAU;YACrB,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY;YAC3B,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS;IAFxB,CAEwB,CAC3B,CAAC;IAEF,IAAI,WAAW,EAAE;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE;YAChD,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACnD;aAAM;YACL,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;SAC3D;QACD,OAAO,IAAI,CAAC;KACb;IAED,SAAS,CAAC,UAAU,CAAC,IAAI,CACvB,CAAC,CAAC,cAAc,CACd,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EACvB,CAAC,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC,CAAC,CACtC,CACF,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAkB;IACtD,IAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;IAEhC,IAAM,uBAAuB,GAAG,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE;QAC7D,CAAC,CAAC,kBAAkB,CAClB,CAAC,CAAC,aAAa,CAAC;YACd,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;gBACpB,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC;gBACxC,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC;gBAC1C,SAAS,EAAE,IAAI;aAChB,CAAC;SACH,CAAC,EACF,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YACxC,CAAC,CAAC,aAAa,CAAC,wBAAwB,CAAC;SAC1C,CAAC,CACH;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC9C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,0BAA0B,CAAC,SAA6B;;IAC/D,IAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;IAEhC,IAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAC3C,UAAC,CAAC;QACA,OAAA,CAAC,CAAC,IAAI,KAAK,UAAU;YACrB,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY;YAC3B,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS;IAFxB,CAEwB,CAC3B,CAAC;IAEF,IAAI,WAAW,EAAE;QACf,sDAAsD;QACtD,6DAA6D;QAC7D,mFAAmF;QACnF,aAAa;QACb,wEAAwE;QACxE,iDAAiD;QACjD,IACE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;YACnC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC;aAC7C,MAAA,WAAW,CAAC,KAAK,CAAC,KAAK,0CAAE,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA,EACzD;YACA,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;SAC1D;aAAM;YACL,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;SACnD;QACD,OAAO,IAAI,CAAC;KACb;IAED,SAAS,CAAC,UAAU,CAAC,IAAI,CACvB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CACzE,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAC7B,aAAqC,EACrC,OAAkB;;IAElB,IAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC;IAChC,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,EAAE;QACnC,OAAO,GAAG,CAAC;KACZ;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE;QAC7B,IAAM,UAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;QAE1B,IAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CACzC,UAAC,CAAC;YACA,OAAA,CAAC,CAAC,IAAI,KAAK,qBAAqB;gBAChC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CACnB,UAAC,CAAC;oBACA,OAAA,CAAC,CAAC,IAAI,KAAK,oBAAoB;wBAC/B,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY;wBAC1B,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,UAAQ;gBAFtB,CAEsB,CACzB;QAND,CAMC,CACJ,CAAC;QAEF,IAAM,UAAU,GAAG,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,YAAY,CAAC,IAAI,CACrD,UAAC,CAAC;YACA,OAAA,CAAC,CAAC,IAAI,KAAK,oBAAoB;gBAC/B,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY;gBAC1B,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,UAAQ;QAFtB,CAEsB,CACzB,CAAC;QAEF,OAAO,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,0CAAE,IAAI,MAAK,kBAAkB;YAClD,CAAC,CAAC,UAAU,CAAC,IAAI;YACjB,CAAC,CAAC,SAAS,CAAC;KACf;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAAkB;IAElB,IAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CACrC,UAAC,CAAC;QACA,OAAA,CAAC,CAAC,IAAI,KAAK,qBAAqB;YAChC,CAAC,CAAC,UAAU,CAAC,IAAI,KAAK,sBAAsB;YAC5C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,kBAAkB;YAC7C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;YAC9C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC1C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;YAChD,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;IAN7C,CAM6C,CAChD,CAAC;IACF,OAAO,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,UAAoC,CAAC;AAC7D,CAAC","sourcesContent":["import * as path from 'path';\nimport * as fs from 'fs';\n\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nimport * as recast from 'recast';\nimport x = recast.types;\nimport t = x.namedTypes;\n\nimport * as Sentry from '@sentry/node';\n\nimport {\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askForToolConfigPath,\n createNewConfigFile,\n getPackageDotJson,\n installPackage,\n makeCodeSnippet,\n showCopyPasteInstructions,\n} from '../../utils/clack-utils';\nimport { hasPackageInstalled } from '../../utils/package-json';\n\nimport {\n SourceMapUploadToolConfigurationFunction,\n SourceMapUploadToolConfigurationOptions,\n} from './types';\n\nimport { findFile, hasSentryContent } from '../../utils/ast-utils';\nimport { debug } from '../../utils/debug';\n\nconst getCodeSnippet = (\n options: SourceMapUploadToolConfigurationOptions,\n colors: boolean,\n) =>\n makeCodeSnippet(colors, (unchanged, plus) =>\n unchanged(`${plus(\n 'const { sentryWebpackPlugin } = require(\"@sentry/webpack-plugin\");',\n )}\n\nmodule.exports = {\n // ... other options\n ${plus('devtool: \"source-map\", // Source map generation must be turned on')}\n plugins: [\n // Put the Sentry Webpack plugin after all other plugins\n ${plus(`sentryWebpackPlugin({\n authToken: process.env.SENTRY_AUTH_TOKEN,\n org: \"${options.orgSlug}\",\n project: \"${options.projectSlug}\",${\n options.selfHosted ? `\\n url: \"${options.url}\",` : ''\n }\n }),`)}\n ],\n}`),\n );\n\nexport const configureWebPackPlugin: SourceMapUploadToolConfigurationFunction =\n async (options) => {\n await installPackage({\n packageName: '@sentry/webpack-plugin',\n alreadyInstalled: hasPackageInstalled(\n '@sentry/webpack-plugin',\n await getPackageDotJson(),\n ),\n });\n\n const webpackConfigPath =\n findFile(path.resolve(process.cwd(), 'webpack.config')) ??\n (await askForToolConfigPath('Webpack', 'webpack.config.js'));\n\n let successfullyAdded = false;\n if (webpackConfigPath) {\n successfullyAdded = await modifyWebpackConfig(webpackConfigPath, options);\n } else {\n successfullyAdded = await createNewConfigFile(\n path.join(process.cwd(), 'webpack.config.js'),\n getCodeSnippet(options, false),\n 'More information about Webpack configs: https://vitejs.dev/config/',\n );\n Sentry.setTag(\n 'created-new-config',\n successfullyAdded ? 'success' : 'fail',\n );\n }\n\n if (successfullyAdded) {\n clack.log.info(\n `We recommend checking the ${\n webpackConfigPath ? 'modified' : 'added'\n } file after the wizard finished to ensure it works with your build setup.`,\n );\n\n Sentry.setTag('ast-mod', 'success');\n } else {\n Sentry.setTag('ast-mod', 'fail');\n await showCopyPasteInstructions(\n path.basename(webpackConfigPath || 'webpack.config.js'),\n getCodeSnippet(options, true),\n );\n }\n\n await addDotEnvSentryBuildPluginFile(options.authToken);\n };\n\n/**\n * Modifies a webpack config file to enable source map generation and add the Sentry webpack plugin\n * exported only for testing\n */\nexport async function modifyWebpackConfig(\n webpackConfigPath: string,\n options: SourceMapUploadToolConfigurationOptions,\n): Promise<boolean> {\n try {\n const webpackConfig = await fs.promises.readFile(webpackConfigPath, {\n encoding: 'utf-8',\n });\n\n const prettyConfigFilename = chalk.cyan(path.basename(webpackConfigPath));\n\n // no idea why recast returns any here, this is dumb :/\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const program = recast.parse(webpackConfig.toString()).program as t.Program;\n\n if (!(await shouldModifyWebpackConfig(program, prettyConfigFilename))) {\n // Sentry tag is set in shouldModifyWebpackConfig\n return false;\n }\n\n const exportStmt = getCjsModuleExports(program);\n if (!exportStmt) {\n // We only care about CJS at the moment since it's probably the most widely used format for webpack configs.\n debug(`Could not find module.exports = {...} in ${webpackConfigPath}.`);\n Sentry.setTag('ast-mod-fail-reason', 'config-object-not-found');\n return false;\n }\n\n const configObject = getWebpackConfigObject(exportStmt, program);\n\n if (!configObject) {\n debug(`Couldn't find config object in ${webpackConfigPath}`);\n Sentry.setTag('ast-mod-fail-reason', 'config-object-not-found');\n return false;\n }\n\n const enabledSourcemaps = enableSourcemapsGeneration(configObject);\n\n if (enabledSourcemaps) {\n clack.log.success(\n `Enabled source map generation in ${prettyConfigFilename}.`,\n );\n } else {\n clack.log.warn(\n `Couldn't enable source maps generation in ${prettyConfigFilename} Please follow the instructions below.`,\n );\n Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');\n return false;\n }\n\n const addedPlugin = addSentryWebpackPlugin(program, configObject, options);\n if (addedPlugin) {\n clack.log.success(\n `Added Sentry webpack plugin to ${prettyConfigFilename}.`,\n );\n } else {\n clack.log.warn(\n `Couldn't add Sentry webpack plugin to ${prettyConfigFilename}. Please follow the instructions below.`,\n );\n Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');\n return false;\n }\n\n const code = recast.print(program).code;\n await fs.promises.writeFile(webpackConfigPath, code);\n\n return true;\n } catch (e) {\n Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');\n debug(e);\n return false;\n }\n}\n\nasync function shouldModifyWebpackConfig(\n program: t.Program,\n prettyConfigFilename: string,\n) {\n if (hasSentryContent(program)) {\n const shouldContinue = await abortIfCancelled(\n clack.select({\n message: `Seems like ${prettyConfigFilename} already contains Sentry-related code. Should the wizard modify it anyway?`,\n options: [\n {\n label: 'Yes, add the Sentry Webpack plugin',\n value: true,\n },\n {\n label: 'No, show me instructions to manually add the plugin',\n value: false,\n },\n ],\n initialValue: true,\n }),\n );\n\n if (!shouldContinue) {\n Sentry.setTag('ast-mod-fail-reason', 'has-sentry-content');\n return false;\n }\n }\n\n return true;\n}\n\nfunction addSentryWebpackPlugin(\n program: t.Program,\n configObj: t.ObjectExpression,\n options: SourceMapUploadToolConfigurationOptions,\n) {\n const b = addSentryWebpackPluginImport(program);\n\n const sentryPluginCall = b.callExpression(\n b.identifier('sentryWebpackPlugin'),\n [\n b.objectExpression([\n b.objectProperty(\n b.identifier('authToken'),\n b.identifier('process.env.SENTRY_AUTH_TOKEN'),\n ),\n b.objectProperty(b.identifier('org'), b.stringLiteral(options.orgSlug)),\n b.objectProperty(\n b.identifier('project'),\n b.stringLiteral(options.projectSlug),\n ),\n ...(options.selfHosted\n ? [\n b.objectProperty(\n b.identifier('url'),\n b.stringLiteral(options.url),\n ),\n ]\n : []),\n ]),\n ],\n );\n\n const pluginsProp = configObj.properties.find(\n (p): p is t.Property =>\n p.type === 'Property' &&\n p.key.type === 'Identifier' &&\n p.key.name === 'plugins',\n );\n\n if (pluginsProp) {\n if (pluginsProp.value.type === 'ArrayExpression') {\n pluginsProp.value.elements.push(sentryPluginCall);\n } else {\n pluginsProp.value = b.arrayExpression([sentryPluginCall]);\n }\n return true;\n }\n\n configObj.properties.push(\n b.objectProperty(\n b.identifier('plugins'),\n b.arrayExpression([sentryPluginCall]),\n ),\n );\n\n return true;\n}\n\nfunction addSentryWebpackPluginImport(program: t.Program) {\n const b = recast.types.builders;\n\n const sentryPluginRequireStmt = b.variableDeclaration('const', [\n b.variableDeclarator(\n b.objectPattern([\n b.objectProperty.from({\n key: b.identifier('sentryWebpackPlugin'),\n value: b.identifier('sentryWebpackPlugin'),\n shorthand: true,\n }),\n ]),\n b.callExpression(b.identifier('require'), [\n b.stringLiteral('@sentry/webpack-plugin'),\n ]),\n ),\n ]);\n\n program.body.unshift(sentryPluginRequireStmt);\n return b;\n}\n\nfunction enableSourcemapsGeneration(configObj: t.ObjectExpression): boolean {\n const b = recast.types.builders;\n\n const devtoolProp = configObj.properties.find(\n (p): p is t.Property =>\n p.type === 'Property' &&\n p.key.type === 'Identifier' &&\n p.key.name === 'devtool',\n );\n\n if (devtoolProp) {\n // devtool can have quite a lot of source maps values.\n // see: https://webpack.js.org/configuration/devtool/#devtool\n // For Sentry to work best, we should set it to \"source-map\" or \"hidden-source-map\"\n // Heuristic:\n // - all values that contain \"hidden\" will be set to \"hidden-source-map\"\n // - all other values will be set to \"source-map\"\n if (\n (devtoolProp.value.type === 'Literal' ||\n devtoolProp.value.type === 'StringLiteral') &&\n devtoolProp.value.value?.toString().startsWith('hidden-')\n ) {\n devtoolProp.value = b.stringLiteral('hidden-source-map');\n } else {\n devtoolProp.value = b.stringLiteral('source-map');\n }\n return true;\n }\n\n configObj.properties.push(\n b.objectProperty(b.identifier('devtool'), b.stringLiteral('source-map')),\n );\n\n return true;\n}\n\nfunction getWebpackConfigObject(\n moduleExports: t.AssignmentExpression,\n program: t.Program,\n): t.ObjectExpression | undefined {\n const rhs = moduleExports.right;\n if (rhs.type === 'ObjectExpression') {\n return rhs;\n }\n if (rhs.type === 'Identifier') {\n const configId = rhs.name;\n\n const configDeclaration = program.body.find(\n (s): s is t.VariableDeclaration =>\n s.type === 'VariableDeclaration' &&\n !!s.declarations.find(\n (d) =>\n d.type === 'VariableDeclarator' &&\n d.id.type === 'Identifier' &&\n d.id.name === configId,\n ),\n );\n\n const declarator = configDeclaration?.declarations.find(\n (d): d is t.VariableDeclarator =>\n d.type === 'VariableDeclarator' &&\n d.id.type === 'Identifier' &&\n d.id.name === configId,\n );\n\n return declarator?.init?.type === 'ObjectExpression'\n ? declarator.init\n : undefined;\n }\n\n return undefined;\n}\n\nfunction getCjsModuleExports(\n program: t.Program,\n): t.AssignmentExpression | undefined {\n const moduleExports = program.body.find(\n (s): s is t.ExpressionStatement =>\n s.type === 'ExpressionStatement' &&\n s.expression.type === 'AssignmentExpression' &&\n s.expression.left.type === 'MemberExpression' &&\n s.expression.left.object.type === 'Identifier' &&\n s.expression.left.object.name === 'module' &&\n s.expression.left.property.type === 'Identifier' &&\n s.expression.left.property.name === 'exports',\n );\n return moduleExports?.expression as t.AssignmentExpression;\n}\n"]}
@@ -87,6 +87,7 @@ var fs = __importStar(require("fs"));
87
87
  var path = __importStar(require("path"));
88
88
  var url = __importStar(require("url"));
89
89
  var chalk_1 = __importDefault(require("chalk"));
90
+ var Sentry = __importStar(require("@sentry/node"));
90
91
  // @ts-ignore - clack is ESM and TS complains about that. It works though
91
92
  var prompts_1 = __importDefault(require("@clack/prompts"));
92
93
  // @ts-ignore - magicast is ESM and TS complains about that. It works though
@@ -97,6 +98,7 @@ var templates_1 = require("./templates");
97
98
  var clack_utils_1 = require("../utils/clack-utils");
98
99
  var debug_1 = require("../utils/debug");
99
100
  var ast_utils_1 = require("../utils/ast-utils");
101
+ var telemetry_1 = require("../telemetry");
100
102
  var SVELTE_CONFIG_FILE = 'svelte.config.js';
101
103
  function createOrMergeSvelteKitFiles(projectInfo, svelteConfig) {
102
104
  return __awaiter(this, void 0, void 0, function () {
@@ -110,28 +112,26 @@ function createOrMergeSvelteKitFiles(projectInfo, svelteConfig) {
110
112
  viteConfig = (0, ast_utils_1.findFile)(path.resolve(process.cwd(), 'vite.config'));
111
113
  fileEnding = (0, clack_utils_1.isUsingTypeScript)() ? 'ts' : 'js';
112
114
  dsn = projectInfo.dsn;
115
+ Sentry.setTag('client-hooks-file-strategy', originalClientHooksFile ? 'merge' : 'create');
113
116
  if (!!originalClientHooksFile) return [3 /*break*/, 2];
114
117
  prompts_1.default.log.info('No client hooks file found, creating a new one.');
115
118
  return [4 /*yield*/, createNewHooksFile("".concat(clientHooksPath, ".").concat(fileEnding), 'client', dsn)];
116
119
  case 1:
117
120
  _b.sent();
118
- _b.label = 2;
119
- case 2:
120
- if (!!originalServerHooksFile) return [3 /*break*/, 4];
121
- prompts_1.default.log.info('No server hooks file found, creating a new one.');
122
- return [4 /*yield*/, createNewHooksFile("".concat(serverHooksPath, ".").concat(fileEnding), 'server', dsn)];
121
+ return [3 /*break*/, 4];
122
+ case 2: return [4 /*yield*/, mergeHooksFile(originalClientHooksFile, 'client', dsn)];
123
123
  case 3:
124
124
  _b.sent();
125
125
  _b.label = 4;
126
126
  case 4:
127
- if (!originalClientHooksFile) return [3 /*break*/, 6];
128
- return [4 /*yield*/, mergeHooksFile(originalClientHooksFile, 'client', dsn)];
127
+ Sentry.setTag('server-hooks-file-strategy', originalServerHooksFile ? 'merge' : 'create');
128
+ if (!!originalServerHooksFile) return [3 /*break*/, 6];
129
+ prompts_1.default.log.info('No server hooks file found, creating a new one.');
130
+ return [4 /*yield*/, createNewHooksFile("".concat(serverHooksPath, ".").concat(fileEnding), 'server', dsn)];
129
131
  case 5:
130
132
  _b.sent();
131
- _b.label = 6;
132
- case 6:
133
- if (!originalServerHooksFile) return [3 /*break*/, 8];
134
- return [4 /*yield*/, mergeHooksFile(originalServerHooksFile, 'server', dsn)];
133
+ return [3 /*break*/, 8];
134
+ case 6: return [4 /*yield*/, mergeHooksFile(originalServerHooksFile, 'server', dsn)];
135
135
  case 7:
136
136
  _b.sent();
137
137
  _b.label = 8;
@@ -186,6 +186,7 @@ function createNewHooksFile(hooksFileDest, hooktype, dsn) {
186
186
  case 2:
187
187
  _a.sent();
188
188
  prompts_1.default.log.success("Created ".concat(hooksFileDest));
189
+ Sentry.setTag("created-".concat(hooktype, "-hooks"), 'success');
189
190
  return [2 /*return*/];
190
191
  }
191
192
  });
@@ -204,38 +205,66 @@ function createNewHooksFile(hooksFileDest, hooktype, dsn) {
204
205
  */
205
206
  function mergeHooksFile(hooksFile, hookType, dsn) {
206
207
  return __awaiter(this, void 0, void 0, function () {
207
- var originalHooksMod, modifiedCode;
208
+ var originalHooksMod, file;
209
+ var _this = this;
208
210
  return __generator(this, function (_a) {
209
211
  switch (_a.label) {
210
212
  case 0: return [4 /*yield*/, (0, magicast_1.loadFile)(hooksFile)];
211
213
  case 1:
212
214
  originalHooksMod = _a.sent();
215
+ file = "".concat(hookType, "-hooks");
213
216
  if ((0, ast_utils_1.hasSentryContent)(originalHooksMod.$ast)) {
214
217
  // We don't want to mess with files that already have Sentry content.
215
218
  // Let's just bail out at this point.
216
219
  prompts_1.default.log.warn("File ".concat(chalk_1.default.cyan(path.basename(hooksFile)), " already contains Sentry code.\nSkipping adding Sentry functionality to."));
220
+ Sentry.setTag("modified-".concat(file), 'fail');
221
+ Sentry.setTag("".concat(file, "-fail-reason"), 'has-sentry-content');
217
222
  return [2 /*return*/];
218
223
  }
219
- originalHooksMod.imports.$add({
220
- from: '@sentry/sveltekit',
221
- imported: '*',
222
- local: 'Sentry',
223
- });
224
- if (hookType === 'client') {
225
- insertClientInitCall(dsn, originalHooksMod);
226
- }
227
- else {
228
- insertServerInitCall(dsn, originalHooksMod);
229
- }
230
- wrapHandleError(originalHooksMod);
231
- if (hookType === 'server') {
232
- wrapHandle(originalHooksMod);
233
- }
234
- modifiedCode = originalHooksMod.generate().code;
235
- return [4 /*yield*/, fs.promises.writeFile(hooksFile, modifiedCode)];
224
+ return [4 /*yield*/, modifyAndRecordFail(function () {
225
+ return originalHooksMod.imports.$add({
226
+ from: '@sentry/sveltekit',
227
+ imported: '*',
228
+ local: 'Sentry',
229
+ });
230
+ }, 'import-injection', file)];
236
231
  case 2:
232
+ _a.sent();
233
+ return [4 /*yield*/, modifyAndRecordFail(function () {
234
+ if (hookType === 'client') {
235
+ insertClientInitCall(dsn, originalHooksMod);
236
+ }
237
+ else {
238
+ insertServerInitCall(dsn, originalHooksMod);
239
+ }
240
+ }, 'init-call-injection', file)];
241
+ case 3:
242
+ _a.sent();
243
+ return [4 /*yield*/, modifyAndRecordFail(function () { return wrapHandleError(originalHooksMod); }, 'wrap-handle-error', file)];
244
+ case 4:
245
+ _a.sent();
246
+ if (!(hookType === 'server')) return [3 /*break*/, 6];
247
+ return [4 /*yield*/, modifyAndRecordFail(function () { return wrapHandle(originalHooksMod); }, 'wrap-handle', 'server-hooks')];
248
+ case 5:
249
+ _a.sent();
250
+ _a.label = 6;
251
+ case 6: return [4 /*yield*/, modifyAndRecordFail(function () { return __awaiter(_this, void 0, void 0, function () {
252
+ var modifiedCode;
253
+ return __generator(this, function (_a) {
254
+ switch (_a.label) {
255
+ case 0:
256
+ modifiedCode = originalHooksMod.generate().code;
257
+ return [4 /*yield*/, fs.promises.writeFile(hooksFile, modifiedCode)];
258
+ case 1:
259
+ _a.sent();
260
+ return [2 /*return*/];
261
+ }
262
+ });
263
+ }); }, 'write-file', file)];
264
+ case 7:
237
265
  _a.sent();
238
266
  prompts_1.default.log.success("Added Sentry code to ".concat(hooksFile));
267
+ Sentry.setTag("modified-".concat(hookType, "-hooks"), 'success');
239
268
  return [2 /*return*/];
240
269
  }
241
270
  });
@@ -410,7 +439,8 @@ function loadSvelteConfig() {
410
439
  exports.loadSvelteConfig = loadSvelteConfig;
411
440
  function modifyViteConfig(viteConfigPath, projectInfo) {
412
441
  return __awaiter(this, void 0, void 0, function () {
413
- var viteConfigContent, org, project, url, selfHosted, viteModule, code, e_2;
442
+ var viteConfigContent, org, project, url, selfHosted, viteModule_1, e_2;
443
+ var _this = this;
414
444
  return __generator(this, function (_a) {
415
445
  switch (_a.label) {
416
446
  case 0: return [4 /*yield*/, fs.promises.readFile(viteConfigPath, 'utf-8')];
@@ -419,34 +449,52 @@ function modifyViteConfig(viteConfigPath, projectInfo) {
419
449
  org = projectInfo.org, project = projectInfo.project, url = projectInfo.url, selfHosted = projectInfo.selfHosted;
420
450
  _a.label = 2;
421
451
  case 2:
422
- _a.trys.push([2, 4, , 6]);
423
- viteModule = (0, magicast_1.parseModule)(viteConfigContent);
424
- if ((0, ast_utils_1.hasSentryContent)(viteModule.$ast)) {
452
+ _a.trys.push([2, 5, , 7]);
453
+ viteModule_1 = (0, magicast_1.parseModule)(viteConfigContent);
454
+ if ((0, ast_utils_1.hasSentryContent)(viteModule_1.$ast)) {
425
455
  prompts_1.default.log.warn("File ".concat(chalk_1.default.cyan(path.basename(viteConfigPath)), " already contains Sentry code.\nSkipping adding Sentry functionality to."));
456
+ Sentry.setTag("modified-vite-cfg", 'fail');
457
+ Sentry.setTag("vite-cfg-fail-reason", 'has-sentry-content');
426
458
  return [2 /*return*/];
427
459
  }
428
- (0, helpers_1.addVitePlugin)(viteModule, {
429
- imported: 'sentrySvelteKit',
430
- from: '@sentry/sveltekit',
431
- constructor: 'sentrySvelteKit',
432
- options: {
433
- sourceMapsUploadOptions: __assign({ org: org, project: project }, (selfHosted && { url: url })),
434
- },
435
- index: 0,
436
- });
437
- code = (0, magicast_1.generateCode)(viteModule.$ast).code;
438
- return [4 /*yield*/, fs.promises.writeFile(viteConfigPath, code)];
460
+ return [4 /*yield*/, modifyAndRecordFail(function () {
461
+ return (0, helpers_1.addVitePlugin)(viteModule_1, {
462
+ imported: 'sentrySvelteKit',
463
+ from: '@sentry/sveltekit',
464
+ constructor: 'sentrySvelteKit',
465
+ options: {
466
+ sourceMapsUploadOptions: __assign({ org: org, project: project }, (selfHosted && { url: url })),
467
+ },
468
+ index: 0,
469
+ });
470
+ }, 'add-vite-plugin', 'vite-cfg')];
439
471
  case 3:
440
472
  _a.sent();
441
- return [3 /*break*/, 6];
473
+ return [4 /*yield*/, modifyAndRecordFail(function () { return __awaiter(_this, void 0, void 0, function () {
474
+ var code;
475
+ return __generator(this, function (_a) {
476
+ switch (_a.label) {
477
+ case 0:
478
+ code = (0, magicast_1.generateCode)(viteModule_1.$ast).code;
479
+ return [4 /*yield*/, fs.promises.writeFile(viteConfigPath, code)];
480
+ case 1:
481
+ _a.sent();
482
+ return [2 /*return*/];
483
+ }
484
+ });
485
+ }); }, 'write-file', 'vite-cfg')];
442
486
  case 4:
487
+ _a.sent();
488
+ return [3 /*break*/, 7];
489
+ case 5:
443
490
  e_2 = _a.sent();
444
491
  (0, debug_1.debug)(e_2);
445
492
  return [4 /*yield*/, showFallbackViteCopyPasteSnippet(viteConfigPath, getViteConfigCodeSnippet(org, project, selfHosted, url))];
446
- case 5:
493
+ case 6:
447
494
  _a.sent();
448
- return [3 /*break*/, 6];
449
- case 6: return [2 /*return*/];
495
+ Sentry.captureException('Sveltekit Vite Config Modification Fail');
496
+ return [3 /*break*/, 7];
497
+ case 7: return [2 /*return*/];
450
498
  }
451
499
  });
452
500
  });
@@ -495,4 +543,30 @@ function getInitCallInsertionIndex(originalHooksModAST) {
495
543
  : 0;
496
544
  return initCallInsertionIndex;
497
545
  }
546
+ /**
547
+ * Applies the @param modifyCallback and records Sentry tags if the call failed.
548
+ * In case of a failure, a tag is set with @param reason as a fail reason
549
+ * and the error is rethrown.
550
+ */
551
+ function modifyAndRecordFail(modifyCallback, reason, fileType) {
552
+ return __awaiter(this, void 0, void 0, function () {
553
+ var e_3;
554
+ return __generator(this, function (_a) {
555
+ switch (_a.label) {
556
+ case 0:
557
+ _a.trys.push([0, 2, , 3]);
558
+ return [4 /*yield*/, (0, telemetry_1.traceStep)("".concat(fileType, "-").concat(reason), modifyCallback)];
559
+ case 1:
560
+ _a.sent();
561
+ return [3 /*break*/, 3];
562
+ case 2:
563
+ e_3 = _a.sent();
564
+ Sentry.setTag("modified-".concat(fileType), 'fail');
565
+ Sentry.setTag("".concat(fileType, "-mod-fail-reason"), reason);
566
+ throw e_3;
567
+ case 3: return [2 /*return*/];
568
+ }
569
+ });
570
+ });
571
+ }
498
572
  //# sourceMappingURL=sdk-setup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/sveltekit/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExportNamedDeclaration, Program } from '@babel/types';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as url from 'url';\nimport chalk from 'chalk';\n\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport type { ProxifiedModule } from 'magicast';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, loadFile, parseModule } from 'magicast';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { addVitePlugin } from 'magicast/helpers';\nimport { getClientHooksTemplate, getServerHooksTemplate } from './templates';\nimport { abortIfCancelled, isUsingTypeScript } from '../utils/clack-utils';\nimport { debug } from '../utils/debug';\nimport { findFile, hasSentryContent } from '../utils/ast-utils';\n\nimport * as recast from 'recast';\nimport x = recast.types;\nimport t = x.namedTypes;\n\nconst SVELTE_CONFIG_FILE = 'svelte.config.js';\n\nexport type PartialSvelteConfig = {\n kit?: {\n files?: {\n hooks?: {\n client?: string;\n server?: string;\n };\n routes?: string;\n };\n };\n};\n\ntype ProjectInfo = {\n dsn: string;\n org: string;\n project: string;\n selfHosted: boolean;\n url: string;\n};\n\nexport async function createOrMergeSvelteKitFiles(\n projectInfo: ProjectInfo,\n svelteConfig: PartialSvelteConfig,\n): Promise<void> {\n const { clientHooksPath, serverHooksPath } = getHooksConfigDirs(svelteConfig);\n\n // full file paths with correct file ending (or undefined if not found)\n const originalClientHooksFile = findFile(clientHooksPath);\n const originalServerHooksFile = findFile(serverHooksPath);\n\n const viteConfig = findFile(path.resolve(process.cwd(), 'vite.config'));\n\n const fileEnding = isUsingTypeScript() ? 'ts' : 'js';\n\n const { dsn } = projectInfo;\n\n if (!originalClientHooksFile) {\n clack.log.info('No client hooks file found, creating a new one.');\n await createNewHooksFile(`${clientHooksPath}.${fileEnding}`, 'client', dsn);\n }\n if (!originalServerHooksFile) {\n clack.log.info('No server hooks file found, creating a new one.');\n await createNewHooksFile(`${serverHooksPath}.${fileEnding}`, 'server', dsn);\n }\n\n if (originalClientHooksFile) {\n await mergeHooksFile(originalClientHooksFile, 'client', dsn);\n }\n if (originalServerHooksFile) {\n await mergeHooksFile(originalServerHooksFile, 'server', dsn);\n }\n\n if (viteConfig) {\n await modifyViteConfig(viteConfig, projectInfo);\n }\n}\n\n/**\n * Attempts to read the svelte.config.js file to find the location of the hooks files.\n * If users specified a custom location, we'll use that. Otherwise, we'll use the default.\n */\nfunction getHooksConfigDirs(svelteConfig: PartialSvelteConfig): {\n clientHooksPath: string;\n serverHooksPath: string;\n} {\n const relativeUserClientHooksPath = svelteConfig?.kit?.files?.hooks?.client;\n const relativeUserServerHooksPath = svelteConfig?.kit?.files?.hooks?.server;\n const userClientHooksPath =\n relativeUserClientHooksPath &&\n path.resolve(process.cwd(), relativeUserClientHooksPath);\n const userServerHooksPath =\n relativeUserServerHooksPath &&\n path.resolve(process.cwd(), relativeUserServerHooksPath);\n\n const defaulHooksDir = path.resolve(process.cwd(), 'src');\n const defaultClientHooksPath = path.resolve(defaulHooksDir, 'hooks.client'); // file ending missing on purpose\n const defaultServerHooksPath = path.resolve(defaulHooksDir, 'hooks.server'); // same here\n\n return {\n clientHooksPath: userClientHooksPath || defaultClientHooksPath,\n serverHooksPath: userServerHooksPath || defaultServerHooksPath,\n };\n}\n\n/**\n * Reads the template, replaces the dsn placeholder with the actual dsn and writes the file to @param hooksFileDest\n */\nasync function createNewHooksFile(\n hooksFileDest: string,\n hooktype: 'client' | 'server',\n dsn: string,\n): Promise<void> {\n const filledTemplate =\n hooktype === 'client'\n ? getClientHooksTemplate(dsn)\n : getServerHooksTemplate(dsn);\n\n await fs.promises.mkdir(path.dirname(hooksFileDest), { recursive: true });\n await fs.promises.writeFile(hooksFileDest, filledTemplate);\n\n clack.log.success(`Created ${hooksFileDest}`);\n}\n\n/**\n * Merges the users' hooks file with Sentry-related code.\n *\n * Both hooks:\n * - add import * as Sentry\n * - add Sentry.init\n * - add handleError hook wrapper\n *\n * Additionally in Server hook:\n * - add handle hook handler\n */\nasync function mergeHooksFile(\n hooksFile: string,\n hookType: 'client' | 'server',\n dsn: string,\n): Promise<void> {\n const originalHooksMod = await loadFile(hooksFile);\n if (hasSentryContent(originalHooksMod.$ast as t.Program)) {\n // We don't want to mess with files that already have Sentry content.\n // Let's just bail out at this point.\n clack.log.warn(\n `File ${chalk.cyan(\n path.basename(hooksFile),\n )} already contains Sentry code.\nSkipping adding Sentry functionality to.`,\n );\n return;\n }\n\n originalHooksMod.imports.$add({\n from: '@sentry/sveltekit',\n imported: '*',\n local: 'Sentry',\n });\n\n if (hookType === 'client') {\n insertClientInitCall(dsn, originalHooksMod);\n } else {\n insertServerInitCall(dsn, originalHooksMod);\n }\n\n wrapHandleError(originalHooksMod);\n\n if (hookType === 'server') {\n wrapHandle(originalHooksMod);\n }\n\n const modifiedCode = originalHooksMod.generate().code;\n\n await fs.promises.writeFile(hooksFile, modifiedCode);\n\n clack.log.success(`Added Sentry code to ${hooksFile}`);\n}\n\nfunction insertClientInitCall(\n dsn: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalHooksMod: ProxifiedModule<any>,\n): void {\n const initCallComment = `\n // If you don't want to use Session Replay, remove the \\`Replay\\` integration, \n // \\`replaysSessionSampleRate\\` and \\`replaysOnErrorSampleRate\\` options.`;\n\n // This assignment of any values is fine because we're just creating a function call in magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCall = builders.functionCall('Sentry.init', {\n dsn,\n tracesSampleRate: 1.0,\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1.0,\n integrations: [builders.newExpression('Sentry.Replay')],\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCallWithComment = builders.raw(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n `${initCallComment}\\n${generateCode(initCall).code}`,\n );\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n\n const initCallInsertionIndex = getInitCallInsertionIndex(originalHooksModAST);\n\n originalHooksModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-ignore - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCallWithComment).code,\n );\n}\n\nfunction insertServerInitCall(\n dsn: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalHooksMod: ProxifiedModule<any>,\n): void {\n // This assignment of any values is fine because we're just creating a function call in magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCall = builders.functionCall('Sentry.init', {\n dsn,\n tracesSampleRate: 1.0,\n });\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n\n const initCallInsertionIndex = getInitCallInsertionIndex(originalHooksModAST);\n\n originalHooksModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-ignore - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrapHandleError(mod: ProxifiedModule<any>): void {\n const modAst = mod.exports.$ast as Program;\n const namedExports = modAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundHandleError = false;\n\n namedExports.forEach((modExport) => {\n const declaration = modExport.declaration;\n if (!declaration) {\n return;\n }\n if (declaration.type === 'FunctionDeclaration') {\n if (!declaration.id || declaration.id.name !== 'handleError') {\n return;\n }\n foundHandleError = true;\n const userCode = generateCode(declaration).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handleError = builders.raw(\n `Sentry.handleErrorWithSentry(${userCode.replace(\n 'handleError',\n '_handleError',\n )})`,\n );\n // because magicast doesn't overwrite the original function export, we need to remove it manually\n modAst.body = modAst.body.filter((node) => node !== modExport);\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n declarations.forEach((declaration) => {\n // @ts-ignore - id should always have a name in this case\n if (!declaration.id || declaration.id.name !== 'handleError') {\n return;\n }\n foundHandleError = true;\n const userCode = declaration.init;\n const stringifiedUserCode = userCode ? generateCode(userCode).code : '';\n // @ts-ignore - we can just place a string here, magicast will convert it to a node\n declaration.init = `Sentry.handleErrorWithSentry(${stringifiedUserCode})`;\n });\n }\n });\n\n if (!foundHandleError) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handleError = builders.functionCall(\n 'Sentry.handleErrorWithSentry',\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrapHandle(mod: ProxifiedModule<any>): void {\n const modAst = mod.exports.$ast as Program;\n const namedExports = modAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundHandle = false;\n\n namedExports.forEach((modExport) => {\n const declaration = modExport.declaration;\n if (!declaration) {\n return;\n }\n if (declaration.type === 'FunctionDeclaration') {\n if (!declaration.id || declaration.id.name !== 'handle') {\n return;\n }\n foundHandle = true;\n const userCode = generateCode(declaration).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handle = builders.raw(\n `sequence(Sentry.sentryHandle(), ${userCode.replace(\n 'handle',\n '_handle',\n )})`,\n );\n // because of an issue with magicast, we need to remove the original export\n modAst.body = modAst.body.filter((node) => node !== modExport);\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n declarations.forEach((declaration) => {\n // @ts-ignore - id should always have a name in this case\n if (!declaration.id || declaration.id.name !== 'handle') {\n return;\n }\n const userCode = declaration.init;\n const stringifiedUserCode = userCode ? generateCode(userCode).code : '';\n // @ts-ignore - we can just place a string here, magicast will convert it to a node\n declaration.init = `sequence(Sentry.sentryHandle(), ${stringifiedUserCode})`;\n foundHandle = true;\n });\n }\n });\n\n if (!foundHandle) {\n // can't use builders.functionCall here because it doesn't yet\n // support member expressions (Sentry.sentryHandle()) in args\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handle = builders.raw('sequence(Sentry.sentryHandle())');\n }\n\n try {\n mod.imports.$add({\n from: '@sveltejs/kit/hooks',\n imported: 'sequence',\n local: 'sequence',\n });\n } catch (_) {\n // It's possible sequence is already imported. in this case, magicast throws but that's fine.\n }\n}\n\nexport async function loadSvelteConfig(): Promise<PartialSvelteConfig> {\n const configFilePath = path.join(process.cwd(), SVELTE_CONFIG_FILE);\n\n try {\n if (!fs.existsSync(configFilePath)) {\n return {};\n }\n\n const configUrl = url.pathToFileURL(configFilePath).href;\n const svelteConfigModule = (await import(configUrl)) as {\n default: PartialSvelteConfig;\n };\n\n return svelteConfigModule?.default || {};\n } catch (e: unknown) {\n clack.log.error(`Couldn't load ${SVELTE_CONFIG_FILE}.\nPlease make sure, you're running this wizard with Node 16 or newer`);\n clack.log.info(\n chalk.dim(\n typeof e === 'object' && e != null && 'toString' in e\n ? e.toString()\n : typeof e === 'string'\n ? e\n : 'Unknown error',\n ),\n );\n\n return {};\n }\n}\n\nasync function modifyViteConfig(\n viteConfigPath: string,\n projectInfo: ProjectInfo,\n): Promise<void> {\n const viteConfigContent = (\n await fs.promises.readFile(viteConfigPath, 'utf-8')\n ).toString();\n\n const { org, project, url, selfHosted } = projectInfo;\n\n try {\n const viteModule = parseModule(viteConfigContent);\n\n if (hasSentryContent(viteModule.$ast as t.Program)) {\n clack.log.warn(\n `File ${chalk.cyan(\n path.basename(viteConfigPath),\n )} already contains Sentry code.\nSkipping adding Sentry functionality to.`,\n );\n return;\n }\n\n addVitePlugin(viteModule, {\n imported: 'sentrySvelteKit',\n from: '@sentry/sveltekit',\n constructor: 'sentrySvelteKit',\n options: {\n sourceMapsUploadOptions: {\n org,\n project,\n ...(selfHosted && { url }),\n },\n },\n index: 0,\n });\n\n const code = generateCode(viteModule.$ast).code;\n\n await fs.promises.writeFile(viteConfigPath, code);\n } catch (e) {\n debug(e);\n await showFallbackViteCopyPasteSnippet(\n viteConfigPath,\n getViteConfigCodeSnippet(org, project, selfHosted, url),\n );\n }\n}\n\nasync function showFallbackViteCopyPasteSnippet(\n viteConfigPath: string,\n codeSnippet: string,\n) {\n const viteConfigFilename = path.basename(viteConfigPath);\n\n clack.log.warning(\n `Couldn't automatically modify your ${chalk.cyan(viteConfigFilename)}\n${chalk.dim(`This sometimes happens when we encounter more complex vite configs.\nIt may not seem like it but sometimes our magical powers are limited ;)`)}`,\n );\n\n clack.log.info(\"But don't worry - it's super easy to do this yourself!\");\n\n clack.log.step(\n `Add the following code to your ${chalk.cyan(viteConfigFilename)}:`,\n );\n\n // Intentionally logging to console here for easier copy/pasting\n // eslint-disable-next-line no-console\n console.log(codeSnippet);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you copy the snippet above?',\n options: [\n { label: 'Yes!', value: true, hint: \"Great, that's already it!\" },\n ],\n initialValue: true,\n }),\n );\n}\n\nconst getViteConfigCodeSnippet = (\n org: string,\n project: string,\n selfHosted: boolean,\n url: string,\n) =>\n chalk.gray(`\nimport { sveltekit } from '@sveltejs/kit/vite';\nimport { defineConfig } from 'vite';\n${chalk.greenBright(\"import { sentrySvelteKit } from '@sentry/sveltekit'\")}\n\nexport default defineConfig({\n plugins: [\n // Make sure \\`sentrySvelteKit\\` is registered before \\`sveltekit\\`\n ${chalk.greenBright(`sentrySvelteKit({\n sourceMapsUploadOptions: {\n org: '${org}',\n project: '${project}',${selfHosted ? `\\n url: '${url}',` : ''}\n } \n }),`)}\n sveltekit(),\n ]\n});\n`);\n\n/**\n * We want to insert the init call on top of the file but after all import statements\n */\nfunction getInitCallInsertionIndex(originalHooksModAST: Program): number {\n // We need to deep-copy here because reverse mutates in place\n const copiedBodyNodes = [...originalHooksModAST.body];\n const lastImportDeclaration = copiedBodyNodes\n .reverse()\n .find((node) => node.type === 'ImportDeclaration');\n\n const initCallInsertionIndex = lastImportDeclaration\n ? originalHooksModAST.body.indexOf(lastImportDeclaration) + 1\n : 0;\n return initCallInsertionIndex;\n}\n"]}
1
+ {"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/sveltekit/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExportNamedDeclaration, Program } from '@babel/types';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as url from 'url';\nimport chalk from 'chalk';\n\nimport * as Sentry from '@sentry/node';\n\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport type { ProxifiedModule } from 'magicast';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, loadFile, parseModule } from 'magicast';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { addVitePlugin } from 'magicast/helpers';\nimport { getClientHooksTemplate, getServerHooksTemplate } from './templates';\nimport { abortIfCancelled, isUsingTypeScript } from '../utils/clack-utils';\nimport { debug } from '../utils/debug';\nimport { findFile, hasSentryContent } from '../utils/ast-utils';\n\nimport * as recast from 'recast';\nimport x = recast.types;\nimport t = x.namedTypes;\nimport { traceStep } from '../telemetry';\n\nconst SVELTE_CONFIG_FILE = 'svelte.config.js';\n\nexport type PartialSvelteConfig = {\n kit?: {\n files?: {\n hooks?: {\n client?: string;\n server?: string;\n };\n routes?: string;\n };\n };\n};\n\ntype ProjectInfo = {\n dsn: string;\n org: string;\n project: string;\n selfHosted: boolean;\n url: string;\n};\n\nexport async function createOrMergeSvelteKitFiles(\n projectInfo: ProjectInfo,\n svelteConfig: PartialSvelteConfig,\n): Promise<void> {\n const { clientHooksPath, serverHooksPath } = getHooksConfigDirs(svelteConfig);\n\n // full file paths with correct file ending (or undefined if not found)\n const originalClientHooksFile = findFile(clientHooksPath);\n const originalServerHooksFile = findFile(serverHooksPath);\n\n const viteConfig = findFile(path.resolve(process.cwd(), 'vite.config'));\n\n const fileEnding = isUsingTypeScript() ? 'ts' : 'js';\n\n const { dsn } = projectInfo;\n\n Sentry.setTag(\n 'client-hooks-file-strategy',\n originalClientHooksFile ? 'merge' : 'create',\n );\n if (!originalClientHooksFile) {\n clack.log.info('No client hooks file found, creating a new one.');\n await createNewHooksFile(`${clientHooksPath}.${fileEnding}`, 'client', dsn);\n } else {\n await mergeHooksFile(originalClientHooksFile, 'client', dsn);\n }\n\n Sentry.setTag(\n 'server-hooks-file-strategy',\n originalServerHooksFile ? 'merge' : 'create',\n );\n if (!originalServerHooksFile) {\n clack.log.info('No server hooks file found, creating a new one.');\n await createNewHooksFile(`${serverHooksPath}.${fileEnding}`, 'server', dsn);\n } else {\n await mergeHooksFile(originalServerHooksFile, 'server', dsn);\n }\n\n if (viteConfig) {\n await modifyViteConfig(viteConfig, projectInfo);\n }\n}\n\n/**\n * Attempts to read the svelte.config.js file to find the location of the hooks files.\n * If users specified a custom location, we'll use that. Otherwise, we'll use the default.\n */\nfunction getHooksConfigDirs(svelteConfig: PartialSvelteConfig): {\n clientHooksPath: string;\n serverHooksPath: string;\n} {\n const relativeUserClientHooksPath = svelteConfig?.kit?.files?.hooks?.client;\n const relativeUserServerHooksPath = svelteConfig?.kit?.files?.hooks?.server;\n const userClientHooksPath =\n relativeUserClientHooksPath &&\n path.resolve(process.cwd(), relativeUserClientHooksPath);\n const userServerHooksPath =\n relativeUserServerHooksPath &&\n path.resolve(process.cwd(), relativeUserServerHooksPath);\n\n const defaulHooksDir = path.resolve(process.cwd(), 'src');\n const defaultClientHooksPath = path.resolve(defaulHooksDir, 'hooks.client'); // file ending missing on purpose\n const defaultServerHooksPath = path.resolve(defaulHooksDir, 'hooks.server'); // same here\n\n return {\n clientHooksPath: userClientHooksPath || defaultClientHooksPath,\n serverHooksPath: userServerHooksPath || defaultServerHooksPath,\n };\n}\n\n/**\n * Reads the template, replaces the dsn placeholder with the actual dsn and writes the file to @param hooksFileDest\n */\nasync function createNewHooksFile(\n hooksFileDest: string,\n hooktype: 'client' | 'server',\n dsn: string,\n): Promise<void> {\n const filledTemplate =\n hooktype === 'client'\n ? getClientHooksTemplate(dsn)\n : getServerHooksTemplate(dsn);\n\n await fs.promises.mkdir(path.dirname(hooksFileDest), { recursive: true });\n await fs.promises.writeFile(hooksFileDest, filledTemplate);\n\n clack.log.success(`Created ${hooksFileDest}`);\n Sentry.setTag(`created-${hooktype}-hooks`, 'success');\n}\n\n/**\n * Merges the users' hooks file with Sentry-related code.\n *\n * Both hooks:\n * - add import * as Sentry\n * - add Sentry.init\n * - add handleError hook wrapper\n *\n * Additionally in Server hook:\n * - add handle hook handler\n */\nasync function mergeHooksFile(\n hooksFile: string,\n hookType: 'client' | 'server',\n dsn: string,\n): Promise<void> {\n const originalHooksMod = await loadFile(hooksFile);\n\n const file: 'server-hooks' | 'client-hooks' = `${hookType}-hooks`;\n\n if (hasSentryContent(originalHooksMod.$ast as t.Program)) {\n // We don't want to mess with files that already have Sentry content.\n // Let's just bail out at this point.\n clack.log.warn(\n `File ${chalk.cyan(\n path.basename(hooksFile),\n )} already contains Sentry code.\nSkipping adding Sentry functionality to.`,\n );\n Sentry.setTag(`modified-${file}`, 'fail');\n Sentry.setTag(`${file}-fail-reason`, 'has-sentry-content');\n return;\n }\n\n await modifyAndRecordFail(\n () =>\n originalHooksMod.imports.$add({\n from: '@sentry/sveltekit',\n imported: '*',\n local: 'Sentry',\n }),\n 'import-injection',\n file,\n );\n\n await modifyAndRecordFail(\n () => {\n if (hookType === 'client') {\n insertClientInitCall(dsn, originalHooksMod);\n } else {\n insertServerInitCall(dsn, originalHooksMod);\n }\n },\n 'init-call-injection',\n file,\n );\n\n await modifyAndRecordFail(\n () => wrapHandleError(originalHooksMod),\n 'wrap-handle-error',\n file,\n );\n\n if (hookType === 'server') {\n await modifyAndRecordFail(\n () => wrapHandle(originalHooksMod),\n 'wrap-handle',\n 'server-hooks',\n );\n }\n\n await modifyAndRecordFail(\n async () => {\n const modifiedCode = originalHooksMod.generate().code;\n await fs.promises.writeFile(hooksFile, modifiedCode);\n },\n 'write-file',\n file,\n );\n\n clack.log.success(`Added Sentry code to ${hooksFile}`);\n Sentry.setTag(`modified-${hookType}-hooks`, 'success');\n}\n\nfunction insertClientInitCall(\n dsn: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalHooksMod: ProxifiedModule<any>,\n): void {\n const initCallComment = `\n // If you don't want to use Session Replay, remove the \\`Replay\\` integration, \n // \\`replaysSessionSampleRate\\` and \\`replaysOnErrorSampleRate\\` options.`;\n\n // This assignment of any values is fine because we're just creating a function call in magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCall = builders.functionCall('Sentry.init', {\n dsn,\n tracesSampleRate: 1.0,\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1.0,\n integrations: [builders.newExpression('Sentry.Replay')],\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCallWithComment = builders.raw(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n `${initCallComment}\\n${generateCode(initCall).code}`,\n );\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n\n const initCallInsertionIndex = getInitCallInsertionIndex(originalHooksModAST);\n\n originalHooksModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-ignore - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCallWithComment).code,\n );\n}\n\nfunction insertServerInitCall(\n dsn: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalHooksMod: ProxifiedModule<any>,\n): void {\n // This assignment of any values is fine because we're just creating a function call in magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCall = builders.functionCall('Sentry.init', {\n dsn,\n tracesSampleRate: 1.0,\n });\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n\n const initCallInsertionIndex = getInitCallInsertionIndex(originalHooksModAST);\n\n originalHooksModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-ignore - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrapHandleError(mod: ProxifiedModule<any>): void {\n const modAst = mod.exports.$ast as Program;\n const namedExports = modAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundHandleError = false;\n\n namedExports.forEach((modExport) => {\n const declaration = modExport.declaration;\n if (!declaration) {\n return;\n }\n if (declaration.type === 'FunctionDeclaration') {\n if (!declaration.id || declaration.id.name !== 'handleError') {\n return;\n }\n foundHandleError = true;\n const userCode = generateCode(declaration).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handleError = builders.raw(\n `Sentry.handleErrorWithSentry(${userCode.replace(\n 'handleError',\n '_handleError',\n )})`,\n );\n // because magicast doesn't overwrite the original function export, we need to remove it manually\n modAst.body = modAst.body.filter((node) => node !== modExport);\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n declarations.forEach((declaration) => {\n // @ts-ignore - id should always have a name in this case\n if (!declaration.id || declaration.id.name !== 'handleError') {\n return;\n }\n foundHandleError = true;\n const userCode = declaration.init;\n const stringifiedUserCode = userCode ? generateCode(userCode).code : '';\n // @ts-ignore - we can just place a string here, magicast will convert it to a node\n declaration.init = `Sentry.handleErrorWithSentry(${stringifiedUserCode})`;\n });\n }\n });\n\n if (!foundHandleError) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handleError = builders.functionCall(\n 'Sentry.handleErrorWithSentry',\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrapHandle(mod: ProxifiedModule<any>): void {\n const modAst = mod.exports.$ast as Program;\n const namedExports = modAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundHandle = false;\n\n namedExports.forEach((modExport) => {\n const declaration = modExport.declaration;\n if (!declaration) {\n return;\n }\n if (declaration.type === 'FunctionDeclaration') {\n if (!declaration.id || declaration.id.name !== 'handle') {\n return;\n }\n foundHandle = true;\n const userCode = generateCode(declaration).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handle = builders.raw(\n `sequence(Sentry.sentryHandle(), ${userCode.replace(\n 'handle',\n '_handle',\n )})`,\n );\n // because of an issue with magicast, we need to remove the original export\n modAst.body = modAst.body.filter((node) => node !== modExport);\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n declarations.forEach((declaration) => {\n // @ts-ignore - id should always have a name in this case\n if (!declaration.id || declaration.id.name !== 'handle') {\n return;\n }\n const userCode = declaration.init;\n const stringifiedUserCode = userCode ? generateCode(userCode).code : '';\n // @ts-ignore - we can just place a string here, magicast will convert it to a node\n declaration.init = `sequence(Sentry.sentryHandle(), ${stringifiedUserCode})`;\n foundHandle = true;\n });\n }\n });\n\n if (!foundHandle) {\n // can't use builders.functionCall here because it doesn't yet\n // support member expressions (Sentry.sentryHandle()) in args\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handle = builders.raw('sequence(Sentry.sentryHandle())');\n }\n\n try {\n mod.imports.$add({\n from: '@sveltejs/kit/hooks',\n imported: 'sequence',\n local: 'sequence',\n });\n } catch (_) {\n // It's possible sequence is already imported. in this case, magicast throws but that's fine.\n }\n}\n\nexport async function loadSvelteConfig(): Promise<PartialSvelteConfig> {\n const configFilePath = path.join(process.cwd(), SVELTE_CONFIG_FILE);\n\n try {\n if (!fs.existsSync(configFilePath)) {\n return {};\n }\n\n const configUrl = url.pathToFileURL(configFilePath).href;\n const svelteConfigModule = (await import(configUrl)) as {\n default: PartialSvelteConfig;\n };\n\n return svelteConfigModule?.default || {};\n } catch (e: unknown) {\n clack.log.error(`Couldn't load ${SVELTE_CONFIG_FILE}.\nPlease make sure, you're running this wizard with Node 16 or newer`);\n clack.log.info(\n chalk.dim(\n typeof e === 'object' && e != null && 'toString' in e\n ? e.toString()\n : typeof e === 'string'\n ? e\n : 'Unknown error',\n ),\n );\n\n return {};\n }\n}\n\nasync function modifyViteConfig(\n viteConfigPath: string,\n projectInfo: ProjectInfo,\n): Promise<void> {\n const viteConfigContent = (\n await fs.promises.readFile(viteConfigPath, 'utf-8')\n ).toString();\n\n const { org, project, url, selfHosted } = projectInfo;\n\n try {\n const viteModule = parseModule(viteConfigContent);\n\n if (hasSentryContent(viteModule.$ast as t.Program)) {\n clack.log.warn(\n `File ${chalk.cyan(\n path.basename(viteConfigPath),\n )} already contains Sentry code.\nSkipping adding Sentry functionality to.`,\n );\n Sentry.setTag(`modified-vite-cfg`, 'fail');\n Sentry.setTag(`vite-cfg-fail-reason`, 'has-sentry-content');\n return;\n }\n\n await modifyAndRecordFail(\n () =>\n addVitePlugin(viteModule, {\n imported: 'sentrySvelteKit',\n from: '@sentry/sveltekit',\n constructor: 'sentrySvelteKit',\n options: {\n sourceMapsUploadOptions: {\n org,\n project,\n ...(selfHosted && { url }),\n },\n },\n index: 0,\n }),\n 'add-vite-plugin',\n 'vite-cfg',\n );\n\n await modifyAndRecordFail(\n async () => {\n const code = generateCode(viteModule.$ast).code;\n await fs.promises.writeFile(viteConfigPath, code);\n },\n 'write-file',\n 'vite-cfg',\n );\n } catch (e) {\n debug(e);\n await showFallbackViteCopyPasteSnippet(\n viteConfigPath,\n getViteConfigCodeSnippet(org, project, selfHosted, url),\n );\n Sentry.captureException('Sveltekit Vite Config Modification Fail');\n }\n}\n\nasync function showFallbackViteCopyPasteSnippet(\n viteConfigPath: string,\n codeSnippet: string,\n) {\n const viteConfigFilename = path.basename(viteConfigPath);\n\n clack.log.warning(\n `Couldn't automatically modify your ${chalk.cyan(viteConfigFilename)}\n${chalk.dim(`This sometimes happens when we encounter more complex vite configs.\nIt may not seem like it but sometimes our magical powers are limited ;)`)}`,\n );\n\n clack.log.info(\"But don't worry - it's super easy to do this yourself!\");\n\n clack.log.step(\n `Add the following code to your ${chalk.cyan(viteConfigFilename)}:`,\n );\n\n // Intentionally logging to console here for easier copy/pasting\n // eslint-disable-next-line no-console\n console.log(codeSnippet);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you copy the snippet above?',\n options: [\n { label: 'Yes!', value: true, hint: \"Great, that's already it!\" },\n ],\n initialValue: true,\n }),\n );\n}\n\nconst getViteConfigCodeSnippet = (\n org: string,\n project: string,\n selfHosted: boolean,\n url: string,\n) =>\n chalk.gray(`\nimport { sveltekit } from '@sveltejs/kit/vite';\nimport { defineConfig } from 'vite';\n${chalk.greenBright(\"import { sentrySvelteKit } from '@sentry/sveltekit'\")}\n\nexport default defineConfig({\n plugins: [\n // Make sure \\`sentrySvelteKit\\` is registered before \\`sveltekit\\`\n ${chalk.greenBright(`sentrySvelteKit({\n sourceMapsUploadOptions: {\n org: '${org}',\n project: '${project}',${selfHosted ? `\\n url: '${url}',` : ''}\n } \n }),`)}\n sveltekit(),\n ]\n});\n`);\n\n/**\n * We want to insert the init call on top of the file but after all import statements\n */\nfunction getInitCallInsertionIndex(originalHooksModAST: Program): number {\n // We need to deep-copy here because reverse mutates in place\n const copiedBodyNodes = [...originalHooksModAST.body];\n const lastImportDeclaration = copiedBodyNodes\n .reverse()\n .find((node) => node.type === 'ImportDeclaration');\n\n const initCallInsertionIndex = lastImportDeclaration\n ? originalHooksModAST.body.indexOf(lastImportDeclaration) + 1\n : 0;\n return initCallInsertionIndex;\n}\n\n/**\n * Applies the @param modifyCallback and records Sentry tags if the call failed.\n * In case of a failure, a tag is set with @param reason as a fail reason\n * and the error is rethrown.\n */\nasync function modifyAndRecordFail<T>(\n modifyCallback: () => T | Promise<T>,\n reason: string,\n fileType: 'server-hooks' | 'client-hooks' | 'vite-cfg',\n): Promise<void> {\n try {\n await traceStep(`${fileType}-${reason}`, modifyCallback);\n } catch (e) {\n Sentry.setTag(`modified-${fileType}`, 'fail');\n Sentry.setTag(`${fileType}-mod-fail-reason`, reason);\n throw e;\n }\n}\n"]}
@@ -1,2 +1,3 @@
1
1
  import { WizardOptions } from '../utils/types';
2
2
  export declare function runSvelteKitWizard(options: WizardOptions): Promise<void>;
3
+ export declare function runSvelteKitWizardWithTelemetry(options: WizardOptions): Promise<void>;