diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 9203dd5c8..b0516b285 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -45,6 +45,13 @@ jobs:
- name: Lint workflow files
run: yarn lint:actionlint
+ - name: Lint docs code block
+ # TODO: Lint files in `website/versioned_docs/version-stable` too
+ run: yarn "docs/**/*.md"
+ env:
+ # Make Prettier throws on embeded format
+ PRETTIER_DEBUG: true
+
- name: Validate renovate config
run: npx --package renovate -c renovate-config-validator
diff --git a/docs/api.md b/docs/api.md
index 31560c64f..2e1c71b40 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -6,7 +6,7 @@ title: API
If you want to run Prettier programmatically, check this page out.
```js
-const prettier = require("prettier");
+import * as prettier from "prettier";
```
## `prettier.format(source, options)`
@@ -15,7 +15,7 @@ const prettier = require("prettier");
```js
await prettier.format("foo ( );", { semi: false, parser: "babel" });
-// -> "foo()"
+// -> 'foo()\n'
```
## `prettier.check(source [, options])`
@@ -81,10 +81,10 @@ When Prettier loads configuration files and plugins, the file system structure i
`getFileInfo` can be used by editor extensions to decide if a particular file needs to be formatted. This method returns a promise, which resolves to an object with the following properties:
-```typescript
+```ts
{
- ignored: boolean,
- inferredParser: string | null,
+ ignored: boolean;
+ inferredParser: string | null;
}
```
@@ -104,7 +104,7 @@ Returns a promise which resolves to an object representing the options, parsers,
The support information looks like this:
-```typescript
+```ts
{
languages: Array<{
name: string;
diff --git a/docs/browser.md b/docs/browser.md
index e6aebbbfd..da0f075a5 100644
--- a/docs/browser.md
+++ b/docs/browser.md
@@ -35,10 +35,12 @@ See below for examples.
```
@@ -51,7 +53,7 @@ Note that the [`unpkg` field](https://unpkg.com/#examples) in Prettier’s `pack
import * as prettier from "https://unpkg.com/prettier@2.7.1/esm/standalone.mjs";
import parserGraphql from "https://unpkg.com/prettier@2.7.1/esm/parser-graphql.mjs";
- prettier.format("type Query { hello: String }", {
+ const formatted = await prettier.format("type Query { hello: String }", {
parser: "graphql",
plugins: [parserGraphql],
});
@@ -64,8 +66,8 @@ Note that the [`unpkg` field](https://unpkg.com/#examples) in Prettier’s `pack
define([
"https://unpkg.com/prettier@2.7.1/standalone.js",
"https://unpkg.com/prettier@2.7.1/parser-graphql.js",
-], (prettier, ...plugins) => {
- prettier.format("type Query { hello: String }", {
+], async (prettier, ...plugins) => {
+ const formatted = await prettier.format("type Query { hello: String }", {
parser: "graphql",
plugins,
});
@@ -77,10 +79,12 @@ define([
```js
const prettier = require("prettier/standalone");
const plugins = [require("prettier/parser-graphql")];
-prettier.format("type Query { hello: String }", {
- parser: "graphql",
- plugins,
-});
+(async () => {
+ const formatted = await prettier.format("type Query { hello: String }", {
+ parser: "graphql",
+ plugins,
+ });
+})();
```
This syntax doesn’t necessarily work in the browser, but it can be used when bundling the code with browserify, Rollup, webpack, or another bundler.
@@ -90,10 +94,12 @@ This syntax doesn’t necessarily work in the browser, but it can be used when b
```js
importScripts("https://unpkg.com/prettier@2.7.1/standalone.js");
importScripts("https://unpkg.com/prettier@2.7.1/parser-graphql.js");
-prettier.format("type Query { hello: String }", {
- parser: "graphql",
- plugins: prettierPlugins,
-});
+(async () => {
+ const formatted = await prettier.format("type Query { hello: String }", {
+ parser: "graphql",
+ plugins: prettierPlugins,
+ });
+})();
```
## Parser plugins for embedded code
@@ -106,7 +112,7 @@ If you want to format [embedded code](options.md#embedded-language-formatting),
import parserBabel from "https://unpkg.com/prettier@2.7.1/esm/parser-babel.mjs";
console.log(
- prettier.format("const html=/* HTML */ `
`", {
+ await prettier.format("const html=/* HTML */ `
`", {
parser: "babel",
plugins: [parserBabel],
})
@@ -124,7 +130,7 @@ The HTML code embedded in JavaScript stays unformatted because the `html` parser
import parserHtml from "https://unpkg.com/prettier@2.7.1/esm/parser-html.mjs";
console.log(
- prettier.format("const html=/* HTML */ `
`", {
+ await prettier.format("const html=/* HTML */ `
`", {
parser: "babel",
plugins: [parserBabel, parserHtml],
})
diff --git a/docs/cli.md b/docs/cli.md
index 62bcf0a85..ca74d7827 100644
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -16,7 +16,7 @@ To format a file in-place, use `--write`. (Note: This overwrites your files!)
In practice, this may look something like:
```bash
-prettier --write .
+prettier . --write
```
This command formats all files supported by Prettier in the current directory and its subdirectories.
@@ -26,7 +26,7 @@ It’s recommended to always make sure that `prettier --write .` only formats wh
A more complicated example:
```bash
-prettier --single-quote --trailing-comma all --write docs package.json "{app,__{tests,mocks}__}/**/*.js"
+prettier docs package.json "{app,__{tests,mocks}__}/**/*.js" --write --single-quote --trailing-comma all
```
> Don’t forget the **quotes** around the globs! The quotes make sure that Prettier CLI expands the globs rather than your shell, which is important for cross-platform usage.
@@ -53,7 +53,7 @@ When you want to check if your files are formatted, you can run Prettier with th
This will output a human-friendly message and a list of unformatted files, if any.
```bash
-prettier --check "src/**/*.js"
+prettier . --check
```
Console output if all files are formatted:
@@ -95,15 +95,15 @@ If you're worried that Prettier will change the correctness of your code, add `-
If you are repeatedly formatting individual files with `prettier`, you will incur a small performance cost when Prettier attempts to look up a [configuration file](configuration.md). In order to skip this, you may ask Prettier to find the config file once, and re-use it later on.
-```bash
-prettier --find-config-path ./my/file.js
-./my/.prettierrc
+```console
+$ prettier --find-config-path path/to/file.js
+path/to/.prettierrc
```
This will provide you with a path to the configuration file, which you can pass to `--config`:
```bash
-prettier --config ./my/.prettierrc --write ./my/file.js
+prettier path/to/file.js --write --config path/to/.prettierrc
```
You can also use `--config` if your configuration file lives somewhere where Prettier cannot find it, such as a `config/` directory.
@@ -119,7 +119,7 @@ Path to a file containing patterns that describe files to ignore. By default, Pr
Another useful flag is `--list-different` (or `-l`) which prints the filenames of files that are different from Prettier formatting. If there are differences the script errors out, which is useful in a CI scenario.
```bash
-prettier --single-quote --list-different "src/**/*.js"
+prettier . --single-quote --list-different
```
You can also use [`--check`](cli.md#--check) flag, which works the same way as `--list-different`, but also prints a human-friendly summary message to stdout.
@@ -193,8 +193,8 @@ $ cat abc.css | prettier --stdin-filepath abc.css
With `--ignore-unknown` (or `-u`), prettier will ignore unknown files matched by patterns.
-```console
-$ prettier "**/*" --write --ignore-unknown
+```bash
+prettier "**/*" --write --ignore-unknown
```
## `--no-error-on-unmatched-pattern`
@@ -216,7 +216,7 @@ If this option is enabled, the following values are used as cache keys and the f
- (if `--cache-strategy` is `content`) content of the file
```bash
-prettier --write --cache src
+prettier . --write --cache
```
Running Prettier without `--cache` will delete the cache.
@@ -232,7 +232,7 @@ Path to the cache file location used by `--cache` flag. If you don't explicit `-
If a file path is passed, that file is used as the cache file.
```bash
-prettier --write --cache --cache-location=my_cache_file src
+prettier . --write --cache --cache-location=path/to/cache-file
```
## `--cache-strategy`
@@ -244,5 +244,5 @@ In general, `metadata` is faster. However, `content` is useful for updating the
If no strategy is specified, `content` will be used.
```bash
-prettier --write --cache --cache-strategy metadata src
+prettier . --write --cache --cache-strategy metadata
```
diff --git a/docs/ignore.md b/docs/ignore.md
index 2b5b7504f..0b6bfd2a6 100644
--- a/docs/ignore.md
+++ b/docs/ignore.md
@@ -13,13 +13,13 @@ To exclude files from formatting, create a `.prettierignore` file in the root of
Example:
-```
+```text
# Ignore artifacts:
build
coverage
# Ignore all HTML files:
-*.html
+**/*.html
```
It’s recommended to have a `.prettierignore` in your project! This way you can run `prettier --write .` to make sure that everything is formatted (without mangling files you don’t want, or choking on generated files). And – your editor will know which files _not_ to format!
@@ -28,7 +28,7 @@ By default prettier ignores files in version control systems directories (".git"
So by default it will be
-```js
+```text
**/.git
**/.svn
**/.hg
@@ -37,7 +37,7 @@ So by default it will be
and
-```js
+```text
**/.git
**/.svn
**/.hg
@@ -186,7 +186,7 @@ hello: world
For one-off commands, when you want to exclude some files without adding them to `.prettierignore`, negative patterns can come in handy:
```bash
-prettier --write . '!**/*.{js,jsx,vue}'
+prettier . "!**/*.{js,jsx,vue}" --write
```
See [fast-glob](https://prettier.io/docs/en/cli.html#file-patterns) to learn more about advanced glob syntax.
diff --git a/docs/install.md b/docs/install.md
index d6563217d..acaa21a23 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -30,7 +30,7 @@ echo {}> .prettierrc.json
Next, create a [.prettierignore](ignore.md) file to let the Prettier CLI and editors know which files to _not_ format. Here’s an example:
-```
+```text
# Ignore artifacts:
build
coverage
@@ -46,7 +46,7 @@ Now, format all files with Prettier:
```bash
-npx prettier --write .
+npx prettier . --write
```
> What is that `npx` thing? `npx` ships with `npm` and lets you run locally installed tools. We’ll leave off the `npx` part for brevity throughout the rest of this file!
@@ -56,7 +56,7 @@ npx prettier --write .
```bash
-yarn prettier --write .
+yarn prettier . --write
```
> What is `yarn` doing at the start? `yarn prettier` runs the locally installed version of Prettier. We’ll leave off the `yarn` part for brevity throughout the rest of this file!
@@ -68,7 +68,7 @@ yarn prettier --write .
If you have a CI setup, run the following as part of it to make sure that everyone runs Prettier. This avoids merge conflicts and other collaboration issues!
```bash
-npx prettier --check .
+npx prettier . --check
```
`--check` is like `--write`, but only checks that files are already formatted, rather than overwriting them. `prettier --write` and `prettier --check` are the most common ways to run Prettier.
diff --git a/docs/plugins.md b/docs/plugins.md
index b2e19e22d..c3057943f 100644
--- a/docs/plugins.md
+++ b/docs/plugins.md
@@ -486,54 +486,124 @@ The `--debug-print-comments` CLI flag can help with debugging comment attachment
Example:
```js
-options: {
- openingBraceNewLine: {
- type: "boolean",
- category: "Global",
- default: true,
- description: "Move open brace for code blocks onto new line."
- }
-}
+export default {
+ // ... plugin implementation
+ options: {
+ openingBraceNewLine: {
+ type: "boolean",
+ category: "Global",
+ default: true,
+ description: "Move open brace for code blocks onto new line.",
+ },
+ },
+};
```
### `defaultOptions`
If your plugin requires different default values for some of Prettier’s core options, you can specify them in `defaultOptions`:
-```
-defaultOptions: {
- tabWidth: 4
-}
+```js
+export default {
+ // ... plugin implementation
+ defaultOptions: {
+ tabWidth: 4,
+ },
+};
```
### Utility functions
A `util` module from Prettier core is considered a private API and is not meant to be consumed by plugins. Instead, the `util-shared` module provides the following limited set of utility functions for plugins:
-
```ts
type Quote = '"' | "'";
type SkipOptions = { backwards?: boolean };
+
function getMaxContinuousCount(str: string, target: string): number;
+
function getStringWidth(text: string): number;
-function getAlignmentSize(value: string, tabWidth: number, startIndex?: number): number;
+
+function getAlignmentSize(
+ value: string,
+ tabWidth: number,
+ startIndex?: number
+): number;
+
function getIndentSize(value: string, tabWidth: number): number;
-function skip(chars: string | RegExp): (text: string, index: number | false, opts?: SkipOptions) => number | false;
-function skipWhitespace(text: string, index: number | false, opts?: SkipOptions): number | false;
-function skipSpaces(text: string, index: number | false, opts?: SkipOptions): number | false;
-function skipToLineEnd(text: string, index: number | false, opts?: SkipOptions): number | false;
-function skipEverythingButNewLine(text: string, index: number | false, opts?: SkipOptions): number | false;
+
+function skip(
+ chars: string | RegExp
+): (text: string, index: number | false, opts?: SkipOptions) => number | false;
+
+function skipWhitespace(
+ text: string,
+ index: number | false,
+ opts?: SkipOptions
+): number | false;
+
+function skipSpaces(
+ text: string,
+ index: number | false,
+ opts?: SkipOptions
+): number | false;
+
+function skipToLineEnd(
+ text: string,
+ index: number | false,
+ opts?: SkipOptions
+): number | false;
+
+function skipEverythingButNewLine(
+ text: string,
+ index: number | false,
+ opts?: SkipOptions
+): number | false;
+
function skipInlineComment(text: string, index: number | false): number | false;
-function skipTrailingComment(text: string, index: number | false): number | false;
-function skipNewline(text: string, index: number | false, opts?: SkipOptions): number | false;
+
+function skipTrailingComment(
+ text: string,
+ index: number | false
+): number | false;
+
+function skipNewline(
+ text: string,
+ index: number | false,
+ opts?: SkipOptions
+): number | false;
+
function hasNewline(text: string, index: number, opts?: SkipOptions): boolean;
+
function hasNewlineInRange(text: string, start: number, end: number): boolean;
+
function hasSpaces(text: string, index: number, opts?: SkipOptions): boolean;
-function makeString(rawContent: string, enclosingQuote: Quote, unescapeUnnecessaryEscapes?: boolean): string;
-function getNextNonSpaceNonCommentCharacterIndex(text: string, node: N, locEnd: (node: N) => number): number | false;
+
+function makeString(
+ rawContent: string,
+ enclosingQuote: Quote,
+ unescapeUnnecessaryEscapes?: boolean
+): string;
+
+function getNextNonSpaceNonCommentCharacterIndex(
+ text: string,
+ node: N,
+ locEnd: (node: N) => number
+): number | false;
+
function isNextLineEmptyAfterIndex(text: string, index: number): boolean;
-function isNextLineEmpty(text: string, node: N, locEnd: (node: N) => number): boolean;
-function isPreviousLineEmpty(text: string, node: N, locStart: (node: N) => number): boolean;
+
+function isNextLineEmpty(
+ text: string,
+ node: N,
+ locEnd: (node: N) => number
+): boolean;
+
+function isPreviousLineEmpty(
+ text: string,
+ node: N,
+ locStart: (node: N) => number
+): boolean;
```
### Tutorials