@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
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
// @ts-expect-error - clack is ESM and TS complains about that. It works though
|
|
30
|
+
const clack = __importStar(require("@clack/prompts"));
|
|
31
|
+
const fs = __importStar(require("node:fs"));
|
|
32
|
+
const os = __importStar(require("node:os"));
|
|
33
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
34
|
+
const vitest_1 = require("vitest");
|
|
35
|
+
const configure_sentry_cli_1 = require("../../src/apple/configure-sentry-cli");
|
|
36
|
+
vitest_1.vi.mock('@clack/prompts', async () => ({
|
|
37
|
+
__esModule: true,
|
|
38
|
+
default: await vitest_1.vi.importActual('@clack/prompts'),
|
|
39
|
+
}));
|
|
40
|
+
(0, vitest_1.describe)('configureSentryCLI', () => {
|
|
41
|
+
const authToken = 'test';
|
|
42
|
+
let projectDir;
|
|
43
|
+
let rcPath;
|
|
44
|
+
let gitignorePath;
|
|
45
|
+
(0, vitest_1.beforeEach)(() => {
|
|
46
|
+
(0, vitest_1.beforeEach)(() => {
|
|
47
|
+
vitest_1.vi.spyOn(clack.log, 'warn').mockImplementation(() => {
|
|
48
|
+
/* empty */
|
|
49
|
+
});
|
|
50
|
+
vitest_1.vi.spyOn(clack, 'select').mockResolvedValue(undefined);
|
|
51
|
+
});
|
|
52
|
+
projectDir = fs.mkdtempSync(node_path_1.default.join(os.tmpdir(), 'project'));
|
|
53
|
+
fs.mkdirSync(projectDir, { recursive: true });
|
|
54
|
+
rcPath = node_path_1.default.join(projectDir, '.sentryclirc');
|
|
55
|
+
gitignorePath = node_path_1.default.join(projectDir, '.gitignore');
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.describe)('.sentryclirc file not exists', () => {
|
|
58
|
+
(0, vitest_1.it)('should create the .sentryclirc file', () => {
|
|
59
|
+
// -- Arrange --
|
|
60
|
+
// Pre-condition is that the .sentryclirc file does not exist
|
|
61
|
+
(0, vitest_1.expect)(fs.existsSync(rcPath)).toBe(false);
|
|
62
|
+
// -- Act --
|
|
63
|
+
(0, configure_sentry_cli_1.configureSentryCLI)({ projectDir, authToken });
|
|
64
|
+
// -- Assert --
|
|
65
|
+
(0, vitest_1.expect)(fs.existsSync(rcPath)).toBe(true);
|
|
66
|
+
(0, vitest_1.expect)(fs.readFileSync(rcPath, 'utf8')).toContain(`token=test`);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
(0, vitest_1.describe)('.sentryclirc file exists', () => {
|
|
70
|
+
(0, vitest_1.it)('should update the .sentryclirc file', () => {
|
|
71
|
+
// -- Arrange --
|
|
72
|
+
// Pre-condition is that the .sentryclirc file exists
|
|
73
|
+
fs.writeFileSync(rcPath, `token=old`);
|
|
74
|
+
// -- Act --
|
|
75
|
+
(0, configure_sentry_cli_1.configureSentryCLI)({ projectDir, authToken });
|
|
76
|
+
// -- Assert --
|
|
77
|
+
(0, vitest_1.expect)(fs.readFileSync(rcPath, 'utf8')).toContain(`token=${authToken}`);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
(0, vitest_1.describe)('.gitignore file not exists', () => {
|
|
81
|
+
(0, vitest_1.it)('should create the .gitignore file', () => {
|
|
82
|
+
// -- Arrange --
|
|
83
|
+
// Pre-condition is that the .gitignore file does not exist
|
|
84
|
+
(0, vitest_1.expect)(fs.existsSync(gitignorePath)).toBe(false);
|
|
85
|
+
// -- Act --
|
|
86
|
+
(0, configure_sentry_cli_1.configureSentryCLI)({ projectDir, authToken });
|
|
87
|
+
// -- Assert --
|
|
88
|
+
(0, vitest_1.expect)(fs.existsSync(gitignorePath)).toBe(true);
|
|
89
|
+
(0, vitest_1.expect)(fs.readFileSync(gitignorePath, 'utf8')).toContain('.sentryclirc');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
(0, vitest_1.describe)('.gitignore file exists', () => {
|
|
93
|
+
(0, vitest_1.describe)("contains '.sentryclirc'", () => {
|
|
94
|
+
(0, vitest_1.it)('should not append the .sentryclirc file to the .gitignore file', () => {
|
|
95
|
+
// -- Arrange --
|
|
96
|
+
// Pre-condition is that the .gitignore file exists and contains '.sentryclirc'
|
|
97
|
+
fs.writeFileSync(gitignorePath, `
|
|
98
|
+
# Xcode
|
|
99
|
+
xcuserdata/
|
|
100
|
+
|
|
101
|
+
# Sentry
|
|
102
|
+
.sentryclirc
|
|
103
|
+
`);
|
|
104
|
+
// -- Act --
|
|
105
|
+
(0, configure_sentry_cli_1.configureSentryCLI)({ projectDir, authToken });
|
|
106
|
+
// -- Assert --
|
|
107
|
+
(0, vitest_1.expect)(fs.readFileSync(gitignorePath, 'utf8')).toContain('.sentryclirc');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
(0, vitest_1.describe)("does not contain '.sentryclirc'", () => {
|
|
111
|
+
(0, vitest_1.it)('should append the .sentryclirc file to the .gitignore file', () => {
|
|
112
|
+
// -- Arrange --
|
|
113
|
+
// Pre-condition is that the .gitignore file exists and does not contain '.sentryclirc'
|
|
114
|
+
fs.writeFileSync(gitignorePath, `
|
|
115
|
+
# Xcode
|
|
116
|
+
xcuserdata/
|
|
117
|
+
`);
|
|
118
|
+
// -- Act --
|
|
119
|
+
(0, configure_sentry_cli_1.configureSentryCLI)({ projectDir, authToken });
|
|
120
|
+
// -- Assert --
|
|
121
|
+
(0, vitest_1.expect)(fs.readFileSync(gitignorePath, 'utf8')).toBe(`
|
|
122
|
+
# Xcode
|
|
123
|
+
xcuserdata/
|
|
124
|
+
|
|
125
|
+
.sentryclirc
|
|
126
|
+
`);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=configure-sentry-cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure-sentry-cli.test.js","sourceRoot":"","sources":["../../../test/apple/configure-sentry-cli.test.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport path from 'node:path';\nimport { beforeEach, describe, expect, it, vi } from 'vitest';\nimport { configureSentryCLI } from '../../src/apple/configure-sentry-cli';\n\nvi.mock('@clack/prompts', async () => ({\n __esModule: true,\n default: await vi.importActual<typeof clack>('@clack/prompts'),\n}));\n\ndescribe('configureSentryCLI', () => {\n const authToken = 'test';\n let projectDir: string;\n let rcPath: string;\n let gitignorePath: string;\n\n beforeEach(() => {\n beforeEach(() => {\n vi.spyOn(clack.log, 'warn').mockImplementation(() => {\n /* empty */\n });\n vi.spyOn(clack, 'select').mockResolvedValue(undefined);\n });\n\n projectDir = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projectDir, { recursive: true });\n\n rcPath = path.join(projectDir, '.sentryclirc');\n gitignorePath = path.join(projectDir, '.gitignore');\n });\n\n describe('.sentryclirc file not exists', () => {\n it('should create the .sentryclirc file', () => {\n // -- Arrange --\n // Pre-condition is that the .sentryclirc file does not exist\n expect(fs.existsSync(rcPath)).toBe(false);\n\n // -- Act --\n configureSentryCLI({ projectDir, authToken });\n\n // -- Assert --\n expect(fs.existsSync(rcPath)).toBe(true);\n expect(fs.readFileSync(rcPath, 'utf8')).toContain(`token=test`);\n });\n });\n\n describe('.sentryclirc file exists', () => {\n it('should update the .sentryclirc file', () => {\n // -- Arrange --\n // Pre-condition is that the .sentryclirc file exists\n fs.writeFileSync(rcPath, `token=old`);\n\n // -- Act --\n configureSentryCLI({ projectDir, authToken });\n\n // -- Assert --\n expect(fs.readFileSync(rcPath, 'utf8')).toContain(`token=${authToken}`);\n });\n });\n\n describe('.gitignore file not exists', () => {\n it('should create the .gitignore file', () => {\n // -- Arrange --\n // Pre-condition is that the .gitignore file does not exist\n expect(fs.existsSync(gitignorePath)).toBe(false);\n\n // -- Act --\n configureSentryCLI({ projectDir, authToken });\n\n // -- Assert --\n expect(fs.existsSync(gitignorePath)).toBe(true);\n expect(fs.readFileSync(gitignorePath, 'utf8')).toContain('.sentryclirc');\n });\n });\n\n describe('.gitignore file exists', () => {\n describe(\"contains '.sentryclirc'\", () => {\n it('should not append the .sentryclirc file to the .gitignore file', () => {\n // -- Arrange --\n // Pre-condition is that the .gitignore file exists and contains '.sentryclirc'\n fs.writeFileSync(\n gitignorePath,\n `\n# Xcode\nxcuserdata/\n\n# Sentry\n.sentryclirc\n`,\n );\n\n // -- Act --\n configureSentryCLI({ projectDir, authToken });\n\n // -- Assert --\n expect(fs.readFileSync(gitignorePath, 'utf8')).toContain(\n '.sentryclirc',\n );\n });\n });\n\n describe(\"does not contain '.sentryclirc'\", () => {\n it('should append the .sentryclirc file to the .gitignore file', () => {\n // -- Arrange --\n // Pre-condition is that the .gitignore file exists and does not contain '.sentryclirc'\n fs.writeFileSync(\n gitignorePath,\n `\n# Xcode\nxcuserdata/\n`,\n );\n\n // -- Act --\n configureSentryCLI({ projectDir, authToken });\n\n // -- Assert --\n expect(fs.readFileSync(gitignorePath, 'utf8')).toBe(\n `\n# Xcode\nxcuserdata/\n\n.sentryclirc\n`,\n );\n });\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Note for future maintainers:
|
|
3
|
+
//
|
|
4
|
+
// This test file is mocking the `child_process` module.
|
|
5
|
+
// As other tests are using the `child_process` module, we can not have them in the same file.
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const vitest_1 = require("vitest");
|
|
8
|
+
const macos_system_helper_1 = require("../../src/apple/macos-system-helper");
|
|
9
|
+
const { execSyncMock } = vitest_1.vi.hoisted(() => {
|
|
10
|
+
return {
|
|
11
|
+
execSyncMock: vitest_1.vi.fn(),
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
vitest_1.vi.mock('node:child_process', async () => {
|
|
15
|
+
return {
|
|
16
|
+
...(await vitest_1.vi.importActual('node:child_process')),
|
|
17
|
+
execSync: execSyncMock,
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
(0, vitest_1.describe)('MacOSSystemHelpers', () => {
|
|
21
|
+
(0, vitest_1.afterEach)(() => {
|
|
22
|
+
vitest_1.vi.clearAllMocks();
|
|
23
|
+
vitest_1.vi.restoreAllMocks();
|
|
24
|
+
});
|
|
25
|
+
(0, vitest_1.describe)('readXcodeBuildSettings', () => {
|
|
26
|
+
(0, vitest_1.describe)('project path', () => {
|
|
27
|
+
(0, vitest_1.it)('should escape quotes', () => {
|
|
28
|
+
// -- Arrange --
|
|
29
|
+
const projectPath = 'some path" && echo "Hello World"';
|
|
30
|
+
// Use spyOn instead of vi.mock
|
|
31
|
+
execSyncMock.mockImplementationOnce(() => {
|
|
32
|
+
return ' ACTION = build';
|
|
33
|
+
});
|
|
34
|
+
// -- Act --
|
|
35
|
+
const buildSettings = macos_system_helper_1.MacOSSystemHelpers.readXcodeBuildSettings(projectPath);
|
|
36
|
+
// -- Assert --
|
|
37
|
+
(0, vitest_1.expect)(buildSettings).toEqual({
|
|
38
|
+
ACTION: 'build',
|
|
39
|
+
});
|
|
40
|
+
// We expect the project path to be escaped
|
|
41
|
+
(0, vitest_1.expect)(execSyncMock).toHaveBeenCalledWith(`"xcodebuild" "-project" "some path\\" && echo \\"Hello World\\"" "-showBuildSettings"`, { encoding: 'utf8' });
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=macos-system-helper-mocked.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macos-system-helper-mocked.test.js","sourceRoot":"","sources":["../../../test/apple/macos-system-helper-mocked.test.ts"],"names":[],"mappings":";AAAA,+BAA+B;AAC/B,EAAE;AACF,wDAAwD;AACxD,8FAA8F;;AAE9F,mCAA6D;AAC7D,6EAAyE;AAEzE,MAAM,EAAE,YAAY,EAAE,GAAG,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE;IACvC,OAAO;QACL,YAAY,EAAE,WAAE,CAAC,EAAE,EAAE;KACtB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,WAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;IACvC,OAAO;QACL,GAAG,CAAC,MAAM,WAAE,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;QAChD,QAAQ,EAAE,YAAY;KACvB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,WAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;YAC5B,IAAA,WAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;gBAC9B,gBAAgB;gBAChB,MAAM,WAAW,GAAG,kCAAkC,CAAC;gBAEvD,+BAA+B;gBAC/B,YAAY,CAAC,sBAAsB,CAAC,GAAG,EAAE;oBACvC,OAAO,mBAAmB,CAAC;gBAC7B,CAAC,CAAC,CAAC;gBAEH,YAAY;gBACZ,MAAM,aAAa,GACjB,wCAAkB,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;gBAEzD,eAAe;gBACf,IAAA,eAAM,EAAC,aAAa,CAAC,CAAC,OAAO,CAAC;oBAC5B,MAAM,EAAE,OAAO;iBAChB,CAAC,CAAC;gBACH,2CAA2C;gBAC3C,IAAA,eAAM,EAAC,YAAY,CAAC,CAAC,oBAAoB,CACvC,uFAAuF,EACvF,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Note for future maintainers:\n//\n// This test file is mocking the `child_process` module.\n// As other tests are using the `child_process` module, we can not have them in the same file.\n\nimport { afterEach, describe, expect, it, vi } from 'vitest';\nimport { MacOSSystemHelpers } from '../../src/apple/macos-system-helper';\n\nconst { execSyncMock } = vi.hoisted(() => {\n return {\n execSyncMock: vi.fn(),\n };\n});\n\nvi.mock('node:child_process', async () => {\n return {\n ...(await vi.importActual('node:child_process')),\n execSync: execSyncMock,\n };\n});\n\ndescribe('MacOSSystemHelpers', () => {\n afterEach(() => {\n vi.clearAllMocks();\n vi.restoreAllMocks();\n });\n\n describe('readXcodeBuildSettings', () => {\n describe('project path', () => {\n it('should escape quotes', () => {\n // -- Arrange --\n const projectPath = 'some path\" && echo \"Hello World\"';\n\n // Use spyOn instead of vi.mock\n execSyncMock.mockImplementationOnce(() => {\n return ' ACTION = build';\n });\n\n // -- Act --\n const buildSettings =\n MacOSSystemHelpers.readXcodeBuildSettings(projectPath);\n\n // -- Assert --\n expect(buildSettings).toEqual({\n ACTION: 'build',\n });\n // We expect the project path to be escaped\n expect(execSyncMock).toHaveBeenCalledWith(\n `\"xcodebuild\" \"-project\" \"some path\\\\\" && echo \\\\\"Hello World\\\\\"\" \"-showBuildSettings\"`,\n { encoding: 'utf8' },\n );\n });\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
7
|
+
const vitest_1 = require("vitest");
|
|
8
|
+
const macos_system_helper_1 = require("../../src/apple/macos-system-helper");
|
|
9
|
+
const appleProjectsPath = node_path_1.default.resolve(__dirname, '../../fixtures/test-applications/apple');
|
|
10
|
+
const projectWithSynchronizedFolders = node_path_1.default.join(appleProjectsPath, 'xcode-15-compatible-project/Project.xcodeproj');
|
|
11
|
+
// The path to the Xcode.app can be different on different machines, therefore me must detect the path
|
|
12
|
+
// to the Xcode.app using the `xcode-select` command.
|
|
13
|
+
// The same goes for the SDK path, which can be different on different machines depending if the Command Line Tools
|
|
14
|
+
// or the full Xcode is installed.
|
|
15
|
+
//
|
|
16
|
+
// While creating these tests we ensured that the implementation in the tests is correct by comparing.
|
|
17
|
+
// We must not change the implementation in the test code unless we are sure that the implementation is correct!
|
|
18
|
+
(0, vitest_1.describe)('MacOSSystemHelpers', () => {
|
|
19
|
+
(0, vitest_1.afterEach)(() => {
|
|
20
|
+
vitest_1.vi.clearAllMocks();
|
|
21
|
+
vitest_1.vi.restoreAllMocks();
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.describe)('findSDKRootDirectoryPath', () => {
|
|
24
|
+
vitest_1.test.runIf(process.platform === 'darwin')('should return the SDK root directory path', () => {
|
|
25
|
+
// -- Act --
|
|
26
|
+
const sdkRootDirectoryPath = macos_system_helper_1.MacOSSystemHelpers.findSDKRootDirectoryPath();
|
|
27
|
+
// -- Assert --
|
|
28
|
+
const candidates = [
|
|
29
|
+
// Matches the path for the Command Line Tools, e.g. /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
|
|
30
|
+
/^\/Library\/Developer\/CommandLineTools\/SDKs\/MacOSX\.sdk$/i,
|
|
31
|
+
// Matches the path for the default Xcode.app, e.g. /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
|
|
32
|
+
/^\/Applications\/Xcode\.app\/Contents\/Developer\/Platforms\/MacOSX\.platform\/Developer\/SDKs\/MacOSX\.sdk$/i,
|
|
33
|
+
// Matches the path for any Xcode.app, e.g. /Applications/Xcode-16.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
|
|
34
|
+
/^\/Applications\/Xcode.+\.app\/Contents\/Developer\/Platforms\/MacOSX\.platform\/Developer\/SDKs\/MacOSX\.sdk$/i,
|
|
35
|
+
];
|
|
36
|
+
(0, vitest_1.expect)(sdkRootDirectoryPath).toSatisfy((path) => candidates.some((regex) => regex.test(path)));
|
|
37
|
+
});
|
|
38
|
+
vitest_1.test.runIf(process.platform !== 'darwin')('should return undefined on non-macOS platforms', () => {
|
|
39
|
+
// The purpose of this test is to verify that the implementation of findSDKRootDirectoryPath() is still unchanged
|
|
40
|
+
// -- Act --
|
|
41
|
+
const sdkRootDirectoryPath = macos_system_helper_1.MacOSSystemHelpers.findSDKRootDirectoryPath();
|
|
42
|
+
// -- Assert --
|
|
43
|
+
(0, vitest_1.expect)(sdkRootDirectoryPath).toBeUndefined();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.describe)('findDeveloperDirectoryPath', () => {
|
|
47
|
+
vitest_1.test.runIf(process.platform === 'darwin')('should return the developer directory path', () => {
|
|
48
|
+
// -- Act --
|
|
49
|
+
const developerDirectoryPath = macos_system_helper_1.MacOSSystemHelpers.findDeveloperDirectoryPath();
|
|
50
|
+
// -- Assert --
|
|
51
|
+
const candidates = [
|
|
52
|
+
// Matches the path for the default Xcode.app, e.g. /Applications/Xcode.app/Contents/Developer
|
|
53
|
+
/^\/Applications\/Xcode\.app\/Contents\/Developer$/i,
|
|
54
|
+
// Matches the path for any Xcode.app, e.g. /Applications/Xcode-16.0.app/Contents/Developer
|
|
55
|
+
/^\/Applications\/Xcode.+\.app\/Contents\/Developer$/i,
|
|
56
|
+
];
|
|
57
|
+
(0, vitest_1.expect)(developerDirectoryPath).toSatisfy((path) => candidates.some((regex) => regex.test(path)));
|
|
58
|
+
});
|
|
59
|
+
vitest_1.test.runIf(process.platform !== 'darwin')('should return undefined on non-macOS platforms', () => {
|
|
60
|
+
// The purpose of this test is to verify that the implementation of findDeveloperDirectoryPath() is still unchanged
|
|
61
|
+
// -- Act --
|
|
62
|
+
const developerDirectoryPath = macos_system_helper_1.MacOSSystemHelpers.findDeveloperDirectoryPath();
|
|
63
|
+
// -- Assert --
|
|
64
|
+
(0, vitest_1.expect)(developerDirectoryPath).toBeUndefined();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.describe)('readXcodeBuildSettings', () => {
|
|
68
|
+
vitest_1.test.runIf(process.platform === 'darwin')('should return the build settings', () => {
|
|
69
|
+
// -- Act --
|
|
70
|
+
const buildSettings = macos_system_helper_1.MacOSSystemHelpers.readXcodeBuildSettings(projectWithSynchronizedFolders);
|
|
71
|
+
// -- Assert --
|
|
72
|
+
// The build settings are a massive list of key-value pairs, so we'll just check a few of them
|
|
73
|
+
// which are relevant for our use cases.
|
|
74
|
+
(0, vitest_1.expect)(buildSettings?.['CONFIGURATION_BUILD_DIR']).toEqual(node_path_1.default.join(appleProjectsPath, 'xcode-15-compatible-project/build/Release-unknown'));
|
|
75
|
+
(0, vitest_1.expect)(buildSettings?.['TARGET_BUILD_DIR']).toEqual(node_path_1.default.join(appleProjectsPath, 'xcode-15-compatible-project/build/Release-unknown'));
|
|
76
|
+
},
|
|
77
|
+
// Increased timeout to 10 seconds due to timeout errors for Node 18 and Node 20
|
|
78
|
+
10000);
|
|
79
|
+
vitest_1.test.runIf(process.platform !== 'darwin')('should return undefined on non-macOS platforms', () => {
|
|
80
|
+
// The purpose of this test is to verify that the implementation of readXcodeBuildSettings() is still unchanged
|
|
81
|
+
// -- Act --
|
|
82
|
+
const buildSettings = macos_system_helper_1.MacOSSystemHelpers.readXcodeBuildSettings(projectWithSynchronizedFolders);
|
|
83
|
+
// -- Assert --
|
|
84
|
+
(0, vitest_1.expect)(buildSettings).toBeUndefined();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=macos-system-helper.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macos-system-helper.test.js","sourceRoot":"","sources":["../../../test/apple/macos-system-helper.test.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { afterEach, describe, expect, test, vi } from 'vitest';\nimport { MacOSSystemHelpers } from '../../src/apple/macos-system-helper';\n\nconst appleProjectsPath = path.resolve(\n __dirname,\n '../../fixtures/test-applications/apple',\n);\nconst projectWithSynchronizedFolders = path.join(\n appleProjectsPath,\n 'xcode-15-compatible-project/Project.xcodeproj',\n);\n\n// The path to the Xcode.app can be different on different machines, therefore me must detect the path\n// to the Xcode.app using the `xcode-select` command.\n// The same goes for the SDK path, which can be different on different machines depending if the Command Line Tools\n// or the full Xcode is installed.\n//\n// While creating these tests we ensured that the implementation in the tests is correct by comparing.\n// We must not change the implementation in the test code unless we are sure that the implementation is correct!\n\ndescribe('MacOSSystemHelpers', () => {\n afterEach(() => {\n vi.clearAllMocks();\n vi.restoreAllMocks();\n });\n\n describe('findSDKRootDirectoryPath', () => {\n test.runIf(process.platform === 'darwin')(\n 'should return the SDK root directory path',\n () => {\n // -- Act --\n const sdkRootDirectoryPath =\n MacOSSystemHelpers.findSDKRootDirectoryPath();\n\n // -- Assert --\n const candidates = [\n // Matches the path for the Command Line Tools, e.g. /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk\n /^\\/Library\\/Developer\\/CommandLineTools\\/SDKs\\/MacOSX\\.sdk$/i,\n // Matches the path for the default Xcode.app, e.g. /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk\n /^\\/Applications\\/Xcode\\.app\\/Contents\\/Developer\\/Platforms\\/MacOSX\\.platform\\/Developer\\/SDKs\\/MacOSX\\.sdk$/i,\n // Matches the path for any Xcode.app, e.g. /Applications/Xcode-16.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk\n /^\\/Applications\\/Xcode.+\\.app\\/Contents\\/Developer\\/Platforms\\/MacOSX\\.platform\\/Developer\\/SDKs\\/MacOSX\\.sdk$/i,\n ];\n\n expect(sdkRootDirectoryPath).toSatisfy((path: string) =>\n candidates.some((regex) => regex.test(path)),\n );\n },\n );\n\n test.runIf(process.platform !== 'darwin')(\n 'should return undefined on non-macOS platforms',\n () => {\n // The purpose of this test is to verify that the implementation of findSDKRootDirectoryPath() is still unchanged\n\n // -- Act --\n const sdkRootDirectoryPath =\n MacOSSystemHelpers.findSDKRootDirectoryPath();\n\n // -- Assert --\n expect(sdkRootDirectoryPath).toBeUndefined();\n },\n );\n });\n\n describe('findDeveloperDirectoryPath', () => {\n test.runIf(process.platform === 'darwin')(\n 'should return the developer directory path',\n () => {\n // -- Act --\n const developerDirectoryPath =\n MacOSSystemHelpers.findDeveloperDirectoryPath();\n\n // -- Assert --\n const candidates = [\n // Matches the path for the default Xcode.app, e.g. /Applications/Xcode.app/Contents/Developer\n /^\\/Applications\\/Xcode\\.app\\/Contents\\/Developer$/i,\n // Matches the path for any Xcode.app, e.g. /Applications/Xcode-16.0.app/Contents/Developer\n /^\\/Applications\\/Xcode.+\\.app\\/Contents\\/Developer$/i,\n ];\n\n expect(developerDirectoryPath).toSatisfy((path: string) =>\n candidates.some((regex) => regex.test(path)),\n );\n },\n );\n test.runIf(process.platform !== 'darwin')(\n 'should return undefined on non-macOS platforms',\n () => {\n // The purpose of this test is to verify that the implementation of findDeveloperDirectoryPath() is still unchanged\n\n // -- Act --\n const developerDirectoryPath =\n MacOSSystemHelpers.findDeveloperDirectoryPath();\n\n // -- Assert --\n expect(developerDirectoryPath).toBeUndefined();\n },\n );\n });\n\n describe('readXcodeBuildSettings', () => {\n test.runIf(process.platform === 'darwin')(\n 'should return the build settings',\n () => {\n // -- Act --\n const buildSettings = MacOSSystemHelpers.readXcodeBuildSettings(\n projectWithSynchronizedFolders,\n );\n\n // -- Assert --\n // The build settings are a massive list of key-value pairs, so we'll just check a few of them\n // which are relevant for our use cases.\n expect(buildSettings?.['CONFIGURATION_BUILD_DIR']).toEqual(\n path.join(\n appleProjectsPath,\n 'xcode-15-compatible-project/build/Release-unknown',\n ),\n );\n expect(buildSettings?.['TARGET_BUILD_DIR']).toEqual(\n path.join(\n appleProjectsPath,\n 'xcode-15-compatible-project/build/Release-unknown',\n ),\n );\n },\n // Increased timeout to 10 seconds due to timeout errors for Node 18 and Node 20\n 10000,\n );\n\n test.runIf(process.platform !== 'darwin')(\n 'should return undefined on non-macOS platforms',\n () => {\n // The purpose of this test is to verify that the implementation of readXcodeBuildSettings() is still unchanged\n\n // -- Act --\n const buildSettings = MacOSSystemHelpers.readXcodeBuildSettings(\n projectWithSynchronizedFolders,\n );\n\n // -- Assert --\n expect(buildSettings).toBeUndefined();\n },\n );\n });\n});\n"]}
|
|
@@ -100,6 +100,11 @@ fi
|
|
|
100
100
|
(0, vitest_1.expect)(snippet).toBe(` SentrySDK.start { options in
|
|
101
101
|
options.dsn = "test-dsn"
|
|
102
102
|
options.debug = true // Enabled debug when first installing is always helpful
|
|
103
|
+
|
|
104
|
+
// Adds IP for users.
|
|
105
|
+
// For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/
|
|
106
|
+
options.sendDefaultPii = true
|
|
107
|
+
|
|
103
108
|
// Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
|
|
104
109
|
// We recommend adjusting this value in production.
|
|
105
110
|
options.tracesSampleRate = 1.0
|
|
@@ -127,6 +132,11 @@ fi
|
|
|
127
132
|
(0, vitest_1.expect)(snippet).toBe(` [SentrySDK startWithConfigureOptions:^(SentryOptions * options) {
|
|
128
133
|
options.dsn = @"test-dsn";
|
|
129
134
|
options.debug = YES; // Enabled debug when first installing is always helpful
|
|
135
|
+
|
|
136
|
+
// Adds IP for users.
|
|
137
|
+
// For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/
|
|
138
|
+
options.sendDefaultPii = YES;
|
|
139
|
+
|
|
130
140
|
// Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
|
|
131
141
|
// We recommend adjusting this value in production.
|
|
132
142
|
options.tracesSampleRate = @1.0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/apple/templates.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,yDAMmC;AAEnC,IAAA,iBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,MAAM,UAAU,GAIV;YACJ;gBACE,YAAY,EAAE,IAAI;gBAClB,mBAAmB,EAAE,IAAI;gBACzB,cAAc,EACZ;;;;;;;;;;;;;;CAcT,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aAChB;YACD;gBACE,YAAY,EAAE,IAAI;gBAClB,mBAAmB,EAAE,KAAK;gBAC1B,cAAc,EACZ;;;;;;;;;;;CAWT,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aAChB;YACD;gBACE,YAAY,EAAE,KAAK;gBACnB,mBAAmB,EAAE,IAAI;gBACzB,cAAc,EACZ;;;;;;;;;;;;;;CAcT,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aAChB;YACD;gBACE,YAAY,EAAE,KAAK;gBACnB,mBAAmB,EAAE,KAAK;gBAC1B,cAAc,EACZ;;;;;;;;;;;CAWT,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aAChB;SACF,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,IAAA,iBAAQ,EAAC,iBAAiB,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,6BAA6B,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE;gBACvI,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;oBAC1C,WAAW;oBACX,MAAM,MAAM,GAAG,IAAA,gCAAoB,EACjC,UAAU,EACV,cAAc,EACd,SAAS,CAAC,YAAY,EACtB,SAAS,CAAC,mBAAmB,CAC9B,CAAC;oBAEF,eAAe;oBACf,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;SACJ;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,IAAA,eAAM,EAAC,2BAAe,CAAC,CAAC,IAAI,CAC1B,6FAA6F,CAC9F,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,gBAAgB;YAChB,MAAM,OAAO,GAAG,IAAA,2BAAe,EAAC,UAAU,CAAC,CAAC;YAE5C,eAAe;YACf,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,IAAI,CAClB
|
|
1
|
+
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/apple/templates.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest';\nimport {\n getFastlaneSnippet,\n getObjcSnippet,\n getRunScriptTemplate,\n getSwiftSnippet,\n scriptInputPath,\n} from '../../src/apple/templates';\n\ndescribe('templates', () => {\n describe('getRunScriptTemplate', () => {\n const variations: {\n uploadSource: boolean;\n includeHomebrewPath: boolean;\n expectedScript: string;\n }[] = [\n {\n uploadSource: true,\n includeHomebrewPath: true,\n expectedScript:\n `# This script is responsible for uploading debug symbols and source context for Sentry.\nif [[ \"$(uname -m)\" == arm64 ]]; then\nexport PATH=\"/opt/homebrew/bin:$PATH\"\nfi\nif which sentry-cli >/dev/null; then\nexport SENTRY_ORG=test-org\nexport SENTRY_PROJECT=test-project\nERROR=$(sentry-cli debug-files upload --include-sources \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n`.replace(/\\n/g, '\\\\n'),\n },\n {\n uploadSource: true,\n includeHomebrewPath: false,\n expectedScript:\n `# This script is responsible for uploading debug symbols and source context for Sentry.\nif which sentry-cli >/dev/null; then\nexport SENTRY_ORG=test-org\nexport SENTRY_PROJECT=test-project\nERROR=$(sentry-cli debug-files upload --include-sources \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n`.replace(/\\n/g, '\\\\n'),\n },\n {\n uploadSource: false,\n includeHomebrewPath: true,\n expectedScript:\n `# This script is responsible for uploading debug symbols and source context for Sentry.\nif [[ \"$(uname -m)\" == arm64 ]]; then\nexport PATH=\"/opt/homebrew/bin:$PATH\"\nfi\nif which sentry-cli >/dev/null; then\nexport SENTRY_ORG=test-org\nexport SENTRY_PROJECT=test-project\nERROR=$(sentry-cli debug-files upload \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n`.replace(/\\n/g, '\\\\n'),\n },\n {\n uploadSource: false,\n includeHomebrewPath: false,\n expectedScript:\n `# This script is responsible for uploading debug symbols and source context for Sentry.\nif which sentry-cli >/dev/null; then\nexport SENTRY_ORG=test-org\nexport SENTRY_PROJECT=test-project\nERROR=$(sentry-cli debug-files upload \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\nif [ ! $? -eq 0 ]; then\necho \"warning: sentry-cli - $ERROR\"\nfi\nelse\necho \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n`.replace(/\\n/g, '\\\\n'),\n },\n ];\n\n for (const variation of variations) {\n describe(`uploadSource: ${variation.uploadSource.toString()} and includeHomebrewPath: ${variation.includeHomebrewPath.toString()}`, () => {\n it('should return the correct script', () => {\n // -- ct --\n const script = getRunScriptTemplate(\n 'test-org',\n 'test-project',\n variation.uploadSource,\n variation.includeHomebrewPath,\n );\n\n // -- Assert --\n expect(script).toBe(variation.expectedScript);\n });\n });\n }\n });\n\n describe('scriptInputPath', () => {\n it('should return the correct path', () => {\n expect(scriptInputPath).toBe(\n '\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}\"',\n );\n });\n });\n\n describe('getSwiftSnippet', () => {\n it('should return the correct snippet', () => {\n // -- Arrange --\n const snippet = getSwiftSnippet('test-dsn');\n\n // -- Assert --\n expect(snippet).toBe(\n ` SentrySDK.start { options in\n options.dsn = \"test-dsn\"\n options.debug = true // Enabled debug when first installing is always helpful\n\n // Adds IP for users.\n // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/\n options.sendDefaultPii = true\n\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = 1.0\n\n // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more.\n options.configureProfiling = {\n $0.sessionSampleRate = 1.0 // We recommend adjusting this value in production.\n $0.lifecycle = .trace\n }\n\n // Uncomment the following lines to add more data to your events\n // options.attachScreenshot = true // This adds a screenshot to the error events\n // options.attachViewHierarchy = true // This adds the view hierarchy to the error events\n }\n // Remove the next line after confirming that your Sentry integration is working.\n SentrySDK.capture(message: \"This app uses Sentry! :)\")\n`,\n );\n });\n });\n\n describe('getObjcSnippet', () => {\n it('should return the correct snippet', () => {\n // -- Arrange --\n const snippet = getObjcSnippet('test-dsn');\n\n // -- Assert --\n expect(snippet).toBe(\n ` [SentrySDK startWithConfigureOptions:^(SentryOptions * options) {\n options.dsn = @\"test-dsn\";\n options.debug = YES; // Enabled debug when first installing is always helpful\n\n // Adds IP for users.\n // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/\n options.sendDefaultPii = YES;\n\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = @1.0;\n\n // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more.\n options.configureProfiling = ^(SentryProfileOptions *profiling) {\n profiling.sessionSampleRate = 1.0; // We recommend adjusting this value in production.\n profiling.lifecycle = SentryProfilingLifecycleTrace;\n };\n\n //Uncomment the following lines to add more data to your events\n //options.attachScreenshot = YES; //This will add a screenshot to the error events\n //options.attachViewHierarchy = YES; //This will add the view hierarchy to the error events\n }];\n //Remove the next line after confirming that your Sentry integration is working.\n [SentrySDK captureMessage:@\"This app uses Sentry!\"];\n`,\n );\n });\n });\n\n describe('getFastlaneSnippet', () => {\n it('should return the correct snippet', () => {\n // -- Arrange --\n const snippet = getFastlaneSnippet('test-org', 'test-project');\n\n // -- Assert --\n expect(snippet).toBe(\n ` sentry_cli(\n org_slug: 'test-org',\n project_slug: 'test-project',\n include_sources: true\n )`,\n );\n });\n });\n});\n"]}
|