You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
2.6 KiB
124 lines
2.6 KiB
#!/usr/bin/env node |
|
var fs = require('fs'); |
|
var path = require('path'); |
|
|
|
var command, directory, file; |
|
|
|
var yargs = require('yargs') |
|
.usage('Usage: $0 <command> [options] <dir> [file]') |
|
// .demand(1) |
|
|
|
.command('ancestors', 'Output the ancestors') |
|
.command('descendents', 'Output the descendents') |
|
|
|
.example('$0 ancestors -I src src/ src/_footer.scss', 'outputs the ancestors of src/_footer.scss') |
|
|
|
.option('I', { |
|
alias: 'load-path', |
|
default: [process.cwd()], |
|
describe: 'Add directories to the sass load path', |
|
type: 'array', |
|
}) |
|
|
|
.option('e', { |
|
alias: 'extensions', |
|
default: ['scss', 'css', 'sass'], |
|
describe: 'File extensions to include in the graph', |
|
type: 'array', |
|
}) |
|
|
|
.option('f', { |
|
alias: 'follow', |
|
default: false, |
|
describe: 'Follow symbolic links', |
|
type: 'bool', |
|
}) |
|
|
|
.option('j', { |
|
alias: 'json', |
|
default: false, |
|
describe: 'Output the index in json', |
|
type: 'bool', |
|
}) |
|
|
|
.version(function() { |
|
return require('../package').version; |
|
}) |
|
.alias('v', 'version') |
|
|
|
.help('h') |
|
.alias('h', 'help'); |
|
|
|
var argv = yargs.argv; |
|
|
|
if (argv._.length === 0) { |
|
yargs.showHelp(); |
|
process.exit(1); |
|
} |
|
|
|
if (['ancestors', 'descendents'].indexOf(argv._[0]) !== -1) { |
|
command = argv._.shift(); |
|
} |
|
|
|
if (argv._ && path.extname(argv._[0]) === '') { |
|
directory = argv._.shift(); |
|
} |
|
|
|
if (argv._ && path.extname(argv._[0])) { |
|
file = argv._.shift(); |
|
} |
|
|
|
|
|
try { |
|
if (!directory) { |
|
throw new Error('Missing directory'); |
|
} |
|
|
|
if (!command && !argv.json) { |
|
throw new Error('Missing command'); |
|
} |
|
|
|
if (!file && (command === 'ancestors' || command === 'descendents')) { |
|
throw new Error(command + ' command requires a file'); |
|
} |
|
|
|
var loadPaths = argv.loadPath; |
|
if(process.env.SASS_PATH) { |
|
loadPaths = loadPaths.concat(process.env.SASS_PATH.split(/:/).map(function(f) { |
|
return path.resolve(f); |
|
})); |
|
} |
|
|
|
var graph = require('../').parseDir(directory, { |
|
extensions: argv.extensions, |
|
loadPaths: loadPaths, |
|
follow: argv.follow, |
|
}); |
|
|
|
if(argv.json) { |
|
console.log(JSON.stringify(graph.index, null, 4)); |
|
process.exit(0); |
|
} |
|
|
|
if (command === 'ancestors') { |
|
graph.visitAncestors(path.resolve(file), function(f) { |
|
console.log(f); |
|
}); |
|
} |
|
|
|
if (command === 'descendents') { |
|
graph.visitDescendents(path.resolve(file), function(f) { |
|
console.log(f); |
|
}); |
|
} |
|
} catch(e) { |
|
if (e.code === 'ENOENT') { |
|
console.error('Error: no such file or directory "' + e.path + '"'); |
|
} |
|
else { |
|
console.log('Error: ' + e.message); |
|
} |
|
|
|
// console.log(e.stack); |
|
process.exit(1); |
|
}
|
|
|