diff --git a/package.json b/package.json index faf0d36824e00..cd8d0fc23af7b 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "shellcheck": "./scripts/shellCheck.sh", "spell": "cspell --color **/*", "spell-changed": "cspell --color --no-must-find-files", - "prettier": "prettier --experimental-cli --write .", + "prettier": "./scripts/runPrettier.sh", "prettier-changed": "prettier --experimental-cli --write --ignore-unknown $(git diff --diff-filter=AMR --name-only origin/main HEAD)", "prettier-watch": "onchange \"**/*.{js,mjs,ts,tsx}\" -- prettier --experimental-cli --write --ignore-unknown {{changed}}", "print-version": "echo $npm_package_version", diff --git a/scripts/runPrettier.sh b/scripts/runPrettier.sh new file mode 100755 index 0000000000000..5df1552115da9 --- /dev/null +++ b/scripts/runPrettier.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# +# Prettier can intermittently fail due to a stale cache. This wrapper runs +# prettier once, and if it fails, clears the cache and retries. + +set -eu + +TOP="$(realpath "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)/..")" +readonly TOP +source "${TOP}/scripts/shellUtils.sh" + +declare -r PRETTIER_CACHE_DIR="${TOP}/node_modules/.cache/prettier" + +function run_prettier() { + npx prettier --experimental-cli --write . "$@" +} + +function clear_cache() { + if [[ -d "${PRETTIER_CACHE_DIR}" ]]; then + info "Clearing prettier cache at ${PRETTIER_CACHE_DIR}" + rm -rf "${PRETTIER_CACHE_DIR}" + fi +} + +function main() { + if run_prettier "$@"; then + success "Prettier finished successfully" + return + fi + + error "Prettier failed — clearing cache and retrying" + clear_cache + + if run_prettier "$@"; then + success "Prettier finished successfully after clearing cache" + else + error "Prettier failed again after clearing cache" + exit 1 + fi +} + +main "$@"