@sentry/wizard 4.8.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/e2e-tests/tests/angular-17.test.js +41 -41
- package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
- package/dist/e2e-tests/tests/angular-19.test.js +39 -39
- package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
- package/dist/e2e-tests/tests/expo.test.js +10 -2
- package/dist/e2e-tests/tests/expo.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-native.test.js +38 -3
- package/dist/e2e-tests/tests/react-native.test.js.map +1 -1
- package/dist/e2e-tests/utils/index.js +14 -6
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/lib/Helper/SentryCli.d.ts +0 -11
- package/dist/lib/Helper/SentryCli.js +0 -52
- package/dist/lib/Helper/SentryCli.js.map +1 -1
- package/dist/lib/Steps/Integrations/Cordova.js +13 -30
- package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
- package/dist/src/android/templates.js +2 -0
- package/dist/src/android/templates.js.map +1 -1
- package/dist/src/angular/angular-wizard.js +1 -1
- package/dist/src/angular/angular-wizard.js.map +1 -1
- package/dist/src/angular/sdk-setup.d.ts +1 -1
- package/dist/src/angular/sdk-setup.js +3 -3
- package/dist/src/angular/sdk-setup.js.map +1 -1
- package/dist/src/apple/code-tools.d.ts +4 -2
- package/dist/src/apple/code-tools.js +21 -11
- package/dist/src/apple/code-tools.js.map +1 -1
- package/dist/src/apple/inject-code-snippet.js +5 -3
- package/dist/src/apple/inject-code-snippet.js.map +1 -1
- package/dist/src/apple/macos-system-helper.d.ts +5 -0
- package/dist/src/apple/macos-system-helper.js +86 -0
- package/dist/src/apple/macos-system-helper.js.map +1 -0
- package/dist/src/apple/templates.js +10 -0
- package/dist/src/apple/templates.js.map +1 -1
- package/dist/src/apple/xcode-manager.d.ts +237 -11
- package/dist/src/apple/xcode-manager.js +736 -65
- package/dist/src/apple/xcode-manager.js.map +1 -1
- package/dist/src/apple/xcode-project-object-with-id.d.ts +5 -0
- package/dist/src/apple/xcode-project-object-with-id.js +3 -0
- package/dist/src/apple/xcode-project-object-with-id.js.map +1 -0
- package/dist/src/flutter/templates.js +7 -1
- package/dist/src/flutter/templates.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +1 -3
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nuxt/nuxt-wizard.js +1 -3
- package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
- package/dist/src/react-native/expo-env-file.js +5 -0
- package/dist/src/react-native/expo-env-file.js.map +1 -1
- package/dist/src/react-native/expo-metro.js +18 -5
- package/dist/src/react-native/expo-metro.js.map +1 -1
- package/dist/src/react-native/expo.js +6 -0
- package/dist/src/react-native/expo.js.map +1 -1
- package/dist/src/react-native/glob.js +14 -4
- package/dist/src/react-native/glob.js.map +1 -1
- package/dist/src/react-native/gradle.d.ts +0 -1
- package/dist/src/react-native/gradle.js +15 -9
- package/dist/src/react-native/gradle.js.map +1 -1
- package/dist/src/react-native/javascript.d.ts +9 -4
- package/dist/src/react-native/javascript.js +44 -22
- package/dist/src/react-native/javascript.js.map +1 -1
- package/dist/src/react-native/metro.d.ts +1 -5
- package/dist/src/react-native/metro.js +18 -120
- package/dist/src/react-native/metro.js.map +1 -1
- package/dist/src/react-native/options.d.ts +1 -3
- package/dist/src/react-native/options.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.d.ts +1 -19
- package/dist/src/react-native/react-native-wizard.js +27 -101
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-native/xcode.d.ts +0 -7
- package/dist/src/react-native/xcode.js +15 -108
- package/dist/src/react-native/xcode.js.map +1 -1
- package/dist/src/remix/remix-wizard.js +1 -3
- package/dist/src/remix/remix-wizard.js.map +1 -1
- package/dist/src/run.js +1 -4
- package/dist/src/run.js.map +1 -1
- package/dist/src/sourcemaps/utils/sdk-version.js +3 -0
- package/dist/src/sourcemaps/utils/sdk-version.js.map +1 -1
- package/dist/src/sveltekit/sveltekit-wizard.js +1 -3
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/utils/ast-utils.d.ts +0 -7
- package/dist/src/utils/ast-utils.js +1 -27
- package/dist/src/utils/ast-utils.js.map +1 -1
- package/dist/src/utils/clack/index.d.ts +2 -12
- package/dist/src/utils/clack/index.js +8 -47
- package/dist/src/utils/clack/index.js.map +1 -1
- package/dist/src/utils/git.d.ts +11 -0
- package/dist/src/utils/git.js +69 -0
- package/dist/src/utils/git.js.map +1 -0
- package/dist/src/utils/sentrycli-utils.js +13 -4
- package/dist/src/utils/sentrycli-utils.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/apple/code-tools.test.js +54 -35
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/configure-sentry-cli.test.d.ts +1 -0
- package/dist/test/apple/configure-sentry-cli.test.js +131 -0
- package/dist/test/apple/configure-sentry-cli.test.js.map +1 -0
- package/dist/test/apple/macos-system-helper-mocked.test.d.ts +1 -0
- package/dist/test/apple/macos-system-helper-mocked.test.js +46 -0
- package/dist/test/apple/macos-system-helper-mocked.test.js.map +1 -0
- package/dist/test/apple/macos-system-helper.test.d.ts +1 -0
- package/dist/test/apple/macos-system-helper.test.js +88 -0
- package/dist/test/apple/macos-system-helper.test.js.map +1 -0
- package/dist/test/apple/templates.test.js +10 -0
- package/dist/test/apple/templates.test.js.map +1 -1
- package/dist/test/apple/xcode-manager.test.js +745 -379
- package/dist/test/apple/xcode-manager.test.js.map +1 -1
- package/dist/test/flutter/templates.test.js +9 -0
- package/dist/test/flutter/templates.test.js.map +1 -1
- package/dist/test/react-native/gradle.test.js +0 -119
- package/dist/test/react-native/gradle.test.js.map +1 -1
- package/dist/test/react-native/javascript.test.js +119 -0
- package/dist/test/react-native/javascript.test.js.map +1 -1
- package/dist/test/react-native/metro.test.js +0 -90
- package/dist/test/react-native/metro.test.js.map +1 -1
- package/dist/test/react-native/xcode.test.js +0 -81
- package/dist/test/react-native/xcode.test.js.map +1 -1
- package/dist/test/utils/git.test.d.ts +1 -0
- package/dist/test/utils/git.test.js +70 -0
- package/dist/test/utils/git.test.js.map +1 -0
- package/package.json +1 -1
- package/dist/src/react-native/uninstall.d.ts +0 -2
- package/dist/src/react-native/uninstall.js +0 -94
- package/dist/src/react-native/uninstall.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../e2e-tests/utils/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { Integration } from '../../lib/Constants';\nimport { spawn, execSync } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport { dim, green, red } from '../../lib/Helper/Logging';\nimport { expect } from 'vitest';\n\nexport const KEYS = {\n UP: '\\u001b[A',\n DOWN: '\\u001b[B',\n LEFT: '\\u001b[D',\n RIGHT: '\\u001b[C',\n ENTER: '\\r',\n SPACE: ' ',\n};\n\nexport const TEST_ARGS = {\n AUTH_TOKEN: process.env.SENTRY_TEST_AUTH_TOKEN || 'TEST_AUTH_TOKEN',\n PROJECT_DSN:\n process.env.SENTRY_TEST_DSN || 'https://public@dsn.ingest.sentry.io/1337',\n ORG_SLUG: process.env.SENTRY_TEST_ORG || 'TEST_ORG_SLUG',\n PROJECT_SLUG: process.env.SENTRY_TEST_PROJECT || 'TEST_PROJECT_SLUG',\n};\n\nexport const log = {\n success: (message: string) => {\n green(`[SUCCESS] ${message}`);\n },\n info: (message: string) => {\n dim(`[INFO] ${message}`);\n },\n error: (message: unknown) => {\n function formatMessage(message: unknown, depth: number): string {\n if (depth > 3) {\n return '...';\n }\n\n if (message instanceof Error) {\n return JSON.stringify(\n {\n name: message.name,\n message: message.message,\n stack: message.stack,\n ...(message.cause\n ? {\n cause: formatMessage(message.cause, depth + 1),\n }\n : {}),\n },\n null,\n 2,\n );\n }\n return String(message);\n }\n red(`[ERROR] ${formatMessage(message, 0)}`);\n },\n};\n\nexport class WizardTestEnv {\n taskHandle: ChildProcess;\n\n constructor(\n cmd: string,\n args: string[],\n opts?: {\n cwd?: string;\n debug?: boolean;\n },\n ) {\n this.taskHandle = spawn(cmd, args, { cwd: opts?.cwd, stdio: 'pipe' });\n\n if (opts?.debug) {\n this.taskHandle.stdout?.pipe(process.stdout);\n this.taskHandle.stderr?.pipe(process.stderr);\n }\n }\n\n sendStdin(input: string) {\n this.taskHandle.stdin?.write(input);\n }\n\n /**\n * Sends the input and waits for the output.\n * @returns a promise that resolves when the output was found\n * @throws an error when the output was not found within the timeout\n */\n sendStdinAndWaitForOutput(\n input: string | string[],\n output: string,\n options?: { timeout?: number; optional?: boolean },\n ) {\n const outputPromise = this.waitForOutput(output, options);\n\n if (Array.isArray(input)) {\n for (const i of input) {\n this.sendStdin(i);\n }\n } else {\n this.sendStdin(input);\n }\n return outputPromise;\n }\n\n /**\n * Waits for the task to exit with a given `statusCode`.\n *\n * @returns a promise that resolves to `true` if the run ends with the status\n * code, or it rejects when the `timeout` was reached.\n */\n waitForStatusCode(\n statusCode: number | null,\n options: {\n /** Timeout in ms */\n timeout?: number;\n } = {},\n ) {\n const { timeout } = {\n timeout: 60_000,\n ...options,\n };\n\n return new Promise<boolean>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.kill();\n reject(\n new Error(`Timeout waiting for status code: ${statusCode ?? 'null'}`),\n );\n }, timeout);\n\n this.taskHandle.on('error', (err: Error) => {\n clearTimeout(timeoutId);\n reject(err);\n });\n\n this.taskHandle.on('exit', (code: number | null) => {\n clearTimeout(timeoutId);\n resolve(code === statusCode);\n });\n });\n }\n\n /**\n * Waits for the provided output with `.includes()` logic.\n *\n * @returns a promise that resolves to `true` if the output was found, `false` if the output was not found within the\n * timeout and `optional: true` is set, or it rejects when the timeout was reached with `optional: false`\n */\n waitForOutput(\n output: string,\n options: {\n /** Timeout in ms */\n timeout?: number;\n /** Whether to always resolve after the timeout, no matter whether the input was actually found or not. */\n optional?: boolean;\n } = {},\n ) {\n const { timeout, optional } = {\n timeout: 60_000,\n optional: false,\n ...options,\n };\n\n return new Promise<boolean>((resolve, reject) => {\n let outputBuffer = '';\n const timeoutId = setTimeout(() => {\n this.kill();\n if (optional) {\n // The output is not found but it's optional so we can resolve the promise with false\n resolve(false);\n } else {\n reject(\n new Error(\n `Timeout waiting for output: ${output}. Got the following instead: ${outputBuffer}`,\n ),\n );\n }\n }, timeout);\n\n this.taskHandle.on('error', (err: Error) => {\n clearTimeout(timeoutId);\n reject(err);\n });\n\n this.taskHandle.stdout?.on('data', (data) => {\n outputBuffer += data;\n if (outputBuffer.includes(output)) {\n clearTimeout(timeoutId);\n // The output is found so we can resolve the promise with true\n resolve(true);\n }\n });\n });\n }\n\n kill() {\n this.taskHandle.stdin?.destroy();\n this.taskHandle.stderr?.destroy();\n this.taskHandle.stdout?.destroy();\n this.taskHandle.kill('SIGINT');\n this.taskHandle.unref();\n }\n}\n\n/**\n * Initialize a git repository in the given directory\n * @param projectDir\n */\nexport function initGit(projectDir: string): void {\n try {\n execSync('git init', { cwd: projectDir });\n // Add all files to the git repo\n execSync('git add -A', { cwd: projectDir });\n // Add author info to avoid git commit error\n execSync('git config user.email test@test.sentry.io', { cwd: projectDir });\n execSync('git config user.name Test', { cwd: projectDir });\n execSync('git commit -m init', { cwd: projectDir });\n } catch (e) {\n log.error('Error initializing git');\n log.error(e);\n }\n}\n\n/**\n * Cleanup the git repository in the given directory\n *\n * Caution! Make sure `projectDir` is a test project directory,\n * if in doubt, please commit your local non-test changes first!\n * @param projectDir\n */\nexport function cleanupGit(projectDir: string): void {\n try {\n // Remove the .git directory\n execSync(`rm -rf ${projectDir}/.git`);\n } catch (e) {\n log.error('Error cleaning up git');\n log.error(e);\n }\n}\n\n/**\n * Revert local changes in the given directory\n *\n * Caution! Make sure `projectDir` is a test project directory,\n * if in doubt, please commit your local non-test changes first!\n *\n * @param projectDir\n */\nexport function revertLocalChanges(projectDir: string): void {\n try {\n // Revert tracked files\n execSync('git restore .', { cwd: projectDir });\n // Revert untracked files\n execSync('git clean -fd .', { cwd: projectDir });\n // Remove node_modules and dist (.gitignore'd and therefore not removed via git clean)\n execSync('rm -rf node_modules', { cwd: projectDir });\n execSync('rm -rf dist', { cwd: projectDir });\n } catch (e) {\n log.error('Error reverting local changes');\n log.error(e);\n }\n}\n\n/**\n * Start the wizard instance with the given integration and project directory\n * @param integration\n * @param projectDir\n *\n * @returns WizardTestEnv\n */\nexport function startWizardInstance(\n integration: Integration,\n projectDir: string,\n debug = false,\n): WizardTestEnv {\n const binName = process.env.SENTRY_WIZARD_E2E_TEST_BIN\n ? ['dist-bin', `sentry-wizard-${process.platform}-${process.arch}`]\n : ['dist', 'bin.js'];\n const binPath = path.join(__dirname, '..', '..', ...binName);\n\n revertLocalChanges(projectDir);\n cleanupGit(projectDir);\n initGit(projectDir);\n\n return new WizardTestEnv(\n binPath,\n [\n '--debug',\n '-i',\n integration,\n '--preSelectedProject.authToken',\n TEST_ARGS.AUTH_TOKEN,\n '--preSelectedProject.dsn',\n TEST_ARGS.PROJECT_DSN,\n '--preSelectedProject.orgSlug',\n TEST_ARGS.ORG_SLUG,\n '--preSelectedProject.projectSlug',\n TEST_ARGS.PROJECT_SLUG,\n '--disable-telemetry',\n ],\n { cwd: projectDir, debug },\n );\n}\n\n/**\n * Create a file with the given content\n *\n * @param filePath\n * @param content\n */\nexport function createFile(filePath: string, content?: string) {\n return fs.writeFileSync(filePath, content || '');\n}\n\n/**\n * Modify the file with the new content\n *\n * @param filePath\n * @param oldContent\n * @param newContent\n */\nexport function modifyFile(\n filePath: string,\n replaceMap: Record<string, string>,\n) {\n const fileContent = fs.readFileSync(filePath, 'utf-8');\n let newFileContent = fileContent;\n\n for (const [oldContent, newContent] of Object.entries(replaceMap)) {\n newFileContent = newFileContent.replace(oldContent, newContent);\n }\n\n fs.writeFileSync(filePath, newFileContent);\n}\n\n/**\n * Read the file contents and check if it does not contain the given content\n *\n * @param {string} filePath\n * @param {(string | string[])} content\n */\nexport function checkFileDoesNotContain(\n filePath: string,\n content: string | string[],\n) {\n const fileContent = fs.readFileSync(filePath, 'utf-8');\n const contentArray = Array.isArray(content) ? content : [content];\n\n for (const c of contentArray) {\n expect(fileContent).not.toContain(c);\n }\n}\n\n/**\n * Read the file contents and check if it contains the given content\n *\n * @param {string} filePath\n * @param {(string | string[])} content\n */\nexport function checkFileContents(\n filePath: string,\n content: string | string[],\n) {\n const fileContent = fs.readFileSync(filePath, 'utf-8');\n const contentArray = Array.isArray(content) ? content : [content];\n\n for (const c of contentArray) {\n expect(fileContent).toContain(c);\n }\n}\n\n/**\n * Check if the file exists\n *\n * @param filePath\n */\nexport function checkFileExists(filePath: string) {\n expect(fs.existsSync(filePath)).toBe(true);\n}\n\n/**\n * Check if the package.json contains the given integration\n *\n * @param projectDir\n * @param integration\n */\nexport function checkPackageJson(projectDir: string, integration: Integration) {\n checkFileContents(`${projectDir}/package.json`, `@sentry/${integration}`);\n}\n\n/**\n * Check if the .sentryclirc contains the auth token\n *\n * @param projectDir\n */\nexport function checkSentryCliRc(projectDir: string) {\n checkFileContents(\n `${projectDir}/.sentryclirc`,\n `token=${TEST_ARGS.AUTH_TOKEN}`,\n );\n}\n\n/**\n * Check if the .env.sentry-build-plugin contains the auth token\n * @param projectDir\n */\nexport function checkEnvBuildPlugin(projectDir: string) {\n checkFileContents(\n `${projectDir}/.env.sentry-build-plugin`,\n `SENTRY_AUTH_TOKEN=${TEST_ARGS.AUTH_TOKEN}`,\n );\n}\n\n/**\n * Check if the sentry.properties contains the auth token\n * @param projectDir\n */\nexport function checkSentryProperties(projectDir: string) {\n checkFileContents(\n `${projectDir}/sentry.properties`,\n `auth_token=${TEST_ARGS.AUTH_TOKEN}`,\n );\n}\n\n/**\n * Check if the project builds\n * Check if the project builds and ends with status code 0.\n * @param projectDir\n */\nexport async function checkIfBuilds(projectDir: string) {\n const testEnv = new WizardTestEnv('npm', ['run', 'build'], {\n cwd: projectDir,\n });\n\n const builtSuccessfully = await testEnv.waitForStatusCode(0, {\n timeout: 120_000,\n });\n\n expect(builtSuccessfully).toBe(true);\n}\n\n/**\n * Check if the flutter project builds\n * @param projectDir\n */\nexport async function checkIfFlutterBuilds(\n projectDir: string,\n expectedOutput: string,\n debug = false,\n) {\n const testEnv = new WizardTestEnv('flutter', ['build', 'web'], {\n cwd: projectDir,\n debug: debug,\n });\n\n const outputReceived = await testEnv.waitForOutput(expectedOutput, {\n timeout: 120_000,\n });\n\n expect(outputReceived).toBe(true);\n}\n\n/**\n * Check if the project runs on dev mode\n * @param projectDir\n * @param expectedOutput\n */\nexport async function checkIfRunsOnDevMode(\n projectDir: string,\n expectedOutput: string,\n) {\n const testEnv = new WizardTestEnv('npm', ['run', 'dev'], { cwd: projectDir });\n\n expect(\n await testEnv.waitForOutput(expectedOutput, {\n timeout: 120_000,\n }),\n ).toBe(true);\n\n testEnv.kill();\n}\n\n/**\n * Check if the project runs on prod mode\n * @param projectDir\n * @param expectedOutput\n */\nexport async function checkIfRunsOnProdMode(\n projectDir: string,\n expectedOutput: string,\n startCommand = 'start',\n) {\n const testEnv = new WizardTestEnv('npm', ['run', startCommand], {\n cwd: projectDir,\n });\n\n expect(\n await testEnv.waitForOutput(expectedOutput, {\n timeout: 120_000,\n }),\n ).toBe(true);\n\n testEnv.kill();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../e2e-tests/utils/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { Integration } from '../../lib/Constants';\nimport { spawn, execSync } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport { dim, green, red } from '../../lib/Helper/Logging';\nimport { expect } from 'vitest';\n\nexport const KEYS = {\n UP: '\\u001b[A',\n DOWN: '\\u001b[B',\n LEFT: '\\u001b[D',\n RIGHT: '\\u001b[C',\n ENTER: '\\r',\n SPACE: ' ',\n};\n\nexport const TEST_ARGS = {\n AUTH_TOKEN: process.env.SENTRY_TEST_AUTH_TOKEN || 'TEST_AUTH_TOKEN',\n PROJECT_DSN:\n process.env.SENTRY_TEST_DSN || 'https://public@dsn.ingest.sentry.io/1337',\n ORG_SLUG: process.env.SENTRY_TEST_ORG || 'TEST_ORG_SLUG',\n PROJECT_SLUG: process.env.SENTRY_TEST_PROJECT || 'TEST_PROJECT_SLUG',\n};\n\nexport const log = {\n success: (message: string) => {\n green(`[SUCCESS] ${message}`);\n },\n info: (message: string) => {\n dim(`[INFO] ${message}`);\n },\n error: (message: unknown) => {\n function formatMessage(message: unknown, depth: number): string {\n if (depth > 3) {\n return '...';\n }\n\n if (message instanceof Error) {\n return JSON.stringify(\n {\n name: message.name,\n message: message.message,\n stack: message.stack,\n ...(message.cause\n ? {\n cause: formatMessage(message.cause, depth + 1),\n }\n : {}),\n },\n null,\n 2,\n );\n }\n return String(message);\n }\n red(`[ERROR] ${formatMessage(message, 0)}`);\n },\n};\n\nexport class WizardTestEnv {\n taskHandle: ChildProcess;\n\n constructor(\n cmd: string,\n args: string[],\n opts?: {\n cwd?: string;\n debug?: boolean;\n },\n ) {\n this.taskHandle = spawn(cmd, args, { cwd: opts?.cwd, stdio: 'pipe' });\n\n if (opts?.debug) {\n this.taskHandle.stdout?.pipe(process.stdout);\n this.taskHandle.stderr?.pipe(process.stderr);\n }\n }\n\n sendStdin(input: string) {\n this.taskHandle.stdin?.write(input);\n }\n\n /**\n * Sends the input and waits for the output.\n * @returns a promise that resolves when the output was found\n * @throws an error when the output was not found within the timeout\n */\n sendStdinAndWaitForOutput(\n input: string | string[],\n output: string,\n options?: { timeout?: number; optional?: boolean },\n ) {\n const outputPromise = this.waitForOutput(output, options);\n\n if (Array.isArray(input)) {\n for (const i of input) {\n this.sendStdin(i);\n }\n } else {\n this.sendStdin(input);\n }\n return outputPromise;\n }\n\n /**\n * Waits for the task to exit with a given `statusCode`.\n *\n * @returns a promise that resolves to `true` if the run ends with the status\n * code, or it rejects when the `timeout` was reached.\n */\n waitForStatusCode(\n statusCode: number | null,\n options: {\n /** Timeout in ms */\n timeout?: number;\n } = {},\n ) {\n const { timeout } = {\n timeout: 60_000,\n ...options,\n };\n\n return new Promise<boolean>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.kill();\n reject(\n new Error(`Timeout waiting for status code: ${statusCode ?? 'null'}`),\n );\n }, timeout);\n\n this.taskHandle.on('error', (err: Error) => {\n clearTimeout(timeoutId);\n reject(err);\n });\n\n this.taskHandle.on('exit', (code: number | null) => {\n clearTimeout(timeoutId);\n resolve(code === statusCode);\n });\n });\n }\n\n /**\n * Waits for the provided output with `.includes()` logic.\n *\n * @returns a promise that resolves to `true` if the output was found, `false` if the output was not found within the\n * timeout and `optional: true` is set, or it rejects when the timeout was reached with `optional: false`\n */\n waitForOutput(\n output: string,\n options: {\n /** Timeout in ms */\n timeout?: number;\n /** Whether to always resolve after the timeout, no matter whether the input was actually found or not. */\n optional?: boolean;\n } = {},\n ) {\n const { timeout, optional } = {\n timeout: 60_000,\n optional: false,\n ...options,\n };\n\n return new Promise<boolean>((resolve, reject) => {\n let outputBuffer = '';\n const timeoutId = setTimeout(() => {\n this.taskHandle.off('error', errorListener);\n this.taskHandle.stdout?.off('data', dataListener);\n\n this.kill();\n if (optional) {\n // The output is not found but it's optional so we can resolve the promise with false\n resolve(false);\n } else {\n reject(\n new Error(\n `Timeout waiting for output: ${output}. Got the following instead: ${outputBuffer}`,\n ),\n );\n }\n }, timeout);\n\n const dataListener = (data: string) => {\n outputBuffer += data;\n if (outputBuffer.includes(output)) {\n clearTimeout(timeoutId);\n this.taskHandle.off('error', errorListener);\n this.taskHandle.stdout?.off('data', dataListener);\n // The output is found so we can resolve the promise with true\n resolve(true);\n }\n };\n\n const errorListener = (err: Error) => {\n this.taskHandle.off('error', errorListener);\n this.taskHandle.stdout?.off('data', dataListener);\n clearTimeout(timeoutId);\n reject(err);\n };\n\n this.taskHandle.on('error', errorListener);\n this.taskHandle.stdout?.on('data', dataListener);\n });\n }\n\n kill() {\n this.taskHandle.stdin?.destroy();\n this.taskHandle.stderr?.destroy();\n this.taskHandle.stdout?.destroy();\n this.taskHandle.kill('SIGINT');\n this.taskHandle.unref();\n }\n}\n\n/**\n * Initialize a git repository in the given directory\n * @param projectDir\n */\nexport function initGit(projectDir: string): void {\n try {\n execSync('git init', { cwd: projectDir });\n // Add all files to the git repo\n execSync('git add -A', { cwd: projectDir });\n // Add author info to avoid git commit error\n execSync('git config user.email test@test.sentry.io', { cwd: projectDir });\n execSync('git config user.name Test', { cwd: projectDir });\n execSync('git commit -m init', { cwd: projectDir });\n } catch (e) {\n log.error('Error initializing git');\n log.error(e);\n }\n}\n\n/**\n * Cleanup the git repository in the given directory\n *\n * Caution! Make sure `projectDir` is a test project directory,\n * if in doubt, please commit your local non-test changes first!\n * @param projectDir\n */\nexport function cleanupGit(projectDir: string): void {\n try {\n // Remove the .git directory\n execSync(`rm -rf ${projectDir}/.git`);\n } catch (e) {\n log.error('Error cleaning up git');\n log.error(e);\n }\n}\n\n/**\n * Revert local changes in the given directory\n *\n * Caution! Make sure `projectDir` is a test project directory,\n * if in doubt, please commit your local non-test changes first!\n *\n * @param projectDir\n */\nexport function revertLocalChanges(projectDir: string): void {\n try {\n // Revert tracked files\n execSync('git restore .', { cwd: projectDir });\n // Revert untracked files\n execSync('git clean -fd .', { cwd: projectDir });\n // Remove node_modules and dist (.gitignore'd and therefore not removed via git clean)\n execSync('rm -rf node_modules', { cwd: projectDir });\n execSync('rm -rf dist', { cwd: projectDir });\n } catch (e) {\n log.error('Error reverting local changes');\n log.error(e);\n }\n}\n\n/**\n * Start the wizard instance with the given integration and project directory\n * @param integration\n * @param projectDir\n *\n * @returns WizardTestEnv\n */\nexport function startWizardInstance(\n integration: Integration,\n projectDir: string,\n debug = false,\n): WizardTestEnv {\n const binName = process.env.SENTRY_WIZARD_E2E_TEST_BIN\n ? ['dist-bin', `sentry-wizard-${process.platform}-${process.arch}`]\n : ['dist', 'bin.js'];\n const binPath = path.join(__dirname, '..', '..', ...binName);\n\n revertLocalChanges(projectDir);\n cleanupGit(projectDir);\n initGit(projectDir);\n\n return new WizardTestEnv(\n binPath,\n [\n '--debug',\n '-i',\n integration,\n '--preSelectedProject.authToken',\n TEST_ARGS.AUTH_TOKEN,\n '--preSelectedProject.dsn',\n TEST_ARGS.PROJECT_DSN,\n '--preSelectedProject.orgSlug',\n TEST_ARGS.ORG_SLUG,\n '--preSelectedProject.projectSlug',\n TEST_ARGS.PROJECT_SLUG,\n '--disable-telemetry',\n ],\n { cwd: projectDir, debug },\n );\n}\n\n/**\n * Create a file with the given content\n *\n * @param filePath\n * @param content\n */\nexport function createFile(filePath: string, content?: string) {\n return fs.writeFileSync(filePath, content || '');\n}\n\n/**\n * Modify the file with the new content\n *\n * @param filePath\n * @param oldContent\n * @param newContent\n */\nexport function modifyFile(\n filePath: string,\n replaceMap: Record<string, string>,\n) {\n const fileContent = fs.readFileSync(filePath, 'utf-8');\n let newFileContent = fileContent;\n\n for (const [oldContent, newContent] of Object.entries(replaceMap)) {\n newFileContent = newFileContent.replace(oldContent, newContent);\n }\n\n fs.writeFileSync(filePath, newFileContent);\n}\n\n/**\n * Read the file contents and check if it does not contain the given content\n *\n * @param {string} filePath\n * @param {(string | string[])} content\n */\nexport function checkFileDoesNotContain(\n filePath: string,\n content: string | string[],\n) {\n const fileContent = fs.readFileSync(filePath, 'utf-8');\n const contentArray = Array.isArray(content) ? content : [content];\n\n for (const c of contentArray) {\n expect(fileContent).not.toContain(c);\n }\n}\n\n/**\n * Read the file contents and check if it contains the given content\n *\n * @param {string} filePath\n * @param {(string | string[])} content\n */\nexport function checkFileContents(\n filePath: string,\n content: string | string[],\n) {\n const fileContent = fs.readFileSync(filePath, 'utf-8');\n const contentArray = Array.isArray(content) ? content : [content];\n\n for (const c of contentArray) {\n expect(fileContent).toContain(c);\n }\n}\n\n/**\n * Check if the file exists\n *\n * @param filePath\n */\nexport function checkFileExists(filePath: string) {\n expect(fs.existsSync(filePath)).toBe(true);\n}\n\n/**\n * Check if the package.json contains the given integration\n *\n * @param projectDir\n * @param integration\n */\nexport function checkPackageJson(projectDir: string, integration: Integration) {\n checkFileContents(`${projectDir}/package.json`, `@sentry/${integration}`);\n}\n\n/**\n * Check if the .sentryclirc contains the auth token\n *\n * @param projectDir\n */\nexport function checkSentryCliRc(projectDir: string) {\n checkFileContents(\n `${projectDir}/.sentryclirc`,\n `token=${TEST_ARGS.AUTH_TOKEN}`,\n );\n}\n\n/**\n * Check if the .env.sentry-build-plugin contains the auth token\n * @param projectDir\n */\nexport function checkEnvBuildPlugin(projectDir: string) {\n checkFileContents(\n `${projectDir}/.env.sentry-build-plugin`,\n `SENTRY_AUTH_TOKEN=${TEST_ARGS.AUTH_TOKEN}`,\n );\n}\n\n/**\n * Check if the sentry.properties contains the auth token\n * @param projectDir\n */\nexport function checkSentryProperties(projectDir: string) {\n checkFileContents(\n `${projectDir}/sentry.properties`,\n `auth_token=${TEST_ARGS.AUTH_TOKEN}`,\n );\n}\n\n/**\n * Check if the project builds\n * Check if the project builds and ends with status code 0.\n * @param projectDir\n */\nexport async function checkIfBuilds(projectDir: string) {\n const testEnv = new WizardTestEnv('npm', ['run', 'build'], {\n cwd: projectDir,\n });\n\n const builtSuccessfully = await testEnv.waitForStatusCode(0, {\n timeout: 120_000,\n });\n\n expect(builtSuccessfully).toBe(true);\n}\n\n/**\n * Check if the flutter project builds\n * @param projectDir\n */\nexport async function checkIfFlutterBuilds(\n projectDir: string,\n expectedOutput: string,\n debug = false,\n) {\n const testEnv = new WizardTestEnv('flutter', ['build', 'web'], {\n cwd: projectDir,\n debug: debug,\n });\n\n const outputReceived = await testEnv.waitForOutput(expectedOutput, {\n timeout: 120_000,\n });\n\n expect(outputReceived).toBe(true);\n}\n\n/**\n * Check if the project runs on dev mode\n * @param projectDir\n * @param expectedOutput\n */\nexport async function checkIfRunsOnDevMode(\n projectDir: string,\n expectedOutput: string,\n) {\n const testEnv = new WizardTestEnv('npm', ['run', 'dev'], { cwd: projectDir });\n\n expect(\n await testEnv.waitForOutput(expectedOutput, {\n timeout: 120_000,\n }),\n ).toBe(true);\n\n testEnv.kill();\n}\n\n/**\n * Check if the project runs on prod mode\n * @param projectDir\n * @param expectedOutput\n */\nexport async function checkIfRunsOnProdMode(\n projectDir: string,\n expectedOutput: string,\n startCommand = 'start',\n) {\n const testEnv = new WizardTestEnv('npm', ['run', startCommand], {\n cwd: projectDir,\n });\n\n expect(\n await testEnv.waitForOutput(expectedOutput, {\n timeout: 120_000,\n }),\n ).toBe(true);\n\n testEnv.kill();\n}\n"]}
|
|
@@ -26,16 +26,5 @@ export declare class SentryCli {
|
|
|
26
26
|
*/
|
|
27
27
|
dumpProperties(props: Partial<SentryCliProps>, format?: 'rc' | 'properties'): string;
|
|
28
28
|
dumpConfig(config: Partial<SentryCliConfig>): string;
|
|
29
|
-
/**
|
|
30
|
-
* Creates `.sentryclirc` and `sentry.properties` files with the CLI properties
|
|
31
|
-
* obtained from the user answers (or from logging into Sentry).
|
|
32
|
-
* The `.sentryclirc` only contains the auth token and will be added to the
|
|
33
|
-
* user's `.gitignore` file. The properties file contains the rest of the
|
|
34
|
-
* properties (org, project, etc.).
|
|
35
|
-
*
|
|
36
|
-
* @param sentryCli instance of the Sentry CLI
|
|
37
|
-
* @param cliProps the properties to write to the files
|
|
38
|
-
*/
|
|
39
|
-
createSentryCliConfig(cliProps: SentryCliProps): Promise<void>;
|
|
40
29
|
}
|
|
41
30
|
export {};
|
|
@@ -24,13 +24,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.SentryCli = void 0;
|
|
27
|
-
const fs = __importStar(require("node:fs"));
|
|
28
27
|
const path = __importStar(require("node:path"));
|
|
29
|
-
const Git_1 = require("./Git");
|
|
30
|
-
const Logging_1 = require("./Logging");
|
|
31
|
-
const SENTRYCLIRC_FILENAME = '.sentryclirc';
|
|
32
|
-
const GITIGNORE_FILENAME = '.gitignore';
|
|
33
|
-
const PROPERTIES_FILENAME = 'sentry.properties';
|
|
34
28
|
class SentryCli {
|
|
35
29
|
_argv;
|
|
36
30
|
_resolve = require.resolve;
|
|
@@ -93,52 +87,6 @@ class SentryCli {
|
|
|
93
87
|
}
|
|
94
88
|
return dumpedSections.join('\n');
|
|
95
89
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Creates `.sentryclirc` and `sentry.properties` files with the CLI properties
|
|
98
|
-
* obtained from the user answers (or from logging into Sentry).
|
|
99
|
-
* The `.sentryclirc` only contains the auth token and will be added to the
|
|
100
|
-
* user's `.gitignore` file. The properties file contains the rest of the
|
|
101
|
-
* properties (org, project, etc.).
|
|
102
|
-
*
|
|
103
|
-
* @param sentryCli instance of the Sentry CLI
|
|
104
|
-
* @param cliProps the properties to write to the files
|
|
105
|
-
*/
|
|
106
|
-
async createSentryCliConfig(cliProps) {
|
|
107
|
-
const { 'auth/token': authToken, ...cliPropsToWrite } = cliProps;
|
|
108
|
-
/**
|
|
109
|
-
* To not commit the auth token to the VCS, instead of adding it to the
|
|
110
|
-
* properties file (like the rest of props), it's added to the Sentry CLI
|
|
111
|
-
* config, which is added to the gitignore. This way makes the properties
|
|
112
|
-
* file safe to commit without exposing any auth tokens.
|
|
113
|
-
*/
|
|
114
|
-
if (authToken) {
|
|
115
|
-
try {
|
|
116
|
-
await fs.promises.appendFile(SENTRYCLIRC_FILENAME, this.dumpConfig({ auth: { 'auth/token': authToken } }));
|
|
117
|
-
(0, Logging_1.green)(`✓ Successfully added the auth token to ${SENTRYCLIRC_FILENAME}`);
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
(0, Logging_1.red)(`⚠ Could not add the auth token to ${SENTRYCLIRC_FILENAME}, ` +
|
|
121
|
-
`please add it to identify your user account:\n${authToken}`);
|
|
122
|
-
(0, Logging_1.nl)();
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
(0, Logging_1.red)(`⚠ Did not find an auth token, please add your token to ${SENTRYCLIRC_FILENAME}`);
|
|
127
|
-
(0, Logging_1.l)('To generate an auth token, visit https://sentry.io/settings/account/api/auth-tokens/');
|
|
128
|
-
(0, Logging_1.l)('To learn how to configure Sentry CLI, visit ' +
|
|
129
|
-
'https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-sentry-cli');
|
|
130
|
-
}
|
|
131
|
-
await (0, Git_1.addToGitignore)(SENTRYCLIRC_FILENAME, `⚠ Could not add ${SENTRYCLIRC_FILENAME} to ${GITIGNORE_FILENAME}, please add it to not commit your auth key.`);
|
|
132
|
-
try {
|
|
133
|
-
await fs.promises.writeFile(`./${PROPERTIES_FILENAME}`, this.dumpProperties(cliPropsToWrite));
|
|
134
|
-
(0, Logging_1.green)('✓ Successfully created sentry.properties');
|
|
135
|
-
}
|
|
136
|
-
catch {
|
|
137
|
-
(0, Logging_1.red)(`⚠ Could not add org and project data to ${PROPERTIES_FILENAME}`);
|
|
138
|
-
(0, Logging_1.l)('See docs for a manual setup: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-sentry-cli');
|
|
139
|
-
}
|
|
140
|
-
(0, Logging_1.nl)();
|
|
141
|
-
}
|
|
142
90
|
}
|
|
143
91
|
exports.SentryCli = SentryCli;
|
|
144
92
|
//# sourceMappingURL=SentryCli.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SentryCli.js","sourceRoot":"","sources":["../../../lib/Helper/SentryCli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"SentryCli.js","sourceRoot":"","sources":["../../../lib/Helper/SentryCli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,gDAAkC;AAgBlC,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;CACF;AAxED,8BAwEC","sourcesContent":["import type { Answers } from 'inquirer';\nimport * as path from 'node:path';\n\nimport type { Args } from '../Constants';\nimport { Config } from '../Types';\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"]}
|
|
@@ -132,6 +132,12 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
|
|
|
132
132
|
reject(err);
|
|
133
133
|
return;
|
|
134
134
|
}
|
|
135
|
+
const xcodeSourceScriptPath = path.join(process.cwd(), 'plugins/sentry-cordova/scripts', 'xcode-upload-debug-files.sh');
|
|
136
|
+
if (!fs.existsSync(xcodeSourceScriptPath)) {
|
|
137
|
+
this.debug(`file ${xcodeSourceScriptPath} not found.`);
|
|
138
|
+
reject('This version of wizard requires Sentry Cordova 1.4.2 or higher, please use an older version of sentry wizard or upgrade sentry cordova.');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
135
141
|
const buildScripts = [];
|
|
136
142
|
for (const val of Object.values(proj.hash.project.objects.PBXShellScriptBuildPhase || {})) {
|
|
137
143
|
if (typeof val === 'object' &&
|
|
@@ -139,7 +145,7 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
|
|
|
139
145
|
buildScripts.push(val);
|
|
140
146
|
}
|
|
141
147
|
}
|
|
142
|
-
this._addNewXcodeBuildPhaseForSymbols(buildScripts, proj);
|
|
148
|
+
this._addNewXcodeBuildPhaseForSymbols(buildScripts, proj, xcodeSourceScriptPath);
|
|
143
149
|
this._addNewXcodeBuildPhaseForStripping(buildScripts, proj);
|
|
144
150
|
// we always modify the xcode file in memory but we only want to save it
|
|
145
151
|
// in case the user wants configuration for ios. This is why we check
|
|
@@ -155,43 +161,20 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
|
|
|
155
161
|
});
|
|
156
162
|
});
|
|
157
163
|
}
|
|
158
|
-
_addNewXcodeBuildPhaseForSymbols(buildScripts, proj) {
|
|
164
|
+
_addNewXcodeBuildPhaseForSymbols(buildScripts, proj, xcodeSymbolScriptPath) {
|
|
159
165
|
for (const script of buildScripts) {
|
|
160
166
|
if (typeof script === 'object' &&
|
|
161
167
|
script.shellScript?.match(/SENTRY_PROPERTIES/)) {
|
|
162
168
|
return;
|
|
163
169
|
}
|
|
164
170
|
}
|
|
165
|
-
const
|
|
171
|
+
const script = fs
|
|
172
|
+
.readFileSync(xcodeSymbolScriptPath, 'utf8')
|
|
173
|
+
.replace(/\\/g, '\\\\')
|
|
174
|
+
.replace(/\n/g, '\\n');
|
|
166
175
|
proj.addBuildPhase([], 'PBXShellScriptBuildPhase', 'Upload Debug Symbols to Sentry', null, {
|
|
167
176
|
shellPath: '/bin/sh',
|
|
168
|
-
shellScript:
|
|
169
|
-
// eslint-disable-next-line prefer-template
|
|
170
|
-
'echo "warning: uploading debug symbols - set SENTRY_SKIP_DSYM_UPLOAD=true to skip this"\\n' +
|
|
171
|
-
'if [ -n "$SENTRY_SKIP_DSYM_UPLOAD" ]; then\\n' +
|
|
172
|
-
' echo "warning: skipping debug symbol upload"\\n' +
|
|
173
|
-
' exit 0\\n' +
|
|
174
|
-
'fi\\n' +
|
|
175
|
-
'export SENTRY_PROPERTIES=' +
|
|
176
|
-
cwd +
|
|
177
|
-
'\\n' +
|
|
178
|
-
'function getProperty {\\n' +
|
|
179
|
-
' PROP_KEY=$1\\n' +
|
|
180
|
-
' PROP_VALUE=`cat $SENTRY_PROPERTIES | grep "$PROP_KEY" | cut -d\'=\' -f2`\\n' +
|
|
181
|
-
' if [ -z "$PROP_VALUE" ]; then\\n' +
|
|
182
|
-
' echo "plugins/sentry-cordova/node_modules/@sentry/cli/bin/sentry-cli"\\n' +
|
|
183
|
-
' else\\n' +
|
|
184
|
-
' echo $PROP_VALUE\\n' +
|
|
185
|
-
' fi\\n' +
|
|
186
|
-
'}\\n' +
|
|
187
|
-
'if [ ! -f $SENTRY_PROPERTIES ]; then\\n' +
|
|
188
|
-
' echo "warning: SENTRY: sentry.properties file not found! Skipping symbol upload."\\n' +
|
|
189
|
-
' exit 0\\n' +
|
|
190
|
-
'fi\\n' +
|
|
191
|
-
'echo "# Reading property from $SENTRY_PROPERTIES"\\n' +
|
|
192
|
-
'SENTRY_CLI=$(getProperty "cli.executable")\\n' +
|
|
193
|
-
'SENTRY_COMMAND="../../$SENTRY_CLI upload-dsym"\\n' +
|
|
194
|
-
'$SENTRY_COMMAND',
|
|
177
|
+
shellScript: script,
|
|
195
178
|
});
|
|
196
179
|
}
|
|
197
180
|
_addNewXcodeBuildPhaseForStripping(buildScripts, proj) {
|
|
@@ -1 +1 @@
|
|
|
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: unknown) => {\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: unknown) => {\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"]}
|
|
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: unknown) => {\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: unknown) => {\n if (err) {\n reject(err);\n return;\n }\n\n const xcodeSourceScriptPath = path.join(\n process.cwd(),\n 'plugins/sentry-cordova/scripts',\n 'xcode-upload-debug-files.sh',\n );\n\n if (!fs.existsSync(xcodeSourceScriptPath)) {\n this.debug(`file ${xcodeSourceScriptPath} not found.`);\n reject(\n 'This version of wizard requires Sentry Cordova 1.4.2 or higher, please use an older version of sentry wizard or upgrade sentry cordova.',\n );\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(\n buildScripts,\n proj,\n xcodeSourceScriptPath,\n );\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 xcodeSymbolScriptPath: string,\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\n const script = fs\n .readFileSync(xcodeSymbolScriptPath, 'utf8')\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\n/g, '\\\\n');\n\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n null,\n {\n shellPath: '/bin/sh',\n shellScript: script,\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"]}
|
|
@@ -26,6 +26,8 @@ exports.pluginKts = pluginKts;
|
|
|
26
26
|
const manifest = (dsn) => `
|
|
27
27
|
<!-- Required: set your sentry.io project identifier (DSN) -->
|
|
28
28
|
<meta-data android:name="io.sentry.dsn" android:value="${dsn}" />
|
|
29
|
+
<!-- Add data like request headers, user ip address and device name, see https://docs.sentry.io/platforms/android/data-management/data-collected/ for more info -->
|
|
30
|
+
<meta-data android:name="io.sentry.send-default-pii" android:value="true" />
|
|
29
31
|
|
|
30
32
|
<!-- enable automatic breadcrumbs for user interactions (clicks, swipes, scrolls) -->
|
|
31
33
|
<meta-data android:name="io.sentry.traces.user-interaction.enable" android:value="true" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/android/templates.ts"],"names":[],"mappings":";;;AAAO,MAAM,YAAY,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;;6CAEP,OAAO;;;CAGnD,CAAC;AALW,QAAA,YAAY,gBAKvB;AAEK,MAAM,eAAe,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;;8CAET,OAAO;;;CAGpD,CAAC;AALW,QAAA,eAAe,mBAK1B;AAEK,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;6CACD,OAAO;CACnD,CAAC;AAFW,QAAA,MAAM,UAEjB;AAEK,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;8CACH,OAAO;CACpD,CAAC;AAFW,QAAA,SAAS,aAEpB;AAEK,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC;;6DAEoB,GAAG
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/android/templates.ts"],"names":[],"mappings":";;;AAAO,MAAM,YAAY,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;;6CAEP,OAAO;;;CAGnD,CAAC;AALW,QAAA,YAAY,gBAKvB;AAEK,MAAM,eAAe,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;;8CAET,OAAO;;;CAGpD,CAAC;AALW,QAAA,eAAe,mBAK1B;AAEK,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;6CACD,OAAO;CACnD,CAAC;AAFW,QAAA,MAAM,UAEjB;AAEK,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC;8CACH,OAAO;CACpD,CAAC;AAFW,QAAA,SAAS,aAEpB;AAEK,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC;;6DAEoB,GAAG;;;;;;;;;;;;;CAa/D,CAAC;AAfW,QAAA,QAAQ,YAenB;AAEW,QAAA,YAAY,GAAG,4BAA4B,CAAC;AAE5C,QAAA,cAAc,GAAG,2BAA2B,CAAC;AAE7C,QAAA,gBAAgB,GAAG;;;;;;;;;CAS/B,CAAC;AAEW,QAAA,kBAAkB,GAAG;;;;;;;;;CASjC,CAAC;AAEK,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAE,EAAE,CAAC;;;aAG1D,OAAO;qBACC,WAAW;;;;;;CAM/B,CAAC;AAVW,QAAA,aAAa,iBAUxB;AAEK,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAE,EAAE,CAAC;;;eAG3D,OAAO;uBACC,WAAW;;;;;;CAMjC,CAAC;AAVW,QAAA,gBAAgB,oBAU3B","sourcesContent":["export const pluginsBlock = (version = '3.12.0') => `\nplugins {\n id 'io.sentry.android.gradle' version '${version}'\n}\n\n`;\n\nexport const pluginsBlockKts = (version = '3.12.0') => `\nplugins {\n id(\"io.sentry.android.gradle\") version \"${version}\"\n}\n\n`;\n\nexport const plugin = (version = '3.12.0') => `\n id 'io.sentry.android.gradle' version '${version}'\n`;\n\nexport const pluginKts = (version = '3.12.0') => `\n id(\"io.sentry.android.gradle\") version \"${version}\"\n`;\n\nexport const manifest = (dsn: string) => `\n <!-- Required: set your sentry.io project identifier (DSN) -->\n <meta-data android:name=\"io.sentry.dsn\" android:value=\"${dsn}\" />\n <!-- Add data like request headers, user ip address and device name, see https://docs.sentry.io/platforms/android/data-management/data-collected/ for more info -->\n <meta-data android:name=\"io.sentry.send-default-pii\" android:value=\"true\" />\n\n <!-- enable automatic breadcrumbs for user interactions (clicks, swipes, scrolls) -->\n <meta-data android:name=\"io.sentry.traces.user-interaction.enable\" android:value=\"true\" />\n <!-- enable screenshot for crashes (could contain sensitive/PII data) -->\n <meta-data android:name=\"io.sentry.attach-screenshot\" android:value=\"true\" />\n <!-- enable view hierarchy for crashes -->\n <meta-data android:name=\"io.sentry.attach-view-hierarchy\" android:value=\"true\" />\n\n <!-- enable the performance API by setting a sample-rate, adjust in production env -->\n <meta-data android:name=\"io.sentry.traces.sample-rate\" android:value=\"1.0\" />\n`;\n\nexport const sentryImport = `import io.sentry.Sentry;\\n`;\n\nexport const sentryImportKt = `import io.sentry.Sentry\\n`;\n\nexport const testErrorSnippet = `\n // waiting for view to draw to better represent a captured error with a screenshot\n findViewById(android.R.id.content).getViewTreeObserver().addOnGlobalLayoutListener(() -> {\n try {\n throw new Exception(\"This app uses Sentry! :)\");\n } catch (Exception e) {\n Sentry.captureException(e);\n }\n });\n`;\n\nexport const testErrorSnippetKt = `\n // waiting for view to draw to better represent a captured error with a screenshot\n findViewById<android.view.View>(android.R.id.content).viewTreeObserver.addOnGlobalLayoutListener {\n try {\n throw Exception(\"This app uses Sentry! :)\")\n } catch (e: Exception) {\n Sentry.captureException(e)\n }\n }\n`;\n\nexport const sourceContext = (orgSlug: string, projectSlug: string) => `\n\nsentry {\n org = \"${orgSlug}\"\n projectName = \"${projectSlug}\"\n\n // this will upload your source code to Sentry to show it as part of the stack traces\n // disable if you don't want to expose your sources\n includeSourceContext = true\n}\n`;\n\nexport const sourceContextKts = (orgSlug: string, projectSlug: string) => `\n\nsentry {\n org.set(\"${orgSlug}\")\n projectName.set(\"${projectSlug}\")\n\n // this will upload your source code to Sentry to show it as part of the stack traces\n // disable if you don't want to expose your sources\n includeSourceContext.set(true)\n}\n`;\n"]}
|
|
@@ -127,7 +127,7 @@ Apologies for the inconvenience!`);
|
|
|
127
127
|
},
|
|
128
128
|
]);
|
|
129
129
|
await (0, telemetry_1.traceStep)('Initialize Sentry on Angular application entry point', async () => {
|
|
130
|
-
await (0, sdk_setup_1.
|
|
130
|
+
await (0, sdk_setup_1.initializeSentryOnApplicationEntry)(dsn, selectedFeatures);
|
|
131
131
|
});
|
|
132
132
|
await (0, telemetry_1.traceStep)('Update Angular project configuration', async () => {
|
|
133
133
|
await (0, sdk_setup_2.updateAppConfig)(installedMinVersion, selectedFeatures.performance);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-wizard.js","sourceRoot":"","sources":["../../../src/angular/angular-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\n\nimport chalk from 'chalk';\nimport type { WizardOptions } from '../utils/types';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abortIfCancelled,\n askShouldCreateExampleComponent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n printWelcome,\n runPrettierIfInstalled,\n abort,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { gte, minVersion, SemVer } from 'semver';\n\nimport * as Sentry from '@sentry/node';\nimport { initalizeSentryOnApplicationEntry } from './sdk-setup';\nimport { updateAppConfig } from './sdk-setup';\nimport { runSourcemapsWizard } from '../sourcemaps/sourcemaps-wizard';\nimport { addSourcemapEntryToAngularJSON } from './codemods/sourcemaps';\nimport { createExampleComponent } from './example-component';\n\nconst MIN_SUPPORTED_ANGULAR_VERSION = '14.0.0';\nconst MIN_SUPPORTED_WIZARD_ANGULAR_VERSION = '17.0.0';\n\nexport async function runAngularWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'angular',\n wizardOptions: options,\n },\n () => runAngularWizardWithTelemetry(options),\n );\n}\n\nasync function runAngularWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Angular Wizard',\n promoCode: options.promoCode,\n telemetryEnabled: options.telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, '@angular/core', 'Angular');\n\n let installedAngularVersion = getPackageVersion('@angular/core', packageJson);\n\n if (!installedAngularVersion) {\n clack.log.warn('Could not determine installed Angular version.');\n\n installedAngularVersion = await abortIfCancelled(\n clack.text({\n message: `Please enter your installed Angular major version (e.g. ${chalk.cyan(\n '18',\n )} for Angular 18)`,\n validate(value) {\n if (!value) {\n return 'Angular version is required';\n }\n\n try {\n if (!minVersion(value)) {\n return `Invalid Angular version provided: ${value}`;\n }\n } catch (error) {\n return `Invalid Angular version provided: ${value}`;\n }\n },\n }),\n );\n }\n\n Sentry.setTag('angular-version', installedAngularVersion);\n\n const installedMinVersion = minVersion(installedAngularVersion) as SemVer;\n\n const sdkSupportsAngularVersion = gte(\n installedMinVersion,\n MIN_SUPPORTED_ANGULAR_VERSION,\n );\n\n const wizardSupportsAngularVersion = gte(\n installedMinVersion,\n MIN_SUPPORTED_WIZARD_ANGULAR_VERSION,\n );\n\n if (!sdkSupportsAngularVersion) {\n Sentry.setTag('angular-version-compatible', false);\n\n clack.log.warn(\n `Angular version ${chalk.cyan(\n MIN_SUPPORTED_ANGULAR_VERSION,\n )} or higher is required for the Sentry SDK.`,\n );\n clack.log.warn(\n `Please refer to Sentry's version compatibility table for more information:\n\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/angular/#angular-version-compatibility',\n)}\n`,\n );\n\n return abort('Exiting the wizard.', 0);\n }\n\n if (!wizardSupportsAngularVersion) {\n Sentry.setTag('angular-wizard-version-compatible', false);\n\n clack.log.warn(\n `The Sentry Angular Wizard requires Angular version ${chalk.cyan(\n MIN_SUPPORTED_WIZARD_ANGULAR_VERSION,\n )} or higher.`,\n );\n clack.log.warn(\n `Your Angular version (${installedAngularVersion}) is compatible with the Sentry SDK but you need to set it up manually by following our documentation:\n\n${chalk.underline('https://docs.sentry.io/platforms/javascript/guides/angular')}\n\nApologies for the inconvenience!`,\n );\n\n return abort('Exiting the wizard.', 0);\n }\n\n const { selectedProject, authToken, sentryUrl, selfHosted } =\n await getOrAskForProjectData(options, 'javascript-angular');\n\n const dsn = selectedProject.keys[0].dsn.public;\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/angular',\n packageJson,\n );\n\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n await installPackage({\n packageName: '@sentry/angular',\n packageNameDisplayLabel: '@sentry/angular',\n alreadyInstalled: sdkAlreadyInstalled,\n });\n\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Sentry Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n await traceStep(\n 'Initialize Sentry on Angular application entry point',\n async () => {\n await initalizeSentryOnApplicationEntry(dsn, selectedFeatures);\n },\n );\n\n await traceStep('Update Angular project configuration', async () => {\n await updateAppConfig(installedMinVersion, selectedFeatures.performance);\n });\n\n await traceStep('Setup for sourcemap uploads', async () => {\n await addSourcemapEntryToAngularJSON();\n\n if (!options.preSelectedProject) {\n options.preSelectedProject = {\n authToken,\n selfHosted,\n project: {\n organization: {\n id: selectedProject.organization.id,\n name: selectedProject.organization.name,\n slug: selectedProject.organization.slug,\n },\n id: selectedProject.id,\n slug: selectedProject.slug,\n keys: [\n {\n dsn: {\n public: dsn,\n },\n },\n ],\n },\n };\n\n options.url = sentryUrl;\n }\n\n await runSourcemapsWizard(options, 'angular');\n });\n\n const shouldCreateExampleComponent = await askShouldCreateExampleComponent();\n\n Sentry.setTag('create-example-component', shouldCreateExampleComponent);\n\n if (shouldCreateExampleComponent) {\n await traceStep(\n 'create-example-component',\n async () =>\n await createExampleComponent({\n url: sentryUrl,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n }),\n );\n }\n\n await traceStep('Run Prettier', async () => {\n await runPrettierIfInstalled({ cwd: undefined });\n });\n\n clack.outro(buildOutroMessage(shouldCreateExampleComponent));\n}\n\nexport function buildOutroMessage(createdExampleComponent: boolean): string {\n let msg = chalk.green('\\nSuccessfully installed the Sentry Angular SDK!');\n\n if (createdExampleComponent) {\n msg += `\\n\\nYou can validate your setup by starting your dev environment (${chalk.cyan(\n 'ng serve',\n )}) and throwing an error in the example component.`;\n }\n\n msg += `\\n\\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/javascript/guides/angular/`;\n\n return msg;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"angular-wizard.js","sourceRoot":"","sources":["../../../src/angular/angular-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\n\nimport chalk from 'chalk';\nimport type { WizardOptions } from '../utils/types';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abortIfCancelled,\n askShouldCreateExampleComponent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n printWelcome,\n runPrettierIfInstalled,\n abort,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { gte, minVersion, SemVer } from 'semver';\n\nimport * as Sentry from '@sentry/node';\nimport { initializeSentryOnApplicationEntry } from './sdk-setup';\nimport { updateAppConfig } from './sdk-setup';\nimport { runSourcemapsWizard } from '../sourcemaps/sourcemaps-wizard';\nimport { addSourcemapEntryToAngularJSON } from './codemods/sourcemaps';\nimport { createExampleComponent } from './example-component';\n\nconst MIN_SUPPORTED_ANGULAR_VERSION = '14.0.0';\nconst MIN_SUPPORTED_WIZARD_ANGULAR_VERSION = '17.0.0';\n\nexport async function runAngularWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'angular',\n wizardOptions: options,\n },\n () => runAngularWizardWithTelemetry(options),\n );\n}\n\nasync function runAngularWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Angular Wizard',\n promoCode: options.promoCode,\n telemetryEnabled: options.telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, '@angular/core', 'Angular');\n\n let installedAngularVersion = getPackageVersion('@angular/core', packageJson);\n\n if (!installedAngularVersion) {\n clack.log.warn('Could not determine installed Angular version.');\n\n installedAngularVersion = await abortIfCancelled(\n clack.text({\n message: `Please enter your installed Angular major version (e.g. ${chalk.cyan(\n '18',\n )} for Angular 18)`,\n validate(value) {\n if (!value) {\n return 'Angular version is required';\n }\n\n try {\n if (!minVersion(value)) {\n return `Invalid Angular version provided: ${value}`;\n }\n } catch (error) {\n return `Invalid Angular version provided: ${value}`;\n }\n },\n }),\n );\n }\n\n Sentry.setTag('angular-version', installedAngularVersion);\n\n const installedMinVersion = minVersion(installedAngularVersion) as SemVer;\n\n const sdkSupportsAngularVersion = gte(\n installedMinVersion,\n MIN_SUPPORTED_ANGULAR_VERSION,\n );\n\n const wizardSupportsAngularVersion = gte(\n installedMinVersion,\n MIN_SUPPORTED_WIZARD_ANGULAR_VERSION,\n );\n\n if (!sdkSupportsAngularVersion) {\n Sentry.setTag('angular-version-compatible', false);\n\n clack.log.warn(\n `Angular version ${chalk.cyan(\n MIN_SUPPORTED_ANGULAR_VERSION,\n )} or higher is required for the Sentry SDK.`,\n );\n clack.log.warn(\n `Please refer to Sentry's version compatibility table for more information:\n\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/angular/#angular-version-compatibility',\n)}\n`,\n );\n\n return abort('Exiting the wizard.', 0);\n }\n\n if (!wizardSupportsAngularVersion) {\n Sentry.setTag('angular-wizard-version-compatible', false);\n\n clack.log.warn(\n `The Sentry Angular Wizard requires Angular version ${chalk.cyan(\n MIN_SUPPORTED_WIZARD_ANGULAR_VERSION,\n )} or higher.`,\n );\n clack.log.warn(\n `Your Angular version (${installedAngularVersion}) is compatible with the Sentry SDK but you need to set it up manually by following our documentation:\n\n${chalk.underline('https://docs.sentry.io/platforms/javascript/guides/angular')}\n\nApologies for the inconvenience!`,\n );\n\n return abort('Exiting the wizard.', 0);\n }\n\n const { selectedProject, authToken, sentryUrl, selfHosted } =\n await getOrAskForProjectData(options, 'javascript-angular');\n\n const dsn = selectedProject.keys[0].dsn.public;\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/angular',\n packageJson,\n );\n\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n await installPackage({\n packageName: '@sentry/angular',\n packageNameDisplayLabel: '@sentry/angular',\n alreadyInstalled: sdkAlreadyInstalled,\n });\n\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Sentry Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n await traceStep(\n 'Initialize Sentry on Angular application entry point',\n async () => {\n await initializeSentryOnApplicationEntry(dsn, selectedFeatures);\n },\n );\n\n await traceStep('Update Angular project configuration', async () => {\n await updateAppConfig(installedMinVersion, selectedFeatures.performance);\n });\n\n await traceStep('Setup for sourcemap uploads', async () => {\n await addSourcemapEntryToAngularJSON();\n\n if (!options.preSelectedProject) {\n options.preSelectedProject = {\n authToken,\n selfHosted,\n project: {\n organization: {\n id: selectedProject.organization.id,\n name: selectedProject.organization.name,\n slug: selectedProject.organization.slug,\n },\n id: selectedProject.id,\n slug: selectedProject.slug,\n keys: [\n {\n dsn: {\n public: dsn,\n },\n },\n ],\n },\n };\n\n options.url = sentryUrl;\n }\n\n await runSourcemapsWizard(options, 'angular');\n });\n\n const shouldCreateExampleComponent = await askShouldCreateExampleComponent();\n\n Sentry.setTag('create-example-component', shouldCreateExampleComponent);\n\n if (shouldCreateExampleComponent) {\n await traceStep(\n 'create-example-component',\n async () =>\n await createExampleComponent({\n url: sentryUrl,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n }),\n );\n }\n\n await traceStep('Run Prettier', async () => {\n await runPrettierIfInstalled({ cwd: undefined });\n });\n\n clack.outro(buildOutroMessage(shouldCreateExampleComponent));\n}\n\nexport function buildOutroMessage(createdExampleComponent: boolean): string {\n let msg = chalk.green('\\nSuccessfully installed the Sentry Angular SDK!');\n\n if (createdExampleComponent) {\n msg += `\\n\\nYou can validate your setup by starting your dev environment (${chalk.cyan(\n 'ng serve',\n )}) and throwing an error in the example component.`;\n }\n\n msg += `\\n\\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/javascript/guides/angular/`;\n\n return msg;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SemVer } from 'semver';
|
|
2
|
-
export declare function
|
|
2
|
+
export declare function initializeSentryOnApplicationEntry(dsn: string, selectedFeatures: {
|
|
3
3
|
performance: boolean;
|
|
4
4
|
replay: boolean;
|
|
5
5
|
}): Promise<void>;
|
|
@@ -27,7 +27,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
28
28
|
};
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.updateAppConfig = exports.
|
|
30
|
+
exports.updateAppConfig = exports.initializeSentryOnApplicationEntry = void 0;
|
|
31
31
|
// @ts-expect-error - magicast is ESM and TS complains about that. It works though
|
|
32
32
|
const magicast_1 = require("magicast");
|
|
33
33
|
const fs = __importStar(require("fs"));
|
|
@@ -39,7 +39,7 @@ const app_config_1 = require("./codemods/app-config");
|
|
|
39
39
|
const main_1 = require("./codemods/main");
|
|
40
40
|
const ast_utils_1 = require("../utils/ast-utils");
|
|
41
41
|
const Sentry = __importStar(require("@sentry/node"));
|
|
42
|
-
async function
|
|
42
|
+
async function initializeSentryOnApplicationEntry(dsn, selectedFeatures) {
|
|
43
43
|
const appEntryFilename = 'main.ts';
|
|
44
44
|
const appEntryPath = path.join(process.cwd(), 'src', appEntryFilename);
|
|
45
45
|
const originalAppEntry = await (0, magicast_1.loadFile)(appEntryPath);
|
|
@@ -60,7 +60,7 @@ ${chalk_1.default.underline('https://docs.sentry.io/platforms/javascript/guides/
|
|
|
60
60
|
}
|
|
61
61
|
prompts_1.default.log.success(`Successfully initialized Sentry on ${chalk_1.default.cyan(appEntryFilename)}`);
|
|
62
62
|
}
|
|
63
|
-
exports.
|
|
63
|
+
exports.initializeSentryOnApplicationEntry = initializeSentryOnApplicationEntry;
|
|
64
64
|
async function updateAppConfig(angularVersion, isTracingEnabled) {
|
|
65
65
|
const appConfigFilename = 'app.config.ts';
|
|
66
66
|
const appConfigPath = path.join(process.cwd(), 'src', 'app', appConfigFilename);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/angular/sdk-setup.ts"],"names":[],"mappings":";AAAA,4DAA4D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE5D,kFAAkF;AAClF,uCAA+C;AAE/C,uCAAyB;AACzB,2CAA6B;AAE7B,+EAA+E;AAC/E,6DAAmC;AACnC,kDAA0B;AAC1B,sDAA2D;AAC3D,0CAAoD;AACpD,kDAAsD;AACtD,qDAAuC;AAKhC,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/angular/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { loadFile, writeFile } from 'magicast';\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport { updateAppConfigMod } from './codemods/app-config';\nimport { updateAppEntryMod } from './codemods/main';\nimport { hasSentryContent } from '../utils/ast-utils';\nimport * as Sentry from '@sentry/node';\n\nimport type { namedTypes as t } from 'ast-types';\nimport type { SemVer } from 'semver';\n\nexport async function initializeSentryOnApplicationEntry(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n): Promise<void> {\n const appEntryFilename = 'main.ts';\n const appEntryPath = path.join(process.cwd(), 'src', appEntryFilename);\n\n const originalAppEntry = await loadFile(appEntryPath);\n\n if (hasSentryContent(originalAppEntry.$ast as t.Program)) {\n clack.log.warn(\n `File ${chalk.cyan(appEntryFilename)} already contains Sentry.\nSkipping adding Sentry functionality to ${chalk.cyan(appEntryFilename)}.`,\n );\n\n return;\n }\n\n const updatedAppEntryMod = updateAppEntryMod(\n originalAppEntry,\n dsn,\n selectedFeatures,\n );\n\n try {\n await writeFile(updatedAppEntryMod.$ast, appEntryPath);\n } catch (error: unknown) {\n clack.log.error(\n `Error while adding Sentry to ${chalk.cyan(appEntryFilename)}`,\n );\n\n clack.log.warn(\n `Please refer to the documentation for manual setup:\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/angular/#configure',\n)}`,\n );\n\n return;\n }\n\n clack.log.success(\n `Successfully initialized Sentry on ${chalk.cyan(appEntryFilename)}`,\n );\n}\n\nexport async function updateAppConfig(\n angularVersion: SemVer,\n isTracingEnabled: boolean,\n): Promise<void> {\n const appConfigFilename = 'app.config.ts';\n const appConfigPath = path.join(\n process.cwd(),\n 'src',\n 'app',\n appConfigFilename,\n );\n\n if (!fs.existsSync(appConfigPath)) {\n Sentry.setTag('angular-app-config-found', false);\n\n clack.log.warn(\n `File ${chalk.cyan(\n appConfigFilename,\n )} not found. Skipping adding Sentry functionality.`,\n );\n\n clack.log.warn(`Please refer to the documentation for manual setup:\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/angular/#configure',\n)}`);\n\n return;\n }\n\n Sentry.setTag('angular-app-config-found', true);\n\n const appConfig = await loadFile(appConfigPath);\n\n if (hasSentryContent(appConfig.$ast as t.Program)) {\n clack.log.warn(\n `File ${chalk.cyan(appConfigFilename)} already contains Sentry.\n Skipping adding Sentry functionality to ${chalk.cyan(appConfigFilename)}.`,\n );\n\n return;\n }\n\n try {\n const updatedAppConfigMod = updateAppConfigMod(\n appConfig,\n angularVersion,\n isTracingEnabled,\n );\n\n await writeFile(updatedAppConfigMod.$ast, appConfigPath);\n } catch (error: unknown) {\n clack.log.error(\n `Error while updating your app config ${chalk.cyan(appConfigFilename)}.`,\n );\n\n clack.log.info(\n chalk.dim(\n typeof error === 'object' && error != null && 'toString' in error\n ? error.toString()\n : typeof error === 'string'\n ? error\n : '',\n ),\n );\n\n clack.log.warn(`Please refer to the documentation for manual setup:\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/angular/#configure',\n)}`);\n\n return;\n }\n\n clack.log.success(\n `Successfully updated your app config ${chalk.cyan(appConfigFilename)}`,\n );\n}\n"]}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
declare function isAppDelegateFile(filePath: string): boolean;
|
|
2
|
-
declare function
|
|
3
|
-
|
|
2
|
+
declare function findAppDidFinishLaunchingWithOptionsInDirectory(dir: string): string | null;
|
|
3
|
+
declare function findAppDidFinishLaunchingWithOptions(files: string[]): string | null;
|
|
4
|
+
export declare function addCodeSnippetToProject(files: string[], dsn: string): boolean;
|
|
4
5
|
/**
|
|
5
6
|
* Exported for testing purposes, but should not be used in other modules.
|
|
6
7
|
*/
|
|
7
8
|
export declare let exportForTesting: {
|
|
8
9
|
isAppDelegateFile: typeof isAppDelegateFile;
|
|
10
|
+
findAppDidFinishLaunchingWithOptionsInDirectory: typeof findAppDidFinishLaunchingWithOptionsInDirectory;
|
|
9
11
|
findAppDidFinishLaunchingWithOptions: typeof findAppDidFinishLaunchingWithOptions;
|
|
10
12
|
};
|
|
11
13
|
export {};
|