UNPKG

knip

Version:

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

66 lines (65 loc) 2.15 kB
import parseArgs from 'minimist'; import { parse } from 'unbash'; const BIN = 'svelte-package'; export const DEFAULT_INPUT = 'src/lib'; export const DEFAULT_OUTPUT = 'dist'; const parseCommandIO = (args) => { const parsed = parseArgs(args, { string: ['i', 'o', 'input', 'output'], alias: { input: ['i'], output: ['o'] } }); return { input: parsed.input ?? DEFAULT_INPUT, output: parsed.output ?? DEFAULT_OUTPUT }; }; const collectFromCommands = (statements, out) => { for (const stmt of statements) visit(stmt.command, out); }; const visit = (node, out) => { switch (node.type) { case 'Command': if (node.name?.value === BIN) out.push(parseCommandIO(node.suffix.map(w => w.value))); return; case 'AndOr': case 'Pipeline': for (const n of node.commands) visit(n, out); return; case 'If': collectFromCommands(node.clause.commands, out); collectFromCommands(node.then.commands, out); if (node.else) visit(node.else, out); return; case 'While': collectFromCommands(node.clause.commands, out); collectFromCommands(node.body.commands, out); return; case 'For': case 'Select': case 'Subshell': case 'BraceGroup': collectFromCommands(node.body.commands, out); return; case 'CompoundList': collectFromCommands(node.commands, out); return; case 'Function': case 'Coproc': visit(node.body, out); return; case 'Statement': visit(node.command, out); } }; export const parseScripts = (scripts) => { const out = []; for (const script of Object.values(scripts ?? {})) { if (typeof script !== 'string' || !script.includes(BIN)) continue; try { const parsed = parse(script); if (parsed.commands) collectFromCommands(parsed.commands, out); } catch { } } return out; };