@sentry/wizard 6.7.0 → 6.8.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 CHANGED
@@ -1,12 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 6.8.0
4
+
5
+ ### Features
6
+
7
+ - feat(pnpm): Allow pnpm catalog in the package.json ([#1117](https://github.com/getsentry/sentry-wizard/pull/1117))
8
+
3
9
  ## 6.7.0
4
10
 
5
11
  ### Features
6
12
 
7
13
  - feat: Add wizard for `react-router` framework mode ([#1076](https://github.com/getsentry/sentry-wizard/pull/1076))
8
14
 
9
- This release adds a new wizard setup flow for React Router (framework):
15
+ This release adds a new wizard setup flow for React Router (framework):
10
16
  ```sh
11
17
  npx @sentry/wizard@latest -i reactRouter
12
18
  ```
@@ -14,11 +20,11 @@
14
20
 
15
21
  This release adds a new mode for setting up the Sentry SDK in NextJS for Spotlight.
16
22
  When running
17
-
23
+
18
24
  ```sh
19
25
  npx @sentry/wizard@latest -i nextjs --spotlight
20
26
  ```
21
- the NextJS SDK will be configured to only send its telemetry to Spotlight.
27
+ the NextJS SDK will be configured to only send its telemetry to Spotlight.
22
28
  No Sentry account is required to complete this flow.
23
29
 
24
30
  ## 6.6.1
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,206 @@
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 path = __importStar(require("node:path"));
27
+ const fs = __importStar(require("node:fs"));
28
+ const Constants_1 = require("../../lib/Constants");
29
+ const utils_1 = require("../utils");
30
+ const vitest_1 = require("vitest");
31
+ //@ts-expect-error - clifty is ESM only
32
+ const clifty_1 = require("clifty");
33
+ (0, vitest_1.describe)('pnpm workspace', () => {
34
+ const workspaceDir = path.resolve(__dirname, '../test-applications/pnpm-workspace-test-app');
35
+ const projectDir = path.resolve(workspaceDir, 'packages/sveltekit');
36
+ const integration = Constants_1.Integration.sveltekit;
37
+ let wizardExitCode;
38
+ (0, vitest_1.beforeAll)(async () => {
39
+ (0, utils_1.initGit)(workspaceDir);
40
+ (0, utils_1.revertLocalChanges)(workspaceDir);
41
+ wizardExitCode = await (0, clifty_1.withEnv)({
42
+ cwd: projectDir,
43
+ })
44
+ .defineInteraction()
45
+ .expectOutput('The Sentry SvelteKit Wizard will help you set up Sentry for your application')
46
+ .step('package installation', ({ expectOutput, whenAsked }) => {
47
+ whenAsked('Please select your package manager.').respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.DOWN, clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER);
48
+ expectOutput('Installing @sentry/sveltekit');
49
+ })
50
+ .step('SDK setup', ({ whenAsked }) => {
51
+ whenAsked('Do you want to enable Tracing', {
52
+ timeout: 90000, // package installation can take a while in CI
53
+ }).respondWith(clifty_1.KEYS.ENTER);
54
+ whenAsked('Do you want to enable Session Replay').respondWith(clifty_1.KEYS.ENTER);
55
+ whenAsked('Do you want to enable Logs').respondWith(clifty_1.KEYS.ENTER);
56
+ })
57
+ .whenAsked('Do you want to create an example page')
58
+ .respondWith(clifty_1.KEYS.ENTER)
59
+ .whenAsked('Optionally add a project-scoped MCP server configuration for the Sentry MCP?')
60
+ .respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER)
61
+ .expectOutput('Successfully installed the Sentry SvelteKit SDK!')
62
+ .run((0, utils_1.getWizardCommand)(integration));
63
+ });
64
+ (0, vitest_1.afterAll)(() => {
65
+ (0, utils_1.revertLocalChanges)(workspaceDir);
66
+ (0, utils_1.cleanupGit)(workspaceDir);
67
+ });
68
+ (0, vitest_1.it)('exits with exit code 0', () => {
69
+ (0, vitest_1.expect)(wizardExitCode).toBe(0);
70
+ });
71
+ (0, vitest_1.it)('adds the SDK dependency to package.json', () => {
72
+ (0, utils_1.checkPackageJson)(projectDir, integration);
73
+ });
74
+ (0, vitest_1.it)('adds the .env.sentry-build-plugin', () => {
75
+ (0, utils_1.checkEnvBuildPlugin)(projectDir);
76
+ });
77
+ (0, vitest_1.it)('adds the example page', () => {
78
+ (0, utils_1.checkFileExists)(path.resolve(projectDir, 'src/routes/sentry-example-page/+page.svelte'));
79
+ (0, utils_1.checkFileExists)(path.resolve(projectDir, 'src/routes/sentry-example-page/+server.js'));
80
+ });
81
+ (0, vitest_1.it)('adds the sentry plugin to vite.config.ts', () => {
82
+ const viteConfig = fs.readFileSync(path.resolve(projectDir, 'vite.config.ts'));
83
+ (0, vitest_1.expect)(viteConfig.toString()).toMatchInlineSnapshot(`
84
+ "import { sentrySvelteKit } from "@sentry/sveltekit";
85
+ import { sveltekit } from '@sveltejs/kit/vite';
86
+ import { defineConfig } from 'vite';
87
+
88
+ export default defineConfig({
89
+ plugins: [sentrySvelteKit({
90
+ sourceMapsUploadOptions: {
91
+ org: "${utils_1.TEST_ARGS.ORG_SLUG}",
92
+ project: "${utils_1.TEST_ARGS.PROJECT_SLUG}"
93
+ }
94
+ }), sveltekit()]
95
+ });"
96
+ `);
97
+ });
98
+ (0, vitest_1.it)('creates the hook files', () => {
99
+ const clientHooks = fs.readFileSync(path.resolve(projectDir, 'src/hooks.client.ts'));
100
+ const serverHooks = fs.readFileSync(path.resolve(projectDir, 'src/hooks.server.ts'));
101
+ (0, vitest_1.expect)(clientHooks.toString()).toMatchInlineSnapshot(`
102
+ "import { handleErrorWithSentry, replayIntegration } from "@sentry/sveltekit";
103
+ import * as Sentry from '@sentry/sveltekit';
104
+
105
+ Sentry.init({
106
+ dsn: '${utils_1.TEST_ARGS.PROJECT_DSN}',
107
+
108
+ tracesSampleRate: 1.0,
109
+
110
+ // Enable logs to be sent to Sentry
111
+ enableLogs: true,
112
+
113
+ // This sets the sample rate to be 10%. You may want this to be 100% while
114
+ // in development and sample at a lower rate in production
115
+ replaysSessionSampleRate: 0.1,
116
+
117
+ // If the entire session is not sampled, use the below sample rate to sample
118
+ // sessions when an error occurs.
119
+ replaysOnErrorSampleRate: 1.0,
120
+
121
+ // If you don't want to use Session Replay, just remove the line below:
122
+ integrations: [replayIntegration()],
123
+
124
+ // Enable sending user PII (Personally Identifiable Information)
125
+ // https://docs.sentry.io/platforms/javascript/guides/sveltekit/configuration/options/#sendDefaultPii
126
+ sendDefaultPii: true,
127
+ });
128
+
129
+ // If you have a custom error handler, pass it to \`handleErrorWithSentry\`
130
+ export const handleError = handleErrorWithSentry();
131
+ "
132
+ `);
133
+ (0, vitest_1.expect)(serverHooks.toString()).toMatchInlineSnapshot(`
134
+ "import {sequence} from "@sveltejs/kit/hooks";
135
+ import * as Sentry from "@sentry/sveltekit";
136
+ export const handle = sequence(Sentry.sentryHandle(), async ({ event, resolve }) => {
137
+ const response = await resolve(event);
138
+ return response;
139
+ });
140
+ export const handleError = Sentry.handleErrorWithSentry();"
141
+ `);
142
+ });
143
+ (0, vitest_1.it)('creates the insturmentation.server file', () => {
144
+ const instrumentationServer = fs.readFileSync(path.resolve(projectDir, 'src/instrumentation.server.ts'));
145
+ (0, vitest_1.expect)(instrumentationServer.toString()).toMatchInlineSnapshot(`
146
+ "import * as Sentry from '@sentry/sveltekit';
147
+
148
+ Sentry.init({
149
+ dsn: '${utils_1.TEST_ARGS.PROJECT_DSN}',
150
+
151
+ tracesSampleRate: 1.0,
152
+
153
+ // Enable logs to be sent to Sentry
154
+ enableLogs: true,
155
+
156
+ // uncomment the line below to enable Spotlight (https://spotlightjs.com)
157
+ // spotlight: import.meta.env.DEV,
158
+ });"
159
+ `);
160
+ });
161
+ (0, vitest_1.it)('enables tracing and instrumentation in svelte.config.js', () => {
162
+ const svelteConfig = fs.readFileSync(path.resolve(projectDir, 'svelte.config.js'));
163
+ (0, vitest_1.expect)(svelteConfig.toString()).toMatchInlineSnapshot(`
164
+ "import adapter from '@sveltejs/adapter-node';
165
+ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
166
+
167
+ /** @type {import('@sveltejs/kit').Config} */
168
+ const config = {
169
+ // Consult https://svelte.dev/docs/kit/integrations#preprocessors
170
+ // for more information about preprocessors
171
+ preprocess: vitePreprocess(),
172
+
173
+ kit: {
174
+ // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
175
+ // If your environment is not supported, or you settled on a specific environment, switch out the adapter.
176
+ // See https://svelte.dev/docs/kit/adapters for more information about adapters.
177
+ adapter: adapter(),
178
+ experimental: {
179
+ remoteFunctions: true,
180
+
181
+ tracing: {
182
+ server: true,
183
+ },
184
+
185
+ instrumentation: {
186
+ server: true,
187
+ },
188
+ },
189
+ },
190
+ };
191
+
192
+ export default config;"
193
+ `);
194
+ });
195
+ // checkSvelteKitProject(projectDir, integration);
196
+ (0, vitest_1.it)('builds successfully', async () => {
197
+ await (0, utils_1.checkIfBuilds)(projectDir);
198
+ });
199
+ (0, vitest_1.it)('runs on dev mode correctly', async () => {
200
+ await (0, utils_1.checkIfRunsOnDevMode)(projectDir, 'ready in');
201
+ });
202
+ (0, vitest_1.it)('runs on prod mode correctly', async () => {
203
+ await (0, utils_1.checkIfRunsOnProdMode)(projectDir, 'to expose', 'preview');
204
+ });
205
+ });
206
+ //# sourceMappingURL=pnpm-workspace.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm-workspace.test.js","sourceRoot":"","sources":["../../../e2e-tests/tests/pnpm-workspace.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { Integration } from '../../lib/Constants';\nimport {\n checkEnvBuildPlugin,\n checkFileExists,\n checkIfBuilds,\n checkIfRunsOnDevMode,\n checkIfRunsOnProdMode,\n checkPackageJson,\n cleanupGit,\n getWizardCommand,\n initGit,\n revertLocalChanges,\n TEST_ARGS,\n} from '../utils';\nimport { afterAll, beforeAll, describe, expect, it } from 'vitest';\n\n//@ts-expect-error - clifty is ESM only\nimport { KEYS, withEnv } from 'clifty';\n\ndescribe('pnpm workspace', () => {\n const workspaceDir = path.resolve(\n __dirname,\n '../test-applications/pnpm-workspace-test-app',\n );\n const projectDir = path.resolve(workspaceDir, 'packages/sveltekit');\n\n const integration = Integration.sveltekit;\n let wizardExitCode: number;\n\n beforeAll(async () => {\n initGit(workspaceDir);\n revertLocalChanges(workspaceDir);\n\n wizardExitCode = await withEnv({\n cwd: projectDir,\n })\n .defineInteraction()\n .expectOutput(\n 'The Sentry SvelteKit Wizard will help you set up Sentry for your application',\n )\n .step('package installation', ({ expectOutput, whenAsked }) => {\n whenAsked('Please select your package manager.').respondWith(\n KEYS.DOWN,\n KEYS.DOWN,\n KEYS.DOWN,\n KEYS.ENTER,\n );\n expectOutput('Installing @sentry/sveltekit');\n })\n .step('SDK setup', ({ whenAsked }) => {\n whenAsked('Do you want to enable Tracing', {\n timeout: 90_000, // package installation can take a while in CI\n }).respondWith(KEYS.ENTER);\n whenAsked('Do you want to enable Session Replay').respondWith(\n KEYS.ENTER,\n );\n whenAsked('Do you want to enable Logs').respondWith(KEYS.ENTER);\n })\n .whenAsked('Do you want to create an example page')\n .respondWith(KEYS.ENTER)\n .whenAsked(\n 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?',\n )\n .respondWith(KEYS.DOWN, KEYS.ENTER)\n .expectOutput('Successfully installed the Sentry SvelteKit SDK!')\n .run(getWizardCommand(integration));\n });\n\n afterAll(() => {\n revertLocalChanges(workspaceDir);\n cleanupGit(workspaceDir);\n });\n\n it('exits with exit code 0', () => {\n expect(wizardExitCode).toBe(0);\n });\n\n it('adds the SDK dependency to package.json', () => {\n checkPackageJson(projectDir, integration);\n });\n\n it('adds the .env.sentry-build-plugin', () => {\n checkEnvBuildPlugin(projectDir);\n });\n\n it('adds the example page', () => {\n checkFileExists(\n path.resolve(projectDir, 'src/routes/sentry-example-page/+page.svelte'),\n );\n checkFileExists(\n path.resolve(projectDir, 'src/routes/sentry-example-page/+server.js'),\n );\n });\n\n it('adds the sentry plugin to vite.config.ts', () => {\n const viteConfig = fs.readFileSync(\n path.resolve(projectDir, 'vite.config.ts'),\n );\n expect(viteConfig.toString()).toMatchInlineSnapshot(`\n \"import { sentrySvelteKit } from \"@sentry/sveltekit\";\n import { sveltekit } from '@sveltejs/kit/vite';\n import { defineConfig } from 'vite';\n\n export default defineConfig({\n \tplugins: [sentrySvelteKit({\n sourceMapsUploadOptions: {\n org: \"${TEST_ARGS.ORG_SLUG}\",\n project: \"${TEST_ARGS.PROJECT_SLUG}\"\n }\n }), sveltekit()]\n });\"\n `);\n });\n\n it('creates the hook files', () => {\n const clientHooks = fs.readFileSync(\n path.resolve(projectDir, 'src/hooks.client.ts'),\n );\n const serverHooks = fs.readFileSync(\n path.resolve(projectDir, 'src/hooks.server.ts'),\n );\n\n expect(clientHooks.toString()).toMatchInlineSnapshot(`\n \"import { handleErrorWithSentry, replayIntegration } from \"@sentry/sveltekit\";\n import * as Sentry from '@sentry/sveltekit';\n\n Sentry.init({\n dsn: '${TEST_ARGS.PROJECT_DSN}',\n\n tracesSampleRate: 1.0,\n\n // Enable logs to be sent to Sentry\n enableLogs: true,\n\n // This sets the sample rate to be 10%. You may want this to be 100% while\n // in development and sample at a lower rate in production\n replaysSessionSampleRate: 0.1,\n\n // If the entire session is not sampled, use the below sample rate to sample\n // sessions when an error occurs.\n replaysOnErrorSampleRate: 1.0,\n\n // If you don't want to use Session Replay, just remove the line below:\n integrations: [replayIntegration()],\n\n // Enable sending user PII (Personally Identifiable Information)\n // https://docs.sentry.io/platforms/javascript/guides/sveltekit/configuration/options/#sendDefaultPii\n sendDefaultPii: true,\n });\n\n // If you have a custom error handler, pass it to \\`handleErrorWithSentry\\`\n export const handleError = handleErrorWithSentry();\n \"\n `);\n\n expect(serverHooks.toString()).toMatchInlineSnapshot(`\n \"import {sequence} from \"@sveltejs/kit/hooks\";\n import * as Sentry from \"@sentry/sveltekit\";\n export const handle = sequence(Sentry.sentryHandle(), async ({ event, resolve }) => {\n const response = await resolve(event);\n return response;\n });\n export const handleError = Sentry.handleErrorWithSentry();\"\n `);\n });\n\n it('creates the insturmentation.server file', () => {\n const instrumentationServer = fs.readFileSync(\n path.resolve(projectDir, 'src/instrumentation.server.ts'),\n );\n\n expect(instrumentationServer.toString()).toMatchInlineSnapshot(`\n \"import * as Sentry from '@sentry/sveltekit';\n\n Sentry.init({\n dsn: '${TEST_ARGS.PROJECT_DSN}',\n\n tracesSampleRate: 1.0,\n\n // Enable logs to be sent to Sentry\n enableLogs: true,\n\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: import.meta.env.DEV,\n });\"\n `);\n });\n\n it('enables tracing and instrumentation in svelte.config.js', () => {\n const svelteConfig = fs.readFileSync(\n path.resolve(projectDir, 'svelte.config.js'),\n );\n expect(svelteConfig.toString()).toMatchInlineSnapshot(`\n \"import adapter from '@sveltejs/adapter-node';\n import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';\n\n /** @type {import('@sveltejs/kit').Config} */\n const config = {\n // Consult https://svelte.dev/docs/kit/integrations#preprocessors\n // for more information about preprocessors\n preprocess: vitePreprocess(),\n\n kit: {\n // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.\n // If your environment is not supported, or you settled on a specific environment, switch out the adapter.\n // See https://svelte.dev/docs/kit/adapters for more information about adapters.\n adapter: adapter(),\n experimental: {\n remoteFunctions: true,\n\n tracing: {\n server: true,\n },\n\n instrumentation: {\n server: true,\n },\n },\n },\n };\n\n export default config;\"\n `);\n });\n\n // checkSvelteKitProject(projectDir, integration);\n it('builds successfully', async () => {\n await checkIfBuilds(projectDir);\n });\n\n it('runs on dev mode correctly', async () => {\n await checkIfRunsOnDevMode(projectDir, 'ready in');\n });\n\n it('runs on prod mode correctly', async () => {\n await checkIfRunsOnProdMode(projectDir, 'to expose', 'preview');\n });\n});\n"]}
@@ -1,6 +1,83 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
2
28
  Object.defineProperty(exports, "__esModule", { value: true });
3
29
  exports.getPackageVersion = exports.hasPackageInstalled = exports.findInstalledPackageFromList = void 0;
30
+ // @ts-expect-error - clack is ESM and TS complains about that. It works though
31
+ const clack = __importStar(require("@clack/prompts"));
32
+ const fs = __importStar(require("fs"));
33
+ const path = __importStar(require("path"));
34
+ const js_yaml_1 = __importDefault(require("js-yaml"));
35
+ /**
36
+ * Finds and parses the pnpm-workspace.yaml file to extract catalog definitions.
37
+ * Searches up to 10 parent directories from the current working directory.
38
+ * Returns null if the file doesn't exist or can't be parsed.
39
+ */
40
+ function getPnpmWorkspace() {
41
+ let currentDir = process.cwd();
42
+ const maxLevels = 10;
43
+ for (let i = 0; i < maxLevels; i++) {
44
+ const workspaceFile = path.join(currentDir, 'pnpm-workspace.yaml');
45
+ if (fs.existsSync(workspaceFile)) {
46
+ const content = fs.readFileSync(workspaceFile, 'utf-8');
47
+ try {
48
+ const parsed = js_yaml_1.default.load(content);
49
+ return parsed ?? null;
50
+ }
51
+ catch {
52
+ clack.log.error('Could not parse pnpm-workspace.yaml.');
53
+ return null;
54
+ }
55
+ }
56
+ const parentDir = path.dirname(currentDir);
57
+ // Stop if we've reached the root directory
58
+ if (parentDir === currentDir) {
59
+ break;
60
+ }
61
+ currentDir = parentDir;
62
+ }
63
+ clack.log.error('Could not find pnpm-workspace.yaml.');
64
+ return null;
65
+ }
66
+ /**
67
+ * Resolves a catalog reference (e.g., "catalog:" or "catalog:sveltekit") to the actual version.
68
+ * - "catalog:" refers to the default catalog (workspace.catalog)
69
+ * - "catalog:customcatalog" refers to a named catalog (workspace.catalogs.customcatalog)
70
+ * Returns the actual version if found, or undefined if the catalog or package doesn't exist.
71
+ */
72
+ function resolveCatalogVersion(catalogRef, packageName) {
73
+ const catalogName = catalogRef.replace(/^catalog:/, '');
74
+ const workspace = getPnpmWorkspace();
75
+ if (!workspace) {
76
+ return undefined;
77
+ }
78
+ const catalog = catalogName === '' ? workspace.catalog : workspace.catalogs?.[catalogName];
79
+ return catalog?.[packageName];
80
+ }
4
81
  /**
5
82
  * Checks if @param packageJson has any of the @param packageNamesList package names
6
83
  * listed as a dependency or devDependency.
@@ -21,8 +98,15 @@ function hasPackageInstalled(packageName, packageJson) {
21
98
  }
22
99
  exports.hasPackageInstalled = hasPackageInstalled;
23
100
  function getPackageVersion(packageName, packageJson) {
24
- return (packageJson?.dependencies?.[packageName] ||
25
- packageJson?.devDependencies?.[packageName]);
101
+ const rawVersion = packageJson?.dependencies?.[packageName] ||
102
+ packageJson?.devDependencies?.[packageName];
103
+ if (!rawVersion) {
104
+ return undefined;
105
+ }
106
+ const version = rawVersion.startsWith('catalog:')
107
+ ? resolveCatalogVersion(rawVersion, packageName)
108
+ : rawVersion;
109
+ return version;
26
110
  }
27
111
  exports.getPackageVersion = getPackageVersion;
28
112
  //# sourceMappingURL=package-json.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../src/utils/package-json.ts"],"names":[],"mappings":";;;AAiBA;;;;;GAKG;AACH,SAAgB,4BAA4B,CAC1C,gBAA0B,EAC1B,WAA2B;IAE3B,OAAO,gBAAgB;SACpB,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACrB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC;KACrD,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,UAAU,EAA4B,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC1E,CAAC;AAVD,oEAUC;AAED,SAAgB,mBAAmB,CACjC,WAAmB,EACnB,WAA2B;IAE3B,OAAO,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,KAAK,SAAS,CAAC;AACnE,CAAC;AALD,kDAKC;AAED,SAAgB,iBAAiB,CAC/B,WAAmB,EACnB,WAA2B;IAE3B,OAAO,CACL,WAAW,EAAE,YAAY,EAAE,CAAC,WAAW,CAAC;QACxC,WAAW,EAAE,eAAe,EAAE,CAAC,WAAW,CAAC,CAC5C,CAAC;AACJ,CAAC;AARD,8CAQC","sourcesContent":["export type PackageDotJson = {\n version?: string;\n scripts?: Record<string, string | undefined>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n resolutions?: Record<string, string>;\n overrides?: Record<string, string>;\n pnpm?: {\n overrides?: Record<string, string>;\n };\n};\n\ntype NpmPackage = {\n name: string;\n version: string;\n};\n\n/**\n * Checks if @param packageJson has any of the @param packageNamesList package names\n * listed as a dependency or devDependency.\n * If so, it returns the first package name that is found, including the\n * version (range) specified in the package.json.\n */\nexport function findInstalledPackageFromList(\n packageNamesList: string[],\n packageJson: PackageDotJson,\n): NpmPackage | undefined {\n return packageNamesList\n .map((packageName) => ({\n name: packageName,\n version: getPackageVersion(packageName, packageJson),\n }))\n .find((sdkPackage): sdkPackage is NpmPackage => !!sdkPackage.version);\n}\n\nexport function hasPackageInstalled(\n packageName: string,\n packageJson: PackageDotJson,\n): boolean {\n return getPackageVersion(packageName, packageJson) !== undefined;\n}\n\nexport function getPackageVersion(\n packageName: string,\n packageJson: PackageDotJson,\n): string | undefined {\n return (\n packageJson?.dependencies?.[packageName] ||\n packageJson?.devDependencies?.[packageName]\n );\n}\n"]}
1
+ {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../src/utils/package-json.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport yaml from 'js-yaml';\n\nexport type PackageDotJson = {\n version?: string;\n scripts?: Record<string, string | undefined>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n resolutions?: Record<string, string>;\n overrides?: Record<string, string>;\n pnpm?: {\n overrides?: Record<string, string>;\n };\n};\n\ntype NpmPackage = {\n name: string;\n version: string;\n};\n\ntype PnpmCatalogs = Record<string, Record<string, string>>;\n\ntype PnpmWorkspace = {\n catalog?: Record<string, string>;\n catalogs?: PnpmCatalogs;\n [key: string]: unknown;\n};\n\n/**\n * Finds and parses the pnpm-workspace.yaml file to extract catalog definitions.\n * Searches up to 10 parent directories from the current working directory.\n * Returns null if the file doesn't exist or can't be parsed.\n */\nfunction getPnpmWorkspace(): PnpmWorkspace | null {\n let currentDir = process.cwd();\n const maxLevels = 10;\n\n for (let i = 0; i < maxLevels; i++) {\n const workspaceFile = path.join(currentDir, 'pnpm-workspace.yaml');\n\n if (fs.existsSync(workspaceFile)) {\n const content = fs.readFileSync(workspaceFile, 'utf-8');\n\n try {\n const parsed = yaml.load(content) as PnpmWorkspace;\n\n return parsed ?? null;\n } catch {\n clack.log.error('Could not parse pnpm-workspace.yaml.');\n return null;\n }\n }\n\n const parentDir = path.dirname(currentDir);\n\n // Stop if we've reached the root directory\n if (parentDir === currentDir) {\n break;\n }\n\n currentDir = parentDir;\n }\n\n clack.log.error('Could not find pnpm-workspace.yaml.');\n\n return null;\n}\n\n/**\n * Resolves a catalog reference (e.g., \"catalog:\" or \"catalog:sveltekit\") to the actual version.\n * - \"catalog:\" refers to the default catalog (workspace.catalog)\n * - \"catalog:customcatalog\" refers to a named catalog (workspace.catalogs.customcatalog)\n * Returns the actual version if found, or undefined if the catalog or package doesn't exist.\n */\nfunction resolveCatalogVersion(\n catalogRef: string,\n packageName: string,\n): string | undefined {\n const catalogName = catalogRef.replace(/^catalog:/, '');\n const workspace = getPnpmWorkspace();\n\n if (!workspace) {\n return undefined;\n }\n\n const catalog =\n catalogName === '' ? workspace.catalog : workspace.catalogs?.[catalogName];\n\n return catalog?.[packageName];\n}\n\n/**\n * Checks if @param packageJson has any of the @param packageNamesList package names\n * listed as a dependency or devDependency.\n * If so, it returns the first package name that is found, including the\n * version (range) specified in the package.json.\n */\nexport function findInstalledPackageFromList(\n packageNamesList: string[],\n packageJson: PackageDotJson,\n): NpmPackage | undefined {\n return packageNamesList\n .map((packageName) => ({\n name: packageName,\n version: getPackageVersion(packageName, packageJson),\n }))\n .find((sdkPackage): sdkPackage is NpmPackage => !!sdkPackage.version);\n}\n\nexport function hasPackageInstalled(\n packageName: string,\n packageJson: PackageDotJson,\n): boolean {\n return getPackageVersion(packageName, packageJson) !== undefined;\n}\n\nexport function getPackageVersion(\n packageName: string,\n packageJson: PackageDotJson,\n): string | undefined {\n const rawVersion =\n packageJson?.dependencies?.[packageName] ||\n packageJson?.devDependencies?.[packageName];\n\n if (!rawVersion) {\n return undefined;\n }\n\n const version = rawVersion.startsWith('catalog:')\n ? resolveCatalogVersion(rawVersion, packageName)\n : rawVersion;\n\n return version;\n}\n"]}
@@ -1 +1 @@
1
- export declare const WIZARD_VERSION = "6.7.0";
1
+ export declare const WIZARD_VERSION = "6.8.0";
@@ -3,5 +3,5 @@
3
3
  // This is file is updated at release time.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.WIZARD_VERSION = void 0;
6
- exports.WIZARD_VERSION = '6.7.0';
6
+ exports.WIZARD_VERSION = '6.8.0';
7
7
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,2CAA2C;;;AAE9B,QAAA,cAAc,GAAG,OAAO,CAAC","sourcesContent":["// DO NOT modify this file manually!\n// This is file is updated at release time.\n\nexport const WIZARD_VERSION = '6.7.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,2CAA2C;;;AAE9B,QAAA,cAAc,GAAG,OAAO,CAAC","sourcesContent":["// DO NOT modify this file manually!\n// This is file is updated at release time.\n\nexport const WIZARD_VERSION = '6.8.0';\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,428 @@
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 path = __importStar(require("path"));
28
+ const package_json_1 = require("../../src/utils/package-json");
29
+ const { mockedFs, mockedClack } = vitest_1.vi.hoisted(() => {
30
+ return {
31
+ mockedFs: {
32
+ existsSync: vitest_1.vi.fn(),
33
+ readFileSync: vitest_1.vi.fn(),
34
+ },
35
+ mockedClack: {
36
+ log: {
37
+ error: vitest_1.vi.fn(),
38
+ },
39
+ },
40
+ };
41
+ });
42
+ vitest_1.vi.mock(import('fs'), async (importOriginal) => ({
43
+ ...(await importOriginal()),
44
+ existsSync: mockedFs.existsSync,
45
+ readFileSync: mockedFs.readFileSync,
46
+ }));
47
+ vitest_1.vi.mock(import('@clack/prompts'), async (importOriginal) => ({
48
+ ...(await importOriginal()),
49
+ log: {
50
+ ...(await importOriginal()).log,
51
+ error: mockedClack.log.error,
52
+ },
53
+ }));
54
+ (0, vitest_1.describe)('package-json utils', () => {
55
+ (0, vitest_1.beforeEach)(() => {
56
+ vitest_1.vi.clearAllMocks();
57
+ });
58
+ (0, vitest_1.describe)('getPackageVersion', () => {
59
+ (0, vitest_1.it)('returns version from dependencies', () => {
60
+ const packageJson = {
61
+ dependencies: {
62
+ '@sentry/node': '^7.0.0',
63
+ },
64
+ };
65
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.0.0');
66
+ });
67
+ (0, vitest_1.it)('returns version from devDependencies', () => {
68
+ const packageJson = {
69
+ devDependencies: {
70
+ '@sentry/cli': '^2.0.0',
71
+ },
72
+ };
73
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/cli', packageJson)).toBe('^2.0.0');
74
+ });
75
+ (0, vitest_1.it)('prioritizes dependencies over devDependencies', () => {
76
+ const packageJson = {
77
+ dependencies: {
78
+ '@sentry/node': '^7.0.0',
79
+ },
80
+ devDependencies: {
81
+ '@sentry/node': '^6.0.0',
82
+ },
83
+ };
84
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.0.0');
85
+ });
86
+ (0, vitest_1.it)('returns undefined if package is not found', () => {
87
+ const packageJson = {
88
+ dependencies: {},
89
+ };
90
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
91
+ });
92
+ (0, vitest_1.it)('returns undefined if packageJson has no dependencies', () => {
93
+ const packageJson = {};
94
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
95
+ });
96
+ (0, vitest_1.describe)('pnpm catalog resolution', () => {
97
+ (0, vitest_1.beforeEach)(() => {
98
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue('/test/workspace/packages/app');
99
+ });
100
+ (0, vitest_1.afterEach)(() => {
101
+ vitest_1.vi.clearAllMocks();
102
+ });
103
+ (0, vitest_1.it)('resolves default catalog reference', () => {
104
+ mockedFs.existsSync.mockImplementation((filepath) => {
105
+ return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
106
+ });
107
+ mockedFs.readFileSync.mockReturnValue(`
108
+ catalog:
109
+ '@sentry/node': ^7.100.0
110
+ '@sentry/react': ^7.100.0
111
+ `);
112
+ const packageJson = {
113
+ dependencies: {
114
+ '@sentry/node': 'catalog:',
115
+ },
116
+ };
117
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.100.0');
118
+ });
119
+ (0, vitest_1.it)('resolves named catalog reference', () => {
120
+ mockedFs.existsSync.mockImplementation((filepath) => {
121
+ return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
122
+ });
123
+ mockedFs.readFileSync.mockReturnValue(`
124
+ catalogs:
125
+ sveltekit:
126
+ '@sentry/sveltekit': ^7.100.0
127
+ '@sentry/node': ^7.100.0
128
+ `);
129
+ const packageJson = {
130
+ dependencies: {
131
+ '@sentry/sveltekit': 'catalog:sveltekit',
132
+ },
133
+ };
134
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/sveltekit', packageJson)).toBe('^7.100.0');
135
+ });
136
+ (0, vitest_1.it)('searches parent directories for pnpm-workspace.yaml', () => {
137
+ const mockCwd = '/test/workspace/packages/app/src';
138
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
139
+ mockedFs.existsSync.mockImplementation((filepath) => {
140
+ return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
141
+ });
142
+ mockedFs.readFileSync.mockReturnValue(`
143
+ catalog:
144
+ '@sentry/node': ^7.100.0
145
+ `);
146
+ const packageJson = {
147
+ dependencies: {
148
+ '@sentry/node': 'catalog:',
149
+ },
150
+ };
151
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.100.0');
152
+ });
153
+ (0, vitest_1.it)('returns undefined if catalog does not contain the package', () => {
154
+ mockedFs.existsSync.mockImplementation((filepath) => {
155
+ return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
156
+ });
157
+ mockedFs.readFileSync.mockReturnValue(`
158
+ catalog:
159
+ '@sentry/react': ^7.100.0
160
+ `);
161
+ const packageJson = {
162
+ dependencies: {
163
+ '@sentry/node': 'catalog:',
164
+ },
165
+ };
166
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
167
+ });
168
+ (0, vitest_1.it)('returns undefined if named catalog does not exist', () => {
169
+ mockedFs.existsSync.mockImplementation((filepath) => {
170
+ return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
171
+ });
172
+ mockedFs.readFileSync.mockReturnValue(`
173
+ catalog:
174
+ '@sentry/node': ^7.100.0
175
+ `);
176
+ const packageJson = {
177
+ dependencies: {
178
+ '@sentry/sveltekit': 'catalog:sveltekit',
179
+ },
180
+ };
181
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/sveltekit', packageJson)).toBeUndefined();
182
+ });
183
+ (0, vitest_1.it)('returns undefined if pnpm-workspace.yaml is not found', () => {
184
+ mockedFs.existsSync.mockReturnValue(false);
185
+ const packageJson = {
186
+ dependencies: {
187
+ '@sentry/node': 'catalog:',
188
+ },
189
+ };
190
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
191
+ (0, vitest_1.expect)(mockedClack.log.error).toHaveBeenCalledWith('Could not find pnpm-workspace.yaml.');
192
+ });
193
+ (0, vitest_1.it)('stops searching at root directory', () => {
194
+ const mockCwd = '/test';
195
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
196
+ mockedFs.existsSync.mockReturnValue(false);
197
+ const packageJson = {
198
+ dependencies: {
199
+ '@sentry/node': 'catalog:',
200
+ },
201
+ };
202
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
203
+ });
204
+ (0, vitest_1.it)('handles both default catalog and named catalogs together', () => {
205
+ mockedFs.existsSync.mockImplementation((filepath) => {
206
+ return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
207
+ });
208
+ mockedFs.readFileSync.mockReturnValue(`
209
+ catalog:
210
+ '@sentry/node': ^7.100.0
211
+ catalogs:
212
+ sveltekit:
213
+ '@sentry/sveltekit': ^7.200.0
214
+ `);
215
+ const packageJson = {
216
+ dependencies: {
217
+ '@sentry/node': 'catalog:',
218
+ '@sentry/sveltekit': 'catalog:sveltekit',
219
+ },
220
+ };
221
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.100.0');
222
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/sveltekit', packageJson)).toBe('^7.200.0');
223
+ });
224
+ (0, vitest_1.it)('handles the correct catalog namespace', () => {
225
+ mockedFs.existsSync.mockImplementation((filepath) => {
226
+ return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
227
+ });
228
+ mockedFs.readFileSync.mockReturnValue(`
229
+ catalog:
230
+ '@sveltejs/kit': ^1.0.0
231
+ catalogs:
232
+ sveltekit:
233
+ '@sveltejs/kit': ^2.31.0
234
+ `);
235
+ const packageJson = {
236
+ dependencies: {
237
+ '@sveltejs/kit': 'catalog:sveltekit',
238
+ },
239
+ };
240
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sveltejs/kit', packageJson)).toBe('^2.31.0');
241
+ });
242
+ (0, vitest_1.it)('returns null if pnpm-workspace.yaml has invalid YAML', () => {
243
+ mockedFs.existsSync.mockImplementation((filepath) => {
244
+ return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
245
+ });
246
+ mockedFs.readFileSync.mockReturnValue('invalid: yaml: content: [');
247
+ const packageJson = {
248
+ dependencies: {
249
+ '@sentry/node': 'catalog:',
250
+ },
251
+ };
252
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
253
+ (0, vitest_1.expect)(mockedClack.log.error).toHaveBeenCalledWith('Could not parse pnpm-workspace.yaml.');
254
+ });
255
+ (0, vitest_1.it)('handles regular version strings without catalog lookup', () => {
256
+ const packageJson = {
257
+ dependencies: {
258
+ '@sentry/node': '^7.0.0',
259
+ '@sentry/react': '~7.1.0',
260
+ '@sentry/cli': '2.0.0',
261
+ },
262
+ };
263
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.0.0');
264
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/react', packageJson)).toBe('~7.1.0');
265
+ (0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/cli', packageJson)).toBe('2.0.0');
266
+ (0, vitest_1.expect)(mockedFs.existsSync).not.toHaveBeenCalled();
267
+ });
268
+ });
269
+ });
270
+ (0, vitest_1.describe)('hasPackageInstalled', () => {
271
+ (0, vitest_1.it)('returns true if package is in dependencies', () => {
272
+ const packageJson = {
273
+ dependencies: {
274
+ '@sentry/node': '^7.0.0',
275
+ },
276
+ };
277
+ (0, vitest_1.expect)((0, package_json_1.hasPackageInstalled)('@sentry/node', packageJson)).toBe(true);
278
+ });
279
+ (0, vitest_1.it)('returns true if package is in devDependencies', () => {
280
+ const packageJson = {
281
+ devDependencies: {
282
+ '@sentry/cli': '^2.0.0',
283
+ },
284
+ };
285
+ (0, vitest_1.expect)((0, package_json_1.hasPackageInstalled)('@sentry/cli', packageJson)).toBe(true);
286
+ });
287
+ (0, vitest_1.it)('returns false if package is not installed', () => {
288
+ const packageJson = {
289
+ dependencies: {},
290
+ };
291
+ (0, vitest_1.expect)((0, package_json_1.hasPackageInstalled)('@sentry/node', packageJson)).toBe(false);
292
+ });
293
+ (0, vitest_1.it)('returns true if package uses catalog reference', () => {
294
+ const mockCwd = '/test/workspace/packages/app';
295
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
296
+ mockedFs.existsSync.mockImplementation((filepath) => {
297
+ return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');
298
+ });
299
+ mockedFs.readFileSync.mockReturnValue(`
300
+ catalog:
301
+ '@sentry/node': ^7.100.0
302
+ `);
303
+ const packageJson = {
304
+ dependencies: {
305
+ '@sentry/node': 'catalog:',
306
+ },
307
+ };
308
+ (0, vitest_1.expect)((0, package_json_1.hasPackageInstalled)('@sentry/node', packageJson)).toBe(true);
309
+ });
310
+ (0, vitest_1.it)('returns false if package uses catalog reference but catalog does not have it', () => {
311
+ const mockCwd = '/test/workspace/packages/app';
312
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
313
+ mockedFs.existsSync.mockImplementation((filepath) => {
314
+ return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');
315
+ });
316
+ mockedFs.readFileSync.mockReturnValue(`
317
+ catalog:
318
+ '@sentry/react': ^7.100.0
319
+ `);
320
+ const packageJson = {
321
+ dependencies: {
322
+ '@sentry/node': 'catalog:',
323
+ },
324
+ };
325
+ (0, vitest_1.expect)((0, package_json_1.hasPackageInstalled)('@sentry/node', packageJson)).toBe(false);
326
+ });
327
+ });
328
+ (0, vitest_1.describe)('findInstalledPackageFromList', () => {
329
+ (0, vitest_1.it)('returns the first installed package from the list', () => {
330
+ const packageJson = {
331
+ dependencies: {
332
+ '@sentry/node': '^7.0.0',
333
+ },
334
+ };
335
+ const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/cli', '@sentry/node', '@sentry/react'], packageJson);
336
+ (0, vitest_1.expect)(result).toEqual({
337
+ name: '@sentry/node',
338
+ version: '^7.0.0',
339
+ });
340
+ });
341
+ (0, vitest_1.it)('returns undefined if no packages are installed', () => {
342
+ const packageJson = {
343
+ dependencies: {},
344
+ };
345
+ const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/cli', '@sentry/node', '@sentry/react'], packageJson);
346
+ (0, vitest_1.expect)(result).toBeUndefined();
347
+ });
348
+ (0, vitest_1.it)('checks both dependencies and devDependencies', () => {
349
+ const packageJson = {
350
+ devDependencies: {
351
+ '@sentry/cli': '^2.0.0',
352
+ },
353
+ };
354
+ const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/node', '@sentry/cli'], packageJson);
355
+ (0, vitest_1.expect)(result).toEqual({
356
+ name: '@sentry/cli',
357
+ version: '^2.0.0',
358
+ });
359
+ });
360
+ (0, vitest_1.it)('returns first match in order provided', () => {
361
+ const packageJson = {
362
+ dependencies: {
363
+ '@sentry/node': '^7.0.0',
364
+ '@sentry/react': '^7.0.0',
365
+ },
366
+ };
367
+ const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/react', '@sentry/node'], packageJson);
368
+ (0, vitest_1.expect)(result).toEqual({
369
+ name: '@sentry/react',
370
+ version: '^7.0.0',
371
+ });
372
+ });
373
+ (0, vitest_1.it)('works with catalog references', () => {
374
+ const mockCwd = '/test/workspace/packages/app';
375
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
376
+ mockedFs.existsSync.mockImplementation((filepath) => {
377
+ return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');
378
+ });
379
+ mockedFs.readFileSync.mockReturnValue(`
380
+ catalog:
381
+ '@sentry/node': ^7.100.0
382
+ `);
383
+ const packageJson = {
384
+ dependencies: {
385
+ '@sentry/node': 'catalog:',
386
+ },
387
+ };
388
+ const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/cli', '@sentry/node'], packageJson);
389
+ (0, vitest_1.expect)(result).toEqual({
390
+ name: '@sentry/node',
391
+ version: '^7.100.0',
392
+ });
393
+ });
394
+ (0, vitest_1.it)('returns undefined for empty package list', () => {
395
+ const packageJson = {
396
+ dependencies: {
397
+ '@sentry/node': '^7.0.0',
398
+ },
399
+ };
400
+ const result = (0, package_json_1.findInstalledPackageFromList)([], packageJson);
401
+ (0, vitest_1.expect)(result).toBeUndefined();
402
+ });
403
+ (0, vitest_1.it)('skips packages with unresolvable catalog references', () => {
404
+ const mockCwd = '/test/workspace/packages/app';
405
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
406
+ mockedFs.existsSync.mockImplementation((filepath) => {
407
+ return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');
408
+ });
409
+ mockedFs.readFileSync.mockReturnValue(`
410
+ catalog:
411
+ '@sentry/react': ^7.100.0
412
+ `);
413
+ const packageJson = {
414
+ dependencies: {
415
+ '@sentry/node': 'catalog:',
416
+ '@sentry/react': 'catalog:',
417
+ },
418
+ };
419
+ const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/node', '@sentry/react'], packageJson);
420
+ // Should skip @sentry/node (unresolvable) and return @sentry/react
421
+ (0, vitest_1.expect)(result).toEqual({
422
+ name: '@sentry/react',
423
+ version: '^7.100.0',
424
+ });
425
+ });
426
+ });
427
+ });
428
+ //# sourceMappingURL=package-json.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.test.js","sourceRoot":"","sources":["../../../test/utils/package-json.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAyE;AACzE,2CAA6B;AAE7B,+DAKsC;AAEtC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE;IAChD,OAAO;QACL,QAAQ,EAAE;YACR,UAAU,EAAE,WAAE,CAAC,EAAE,EAAE;YACnB,YAAY,EAAE,WAAE,CAAC,EAAE,EAAE;SACtB;QACD,WAAW,EAAE;YACX,GAAG,EAAE;gBACH,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE;aACf;SACF;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,WAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC;IAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;IAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;CACpC,CAAC,CAAC,CAAC;AAEJ,WAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC;IAC3B,GAAG,EAAE;QACH,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC,GAAG;QAC/B,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK;KAC7B;CACF,CAAC,CAAC,CAAC;AAEJ,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE;oBACZ,cAAc,EAAE,QAAQ;iBACzB;aACF,CAAC;YAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,WAAW,GAAmB;gBAClC,eAAe,EAAE;oBACf,aAAa,EAAE,QAAQ;iBACxB;aACF,CAAC;YAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE;oBACZ,cAAc,EAAE,QAAQ;iBACzB;gBACD,eAAe,EAAE;oBACf,cAAc,EAAE,QAAQ;iBACzB;aACF,CAAC;YAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE,EAAE;aACjB,CAAC;YAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,WAAW,GAAmB,EAAE,CAAC;YAEvC,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,IAAA,iBAAQ,EAAC,yBAAyB,EAAE,GAAG,EAAE;YACvC,IAAA,mBAAU,EAAC,GAAG,EAAE;gBACd,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CACtC,8BAA8B,CAC/B,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAA,kBAAS,EAAC,GAAG,EAAE;gBACb,WAAE,CAAC,aAAa,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;gBAC5C,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;oBAC1D,OAAO,CACL,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CACjE,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;;CAI7C,CAAC,CAAC;gBAEK,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,cAAc,EAAE,UAAU;qBAC3B;iBACF,CAAC;gBAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;gBAC1C,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;oBAC1D,OAAO,CACL,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CACjE,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;;;CAK7C,CAAC,CAAC;gBAEK,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,mBAAmB,EAAE,mBAAmB;qBACzC;iBACF,CAAC;gBAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAC9D,UAAU,CACX,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,GAAG,EAAE;gBAC7D,MAAM,OAAO,GAAG,kCAAkC,CAAC;gBACnD,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAElD,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;oBAC1D,OAAO,CACL,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CACjE,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;CAG7C,CAAC,CAAC;gBAEK,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,cAAc,EAAE,UAAU;qBAC3B;iBACF,CAAC;gBAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,2DAA2D,EAAE,GAAG,EAAE;gBACnE,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;oBAC1D,OAAO,CACL,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CACjE,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;CAG7C,CAAC,CAAC;gBAEK,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,cAAc,EAAE,UAAU;qBAC3B;iBACF,CAAC;gBAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YACzE,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;gBAC3D,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;oBAC1D,OAAO,CACL,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CACjE,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;CAG7C,CAAC,CAAC;gBAEK,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,mBAAmB,EAAE,mBAAmB;qBACzC;iBACF,CAAC;gBAEF,IAAA,eAAM,EACJ,IAAA,gCAAiB,EAAC,mBAAmB,EAAE,WAAW,CAAC,CACpD,CAAC,aAAa,EAAE,CAAC;YACpB,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,uDAAuD,EAAE,GAAG,EAAE;gBAC/D,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;gBAE3C,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,cAAc,EAAE,UAAU;qBAC3B;iBACF,CAAC;gBAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;gBACvE,IAAA,eAAM,EAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAChD,qCAAqC,CACtC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;gBAC3C,MAAM,OAAO,GAAG,OAAO,CAAC;gBACxB,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAElD,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;gBAE3C,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,cAAc,EAAE,UAAU;qBAC3B;iBACF,CAAC;gBAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YACzE,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,0DAA0D,EAAE,GAAG,EAAE;gBAClE,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;oBAC1D,OAAO,CACL,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CACjE,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;;;;CAM7C,CAAC,CAAC;gBAEK,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,cAAc,EAAE,UAAU;wBAC1B,mBAAmB,EAAE,mBAAmB;qBACzC;iBACF,CAAC;gBAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxE,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAC9D,UAAU,CACX,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;gBAC/C,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;oBAC1D,OAAO,CACL,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CACjE,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;;;;CAM7C,CAAC,CAAC;gBAEK,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,eAAe,EAAE,mBAAmB;qBACrC;iBACF,CAAC;gBAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,sDAAsD,EAAE,GAAG,EAAE;gBAC9D,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;oBAC1D,OAAO,CACL,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CACjE,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAAC;gBAEnE,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,cAAc,EAAE,UAAU;qBAC3B;iBACF,CAAC;gBAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;gBACvE,IAAA,eAAM,EAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAChD,sCAAsC,CACvC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;gBAChE,MAAM,WAAW,GAAmB;oBAClC,YAAY,EAAE;wBACZ,cAAc,EAAE,QAAQ;wBACxB,eAAe,EAAE,QAAQ;wBACzB,aAAa,EAAE,OAAO;qBACvB;iBACF,CAAC;gBAEF,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtE,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvE,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpE,IAAA,eAAM,EAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACrD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE;oBACZ,cAAc,EAAE,QAAQ;iBACzB;aACF,CAAC;YAEF,IAAA,eAAM,EAAC,IAAA,kCAAmB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,WAAW,GAAmB;gBAClC,eAAe,EAAE;oBACf,aAAa,EAAE,QAAQ;iBACxB;aACF,CAAC;YAEF,IAAA,eAAM,EAAC,IAAA,kCAAmB,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE,EAAE;aACjB,CAAC;YAEF,IAAA,eAAM,EAAC,IAAA,kCAAmB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,OAAO,GAAG,8BAA8B,CAAC;YAC/C,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAElD,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;gBAC1D,OAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;CAG3C,CAAC,CAAC;YAEG,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE;oBACZ,cAAc,EAAE,UAAU;iBAC3B;aACF,CAAC;YAEF,IAAA,eAAM,EAAC,IAAA,kCAAmB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,8EAA8E,EAAE,GAAG,EAAE;YACtF,MAAM,OAAO,GAAG,8BAA8B,CAAC;YAC/C,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAElD,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;gBAC1D,OAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;CAG3C,CAAC,CAAC;YAEG,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE;oBACZ,cAAc,EAAE,UAAU;iBAC3B;aACF,CAAC;YAEF,IAAA,eAAM,EAAC,IAAA,kCAAmB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE;oBACZ,cAAc,EAAE,QAAQ;iBACzB;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,2CAA4B,EACzC,CAAC,aAAa,EAAE,cAAc,EAAE,eAAe,CAAC,EAChD,WAAW,CACZ,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,QAAQ;aAClB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE,EAAE;aACjB,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,2CAA4B,EACzC,CAAC,aAAa,EAAE,cAAc,EAAE,eAAe,CAAC,EAChD,WAAW,CACZ,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,WAAW,GAAmB;gBAClC,eAAe,EAAE;oBACf,aAAa,EAAE,QAAQ;iBACxB;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,2CAA4B,EACzC,CAAC,cAAc,EAAE,aAAa,CAAC,EAC/B,WAAW,CACZ,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,QAAQ;aAClB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE;oBACZ,cAAc,EAAE,QAAQ;oBACxB,eAAe,EAAE,QAAQ;iBAC1B;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,2CAA4B,EACzC,CAAC,eAAe,EAAE,cAAc,CAAC,EACjC,WAAW,CACZ,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,QAAQ;aAClB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,OAAO,GAAG,8BAA8B,CAAC;YAC/C,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAElD,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;gBAC1D,OAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;CAG3C,CAAC,CAAC;YAEG,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE;oBACZ,cAAc,EAAE,UAAU;iBAC3B;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,2CAA4B,EACzC,CAAC,aAAa,EAAE,cAAc,CAAC,EAC/B,WAAW,CACZ,CAAC;YAEF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE;oBACZ,cAAc,EAAE,QAAQ;iBACzB;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,2CAA4B,EAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAE7D,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,OAAO,GAAG,8BAA8B,CAAC;YAC/C,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAElD,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,QAAgB,EAAE,EAAE;gBAC1D,OAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC;;;CAG3C,CAAC,CAAC;YAEG,MAAM,WAAW,GAAmB;gBAClC,YAAY,EAAE;oBACZ,cAAc,EAAE,UAAU;oBAC1B,eAAe,EAAE,UAAU;iBAC5B;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,2CAA4B,EACzC,CAAC,cAAc,EAAE,eAAe,CAAC,EACjC,WAAW,CACZ,CAAC;YAEF,mEAAmE;YACnE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { beforeEach, describe, it, vi, expect, afterEach } from 'vitest';\nimport * as path from 'path';\n\nimport {\n findInstalledPackageFromList,\n hasPackageInstalled,\n getPackageVersion,\n type PackageDotJson,\n} from '../../src/utils/package-json';\n\nconst { mockedFs, mockedClack } = vi.hoisted(() => {\n return {\n mockedFs: {\n existsSync: vi.fn(),\n readFileSync: vi.fn(),\n },\n mockedClack: {\n log: {\n error: vi.fn(),\n },\n },\n };\n});\n\nvi.mock(import('fs'), async (importOriginal) => ({\n ...(await importOriginal()),\n existsSync: mockedFs.existsSync,\n readFileSync: mockedFs.readFileSync,\n}));\n\nvi.mock(import('@clack/prompts'), async (importOriginal) => ({\n ...(await importOriginal()),\n log: {\n ...(await importOriginal()).log,\n error: mockedClack.log.error,\n },\n}));\n\ndescribe('package-json utils', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n describe('getPackageVersion', () => {\n it('returns version from dependencies', () => {\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': '^7.0.0',\n },\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBe('^7.0.0');\n });\n\n it('returns version from devDependencies', () => {\n const packageJson: PackageDotJson = {\n devDependencies: {\n '@sentry/cli': '^2.0.0',\n },\n };\n\n expect(getPackageVersion('@sentry/cli', packageJson)).toBe('^2.0.0');\n });\n\n it('prioritizes dependencies over devDependencies', () => {\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': '^7.0.0',\n },\n devDependencies: {\n '@sentry/node': '^6.0.0',\n },\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBe('^7.0.0');\n });\n\n it('returns undefined if package is not found', () => {\n const packageJson: PackageDotJson = {\n dependencies: {},\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBeUndefined();\n });\n\n it('returns undefined if packageJson has no dependencies', () => {\n const packageJson: PackageDotJson = {};\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBeUndefined();\n });\n\n describe('pnpm catalog resolution', () => {\n beforeEach(() => {\n vi.spyOn(process, 'cwd').mockReturnValue(\n '/test/workspace/packages/app',\n );\n });\n\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n it('resolves default catalog reference', () => {\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return (\n filepath === path.join('/test/workspace', 'pnpm-workspace.yaml')\n );\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalog:\n '@sentry/node': ^7.100.0\n '@sentry/react': ^7.100.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n },\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBe('^7.100.0');\n });\n\n it('resolves named catalog reference', () => {\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return (\n filepath === path.join('/test/workspace', 'pnpm-workspace.yaml')\n );\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalogs:\n sveltekit:\n '@sentry/sveltekit': ^7.100.0\n '@sentry/node': ^7.100.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/sveltekit': 'catalog:sveltekit',\n },\n };\n\n expect(getPackageVersion('@sentry/sveltekit', packageJson)).toBe(\n '^7.100.0',\n );\n });\n\n it('searches parent directories for pnpm-workspace.yaml', () => {\n const mockCwd = '/test/workspace/packages/app/src';\n vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);\n\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return (\n filepath === path.join('/test/workspace', 'pnpm-workspace.yaml')\n );\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalog:\n '@sentry/node': ^7.100.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n },\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBe('^7.100.0');\n });\n\n it('returns undefined if catalog does not contain the package', () => {\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return (\n filepath === path.join('/test/workspace', 'pnpm-workspace.yaml')\n );\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalog:\n '@sentry/react': ^7.100.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n },\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBeUndefined();\n });\n\n it('returns undefined if named catalog does not exist', () => {\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return (\n filepath === path.join('/test/workspace', 'pnpm-workspace.yaml')\n );\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalog:\n '@sentry/node': ^7.100.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/sveltekit': 'catalog:sveltekit',\n },\n };\n\n expect(\n getPackageVersion('@sentry/sveltekit', packageJson),\n ).toBeUndefined();\n });\n\n it('returns undefined if pnpm-workspace.yaml is not found', () => {\n mockedFs.existsSync.mockReturnValue(false);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n },\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBeUndefined();\n expect(mockedClack.log.error).toHaveBeenCalledWith(\n 'Could not find pnpm-workspace.yaml.',\n );\n });\n\n it('stops searching at root directory', () => {\n const mockCwd = '/test';\n vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);\n\n mockedFs.existsSync.mockReturnValue(false);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n },\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBeUndefined();\n });\n\n it('handles both default catalog and named catalogs together', () => {\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return (\n filepath === path.join('/test/workspace', 'pnpm-workspace.yaml')\n );\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalog:\n '@sentry/node': ^7.100.0\ncatalogs:\n sveltekit:\n '@sentry/sveltekit': ^7.200.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n '@sentry/sveltekit': 'catalog:sveltekit',\n },\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBe('^7.100.0');\n expect(getPackageVersion('@sentry/sveltekit', packageJson)).toBe(\n '^7.200.0',\n );\n });\n\n it('handles the correct catalog namespace', () => {\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return (\n filepath === path.join('/test/workspace', 'pnpm-workspace.yaml')\n );\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalog:\n '@sveltejs/kit': ^1.0.0\ncatalogs:\n sveltekit:\n '@sveltejs/kit': ^2.31.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sveltejs/kit': 'catalog:sveltekit',\n },\n };\n\n expect(getPackageVersion('@sveltejs/kit', packageJson)).toBe('^2.31.0');\n });\n\n it('returns null if pnpm-workspace.yaml has invalid YAML', () => {\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return (\n filepath === path.join('/test/workspace', 'pnpm-workspace.yaml')\n );\n });\n\n mockedFs.readFileSync.mockReturnValue('invalid: yaml: content: [');\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n },\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBeUndefined();\n expect(mockedClack.log.error).toHaveBeenCalledWith(\n 'Could not parse pnpm-workspace.yaml.',\n );\n });\n\n it('handles regular version strings without catalog lookup', () => {\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': '^7.0.0',\n '@sentry/react': '~7.1.0',\n '@sentry/cli': '2.0.0',\n },\n };\n\n expect(getPackageVersion('@sentry/node', packageJson)).toBe('^7.0.0');\n expect(getPackageVersion('@sentry/react', packageJson)).toBe('~7.1.0');\n expect(getPackageVersion('@sentry/cli', packageJson)).toBe('2.0.0');\n expect(mockedFs.existsSync).not.toHaveBeenCalled();\n });\n });\n });\n\n describe('hasPackageInstalled', () => {\n it('returns true if package is in dependencies', () => {\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': '^7.0.0',\n },\n };\n\n expect(hasPackageInstalled('@sentry/node', packageJson)).toBe(true);\n });\n\n it('returns true if package is in devDependencies', () => {\n const packageJson: PackageDotJson = {\n devDependencies: {\n '@sentry/cli': '^2.0.0',\n },\n };\n\n expect(hasPackageInstalled('@sentry/cli', packageJson)).toBe(true);\n });\n\n it('returns false if package is not installed', () => {\n const packageJson: PackageDotJson = {\n dependencies: {},\n };\n\n expect(hasPackageInstalled('@sentry/node', packageJson)).toBe(false);\n });\n\n it('returns true if package uses catalog reference', () => {\n const mockCwd = '/test/workspace/packages/app';\n vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);\n\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalog:\n '@sentry/node': ^7.100.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n },\n };\n\n expect(hasPackageInstalled('@sentry/node', packageJson)).toBe(true);\n });\n\n it('returns false if package uses catalog reference but catalog does not have it', () => {\n const mockCwd = '/test/workspace/packages/app';\n vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);\n\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalog:\n '@sentry/react': ^7.100.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n },\n };\n\n expect(hasPackageInstalled('@sentry/node', packageJson)).toBe(false);\n });\n });\n\n describe('findInstalledPackageFromList', () => {\n it('returns the first installed package from the list', () => {\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': '^7.0.0',\n },\n };\n\n const result = findInstalledPackageFromList(\n ['@sentry/cli', '@sentry/node', '@sentry/react'],\n packageJson,\n );\n\n expect(result).toEqual({\n name: '@sentry/node',\n version: '^7.0.0',\n });\n });\n\n it('returns undefined if no packages are installed', () => {\n const packageJson: PackageDotJson = {\n dependencies: {},\n };\n\n const result = findInstalledPackageFromList(\n ['@sentry/cli', '@sentry/node', '@sentry/react'],\n packageJson,\n );\n\n expect(result).toBeUndefined();\n });\n\n it('checks both dependencies and devDependencies', () => {\n const packageJson: PackageDotJson = {\n devDependencies: {\n '@sentry/cli': '^2.0.0',\n },\n };\n\n const result = findInstalledPackageFromList(\n ['@sentry/node', '@sentry/cli'],\n packageJson,\n );\n\n expect(result).toEqual({\n name: '@sentry/cli',\n version: '^2.0.0',\n });\n });\n\n it('returns first match in order provided', () => {\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': '^7.0.0',\n '@sentry/react': '^7.0.0',\n },\n };\n\n const result = findInstalledPackageFromList(\n ['@sentry/react', '@sentry/node'],\n packageJson,\n );\n\n expect(result).toEqual({\n name: '@sentry/react',\n version: '^7.0.0',\n });\n });\n\n it('works with catalog references', () => {\n const mockCwd = '/test/workspace/packages/app';\n vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);\n\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalog:\n '@sentry/node': ^7.100.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n },\n };\n\n const result = findInstalledPackageFromList(\n ['@sentry/cli', '@sentry/node'],\n packageJson,\n );\n\n expect(result).toEqual({\n name: '@sentry/node',\n version: '^7.100.0',\n });\n });\n\n it('returns undefined for empty package list', () => {\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': '^7.0.0',\n },\n };\n\n const result = findInstalledPackageFromList([], packageJson);\n\n expect(result).toBeUndefined();\n });\n\n it('skips packages with unresolvable catalog references', () => {\n const mockCwd = '/test/workspace/packages/app';\n vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);\n\n mockedFs.existsSync.mockImplementation((filepath: string) => {\n return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');\n });\n\n mockedFs.readFileSync.mockReturnValue(`\ncatalog:\n '@sentry/react': ^7.100.0\n`);\n\n const packageJson: PackageDotJson = {\n dependencies: {\n '@sentry/node': 'catalog:',\n '@sentry/react': 'catalog:',\n },\n };\n\n const result = findInstalledPackageFromList(\n ['@sentry/node', '@sentry/react'],\n packageJson,\n );\n\n // Should skip @sentry/node (unresolvable) and return @sentry/react\n expect(result).toEqual({\n name: '@sentry/react',\n version: '^7.100.0',\n });\n });\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/wizard",
3
- "version": "6.7.0",
3
+ "version": "6.8.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",
@@ -32,6 +32,7 @@
32
32
  "chalk": "^2.4.1",
33
33
  "glob": "9.3.5",
34
34
  "inquirer": "^6.2.0",
35
+ "js-yaml": "^4.1.1",
35
36
  "magicast": "^0.2.10",
36
37
  "opn": "^5.4.0",
37
38
  "read-env": "^1.3.0",
@@ -45,6 +46,7 @@
45
46
  "@babel/types": "~7.21.4",
46
47
  "@types/glob": "^7.2.0",
47
48
  "@types/inquirer": "^0.0.43",
49
+ "@types/js-yaml": "^4.0.9",
48
50
  "@types/node": "^18.19.76",
49
51
  "@types/opn": "5.1.0",
50
52
  "@types/semver": "^7.3.7",