#!/usr/bin/env node /* eslint-disable import/unambiguous */ 'use strict'; const fs = require('fs'); const updateNotifier = require('update-notifier'); const meow = require('meow'); const globby = require('globby'); const getStdin = require('get-stdin'); const pify = require('pify'); const { arrify, ignore } = require('./utils'); const { format } = require('./index'); const cli = meow( ` Usage $ prettier-stylelint [ ...] Options --ignore Additional paths to ignore [Can be set multiple times] --extension Additional extension to lint [Can be set multiple times] --cwd= Working directory for files --stdin Validate/fix code from stdin ('prettier-stylelint -' also works) --write Edit files in place (DRAGONS AHEAD !!) --quiet -q Only log std.err Examples $ prettier-stylelint $ prettier-stylelint index.js $ prettier-stylelint *.js !foo.js $ echo 'a[id="foo"] { content: "x"; }' | prettier-stylelint --stdin Default pattern when no arguments: **/*.{css,scss,less,sss} `, { string: ['_', 'ignore', 'extension', 'cwd'], boolean: ['stdin', 'write'], default: { cwd: process.cwd(), write: false, quiet: false }, alias: { q: 'quiet' } } ); updateNotifier({ pkg: cli.pkg }).notify(); let input = cli.input; const opts = cli.flags; const DEFAULT_EXTENSION = ['css', 'scss', 'less', 'sss']; const DEFAULT_PATTERN = `**/*.{${DEFAULT_EXTENSION.join(',')}}`; const DEFAULT_IGNORE = [ '**/node_modules/**', '**/bower_components/**', 'flow-typed/**', 'coverage/**', '{tmp,temp}/**', '**/*.min.{css,scss,less,sss}', '**/bundle.{css,scss,less,sss}', 'fixture{-*,}.{css,scss,less,sss}', 'fixture{s,}/**', '{test,tests,spec,__tests__}/fixture{s,}/**', 'vendor/**', 'dist/**' ]; const options = { ignore: DEFAULT_IGNORE.concat(arrify(opts.ignore)), extensions: DEFAULT_EXTENSION.concat(arrify(opts.extension)), cwd: opts.cwd, write: opts.write, quiet: opts.quiet }; if (input[0] === '-') { opts.stdin = true; input.shift(); } if (opts.stdin) { getStdin() .then(str => format({ filepath: opts.cwd, text: str }).then(source => process.stdout.write(source)) ) .catch((err) => { console.error(err.stack || err); process.exitCode = 1; }); } else { const isEmptyPatterns = input.length === 0; input = isEmptyPatterns ? [DEFAULT_PATTERN] : arrify(input); globby(input, { ignore: options.ignore, nodir: true, cwd: options.cwd }) .then((paths) => { paths = ignore(paths, options); return Promise.all( paths.map(path => format({ text: fs.readFileSync(path, 'utf8'), filePath: path, quiet: options.quiet }) .then((formatted) => { if (!options.quiet) { console.log(formatted); } if (options.write) { return pify(fs.writeFile)(path, formatted); } return formatted; }) .catch((err) => { console.error( `prettier-stylelint [ERROR]: There was an error formatting "${path}"\n` ); console.error(err.stack || err); console.error('\n'); process.exitCode = 1; }) ) ); }) .catch((err) => { console.error(err.stack || err); process.exitCode = 1; }); }