Fix inferredParser when calling getFileInfo() with resolveConfig: true (#8551)

This commit is contained in:
fisker Cheung authored and GitHub committed 2020-06-17 18:47:56 +08:00
1 parent 11d0f4203e
commit fbf0beb716
9 files changed
+213 -169

No files matched your search

+29
View File
@@ -0,0 +1,29 @@
#### Fix `prettier.getFileInfo()` ([#8548](https://github.com/prettier/prettier/pull/8548), [#8551](https://github.com/prettier/prettier/pull/8551) by [@fisker](https://github.com/fisker))
When passing `{resolveConfig: true}`, the parsers in config file is preferred.
<!-- prettier-ignore -->
```console
$ echo {"parser":"flow"}>.prettierrc
$ node -p "require('prettier').getFileInfo.sync('./foo.js', {resolveConfig: true})"
# Prettier stable
# { ignored: false, inferredParser: 'babel' }
# Prettier master
# { ignored: false, inferredParser: 'flow' }
```
If given `filePath` is ignored, the `inferredParser` is always `null`.
<!-- prettier-ignore -->
```console
$ echo ignored.js>>.prettierignore
$ node -p "require('prettier').getFileInfo.sync('./ignored.js')"
# Prettier stable
# { ignored: true, inferredParser: 'babel' }
# Prettier master
# { ignored: true, inferredParser: null }
```
+2
View File
@@ -98,6 +98,8 @@ The promise will be rejected if the type of `filePath` is not `string`.
Setting `options.ignorePath` (`string`) and `options.withNodeModules` (`boolean`) influence the value of `ignored` (`false` by default).
If the given `filePath` is ignored, the `inferredParser` is always `null`.
Providing [plugin](plugins.md) paths in `options.plugins` (`string[]`) helps extract `inferredParser` for files that are not supported by Prettier core.
When setting `options.resolveConfig` (`boolean`, default `false`), Prettier will resolve the configuration for the given `filePath`. This is useful, for example, when the `inferredParser` might be overridden for a subset of files.
+29 -21
View File
@@ -58,6 +58,20 @@ getFileInfo.sync = function (filePath, opts) {
});
};
function getFileParser(resolvedConfig, filePath, plugins) {
if (resolvedConfig && resolvedConfig.parser) {
return resolvedConfig.parser;
}
const inferredParser = options.inferParser(filePath, plugins);
if (inferredParser) {
return inferredParser;
}
return null;
}
function _getFileInfo({
ignorer,
filePath,
@@ -74,31 +88,25 @@ function _getFileInfo({
return fileInfo;
}
const inferredParser = options.inferParser(filePath, plugins);
let resolvedConfig;
if (inferredParser) {
fileInfo.inferredParser = inferredParser;
return fileInfo;
}
if (!resolveConfig) {
return fileInfo;
}
if (sync) {
const resolvedConfig = config.resolveConfig.sync(filePath);
if (resolvedConfig && resolvedConfig.parser) {
fileInfo.inferredParser = resolvedConfig.parser;
if (resolveConfig) {
if (sync) {
resolvedConfig = config.resolveConfig.sync(filePath);
} else {
return config.resolveConfig(filePath).then((resolvedConfig) => {
fileInfo.inferredParser = getFileParser(
resolvedConfig,
filePath,
plugins
);
return fileInfo;
});
}
return fileInfo;
}
return config.resolveConfig(filePath).then((resolvedConfig) => {
if (resolvedConfig && resolvedConfig.parser) {
fileInfo.inferredParser = resolvedConfig.parser;
}
return fileInfo;
});
fileInfo.inferredParser = getFileParser(resolvedConfig, filePath, plugins);
return fileInfo;
}
function normalizeFilePath(filePath, ignorePath) {
+151 -138
View File
@@ -3,6 +3,7 @@
const path = require("path");
const tempy = require("tempy");
const fs = require("fs");
const fromPairs = require("lodash/fromPairs");
const runPrettier = require("../runPrettier");
const prettier = require("prettier/local");
@@ -131,155 +132,167 @@ test("API getFileInfo.sync with filepath only", () => {
});
});
test("API getFileInfo with resolveConfig", () => {
const file1 = path.resolve(
path.join(__dirname, "../cli/with-resolve-config/file.foo")
describe("API getFileInfo resolveConfig", () => {
const files = fromPairs(
["foo", "js", "bar", "css"].map((ext) => [
ext,
path.resolve(
path.join(__dirname, `../cli/with-resolve-config/file.${ext}`)
),
])
);
const file2 = path.resolve(
path.join(__dirname, "../cli/with-resolve-config/file.bar")
);
const file3 = path.resolve(
path.join(__dirname, "../cli/with-resolve-config/file.js")
);
expect(prettier.getFileInfo(file1)).resolves.toMatchObject({
ignored: false,
inferredParser: null,
test("{resolveConfig: undefined}", () => {
expect(prettier.getFileInfo(files.foo)).resolves.toMatchObject({
ignored: false,
inferredParser: null,
});
expect(prettier.getFileInfo(files.js)).resolves.toMatchObject({
ignored: false,
inferredParser: "babel",
});
expect(prettier.getFileInfo(files.bar)).resolves.toMatchObject({
ignored: false,
inferredParser: null,
});
expect(prettier.getFileInfo(files.css)).resolves.toMatchObject({
ignored: false,
inferredParser: "css",
});
});
expect(prettier.getFileInfo(file2)).resolves.toMatchObject({
ignored: false,
inferredParser: null,
test("{resolveConfig: true}", () => {
expect(
prettier.getFileInfo(files.foo, { resolveConfig: true })
).resolves.toMatchObject({
ignored: false,
inferredParser: "foo-parser",
});
expect(
prettier.getFileInfo(files.js, { resolveConfig: true })
).resolves.toMatchObject({
ignored: false,
inferredParser: "override-js-parser",
});
expect(
prettier.getFileInfo(files.bar, { resolveConfig: true })
).resolves.toMatchObject({
ignored: false,
inferredParser: null,
});
expect(
prettier.getFileInfo(files.css, { resolveConfig: true })
).resolves.toMatchObject({
ignored: false,
inferredParser: "css",
});
});
expect(prettier.getFileInfo(file3)).resolves.toMatchObject({
ignored: false,
inferredParser: "babel",
test("sync {resolveConfig: undefined}", () => {
expect(prettier.getFileInfo.sync(files.foo)).toMatchObject({
ignored: false,
inferredParser: null,
});
expect(prettier.getFileInfo.sync(files.js)).toMatchObject({
ignored: false,
inferredParser: "babel",
});
expect(prettier.getFileInfo.sync(files.bar)).toMatchObject({
ignored: false,
inferredParser: null,
});
expect(prettier.getFileInfo.sync(files.css)).toMatchObject({
ignored: false,
inferredParser: "css",
});
});
expect(
prettier.getFileInfo(file1, {
resolveConfig: true,
})
).resolves.toMatchObject({
ignored: false,
inferredParser: "json",
});
expect(
prettier.getFileInfo(file2, {
resolveConfig: true,
})
).resolves.toMatchObject({
ignored: false,
inferredParser: "babel",
});
expect(
prettier.getFileInfo(file3, {
resolveConfig: true,
})
).resolves.toMatchObject({
ignored: false,
// Bug: should be `not-babel`
inferredParser: "babel",
test("sync {resolveConfig: true}", () => {
expect(
prettier.getFileInfo.sync(files.foo, {
resolveConfig: true,
})
).toMatchObject({
ignored: false,
inferredParser: "foo-parser",
});
expect(
prettier.getFileInfo.sync(files.js, {
resolveConfig: true,
})
).toMatchObject({
ignored: false,
inferredParser: "override-js-parser",
});
expect(
prettier.getFileInfo.sync(files.bar, {
resolveConfig: true,
})
).toMatchObject({
ignored: false,
inferredParser: null,
});
expect(
prettier.getFileInfo.sync(files.css, {
resolveConfig: true,
})
).toMatchObject({
ignored: false,
inferredParser: "css",
});
});
});
test("API getFileInfo with resolveConfig when no config is present", () => {
const file1 = path.resolve(
path.join(__dirname, "../cli/with-resolve-config-no-config/file.foo")
describe("API getFileInfo resolveConfig when no config is present", () => {
const files = fromPairs(
["foo", "js"].map((ext) => [
ext,
path.resolve(path.join(__dirname, `../cli/non-exists-dir/file.${ext}`)),
])
);
const file2 = path.resolve(
path.join(__dirname, "../cli/with-resolve-config-no-config/file.bar")
);
expect(prettier.getFileInfo(file1)).resolves.toMatchObject({
ignored: false,
inferredParser: null,
test("{resolveConfig: undefined}", () => {
expect(prettier.getFileInfo(files.foo)).resolves.toMatchObject({
ignored: false,
inferredParser: null,
});
expect(prettier.getFileInfo(files.js)).resolves.toMatchObject({
ignored: false,
inferredParser: "babel",
});
});
expect(prettier.getFileInfo(file2)).resolves.toMatchObject({
ignored: false,
inferredParser: null,
test("{resolveConfig: true}", () => {
expect(
prettier.getFileInfo(files.foo, { resolveConfig: true })
).resolves.toMatchObject({
ignored: false,
inferredParser: null,
});
expect(
prettier.getFileInfo(files.js, { resolveConfig: true })
).resolves.toMatchObject({
ignored: false,
inferredParser: "babel",
});
});
expect(
prettier.getFileInfo(file1, {
resolveConfig: true,
})
).resolves.toMatchObject({
ignored: false,
inferredParser: null,
test("sync {resolveConfig: undefined}", () => {
expect(prettier.getFileInfo.sync(files.foo)).toMatchObject({
ignored: false,
inferredParser: null,
});
expect(prettier.getFileInfo.sync(files.js)).toMatchObject({
ignored: false,
inferredParser: "babel",
});
});
expect(
prettier.getFileInfo(file2, {
resolveConfig: true,
})
).resolves.toMatchObject({
ignored: false,
inferredParser: null,
});
});
test("API getFileInfo.sync with resolveConfig", () => {
const file1 = path.resolve(
path.join(__dirname, "../cli/with-resolve-config/file.foo")
);
const file2 = path.resolve(
path.join(__dirname, "../cli/with-resolve-config/file.bar")
);
expect(prettier.getFileInfo.sync(file1)).toMatchObject({
ignored: false,
inferredParser: null,
});
expect(prettier.getFileInfo.sync(file2)).toMatchObject({
ignored: false,
inferredParser: null,
});
expect(
prettier.getFileInfo.sync(file1, {
resolveConfig: true,
})
).toMatchObject({
ignored: false,
inferredParser: "json",
});
expect(
prettier.getFileInfo.sync(file2, {
resolveConfig: true,
})
).toMatchObject({
ignored: false,
inferredParser: "babel",
});
});
test("API getFileInfo.sync with resolveConfig when no config is present", () => {
const file1 = path.resolve(
path.join(__dirname, "../cli/with-resolve-config-no-config/file.foo")
);
const file2 = path.resolve(
path.join(__dirname, "../cli/with-resolve-config-no-config/file.bar")
);
expect(prettier.getFileInfo.sync(file1)).toMatchObject({
ignored: false,
inferredParser: null,
});
expect(prettier.getFileInfo.sync(file2)).toMatchObject({
ignored: false,
inferredParser: null,
});
expect(
prettier.getFileInfo.sync(file1, {
resolveConfig: true,
})
).toMatchObject({
ignored: false,
inferredParser: null,
});
expect(
prettier.getFileInfo.sync(file2, {
resolveConfig: true,
})
).toMatchObject({
ignored: false,
inferredParser: null,
test("sync {resolveConfig: true}", () => {
expect(
prettier.getFileInfo.sync(files.foo, { resolveConfig: true })
).toMatchObject({
ignored: false,
inferredParser: null,
});
expect(
prettier.getFileInfo.sync(files.js, { resolveConfig: true })
).toMatchObject({
ignored: false,
inferredParser: "babel",
});
});
});
@@ -1 +0,0 @@
const foo = "bar";
@@ -1 +0,0 @@
{}
@@ -2,15 +2,11 @@
"overrides": [
{
"files": "*.foo",
"options": { "parser": "json" }
},
{
"files": "*.bar",
"options": { "parser": "babel" }
"options": { "parser": "foo-parser" }
},
{
"files": "*.js",
"options": { "parser": "not-babel" }
"options": { "parser": "override-js-parser" }
}
]
}
@@ -1 +0,0 @@
const foo = "bar";
@@ -1 +0,0 @@
{}