The previous loop used Bash glob expansion (lexicographic order) and stopped at the first match, so environments with multiple Node installs could select an older runtime (e.g. v18 before v22). Extract the nvm resolution into a shared scripts/pre-commit/resolve-node.sh that pipes `ls` output through `sort -V | tail -1` to select the semantically newest version. Both pre-commit and run-node-tool.sh now source the shared script, eliminating the duplicated logic.
56 lines
1.6 KiB
Bash
Executable File
56 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
|
|
|
|
# Resolve node when not in PATH (e.g. nvm environments where the shell
|
|
# profile hasn't been sourced by the git hook). Picks the newest installed
|
|
# nvm version using version-aware sort so that v22 is preferred over v18.
|
|
# shellcheck source=scripts/pre-commit/resolve-node.sh
|
|
source "$ROOT_DIR/scripts/pre-commit/resolve-node.sh"
|
|
RUN_NODE_TOOL="$ROOT_DIR/scripts/pre-commit/run-node-tool.sh"
|
|
FILTER_FILES="$ROOT_DIR/scripts/pre-commit/filter-staged-files.mjs"
|
|
|
|
if [[ ! -x "$RUN_NODE_TOOL" ]]; then
|
|
echo "Missing helper: $RUN_NODE_TOOL" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "$FILTER_FILES" ]]; then
|
|
echo "Missing helper: $FILTER_FILES" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Security: avoid option-injection from malicious file names (e.g. "--all", "--force").
|
|
# Robustness: NUL-delimited file list handles spaces/newlines safely.
|
|
# Compatibility: use read loops instead of `mapfile` so this runs on macOS Bash 3.x.
|
|
files=()
|
|
while IFS= read -r -d '' file; do
|
|
files+=("$file")
|
|
done < <(git diff --cached --name-only --diff-filter=ACMR -z)
|
|
|
|
if [ "${#files[@]}" -eq 0 ]; then
|
|
exit 0
|
|
fi
|
|
|
|
lint_files=()
|
|
while IFS= read -r -d '' file; do
|
|
lint_files+=("$file")
|
|
done < <(node "$FILTER_FILES" lint -- "${files[@]}")
|
|
|
|
format_files=()
|
|
while IFS= read -r -d '' file; do
|
|
format_files+=("$file")
|
|
done < <(node "$FILTER_FILES" format -- "${files[@]}")
|
|
|
|
if [ "${#lint_files[@]}" -gt 0 ]; then
|
|
"$RUN_NODE_TOOL" oxlint --type-aware --fix -- "${lint_files[@]}"
|
|
fi
|
|
|
|
if [ "${#format_files[@]}" -gt 0 ]; then
|
|
"$RUN_NODE_TOOL" oxfmt --write -- "${format_files[@]}"
|
|
fi
|
|
|
|
git add -- "${files[@]}"
|