@sentry/wizard 4.3.0 → 4.5.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.
Files changed (34) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/e2e-tests/tests/nextjs-14.test.js +1 -3
  3. package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
  4. package/dist/e2e-tests/tests/nextjs-15.test.js +1 -3
  5. package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
  6. package/dist/src/nextjs/nextjs-wizard.js +0 -24
  7. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  8. package/dist/src/nextjs/templates.d.ts +1 -2
  9. package/dist/src/nextjs/templates.js +2 -8
  10. package/dist/src/nextjs/templates.js.map +1 -1
  11. package/dist/src/react-native/javascript.d.ts +16 -0
  12. package/dist/src/react-native/javascript.js +141 -6
  13. package/dist/src/react-native/javascript.js.map +1 -1
  14. package/dist/src/react-native/react-native-wizard.js +1 -0
  15. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  16. package/dist/src/sourcemaps/tools/sentry-cli.js +8 -1
  17. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  18. package/dist/src/utils/clack-utils.d.ts +9 -8
  19. package/dist/src/utils/clack-utils.js +38 -8
  20. package/dist/src/utils/clack-utils.js.map +1 -1
  21. package/dist/src/utils/package-manager.js +7 -8
  22. package/dist/src/utils/package-manager.js.map +1 -1
  23. package/dist/src/version.d.ts +1 -1
  24. package/dist/src/version.js +1 -1
  25. package/dist/src/version.js.map +1 -1
  26. package/dist/test/nextjs/templates.test.js +0 -51
  27. package/dist/test/nextjs/templates.test.js.map +1 -1
  28. package/dist/test/react-native/javascript.test.js +406 -0
  29. package/dist/test/react-native/javascript.test.js.map +1 -1
  30. package/dist/test/sourcemaps/tools/sentry-cli.test.js +11 -0
  31. package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -1
  32. package/dist/test/utils/clack-utils.test.js +41 -24
  33. package/dist/test/utils/clack-utils.test.js.map +1 -1
  34. package/package.json +1 -1
