@sentry/wizard
Version:
Sentry wizard helping you to configure your project
428 lines • 19.2 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const vitest_1 = require("vitest");
const path = __importStar(require("path"));
const package_json_1 = require("../../src/utils/package-json");
const { mockedFs, mockedClack } = vitest_1.vi.hoisted(() => {
return {
mockedFs: {
existsSync: vitest_1.vi.fn(),
readFileSync: vitest_1.vi.fn(),
},
mockedClack: {
log: {
error: vitest_1.vi.fn(),
},
},
};
});
vitest_1.vi.mock(import('fs'), async (importOriginal) => ({
...(await importOriginal()),
existsSync: mockedFs.existsSync,
readFileSync: mockedFs.readFileSync,
}));
vitest_1.vi.mock(import('@clack/prompts'), async (importOriginal) => ({
...(await importOriginal()),
log: {
...(await importOriginal()).log,
error: mockedClack.log.error,
},
}));
(0, vitest_1.describe)('package-json utils', () => {
(0, vitest_1.beforeEach)(() => {
vitest_1.vi.clearAllMocks();
});
(0, vitest_1.describe)('getPackageVersion', () => {
(0, vitest_1.it)('returns version from dependencies', () => {
const packageJson = {
dependencies: {
'@sentry/node': '^7.0.0',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.0.0');
});
(0, vitest_1.it)('returns version from devDependencies', () => {
const packageJson = {
devDependencies: {
'@sentry/cli': '^2.0.0',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/cli', packageJson)).toBe('^2.0.0');
});
(0, vitest_1.it)('prioritizes dependencies over devDependencies', () => {
const packageJson = {
dependencies: {
'@sentry/node': '^7.0.0',
},
devDependencies: {
'@sentry/node': '^6.0.0',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.0.0');
});
(0, vitest_1.it)('returns undefined if package is not found', () => {
const packageJson = {
dependencies: {},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
});
(0, vitest_1.it)('returns undefined if packageJson has no dependencies', () => {
const packageJson = {};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
});
(0, vitest_1.describe)('pnpm catalog resolution', () => {
(0, vitest_1.beforeEach)(() => {
vitest_1.vi.spyOn(process, 'cwd').mockReturnValue('/test/workspace/packages/app');
});
(0, vitest_1.afterEach)(() => {
vitest_1.vi.clearAllMocks();
});
(0, vitest_1.it)('resolves default catalog reference', () => {
mockedFs.existsSync.mockImplementation((filepath) => {
return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
});
mockedFs.readFileSync.mockReturnValue(`
catalog:
'@sentry/node': ^7.100.0
'@sentry/react': ^7.100.0
`);
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.100.0');
});
(0, vitest_1.it)('resolves named catalog reference', () => {
mockedFs.existsSync.mockImplementation((filepath) => {
return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
});
mockedFs.readFileSync.mockReturnValue(`
catalogs:
sveltekit:
'@sentry/sveltekit': ^7.100.0
'@sentry/node': ^7.100.0
`);
const packageJson = {
dependencies: {
'@sentry/sveltekit': 'catalog:sveltekit',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/sveltekit', packageJson)).toBe('^7.100.0');
});
(0, vitest_1.it)('searches parent directories for pnpm-workspace.yaml', () => {
const mockCwd = '/test/workspace/packages/app/src';
vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
mockedFs.existsSync.mockImplementation((filepath) => {
return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
});
mockedFs.readFileSync.mockReturnValue(`
catalog:
'@sentry/node': ^7.100.0
`);
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.100.0');
});
(0, vitest_1.it)('returns undefined if catalog does not contain the package', () => {
mockedFs.existsSync.mockImplementation((filepath) => {
return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
});
mockedFs.readFileSync.mockReturnValue(`
catalog:
'@sentry/react': ^7.100.0
`);
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
});
(0, vitest_1.it)('returns undefined if named catalog does not exist', () => {
mockedFs.existsSync.mockImplementation((filepath) => {
return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
});
mockedFs.readFileSync.mockReturnValue(`
catalog:
'@sentry/node': ^7.100.0
`);
const packageJson = {
dependencies: {
'@sentry/sveltekit': 'catalog:sveltekit',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/sveltekit', packageJson)).toBeUndefined();
});
(0, vitest_1.it)('returns undefined if pnpm-workspace.yaml is not found', () => {
mockedFs.existsSync.mockReturnValue(false);
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
(0, vitest_1.expect)(mockedClack.log.error).toHaveBeenCalledWith('Could not find pnpm-workspace.yaml.');
});
(0, vitest_1.it)('stops searching at root directory', () => {
const mockCwd = '/test';
vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
mockedFs.existsSync.mockReturnValue(false);
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
});
(0, vitest_1.it)('handles both default catalog and named catalogs together', () => {
mockedFs.existsSync.mockImplementation((filepath) => {
return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
});
mockedFs.readFileSync.mockReturnValue(`
catalog:
'@sentry/node': ^7.100.0
catalogs:
sveltekit:
'@sentry/sveltekit': ^7.200.0
`);
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
'@sentry/sveltekit': 'catalog:sveltekit',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.100.0');
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/sveltekit', packageJson)).toBe('^7.200.0');
});
(0, vitest_1.it)('handles the correct catalog namespace', () => {
mockedFs.existsSync.mockImplementation((filepath) => {
return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
});
mockedFs.readFileSync.mockReturnValue(`
catalog:
'@sveltejs/kit': ^1.0.0
catalogs:
sveltekit:
'@sveltejs/kit': ^2.31.0
`);
const packageJson = {
dependencies: {
'@sveltejs/kit': 'catalog:sveltekit',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sveltejs/kit', packageJson)).toBe('^2.31.0');
});
(0, vitest_1.it)('returns null if pnpm-workspace.yaml has invalid YAML', () => {
mockedFs.existsSync.mockImplementation((filepath) => {
return (filepath === path.join('/test/workspace', 'pnpm-workspace.yaml'));
});
mockedFs.readFileSync.mockReturnValue('invalid: yaml: content: [');
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBeUndefined();
(0, vitest_1.expect)(mockedClack.log.error).toHaveBeenCalledWith('Could not parse pnpm-workspace.yaml.');
});
(0, vitest_1.it)('handles regular version strings without catalog lookup', () => {
const packageJson = {
dependencies: {
'@sentry/node': '^7.0.0',
'@sentry/react': '~7.1.0',
'@sentry/cli': '2.0.0',
},
};
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/node', packageJson)).toBe('^7.0.0');
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/react', packageJson)).toBe('~7.1.0');
(0, vitest_1.expect)((0, package_json_1.getPackageVersion)('@sentry/cli', packageJson)).toBe('2.0.0');
(0, vitest_1.expect)(mockedFs.existsSync).not.toHaveBeenCalled();
});
});
});
(0, vitest_1.describe)('hasPackageInstalled', () => {
(0, vitest_1.it)('returns true if package is in dependencies', () => {
const packageJson = {
dependencies: {
'@sentry/node': '^7.0.0',
},
};
(0, vitest_1.expect)((0, package_json_1.hasPackageInstalled)('@sentry/node', packageJson)).toBe(true);
});
(0, vitest_1.it)('returns true if package is in devDependencies', () => {
const packageJson = {
devDependencies: {
'@sentry/cli': '^2.0.0',
},
};
(0, vitest_1.expect)((0, package_json_1.hasPackageInstalled)('@sentry/cli', packageJson)).toBe(true);
});
(0, vitest_1.it)('returns false if package is not installed', () => {
const packageJson = {
dependencies: {},
};
(0, vitest_1.expect)((0, package_json_1.hasPackageInstalled)('@sentry/node', packageJson)).toBe(false);
});
(0, vitest_1.it)('returns true if package uses catalog reference', () => {
const mockCwd = '/test/workspace/packages/app';
vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
mockedFs.existsSync.mockImplementation((filepath) => {
return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');
});
mockedFs.readFileSync.mockReturnValue(`
catalog:
'@sentry/node': ^7.100.0
`);
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
},
};
(0, vitest_1.expect)((0, package_json_1.hasPackageInstalled)('@sentry/node', packageJson)).toBe(true);
});
(0, vitest_1.it)('returns false if package uses catalog reference but catalog does not have it', () => {
const mockCwd = '/test/workspace/packages/app';
vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
mockedFs.existsSync.mockImplementation((filepath) => {
return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');
});
mockedFs.readFileSync.mockReturnValue(`
catalog:
'@sentry/react': ^7.100.0
`);
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
},
};
(0, vitest_1.expect)((0, package_json_1.hasPackageInstalled)('@sentry/node', packageJson)).toBe(false);
});
});
(0, vitest_1.describe)('findInstalledPackageFromList', () => {
(0, vitest_1.it)('returns the first installed package from the list', () => {
const packageJson = {
dependencies: {
'@sentry/node': '^7.0.0',
},
};
const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/cli', '@sentry/node', '@sentry/react'], packageJson);
(0, vitest_1.expect)(result).toEqual({
name: '@sentry/node',
version: '^7.0.0',
});
});
(0, vitest_1.it)('returns undefined if no packages are installed', () => {
const packageJson = {
dependencies: {},
};
const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/cli', '@sentry/node', '@sentry/react'], packageJson);
(0, vitest_1.expect)(result).toBeUndefined();
});
(0, vitest_1.it)('checks both dependencies and devDependencies', () => {
const packageJson = {
devDependencies: {
'@sentry/cli': '^2.0.0',
},
};
const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/node', '@sentry/cli'], packageJson);
(0, vitest_1.expect)(result).toEqual({
name: '@sentry/cli',
version: '^2.0.0',
});
});
(0, vitest_1.it)('returns first match in order provided', () => {
const packageJson = {
dependencies: {
'@sentry/node': '^7.0.0',
'@sentry/react': '^7.0.0',
},
};
const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/react', '@sentry/node'], packageJson);
(0, vitest_1.expect)(result).toEqual({
name: '@sentry/react',
version: '^7.0.0',
});
});
(0, vitest_1.it)('works with catalog references', () => {
const mockCwd = '/test/workspace/packages/app';
vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
mockedFs.existsSync.mockImplementation((filepath) => {
return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');
});
mockedFs.readFileSync.mockReturnValue(`
catalog:
'@sentry/node': ^7.100.0
`);
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
},
};
const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/cli', '@sentry/node'], packageJson);
(0, vitest_1.expect)(result).toEqual({
name: '@sentry/node',
version: '^7.100.0',
});
});
(0, vitest_1.it)('returns undefined for empty package list', () => {
const packageJson = {
dependencies: {
'@sentry/node': '^7.0.0',
},
};
const result = (0, package_json_1.findInstalledPackageFromList)([], packageJson);
(0, vitest_1.expect)(result).toBeUndefined();
});
(0, vitest_1.it)('skips packages with unresolvable catalog references', () => {
const mockCwd = '/test/workspace/packages/app';
vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(mockCwd);
mockedFs.existsSync.mockImplementation((filepath) => {
return filepath === path.join('/test/workspace', 'pnpm-workspace.yaml');
});
mockedFs.readFileSync.mockReturnValue(`
catalog:
'@sentry/react': ^7.100.0
`);
const packageJson = {
dependencies: {
'@sentry/node': 'catalog:',
'@sentry/react': 'catalog:',
},
};
const result = (0, package_json_1.findInstalledPackageFromList)(['@sentry/node', '@sentry/react'], packageJson);
// Should skip @sentry/node (unresolvable) and return @sentry/react
(0, vitest_1.expect)(result).toEqual({
name: '@sentry/react',
version: '^7.100.0',
});
});
});
});
//# sourceMappingURL=package-json.test.js.map