From 44d246a2a25473f65ab6be98cf5fe63d3ffe8f8d Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Mon, 1 Aug 2022 10:51:31 +0800 Subject: [PATCH] Support config file in ESM (#13130) --- changelog_unreleased/api/13130.md | 19 ++++ docs/configuration.md | 26 ++++- package.json | 1 + scripts/build/bundler.mjs | 1 + .../build/esbuild-plugins/throw-warnings.mjs | 12 +- src/config/get-prettier-config-explorer.js | 32 +++++- src/config/load-external-config.js | 27 +++++ src/utils/import-from-file.js | 9 ++ src/utils/require-from-file.js | 8 ++ .../__snapshots__/config-resolution.js.snap | 14 ++- tests/integration/__tests__/config-invalid.js | 4 +- .../__tests__/config-resolution.js | 106 ++++++++++++++++-- .../__tests__/plugin-options-string.js | 4 +- .../{ => cjs-package}/index.js | 0 .../@company/prettier-config/index.json | 0 .../@company/prettier-config/package.json | 0 .../{ => cjs-package}/package.json | 0 .../config/external-config/esm-file/index.js | 1 + .../esm-file/my-prettier-config-file.js | 4 + .../external-config/esm-file/package.json | 5 + .../external-config/esm-package/index.js | 1 + .../@company/prettier-config/index.js | 4 + .../@company/prettier-config/package.json | 7 ++ .../external-config/esm-package/package.json | 3 + .../package.json | 5 + .../prettier.config.js | 6 + .../package.json | 5 + .../prettier.config.js | 4 + .../package.json | 4 + .../prettier.config.js | 6 + .../.prettierrc.js | 6 + .../package.json | 5 + .../.prettierrc.js | 6 + .../package.json | 5 + .../.prettierrc.js | 6 + .../package.json | 4 + .../package.json | 5 + .../prettier.config.js | 4 + .../package.json | 5 + .../prettier.config.js | 4 + .../package.json | 4 + .../prettier.config.js | 4 + .../.prettierrc.js | 4 + .../package.json | 5 + .../.prettierrc.js | 4 + .../package.json | 5 + .../.prettierrc.js | 4 + .../package.json | 4 + .../package.json | 5 + .../prettier.config.mjs | 4 + .../package.json | 5 + .../prettier.config.mjs | 4 + .../package.json | 4 + .../prettier.config.mjs | 4 + .../.prettierrc.mjs | 4 + .../package.json | 5 + .../.prettierrc.mjs | 4 + .../package.json | 5 + .../.prettierrc.mjs | 4 + .../prettierrc-mjs-in-type-none/package.json | 4 + yarn.lock | 19 ++++ 61 files changed, 442 insertions(+), 31 deletions(-) create mode 100644 changelog_unreleased/api/13130.md create mode 100644 src/config/load-external-config.js create mode 100644 src/utils/import-from-file.js create mode 100644 src/utils/require-from-file.js rename tests/integration/cli/config/external-config/{ => cjs-package}/index.js (100%) rename tests/integration/cli/config/external-config/{ => cjs-package}/node_modules/@company/prettier-config/index.json (100%) rename tests/integration/cli/config/external-config/{ => cjs-package}/node_modules/@company/prettier-config/package.json (100%) rename tests/integration/cli/config/external-config/{ => cjs-package}/package.json (100%) create mode 100644 tests/integration/cli/config/external-config/esm-file/index.js create mode 100644 tests/integration/cli/config/external-config/esm-file/my-prettier-config-file.js create mode 100644 tests/integration/cli/config/external-config/esm-file/package.json create mode 100644 tests/integration/cli/config/external-config/esm-package/index.js create mode 100644 tests/integration/cli/config/external-config/esm-package/node_modules/@company/prettier-config/index.js create mode 100644 tests/integration/cli/config/external-config/esm-package/node_modules/@company/prettier-config/package.json create mode 100644 tests/integration/cli/config/external-config/esm-package/package.json create mode 100644 tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-commonjs/package.json create mode 100644 tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-commonjs/prettier.config.js create mode 100644 tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-module/package.json create mode 100644 tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-module/prettier.config.js create mode 100644 tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-none/package.json create mode 100644 tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-none/prettier.config.js create mode 100644 tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-commonjs/.prettierrc.js create mode 100644 tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-commonjs/package.json create mode 100644 tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-module/.prettierrc.js create mode 100644 tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-module/package.json create mode 100644 tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-none/.prettierrc.js create mode 100644 tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-none/package.json create mode 100644 tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-commonjs/package.json create mode 100644 tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-commonjs/prettier.config.js create mode 100644 tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-module/package.json create mode 100644 tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-module/prettier.config.js create mode 100644 tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-none/package.json create mode 100644 tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-none/prettier.config.js create mode 100644 tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-commonjs/.prettierrc.js create mode 100644 tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-commonjs/package.json create mode 100644 tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-module/.prettierrc.js create mode 100644 tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-module/package.json create mode 100644 tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-none/.prettierrc.js create mode 100644 tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-none/package.json create mode 100644 tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-commonjs/package.json create mode 100644 tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-commonjs/prettier.config.mjs create mode 100644 tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-module/package.json create mode 100644 tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-module/prettier.config.mjs create mode 100644 tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-none/package.json create mode 100644 tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-none/prettier.config.mjs create mode 100644 tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-commonjs/.prettierrc.mjs create mode 100644 tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-commonjs/package.json create mode 100644 tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-module/.prettierrc.mjs create mode 100644 tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-module/package.json create mode 100644 tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-none/.prettierrc.mjs create mode 100644 tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-none/package.json diff --git a/changelog_unreleased/api/13130.md b/changelog_unreleased/api/13130.md new file mode 100644 index 000000000..d59d818a3 --- /dev/null +++ b/changelog_unreleased/api/13130.md @@ -0,0 +1,19 @@ +#### Support config files in ESM (#13130 by @fisker) + +Config files in ESM are supported, supported config file names: + +- `prettier.config.js` (in place with `{"type": "module"}` in `package.json`) +- `.prettierrc.js` (same as above) +- `prettier.config.mjs` +- `.prettierrc.mjs`. + +```js +export default { + trailingComma: "es5", + tabWidth: 4, + semi: false, + singleQuote: true, +}; +``` + +**[Shareable config package](https://prettier.io/docs/en/configuration.html#sharing-configurations) can also be a pure ESM package.** diff --git a/docs/configuration.md b/docs/configuration.md index 3d8c40920..48b928961 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -8,7 +8,9 @@ Prettier uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for co - A `"prettier"` key in your `package.json` file. - A `.prettierrc` file written in JSON or YAML. - A `.prettierrc.json`, `.prettierrc.yml`, `.prettierrc.yaml`, or `.prettierrc.json5` file. -- A `.prettierrc.js`, `.prettierrc.cjs`, `prettier.config.js`, or `prettier.config.cjs` file that exports an object using `module.exports`. +- 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`). +- A `.prettierrc.mjs`, or `prettier.config.mjs` file that exports an object using `export default`. +- A `.prettierrc.cjs`, or `prettier.config.cjs` file that exports an object using `module.exports`. - A `.prettierrc.toml` file. The configuration file will be resolved starting from the location of the file being formatted, and searching up the file tree until a config file is (or isn’t) found. @@ -30,10 +32,22 @@ JSON: } ``` -JS: +JS(ESM): ```js -// prettier.config.js or .prettierrc.js +// prettier.config.js, .prettierrc.js, prettier.config.mjs, or .prettierrc.mjs +export default { + trailingComma: "es5", + tabWidth: 4, + semi: false, + singleQuote: true, +}; +``` + +JS(CommonJS): + +```js +// prettier.config.js, .prettierrc.js, prettier.config.cjs, or .prettierrc.cjs module.exports = { trailingComma: "es5", tabWidth: 4, @@ -130,8 +144,10 @@ An example configuration repository is available [here](https://github.com/azz/p > Note: This method does **not** offer a way to _extend_ the configuration to overwrite some properties from the shared configuration. If you need to do that, import the file in a `.prettierrc.js` file and export the modifications, e.g: > > ```js -> module.exports = { -> ...require("@company/prettier-config"), +> import companyPrettierConfig from "@company/prettier-config"; +> +> export default { +> ...companyPrettierConfig, > semi: false, > }; > ``` diff --git a/package.json b/package.json index a6b9a994d..eb5c57847 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "html-tag-names": "2.0.1", "html-void-elements": "2.0.1", "ignore": "5.2.0", + "import-meta-resolve": "2.0.3", "jest-docblock": "28.1.1", "json5": "2.2.1", "leven": "4.0.0", diff --git a/scripts/build/bundler.mjs b/scripts/build/bundler.mjs index 03f23196f..de8682f91 100644 --- a/scripts/build/bundler.mjs +++ b/scripts/build/bundler.mjs @@ -203,6 +203,7 @@ function* getEsbuildOptions(bundle, buildOptions) { esbuildPluginVisualizer({ formats: buildOptions.reports }), esbuildPluginThrowWarnings({ allowDynamicRequire: bundle.target === "node", + allowDynamicImport: bundle.target === "node", }), ].filter(Boolean), minify: shouldMinify, diff --git a/scripts/build/esbuild-plugins/throw-warnings.mjs b/scripts/build/esbuild-plugins/throw-warnings.mjs index 9b7c9e1b5..e126d3edf 100644 --- a/scripts/build/esbuild-plugins/throw-warnings.mjs +++ b/scripts/build/esbuild-plugins/throw-warnings.mjs @@ -57,7 +57,10 @@ const logOverride = Object.fromEntries( ESBUILD_MESSAGE_IDS.map((id) => [id, "warning"]) ); -export default function esbuildPluginThrowWarnings({ allowDynamicRequire }) { +export default function esbuildPluginThrowWarnings({ + allowDynamicRequire, + allowDynamicImport, +}) { return { name: "throw-warnings", setup(build) { @@ -82,6 +85,13 @@ export default function esbuildPluginThrowWarnings({ allowDynamicRequire }) { continue; } + if ( + allowDynamicImport && + warning.id === "unsupported-dynamic-import" + ) { + continue; + } + if ( [ "node_modules/flow-parser/flow_parser.js", diff --git a/src/config/get-prettier-config-explorer.js b/src/config/get-prettier-config-explorer.js index f6de658c6..8e616c535 100644 --- a/src/config/get-prettier-config-explorer.js +++ b/src/config/get-prettier-config-explorer.js @@ -1,7 +1,8 @@ -import { createRequire } from "node:module"; +import { pathToFileURL } from "node:url"; import loadToml from "../utils/load-toml.js"; import loadJson5 from "../utils/load-json5.js"; import thirdParty from "../common/third-party.js"; +import loadExternalConfig from "./load-external-config.js"; const { cosmiconfig } = thirdParty; @@ -13,23 +14,45 @@ const searchPlaces = [ ".prettierrc.yml", ".prettierrc.json5", ".prettierrc.js", + ".prettierrc.mjs", ".prettierrc.cjs", "prettier.config.js", + "prettier.config.mjs", "prettier.config.cjs", ".prettierrc.toml", ]; -const loaders = { ".toml": loadToml, ".json5": loadJson5 }; +async function loadJs(filepath /*, content*/) { + const module = await import(pathToFileURL(filepath).href); + return module.default; +} -function transform(result) { +const loaders = { + ".toml": loadToml, + ".json5": loadJson5, + ".js": loadJs, + ".mjs": loadJs, + ".cjs": loadJs, +}; + +async function transform(result) { if (!result?.config) { return result; } let { config, filepath } = result; + /* + We support external config + + ```json + { + "prettier": "my-prettier-config-package-or-file" + } + ``` + */ if (typeof config === "string") { - config = createRequire(filepath)(config); + config = await loadExternalConfig(config, filepath); result.config = config; } @@ -41,7 +64,6 @@ function transform(result) { } delete config.$schema; - return result; } diff --git a/src/config/load-external-config.js b/src/config/load-external-config.js new file mode 100644 index 000000000..4e8199284 --- /dev/null +++ b/src/config/load-external-config.js @@ -0,0 +1,27 @@ +import requireFromFile from "../utils/require-from-file.js"; +import importFromFile from "../utils/import-from-file.js"; + +async function loadExternalConfig(config, filepath) { + /* + Try `require()` first, this is how it works in Prettier v2. + Kept this because the external config path or package may can't load with `import()`: + 1. is JSON file or package + 2. is CommonJS file without extension + 3. is a dirname with index.js inside + */ + try { + return requireFromFile(config, filepath); + } catch (error) { + if ( + error?.code !== "MODULE_NOT_FOUND" && + error?.code !== "ERR_REQUIRE_ESM" + ) { + throw error; + } + } + + const module = await importFromFile(config, filepath); + return module.default; +} + +export default loadExternalConfig; diff --git a/src/utils/import-from-file.js b/src/utils/import-from-file.js new file mode 100644 index 000000000..246b461a7 --- /dev/null +++ b/src/utils/import-from-file.js @@ -0,0 +1,9 @@ +import { pathToFileURL } from "node:url"; +import { resolve } from "import-meta-resolve"; + +async function importFromFile(specifier, parent) { + const url = await resolve(specifier, pathToFileURL(parent).href); + return import(url); +} + +export default importFromFile; diff --git a/src/utils/require-from-file.js b/src/utils/require-from-file.js new file mode 100644 index 000000000..b9c78a487 --- /dev/null +++ b/src/utils/require-from-file.js @@ -0,0 +1,8 @@ +import { createRequire } from "node:module"; + +function requireFromFile(id, parent) { + const require = createRequire(parent); + return require(id); +} + +export default requireFromFile; diff --git a/tests/integration/__tests__/__snapshots__/config-resolution.js.snap b/tests/integration/__tests__/__snapshots__/config-resolution.js.snap index 625006c65..1eb93c5a8 100644 --- a/tests/integration/__tests__/__snapshots__/config-resolution.js.snap +++ b/tests/integration/__tests__/__snapshots__/config-resolution.js.snap @@ -27,14 +27,20 @@ exports[`resolves configuration file with --find-config-path file (stdout) 1`] = exports[`resolves configuration file with --find-config-path file (write) 1`] = `[]`; -exports[`resolves external configuration from package.json (stderr) 1`] = `""`; - -exports[`resolves external configuration from package.json (stdout) 1`] = ` +exports[`resolves external configuration from package.json (cjs package) (stdout) 1`] = ` "console.log("should have no semi") " `; -exports[`resolves external configuration from package.json (write) 1`] = `[]`; +exports[`resolves external configuration from package.json (esm file) (stdout) 1`] = ` +"console.log("should have no semi") +" +`; + +exports[`resolves external configuration from package.json (esm package) (stdout) 1`] = ` +"console.log("should have no semi") +" +`; exports[`resolves json configuration file with --find-config-path file (stderr) 1`] = `""`; diff --git a/tests/integration/__tests__/config-invalid.js b/tests/integration/__tests__/config-invalid.js index f88e82a5e..63497cdc0 100644 --- a/tests/integration/__tests__/config-invalid.js +++ b/tests/integration/__tests__/config-invalid.js @@ -15,9 +15,7 @@ describe("throw error for unsupported extension", () => { describe("throw error with invalid config format", () => { runPrettier("cli/config/invalid", ["--config", "file/.prettierrc"]).test({ status: "non-zero", - stderr: expect.stringMatching( - /Cannot (?:resolve|find) module '--invalid--'/ - ), + stderr: expect.stringMatching(/Cannot find package '--invalid--'/), }); }); diff --git a/tests/integration/__tests__/config-resolution.js b/tests/integration/__tests__/config-resolution.js index e39cb0641..fa11c4553 100644 --- a/tests/integration/__tests__/config-resolution.js +++ b/tests/integration/__tests__/config-resolution.js @@ -27,9 +27,27 @@ describe("accepts configuration from --config", () => { }); }); -describe("resolves external configuration from package.json", () => { - runPrettier("cli/config/", ["external-config/index.js"]).test({ +describe("resolves external configuration from package.json (cjs package)", () => { + runPrettier("cli/config/external-config/cjs-package", ["index.js"]).test({ status: 0, + stderr: "", + write: [], + }); +}); + +describe("resolves external configuration from package.json (esm package)", () => { + runPrettier("cli/config/external-config/esm-package", ["index.js"]).test({ + status: 0, + stderr: "", + write: [], + }); +}); + +describe("resolves external configuration from package.json (esm file)", () => { + runPrettier("cli/config/external-config/esm-package", ["index.js"]).test({ + status: 0, + stderr: "", + write: [], }); }); @@ -232,13 +250,63 @@ test("API resolveConfig resolves relative path values based on config filepath", }); test("API resolveConfig de-references to an external module", async () => { - const currentDir = path.join(__dirname, "../cli/config/external-config"); + const config = { printWidth: 77, semi: false }; await expect( - prettier.resolveConfig(`${currentDir}/index.js`) - ).resolves.toEqual({ - printWidth: 77, - semi: false, - }); + prettier.resolveConfig( + path.join(__dirname, "../cli/config/external-config/cjs-package/index.js") + ) + ).resolves.toEqual(config); + await expect( + prettier.resolveConfig( + path.join(__dirname, "../cli/config/external-config/esm-package/index.js") + ) + ).resolves.toEqual(config); + await expect( + prettier.resolveConfig( + path.join(__dirname, "../cli/config/external-config/esm-file/index.js") + ) + ).resolves.toEqual(config); +}); + +test(".js config file", async () => { + const parentDirectory = path.join(__dirname, "../cli/config/rc-js"); + + const config = { + trailingComma: "all", + singleQuote: true, + }; + + for (const directoryName of [ + "cjs-prettier-config-js-in-type-commonjs", + "cjs-prettier-config-js-in-type-none", + "cjs-prettierrc-js-in-type-commonjs", + "cjs-prettierrc-js-in-type-none", + "mjs-prettier-config-js-in-type-module", + "mjs-prettierrc-js-in-type-module", + ]) { + const file = path.join(parentDirectory, directoryName, "foo.js"); + await expect(prettier.resolveConfig(file)).resolves.toMatchObject(config); + } + + const cjsError = /module is not defined in ES module scope/; + for (const directoryName of [ + "cjs-prettier-config-js-in-type-module", + "cjs-prettierrc-js-in-type-module", + ]) { + const file = path.join(parentDirectory, directoryName, "foo.js"); + await expect(prettier.resolveConfig(file)).rejects.toThrow(cjsError); + } + + const mjsError = /Unexpected token 'export'/; + for (const directoryName of [ + "mjs-prettier-config-js-in-type-commonjs", + "mjs-prettier-config-js-in-type-none", + "mjs-prettierrc-js-in-type-commonjs", + "mjs-prettierrc-js-in-type-none", + ]) { + const file = path.join(parentDirectory, directoryName, "foo.js"); + await expect(prettier.resolveConfig(file)).rejects.toThrow(mjsError); + } }); test(".cjs config file", async () => { @@ -258,7 +326,27 @@ test(".cjs config file", async () => { "prettier-config-cjs-in-type-module", ]) { const file = path.join(parentDirectory, directoryName, "foo.js"); + await expect(prettier.resolveConfig(file)).resolves.toMatchObject(config); + } +}); +test(".mjs config file", async () => { + const parentDirectory = path.join(__dirname, "../cli/config/rc-mjs"); + + const config = { + trailingComma: "all", + singleQuote: true, + }; + + for (const directoryName of [ + "prettierrc-mjs-in-type-module", + "prettierrc-mjs-in-type-commonjs", + "prettierrc-mjs-in-type-none", + "prettier-config-mjs-in-type-commonjs", + "prettier-config-mjs-in-type-none", + "prettier-config-mjs-in-type-module", + ]) { + const file = path.join(parentDirectory, directoryName, "foo.js"); await expect(prettier.resolveConfig(file)).resolves.toMatchObject(config); } }); @@ -271,7 +359,6 @@ test(".json5 config file", async () => { tabWidth: 3, }; const file = path.join(parentDirectory, "json5/foo.js"); - await expect(prettier.resolveConfig(file)).resolves.toMatchObject(config); }); @@ -279,6 +366,5 @@ test(".json5 config file(invalid)", async () => { const parentDirectory = path.join(__dirname, "../cli/config/rc-json5"); const file = path.join(parentDirectory, "invalid/foo.js"); const error = /JSON5: invalid end of input at 2:1/; - await expect(prettier.resolveConfig(file)).rejects.toThrow(error); }); diff --git a/tests/integration/__tests__/plugin-options-string.js b/tests/integration/__tests__/plugin-options-string.js index 7de030322..36199c6b6 100644 --- a/tests/integration/__tests__/plugin-options-string.js +++ b/tests/integration/__tests__/plugin-options-string.js @@ -58,9 +58,7 @@ describe("Non exists plugin", () => { { input: "hello-world" } ).test({ stdout: "", - stderr: expect.stringMatching( - /Cannot (?:resolve|find) module '--invalid--'/ - ), + stderr: expect.stringMatching(/Cannot find module '--invalid--'/), status: 1, write: [], }); diff --git a/tests/integration/cli/config/external-config/index.js b/tests/integration/cli/config/external-config/cjs-package/index.js similarity index 100% rename from tests/integration/cli/config/external-config/index.js rename to tests/integration/cli/config/external-config/cjs-package/index.js diff --git a/tests/integration/cli/config/external-config/node_modules/@company/prettier-config/index.json b/tests/integration/cli/config/external-config/cjs-package/node_modules/@company/prettier-config/index.json similarity index 100% rename from tests/integration/cli/config/external-config/node_modules/@company/prettier-config/index.json rename to tests/integration/cli/config/external-config/cjs-package/node_modules/@company/prettier-config/index.json diff --git a/tests/integration/cli/config/external-config/node_modules/@company/prettier-config/package.json b/tests/integration/cli/config/external-config/cjs-package/node_modules/@company/prettier-config/package.json similarity index 100% rename from tests/integration/cli/config/external-config/node_modules/@company/prettier-config/package.json rename to tests/integration/cli/config/external-config/cjs-package/node_modules/@company/prettier-config/package.json diff --git a/tests/integration/cli/config/external-config/package.json b/tests/integration/cli/config/external-config/cjs-package/package.json similarity index 100% rename from tests/integration/cli/config/external-config/package.json rename to tests/integration/cli/config/external-config/cjs-package/package.json diff --git a/tests/integration/cli/config/external-config/esm-file/index.js b/tests/integration/cli/config/external-config/esm-file/index.js new file mode 100644 index 000000000..b4639445c --- /dev/null +++ b/tests/integration/cli/config/external-config/esm-file/index.js @@ -0,0 +1 @@ +console.log("should have no semi"); diff --git a/tests/integration/cli/config/external-config/esm-file/my-prettier-config-file.js b/tests/integration/cli/config/external-config/esm-file/my-prettier-config-file.js new file mode 100644 index 000000000..c8fc71441 --- /dev/null +++ b/tests/integration/cli/config/external-config/esm-file/my-prettier-config-file.js @@ -0,0 +1,4 @@ +export default { + printWidth: 77, + semi: false, +}; diff --git a/tests/integration/cli/config/external-config/esm-file/package.json b/tests/integration/cli/config/external-config/esm-file/package.json new file mode 100644 index 000000000..93334b676 --- /dev/null +++ b/tests/integration/cli/config/external-config/esm-file/package.json @@ -0,0 +1,5 @@ +{ + "prettier": "./my-prettier-config-file.js", + "private": true, + "type": "module" +} diff --git a/tests/integration/cli/config/external-config/esm-package/index.js b/tests/integration/cli/config/external-config/esm-package/index.js new file mode 100644 index 000000000..b4639445c --- /dev/null +++ b/tests/integration/cli/config/external-config/esm-package/index.js @@ -0,0 +1 @@ +console.log("should have no semi"); diff --git a/tests/integration/cli/config/external-config/esm-package/node_modules/@company/prettier-config/index.js b/tests/integration/cli/config/external-config/esm-package/node_modules/@company/prettier-config/index.js new file mode 100644 index 000000000..09f9623fc --- /dev/null +++ b/tests/integration/cli/config/external-config/esm-package/node_modules/@company/prettier-config/index.js @@ -0,0 +1,4 @@ +export default { + "printWidth": 77, + "semi": false +} diff --git a/tests/integration/cli/config/external-config/esm-package/node_modules/@company/prettier-config/package.json b/tests/integration/cli/config/external-config/esm-package/node_modules/@company/prettier-config/package.json new file mode 100644 index 000000000..fb040ee6e --- /dev/null +++ b/tests/integration/cli/config/external-config/esm-package/node_modules/@company/prettier-config/package.json @@ -0,0 +1,7 @@ +{ + "name": "@company/prettier-config", + "private": true, + "version": "0.0.0", + "type": "module", + "exports": "./index.js" +} diff --git a/tests/integration/cli/config/external-config/esm-package/package.json b/tests/integration/cli/config/external-config/esm-package/package.json new file mode 100644 index 000000000..58ab00285 --- /dev/null +++ b/tests/integration/cli/config/external-config/esm-package/package.json @@ -0,0 +1,3 @@ +{ + "prettier": "@company/prettier-config" +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-commonjs/package.json b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-commonjs/package.json new file mode 100644 index 000000000..f2ce3c95d --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-commonjs/package.json @@ -0,0 +1,5 @@ +{ + "name": "cjs-prettier-config-js-in-type-commonjs", + "private": true, + "type": "commonjs" +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-commonjs/prettier.config.js b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-commonjs/prettier.config.js new file mode 100644 index 000000000..dcea73b27 --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-commonjs/prettier.config.js @@ -0,0 +1,6 @@ +"use strict"; + +module.exports = { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-module/package.json b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-module/package.json new file mode 100644 index 000000000..47908701a --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-module/package.json @@ -0,0 +1,5 @@ +{ + "name": "cjs-prettier-config-js-in-type-module", + "private": true, + "type": "module" +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-module/prettier.config.js b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-module/prettier.config.js new file mode 100644 index 000000000..0310f4895 --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-module/prettier.config.js @@ -0,0 +1,4 @@ +module.exports = { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-none/package.json b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-none/package.json new file mode 100644 index 000000000..ab34267d3 --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-none/package.json @@ -0,0 +1,4 @@ +{ + "name": "cjs-prettier-config-js-in-type-none", + "private": true +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-none/prettier.config.js b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-none/prettier.config.js new file mode 100644 index 000000000..dcea73b27 --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettier-config-js-in-type-none/prettier.config.js @@ -0,0 +1,6 @@ +"use strict"; + +module.exports = { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-commonjs/.prettierrc.js b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-commonjs/.prettierrc.js new file mode 100644 index 000000000..dcea73b27 --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-commonjs/.prettierrc.js @@ -0,0 +1,6 @@ +"use strict"; + +module.exports = { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-commonjs/package.json b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-commonjs/package.json new file mode 100644 index 000000000..622710c7b --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-commonjs/package.json @@ -0,0 +1,5 @@ +{ + "name": "cjs-prettierrc-js-in-type-commonjs", + "private": true, + "type": "commonjs" +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-module/.prettierrc.js b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-module/.prettierrc.js new file mode 100644 index 000000000..dcea73b27 --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-module/.prettierrc.js @@ -0,0 +1,6 @@ +"use strict"; + +module.exports = { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-module/package.json b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-module/package.json new file mode 100644 index 000000000..ad68a5cba --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-module/package.json @@ -0,0 +1,5 @@ +{ + "name": "cjs-prettierrc-js-in-type-module", + "private": true, + "type": "module" +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-none/.prettierrc.js b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-none/.prettierrc.js new file mode 100644 index 000000000..dcea73b27 --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-none/.prettierrc.js @@ -0,0 +1,6 @@ +"use strict"; + +module.exports = { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-none/package.json b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-none/package.json new file mode 100644 index 000000000..1e73e4349 --- /dev/null +++ b/tests/integration/cli/config/rc-js/cjs-prettierrc-js-in-type-none/package.json @@ -0,0 +1,4 @@ +{ + "name": "prettierrc-js-in-type-none", + "private": true +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-commonjs/package.json b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-commonjs/package.json new file mode 100644 index 000000000..177552693 --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-commonjs/package.json @@ -0,0 +1,5 @@ +{ + "name": "mjs-prettier-config-js-in-type-commonjs", + "private": true, + "type": "commonjs" +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-commonjs/prettier.config.js b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-commonjs/prettier.config.js new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-commonjs/prettier.config.js @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-module/package.json b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-module/package.json new file mode 100644 index 000000000..bc7900e3a --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-module/package.json @@ -0,0 +1,5 @@ +{ + "name": "mjs-prettier-config-js-in-type-module", + "private": true, + "type": "module" +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-module/prettier.config.js b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-module/prettier.config.js new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-module/prettier.config.js @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-none/package.json b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-none/package.json new file mode 100644 index 000000000..8787c2ede --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-none/package.json @@ -0,0 +1,4 @@ +{ + "name": "mjs-prettier-config-js-in-type-none", + "private": true +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-none/prettier.config.js b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-none/prettier.config.js new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettier-config-js-in-type-none/prettier.config.js @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-commonjs/.prettierrc.js b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-commonjs/.prettierrc.js new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-commonjs/.prettierrc.js @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-commonjs/package.json b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-commonjs/package.json new file mode 100644 index 000000000..a3faf105c --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-commonjs/package.json @@ -0,0 +1,5 @@ +{ + "name": "mjs-prettierrc-js-in-type-commonjs", + "private": true, + "type": "commonjs" +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-module/.prettierrc.js b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-module/.prettierrc.js new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-module/.prettierrc.js @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-module/package.json b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-module/package.json new file mode 100644 index 000000000..e8a749525 --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-module/package.json @@ -0,0 +1,5 @@ +{ + "name": "mjs-prettierrc-js-in-type-module", + "private": true, + "type": "module" +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-none/.prettierrc.js b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-none/.prettierrc.js new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-none/.prettierrc.js @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-none/package.json b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-none/package.json new file mode 100644 index 000000000..0583e76e4 --- /dev/null +++ b/tests/integration/cli/config/rc-js/mjs-prettierrc-js-in-type-none/package.json @@ -0,0 +1,4 @@ +{ + "name": "mjs-prettierrc-js-in-type-none", + "private": true +} diff --git a/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-commonjs/package.json b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-commonjs/package.json new file mode 100644 index 000000000..194da1d28 --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-commonjs/package.json @@ -0,0 +1,5 @@ +{ + "name": "prettier-config-mjs-in-type-commonjs", + "private": true, + "type": "commonjs" +} diff --git a/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-commonjs/prettier.config.mjs b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-commonjs/prettier.config.mjs new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-commonjs/prettier.config.mjs @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-module/package.json b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-module/package.json new file mode 100644 index 000000000..94f8379c9 --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-module/package.json @@ -0,0 +1,5 @@ +{ + "name": "prettier-config-mjs-in-type-module", + "private": true, + "type": "module" +} diff --git a/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-module/prettier.config.mjs b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-module/prettier.config.mjs new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-module/prettier.config.mjs @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-none/package.json b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-none/package.json new file mode 100644 index 000000000..86189ffcf --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-none/package.json @@ -0,0 +1,4 @@ +{ + "name": "prettier-config-mjs-in-type-none", + "private": true +} diff --git a/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-none/prettier.config.mjs b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-none/prettier.config.mjs new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettier-config-mjs-in-type-none/prettier.config.mjs @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-commonjs/.prettierrc.mjs b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-commonjs/.prettierrc.mjs new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-commonjs/.prettierrc.mjs @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-commonjs/package.json b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-commonjs/package.json new file mode 100644 index 000000000..b3e79661d --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-commonjs/package.json @@ -0,0 +1,5 @@ +{ + "name": "prettierrc-mjs-in-type-commonjs", + "private": true, + "type": "commonjs" +} diff --git a/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-module/.prettierrc.mjs b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-module/.prettierrc.mjs new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-module/.prettierrc.mjs @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-module/package.json b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-module/package.json new file mode 100644 index 000000000..f0fe03436 --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-module/package.json @@ -0,0 +1,5 @@ +{ + "name": "prettierrc-mjs-in-type-module", + "private": true, + "type": "module" +} diff --git a/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-none/.prettierrc.mjs b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-none/.prettierrc.mjs new file mode 100644 index 000000000..867b88006 --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-none/.prettierrc.mjs @@ -0,0 +1,4 @@ +export default { + "trailingComma": "all", + "singleQuote": true +} diff --git a/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-none/package.json b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-none/package.json new file mode 100644 index 000000000..b494509c0 --- /dev/null +++ b/tests/integration/cli/config/rc-mjs/prettierrc-mjs-in-type-none/package.json @@ -0,0 +1,4 @@ +{ + "name": "prettierrc-mjs-in-type-none", + "private": true +} diff --git a/yarn.lock b/yarn.lock index 965ead0ee..3f7fb1587 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2105,6 +2105,15 @@ __metadata: languageName: node linkType: hard +"builtins@npm:^5.0.0": + version: 5.0.1 + resolution: "builtins@npm:5.0.1" + dependencies: + semver: ^7.0.0 + checksum: 66d204657fe36522822a95b288943ad11b58f5eaede235b11d8c4edaa28ce4800087d44a2681524c340494aadb120a0068011acabe99d30e8f11a7d826d83515 + languageName: node + linkType: hard + "c8@npm:7.12.0": version: 7.12.0 resolution: "c8@npm:7.12.0" @@ -4384,6 +4393,15 @@ __metadata: languageName: node linkType: hard +"import-meta-resolve@npm:2.0.3": + version: 2.0.3 + resolution: "import-meta-resolve@npm:2.0.3" + dependencies: + builtins: ^5.0.0 + checksum: 3a0cc2f50b04e766712a7c60f1136c89c2d0cdd49bbbf8b810a6f1b0985cd3e897988d99bf6ce46103589806e6ba3e0d12b68f1e6bb51032beef3a2c2defd52e + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -6812,6 +6830,7 @@ __metadata: html-tag-names: 2.0.1 html-void-elements: 2.0.1 ignore: 5.2.0 + import-meta-resolve: 2.0.3 jest: 28.1.0 jest-docblock: 28.1.1 jest-light-runner: "fisker/jest-light-runner#b5e893d3a7d301bfb5d68ed81eebadbe2bb0577d"