sassgraph 2.58 KB
#!/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', '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()
    .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._.length && path.extname(argv._[0]) === '') {
  directory = argv._.shift();
}

if (argv._.length && 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);
}