| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| const path = require('path'); |
| const childProcess = require('child_process'); |
| const { |
| devtoolsRootPath, |
| stylelintExecutablePath, |
| nodePath, |
| } = require('../devtools_paths.js'); |
| |
| const yargsObject = require('yargs') |
| .option('files', {type: 'array', desc: 'One or more files to lint.'}) |
| .option('glob', {default: '**/*.css', desc: 'A glob to choose which files to lint.'}) |
| .option('cwd', {default: devtoolsRootPath(), desc: 'Working directory to glob from'}) |
| .parserConfiguration({ |
| // So that if we pass --foo-bar, Yargs only populates |
| // argv with '--foo-bar', not '--foo-bar' and |
| // 'fooBar'. This is important because if we have both |
| // versions and pass them to stylelint, it errors |
| // saying that we've passed the same argument twice. |
| 'camel-case-expansion': false |
| }) |
| .argv; |
| |
| // Note: stylelint requires POSIX-formatted paths/globs, even on Windows. |
| // The forward slash is not a bug. |
| const DEFAULT_GLOB = '**/*.css'; |
| |
| function getCSSFilesOrGlobList() { |
| const files = yargsObject.files || []; |
| if (files.length > 0) { |
| return files.map(file => { |
| // Enforce posix file paths even on Windows |
| return file.split(path.sep).join(path.posix.sep); |
| }); |
| } |
| |
| return [yargsObject.glob || DEFAULT_GLOB]; |
| } |
| |
| function run() { |
| // eslint-disable-next-line no-unused-vars |
| const {glob, files, cwd, _, $0, ...flagsForStylelint} = yargsObject; |
| |
| const extraFlagsForStylelint = Object.keys(flagsForStylelint).flatMap(key => [`--${key}`, flagsForStylelint[key]]); |
| |
| const args = [ |
| stylelintExecutablePath(), ...getCSSFilesOrGlobList(), '--fix', '--allow-empty-input', ...extraFlagsForStylelint |
| ]; |
| const result = childProcess.spawnSync(nodePath(), args, {encoding: 'utf-8', cwd, stdio: 'inherit'}); |
| if (result.error) { |
| // If spawnSync returns an error, exit with an error no matter what result.status says. |
| console.error(result.error); |
| process.exit(1); |
| return; |
| } |
| process.exit(result.status); |
| } |
| |
| run(); |