From da772ff1f0765ba93ea2547a337b20074fa00c35 Mon Sep 17 00:00:00 2001 From: Daniel Bayley Date: Fri, 10 May 2024 11:36:44 +0100 Subject: [PATCH] feat: add support for `package.yaml` config (#16157) Co-authored-by: fisker Cheung --- changelog_unreleased/api/16157.md | 10 +++++++ docs/configuration.md | 2 +- src/config/prettier-config/config-searcher.js | 14 ++++++++- src/config/prettier-config/load-config.js | 9 ++++-- src/config/prettier-config/loaders.js | 7 ++++- .../__tests__/config-resolution.js | 30 +++++++++++++++++++ .../cli/config/package-yaml/package.yaml | 4 +++ 7 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 changelog_unreleased/api/16157.md create mode 100644 tests/integration/cli/config/package-yaml/package.yaml diff --git a/changelog_unreleased/api/16157.md b/changelog_unreleased/api/16157.md new file mode 100644 index 000000000..a7f53fa92 --- /dev/null +++ b/changelog_unreleased/api/16157.md @@ -0,0 +1,10 @@ +#### Add support for `package.yaml` config (#16157 by @danielbayley) + +Enable support for reading `prettier` configuration from [`package.yaml`](https://github.com/pnpm/pnpm/pull/1799). + +```yaml +# package.yaml +prettier: + semi: false + singleQuote: true +``` diff --git a/docs/configuration.md b/docs/configuration.md index 865524248..7848faf3d 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -5,7 +5,7 @@ title: Configuration File You can configure Prettier via (in order of precedence): -- A `"prettier"` key in your `package.json` file. +- A `"prettier"` key in your `package.json`, or [`package.yaml`](https://github.com/pnpm/pnpm/pull/1799) file. - A `.prettierrc` file written in JSON or YAML. - A `.prettierrc.json`, `.prettierrc.yml`, `.prettierrc.yaml`, or `.prettierrc.json5` file. - A `.prettierrc.js`, or `prettier.config.js` file that exports an object using `export default` or `module.exports` (depends on the [`type`](https://nodejs.org/api/packages.html#type) value in your `package.json`). diff --git a/src/config/prettier-config/config-searcher.js b/src/config/prettier-config/config-searcher.js index 11ca86f80..b1c607a2d 100644 --- a/src/config/prettier-config/config-searcher.js +++ b/src/config/prettier-config/config-searcher.js @@ -1,9 +1,13 @@ import isFile from "../../utils/is-file.js"; import Searcher from "../searcher.js"; -import { loadConfigFromPackageJson } from "./loaders.js"; +import { + loadConfigFromPackageJson, + loadConfigFromPackageYaml, +} from "./loaders.js"; const CONFIG_FILE_NAMES = [ "package.json", + "package.yaml", ".prettierrc", ".prettierrc.json", ".prettierrc.yaml", @@ -31,6 +35,14 @@ async function filter({ name, path: file }) { } } + if (name === "package.yaml") { + try { + return Boolean(await loadConfigFromPackageYaml(file)); + } catch { + return false; + } + } + return true; } diff --git a/src/config/prettier-config/load-config.js b/src/config/prettier-config/load-config.js index 65977eec7..d248a717b 100644 --- a/src/config/prettier-config/load-config.js +++ b/src/config/prettier-config/load-config.js @@ -1,14 +1,19 @@ import path from "node:path"; import loadExternalConfig from "./load-external-config.js"; -import loaders, { loadConfigFromPackageJson } from "./loaders.js"; +import loaders, { + loadConfigFromPackageJson, + loadConfigFromPackageYaml, +} from "./loaders.js"; async function loadConfig(configFile) { const { base: fileName, ext: extension } = path.parse(configFile); const load = fileName === "package.json" ? loadConfigFromPackageJson - : loaders[extension]; + : fileName === "package.yaml" + ? loadConfigFromPackageYaml + : loaders[extension]; if (!load) { throw new Error( diff --git a/src/config/prettier-config/loaders.js b/src/config/prettier-config/loaders.js index a5f5f57b2..876113c5c 100644 --- a/src/config/prettier-config/loaders.js +++ b/src/config/prettier-config/loaders.js @@ -27,6 +27,11 @@ async function loadConfigFromPackageJson(file) { return prettier; } +async function loadConfigFromPackageYaml(file) { + const { prettier } = await loadYaml(file); + return prettier; +} + async function loadYaml(file) { const content = await readFile(file); try { @@ -67,4 +72,4 @@ const loaders = { }; export default loaders; -export { loadConfigFromPackageJson, readJson }; +export { loadConfigFromPackageJson, loadConfigFromPackageYaml, readJson }; diff --git a/tests/integration/__tests__/config-resolution.js b/tests/integration/__tests__/config-resolution.js index 0397117e1..d8560ba02 100644 --- a/tests/integration/__tests__/config-resolution.js +++ b/tests/integration/__tests__/config-resolution.js @@ -419,3 +419,33 @@ test("Search from directory, not treat file as directory", async () => { "directory/.prettierrc", ); }); + +test("package.json/package.yaml", async () => { + await expect( + prettier.resolveConfig( + new URL("../cli/config/package/file.js", import.meta.url), + ), + ).resolves.toMatchInlineSnapshot(` + { + "tabWidth": 3, + } + `); + await expect( + prettier.resolveConfig( + new URL("../cli/config/package/file.ts", import.meta.url), + ), + ).resolves.toMatchInlineSnapshot(` + { + "tabWidth": 5, + } + `); + await expect( + prettier.resolveConfig( + new URL("../cli/config/package-yaml/file.ts", import.meta.url), + ), + ).resolves.toMatchInlineSnapshot(` + { + "printWidth": 101, + } + `); +}); diff --git a/tests/integration/cli/config/package-yaml/package.yaml b/tests/integration/cli/config/package-yaml/package.yaml new file mode 100644 index 000000000..8d6296bb4 --- /dev/null +++ b/tests/integration/cli/config/package-yaml/package.yaml @@ -0,0 +1,4 @@ +name: my-package +version: 1.0.0 +prettier: + printWidth: 101