@sentry/wizard 6.11.0 → 6.13.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 +64 -0
- package/dist/bin.js +16 -1
- package/dist/bin.js.map +1 -1
- package/dist/e2e-tests/tests/angular-17.test.js +3 -4
- package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
- package/dist/e2e-tests/tests/angular-19.test.js +3 -4
- package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
- package/dist/e2e-tests/tests/cloudflare-worker.test.js +5 -0
- package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -1
- package/dist/e2e-tests/tests/flutter.test.js +60 -0
- package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
- package/dist/e2e-tests/tests/help-message.test.js +8 -3
- package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-3.test.js +12 -6
- package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-4.test.js +12 -6
- package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
- package/dist/e2e-tests/tests/pnpm-workspace.test.js +8 -4
- package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js +96 -0
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js.map +1 -0
- package/dist/e2e-tests/tests/react-router.test.js +6 -7
- package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
- package/dist/e2e-tests/tests/remix.test.js +2 -4
- package/dist/e2e-tests/tests/remix.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js +24 -8
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js +8 -4
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
- package/dist/lib/Constants.d.ts +1 -0
- package/dist/lib/Constants.js +5 -0
- package/dist/lib/Constants.js.map +1 -1
- package/dist/lib/Steps/Integrations/Electron.js +2 -2
- package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
- package/dist/src/android/android-wizard.js +3 -0
- package/dist/src/android/android-wizard.js.map +1 -1
- package/dist/src/angular/codemods/main.d.ts +1 -1
- package/dist/src/angular/codemods/main.js +0 -1
- package/dist/src/angular/codemods/main.js.map +1 -1
- package/dist/src/apple/apple-wizard.js +2 -3
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/apple/check-installed-cli.d.ts +1 -1
- package/dist/src/apple/check-installed-cli.js +13 -7
- package/dist/src/apple/check-installed-cli.js.map +1 -1
- package/dist/src/apple/code-tools.js +17 -3
- package/dist/src/apple/code-tools.js.map +1 -1
- package/dist/src/apple/configure-package-manager.js +18 -5
- package/dist/src/apple/configure-package-manager.js.map +1 -1
- package/dist/src/apple/configure-xcode-project.js +8 -1
- package/dist/src/apple/configure-xcode-project.js.map +1 -1
- package/dist/src/apple/lookup-xcode-project.d.ts +8 -5
- package/dist/src/apple/lookup-xcode-project.js +22 -17
- package/dist/src/apple/lookup-xcode-project.js.map +1 -1
- package/dist/src/apple/options.d.ts +5 -0
- package/dist/src/apple/options.js.map +1 -1
- package/dist/src/apple/sentry-swift-package.d.ts +4 -0
- package/dist/src/apple/sentry-swift-package.js +17 -0
- package/dist/src/apple/sentry-swift-package.js.map +1 -0
- package/dist/src/apple/snapshots/apple-snapshots-wizard.d.ts +2 -0
- package/dist/src/apple/snapshots/apple-snapshots-wizard.js +251 -0
- package/dist/src/apple/snapshots/apple-snapshots-wizard.js.map +1 -0
- package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.d.ts +13 -0
- package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.js +48 -0
- package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.js.map +1 -0
- package/dist/src/apple/snapshots/snapshot-test-file.d.ts +18 -0
- package/dist/src/apple/snapshots/snapshot-test-file.js +122 -0
- package/dist/src/apple/snapshots/snapshot-test-file.js.map +1 -0
- package/dist/src/apple/snapshots/snapshot-verification-scheme.d.ts +6 -0
- package/dist/src/apple/snapshots/snapshot-verification-scheme.js +147 -0
- package/dist/src/apple/snapshots/snapshot-verification-scheme.js.map +1 -0
- package/dist/src/apple/snapshots/snapshotpreviews-package.d.ts +4 -0
- package/dist/src/apple/snapshots/snapshotpreviews-package.js +8 -0
- package/dist/src/apple/snapshots/snapshotpreviews-package.js.map +1 -0
- package/dist/src/apple/snapshots/snapshots-cli-preflight.d.ts +23 -0
- package/dist/src/apple/snapshots/snapshots-cli-preflight.js +136 -0
- package/dist/src/apple/snapshots/snapshots-cli-preflight.js.map +1 -0
- package/dist/src/apple/xcode-manager.d.ts +59 -1
- package/dist/src/apple/xcode-manager.js +507 -106
- package/dist/src/apple/xcode-manager.js.map +1 -1
- package/dist/src/cloudflare/cloudflare-wizard.js +5 -0
- package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -1
- package/dist/src/cloudflare/sdk-setup.d.ts +1 -0
- package/dist/src/cloudflare/sdk-setup.js.map +1 -1
- package/dist/src/cloudflare/templates.d.ts +1 -0
- package/dist/src/cloudflare/templates.js +7 -1
- package/dist/src/cloudflare/templates.js.map +1 -1
- package/dist/src/cloudflare/wrap-worker.d.ts +1 -0
- package/dist/src/cloudflare/wrap-worker.js +7 -0
- package/dist/src/cloudflare/wrap-worker.js.map +1 -1
- package/dist/src/flutter/flutter-wizard.js +3 -0
- package/dist/src/flutter/flutter-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.js +12 -6
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/nuxt/templates.js +12 -6
- package/dist/src/nuxt/templates.js.map +1 -1
- package/dist/src/react-native/expo.d.ts +6 -0
- package/dist/src/react-native/expo.js +27 -1
- package/dist/src/react-native/expo.js.map +1 -1
- package/dist/src/react-native/git.d.ts +5 -0
- package/dist/src/react-native/git.js +32 -1
- package/dist/src/react-native/git.js.map +1 -1
- package/dist/src/react-native/javascript.js +3 -1
- package/dist/src/react-native/javascript.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +12 -6
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-router/codemods/client.entry.d.ts +1 -1
- package/dist/src/react-router/codemods/client.entry.js +124 -26
- package/dist/src/react-router/codemods/client.entry.js.map +1 -1
- package/dist/src/react-router/codemods/react-router-config.js +1 -1
- package/dist/src/react-router/codemods/react-router-config.js.map +1 -1
- package/dist/src/react-router/codemods/server-entry.d.ts +1 -1
- package/dist/src/react-router/codemods/server-entry.js +40 -4
- package/dist/src/react-router/codemods/server-entry.js.map +1 -1
- package/dist/src/react-router/codemods/vite.js +46 -1
- package/dist/src/react-router/codemods/vite.js.map +1 -1
- package/dist/src/react-router/react-router-wizard.js +62 -21
- package/dist/src/react-router/react-router-wizard.js.map +1 -1
- package/dist/src/react-router/sdk-setup.d.ts +5 -3
- package/dist/src/react-router/sdk-setup.js +44 -16
- package/dist/src/react-router/sdk-setup.js.map +1 -1
- package/dist/src/react-router/templates.d.ts +2 -4
- package/dist/src/react-router/templates.js +89 -87
- package/dist/src/react-router/templates.js.map +1 -1
- package/dist/src/remix/sdk-setup.js +1 -2
- package/dist/src/remix/sdk-setup.js.map +1 -1
- package/dist/src/run.d.ts +4 -1
- package/dist/src/run.js +13 -0
- package/dist/src/run.js.map +1 -1
- package/dist/src/sourcemaps/tools/remix.js +4 -4
- package/dist/src/sourcemaps/tools/remix.js.map +1 -1
- package/dist/src/sourcemaps/tools/vite.js +1 -1
- package/dist/src/sourcemaps/tools/vite.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup/setup.js +17 -4
- package/dist/src/sveltekit/sdk-setup/setup.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup/vite.js +1 -1
- package/dist/src/sveltekit/sdk-setup/vite.js.map +1 -1
- package/dist/src/sveltekit/templates.js +12 -6
- package/dist/src/sveltekit/templates.js.map +1 -1
- package/dist/src/utils/ast-utils.d.ts +10 -0
- package/dist/src/utils/ast-utils.js +19 -1
- package/dist/src/utils/ast-utils.js.map +1 -1
- package/dist/src/utils/clack/index.d.ts +2 -1
- package/dist/src/utils/clack/index.js +17 -6
- package/dist/src/utils/clack/index.js.map +1 -1
- package/dist/src/utils/files.d.ts +2 -0
- package/dist/src/utils/files.js +58 -0
- package/dist/src/utils/files.js.map +1 -0
- package/dist/src/utils/git.d.ts +3 -1
- package/dist/src/utils/git.js +2 -1
- package/dist/src/utils/git.js.map +1 -1
- package/dist/src/utils/line-endings.d.ts +1 -0
- package/dist/src/utils/line-endings.js +76 -0
- package/dist/src/utils/line-endings.js.map +1 -0
- 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/angular/angular-wizard.test.js +0 -5
- package/dist/test/angular/angular-wizard.test.js.map +1 -1
- package/dist/test/apple/code-tools.test.js +78 -0
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/configure-package-manager.test.d.ts +1 -0
- package/dist/test/apple/configure-package-manager.test.js +161 -0
- package/dist/test/apple/configure-package-manager.test.js.map +1 -0
- package/dist/test/apple/lookup-xcode-project.test.d.ts +1 -0
- package/dist/test/apple/lookup-xcode-project.test.js +167 -0
- package/dist/test/apple/lookup-xcode-project.test.js.map +1 -0
- package/dist/test/apple/snapshots/apple-snapshots-wizard.test.d.ts +1 -0
- package/dist/test/apple/snapshots/apple-snapshots-wizard.test.js +487 -0
- package/dist/test/apple/snapshots/apple-snapshots-wizard.test.js.map +1 -0
- package/dist/test/apple/snapshots/hosted-test-target-fixture.d.ts +24 -0
- package/dist/test/apple/snapshots/hosted-test-target-fixture.js +191 -0
- package/dist/test/apple/snapshots/hosted-test-target-fixture.js.map +1 -0
- package/dist/test/apple/snapshots/snapshot-test-file.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshot-test-file.test.js +110 -0
- package/dist/test/apple/snapshots/snapshot-test-file.test.js.map +1 -0
- package/dist/test/apple/snapshots/snapshot-verification-scheme.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshot-verification-scheme.test.js +146 -0
- package/dist/test/apple/snapshots/snapshot-verification-scheme.test.js.map +1 -0
- package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.js +186 -0
- package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.js.map +1 -0
- package/dist/test/apple/snapshots/snapshots-cli-preflight.test.d.ts +1 -0
- package/dist/test/apple/snapshots/snapshots-cli-preflight.test.js +192 -0
- package/dist/test/apple/snapshots/snapshots-cli-preflight.test.js.map +1 -0
- package/dist/test/apple/snapshots/source-file-insertion.test.d.ts +1 -0
- package/dist/test/apple/snapshots/source-file-insertion.test.js +77 -0
- package/dist/test/apple/snapshots/source-file-insertion.test.js.map +1 -0
- package/dist/test/apple/xcode-manager.test.js +452 -43
- package/dist/test/apple/xcode-manager.test.js.map +1 -1
- package/dist/test/cloudflare/sdk-setup.test.js +20 -2
- package/dist/test/cloudflare/sdk-setup.test.js.map +1 -1
- package/dist/test/cloudflare/templates.test.js +54 -0
- package/dist/test/cloudflare/templates.test.js.map +1 -1
- package/dist/test/cloudflare/wrap-worker.test.js +74 -11
- package/dist/test/cloudflare/wrap-worker.test.js.map +1 -1
- package/dist/test/constants.test.d.ts +1 -0
- package/dist/test/constants.test.js +12 -0
- package/dist/test/constants.test.js.map +1 -0
- package/dist/test/nextjs/templates.test.js +66 -33
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/nuxt/templates.test.js +66 -36
- package/dist/test/nuxt/templates.test.js.map +1 -1
- package/dist/test/react-native/expo.test.js +140 -0
- package/dist/test/react-native/expo.test.js.map +1 -1
- package/dist/test/react-native/git.test.d.ts +1 -0
- package/dist/test/react-native/git.test.js +160 -0
- package/dist/test/react-native/git.test.js.map +1 -0
- package/dist/test/react-router/codemods/client-entry.test.js +38 -5
- package/dist/test/react-router/codemods/client-entry.test.js.map +1 -1
- package/dist/test/react-router/codemods/server-entry.test.js +83 -0
- package/dist/test/react-router/codemods/server-entry.test.js.map +1 -1
- package/dist/test/react-router/codemods/vite.test.js +89 -0
- package/dist/test/react-router/codemods/vite.test.js.map +1 -1
- package/dist/test/react-router/sdk-setup.test.js +98 -6
- package/dist/test/react-router/sdk-setup.test.js.map +1 -1
- package/dist/test/react-router/templates.test.js +50 -38
- package/dist/test/react-router/templates.test.js.map +1 -1
- package/dist/test/remix/build-script.test.d.ts +1 -0
- package/dist/test/remix/build-script.test.js +124 -0
- package/dist/test/remix/build-script.test.js.map +1 -0
- package/dist/test/remix/client-entry.test.js +4 -10
- package/dist/test/remix/client-entry.test.js.map +1 -1
- package/dist/test/run.test.d.ts +1 -0
- package/dist/test/run.test.js +137 -0
- package/dist/test/run.test.js.map +1 -0
- package/dist/test/sourcemaps/tools/vite.test.js +12 -8
- package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
- package/dist/test/sveltekit/templates.test.js +78 -27
- package/dist/test/sveltekit/templates.test.js.map +1 -1
- package/dist/test/utils/ast-utils.test.js +22 -0
- package/dist/test/utils/ast-utils.test.js.map +1 -1
- package/dist/test/utils/clack/index.test.js +101 -0
- package/dist/test/utils/clack/index.test.js.map +1 -1
- package/dist/test/utils/git.test.js +10 -0
- package/dist/test/utils/git.test.js.map +1 -1
- package/dist/test/utils/line-endings.test.d.ts +1 -0
- package/dist/test/utils/line-endings.test.js +103 -0
- package/dist/test/utils/line-endings.test.js.map +1 -0
- package/package.json +2 -2
- package/dist/src/react-router/codemods/root.d.ts +0 -1
- package/dist/src/react-router/codemods/root.js +0 -171
- package/dist/src/react-router/codemods/root.js.map +0 -1
- package/dist/test/react-router/codemods/root.test.js +0 -178
- package/dist/test/react-router/codemods/root.test.js.map +0 -1
- /package/dist/{test/react-router/codemods/root.test.d.ts → e2e-tests/tests/react-router-instrumentation-api.test.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
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\n// Sentry mock functions defined at module level for the abort tests\nconst mockRootSpan = {\n setStatus: vi.fn(),\n end: vi.fn(),\n};\nconst mockActiveSpan = {};\nlet mockSentrySession = { status: 999 as number | string };\n\nvi.mock('@sentry/node', async () => {\n const actual = await vi.importActual<typeof import('@sentry/node')>(\n '@sentry/node',\n );\n return {\n ...actual,\n getActiveSpan: vi.fn(() => mockActiveSpan),\n getRootSpan: vi.fn(() => mockRootSpan),\n getCurrentScope: vi.fn(() => ({\n getSession: () => mockSentrySession,\n })),\n captureSession: vi.fn(),\n flush: vi.fn(() => Promise.resolve(true)),\n setTag: vi.fn(),\n captureException: vi.fn(() => 'id'),\n };\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 beforeEach(() => {\n vi.clearAllMocks();\n mockSentrySession = { status: 999 };\n });\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(mockRootSpan.setStatus).toHaveBeenLastCalledWith({\n code: 2,\n message: 'aborted',\n });\n expect(mockRootSpan.end).toHaveBeenCalledTimes(1);\n expect(mockSentrySession.status).toBe('crashed');\n expect(Sentry.flush).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(mockRootSpan.setStatus).toHaveBeenLastCalledWith({\n code: 1,\n message: 'cancelled',\n });\n expect(mockRootSpan.end).toHaveBeenCalledTimes(1);\n expect(mockSentrySession.status).toBe('abnormal');\n expect(Sentry.flush).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"]}
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../test/utils/clack/index.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAQmC;AAEnC,4CAA8B;AAC9B,iEAAmD;AAEnD,wFAA0E;AAC1E,iEAAmD;AAEnD,wEAK4C;AAE5C,kDAA0B;AAE1B,+EAA+E;AAC/E,sDAAwC;AAExC,qDAAuC;AAEvC,mCASgB;AAEhB,WAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IACzC,UAAU,EAAE,IAAI;IAChB,GAAG,CAAC,MAAM,WAAE,CAAC,YAAY,CAAsB,oBAAoB,CAAC,CAAC;CACtE,CAAC,CAAC,CAAC;AAEJ,WAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,GAAG,EAAE;QACH,IAAI,EAAE,WAAE,CAAC,EAAE,EAAE;QACb,OAAO,EAAE,WAAE,CAAC,EAAE,EAAE;QAChB,IAAI,EAAE,WAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE;KACf;IACD,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE;IACd,IAAI,EAAE,WAAE,CAAC,EAAE,EAAE;IACb,OAAO,EAAE,WAAE,CAAC,EAAE,EAAE;IAChB,MAAM,EAAE,WAAE,CAAC,EAAE,EAAE;IACf,mCAAmC;IACnC,QAAQ,EAAE,WAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;IACxC,OAAO,EAAE,WAAE;SACR,EAAE,EAAE;SACJ,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,EAAE,WAAE,CAAC,EAAE,EAAE;CAChB,CAAC,CAAC,CAAC;AACJ,MAAM,SAAS,GAAG,KAA6B,CAAC;AAEhD,WAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjB,MAAM,WAAW,GAAG,eAA6B,CAAC;AAElD,WAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE;IACpB,8BAA8B,EAAE,WAAE,CAAC,EAAE,EAAE;CACxC,CAAC,CAAC,CAAC;AAEJ,WAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACpB,OAAO,EAAE,WAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;CACvD,CAAC,CAAC,CAAC;AAEJ,oEAAoE;AACpE,MAAM,YAAY,GAAG;IACnB,SAAS,EAAE,WAAE,CAAC,EAAE,EAAE;IAClB,GAAG,EAAE,WAAE,CAAC,EAAE,EAAE;CACb,CAAC;AACF,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,IAAI,iBAAiB,GAAG,EAAE,MAAM,EAAE,GAAsB,EAAE,CAAC;AAE3D,WAAE,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;IACjC,MAAM,MAAM,GAAG,MAAM,WAAE,CAAC,YAAY,CAClC,cAAc,CACf,CAAC;IACF,OAAO;QACL,GAAG,MAAM;QACT,aAAa,EAAE,WAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC;QAC1C,WAAW,EAAE,WAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;QACtC,eAAe,EAAE,WAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5B,UAAU,EAAE,GAAG,EAAE,CAAC,iBAAiB;SACpC,CAAC,CAAC;QACH,cAAc,EAAE,WAAE,CAAC,EAAE,EAAE;QACvB,KAAK,EAAE,WAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,EAAE,WAAE,CAAC,EAAE,EAAE;QACf,gBAAgB,EAAE,WAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;KACpC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,SAAS,gBAAgB,CAAC,EAAQ,EAAE,QAAiB;IACnD,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,gBAAgB,CAAC,KAAK,CAAC,OAAe,EAAE,KAAK,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,EAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAE1E,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACxC,eAAM,CAAC,gBAAgB,CAAC;YACtB,mEAAmE;YACnE,OAAO,EAAE,eAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC;SAC/D,CAAC,CACH,CAAC;QAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,gBAAgB,CAAC,KAAK,CAAC,OAAe,EAAE,IAAI,CAAC,CAAC;QAC9C,gBAAgB,CAAC,KAAK,CAAC,IAAY,EAAE,sBAAsB,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,EAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAE1E,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACxC,eAAM,CAAC,gBAAgB,CAAC;YACtB,mEAAmE;YACnE,OAAO,EAAE,eAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC;SAC/D,CAAC,CACH,CAAC;QAEF,IAAA,eAAM,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACrC,eAAM,CAAC,gBAAgB,CAAC;YACtB,mEAAmE;YACnE,OAAO,EAAE,eAAM,CAAC,gBAAgB,CAC9B,4CAA4C,CAC7C;SACF,CAAC,CACH,CAAC;QAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,YAAY,GAAG,WAAE;aACpB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;aAC/B,kBAAkB,CAAC,WAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/B,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,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAA,eAAM,EAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,WAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,kBAAkB,CAAC,WAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/D,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,IAAA,eAAM,EAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAChD,IAAA,eAAM,EAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACzC,eAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,YAAY,GAAG,WAAE;aACpB,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,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAA,eAAM,EAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAA,eAAM,EAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAmB,EACtC,8BAA8B,EAC9B,EAAE,CACH,CAAC;QAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,WAAE,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QACzE,wEAAwE;QACxE,mCAAmC;QACnC,EAAE,EAAE,WAAE,CAAC,EAAE,CAAC,CAAC,GAAY,EAAE,EAAkB,EAAE,EAAE;YAC7C,IAAI,GAAG,KAAK,OAAO,EAAE;gBACnB,EAAE,CAAC,CAAC,CAAC,CAAC;aACP;QACH,CAAC,CAAC;QACF,kCAAkC;QAClC,MAAM,EAAE,EAAE,EAAE,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE;KACxB,CAAC,CAAC,CAAC;IAEJ,IAAA,WAAE,EAAC,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,WAAE,CAAC,EAAE,EAAE;YACf,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE;SACrB,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,IAAA,eAAM,EAAC,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,WAAE,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,WAAE,CAAC,EAAE,EAAE;YACf,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE;SACrB,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,IAAA,eAAM,EAAC,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,IAAA,WAAE,EAAC,+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,WAAE,CAAC,EAAE,EAAE;YACf,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE;SACrB,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,IAAA,eAAM,EAAC,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,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,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,OAAe,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,gBAAgB,CAAC,KAAK,CAAC,OAAe,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/D,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,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACxC,eAAM,CAAC,gBAAgB,CAAC;YACtB,mEAAmE;YACnE,OAAO,EAAE,eAAM,CAAC,gBAAgB,CAAC,+BAA+B,CAAC;SAClE,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;QAC3G,gBAAgB,CAAC,SAAS,CAAC,OAAe,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAEnE,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,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,OAAO,EAAE,GAAG,EAAE;IACrB,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,iBAAiB,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,4DAA4D;QAC5D,gEAAgE;QAChE,MAAM,OAAO,GAAG,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEvE,MAAM,IAAA,aAAK,GAAE,CAAC;QAEd,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAExC,IAAA,eAAM,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;QAExE,IAAA,eAAM,EAAC,YAAY,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC;YACtD,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,SAAS;SACnB,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,YAAY,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,IAAA,eAAM,EAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,4DAA4D;QAC5D,gEAAgE;QAChE,MAAM,OAAO,GAAG,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEvE,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEtB,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAExC,IAAA,eAAM,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAEpD,IAAA,eAAM,EAAC,YAAY,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC;YACtD,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,YAAY,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,IAAA,eAAM,EAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,wDAAwD;QACxD,OAAO,MAAM,CAAC,sCAAsC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,eAAe,GAAG,WAAE;aACvB,KAAK,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;aAClD,mBAAmB,CAAC,yBAAO,CAAC,CAAC;QAEhC,MAAM,cAAc,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;QAEjD,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEjD,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,IAAI,CAAC,yBAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,eAAe,GAAG,WAAE;aACvB,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,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEjD,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,IAAI,CAAC,yBAAO,CAAC,CAAC;QACtC,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,IAAI,CAAC,yBAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,IAAA,WAAE,EAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,eAAe,GAAG,WAAE;iBACvB,KAAK,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;iBAClD,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE7B,MAAM,cAAc,GAAG,MAAM,IAAA,yBAAiB,EAAC,yBAAO,CAAC,CAAC;YAExD,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAEjD,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,IAAI,CAAC,yBAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,eAAe,GAAG,WAAE;iBACvB,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,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAEjD,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,IAAI,CAAC,yBAAO,CAAC,CAAC;YACtC,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,IAAI,CAAC,qBAAG,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,eAAe,GAAG,WAAE;iBACvB,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,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACjD,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,IAAI,CAAC,sBAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,eAAe,GAAG,WAAE;iBACvB,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,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACjD,IAAA,eAAM,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAElD,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,IAAI,CAAC,sBAAI,CAAC,CAAC;YACnC,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,IAAI,CAAC,sBAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,2EAA2E;IAC3E,uEAAuE;IACvE,qCAAqC;IACrC,IAAI,OAAoC,CAAC;IAEzC,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;QACnB,oEAAoE;QACpE,sEAAsE;QACtE,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC9B,OAAO,GAAG,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE;YAC3D,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAwB,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,OAAO,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,IAAA,WAAE,EAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YAChF,QAAQ,CAAC,WAAoB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAEtD,MAAM,IAAA,eAAM,EACV,IAAA,yCAAiC,EAAC;gBAChC,gBAAgB,EAAE,SAAS;gBAC3B,GAAG,EAAE,SAAS;gBACd,cAAc,EAAE,IAAI;aACrB,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE1B,IAAA,eAAM,EAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAC1C,eAAM,CAAC,gBAAgB,CACrB,qDAAqD,CACtD,CACF,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC1E,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC7C,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;YAC9F,QAAQ,CAAC,WAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACpD,QAAQ,CAAC,8BAAuC,CAAC,eAAe,CAAC;gBAChE,gBAAgB;aACjB,CAAC,CAAC;YAEH,MAAM,IAAA,eAAM,EACV,IAAA,yCAAiC,EAAC;gBAChC,gBAAgB,EAAE,KAAK;gBACvB,GAAG,EAAE,SAAS;gBACd,cAAc,EAAE,IAAI;aACrB,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE1B,IAAA,eAAM,EAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACzC,eAAM,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,CAC1D,CAAC;YACF,IAAA,eAAM,EAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAC1C,eAAM,CAAC,gBAAgB,CACrB,wDAAwD,CACzD,CACF,CAAC;YACF,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACxC,0BAA0B,EAC1B,KAAK,CACN,CAAC;YACF,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC7C,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,IAAA,WAAE,EAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC3E,QAAQ,CAAC,WAAoB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACtD,gBAAgB,CAAC,KAAK,CAAC,OAAe,EAAE,IAAI,CAAC,CAAC;YAE9C,MAAM,IAAA,yCAAiC,EAAC;gBACtC,gBAAgB,EAAE,SAAS;gBAC3B,GAAG,EAAE,SAAS;aACf,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACxC,eAAM,CAAC,gBAAgB,CAAC;gBACtB,mEAAmE;gBACnE,OAAO,EAAE,eAAM,CAAC,gBAAgB,CAAC,6BAA6B,CAAC;aAChE,CAAC,CACH,CAAC;YACF,IAAA,eAAM,EAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC/C,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACvC,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YACzF,QAAQ,CAAC,WAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACpD,QAAQ,CAAC,8BAAuC,CAAC,eAAe,CAAC;gBAChE,gBAAgB;aACjB,CAAC,CAAC;YACH,gBAAgB,CAAC,KAAK,CAAC,OAAe,EAAE,IAAI,CAAC,CAAC;YAE9C,MAAM,IAAA,yCAAiC,EAAC;gBACtC,gBAAgB,EAAE,KAAK;gBACvB,GAAG,EAAE,SAAS;gBACd,cAAc,EAAE,KAAK;aACtB,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACzC,eAAM,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,CAC1D,CAAC;YACF,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACxC,eAAM,CAAC,gBAAgB,CAAC;gBACtB,mEAAmE;gBACnE,OAAO,EAAE,eAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC;aACpD,CAAC,CACH,CAAC;YACF,IAAA,eAAM,EAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC/C,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACvC,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACxC,0BAA0B,EAC1B,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YAClE,QAAQ,CAAC,WAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACpD,QAAQ,CAAC,8BAAuC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAEtE,MAAM,IAAA,yCAAiC,EAAC;gBACtC,gBAAgB,EAAE,SAAS;gBAC3B,GAAG,EAAE,SAAS;aACf,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC7C,IAAA,eAAM,EAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC9C,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import {\n abort,\n askForToolConfigPath,\n askForWizardLogin,\n confirmContinueIfNoOrDirtyGitRepo,\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';\nimport * as GitUtils from '../../../src/utils/git';\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('../../../src/utils/git', () => ({\n isInGitRepo: vi.fn(),\n getUncommittedOrUntrackedFiles: vi.fn(),\n}));\n\nvi.mock('opn', () => ({\n default: vi.fn(() => Promise.resolve({ on: vi.fn() })),\n}));\n\n// Sentry mock functions defined at module level for the abort tests\nconst mockRootSpan = {\n setStatus: vi.fn(),\n end: vi.fn(),\n};\nconst mockActiveSpan = {};\nlet mockSentrySession = { status: 999 as number | string };\n\nvi.mock('@sentry/node', async () => {\n const actual = await vi.importActual<typeof import('@sentry/node')>(\n '@sentry/node',\n );\n return {\n ...actual,\n getActiveSpan: vi.fn(() => mockActiveSpan),\n getRootSpan: vi.fn(() => mockRootSpan),\n getCurrentScope: vi.fn(() => ({\n getSession: () => mockSentrySession,\n })),\n captureSession: vi.fn(),\n flush: vi.fn(() => Promise.resolve(true)),\n setTag: vi.fn(),\n captureException: vi.fn(() => 'id'),\n };\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 beforeEach(() => {\n vi.clearAllMocks();\n mockSentrySession = { status: 999 };\n });\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(mockRootSpan.setStatus).toHaveBeenLastCalledWith({\n code: 2,\n message: 'aborted',\n });\n expect(mockRootSpan.end).toHaveBeenCalledTimes(1);\n expect(mockSentrySession.status).toBe('crashed');\n expect(Sentry.flush).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(mockRootSpan.setStatus).toHaveBeenLastCalledWith({\n code: 1,\n message: 'cancelled',\n });\n expect(mockRootSpan.end).toHaveBeenCalledTimes(1);\n expect(mockSentrySession.status).toBe('abnormal');\n expect(Sentry.flush).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\ndescribe('confirmContinueIfNoOrDirtyGitRepo', () => {\n // process.exit is mocked to throw so that abort() halts execution the same\n // way it would terminate the process in production, instead of falling\n // through to the interactive prompt.\n let exitSpy: ReturnType<typeof vi.spyOn>;\n\n beforeEach(() => {\n vi.clearAllMocks();\n // Drain any leftover `mockReturnValueOnce` values queued by earlier\n // suites; `clearAllMocks` clears call history but not the once-queue.\n clackMock.confirm.mockReset();\n exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => {\n throw new Error('exit');\n }) as typeof process.exit);\n });\n\n afterEach(() => {\n exitSpy.mockRestore();\n });\n\n describe('non-interactive mode', () => {\n it('aborts without prompting when the project is not a git repository', async () => {\n (GitUtils.isInGitRepo as Mock).mockReturnValue(false);\n\n await expect(\n confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: undefined,\n cwd: undefined,\n nonInteractive: true,\n }),\n ).rejects.toThrow('exit');\n\n expect(clack.log.error).toHaveBeenCalledWith(\n expect.stringContaining(\n 'not inside a git repository in non-interactive mode',\n ),\n );\n expect(Sentry.setTag).toHaveBeenCalledWith('continue-without-git', false);\n expect(clack.confirm).not.toHaveBeenCalled();\n expect(exitSpy).toHaveBeenCalled();\n });\n\n it('aborts without prompting when the repository has uncommitted or untracked files', async () => {\n (GitUtils.isInGitRepo as Mock).mockReturnValue(true);\n (GitUtils.getUncommittedOrUntrackedFiles as Mock).mockReturnValue([\n '- src/index.ts',\n ]);\n\n await expect(\n confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: false,\n cwd: undefined,\n nonInteractive: true,\n }),\n ).rejects.toThrow('exit');\n\n expect(clack.log.warn).toHaveBeenCalledWith(\n expect.stringContaining('uncommitted or untracked files'),\n );\n expect(clack.log.error).toHaveBeenCalledWith(\n expect.stringContaining(\n 'uncommitted or untracked files in non-interactive mode',\n ),\n );\n expect(Sentry.setTag).toHaveBeenCalledWith(\n 'continue-with-dirty-repo',\n false,\n );\n expect(clack.confirm).not.toHaveBeenCalled();\n expect(exitSpy).toHaveBeenCalled();\n });\n });\n\n describe('interactive mode (default)', () => {\n it('prompts to continue when the project is not a git repository', async () => {\n (GitUtils.isInGitRepo as Mock).mockReturnValue(false);\n mockUserResponse(clack.confirm as Mock, true);\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: undefined,\n cwd: undefined,\n });\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('not inside a git repository'),\n }),\n );\n expect(clack.log.error).not.toHaveBeenCalled();\n expect(exitSpy).not.toHaveBeenCalled();\n expect(Sentry.setTag).toHaveBeenCalledWith('continue-without-git', true);\n });\n\n it('prompts to continue when the repository has uncommitted or untracked files', async () => {\n (GitUtils.isInGitRepo as Mock).mockReturnValue(true);\n (GitUtils.getUncommittedOrUntrackedFiles as Mock).mockReturnValue([\n '- src/index.ts',\n ]);\n mockUserResponse(clack.confirm as Mock, true);\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: false,\n cwd: undefined,\n nonInteractive: false,\n });\n\n expect(clack.log.warn).toHaveBeenCalledWith(\n expect.stringContaining('uncommitted or untracked files'),\n );\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('continue anyway'),\n }),\n );\n expect(clack.log.error).not.toHaveBeenCalled();\n expect(exitSpy).not.toHaveBeenCalled();\n expect(Sentry.setTag).toHaveBeenCalledWith(\n 'continue-with-dirty-repo',\n true,\n );\n });\n\n it('does not prompt or abort for a clean git repository', async () => {\n (GitUtils.isInGitRepo as Mock).mockReturnValue(true);\n (GitUtils.getUncommittedOrUntrackedFiles as Mock).mockReturnValue([]);\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: undefined,\n cwd: undefined,\n });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n expect(clack.log.warn).not.toHaveBeenCalled();\n expect(exitSpy).not.toHaveBeenCalled();\n });\n });\n});\n"]}
|
|
@@ -60,6 +60,16 @@ vitest_1.vi.mock('child_process', async () => {
|
|
|
60
60
|
});
|
|
61
61
|
(0, vitest_1.expect)((0, git_1.getUncommittedOrUntrackedFiles)()).toEqual([]);
|
|
62
62
|
});
|
|
63
|
+
(0, vitest_1.it)('forwards cwd if provided', () => {
|
|
64
|
+
mockedExecSync.mockImplementationOnce(() => {
|
|
65
|
+
return '';
|
|
66
|
+
});
|
|
67
|
+
(0, git_1.getUncommittedOrUntrackedFiles)({ cwd: '/path/to/dir' });
|
|
68
|
+
(0, vitest_1.expect)(mockedExecSync).toHaveBeenCalledWith('git status --porcelain=v1', {
|
|
69
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
70
|
+
cwd: '/path/to/dir',
|
|
71
|
+
});
|
|
72
|
+
});
|
|
63
73
|
(0, vitest_1.it)('returns an empty list if the git command fails', () => {
|
|
64
74
|
mockedExecSync.mockImplementationOnce(() => {
|
|
65
75
|
throw new Error('Command failed');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.test.js","sourceRoot":"","sources":["../../../test/utils/git.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { beforeEach, describe, it, vi, expect } from 'vitest';\n\nimport {\n getUncommittedOrUntrackedFiles,\n isInGitRepo,\n} from '../../src/utils/git';\n\nconst { mockedExecSync } = vi.hoisted(() => {\n return { mockedExecSync: vi.fn() };\n});\n\nvi.mock('child_process', async () => {\n return {\n default: {},\n ...(await vi.importActual('child_process')),\n execSync: mockedExecSync,\n };\n});\n\nbeforeEach(() => {\n vi.clearAllMocks();\n});\n\ndescribe('isInGitRepo', () => {\n it('returns true if the git command process exits with 0', () => {\n mockedExecSync.mockImplementationOnce(() => {\n return 'true';\n });\n expect(isInGitRepo({ cwd: undefined })).toBe(true);\n });\n\n it('returns false if the git command process exits with non-zero', () => {\n mockedExecSync.mockImplementationOnce(() => {\n throw new Error('Command failed');\n });\n expect(isInGitRepo({ cwd: undefined })).toBe(false);\n });\n\n it('forwards cwd if provided', () => {\n mockedExecSync.mockImplementationOnce(() => {\n return 'true';\n });\n isInGitRepo({ cwd: '/path/to/dir' });\n expect(mockedExecSync).toHaveBeenCalledWith(\n 'git rev-parse --is-inside-work-tree',\n {\n stdio: 'ignore',\n cwd: '/path/to/dir',\n },\n );\n });\n});\n\ndescribe('getUncommittedOrUntrackedFiles', () => {\n it('returns a list of uncommitted or untracked files', () => {\n mockedExecSync.mockImplementationOnce(() => {\n return (\n ' M file1.txt\\n' +\n '?? file2.txt\\n' +\n '?? file3.txt\\n' +\n '?? file4.txt\\n'\n );\n });\n expect(getUncommittedOrUntrackedFiles()).toEqual([\n '- file1.txt',\n '- file2.txt',\n '- file3.txt',\n '- file4.txt',\n ]);\n });\n\n it('returns an empty list if there are no uncommitted or untracked files', () => {\n mockedExecSync.mockImplementationOnce(() => {\n return '';\n });\n\n expect(getUncommittedOrUntrackedFiles()).toEqual([]);\n });\n\n it('returns an empty list if the git command fails', () => {\n mockedExecSync.mockImplementationOnce(() => {\n throw new Error('Command failed');\n });\n\n expect(getUncommittedOrUntrackedFiles()).toEqual([]);\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"git.test.js","sourceRoot":"","sources":["../../../test/utils/git.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { beforeEach, describe, it, vi, expect } from 'vitest';\n\nimport {\n getUncommittedOrUntrackedFiles,\n isInGitRepo,\n} from '../../src/utils/git';\n\nconst { mockedExecSync } = vi.hoisted(() => {\n return { mockedExecSync: vi.fn() };\n});\n\nvi.mock('child_process', async () => {\n return {\n default: {},\n ...(await vi.importActual('child_process')),\n execSync: mockedExecSync,\n };\n});\n\nbeforeEach(() => {\n vi.clearAllMocks();\n});\n\ndescribe('isInGitRepo', () => {\n it('returns true if the git command process exits with 0', () => {\n mockedExecSync.mockImplementationOnce(() => {\n return 'true';\n });\n expect(isInGitRepo({ cwd: undefined })).toBe(true);\n });\n\n it('returns false if the git command process exits with non-zero', () => {\n mockedExecSync.mockImplementationOnce(() => {\n throw new Error('Command failed');\n });\n expect(isInGitRepo({ cwd: undefined })).toBe(false);\n });\n\n it('forwards cwd if provided', () => {\n mockedExecSync.mockImplementationOnce(() => {\n return 'true';\n });\n isInGitRepo({ cwd: '/path/to/dir' });\n expect(mockedExecSync).toHaveBeenCalledWith(\n 'git rev-parse --is-inside-work-tree',\n {\n stdio: 'ignore',\n cwd: '/path/to/dir',\n },\n );\n });\n});\n\ndescribe('getUncommittedOrUntrackedFiles', () => {\n it('returns a list of uncommitted or untracked files', () => {\n mockedExecSync.mockImplementationOnce(() => {\n return (\n ' M file1.txt\\n' +\n '?? file2.txt\\n' +\n '?? file3.txt\\n' +\n '?? file4.txt\\n'\n );\n });\n expect(getUncommittedOrUntrackedFiles()).toEqual([\n '- file1.txt',\n '- file2.txt',\n '- file3.txt',\n '- file4.txt',\n ]);\n });\n\n it('returns an empty list if there are no uncommitted or untracked files', () => {\n mockedExecSync.mockImplementationOnce(() => {\n return '';\n });\n\n expect(getUncommittedOrUntrackedFiles()).toEqual([]);\n });\n\n it('forwards cwd if provided', () => {\n mockedExecSync.mockImplementationOnce(() => {\n return '';\n });\n\n getUncommittedOrUntrackedFiles({ cwd: '/path/to/dir' });\n\n expect(mockedExecSync).toHaveBeenCalledWith('git status --porcelain=v1', {\n stdio: ['ignore', 'pipe', 'ignore'],\n cwd: '/path/to/dir',\n });\n });\n\n it('returns an empty list if the git command fails', () => {\n mockedExecSync.mockImplementationOnce(() => {\n throw new Error('Command failed');\n });\n\n expect(getUncommittedOrUntrackedFiles()).toEqual([]);\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const vitest_1 = require("vitest");
|
|
27
|
+
const fs = __importStar(require("fs"));
|
|
28
|
+
const path = __importStar(require("path"));
|
|
29
|
+
const os = __importStar(require("os"));
|
|
30
|
+
const line_endings_1 = require("../../src/utils/line-endings");
|
|
31
|
+
const git = __importStar(require("../../src/utils/git"));
|
|
32
|
+
(0, vitest_1.describe)('fixLineEndings', () => {
|
|
33
|
+
let tmpDir;
|
|
34
|
+
(0, vitest_1.beforeEach)(() => {
|
|
35
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'line-endings-test-'));
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.afterEach)(() => {
|
|
38
|
+
fs.rmSync(tmpDir, { recursive: true });
|
|
39
|
+
vitest_1.vi.restoreAllMocks();
|
|
40
|
+
});
|
|
41
|
+
(0, vitest_1.it)('normalizes mixed line endings to CRLF when file has CRLF', () => {
|
|
42
|
+
const filePath = path.join(tmpDir, 'mixed.dart');
|
|
43
|
+
fs.writeFileSync(filePath, 'line1\r\nline2\nline3\r\n', 'utf8');
|
|
44
|
+
vitest_1.vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([
|
|
45
|
+
`- ${filePath}`,
|
|
46
|
+
]);
|
|
47
|
+
(0, line_endings_1.fixLineEndings)();
|
|
48
|
+
const result = fs.readFileSync(filePath, 'utf8');
|
|
49
|
+
(0, vitest_1.expect)(result).toBe('line1\r\nline2\r\nline3\r\n');
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.it)('skips files that are pure LF', () => {
|
|
52
|
+
const filePath = path.join(tmpDir, 'lf.dart');
|
|
53
|
+
const original = 'line1\nline2\n';
|
|
54
|
+
fs.writeFileSync(filePath, original, 'utf8');
|
|
55
|
+
vitest_1.vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([
|
|
56
|
+
`- ${filePath}`,
|
|
57
|
+
]);
|
|
58
|
+
(0, line_endings_1.fixLineEndings)();
|
|
59
|
+
const result = fs.readFileSync(filePath, 'utf8');
|
|
60
|
+
(0, vitest_1.expect)(result).toBe(original);
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)('leaves consistent CRLF files unchanged', () => {
|
|
63
|
+
const filePath = path.join(tmpDir, 'crlf.dart');
|
|
64
|
+
const original = 'line1\r\nline2\r\n';
|
|
65
|
+
fs.writeFileSync(filePath, original, 'utf8');
|
|
66
|
+
vitest_1.vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([
|
|
67
|
+
`- ${filePath}`,
|
|
68
|
+
]);
|
|
69
|
+
(0, line_endings_1.fixLineEndings)();
|
|
70
|
+
const result = fs.readFileSync(filePath, 'utf8');
|
|
71
|
+
(0, vitest_1.expect)(result).toBe(original);
|
|
72
|
+
});
|
|
73
|
+
(0, vitest_1.it)('skips non-text files', () => {
|
|
74
|
+
const filePath = path.join(tmpDir, 'image.png');
|
|
75
|
+
const original = 'line1\r\nline2\nline3\r\n';
|
|
76
|
+
fs.writeFileSync(filePath, original, 'utf8');
|
|
77
|
+
vitest_1.vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([
|
|
78
|
+
`- ${filePath}`,
|
|
79
|
+
]);
|
|
80
|
+
(0, line_endings_1.fixLineEndings)();
|
|
81
|
+
const result = fs.readFileSync(filePath, 'utf8');
|
|
82
|
+
(0, vitest_1.expect)(result).toBe(original);
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('skips directories', () => {
|
|
85
|
+
const dirPath = path.join(tmpDir, 'subdir');
|
|
86
|
+
fs.mkdirSync(dirPath);
|
|
87
|
+
vitest_1.vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([
|
|
88
|
+
`- ${dirPath}`,
|
|
89
|
+
]);
|
|
90
|
+
(0, vitest_1.expect)(() => (0, line_endings_1.fixLineEndings)()).not.toThrow();
|
|
91
|
+
});
|
|
92
|
+
(0, vitest_1.it)('skips nonexistent files', () => {
|
|
93
|
+
vitest_1.vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([
|
|
94
|
+
'- nonexistent.txt',
|
|
95
|
+
]);
|
|
96
|
+
(0, vitest_1.expect)(() => (0, line_endings_1.fixLineEndings)()).not.toThrow();
|
|
97
|
+
});
|
|
98
|
+
(0, vitest_1.it)('does nothing when there are no modified files', () => {
|
|
99
|
+
vitest_1.vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([]);
|
|
100
|
+
(0, vitest_1.expect)(() => (0, line_endings_1.fixLineEndings)()).not.toThrow();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=line-endings.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-endings.test.js","sourceRoot":"","sources":["../../../test/utils/line-endings.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAyE;AACzE,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,+DAA8D;AAC9D,yDAA2C;AAE3C,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,MAAc,CAAC;IAEnB,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,WAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACjD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,2BAA2B,EAAE,MAAM,CAAC,CAAC;QAEhE,WAAE,CAAC,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC,eAAe,CAAC;YAC9D,KAAK,QAAQ,EAAE;SAChB,CAAC,CAAC;QAEH,IAAA,6BAAc,GAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE7C,WAAE,CAAC,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC,eAAe,CAAC;YAC9D,KAAK,QAAQ,EAAE;SAChB,CAAC,CAAC;QAEH,IAAA,6BAAc,GAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,oBAAoB,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE7C,WAAE,CAAC,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC,eAAe,CAAC;YAC9D,KAAK,QAAQ,EAAE;SAChB,CAAC,CAAC;QAEH,IAAA,6BAAc,GAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,2BAA2B,CAAC;QAC7C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE7C,WAAE,CAAC,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC,eAAe,CAAC;YAC9D,KAAK,QAAQ,EAAE;SAChB,CAAC,CAAC;QAEH,IAAA,6BAAc,GAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5C,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEtB,WAAE,CAAC,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC,eAAe,CAAC;YAC9D,KAAK,OAAO,EAAE;SACf,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,6BAAc,GAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,WAAE,CAAC,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC,eAAe,CAAC;YAC9D,mBAAmB;SACpB,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,6BAAc,GAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,WAAE,CAAC,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAEpE,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,6BAAc,GAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { fixLineEndings } from '../../src/utils/line-endings';\nimport * as git from '../../src/utils/git';\n\ndescribe('fixLineEndings', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'line-endings-test-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true });\n vi.restoreAllMocks();\n });\n\n it('normalizes mixed line endings to CRLF when file has CRLF', () => {\n const filePath = path.join(tmpDir, 'mixed.dart');\n fs.writeFileSync(filePath, 'line1\\r\\nline2\\nline3\\r\\n', 'utf8');\n\n vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([\n `- ${filePath}`,\n ]);\n\n fixLineEndings();\n\n const result = fs.readFileSync(filePath, 'utf8');\n expect(result).toBe('line1\\r\\nline2\\r\\nline3\\r\\n');\n });\n\n it('skips files that are pure LF', () => {\n const filePath = path.join(tmpDir, 'lf.dart');\n const original = 'line1\\nline2\\n';\n fs.writeFileSync(filePath, original, 'utf8');\n\n vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([\n `- ${filePath}`,\n ]);\n\n fixLineEndings();\n\n const result = fs.readFileSync(filePath, 'utf8');\n expect(result).toBe(original);\n });\n\n it('leaves consistent CRLF files unchanged', () => {\n const filePath = path.join(tmpDir, 'crlf.dart');\n const original = 'line1\\r\\nline2\\r\\n';\n fs.writeFileSync(filePath, original, 'utf8');\n\n vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([\n `- ${filePath}`,\n ]);\n\n fixLineEndings();\n\n const result = fs.readFileSync(filePath, 'utf8');\n expect(result).toBe(original);\n });\n\n it('skips non-text files', () => {\n const filePath = path.join(tmpDir, 'image.png');\n const original = 'line1\\r\\nline2\\nline3\\r\\n';\n fs.writeFileSync(filePath, original, 'utf8');\n\n vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([\n `- ${filePath}`,\n ]);\n\n fixLineEndings();\n\n const result = fs.readFileSync(filePath, 'utf8');\n expect(result).toBe(original);\n });\n\n it('skips directories', () => {\n const dirPath = path.join(tmpDir, 'subdir');\n fs.mkdirSync(dirPath);\n\n vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([\n `- ${dirPath}`,\n ]);\n\n expect(() => fixLineEndings()).not.toThrow();\n });\n\n it('skips nonexistent files', () => {\n vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([\n '- nonexistent.txt',\n ]);\n\n expect(() => fixLineEndings()).not.toThrow();\n });\n\n it('does nothing when there are no modified files', () => {\n vi.spyOn(git, 'getUncommittedOrUntrackedFiles').mockReturnValue([]);\n\n expect(() => fixLineEndings()).not.toThrow();\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/wizard",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.13.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",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@clack/prompts": "0.7.0",
|
|
30
30
|
"@sentry/node": "^10.29.0",
|
|
31
|
-
"axios": "1.
|
|
31
|
+
"axios": "1.15.2",
|
|
32
32
|
"chalk": "^2.4.1",
|
|
33
33
|
"glob": "9.3.5",
|
|
34
34
|
"inquirer": "^6.2.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function instrumentRoot(rootFileName: string): Promise<void>;
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.instrumentRoot = void 0;
|
|
27
|
-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
28
|
-
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
29
|
-
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
30
|
-
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
31
|
-
const recast = __importStar(require("recast"));
|
|
32
|
-
const path = __importStar(require("path"));
|
|
33
|
-
const magicast_1 = require("magicast");
|
|
34
|
-
const templates_1 = require("../templates");
|
|
35
|
-
const ast_utils_1 = require("../../utils/ast-utils");
|
|
36
|
-
const debug_1 = require("../../utils/debug");
|
|
37
|
-
function hasCaptureExceptionCall(node) {
|
|
38
|
-
let found = false;
|
|
39
|
-
recast.visit(node, {
|
|
40
|
-
visitCallExpression(path) {
|
|
41
|
-
const callee = path.value.callee;
|
|
42
|
-
if ((callee.type === 'MemberExpression' &&
|
|
43
|
-
callee.object?.name === 'Sentry' &&
|
|
44
|
-
callee.property?.name === 'captureException') ||
|
|
45
|
-
(callee.type === 'Identifier' && callee.name === 'captureException')) {
|
|
46
|
-
found = true;
|
|
47
|
-
}
|
|
48
|
-
this.traverse(path);
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
return found;
|
|
52
|
-
}
|
|
53
|
-
function addCaptureExceptionCall(functionNode) {
|
|
54
|
-
const captureExceptionCall = recast.parse(`Sentry.captureException(error);`)
|
|
55
|
-
.program.body[0];
|
|
56
|
-
const functionBody = (0, ast_utils_1.safeGetFunctionBody)(functionNode);
|
|
57
|
-
if (functionBody) {
|
|
58
|
-
if (!(0, ast_utils_1.safeInsertBeforeReturn)(functionBody, captureExceptionCall)) {
|
|
59
|
-
functionBody.push(captureExceptionCall);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
(0, debug_1.debug)('Could not safely access ErrorBoundary function body');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
function findErrorBoundaryInExports(namedExports) {
|
|
67
|
-
return namedExports.some((namedExport) => {
|
|
68
|
-
const declaration = namedExport.declaration;
|
|
69
|
-
if (!declaration) {
|
|
70
|
-
return namedExport.specifiers?.some((spec) => spec.type === 'ExportSpecifier' &&
|
|
71
|
-
spec.exported?.type === 'Identifier' &&
|
|
72
|
-
spec.exported.name === 'ErrorBoundary');
|
|
73
|
-
}
|
|
74
|
-
if (declaration.type === 'FunctionDeclaration') {
|
|
75
|
-
return declaration.id?.name === 'ErrorBoundary';
|
|
76
|
-
}
|
|
77
|
-
if (declaration.type === 'VariableDeclaration') {
|
|
78
|
-
return declaration.declarations.some((decl) => {
|
|
79
|
-
// @ts-expect-error - id should always have a name in this case
|
|
80
|
-
return decl.id?.name === 'ErrorBoundary';
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
return false;
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
async function instrumentRoot(rootFileName) {
|
|
87
|
-
const filePath = path.join(process.cwd(), 'app', rootFileName);
|
|
88
|
-
const rootRouteAst = await (0, magicast_1.loadFile)(filePath);
|
|
89
|
-
const exportsAst = rootRouteAst.exports.$ast;
|
|
90
|
-
const namedExports = exportsAst.body.filter((node) => node.type === 'ExportNamedDeclaration');
|
|
91
|
-
const foundErrorBoundary = findErrorBoundaryInExports(namedExports);
|
|
92
|
-
const alreadyHasSentry = (0, ast_utils_1.hasSentryContent)(rootRouteAst.$ast);
|
|
93
|
-
if (!alreadyHasSentry) {
|
|
94
|
-
rootRouteAst.imports.$add({
|
|
95
|
-
from: '@sentry/react-router',
|
|
96
|
-
imported: '*',
|
|
97
|
-
local: 'Sentry',
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
if (!foundErrorBoundary) {
|
|
101
|
-
const hasIsRouteErrorResponseImport = rootRouteAst.imports.$items.some((item) => item.imported === 'isRouteErrorResponse' &&
|
|
102
|
-
item.from === 'react-router');
|
|
103
|
-
if (!hasIsRouteErrorResponseImport) {
|
|
104
|
-
rootRouteAst.imports.$add({
|
|
105
|
-
from: 'react-router',
|
|
106
|
-
imported: 'isRouteErrorResponse',
|
|
107
|
-
local: 'isRouteErrorResponse',
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
recast.visit(rootRouteAst.$ast, {
|
|
111
|
-
visitExportDefaultDeclaration(path) {
|
|
112
|
-
const implementation = recast.parse(templates_1.ERROR_BOUNDARY_TEMPLATE).program
|
|
113
|
-
.body[0];
|
|
114
|
-
path.insertBefore(recast.types.builders.exportDeclaration(false, implementation));
|
|
115
|
-
this.traverse(path);
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
recast.visit(rootRouteAst.$ast, {
|
|
121
|
-
visitExportNamedDeclaration(path) {
|
|
122
|
-
const declaration = path.value.declaration;
|
|
123
|
-
if (!declaration) {
|
|
124
|
-
this.traverse(path);
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
let functionToInstrument = null;
|
|
128
|
-
if (declaration.type === 'FunctionDeclaration' &&
|
|
129
|
-
declaration.id?.name === 'ErrorBoundary') {
|
|
130
|
-
functionToInstrument = declaration;
|
|
131
|
-
}
|
|
132
|
-
else if (declaration.type === 'VariableDeclaration' &&
|
|
133
|
-
declaration.declarations?.[0]?.id?.name === 'ErrorBoundary') {
|
|
134
|
-
const init = declaration.declarations[0].init;
|
|
135
|
-
if (init &&
|
|
136
|
-
(init.type === 'FunctionExpression' ||
|
|
137
|
-
init.type === 'ArrowFunctionExpression')) {
|
|
138
|
-
functionToInstrument = init;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
if (functionToInstrument &&
|
|
142
|
-
!hasCaptureExceptionCall(functionToInstrument)) {
|
|
143
|
-
addCaptureExceptionCall(functionToInstrument);
|
|
144
|
-
}
|
|
145
|
-
this.traverse(path);
|
|
146
|
-
},
|
|
147
|
-
visitVariableDeclaration(path) {
|
|
148
|
-
if (path.value.declarations?.[0]?.id?.name === 'ErrorBoundary') {
|
|
149
|
-
const init = path.value.declarations[0].init;
|
|
150
|
-
if (init &&
|
|
151
|
-
(init.type === 'FunctionExpression' ||
|
|
152
|
-
init.type === 'ArrowFunctionExpression') &&
|
|
153
|
-
!hasCaptureExceptionCall(init)) {
|
|
154
|
-
addCaptureExceptionCall(init);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
this.traverse(path);
|
|
158
|
-
},
|
|
159
|
-
visitFunctionDeclaration(path) {
|
|
160
|
-
if (path.value.id?.name === 'ErrorBoundary' &&
|
|
161
|
-
!hasCaptureExceptionCall(path.value)) {
|
|
162
|
-
addCaptureExceptionCall(path.value);
|
|
163
|
-
}
|
|
164
|
-
this.traverse(path);
|
|
165
|
-
},
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
await (0, magicast_1.writeFile)(rootRouteAst.$ast, filePath);
|
|
169
|
-
}
|
|
170
|
-
exports.instrumentRoot = instrumentRoot;
|
|
171
|
-
//# sourceMappingURL=root.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../../../src/react-router/codemods/root.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport * as recast from 'recast';\nimport * as path from 'path';\n\nimport type { ExportNamedDeclaration } from '@babel/types';\nimport type { namedTypes as t } from 'ast-types';\n\nimport {\n loadFile,\n writeFile,\n // @ts-expect-error - magicast is ESM and TS complains about that. It works though\n} from 'magicast';\n\nimport { ERROR_BOUNDARY_TEMPLATE } from '../templates';\nimport {\n hasSentryContent,\n safeGetFunctionBody,\n safeInsertBeforeReturn,\n} from '../../utils/ast-utils';\nimport { debug } from '../../utils/debug';\n\nfunction hasCaptureExceptionCall(node: t.Node): boolean {\n let found = false;\n recast.visit(node, {\n visitCallExpression(path) {\n const callee = path.value.callee;\n if (\n (callee.type === 'MemberExpression' &&\n callee.object?.name === 'Sentry' &&\n callee.property?.name === 'captureException') ||\n (callee.type === 'Identifier' && callee.name === 'captureException')\n ) {\n found = true;\n }\n this.traverse(path);\n },\n });\n return found;\n}\n\nfunction addCaptureExceptionCall(functionNode: t.Node): void {\n const captureExceptionCall = recast.parse(`Sentry.captureException(error);`)\n .program.body[0];\n\n const functionBody = safeGetFunctionBody(functionNode);\n if (functionBody) {\n if (!safeInsertBeforeReturn(functionBody, captureExceptionCall)) {\n functionBody.push(captureExceptionCall);\n }\n } else {\n debug('Could not safely access ErrorBoundary function body');\n }\n}\n\nfunction findErrorBoundaryInExports(\n namedExports: ExportNamedDeclaration[],\n): boolean {\n return namedExports.some((namedExport) => {\n const declaration = namedExport.declaration;\n\n if (!declaration) {\n return namedExport.specifiers?.some(\n (spec) =>\n spec.type === 'ExportSpecifier' &&\n spec.exported?.type === 'Identifier' &&\n spec.exported.name === 'ErrorBoundary',\n );\n }\n\n if (declaration.type === 'FunctionDeclaration') {\n return declaration.id?.name === 'ErrorBoundary';\n }\n\n if (declaration.type === 'VariableDeclaration') {\n return declaration.declarations.some((decl) => {\n // @ts-expect-error - id should always have a name in this case\n return decl.id?.name === 'ErrorBoundary';\n });\n }\n\n return false;\n });\n}\n\nexport async function instrumentRoot(rootFileName: string): Promise<void> {\n const filePath = path.join(process.cwd(), 'app', rootFileName);\n const rootRouteAst = await loadFile(filePath);\n\n const exportsAst = rootRouteAst.exports.$ast as t.Program;\n const namedExports = exportsAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n const foundErrorBoundary = findErrorBoundaryInExports(namedExports);\n const alreadyHasSentry = hasSentryContent(rootRouteAst.$ast as t.Program);\n\n if (!alreadyHasSentry) {\n rootRouteAst.imports.$add({\n from: '@sentry/react-router',\n imported: '*',\n local: 'Sentry',\n });\n }\n\n if (!foundErrorBoundary) {\n const hasIsRouteErrorResponseImport = rootRouteAst.imports.$items.some(\n (item) =>\n item.imported === 'isRouteErrorResponse' &&\n item.from === 'react-router',\n );\n\n if (!hasIsRouteErrorResponseImport) {\n rootRouteAst.imports.$add({\n from: 'react-router',\n imported: 'isRouteErrorResponse',\n local: 'isRouteErrorResponse',\n });\n }\n\n recast.visit(rootRouteAst.$ast, {\n visitExportDefaultDeclaration(path) {\n const implementation = recast.parse(ERROR_BOUNDARY_TEMPLATE).program\n .body[0];\n\n path.insertBefore(\n recast.types.builders.exportDeclaration(false, implementation),\n );\n\n this.traverse(path);\n },\n });\n } else {\n recast.visit(rootRouteAst.$ast, {\n visitExportNamedDeclaration(path) {\n const declaration = path.value.declaration;\n if (!declaration) {\n this.traverse(path);\n return;\n }\n\n let functionToInstrument = null;\n\n if (\n declaration.type === 'FunctionDeclaration' &&\n declaration.id?.name === 'ErrorBoundary'\n ) {\n functionToInstrument = declaration;\n } else if (\n declaration.type === 'VariableDeclaration' &&\n declaration.declarations?.[0]?.id?.name === 'ErrorBoundary'\n ) {\n const init = declaration.declarations[0].init;\n if (\n init &&\n (init.type === 'FunctionExpression' ||\n init.type === 'ArrowFunctionExpression')\n ) {\n functionToInstrument = init;\n }\n }\n\n if (\n functionToInstrument &&\n !hasCaptureExceptionCall(functionToInstrument)\n ) {\n addCaptureExceptionCall(functionToInstrument);\n }\n\n this.traverse(path);\n },\n\n visitVariableDeclaration(path) {\n if (path.value.declarations?.[0]?.id?.name === 'ErrorBoundary') {\n const init = path.value.declarations[0].init;\n if (\n init &&\n (init.type === 'FunctionExpression' ||\n init.type === 'ArrowFunctionExpression') &&\n !hasCaptureExceptionCall(init)\n ) {\n addCaptureExceptionCall(init);\n }\n }\n this.traverse(path);\n },\n\n visitFunctionDeclaration(path) {\n if (\n path.value.id?.name === 'ErrorBoundary' &&\n !hasCaptureExceptionCall(path.value)\n ) {\n addCaptureExceptionCall(path.value);\n }\n this.traverse(path);\n },\n });\n }\n\n await writeFile(rootRouteAst.$ast, filePath);\n}\n"]}
|