@sentry/wizard 4.4.0 → 4.6.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 +23 -1
- package/README.md +23 -19
- package/dist/bin.js +13 -0
- package/dist/bin.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-14.test.js +4 -5
- package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-15.test.js +3 -5
- package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
- package/dist/e2e-tests/utils/index.d.ts +1 -1
- package/dist/e2e-tests/utils/index.js +20 -2
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/lib/Constants.d.ts +2 -0
- package/dist/lib/Constants.js.map +1 -1
- package/dist/lib/Helper/File.d.ts +1 -1
- package/dist/lib/Helper/File.js +1 -3
- package/dist/lib/Helper/File.js.map +1 -1
- package/dist/lib/Helper/Logging.d.ts +3 -0
- package/dist/lib/Helper/Logging.js +3 -0
- package/dist/lib/Helper/Logging.js.map +1 -1
- package/dist/lib/Helper/Package.d.ts +5 -3
- package/dist/lib/Helper/Package.js +2 -2
- package/dist/lib/Helper/Package.js.map +1 -1
- package/dist/lib/Helper/SentryCli.d.ts +20 -7
- package/dist/lib/Helper/SentryCli.js +21 -13
- package/dist/lib/Helper/SentryCli.js.map +1 -1
- package/dist/lib/Helper/Wizard.js +9 -5
- package/dist/lib/Helper/Wizard.js.map +1 -1
- package/dist/lib/Helper/__tests__/SentryCli.js +21 -4
- package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
- package/dist/lib/Setup.d.ts +3 -1
- package/dist/lib/Setup.js.map +1 -1
- package/dist/lib/Steps/Integrations/BaseIntegration.js +1 -2
- package/dist/lib/Steps/Integrations/BaseIntegration.js.map +1 -1
- package/dist/lib/Steps/Integrations/Cordova.js +14 -10
- package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
- package/dist/lib/Steps/Integrations/Electron.d.ts +4 -1
- package/dist/lib/Steps/Integrations/Electron.js +1 -1
- package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
- package/dist/lib/Steps/Integrations/MobileProject.d.ts +3 -1
- package/dist/lib/Steps/Integrations/MobileProject.js +1 -1
- package/dist/lib/Steps/Integrations/MobileProject.js.map +1 -1
- package/dist/lib/Steps/PromptForParameters.d.ts +4 -1
- package/dist/lib/Steps/PromptForParameters.js.map +1 -1
- package/dist/lib/Steps/SentryProjectSelector.d.ts +42 -1
- package/dist/lib/Steps/SentryProjectSelector.js +1 -1
- package/dist/lib/Steps/SentryProjectSelector.js.map +1 -1
- package/dist/lib/Steps/WaitForSentry.d.ts +3 -1
- package/dist/lib/Steps/WaitForSentry.js +4 -4
- package/dist/lib/Steps/WaitForSentry.js.map +1 -1
- package/dist/lib/Types.d.ts +14 -0
- package/dist/lib/Types.js +3 -0
- package/dist/lib/Types.js.map +1 -0
- package/dist/lib/__tests__/Env.js +6 -13
- package/dist/lib/__tests__/Env.js.map +1 -1
- package/dist/src/android/android-wizard.js +15 -12
- package/dist/src/android/android-wizard.js.map +1 -1
- package/dist/src/android/code-tools.js +1 -1
- package/dist/src/android/code-tools.js.map +1 -1
- package/dist/src/android/gradle.js +4 -4
- package/dist/src/android/gradle.js.map +1 -1
- package/dist/src/android/manifest.js +1 -1
- package/dist/src/android/manifest.js.map +1 -1
- package/dist/src/apple/apple-wizard.d.ts +2 -2
- package/dist/src/apple/apple-wizard.js +37 -118
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/apple/check-installed-cli.d.ts +1 -0
- package/dist/src/apple/check-installed-cli.js +60 -0
- package/dist/src/apple/check-installed-cli.js.map +1 -0
- package/dist/src/apple/cocoapod.js +1 -1
- package/dist/src/apple/cocoapod.js.map +1 -1
- package/dist/src/apple/code-tools.js +1 -1
- package/dist/src/apple/code-tools.js.map +1 -1
- package/dist/src/apple/configure-fastlane.d.ts +5 -0
- package/dist/src/apple/configure-fastlane.js +66 -0
- package/dist/src/apple/configure-fastlane.js.map +1 -0
- package/dist/src/apple/fastlane.d.ts +1 -1
- package/dist/src/apple/fastlane.js +5 -5
- package/dist/src/apple/fastlane.js.map +1 -1
- package/dist/src/apple/lookup-xcode-project.d.ts +7 -0
- package/dist/src/apple/lookup-xcode-project.js +98 -0
- package/dist/src/apple/lookup-xcode-project.js.map +1 -0
- package/dist/src/apple/options.d.ts +4 -0
- package/dist/src/apple/options.js +3 -0
- package/dist/src/apple/options.js.map +1 -0
- package/dist/src/apple/search-xcode-project-at-path.d.ts +1 -0
- package/dist/src/apple/search-xcode-project-at-path.js +70 -0
- package/dist/src/apple/search-xcode-project-at-path.js.map +1 -0
- package/dist/src/apple/xcode-manager.js +1 -1
- package/dist/src/apple/xcode-manager.js.map +1 -1
- package/dist/src/flutter/code-tools.js +3 -3
- package/dist/src/flutter/code-tools.js.map +1 -1
- package/dist/src/flutter/flutter-wizard.js +21 -15
- package/dist/src/flutter/flutter-wizard.js.map +1 -1
- package/dist/src/flutter/templates.js +4 -4
- package/dist/src/flutter/templates.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +118 -67
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.d.ts +11 -3
- package/dist/src/nextjs/templates.js +193 -71
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/nuxt/nuxt-wizard.js +21 -16
- package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
- package/dist/src/nuxt/sdk-example.js +3 -3
- package/dist/src/nuxt/sdk-example.js.map +1 -1
- package/dist/src/nuxt/sdk-setup.js +9 -9
- package/dist/src/nuxt/sdk-setup.js.map +1 -1
- package/dist/src/nuxt/templates.js +173 -58
- package/dist/src/nuxt/templates.js.map +1 -1
- package/dist/src/nuxt/utils.js +6 -3
- package/dist/src/nuxt/utils.js.map +1 -1
- package/dist/src/react-native/expo-env-file.js +1 -1
- package/dist/src/react-native/expo-env-file.js.map +1 -1
- package/dist/src/react-native/expo-metro.js +4 -4
- package/dist/src/react-native/expo-metro.js.map +1 -1
- package/dist/src/react-native/expo.js +4 -4
- package/dist/src/react-native/expo.js.map +1 -1
- package/dist/src/react-native/javascript.js +7 -7
- package/dist/src/react-native/javascript.js.map +1 -1
- package/dist/src/react-native/metro.js +8 -8
- package/dist/src/react-native/metro.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.d.ts +1 -1
- package/dist/src/react-native/react-native-wizard.js +36 -31
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-native/uninstall.js +8 -5
- package/dist/src/react-native/uninstall.js.map +1 -1
- package/dist/src/react-native/xcode.d.ts +2 -1
- package/dist/src/react-native/xcode.js +1 -2
- package/dist/src/react-native/xcode.js.map +1 -1
- package/dist/src/remix/codemods/handle-error.js +4 -1
- package/dist/src/remix/codemods/handle-error.js.map +1 -1
- package/dist/src/remix/remix-wizard.js +23 -18
- package/dist/src/remix/remix-wizard.js.map +1 -1
- package/dist/src/remix/sdk-example.js +163 -64
- package/dist/src/remix/sdk-example.js.map +1 -1
- package/dist/src/remix/sdk-setup.js +11 -7
- package/dist/src/remix/sdk-setup.js.map +1 -1
- package/dist/src/run.d.ts +3 -1
- package/dist/src/run.js +29 -9
- package/dist/src/run.js.map +1 -1
- package/dist/src/sourcemaps/sourcemaps-wizard.js +30 -28
- package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
- package/dist/src/sourcemaps/tools/angular.js +3 -3
- package/dist/src/sourcemaps/tools/angular.js.map +1 -1
- package/dist/src/sourcemaps/tools/create-react-app.js +3 -3
- package/dist/src/sourcemaps/tools/create-react-app.js.map +1 -1
- package/dist/src/sourcemaps/tools/esbuild.js +6 -6
- package/dist/src/sourcemaps/tools/esbuild.js.map +1 -1
- package/dist/src/sourcemaps/tools/nextjs.js +5 -5
- package/dist/src/sourcemaps/tools/nextjs.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/rollup.js +6 -6
- package/dist/src/sourcemaps/tools/rollup.js.map +1 -1
- package/dist/src/sourcemaps/tools/sentry-cli.js +23 -16
- package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
- package/dist/src/sourcemaps/tools/tsc.js +6 -6
- package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
- package/dist/src/sourcemaps/tools/vite.js +12 -12
- package/dist/src/sourcemaps/tools/vite.js.map +1 -1
- package/dist/src/sourcemaps/tools/webpack.js +10 -10
- package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
- package/dist/src/sourcemaps/utils/detect-tool.js +2 -2
- package/dist/src/sourcemaps/utils/detect-tool.js.map +1 -1
- package/dist/src/sourcemaps/utils/other-wizards.js +5 -5
- package/dist/src/sourcemaps/utils/other-wizards.js.map +1 -1
- package/dist/src/sourcemaps/utils/sdk-version.js +7 -7
- package/dist/src/sourcemaps/utils/sdk-version.js.map +1 -1
- package/dist/src/sveltekit/sdk-example.js +1 -1
- package/dist/src/sveltekit/sdk-example.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup.js +15 -14
- package/dist/src/sveltekit/sdk-setup.js.map +1 -1
- package/dist/src/sveltekit/sveltekit-wizard.js +25 -20
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/sveltekit/templates.js +126 -37
- package/dist/src/sveltekit/templates.js.map +1 -1
- package/dist/src/telemetry.js +11 -0
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/utils/{clack-utils.d.ts → clack/index.d.ts} +54 -15
- package/dist/src/utils/{clack-utils.js → clack/index.js} +107 -24
- package/dist/src/utils/clack/index.js.map +1 -0
- package/dist/src/utils/debug.js +1 -1
- package/dist/src/utils/debug.js.map +1 -1
- package/dist/src/utils/find-files-with-extension.d.ts +1 -0
- package/dist/src/utils/find-files-with-extension.js +39 -0
- package/dist/src/utils/find-files-with-extension.js.map +1 -0
- package/dist/src/utils/package-manager.d.ts +6 -1
- package/dist/src/utils/package-manager.js +32 -27
- package/dist/src/utils/package-manager.js.map +1 -1
- package/dist/src/utils/sentrycli-utils.js +0 -1
- package/dist/src/utils/sentrycli-utils.js.map +1 -1
- package/dist/src/utils/types.d.ts +4 -0
- package/dist/src/utils/types.js.map +1 -1
- 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/android/code-tools.test.js +0 -1
- package/dist/test/android/code-tools.test.js.map +1 -1
- package/dist/test/apple/cocoapod.test.js +1 -1
- package/dist/test/apple/cocoapod.test.js.map +1 -1
- package/dist/test/apple/code-tools.test.js +1 -1
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/fastfile.test.js +1 -1
- package/dist/test/apple/fastfile.test.js.map +1 -1
- package/dist/test/apple/xcode-manager.test.js +26 -2
- package/dist/test/apple/xcode-manager.test.js.map +1 -1
- package/dist/test/flutter/code-tools.test.js +0 -2
- package/dist/test/flutter/code-tools.test.js.map +1 -1
- package/dist/test/flutter/templates.test.js +23 -23
- package/dist/test/flutter/templates.test.js.map +1 -1
- package/dist/test/nextjs/templates.test.js +127 -133
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/react-native/expo-metro.test.js +1 -1
- package/dist/test/react-native/expo-metro.test.js.map +1 -1
- package/dist/test/react-native/javascript.test.js +1 -1
- package/dist/test/react-native/javascript.test.js.map +1 -1
- package/dist/test/react-native/metro.test.js +1 -1
- package/dist/test/react-native/metro.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/sentry-cli.test.js +14 -3
- package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -1
- package/dist/test/utils/{clack-utils.test.js → clack/index.test.js} +131 -41
- package/dist/test/utils/clack/index.test.js.map +1 -0
- package/dist/test/utils/package-manager.test.d.ts +1 -0
- package/dist/test/utils/package-manager.test.js +29 -0
- package/dist/test/utils/package-manager.test.js.map +1 -0
- package/package.json +1 -1
- package/dist/src/utils/clack-utils.js.map +0 -1
- package/dist/test/utils/clack-utils.test.js.map +0 -1
- /package/dist/test/utils/{clack-utils.test.d.ts → clack/index.test.d.ts} +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
type PackageDotJson = {
|
|
2
2
|
dependencies?: Record<string, string>;
|
|
3
3
|
devDependencies?: Record<string, string>;
|
|
4
|
-
}
|
|
4
|
+
};
|
|
5
|
+
export declare function checkPackageVersion(appPackage: PackageDotJson, packageName: string, acceptableVersions: string, canBeLatest: boolean): boolean;
|
|
5
6
|
/**
|
|
6
7
|
* Determines if the passed `package.json` object has the passed package installed.
|
|
7
8
|
*
|
|
@@ -10,4 +11,5 @@ export declare function checkPackageVersion(appPackage: {
|
|
|
10
11
|
*
|
|
11
12
|
* @returns `true` if the package is installed, `false` otherwise
|
|
12
13
|
*/
|
|
13
|
-
export declare function hasPackageInstalled(appPackage:
|
|
14
|
+
export declare function hasPackageInstalled(appPackage: PackageDotJson, packageName: string): boolean;
|
|
15
|
+
export {};
|
|
@@ -49,8 +49,8 @@ function fulfillsVersionRange(version, acceptableVersions, canBeLatest) {
|
|
|
49
49
|
* @returns `true` if the package is installed, `false` otherwise
|
|
50
50
|
*/
|
|
51
51
|
function hasPackageInstalled(appPackage, packageName) {
|
|
52
|
-
const depsVersion = appPackage.dependencies[packageName];
|
|
53
|
-
const devDepsVersion = appPackage.devDependencies[packageName];
|
|
52
|
+
const depsVersion = appPackage.dependencies?.[packageName];
|
|
53
|
+
const devDepsVersion = appPackage.devDependencies?.[packageName];
|
|
54
54
|
return !!depsVersion || !!devDepsVersion;
|
|
55
55
|
}
|
|
56
56
|
exports.hasPackageInstalled = hasPackageInstalled;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Package.js","sourceRoot":"","sources":["../../../lib/Helper/Package.ts"],"names":[],"mappings":";;;AAAA,mCAA8D;AAE9D,uCAAuC;
|
|
1
|
+
{"version":3,"file":"Package.js","sourceRoot":"","sources":["../../../lib/Helper/Package.ts"],"names":[],"mappings":";;;AAAA,mCAA8D;AAE9D,uCAAuC;AAOvC,SAAgB,mBAAmB,CACjC,UAA0B,EAC1B,WAAmB,EACnB,kBAA0B,EAC1B,WAAoB;IAEpB,MAAM,WAAW,GAAG,UAAU,EAAE,YAAY,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAClE,MAAM,cAAc,GAAG,UAAU,EAAE,eAAe,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAExE,IAAI,CAAC,WAAW,IAAI,CAAC,cAAc,EAAE;QACnC,IAAA,aAAG,EAAC,KAAK,WAAW,8BAA8B,CAAC,CAAC;QACpD,IAAA,aAAG,EAAC,oCAAoC,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC;KACd;IACD,IACE,CAAC,oBAAoB,CAAC,WAAW,EAAE,kBAAkB,EAAE,WAAW,CAAC;QACnE,CAAC,oBAAoB,CAAC,cAAc,EAAE,kBAAkB,EAAE,WAAW,CAAC,EACtE;QACA,IAAA,aAAG,EACD,oDAAoD,WAAW,8CAA8C,kBAAkB,KAAK,CACrI,CAAC;QACF,OAAO,KAAK,CAAC;KACd;IACD,IAAA,eAAK,EACH,+BAA+B,WAAW,sCAAsC,CACjF,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AA3BD,kDA2BC;AAED,SAAS,oBAAoB,CAC3B,OAAe,EACf,kBAA0B,EAC1B,WAAoB;IAEpB,IAAI,OAAO,KAAK,QAAQ,EAAE;QACxB,OAAO,WAAW,CAAC;KACpB;IAED,IAAI,kBAAkB,EAAE,OAAO,CAAC;IAEhC,IAAI,IAAA,cAAK,EAAC,OAAO,CAAC,EAAE;QAClB,kBAAkB,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,CAAC;QACpC,OAAO,GAAG,KAAK,CAAC;KACjB;SAAM,IAAI,IAAA,mBAAU,EAAC,OAAO,CAAC,EAAE;QAC9B,kBAAkB,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAC,CAAC;QACzC,OAAO,GAAG,IAAI,CAAC;KAChB;IAED,OAAO;IACL,yGAAyG;IACzG,CAAC,CAAC,kBAAkB;QACpB,CAAC,OAAO;YACN,CAAC,CAAC,IAAA,eAAM,EAAC,kBAAkB,EAAE,kBAAkB,CAAC;YAChD,CAAC,CAAC,IAAA,kBAAS,EAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,mBAAmB,CACjC,UAA0B,EAC1B,WAAmB;IAEnB,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,cAAc,CAAC;AAC3C,CAAC;AAPD,kDAOC","sourcesContent":["import { satisfies, subset, valid, validRange } from 'semver';\n\nimport { green, red } from './Logging';\n\ntype PackageDotJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n};\n\nexport function checkPackageVersion(\n appPackage: PackageDotJson,\n packageName: string,\n acceptableVersions: string,\n canBeLatest: boolean,\n): boolean {\n const depsVersion = appPackage?.dependencies?.[packageName] ?? '';\n const devDepsVersion = appPackage?.devDependencies?.[packageName] ?? '';\n\n if (!depsVersion && !devDepsVersion) {\n red(`✗ ${packageName} isn't in your dependencies.`);\n red(' Please install it with yarn/npm.');\n return false;\n }\n if (\n !fulfillsVersionRange(depsVersion, acceptableVersions, canBeLatest) &&\n !fulfillsVersionRange(devDepsVersion, acceptableVersions, canBeLatest)\n ) {\n red(\n `✗ Your \\`package.json\\` specifies a version of \\`${packageName}\\` outside of the compatible version range ${acceptableVersions}.\\n`,\n );\n return false;\n }\n green(\n `✓ A compatible version of \\`${packageName}\\` is specified in \\`package.json\\`.`,\n );\n return true;\n}\n\nfunction fulfillsVersionRange(\n version: string,\n acceptableVersions: string,\n canBeLatest: boolean,\n): boolean {\n if (version === 'latest') {\n return canBeLatest;\n }\n\n let cleanedUserVersion, isRange;\n\n if (valid(version)) {\n cleanedUserVersion = valid(version);\n isRange = false;\n } else if (validRange(version)) {\n cleanedUserVersion = validRange(version);\n isRange = true;\n }\n\n return (\n // If the given version is a bogus format, this will still be undefined and we'll automatically reject it\n !!cleanedUserVersion &&\n (isRange\n ? subset(cleanedUserVersion, acceptableVersions)\n : satisfies(cleanedUserVersion, acceptableVersions))\n );\n}\n\n/**\n * Determines if the passed `package.json` object has the passed package installed.\n *\n * @param appPackage The `package.json` object\n * @param packageName The name of the package to check for\n *\n * @returns `true` if the package is installed, `false` otherwise\n */\nexport function hasPackageInstalled(\n appPackage: PackageDotJson,\n packageName: string,\n): boolean {\n const depsVersion = appPackage.dependencies?.[packageName];\n const devDepsVersion = appPackage.devDependencies?.[packageName];\n return !!depsVersion || !!devDepsVersion;\n}\n"]}
|
|
@@ -1,18 +1,31 @@
|
|
|
1
1
|
import type { Answers } from 'inquirer';
|
|
2
2
|
import type { Args } from '../Constants';
|
|
3
|
+
import { Config } from '../Types';
|
|
3
4
|
export interface SentryCliProps {
|
|
4
|
-
|
|
5
|
+
'defaults/url': string;
|
|
6
|
+
'defaults/org': string | null;
|
|
7
|
+
'defaults/project': string | null;
|
|
8
|
+
'auth/token': string | null;
|
|
9
|
+
'cli/executable'?: string;
|
|
5
10
|
}
|
|
6
|
-
type SentryCliConfig = Record<string, SentryCliProps
|
|
11
|
+
type SentryCliConfig = Record<string, Partial<SentryCliProps>>;
|
|
12
|
+
type RequireResolve = typeof require.resolve;
|
|
7
13
|
export declare class SentryCli {
|
|
8
14
|
protected _argv: Args;
|
|
9
15
|
private _resolve;
|
|
10
16
|
constructor(_argv: Args);
|
|
11
|
-
setResolveFunction(resolve:
|
|
12
|
-
convertAnswersToProperties(answers: Answers
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
setResolveFunction(resolve: RequireResolve): void;
|
|
18
|
+
convertAnswersToProperties(answers: Answers & {
|
|
19
|
+
config?: Config;
|
|
20
|
+
}): SentryCliProps;
|
|
21
|
+
/**
|
|
22
|
+
* Create the contents of a `sentry.properties` file
|
|
23
|
+
* @param props the properties to write to the file
|
|
24
|
+
* @param format the format of the file, either `rc`
|
|
25
|
+
* (.sentryclirc) or `properties` (sentry.properties)
|
|
26
|
+
*/
|
|
27
|
+
dumpProperties(props: Partial<SentryCliProps>, format?: 'rc' | 'properties'): string;
|
|
28
|
+
dumpConfig(config: Partial<SentryCliConfig>): string;
|
|
16
29
|
/**
|
|
17
30
|
* Creates `.sentryclirc` and `sentry.properties` files with the CLI properties
|
|
18
31
|
* obtained from the user answers (or from logging into Sentry).
|
|
@@ -33,7 +33,6 @@ const GITIGNORE_FILENAME = '.gitignore';
|
|
|
33
33
|
const PROPERTIES_FILENAME = 'sentry.properties';
|
|
34
34
|
class SentryCli {
|
|
35
35
|
_argv;
|
|
36
|
-
// eslint-disable-next-line @typescript-eslint/typedef
|
|
37
36
|
_resolve = require.resolve;
|
|
38
37
|
constructor(_argv) {
|
|
39
38
|
this._argv = _argv;
|
|
@@ -42,11 +41,12 @@ class SentryCli {
|
|
|
42
41
|
this._resolve = resolve;
|
|
43
42
|
}
|
|
44
43
|
convertAnswersToProperties(answers) {
|
|
45
|
-
const props = {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
const props = {
|
|
45
|
+
'defaults/url': this._argv.url,
|
|
46
|
+
'defaults/org': answers.config?.organization?.slug ?? null,
|
|
47
|
+
'defaults/project': answers.config?.project?.slug ?? null,
|
|
48
|
+
'auth/token': answers.config?.auth?.token ?? null,
|
|
49
|
+
};
|
|
50
50
|
try {
|
|
51
51
|
const cliPath = this._resolve('@sentry/cli/bin/sentry-cli', {
|
|
52
52
|
paths: [process.cwd()],
|
|
@@ -60,11 +60,19 @@ class SentryCli {
|
|
|
60
60
|
}
|
|
61
61
|
return props;
|
|
62
62
|
}
|
|
63
|
-
/**
|
|
64
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Create the contents of a `sentry.properties` file
|
|
65
|
+
* @param props the properties to write to the file
|
|
66
|
+
* @param format the format of the file, either `rc`
|
|
67
|
+
* (.sentryclirc) or `properties` (sentry.properties)
|
|
68
|
+
*/
|
|
69
|
+
dumpProperties(props, format = 'properties') {
|
|
70
|
+
const propEntries = Object.entries(props);
|
|
65
71
|
const rv = [];
|
|
66
|
-
for (const [key, value] of
|
|
67
|
-
const normalizedKey =
|
|
72
|
+
for (const [key, value] of propEntries) {
|
|
73
|
+
const normalizedKey = format === 'properties'
|
|
74
|
+
? key.replace(/\//g, '.')
|
|
75
|
+
: key.split('/').at(1) ?? '';
|
|
68
76
|
if (value === undefined || value === null) {
|
|
69
77
|
// comment that property out since it has no value
|
|
70
78
|
rv.push(`#${normalizedKey}=`);
|
|
@@ -78,8 +86,8 @@ class SentryCli {
|
|
|
78
86
|
}
|
|
79
87
|
dumpConfig(config) {
|
|
80
88
|
const dumpedSections = [];
|
|
81
|
-
for (const [sectionName,
|
|
82
|
-
const props = this.dumpProperties(
|
|
89
|
+
for (const [sectionName, values] of Object.entries(config)) {
|
|
90
|
+
const props = values ? this.dumpProperties(values, 'rc') : '';
|
|
83
91
|
const section = `[${sectionName}]\n${props}`;
|
|
84
92
|
dumpedSections.push(section);
|
|
85
93
|
}
|
|
@@ -105,7 +113,7 @@ class SentryCli {
|
|
|
105
113
|
*/
|
|
106
114
|
if (authToken) {
|
|
107
115
|
try {
|
|
108
|
-
await fs.promises.appendFile(SENTRYCLIRC_FILENAME, this.dumpConfig({ auth: { token: authToken } }));
|
|
116
|
+
await fs.promises.appendFile(SENTRYCLIRC_FILENAME, this.dumpConfig({ auth: { 'auth/token': authToken } }));
|
|
109
117
|
(0, Logging_1.green)(`✓ Successfully added the auth token to ${SENTRYCLIRC_FILENAME}`);
|
|
110
118
|
}
|
|
111
119
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SentryCli.js","sourceRoot":"","sources":["../../../lib/Helper/SentryCli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8B;AAE9B,gDAAkC;AAGlC,+BAAuC;AACvC,uCAA8C;
|
|
1
|
+
{"version":3,"file":"SentryCli.js","sourceRoot":"","sources":["../../../lib/Helper/SentryCli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8B;AAE9B,gDAAkC;AAGlC,+BAAuC;AACvC,uCAA8C;AAG9C,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAC5C,MAAM,kBAAkB,GAAG,YAAY,CAAC;AACxC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAahD,MAAa,SAAS;IAGS;IAFrB,QAAQ,GAAmB,OAAO,CAAC,OAAO,CAAC;IAEnD,YAA6B,KAAW;QAAX,UAAK,GAAL,KAAK,CAAM;IAAG,CAAC;IAErC,kBAAkB,CAAC,OAAuB;QAC/C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAEM,0BAA0B,CAC/B,OAAsC;QAEtC,MAAM,KAAK,GAAmB;YAC5B,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG;YAC9B,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,IAAI,IAAI;YAC1D,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;YACzD,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI;SAClD,CAAC;QAEF,IAAI;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,4BAA4B,EAAE;gBAC1D,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;aACvB,CAAC,CAAC;YACH,KAAK,CAAC,gBAAgB,CAAC,GAAG,IAAI;iBAC3B,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC;iBAChC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SAC3B;QAAC,OAAO,CAAC,EAAE;YACV,8CAA8C;SAC/C;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACI,cAAc,CACnB,KAA8B,EAC9B,SAA8B,YAAY;QAE1C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAGrC,CAAC;QACJ,MAAM,EAAE,GAAa,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE;YACtC,MAAM,aAAa,GACjB,MAAM,KAAK,YAAY;gBACrB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;gBACzB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;gBACzC,kDAAkD;gBAClD,EAAE,CAAC,IAAI,CAAC,IAAI,aAAa,GAAG,CAAC,CAAC;aAC/B;iBAAM;gBACL,EAAE,CAAC,IAAI,CAAC,GAAG,aAAa,IAAI,KAAK,EAAE,CAAC,CAAC;aACtC;SACF;QACD,2CAA2C;QAC3C,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9B,CAAC;IAEM,UAAU,CAAC,MAAgC;QAChD,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG,IAAI,WAAW,MAAM,KAAK,EAAE,CAAC;YAC7C,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAC9B;QACD,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,qBAAqB,CAAC,QAAwB;QACzD,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,GAAG,QAAQ,CAAC;QAEjE;;;;;WAKG;QACH,IAAI,SAAS,EAAE;YACb,IAAI;gBACF,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAC1B,oBAAoB,EACpB,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CACvD,CAAC;gBACF,IAAA,eAAK,EAAC,0CAA0C,oBAAoB,EAAE,CAAC,CAAC;aACzE;YAAC,MAAM;gBACN,IAAA,aAAG,EACD,qCAAqC,oBAAoB,IAAI;oBAC3D,iDAAiD,SAAS,EAAE,CAC/D,CAAC;gBACF,IAAA,YAAE,GAAE,CAAC;aACN;SACF;aAAM;YACL,IAAA,aAAG,EACD,0DAA0D,oBAAoB,EAAE,CACjF,CAAC;YACF,IAAA,WAAC,EACC,sFAAsF,CACvF,CAAC;YACF,IAAA,WAAC,EACC,8CAA8C;gBAC5C,8FAA8F,CACjG,CAAC;SACH;QAED,MAAM,IAAA,oBAAc,EAClB,oBAAoB,EACpB,mBAAmB,oBAAoB,OAAO,kBAAkB,8CAA8C,CAC/G,CAAC;QAEF,IAAI;YACF,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,KAAK,mBAAmB,EAAE,EAC1B,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CACrC,CAAC;YACF,IAAA,eAAK,EAAC,0CAA0C,CAAC,CAAC;SACnD;QAAC,MAAM;YACN,IAAA,aAAG,EAAC,2CAA2C,mBAAmB,EAAE,CAAC,CAAC;YACtE,IAAA,WAAC,EACC,2HAA2H,CAC5H,CAAC;SACH;QACD,IAAA,YAAE,GAAE,CAAC;IACP,CAAC;CACF;AA1ID,8BA0IC","sourcesContent":["import * as fs from 'node:fs';\nimport type { Answers } from 'inquirer';\nimport * as path from 'node:path';\n\nimport type { Args } from '../Constants';\nimport { addToGitignore } from './Git';\nimport { green, l, nl, red } from './Logging';\nimport { Config } from '../Types';\n\nconst SENTRYCLIRC_FILENAME = '.sentryclirc';\nconst GITIGNORE_FILENAME = '.gitignore';\nconst PROPERTIES_FILENAME = 'sentry.properties';\n\nexport interface SentryCliProps {\n 'defaults/url': string;\n 'defaults/org': string | null;\n 'defaults/project': string | null;\n 'auth/token': string | null;\n 'cli/executable'?: string;\n}\n\ntype SentryCliConfig = Record<string, Partial<SentryCliProps>>;\ntype RequireResolve = typeof require.resolve;\n\nexport class SentryCli {\n private _resolve: RequireResolve = require.resolve;\n\n public constructor(protected _argv: Args) {}\n\n public setResolveFunction(resolve: RequireResolve): void {\n this._resolve = resolve;\n }\n\n public convertAnswersToProperties(\n answers: Answers & { config?: Config },\n ): SentryCliProps {\n const props: SentryCliProps = {\n 'defaults/url': this._argv.url,\n 'defaults/org': answers.config?.organization?.slug ?? null,\n 'defaults/project': answers.config?.project?.slug ?? null,\n 'auth/token': answers.config?.auth?.token ?? null,\n };\n\n try {\n const cliPath = this._resolve('@sentry/cli/bin/sentry-cli', {\n paths: [process.cwd()],\n });\n props['cli/executable'] = path\n .relative(process.cwd(), cliPath)\n .replace(/\\\\/g, '\\\\\\\\');\n } catch (e) {\n // we do nothing and leave everything as it is\n }\n return props;\n }\n\n /**\n * Create the contents of a `sentry.properties` file\n * @param props the properties to write to the file\n * @param format the format of the file, either `rc`\n * (.sentryclirc) or `properties` (sentry.properties)\n */\n public dumpProperties(\n props: Partial<SentryCliProps>,\n format: 'rc' | 'properties' = 'properties',\n ): string {\n const propEntries = Object.entries(props) as [\n keyof SentryCliProps,\n SentryCliProps[keyof SentryCliProps],\n ][];\n const rv: string[] = [];\n for (const [key, value] of propEntries) {\n const normalizedKey =\n format === 'properties'\n ? key.replace(/\\//g, '.')\n : key.split('/').at(1) ?? '';\n if (value === undefined || value === null) {\n // comment that property out since it has no value\n rv.push(`#${normalizedKey}=`);\n } else {\n rv.push(`${normalizedKey}=${value}`);\n }\n }\n // eslint-disable-next-line prefer-template\n return rv.join('\\n') + '\\n';\n }\n\n public dumpConfig(config: Partial<SentryCliConfig>): string {\n const dumpedSections: string[] = [];\n for (const [sectionName, values] of Object.entries(config)) {\n const props = values ? this.dumpProperties(values, 'rc') : '';\n const section = `[${sectionName}]\\n${props}`;\n dumpedSections.push(section);\n }\n return dumpedSections.join('\\n');\n }\n\n /**\n * Creates `.sentryclirc` and `sentry.properties` files with the CLI properties\n * obtained from the user answers (or from logging into Sentry).\n * The `.sentryclirc` only contains the auth token and will be added to the\n * user's `.gitignore` file. The properties file contains the rest of the\n * properties (org, project, etc.).\n *\n * @param sentryCli instance of the Sentry CLI\n * @param cliProps the properties to write to the files\n */\n public async createSentryCliConfig(cliProps: SentryCliProps): Promise<void> {\n const { 'auth/token': authToken, ...cliPropsToWrite } = cliProps;\n\n /**\n * To not commit the auth token to the VCS, instead of adding it to the\n * properties file (like the rest of props), it's added to the Sentry CLI\n * config, which is added to the gitignore. This way makes the properties\n * file safe to commit without exposing any auth tokens.\n */\n if (authToken) {\n try {\n await fs.promises.appendFile(\n SENTRYCLIRC_FILENAME,\n this.dumpConfig({ auth: { 'auth/token': authToken } }),\n );\n green(`✓ Successfully added the auth token to ${SENTRYCLIRC_FILENAME}`);\n } catch {\n red(\n `⚠ Could not add the auth token to ${SENTRYCLIRC_FILENAME}, ` +\n `please add it to identify your user account:\\n${authToken}`,\n );\n nl();\n }\n } else {\n red(\n `⚠ Did not find an auth token, please add your token to ${SENTRYCLIRC_FILENAME}`,\n );\n l(\n 'To generate an auth token, visit https://sentry.io/settings/account/api/auth-tokens/',\n );\n l(\n 'To learn how to configure Sentry CLI, visit ' +\n 'https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-sentry-cli',\n );\n }\n\n await addToGitignore(\n SENTRYCLIRC_FILENAME,\n `⚠ Could not add ${SENTRYCLIRC_FILENAME} to ${GITIGNORE_FILENAME}, please add it to not commit your auth key.`,\n );\n\n try {\n await fs.promises.writeFile(\n `./${PROPERTIES_FILENAME}`,\n this.dumpProperties(cliPropsToWrite),\n );\n green('✓ Successfully created sentry.properties');\n } catch {\n red(`⚠ Could not add org and project data to ${PROPERTIES_FILENAME}`);\n l(\n 'See docs for a manual setup: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-sentry-cli',\n );\n }\n nl();\n }\n}\n"]}
|
|
@@ -8,15 +8,19 @@ function sanitizeAndValidateArgs(argv) {
|
|
|
8
8
|
argv.quiet = true;
|
|
9
9
|
(0, Logging_1.dim)('will activate quiet mode for you');
|
|
10
10
|
}
|
|
11
|
-
// @ts-ignore skip-connect does not exist on args
|
|
12
11
|
if (argv['skip-connect']) {
|
|
13
|
-
// @ts-ignore skip-connect does not exist on args
|
|
14
12
|
argv.skipConnect = argv['skip-connect'];
|
|
15
|
-
// @ts-ignore skip-connect does not exist on args
|
|
16
13
|
delete argv['skip-connect'];
|
|
17
14
|
}
|
|
18
|
-
// @ts-ignore skip-connect does not exist on args
|
|
19
15
|
argv.promoCode = argv['promo-code'];
|
|
16
|
+
if (argv['ignore-git-changes']) {
|
|
17
|
+
argv.ignoreGitChanges = argv['ignore-git-changes'];
|
|
18
|
+
delete argv['ignore-git-changes'];
|
|
19
|
+
}
|
|
20
|
+
if (argv['xcode-project-dir']) {
|
|
21
|
+
argv.xcodeProjectDir = argv['xcode-project-dir'];
|
|
22
|
+
delete argv['xcode-project-dir'];
|
|
23
|
+
}
|
|
20
24
|
}
|
|
21
25
|
function getCurrentIntegration(answers) {
|
|
22
26
|
return answers.integration;
|
|
@@ -43,7 +47,7 @@ async function startWizard(argv, ...steps) {
|
|
|
43
47
|
BottomBar_1.BottomBar.hide();
|
|
44
48
|
(0, Logging_1.nl)();
|
|
45
49
|
(0, Logging_1.red)('Sentry Wizard failed with:');
|
|
46
|
-
(0, Logging_1.red)(argv.debug ? e : e
|
|
50
|
+
(0, Logging_1.red)(argv.debug && e instanceof Error ? e.message : String(e));
|
|
47
51
|
(0, Logging_1.nl)();
|
|
48
52
|
(0, Logging_1.red)('Protip: Add --debug to see whats going on');
|
|
49
53
|
(0, Logging_1.red)('OR use --help to see your options');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Wizard.js","sourceRoot":"","sources":["../../../lib/Helper/Wizard.ts"],"names":[],"mappings":";;;AAKA,2CAAwC;AACxC,uCAAgD;AAEhD,SAAS,uBAAuB,CAAC,
|
|
1
|
+
{"version":3,"file":"Wizard.js","sourceRoot":"","sources":["../../../lib/Helper/Wizard.ts"],"names":[],"mappings":";;;AAKA,2CAAwC;AACxC,uCAAgD;AAEhD,SAAS,uBAAuB,CAAC,IAAoC;IACnE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAA,aAAG,EAAC,kCAAkC,CAAC,CAAC;KACzC;IACD,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAwB,CAAC;QAC/D,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC;KAC7B;IACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAsB,CAAC;IACzD,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE;QAC9B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAC1B,oBAAoB,CACO,CAAC;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC,CAAC;KACnC;IACD,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE;QAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAA4B,CAAC;QAC5E,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC;KAClC;AACH,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO,OAAO,CAAC,WAA8B,CAAC;AAChD,CAAC;AAFD,sDAEC;AAEM,KAAK,UAAU,WAAW,CAC/B,IAAU,EACV,GAAG,KAAsC;IAEzC,IAAI;QACF,uBAAuB,CAAC,IAAsC,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAA,eAAK,EAAC,IAAI,CAAC,CAAC;SACb;QACD,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAA,aAAG,EAAC,4CAA4C,CAAC,CAAC;SACnD;QACD,OAAO,MAAM,KAAK;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;aAC7B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5C,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC;QACvC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;KAC3B;IAAC,OAAO,CAAU,EAAE;QACnB,qBAAS,CAAC,IAAI,EAAE,CAAC;QACjB,IAAA,YAAE,GAAE,CAAC;QACL,IAAA,aAAG,EAAC,4BAA4B,CAAC,CAAC;QAClC,IAAA,aAAG,EAAC,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAA,YAAE,GAAE,CAAC;QACL,IAAA,aAAG,EAAC,2CAA2C,CAAC,CAAC;QACjD,IAAA,aAAG,EAAC,mCAAmC,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;AACH,CAAC;AA7BD,kCA6BC","sourcesContent":["import type { Answers } from 'inquirer';\n\nimport type { Args } from '../Constants';\nimport type { IStep } from '../Steps/BaseStep';\nimport type { BaseIntegration } from '../Steps/Integrations/BaseIntegration';\nimport { BottomBar } from './BottomBar';\nimport { debug, dim, nl, red } from './Logging';\n\nfunction sanitizeAndValidateArgs(argv: Args & Record<string, unknown>): void {\n if (argv.quiet === undefined) {\n argv.quiet = true;\n dim('will activate quiet mode for you');\n }\n if (argv['skip-connect']) {\n argv.skipConnect = argv['skip-connect'] as Args['skipConnect'];\n delete argv['skip-connect'];\n }\n argv.promoCode = argv['promo-code'] as Args['promoCode'];\n if (argv['ignore-git-changes']) {\n argv.ignoreGitChanges = argv[\n 'ignore-git-changes'\n ] as Args['ignoreGitChanges'];\n delete argv['ignore-git-changes'];\n }\n if (argv['xcode-project-dir']) {\n argv.xcodeProjectDir = argv['xcode-project-dir'] as Args['xcodeProjectDir'];\n delete argv['xcode-project-dir'];\n }\n}\n\nexport function getCurrentIntegration(answers: Answers): BaseIntegration {\n return answers.integration as BaseIntegration;\n}\n\nexport async function startWizard<M extends IStep>(\n argv: Args,\n ...steps: Array<{ new (debug: Args): M }>\n): Promise<Answers> {\n try {\n sanitizeAndValidateArgs(argv as Args & Record<string, unknown>);\n if (argv.debug) {\n debug(argv);\n }\n if (argv.quiet) {\n dim(\"Quiet mode On, DAMA, don't ask me anything\");\n }\n return await steps\n .map((step) => new step(argv))\n .reduce(async (answer, step) => {\n const prevAnswer = await answer;\n const answers = await step.emit(prevAnswer);\n return { ...prevAnswer, ...answers };\n }, Promise.resolve({}));\n } catch (e: unknown) {\n BottomBar.hide();\n nl();\n red('Sentry Wizard failed with:');\n red(argv.debug && e instanceof Error ? e.message : String(e));\n nl();\n red('Protip: Add --debug to see whats going on');\n red('OR use --help to see your options');\n process.exit(1);\n }\n}\n"]}
|
|
@@ -27,8 +27,10 @@ const demoAnswers = {
|
|
|
27
27
|
},
|
|
28
28
|
};
|
|
29
29
|
describe('SentryCli', () => {
|
|
30
|
+
const resolveFunc = jest
|
|
31
|
+
.fn()
|
|
32
|
+
.mockReturnValue('node_modules/sentry/cli');
|
|
30
33
|
test('convertAnswersToProperties', () => {
|
|
31
|
-
const resolveFunc = jest.fn().mockReturnValue('node_modules/sentry/cli');
|
|
32
34
|
const sentry = new SentryCli_1.SentryCli(args);
|
|
33
35
|
sentry.setResolveFunction(resolveFunc);
|
|
34
36
|
const props = sentry.convertAnswersToProperties(demoAnswers);
|
|
@@ -39,7 +41,6 @@ describe('SentryCli', () => {
|
|
|
39
41
|
expect(props['cli/executable']).toBe('node_modules/sentry/cli');
|
|
40
42
|
});
|
|
41
43
|
test('dump properties', () => {
|
|
42
|
-
const resolveFunc = jest.fn().mockReturnValue('node_modules/sentry/cli');
|
|
43
44
|
const sentry = new SentryCli_1.SentryCli(args);
|
|
44
45
|
sentry.setResolveFunction(resolveFunc);
|
|
45
46
|
const props = sentry.convertAnswersToProperties(demoAnswers);
|
|
@@ -50,9 +51,23 @@ defaults.project=test_proj
|
|
|
50
51
|
auth.token=abcd
|
|
51
52
|
cli.executable=node_modules/sentry/cli
|
|
52
53
|
`);
|
|
54
|
+
});
|
|
55
|
+
test('dump config', () => {
|
|
56
|
+
const sentry = new SentryCli_1.SentryCli(args);
|
|
57
|
+
sentry.setResolveFunction(resolveFunc);
|
|
58
|
+
const props = {
|
|
59
|
+
auth: { 'auth/token': 'myToken' },
|
|
60
|
+
};
|
|
61
|
+
expect(sentry.dumpConfig(props)).toMatchInlineSnapshot(`
|
|
62
|
+
"[auth]
|
|
63
|
+
token=myToken
|
|
64
|
+
"
|
|
65
|
+
`);
|
|
53
66
|
});
|
|
54
67
|
test('convertAnswersToProperties windows', () => {
|
|
55
|
-
const resolveFunc = jest
|
|
68
|
+
const resolveFunc = jest
|
|
69
|
+
.fn()
|
|
70
|
+
.mockReturnValue('node_modules\\sentry\\cli');
|
|
56
71
|
const sentry = new SentryCli_1.SentryCli(args);
|
|
57
72
|
sentry.setResolveFunction(resolveFunc);
|
|
58
73
|
const props = sentry.convertAnswersToProperties(demoAnswers);
|
|
@@ -63,7 +78,9 @@ cli.executable=node_modules/sentry/cli
|
|
|
63
78
|
expect(props['cli/executable']).toBe('node_modules\\\\sentry\\\\cli');
|
|
64
79
|
});
|
|
65
80
|
test('dump properties windows', () => {
|
|
66
|
-
const resolveFunc = jest
|
|
81
|
+
const resolveFunc = jest
|
|
82
|
+
.fn()
|
|
83
|
+
.mockReturnValue('node_modules\\sentry\\cli');
|
|
67
84
|
const sentry = new SentryCli_1.SentryCli(args);
|
|
68
85
|
sentry.setResolveFunction(resolveFunc);
|
|
69
86
|
const props = sentry.convertAnswersToProperties(demoAnswers);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SentryCli.js","sourceRoot":"","sources":["../../../../lib/Helper/__tests__/SentryCli.ts"],"names":[],"mappings":";;AAIA,+CAAwD;AACxD,4CAAyC;
|
|
1
|
+
{"version":3,"file":"SentryCli.js","sourceRoot":"","sources":["../../../../lib/Helper/__tests__/SentryCli.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference types=\"jest\" />\nimport type { Answers } from 'inquirer';\n\nimport type { Args } from '../../Constants';\nimport { Integration, Platform } from '../../Constants';\nimport { SentryCli } from '../SentryCli';\n\ntype RequireResolve = typeof require.resolve;\n\nconst args: Args = {\n debug: false,\n integration: Integration.reactNative,\n platform: [Platform.ios],\n quiet: false,\n skipConnect: false,\n uninstall: false,\n url: 'https://localhost:1234',\n signup: false,\n disableTelemetry: false,\n};\n\nconst demoAnswers: Answers = {\n config: {\n auth: {\n token: 'abcd',\n },\n organization: {\n slug: 'test_org',\n },\n project: {\n slug: 'test_proj',\n },\n },\n};\n\ndescribe('SentryCli', () => {\n const resolveFunc = jest\n .fn()\n .mockReturnValue('node_modules/sentry/cli') as unknown as RequireResolve;\n test('convertAnswersToProperties', () => {\n const sentry = new SentryCli(args);\n sentry.setResolveFunction(resolveFunc);\n const props = sentry.convertAnswersToProperties(demoAnswers);\n expect(props['defaults/url']).toBe('https://localhost:1234');\n expect(props['defaults/org']).toBe('test_org');\n expect(props['defaults/project']).toBe('test_proj');\n expect(props['auth/token']).toBe('abcd');\n expect(props['cli/executable']).toBe('node_modules/sentry/cli');\n });\n\n test('dump properties', () => {\n const sentry = new SentryCli(args);\n sentry.setResolveFunction(resolveFunc);\n const props = sentry.convertAnswersToProperties(demoAnswers);\n expect(sentry.dumpProperties(props))\n .toBe(`defaults.url=https://localhost:1234\ndefaults.org=test_org\ndefaults.project=test_proj\nauth.token=abcd\ncli.executable=node_modules/sentry/cli\n`);\n });\n\n test('dump config', () => {\n const sentry = new SentryCli(args);\n sentry.setResolveFunction(resolveFunc);\n const props = {\n auth: { 'auth/token': 'myToken' },\n };\n expect(sentry.dumpConfig(props)).toMatchInlineSnapshot(`\n \"[auth]\n token=myToken\n \"\n `);\n });\n\n test('convertAnswersToProperties windows', () => {\n const resolveFunc = jest\n .fn()\n .mockReturnValue(\n 'node_modules\\\\sentry\\\\cli',\n ) as unknown as RequireResolve;\n const sentry = new SentryCli(args);\n sentry.setResolveFunction(resolveFunc);\n const props = sentry.convertAnswersToProperties(demoAnswers);\n expect(props['defaults/url']).toBe('https://localhost:1234');\n expect(props['defaults/org']).toBe('test_org');\n expect(props['defaults/project']).toBe('test_proj');\n expect(props['auth/token']).toBe('abcd');\n expect(props['cli/executable']).toBe('node_modules\\\\\\\\sentry\\\\\\\\cli');\n });\n\n test('dump properties windows', () => {\n const resolveFunc = jest\n .fn()\n .mockReturnValue(\n 'node_modules\\\\sentry\\\\cli',\n ) as unknown as RequireResolve;\n const sentry = new SentryCli(args);\n sentry.setResolveFunction(resolveFunc);\n const props = sentry.convertAnswersToProperties(demoAnswers);\n expect(sentry.dumpProperties(props))\n .toBe(`defaults.url=https://localhost:1234\ndefaults.org=test_org\ndefaults.project=test_proj\nauth.token=abcd\ncli.executable=node_modules\\\\\\\\sentry\\\\\\\\cli\n`);\n });\n});\n"]}
|
package/dist/lib/Setup.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { Answers } from 'inquirer';
|
|
2
|
+
import { Args } from './Constants';
|
|
1
3
|
/**
|
|
2
4
|
* @deprecated this function is the entry point to the old, step-based wizards located in `lib`.
|
|
3
5
|
* When creating new wizards, we now add them to clack-based wizards under `src`.
|
|
4
6
|
* Therefor, do not call this function anymore.
|
|
5
7
|
* Use `run` from {@link ../src/run.ts} instead.
|
|
6
8
|
*/
|
|
7
|
-
export declare function run(argv:
|
|
9
|
+
export declare function run(argv: Args): Promise<Answers>;
|
package/dist/lib/Setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Setup.js","sourceRoot":"","sources":["../../lib/Setup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Setup.js","sourceRoot":"","sources":["../../lib/Setup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,8CAAqD;AAGrD,sCAA+C;AAC/C,4CAA8C;AAC9C,8CAAgC;AAEhC;;;;;GAKG;AACI,KAAK,UAAU,GAAG,CAAC,IAAU;IAClC,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,IAAA,qBAAe,GAAE,EAAE,CAAC;IAE/C,IAAI,IAAI,CAAC,KAAK,EAAE;QACd,IAAA,uBAAe,GAAE,CAAC;KACnB;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;QAChC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;KACxB;IACD,MAAM,KAAK,GAAG;QACZ,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,iBAAiB;QACtB,IAAI,CAAC,eAAe;KACrB,CAAC;IACF,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;QAC5B,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,mBAAmB,CACzB,CAAC;KACH;IACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO,IAAA,oBAAW,EAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;AACrC,CAAC;AA3BD,kBA2BC","sourcesContent":["import { Answers } from 'inquirer';\nimport { enableDebugLogs } from '../src/utils/debug';\nimport { Args } from './Constants';\n\nimport { readEnvironment } from './Helper/Env';\nimport { startWizard } from './Helper/Wizard';\nimport * as Step from './Steps';\n\n/**\n * @deprecated this function is the entry point to the old, step-based wizards located in `lib`.\n * When creating new wizards, we now add them to clack-based wizards under `src`.\n * Therefor, do not call this function anymore.\n * Use `run` from {@link ../src/run.ts} instead.\n */\nexport async function run(argv: Args): Promise<Answers> {\n const args = { ...argv, ...readEnvironment() };\n\n if (argv.debug) {\n enableDebugLogs();\n }\n\n if (args.uninstall === undefined) {\n args.uninstall = false;\n }\n const steps = [\n Step.Initial,\n Step.Welcome,\n Step.ChooseIntegration,\n Step.ShouldConfigure,\n ];\n if (args.uninstall === false) {\n steps.push(\n Step.OpenSentry,\n Step.WaitForSentry,\n Step.SentryProjectSelector,\n Step.PromptForParameters,\n );\n }\n steps.push(Step.ConfigureProject, Step.Result);\n\n return startWizard(args, ...steps);\n}\n"]}
|
|
@@ -9,8 +9,7 @@ class BaseIntegration extends BaseStep_1.BaseStep {
|
|
|
9
9
|
constructor(_argv) {
|
|
10
10
|
super(_argv);
|
|
11
11
|
this._argv = _argv;
|
|
12
|
-
|
|
13
|
-
this.type = this.construct;
|
|
12
|
+
this.type = this.constructor.name;
|
|
14
13
|
}
|
|
15
14
|
// eslint-disable-next-line @typescript-eslint/require-await
|
|
16
15
|
async uninstall(_answers) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseIntegration.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/BaseIntegration.ts"],"names":[],"mappings":";;;AAGA,0CAAuC;AAEvC,MAAsB,eAAgB,SAAQ,mBAAQ;IAIvB;IAHtB,IAAI,CAAS;IACV,gBAAgB,CAAmB;IAE7C,YAA6B,KAAW;QACtC,KAAK,CAAC,KAAK,CAAC,CAAC;QADc,UAAK,GAAL,KAAK,CAAM;QAEtC,
|
|
1
|
+
{"version":3,"file":"BaseIntegration.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/BaseIntegration.ts"],"names":[],"mappings":";;;AAGA,0CAAuC;AAEvC,MAAsB,eAAgB,SAAQ,mBAAQ;IAIvB;IAHtB,IAAI,CAAS;IACV,gBAAgB,CAAmB;IAE7C,YAA6B,KAAW;QACtC,KAAK,CAAC,KAAK,CAAC,CAAC;QADc,UAAK,GAAL,KAAK,CAAM;QAEtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;IAED,4DAA4D;IACrD,KAAK,CAAC,SAAS,CAAC,QAAiB;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,eAAe,CAAC,QAAiB;QAC5C,kEAAkE;QAClE,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,OAAO,IAAI,CAAC,gBAAgB,CAAC;SAC9B;QACD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,QAAiB;QACvC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAC7D,CAAC,MAAe,EAAE,EAAE,CAAC,MAAM,CAC5B,CAAC;IACJ,CAAC;CAGF;AAnCD,0CAmCC","sourcesContent":["import type { Answers } from 'inquirer';\n\nimport type { Args } from '../../Constants';\nimport { BaseStep } from '../BaseStep';\n\nexport abstract class BaseIntegration extends BaseStep {\n public type: string;\n protected _shouldConfigure: Promise<Answers>;\n\n public constructor(protected _argv: Args) {\n super(_argv);\n this.type = this.constructor.name;\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async uninstall(_answers: Answers): Promise<Answers> {\n return {};\n }\n\n /**\n * This can be used for example for platform:boolean to determine\n * if we should configure iOS/Android.\n * Basically this will be merged into answers so it can be checked by a later step.\n */\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n this._shouldConfigure = Promise.resolve({ platform: true });\n return this._shouldConfigure;\n }\n\n public async shouldEmit(_answers: Answers): Promise<boolean> {\n return Object.values(await this.shouldConfigure(_answers)).some(\n (active: boolean) => active,\n );\n }\n\n public abstract emit(answers: Answers): Promise<Answers>;\n}\n"]}
|
|
@@ -29,11 +29,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
29
29
|
exports.Cordova = void 0;
|
|
30
30
|
const fs = __importStar(require("node:fs"));
|
|
31
31
|
const path = __importStar(require("node:path"));
|
|
32
|
+
const xcode_1 = __importDefault(require("xcode"));
|
|
32
33
|
const File_1 = require("../../Helper/File");
|
|
33
34
|
const Logging_1 = require("../../Helper/Logging");
|
|
34
35
|
const SentryCli_1 = require("../../Helper/SentryCli");
|
|
35
36
|
const BaseIntegration_1 = require("./BaseIntegration");
|
|
36
|
-
const xcode_1 = __importDefault(require("xcode"));
|
|
37
37
|
class Cordova extends BaseIntegration_1.BaseIntegration {
|
|
38
38
|
_argv;
|
|
39
39
|
_sentryCli;
|
|
@@ -49,13 +49,13 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
|
|
|
49
49
|
return this.uninstall(answers);
|
|
50
50
|
}
|
|
51
51
|
const sentryCliProperties = this._sentryCli.convertAnswersToProperties(answers);
|
|
52
|
-
await (0, File_1.patchMatchingFile)(`${this._folderPrefix}/ios/*.xcodeproj/project.pbxproj`, this._patchXcodeProj
|
|
52
|
+
await (0, File_1.patchMatchingFile)(`${this._folderPrefix}/ios/*.xcodeproj/project.pbxproj`, (contents, filename) => this._patchXcodeProj(contents, filename));
|
|
53
53
|
await this._addSentryProperties(sentryCliProperties);
|
|
54
54
|
(0, Logging_1.green)('Successfully set up for cordova');
|
|
55
55
|
return {};
|
|
56
56
|
}
|
|
57
57
|
async uninstall(_answers) {
|
|
58
|
-
await (0, File_1.patchMatchingFile)('**/*.xcodeproj/project.pbxproj', this._unpatchXcodeProj
|
|
58
|
+
await (0, File_1.patchMatchingFile)('**/*.xcodeproj/project.pbxproj', (_, filename) => this._unpatchXcodeProj(filename));
|
|
59
59
|
return {};
|
|
60
60
|
}
|
|
61
61
|
async shouldConfigure(_answers) {
|
|
@@ -95,7 +95,7 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
|
|
|
95
95
|
}
|
|
96
96
|
_unpatchXcodeBuildScripts(proj) {
|
|
97
97
|
const scripts = proj.hash.project.objects.PBXShellScriptBuildPhase || {};
|
|
98
|
-
const firstTarget = proj.getFirstTarget()
|
|
98
|
+
const firstTarget = proj.getFirstTarget()?.uuid || '';
|
|
99
99
|
const nativeTargets = proj.hash.project.objects.PBXNativeTarget;
|
|
100
100
|
// scripts to kill entirely.
|
|
101
101
|
for (const key of Object.keys(scripts)) {
|
|
@@ -104,13 +104,14 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
|
|
|
104
104
|
if (typeof script === 'string' || script === undefined) {
|
|
105
105
|
continue;
|
|
106
106
|
}
|
|
107
|
-
if (script.shellScript
|
|
108
|
-
script.shellScript
|
|
107
|
+
if (script.shellScript?.match(/SENTRY_PROPERTIES/) ||
|
|
108
|
+
script.shellScript?.match(/SENTRY_FRAMEWORK_PATCH/)) {
|
|
109
109
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
110
110
|
delete scripts[key];
|
|
111
111
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
112
112
|
delete scripts[`${key}_comment`];
|
|
113
|
-
const
|
|
113
|
+
const target = nativeTargets && nativeTargets[firstTarget];
|
|
114
|
+
const phases = typeof target === 'object' && target.buildPhases;
|
|
114
115
|
if (phases) {
|
|
115
116
|
for (let i = 0; i < phases.length; i++) {
|
|
116
117
|
if (phases[i].value === key) {
|
|
@@ -133,7 +134,8 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
|
|
|
133
134
|
}
|
|
134
135
|
const buildScripts = [];
|
|
135
136
|
for (const val of Object.values(proj.hash.project.objects.PBXShellScriptBuildPhase || {})) {
|
|
136
|
-
if (val
|
|
137
|
+
if (typeof val === 'object' &&
|
|
138
|
+
val.isa === 'PBXShellScriptBuildPhase') {
|
|
137
139
|
buildScripts.push(val);
|
|
138
140
|
}
|
|
139
141
|
}
|
|
@@ -155,7 +157,8 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
|
|
|
155
157
|
}
|
|
156
158
|
_addNewXcodeBuildPhaseForSymbols(buildScripts, proj) {
|
|
157
159
|
for (const script of buildScripts) {
|
|
158
|
-
if (script
|
|
160
|
+
if (typeof script === 'object' &&
|
|
161
|
+
script.shellScript?.match(/SENTRY_PROPERTIES/)) {
|
|
159
162
|
return;
|
|
160
163
|
}
|
|
161
164
|
}
|
|
@@ -193,7 +196,8 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
|
|
|
193
196
|
}
|
|
194
197
|
_addNewXcodeBuildPhaseForStripping(buildScripts, proj) {
|
|
195
198
|
for (const script of buildScripts) {
|
|
196
|
-
if (script
|
|
199
|
+
if (typeof script === 'object' &&
|
|
200
|
+
script.shellScript?.match(/SENTRY_FRAMEWORK_PATCH/)) {
|
|
197
201
|
return;
|
|
198
202
|
}
|
|
199
203
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cordova.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/Cordova.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { Answers } from 'inquirer';\n\nimport type { Args } from '../../Constants';\nimport { exists, matchesContent, patchMatchingFile } from '../../Helper/File';\nimport { green } from '../../Helper/Logging';\nimport { SentryCli } from '../../Helper/SentryCli';\nimport { BaseIntegration } from './BaseIntegration';\n\nimport xcode from 'xcode';\nimport type { PBXShellScriptBuildPhase } from 'xcode';\n\nexport class Cordova extends BaseIntegration {\n protected _sentryCli: SentryCli;\n\n protected _folderPrefix = 'platforms';\n protected _pluginFolder: string[] = ['.'];\n\n public constructor(protected _argv: Args) {\n super(_argv);\n this._sentryCli = new SentryCli(this._argv);\n }\n\n public async emit(answers: Answers): Promise<Answers> {\n if (this._argv.uninstall) {\n return this.uninstall(answers);\n }\n\n const sentryCliProperties =\n this._sentryCli.convertAnswersToProperties(answers);\n\n await patchMatchingFile(\n `${this._folderPrefix}/ios/*.xcodeproj/project.pbxproj`,\n this._patchXcodeProj.bind(this),\n );\n\n await this._addSentryProperties(sentryCliProperties);\n green('Successfully set up for cordova');\n\n return {};\n }\n\n public async uninstall(_answers: Answers): Promise<Answers> {\n await patchMatchingFile(\n '**/*.xcodeproj/project.pbxproj',\n this._unpatchXcodeProj.bind(this),\n );\n\n return {};\n }\n\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n\n let result = false;\n if (!exists(path.join('sentry.properties'))) {\n result = true;\n this.debug('sentry.properties not exists');\n }\n\n if (\n !matchesContent('**/*.xcodeproj/project.pbxproj', /SENTRY_PROPERTIES/gi)\n ) {\n result = true;\n this.debug('**/*.xcodeproj/project.pbxproj not matched');\n }\n\n if (this._argv.uninstall) {\n // if we uninstall we need to invert the result so we remove already patched\n result = !result;\n }\n\n this._shouldConfigure = Promise.resolve({ cordova: result });\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.shouldConfigure;\n }\n\n private _unpatchXcodeProj(filename: string): Promise<string> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: any) => {\n if (err) {\n reject(err);\n return;\n }\n\n this._unpatchXcodeBuildScripts(proj);\n resolve(proj.writeSync());\n });\n });\n }\n\n private _unpatchXcodeBuildScripts(proj: any): void {\n const scripts = proj.hash.project.objects.PBXShellScriptBuildPhase || {};\n const firstTarget = proj.getFirstTarget().uuid;\n const nativeTargets = proj.hash.project.objects.PBXNativeTarget;\n\n // scripts to kill entirely.\n for (const key of Object.keys(scripts)) {\n const script = scripts[key];\n\n // ignore comments and keys that got deleted\n if (typeof script === 'string' || script === undefined) {\n continue;\n }\n\n if (\n script.shellScript.match(/SENTRY_PROPERTIES/) ||\n script.shellScript.match(/SENTRY_FRAMEWORK_PATCH/)\n ) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[key];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[`${key}_comment`];\n const phases = nativeTargets[firstTarget].buildPhases;\n if (phases) {\n for (let i = 0; i < phases.length; i++) {\n if (phases[i].value === key) {\n phases.splice(i, 1);\n break;\n }\n }\n }\n continue;\n }\n }\n }\n\n private _patchXcodeProj(\n contents: string,\n filename: string,\n ): Promise<void | string> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: any) => {\n if (err) {\n reject(err);\n return;\n }\n\n const buildScripts = [];\n for (const val of Object.values(\n proj.hash.project.objects.PBXShellScriptBuildPhase || {},\n )) {\n if ((val as PBXShellScriptBuildPhase).isa) {\n buildScripts.push(val);\n }\n }\n\n this._addNewXcodeBuildPhaseForSymbols(buildScripts, proj);\n this._addNewXcodeBuildPhaseForStripping(buildScripts, proj);\n\n // we always modify the xcode file in memory but we only want to save it\n // in case the user wants configuration for ios. This is why we check\n // here first if changes are made before we might prompt the platform\n // continue prompt.\n const newContents = proj.writeSync();\n if (newContents === contents) {\n resolve();\n } else {\n resolve(newContents);\n }\n });\n });\n }\n\n private _addNewXcodeBuildPhaseForSymbols(buildScripts: any, proj: any): void {\n for (const script of buildScripts) {\n if (script.shellScript.match(/SENTRY_PROPERTIES/)) {\n return;\n }\n }\n const cwd = path.join(process.cwd(), 'sentry.properties');\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n null,\n {\n shellPath: '/bin/sh',\n shellScript:\n // eslint-disable-next-line prefer-template\n 'echo \"warning: uploading debug symbols - set SENTRY_SKIP_DSYM_UPLOAD=true to skip this\"\\\\n' +\n 'if [ -n \"$SENTRY_SKIP_DSYM_UPLOAD\" ]; then\\\\n' +\n ' echo \"warning: skipping debug symbol upload\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'export SENTRY_PROPERTIES=' +\n cwd +\n '\\\\n' +\n 'function getProperty {\\\\n' +\n ' PROP_KEY=$1\\\\n' +\n ' PROP_VALUE=`cat $SENTRY_PROPERTIES | grep \"$PROP_KEY\" | cut -d\\'=\\' -f2`\\\\n' +\n ' if [ -z \"$PROP_VALUE\" ]; then\\\\n' +\n ' echo \"plugins/sentry-cordova/node_modules/@sentry/cli/bin/sentry-cli\"\\\\n' +\n ' else\\\\n' +\n ' echo $PROP_VALUE\\\\n' +\n ' fi\\\\n' +\n '}\\\\n' +\n 'if [ ! -f $SENTRY_PROPERTIES ]; then\\\\n' +\n ' echo \"warning: SENTRY: sentry.properties file not found! Skipping symbol upload.\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'echo \"# Reading property from $SENTRY_PROPERTIES\"\\\\n' +\n 'SENTRY_CLI=$(getProperty \"cli.executable\")\\\\n' +\n 'SENTRY_COMMAND=\"../../$SENTRY_CLI upload-dsym\"\\\\n' +\n '$SENTRY_COMMAND',\n },\n );\n }\n\n private _addNewXcodeBuildPhaseForStripping(\n buildScripts: any,\n proj: any,\n ): void {\n for (const script of buildScripts) {\n if (script.shellScript.match(/SENTRY_FRAMEWORK_PATCH/)) {\n return;\n }\n }\n // http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Sentry strip unused archs from Framework',\n null,\n {\n shellPath: '/bin/sh',\n shellScript:\n '# SENTRY_FRAMEWORK_PATCH \\\\n' +\n 'echo \"warning: patching framework - set SENTRY_SKIP_FRAMEWORK_PATCH=true to skip this\"\\\\n' +\n 'if [ -n \"$SENTRY_SKIP_FRAMEWORK_PATCH\" ]; then\\\\n' +\n ' echo \"warning: skipping framework patch\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'APP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\\\\n' +\n 'find \"$APP_PATH\" -name \\'Sentry*.framework\\' -type d | while read -r FRAMEWORK\\\\n' +\n 'do\\\\n' +\n 'FRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\\\\n' +\n 'FRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\\\\n' +\n 'echo \"Executable is $FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'EXTRACTED_ARCHS=()\\\\n' +\n 'for ARCH in $ARCHS\\\\n' +\n 'do\\\\n' +\n 'echo \"Checking if $FRAMEWORK_EXECUTABLE_PATH needs to be stripped.\"\\\\n' +\n '# Do not skip if \"Architectures in the fat file\".\\\\n' +\n '# Skip if Non-fat file or if file not found. \\\\n' +\n 'if lipo -info \"$FRAMEWORK_EXECUTABLE_PATH\" | grep -v \" fat \"; then\\\\n' +\n ' echo \"Strip not required, skipping the strip script.\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'echo \"Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME\"\\\\n' +\n 'lipo -extract \"$ARCH\" \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\"\\\\n' +\n 'EXTRACTED_ARCHS+=(\"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\")\\\\n' +\n 'done\\\\n' +\n 'echo \"Merging extracted architectures: ${ARCHS}\"\\\\n' +\n 'lipo -o \"$FRAMEWORK_EXECUTABLE_PATH-merged\" -create \"${EXTRACTED_ARCHS[@]}\"\\\\n' +\n 'rm \"${EXTRACTED_ARCHS[@]}\"\\\\n' +\n 'echo \"Replacing original executable with thinned version\"\\\\n' +\n 'rm \"$FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'mv \"$FRAMEWORK_EXECUTABLE_PATH-merged\" \"$FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'done',\n },\n );\n }\n\n private _addSentryProperties(properties: any): Promise<void> {\n let rv = Promise.resolve();\n const fn = path.join('sentry.properties');\n if (exists(fn)) {\n return rv;\n }\n rv = rv.then(() =>\n fs.writeFileSync(fn, this._sentryCli.dumpProperties(properties)),\n );\n\n return rv;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Cordova.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/Cordova.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Answers } from 'inquirer';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PBXShellScriptBuildPhase, Project } from 'xcode';\nimport xcode from 'xcode';\n\nimport type { Args } from '../../Constants';\nimport { exists, matchesContent, patchMatchingFile } from '../../Helper/File';\nimport { green } from '../../Helper/Logging';\nimport { SentryCli, SentryCliProps } from '../../Helper/SentryCli';\nimport { BaseIntegration } from './BaseIntegration';\n\nexport class Cordova extends BaseIntegration {\n protected _sentryCli: SentryCli;\n\n protected _folderPrefix = 'platforms';\n protected _pluginFolder: string[] = ['.'];\n\n public constructor(protected _argv: Args) {\n super(_argv);\n this._sentryCli = new SentryCli(this._argv);\n }\n\n public async emit(answers: Answers): Promise<Answers> {\n if (this._argv.uninstall) {\n return this.uninstall(answers);\n }\n\n const sentryCliProperties =\n this._sentryCli.convertAnswersToProperties(answers);\n\n await patchMatchingFile(\n `${this._folderPrefix}/ios/*.xcodeproj/project.pbxproj`,\n (contents, filename) => this._patchXcodeProj(contents, filename),\n );\n\n await this._addSentryProperties(sentryCliProperties);\n green('Successfully set up for cordova');\n\n return {};\n }\n\n public async uninstall(_answers: Answers): Promise<Answers> {\n await patchMatchingFile('**/*.xcodeproj/project.pbxproj', (_, filename) =>\n this._unpatchXcodeProj(filename),\n );\n\n return {};\n }\n\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n\n let result = false;\n if (!exists(path.join('sentry.properties'))) {\n result = true;\n this.debug('sentry.properties not exists');\n }\n\n if (\n !matchesContent('**/*.xcodeproj/project.pbxproj', /SENTRY_PROPERTIES/gi)\n ) {\n result = true;\n this.debug('**/*.xcodeproj/project.pbxproj not matched');\n }\n\n if (this._argv.uninstall) {\n // if we uninstall we need to invert the result so we remove already patched\n result = !result;\n }\n\n this._shouldConfigure = Promise.resolve({ cordova: result });\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.shouldConfigure;\n }\n\n private _unpatchXcodeProj(filename: string): Promise<string> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: any) => {\n if (err) {\n reject(err);\n return;\n }\n\n this._unpatchXcodeBuildScripts(proj);\n resolve(proj.writeSync());\n });\n });\n }\n\n private _unpatchXcodeBuildScripts(proj: Project): void {\n const scripts = proj.hash.project.objects.PBXShellScriptBuildPhase || {};\n\n const firstTarget = proj.getFirstTarget()?.uuid || '';\n\n const nativeTargets = proj.hash.project.objects.PBXNativeTarget;\n\n // scripts to kill entirely.\n for (const key of Object.keys(scripts)) {\n const script = scripts[key];\n\n // ignore comments and keys that got deleted\n if (typeof script === 'string' || script === undefined) {\n continue;\n }\n\n if (\n script.shellScript?.match(/SENTRY_PROPERTIES/) ||\n script.shellScript?.match(/SENTRY_FRAMEWORK_PATCH/)\n ) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[key];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[`${key}_comment`];\n const target = nativeTargets && nativeTargets[firstTarget];\n const phases = typeof target === 'object' && target.buildPhases;\n if (phases) {\n for (let i = 0; i < phases.length; i++) {\n if (phases[i].value === key) {\n phases.splice(i, 1);\n break;\n }\n }\n }\n continue;\n }\n }\n }\n\n private _patchXcodeProj(\n contents: string,\n filename: string,\n ): Promise<string | void> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: any) => {\n if (err) {\n reject(err);\n return;\n }\n\n const buildScripts: Array<PBXShellScriptBuildPhase> = [];\n for (const val of Object.values(\n proj.hash.project.objects.PBXShellScriptBuildPhase || {},\n )) {\n if (\n typeof val === 'object' &&\n val.isa === 'PBXShellScriptBuildPhase'\n ) {\n buildScripts.push(val);\n }\n }\n\n this._addNewXcodeBuildPhaseForSymbols(buildScripts, proj);\n this._addNewXcodeBuildPhaseForStripping(buildScripts, proj);\n\n // we always modify the xcode file in memory but we only want to save it\n // in case the user wants configuration for ios. This is why we check\n // here first if changes are made before we might prompt the platform\n // continue prompt.\n const newContents = proj.writeSync();\n if (newContents === contents) {\n resolve();\n } else {\n resolve(newContents);\n }\n });\n });\n }\n\n private _addNewXcodeBuildPhaseForSymbols(\n buildScripts: Array<PBXShellScriptBuildPhase | string>,\n proj: Project,\n ): void {\n for (const script of buildScripts) {\n if (\n typeof script === 'object' &&\n script.shellScript?.match(/SENTRY_PROPERTIES/)\n ) {\n return;\n }\n }\n const cwd = path.join(process.cwd(), 'sentry.properties');\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n null,\n {\n shellPath: '/bin/sh',\n shellScript:\n // eslint-disable-next-line prefer-template\n 'echo \"warning: uploading debug symbols - set SENTRY_SKIP_DSYM_UPLOAD=true to skip this\"\\\\n' +\n 'if [ -n \"$SENTRY_SKIP_DSYM_UPLOAD\" ]; then\\\\n' +\n ' echo \"warning: skipping debug symbol upload\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'export SENTRY_PROPERTIES=' +\n cwd +\n '\\\\n' +\n 'function getProperty {\\\\n' +\n ' PROP_KEY=$1\\\\n' +\n ' PROP_VALUE=`cat $SENTRY_PROPERTIES | grep \"$PROP_KEY\" | cut -d\\'=\\' -f2`\\\\n' +\n ' if [ -z \"$PROP_VALUE\" ]; then\\\\n' +\n ' echo \"plugins/sentry-cordova/node_modules/@sentry/cli/bin/sentry-cli\"\\\\n' +\n ' else\\\\n' +\n ' echo $PROP_VALUE\\\\n' +\n ' fi\\\\n' +\n '}\\\\n' +\n 'if [ ! -f $SENTRY_PROPERTIES ]; then\\\\n' +\n ' echo \"warning: SENTRY: sentry.properties file not found! Skipping symbol upload.\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'echo \"# Reading property from $SENTRY_PROPERTIES\"\\\\n' +\n 'SENTRY_CLI=$(getProperty \"cli.executable\")\\\\n' +\n 'SENTRY_COMMAND=\"../../$SENTRY_CLI upload-dsym\"\\\\n' +\n '$SENTRY_COMMAND',\n },\n );\n }\n\n private _addNewXcodeBuildPhaseForStripping(\n buildScripts: Array<PBXShellScriptBuildPhase | string>,\n proj: Project,\n ): void {\n for (const script of buildScripts) {\n if (\n typeof script === 'object' &&\n script.shellScript?.match(/SENTRY_FRAMEWORK_PATCH/)\n ) {\n return;\n }\n }\n // http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Sentry strip unused archs from Framework',\n null,\n {\n shellPath: '/bin/sh',\n shellScript:\n '# SENTRY_FRAMEWORK_PATCH \\\\n' +\n 'echo \"warning: patching framework - set SENTRY_SKIP_FRAMEWORK_PATCH=true to skip this\"\\\\n' +\n 'if [ -n \"$SENTRY_SKIP_FRAMEWORK_PATCH\" ]; then\\\\n' +\n ' echo \"warning: skipping framework patch\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'APP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\\\\n' +\n 'find \"$APP_PATH\" -name \\'Sentry*.framework\\' -type d | while read -r FRAMEWORK\\\\n' +\n 'do\\\\n' +\n 'FRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\\\\n' +\n 'FRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\\\\n' +\n 'echo \"Executable is $FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'EXTRACTED_ARCHS=()\\\\n' +\n 'for ARCH in $ARCHS\\\\n' +\n 'do\\\\n' +\n 'echo \"Checking if $FRAMEWORK_EXECUTABLE_PATH needs to be stripped.\"\\\\n' +\n '# Do not skip if \"Architectures in the fat file\".\\\\n' +\n '# Skip if Non-fat file or if file not found. \\\\n' +\n 'if lipo -info \"$FRAMEWORK_EXECUTABLE_PATH\" | grep -v \" fat \"; then\\\\n' +\n ' echo \"Strip not required, skipping the strip script.\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'echo \"Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME\"\\\\n' +\n 'lipo -extract \"$ARCH\" \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\"\\\\n' +\n 'EXTRACTED_ARCHS+=(\"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\")\\\\n' +\n 'done\\\\n' +\n 'echo \"Merging extracted architectures: ${ARCHS}\"\\\\n' +\n 'lipo -o \"$FRAMEWORK_EXECUTABLE_PATH-merged\" -create \"${EXTRACTED_ARCHS[@]}\"\\\\n' +\n 'rm \"${EXTRACTED_ARCHS[@]}\"\\\\n' +\n 'echo \"Replacing original executable with thinned version\"\\\\n' +\n 'rm \"$FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'mv \"$FRAMEWORK_EXECUTABLE_PATH-merged\" \"$FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'done',\n },\n );\n }\n\n private _addSentryProperties(properties: SentryCliProps): Promise<void> {\n let rv = Promise.resolve();\n const fn = path.join('sentry.properties');\n if (exists(fn)) {\n return rv;\n }\n rv = rv.then(() =>\n fs.writeFileSync(fn, this._sentryCli.dumpProperties(properties)),\n );\n\n return rv;\n }\n}\n"]}
|
|
@@ -2,11 +2,14 @@ import type { Answers } from 'inquirer';
|
|
|
2
2
|
import type { Args } from '../../Constants';
|
|
3
3
|
import { SentryCli } from '../../Helper/SentryCli';
|
|
4
4
|
import { BaseIntegration } from './BaseIntegration';
|
|
5
|
+
import { Config } from '../../Types';
|
|
5
6
|
export declare class Electron extends BaseIntegration {
|
|
6
7
|
protected _argv: Args;
|
|
7
8
|
protected _sentryCli: SentryCli;
|
|
8
9
|
constructor(_argv: Args);
|
|
9
|
-
emit(answers: Answers
|
|
10
|
+
emit(answers: Answers & {
|
|
11
|
+
config?: Config;
|
|
12
|
+
}): Promise<Answers>;
|
|
10
13
|
shouldConfigure(_answers: Answers): Promise<Answers>;
|
|
11
14
|
private _checkDep;
|
|
12
15
|
}
|
|
@@ -71,7 +71,7 @@ class Electron extends BaseIntegration_1.BaseIntegration {
|
|
|
71
71
|
}
|
|
72
72
|
// eslint-disable-next-line @typescript-eslint/require-await
|
|
73
73
|
async emit(answers) {
|
|
74
|
-
const dsn = answers.config?.dsn?.public ??
|
|
74
|
+
const dsn = answers.config?.dsn?.public ?? 'DSN NOT FOUND';
|
|
75
75
|
(0, Logging_1.nl)();
|
|
76
76
|
const sentryCliProps = this._sentryCli.convertAnswersToProperties(answers);
|
|
77
77
|
fs.writeFileSync('./sentry.properties', this._sentryCli.dumpProperties(sentryCliProps));
|