prettier/src/main/support.js

158 lines
4.1 KiB
JavaScript

"use strict";
const semver = require("semver");
const arrayify = require("../utils/arrayify");
const currentVersion = require("../../package.json").version;
const coreOptions = require("./core-options").options;
function getSupportInfo(version, opts) {
opts = Object.assign(
{
plugins: [],
showUnreleased: false,
showDeprecated: false,
showInternal: false
},
opts
);
if (!version) {
// pre-release version is smaller than the normal version in semver,
// we need to treat it as the normal one so as to test new features.
version = currentVersion.split("-", 1)[0];
}
const plugins = opts.plugins;
const options = arrayify(
Object.assign(
plugins.reduce(
(currentOptions, plugin) =>
Object.assign(currentOptions, plugin.options),
{}
),
coreOptions
),
"name"
)
.sort((a, b) => (a.name === b.name ? 0 : a.name < b.name ? -1 : 1))
.filter(filterSince)
.filter(filterDeprecated)
.map(mapDeprecated)
.map(mapInternal)
.map(option => {
const newOption = Object.assign({}, option);
if (Array.isArray(newOption.default)) {
newOption.default =
newOption.default.length === 1
? newOption.default[0].value
: newOption.default
.filter(filterSince)
.sort((info1, info2) =>
semver.compare(info2.since, info1.since)
)[0].value;
}
if (Array.isArray(newOption.choices)) {
newOption.choices = newOption.choices
.filter(filterSince)
.filter(filterDeprecated)
.map(mapDeprecated);
}
return newOption;
})
.map(option => {
const filteredPlugins = plugins.filter(
plugin =>
plugin.defaultOptions &&
plugin.defaultOptions[option.name] !== undefined
);
const pluginDefaults = filteredPlugins.reduce((reduced, plugin) => {
reduced[plugin.name] = plugin.defaultOptions[option.name];
return reduced;
}, {});
return Object.assign(option, { pluginDefaults });
});
const usePostCssParser = semver.lt(version, "1.7.1");
const useBabylonParser = semver.lt(version, "1.16.0");
const languages = plugins
.reduce((all, plugin) => all.concat(plugin.languages || []), [])
.filter(filterSince)
.map(language => {
// Prevent breaking changes
if (language.name === "Markdown") {
return Object.assign({}, language, {
parsers: ["markdown"]
});
}
if (language.name === "TypeScript") {
return Object.assign({}, language, {
parsers: ["typescript"]
});
}
// "babylon" was renamed to "babel" in 1.16.0
if (useBabylonParser && language.parsers.indexOf("babel") !== -1) {
return Object.assign({}, language, {
parsers: language.parsers.map(parser =>
parser === "babel" ? "babylon" : parser
)
});
}
if (
usePostCssParser &&
(language.name === "CSS" || language.group === "CSS")
) {
return Object.assign({}, language, {
parsers: ["postcss"]
});
}
return language;
});
return { languages, options };
function filterSince(object) {
return (
opts.showUnreleased ||
!("since" in object) ||
(object.since && semver.gte(version, object.since))
);
}
function filterDeprecated(object) {
return (
opts.showDeprecated ||
!("deprecated" in object) ||
(object.deprecated && semver.lt(version, object.deprecated))
);
}
function mapDeprecated(object) {
if (!object.deprecated || opts.showDeprecated) {
return object;
}
const newObject = Object.assign({}, object);
delete newObject.deprecated;
delete newObject.redirect;
return newObject;
}
function mapInternal(object) {
if (opts.showInternal) {
return object;
}
const newObject = Object.assign({}, object);
delete newObject.cliName;
delete newObject.cliCategory;
delete newObject.cliDescription;
return newObject;
}
}
module.exports = {
getSupportInfo
};