@sentry/wizard 4.6.0 → 4.7.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/bin.js +9 -0
- package/dist/bin.js.map +1 -1
- package/dist/e2e-tests/tests/flutter.test.js +16 -16
- package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
- package/dist/e2e-tests/tests/help-message.test.d.ts +1 -0
- package/dist/e2e-tests/tests/help-message.test.js +56 -0
- package/dist/e2e-tests/tests/help-message.test.js.map +1 -0
- package/dist/e2e-tests/tests/nextjs-14.test.js +15 -15
- package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-15.test.js +15 -15
- package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-3.test.js +13 -12
- package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-4.test.js +13 -12
- package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
- package/dist/e2e-tests/tests/remix.test.js +20 -20
- package/dist/e2e-tests/tests/remix.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit.test.js +20 -20
- package/dist/e2e-tests/tests/sveltekit.test.js.map +1 -1
- package/dist/e2e-tests/utils/index.js +15 -11
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/lib/Constants.d.ts +5 -1
- package/dist/lib/Constants.js.map +1 -1
- package/dist/lib/Helper/Logging.d.ts +1 -1
- package/dist/lib/Helper/Logging.js.map +1 -1
- package/dist/lib/Helper/__tests__/File.js +9 -9
- package/dist/lib/Helper/__tests__/File.js.map +1 -1
- package/dist/lib/Helper/__tests__/MergeConfig.js +17 -17
- package/dist/lib/Helper/__tests__/MergeConfig.js.map +1 -1
- package/dist/lib/Helper/__tests__/SentryCli.js +23 -22
- package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
- package/dist/lib/Setup.d.ts +2 -1
- package/dist/lib/Setup.js +12 -2
- package/dist/lib/Setup.js.map +1 -1
- package/dist/lib/Steps/BaseStep.d.ts +1 -1
- package/dist/lib/Steps/BaseStep.js.map +1 -1
- package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
- package/dist/lib/Steps/Welcome.js +5 -0
- package/dist/lib/Steps/Welcome.js.map +1 -1
- package/dist/lib/__tests__/Env.js +4 -3
- package/dist/lib/__tests__/Env.js.map +1 -1
- package/dist/src/apple/apple-wizard.js +24 -64
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/apple/configure-package-manager.d.ts +5 -0
- package/dist/src/apple/configure-package-manager.js +68 -0
- package/dist/src/apple/configure-package-manager.js.map +1 -0
- package/dist/src/apple/configure-sentry-cli.d.ts +4 -0
- package/dist/src/apple/configure-sentry-cli.js +47 -0
- package/dist/src/apple/configure-sentry-cli.js.map +1 -0
- package/dist/src/apple/configure-xcode-project.d.ts +8 -0
- package/dist/src/apple/configure-xcode-project.js +11 -0
- package/dist/src/apple/configure-xcode-project.js.map +1 -0
- package/dist/src/apple/inject-code-snippet.d.ts +6 -0
- package/dist/src/apple/inject-code-snippet.js +54 -0
- package/dist/src/apple/inject-code-snippet.js.map +1 -0
- package/dist/src/apple/templates.js +11 -7
- package/dist/src/apple/templates.js.map +1 -1
- package/dist/src/apple/xcode-manager.js +3 -6
- package/dist/src/apple/xcode-manager.js.map +1 -1
- package/dist/src/nextjs/templates.js +3 -1
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/react-native/javascript.d.ts +6 -4
- package/dist/src/react-native/javascript.js +25 -9
- package/dist/src/react-native/javascript.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 +30 -5
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-native/xcode.d.ts +7 -3
- package/dist/src/react-native/xcode.js +64 -20
- package/dist/src/react-native/xcode.js.map +1 -1
- package/dist/src/run.js +2 -2
- package/dist/src/run.js.map +1 -1
- package/dist/src/utils/clack/index.js +3 -1
- package/dist/src/utils/clack/index.js.map +1 -1
- package/dist/src/utils/package-manager.d.ts +2 -0
- package/dist/src/utils/package-manager.js +55 -5
- package/dist/src/utils/package-manager.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/test/android/code-tools.test.js +13 -12
- package/dist/test/android/code-tools.test.js.map +1 -1
- package/dist/test/apple/cocoapod.test.js +77 -72
- package/dist/test/apple/cocoapod.test.js.map +1 -1
- package/dist/test/apple/code-tools.test.js +173 -166
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/fastfile.test.js +86 -83
- package/dist/test/apple/fastfile.test.js.map +1 -1
- package/dist/test/apple/templates.test.js +32 -27
- package/dist/test/apple/templates.test.js.map +1 -1
- package/dist/test/apple/xcode-manager.test.js +182 -183
- package/dist/test/apple/xcode-manager.test.js.map +1 -1
- package/dist/test/flutter/code-tools.test.js +29 -28
- package/dist/test/flutter/code-tools.test.js.map +1 -1
- package/dist/test/flutter/templates.test.js +15 -14
- package/dist/test/flutter/templates.test.js.map +1 -1
- package/dist/test/nextjs/templates.test.js +43 -36
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/nuxt/templates.test.js +25 -24
- package/dist/test/nuxt/templates.test.js.map +1 -1
- package/dist/test/react-native/expo-metro.test.js +11 -10
- package/dist/test/react-native/expo-metro.test.js.map +1 -1
- package/dist/test/react-native/expo.test.js +11 -10
- package/dist/test/react-native/expo.test.js.map +1 -1
- package/dist/test/react-native/gradle.test.js +27 -26
- package/dist/test/react-native/gradle.test.js.map +1 -1
- package/dist/test/react-native/javascript.test.js +108 -58
- package/dist/test/react-native/javascript.test.js.map +1 -1
- package/dist/test/react-native/metro.test.js +65 -64
- package/dist/test/react-native/metro.test.js.map +1 -1
- package/dist/test/react-native/xcode.test.js +138 -37
- package/dist/test/react-native/xcode.test.js.map +1 -1
- package/dist/test/remix/client-entry.test.js +8 -7
- package/dist/test/remix/client-entry.test.js.map +1 -1
- package/dist/test/remix/server-instrumentation.test.js +6 -5
- package/dist/test/remix/server-instrumentation.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/sentry-cli.test.js +20 -20
- package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/tsc.test.js +13 -14
- package/dist/test/sourcemaps/tools/tsc.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/vite.test.js +13 -14
- package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/webpack.test.js +19 -20
- package/dist/test/sourcemaps/tools/webpack.test.js.map +1 -1
- package/dist/test/sveltekit/templates.test.js +13 -12
- package/dist/test/sveltekit/templates.test.js.map +1 -1
- package/dist/test/utils/ast-utils.test.js +45 -44
- package/dist/test/utils/ast-utils.test.js.map +1 -1
- package/dist/test/utils/clack/index.test.js +140 -144
- package/dist/test/utils/clack/index.test.js.map +1 -1
- package/dist/test/utils/package-manager.test.js +8 -7
- package/dist/test/utils/package-manager.test.js.map +1 -1
- package/package.json +10 -38
- package/dist/e2e-tests/jest.config.d.ts +0 -17
- package/dist/e2e-tests/jest.config.js +0 -23
- package/dist/e2e-tests/jest.config.js.map +0 -1
|
@@ -35,120 +35,121 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
35
35
|
// @ts-expect-error - clack is ESM and TS complains about that. It works though
|
|
36
36
|
const clack = __importStar(require("@clack/prompts"));
|
|
37
37
|
const Sentry = __importStar(require("@sentry/node"));
|
|
38
|
-
|
|
38
|
+
const vitest_1 = require("vitest");
|
|
39
|
+
vitest_1.vi.mock('node:child_process', async () => ({
|
|
39
40
|
__esModule: true,
|
|
40
|
-
...
|
|
41
|
+
...(await vitest_1.vi.importActual('node:child_process')),
|
|
41
42
|
}));
|
|
42
|
-
|
|
43
|
+
vitest_1.vi.mock('@clack/prompts', () => ({
|
|
43
44
|
log: {
|
|
44
|
-
info:
|
|
45
|
-
success:
|
|
46
|
-
warn:
|
|
47
|
-
error:
|
|
45
|
+
info: vitest_1.vi.fn(),
|
|
46
|
+
success: vitest_1.vi.fn(),
|
|
47
|
+
warn: vitest_1.vi.fn(),
|
|
48
|
+
error: vitest_1.vi.fn(),
|
|
48
49
|
},
|
|
49
|
-
outro:
|
|
50
|
-
text:
|
|
51
|
-
confirm:
|
|
52
|
-
cancel:
|
|
50
|
+
outro: vitest_1.vi.fn(),
|
|
51
|
+
text: vitest_1.vi.fn(),
|
|
52
|
+
confirm: vitest_1.vi.fn(),
|
|
53
|
+
cancel: vitest_1.vi.fn(),
|
|
53
54
|
// passthrough for abortIfCancelled
|
|
54
|
-
isCancel:
|
|
55
|
-
spinner:
|
|
55
|
+
isCancel: vitest_1.vi.fn().mockReturnValue(false),
|
|
56
|
+
spinner: vitest_1.vi
|
|
56
57
|
.fn()
|
|
57
|
-
.mockImplementation(() => ({ start:
|
|
58
|
-
select:
|
|
58
|
+
.mockImplementation(() => ({ start: vitest_1.vi.fn(), stop: vitest_1.vi.fn() })),
|
|
59
|
+
select: vitest_1.vi.fn(),
|
|
59
60
|
}));
|
|
60
61
|
const clackMock = clack;
|
|
61
|
-
|
|
62
|
+
vitest_1.vi.mock('axios');
|
|
62
63
|
const mockedAxios = axios_1.default;
|
|
63
|
-
|
|
64
|
+
vitest_1.vi.mock('opn', () => ({
|
|
65
|
+
default: vitest_1.vi.fn(() => Promise.resolve({ on: vitest_1.vi.fn() })),
|
|
66
|
+
}));
|
|
64
67
|
function mockUserResponse(fn, response) {
|
|
65
68
|
fn.mockReturnValueOnce(response);
|
|
66
69
|
}
|
|
67
|
-
describe('askForToolConfigPath', () => {
|
|
68
|
-
afterEach(() => {
|
|
69
|
-
|
|
70
|
+
(0, vitest_1.describe)('askForToolConfigPath', () => {
|
|
71
|
+
(0, vitest_1.afterEach)(() => {
|
|
72
|
+
vitest_1.vi.clearAllMocks();
|
|
70
73
|
});
|
|
71
|
-
it('returns undefined if users have no config file', async () => {
|
|
74
|
+
(0, vitest_1.it)('returns undefined if users have no config file', async () => {
|
|
72
75
|
mockUserResponse(clack.confirm, false);
|
|
73
76
|
const result = await (0, clack_1.askForToolConfigPath)('Webpack', 'webpack.config.js');
|
|
74
|
-
expect(clack.confirm).toHaveBeenCalledWith(expect.objectContaining({
|
|
77
|
+
(0, vitest_1.expect)(clack.confirm).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
75
78
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
76
|
-
message: expect.stringContaining('have a Webpack config file'),
|
|
79
|
+
message: vitest_1.expect.stringContaining('have a Webpack config file'),
|
|
77
80
|
}));
|
|
78
|
-
expect(result).toBeUndefined();
|
|
81
|
+
(0, vitest_1.expect)(result).toBeUndefined();
|
|
79
82
|
});
|
|
80
|
-
it('returns the path if users have a config file and the entered path is valid', async () => {
|
|
83
|
+
(0, vitest_1.it)('returns the path if users have a config file and the entered path is valid', async () => {
|
|
81
84
|
mockUserResponse(clack.confirm, true);
|
|
82
85
|
mockUserResponse(clack.text, 'my.webpack.config.js');
|
|
83
86
|
const result = await (0, clack_1.askForToolConfigPath)('Webpack', 'webpack.config.js');
|
|
84
|
-
expect(clack.confirm).toHaveBeenCalledWith(expect.objectContaining({
|
|
87
|
+
(0, vitest_1.expect)(clack.confirm).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
85
88
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
86
|
-
message: expect.stringContaining('have a Webpack config file'),
|
|
89
|
+
message: vitest_1.expect.stringContaining('have a Webpack config file'),
|
|
87
90
|
}));
|
|
88
|
-
expect(clack.text).toHaveBeenCalledWith(expect.objectContaining({
|
|
91
|
+
(0, vitest_1.expect)(clack.text).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
89
92
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
90
|
-
message: expect.stringContaining('enter the path to your Webpack config file'),
|
|
93
|
+
message: vitest_1.expect.stringContaining('enter the path to your Webpack config file'),
|
|
91
94
|
}));
|
|
92
|
-
expect(result).toBe('my.webpack.config.js');
|
|
95
|
+
(0, vitest_1.expect)(result).toBe('my.webpack.config.js');
|
|
93
96
|
});
|
|
94
97
|
});
|
|
95
|
-
describe('createNewConfigFile', () => {
|
|
96
|
-
afterEach(() => {
|
|
97
|
-
|
|
98
|
+
(0, vitest_1.describe)('createNewConfigFile', () => {
|
|
99
|
+
(0, vitest_1.afterEach)(() => {
|
|
100
|
+
vitest_1.vi.clearAllMocks();
|
|
98
101
|
});
|
|
99
|
-
it('writes the file to disk and returns true if the file was created successfully', async () => {
|
|
100
|
-
const writeFileSpy =
|
|
102
|
+
(0, vitest_1.it)('writes the file to disk and returns true if the file was created successfully', async () => {
|
|
103
|
+
const writeFileSpy = vitest_1.vi
|
|
101
104
|
.spyOn(fs.promises, 'writeFile')
|
|
102
|
-
.mockImplementation(
|
|
105
|
+
.mockImplementation(vitest_1.vi.fn());
|
|
103
106
|
const filename = '/webpack.config.js';
|
|
104
107
|
const code = 'module.exports = {/*config...*/}';
|
|
105
108
|
const result = await (0, clack_1.createNewConfigFile)(filename, code);
|
|
106
|
-
expect(result).toBe(true);
|
|
107
|
-
expect(writeFileSpy).toHaveBeenCalledWith(filename, code);
|
|
109
|
+
(0, vitest_1.expect)(result).toBe(true);
|
|
110
|
+
(0, vitest_1.expect)(writeFileSpy).toHaveBeenCalledWith(filename, code);
|
|
108
111
|
});
|
|
109
|
-
it('logs more information if provided as an argument', async () => {
|
|
110
|
-
|
|
112
|
+
(0, vitest_1.it)('logs more information if provided as an argument', async () => {
|
|
113
|
+
vitest_1.vi.spyOn(fs.promises, 'writeFile').mockImplementation(vitest_1.vi.fn());
|
|
111
114
|
const filename = '/webpack.config.js';
|
|
112
115
|
const code = 'module.exports = {/*config...*/}';
|
|
113
116
|
const moreInfo = 'More information...';
|
|
114
117
|
await (0, clack_1.createNewConfigFile)(filename, code, moreInfo);
|
|
115
|
-
expect(clack.log.info).toHaveBeenCalledTimes(1);
|
|
116
|
-
expect(clack.log.info).toHaveBeenCalledWith(expect.stringContaining(moreInfo));
|
|
118
|
+
(0, vitest_1.expect)(clack.log.info).toHaveBeenCalledTimes(1);
|
|
119
|
+
(0, vitest_1.expect)(clack.log.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining(moreInfo));
|
|
117
120
|
});
|
|
118
|
-
it('returns false and logs a warning if the file could not be created', async () => {
|
|
119
|
-
const writeFileSpy =
|
|
121
|
+
(0, vitest_1.it)('returns false and logs a warning if the file could not be created', async () => {
|
|
122
|
+
const writeFileSpy = vitest_1.vi
|
|
120
123
|
.spyOn(fs.promises, 'writeFile')
|
|
121
124
|
.mockImplementation(() => Promise.reject(new Error('Could not write')));
|
|
122
125
|
const filename = '/webpack.config.js';
|
|
123
126
|
const code = 'module.exports = {/*config...*/}';
|
|
124
127
|
const result = await (0, clack_1.createNewConfigFile)(filename, code);
|
|
125
|
-
expect(result).toBe(false);
|
|
126
|
-
expect(writeFileSpy).toHaveBeenCalledWith(filename, code);
|
|
127
|
-
expect(clack.log.warn).toHaveBeenCalledTimes(1);
|
|
128
|
+
(0, vitest_1.expect)(result).toBe(false);
|
|
129
|
+
(0, vitest_1.expect)(writeFileSpy).toHaveBeenCalledWith(filename, code);
|
|
130
|
+
(0, vitest_1.expect)(clack.log.warn).toHaveBeenCalledTimes(1);
|
|
128
131
|
});
|
|
129
|
-
it('returns false if the passed path is not absolute', async () => {
|
|
132
|
+
(0, vitest_1.it)('returns false if the passed path is not absolute', async () => {
|
|
130
133
|
const result = await (0, clack_1.createNewConfigFile)('./relative/webpack.config.js', '');
|
|
131
|
-
expect(result).toBe(false);
|
|
134
|
+
(0, vitest_1.expect)(result).toBe(false);
|
|
132
135
|
});
|
|
133
136
|
});
|
|
134
|
-
describe('installPackage', () => {
|
|
135
|
-
afterEach(() => {
|
|
136
|
-
|
|
137
|
+
(0, vitest_1.describe)('installPackage', () => {
|
|
138
|
+
(0, vitest_1.afterEach)(() => {
|
|
139
|
+
vitest_1.vi.clearAllMocks();
|
|
137
140
|
});
|
|
138
|
-
const spawnSpy =
|
|
139
|
-
.spyOn(ChildProcess, 'spawn')
|
|
140
|
-
// @ts-expect-error - ignoring complete typing
|
|
141
|
-
.mockImplementation(() => ({
|
|
141
|
+
const spawnSpy = vitest_1.vi.spyOn(ChildProcess, 'spawn').mockImplementation(() => ({
|
|
142
142
|
// @ts-expect-error - not passing the full object but directly resolving
|
|
143
143
|
// to simulate a successful install
|
|
144
|
-
on:
|
|
144
|
+
on: vitest_1.vi.fn((evt, cb) => {
|
|
145
145
|
if (evt === 'close') {
|
|
146
146
|
cb(0);
|
|
147
147
|
}
|
|
148
148
|
}),
|
|
149
|
-
|
|
149
|
+
// @ts-expect-error - this is fine
|
|
150
|
+
stderr: { on: vitest_1.vi.fn() },
|
|
150
151
|
}));
|
|
151
|
-
it('force-installs a package if the forceInstall flag is set', async () => {
|
|
152
|
+
(0, vitest_1.it)('force-installs a package if the forceInstall flag is set', async () => {
|
|
152
153
|
const packageManagerMock = {
|
|
153
154
|
name: 'npm',
|
|
154
155
|
label: 'NPM',
|
|
@@ -157,8 +158,8 @@ describe('installPackage', () => {
|
|
|
157
158
|
runScriptCommand: 'npm run',
|
|
158
159
|
flags: '',
|
|
159
160
|
forceInstallFlag: '--force',
|
|
160
|
-
detect:
|
|
161
|
-
addOverride:
|
|
161
|
+
detect: vitest_1.vi.fn(),
|
|
162
|
+
addOverride: vitest_1.vi.fn(),
|
|
162
163
|
};
|
|
163
164
|
await (0, clack_1.installPackage)({
|
|
164
165
|
alreadyInstalled: false,
|
|
@@ -168,9 +169,9 @@ describe('installPackage', () => {
|
|
|
168
169
|
askBeforeUpdating: false,
|
|
169
170
|
packageManager: packageManagerMock,
|
|
170
171
|
});
|
|
171
|
-
expect(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@some/package', '--force'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
|
|
172
|
+
(0, vitest_1.expect)(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@some/package', '--force'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
|
|
172
173
|
});
|
|
173
|
-
it.each([false, undefined])("doesn't force-install a package if the forceInstall flag is %s", async (flag) => {
|
|
174
|
+
vitest_1.it.each([false, undefined])("doesn't force-install a package if the forceInstall flag is %s", async (flag) => {
|
|
174
175
|
const packageManagerMock = {
|
|
175
176
|
name: 'npm',
|
|
176
177
|
label: 'NPM',
|
|
@@ -179,8 +180,8 @@ describe('installPackage', () => {
|
|
|
179
180
|
runScriptCommand: 'npm run',
|
|
180
181
|
flags: '',
|
|
181
182
|
forceInstallFlag: '--force',
|
|
182
|
-
detect:
|
|
183
|
-
addOverride:
|
|
183
|
+
detect: vitest_1.vi.fn(),
|
|
184
|
+
addOverride: vitest_1.vi.fn(),
|
|
184
185
|
};
|
|
185
186
|
await (0, clack_1.installPackage)({
|
|
186
187
|
alreadyInstalled: false,
|
|
@@ -190,9 +191,9 @@ describe('installPackage', () => {
|
|
|
190
191
|
askBeforeUpdating: false,
|
|
191
192
|
packageManager: packageManagerMock,
|
|
192
193
|
});
|
|
193
|
-
expect(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@sentry/sveltekit'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
|
|
194
|
+
(0, vitest_1.expect)(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@sentry/sveltekit'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
|
|
194
195
|
});
|
|
195
|
-
it('adds install flags if defined', async () => {
|
|
196
|
+
(0, vitest_1.it)('adds install flags if defined', async () => {
|
|
196
197
|
const packageManagerMock = {
|
|
197
198
|
name: 'npm',
|
|
198
199
|
label: 'NPM',
|
|
@@ -201,8 +202,8 @@ describe('installPackage', () => {
|
|
|
201
202
|
runScriptCommand: 'npm run',
|
|
202
203
|
flags: '--ignore-workspace-root-check',
|
|
203
204
|
forceInstallFlag: '--force',
|
|
204
|
-
detect:
|
|
205
|
-
addOverride:
|
|
205
|
+
detect: vitest_1.vi.fn(),
|
|
206
|
+
addOverride: vitest_1.vi.fn(),
|
|
206
207
|
};
|
|
207
208
|
await (0, clack_1.installPackage)({
|
|
208
209
|
alreadyInstalled: false,
|
|
@@ -212,23 +213,18 @@ describe('installPackage', () => {
|
|
|
212
213
|
askBeforeUpdating: false,
|
|
213
214
|
packageManager: packageManagerMock,
|
|
214
215
|
});
|
|
215
|
-
expect(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@some/package', '--ignore-workspace-root-check', '--force'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
|
|
216
|
+
(0, vitest_1.expect)(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@some/package', '--ignore-workspace-root-check', '--force'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
|
|
216
217
|
});
|
|
217
218
|
});
|
|
218
|
-
describe('askForWizardLogin', () => {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
// clackMock.confirm.mockClear();
|
|
222
|
-
// mockUserResponse(clack.confirm as jest.Mock, undefined);
|
|
223
|
-
});
|
|
224
|
-
beforeEach(() => {
|
|
225
|
-
jest.clearAllMocks();
|
|
219
|
+
(0, vitest_1.describe)('askForWizardLogin', () => {
|
|
220
|
+
(0, vitest_1.beforeEach)(() => {
|
|
221
|
+
vitest_1.vi.clearAllMocks();
|
|
226
222
|
mockedAxios.get.mockClear();
|
|
227
223
|
clackMock.confirm.mockClear();
|
|
228
224
|
clackMock.confirm.mockReset();
|
|
229
225
|
mockUserResponse(clack.confirm, undefined);
|
|
230
226
|
});
|
|
231
|
-
it('asks if a user already has a Sentry account by default', async () => {
|
|
227
|
+
(0, vitest_1.it)('asks if a user already has a Sentry account by default', async () => {
|
|
232
228
|
mockUserResponse(clack.confirm, Promise.resolve(true));
|
|
233
229
|
// Provide the data object to be returned
|
|
234
230
|
mockedAxios.get.mockResolvedValue({
|
|
@@ -237,12 +233,12 @@ describe('askForWizardLogin', () => {
|
|
|
237
233
|
},
|
|
238
234
|
});
|
|
239
235
|
await (0, clack_1.askForWizardLogin)({ url: 'https://santry.io/' });
|
|
240
|
-
expect(clack.confirm).toHaveBeenCalledWith(expect.objectContaining({
|
|
236
|
+
(0, vitest_1.expect)(clack.confirm).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
241
237
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
242
|
-
message: expect.stringContaining('already have a Sentry account'),
|
|
238
|
+
message: vitest_1.expect.stringContaining('already have a Sentry account'),
|
|
243
239
|
}));
|
|
244
240
|
});
|
|
245
|
-
it('skips asking for if a user already has a Sentry account if org and project are pre-selected', async () => {
|
|
241
|
+
(0, vitest_1.it)('skips asking for if a user already has a Sentry account if org and project are pre-selected', async () => {
|
|
246
242
|
mockUserResponse(clackMock.confirm, Promise.resolve(true));
|
|
247
243
|
// Provide the data object to be returned
|
|
248
244
|
mockedAxios.get.mockResolvedValue({
|
|
@@ -255,124 +251,124 @@ describe('askForWizardLogin', () => {
|
|
|
255
251
|
orgSlug: 'my-org',
|
|
256
252
|
projectSlug: 'my-project',
|
|
257
253
|
});
|
|
258
|
-
expect(clack.confirm).not.toHaveBeenCalled();
|
|
254
|
+
(0, vitest_1.expect)(clack.confirm).not.toHaveBeenCalled();
|
|
259
255
|
});
|
|
260
256
|
});
|
|
261
|
-
describe('abort', () => {
|
|
257
|
+
(0, vitest_1.describe)('abort', () => {
|
|
262
258
|
const sentryTxn = {
|
|
263
|
-
setStatus:
|
|
264
|
-
finish:
|
|
259
|
+
setStatus: vitest_1.vi.fn(),
|
|
260
|
+
finish: vitest_1.vi.fn(),
|
|
265
261
|
};
|
|
266
262
|
let sentrySession = {
|
|
267
263
|
status: 999,
|
|
268
264
|
};
|
|
269
|
-
beforeEach(() => {
|
|
270
|
-
|
|
265
|
+
(0, vitest_1.beforeEach)(() => {
|
|
266
|
+
vitest_1.vi.clearAllMocks();
|
|
271
267
|
sentrySession = {
|
|
272
268
|
status: 999,
|
|
273
269
|
};
|
|
274
270
|
});
|
|
275
|
-
|
|
271
|
+
vitest_1.vi.spyOn(Sentry, 'getCurrentHub').mockReturnValue({
|
|
276
272
|
getScope: () => ({
|
|
277
273
|
// @ts-expect-error - don't care about the rest of the required props value
|
|
278
274
|
getTransaction: () => sentryTxn,
|
|
279
275
|
// @ts-expect-error - don't care about the rest of the required props value
|
|
280
276
|
getSession: () => sentrySession,
|
|
281
277
|
}),
|
|
282
|
-
captureSession:
|
|
278
|
+
captureSession: vitest_1.vi.fn(),
|
|
283
279
|
});
|
|
284
|
-
const flushSpy =
|
|
285
|
-
|
|
286
|
-
it('ends the process with an error exit code by default', async () => {
|
|
287
|
-
// @ts-expect-error -
|
|
280
|
+
const flushSpy = vitest_1.vi.fn();
|
|
281
|
+
vitest_1.vi.spyOn(Sentry, 'flush').mockImplementation(flushSpy);
|
|
282
|
+
(0, vitest_1.it)('ends the process with an error exit code by default', async () => {
|
|
283
|
+
// @ts-expect-error - vitest doesn't like the empty function
|
|
288
284
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
289
|
-
const exitSpy =
|
|
285
|
+
const exitSpy = vitest_1.vi.spyOn(process, 'exit').mockImplementation(() => { });
|
|
290
286
|
await (0, clack_1.abort)();
|
|
291
|
-
expect(exitSpy).toHaveBeenCalledWith(1);
|
|
292
|
-
expect(clackMock.outro).toHaveBeenCalledTimes(1);
|
|
293
|
-
expect(clackMock.outro).toHaveBeenCalledWith('Wizard setup cancelled.');
|
|
294
|
-
expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('aborted');
|
|
295
|
-
expect(sentryTxn.finish).toHaveBeenCalledTimes(1);
|
|
296
|
-
expect(sentrySession.status).toBe('crashed');
|
|
297
|
-
expect(flushSpy).toHaveBeenLastCalledWith(3000);
|
|
287
|
+
(0, vitest_1.expect)(exitSpy).toHaveBeenCalledWith(1);
|
|
288
|
+
(0, vitest_1.expect)(clackMock.outro).toHaveBeenCalledTimes(1);
|
|
289
|
+
(0, vitest_1.expect)(clackMock.outro).toHaveBeenCalledWith('Wizard setup cancelled.');
|
|
290
|
+
(0, vitest_1.expect)(sentryTxn.setStatus).toHaveBeenLastCalledWith('aborted');
|
|
291
|
+
(0, vitest_1.expect)(sentryTxn.finish).toHaveBeenCalledTimes(1);
|
|
292
|
+
(0, vitest_1.expect)(sentrySession.status).toBe('crashed');
|
|
293
|
+
(0, vitest_1.expect)(flushSpy).toHaveBeenLastCalledWith(3000);
|
|
298
294
|
});
|
|
299
|
-
it('ends the process with a custom exit code and message if provided', async () => {
|
|
300
|
-
// @ts-expect-error -
|
|
295
|
+
(0, vitest_1.it)('ends the process with a custom exit code and message if provided', async () => {
|
|
296
|
+
// @ts-expect-error - vitest doesn't like the empty function
|
|
301
297
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
302
|
-
const exitSpy =
|
|
298
|
+
const exitSpy = vitest_1.vi.spyOn(process, 'exit').mockImplementation(() => { });
|
|
303
299
|
await (0, clack_1.abort)('Bye', 0);
|
|
304
|
-
expect(exitSpy).toHaveBeenCalledWith(0);
|
|
305
|
-
expect(clackMock.outro).toHaveBeenCalledTimes(1);
|
|
306
|
-
expect(clackMock.outro).toHaveBeenCalledWith('Bye');
|
|
307
|
-
expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('cancelled');
|
|
308
|
-
expect(sentryTxn.finish).toHaveBeenCalledTimes(1);
|
|
309
|
-
expect(sentrySession.status).toBe('abnormal');
|
|
310
|
-
expect(flushSpy).toHaveBeenLastCalledWith(3000);
|
|
300
|
+
(0, vitest_1.expect)(exitSpy).toHaveBeenCalledWith(0);
|
|
301
|
+
(0, vitest_1.expect)(clackMock.outro).toHaveBeenCalledTimes(1);
|
|
302
|
+
(0, vitest_1.expect)(clackMock.outro).toHaveBeenCalledWith('Bye');
|
|
303
|
+
(0, vitest_1.expect)(sentryTxn.setStatus).toHaveBeenLastCalledWith('cancelled');
|
|
304
|
+
(0, vitest_1.expect)(sentryTxn.finish).toHaveBeenCalledTimes(1);
|
|
305
|
+
(0, vitest_1.expect)(sentrySession.status).toBe('abnormal');
|
|
306
|
+
(0, vitest_1.expect)(flushSpy).toHaveBeenLastCalledWith(3000);
|
|
311
307
|
});
|
|
312
308
|
});
|
|
313
|
-
describe('getPackageManager', () => {
|
|
314
|
-
afterEach(() => {
|
|
315
|
-
|
|
309
|
+
(0, vitest_1.describe)('getPackageManager', () => {
|
|
310
|
+
(0, vitest_1.afterEach)(() => {
|
|
311
|
+
vitest_1.vi.clearAllMocks();
|
|
316
312
|
// @ts-expect-error - this variable is set by the wizard
|
|
317
313
|
delete global.__sentry_wizard_cached_package_manager;
|
|
318
314
|
});
|
|
319
|
-
it('returns the auto-detected package manager', async () => {
|
|
320
|
-
const detectPacManSpy =
|
|
315
|
+
(0, vitest_1.it)('returns the auto-detected package manager', async () => {
|
|
316
|
+
const detectPacManSpy = vitest_1.vi
|
|
321
317
|
.spyOn(PackageManagerUtils, '_detectPackageManger')
|
|
322
318
|
.mockReturnValueOnce(package_manager_1.YARN_V1);
|
|
323
319
|
const packageManager = await (0, clack_1.getPackageManager)();
|
|
324
|
-
expect(detectPacManSpy).toHaveBeenCalledTimes(1);
|
|
325
|
-
expect(packageManager).toBe(package_manager_1.YARN_V1);
|
|
320
|
+
(0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(1);
|
|
321
|
+
(0, vitest_1.expect)(packageManager).toBe(package_manager_1.YARN_V1);
|
|
326
322
|
});
|
|
327
|
-
it('caches the auto-detected package manager', async () => {
|
|
328
|
-
const detectPacManSpy =
|
|
323
|
+
(0, vitest_1.it)('caches the auto-detected package manager', async () => {
|
|
324
|
+
const detectPacManSpy = vitest_1.vi
|
|
329
325
|
.spyOn(PackageManagerUtils, '_detectPackageManger')
|
|
330
326
|
.mockReturnValueOnce(package_manager_1.YARN_V1);
|
|
331
327
|
const packageManager1 = await (0, clack_1.getPackageManager)();
|
|
332
328
|
const packageManager2 = await (0, clack_1.getPackageManager)();
|
|
333
|
-
expect(detectPacManSpy).toHaveBeenCalledTimes(1);
|
|
334
|
-
expect(packageManager1).toBe(package_manager_1.YARN_V1);
|
|
335
|
-
expect(packageManager2).toBe(package_manager_1.YARN_V1);
|
|
329
|
+
(0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(1);
|
|
330
|
+
(0, vitest_1.expect)(packageManager1).toBe(package_manager_1.YARN_V1);
|
|
331
|
+
(0, vitest_1.expect)(packageManager2).toBe(package_manager_1.YARN_V1);
|
|
336
332
|
});
|
|
337
|
-
describe('when auto detection fails', () => {
|
|
338
|
-
it('returns a fallback package manager if fallback is specified', async () => {
|
|
339
|
-
const detectPacManSpy =
|
|
333
|
+
(0, vitest_1.describe)('when auto detection fails', () => {
|
|
334
|
+
(0, vitest_1.it)('returns a fallback package manager if fallback is specified', async () => {
|
|
335
|
+
const detectPacManSpy = vitest_1.vi
|
|
340
336
|
.spyOn(PackageManagerUtils, '_detectPackageManger')
|
|
341
337
|
.mockReturnValueOnce(null);
|
|
342
338
|
const packageManager = await (0, clack_1.getPackageManager)(package_manager_1.YARN_V2);
|
|
343
|
-
expect(detectPacManSpy).toHaveBeenCalledTimes(1);
|
|
344
|
-
expect(packageManager).toBe(package_manager_1.YARN_V2);
|
|
339
|
+
(0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(1);
|
|
340
|
+
(0, vitest_1.expect)(packageManager).toBe(package_manager_1.YARN_V2);
|
|
345
341
|
});
|
|
346
|
-
it("doesn't cache the fallback package manager", async () => {
|
|
347
|
-
const detectPacManSpy =
|
|
342
|
+
(0, vitest_1.it)("doesn't cache the fallback package manager", async () => {
|
|
343
|
+
const detectPacManSpy = vitest_1.vi
|
|
348
344
|
.spyOn(PackageManagerUtils, '_detectPackageManger')
|
|
349
345
|
.mockReturnValue(null);
|
|
350
346
|
const packageManager1 = await (0, clack_1.getPackageManager)(package_manager_1.YARN_V2);
|
|
351
347
|
const packageManager2 = await (0, clack_1.getPackageManager)(package_manager_1.NPM);
|
|
352
|
-
expect(detectPacManSpy).toHaveBeenCalledTimes(2);
|
|
353
|
-
expect(packageManager1).toBe(package_manager_1.YARN_V2);
|
|
354
|
-
expect(packageManager2).toBe(package_manager_1.NPM);
|
|
348
|
+
(0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(2);
|
|
349
|
+
(0, vitest_1.expect)(packageManager1).toBe(package_manager_1.YARN_V2);
|
|
350
|
+
(0, vitest_1.expect)(packageManager2).toBe(package_manager_1.NPM);
|
|
355
351
|
});
|
|
356
|
-
it('returns the user-selected package manager if no fallback is provided', async () => {
|
|
357
|
-
const detectPacManSpy =
|
|
352
|
+
(0, vitest_1.it)('returns the user-selected package manager if no fallback is provided', async () => {
|
|
353
|
+
const detectPacManSpy = vitest_1.vi
|
|
358
354
|
.spyOn(PackageManagerUtils, '_detectPackageManger')
|
|
359
355
|
.mockReturnValueOnce(null);
|
|
360
356
|
clackMock.select.mockReturnValueOnce(Promise.resolve(package_manager_1.PNPM));
|
|
361
357
|
const packageManager = await (0, clack_1.getPackageManager)();
|
|
362
|
-
expect(detectPacManSpy).toHaveBeenCalledTimes(1);
|
|
363
|
-
expect(packageManager).toBe(package_manager_1.PNPM);
|
|
358
|
+
(0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(1);
|
|
359
|
+
(0, vitest_1.expect)(packageManager).toBe(package_manager_1.PNPM);
|
|
364
360
|
});
|
|
365
|
-
it('caches the user-selected package manager', async () => {
|
|
366
|
-
const detectPacManSpy =
|
|
361
|
+
(0, vitest_1.it)('caches the user-selected package manager', async () => {
|
|
362
|
+
const detectPacManSpy = vitest_1.vi
|
|
367
363
|
.spyOn(PackageManagerUtils, '_detectPackageManger')
|
|
368
364
|
.mockReturnValueOnce(null);
|
|
369
365
|
clackMock.select.mockReturnValueOnce(Promise.resolve(package_manager_1.PNPM));
|
|
370
366
|
const packageManager1 = await (0, clack_1.getPackageManager)();
|
|
371
367
|
const packageManager2 = await (0, clack_1.getPackageManager)();
|
|
372
|
-
expect(detectPacManSpy).toHaveBeenCalledTimes(1);
|
|
373
|
-
expect(clackMock.select).toHaveBeenCalledTimes(1);
|
|
374
|
-
expect(packageManager1).toBe(package_manager_1.PNPM);
|
|
375
|
-
expect(packageManager2).toBe(package_manager_1.PNPM);
|
|
368
|
+
(0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(1);
|
|
369
|
+
(0, vitest_1.expect)(clackMock.select).toHaveBeenCalledTimes(1);
|
|
370
|
+
(0, vitest_1.expect)(packageManager1).toBe(package_manager_1.PNPM);
|
|
371
|
+
(0, vitest_1.expect)(packageManager2).toBe(package_manager_1.PNPM);
|
|
376
372
|
});
|
|
377
373
|
});
|
|
378
374
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../test/utils/clack/index.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAOmC;AAEnC,4CAA8B;AAC9B,iEAAmD;AAEnD,wFAA0E;AAE1E,wEAK4C;AAE5C,kDAA0B;AAE1B,+EAA+E;AAC/E,sDAAwC;AAExC,qDAAuC;AAEvC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,UAAU,EAAE,IAAI;IAChB,GAAG,IAAI,CAAC,aAAa,CAAsB,oBAAoB,CAAC;CACjE,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,GAAG,EAAE;QACH,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;QAClB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;KACjB;IACD,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACf,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;IAClB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,mCAAmC;IACnC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;IAC1C,OAAO,EAAE,IAAI;SACV,EAAE,EAAE;SACJ,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;CAClB,CAAC,CAAC,CAAC;AACJ,MAAM,SAAS,GAAG,KAAkC,CAAC;AAErD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnB,MAAM,WAAW,GAAG,eAAkC,CAAC;AAEvD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAE1E,SAAS,gBAAgB,CAAC,EAAa,EAAE,QAAiB;IACxD,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,gBAAgB,CAAC,KAAK,CAAC,OAAoB,EAAE,KAAK,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,EAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAE1E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC;YACtB,mEAAmE;YACnE,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC;SAC/D,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,gBAAgB,CAAC,KAAK,CAAC,OAAoB,EAAE,IAAI,CAAC,CAAC;QACnD,gBAAgB,CAAC,KAAK,CAAC,IAAiB,EAAE,sBAAsB,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,EAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAE1E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC;YACtB,mEAAmE;YACnE,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC;SAC/D,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACrC,MAAM,CAAC,gBAAgB,CAAC;YACtB,mEAAmE;YACnE,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAC9B,4CAA4C,CAC7C;SACF,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,YAAY,GAAG,IAAI;aACtB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;aAC/B,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAEjC,MAAM,QAAQ,GAAG,oBAAoB,CAAC;QACtC,MAAM,IAAI,GAAG,kCAAkC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAmB,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEzD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAEnE,MAAM,QAAQ,GAAG,oBAAoB,CAAC;QACtC,MAAM,IAAI,GAAG,kCAAkC,CAAC;QAChD,MAAM,QAAQ,GAAG,qBAAqB,CAAC;QAEvC,MAAM,IAAA,2BAAmB,EAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEpD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACzC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,YAAY,GAAG,IAAI;aACtB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;aAC/B,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAE1E,MAAM,QAAQ,GAAG,oBAAoB,CAAC;QACtC,MAAM,IAAI,GAAG,kCAAkC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAmB,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEzD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAmB,EACtC,8BAA8B,EAC9B,EAAE,CACH,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI;SAClB,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC;QAC7B,8CAA8C;SAC7C,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QACzB,wEAAwE;QACxE,mCAAmC;QACnC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,GAAY,EAAE,EAAkB,EAAE,EAAE;YAC/C,IAAI,GAAG,KAAK,OAAO,EAAE;gBACnB,EAAE,CAAC,CAAC,CAAC,CAAC;aACP;QACH,CAAC,CAAC;QACF,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE;KAC1B,CAAC,CAAC,CAAC;IAEN,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,kBAAkB,GAAmB;YACzC,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,KAAK;YACZ,cAAc,EAAE,SAAS;YACzB,YAAY,EAAE,eAAe;YAC7B,gBAAgB,EAAE,SAAS;YAC3B,KAAK,EAAE,EAAE;YACT,gBAAgB,EAAE,SAAS;YAC3B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YACjB,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;SACvB,CAAC;QAEF,MAAM,IAAA,sBAAc,EAAC;YACnB,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,eAAe;YAC5B,uBAAuB,EAAE,eAAe;YACxC,YAAY,EAAE,IAAI;YAClB,iBAAiB,EAAE,KAAK;YACxB,cAAc,EAAE,kBAAkB;SACnC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,KAAK,EACL,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,EACvC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CACzB,gEAAgE,EAChE,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,kBAAkB,GAAmB;YACzC,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,KAAK;YACZ,cAAc,EAAE,SAAS;YACzB,YAAY,EAAE,eAAe;YAC7B,gBAAgB,EAAE,SAAS;YAC3B,KAAK,EAAE,EAAE;YACT,gBAAgB,EAAE,SAAS;YAC3B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YACjB,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;SACvB,CAAC;QAEF,MAAM,IAAA,sBAAc,EAAC;YACnB,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,mBAAmB;YAChC,uBAAuB,EAAE,mBAAmB;YAC5C,YAAY,EAAE,IAAI;YAClB,iBAAiB,EAAE,KAAK;YACxB,cAAc,EAAE,kBAAkB;SACnC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,KAAK,EACL,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAChC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,kBAAkB,GAAmB;YACzC,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,KAAK;YACZ,cAAc,EAAE,SAAS;YACzB,YAAY,EAAE,eAAe;YAC7B,gBAAgB,EAAE,SAAS;YAC3B,KAAK,EAAE,+BAA+B;YACtC,gBAAgB,EAAE,SAAS;YAC3B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YACjB,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;SACvB,CAAC;QAEF,MAAM,IAAA,sBAAc,EAAC;YACnB,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,eAAe;YAC5B,uBAAuB,EAAE,eAAe;YACxC,YAAY,EAAE,IAAI;YAClB,iBAAiB,EAAE,KAAK;YACxB,cAAc,EAAE,kBAAkB;SACnC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,KAAK,EAEL,CAAC,SAAS,EAAE,eAAe,EAAE,+BAA+B,EAAE,SAAS,CAAC,EACxE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,aAAa;IACb,SAAS,CAAC,GAAG,EAAE;QACb,iCAAiC;QACjC,2DAA2D;IAC7D,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC5B,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC9B,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC9B,gBAAgB,CAAC,KAAK,CAAC,OAAoB,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,gBAAgB,CAAC,KAAK,CAAC,OAAoB,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpE,yCAAyC;QACzC,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC;YAChC,IAAI,EAAE;gBACJ,IAAI,EAAE,YAAY;aACnB;SACF,CAAC,CAAC;QAEH,MAAM,IAAA,yBAAiB,EAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAEvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC;YACtB,mEAAmE;YACnE,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,+BAA+B,CAAC;SAClE,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;QAC3G,gBAAgB,CAAC,SAAS,CAAC,OAAoB,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAExE,yCAAyC;QACzC,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC;YAChC,IAAI,EAAE;gBACJ,IAAI,EAAE,YAAY;aACnB;SACF,CAAC,CAAC;QAEH,MAAM,IAAA,yBAAiB,EAAC;YACtB,GAAG,EAAE,oBAAoB;YACzB,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,YAAY;SAC1B,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,MAAM,SAAS,GAAG;QAChB,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;QACpB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;KAClB,CAAC;IAEF,IAAI,aAAa,GAAG;QAClB,MAAM,EAAE,GAAG;KACZ,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,aAAa,GAAG;YACd,MAAM,EAAE,GAAG;SACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,eAAe,CAAC;QAClD,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YACf,2EAA2E;YAC3E,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS;YAC/B,2EAA2E;YAC3E,UAAU,EAAE,GAAG,EAAE,CAAC,aAAa;SAChC,CAAC;QACF,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;KAC1B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEzD,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,0DAA0D;QAC1D,gEAAgE;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEzE,MAAM,IAAA,aAAK,GAAE,CAAC;QAEd,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAExC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;QAExE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,0DAA0D;QAC1D,gEAAgE;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEzE,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEtB,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAExC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAEpD,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAClE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,wDAAwD;QACxD,OAAO,MAAM,CAAC,sCAAsC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,eAAe,GAAG,IAAI;aACzB,KAAK,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;aAClD,mBAAmB,CAAC,yBAAO,CAAC,CAAC;QAEhC,MAAM,cAAc,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;QAEjD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,yBAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,eAAe,GAAG,IAAI;aACzB,KAAK,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;aAClD,mBAAmB,CAAC,yBAAO,CAAC,CAAC;QAEhC,MAAM,eAAe,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;QAClD,MAAM,eAAe,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;QAElD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,yBAAO,CAAC,CAAC;QACtC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,yBAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,eAAe,GAAG,IAAI;iBACzB,KAAK,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;iBAClD,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE7B,MAAM,cAAc,GAAG,MAAM,IAAA,yBAAiB,EAAC,yBAAO,CAAC,CAAC;YAExD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAEjD,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,yBAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,eAAe,GAAG,IAAI;iBACzB,KAAK,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;iBAClD,eAAe,CAAC,IAAI,CAAC,CAAC;YAEzB,MAAM,eAAe,GAAG,MAAM,IAAA,yBAAiB,EAAC,yBAAO,CAAC,CAAC;YACzD,MAAM,eAAe,GAAG,MAAM,IAAA,yBAAiB,EAAC,qBAAG,CAAC,CAAC;YAErD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAEjD,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,yBAAO,CAAC,CAAC;YACtC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,qBAAG,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,eAAe,GAAG,IAAI;iBACzB,KAAK,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;iBAClD,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE7B,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAI,CAAC,CAAC,CAAC;YAE5D,MAAM,cAAc,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;YAEjD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,sBAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,eAAe,GAAG,IAAI;iBACzB,KAAK,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;iBAClD,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE7B,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAI,CAAC,CAAC,CAAC;YAE5D,MAAM,eAAe,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;YAClD,MAAM,eAAe,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;YAElD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAElD,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,sBAAI,CAAC,CAAC;YACnC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,sBAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import {\n abort,\n askForToolConfigPath,\n askForWizardLogin,\n createNewConfigFile,\n getPackageManager,\n installPackage,\n} from '../../../src/utils/clack/';\n\nimport * as fs from 'node:fs';\nimport * as ChildProcess from 'node:child_process';\nimport type { PackageManager } from '../../../src/utils/package-manager';\nimport * as PackageManagerUtils from '../../../src/utils/package-manager';\n\nimport {\n NPM,\n PNPM,\n YARN_V1,\n YARN_V2,\n} from '../../../src/utils/package-manager';\n\nimport axios from 'axios';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\n\nimport * as Sentry from '@sentry/node';\n\njest.mock('node:child_process', () => ({\n __esModule: true,\n ...jest.requireActual<typeof ChildProcess>('node:child_process'),\n}));\n\njest.mock('@clack/prompts', () => ({\n log: {\n info: jest.fn(),\n success: jest.fn(),\n warn: jest.fn(),\n error: jest.fn(),\n },\n outro: jest.fn(),\n text: jest.fn(),\n confirm: jest.fn(),\n cancel: jest.fn(),\n // passthrough for abortIfCancelled\n isCancel: jest.fn().mockReturnValue(false),\n spinner: jest\n .fn()\n .mockImplementation(() => ({ start: jest.fn(), stop: jest.fn() })),\n select: jest.fn(),\n}));\nconst clackMock = clack as jest.Mocked<typeof clack>;\n\njest.mock('axios');\nconst mockedAxios = axios as jest.Mocked<typeof axios>;\n\njest.mock('opn', () => jest.fn(() => Promise.resolve({ on: jest.fn() })));\n\nfunction mockUserResponse(fn: jest.Mock, response: unknown) {\n fn.mockReturnValueOnce(response);\n}\n\ndescribe('askForToolConfigPath', () => {\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('returns undefined if users have no config file', async () => {\n mockUserResponse(clack.confirm as jest.Mock, false);\n\n const result = await askForToolConfigPath('Webpack', 'webpack.config.js');\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('have a Webpack config file'),\n }),\n );\n\n expect(result).toBeUndefined();\n });\n\n it('returns the path if users have a config file and the entered path is valid', async () => {\n mockUserResponse(clack.confirm as jest.Mock, true);\n mockUserResponse(clack.text as jest.Mock, 'my.webpack.config.js');\n\n const result = await askForToolConfigPath('Webpack', 'webpack.config.js');\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('have a Webpack config file'),\n }),\n );\n\n expect(clack.text).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining(\n 'enter the path to your Webpack config file',\n ),\n }),\n );\n\n expect(result).toBe('my.webpack.config.js');\n });\n});\n\ndescribe('createNewConfigFile', () => {\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('writes the file to disk and returns true if the file was created successfully', async () => {\n const writeFileSpy = jest\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(jest.fn());\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n\n const result = await createNewConfigFile(filename, code);\n\n expect(result).toBe(true);\n expect(writeFileSpy).toHaveBeenCalledWith(filename, code);\n });\n\n it('logs more information if provided as an argument', async () => {\n jest.spyOn(fs.promises, 'writeFile').mockImplementation(jest.fn());\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n const moreInfo = 'More information...';\n\n await createNewConfigFile(filename, code, moreInfo);\n\n expect(clack.log.info).toHaveBeenCalledTimes(1);\n expect(clack.log.info).toHaveBeenCalledWith(\n expect.stringContaining(moreInfo),\n );\n });\n\n it('returns false and logs a warning if the file could not be created', async () => {\n const writeFileSpy = jest\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(() => Promise.reject(new Error('Could not write')));\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n\n const result = await createNewConfigFile(filename, code);\n\n expect(result).toBe(false);\n expect(writeFileSpy).toHaveBeenCalledWith(filename, code);\n expect(clack.log.warn).toHaveBeenCalledTimes(1);\n });\n\n it('returns false if the passed path is not absolute', async () => {\n const result = await createNewConfigFile(\n './relative/webpack.config.js',\n '',\n );\n\n expect(result).toBe(false);\n });\n});\n\ndescribe('installPackage', () => {\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n const spawnSpy = jest\n .spyOn(ChildProcess, 'spawn')\n // @ts-expect-error - ignoring complete typing\n .mockImplementation(() => ({\n // @ts-expect-error - not passing the full object but directly resolving\n // to simulate a successful install\n on: jest.fn((evt: 'close', cb: (args) => void) => {\n if (evt === 'close') {\n cb(0);\n }\n }),\n stderr: { on: jest.fn() },\n }));\n\n it('force-installs a package if the forceInstall flag is set', async () => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n forceInstallFlag: '--force',\n detect: jest.fn(),\n addOverride: jest.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@some/package',\n packageNameDisplayLabel: '@some/package',\n forceInstall: true,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n ['install', '@some/package', '--force'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n });\n\n it.each([false, undefined])(\n \"doesn't force-install a package if the forceInstall flag is %s\",\n async (flag) => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n forceInstallFlag: '--force',\n detect: jest.fn(),\n addOverride: jest.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@sentry/sveltekit',\n packageNameDisplayLabel: '@sentry/sveltekit',\n forceInstall: flag,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n ['install', '@sentry/sveltekit'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n },\n );\n\n it('adds install flags if defined', async () => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '--ignore-workspace-root-check',\n forceInstallFlag: '--force',\n detect: jest.fn(),\n addOverride: jest.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@some/package',\n packageNameDisplayLabel: '@some/package',\n forceInstall: true,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n\n ['install', '@some/package', '--ignore-workspace-root-check', '--force'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n });\n});\n\ndescribe('askForWizardLogin', () => {\n // mock axios\n afterEach(() => {\n // clackMock.confirm.mockClear();\n // mockUserResponse(clack.confirm as jest.Mock, undefined);\n });\n\n beforeEach(() => {\n jest.clearAllMocks();\n mockedAxios.get.mockClear();\n clackMock.confirm.mockClear();\n clackMock.confirm.mockReset();\n mockUserResponse(clack.confirm as jest.Mock, undefined);\n });\n\n it('asks if a user already has a Sentry account by default', async () => {\n mockUserResponse(clack.confirm as jest.Mock, Promise.resolve(true));\n\n // Provide the data object to be returned\n mockedAxios.get.mockResolvedValue({\n data: {\n hash: 'mockedHash',\n },\n });\n\n await askForWizardLogin({ url: 'https://santry.io/' });\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('already have a Sentry account'),\n }),\n );\n });\n\n it('skips asking for if a user already has a Sentry account if org and project are pre-selected', async () => {\n mockUserResponse(clackMock.confirm as jest.Mock, Promise.resolve(true));\n\n // Provide the data object to be returned\n mockedAxios.get.mockResolvedValue({\n data: {\n hash: 'mockedHash',\n },\n });\n\n await askForWizardLogin({\n url: 'https://santry.io/',\n orgSlug: 'my-org',\n projectSlug: 'my-project',\n });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n });\n});\n\ndescribe('abort', () => {\n const sentryTxn = {\n setStatus: jest.fn(),\n finish: jest.fn(),\n };\n\n let sentrySession = {\n status: 999,\n };\n\n beforeEach(() => {\n jest.clearAllMocks();\n sentrySession = {\n status: 999,\n };\n });\n\n jest.spyOn(Sentry, 'getCurrentHub').mockReturnValue({\n getScope: () => ({\n // @ts-expect-error - don't care about the rest of the required props value\n getTransaction: () => sentryTxn,\n // @ts-expect-error - don't care about the rest of the required props value\n getSession: () => sentrySession,\n }),\n captureSession: jest.fn(),\n });\n\n const flushSpy = jest.fn();\n jest.spyOn(Sentry, 'flush').mockImplementation(flushSpy);\n\n it('ends the process with an error exit code by default', async () => {\n // @ts-expect-error - jest doesn't like the empty function\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {});\n\n await abort();\n\n expect(exitSpy).toHaveBeenCalledWith(1);\n\n expect(clackMock.outro).toHaveBeenCalledTimes(1);\n expect(clackMock.outro).toHaveBeenCalledWith('Wizard setup cancelled.');\n\n expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('aborted');\n expect(sentryTxn.finish).toHaveBeenCalledTimes(1);\n expect(sentrySession.status).toBe('crashed');\n expect(flushSpy).toHaveBeenLastCalledWith(3000);\n });\n\n it('ends the process with a custom exit code and message if provided', async () => {\n // @ts-expect-error - jest doesn't like the empty function\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {});\n\n await abort('Bye', 0);\n\n expect(exitSpy).toHaveBeenCalledWith(0);\n\n expect(clackMock.outro).toHaveBeenCalledTimes(1);\n expect(clackMock.outro).toHaveBeenCalledWith('Bye');\n\n expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('cancelled');\n expect(sentryTxn.finish).toHaveBeenCalledTimes(1);\n expect(sentrySession.status).toBe('abnormal');\n expect(flushSpy).toHaveBeenLastCalledWith(3000);\n });\n});\n\ndescribe('getPackageManager', () => {\n afterEach(() => {\n jest.clearAllMocks();\n // @ts-expect-error - this variable is set by the wizard\n delete global.__sentry_wizard_cached_package_manager;\n });\n\n it('returns the auto-detected package manager', async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(YARN_V1);\n\n const packageManager = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager).toBe(YARN_V1);\n });\n\n it('caches the auto-detected package manager', async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(YARN_V1);\n\n const packageManager1 = await getPackageManager();\n const packageManager2 = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager1).toBe(YARN_V1);\n expect(packageManager2).toBe(YARN_V1);\n });\n\n describe('when auto detection fails', () => {\n it('returns a fallback package manager if fallback is specified', async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n const packageManager = await getPackageManager(YARN_V2);\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager).toBe(YARN_V2);\n });\n\n it(\"doesn't cache the fallback package manager\", async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValue(null);\n\n const packageManager1 = await getPackageManager(YARN_V2);\n const packageManager2 = await getPackageManager(NPM);\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(2);\n\n expect(packageManager1).toBe(YARN_V2);\n expect(packageManager2).toBe(NPM);\n });\n\n it('returns the user-selected package manager if no fallback is provided', async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n clackMock.select.mockReturnValueOnce(Promise.resolve(PNPM));\n\n const packageManager = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n expect(packageManager).toBe(PNPM);\n });\n\n it('caches the user-selected package manager', async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n clackMock.select.mockReturnValueOnce(Promise.resolve(PNPM));\n\n const packageManager1 = await getPackageManager();\n const packageManager2 = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n expect(clackMock.select).toHaveBeenCalledTimes(1);\n\n expect(packageManager1).toBe(PNPM);\n expect(packageManager2).toBe(PNPM);\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../test/utils/clack/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n abort,\n askForToolConfigPath,\n askForWizardLogin,\n createNewConfigFile,\n getPackageManager,\n installPackage,\n} from '../../../src/utils/clack/';\n\nimport * as fs from 'node:fs';\nimport * as ChildProcess from 'node:child_process';\nimport type { PackageManager } from '../../../src/utils/package-manager';\nimport * as PackageManagerUtils from '../../../src/utils/package-manager';\n\nimport {\n NPM,\n PNPM,\n YARN_V1,\n YARN_V2,\n} from '../../../src/utils/package-manager';\n\nimport axios from 'axios';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\n\nimport * as Sentry from '@sentry/node';\n\nimport {\n vi,\n it,\n describe,\n expect,\n beforeEach,\n Mocked,\n Mock,\n afterEach,\n} from 'vitest';\n\nvi.mock('node:child_process', async () => ({\n __esModule: true,\n ...(await vi.importActual<typeof ChildProcess>('node:child_process')),\n}));\n\nvi.mock('@clack/prompts', () => ({\n log: {\n info: vi.fn(),\n success: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n },\n outro: vi.fn(),\n text: vi.fn(),\n confirm: vi.fn(),\n cancel: vi.fn(),\n // passthrough for abortIfCancelled\n isCancel: vi.fn().mockReturnValue(false),\n spinner: vi\n .fn()\n .mockImplementation(() => ({ start: vi.fn(), stop: vi.fn() })),\n select: vi.fn(),\n}));\nconst clackMock = clack as Mocked<typeof clack>;\n\nvi.mock('axios');\nconst mockedAxios = axios as Mocked<typeof axios>;\n\nvi.mock('opn', () => ({\n default: vi.fn(() => Promise.resolve({ on: vi.fn() })),\n}));\n\nfunction mockUserResponse(fn: Mock, response: unknown) {\n fn.mockReturnValueOnce(response);\n}\n\ndescribe('askForToolConfigPath', () => {\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n it('returns undefined if users have no config file', async () => {\n mockUserResponse(clack.confirm as Mock, false);\n\n const result = await askForToolConfigPath('Webpack', 'webpack.config.js');\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('have a Webpack config file'),\n }),\n );\n\n expect(result).toBeUndefined();\n });\n\n it('returns the path if users have a config file and the entered path is valid', async () => {\n mockUserResponse(clack.confirm as Mock, true);\n mockUserResponse(clack.text as Mock, 'my.webpack.config.js');\n\n const result = await askForToolConfigPath('Webpack', 'webpack.config.js');\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('have a Webpack config file'),\n }),\n );\n\n expect(clack.text).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining(\n 'enter the path to your Webpack config file',\n ),\n }),\n );\n\n expect(result).toBe('my.webpack.config.js');\n });\n});\n\ndescribe('createNewConfigFile', () => {\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n it('writes the file to disk and returns true if the file was created successfully', async () => {\n const writeFileSpy = vi\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(vi.fn());\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n\n const result = await createNewConfigFile(filename, code);\n\n expect(result).toBe(true);\n expect(writeFileSpy).toHaveBeenCalledWith(filename, code);\n });\n\n it('logs more information if provided as an argument', async () => {\n vi.spyOn(fs.promises, 'writeFile').mockImplementation(vi.fn());\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n const moreInfo = 'More information...';\n\n await createNewConfigFile(filename, code, moreInfo);\n\n expect(clack.log.info).toHaveBeenCalledTimes(1);\n expect(clack.log.info).toHaveBeenCalledWith(\n expect.stringContaining(moreInfo),\n );\n });\n\n it('returns false and logs a warning if the file could not be created', async () => {\n const writeFileSpy = vi\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(() => Promise.reject(new Error('Could not write')));\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n\n const result = await createNewConfigFile(filename, code);\n\n expect(result).toBe(false);\n expect(writeFileSpy).toHaveBeenCalledWith(filename, code);\n expect(clack.log.warn).toHaveBeenCalledTimes(1);\n });\n\n it('returns false if the passed path is not absolute', async () => {\n const result = await createNewConfigFile(\n './relative/webpack.config.js',\n '',\n );\n\n expect(result).toBe(false);\n });\n});\n\ndescribe('installPackage', () => {\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n const spawnSpy = vi.spyOn(ChildProcess, 'spawn').mockImplementation(() => ({\n // @ts-expect-error - not passing the full object but directly resolving\n // to simulate a successful install\n on: vi.fn((evt: 'close', cb: (args) => void) => {\n if (evt === 'close') {\n cb(0);\n }\n }),\n // @ts-expect-error - this is fine\n stderr: { on: vi.fn() },\n }));\n\n it('force-installs a package if the forceInstall flag is set', async () => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n forceInstallFlag: '--force',\n detect: vi.fn(),\n addOverride: vi.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@some/package',\n packageNameDisplayLabel: '@some/package',\n forceInstall: true,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n ['install', '@some/package', '--force'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n });\n\n it.each([false, undefined])(\n \"doesn't force-install a package if the forceInstall flag is %s\",\n async (flag) => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n forceInstallFlag: '--force',\n detect: vi.fn(),\n addOverride: vi.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@sentry/sveltekit',\n packageNameDisplayLabel: '@sentry/sveltekit',\n forceInstall: flag,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n ['install', '@sentry/sveltekit'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n },\n );\n\n it('adds install flags if defined', async () => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '--ignore-workspace-root-check',\n forceInstallFlag: '--force',\n detect: vi.fn(),\n addOverride: vi.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@some/package',\n packageNameDisplayLabel: '@some/package',\n forceInstall: true,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n\n ['install', '@some/package', '--ignore-workspace-root-check', '--force'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n });\n});\n\ndescribe('askForWizardLogin', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n mockedAxios.get.mockClear();\n clackMock.confirm.mockClear();\n clackMock.confirm.mockReset();\n mockUserResponse(clack.confirm as Mock, undefined);\n });\n\n it('asks if a user already has a Sentry account by default', async () => {\n mockUserResponse(clack.confirm as Mock, Promise.resolve(true));\n\n // Provide the data object to be returned\n mockedAxios.get.mockResolvedValue({\n data: {\n hash: 'mockedHash',\n },\n });\n\n await askForWizardLogin({ url: 'https://santry.io/' });\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('already have a Sentry account'),\n }),\n );\n });\n\n it('skips asking for if a user already has a Sentry account if org and project are pre-selected', async () => {\n mockUserResponse(clackMock.confirm as Mock, Promise.resolve(true));\n\n // Provide the data object to be returned\n mockedAxios.get.mockResolvedValue({\n data: {\n hash: 'mockedHash',\n },\n });\n\n await askForWizardLogin({\n url: 'https://santry.io/',\n orgSlug: 'my-org',\n projectSlug: 'my-project',\n });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n });\n});\n\ndescribe('abort', () => {\n const sentryTxn = {\n setStatus: vi.fn(),\n finish: vi.fn(),\n };\n\n let sentrySession = {\n status: 999,\n };\n\n beforeEach(() => {\n vi.clearAllMocks();\n sentrySession = {\n status: 999,\n };\n });\n\n vi.spyOn(Sentry, 'getCurrentHub').mockReturnValue({\n getScope: () => ({\n // @ts-expect-error - don't care about the rest of the required props value\n getTransaction: () => sentryTxn,\n // @ts-expect-error - don't care about the rest of the required props value\n getSession: () => sentrySession,\n }),\n captureSession: vi.fn(),\n });\n\n const flushSpy = vi.fn();\n vi.spyOn(Sentry, 'flush').mockImplementation(flushSpy);\n\n it('ends the process with an error exit code by default', async () => {\n // @ts-expect-error - vitest doesn't like the empty function\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {});\n\n await abort();\n\n expect(exitSpy).toHaveBeenCalledWith(1);\n\n expect(clackMock.outro).toHaveBeenCalledTimes(1);\n expect(clackMock.outro).toHaveBeenCalledWith('Wizard setup cancelled.');\n\n expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('aborted');\n expect(sentryTxn.finish).toHaveBeenCalledTimes(1);\n expect(sentrySession.status).toBe('crashed');\n expect(flushSpy).toHaveBeenLastCalledWith(3000);\n });\n\n it('ends the process with a custom exit code and message if provided', async () => {\n // @ts-expect-error - vitest doesn't like the empty function\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {});\n\n await abort('Bye', 0);\n\n expect(exitSpy).toHaveBeenCalledWith(0);\n\n expect(clackMock.outro).toHaveBeenCalledTimes(1);\n expect(clackMock.outro).toHaveBeenCalledWith('Bye');\n\n expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('cancelled');\n expect(sentryTxn.finish).toHaveBeenCalledTimes(1);\n expect(sentrySession.status).toBe('abnormal');\n expect(flushSpy).toHaveBeenLastCalledWith(3000);\n });\n});\n\ndescribe('getPackageManager', () => {\n afterEach(() => {\n vi.clearAllMocks();\n // @ts-expect-error - this variable is set by the wizard\n delete global.__sentry_wizard_cached_package_manager;\n });\n\n it('returns the auto-detected package manager', async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(YARN_V1);\n\n const packageManager = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager).toBe(YARN_V1);\n });\n\n it('caches the auto-detected package manager', async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(YARN_V1);\n\n const packageManager1 = await getPackageManager();\n const packageManager2 = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager1).toBe(YARN_V1);\n expect(packageManager2).toBe(YARN_V1);\n });\n\n describe('when auto detection fails', () => {\n it('returns a fallback package manager if fallback is specified', async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n const packageManager = await getPackageManager(YARN_V2);\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager).toBe(YARN_V2);\n });\n\n it(\"doesn't cache the fallback package manager\", async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValue(null);\n\n const packageManager1 = await getPackageManager(YARN_V2);\n const packageManager2 = await getPackageManager(NPM);\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(2);\n\n expect(packageManager1).toBe(YARN_V2);\n expect(packageManager2).toBe(NPM);\n });\n\n it('returns the user-selected package manager if no fallback is provided', async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n clackMock.select.mockReturnValueOnce(Promise.resolve(PNPM));\n\n const packageManager = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n expect(packageManager).toBe(PNPM);\n });\n\n it('caches the user-selected package manager', async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n clackMock.select.mockReturnValueOnce(Promise.resolve(PNPM));\n\n const packageManager1 = await getPackageManager();\n const packageManager2 = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n expect(clackMock.select).toHaveBeenCalledTimes(1);\n\n expect(packageManager1).toBe(PNPM);\n expect(packageManager2).toBe(PNPM);\n });\n });\n});\n"]}
|