diff --git a/.eslintrc.js b/.eslintrc.js index c7ed3987e..dd11a9d1e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -191,12 +191,23 @@ module.exports = { }, }, { - files: ["src/cli/**/*.js"], + files: ["src/cli/*.js"], rules: { "no-restricted-modules": [ "error", { - patterns: [".."], + patterns: ["../"], + }, + ], + }, + }, + { + files: ["src/cli/*/*.js"], + rules: { + "no-restricted-modules": [ + "error", + { + patterns: ["../../"], }, ], }, diff --git a/src/cli/context.js b/src/cli/context.js index a2a869a4d..637c6e058 100644 --- a/src/cli/context.js +++ b/src/cli/context.js @@ -1,20 +1,10 @@ "use strict"; const pick = require("lodash/pick"); - -// eslint-disable-next-line no-restricted-modules -const prettier = require("../index.js"); +const getContextOptions = require("./options/get-context-options.js"); const { - optionsModule, - optionsNormalizer: { normalizeCliOptions }, - utils: { arrayify }, -} = require("./prettier-internal.js"); -const minimist = require("./minimist.js"); -const constant = require("./constant.js"); -const { - createDetailedOptionMap, - normalizeDetailedOptionMap, -} = require("./option-map.js"); -const createMinimistOptions = require("./create-minimist-options.js"); + parseArgv, + parseArgvWithoutPlugins, +} = require("./options/parse-cli-arguments.js"); /** * @typedef {Object} Context @@ -74,61 +64,4 @@ class Context { } } -function getContextOptions(plugins, pluginSearchDirs) { - const { options: supportOptions, languages } = prettier.getSupportInfo({ - showDeprecated: true, - showUnreleased: true, - showInternal: true, - plugins, - pluginSearchDirs, - }); - const detailedOptionMap = normalizeDetailedOptionMap({ - ...createDetailedOptionMap(supportOptions), - ...constant.options, - }); - - const detailedOptions = arrayify(detailedOptionMap, "name"); - - const apiDefaultOptions = { - ...optionsModule.hiddenDefaults, - ...Object.fromEntries( - supportOptions - .filter(({ deprecated }) => !deprecated) - .map((option) => [option.name, option.default]) - ), - }; - - return { - supportOptions, - detailedOptions, - detailedOptionMap, - apiDefaultOptions, - languages, - }; -} - -function parseArgv(rawArguments, detailedOptions, logger, keys) { - const minimistOptions = createMinimistOptions(detailedOptions); - let argv = minimist(rawArguments, minimistOptions); - - if (keys) { - detailedOptions = detailedOptions.filter((option) => - keys.includes(option.name) - ); - argv = pick(argv, keys); - } - - return normalizeCliOptions(argv, detailedOptions, { logger }); -} - -const detailedOptionsWithoutPlugins = getContextOptions().detailedOptions; -function parseArgvWithoutPlugins(rawArguments, logger, keys) { - return parseArgv( - rawArguments, - detailedOptionsWithoutPlugins, - logger, - typeof keys === "string" ? [keys] : keys - ); -} - -module.exports = { Context, parseArgvWithoutPlugins }; +module.exports = Context; diff --git a/src/cli/core.js b/src/cli/core.js deleted file mode 100644 index 5d7836f52..000000000 --- a/src/cli/core.js +++ /dev/null @@ -1,59 +0,0 @@ -"use strict"; - -const path = require("path"); - -const stringify = require("fast-json-stable-stringify"); - -// eslint-disable-next-line no-restricted-modules -const prettier = require("../index.js"); - -const { format, formatStdin, formatFiles } = require("./format.js"); -const { Context, parseArgvWithoutPlugins } = require("./context.js"); -const { - normalizeDetailedOptionMap, - createDetailedOptionMap, -} = require("./option-map.js"); -const { createDetailedUsage, createUsage } = require("./usage.js"); -const { createLogger } = require("./logger.js"); - -async function logResolvedConfigPathOrDie(context) { - const file = context.argv["find-config-path"]; - const configFile = await prettier.resolveConfigFile(file); - if (configFile) { - context.logger.log(path.relative(process.cwd(), configFile)); - } else { - throw new Error(`Can not find configure file for "${file}"`); - } -} - -async function logFileInfoOrDie(context) { - const options = { - ignorePath: context.argv["ignore-path"], - withNodeModules: context.argv["with-node-modules"], - plugins: context.argv.plugin, - pluginSearchDirs: context.argv["plugin-search-dir"], - resolveConfig: context.argv.config !== false, - }; - - context.logger.log( - prettier.format( - stringify(await prettier.getFileInfo(context.argv["file-info"], options)), - { parser: "json" } - ) - ); -} - -module.exports = { - Context, - createDetailedOptionMap, - createDetailedUsage, - createUsage, - format, - formatFiles, - formatStdin, - logResolvedConfigPathOrDie, - logFileInfoOrDie, - normalizeDetailedOptionMap, - parseArgvWithoutPlugins, - createLogger, -}; diff --git a/src/cli/file-info.js b/src/cli/file-info.js new file mode 100644 index 000000000..36a8dbc41 --- /dev/null +++ b/src/cli/file-info.js @@ -0,0 +1,24 @@ +"use strict"; + +const stringify = require("fast-json-stable-stringify"); +// eslint-disable-next-line no-restricted-modules +const prettier = require("../index.js"); + +async function logFileInfoOrDie(context) { + const options = { + ignorePath: context.argv["ignore-path"], + withNodeModules: context.argv["with-node-modules"], + plugins: context.argv.plugin, + pluginSearchDirs: context.argv["plugin-search-dir"], + resolveConfig: context.argv.config !== false, + }; + + context.logger.log( + prettier.format( + stringify(await prettier.getFileInfo(context.argv["file-info"], options)), + { parser: "json" } + ) + ); +} + +module.exports = logFileInfoOrDie; diff --git a/src/cli/find-config-path.js b/src/cli/find-config-path.js new file mode 100644 index 000000000..b2a0e7d14 --- /dev/null +++ b/src/cli/find-config-path.js @@ -0,0 +1,18 @@ +"use strict"; + +const path = require("path"); + +// eslint-disable-next-line no-restricted-modules +const prettier = require("../index.js"); + +async function logResolvedConfigPathOrDie(context) { + const file = context.argv["find-config-path"]; + const configFile = await prettier.resolveConfigFile(file); + if (configFile) { + context.logger.log(path.relative(process.cwd(), configFile)); + } else { + throw new Error(`Can not find configure file for "${file}"`); + } +} + +module.exports = logResolvedConfigPathOrDie; diff --git a/src/cli/format.js b/src/cli/format.js index df9055c43..bf61bef46 100644 --- a/src/cli/format.js +++ b/src/cli/format.js @@ -12,7 +12,7 @@ const { getStdin } = require("../common/third-party.js"); const { createIgnorer, errors } = require("./prettier-internal.js"); const { expandPatterns, fixWindowsSlashes } = require("./expand-patterns.js"); -const { getOptionsForFile } = require("./option.js"); +const getOptionsForFile = require("./options/get-options-for-file.js"); const isTTY = require("./is-tty.js"); function diff(a, b) { @@ -439,4 +439,4 @@ async function formatFiles(context) { } } -module.exports = { format, formatStdin, formatFiles }; +module.exports = { formatStdin, formatFiles }; diff --git a/src/cli/index.js b/src/cli/index.js index 15a47938d..ef33f8308 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -8,20 +8,26 @@ require("please-upgrade-node")(packageJson); const stringify = require("fast-json-stable-stringify"); // eslint-disable-next-line no-restricted-modules const prettier = require("../index.js"); -const core = require("./core.js"); +const createLogger = require("./logger.js"); +const Context = require("./context.js"); +const { parseArgvWithoutPlugins } = require("./options/parse-cli-arguments.js"); +const { createDetailedUsage, createUsage } = require("./usage.js"); +const { formatStdin, formatFiles } = require("./format.js"); +const logFileInfoOrDie = require("./file-info.js"); +const logResolvedConfigPathOrDie = require("./find-config-path.js"); async function run(rawArguments) { // Create a default level logger, so we can log errors during `logLevel` parsing - let logger = core.createLogger(); + let logger = createLogger(); try { - const logLevel = core.parseArgvWithoutPlugins( + const logLevel = parseArgvWithoutPlugins( rawArguments, logger, "loglevel" ).loglevel; if (logLevel !== logger.logLevel) { - logger = core.createLogger(logLevel); + logger = createLogger(logLevel); } await main(rawArguments, logger); @@ -32,7 +38,7 @@ async function run(rawArguments) { } async function main(rawArguments, logger) { - const context = new core.Context({ rawArguments, logger }); + const context = new Context({ rawArguments, logger }); logger.debug(`normalized argv: ${JSON.stringify(context.argv)}`); @@ -60,8 +66,8 @@ async function main(rawArguments, logger) { if (context.argv.help !== undefined) { logger.log( typeof context.argv.help === "string" && context.argv.help !== "" - ? core.createDetailedUsage(context, context.argv.help) - : core.createUsage(context) + ? createDetailedUsage(context, context.argv.help) + : createUsage(context) ); return; } @@ -81,15 +87,15 @@ async function main(rawArguments, logger) { (!process.stdin.isTTY || context.argv["stdin-filepath"]); if (context.argv["find-config-path"]) { - await core.logResolvedConfigPathOrDie(context); + await logResolvedConfigPathOrDie(context); } else if (context.argv["file-info"]) { - await core.logFileInfoOrDie(context); + await logFileInfoOrDie(context); } else if (useStdin) { - await core.formatStdin(context); + await formatStdin(context); } else if (hasFilePatterns) { - await core.formatFiles(context); + await formatFiles(context); } else { - logger.log(core.createUsage(context)); + logger.log(createUsage(context)); process.exitCode = 1; } } diff --git a/src/cli/logger.js b/src/cli/logger.js index 88c97e820..252b90496 100644 --- a/src/cli/logger.js +++ b/src/cli/logger.js @@ -87,4 +87,4 @@ function createLogger(logLevel = "log") { } } -module.exports = { createLogger }; +module.exports = createLogger; diff --git a/src/cli/create-minimist-options.js b/src/cli/options/create-minimist-options.js similarity index 100% rename from src/cli/create-minimist-options.js rename to src/cli/options/create-minimist-options.js diff --git a/src/cli/options/get-context-options.js b/src/cli/options/get-context-options.js new file mode 100644 index 000000000..f637a42be --- /dev/null +++ b/src/cli/options/get-context-options.js @@ -0,0 +1,47 @@ +"use strict"; +// eslint-disable-next-line no-restricted-modules +const prettier = require("../../index.js"); +const { + optionsModule, + utils: { arrayify }, +} = require("../prettier-internal.js"); +const constant = require("../constant.js"); +const { + normalizeDetailedOptionMap, + createDetailedOptionMap, +} = require("./option-map.js"); + +function getContextOptions(plugins, pluginSearchDirs) { + const { options: supportOptions, languages } = prettier.getSupportInfo({ + showDeprecated: true, + showUnreleased: true, + showInternal: true, + plugins, + pluginSearchDirs, + }); + const detailedOptionMap = normalizeDetailedOptionMap({ + ...createDetailedOptionMap(supportOptions), + ...constant.options, + }); + + const detailedOptions = arrayify(detailedOptionMap, "name"); + + const apiDefaultOptions = { + ...optionsModule.hiddenDefaults, + ...Object.fromEntries( + supportOptions + .filter(({ deprecated }) => !deprecated) + .map((option) => [option.name, option.default]) + ), + }; + + return { + supportOptions, + detailedOptions, + detailedOptionMap, + apiDefaultOptions, + languages, + }; +} + +module.exports = getContextOptions; diff --git a/src/cli/option.js b/src/cli/options/get-options-for-file.js similarity index 95% rename from src/cli/option.js rename to src/cli/options/get-options-for-file.js index d66f42372..8efbdaa58 100644 --- a/src/cli/option.js +++ b/src/cli/options/get-options-for-file.js @@ -2,9 +2,9 @@ const dashify = require("dashify"); // eslint-disable-next-line no-restricted-modules -const prettier = require("../index.js"); +const prettier = require("../../index.js"); +const { optionsNormalizer } = require("../prettier-internal.js"); const minimist = require("./minimist.js"); -const { optionsNormalizer } = require("./prettier-internal.js"); const createMinimistOptions = require("./create-minimist-options.js"); function getOptions(argv, detailedOptions) { @@ -135,7 +135,4 @@ async function getOptionsForFile(context, filepath) { return appliedOptions; } -module.exports = { - getOptionsForFile, - createMinimistOptions, -}; +module.exports = getOptionsForFile; diff --git a/src/cli/minimist.js b/src/cli/options/minimist.js similarity index 100% rename from src/cli/minimist.js rename to src/cli/options/minimist.js diff --git a/src/cli/option-map.js b/src/cli/options/option-map.js similarity index 96% rename from src/cli/option-map.js rename to src/cli/options/option-map.js index fa906c7fd..08917ca07 100644 --- a/src/cli/option-map.js +++ b/src/cli/options/option-map.js @@ -1,7 +1,7 @@ "use strict"; const dashify = require("dashify"); -const { coreOptions } = require("./prettier-internal.js"); +const { coreOptions } = require("../prettier-internal.js"); function normalizeDetailedOption(name, option) { return { diff --git a/src/cli/options/parse-cli-arguments.js b/src/cli/options/parse-cli-arguments.js new file mode 100644 index 000000000..3cabe9bd1 --- /dev/null +++ b/src/cli/options/parse-cli-arguments.js @@ -0,0 +1,34 @@ +"use strict"; +const pick = require("lodash/pick"); +const { + optionsNormalizer: { normalizeCliOptions }, +} = require("../prettier-internal.js"); +const getContextOptions = require("./get-context-options.js"); +const minimist = require("./minimist.js"); +const createMinimistOptions = require("./create-minimist-options.js"); + +function parseArgv(rawArguments, detailedOptions, logger, keys) { + const minimistOptions = createMinimistOptions(detailedOptions); + let argv = minimist(rawArguments, minimistOptions); + + if (keys) { + detailedOptions = detailedOptions.filter((option) => + keys.includes(option.name) + ); + argv = pick(argv, keys); + } + + return normalizeCliOptions(argv, detailedOptions, { logger }); +} + +const detailedOptionsWithoutPlugins = getContextOptions().detailedOptions; +function parseArgvWithoutPlugins(rawArguments, logger, keys) { + return parseArgv( + rawArguments, + detailedOptionsWithoutPlugins, + logger, + typeof keys === "string" ? [keys] : keys + ); +} + +module.exports = { parseArgv, parseArgvWithoutPlugins }; diff --git a/tests/integration/__tests__/help-options.js b/tests/integration/__tests__/help-options.js index e8a616ee5..f87acfa2f 100644 --- a/tests/integration/__tests__/help-options.js +++ b/tests/integration/__tests__/help-options.js @@ -3,19 +3,22 @@ const prettier = require("prettier-local"); const runPrettier = require("../runPrettier.js"); const constant = require("../../../src/cli/constant.js"); -const core = require("../../../src/cli/core.js"); +const { + createDetailedOptionMap, + normalizeDetailedOptionMap, +} = require("../../../src/cli/options/option-map.js"); const arrayify = require("../../../src/utils/arrayify.js"); for (const option of arrayify( { - ...core.createDetailedOptionMap( + ...createDetailedOptionMap( prettier.getSupportInfo({ showDeprecated: true, showUnreleased: true, showInternal: true, }).options ), - ...core.normalizeDetailedOptionMap(constant.options), + ...normalizeDetailedOptionMap(constant.options), }, "name" )) { diff --git a/tsconfig.json b/tsconfig.json index 0c539b74a..1d5511aae 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,11 +24,14 @@ "src/main/options.js", "src/cli/index.js", "src/cli/expand-patterns.js", - "src/cli/core.js", + "src/cli/file-info.js", + "src/cli/find-config-path.js", "src/cli/context.js", "src/cli/format.js", - "src/cli/option-map.js", - "src/cli/option.js", + "src/cli/options/get-context-options.js", + "src/cli/options/get-options-for-file.js", + "src/cli/options/option-map.js", + "src/cli/options/parse-cli-arguments.js", "src/cli/usage.js", "src/cli/constant.js", "src/cli/prettier-internal.js",