diff --git a/.circleci/config.yml b/.circleci/config.yml index 56b9f9f..4f8472a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,11 +2,21 @@ version: 2.1 jobs: build: docker: - # Node 24.18 (engines/.nvmrc) — matching browsers image. - - image: cimg/node:24.18-browsers + # Node 24.18.1 (engines/.nvmrc) — matching browsers image. + - image: cimg/node:24.18.1-browsers working_directory: ~/repo steps: - checkout + - run: + name: PR base branch verification (main requires dev head) + command: | + TARGET="${CIRCLE_TARGET_BRANCH:-${GITHUB_BASE_REF:-}}" + SOURCE="${CIRCLE_BRANCH:-$(git rev-parse --abbrev-ref HEAD)}" + if [ -n "$TARGET" ] && [ "$TARGET" = "main" ] && [ "$SOURCE" != "dev" ]; then + echo "FAIL: PRs targeting main must originate from dev branch (got: $SOURCE)." >&2 + exit 1 + fi + echo "OK: PR base/head branch verification passed (Target: ${TARGET:-default}, Source: $SOURCE)" - run: name: Test install command: npm install diff --git a/.nvmrc b/.nvmrc index ca5c350..8dfc5cb 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -24.18.0 +24.18.1 diff --git a/package-lock.json b/package-lock.json index 900cb08..d731579 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "express-sslify": "^1.2.0", "react": "^19.2.6", "react-dom": "^19.2.6", - "react-router": "^7.15.1", + "react-router": "^8.3.0", "react-router-dom": "^7.15.1", "react-router-hash-link": "^2.4.3", "react-slick": "^0.31.0", @@ -3150,6 +3150,12 @@ "node": ">= 0.6" } }, + "node_modules/cookie-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", + "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", + "license": "MIT" + }, "node_modules/cookie-signature": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", @@ -5532,9 +5538,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "funding": [ { "type": "github", @@ -5864,9 +5870,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", "funding": [ { "type": "opencollective", @@ -5883,7 +5889,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6172,20 +6178,19 @@ "peer": true }, "node_modules/react-router": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.0.tgz", - "integrity": "sha512-pTTGt8J+ji1NOmYnjzT+bAJy/1zD+Jp4ziO6cL7T3ZLvXKtusO7BpFqlRXitqpcPVqllsIXFHRMt+2/k3Xn6HQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-8.3.0.tgz", + "integrity": "sha512-qyPMvW83jGIct3yiieisxdk9M745anqhpIMKN5m1t6yBMfgVPpt77aHOqs5fUlEJRMCGffg9BaQLH9oPVOL7xQ==", "license": "MIT", "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" + "cookie-es": "^3.1.1" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.22.0" }, "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" + "react": ">=19.2.7", + "react-dom": ">=19.2.7" }, "peerDependenciesMeta": { "react-dom": { @@ -6209,6 +6214,41 @@ "react-dom": ">=18" } }, + "node_modules/react-router-dom/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/react-router-dom/node_modules/react-router": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.0.tgz", + "integrity": "sha512-pTTGt8J+ji1NOmYnjzT+bAJy/1zD+Jp4ziO6cL7T3ZLvXKtusO7BpFqlRXitqpcPVqllsIXFHRMt+2/k3Xn6HQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, "node_modules/react-router-hash-link": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/react-router-hash-link/-/react-router-hash-link-2.4.3.tgz", @@ -6222,19 +6262,6 @@ "react-router-dom": ">=4" } }, - "node_modules/react-router/node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/react-slick": { "version": "0.31.0", "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.31.0.tgz", diff --git a/package.json b/package.json index b822d00..872765d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "appersonautomotive.com", - "version": "3.2.0", + "version": "3.2.3", "description": "appersonautomotive.com", "main": "dist/index.html", "repository": { @@ -9,7 +9,7 @@ }, "author": "https://github.com/orgs/WebJamApps/teams/the-95-theses", "engines": { - "node": "24.18.0" + "node": "24.18.1" }, "files": [ "vite.config.ts", @@ -55,7 +55,7 @@ "express-sslify": "^1.2.0", "react": "^19.2.6", "react-dom": "^19.2.6", - "react-router": "^7.15.1", + "react-router": "^8.3.0", "react-router-dom": "^7.15.1", "react-router-hash-link": "^2.4.3", "react-slick": "^0.31.0", diff --git a/test/App/__snapshots__/App.spec.tsx.snap b/test/App/__snapshots__/App.spec.tsx.snap index cc6c89b..c922a95 100644 --- a/test/App/__snapshots__/App.spec.tsx.snap +++ b/test/App/__snapshots__/App.spec.tsx.snap @@ -158,7 +158,7 @@ exports[`App component > renders the component 1`] = ` style="font-size: 13px; color: rgb(192, 192, 192); font-family: Habibi, ChivoBlack, Arial, sans-serif;" > v - 3.2.0 + 3.2.3 diff --git a/test/App/__snapshots__/AppTemplate.spec.tsx.snap b/test/App/__snapshots__/AppTemplate.spec.tsx.snap index 8256ddf..e4a7ec8 100644 --- a/test/App/__snapshots__/AppTemplate.spec.tsx.snap +++ b/test/App/__snapshots__/AppTemplate.spec.tsx.snap @@ -154,7 +154,7 @@ exports[`AppTemplate > calls the mobile menu 1`] = ` style="font-size: 13px; color: rgb(192, 192, 192); font-family: Habibi, ChivoBlack, Arial, sans-serif;" > v - 3.2.0 + 3.2.3 @@ -420,7 +420,7 @@ exports[`AppTemplate > renders the component 1`] = ` style="font-size: 13px; color: rgb(192, 192, 192); font-family: Habibi, ChivoBlack, Arial, sans-serif;" > v - 3.2.0 + 3.2.3