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.
		
		
		
		
			
				
					125 lines
				
				2.6 KiB
			
		
		
			
		
	
	
					125 lines
				
				2.6 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								#!/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);
							 | 
						||
| 
								 | 
							
								}
							 |