UNPKG

knip

Version:

Find and fix unused dependencies, exports and files in your TypeScript and JavaScript projects

65 lines (64 loc) 2.75 kB
import { isFile } from './fs.js'; import { _load } from './loader.js'; import { basename, join } from './path.js'; export const DEFAULT_CATALOG = 'default'; export const getCatalogContainer = async (cwd, manifest, manifestPath, pnpmWorkspacePath, pnpmWorkspace) => { const filePath = pnpmWorkspacePath ?? (isFile(join(cwd, '.yarnrc.yml')) ? join(cwd, '.yarnrc.yml') : manifestPath); const yarnWorkspace = basename(filePath) === '.yarnrc.yml' ? await _load(filePath) : undefined; const catalog = pnpmWorkspace?.catalog ?? yarnWorkspace?.catalog ?? manifest.catalog ?? ((!Array.isArray(manifest.workspaces) && manifest.workspaces?.catalog) || {}); const catalogs = pnpmWorkspace?.catalogs ?? yarnWorkspace?.catalogs ?? manifest.catalogs ?? ((!Array.isArray(manifest.workspaces) && manifest.workspaces?.catalogs) || {}); return { filePath, catalog, catalogs }; }; const extractEntries = (catalog) => { if (catalog && typeof catalog === 'object') return Object.keys(catalog).map(entry => `${DEFAULT_CATALOG}:${entry}`); return []; }; const extractNamedEntries = (catalogs) => { const entries = new Set(); if (catalogs && typeof catalogs === 'object') { for (const [catalogName, catalog] of Object.entries(catalogs)) { if (catalog && typeof catalog === 'object') { for (const name of Object.keys(catalog)) entries.add(`${catalogName}:${name}`); } } } return entries; }; export const parseCatalog = (container) => { const entries = new Set(); if ('catalog' in container) for (const id of extractEntries(container.catalog)) entries.add(id); if ('catalogs' in container) for (const id of extractNamedEntries(container.catalogs)) entries.add(id); return entries; }; export const extractCatalogReferences = (manifest) => { const catalogReferences = new Set(); const checkDependencies = (dependencies) => { if (!dependencies) return; for (const [name, version] of Object.entries(dependencies)) { if (typeof version === 'string' && version.startsWith('catalog:')) { const catalogName = version.slice('catalog:'.length) || DEFAULT_CATALOG; catalogReferences.add([catalogName, name].join(':')); } } }; checkDependencies(manifest.dependencies); checkDependencies(manifest.devDependencies); checkDependencies(manifest.peerDependencies); checkDependencies(manifest.optionalDependencies); checkDependencies(manifest.resolutions); checkDependencies(manifest.pnpm?.overrides); return catalogReferences; };