MM-69835 Update to React 19 and rebuild - #13
Conversation
|
@coderabbitai Review this |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '== Pull request metadata =='
gh pr view 13 --repo mattermost/react-bootstrap --json number,title,baseRefName,headRefName,files,additions,deletions --jq '{number,title,base:.baseRefName,head:.headRefName,additions,deletions,files:[.files[].path]}'
echo
echo '== Changed-file summary =='
git diff --stat "origin/$(gh pr view 13 --repo mattermost/react-bootstrap --json baseRefName --jq .baseRefName)"...HEAD
echo
echo '== Changed source and metadata files =='
git diff --name-only "origin/$(gh pr view 13 --repo mattermost/react-bootstrap --json baseRefName --jq .baseRefName)"...HEAD | sed -n '1,240p'Length of output: 3327 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="mattermost/react-bootstrap"
pr="13"
echo '== Dependency manifest patch =='
gh api --paginate "repos/$repo/pulls/$pr/files?per_page=100" \
--jq '.[] | select(.filename == "package.json") | .patch'
echo
echo '== Lockfile header and dependency-related changes =='
gh api --paginate "repos/$repo/pulls/$pr/files?per_page=100" \
--jq '.[] | select(.filename == "yarn.lock") | .patch' | sed -n '1,360p'
echo
echo '== Generated files with React API changes =='
for file in \
'es/Collapse.js' \
'es/Fade.js' \
'es/Overlay.js' \
'es/OverlayTrigger.js' \
'es/Dropdown.js' \
'es/Modal.js' \
'es/utils/mergeRefs.js' \
'lib/Collapse.js' \
'lib/OverlayTrigger.js'
do
echo "--- $file ---"
gh api --paginate "repos/$repo/pulls/$pr/files?per_page=100" \
--jq --arg file "$file" '.[] | select(.filename == $file) | .patch'
doneLength of output: 6808 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="mattermost/react-bootstrap"
base="MM-69835-4"
head="MM-69835-5"
workdir="$(mktemp -d)"
trap 'rm -rf "$workdir"' EXIT
fetch_file() {
local ref="$1"
local file="$2"
local destination="$3"
gh api "repos/$repo/contents/$file?ref=$ref" --jq '.content' | tr -d '\n' | base64 -d > "$destination"
}
for file in package.json es/Collapse.js es/Fade.js es/Overlay.js es/OverlayTrigger.js es/Dropdown.js es/Modal.js es/utils/mergeRefs.js; do
safe_name="${file//\//_}"
fetch_file "$base" "$file" "$workdir/base_$safe_name"
fetch_file "$head" "$file" "$workdir/head_$safe_name"
done
echo '== package.json: package contract and scripts =='
python3 - "$workdir/base_package.json" "$workdir/head_package.json" <<'PY'
import json, sys
for label, path in zip(("base", "head"), sys.argv[1:]):
p = json.load(open(path))
print(f"-- {label} --")
for key in ("version", "main", "module", "browser", "peerDependencies", "dependencies", "devDependencies", "scripts"):
print(f"{key}: {json.dumps(p.get(key), indent=2, sort_keys=True)}")
PY
echo
echo '== Targeted generated-code diffs: imports, hooks, refs, ReactDOM, transition callbacks =='
for file in es/Collapse.js es/Fade.js es/Overlay.js es/OverlayTrigger.js es/Dropdown.js es/Modal.js es/utils/mergeRefs.js; do
safe_name="${file//\//_}"
echo "--- $file ---"
diff -U3 "$workdir/base_$safe_name" "$workdir/head_$safe_name" \
| grep -E '^(@@|[+-].*(React|react-dom|findDOMNode|use[A-Z]|ref|Ref|Transition|createElement|defaultProps|propTypes))' \
|| true
done
echo
echo '== Full diff summaries =='
for file in es/Collapse.js es/Fade.js es/Overlay.js es/OverlayTrigger.js es/Dropdown.js es/Modal.js es/utils/mergeRefs.js; do
safe_name="${file//\//_}"
echo "--- $file ---"
diff -u "$workdir/base_$safe_name" "$workdir/head_$safe_name" | diffstat 2>/dev/null || \
diff -u "$workdir/base_$safe_name" "$workdir/head_$safe_name" | sed -n '1,30p'
doneLength of output: 2326 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="mattermost/react-bootstrap"
pr="13"
echo '== Pull request commit references =='
gh api "repos/$repo/pulls/$pr" \
--jq '{base_sha:.base.sha, base_label:.base.label, head_sha:.head.sha, head_label:.head.label, merge_commit_sha:.merge_commit_sha, state:.state}'
echo
echo '== Pull request commits =='
gh api --paginate "repos/$repo/pulls/$pr/commits?per_page=100" \
--jq '.[] | {sha, parents:[.parents[].sha], message:(.commit.message | split("\n")[0])}'
echo
echo '== Confirm selected files exist at the head commit =='
head_sha="$(gh api "repos/$repo/pulls/$pr" --jq '.head.sha')"
for file in package.json es/Collapse.js es/Fade.js es/Overlay.js es/OverlayTrigger.js es/Dropdown.js es/Modal.js es/utils/mergeRefs.js; do
printf '%s: ' "$file"
gh api "repos/$repo/contents/$file?ref=$head_sha" --jq '.sha'
doneLength of output: 2137 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="mattermost/react-bootstrap"
base="a182b78abc9eef0cdbe708f3508a00beb94e4cc2"
head="177c152a9d7801dab0f00a278bbf6dae2ba0bc0f"
workdir="$(mktemp -d)"
trap 'rm -rf "$workdir"' EXIT
fetch_file() {
local ref="$1" file="$2" output="$3"
gh api "repos/$repo/contents/$file?ref=$ref" --jq '.content' \
| tr -d '\n' | base64 --decode > "$output"
}
files=(
package.json
es/Collapse.js es/Fade.js es/Overlay.js es/OverlayTrigger.js
es/Dropdown.js es/DropdownMenu.js es/Modal.js es/utils/mergeRefs.js
)
for file in "${files[@]}"; do
safe="${file//\//_}"
fetch_file "$base" "$file" "$workdir/base_$safe"
fetch_file "$head" "$file" "$workdir/head_$safe"
done
echo '== package.json contract and test scripts =='
python3 - "$workdir/base_package.json" "$workdir/head_package.json" <<'PY'
import json, sys
for label, path in zip(("base", "head"), sys.argv[1:]):
package = json.load(open(path))
print(f"-- {label} --")
for key in ("version", "main", "module", "browser", "peerDependencies", "dependencies", "devDependencies", "scripts"):
print(f"{key}: {json.dumps(package.get(key), indent=2, sort_keys=True)}")
PY
echo
echo '== All changed lines in selected modules =='
for file in "${files[@]:1}"; do
safe="${file//\//_}"
echo "--- $file ---"
diff -u "$workdir/base_$safe" "$workdir/head_$safe" | sed -n '1,260p' || true
done
echo
echo '== React 19-sensitive calls in rebuilt ESM output =='
grep -nE 'findDOMNode|ReactDOM|createPortal|createRoot|forwardRef|defaultProps|UNSAFE_|componentWill|ref=|use[A-Z][A-Za-z]*\(' \
"$workdir/head_es_Collapse.js" \
"$workdir/head_es_Fade.js" \
"$workdir/head_es_Overlay.js" \
"$workdir/head_es_OverlayTrigger.js" \
"$workdir/head_es_Dropdown.js" \
"$workdir/head_es_DropdownMenu.js" \
"$workdir/head_es_Modal.js" \
"$workdir/head_es_utils_mergeRefs.js" \
|| trueLength of output: 2244 🏁 Script executed: #!/bin/bash
set -euo pipefail
base="a182b78abc9eef0cdbe708f3508a00beb94e4cc2"
dependency_commit="b0055d2c5d2a903a00408cc525f9b4b090ef24e4"
head="177c152a9d7801dab0f00a278bbf6dae2ba0bc0f"
repo="mattermost/react-bootstrap"
echo '== Local object availability =='
for revision in "$base" "$dependency_commit" "$head"; do
if git cat-file -e "${revision}^{commit}" 2>/dev/null; then
echo "$revision: present"
else
echo "$revision: unavailable"
fi
done
echo
echo '== Direct-parent commit availability through GitHub =='
for revision in "$dependency_commit" "$head"; do
printf '%s: ' "$revision"
gh api "repos/$repo/commits/$revision" --jq '{sha,parents:[.parents[].sha],files_changed:(.files | length)}'
done
echo
echo '== Isolated rebuild diff, when the direct parent is available locally =='
if git cat-file -e "${dependency_commit}^{commit}" 2>/dev/null && git cat-file -e "${head}^{commit}" 2>/dev/null; then
git diff --stat "$dependency_commit" "$head"
echo
git diff -- package.json "$dependency_commit" "$head" || true
echo
git diff -U5 "$dependency_commit" "$head" -- \
es/Collapse.js es/Fade.js es/Overlay.js es/OverlayTrigger.js es/Dropdown.js es/DropdownMenu.js es/Modal.js es/utils/mergeRefs.js \
| sed -n '1,1200p'
fi
echo
echo '== Head package manifest through GitHub API =='
gh api "repos/$repo/contents/package.json?ref=$head" --jq '.content' | tr -d '\n' | base64 --decode \
| python3 -c 'import json,sys; p=json.load(sys.stdin); print(json.dumps({k:p.get(k) for k in ("peerDependencies","dependencies","devDependencies","scripts")}, indent=2, sort_keys=True))'Length of output: 39359 🏁 Script executed: #!/bin/bash
set -euo pipefail
head="177c152a9d7801dab0f00a278bbf6dae2ba0bc0f"
echo '== Exact locations in changed ESM files =='
nl -ba es/Overlay.js | sed -n '76,122p'
echo
nl -ba es/OverlayTrigger.js | sed -n '270,310p'
echo
nl -ba es/Dropdown.js | sed -n '280,350p'
echo
nl -ba es/Modal.js | sed -n '205,255p'
echo
echo '== Equivalent generated output occurrences =='
rg -n -C2 "display: 'content'|target: null|isOverflowing\(document\.body\)" \
es lib amd/react-bootstrap.js dist/react-bootstrap.js
echo
echo '== Public prop declarations and existing test coverage =='
rg -n -C4 "target:|container:|container\s*=|<Overlay|<Modal|OverlayTrigger" \
src test README.md docs 2>/dev/null || true
echo
echo '== Changed test files =='
git diff --name-only a182b78abc9eef0cdbe708f3508a00beb94e4cc2 177c152a9d7801dab0f00a278bbf6dae2ba0bc0f -- test src || trueLength of output: 1251 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '== Exact locations in changed ESM files =='
cat -n es/Overlay.js | sed -n '76,122p'
echo
cat -n es/OverlayTrigger.js | sed -n '270,310p'
echo
cat -n es/Dropdown.js | sed -n '280,350p'
echo
cat -n es/Modal.js | sed -n '205,255p'
echo
echo '== Equivalent generated output occurrences =='
rg -n -C2 "display: 'content'|target: null|isOverflowing\(document\.body\)" \
es lib amd/react-bootstrap.js dist/react-bootstrap.js || true
echo
echo '== Public prop declarations and existing test coverage =='
rg -n -C4 "target:|container:|container\s*=|<Overlay|<Modal|OverlayTrigger" \
src test README.md docs 2>/dev/null || true
echo
echo '== Changed test or source files =='
git diff --name-only a182b78abc9eef0cdbe708f3508a00beb94e4cc2 177c152a9d7801dab0f00a278bbf6dae2ba0bc0f -- test src || trueLength of output: 43725
I did not execute tests because the review sandbox does not execute repository code. ❌ Action failedReview failed.
|
|
Caution Review failedFailed to post review comments. We encountered an issue with GitHub. Use ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (4)
📒 Files selected for processing (90)
🧰 Additional context used🪛 ast-grep (0.45.0)es/Navbar.js[warning] 203-203: Avoid using the initial state variable in setState (setstate-same-var) es/TabContent.js[warning] 158-158: Avoid using the initial state variable in setState (setstate-same-var) 🪛 Biome (2.5.6)amd/react-bootstrap.js[error] 701-701: This comparison uses the same expression on both sides. (lint/suspicious/noSelfCompare) 📝 WalkthroughWalkthroughThis change updates React Bootstrap for React 19. It replaces legacy context and DOM lookup APIs with modern contexts, refs, transitions, overlays, modal rendering, and runtime validation. It updates source, compiled, AMD, and development dependency versions. ChangesReact 19 compatibility migration
Estimated code review effort: 5 (Critical) | ~120 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ast-grep (0.45.0)amd/react-bootstrap.jsast-grep timed out on this file 🔧 ESLint
package.jsonParsing error: Unexpected token, expected ";" 1 | {
Comment |
Summary
We check the compiled code into this repo because we don't publish our fork to NPM. I pulled that out until the end for ease of review
Ticket Link
https://mattermost.atlassian.net/browse/MM-69835