@sentry/wizard 4.8.0 → 4.9.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 +8 -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/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.js +14 -4
- 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 -1
- package/dist/src/react-native/metro.js +30 -4
- package/dist/src/react-native/metro.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.d.ts +4 -0
- package/dist/src/react-native/react-native-wizard.js +32 -4
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-native/xcode.js +24 -9
- 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/sveltekit/sveltekit-wizard.js +1 -3
- package/dist/src/sveltekit/sveltekit-wizard.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/javascript.test.js +119 -0
- package/dist/test/react-native/javascript.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xcode-manager.test.js","sourceRoot":"","sources":["../../../test/apple/xcode-manager.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type {\n PBXFileReference,\n PBXGroup,\n PBXNativeTarget,\n PBXProject,\n PBXShellScriptBuildPhase,\n XCBuildConfiguration,\n} from 'xcode';\nimport { getRunScriptTemplate } from '../../src/apple/templates';\nimport { XcodeProject } from '../../src/apple/xcode-manager';\nimport type { SentryProjectData } from '../../src/utils/types';\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\n\nvi.mock('node:fs', async () => ({\n __esModule: true,\n ...(await vi.importActual<typeof fs>('node:fs')),\n}));\n\nvi.mock('@clack/prompts', () => ({\n log: {\n info: vi.fn(),\n success: vi.fn(),\n step: vi.fn(),\n },\n}));\n\nconst appleProjectsPath = path.resolve(\n __dirname,\n '../../fixtures/test-applications/apple',\n);\nconst damagedProjectPath = path.join(\n appleProjectsPath,\n 'damaged-missing-configuration-list/Project.xcodeproj/project.pbxproj',\n);\nconst noTargetsProjectPath = path.join(\n appleProjectsPath,\n 'no-targets/Project.xcodeproj/project.pbxproj',\n);\nconst singleTargetProjectPath = path.join(\n appleProjectsPath,\n 'spm-swiftui-single-target/Project.xcodeproj/project.pbxproj',\n);\nconst multiTargetProjectPath = path.join(\n appleProjectsPath,\n 'spm-swiftui-multi-targets/Project.xcodeproj/project.pbxproj',\n);\nconst projectData: SentryProjectData = {\n id: '1234567890',\n slug: 'project',\n organization: {\n id: '1234567890',\n name: 'Sentry',\n slug: 'sentry',\n },\n keys: [{ dsn: { public: 'https://sentry.io/1234567890' } }],\n};\n\ndescribe('XcodeManager', () => {\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n describe('XcodeProject', () => {\n describe('getAllTargets', () => {\n describe('single target', () => {\n it('should return all targets', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n\n // -- Act --\n const targets = xcodeProject.getAllTargets();\n\n // -- Assert --\n expect(targets).toEqual(['Project']);\n });\n });\n\n describe('multiple targets', () => {\n it('should return all targets', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(multiTargetProjectPath);\n\n // -- Act --\n const targets = xcodeProject.getAllTargets();\n\n // -- Assert --\n expect(targets).toEqual(['Project1', 'Project2']);\n });\n });\n\n describe('no targets', () => {\n it('should return an empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(noTargetsProjectPath);\n\n // -- Act --\n const targets = xcodeProject.getAllTargets();\n\n // -- Assert --\n expect(targets).toEqual([]);\n });\n });\n\n describe('project with missing configuration list', () => {\n it('should return an empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(damagedProjectPath);\n\n // -- Act --\n const targets = xcodeProject.getAllTargets();\n\n // -- Assert --\n expect(targets).toEqual([]);\n });\n });\n });\n\n describe('updateXcodeProject', () => {\n let sourceProjectPath: string;\n let tempProjectPath: string;\n let xcodeProject: XcodeProject;\n\n beforeEach(() => {\n const tempDir = fs.mkdtempSync(\n path.join(os.tmpdir(), 'update-xcode-project'),\n );\n\n sourceProjectPath = singleTargetProjectPath;\n tempProjectPath = path.resolve(tempDir, 'project.pbxproj');\n\n fs.copyFileSync(sourceProjectPath, tempProjectPath);\n xcodeProject = new XcodeProject(tempProjectPath);\n });\n\n describe('upload symbols script', () => {\n const scriptVariants: {\n uploadSource: boolean;\n includeHomebrewPath: boolean;\n }[] = [\n {\n uploadSource: true,\n includeHomebrewPath: true,\n },\n {\n uploadSource: true,\n includeHomebrewPath: false,\n },\n {\n uploadSource: false,\n includeHomebrewPath: true,\n },\n {\n uploadSource: false,\n includeHomebrewPath: false,\n },\n ];\n\n for (const variant of scriptVariants) {\n describe(`upload source = ${variant.uploadSource?.toString()} and include homebrew path = ${variant.includeHomebrewPath.toString()}`, () => {\n beforeEach(() => {\n vi.spyOn(fs, 'existsSync').mockReturnValue(\n variant.includeHomebrewPath,\n );\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n it('should add the upload symbols script to the target', () => {\n // -- Arrange --\n const generatedShellScript = getRunScriptTemplate(\n projectData.organization.slug,\n projectData.slug,\n variant.uploadSource,\n variant.includeHomebrewPath,\n );\n const expectedShellScript = `\"${generatedShellScript.replace(\n /\"/g,\n '\\\\\"',\n )}\"`;\n\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n false, // Ignore SPM reference\n variant.uploadSource,\n );\n\n // -- Assert --\n const updatedXcodeProject = new XcodeProject(tempProjectPath);\n\n // Expect the upload symbols script to be added\n const scriptObjects =\n updatedXcodeProject.objects.PBXShellScriptBuildPhase;\n expect(scriptObjects).toBeDefined();\n if (!scriptObjects) {\n throw new Error('Script objects not found');\n }\n const scriptKeys = Object.keys(scriptObjects);\n expect(scriptKeys).toHaveLength(2);\n\n // Find the script ID\n const scriptId = scriptKeys.find(\n (key) => !key.endsWith('_comment'),\n );\n expect(scriptId).toBeDefined();\n if (!scriptId) {\n throw new Error('Script ID not found');\n }\n expect(scriptId).toMatch(/^[A-F0-9]{24}$/i);\n\n // Expect the script to be added\n const script = scriptObjects[\n scriptId\n ] as PBXShellScriptBuildPhase;\n expect(script).toBeDefined();\n expect(typeof script).not.toBe('string');\n expect(script.inputPaths).toEqual([\n '\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}\"',\n ]);\n expect(script.outputPaths).toEqual([]);\n expect(script.shellPath).toBe('/bin/sh');\n expect(script.shellScript).toEqual(expectedShellScript);\n\n const commentKey = `${scriptId}_comment`;\n expect(scriptKeys).toContain(commentKey);\n expect(scriptObjects[commentKey]).toBe(\n 'Upload Debug Symbols to Sentry',\n );\n });\n });\n }\n });\n\n describe('debug information format and sandbox', () => {\n describe('upload source is false', () => {\n it('should not update the Xcode project', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n false, // Ignore SPM reference\n false,\n );\n\n // -- Assert --\n const expectedXcodeProject = new XcodeProject(sourceProjectPath);\n expect(xcodeProject.objects.XCBuildConfiguration).toEqual(\n expectedXcodeProject.objects.XCBuildConfiguration,\n );\n });\n });\n\n describe('upload source is true', () => {\n const uploadSource = true;\n\n describe('named target not found', () => {\n it('should not update the flags in the Xcode project', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Invalid Target Name',\n false, // Ignore SPM reference\n uploadSource,\n );\n\n // -- Assert --\n const originalXcodeProject = new XcodeProject(sourceProjectPath);\n expect(xcodeProject.objects.XCBuildConfiguration).toEqual(\n originalXcodeProject.objects.XCBuildConfiguration,\n );\n });\n });\n\n describe('named target found', () => {\n describe('build configurations is undefined', () => {\n it('should not update the Xcode project', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Invalid Target Name',\n false, // Ignore SPM reference\n uploadSource,\n );\n\n // -- Assert --\n const originalXcodeProject = new XcodeProject(\n sourceProjectPath,\n );\n expect(xcodeProject.objects.XCBuildConfiguration).toEqual(\n originalXcodeProject.objects.XCBuildConfiguration,\n );\n });\n });\n\n describe('no build configurations found', () => {\n it('should not update the Xcode project', () => {\n // -- Arrange --\n xcodeProject.objects.XCBuildConfiguration = {};\n\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Invalid Target Name',\n false, // Ignore SPM reference\n uploadSource,\n );\n\n // -- Assert --\n expect(xcodeProject.objects.XCBuildConfiguration).toEqual({});\n });\n });\n\n describe('build configurations found', () => {\n const debugProjectBuildConfigurationListId =\n 'D4E604DA2D50CEEE00CAB00F';\n const releaseProjectBuildConfigurationListId =\n 'D4E604DB2D50CEEE00CAB00F';\n const debugTargetBuildConfigurationListId =\n 'D4E604DD2D50CEEE00CAB00F';\n const releaseTargetBuildConfigurationListId =\n 'D4E604DE2D50CEEE00CAB00F';\n\n it('should update the target configuration lists', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n false, // Ignore SPM reference\n uploadSource,\n );\n\n // -- Assert --\n expect(xcodeProject.objects.XCBuildConfiguration).toBeDefined();\n // Both Debug and Release are configured equally\n const expectedConfigKeys = [\n debugTargetBuildConfigurationListId, // Debug\n releaseTargetBuildConfigurationListId, // Release\n ];\n for (const key of expectedConfigKeys) {\n const buildConfiguration = xcodeProject.objects\n .XCBuildConfiguration?.[key] as XCBuildConfiguration;\n expect(buildConfiguration).toBeDefined();\n expect(typeof buildConfiguration).not.toBe('string');\n const buildSettings = buildConfiguration.buildSettings ?? {};\n expect(buildSettings.DEBUG_INFORMATION_FORMAT).toBe(\n '\"dwarf-with-dsym\"',\n );\n expect(buildSettings.ENABLE_USER_SCRIPT_SANDBOXING).toBe(\n '\"NO\"',\n );\n }\n });\n\n it('should not update the project configuration lists', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n false, // Ignore SPM reference\n uploadSource,\n );\n\n // -- Assert --\n expect(xcodeProject.objects.XCBuildConfiguration).toBeDefined();\n\n // Check project build configurations 'Debug'\n const debugBuildConfiguration = xcodeProject.objects\n .XCBuildConfiguration?.[\n debugProjectBuildConfigurationListId\n ] as XCBuildConfiguration;\n expect(debugBuildConfiguration).toBeDefined();\n expect(typeof debugBuildConfiguration).not.toBe('string');\n expect(\n debugBuildConfiguration.buildSettings\n ?.DEBUG_INFORMATION_FORMAT,\n ).toBe('dwarf');\n expect(\n debugBuildConfiguration.buildSettings\n ?.ENABLE_USER_SCRIPT_SANDBOXING,\n ).toBe('YES');\n\n // Check project build configurations 'Release'\n const releaseBuildConfiguration = xcodeProject.objects\n .XCBuildConfiguration?.[\n releaseProjectBuildConfigurationListId\n ] as XCBuildConfiguration;\n expect(releaseBuildConfiguration).toBeDefined();\n expect(typeof releaseBuildConfiguration).not.toBe('string');\n expect(\n releaseBuildConfiguration.buildSettings\n ?.DEBUG_INFORMATION_FORMAT,\n ).toBe('\"dwarf-with-dsym\"');\n expect(\n releaseBuildConfiguration.buildSettings\n ?.ENABLE_USER_SCRIPT_SANDBOXING,\n ).toBe('YES');\n });\n });\n });\n });\n });\n\n describe('add SPM reference', () => {\n const addSPMReference = true;\n\n describe('framework build phase already contains Sentry', () => {\n it('should not update the Xcode project', () => {\n // -- Arrange --\n xcodeProject.objects.PBXFrameworksBuildPhase = {\n 'framework-id': {\n isa: 'PBXFrameworksBuildPhase',\n files: [\n {\n value: '123',\n comment: 'Sentry in Frameworks',\n },\n ],\n },\n };\n\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n addSPMReference,\n );\n\n // -- Assert --\n const expectedXcodeProject = new XcodeProject(sourceProjectPath);\n expectedXcodeProject.objects.PBXFrameworksBuildPhase = {\n 'framework-id': {\n isa: 'PBXFrameworksBuildPhase',\n files: [\n {\n value: '123',\n comment: 'Sentry in Frameworks',\n },\n ],\n },\n };\n expect(xcodeProject.objects.PBXFrameworksBuildPhase).toEqual(\n expectedXcodeProject.objects.PBXFrameworksBuildPhase,\n );\n expect(xcodeProject.objects.XCRemoteSwiftPackageReference).toEqual(\n expectedXcodeProject.objects.XCRemoteSwiftPackageReference,\n );\n expect(\n xcodeProject.objects.XCSwiftPackageProductDependency,\n ).toEqual(\n expectedXcodeProject.objects.XCSwiftPackageProductDependency,\n );\n });\n });\n\n it('should add the SPM reference to the target', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n addSPMReference,\n );\n\n // -- Assert --\n // Get the target\n const target = xcodeProject.objects.PBXNativeTarget?.[\n 'D4E604CC2D50CEEC00CAB00F'\n ] as PBXNativeTarget;\n expect(target).toBeDefined();\n if (!target) {\n throw new Error('Target is undefined');\n }\n\n // Check the SPM dependency is added to the target\n expect(target.packageProductDependencies).toEqual([\n expect.objectContaining({\n value: expect.any(String) as string,\n comment: 'Sentry',\n }),\n ]);\n\n // Check the SPM package reference object is added to the project\n const remoteSwiftPackageReferences =\n xcodeProject.objects.XCRemoteSwiftPackageReference;\n expect(remoteSwiftPackageReferences).toBeDefined();\n if (!remoteSwiftPackageReferences) {\n throw new Error('XCRemoteSwiftPackageReference is undefined');\n }\n const rspRefKeys = Object.keys(remoteSwiftPackageReferences);\n expect(rspRefKeys).toHaveLength(2);\n // First key is expected to be the UUID of the SPM package reference\n expect(rspRefKeys[0]).toMatch(/^[A-F0-9]{24}$/i);\n // Second key is expected to be the UUID of the SPM package reference with _comment suffix\n expect(rspRefKeys[1]).toMatch(/^[A-F0-9]{24}_comment$/i);\n\n expect(remoteSwiftPackageReferences?.[rspRefKeys[0]]).toEqual({\n isa: 'XCRemoteSwiftPackageReference',\n repositoryURL: '\"https://github.com/getsentry/sentry-cocoa/\"',\n requirement: {\n kind: 'upToNextMajorVersion',\n minimumVersion: '8.0.0',\n },\n });\n expect(remoteSwiftPackageReferences?.[rspRefKeys[1]]).toBe(\n 'XCRemoteSwiftPackageReference \"sentry-cocoa\"',\n );\n\n // Check the SPM package is a dependency of the target\n const packageProductDependencies =\n xcodeProject.objects.XCSwiftPackageProductDependency;\n expect(packageProductDependencies).toBeDefined();\n if (!packageProductDependencies) {\n throw new Error('XCSwiftPackageProductDependency is undefined');\n }\n const ppDepKeys = Object.keys(packageProductDependencies);\n expect(ppDepKeys).toHaveLength(2);\n // First key is expected to be the UUID of the SPM package dependency\n expect(ppDepKeys[0]).toMatch(/^[A-F0-9]{24}$/i);\n // Second key is expected to be the UUID of the SPM package dependency with _comment suffix\n expect(ppDepKeys[1]).toMatch(/^[A-F0-9]{24}_comment$/i);\n expect(packageProductDependencies?.[ppDepKeys[0]]).toEqual({\n isa: 'XCSwiftPackageProductDependency',\n package: rspRefKeys[0],\n package_comment: 'XCRemoteSwiftPackageReference \"sentry-cocoa\"',\n productName: 'Sentry',\n });\n });\n });\n });\n });\n\n describe('filesForTarget', () => {\n describe('targets are undefined', () => {\n it('should return undefined', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = undefined;\n\n // -- Act --\n const files = xcodeProject.filesForTarget('Project');\n\n // -- Assert --\n expect(files).toBeUndefined();\n });\n });\n\n describe('target not found', () => {\n it('should return undefined', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n\n // -- Act --\n const files = xcodeProject.filesForTarget('NonExistentTarget');\n\n // -- Assert --\n expect(files).toBeUndefined();\n });\n });\n\n describe('target build phases are undefined', () => {\n it('should return undefined', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n Project: {\n isa: 'PBXNativeTarget',\n name: 'Project',\n buildPhases: undefined,\n },\n };\n\n // -- Act --\n const files = xcodeProject.filesForTarget('Project');\n\n // -- Assert --\n expect(files).toBeUndefined();\n });\n });\n\n describe('build phases are undefined', () => {\n it('should return undefined', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n Project: {\n isa: 'PBXNativeTarget',\n name: 'Project',\n buildPhases: undefined,\n },\n };\n xcodeProject.objects.PBXSourcesBuildPhase = undefined;\n\n // -- Act --\n const files = xcodeProject.filesForTarget('Project');\n\n // -- Assert --\n expect(files).toBeUndefined();\n });\n });\n\n describe('referenced build phase is undefined', () => {\n it('should return undefined', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n Project: {\n isa: 'PBXNativeTarget',\n name: 'Project',\n buildPhases: [\n {\n value: 'random-build-phase',\n },\n ],\n },\n };\n\n // -- Act --\n const files = xcodeProject.filesForTarget('Project');\n\n // -- Assert --\n expect(files).toBeUndefined();\n });\n });\n\n describe('build phase files are undefined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n Project: {\n isa: 'PBXNativeTarget',\n name: 'Project',\n buildPhases: [\n {\n value: 'build-phase-key',\n },\n ],\n },\n };\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': {\n isa: 'PBXSourcesBuildPhase',\n files: undefined,\n },\n };\n\n // -- Act --\n const files = xcodeProject.filesForTarget('Project');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase has no files', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n\n // -- Act --\n const files = xcodeProject.filesForTarget('Project');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase with files', () => {\n let xcodeProject: XcodeProject;\n\n beforeEach(() => {\n xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n 'some-target': {\n isa: 'PBXNativeTarget',\n name: 'some-target',\n buildPhases: [\n {\n value: 'build-phase-key',\n },\n ],\n },\n };\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': {\n isa: 'PBXSourcesBuildPhase',\n files: [\n {\n value: 'file-key',\n },\n ],\n },\n };\n xcodeProject.objects.PBXBuildFile = {\n 'file-key': {\n isa: 'PBXBuildFile',\n fileRef: 'file-ref-key',\n },\n };\n xcodeProject.files = [\n {\n key: 'file-ref-key',\n path: 'file-path',\n },\n ];\n });\n\n describe('build file objects are not defined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n xcodeProject.objects.PBXBuildFile = undefined;\n\n // -- Act --\n const files = xcodeProject.filesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build file object is not found', () => {\n it('should return empty array', () => {\n // -- Arrange --\n xcodeProject.objects.PBXBuildFile = {};\n\n // -- Act --\n const files = xcodeProject.filesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build file object exists', () => {\n describe('file reference is undefined', () => {\n it('should ignore the file', () => {\n // -- Arrange --\n xcodeProject.files = [];\n\n // -- Act --\n const files = xcodeProject.filesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n it('should return array of file paths', () => {\n // -- Act --\n const files = xcodeProject.filesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([\n path.join(\n appleProjectsPath,\n 'spm-swiftui-single-target',\n 'file-path',\n ),\n ]);\n });\n });\n });\n });\n\n describe('projectFiles', () => {\n describe('no groups in project', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXGroup = undefined;\n\n // -- Act --\n const files = xcodeProject.projectFiles();\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('main group not found', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const project = xcodeProject.objects.PBXProject?.[\n 'D4E604C52D50CEEC00CAB00F'\n ] as PBXProject;\n if (project) {\n delete project.mainGroup;\n }\n\n // -- Act --\n const files = xcodeProject.projectFiles();\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('main group found', () => {\n it('should return array of file paths', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n\n // -- Act --\n const files = xcodeProject.projectFiles();\n\n // -- Assert --\n expect(files).toEqual([\n {\n key: 'D4E604CD2D50CEEC00CAB00F',\n path: 'Project.app',\n },\n ]);\n });\n\n it('should cache the result', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n\n // Smoke test\n expect(xcodeProject.files).toBeUndefined();\n\n // -- Act --\n const files = xcodeProject.projectFiles();\n\n // -- Assert --\n expect(xcodeProject.files).toBeDefined();\n expect(xcodeProject.files).toEqual(files);\n });\n });\n });\n\n describe('buildGroup', () => {\n describe('group has undefined children', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const group: PBXGroup = {\n isa: 'PBXGroup',\n children: undefined,\n path: '',\n };\n\n // -- Act --\n const files = xcodeProject.buildGroup(group);\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('group has no children', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const group: PBXGroup = {\n isa: 'PBXGroup',\n };\n\n // -- Act --\n const files = xcodeProject.buildGroup(group);\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('group child is file reference', () => {\n const group: PBXGroup = {\n isa: 'PBXGroup',\n children: [\n {\n value: 'D4E604CD2D50CEEC00CAB00F',\n },\n ],\n path: '',\n };\n\n describe('file references are undefined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXFileReference = undefined;\n\n // -- Act --\n const files = xcodeProject.buildGroup(group);\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('file reference is string', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const group: PBXGroup = {\n isa: 'PBXGroup',\n children: [\n {\n value: 'D4E604CD2D50CEEC00CAB00F_comment',\n },\n ],\n path: '',\n };\n\n // -- Act --\n const files = xcodeProject.buildGroup(group);\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('file reference is valid', () => {\n it('should return array of escaped paths', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXFileReference = {\n D4E604CD2D50CEEC00CAB00F: {\n isa: 'PBXFileReference',\n path: '\"some/path/to/file.swift\"',\n sourceTree: 'SOURCE_ROOT',\n },\n };\n const group: PBXGroup = {\n isa: 'PBXGroup',\n children: [\n {\n value: 'D4E604CD2D50CEEC00CAB00F',\n },\n ],\n path: '',\n };\n\n // -- Act --\n const files = xcodeProject.buildGroup(group);\n\n // -- Assert --\n expect(files).toEqual([\n {\n key: 'D4E604CD2D50CEEC00CAB00F',\n path: 'some/path/to/file.swift',\n },\n ]);\n });\n });\n });\n\n describe('group child is group reference', () => {\n const group: PBXGroup = {\n isa: 'PBXGroup',\n children: [\n {\n value: 'D4E604C42D50CEEC00CAB00F',\n },\n ],\n path: '',\n };\n\n describe('groups are undefined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXGroup = undefined;\n\n // -- Act --\n const files = xcodeProject.buildGroup(group);\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('group reference is string', () => {\n it('should return array of file paths', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const group: PBXGroup = {\n isa: 'PBXGroup',\n children: [\n {\n value: 'D4E604CE2D50CEEC00CAB00F_comment',\n },\n ],\n path: '',\n };\n\n // -- Act --\n const files = xcodeProject.buildGroup(group);\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('group reference is valid', () => {\n it('should return array of file paths', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n\n // -- Act --\n const files = xcodeProject.buildGroup(group);\n\n // -- Assert --\n expect(files).toEqual([\n {\n key: 'D4E604CD2D50CEEC00CAB00F',\n path: 'Project.app',\n },\n ]);\n });\n });\n\n describe('group reference has path', () => {\n it('should append the path to the file paths', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const group: PBXGroup = {\n isa: 'PBXGroup',\n children: [\n {\n value: 'sub-group',\n },\n ],\n path: '\"some/path/to/group\"',\n };\n const subgroup: PBXGroup = {\n isa: 'PBXGroup',\n children: [\n {\n value: 'file-at-path',\n },\n ],\n };\n const file: PBXFileReference = {\n isa: 'PBXFileReference',\n path: '\"some/file/at/path.swift\"',\n sourceTree: '<group>',\n };\n xcodeProject.objects.PBXGroup = {\n 'main-group': group,\n 'sub-group': subgroup,\n };\n xcodeProject.objects.PBXFileReference = {\n 'file-at-path': file,\n };\n\n // -- Act --\n const files = xcodeProject.buildGroup(group);\n\n // -- Assert --\n expect(files).toEqual([\n {\n key: 'file-at-path',\n path: 'some/file/at/path.swift',\n },\n ]);\n });\n });\n });\n\n describe('group child is not a file reference or group', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXGroup = {};\n xcodeProject.objects.PBXFileReference = {};\n const group: PBXGroup = {\n isa: 'PBXGroup',\n children: [\n {\n value: 'random-key',\n },\n ],\n path: '',\n };\n\n // -- Act --\n const files = xcodeProject.buildGroup(group);\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"xcode-manager.test.js","sourceRoot":"","sources":["../../../test/apple/xcode-manager.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport process from 'node:process';\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nimport type {\n PBXNativeTarget,\n PBXShellScriptBuildPhase,\n XCBuildConfiguration,\n} from 'xcode';\nimport { getRunScriptTemplate } from '../../src/apple/templates';\nimport { XcodeProject } from '../../src/apple/xcode-manager';\nimport type { SentryProjectData } from '../../src/utils/types';\n\nvi.mock('node:fs', async () => ({\n __esModule: true,\n ...(await vi.importActual<typeof fs>('node:fs')),\n}));\n\nvi.mock('@clack/prompts', () => ({\n log: {\n info: vi.fn(),\n success: vi.fn(),\n step: vi.fn(),\n },\n}));\n\nconst appleProjectsPath = path.resolve(\n __dirname,\n '../../fixtures/test-applications/apple',\n);\nconst damagedProjectPath = path.join(\n appleProjectsPath,\n 'damaged-missing-configuration-list/Project.xcodeproj/project.pbxproj',\n);\nconst noTargetsProjectPath = path.join(\n appleProjectsPath,\n 'no-targets/Project.xcodeproj/project.pbxproj',\n);\nconst noFilesInTargetProjectPath = path.join(\n appleProjectsPath,\n 'no-files-in-target/Project.xcodeproj/project.pbxproj',\n);\nconst projectWithSynchronizedFolders = path.join(\n appleProjectsPath,\n 'project-with-synchronized-folders/Project.xcodeproj/project.pbxproj',\n);\nconst singleTargetProjectPath = path.join(\n appleProjectsPath,\n 'spm-swiftui-single-target/Project.xcodeproj/project.pbxproj',\n);\nconst multiTargetProjectPath = path.join(\n appleProjectsPath,\n 'spm-swiftui-multi-targets/Project.xcodeproj/project.pbxproj',\n);\nconst projectData: SentryProjectData = {\n id: '1234567890',\n slug: 'project',\n organization: {\n id: '1234567890',\n name: 'Sentry',\n slug: 'sentry',\n },\n keys: [{ dsn: { public: 'https://sentry.io/1234567890' } }],\n};\n\ndescribe('XcodeManager', () => {\n beforeEach(() => {\n if (process.platform !== 'darwin') {\n // The macOS system helpers are only available on macOS\n // As the test suite is also run on non-macOS platforms, we need to mock the system helpers\n\n // The path to the Xcode.app can be different on different machines, so we allow overwriting it using environment variables\n vi.mock('../../src/apple/macos-system-helper', () => ({\n MacOSSystemHelpers: {\n findSDKRootDirectoryPath: vi.fn(\n () =>\n '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk',\n ),\n findDeveloperDirectoryPath: vi.fn(\n () => '/Applications/Xcode.app/Contents/Developer',\n ),\n readXcodeBuildSettings: vi.fn(() => ({\n CONFIGURATION_BUILD_DIR: path.join(\n appleProjectsPath,\n 'project-with-synchronized-folders/build/Release-unknown',\n ),\n })),\n },\n }));\n }\n });\n\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n describe('XcodeProject', () => {\n describe('getAllTargets', () => {\n describe('single target', () => {\n it('should return all targets', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n\n // -- Act --\n const targets = xcodeProject.getAllTargets();\n\n // -- Assert --\n expect(targets).toEqual(['Project']);\n });\n });\n\n describe('multiple targets', () => {\n it('should return all targets', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(multiTargetProjectPath);\n\n // -- Act --\n const targets = xcodeProject.getAllTargets();\n\n // -- Assert --\n expect(targets).toEqual(['Project1', 'Project2']);\n });\n });\n\n describe('no targets', () => {\n it('should return an empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(noTargetsProjectPath);\n\n // -- Act --\n const targets = xcodeProject.getAllTargets();\n\n // -- Assert --\n expect(targets).toEqual([]);\n });\n });\n\n describe('project with missing configuration list', () => {\n it('should return an empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(damagedProjectPath);\n\n // -- Act --\n const targets = xcodeProject.getAllTargets();\n\n // -- Assert --\n expect(targets).toEqual([]);\n });\n });\n });\n\n describe('updateXcodeProject', () => {\n let sourceProjectPath: string;\n let tempProjectPath: string;\n let xcodeProject: XcodeProject;\n\n beforeEach(() => {\n const tempDir = fs.mkdtempSync(\n path.join(os.tmpdir(), 'update-xcode-project'),\n );\n\n sourceProjectPath = singleTargetProjectPath;\n tempProjectPath = path.resolve(tempDir, 'project.pbxproj');\n\n fs.copyFileSync(sourceProjectPath, tempProjectPath);\n xcodeProject = new XcodeProject(tempProjectPath);\n });\n\n describe('upload symbols script', () => {\n const scriptVariants: {\n uploadSource: boolean;\n includeHomebrewPath: boolean;\n }[] = [\n {\n uploadSource: true,\n includeHomebrewPath: true,\n },\n {\n uploadSource: true,\n includeHomebrewPath: false,\n },\n {\n uploadSource: false,\n includeHomebrewPath: true,\n },\n {\n uploadSource: false,\n includeHomebrewPath: false,\n },\n ];\n\n for (const variant of scriptVariants) {\n describe(`upload source = ${variant.uploadSource?.toString()} and include homebrew path = ${variant.includeHomebrewPath.toString()}`, () => {\n beforeEach(() => {\n vi.spyOn(fs, 'existsSync').mockReturnValue(\n variant.includeHomebrewPath,\n );\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n it('should add the upload symbols script to the target', () => {\n // -- Arrange --\n const generatedShellScript = getRunScriptTemplate(\n projectData.organization.slug,\n projectData.slug,\n variant.uploadSource,\n variant.includeHomebrewPath,\n );\n const expectedShellScript = `\"${generatedShellScript.replace(\n /\"/g,\n '\\\\\"',\n )}\"`;\n\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n false, // Ignore SPM reference\n variant.uploadSource,\n );\n\n // -- Assert --\n const updatedXcodeProject = new XcodeProject(tempProjectPath);\n\n // Expect the upload symbols script to be added\n const scriptObjects =\n updatedXcodeProject.objects.PBXShellScriptBuildPhase;\n expect(scriptObjects).toBeDefined();\n if (!scriptObjects) {\n throw new Error('Script objects not found');\n }\n const scriptKeys = Object.keys(scriptObjects);\n expect(scriptKeys).toHaveLength(2);\n\n // Find the script ID\n const scriptId = scriptKeys.find(\n (key) => !key.endsWith('_comment'),\n );\n expect(scriptId).toBeDefined();\n if (!scriptId) {\n throw new Error('Script ID not found');\n }\n expect(scriptId).toMatch(/^[A-F0-9]{24}$/i);\n\n // Expect the script to be added\n const script = scriptObjects[\n scriptId\n ] as PBXShellScriptBuildPhase;\n expect(script).toBeDefined();\n expect(typeof script).not.toBe('string');\n expect(script.inputPaths).toEqual([\n '\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}\"',\n ]);\n expect(script.outputPaths).toEqual([]);\n expect(script.shellPath).toBe('/bin/sh');\n expect(script.shellScript).toEqual(expectedShellScript);\n\n const commentKey = `${scriptId}_comment`;\n expect(scriptKeys).toContain(commentKey);\n expect(scriptObjects[commentKey]).toBe(\n 'Upload Debug Symbols to Sentry',\n );\n });\n });\n }\n });\n\n describe('debug information format and sandbox', () => {\n describe('upload source is false', () => {\n it('should not update the Xcode project', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n false, // Ignore SPM reference\n false,\n );\n\n // -- Assert --\n const expectedXcodeProject = new XcodeProject(sourceProjectPath);\n expect(xcodeProject.objects.XCBuildConfiguration).toEqual(\n expectedXcodeProject.objects.XCBuildConfiguration,\n );\n });\n });\n\n describe('upload source is true', () => {\n const uploadSource = true;\n\n describe('named target not found', () => {\n it('should not update the flags in the Xcode project', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Invalid Target Name',\n false, // Ignore SPM reference\n uploadSource,\n );\n\n // -- Assert --\n const originalXcodeProject = new XcodeProject(sourceProjectPath);\n expect(xcodeProject.objects.XCBuildConfiguration).toEqual(\n originalXcodeProject.objects.XCBuildConfiguration,\n );\n });\n });\n\n describe('named target found', () => {\n describe('build configurations is undefined', () => {\n it('should not update the Xcode project', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Invalid Target Name',\n false, // Ignore SPM reference\n uploadSource,\n );\n\n // -- Assert --\n const originalXcodeProject = new XcodeProject(\n sourceProjectPath,\n );\n expect(xcodeProject.objects.XCBuildConfiguration).toEqual(\n originalXcodeProject.objects.XCBuildConfiguration,\n );\n });\n });\n\n describe('no build configurations found', () => {\n it('should not update the Xcode project', () => {\n // -- Arrange --\n xcodeProject.objects.XCBuildConfiguration = {};\n\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Invalid Target Name',\n false, // Ignore SPM reference\n uploadSource,\n );\n\n // -- Assert --\n expect(xcodeProject.objects.XCBuildConfiguration).toEqual({});\n });\n });\n\n describe('build configurations found', () => {\n const debugProjectBuildConfigurationListId =\n 'D4E604DA2D50CEEE00CAB00F';\n const releaseProjectBuildConfigurationListId =\n 'D4E604DB2D50CEEE00CAB00F';\n const debugTargetBuildConfigurationListId =\n 'D4E604DD2D50CEEE00CAB00F';\n const releaseTargetBuildConfigurationListId =\n 'D4E604DE2D50CEEE00CAB00F';\n\n it('should update the target configuration lists', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n false, // Ignore SPM reference\n uploadSource,\n );\n\n // -- Assert --\n expect(xcodeProject.objects.XCBuildConfiguration).toBeDefined();\n // Both Debug and Release are configured equally\n const expectedConfigKeys = [\n debugTargetBuildConfigurationListId, // Debug\n releaseTargetBuildConfigurationListId, // Release\n ];\n for (const key of expectedConfigKeys) {\n const buildConfiguration = xcodeProject.objects\n .XCBuildConfiguration?.[key] as XCBuildConfiguration;\n expect(buildConfiguration).toBeDefined();\n expect(typeof buildConfiguration).not.toBe('string');\n const buildSettings = buildConfiguration.buildSettings ?? {};\n expect(buildSettings.DEBUG_INFORMATION_FORMAT).toBe(\n '\"dwarf-with-dsym\"',\n );\n expect(buildSettings.ENABLE_USER_SCRIPT_SANDBOXING).toBe(\n '\"NO\"',\n );\n }\n });\n\n it('should not update the project configuration lists', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n false, // Ignore SPM reference\n uploadSource,\n );\n\n // -- Assert --\n expect(xcodeProject.objects.XCBuildConfiguration).toBeDefined();\n\n // Check project build configurations 'Debug'\n const debugBuildConfiguration = xcodeProject.objects\n .XCBuildConfiguration?.[\n debugProjectBuildConfigurationListId\n ] as XCBuildConfiguration;\n expect(debugBuildConfiguration).toBeDefined();\n expect(typeof debugBuildConfiguration).not.toBe('string');\n expect(\n debugBuildConfiguration.buildSettings\n ?.DEBUG_INFORMATION_FORMAT,\n ).toBe('dwarf');\n expect(\n debugBuildConfiguration.buildSettings\n ?.ENABLE_USER_SCRIPT_SANDBOXING,\n ).toBe('YES');\n\n // Check project build configurations 'Release'\n const releaseBuildConfiguration = xcodeProject.objects\n .XCBuildConfiguration?.[\n releaseProjectBuildConfigurationListId\n ] as XCBuildConfiguration;\n expect(releaseBuildConfiguration).toBeDefined();\n expect(typeof releaseBuildConfiguration).not.toBe('string');\n expect(\n releaseBuildConfiguration.buildSettings\n ?.DEBUG_INFORMATION_FORMAT,\n ).toBe('\"dwarf-with-dsym\"');\n expect(\n releaseBuildConfiguration.buildSettings\n ?.ENABLE_USER_SCRIPT_SANDBOXING,\n ).toBe('YES');\n });\n });\n });\n });\n });\n\n describe('add SPM reference', () => {\n const addSPMReference = true;\n\n describe('framework build phase already contains Sentry', () => {\n it('should not update the Xcode project', () => {\n // -- Arrange --\n xcodeProject.objects.PBXFrameworksBuildPhase = {\n 'framework-id': {\n isa: 'PBXFrameworksBuildPhase',\n files: [\n {\n value: '123',\n comment: 'Sentry in Frameworks',\n },\n ],\n },\n };\n\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n addSPMReference,\n );\n\n // -- Assert --\n const expectedXcodeProject = new XcodeProject(sourceProjectPath);\n expectedXcodeProject.objects.PBXFrameworksBuildPhase = {\n 'framework-id': {\n isa: 'PBXFrameworksBuildPhase',\n files: [\n {\n value: '123',\n comment: 'Sentry in Frameworks',\n },\n ],\n },\n };\n expect(xcodeProject.objects.PBXFrameworksBuildPhase).toEqual(\n expectedXcodeProject.objects.PBXFrameworksBuildPhase,\n );\n expect(xcodeProject.objects.XCRemoteSwiftPackageReference).toEqual(\n expectedXcodeProject.objects.XCRemoteSwiftPackageReference,\n );\n expect(\n xcodeProject.objects.XCSwiftPackageProductDependency,\n ).toEqual(\n expectedXcodeProject.objects.XCSwiftPackageProductDependency,\n );\n });\n });\n\n it('should add the SPM reference to the target', () => {\n // -- Act --\n xcodeProject.updateXcodeProject(\n projectData,\n 'Project',\n addSPMReference,\n );\n\n // -- Assert --\n // Get the target\n const target = xcodeProject.objects.PBXNativeTarget?.[\n 'D4E604CC2D50CEEC00CAB00F'\n ] as PBXNativeTarget;\n expect(target).toBeDefined();\n if (!target) {\n throw new Error('Target is undefined');\n }\n\n // Check the SPM dependency is added to the target\n expect(target.packageProductDependencies).toEqual([\n expect.objectContaining({\n value: expect.any(String) as string,\n comment: 'Sentry',\n }),\n ]);\n\n // Check the SPM package reference object is added to the project\n const remoteSwiftPackageReferences =\n xcodeProject.objects.XCRemoteSwiftPackageReference;\n expect(remoteSwiftPackageReferences).toBeDefined();\n if (!remoteSwiftPackageReferences) {\n throw new Error('XCRemoteSwiftPackageReference is undefined');\n }\n const rspRefKeys = Object.keys(remoteSwiftPackageReferences);\n expect(rspRefKeys).toHaveLength(2);\n // First key is expected to be the UUID of the SPM package reference\n expect(rspRefKeys[0]).toMatch(/^[A-F0-9]{24}$/i);\n // Second key is expected to be the UUID of the SPM package reference with _comment suffix\n expect(rspRefKeys[1]).toMatch(/^[A-F0-9]{24}_comment$/i);\n\n expect(remoteSwiftPackageReferences?.[rspRefKeys[0]]).toEqual({\n isa: 'XCRemoteSwiftPackageReference',\n repositoryURL: '\"https://github.com/getsentry/sentry-cocoa/\"',\n requirement: {\n kind: 'upToNextMajorVersion',\n minimumVersion: '8.0.0',\n },\n });\n expect(remoteSwiftPackageReferences?.[rspRefKeys[1]]).toBe(\n 'XCRemoteSwiftPackageReference \"sentry-cocoa\"',\n );\n\n // Check the SPM package is a dependency of the target\n const packageProductDependencies =\n xcodeProject.objects.XCSwiftPackageProductDependency;\n expect(packageProductDependencies).toBeDefined();\n if (!packageProductDependencies) {\n throw new Error('XCSwiftPackageProductDependency is undefined');\n }\n const ppDepKeys = Object.keys(packageProductDependencies);\n expect(ppDepKeys).toHaveLength(2);\n // First key is expected to be the UUID of the SPM package dependency\n expect(ppDepKeys[0]).toMatch(/^[A-F0-9]{24}$/i);\n // Second key is expected to be the UUID of the SPM package dependency with _comment suffix\n expect(ppDepKeys[1]).toMatch(/^[A-F0-9]{24}_comment$/i);\n expect(packageProductDependencies?.[ppDepKeys[0]]).toEqual({\n isa: 'XCSwiftPackageProductDependency',\n package: rspRefKeys[0],\n package_comment: 'XCRemoteSwiftPackageReference \"sentry-cocoa\"',\n productName: 'Sentry',\n });\n });\n });\n });\n\n describe('getSourceFilesForTarget', () => {\n describe('targets are undefined', () => {\n it('should return undefined', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = undefined;\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('Project');\n\n // -- Assert --\n expect(files).toBeUndefined();\n });\n });\n\n describe('target not found', () => {\n it('should return undefined', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n\n // -- Act --\n const files =\n xcodeProject.getSourceFilesForTarget('NonExistentTarget');\n\n // -- Assert --\n expect(files).toBeUndefined();\n });\n });\n\n describe('target build phases are undefined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n Project: {\n isa: 'PBXNativeTarget',\n name: 'Project',\n buildPhases: undefined,\n },\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('Project');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phases are undefined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n Project: {\n isa: 'PBXNativeTarget',\n name: 'Project',\n buildPhases: undefined,\n },\n };\n xcodeProject.objects.PBXSourcesBuildPhase = undefined;\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('Project');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('referenced build phase is undefined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n Project: {\n isa: 'PBXNativeTarget',\n name: 'Project',\n buildPhases: [\n {\n value: 'random-build-phase',\n },\n ],\n },\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('Project');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase files are undefined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n Project: {\n isa: 'PBXNativeTarget',\n name: 'Project',\n buildPhases: [\n {\n value: 'build-phase-key',\n },\n ],\n },\n };\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': {\n isa: 'PBXSourcesBuildPhase',\n files: undefined,\n },\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('Project');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase has no files', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(noFilesInTargetProjectPath);\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('Project');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase with files', () => {\n let xcodeProject: XcodeProject;\n\n beforeEach(() => {\n xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n 'some-target': {\n isa: 'PBXNativeTarget',\n name: 'some-target',\n buildPhases: [\n {\n value: 'build-phase-key',\n },\n ],\n },\n };\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': {\n isa: 'PBXSourcesBuildPhase',\n files: [\n {\n value: 'file-key',\n },\n ],\n },\n };\n xcodeProject.objects.PBXBuildFile = {\n 'file-key': {\n isa: 'PBXBuildFile',\n fileRef: 'file-ref-key',\n },\n };\n });\n\n describe('build file objects are not defined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n xcodeProject.objects.PBXBuildFile = undefined;\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build file object is not found', () => {\n it('should return empty array', () => {\n // -- Arrange --\n xcodeProject.objects.PBXBuildFile = {};\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build file object is invalid', () => {\n it('should return empty array', () => {\n // -- Arrange --\n xcodeProject.objects.PBXBuildFile = {\n 'file-key': 'invalid-object',\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('file reference is missing', () => {\n it('should return empty array', () => {\n // -- Arrange --\n xcodeProject.objects.PBXBuildFile = {\n 'file-key': {\n isa: 'PBXBuildFile',\n },\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('file reference is invalid', () => {\n it('should return empty array', () => {\n // -- Arrange --\n xcodeProject.objects.PBXFileReference = {\n 'file-ref-key': 'invalid-object',\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('file reference path is missing', () => {\n it('should return empty array', () => {\n // -- Arrange --\n xcodeProject.objects.PBXFileReference = {\n 'file-ref-key': {\n isa: 'PBXFileReference',\n path: undefined as unknown as string,\n sourceTree: 'SOURCE_ROOT',\n },\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('valid file reference', () => {\n it('should return array with file path', () => {\n // -- Arrange --\n xcodeProject.objects.PBXFileReference = {\n 'file-ref-key': {\n isa: 'PBXFileReference',\n path: 'test.swift',\n sourceTree: 'SOURCE_ROOT',\n },\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([\n path.join(xcodeProject.baseDir, 'test.swift'),\n ]);\n });\n });\n });\n\n describe('synchronized root groups', () => {\n it('should handle missing fileSystemSynchronizedGroups', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n 'some-target': {\n isa: 'PBXNativeTarget',\n name: 'some-target',\n },\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n\n it('should handle empty fileSystemSynchronizedGroups', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n 'some-target': {\n isa: 'PBXNativeTarget',\n name: 'some-target',\n fileSystemSynchronizedGroups: [],\n },\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n\n it('should handle invalid synchronized root group', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n 'some-target': {\n isa: 'PBXNativeTarget',\n name: 'some-target',\n fileSystemSynchronizedGroups: [\n {\n value: 'invalid-group',\n },\n ],\n },\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n\n it('should handle synchronized root group with missing path', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n xcodeProject.objects.PBXNativeTarget = {\n 'some-target': {\n isa: 'PBXNativeTarget',\n name: 'some-target',\n fileSystemSynchronizedGroups: [\n {\n value: 'group-key',\n },\n ],\n },\n };\n xcodeProject.objects.PBXFileSystemSynchronizedRootGroup = {\n 'group-key': {\n isa: 'PBXFileSystemSynchronizedRootGroup',\n path: undefined as unknown as string,\n sourceTree: 'SOURCE_ROOT',\n },\n };\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('some-target');\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n\n it('should exclude files in membership exceptions', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n\n // The subfolder 1-1-1 is a synchronized root group containing two files:\n // - File-1-1-1-1.swift\n // - File-1-1-1-2.swift\n //\n // The membership exceptions are:\n // - File-1-1-1-2.swift\n //\n // The expected result is that File-1-1-1-1.swift is excluded from the build, but\n // included due to the membership exception.\n // The File-1-1-1-2.swift is excluded from the build due to the membership exception.\n\n // Pre-condition: File-1-1-1-1.swift exists\n const file1111 = path.join(\n xcodeProject.baseDir,\n 'Group 1',\n 'Subgroup 1-1',\n 'Subfolder 1-1-1',\n 'File-1-1-1-1.swift',\n );\n expect(fs.existsSync(file1111)).toBe(true);\n\n // Pre-condition: File-1-1-1-2.swift exists\n const file1112 = path.join(\n xcodeProject.baseDir,\n 'Group 1',\n 'Subgroup 1-1',\n 'Subfolder 1-1-1',\n 'File-1-1-1-2.swift',\n );\n expect(fs.existsSync(file1112)).toBe(true);\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('Project');\n\n // -- Assert --\n // Known Issue:\n // The file `File-1-1-1-1.swift` is included in the source build phase, but not in the list of files.\n //\n // This is the group structure:\n // <main group> / Group 1 / Subgroup 1-1 / Subfolder 1-1-1 / File-1-1-1-1.swift\n //\n // - <main group> is the root group\n // - Group 1 is a group\n // - Subgroup 1-1 is a nested group\n // - Subfolder 1-1-1 is a synchronized root group\n // - File-1-1-1-1.swift is a file in the synchronized root group Subfolder 1-1-1\n //\n // For no apparent reason, Xcode is picking up the file, but Group 1 is not mentioned anywhere other then the main group.\n // This would require us to consider every root group as a potential source of files, which seems excessive if a project has multiple targets.\n\n // expect(files).toContain(file1111);\n expect(files).not.toContain(file1112);\n });\n\n it('should return synchronized files and files in main group', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n\n // -- Act --\n const files = xcodeProject.getSourceFilesForTarget('Project');\n\n // -- Assert --\n // The order is not guaranteed, so we need to check for each file individually\n // The order in this test case is the one displayed in the Xcode UI\n const group1DirPath = path.join(xcodeProject.baseDir, 'Group 1');\n const subgroup1_1DirPath = path.join(group1DirPath, 'Subgroup 1-1');\n const subgroup1_2DirPath = path.join(group1DirPath, 'Subgroup 1-2');\n const subgroup1_1_2DirPath = path.join(\n subgroup1_1DirPath,\n 'Subgroup 1-1-2',\n );\n\n const sourcesDirPath = path.join(xcodeProject.baseDir, 'Sources');\n const subfolder1DirPath = path.join(sourcesDirPath, 'Subfolder 1');\n const subfolder2DirPath = path.join(sourcesDirPath, 'Subfolder 2');\n\n const groupRef1_3DirPath = path.join(\n xcodeProject.baseDir,\n 'Group Reference 1-3',\n );\n\n expect(files).toContain(\n path.join(subgroup1_2DirPath, 'File-1-2-2.swift'),\n );\n expect(files).toContain(\n path.join(subfolder1DirPath, 'ContentView.swift'),\n );\n expect(files).toContain(\n path.join(\n subgroup1_2DirPath,\n 'File-1-2-3--relative-to-group.swift',\n ),\n );\n expect(files).toContain(path.join(sourcesDirPath, 'MainApp.swift'));\n expect(files).toContain(path.join(subfolder2DirPath, 'File.swift'));\n\n // Absolute path\n expect(files).toContain(\n '/System/Library/CoreServices/SystemVersion.plist',\n );\n // Path relative to the SDK\n expect(files).toContain(\n '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/SDKSettings.plist',\n );\n // Path relative to the developer directory\n expect(files).toContain(\n '/Applications/Xcode.app/Contents/Developer/usr/bin/git',\n );\n // Path relative to the build products directory\n // NOT SUPPORTED YET\n\n // Path relative to the project\n expect(files).toContain(\n path.join(subgroup1_2DirPath, 'File-1-2-1.swift'),\n );\n expect(files).toContain(\n path.join(groupRef1_3DirPath, 'File-1-3-1.swift'),\n );\n expect(files).toContain(\n path.join(\n subgroup1_2DirPath,\n 'File-1-2-3--relative-to-project.swift',\n ),\n );\n expect(files).toContain(\n path.join(subgroup1_1_2DirPath, 'File-1-1-2-1.swift'),\n );\n // Known Issue:\n // The file `File-1-1-1-1.swift` is included in the source build phase, but not in the list of files.\n //\n // This is the group structure:\n // <main group> / Group 1 / Subgroup 1-1 / Subfolder 1-1-1 / File-1-1-1-1.swift\n //\n // - <main group> is the root group\n // - Group 1 is a group\n // - Subgroup 1-1 is a nested group\n // - Subfolder 1-1-1 is a synchronized root group\n // - File-1-1-1-1.swift is a file in the synchronized root group Subfolder 1-1-1\n //\n // For no apparent reason, Xcode is picking up the file, but Group 1 is not mentioned anywhere other then the main group.\n // This would require us to consider every root group as a potential source of files, which seems excessive if a project has multiple targets.\n\n // expect(files).toContain(\n // path.join(\n // xcodeProject.baseDir,\n // 'Group 1',\n // 'Subgroup 1-1',\n // 'Subfolder 1-1-1',\n // 'File-1-1-1-1.swift',\n // ),\n // );\n\n // Assert that there are no other file paths in the list\n expect(files).toHaveLength(12);\n });\n });\n });\n\n describe('findFilesInSourceBuildPhase', () => {\n describe('when build phase is not found', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = undefined;\n\n // -- Act --\n const files = xcodeProject.findFilesInSourceBuildPhase({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase files are undefined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = [\n {\n value: 'build-phase-key',\n },\n ];\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': {\n isa: 'PBXSourcesBuildPhase',\n files: undefined,\n },\n };\n\n // -- Act --\n const files = xcodeProject.findFilesInSourceBuildPhase({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase files are empty', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = [\n {\n value: 'build-phase-key',\n },\n ];\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': {\n isa: 'PBXSourcesBuildPhase',\n files: [],\n },\n };\n\n // -- Act --\n const files = xcodeProject.findFilesInSourceBuildPhase({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase file is a comment', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = [\n {\n value: 'build-phase-key',\n },\n ];\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': 'this is a comment',\n };\n\n // Smoke test to ensure native target is defined\n expect(nativeTarget).toBeDefined();\n\n // -- Act --\n const files = xcodeProject.findFilesInSourceBuildPhase({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase file is not found', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = [\n {\n value: 'build-phase-key',\n },\n ];\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': {\n isa: 'PBXSourcesBuildPhase',\n files: [],\n },\n };\n\n // -- Act --\n const files = xcodeProject.findFilesInSourceBuildPhase({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase file reference is a comment', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = [\n {\n value: 'build-phase-key',\n },\n ];\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': {\n isa: 'PBXSourcesBuildPhase',\n files: [\n {\n value: 'file-key',\n },\n ],\n },\n };\n xcodeProject.objects.PBXBuildFile = {\n 'file-key': {\n isa: 'PBXBuildFile',\n fileRef: 'file-ref-key',\n },\n };\n xcodeProject.objects.PBXFileReference = {\n 'file-ref-key': 'this is a comment',\n };\n\n // -- Act --\n const files = xcodeProject.findFilesInSourceBuildPhase({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('build phase file reference has no path', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = [\n {\n value: 'build-phase-key',\n },\n ];\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': {\n isa: 'PBXSourcesBuildPhase',\n files: [\n {\n value: 'file-key',\n },\n ],\n },\n };\n xcodeProject.objects.PBXBuildFile = {\n 'file-key': {\n isa: 'PBXBuildFile',\n fileRef: 'file-ref-key',\n },\n };\n xcodeProject.objects.PBXFileReference = {\n 'file-ref-key': {\n isa: 'PBXFileReference',\n path: undefined as unknown as string,\n sourceTree: 'SOURCE_ROOT',\n },\n };\n\n // -- Act --\n const files = xcodeProject.findFilesInSourceBuildPhase({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('when file reference path contains doublequotes', () => {\n it('should be removed', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = [\n {\n value: 'build-phase-key',\n },\n ];\n xcodeProject.objects.PBXSourcesBuildPhase = {\n 'build-phase-key': {\n isa: 'PBXSourcesBuildPhase',\n files: [\n {\n value: 'file-key',\n },\n ],\n },\n };\n xcodeProject.objects.PBXBuildFile = {\n 'file-key': {\n isa: 'PBXBuildFile',\n fileRef: 'file-ref-key',\n },\n };\n xcodeProject.objects.PBXFileReference = {\n 'file-ref-key': {\n isa: 'PBXFileReference',\n path: '\"path/with/quotes.swift\"',\n sourceTree: 'SOURCE_ROOT',\n },\n };\n\n // -- Act --\n const files = xcodeProject.findFilesInSourceBuildPhase({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).toEqual([\n path.join(xcodeProject.baseDir, 'path/with/quotes.swift'),\n ]);\n });\n });\n\n it('should return all files in build phase', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n\n // -- Act --\n const files = xcodeProject.findFilesInSourceBuildPhase({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n // The list should reflect exactly the list of `files` in the `PBXSourcesBuildPhase` in the project.pbxproj file\n expect(files).toEqual([\n // Absolute paths\n '/System/Library/CoreServices/SystemVersion.plist',\n\n // Path relative to the build directory\n // NOT SUPPORTED YET\n\n // Path relative to the SDK\n '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/SDKSettings.plist',\n\n // Path relative to the developer directory\n '/Applications/Xcode.app/Contents/Developer/usr/bin/git',\n\n path.join(\n xcodeProject.baseDir,\n 'Group 1',\n 'Subgroup 1-2',\n 'File-1-2-2.swift',\n ),\n path.join(\n xcodeProject.baseDir,\n 'Group 1',\n 'Subgroup 1-2',\n 'File-1-2-3--relative-to-group.swift',\n ),\n path.join(\n xcodeProject.baseDir,\n 'Group 1',\n 'Subgroup 1-2',\n 'File-1-2-1.swift',\n ),\n path.join(\n xcodeProject.baseDir,\n 'Group 1',\n 'Subgroup 1-1',\n 'Subgroup 1-1-2',\n 'File-1-1-2-1.swift',\n ),\n path.join(\n xcodeProject.baseDir,\n 'Group Reference 1-3',\n 'File-1-3-1.swift',\n ),\n path.join(\n xcodeProject.baseDir,\n 'Group 1',\n 'Subgroup 1-2',\n 'File-1-2-3--relative-to-project.swift',\n ),\n ]);\n });\n });\n\n describe('findSourceBuildPhaseInTarget', () => {\n describe('when build phases are undefined', () => {\n it('should return undefined', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = undefined;\n\n // -- Act --\n const buildPhase =\n xcodeProject.findSourceBuildPhaseInTarget(nativeTarget);\n\n // -- Assert --\n expect(buildPhase).toBeUndefined();\n });\n });\n\n describe('when build phases are empty', () => {\n it('should return undefined', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = [];\n\n // -- Act --\n const buildPhase =\n xcodeProject.findSourceBuildPhaseInTarget(nativeTarget);\n\n // -- Assert --\n expect(buildPhase).toBeUndefined();\n });\n });\n\n describe('when referenced build phase is not found', () => {\n it('should ignore it', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.buildPhases = [\n {\n value: 'build-phase-key',\n },\n ];\n xcodeProject.objects.PBXSourcesBuildPhase = {};\n\n // -- Act --\n const buildPhase =\n xcodeProject.findSourceBuildPhaseInTarget(nativeTarget);\n\n // -- Assert --\n expect(buildPhase).toBeUndefined();\n });\n });\n\n describe('when referenced build phase is found', () => {\n it('should return the build phase', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n\n // -- Act --\n const buildPhase =\n xcodeProject.findSourceBuildPhaseInTarget(nativeTarget);\n\n // -- Assert --\n expect(buildPhase).toEqual({\n id: 'D4E604C92D50CEEC00CAB00F',\n obj: {\n isa: 'PBXSourcesBuildPhase',\n files: [],\n buildActionMask: 2147483647,\n runOnlyForDeploymentPostprocessing: 0,\n },\n });\n });\n });\n });\n\n describe('findFilesInSynchronizedRootGroups', () => {\n describe('when synchronized root groups are undefined', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.fileSystemSynchronizedGroups = undefined;\n\n // -- Act --\n const files = xcodeProject.findFilesInSynchronizedRootGroups({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('when synchronized root groups are empty', () => {\n it('should return empty array', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(singleTargetProjectPath);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n nativeTarget.fileSystemSynchronizedGroups = [];\n\n // -- Act --\n const files = xcodeProject.findFilesInSynchronizedRootGroups({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).toEqual([]);\n });\n });\n\n describe('when synchronized root groups are not found', () => {\n it('should ignore files in them', () => {\n // -- Arrange --\n const xcodeProject = new XcodeProject(projectWithSynchronizedFolders);\n const nativeTargetId = 'D4E604CC2D50CEEC00CAB00F';\n const nativeTarget = xcodeProject.objects.PBXNativeTarget?.[\n nativeTargetId\n ] as PBXNativeTarget;\n\n // Add an invalid group reference to the native target\n nativeTarget.fileSystemSynchronizedGroups = [\n ...(nativeTarget.fileSystemSynchronizedGroups || []),\n {\n value: 'invalid-group-key',\n },\n ];\n\n // -- Act --\n const files = xcodeProject.findFilesInSynchronizedRootGroups({\n id: nativeTargetId,\n obj: nativeTarget,\n });\n\n // -- Assert --\n expect(files).not.toContain(\n path.join(\n xcodeProject.baseDir,\n 'Sources',\n 'Subfolder 1',\n 'Excluded-File.swift',\n ),\n );\n });\n });\n });\n });\n});\n"]}
|
|
@@ -32,6 +32,9 @@ const templates_1 = require("../../src/flutter/templates");
|
|
|
32
32
|
"await SentryFlutter.init(
|
|
33
33
|
(options) {
|
|
34
34
|
options.dsn = 'my-dsn';
|
|
35
|
+
// Adds request headers and IP for users, for more info visit:
|
|
36
|
+
// https://docs.sentry.io/platforms/dart/guides/flutter/data-management/data-collected/
|
|
37
|
+
options.sendDefaultPii = true;
|
|
35
38
|
// Set tracesSampleRate to 1.0 to capture 100% of transactions for tracing.
|
|
36
39
|
// We recommend adjusting this value in production.
|
|
37
40
|
options.tracesSampleRate = 1.0;
|
|
@@ -54,6 +57,9 @@ const templates_1 = require("../../src/flutter/templates");
|
|
|
54
57
|
"await SentryFlutter.init(
|
|
55
58
|
(options) {
|
|
56
59
|
options.dsn = 'my-dsn';
|
|
60
|
+
// Adds request headers and IP for users, for more info visit:
|
|
61
|
+
// https://docs.sentry.io/platforms/dart/guides/flutter/data-management/data-collected/
|
|
62
|
+
options.sendDefaultPii = true;
|
|
57
63
|
// Set tracesSampleRate to 1.0 to capture 100% of transactions for tracing.
|
|
58
64
|
// We recommend adjusting this value in production.
|
|
59
65
|
options.tracesSampleRate = 1.0;
|
|
@@ -73,6 +79,9 @@ const templates_1 = require("../../src/flutter/templates");
|
|
|
73
79
|
"await SentryFlutter.init(
|
|
74
80
|
(options) {
|
|
75
81
|
options.dsn = 'my-dsn';
|
|
82
|
+
// Adds request headers and IP for users, for more info visit:
|
|
83
|
+
// https://docs.sentry.io/platforms/dart/guides/flutter/data-management/data-collected/
|
|
84
|
+
options.sendDefaultPii = true;
|
|
76
85
|
},
|
|
77
86
|
appRunner: () => runApp(SentryWidget(child: const MyApp())),
|
|
78
87
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/flutter/templates.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,2DAIqC;AAErC,IAAA,iBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAA,iBAAQ,EAAC,SAAS,EAAE,GAAG,EAAE;QACvB,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,IAAA,0BAAc,EAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAClE,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;aAOhC,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,IAAA,4BAAgB,EAAC,eAAe,CAAC,CAAC;YACnD,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,4BAA4B,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,IAAA,iBAAQ,EAAC,MAAM,EAAE,GAAG,EAAE;QACpB,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,QAAQ,GAAG,IAAA,uBAAW,EAC1B,QAAQ,EACR;gBACE,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI;aAChB,EACD,eAAe,CAChB,CAAC;YACF,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC
|
|
1
|
+
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/flutter/templates.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,2DAIqC;AAErC,IAAA,iBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAA,iBAAQ,EAAC,SAAS,EAAE,GAAG,EAAE;QACvB,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,IAAA,0BAAc,EAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAClE,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;aAOhC,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,IAAA,4BAAgB,EAAC,eAAe,CAAC,CAAC;YACnD,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,4BAA4B,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,IAAA,iBAAQ,EAAC,MAAM,EAAE,GAAG,EAAE;QACpB,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,QAAQ,GAAG,IAAA,uBAAW,EAC1B,QAAQ,EACR;gBACE,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI;aAChB,EACD,eAAe,CAChB,CAAC;YACF,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;OAkBtC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,QAAQ,GAAG,IAAA,uBAAW,EAC1B,QAAQ,EACR;gBACE,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,KAAK;aACjB,EACD,eAAe,CAChB,CAAC;YACF,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;OAetC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,QAAQ,GAAG,IAAA,uBAAW,EAC1B,QAAQ,EACR;gBACE,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,KAAK;aACjB,EACD,eAAe,CAChB,CAAC;YACF,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;OAYtC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from 'vitest';\nimport {\n pubspecOptions,\n sentryProperties,\n initSnippet,\n} from '../../src/flutter/templates';\n\ndescribe('Flutter code templates', () => {\n describe('pubspec', () => {\n it('generates pubspec with project and org', () => {\n const template = pubspecOptions('fixture-project', 'fixture-org');\n expect(template).toMatchInlineSnapshot(`\n \"sentry:\n upload_debug_symbols: true\n upload_source_maps: true\n project: fixture-project\n org: fixture-org\n \"\n `);\n });\n });\n describe('sentry.properties', () => {\n it('generates sentry.properties with token', () => {\n const template = sentryProperties('fixture-token');\n expect(template).toMatchInlineSnapshot(`\"auth_token=fixture-token\"`);\n });\n });\n describe('init', () => {\n it('generates Sentry config with all features enabled', () => {\n const template = initSnippet(\n 'my-dsn',\n {\n tracing: true,\n profiling: true,\n },\n 'const MyApp()',\n );\n expect(template).toMatchInlineSnapshot(`\n \"await SentryFlutter.init(\n (options) {\n options.dsn = 'my-dsn';\n // Adds request headers and IP for users, for more info visit:\n // https://docs.sentry.io/platforms/dart/guides/flutter/data-management/data-collected/\n options.sendDefaultPii = true;\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for tracing.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = 1.0;\n // The sampling rate for profiling is relative to tracesSampleRate\n // Setting to 1.0 will profile 100% of sampled transactions:\n options.profilesSampleRate = 1.0;\n },\n appRunner: () => runApp(SentryWidget(child: const MyApp())),\n );\n // TODO: Remove this line after sending the first sample event to sentry.\n await Sentry.captureException(StateError('This is a sample exception.'));\"\n `);\n });\n\n it('generates Sentry config with profiling disabled', () => {\n const template = initSnippet(\n 'my-dsn',\n {\n tracing: true,\n profiling: false,\n },\n 'const MyApp()',\n );\n expect(template).toMatchInlineSnapshot(`\n \"await SentryFlutter.init(\n (options) {\n options.dsn = 'my-dsn';\n // Adds request headers and IP for users, for more info visit:\n // https://docs.sentry.io/platforms/dart/guides/flutter/data-management/data-collected/\n options.sendDefaultPii = true;\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for tracing.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = 1.0;\n },\n appRunner: () => runApp(SentryWidget(child: const MyApp())),\n );\n // TODO: Remove this line after sending the first sample event to sentry.\n await Sentry.captureException(StateError('This is a sample exception.'));\"\n `);\n });\n\n it('generates Sentry config with tracing disabled', () => {\n const template = initSnippet(\n 'my-dsn',\n {\n tracing: false,\n profiling: false,\n },\n 'const MyApp()',\n );\n expect(template).toMatchInlineSnapshot(`\n \"await SentryFlutter.init(\n (options) {\n options.dsn = 'my-dsn';\n // Adds request headers and IP for users, for more info visit:\n // https://docs.sentry.io/platforms/dart/guides/flutter/data-management/data-collected/\n options.sendDefaultPii = true;\n },\n appRunner: () => runApp(SentryWidget(child: const MyApp())),\n );\n // TODO: Remove this line after sending the first sample event to sentry.\n await Sentry.captureException(StateError('This is a sample exception.'));\"\n `);\n });\n });\n});\n"]}
|
|
@@ -32,6 +32,10 @@ import * as Sentry from '@sentry/react-native';
|
|
|
32
32
|
Sentry.init({
|
|
33
33
|
dsn: 'dsn',
|
|
34
34
|
|
|
35
|
+
// Adds more context data to events (IP address, cookies, user, etc.)
|
|
36
|
+
// For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/
|
|
37
|
+
sendDefaultPii: true,
|
|
38
|
+
|
|
35
39
|
// uncomment the line below to enable Spotlight (https://spotlightjs.com)
|
|
36
40
|
// spotlight: __DEV__,
|
|
37
41
|
});
|
|
@@ -73,6 +77,10 @@ import * as Sentry from '@sentry/react-native';
|
|
|
73
77
|
Sentry.init({
|
|
74
78
|
dsn: 'dsn',
|
|
75
79
|
|
|
80
|
+
// Adds more context data to events (IP address, cookies, user, etc.)
|
|
81
|
+
// For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/
|
|
82
|
+
sendDefaultPii: true,
|
|
83
|
+
|
|
76
84
|
// Configure Session Replay
|
|
77
85
|
replaysSessionSampleRate: 0.1,
|
|
78
86
|
replaysOnErrorSampleRate: 1,
|
|
@@ -96,6 +104,109 @@ export default App;`;
|
|
|
96
104
|
enableSessionReplay: true,
|
|
97
105
|
})).toBe(expectedOutput);
|
|
98
106
|
});
|
|
107
|
+
(0, vitest_1.it)('adds sdk import and sentry init under last import in the file and enables feedback widget', () => {
|
|
108
|
+
const input = `import * as React from 'react';
|
|
109
|
+
|
|
110
|
+
const test = 'test';
|
|
111
|
+
|
|
112
|
+
import { View } from 'react-native';
|
|
113
|
+
|
|
114
|
+
const App = () => {
|
|
115
|
+
return (
|
|
116
|
+
<View>
|
|
117
|
+
Test App
|
|
118
|
+
</View>
|
|
119
|
+
);
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export default App;`;
|
|
123
|
+
const expectedOutput = `import * as React from 'react';
|
|
124
|
+
|
|
125
|
+
const test = 'test';
|
|
126
|
+
|
|
127
|
+
import { View } from 'react-native';
|
|
128
|
+
import * as Sentry from '@sentry/react-native';
|
|
129
|
+
|
|
130
|
+
Sentry.init({
|
|
131
|
+
dsn: 'dsn',
|
|
132
|
+
|
|
133
|
+
// Adds more context data to events (IP address, cookies, user, etc.)
|
|
134
|
+
// For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/
|
|
135
|
+
sendDefaultPii: true,
|
|
136
|
+
integrations: [Sentry.feedbackIntegration()],
|
|
137
|
+
|
|
138
|
+
// uncomment the line below to enable Spotlight (https://spotlightjs.com)
|
|
139
|
+
// spotlight: __DEV__,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
const App = () => {
|
|
143
|
+
return (
|
|
144
|
+
<View>
|
|
145
|
+
Test App
|
|
146
|
+
</View>
|
|
147
|
+
);
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export default App;`;
|
|
151
|
+
(0, vitest_1.expect)((0, javascript_1.addSentryInitWithSdkImport)(input, {
|
|
152
|
+
dsn: 'dsn',
|
|
153
|
+
enableFeedbackWidget: true,
|
|
154
|
+
})).toBe(expectedOutput);
|
|
155
|
+
});
|
|
156
|
+
(0, vitest_1.it)('adds sdk import and sentry init under last import in the file and enables session replay and feedback widget', () => {
|
|
157
|
+
const input = `import * as React from 'react';
|
|
158
|
+
|
|
159
|
+
const test = 'test';
|
|
160
|
+
|
|
161
|
+
import { View } from 'react-native';
|
|
162
|
+
|
|
163
|
+
const App = () => {
|
|
164
|
+
return (
|
|
165
|
+
<View>
|
|
166
|
+
Test App
|
|
167
|
+
</View>
|
|
168
|
+
);
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
export default App;`;
|
|
172
|
+
const expectedOutput = `import * as React from 'react';
|
|
173
|
+
|
|
174
|
+
const test = 'test';
|
|
175
|
+
|
|
176
|
+
import { View } from 'react-native';
|
|
177
|
+
import * as Sentry from '@sentry/react-native';
|
|
178
|
+
|
|
179
|
+
Sentry.init({
|
|
180
|
+
dsn: 'dsn',
|
|
181
|
+
|
|
182
|
+
// Adds more context data to events (IP address, cookies, user, etc.)
|
|
183
|
+
// For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/
|
|
184
|
+
sendDefaultPii: true,
|
|
185
|
+
|
|
186
|
+
// Configure Session Replay
|
|
187
|
+
replaysSessionSampleRate: 0.1,
|
|
188
|
+
replaysOnErrorSampleRate: 1,
|
|
189
|
+
integrations: [Sentry.mobileReplayIntegration(), Sentry.feedbackIntegration()],
|
|
190
|
+
|
|
191
|
+
// uncomment the line below to enable Spotlight (https://spotlightjs.com)
|
|
192
|
+
// spotlight: __DEV__,
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const App = () => {
|
|
196
|
+
return (
|
|
197
|
+
<View>
|
|
198
|
+
Test App
|
|
199
|
+
</View>
|
|
200
|
+
);
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
export default App;`;
|
|
204
|
+
(0, vitest_1.expect)((0, javascript_1.addSentryInitWithSdkImport)(input, {
|
|
205
|
+
dsn: 'dsn',
|
|
206
|
+
enableSessionReplay: true,
|
|
207
|
+
enableFeedbackWidget: true,
|
|
208
|
+
})).toBe(expectedOutput);
|
|
209
|
+
});
|
|
99
210
|
(0, vitest_1.it)('does not add sdk import and sentry init in the file without imports', () => {
|
|
100
211
|
const input = `export const test = 'test';`;
|
|
101
212
|
(0, vitest_1.expect)((0, javascript_1.addSentryInitWithSdkImport)(input, { dsn: 'dsn' })).toBe(input);
|
|
@@ -336,6 +447,10 @@ import * as Sentry from '@sentry/react-native';
|
|
|
336
447
|
Sentry.init({
|
|
337
448
|
dsn: 'https://sentry.io/123',
|
|
338
449
|
|
|
450
|
+
// Adds more context data to events (IP address, cookies, user, etc.)
|
|
451
|
+
// For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/
|
|
452
|
+
sendDefaultPii: true,
|
|
453
|
+
|
|
339
454
|
// uncomment the line below to enable Spotlight (https://spotlightjs.com)
|
|
340
455
|
// spotlight: __DEV__,
|
|
341
456
|
});
|
|
@@ -384,6 +499,10 @@ import * as Sentry from '@sentry/react-native';
|
|
|
384
499
|
Sentry.init({
|
|
385
500
|
dsn: 'https://sentry.io/123',
|
|
386
501
|
|
|
502
|
+
// Adds more context data to events (IP address, cookies, user, etc.)
|
|
503
|
+
// For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/
|
|
504
|
+
sendDefaultPii: true,
|
|
505
|
+
|
|
387
506
|
// uncomment the line below to enable Spotlight (https://spotlightjs.com)
|
|
388
507
|
// spotlight: __DEV__,
|
|
389
508
|
});
|