knip
Version:
Find and fix unused dependencies, exports and files in your TypeScript and JavaScript projects
66 lines (65 loc) • 2.15 kB
JavaScript
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;
};