@@ -129,11 +129,24 @@ describe('installPackage', () => {
129
129
  afterEach(() => {
130
130
  jest.clearAllMocks();
131
131
  });
132
+ const spawnSpy = jest
133
+ .spyOn(ChildProcess, 'spawn')
134
+ // @ts-expect-error - ignoring complete typing
135
+ .mockImplementation(() => ({
136
+ // @ts-expect-error - not passing the full object but directly resolving
137
+ // to simulate a successful install
138
+ on: jest.fn((evt, cb) => {
139
+ if (evt === 'close') {
140
+ cb(0);
141
+ }
142
+ }),
143
+ stderr: { on: jest.fn() },
144
+ }));
132
145
  it('force-installs a package if the forceInstall flag is set', async () => {
133
146
  const packageManagerMock = {
134
147
  name: 'npm',
135
148
  label: 'NPM',
136
- installCommand: 'npm install',
149
+ installCommand: 'install',
137
150
  buildCommand: 'npm run build',
138
151
  runScriptCommand: 'npm run',
139
152
  flags: '',
@@ -141,30 +154,21 @@ describe('installPackage', () => {
141
154
  detect: jest.fn(),
142
155
  addOverride: jest.fn(),
143
156
  };
144
- const execSpy = jest
145
- .spyOn(ChildProcess, 'exec')
146
- // @ts-expect-error - don't care about the return value
147
- .mockImplementationOnce((cmd, cb) => {
148
- if (cb) {
149
- // @ts-expect-error - don't care about the options value
150
- cb(null, '', '');
151
- }
152
- });
153
157
  await (0, clack_utils_1.installPackage)({
154
158
  alreadyInstalled: false,
155
- packageName: '@sentry/sveltekit',
156
- packageNameDisplayLabel: '@sentry/sveltekit',
159
+ packageName: '@some/package',
160
+ packageNameDisplayLabel: '@some/package',
157
161
  forceInstall: true,
158
162
  askBeforeUpdating: false,
159
163
  packageManager: packageManagerMock,
160
164
  });
161
- expect(execSpy).toHaveBeenCalledWith('npm install @sentry/sveltekit --force', expect.any(Function));
165
+ expect(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@some/package', '--force'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
162
166
  });
163
167
  it.each([false, undefined])("doesn't force-install a package if the forceInstall flag is %s", async (flag) => {
164
168
  const packageManagerMock = {
165
169
  name: 'npm',
166
170
  label: 'NPM',
167
- installCommand: 'npm install',
171
+ installCommand: 'install',
168
172
  buildCommand: 'npm run build',
169
173
  runScriptCommand: 'npm run',
170
174
  flags: '',
@@ -172,15 +176,6 @@ describe('installPackage', () => {
172
176
  detect: jest.fn(),
173
177
  addOverride: jest.fn(),
174
178
  };
175
- const execSpy = jest
176
- .spyOn(ChildProcess, 'exec')
177
- // @ts-expect-error - don't care about the return value
178
- .mockImplementationOnce((cmd, cb) => {
179
- if (cb) {
180
- // @ts-expect-error - don't care about the options value
181
- cb(null, '', '');
182
- }
183
- });
184
179
  await (0, clack_utils_1.installPackage)({
185
180
  alreadyInstalled: false,
186
181
  packageName: '@sentry/sveltekit',
@@ -189,7 +184,29 @@ describe('installPackage', () => {
189
184
  askBeforeUpdating: false,
190
185
  packageManager: packageManagerMock,
191
186
  });
192
- expect(execSpy).toHaveBeenCalledWith('npm install @sentry/sveltekit ', expect.any(Function));
187
+ expect(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@sentry/sveltekit'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
188
+ });
189
+ it('adds install flags if defined', async () => {
190
+ const packageManagerMock = {
191
+ name: 'npm',
192
+ label: 'NPM',
193
+ installCommand: 'install',
194
+ buildCommand: 'npm run build',
195
+ runScriptCommand: 'npm run',
196
+ flags: '--ignore-workspace-root-check',
197
+ forceInstallFlag: '--force',
198
+ detect: jest.fn(),
199
+ addOverride: jest.fn(),
200
+ };
201
+ await (0, clack_utils_1.installPackage)({
202
+ alreadyInstalled: false,
203
+ packageName: '@some/package',
204
+ packageNameDisplayLabel: '@some/package',
205
+ forceInstall: true,
206
+ askBeforeUpdating: false,
207
+ packageManager: packageManagerMock,
208
+ });
209
+ expect(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@some/package', '--ignore-workspace-root-check', '--force'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
193
210
  });
194
211
  });
195
212
  describe('askForWizardLogin', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"clack-utils.test.js","sourceRoot":"","sources":["../../../test/utils/clack-utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n abort,\n askForToolConfigPath,\n askForWizardLogin,\n createNewConfigFile,\n installPackage,\n} from '../../src/utils/clack-utils';\n\nimport * as fs from 'node:fs';\nimport * as ChildProcess from 'node:child_process';\nimport type { PackageManager } from '../../src/utils/package-manager';\n\nimport axios from 'axios';\n\n// @ts-ignore - 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('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}));\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: any) {\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 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 message: expect.stringContaining('have a Webpack config file'),\n }),\n );\n\n expect(clack.text).toHaveBeenCalledWith(\n expect.objectContaining({\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 it('force-installs a package if the forceInstall flag is set', async () => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'npm 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 const execSpy = jest\n .spyOn(ChildProcess, 'exec')\n // @ts-expect-error - don't care about the return value\n .mockImplementationOnce((cmd, cb) => {\n if (cb) {\n // @ts-expect-error - don't care about the options value\n cb(null, '', '');\n }\n });\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@sentry/sveltekit',\n packageNameDisplayLabel: '@sentry/sveltekit',\n forceInstall: true,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(execSpy).toHaveBeenCalledWith(\n 'npm install @sentry/sveltekit --force',\n expect.any(Function),\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: 'npm 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 const execSpy = jest\n .spyOn(ChildProcess, 'exec')\n // @ts-expect-error - don't care about the return value\n .mockImplementationOnce((cmd, cb) => {\n if (cb) {\n // @ts-expect-error - don't care about the options value\n cb(null, '', '');\n }\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(execSpy).toHaveBeenCalledWith(\n 'npm install @sentry/sveltekit ',\n expect.any(Function),\n );\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 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-ignore - 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-ignore - 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"]}
1
+ {"version":3,"file":"clack-utils.test.js","sourceRoot":"","sources":["../../../test/utils/clack-utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n abort,\n askForToolConfigPath,\n askForWizardLogin,\n createNewConfigFile,\n installPackage,\n} from '../../src/utils/clack-utils';\n\nimport * as fs from 'node:fs';\nimport * as ChildProcess from 'node:child_process';\nimport type { PackageManager } from '../../src/utils/package-manager';\n\nimport axios from 'axios';\n\n// @ts-ignore - 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('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}));\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: any) {\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 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 message: expect.stringContaining('have a Webpack config file'),\n }),\n );\n\n expect(clack.text).toHaveBeenCalledWith(\n expect.objectContaining({\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 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-ignore - 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-ignore - 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/wizard",
3
- "version": "4.3.0",
3
+ "version": "4.5.0",
4
4
  "homepage": "https://github.com/getsentry/sentry-wizard",
5
5
  "repository": "https://github.com/getsentry/sentry-wizard",
6
6
  "description": "Sentry wizard helping you to configure your project",