From 98c45bb42189e8dac7e0cbb13f83e41c86b5db8b Mon Sep 17 00:00:00 2001 From: ikatyang Date: Fri, 8 Sep 2017 12:33:26 +0800 Subject: [PATCH] refactor: use getter to show warning --- src/cli-constant.js | 6 ++++-- src/cli-normalizer.js | 34 +++++++++++++++++++++++++++++++++- src/cli-util.js | 35 ++++++++++++++--------------------- src/cli.js | 7 ++++++- 4 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/cli-constant.js b/src/cli-constant.js index bb0bfe97..31e38097 100644 --- a/src/cli-constant.js +++ b/src/cli-constant.js @@ -60,7 +60,8 @@ const options = normalizer.normalizeDetailOptions({ // Deprecated in 0.0.10 type: "boolean", isHidden: true, - isFormatOption: true + isFormatOption: true, + deprecated: "Use `--parser flow` instead." }, help: { type: "boolean", @@ -111,7 +112,8 @@ const options = normalizer.normalizeDetailOptions({ type: "choice", isFormatOption: true, choices: ["flow", "babylon", "typescript", "postcss", "json", "graphql"], - description: "Specify which parse to use. Defaults to babylon." + description: "Specify which parse to use. Defaults to babylon.", + getter: (value, argv) => (argv["flow-parser"] ? "flow" : value) }, "print-width": { type: "int", diff --git a/src/cli-normalizer.js b/src/cli-normalizer.js index 789016db..3dcaf310 100644 --- a/src/cli-normalizer.js +++ b/src/cli-normalizer.js @@ -4,7 +4,26 @@ function normalizeDetailOptions(detailOptions) { const names = Object.keys(detailOptions).sort(); const normaliezdOptions = names.map(name => - Object.assign({ name }, detailOptions[name]) + Object.assign( + { + name, + _getValue: (value, argv) => { + const option = detailOptions[name]; + if (value && option.deprecated) { + let warning = `\`--${name}\` is deprecated.`; + if (typeof option.deprecated === "string") { + warning += ` ${option.deprecated}`; + } + console.warn(warning); + } + if (typeof option.getter === "function") { + return option.getter(value, argv); + } + return value; + } + }, + detailOptions[name] + ) ); normaliezdOptions.forEach(normalizedOption => { @@ -14,6 +33,19 @@ function normalizeDetailOptions(detailOptions) { return normaliezdOptions; } +function normalizeArgv(argv, detailOptions) { + const normalizedArgv = { _: argv["_"] }; + + detailOptions.forEach(option => { + Object.defineProperty(normalizedArgv, option.name, { + get: () => option._getValue(argv[option.name], normalizedArgv) + }); + }); + + return normalizedArgv; +} + module.exports = { + normalizeArgv, normalizeDetailOptions }; diff --git a/src/cli-util.js b/src/cli-util.js index ea859358..07fb661a 100644 --- a/src/cli-util.js +++ b/src/cli-util.js @@ -15,6 +15,7 @@ const cleanAST = require("./clean-ast").cleanAST; const resolver = require("./resolve-config"); const constant = require("./cli-constant"); const validator = require("./cli-validator"); +const normalizer = require("./cli-normalizer"); const apiDefaultOptions = require("./options").defaults; function getOptions(argv) { @@ -31,21 +32,10 @@ function getOptions(argv) { jsxBracketSameLine: argv["jsx-bracket-same-line"], filepath: argv["stdin-filepath"], trailingComma: getTrailingComma(argv), - parser: getParserOption(argv) + parser: argv["parser"] }; } -function getParserOption(argv) { - // For backward compatibility. Deprecated in 0.0.10 - /* istanbul ignore if */ - if (argv["flow-parser"]) { - console.warn("`--flow-parser` is deprecated. Use `--parser flow` instead."); - return "flow"; - } - - return argv["parser"]; -} - function getIntOption(argv, optionName) { const value = argv[optionName]; @@ -201,15 +191,18 @@ function getOptionsForFile(argv, filePath) { function parseArgsToOptions(args, overrideDefaults) { return getOptions( - minimist(args, { - boolean: constant.booleanOptionNames, - string: constant.stringOptionNames, - default: Object.assign( - {}, - dashifyObject(apiDefaultOptions), - dashifyObject(overrideDefaults) - ) - }) + normalizer.normalizeArgv( + minimist(args, { + boolean: constant.booleanOptionNames, + string: constant.stringOptionNames, + default: Object.assign( + {}, + dashifyObject(apiDefaultOptions), + dashifyObject(overrideDefaults) + ) + }), + constant.options + ) ); } diff --git a/src/cli.js b/src/cli.js index af64cd9e..802542d9 100644 --- a/src/cli.js +++ b/src/cli.js @@ -6,9 +6,14 @@ const prettier = eval("require")("../index"); const constant = require("./cli-constant"); const util = require("./cli-util"); const validator = require("./cli-validator"); +const normalizer = require("./cli-normalizer"); function run(args) { - const argv = minimist(args, constant.minimistOptions); + const argv = normalizer.normalizeArgv( + minimist(args, constant.minimistOptions), + constant.options + ); + argv.__args = args; argv.__filePatterns = argv["_"];