From 564bc25df89aa1dd6ea47cc3b5bd2eebaf480c71 Mon Sep 17 00:00:00 2001 From: Teodorus Nathaniel Date: Thu, 2 Jul 2026 16:22:30 +0700 Subject: [PATCH 1/5] chore: use local prettier version --- .github/actions/base/prettier/action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/actions/base/prettier/action.yml b/.github/actions/base/prettier/action.yml index 847c4c9..e5af6b6 100644 --- a/.github/actions/base/prettier/action.yml +++ b/.github/actions/base/prettier/action.yml @@ -49,11 +49,11 @@ runs: working-directory: ${{ env.HOLDEX_WORKING_DIR || '.' }} run: | if [ "${{ inputs.package-manager }}" = "pnpm" ]; then - pnpm add -g prettier + pnpm add prettier -D elif [ "${{ inputs.package-manager }}" = "npm" ]; then - npm install -g prettier + npm i prettier -D else - bun i -g prettier + bun i prettier -D fi - name: Check for Prettier config From aa3b6e14c919d7553ba4697b833f69a843e072b8 Mon Sep 17 00:00:00 2001 From: Teodorus Nathaniel Date: Thu, 2 Jul 2026 16:27:29 +0700 Subject: [PATCH 2/5] chore: use local --- .github/actions/base/prettier/action.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/actions/base/prettier/action.yml b/.github/actions/base/prettier/action.yml index e5af6b6..a6be7a7 100644 --- a/.github/actions/base/prettier/action.yml +++ b/.github/actions/base/prettier/action.yml @@ -49,11 +49,11 @@ runs: working-directory: ${{ env.HOLDEX_WORKING_DIR || '.' }} run: | if [ "${{ inputs.package-manager }}" = "pnpm" ]; then - pnpm add prettier -D + pnpm add -g prettier elif [ "${{ inputs.package-manager }}" = "npm" ]; then - npm i prettier -D + npm install -g prettier else - bun i prettier -D + bun i -g prettier fi - name: Check for Prettier config @@ -106,4 +106,11 @@ runs: if: steps.resolved-files.outputs.any-changed == 'true' shell: bash working-directory: ${{ env.HOLDEX_WORKING_DIR || '.' }} - run: prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} + run: | + if [ "${{ inputs.package-manager }}" = "pnpm" ]; then + pnpm run prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} + elif [ "${{ inputs.package-manager }}" = "npm" ]; then + npm run prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} + else + bun run prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} + fi From dc394e8ed73e3bac1d70380a0b271f813355a134 Mon Sep 17 00:00:00 2001 From: Teodorus Nathaniel Date: Thu, 2 Jul 2026 16:30:44 +0700 Subject: [PATCH 3/5] chore: use exec --- .github/actions/base/prettier/action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/actions/base/prettier/action.yml b/.github/actions/base/prettier/action.yml index a6be7a7..2663640 100644 --- a/.github/actions/base/prettier/action.yml +++ b/.github/actions/base/prettier/action.yml @@ -108,9 +108,9 @@ runs: working-directory: ${{ env.HOLDEX_WORKING_DIR || '.' }} run: | if [ "${{ inputs.package-manager }}" = "pnpm" ]; then - pnpm run prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} + pnpm exec prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} elif [ "${{ inputs.package-manager }}" = "npm" ]; then - npm run prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} + npx prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} else - bun run prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} + bunx prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} fi From cb85696db84ffd9c25324bdf40000ce2e58ca635 Mon Sep 17 00:00:00 2001 From: Teodorus Nathaniel Date: Thu, 2 Jul 2026 16:48:04 +0700 Subject: [PATCH 4/5] chore: run prettier from local, if not found, global --- .github/actions/base/prettier/action.yml | 66 +++++++++++++++--------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/.github/actions/base/prettier/action.yml b/.github/actions/base/prettier/action.yml index 2663640..7026201 100644 --- a/.github/actions/base/prettier/action.yml +++ b/.github/actions/base/prettier/action.yml @@ -56,16 +56,44 @@ runs: bun i -g prettier fi + - name: Install dependencies + if: steps.resolved-files.outputs.any-changed == 'true' + shell: bash + working-directory: ${{ env.HOLDEX_WORKING_DIR || '.' }} + run: | + if [ -f package.json ]; then + if [ "${{ inputs.package-manager }}" = "pnpm" ]; then + pnpm install --frozen-lockfile + elif [ "${{ inputs.package-manager }}" = "npm" ]; then + npm ci + else + bun i --frozen-lockfile + fi + else + echo "No package.json found, skipping dependency installation." + fi + - name: Check for Prettier config id: prettier-config if: steps.resolved-files.outputs.any-changed == 'true' shell: bash working-directory: ${{ env.HOLDEX_WORKING_DIR || '.' }} run: | + run_prettier() { + if [ -x "./node_modules/.bin/prettier" ]; then + ./node_modules/.bin/prettier "$@" + elif command -v prettier >/dev/null 2>&1; then + prettier "$@" + else + echo "::error::Prettier not found locally or globally." >&2 + exit 1 + fi + } + probe_file=".prettier-config-probe.tmp" touch "$probe_file" - if prettier --find-config-path "$probe_file" >/dev/null 2>&1; then + if run_prettier --find-config-path "$probe_file" >/dev/null 2>&1; then echo "has-config=true" >> "$GITHUB_OUTPUT" else echo "has-config=false" >> "$GITHUB_OUTPUT" @@ -79,23 +107,6 @@ runs: rm -f "$probe_file" - - name: Install dependencies - if: steps.resolved-files.outputs.any-changed == 'true' - shell: bash - working-directory: ${{ env.HOLDEX_WORKING_DIR || '.' }} - run: | - if [ -f package.json ]; then - if [ "${{ inputs.package-manager }}" = "pnpm" ]; then - pnpm install --frozen-lockfile - elif [ "${{ inputs.package-manager }}" = "npm" ]; then - npm ci - else - bun i --frozen-lockfile - fi - else - echo "No package.json found, skipping dependency installation." - fi - - name: Skip when no files changed if: steps.resolved-files.outputs.any-changed != 'true' shell: bash @@ -107,10 +118,15 @@ runs: shell: bash working-directory: ${{ env.HOLDEX_WORKING_DIR || '.' }} run: | - if [ "${{ inputs.package-manager }}" = "pnpm" ]; then - pnpm exec prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} - elif [ "${{ inputs.package-manager }}" = "npm" ]; then - npx prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} - else - bunx prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} - fi + run_prettier() { + if [ -x "./node_modules/.bin/prettier" ]; then + ./node_modules/.bin/prettier "$@" + elif command -v prettier >/dev/null 2>&1; then + prettier "$@" + else + echo "::error::Prettier not found locally or globally." >&2 + exit 1 + fi + } + + run_prettier --check --ignore-unknown ${{ steps.resolved-files.outputs.files }} From a24e04258e4e8f71cc1161469a2348ebcb8477ce Mon Sep 17 00:00:00 2001 From: Teodorus Nathaniel Date: Thu, 2 Jul 2026 16:55:48 +0700 Subject: [PATCH 5/5] chore: not install prettier globally if local exist --- .github/actions/base/prettier/action.yml | 31 ++++++++++++++---------- ACTIONS.md | 5 ++-- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/.github/actions/base/prettier/action.yml b/.github/actions/base/prettier/action.yml index 7026201..67efce8 100644 --- a/.github/actions/base/prettier/action.yml +++ b/.github/actions/base/prettier/action.yml @@ -43,19 +43,6 @@ runs: echo "files=$files" >> "$GITHUB_OUTPUT" fi - - name: Install Prettier - if: steps.resolved-files.outputs.any-changed == 'true' - shell: bash - working-directory: ${{ env.HOLDEX_WORKING_DIR || '.' }} - run: | - if [ "${{ inputs.package-manager }}" = "pnpm" ]; then - pnpm add -g prettier - elif [ "${{ inputs.package-manager }}" = "npm" ]; then - npm install -g prettier - else - bun i -g prettier - fi - - name: Install dependencies if: steps.resolved-files.outputs.any-changed == 'true' shell: bash @@ -73,6 +60,24 @@ runs: echo "No package.json found, skipping dependency installation." fi + - name: Install Prettier (fallback) + if: steps.resolved-files.outputs.any-changed == 'true' + shell: bash + working-directory: ${{ env.HOLDEX_WORKING_DIR || '.' }} + run: | + if [ -x "./node_modules/.bin/prettier" ]; then + echo "Using project-local Prettier." + exit 0 + fi + + if [ "${{ inputs.package-manager }}" = "pnpm" ]; then + pnpm add -g prettier + elif [ "${{ inputs.package-manager }}" = "npm" ]; then + npm install -g prettier + else + bun i -g prettier + fi + - name: Check for Prettier config id: prettier-config if: steps.resolved-files.outputs.any-changed == 'true' diff --git a/ACTIONS.md b/ACTIONS.md index 04c378e..0eeb53e 100644 --- a/ACTIONS.md +++ b/ACTIONS.md @@ -58,10 +58,11 @@ Path: `/.github/actions/base/prettier` - Discovers changed files itself if `changed-files` is not provided. - Skips execution if no changed files exist. -- Installs Prettier globally using selected package manager. -- Verifies a resolvable Prettier config exists. - Runs dependency install in repo context when `package.json` exists: - `bun i --frozen-lockfile`, `pnpm install --frozen-lockfile`, or `npm ci`. +- Uses project-local Prettier (`./node_modules/.bin/prettier`) when available after dependency install. +- Installs Prettier globally as a fallback only when no local binary is found. +- Verifies a resolvable Prettier config exists. - Runs `prettier --check --ignore-unknown` on changed files. - Respects `HOLDEX_WORKING_DIR` env var: all steps run in that directory when set.