@sentry/wizard 6.11.0 → 6.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +64 -0
- package/dist/bin.js +16 -1
- package/dist/bin.js.map +1 -1
- package/dist/e2e-tests/tests/angular-17.test.js +3 -4
- package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
- package/dist/e2e-tests/tests/angular-19.test.js +3 -4
- package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
- package/dist/e2e-tests/tests/cloudflare-worker.test.js +5 -0
- package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -1
- package/dist/e2e-tests/tests/flutter.test.js +60 -0
- package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
- package/dist/e2e-tests/tests/help-message.test.js +8 -3
- package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-3.test.js +12 -6
- package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-4.test.js +12 -6
- package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
- package/dist/e2e-tests/tests/pnpm-workspace.test.js +8 -4
- package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js +96 -0
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js.map +1 -0
- package/dist/e2e-tests/tests/react-router.test.js +6 -7
- package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
- package/dist/e2e-tests/tests/remix.test.js +2 -4
- package/dist/e2e-tests/tests/remix.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js +24 -8
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js +8 -4
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
- package/dist/lib/Constants.d.ts +1 -0
- package/dist/lib/Constants.js +5 -0
- package/dist/lib/Constants.js.map +1 -1
- package/dist/lib/Steps/Integrations/Electron.js +2 -2
- package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
- package/dist/src/android/android-wizard.js +3 -0
- package/dist/src/android/android-wizard.js.map +1 -1
- package/dist/src/angular/codemods/main.d.ts +1 -1
- package/dist/src/angular/codemods/main.js +0 -1
- package/dist/src/angular/codemods/main.js.map +1 -1
- package/dist/src/apple/apple-wizard.js +2 -3
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/apple/check-installed-cli.d.ts +1 -1
- package/dist/src/apple/check-installed-cli.js +13 -7
- package/dist/src/apple/check-installed-cli.js.map +1 -1
- package/dist/src/apple/code-tools.js +17 -3
- package/dist/src/apple/code-tools.js.map +1 -1
- package/dist/src/apple/configure-package-manager.js +18 -5
- package/dist/src/apple/configure-package-manager.js.map +1 -1
- package/dist/src/apple/configure-xcode-project.js +8 -1
- package/dist/src/apple/configure-xcode-project.js.map +1 -1
- package/dist/src/apple/lookup-xcode-project.d.ts +8 -5
- package/dist/src/apple/lookup-xcode-project.js +22 -17
- package/dist/src/apple/lookup-xcode-project.js.map +1 -1
- package/dist/src/apple/options.d.ts +5 -0
- package/dist/src/apple/options.js.map +1 -1
- package/dist/src/apple/sentry-swift-package.d.ts +4 -0
- package/dist/src/apple/sentry-swift-package.js +17 -0
- package/dist/src/apple/sentry-swift-package.js.map +1 -0
- package/dist/src/apple/snapshots/apple-snapshots-wizard.d.ts +2 -0
- package/dist/src/apple/snapshots/apple-snapshots-wizard.js +251 -0
- package/dist/src/apple/snapshots/apple-snapshots-wizard.js.map +1 -0
- package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.d.ts +13 -0
- package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.js +48 -0
- package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.js.map +1 -0
- package/dist/src/apple/snapshots/snapshot-test-file.d.ts +18 -0
- package/dist/src/apple/snapshots/snapshot-test-file.js +122 -0
- package/dist/src/apple/snapshots/snapshot-test-file.js.map +1 -0
- package/dist/src/apple/snapshots/snapshot-verification-scheme.d.ts +6 -0
- package/dist/src/apple/snapshots/snapshot-verification-scheme.js +147 -0
- package/dist/src/apple/snapshots/snapshot-verification-scheme.js.map +1 -0
- package/dist/src/apple/snapshots/snapshotpreviews-package.d.ts +4 -0
- package/dist/src/apple/snapshots/snapshotpreviews-package.js +8 -0
- package/dist/src/apple/snapshots/snapshotpreviews-package.js.map +1 -0
- package/dist/src/apple/snapshots/snapshots-cli-preflight.d.ts +23 -0
- package/dist/src/apple/snapshots/snapshots-cli-preflight.js +136 -0
- package/dist/src/apple/snapshots/snapshots-cli-preflight.js.map +1 -0
- package/dist/src/apple/xcode-manager.d.ts +59 -1
- package/dist/src/apple/xcode-manager.js +507 -106
- package/dist/src/apple/xcode-manager.js.map +1 -1
- package/dist/src/cloudflare/cloudflare-wizard.js +5 -0
- package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -1
- package/dist/src/cloudflare/sdk-setup.d.ts +1 -0
- package/dist/src/cloudflare/sdk-setup.js.map +1 -1
- package/dist/src/cloudflare/templates.d.ts +1 -0
- package/dist/src/cloudflare/templates.js +7 -1
- package/dist/src/cloudflare/templates.js.map +1 -1
- package/dist/src/cloudflare/wrap-worker.d.ts +1 -0
- package/dist/src/cloudflare/wrap-worker.js +7 -0
- package/dist/src/cloudflare/wrap-worker.js.map +1 -1
- package/dist/src/flutter/flutter-wizard.js +3 -0
- package/dist/src/flutter/flutter-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.js +12 -6
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/nuxt/templates.js +12 -6
- package/dist/src/nuxt/templates.js.map +1 -1
- package/dist/src/react-native/expo.d.ts +6 -0
- package/dist/src/react-native/expo.js +27 -1
- package/dist/src/react-native/expo.js.map +1 -1
- package/dist/src/react-native/git.d.ts +5 -0
- package/dist/src/react-native/git.js +32 -1
- package/dist/src/react-native/git.js.map +1 -1
- package/dist/src/react-native/javascript.js +3 -1
- package/dist/src/react-native/javascript.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +12 -6
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-router/codemods/client.entry.d.ts +1 -1
- package/dist/src/react-router/codemods/client.entry.js +124 -26
- package/dist/src/react-router/codemods/client.entry.js.map +1 -1
- package/dist/src/react-router/codemods/react-router-config.js +1 -1
- package/dist/src/react-router/codemods/react-router-config.js.map +1 -1
- package/dist/src/react-router/codemods/server-entry.d.ts +1 -1
- package/dist/src/react-router/codemods/server-entry.js +40 -4
- package/dist/src/react-router/codemods/server-entry.js.map +1 -1
- package/dist/src/react-router/codemods/vite.js +46 -1
- package/dist/src/react-router/codemods/vite.js.map +1 -1
- package/dist/src/react-router/react-router-wizard.js +62 -21
- package/dist/src/react-router/react-router-wizard.js.map +1 -1
- package/dist/src/react-router/sdk-setup.d.ts +5 -3
- package/dist/src/react-router/sdk-setup.js +44 -16
- package/dist/src/react-router/sdk-setup.js.map +1 -1
- package/dist/src/react-router/templates.d.ts +2 -4
- package/dist/src/react-router/templates.js +89 -87
- package/dist/src/react-router/templates.js.map +1 -1
- package/dist/src/remix/sdk-setup.js +1 -2
- package/dist/src/remix/sdk-setup.js.map +1 -1
- package/dist/src/run.d.ts +4 -1
- package/dist/src/run.js +13 -0
- package/dist/src/run.js.map +1 -1
- package/dist/src/sourcemaps/tools/remix.js +4 -4
- package/dist/src/sourcemaps/tools/remix.js.map +1 -1
- package/dist/src/sourcemaps/tools/vite.js +1 -1
- package/dist/src/sourcemaps/tools/vite.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup/setup.js +17 -4
- package/dist/src/sveltekit/sdk-setup/setup.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup/vite.js +1 -1
- package/dist/src/sveltekit/sdk-setup/vite.js.map +1 -1
- package/dist/src/sveltekit/templates.js +12 -6
- package/dist/src/sveltekit/templates.js.map +1 -1
- package/dist/src/utils/ast-utils.d.ts +10 -0
- package/dist/src/utils/ast-utils.js +19 -1
- package/dist/src/utils/ast-utils.js.map +1 -1
- package/dist/src/utils/clack/index.d.ts +2 -1
- package/dist/src/utils/clack/index.js +17 -6
- package/dist/src/utils/clack/index.js.map +1 -1
- package/dist/src/utils/files.d.ts +2 -0
- package/dist/src/utils/files.js +58 -0
- package/dist/src/utils/files.js.map +1 -0
- package/dist/src/utils/git.d.ts +3 -1
- package/dist/src/utils/git.js +2 -1
- package/dist/src/utils/git.js.map +1 -1
- package/dist/src/utils/line-endings.d.ts +1 -0
- package/dist/src/utils/line-endings.js +76 -0
- package/dist/src/utils/line-endings.js.map +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/test/angular/angular-wizard.test.js +0 -5
- package/dist/test/angular/angular-wizard.test.js.map +1 -1
- package/dist/test/apple/code-tools.test.js +78 -0
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/configure-package-manager.test.d.ts +1 -0
- package/dist/test/apple/configure-package-manager.test.js +161 -0
- package/dist/test/apple/configure-package-manager.test.js.map +1 -0
- package/dist/test/apple/lookup-xcode-project.test.d.ts +1 -0
- package/dist/test/apple/lookup-xcode-project.test.js +167 -0
- package/dist/test/apple/lookup-xcode-project.test.js.map +1 -0
- package/dist/test/apple/snapshots/apple-snapshots-wizard.test.d.ts +1 -0
- package/dist/test/apple/snapshots/apple-snapshots-wizard.test.js +487 -0
- package/dist/test/apple/snapshots/apple-snapshots-wizard.test.js.map +1 -0
- package/dist/test/apple/snapshots/hosted-test-target-fixture.d.ts +24 -0
- package/dist/test/apple/snapshots/hosted-test-target-fixture.js +191 -0
- package/dist/test/apple/snapshots/hosted-test-target-fixture.js.map +1 -0
- package/dist/test/apple/snapshots/snapshot-test-file.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshot-test-file.test.js +110 -0
- package/dist/test/apple/snapshots/snapshot-test-file.test.js.map +1 -0
- package/dist/test/apple/snapshots/snapshot-verification-scheme.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshot-verification-scheme.test.js +146 -0
- package/dist/test/apple/snapshots/snapshot-verification-scheme.test.js.map +1 -0
- package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.js +186 -0
- package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.js.map +1 -0
- package/dist/test/apple/snapshots/snapshots-cli-preflight.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshots-cli-preflight.test.js +192 -0
- package/dist/test/apple/snapshots/snapshots-cli-preflight.test.js.map +1 -0
- package/dist/test/apple/snapshots/source-file-insertion.test.d.ts +1 -0
- package/dist/test/apple/snapshots/source-file-insertion.test.js +77 -0
- package/dist/test/apple/snapshots/source-file-insertion.test.js.map +1 -0
- package/dist/test/apple/xcode-manager.test.js +452 -43
- package/dist/test/apple/xcode-manager.test.js.map +1 -1
- package/dist/test/cloudflare/sdk-setup.test.js +20 -2
- package/dist/test/cloudflare/sdk-setup.test.js.map +1 -1
- package/dist/test/cloudflare/templates.test.js +54 -0
- package/dist/test/cloudflare/templates.test.js.map +1 -1
- package/dist/test/cloudflare/wrap-worker.test.js +74 -11
- package/dist/test/cloudflare/wrap-worker.test.js.map +1 -1
- package/dist/test/constants.test.d.ts +1 -0
- package/dist/test/constants.test.js +12 -0
- package/dist/test/constants.test.js.map +1 -0
- package/dist/test/nextjs/templates.test.js +66 -33
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/nuxt/templates.test.js +66 -36
- package/dist/test/nuxt/templates.test.js.map +1 -1
- package/dist/test/react-native/expo.test.js +140 -0
- package/dist/test/react-native/expo.test.js.map +1 -1
- package/dist/test/react-native/git.test.d.ts +1 -0
- package/dist/test/react-native/git.test.js +160 -0
- package/dist/test/react-native/git.test.js.map +1 -0
- package/dist/test/react-router/codemods/client-entry.test.js +38 -5
- package/dist/test/react-router/codemods/client-entry.test.js.map +1 -1
- package/dist/test/react-router/codemods/server-entry.test.js +83 -0
- package/dist/test/react-router/codemods/server-entry.test.js.map +1 -1
- package/dist/test/react-router/codemods/vite.test.js +89 -0
- package/dist/test/react-router/codemods/vite.test.js.map +1 -1
- package/dist/test/react-router/sdk-setup.test.js +98 -6
- package/dist/test/react-router/sdk-setup.test.js.map +1 -1
- package/dist/test/react-router/templates.test.js +50 -38
- package/dist/test/react-router/templates.test.js.map +1 -1
- package/dist/test/remix/build-script.test.d.ts +1 -0
- package/dist/test/remix/build-script.test.js +124 -0
- package/dist/test/remix/build-script.test.js.map +1 -0
- package/dist/test/remix/client-entry.test.js +4 -10
- package/dist/test/remix/client-entry.test.js.map +1 -1
- package/dist/test/run.test.d.ts +1 -0
- package/dist/test/run.test.js +137 -0
- package/dist/test/run.test.js.map +1 -0
- package/dist/test/sourcemaps/tools/vite.test.js +12 -8
- package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
- package/dist/test/sveltekit/templates.test.js +78 -27
- package/dist/test/sveltekit/templates.test.js.map +1 -1
- package/dist/test/utils/ast-utils.test.js +22 -0
- package/dist/test/utils/ast-utils.test.js.map +1 -1
- package/dist/test/utils/clack/index.test.js +101 -0
- package/dist/test/utils/clack/index.test.js.map +1 -1
- package/dist/test/utils/git.test.js +10 -0
- package/dist/test/utils/git.test.js.map +1 -1
- package/dist/test/utils/line-endings.test.d.ts +1 -0
- package/dist/test/utils/line-endings.test.js +103 -0
- package/dist/test/utils/line-endings.test.js.map +1 -0
- package/package.json +2 -2
- package/dist/src/react-router/codemods/root.d.ts +0 -1
- package/dist/src/react-router/codemods/root.js +0 -171
- package/dist/src/react-router/codemods/root.js.map +0 -1
- package/dist/test/react-router/codemods/root.test.js +0 -178
- package/dist/test/react-router/codemods/root.test.js.map +0 -1
- /package/dist/{test/react-router/codemods/root.test.d.ts → e2e-tests/tests/react-router-instrumentation-api.test.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-setup.test.js","sourceRoot":"","sources":["../../../test/react-router/sdk-setup.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAA8D;AAE9D,MAAM,EAAE,UAAU,EAAE,GAAG,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE;IACrC,MAAM,IAAI,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;IACtB,MAAM,OAAO,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;IACtB,MAAM,OAAO,GAAG,WAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,6BAA6B;IAElF,OAAO;QACL,UAAU,EAAE;YACV,IAAI;YACJ,IAAI;YACJ,KAAK;YACL,OAAO;YACP,KAAK;YACL,OAAO;SACR;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,WAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC7B,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE;YACP,GAAG,EAAE;gBACH,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,OAAO,EAAE,UAAU,CAAC,OAAO;aAC5B;YACD,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,WAAE,CAAC,OAAO,CACxE,GAAG,EAAE;IACH,OAAO;QACL,cAAc,EAAE,WAAE,CAAC,EAAE,EAAE;QACvB,gBAAgB,EAAE,WAAE,CAAC,EAAE,EAAE;QACzB,iBAAiB,EAAE,WAAE,CAAC,EAAE,EAAE;KAC3B,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,GAAG,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzE,qBAAqB,EAAE,WAAE,CAAC,EAAE,EAAE;IAC9B,qBAAqB,EAAE,WAAE,CAAC,EAAE,EAAE;CAC/B,CAAC,CAAC,CAAC;AAEJ,WAAE,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,iBAAiB,EAAE,qBAAqB;IACxC,iBAAiB,EAAE,qBAAqB;CACzC,CAAC,CAAC,CAAC;AAEJ,WAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;IACvB,OAAO;QACL,GAAG,CAAC,MAAM,WAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAChC,UAAU,EAAE,cAAc;QAC1B,YAAY,EAAE,gBAAgB;QAC9B,aAAa,EAAE,iBAAiB;QAChC,QAAQ,EAAE;YACR,SAAS,EAAE,WAAE,CAAC,EAAE,EAAE;SACnB;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,+CAA+C;AAC/C,WAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,WAAE,CAAC,EAAE,EAAE;CAClB,CAAC,CAAC,CAAC;AAEJ,uEAAuE;AACvE,WAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACpC,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,yBAAyB,EAAE,WAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACzD,eAAe,EAAE,WAAE,CAAC,EAAE,CACpB,CACE,MAAe,EACf,QAIW,EACX,EAAE;YACF,gFAAgF;YAChF,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC;YACvC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1C,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,CACF;QACD,iBAAiB,EAAE,qBAAqB;KACzC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,gEAM0C;AAC1C,4DAA8C;AAE9C,gEAAyF;AAEzF,IAAA,iBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,WAAE,CAAC,aAAa,EAAE,CAAC;QAEnB,qBAAqB,CAAC,kBAAkB,CACtC,CACE,WAAmB,EACnB,WAGC,EACD,EAAE;YACF,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,EAAE;gBAC3C,OAAO,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;aAC9C;YACD,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,EAAE;gBAC9C,OAAO,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;aACjD;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAA,WAAE,EAAC,4EAA4E,EAAE,GAAG,EAAE;YACpF,IAAA,eAAM,EACJ,IAAA,2BAAe,EAAC,EAAE,YAAY,EAAE,EAAE,mBAAmB,EAAE,OAAO,EAAE,EAAE,CAAC,CACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,IAAA,eAAM,EACJ,IAAA,2BAAe,EAAC,EAAE,YAAY,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,EAAE,CAAC,CACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,IAAA,eAAM,EACJ,IAAA,2BAAe,EAAC;gBACd,eAAe,EAAE,EAAE,mBAAmB,EAAE,OAAO,EAAE;aAClD,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,IAAA,eAAM,EACJ,IAAA,2BAAe,EAAC,EAAE,YAAY,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,EAAE,CAAC,CACrE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,IAAA,eAAM,EAAC,IAAA,2BAAe,EAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAClE,KAAK,CACN,CAAC;YACF,IAAA,eAAM,EAAC,IAAA,2BAAe,EAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,IAAA,WAAE,EAAC,uEAAuE,EAAE,GAAG,EAAE;YAC/E,MAAM,GAAG,GAAG,uBAAuB,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC;YAC3B,MAAM,eAAe,GAAG,KAAK,CAAC;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC;YAExB,MAAM,MAAM,GAAG,IAAA,iDAAqC,EAClD,GAAG,EACH,aAAa,EACb,eAAe,EACf,UAAU,CACX,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;YACzD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,GAAG,GAAG,uBAAuB,CAAC;YACpC,MAAM,aAAa,GAAG,KAAK,CAAC;YAC5B,MAAM,eAAe,GAAG,KAAK,CAAC;YAC9B,MAAM,UAAU,GAAG,KAAK,CAAC;YAEzB,MAAM,MAAM,GAAG,IAAA,iDAAqC,EAClD,GAAG,EACH,aAAa,EACb,eAAe,EACf,UAAU,CACX,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;YACzD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,cAAc,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAErC,YAAY,CAAC,QAA4B,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAE1E,IAAA,gCAAoB,GAAE,CAAC;QAEvB,IAAA,eAAM,EAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAChD,yBAAyB,EACzB;YACE,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,MAAM;SACd,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEpC,YAAY,CAAC,QAA4B,CAAC,SAAS,EAAE,CAAC;QAEvD,IAAA,gCAAoB,GAAE,CAAC;QAEvB,IAAA,eAAM,EAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,iBAAiB,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAEtD,MAAM,IAAI,GAAG,IAAA,2CAA+B,EAAC,uBAAuB,EAAE;YACpE,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAChD,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAGjD,CAAC;QACF,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAC5B,eAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CACjD,CAAC;QACF,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAC5B,eAAM,CAAC,gBAAgB,CAAC,8BAA8B,CAAC,CACxD,CAAC;QACF,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAC5B,eAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAC/C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,eAAe,GAAG,kBAAkB,CAAC;QAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QAEzC,4CAA4C;QAC5C,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE/C,2BAA2B;QAC1B,YAAY,CAAC,QAA4B,CAAC,mBAAmB,CAC5D,oCAAoC,CACrC,CAAC;QAEF,kCAAkC;QAClC,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,IAAA,6CAAiC,EACpD,eAAe,EACf,QAAQ,CACT,CAAC;QAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAA,eAAM,EAAC,UAAU,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC;YAC9C,OAAO,EAAE,eAAM,CAAC,gBAAgB,CAC9B,+BAA+B,CACtB;YACX,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAC1C,eAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CACnC,CAAC;QACF,IAAA,eAAM,EAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAChD,yBAAyB,EACzB;YACE,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,MAAM;SACd,CACF,CAAC;QACF,IAAA,eAAM,EAAC,UAAU,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAC7C,eAAM,CAAC,gBAAgB,CAAC,6CAA6C,CAAC,CACvE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,eAAe,GAAG,kBAAkB,CAAC;QAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QAEzC,2CAA2C;QAC3C,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,IAAA,6CAAiC,EACpD,eAAe,EACf,QAAQ,CACT,CAAC;QAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAA,eAAM,EAAC,UAAU,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC9C,IAAA,eAAM,EAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACrD,IAAA,eAAM,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,eAAe,GAAG,kBAAkB,CAAC;QAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QAEzC,4CAA4C;QAC5C,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE/C,2BAA2B;QAC1B,YAAY,CAAC,QAA4B,CAAC,mBAAmB,CAC5D,gBAAgB,CACjB,CAAC;QAEF,sCAAsC;QACtC,cAAc,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,MAAM,IAAA,6CAAiC,EACpD,eAAe,EACf,QAAQ,CACT,CAAC;QAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAA,eAAM,EAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACjD,IAAA,eAAM,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAC1C,eAAM,CAAC,gBAAgB,CACrB,uDAAuD,CACxD,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,eAAe,GAAG,kBAAkB,CAAC;QAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QAEzC,4CAA4C;QAC5C,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE/C,kCAAkC;QAClC,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7C,YAAY,CAAC,QAA4B,CAAC,sBAAsB,CAAC,GAAG,EAAE;YACrE,MAAM,SAAS,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,IAAA,6CAAiC,EACpD,eAAe,EACf,QAAQ,CACT,CAAC;QAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAA,eAAM,EAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACjD,IAAA,eAAM,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAC1C,eAAM,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,CACjE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,eAAe,GAAG,kBAAkB,CAAC;QAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QACzC,MAAM,aAAa,GAAG,oCAAoC,CAAC;QAE3D,4CAA4C;QAC5C,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE/C,uCAAuC;QACtC,YAAY,CAAC,QAA4B,CAAC,mBAAmB,CAC5D,aAAa,CACd,CAAC;QAEF,kCAAkC;QAClC,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,IAAA,6CAAiC,EAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAEnE,IAAA,eAAM,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,eAAe,GAAG,kBAAkB,CAAC;QAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QAEzC,uBAAuB;QACvB,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE/C,2BAA2B;QAC1B,YAAY,CAAC,QAA4B,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAErE,qBAAqB;QACrB,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,IAAA,6CAAiC,EAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAEnE,IAAA,eAAM,EAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAChD,yBAAyB,EACzB;YACE,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,MAAM;SACd,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iHAAiH,EAAE,KAAK,IAAI,EAAE;QAC/H,MAAM,eAAe,GAAwC;YAC3D,OAAO,EAAE;gBACP,GAAG,EAAE,kBAAkB;gBACvB,KAAK,EAAE,oBAAoB;gBAC3B,KAAK,EAAE,oBAAoB;aAC5B;SACF,CAAC;QAEF,yDAAyD;QACzD,qBAAqB,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAEzD,6BAA6B;QAC7B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,WAAE;aACrB,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC;aACvC,iBAAiB,EAAE,CAAC;QAEvB,MAAM,IAAA,oCAAwB,GAAE,CAAC;QAEjC,8BAA8B;QAC9B,IAAA,eAAM,EAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAEzC,yCAAyC;QACzC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAW,CACJ,CAAC;QAEzC,sGAAsG;QACtG,IAAA,eAAM,EAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CACrC,kEAAkE,CACnE,CAAC;QAEF,4FAA4F;QAC5F,IAAA,eAAM,EAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CACvC,4FAA4F,CAC7F,CAAC;QAEF,2CAA2C;QAC3C,IAAA,eAAM,EAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,eAAe,GAAwC;YAC3D,OAAO,EAAE;gBACP,KAAK,EAAE,oBAAoB;aAC5B;SACF,CAAC;QAEF,yDAAyD;QACzD,qBAAqB,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAEzD,6BAA6B;QAC7B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,WAAE;aACrB,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC;aACvC,iBAAiB,EAAE,CAAC;QAEvB,MAAM,IAAA,oCAAwB,GAAE,CAAC;QAEjC,8DAA8D;QAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAW,CACJ,CAAC;QACzC,IAAA,eAAM,EAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CACvC,4FAA4F,CAC7F,CAAC;QACF,IAAA,eAAM,EAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,eAAe,GAAG;YACtB,OAAO,EAAE;gBACP,KAAK,EAAE,oBAAoB;aAC5B;SACF,CAAC;QAEF,qEAAqE;QACrE,qBAAqB,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAEzD,MAAM,IAAA,eAAM,EAAC,IAAA,oCAAwB,GAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CACtD,gJAAgJ,CACjJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,eAAe,GAAwC;YAC3D,OAAO,EAAE;gBACP,GAAG,EAAE,yDAAyD;gBAC9D,KAAK,EAAE,oBAAoB;aAC5B;SACF,CAAC;QAEF,qBAAqB,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAEzD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,WAAE;aACrB,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC;aACvC,iBAAiB,EAAE,CAAC;QAEvB,MAAM,IAAA,oCAAwB,GAAE,CAAC;QAEjC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAW,CACJ,CAAC;QAEzC,sEAAsE;QACtE,IAAA,eAAM,EAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CACrC,4FAA4F,CAC7F,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,eAAe,GAAwC;YAC3D,OAAO,EAAE;gBACP,KAAK,EACH,sFAAsF;aACzF;SACF,CAAC;QAEF,qBAAqB,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAEzD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,WAAE;aACrB,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC;aACvC,iBAAiB,EAAE,CAAC;QAEvB,MAAM,IAAA,oCAAwB,GAAE,CAAC;QAEjC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAW,CACJ,CAAC;QAEzC,sEAAsE;QACtE,IAAA,eAAM,EAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CACvC,yHAAyH,CAC1H,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,eAAe,GAAwC;YAC3D,OAAO,EAAE;gBACP,GAAG,EAAE,2DAA2D;gBAChE,KAAK,EAAE,wDAAwD;aAChE;SACF,CAAC;QAEF,qBAAqB,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAEzD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,WAAE;aACrB,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC;aACvC,iBAAiB,EAAE,CAAC;QAEvB,MAAM,IAAA,oCAAwB,GAAE,CAAC;QAEjC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAW,CACJ,CAAC;QAEzC,sCAAsC;QACtC,IAAA,eAAM,EAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CACrC,4FAA4F,CAC7F,CAAC;QACF,IAAA,eAAM,EAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CACvC,yFAAyF,CAC1F,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it, vi, beforeEach } from 'vitest';\n\nconst { clackMocks } = vi.hoisted(() => {\n const info = vi.fn();\n const warn = vi.fn();\n const error = vi.fn();\n const success = vi.fn();\n const outro = vi.fn();\n const confirm = vi.fn(() => Promise.resolve(false)); // default to false for tests\n\n return {\n clackMocks: {\n info,\n warn,\n error,\n success,\n outro,\n confirm,\n },\n };\n});\n\nvi.mock('@clack/prompts', () => {\n return {\n __esModule: true,\n default: {\n log: {\n info: clackMocks.info,\n warn: clackMocks.warn,\n error: clackMocks.error,\n success: clackMocks.success,\n },\n outro: clackMocks.outro,\n confirm: clackMocks.confirm,\n },\n };\n});\n\nconst { existsSyncMock, readFileSyncMock, writeFileSyncMock } = vi.hoisted(\n () => {\n return {\n existsSyncMock: vi.fn(),\n readFileSyncMock: vi.fn(),\n writeFileSyncMock: vi.fn(),\n };\n },\n);\n\nconst { getPackageDotJsonMock, getPackageVersionMock } = vi.hoisted(() => ({\n getPackageDotJsonMock: vi.fn(),\n getPackageVersionMock: vi.fn(),\n}));\n\nvi.mock('../../src/utils/package-json', () => ({\n getPackageDotJson: getPackageDotJsonMock,\n getPackageVersion: getPackageVersionMock,\n}));\n\nvi.mock('fs', async () => {\n return {\n ...(await vi.importActual('fs')),\n existsSync: existsSyncMock,\n readFileSync: readFileSyncMock,\n writeFileSync: writeFileSyncMock,\n promises: {\n writeFile: vi.fn(),\n },\n };\n});\n\n// module-level mock for child_process.execSync\nvi.mock('child_process', () => ({\n __esModule: true,\n execSync: vi.fn(),\n}));\n\n// mock showCopyPasteInstructions and makeCodeSnippet used by templates\nvi.mock('../../src/utils/clack', () => {\n return {\n __esModule: true,\n showCopyPasteInstructions: vi.fn(() => Promise.resolve()),\n makeCodeSnippet: vi.fn(\n (\n colors: boolean,\n callback: (\n unchanged: (str: string) => string,\n plus: (str: string) => string,\n minus: (str: string) => string,\n ) => string,\n ) => {\n // Mock implementation that just calls the callback with simple string functions\n const unchanged = (str: string) => str;\n const plus = (str: string) => `+ ${str}`;\n const minus = (str: string) => `- ${str}`;\n return callback(unchanged, plus, minus);\n },\n ),\n getPackageDotJson: getPackageDotJsonMock,\n };\n});\n\nimport {\n isReactRouterV7,\n runReactRouterReveal,\n createServerInstrumentationFile,\n tryRevealAndGetManualInstructions,\n updatePackageJsonScripts,\n} from '../../src/react-router/sdk-setup';\nimport * as childProcess from 'child_process';\nimport type { Mock } from 'vitest';\nimport { getSentryInstrumentationServerContent } from '../../src/react-router/templates';\n\ndescribe('React Router SDK Setup', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n\n getPackageVersionMock.mockImplementation(\n (\n packageName: string,\n packageJson: {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n },\n ) => {\n if (packageJson.dependencies?.[packageName]) {\n return packageJson.dependencies[packageName];\n }\n if (packageJson.devDependencies?.[packageName]) {\n return packageJson.devDependencies[packageName];\n }\n return null;\n },\n );\n });\n\n describe('isReactRouterV7', () => {\n it('should return true for React Router v7+ in dependencies or devDependencies', () => {\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '7.0.0' } }),\n ).toBe(true);\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '^7.1.0' } }),\n ).toBe(true);\n expect(\n isReactRouterV7({\n devDependencies: { '@react-router/dev': '7.1.0' },\n }),\n ).toBe(true);\n });\n\n it('should return false for React Router v6 or missing dependency', () => {\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '6.28.0' } }),\n ).toBe(false);\n expect(isReactRouterV7({ dependencies: { react: '^18.0.0' } })).toBe(\n false,\n );\n expect(isReactRouterV7({})).toBe(false);\n });\n });\n\n describe('generateServerInstrumentation', () => {\n it('should generate server instrumentation file with all features enabled', () => {\n const dsn = 'https://sentry.io/123';\n const enableTracing = true;\n const enableProfiling = false;\n const enableLogs = true;\n\n const result = getSentryInstrumentationServerContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain('dsn: \"https://sentry.io/123\"');\n expect(result).toContain('tracesSampleRate: 1');\n expect(result).toContain('enableLogs: true');\n });\n\n it('should generate server instrumentation file when performance is disabled', () => {\n const dsn = 'https://sentry.io/123';\n const enableTracing = false;\n const enableProfiling = false;\n const enableLogs = false;\n\n const result = getSentryInstrumentationServerContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain('dsn: \"https://sentry.io/123\"');\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('enableLogs: true');\n });\n });\n});\n\ndescribe('runReactRouterReveal', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('runs the reveal CLI when entry files are missing', () => {\n existsSyncMock.mockReturnValue(false);\n\n (childProcess.execSync as unknown as Mock).mockImplementation(() => 'ok');\n\n runReactRouterReveal();\n\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n });\n\n it('does not run the reveal CLI when entry files already exist', () => {\n existsSyncMock.mockReturnValue(true);\n\n (childProcess.execSync as unknown as Mock).mockReset();\n\n runReactRouterReveal();\n\n expect(childProcess.execSync).not.toHaveBeenCalled();\n });\n});\n\ndescribe('server instrumentation helpers', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('createServerInstrumentationFile writes instrumentation file and returns path', () => {\n writeFileSyncMock.mockImplementation(() => undefined);\n\n const path = createServerInstrumentationFile('https://sentry.io/123', {\n performance: true,\n replay: false,\n logs: true,\n profiling: false,\n });\n\n expect(path).toContain('instrument.server.mjs');\n expect(writeFileSyncMock).toHaveBeenCalled();\n const writtenCall = writeFileSyncMock.mock.calls[0] as unknown as [\n string,\n string,\n ];\n expect(writtenCall[0]).toEqual(\n expect.stringContaining('instrument.server.mjs'),\n );\n expect(writtenCall[1]).toEqual(\n expect.stringContaining('dsn: \"https://sentry.io/123\"'),\n );\n expect(writtenCall[1]).toEqual(\n expect.stringContaining('tracesSampleRate: 1'),\n );\n });\n});\n\ndescribe('tryRevealAndGetManualInstructions', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('should return true when user confirms and reveal command succeeds', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n 'Successfully generated entry files',\n );\n\n // Mock file existing after reveal\n existsSyncMock.mockReturnValueOnce(true);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(true);\n expect(clackMocks.confirm).toHaveBeenCalledWith({\n message: expect.stringContaining(\n 'Would you like to try running',\n ) as string,\n initialValue: true,\n });\n expect(clackMocks.info).toHaveBeenCalledWith(\n expect.stringContaining('Running'),\n );\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n expect(clackMocks.success).toHaveBeenCalledWith(\n expect.stringContaining('Found entry.client.tsx after running reveal'),\n );\n });\n\n it('should return false when user declines reveal operation', async () => {\n const missingFilename = 'entry.server.tsx';\n const filePath = '/app/entry.server.tsx';\n\n // Mock user declining the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(false);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(clackMocks.confirm).toHaveBeenCalled();\n expect(childProcess.execSync).not.toHaveBeenCalled();\n expect(clackMocks.info).not.toHaveBeenCalled();\n });\n\n it('should return false when reveal command succeeds but file still does not exist', async () => {\n const missingFilename = 'entry.client.jsx';\n const filePath = '/app/entry.client.jsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n 'Command output',\n );\n\n // Mock file NOT existing after reveal\n existsSyncMock.mockReturnValueOnce(false);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(childProcess.execSync).toHaveBeenCalled();\n expect(clackMocks.warn).toHaveBeenCalledWith(\n expect.stringContaining(\n 'entry.client.jsx still not found after running reveal',\n ),\n );\n });\n\n it('should return false when reveal command throws an error', async () => {\n const missingFilename = 'entry.server.jsx';\n const filePath = '/app/entry.server.jsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync throwing an error\n const mockError = new Error('Command failed');\n (childProcess.execSync as unknown as Mock).mockImplementationOnce(() => {\n throw mockError;\n });\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(childProcess.execSync).toHaveBeenCalled();\n expect(clackMocks.warn).toHaveBeenCalledWith(\n expect.stringContaining('Failed to run npx react-router reveal'),\n );\n });\n\n it('should log command output when reveal succeeds', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n const commandOutput = 'Generated entry files successfully';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding with output\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n commandOutput,\n );\n\n // Mock file existing after reveal\n existsSyncMock.mockReturnValueOnce(true);\n\n await tryRevealAndGetManualInstructions(missingFilename, filePath);\n\n expect(clackMocks.info).toHaveBeenCalledWith(commandOutput);\n });\n\n it('should handle reveal command with proper parameters', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n\n // Mock user confirming\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce('ok');\n\n // Mock file existing\n existsSyncMock.mockReturnValueOnce(true);\n\n await tryRevealAndGetManualInstructions(missingFilename, filePath);\n\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n });\n});\n\ndescribe('updatePackageJsonScripts', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('should set NODE_ENV=production for both dev and start scripts (workaround for React Router v7 + React 19 issue)', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'react-router dev',\n start: 'react-router serve',\n build: 'react-router build',\n },\n };\n\n // Mock getPackageDotJson to return our test package.json\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n // Mock fs.promises.writeFile\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n // Verify writeFile was called\n expect(writeFileMock).toHaveBeenCalled();\n\n // Check the written package.json content\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Both dev and start scripts should use the correct filenames and commands according to documentation\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--import ./instrument.server.mjs' react-router dev\",\n );\n\n // The start script should use react-router-serve with build path according to documentation\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n\n // The build script should remain unchanged\n expect(writtenContent.scripts.build).toBe('react-router build');\n });\n\n it('should handle package.json with only start script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n start: 'react-router serve',\n },\n };\n\n // Mock getPackageDotJson to return our test package.json\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n // Mock fs.promises.writeFile\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n // Verify only start script is modified when dev doesn't exist\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n expect(writtenContent.scripts.dev).toBeUndefined();\n });\n\n it('should throw error when no start script exists', async () => {\n const mockPackageJson = {\n scripts: {\n build: 'react-router build',\n },\n };\n\n // Mock getPackageDotJson to return package.json without start script\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n await expect(updatePackageJsonScripts()).rejects.toThrow(\n 'Could not find a `start` script in your package.json. Please add: \"start\": \"react-router-serve ./build/server/index.js\" and re-run the wizard.',\n );\n });\n\n it('should handle unquoted NODE_OPTIONS in dev script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'NODE_OPTIONS=--loader ts-node/register react-router dev',\n start: 'react-router serve',\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should merge unquoted NODE_OPTIONS and wrap result in single quotes\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--loader ts-node/register --import ./instrument.server.mjs' react-router dev\",\n );\n });\n\n it('should handle unquoted NODE_OPTIONS in start script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n start:\n 'NODE_OPTIONS=--require ./dotenv-config.js react-router-serve ./build/server/index.js',\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should merge unquoted NODE_OPTIONS and wrap result in single quotes\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--require ./dotenv-config.js --import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n });\n\n it('should handle quoted NODE_OPTIONS and standardize to single quotes', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'NODE_OPTIONS=\"--max-old-space-size=4096\" react-router dev',\n start: \"NODE_OPTIONS='--enable-source-maps' react-router serve\",\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should standardize to single quotes\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--max-old-space-size=4096 --import ./instrument.server.mjs' react-router dev\",\n );\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--enable-source-maps --import ./instrument.server.mjs' react-router serve\",\n );\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"sdk-setup.test.js","sourceRoot":"","sources":["../../../test/react-router/sdk-setup.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi, beforeEach } from 'vitest';\n\nconst { clackMocks } = vi.hoisted(() => {\n const info = vi.fn();\n const warn = vi.fn();\n const error = vi.fn();\n const success = vi.fn();\n const outro = vi.fn();\n const confirm = vi.fn(() => Promise.resolve(false)); // default to false for tests\n\n return {\n clackMocks: {\n info,\n warn,\n error,\n success,\n outro,\n confirm,\n },\n };\n});\n\nvi.mock('@clack/prompts', () => {\n return {\n __esModule: true,\n default: {\n log: {\n info: clackMocks.info,\n warn: clackMocks.warn,\n error: clackMocks.error,\n success: clackMocks.success,\n },\n outro: clackMocks.outro,\n confirm: clackMocks.confirm,\n },\n };\n});\n\nconst { existsSyncMock, readFileSyncMock, writeFileSyncMock } = vi.hoisted(\n () => {\n return {\n existsSyncMock: vi.fn(),\n readFileSyncMock: vi.fn(),\n writeFileSyncMock: vi.fn(),\n };\n },\n);\n\nconst { getPackageDotJsonMock, getPackageVersionMock } = vi.hoisted(() => ({\n getPackageDotJsonMock: vi.fn(),\n getPackageVersionMock: vi.fn(),\n}));\n\nvi.mock('../../src/utils/package-json', () => ({\n getPackageDotJson: getPackageDotJsonMock,\n getPackageVersion: getPackageVersionMock,\n}));\n\nvi.mock('fs', async () => {\n return {\n ...(await vi.importActual('fs')),\n existsSync: existsSyncMock,\n readFileSync: readFileSyncMock,\n writeFileSync: writeFileSyncMock,\n promises: {\n writeFile: vi.fn(),\n },\n };\n});\n\n// module-level mock for child_process.execSync\nvi.mock('child_process', () => ({\n __esModule: true,\n execSync: vi.fn(),\n}));\n\n// mock showCopyPasteInstructions and makeCodeSnippet used by templates\nvi.mock('../../src/utils/clack', () => {\n return {\n __esModule: true,\n showCopyPasteInstructions: vi.fn(() => Promise.resolve()),\n makeCodeSnippet: vi.fn(\n (\n colors: boolean,\n callback: (\n unchanged: (str: string) => string,\n plus: (str: string) => string,\n minus: (str: string) => string,\n ) => string,\n ) => {\n // Mock implementation that just calls the callback with simple string functions\n const unchanged = (str: string) => str;\n const plus = (str: string) => `+ ${str}`;\n const minus = (str: string) => `- ${str}`;\n return callback(unchanged, plus, minus);\n },\n ),\n getPackageDotJson: getPackageDotJsonMock,\n };\n});\n\nimport {\n isReactRouterV7,\n getReactRouterVersion,\n supportsInstrumentationAPI,\n supportsOnError,\n runReactRouterReveal,\n createServerInstrumentationFile,\n tryRevealAndGetManualInstructions,\n updatePackageJsonScripts,\n} from '../../src/react-router/sdk-setup';\nimport * as childProcess from 'child_process';\nimport type { Mock } from 'vitest';\nimport { getSentryInstrumentationServerContent } from '../../src/react-router/templates';\n\ndescribe('React Router SDK Setup', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n\n getPackageVersionMock.mockImplementation(\n (\n packageName: string,\n packageJson: {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n },\n ) => {\n if (packageJson.dependencies?.[packageName]) {\n return packageJson.dependencies[packageName];\n }\n if (packageJson.devDependencies?.[packageName]) {\n return packageJson.devDependencies[packageName];\n }\n return null;\n },\n );\n });\n\n describe('isReactRouterV7', () => {\n it('should return true for React Router v7+ in dependencies or devDependencies', () => {\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '7.0.0' } }),\n ).toBe(true);\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '^7.1.0' } }),\n ).toBe(true);\n expect(\n isReactRouterV7({\n devDependencies: { '@react-router/dev': '7.1.0' },\n }),\n ).toBe(true);\n });\n\n it('should return false for React Router v6 or missing dependency', () => {\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '6.28.0' } }),\n ).toBe(false);\n expect(isReactRouterV7({ dependencies: { react: '^18.0.0' } })).toBe(\n false,\n );\n expect(isReactRouterV7({})).toBe(false);\n });\n });\n\n describe('getReactRouterVersion', () => {\n it('should coerce range version from package.json', () => {\n expect(\n getReactRouterVersion({\n dependencies: { '@react-router/dev': '^7.8.2' },\n }),\n ).toBe('7.8.2');\n });\n\n it('should return undefined when package is not in package.json', () => {\n expect(\n getReactRouterVersion({ dependencies: { react: '^18.0.0' } }),\n ).toBeUndefined();\n expect(getReactRouterVersion({})).toBeUndefined();\n });\n });\n\n describe('supportsInstrumentationAPI', () => {\n it('should return true for React Router v7.15.0 or higher', () => {\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '7.15.0' },\n }),\n ).toBe(true);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '^7.15.0' },\n }),\n ).toBe(true);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '7.16.0' },\n }),\n ).toBe(true);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '8.0.0' },\n }),\n ).toBe(true);\n expect(\n supportsInstrumentationAPI({\n devDependencies: { '@react-router/dev': '7.15.0' },\n }),\n ).toBe(true);\n });\n\n it('should return false for React Router versions below v7.15.0', () => {\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '7.14.0' },\n }),\n ).toBe(false);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '7.0.0' },\n }),\n ).toBe(false);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '7.9.5' },\n }),\n ).toBe(false);\n });\n\n it('should return false when @react-router/dev is not installed', () => {\n expect(\n supportsInstrumentationAPI({\n dependencies: { react: '^18.0.0' },\n }),\n ).toBe(false);\n expect(supportsInstrumentationAPI({})).toBe(false);\n });\n\n it('should handle semver range specifiers correctly', () => {\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '~7.15.0' },\n }),\n ).toBe(true);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '>=7.15.0' },\n }),\n ).toBe(true);\n });\n });\n\n describe('supportsOnError', () => {\n it('should return true for React Router v7.11.0 or higher', () => {\n expect(\n supportsOnError({\n dependencies: { '@react-router/dev': '7.11.0' },\n }),\n ).toBe(true);\n expect(\n supportsOnError({\n dependencies: { '@react-router/dev': '^7.11.0' },\n }),\n ).toBe(true);\n expect(\n supportsOnError({\n dependencies: { '@react-router/dev': '7.12.0' },\n }),\n ).toBe(true);\n expect(\n supportsOnError({\n dependencies: { '@react-router/dev': '8.0.0' },\n }),\n ).toBe(true);\n expect(\n supportsOnError({\n devDependencies: { '@react-router/dev': '7.11.0' },\n }),\n ).toBe(true);\n });\n\n it('should return false for React Router versions below v7.11.0', () => {\n expect(\n supportsOnError({\n dependencies: { '@react-router/dev': '7.10.0' },\n }),\n ).toBe(false);\n expect(\n supportsOnError({\n dependencies: { '@react-router/dev': '7.0.0' },\n }),\n ).toBe(false);\n expect(\n supportsOnError({\n dependencies: { '@react-router/dev': '7.8.2' },\n }),\n ).toBe(false);\n });\n\n it('should return false when @react-router/dev is not installed', () => {\n expect(\n supportsOnError({\n dependencies: { react: '^18.0.0' },\n }),\n ).toBe(false);\n expect(supportsOnError({})).toBe(false);\n });\n });\n\n describe('generateServerInstrumentation', () => {\n it('should generate server instrumentation file with all features enabled', () => {\n const dsn = 'https://sentry.io/123';\n const enableTracing = true;\n const enableProfiling = false;\n const enableLogs = true;\n\n const result = getSentryInstrumentationServerContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain('dsn: \"https://sentry.io/123\"');\n expect(result).toContain('tracesSampleRate: 1');\n expect(result).toContain('enableLogs: true');\n });\n\n it('should generate server instrumentation file when performance is disabled', () => {\n const dsn = 'https://sentry.io/123';\n const enableTracing = false;\n const enableProfiling = false;\n const enableLogs = false;\n\n const result = getSentryInstrumentationServerContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain('dsn: \"https://sentry.io/123\"');\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('enableLogs: true');\n });\n });\n});\n\ndescribe('runReactRouterReveal', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('runs the reveal CLI when entry files are missing', () => {\n existsSyncMock.mockReturnValue(false);\n\n (childProcess.execSync as unknown as Mock).mockImplementation(() => 'ok');\n\n runReactRouterReveal();\n\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n });\n\n it('does not run the reveal CLI when entry files already exist', () => {\n existsSyncMock.mockReturnValue(true);\n\n (childProcess.execSync as unknown as Mock).mockReset();\n\n runReactRouterReveal();\n\n expect(childProcess.execSync).not.toHaveBeenCalled();\n });\n});\n\ndescribe('server instrumentation helpers', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('createServerInstrumentationFile writes instrumentation file and returns path', () => {\n writeFileSyncMock.mockImplementation(() => undefined);\n\n const path = createServerInstrumentationFile('https://sentry.io/123', {\n performance: true,\n replay: false,\n logs: true,\n profiling: false,\n });\n\n expect(path).toContain('instrument.server.mjs');\n expect(writeFileSyncMock).toHaveBeenCalled();\n const writtenCall = writeFileSyncMock.mock.calls[0] as unknown as [\n string,\n string,\n ];\n expect(writtenCall[0]).toEqual(\n expect.stringContaining('instrument.server.mjs'),\n );\n expect(writtenCall[1]).toEqual(\n expect.stringContaining('dsn: \"https://sentry.io/123\"'),\n );\n expect(writtenCall[1]).toEqual(\n expect.stringContaining('tracesSampleRate: 1'),\n );\n });\n});\n\ndescribe('tryRevealAndGetManualInstructions', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('should return true when user confirms and reveal command succeeds', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n 'Successfully generated entry files',\n );\n\n // Mock file existing after reveal\n existsSyncMock.mockReturnValueOnce(true);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(true);\n expect(clackMocks.confirm).toHaveBeenCalledWith({\n message: expect.stringContaining(\n 'Would you like to try running',\n ) as string,\n initialValue: true,\n });\n expect(clackMocks.info).toHaveBeenCalledWith(\n expect.stringContaining('Running'),\n );\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n expect(clackMocks.success).toHaveBeenCalledWith(\n expect.stringContaining('Found entry.client.tsx after running reveal'),\n );\n });\n\n it('should return false when user declines reveal operation', async () => {\n const missingFilename = 'entry.server.tsx';\n const filePath = '/app/entry.server.tsx';\n\n // Mock user declining the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(false);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(clackMocks.confirm).toHaveBeenCalled();\n expect(childProcess.execSync).not.toHaveBeenCalled();\n expect(clackMocks.info).not.toHaveBeenCalled();\n });\n\n it('should return false when reveal command succeeds but file still does not exist', async () => {\n const missingFilename = 'entry.client.jsx';\n const filePath = '/app/entry.client.jsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n 'Command output',\n );\n\n // Mock file NOT existing after reveal\n existsSyncMock.mockReturnValueOnce(false);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(childProcess.execSync).toHaveBeenCalled();\n expect(clackMocks.warn).toHaveBeenCalledWith(\n expect.stringContaining(\n 'entry.client.jsx still not found after running reveal',\n ),\n );\n });\n\n it('should return false when reveal command throws an error', async () => {\n const missingFilename = 'entry.server.jsx';\n const filePath = '/app/entry.server.jsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync throwing an error\n const mockError = new Error('Command failed');\n (childProcess.execSync as unknown as Mock).mockImplementationOnce(() => {\n throw mockError;\n });\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(childProcess.execSync).toHaveBeenCalled();\n expect(clackMocks.warn).toHaveBeenCalledWith(\n expect.stringContaining('Failed to run npx react-router reveal'),\n );\n });\n\n it('should log command output when reveal succeeds', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n const commandOutput = 'Generated entry files successfully';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding with output\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n commandOutput,\n );\n\n // Mock file existing after reveal\n existsSyncMock.mockReturnValueOnce(true);\n\n await tryRevealAndGetManualInstructions(missingFilename, filePath);\n\n expect(clackMocks.info).toHaveBeenCalledWith(commandOutput);\n });\n\n it('should handle reveal command with proper parameters', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n\n // Mock user confirming\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce('ok');\n\n // Mock file existing\n existsSyncMock.mockReturnValueOnce(true);\n\n await tryRevealAndGetManualInstructions(missingFilename, filePath);\n\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n });\n});\n\ndescribe('updatePackageJsonScripts', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('should set NODE_ENV=production for both dev and start scripts (workaround for React Router v7 + React 19 issue)', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'react-router dev',\n start: 'react-router serve',\n build: 'react-router build',\n },\n };\n\n // Mock getPackageDotJson to return our test package.json\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n // Mock fs.promises.writeFile\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n // Verify writeFile was called\n expect(writeFileMock).toHaveBeenCalled();\n\n // Check the written package.json content\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Both dev and start scripts should use the correct filenames and commands according to documentation\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--import ./instrument.server.mjs' react-router dev\",\n );\n\n // Start script should have NODE_ENV=production before --import\n expect(writtenContent.scripts.start).toBe(\n \"NODE_ENV=production NODE_OPTIONS='--import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n\n // The build script should remain unchanged\n expect(writtenContent.scripts.build).toBe('react-router build');\n });\n\n it('should handle package.json with only start script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n start: 'react-router serve',\n },\n };\n\n // Mock getPackageDotJson to return our test package.json\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n // Mock fs.promises.writeFile\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n // Verify only start script is modified when dev doesn't exist\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n expect(writtenContent.scripts.start).toBe(\n \"NODE_ENV=production NODE_OPTIONS='--import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n expect(writtenContent.scripts.dev).toBeUndefined();\n });\n\n it('should throw error when no start script exists', async () => {\n const mockPackageJson = {\n scripts: {\n build: 'react-router build',\n },\n };\n\n // Mock getPackageDotJson to return package.json without start script\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n await expect(updatePackageJsonScripts()).rejects.toThrow(\n 'Could not find a `start` script in your package.json. Please add: \"start\": \"react-router-serve ./build/server/index.js\" and re-run the wizard.',\n );\n });\n\n it('should handle unquoted NODE_OPTIONS in dev script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'NODE_OPTIONS=--loader ts-node/register react-router dev',\n start: 'react-router serve',\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should merge unquoted NODE_OPTIONS and wrap result in single quotes\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--loader ts-node/register --import ./instrument.server.mjs' react-router dev\",\n );\n });\n\n it('should handle unquoted NODE_OPTIONS in start script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n start:\n 'NODE_OPTIONS=--require ./dotenv-config.js react-router-serve ./build/server/index.js',\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should merge unquoted NODE_OPTIONS and prepend NODE_ENV\n expect(writtenContent.scripts.start).toBe(\n \"NODE_ENV=production NODE_OPTIONS='--require ./dotenv-config.js --import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n });\n\n it('should handle quoted NODE_OPTIONS and standardize to single quotes', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'NODE_OPTIONS=\"--max-old-space-size=4096\" react-router dev',\n start: \"NODE_OPTIONS='--enable-source-maps' react-router serve\",\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should standardize to single quotes\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--max-old-space-size=4096 --import ./instrument.server.mjs' react-router dev\",\n );\n // Should prepend NODE_ENV=production to start script\n expect(writtenContent.scripts.start).toBe(\n \"NODE_ENV=production NODE_OPTIONS='--enable-source-maps --import ./instrument.server.mjs' react-router serve\",\n );\n });\n});\n"]}
|
|
@@ -20,13 +20,6 @@ const templates_1 = require("../../src/react-router/templates");
|
|
|
20
20
|
vitest_1.vi.clearAllMocks();
|
|
21
21
|
});
|
|
22
22
|
(0, vitest_1.describe)('Template Constants', () => {
|
|
23
|
-
(0, vitest_1.it)('should have correct ERROR_BOUNDARY_TEMPLATE content', () => {
|
|
24
|
-
(0, vitest_1.expect)(templates_1.ERROR_BOUNDARY_TEMPLATE).toContain('function ErrorBoundary({ error })');
|
|
25
|
-
(0, vitest_1.expect)(templates_1.ERROR_BOUNDARY_TEMPLATE).toContain('isRouteErrorResponse(error)');
|
|
26
|
-
(0, vitest_1.expect)(templates_1.ERROR_BOUNDARY_TEMPLATE).toContain('Sentry.captureException(error)');
|
|
27
|
-
(0, vitest_1.expect)(templates_1.ERROR_BOUNDARY_TEMPLATE).toContain('error.status === 404');
|
|
28
|
-
(0, vitest_1.expect)(templates_1.ERROR_BOUNDARY_TEMPLATE).toContain('An unexpected error occurred');
|
|
29
|
-
});
|
|
30
23
|
(0, vitest_1.it)('should have correct EXAMPLE_PAGE_TEMPLATE_TSX content', () => {
|
|
31
24
|
(0, vitest_1.expect)(templates_1.EXAMPLE_PAGE_TEMPLATE_TSX).toContain('import type { Route }');
|
|
32
25
|
(0, vitest_1.expect)(templates_1.EXAMPLE_PAGE_TEMPLATE_TSX).toContain('export async function loader()');
|
|
@@ -43,15 +36,12 @@ const templates_1 = require("../../src/react-router/templates");
|
|
|
43
36
|
});
|
|
44
37
|
});
|
|
45
38
|
(0, vitest_1.describe)('getManualClientEntryContent', () => {
|
|
46
|
-
(0, vitest_1.it)('should generate manual client entry with all features enabled', () => {
|
|
39
|
+
(0, vitest_1.it)('should generate manual client entry with all features enabled and onError', () => {
|
|
47
40
|
const dsn = 'https://test.sentry.io/123';
|
|
48
|
-
const
|
|
49
|
-
const enableReplay = true;
|
|
50
|
-
const enableLogs = true;
|
|
51
|
-
const result = (0, templates_1.getManualClientEntryContent)(dsn, enableTracing, enableReplay, enableLogs);
|
|
41
|
+
const result = (0, templates_1.getManualClientEntryContent)(dsn, true, true, true, false, true);
|
|
52
42
|
(0, vitest_1.expect)(result).toContain("+ import * as Sentry from '@sentry/react-router'");
|
|
53
43
|
(0, vitest_1.expect)(result).toContain(`dsn: "${dsn}"`);
|
|
54
|
-
(0, vitest_1.expect)(result).toContain('
|
|
44
|
+
(0, vitest_1.expect)(result).toContain('// httpBodies: [],');
|
|
55
45
|
(0, vitest_1.expect)(result).toContain('Sentry.reactRouterTracingIntegration()');
|
|
56
46
|
(0, vitest_1.expect)(result).toContain('Sentry.replayIntegration()');
|
|
57
47
|
(0, vitest_1.expect)(result).toContain('enableLogs: true');
|
|
@@ -59,7 +49,12 @@ const templates_1 = require("../../src/react-router/templates");
|
|
|
59
49
|
(0, vitest_1.expect)(result).toContain('replaysSessionSampleRate: 0.1');
|
|
60
50
|
(0, vitest_1.expect)(result).toContain('replaysOnErrorSampleRate: 1.0');
|
|
61
51
|
(0, vitest_1.expect)(result).toContain('tracePropagationTargets');
|
|
62
|
-
(0, vitest_1.expect)(result).toContain('
|
|
52
|
+
(0, vitest_1.expect)(result).toContain('onError={Sentry.sentryOnError}');
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.it)('should not include onError when useOnError is false', () => {
|
|
55
|
+
const dsn = 'https://test.sentry.io/123';
|
|
56
|
+
const result = (0, templates_1.getManualClientEntryContent)(dsn, true, true, true);
|
|
57
|
+
(0, vitest_1.expect)(result).not.toContain('onError={Sentry.sentryOnError}');
|
|
63
58
|
});
|
|
64
59
|
(0, vitest_1.it)('should generate manual client entry with tracing disabled', () => {
|
|
65
60
|
const dsn = 'https://test.sentry.io/123';
|
|
@@ -101,6 +96,34 @@ const templates_1 = require("../../src/react-router/templates");
|
|
|
101
96
|
(0, vitest_1.expect)(result).not.toContain('enableLogs: true');
|
|
102
97
|
(0, vitest_1.expect)(result).toContain('integrations: [');
|
|
103
98
|
});
|
|
99
|
+
(0, vitest_1.describe)('Instrumentation API', () => {
|
|
100
|
+
(0, vitest_1.it)('should generate client entry with instrumentation API enabled', () => {
|
|
101
|
+
const dsn = 'https://test.sentry.io/123';
|
|
102
|
+
const result = (0, templates_1.getManualClientEntryContent)(dsn, true, false, false, true, true);
|
|
103
|
+
(0, vitest_1.expect)(result).toContain('const tracing = Sentry.reactRouterTracingIntegration();');
|
|
104
|
+
(0, vitest_1.expect)(result).toContain('integrations: [');
|
|
105
|
+
(0, vitest_1.expect)(result).toContain('tracing');
|
|
106
|
+
(0, vitest_1.expect)(result).toContain('instrumentations={[tracing.clientInstrumentation]}');
|
|
107
|
+
(0, vitest_1.expect)(result).toContain('onError={Sentry.sentryOnError}');
|
|
108
|
+
});
|
|
109
|
+
(0, vitest_1.it)('should generate client entry with instrumentation API and replay enabled', () => {
|
|
110
|
+
const dsn = 'https://test.sentry.io/123';
|
|
111
|
+
const result = (0, templates_1.getManualClientEntryContent)(dsn, true, true, false, true, true);
|
|
112
|
+
(0, vitest_1.expect)(result).toContain('const tracing = Sentry.reactRouterTracingIntegration();');
|
|
113
|
+
(0, vitest_1.expect)(result).toContain('tracing');
|
|
114
|
+
(0, vitest_1.expect)(result).toContain('Sentry.replayIntegration()');
|
|
115
|
+
(0, vitest_1.expect)(result).toContain('instrumentations={[tracing.clientInstrumentation]}');
|
|
116
|
+
(0, vitest_1.expect)(result).toContain('onError={Sentry.sentryOnError}');
|
|
117
|
+
});
|
|
118
|
+
(0, vitest_1.it)('should not use instrumentation API when explicitly disabled', () => {
|
|
119
|
+
const dsn = 'https://test.sentry.io/123';
|
|
120
|
+
const result = (0, templates_1.getManualClientEntryContent)(dsn, true, false, false, false, true);
|
|
121
|
+
(0, vitest_1.expect)(result).not.toContain('const tracing');
|
|
122
|
+
(0, vitest_1.expect)(result).toContain('Sentry.reactRouterTracingIntegration()');
|
|
123
|
+
(0, vitest_1.expect)(result).not.toContain('instrumentations');
|
|
124
|
+
(0, vitest_1.expect)(result).toContain('onError={Sentry.sentryOnError}');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
104
127
|
});
|
|
105
128
|
(0, vitest_1.describe)('getManualServerEntryContent', () => {
|
|
106
129
|
(0, vitest_1.it)('should generate manual server entry content', () => {
|
|
@@ -115,29 +138,18 @@ const templates_1 = require("../../src/react-router/templates");
|
|
|
115
138
|
(0, vitest_1.expect)(result).toContain('export default handleRequest');
|
|
116
139
|
(0, vitest_1.expect)(result).toContain('rest of your server entry');
|
|
117
140
|
});
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
(0, vitest_1.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
});
|
|
131
|
-
(0, vitest_1.it)('should generate manual root content for JavaScript', () => {
|
|
132
|
-
const isTs = false;
|
|
133
|
-
const result = (0, templates_1.getManualRootContent)(isTs);
|
|
134
|
-
(0, vitest_1.expect)(result).toContain("+ import * as Sentry from '@sentry/react-router'");
|
|
135
|
-
(0, vitest_1.expect)(result).toContain('export function ErrorBoundary({ error })');
|
|
136
|
-
(0, vitest_1.expect)(result).not.toContain(': Route.ErrorBoundaryProps');
|
|
137
|
-
(0, vitest_1.expect)(result).toContain('let stack');
|
|
138
|
-
(0, vitest_1.expect)(result).not.toContain(': string | undefined');
|
|
139
|
-
(0, vitest_1.expect)(result).toContain('isRouteErrorResponse(error)');
|
|
140
|
-
(0, vitest_1.expect)(result).toContain('+ Sentry.captureException(error)');
|
|
141
|
+
(0, vitest_1.describe)('Instrumentation API', () => {
|
|
142
|
+
(0, vitest_1.it)('should generate server entry with instrumentations when useInstrumentationAPI is true', () => {
|
|
143
|
+
const result = (0, templates_1.getManualServerEntryContent)(true);
|
|
144
|
+
(0, vitest_1.expect)(result).toContain("+ import * as Sentry from '@sentry/react-router'");
|
|
145
|
+
(0, vitest_1.expect)(result).toContain('export const instrumentations = [Sentry.createSentryServerInstrumentation()];');
|
|
146
|
+
(0, vitest_1.expect)(result).toContain('Enable automatic server-side instrumentation for loaders, actions, middleware');
|
|
147
|
+
});
|
|
148
|
+
(0, vitest_1.it)('should not include instrumentations when useInstrumentationAPI is false', () => {
|
|
149
|
+
const result = (0, templates_1.getManualServerEntryContent)(false);
|
|
150
|
+
(0, vitest_1.expect)(result).not.toContain('instrumentations');
|
|
151
|
+
(0, vitest_1.expect)(result).not.toContain('createSentryServerInstrumentation');
|
|
152
|
+
});
|
|
141
153
|
});
|
|
142
154
|
});
|
|
143
155
|
(0, vitest_1.describe)('getManualServerInstrumentContent', () => {
|
|
@@ -150,7 +162,7 @@ const templates_1 = require("../../src/react-router/templates");
|
|
|
150
162
|
(0, vitest_1.expect)(result).toContain("+ import * as Sentry from '@sentry/react-router'");
|
|
151
163
|
(0, vitest_1.expect)(result).toContain("import { nodeProfilingIntegration } from '@sentry/profiling-node'");
|
|
152
164
|
(0, vitest_1.expect)(result).toContain(`dsn: "${dsn}"`);
|
|
153
|
-
(0, vitest_1.expect)(result).toContain('
|
|
165
|
+
(0, vitest_1.expect)(result).toContain('// httpBodies: [],');
|
|
154
166
|
(0, vitest_1.expect)(result).toContain('enableLogs: true');
|
|
155
167
|
(0, vitest_1.expect)(result).toContain('integrations: [nodeProfilingIntegration()]');
|
|
156
168
|
(0, vitest_1.expect)(result).toContain('tracesSampleRate: 1.0');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/react-router/templates.test.ts"],"names":[],"mappings":";;AAAA,mCAA8D;AAE9D,+BAA+B;AAC/B,WAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACpC,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,WAAE,CAAC,EAAE,CACpB,CACE,MAAe,EACf,QAIW,EACX,EAAE;YACF,gFAAgF;YAChF,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC;YACvC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1C,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,CACF;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,gEAS0C;AAE1C,IAAA,iBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,IAAA,WAAE,EAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,IAAA,eAAM,EAAC,mCAAuB,CAAC,CAAC,SAAS,CACvC,mCAAmC,CACpC,CAAC;YACF,IAAA,eAAM,EAAC,mCAAuB,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACzE,IAAA,eAAM,EAAC,mCAAuB,CAAC,CAAC,SAAS,CACvC,gCAAgC,CACjC,CAAC;YACF,IAAA,eAAM,EAAC,mCAAuB,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YAClE,IAAA,eAAM,EAAC,mCAAuB,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YACrE,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAC,SAAS,CACzC,gCAAgC,CACjC,CAAC;YACF,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAC,SAAS,CACzC,kDAAkD,CACnD,CAAC;YACF,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAC,SAAS,CACzC,6CAA6C,CAC9C,CAAC;YACF,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAC,SAAS,CACzC,uCAAuC,CACxC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YACzE,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAC,SAAS,CACzC,gCAAgC,CACjC,CAAC;YACF,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAC,SAAS,CACzC,kDAAkD,CACnD,CAAC;YACF,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAC,SAAS,CACzC,6CAA6C,CAC9C,CAAC;YACF,IAAA,eAAM,EAAC,qCAAyB,CAAC,CAAC,SAAS,CACzC,uCAAuC,CACxC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,IAAA,WAAE,EAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,GAAG,GAAG,4BAA4B,CAAC;YACzC,MAAM,aAAa,GAAG,IAAI,CAAC;YAC3B,MAAM,YAAY,GAAG,IAAI,CAAC;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC;YAExB,MAAM,MAAM,GAAG,IAAA,uCAA2B,EACxC,GAAG,EACH,aAAa,EACb,YAAY,EACZ,UAAU,CACX,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,kDAAkD,CACnD,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;YAC1C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YACvD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YAClD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;YAC1D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;YAC1D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YACpD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,GAAG,GAAG,4BAA4B,CAAC;YACzC,MAAM,aAAa,GAAG,KAAK,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC;YAC1B,MAAM,UAAU,GAAG,KAAK,CAAC;YAEzB,MAAM,MAAM,GAAG,IAAA,uCAA2B,EACxC,GAAG,EACH,aAAa,EACb,YAAY,EACZ,UAAU,CACX,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;YAC1C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACvE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YACvD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACjD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,GAAG,GAAG,4BAA4B,CAAC;YACzC,MAAM,aAAa,GAAG,IAAI,CAAC;YAC3B,MAAM,YAAY,GAAG,KAAK,CAAC;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC;YAExB,MAAM,MAAM,GAAG,IAAA,uCAA2B,EACxC,GAAG,EACH,aAAa,EACb,YAAY,EACZ,UAAU,CACX,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;YAC1C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YAClD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YAC3D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YACzD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,GAAG,GAAG,4BAA4B,CAAC;YACzC,MAAM,aAAa,GAAG,KAAK,CAAC;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC;YAC3B,MAAM,UAAU,GAAG,KAAK,CAAC;YAEzB,MAAM,MAAM,GAAG,IAAA,uCAA2B,EACxC,GAAG,EACH,aAAa,EACb,YAAY,EACZ,UAAU,CACX,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;YAC1C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACvE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YAC3D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACjD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,MAAM,GAAG,IAAA,uCAA2B,GAAE,CAAC;YAE7C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,kDAAkD,CACnD,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;YAC7D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YACnD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACzC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,4DAA4D,CAC7D,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,+DAA+D,CAChE,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;YACzD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,IAAA,WAAE,EAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,IAAI,GAAG,IAAI,CAAC;YAClB,MAAM,MAAM,GAAG,IAAA,gCAAoB,EAAC,IAAI,CAAC,CAAC;YAE1C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,kDAAkD,CACnD,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,oEAAoE,CACrE,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;YAC1D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACxD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;YAC7D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YACpD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,IAAI,GAAG,KAAK,CAAC;YACnB,MAAM,MAAM,GAAG,IAAA,gCAAoB,EAAC,IAAI,CAAC,CAAC;YAE1C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,kDAAkD,CACnD,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;YACrE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YAC3D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACtC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACrD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACxD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAChD,IAAA,WAAE,EAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,GAAG,GAAG,4BAA4B,CAAC;YACzC,MAAM,aAAa,GAAG,IAAI,CAAC;YAC3B,MAAM,eAAe,GAAG,IAAI,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC;YAExB,MAAM,MAAM,GAAG,IAAA,4CAAgC,EAC7C,GAAG,EACH,aAAa,EACb,eAAe,EACf,UAAU,CACX,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,kDAAkD,CACnD,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,mEAAmE,CACpE,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;YAC1C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAC;YACvE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YAClD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YACpD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;YAC7D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,GAAG,GAAG,4BAA4B,CAAC;YACzC,MAAM,aAAa,GAAG,KAAK,CAAC;YAC5B,MAAM,eAAe,GAAG,KAAK,CAAC;YAE9B,MAAM,MAAM,GAAG,IAAA,4CAAgC,EAC7C,GAAG,EACH,aAAa,EACb,eAAe,CAChB,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;YAC1C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YACzD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YACnD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAC1B,4CAA4C,CAC7C,CAAC;YACF,0DAA0D;YAC1D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,oFAAoF,EAAE,GAAG,EAAE;YAC5F,MAAM,GAAG,GAAG,4BAA4B,CAAC;YACzC,MAAM,aAAa,GAAG,IAAI,CAAC;YAC3B,MAAM,eAAe,GAAG,KAAK,CAAC;YAC9B,MAAM,UAAU,GAAG,KAAK,CAAC;YAEzB,MAAM,MAAM,GAAG,IAAA,4CAAgC,EAC7C,GAAG,EACH,aAAa,EACb,eAAe,EACf,UAAU,CACX,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;YAC1C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YAClD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YACzD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YACnD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,GAAG,GAAG,iDAAiD,CAAC;YAC9D,MAAM,aAAa,GAAG,IAAI,CAAC;YAC3B,MAAM,eAAe,GAAG,KAAK,CAAC;YAE9B,MAAM,MAAM,GAAG,IAAA,4CAAgC,EAC7C,GAAG,EACH,aAAa,EACb,eAAe,CAChB,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,mCAAmC,EAAE,GAAG,EAAE;QACjD,IAAA,WAAE,EAAC,2EAA2E,EAAE,GAAG,EAAE;YACnF,MAAM,MAAM,GAAG,IAAA,6CAAiC,EAAC,IAAI,CAAC,CAAC;YAEvD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YACnD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,MAAM,GAAG,IAAA,6CAAiC,EAAC,KAAK,CAAC,CAAC;YAExD,oDAAoD;YACpD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC5C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAEjD,wDAAwD;YACxD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACxD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACtC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,MAAM,GAAG,IAAA,6CAAiC,GAAE,CAAC;YAEnD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YACnD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it, vi, beforeEach } from 'vitest';\n\n// Mock makeCodeSnippet utility\nvi.mock('../../src/utils/clack', () => {\n return {\n __esModule: true,\n makeCodeSnippet: vi.fn(\n (\n colors: boolean,\n callback: (\n unchanged: (str: string) => string,\n plus: (str: string) => string,\n minus: (str: string) => string,\n ) => string,\n ) => {\n // Mock implementation that just calls the callback with simple string functions\n const unchanged = (str: string) => str;\n const plus = (str: string) => `+ ${str}`;\n const minus = (str: string) => `- ${str}`;\n return callback(unchanged, plus, minus);\n },\n ),\n };\n});\n\nimport {\n ERROR_BOUNDARY_TEMPLATE,\n EXAMPLE_PAGE_TEMPLATE_TSX,\n EXAMPLE_PAGE_TEMPLATE_JSX,\n getManualClientEntryContent,\n getManualServerEntryContent,\n getManualRootContent,\n getManualServerInstrumentContent,\n getManualReactRouterConfigContent,\n} from '../../src/react-router/templates';\n\ndescribe('React Router Templates', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n describe('Template Constants', () => {\n it('should have correct ERROR_BOUNDARY_TEMPLATE content', () => {\n expect(ERROR_BOUNDARY_TEMPLATE).toContain(\n 'function ErrorBoundary({ error })',\n );\n expect(ERROR_BOUNDARY_TEMPLATE).toContain('isRouteErrorResponse(error)');\n expect(ERROR_BOUNDARY_TEMPLATE).toContain(\n 'Sentry.captureException(error)',\n );\n expect(ERROR_BOUNDARY_TEMPLATE).toContain('error.status === 404');\n expect(ERROR_BOUNDARY_TEMPLATE).toContain('An unexpected error occurred');\n });\n\n it('should have correct EXAMPLE_PAGE_TEMPLATE_TSX content', () => {\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain('import type { Route }');\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'export async function loader()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'throw new Error(\"some error thrown in a loader\")',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'export default function SentryExamplePage()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'Loading this page will throw an error',\n );\n });\n\n it('should have correct EXAMPLE_PAGE_TEMPLATE_JSX content', () => {\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).not.toContain('import type { Route }');\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'export async function loader()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'throw new Error(\"some error thrown in a loader\")',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'export default function SentryExamplePage()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'Loading this page will throw an error',\n );\n });\n });\n\n describe('getManualClientEntryContent', () => {\n it('should generate manual client entry with all features enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableReplay = true;\n const enableLogs = true;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('sendDefaultPii: true');\n expect(result).toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).toContain('Sentry.replayIntegration()');\n expect(result).toContain('enableLogs: true');\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('replaysSessionSampleRate: 0.1');\n expect(result).toContain('replaysOnErrorSampleRate: 1.0');\n expect(result).toContain('tracePropagationTargets');\n expect(result).toContain('<HydratedRouter />');\n });\n\n it('should generate manual client entry with tracing disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableReplay = true;\n const enableLogs = false;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).toContain('Sentry.replayIntegration()');\n expect(result).not.toContain('enableLogs: true');\n expect(result).not.toContain('tracePropagationTargets');\n });\n\n it('should generate manual client entry with replay disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableReplay = false;\n const enableLogs = true;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).not.toContain('Sentry.replayIntegration()');\n expect(result).toContain('enableLogs: true');\n expect(result).not.toContain('replaysSessionSampleRate');\n expect(result).not.toContain('replaysOnErrorSampleRate');\n });\n\n it('should generate manual client entry with no integrations', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableReplay = false;\n const enableLogs = false;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).not.toContain('Sentry.replayIntegration()');\n expect(result).not.toContain('enableLogs: true');\n expect(result).toContain('integrations: [');\n });\n });\n\n describe('getManualServerEntryContent', () => {\n it('should generate manual server entry content', () => {\n const result = getManualServerEntryContent();\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain('createReadableStreamFromReadable');\n expect(result).toContain('renderToPipeableStream');\n expect(result).toContain('ServerRouter');\n expect(result).toContain(\n '+ const handleRequest = Sentry.createSentryHandleRequest({',\n );\n expect(result).toContain(\n '+ export const handleError = Sentry.createSentryHandleError({',\n );\n expect(result).toContain('logErrors: false');\n expect(result).toContain('export default handleRequest');\n expect(result).toContain('rest of your server entry');\n });\n });\n\n describe('getManualRootContent', () => {\n it('should generate manual root content for TypeScript', () => {\n const isTs = true;\n const result = getManualRootContent(isTs);\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(\n 'export function ErrorBoundary({ error }: Route.ErrorBoundaryProps)',\n );\n expect(result).toContain('let stack: string | undefined');\n expect(result).toContain('isRouteErrorResponse(error)');\n expect(result).toContain('+ Sentry.captureException(error)');\n expect(result).toContain('details = error.message');\n expect(result).toContain('error.status === 404');\n });\n\n it('should generate manual root content for JavaScript', () => {\n const isTs = false;\n const result = getManualRootContent(isTs);\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain('export function ErrorBoundary({ error })');\n expect(result).not.toContain(': Route.ErrorBoundaryProps');\n expect(result).toContain('let stack');\n expect(result).not.toContain(': string | undefined');\n expect(result).toContain('isRouteErrorResponse(error)');\n expect(result).toContain('+ Sentry.captureException(error)');\n });\n });\n\n describe('getManualServerInstrumentContent', () => {\n it('should generate server instrumentation with all features enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableProfiling = true;\n const enableLogs = true;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(\n \"import { nodeProfilingIntegration } from '@sentry/profiling-node'\",\n );\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('sendDefaultPii: true');\n expect(result).toContain('enableLogs: true');\n expect(result).toContain('integrations: [nodeProfilingIntegration()]');\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('profilesSampleRate: 1.0');\n expect(result).toContain('Capture 100% of the transactions');\n expect(result).toContain('profile every transaction');\n });\n\n it('should generate server instrumentation with tracing disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableProfiling = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('nodeProfilingIntegration');\n expect(result).not.toContain('profilesSampleRate');\n expect(result).not.toContain(\n 'integrations: [nodeProfilingIntegration()]',\n );\n // When logs are not enabled, enableLogs should not appear\n expect(result).not.toContain('enableLogs: true');\n });\n\n it('should generate server instrumentation with profiling disabled but tracing enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableProfiling = false;\n const enableLogs = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).not.toContain('nodeProfilingIntegration');\n expect(result).not.toContain('profilesSampleRate');\n expect(result).not.toContain('integrations:');\n });\n\n it('should handle special characters in DSN', () => {\n const dsn = 'https://test@example.com/sentry/123?param=value';\n const enableTracing = true;\n const enableProfiling = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n });\n });\n\n describe('getManualReactRouterConfigContent', () => {\n it('should generate TypeScript config snippet with type imports and satisfies', () => {\n const result = getManualReactRouterConfigContent(true);\n\n expect(result).toContain('import type { Config }');\n expect(result).toContain('} satisfies Config;');\n expect(result).toContain('sentryOnBuildEnd');\n expect(result).toContain('ssr: true');\n });\n\n it('should generate JavaScript config snippet without TS-only syntax', () => {\n const result = getManualReactRouterConfigContent(false);\n\n // JS version should NOT have TypeScript-only syntax\n expect(result).not.toContain('import type');\n expect(result).not.toContain('satisfies Config');\n\n // JS version should have the standard import and export\n expect(result).toContain('import { sentryOnBuildEnd }');\n expect(result).toContain('sentryOnBuildEnd');\n expect(result).toContain('ssr: true');\n expect(result).toContain('export default {');\n });\n\n it('should default to TypeScript when no parameter is passed', () => {\n const result = getManualReactRouterConfigContent();\n\n expect(result).toContain('import type { Config }');\n expect(result).toContain('} satisfies Config;');\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/react-router/templates.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi, beforeEach } from 'vitest';\n\n// Mock makeCodeSnippet utility\nvi.mock('../../src/utils/clack', () => {\n return {\n __esModule: true,\n makeCodeSnippet: vi.fn(\n (\n colors: boolean,\n callback: (\n unchanged: (str: string) => string,\n plus: (str: string) => string,\n minus: (str: string) => string,\n ) => string,\n ) => {\n // Mock implementation that just calls the callback with simple string functions\n const unchanged = (str: string) => str;\n const plus = (str: string) => `+ ${str}`;\n const minus = (str: string) => `- ${str}`;\n return callback(unchanged, plus, minus);\n },\n ),\n };\n});\n\nimport {\n EXAMPLE_PAGE_TEMPLATE_TSX,\n EXAMPLE_PAGE_TEMPLATE_JSX,\n getManualClientEntryContent,\n getManualServerEntryContent,\n getManualServerInstrumentContent,\n getManualReactRouterConfigContent,\n} from '../../src/react-router/templates';\n\ndescribe('React Router Templates', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n describe('Template Constants', () => {\n it('should have correct EXAMPLE_PAGE_TEMPLATE_TSX content', () => {\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain('import type { Route }');\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'export async function loader()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'throw new Error(\"some error thrown in a loader\")',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'export default function SentryExamplePage()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'Loading this page will throw an error',\n );\n });\n\n it('should have correct EXAMPLE_PAGE_TEMPLATE_JSX content', () => {\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).not.toContain('import type { Route }');\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'export async function loader()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'throw new Error(\"some error thrown in a loader\")',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'export default function SentryExamplePage()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'Loading this page will throw an error',\n );\n });\n });\n\n describe('getManualClientEntryContent', () => {\n it('should generate manual client entry with all features enabled and onError', () => {\n const dsn = 'https://test.sentry.io/123';\n\n const result = getManualClientEntryContent(\n dsn,\n true,\n true,\n true,\n false,\n true,\n );\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('// httpBodies: [],');\n expect(result).toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).toContain('Sentry.replayIntegration()');\n expect(result).toContain('enableLogs: true');\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('replaysSessionSampleRate: 0.1');\n expect(result).toContain('replaysOnErrorSampleRate: 1.0');\n expect(result).toContain('tracePropagationTargets');\n expect(result).toContain('onError={Sentry.sentryOnError}');\n });\n\n it('should not include onError when useOnError is false', () => {\n const dsn = 'https://test.sentry.io/123';\n\n const result = getManualClientEntryContent(dsn, true, true, true);\n\n expect(result).not.toContain('onError={Sentry.sentryOnError}');\n });\n\n it('should generate manual client entry with tracing disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableReplay = true;\n const enableLogs = false;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).toContain('Sentry.replayIntegration()');\n expect(result).not.toContain('enableLogs: true');\n expect(result).not.toContain('tracePropagationTargets');\n });\n\n it('should generate manual client entry with replay disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableReplay = false;\n const enableLogs = true;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).not.toContain('Sentry.replayIntegration()');\n expect(result).toContain('enableLogs: true');\n expect(result).not.toContain('replaysSessionSampleRate');\n expect(result).not.toContain('replaysOnErrorSampleRate');\n });\n\n it('should generate manual client entry with no integrations', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableReplay = false;\n const enableLogs = false;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).not.toContain('Sentry.replayIntegration()');\n expect(result).not.toContain('enableLogs: true');\n expect(result).toContain('integrations: [');\n });\n\n describe('Instrumentation API', () => {\n it('should generate client entry with instrumentation API enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n\n const result = getManualClientEntryContent(\n dsn,\n true,\n false,\n false,\n true,\n true,\n );\n\n expect(result).toContain(\n 'const tracing = Sentry.reactRouterTracingIntegration();',\n );\n expect(result).toContain('integrations: [');\n expect(result).toContain('tracing');\n expect(result).toContain(\n 'instrumentations={[tracing.clientInstrumentation]}',\n );\n expect(result).toContain('onError={Sentry.sentryOnError}');\n });\n\n it('should generate client entry with instrumentation API and replay enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n\n const result = getManualClientEntryContent(\n dsn,\n true,\n true,\n false,\n true,\n true,\n );\n\n expect(result).toContain(\n 'const tracing = Sentry.reactRouterTracingIntegration();',\n );\n expect(result).toContain('tracing');\n expect(result).toContain('Sentry.replayIntegration()');\n expect(result).toContain(\n 'instrumentations={[tracing.clientInstrumentation]}',\n );\n expect(result).toContain('onError={Sentry.sentryOnError}');\n });\n\n it('should not use instrumentation API when explicitly disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n\n const result = getManualClientEntryContent(\n dsn,\n true,\n false,\n false,\n false,\n true,\n );\n\n expect(result).not.toContain('const tracing');\n expect(result).toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).not.toContain('instrumentations');\n expect(result).toContain('onError={Sentry.sentryOnError}');\n });\n });\n });\n\n describe('getManualServerEntryContent', () => {\n it('should generate manual server entry content', () => {\n const result = getManualServerEntryContent();\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain('createReadableStreamFromReadable');\n expect(result).toContain('renderToPipeableStream');\n expect(result).toContain('ServerRouter');\n expect(result).toContain(\n '+ const handleRequest = Sentry.createSentryHandleRequest({',\n );\n expect(result).toContain(\n '+ export const handleError = Sentry.createSentryHandleError({',\n );\n expect(result).toContain('logErrors: false');\n expect(result).toContain('export default handleRequest');\n expect(result).toContain('rest of your server entry');\n });\n\n describe('Instrumentation API', () => {\n it('should generate server entry with instrumentations when useInstrumentationAPI is true', () => {\n const result = getManualServerEntryContent(true);\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(\n 'export const instrumentations = [Sentry.createSentryServerInstrumentation()];',\n );\n expect(result).toContain(\n 'Enable automatic server-side instrumentation for loaders, actions, middleware',\n );\n });\n\n it('should not include instrumentations when useInstrumentationAPI is false', () => {\n const result = getManualServerEntryContent(false);\n\n expect(result).not.toContain('instrumentations');\n expect(result).not.toContain('createSentryServerInstrumentation');\n });\n });\n });\n\n describe('getManualServerInstrumentContent', () => {\n it('should generate server instrumentation with all features enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableProfiling = true;\n const enableLogs = true;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(\n \"import { nodeProfilingIntegration } from '@sentry/profiling-node'\",\n );\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('// httpBodies: [],');\n expect(result).toContain('enableLogs: true');\n expect(result).toContain('integrations: [nodeProfilingIntegration()]');\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('profilesSampleRate: 1.0');\n expect(result).toContain('Capture 100% of the transactions');\n expect(result).toContain('profile every transaction');\n });\n\n it('should generate server instrumentation with tracing disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableProfiling = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('nodeProfilingIntegration');\n expect(result).not.toContain('profilesSampleRate');\n expect(result).not.toContain(\n 'integrations: [nodeProfilingIntegration()]',\n );\n // When logs are not enabled, enableLogs should not appear\n expect(result).not.toContain('enableLogs: true');\n });\n\n it('should generate server instrumentation with profiling disabled but tracing enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableProfiling = false;\n const enableLogs = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).not.toContain('nodeProfilingIntegration');\n expect(result).not.toContain('profilesSampleRate');\n expect(result).not.toContain('integrations:');\n });\n\n it('should handle special characters in DSN', () => {\n const dsn = 'https://test@example.com/sentry/123?param=value';\n const enableTracing = true;\n const enableProfiling = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n });\n });\n\n describe('getManualReactRouterConfigContent', () => {\n it('should generate TypeScript config snippet with type imports and satisfies', () => {\n const result = getManualReactRouterConfigContent(true);\n\n expect(result).toContain('import type { Config }');\n expect(result).toContain('} satisfies Config;');\n expect(result).toContain('sentryOnBuildEnd');\n expect(result).toContain('ssr: true');\n });\n\n it('should generate JavaScript config snippet without TS-only syntax', () => {\n const result = getManualReactRouterConfigContent(false);\n\n // JS version should NOT have TypeScript-only syntax\n expect(result).not.toContain('import type');\n expect(result).not.toContain('satisfies Config');\n\n // JS version should have the standard import and export\n expect(result).toContain('import { sentryOnBuildEnd }');\n expect(result).toContain('sentryOnBuildEnd');\n expect(result).toContain('ssr: true');\n expect(result).toContain('export default {');\n });\n\n it('should default to TypeScript when no parameter is passed', () => {\n const result = getManualReactRouterConfigContent();\n\n expect(result).toContain('import type { Config }');\n expect(result).toContain('} satisfies Config;');\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const fs = __importStar(require("fs"));
|
|
27
|
+
const sdk_setup_1 = require("../../src/remix/sdk-setup");
|
|
28
|
+
const clack_1 = require("../../src/utils/clack");
|
|
29
|
+
const vitest_1 = require("vitest");
|
|
30
|
+
const writeFileSpy = vitest_1.vi
|
|
31
|
+
.spyOn(fs.promises, 'writeFile')
|
|
32
|
+
.mockImplementation(() => Promise.resolve());
|
|
33
|
+
vitest_1.vi.mock('@clack/prompts', () => {
|
|
34
|
+
const mock = {
|
|
35
|
+
log: {
|
|
36
|
+
info: vitest_1.vi.fn(),
|
|
37
|
+
success: vitest_1.vi.fn(),
|
|
38
|
+
warn: vitest_1.vi.fn(),
|
|
39
|
+
},
|
|
40
|
+
confirm: vitest_1.vi.fn().mockResolvedValue(true),
|
|
41
|
+
isCancel: vitest_1.vi.fn().mockReturnValue(false),
|
|
42
|
+
};
|
|
43
|
+
return { ...mock, default: mock };
|
|
44
|
+
});
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
46
|
+
vitest_1.vi.mock('../../src/utils/clack', async () => ({
|
|
47
|
+
...(await vitest_1.vi.importActual('../../src/utils/clack')),
|
|
48
|
+
getPackageDotJson: vitest_1.vi.fn().mockResolvedValue({
|
|
49
|
+
scripts: {
|
|
50
|
+
build: 'remix build',
|
|
51
|
+
},
|
|
52
|
+
version: '1.0.0',
|
|
53
|
+
}),
|
|
54
|
+
}));
|
|
55
|
+
(0, vitest_1.describe)('updateBuildScript', () => {
|
|
56
|
+
(0, vitest_1.afterEach)(() => {
|
|
57
|
+
vitest_1.vi.clearAllMocks();
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.it)('uses npx @sentry/remix --upload-sourcemaps for the upload command', async () => {
|
|
60
|
+
await (0, sdk_setup_1.updateBuildScript)({
|
|
61
|
+
org: 'my-org',
|
|
62
|
+
project: 'my-project',
|
|
63
|
+
isHydrogen: false,
|
|
64
|
+
});
|
|
65
|
+
(0, vitest_1.expect)(writeFileSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('package.json'), vitest_1.expect.stringContaining('npx @sentry/remix --upload-sourcemaps --org my-org --project my-project'));
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)('replaces the remix build command with sourcemap flag and upload', async () => {
|
|
68
|
+
await (0, sdk_setup_1.updateBuildScript)({
|
|
69
|
+
org: 'my-org',
|
|
70
|
+
project: 'my-project',
|
|
71
|
+
isHydrogen: false,
|
|
72
|
+
});
|
|
73
|
+
(0, vitest_1.expect)(writeFileSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('package.json'), vitest_1.expect.stringContaining('remix build --sourcemap && npx @sentry/remix --upload-sourcemaps'));
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.it)('includes --url flag when a custom url is provided', async () => {
|
|
76
|
+
await (0, sdk_setup_1.updateBuildScript)({
|
|
77
|
+
org: 'my-org',
|
|
78
|
+
project: 'my-project',
|
|
79
|
+
url: 'https://self-hosted.example.com',
|
|
80
|
+
isHydrogen: false,
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.expect)(writeFileSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('package.json'), vitest_1.expect.stringContaining('--url https://self-hosted.example.com'));
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('uses shopify hydrogen build for hydrogen apps', async () => {
|
|
85
|
+
vitest_1.vi.mocked(clack_1.getPackageDotJson).mockResolvedValue({
|
|
86
|
+
scripts: {
|
|
87
|
+
build: 'shopify hydrogen build',
|
|
88
|
+
},
|
|
89
|
+
version: '1.0.0',
|
|
90
|
+
});
|
|
91
|
+
await (0, sdk_setup_1.updateBuildScript)({
|
|
92
|
+
org: 'my-org',
|
|
93
|
+
project: 'my-project',
|
|
94
|
+
isHydrogen: true,
|
|
95
|
+
});
|
|
96
|
+
(0, vitest_1.expect)(writeFileSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('package.json'), vitest_1.expect.stringContaining('shopify hydrogen build --sourcemap && npx @sentry/remix --upload-sourcemaps --org my-org --project my-project --buildPath ./dist'));
|
|
97
|
+
});
|
|
98
|
+
(0, vitest_1.it)('sets build script when none exists', async () => {
|
|
99
|
+
vitest_1.vi.mocked(clack_1.getPackageDotJson).mockResolvedValue({
|
|
100
|
+
scripts: {},
|
|
101
|
+
version: '1.0.0',
|
|
102
|
+
});
|
|
103
|
+
await (0, sdk_setup_1.updateBuildScript)({
|
|
104
|
+
org: 'my-org',
|
|
105
|
+
project: 'my-project',
|
|
106
|
+
isHydrogen: false,
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.expect)(writeFileSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('package.json'), vitest_1.expect.stringContaining('remix build --sourcemap && npx @sentry/remix --upload-sourcemaps'));
|
|
109
|
+
});
|
|
110
|
+
(0, vitest_1.it)('throws when build script has an unknown command', async () => {
|
|
111
|
+
vitest_1.vi.mocked(clack_1.getPackageDotJson).mockResolvedValue({
|
|
112
|
+
scripts: {
|
|
113
|
+
build: 'some-custom-build-tool',
|
|
114
|
+
},
|
|
115
|
+
version: '1.0.0',
|
|
116
|
+
});
|
|
117
|
+
await (0, vitest_1.expect)((0, sdk_setup_1.updateBuildScript)({
|
|
118
|
+
org: 'my-org',
|
|
119
|
+
project: 'my-project',
|
|
120
|
+
isHydrogen: false,
|
|
121
|
+
})).rejects.toThrow("build` script doesn't contain a known build command");
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=build-script.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-script.test.js","sourceRoot":"","sources":["../../../test/remix/build-script.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\n\nimport { updateBuildScript } from '../../src/remix/sdk-setup';\nimport { getPackageDotJson } from '../../src/utils/clack';\n\nimport { vi, it, describe, expect, afterEach } from 'vitest';\n\nconst writeFileSpy = vi\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(() => Promise.resolve());\n\nvi.mock('@clack/prompts', () => {\n const mock = {\n log: {\n info: vi.fn(),\n success: vi.fn(),\n warn: vi.fn(),\n },\n confirm: vi.fn().mockResolvedValue(true),\n isCancel: vi.fn().mockReturnValue(false),\n };\n return { ...mock, default: mock };\n});\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-return\nvi.mock('../../src/utils/clack', async () => ({\n ...(await vi.importActual('../../src/utils/clack')),\n getPackageDotJson: vi.fn().mockResolvedValue({\n scripts: {\n build: 'remix build',\n },\n version: '1.0.0',\n }),\n}));\n\ndescribe('updateBuildScript', () => {\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n it('uses npx @sentry/remix --upload-sourcemaps for the upload command', async () => {\n await updateBuildScript({\n org: 'my-org',\n project: 'my-project',\n isHydrogen: false,\n });\n\n expect(writeFileSpy).toHaveBeenCalledWith(\n expect.stringContaining('package.json'),\n expect.stringContaining(\n 'npx @sentry/remix --upload-sourcemaps --org my-org --project my-project',\n ),\n );\n });\n\n it('replaces the remix build command with sourcemap flag and upload', async () => {\n await updateBuildScript({\n org: 'my-org',\n project: 'my-project',\n isHydrogen: false,\n });\n\n expect(writeFileSpy).toHaveBeenCalledWith(\n expect.stringContaining('package.json'),\n expect.stringContaining(\n 'remix build --sourcemap && npx @sentry/remix --upload-sourcemaps',\n ),\n );\n });\n\n it('includes --url flag when a custom url is provided', async () => {\n await updateBuildScript({\n org: 'my-org',\n project: 'my-project',\n url: 'https://self-hosted.example.com',\n isHydrogen: false,\n });\n\n expect(writeFileSpy).toHaveBeenCalledWith(\n expect.stringContaining('package.json'),\n expect.stringContaining('--url https://self-hosted.example.com'),\n );\n });\n\n it('uses shopify hydrogen build for hydrogen apps', async () => {\n vi.mocked(getPackageDotJson).mockResolvedValue({\n scripts: {\n build: 'shopify hydrogen build',\n },\n version: '1.0.0',\n });\n\n await updateBuildScript({\n org: 'my-org',\n project: 'my-project',\n isHydrogen: true,\n });\n\n expect(writeFileSpy).toHaveBeenCalledWith(\n expect.stringContaining('package.json'),\n expect.stringContaining(\n 'shopify hydrogen build --sourcemap && npx @sentry/remix --upload-sourcemaps --org my-org --project my-project --buildPath ./dist',\n ),\n );\n });\n\n it('sets build script when none exists', async () => {\n vi.mocked(getPackageDotJson).mockResolvedValue({\n scripts: {},\n version: '1.0.0',\n });\n\n await updateBuildScript({\n org: 'my-org',\n project: 'my-project',\n isHydrogen: false,\n });\n\n expect(writeFileSpy).toHaveBeenCalledWith(\n expect.stringContaining('package.json'),\n expect.stringContaining(\n 'remix build --sourcemap && npx @sentry/remix --upload-sourcemaps',\n ),\n );\n });\n\n it('throws when build script has an unknown command', async () => {\n vi.mocked(getPackageDotJson).mockResolvedValue({\n scripts: {\n build: 'some-custom-build-tool',\n },\n version: '1.0.0',\n });\n\n await expect(\n updateBuildScript({\n org: 'my-org',\n project: 'my-project',\n isHydrogen: false,\n }),\n ).rejects.toThrow(\"build` script doesn't contain a known build command\");\n });\n});\n"]}
|