From d6b54030a3717c7088198ac550bc3e514e47653b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Feb 2026 23:22:34 +0000 Subject: [PATCH 01/58] refactor: Bump semver from 7.7.3 to 7.7.4 (#3216) --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b70123aae0..a9a4cbeeaf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -98,7 +98,7 @@ "sass": "1.97.3", "sass-loader": "16.0.7", "semantic-release": "25.0.3", - "semver": "7.7.3", + "semver": "7.7.4", "style-loader": "3.3.1", "svg-prep": "1.0.4", "typescript": "5.9.3", @@ -29394,9 +29394,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" diff --git a/package.json b/package.json index 3c88412692..eda9a0359b 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ "sass": "1.97.3", "sass-loader": "16.0.7", "semantic-release": "25.0.3", - "semver": "7.7.3", + "semver": "7.7.4", "style-loader": "3.3.1", "svg-prep": "1.0.4", "typescript": "5.9.3", From aee458b36a88ee28bc9e551bbe994d964261895b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Feb 2026 23:23:18 +0000 Subject: [PATCH 02/58] fix: Bump fast-xml-parser from 5.3.5 to 5.3.6 (#3223) --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a9a4cbeeaf..3c158c4c9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16606,9 +16606,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-parser": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.5.tgz", - "integrity": "sha512-JeaA2Vm9ffQKp9VjvfzObuMCjUYAp5WDYhRYL5LrBPY/jUDlUtOvDfot0vKSkB9tuX885BDHjtw4fZadD95wnA==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz", + "integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==", "dev": true, "funding": [ { From 6d2c4b0f32247c6ffa001348d1eaf321e4dc716d Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 19 Feb 2026 23:25:12 +0000 Subject: [PATCH 03/58] chore(release): 9.0.1-alpha.1 [skip ci] ## [9.0.1-alpha.1](https://github.com/parse-community/parse-dashboard/compare/9.0.0...9.0.1-alpha.1) (2026-02-19) ### Bug Fixes * Bump fast-xml-parser from 5.3.5 to 5.3.6 ([#3223](https://github.com/parse-community/parse-dashboard/issues/3223)) ([aee458b](https://github.com/parse-community/parse-dashboard/commit/aee458b36a88ee28bc9e551bbe994d964261895b)) --- changelogs/CHANGELOG_alpha.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md index d0b6656969..18b27df3be 100644 --- a/changelogs/CHANGELOG_alpha.md +++ b/changelogs/CHANGELOG_alpha.md @@ -1,3 +1,10 @@ +## [9.0.1-alpha.1](https://github.com/parse-community/parse-dashboard/compare/9.0.0...9.0.1-alpha.1) (2026-02-19) + + +### Bug Fixes + +* Bump fast-xml-parser from 5.3.5 to 5.3.6 ([#3223](https://github.com/parse-community/parse-dashboard/issues/3223)) ([aee458b](https://github.com/parse-community/parse-dashboard/commit/aee458b36a88ee28bc9e551bbe994d964261895b)) + # [9.0.0-alpha.8](https://github.com/parse-community/parse-dashboard/compare/9.0.0-alpha.7...9.0.0-alpha.8) (2026-02-19) diff --git a/package-lock.json b/package-lock.json index 3c158c4c9f..2ddef864c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "parse-dashboard", - "version": "9.0.0", + "version": "9.0.1-alpha.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "parse-dashboard", - "version": "9.0.0", + "version": "9.0.1-alpha.1", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "7.28.6", diff --git a/package.json b/package.json index eda9a0359b..f7b7348dae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-dashboard", - "version": "9.0.0", + "version": "9.0.1-alpha.1", "repository": { "type": "git", "url": "https://github.com/parse-community/parse-dashboard" From 3ba250df8421166b00eb906b191c147e237a3606 Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Thu, 19 Feb 2026 23:36:09 +0000 Subject: [PATCH 04/58] fix: Remove unused dependencies (#3227) --- package-lock.json | 356 +--------------------------------------------- package.json | 2 - 2 files changed, 4 insertions(+), 354 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ddef864c5..bebcd09ab4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,8 +93,6 @@ "prettier": "3.8.1", "puppeteer": "24.37.2", "react-test-renderer": "16.13.1", - "request": "2.88.2", - "request-promise": "4.2.6", "sass": "1.97.3", "sass-loader": "16.0.7", "semantic-release": "25.0.3", @@ -12308,15 +12306,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -12419,7 +12408,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "dev": true, + "optional": true }, "node_modules/available-typed-arrays": { "version": "1.0.7", @@ -12436,21 +12426,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "node_modules/babel-jest": { "version": "30.0.4", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.4.tgz", @@ -12873,15 +12848,6 @@ "node": ">=10.0.0" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/bcryptjs": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", @@ -12928,12 +12894,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "node_modules/bn.js": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", @@ -13273,12 +13233,6 @@ "cdl": "bin/cdl.js" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "node_modules/chalk": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", @@ -13735,6 +13689,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "optional": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -14121,18 +14076,6 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", @@ -14658,6 +14601,7 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true, + "optional": true, "engines": { "node": ">=0.4.0" } @@ -14984,16 +14928,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -17274,29 +17208,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", @@ -17742,15 +17653,6 @@ "node": ">= 14" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/git-log-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", @@ -18173,29 +18075,6 @@ "uglify-js": "^3.1.4" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -18520,21 +18399,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", @@ -19331,12 +19195,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -19431,12 +19289,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "node_modules/issue-parser": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", @@ -20820,12 +20672,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "node_modules/jsdom": { "version": "26.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", @@ -20995,12 +20841,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -21114,21 +20954,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/jssha": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.2.0.tgz", @@ -25306,15 +25131,6 @@ "dev": true, "license": "MIT" }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -26227,12 +26043,6 @@ "dev": true, "license": "MIT" }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "node_modules/pg": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.18.0.tgz", @@ -27102,12 +26912,6 @@ "dev": true, "license": "MIT" }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -28162,83 +27966,6 @@ "regjsparser": "bin/parser" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", - "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", - "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dev": true, - "license": "ISC", - "dependencies": { - "bluebird": "^3.5.0", - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "license": "ISC", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -29997,31 +29724,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -30053,15 +29755,6 @@ "node": ">=8" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", @@ -31216,19 +30909,6 @@ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -31351,18 +31031,6 @@ "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/tv4": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", @@ -31382,12 +31050,6 @@ "node": ">= 0.8.0" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -31941,16 +31603,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", diff --git a/package.json b/package.json index f7b7348dae..9d80c12ee5 100644 --- a/package.json +++ b/package.json @@ -118,8 +118,6 @@ "prettier": "3.8.1", "puppeteer": "24.37.2", "react-test-renderer": "16.13.1", - "request": "2.88.2", - "request-promise": "4.2.6", "sass": "1.97.3", "sass-loader": "16.0.7", "semantic-release": "25.0.3", From 025d4a185a26cb0cb92c2e8f75ba560240ed467e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 19 Feb 2026 23:37:58 +0000 Subject: [PATCH 05/58] chore(release): 9.0.1-alpha.2 [skip ci] ## [9.0.1-alpha.2](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.1...9.0.1-alpha.2) (2026-02-19) ### Bug Fixes * Remove unused dependencies ([#3227](https://github.com/parse-community/parse-dashboard/issues/3227)) ([3ba250d](https://github.com/parse-community/parse-dashboard/commit/3ba250df8421166b00eb906b191c147e237a3606)) --- changelogs/CHANGELOG_alpha.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md index 18b27df3be..1e008bb407 100644 --- a/changelogs/CHANGELOG_alpha.md +++ b/changelogs/CHANGELOG_alpha.md @@ -1,3 +1,10 @@ +## [9.0.1-alpha.2](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.1...9.0.1-alpha.2) (2026-02-19) + + +### Bug Fixes + +* Remove unused dependencies ([#3227](https://github.com/parse-community/parse-dashboard/issues/3227)) ([3ba250d](https://github.com/parse-community/parse-dashboard/commit/3ba250df8421166b00eb906b191c147e237a3606)) + ## [9.0.1-alpha.1](https://github.com/parse-community/parse-dashboard/compare/9.0.0...9.0.1-alpha.1) (2026-02-19) diff --git a/package-lock.json b/package-lock.json index bebcd09ab4..d8618bb6e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.1", + "version": "9.0.1-alpha.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "parse-dashboard", - "version": "9.0.1-alpha.1", + "version": "9.0.1-alpha.2", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "7.28.6", diff --git a/package.json b/package.json index 9d80c12ee5..a25afae7c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.1", + "version": "9.0.1-alpha.2", "repository": { "type": "git", "url": "https://github.com/parse-community/parse-dashboard" From 225c71047eedb57cb4134ac618adf629b2ab07a2 Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Thu, 19 Feb 2026 23:46:30 +0000 Subject: [PATCH 06/58] fix: Security upgrade transitive dependency qs (#3228) --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d8618bb6e6..3e1e936017 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27112,9 +27112,9 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" From 49447c83ade501fc9ffb23a2919661139f703160 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 19 Feb 2026 23:48:17 +0000 Subject: [PATCH 07/58] chore(release): 9.0.1-alpha.3 [skip ci] ## [9.0.1-alpha.3](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.2...9.0.1-alpha.3) (2026-02-19) ### Bug Fixes * Security upgrade transitive dependency qs ([#3228](https://github.com/parse-community/parse-dashboard/issues/3228)) ([225c710](https://github.com/parse-community/parse-dashboard/commit/225c71047eedb57cb4134ac618adf629b2ab07a2)) --- changelogs/CHANGELOG_alpha.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md index 1e008bb407..dd2dfba9d2 100644 --- a/changelogs/CHANGELOG_alpha.md +++ b/changelogs/CHANGELOG_alpha.md @@ -1,3 +1,10 @@ +## [9.0.1-alpha.3](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.2...9.0.1-alpha.3) (2026-02-19) + + +### Bug Fixes + +* Security upgrade transitive dependency qs ([#3228](https://github.com/parse-community/parse-dashboard/issues/3228)) ([225c710](https://github.com/parse-community/parse-dashboard/commit/225c71047eedb57cb4134ac618adf629b2ab07a2)) + ## [9.0.1-alpha.2](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.1...9.0.1-alpha.2) (2026-02-19) diff --git a/package-lock.json b/package-lock.json index 3e1e936017..7a65e6f119 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.2", + "version": "9.0.1-alpha.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "parse-dashboard", - "version": "9.0.1-alpha.2", + "version": "9.0.1-alpha.3", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "7.28.6", diff --git a/package.json b/package.json index a25afae7c5..01c73a0cb0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.2", + "version": "9.0.1-alpha.3", "repository": { "type": "git", "url": "https://github.com/parse-community/parse-dashboard" From 8e1be1f8bee5aef85e4a2ed686b5007d9d814f7e Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 00:14:35 +0000 Subject: [PATCH 08/58] fix: Security upgrade transitive dependency undici (#3229) --- ci/{CiVersionCheck.js => CiVersionCheck.mjs} | 10 +- ci/{ciCheck.js => ciCheck.mjs} | 6 +- ...nodeEngineCheck.js => nodeEngineCheck.mjs} | 11 +- eslint.config.js | 2 +- package-lock.json | 118 +++++------------- package.json | 8 +- 6 files changed, 47 insertions(+), 108 deletions(-) rename ci/{CiVersionCheck.js => CiVersionCheck.mjs} (98%) rename ci/{ciCheck.js => ciCheck.mjs} (88%) rename ci/{nodeEngineCheck.js => nodeEngineCheck.mjs} (96%) diff --git a/ci/CiVersionCheck.js b/ci/CiVersionCheck.mjs similarity index 98% rename from ci/CiVersionCheck.js rename to ci/CiVersionCheck.mjs index 098dee59d3..3e34ad6f55 100644 --- a/ci/CiVersionCheck.js +++ b/ci/CiVersionCheck.mjs @@ -1,7 +1,7 @@ -const core = require('@actions/core'); -const semver = require('semver'); -const yaml = require('yaml'); -const fs = require('fs').promises; +import * as core from '@actions/core'; +import semver from 'semver'; +import yaml from 'yaml'; +import fs from 'fs/promises'; /** * This checks the CI version of an environment variable in a YAML file @@ -287,4 +287,4 @@ class CiVersionCheck { } } -module.exports = CiVersionCheck; +export default CiVersionCheck; diff --git a/ci/ciCheck.js b/ci/ciCheck.mjs similarity index 88% rename from ci/ciCheck.js rename to ci/ciCheck.mjs index 492ab04ee6..1e3a0b938b 100644 --- a/ci/ciCheck.js +++ b/ci/ciCheck.mjs @@ -1,7 +1,5 @@ -'use strict' - -const CiVersionCheck = require('./CiVersionCheck'); -const allNodeVersions = require('all-node-versions'); +import CiVersionCheck from './CiVersionCheck.mjs'; +import allNodeVersions from 'all-node-versions'; async function check() { // Run checks diff --git a/ci/nodeEngineCheck.js b/ci/nodeEngineCheck.mjs similarity index 96% rename from ci/nodeEngineCheck.js rename to ci/nodeEngineCheck.mjs index 9af1544237..e7bbd2ae9a 100644 --- a/ci/nodeEngineCheck.js +++ b/ci/nodeEngineCheck.mjs @@ -1,7 +1,10 @@ -const core = require('@actions/core'); -const semver = require('semver'); -const fs = require('fs').promises; -const path = require('path'); +import * as core from '@actions/core'; +import semver from 'semver'; +import fs from 'fs/promises'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); /** * This checks whether any package dependency requires a minimum node engine diff --git a/eslint.config.js b/eslint.config.js index af542474a3..1f4fbe8f0f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -15,7 +15,7 @@ module.exports = defineConfig([ js.configs.recommended, reactPlugin.configs.flat.recommended, { - files: ['**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx'], + files: ['**/*.js', '**/*.jsx', '**/*.mjs', '**/*.ts', '**/*.tsx'], languageOptions: { parser: babelParser, parserOptions: { diff --git a/package-lock.json b/package-lock.json index 7a65e6f119..b8bc42ccd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "parse-dashboard": "bin/parse-dashboard" }, "devDependencies": { - "@actions/core": "2.0.1", + "@actions/core": "3.0.0", "@babel/core": "7.29.0", "@babel/eslint-parser": "7.28.6", "@babel/plugin-proposal-decorators": "7.29.0", @@ -69,7 +69,7 @@ "@semantic-release/changelog": "6.0.3", "@semantic-release/commit-analyzer": "13.0.1", "@semantic-release/git": "10.0.1", - "@semantic-release/github": "12.0.3", + "@semantic-release/github": "12.0.6", "@semantic-release/npm": "13.1.4", "@semantic-release/release-notes-generator": "14.1.0", "@types/jest": "30.0.0", @@ -110,41 +110,41 @@ } }, "node_modules/@actions/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.1.tgz", - "integrity": "sha512-oBfqT3GwkvLlo1fjvhQLQxuwZCGTarTE5OuZ2Wg10hvhBj7LRIlF611WT4aZS6fDhO5ZKlY7lCAZTlpmyaHaeg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.0.tgz", + "integrity": "sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==", "dev": true, "license": "MIT", "dependencies": { - "@actions/exec": "^2.0.0", - "@actions/http-client": "^3.0.0" + "@actions/exec": "^3.0.0", + "@actions/http-client": "^4.0.0" } }, "node_modules/@actions/exec": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-2.0.0.tgz", - "integrity": "sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-3.0.0.tgz", + "integrity": "sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==", "dev": true, "license": "MIT", "dependencies": { - "@actions/io": "^2.0.0" + "@actions/io": "^3.0.2" } }, "node_modules/@actions/http-client": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.0.tgz", - "integrity": "sha512-1s3tXAfVMSz9a4ZEBkXXRQD4QhY3+GAsWSbaYpeknPOKEeyRiU3lH+bHiLMZdo2x/fIeQ/hscL1wCkDLVM2DZQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.0.tgz", + "integrity": "sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==", "dev": true, "license": "MIT", "dependencies": { "tunnel": "^0.0.6", - "undici": "^5.28.5" + "undici": "^6.23.0" } }, "node_modules/@actions/io": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-2.0.0.tgz", - "integrity": "sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-3.0.2.tgz", + "integrity": "sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==", "dev": true, "license": "MIT" }, @@ -2903,16 +2903,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, "node_modules/@firebase/app-check-interop-types": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", @@ -7685,9 +7675,9 @@ } }, "node_modules/@semantic-release/github": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.3.tgz", - "integrity": "sha512-pod3AVGVVVk2rUczMBL4+gfY7hP7A9YYOwjpxVFSusF+pDbFOYBzFRQcHjv1H3IntQyB/Noxzx8LUZ/iwAQQeQ==", + "version": "12.0.6", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.6.tgz", + "integrity": "sha512-aYYFkwHW3c6YtHwQF0t0+lAjlU+87NFOZuH2CvWFD0Ylivc7MwhZMiHOJ0FMpIgPpCVib/VUAcOwvrW0KnxQtA==", "dev": true, "license": "MIT", "dependencies": { @@ -7796,9 +7786,9 @@ } }, "node_modules/@semantic-release/github/node_modules/undici": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", + "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", "dev": true, "license": "MIT", "engines": { @@ -7844,45 +7834,6 @@ "semantic-release": ">=20.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/@actions/core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.0.tgz", - "integrity": "sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@actions/exec": "^3.0.0", - "@actions/http-client": "^4.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/@actions/exec": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-3.0.0.tgz", - "integrity": "sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@actions/io": "^3.0.2" - } - }, - "node_modules/@semantic-release/npm/node_modules/@actions/http-client": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.0.tgz", - "integrity": "sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^6.23.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/@actions/io": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-3.0.2.tgz", - "integrity": "sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==", - "dev": true, - "license": "MIT" - }, "node_modules/@semantic-release/npm/node_modules/@semantic-release/error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", @@ -10320,16 +10271,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/undici": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, "node_modules/@semantic-release/npm/node_modules/unicorn-magic": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", @@ -31294,16 +31235,13 @@ } }, "node_modules/undici": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "dev": true, "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, "engines": { - "node": ">=14.0" + "node": ">=18.17" } }, "node_modules/undici-types": { diff --git a/package.json b/package.json index 01c73a0cb0..9646cc1f83 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "regenerator-runtime": "0.14.1" }, "devDependencies": { - "@actions/core": "2.0.1", + "@actions/core": "3.0.0", "@babel/core": "7.29.0", "@babel/eslint-parser": "7.28.6", "@babel/plugin-proposal-decorators": "7.29.0", @@ -94,7 +94,7 @@ "@semantic-release/changelog": "6.0.3", "@semantic-release/commit-analyzer": "13.0.1", "@semantic-release/git": "10.0.1", - "@semantic-release/github": "12.0.3", + "@semantic-release/github": "12.0.6", "@semantic-release/npm": "13.1.4", "@semantic-release/release-notes-generator": "14.1.0", "@types/jest": "30.0.0", @@ -131,8 +131,8 @@ "yaml": "2.8.2" }, "scripts": { - "ci:check": "node ./ci/ciCheck.js", - "ci:checkNodeEngine": "node ./ci/nodeEngineCheck.js", + "ci:check": "node ./ci/ciCheck.mjs", + "ci:checkNodeEngine": "node ./ci/nodeEngineCheck.mjs", "dev": "node ./Parse-Dashboard/index.js & webpack --config webpack/build.config.js --devtool eval-source-map --progress --watch", "dashboard": "node ./Parse-Dashboard/index.js & webpack --config webpack/build.config.js --progress --watch", "pig": "http-server ./PIG -p 4041 -s & webpack --config webpack/PIG.config.js --progress --watch", From 5a0b88996186a3a5a209b2864c0c40aba6e00c1e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 20 Feb 2026 00:16:30 +0000 Subject: [PATCH 09/58] chore(release): 9.0.1-alpha.4 [skip ci] ## [9.0.1-alpha.4](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.3...9.0.1-alpha.4) (2026-02-20) ### Bug Fixes * Security upgrade transitive dependency undici ([#3229](https://github.com/parse-community/parse-dashboard/issues/3229)) ([8e1be1f](https://github.com/parse-community/parse-dashboard/commit/8e1be1f8bee5aef85e4a2ed686b5007d9d814f7e)) --- changelogs/CHANGELOG_alpha.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md index dd2dfba9d2..1af6617ebe 100644 --- a/changelogs/CHANGELOG_alpha.md +++ b/changelogs/CHANGELOG_alpha.md @@ -1,3 +1,10 @@ +## [9.0.1-alpha.4](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.3...9.0.1-alpha.4) (2026-02-20) + + +### Bug Fixes + +* Security upgrade transitive dependency undici ([#3229](https://github.com/parse-community/parse-dashboard/issues/3229)) ([8e1be1f](https://github.com/parse-community/parse-dashboard/commit/8e1be1f8bee5aef85e4a2ed686b5007d9d814f7e)) + ## [9.0.1-alpha.3](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.2...9.0.1-alpha.3) (2026-02-19) diff --git a/package-lock.json b/package-lock.json index b8bc42ccd6..b8154812e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.3", + "version": "9.0.1-alpha.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "parse-dashboard", - "version": "9.0.1-alpha.3", + "version": "9.0.1-alpha.4", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "7.28.6", diff --git a/package.json b/package.json index 9646cc1f83..836d8c07ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.3", + "version": "9.0.1-alpha.4", "repository": { "type": "git", "url": "https://github.com/parse-community/parse-dashboard" From 5e1b1fa0912c48a5698dc80819a27b85627ef0f3 Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 00:37:37 +0000 Subject: [PATCH 10/58] fix: Security removal dependency null-loader (#3230) --- package-lock.json | 80 ------------------------------------------ package.json | 1 - webpack/base.config.js | 2 +- 3 files changed, 1 insertion(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index b8154812e8..3617f2bbdb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,7 +88,6 @@ "madge": "8.0.0", "marked": "15.0.12", "mongodb-runner": "^6.6.0", - "null-loader": "4.0.1", "parse-server": "9.2.0", "prettier": "3.8.1", "puppeteer": "24.37.2", @@ -11940,15 +11939,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/all-node-versions": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/all-node-versions/-/all-node-versions-13.0.1.tgz", @@ -12805,15 +12795,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/bignumber.js": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", @@ -14939,15 +14920,6 @@ "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "dev": true }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", @@ -21112,20 +21084,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -25022,44 +24980,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/null-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", diff --git a/package.json b/package.json index 836d8c07ad..f8098dfd14 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,6 @@ "madge": "8.0.0", "marked": "15.0.12", "mongodb-runner": "^6.6.0", - "null-loader": "4.0.1", "parse-server": "9.2.0", "prettier": "3.8.1", "puppeteer": "24.37.2", diff --git a/webpack/base.config.js b/webpack/base.config.js index 8f1bb1c83d..2556f67a5b 100644 --- a/webpack/base.config.js +++ b/webpack/base.config.js @@ -76,7 +76,7 @@ module.exports = { }, { test: /\.flow$/, - use: 'null-loader', + type: 'asset/source', }, ], }, From a425dac9f83fa6bf3e6e1334522b4f5b61e185a8 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 20 Feb 2026 00:39:24 +0000 Subject: [PATCH 11/58] chore(release): 9.0.1-alpha.5 [skip ci] ## [9.0.1-alpha.5](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.4...9.0.1-alpha.5) (2026-02-20) ### Bug Fixes * Security removal dependency null-loader ([#3230](https://github.com/parse-community/parse-dashboard/issues/3230)) ([5e1b1fa](https://github.com/parse-community/parse-dashboard/commit/5e1b1fa0912c48a5698dc80819a27b85627ef0f3)) --- changelogs/CHANGELOG_alpha.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md index 1af6617ebe..d5c149486b 100644 --- a/changelogs/CHANGELOG_alpha.md +++ b/changelogs/CHANGELOG_alpha.md @@ -1,3 +1,10 @@ +## [9.0.1-alpha.5](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.4...9.0.1-alpha.5) (2026-02-20) + + +### Bug Fixes + +* Security removal dependency null-loader ([#3230](https://github.com/parse-community/parse-dashboard/issues/3230)) ([5e1b1fa](https://github.com/parse-community/parse-dashboard/commit/5e1b1fa0912c48a5698dc80819a27b85627ef0f3)) + ## [9.0.1-alpha.4](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.3...9.0.1-alpha.4) (2026-02-20) diff --git a/package-lock.json b/package-lock.json index 3617f2bbdb..55ccda642c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.4", + "version": "9.0.1-alpha.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "parse-dashboard", - "version": "9.0.1-alpha.4", + "version": "9.0.1-alpha.5", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "7.28.6", diff --git a/package.json b/package.json index f8098dfd14..cf177ec267 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.4", + "version": "9.0.1-alpha.5", "repository": { "type": "git", "url": "https://github.com/parse-community/parse-dashboard" From d1e5e4156f5b0485afe8021e9525565922530d36 Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 00:46:24 +0000 Subject: [PATCH 12/58] fix: Security upgrade transitive dependency ajv (#3231) --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 55ccda642c..e46c3e3189 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11916,9 +11916,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { @@ -28304,9 +28304,9 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { From 77c0640dd144abd80f991e6ca099e263273d3760 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 20 Feb 2026 00:48:15 +0000 Subject: [PATCH 13/58] chore(release): 9.0.1-alpha.6 [skip ci] ## [9.0.1-alpha.6](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.5...9.0.1-alpha.6) (2026-02-20) ### Bug Fixes * Security upgrade transitive dependency ajv ([#3231](https://github.com/parse-community/parse-dashboard/issues/3231)) ([d1e5e41](https://github.com/parse-community/parse-dashboard/commit/d1e5e4156f5b0485afe8021e9525565922530d36)) --- changelogs/CHANGELOG_alpha.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md index d5c149486b..f37c82ad6e 100644 --- a/changelogs/CHANGELOG_alpha.md +++ b/changelogs/CHANGELOG_alpha.md @@ -1,3 +1,10 @@ +## [9.0.1-alpha.6](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.5...9.0.1-alpha.6) (2026-02-20) + + +### Bug Fixes + +* Security upgrade transitive dependency ajv ([#3231](https://github.com/parse-community/parse-dashboard/issues/3231)) ([d1e5e41](https://github.com/parse-community/parse-dashboard/commit/d1e5e4156f5b0485afe8021e9525565922530d36)) + ## [9.0.1-alpha.5](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.4...9.0.1-alpha.5) (2026-02-20) diff --git a/package-lock.json b/package-lock.json index e46c3e3189..64ef0d2ced 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.5", + "version": "9.0.1-alpha.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "parse-dashboard", - "version": "9.0.1-alpha.5", + "version": "9.0.1-alpha.6", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "7.28.6", diff --git a/package.json b/package.json index cf177ec267..6ecf473106 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.5", + "version": "9.0.1-alpha.6", "repository": { "type": "git", "url": "https://github.com/parse-community/parse-dashboard" From abb08c63b3a5b2c0102560ca21353bc7885cc63e Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 01:43:12 +0000 Subject: [PATCH 14/58] fix: Security removal dependency svg-prep (#3236) --- package-lock.json | 51 --------------------------------- package.json | 1 - webpack/plugins/svg-prep.js | 56 +++++++++++++++++++++++++++++++++---- 3 files changed, 51 insertions(+), 57 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64ef0d2ced..e440a75aa1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -97,7 +97,6 @@ "semantic-release": "25.0.3", "semver": "7.7.4", "style-loader": "3.3.1", - "svg-prep": "1.0.4", "typescript": "5.9.3", "webpack": "5.105.1", "webpack-cli": "6.0.1", @@ -28255,12 +28254,6 @@ "node": ">=18" } }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -30081,28 +30074,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-prep": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/svg-prep/-/svg-prep-1.0.4.tgz", - "integrity": "sha512-RT9dKj+l9yRsrQIZhdWqIftN0E4agtnPCn8pFJm9yM9bEWrNJhtUjG2g2AA/K+9pa4gh/CRFMXIPtcHOviQE2w==", - "dev": true, - "dependencies": { - "commander": "^2.8.1", - "xml2js": "^0.4.12" - }, - "bin": { - "svg-prep": "bin/index.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/svg-prep/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -32148,28 +32119,6 @@ "node": ">=18" } }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index 6ecf473106..f4d3d4e0a4 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,6 @@ "semantic-release": "25.0.3", "semver": "7.7.4", "style-loader": "3.3.1", - "svg-prep": "1.0.4", "typescript": "5.9.3", "webpack": "5.105.1", "webpack-cli": "6.0.1", diff --git a/webpack/plugins/svg-prep.js b/webpack/plugins/svg-prep.js index af6a70f4cb..b5db1bdfa8 100644 --- a/webpack/plugins/svg-prep.js +++ b/webpack/plugins/svg-prep.js @@ -9,10 +9,57 @@ const fs = require('fs'); const path = require('path'); -const SvgPrep = require('svg-prep'); const { Compilation, sources } = require('webpack'); const { RawSource } = sources; +/** + * Builds an SVG sprite from individual SVG files. Each SVG becomes a + * element identified by its filename (without extension). + */ +function buildSvgSprite(files) { + const symbols = files.map(file => { + const name = path.basename(file, '.svg'); + const svg = fs.readFileSync(file, 'utf-8'); + + // Extract viewBox from the root element + const viewBoxMatch = svg.match(/viewBox="([^"]*)"/); + const viewBox = viewBoxMatch ? viewBoxMatch[1] : '0 0 100 100'; + + // Extract inner content between and + const innerMatch = svg.match(/]*>([\s\S]*)<\/svg>/); + const inner = innerMatch ? innerMatch[1] : ''; + + // Strip elements that are unnecessary or potential XSS vectors + // Remove attributes that interfere with sprite styling or pose security risks + const cleaned = inner + .replace(//gi, '') + .replace(//gi, '') + .replace(//gi, '') + .replace(//gi, '') + .replace(//gi, '') + .replace(//g, '') + .replace(/\s+id="[^"]*"/g, '') + .replace(/\s+fill="[^"]*"/g, '') + .replace(/\s+class="[^"]*"/g, '') + .replace(/\s+style="[^"]*"/g, '') + .replace(/\s+stroke="[^"]*"/g, '') + .replace(/\s+stroke-[a-z]+="[^"]*"/g, '') + .replace(/\s+on[a-zA-Z]+="[^"]*"/g, '') + .replace(/\s+on[a-zA-Z]+='[^']*'/g, '') + .replace(/\s+href="[^"]*"/g, '') + .replace(/\s+xlink:href="[^"]*"/g, ''); + + return ` \n ${cleaned.trim()}\n `; + }); + + return [ + '', + '', + ].join('\n'); +} + function SvgPrepPlugin(options) { this.options = {}; Object.assign( @@ -33,17 +80,16 @@ SvgPrepPlugin.prototype.apply = function (compiler) { }, async () => { if (!this.options.source) { - return Promise.resolve(); + return; } - // TODO: Keep track of file hashes, so we can avoid recompiling when none have changed const files = fs .readdirSync(this.options.source) .filter(name => name.endsWith('.svg')) + .sort() .map(name => path.join(this.options.source, name)); - const sprited = await SvgPrep(files).filter({ removeIds: true, noFill: true }).output(); - + const sprited = buildSvgSprite(files); compilation.emitAsset(this.options.output, new RawSource(sprited)); } ); From 85104d48e1e59cb5a7a059d80a6b3394b3acd75f Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 20 Feb 2026 01:44:57 +0000 Subject: [PATCH 15/58] chore(release): 9.0.1-alpha.7 [skip ci] ## [9.0.1-alpha.7](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.6...9.0.1-alpha.7) (2026-02-20) ### Bug Fixes * Security removal dependency svg-prep ([#3236](https://github.com/parse-community/parse-dashboard/issues/3236)) ([abb08c6](https://github.com/parse-community/parse-dashboard/commit/abb08c63b3a5b2c0102560ca21353bc7885cc63e)) --- changelogs/CHANGELOG_alpha.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md index f37c82ad6e..1a27129fbe 100644 --- a/changelogs/CHANGELOG_alpha.md +++ b/changelogs/CHANGELOG_alpha.md @@ -1,3 +1,10 @@ +## [9.0.1-alpha.7](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.6...9.0.1-alpha.7) (2026-02-20) + + +### Bug Fixes + +* Security removal dependency svg-prep ([#3236](https://github.com/parse-community/parse-dashboard/issues/3236)) ([abb08c6](https://github.com/parse-community/parse-dashboard/commit/abb08c63b3a5b2c0102560ca21353bc7885cc63e)) + ## [9.0.1-alpha.6](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.5...9.0.1-alpha.6) (2026-02-20) diff --git a/package-lock.json b/package-lock.json index e440a75aa1..3c36b061f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.6", + "version": "9.0.1-alpha.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "parse-dashboard", - "version": "9.0.1-alpha.6", + "version": "9.0.1-alpha.7", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "7.28.6", diff --git a/package.json b/package.json index f4d3d4e0a4..1e878adf2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.6", + "version": "9.0.1-alpha.7", "repository": { "type": "git", "url": "https://github.com/parse-community/parse-dashboard" From f007a6836a5477c014b2139600fda03073bde4be Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Fri, 27 Feb 2026 03:14:11 +0000 Subject: [PATCH 16/58] feat: Add diff view to Cloud Config parameter dialog for better conflict handling (#3239) --- package-lock.json | 10 + package.json | 1 + src/components/JsonEditor/JsonEditor.scss | 2 +- src/dashboard/Data/Config/Config.react.js | 67 ++---- .../Data/Config/ConfigConflictDiff.react.js | 226 ++++++++++++++++++ .../Data/Config/ConfigConflictDiff.scss | 77 ++++++ .../Data/Config/ConfigDialog.react.js | 137 ++++++++--- src/lib/tests/ConfigConflictDiff.test.js | 93 +++++++ testing/preprocessor.js | 1 + 9 files changed, 536 insertions(+), 78 deletions(-) create mode 100644 src/dashboard/Data/Config/ConfigConflictDiff.react.js create mode 100644 src/dashboard/Data/Config/ConfigConflictDiff.scss create mode 100644 src/lib/tests/ConfigConflictDiff.test.js diff --git a/package-lock.json b/package-lock.json index 3c36b061f8..3383f1e7ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "copy-to-clipboard": "3.3.3", "core-js": "3.48.0", "csrf-sync": "4.2.1", + "diff": "8.0.3", "expr-eval-fork": "3.0.1", "express": "5.2.1", "express-session": "1.18.2", @@ -14738,6 +14739,15 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-match-patch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", diff --git a/package.json b/package.json index 1e878adf2f..8b14f19914 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "copy-to-clipboard": "3.3.3", "core-js": "3.48.0", "csrf-sync": "4.2.1", + "diff": "8.0.3", "expr-eval-fork": "3.0.1", "express": "5.2.1", "express-session": "1.18.2", diff --git a/src/components/JsonEditor/JsonEditor.scss b/src/components/JsonEditor/JsonEditor.scss index e0d35af85a..cab49ea0df 100644 --- a/src/components/JsonEditor/JsonEditor.scss +++ b/src/components/JsonEditor/JsonEditor.scss @@ -90,7 +90,7 @@ .inputLayer { display: block; width: 100%; - min-width: calc(var(--modal-min-width) * (1 - var(--modal-label-ratio))); + min-width: 100%; background: transparent; color: transparent; caret-color: #333; diff --git a/src/dashboard/Data/Config/Config.react.js b/src/dashboard/Data/Config/Config.react.js index a067a4c15c..7daf827fb5 100644 --- a/src/dashboard/Data/Config/Config.react.js +++ b/src/dashboard/Data/Config/Config.react.js @@ -24,7 +24,6 @@ import Toolbar from 'components/Toolbar/Toolbar.react'; import browserStyles from 'dashboard/Data/Browser/Browser.scss'; import configStyles from 'dashboard/Data/Config/Config.scss'; import { CurrentApp } from 'context/currentApp'; -import Modal from 'components/Modal/Modal.react'; import equal from 'fast-deep-equal'; import Notification from 'dashboard/Data/Browser/Notification.react'; import ServerConfigStorage from 'lib/ServerConfigStorage'; @@ -46,7 +45,7 @@ class Config extends TableView { modalValue: '', modalMasterKeyOnly: false, loading: false, - confirmModalOpen: false, + modalConflict: false, lastError: null, lastNote: null, showAddEntryDialog: false, @@ -220,11 +219,12 @@ class Config extends TableView { extras = ( this.setState({ modalOpen: false })} + onCancel={() => this.setState({ modalOpen: false, modalConflict: false })} param={this.state.modalParam} type={this.state.modalType} value={this.state.modalValue} masterKeyOnly={this.state.modalMasterKeyOnly} + conflict={this.state.modalConflict} parseServerVersion={this.context.serverInfo?.parseServerVersion} loading={this.state.loading} configHistory={this.state.currentParamHistory} @@ -271,30 +271,6 @@ class Config extends TableView { ); } - if (this.state.confirmModalOpen) { - extras = ( - this.setState({ confirmModalOpen: false })} - onConfirm={() => { - this.setState({ confirmModalOpen: false }); - this.saveParam({ - ...this.confirmData, - override: true, - }); - }} - > -
- This parameter changed while you were editing it. If you continue, the latest changes - will be lost and replaced with your version. Do you want to proceed? -
- - ); - } let notification = null; if (this.state.lastError) { notification = ; @@ -537,19 +513,28 @@ class Config extends TableView { const currentValueAfter = fetchedParamsAfter.get(name); const valuesAreEqual = equal(currentValue, currentValueAfter); - if (!valuesAreEqual && !override) { - this.setState({ - confirmModalOpen: true, - modalOpen: false, - loading: false, - }); - this.confirmData = { - name, - value, - type, - masterKeyOnly, - }; - return; + if (!valuesAreEqual) { + const { modalValue: conflictServerValue } = this.parseValueForModal(currentValueAfter); + + if (override) { + // Re-check: has the server value changed again since the user confirmed? + const serverValueChanged = !equal(this.state.modalValue, conflictServerValue); + if (serverValueChanged) { + this.setState({ + modalConflict: true, + modalValue: conflictServerValue, + loading: false, + }); + return; + } + } else { + this.setState({ + modalConflict: true, + modalValue: conflictServerValue, + loading: false, + }); + return; + } } await this.props.config.dispatch(ActionTypes.SET, { @@ -567,7 +552,7 @@ class Config extends TableView { this.cacheData.set('masterKeyOnly', masterKeyOnlyParams); } - this.setState({ modalOpen: false }); + this.setState({ modalOpen: false, modalConflict: false }); // Update config history in localStorage let transformedValue = value; diff --git a/src/dashboard/Data/Config/ConfigConflictDiff.react.js b/src/dashboard/Data/Config/ConfigConflictDiff.react.js new file mode 100644 index 0000000000..335261b5c9 --- /dev/null +++ b/src/dashboard/Data/Config/ConfigConflictDiff.react.js @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2016-present, Parse, LLC + * All rights reserved. + * + * This source code is licensed under the license found in the LICENSE file in + * the root directory of this source tree. + */ +import React from 'react'; +import { diffLines, diffChars } from 'diff'; +import styles from 'dashboard/Data/Config/ConfigConflictDiff.scss'; + +/** + * Serialize a config value to a string suitable for diffing. + * Both server and user values go through this to ensure consistent formatting. + */ +function serializeForDiff(value, type, isUserValue = false) { + if (value === null || value === undefined) { + return 'null'; + } + + switch (type) { + case 'Object': + case 'Array': { + // User values from ConfigDialog are already JSON strings for Object/Array + if (isUserValue && typeof value === 'string') { + try { + return JSON.stringify(JSON.parse(value), null, 2); + } catch { + return value; + } + } + return JSON.stringify(value, null, 2); + } + case 'Boolean': + return String(value); + case 'Number': + return String(value); + case 'Date': { + if (typeof value === 'string') { + return value; + } + if (value instanceof Date) { + return value.toISOString(); + } + if (value && value.iso) { + return value.iso; + } + return String(value); + } + case 'GeoPoint': { + if (value && typeof value.toJSON === 'function') { + const json = value.toJSON(); + return JSON.stringify({ latitude: json.latitude, longitude: json.longitude }, null, 2); + } + if (value && (value.latitude !== undefined || value.longitude !== undefined)) { + return JSON.stringify({ latitude: value.latitude, longitude: value.longitude }, null, 2); + } + return JSON.stringify(value, null, 2); + } + case 'File': { + if (value && typeof value.toJSON === 'function') { + const json = value.toJSON(); + return JSON.stringify({ name: json.name, url: json.url }, null, 2); + } + if (value && (value._name !== undefined || value.name !== undefined)) { + return JSON.stringify({ name: value._name || value.name, url: value._url || value.url }, null, 2); + } + return JSON.stringify(value, null, 2); + } + case 'String': + default: + return String(value); + } +} + +/** + * Render a line with character-level highlighting. + * charDiffs is the result of diffChars() for this line pair. + * side is 'removed' or 'added'. + */ +function renderCharHighlightedContent(charDiffs, side) { + return charDiffs.map((part, i) => { + if (part.added && side === 'added') { + return {part.value}; + } + if (part.removed && side === 'removed') { + return {part.value}; + } + if (!part.added && !part.removed) { + return {part.value}; + } + return null; + }); +} + +/** + * ConfigConflictDiff displays a GitHub-style unified diff between + * the server's latest value and the user's edited value. + */ +const ConfigConflictDiff = ({ serverValue, userValue, type }) => { + const serverStr = serializeForDiff(serverValue, type, false); + const userStr = serializeForDiff(userValue, type, true); + + const lineDiffs = diffLines(serverStr, userStr); + + // Build diff lines with character-level highlighting + const rows = []; + let oldLineNum = 1; + let newLineNum = 1; + + for (let i = 0; i < lineDiffs.length; i++) { + const part = lineDiffs[i]; + const lines = part.value.replace(/\n$/, '').split('\n'); + + if (part.removed) { + // Check if next part is an addition (paired change for char-level diff) + const nextPart = lineDiffs[i + 1]; + const hasCharDiff = nextPart && nextPart.added; + let charDiffResult = null; + + if (hasCharDiff) { + charDiffResult = diffChars(part.value, nextPart.value); + } + + for (const line of lines) { + rows.push({ + type: 'removed', + oldNum: oldLineNum++, + newNum: null, + prefix: '-', + content: line, + charDiffs: charDiffResult, + charSide: 'removed', + singleLineDiff: lines.length === 1, + }); + } + + if (hasCharDiff) { + const addedLines = nextPart.value.replace(/\n$/, '').split('\n'); + for (const line of addedLines) { + rows.push({ + type: 'added', + oldNum: null, + newNum: newLineNum++, + prefix: '+', + content: line, + charDiffs: charDiffResult, + charSide: 'added', + singleLineDiff: addedLines.length === 1, + }); + } + i++; // Skip the next (added) part since we handled it + } + } else if (part.added) { + for (const line of lines) { + rows.push({ + type: 'added', + oldNum: null, + newNum: newLineNum++, + prefix: '+', + content: line, + charDiffs: null, + charSide: null, + singleLineDiff: false, + }); + } + } else { + for (const line of lines) { + rows.push({ + type: 'context', + oldNum: oldLineNum++, + newNum: newLineNum++, + prefix: ' ', + content: line, + charDiffs: null, + charSide: null, + singleLineDiff: false, + }); + } + } + } + + if (rows.length === 0 || (rows.length === 1 && rows[0].type === 'context' && rows[0].content === '')) { + return
Values are identical — no differences found.
; + } + + // For character-level highlighting within a single line, + // we need to map charDiffs to individual lines. Since diffChars + // operates on the full block text, for single-line values we can + // highlight directly. For multi-line, we show line-level coloring only. + const renderContent = (row) => { + if (row.charDiffs && row.singleLineDiff) { + return renderCharHighlightedContent(row.charDiffs, row.charSide); + } + return row.content; + }; + + const lineStyle = (row) => { + if (row.type === 'removed') { + return styles.lineRemoved; + } + if (row.type === 'added') { + return styles.lineAdded; + } + return styles.lineContext; + }; + + return ( +
+ + + {rows.map((row, idx) => ( + + + + + + + ))} + +
{row.oldNum ?? ''}{row.newNum ?? ''}{row.prefix}{renderContent(row)}
+
+ ); +}; + +export default ConfigConflictDiff; diff --git a/src/dashboard/Data/Config/ConfigConflictDiff.scss b/src/dashboard/Data/Config/ConfigConflictDiff.scss new file mode 100644 index 0000000000..a3fa52cd2b --- /dev/null +++ b/src/dashboard/Data/Config/ConfigConflictDiff.scss @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2016-present, Parse, LLC + * All rights reserved. + * + * This source code is licensed under the license found in the LICENSE file in + * the root directory of this source tree. + */ +.container { + width: 100%; + min-width: 100%; + overflow: auto; + height: 200px; + min-height: 80px; + resize: both; + text-align: left; +} + +.table { + width: 100%; + border-collapse: collapse; + font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace; + font-size: 12px; + line-height: 20px; +} + +.lineNumber { + width: 1%; + min-width: 40px; + padding: 0 8px; + text-align: right; + color: rgba(27, 31, 36, 0.3); + vertical-align: top; + user-select: none; + border-right: 1px solid #d1d5da; +} + +.prefix { + width: 1%; + padding: 0 4px; + user-select: none; + vertical-align: top; +} + +.content { + padding: 0 8px; + white-space: pre-wrap; + word-break: break-all; +} + +.lineRemoved { + background-color: #ffeef0; +} + +.lineAdded { + background-color: #e6ffec; +} + +.lineContext { + background-color: transparent; +} + +.charRemoved { + background-color: #fdaeb7; + border-radius: 2px; +} + +.charAdded { + background-color: #abf2bc; + border-radius: 2px; +} + +.emptyDiff { + padding: 16px 20px; + color: #586069; + font-style: italic; + text-align: center; +} diff --git a/src/dashboard/Data/Config/ConfigDialog.react.js b/src/dashboard/Data/Config/ConfigDialog.react.js index a59a6efe55..03c5327f09 100644 --- a/src/dashboard/Data/Config/ConfigDialog.react.js +++ b/src/dashboard/Data/Config/ConfigDialog.react.js @@ -26,6 +26,7 @@ import semver from 'semver/preload.js'; import { dateStringUTC } from 'lib/DateUtils'; import LoaderContainer from 'components/LoaderContainer/LoaderContainer.react'; import ServerConfigStorage from 'lib/ServerConfigStorage'; +import ConfigConflictDiff from 'dashboard/Data/Config/ConfigConflictDiff.react'; import { CurrentApp } from 'context/currentApp'; const FORMATTING_CONFIG_KEY = 'config.formatting.syntax'; @@ -126,6 +127,8 @@ export default class ConfigDialog extends React.Component { masterKeyOnly: false, selectedIndex: null, wordWrap: false, + showDiff: false, + confirmOverride: false, error: null, syntaxColors: null, }; @@ -142,6 +145,8 @@ export default class ConfigDialog extends React.Component { masterKeyOnly: props.masterKeyOnly, selectedIndex: 0, wordWrap: false, + showDiff: false, + confirmOverride: false, error: initialError, syntaxColors: null, }; @@ -326,6 +331,7 @@ export default class ConfigDialog extends React.Component { type: this.state.type, value: GET_VALUE[this.state.type](this.state.value), masterKeyOnly: this.state.masterKeyOnly, + ...(this.props.conflict && this.state.confirmOverride ? { override: true } : {}), }); } @@ -358,8 +364,16 @@ export default class ConfigDialog extends React.Component { } componentDidUpdate(prevProps) { - // Update parameter value or masterKeyOnly if they have changed - if (this.props.value !== prevProps.value || this.props.masterKeyOnly !== prevProps.masterKeyOnly) { + // When a conflict is detected (or server value changes during conflict), + // don't reset the editor value — preserve user edits. + // Auto-enable the Diff toggle and reset the override confirmation. + if (this.props.conflict && (!prevProps.conflict || this.props.value !== prevProps.value)) { + this.setState({ showDiff: true, confirmOverride: false }); + return; + } + + // Update parameter value or masterKeyOnly if they have changed (non-conflict) + if (!this.props.conflict && (this.props.value !== prevProps.value || this.props.masterKeyOnly !== prevProps.masterKeyOnly)) { let updatedValue = this.props.value; let error = null; @@ -449,6 +463,27 @@ export default class ConfigDialog extends React.Component { { detectNonPrintable: effectiveDetectNonPrintable, detectNonAlphanumeric: effectiveDetectNonAlphanumeric, detectRegex: effectiveDetectRegex } )} /> + {this.state.showDiff && this.props.param.length > 0 && ( + + } + input={ + { try { return JSON.parse(this.props.value); } catch { return this.props.value; } })() + : this.props.value + } + userValue={this.state.value} + type={this.state.type} + /> + } + /> + )} { /* @@ -500,47 +535,77 @@ export default class ConfigDialog extends React.Component { ); const isJsonType = this.state.type === 'Object' || this.state.type === 'Array'; + const isDiffableType = isJsonType || this.state.type === 'String'; + const isExistingParam = this.props.param && this.props.param.length > 0; const customFooter = ( -
-
- {isJsonType && ( - <> -
-
-
+
+
); @@ -553,7 +618,7 @@ export default class ConfigDialog extends React.Component { iconSize={30} subtitle={'Dynamically configure parts of your app'} customFooter={customFooter} - disabled={!this.valid() || this.props.loading} + disabled={!this.valid() || this.props.loading || (this.props.conflict && !this.state.confirmOverride)} onCancel={this.props.onCancel} onConfirm={this.submit.bind(this)} > diff --git a/src/lib/tests/ConfigConflictDiff.test.js b/src/lib/tests/ConfigConflictDiff.test.js new file mode 100644 index 0000000000..93addd2e69 --- /dev/null +++ b/src/lib/tests/ConfigConflictDiff.test.js @@ -0,0 +1,93 @@ +jest.dontMock('../../dashboard/Data/Config/ConfigConflictDiff.react'); + +import React from 'react'; +import renderer from 'react-test-renderer'; +const ConfigConflictDiff = require('../../dashboard/Data/Config/ConfigConflictDiff.react').default; + +// Mock the diff library +jest.mock('diff', () => ({ + diffLines: jest.fn((oldStr, newStr) => { + // Simple mock: if strings differ, return removed + added + if (oldStr === newStr) { + return [{ value: oldStr }]; + } + return [ + { value: oldStr, removed: true }, + { value: newStr, added: true }, + ]; + }), + diffChars: jest.fn((oldStr, newStr) => { + if (oldStr === newStr) { + return [{ value: oldStr }]; + } + return [ + { value: oldStr, removed: true }, + { value: newStr, added: true }, + ]; + }), +})); + +describe('ConfigConflictDiff', () => { + it('renders a diff for changed string values', () => { + const component = renderer.create( + + ); + const tree = component.toJSON(); + expect(tree).toBeTruthy(); + // Should have table child + expect(tree.children.length).toBe(1); + }); + + it('renders a diff for changed object values', () => { + const component = renderer.create( + + ); + const tree = component.toJSON(); + expect(tree).toBeTruthy(); + }); + + it('renders empty state when values are identical', () => { + const component = renderer.create( + + ); + const tree = component.toJSON(); + expect(tree.type).toBe('div'); + expect(tree.children[0]).toContain('identical'); + }); + + it('renders a diff for boolean values', () => { + const component = renderer.create( + + ); + const tree = component.toJSON(); + expect(tree).toBeTruthy(); + }); + + it('renders a diff for number values', () => { + const component = renderer.create( + + ); + const tree = component.toJSON(); + expect(tree).toBeTruthy(); + }); +}); diff --git a/testing/preprocessor.js b/testing/preprocessor.js index 32a1956367..ef059ee670 100644 --- a/testing/preprocessor.js +++ b/testing/preprocessor.js @@ -32,6 +32,7 @@ module.exports = { src = src.replace(/from 'stylesheets/g, 'from \'' + relPrefix + 'stylesheets'); src = src.replace(/from 'lib/g, 'from \'' + relPrefix + 'lib'); src = src.replace(/from 'components/g, 'from \'' + relPrefix + 'components'); + src = src.replace(/from 'dashboard/g, 'from \'' + relPrefix + 'dashboard'); // Ignore all files within node_modules // babel files can be .js, .es, .jsx or .es6 From b596a324ec09ca0e896801ce53c93d438cbd727e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 27 Feb 2026 03:15:49 +0000 Subject: [PATCH 17/58] chore(release): 9.1.0-alpha.1 [skip ci] # [9.1.0-alpha.1](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.7...9.1.0-alpha.1) (2026-02-27) ### Features * Add diff view to Cloud Config parameter dialog for better conflict handling ([#3239](https://github.com/parse-community/parse-dashboard/issues/3239)) ([f007a68](https://github.com/parse-community/parse-dashboard/commit/f007a6836a5477c014b2139600fda03073bde4be)) --- changelogs/CHANGELOG_alpha.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/changelogs/CHANGELOG_alpha.md b/changelogs/CHANGELOG_alpha.md index 1a27129fbe..5c2ed6d685 100644 --- a/changelogs/CHANGELOG_alpha.md +++ b/changelogs/CHANGELOG_alpha.md @@ -1,3 +1,10 @@ +# [9.1.0-alpha.1](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.7...9.1.0-alpha.1) (2026-02-27) + + +### Features + +* Add diff view to Cloud Config parameter dialog for better conflict handling ([#3239](https://github.com/parse-community/parse-dashboard/issues/3239)) ([f007a68](https://github.com/parse-community/parse-dashboard/commit/f007a6836a5477c014b2139600fda03073bde4be)) + ## [9.0.1-alpha.7](https://github.com/parse-community/parse-dashboard/compare/9.0.1-alpha.6...9.0.1-alpha.7) (2026-02-20) diff --git a/package-lock.json b/package-lock.json index 3383f1e7ab..9dffe74d92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.7", + "version": "9.1.0-alpha.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "parse-dashboard", - "version": "9.0.1-alpha.7", + "version": "9.1.0-alpha.1", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "7.28.6", diff --git a/package.json b/package.json index 8b14f19914..d371de3cae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-dashboard", - "version": "9.0.1-alpha.7", + "version": "9.1.0-alpha.1", "repository": { "type": "git", "url": "https://github.com/parse-community/parse-dashboard" From c6e95d9e1f3ac8f5e68cd1cc2c70664abc670dd0 Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Fri, 27 Feb 2026 18:05:18 +0000 Subject: [PATCH 18/58] fix: Layout issues when resizing Cloud Config parameter dialog (#3241) --- src/components/JsonEditor/JsonEditor.scss | 4 +- .../MultiSelect/MultiSelect.react.js | 2 +- .../Data/Config/ConfigConflictDiff.scss | 7 +- .../Data/Config/ConfigDialog.react.js | 80 +++++++++++++------ 4 files changed, 64 insertions(+), 29 deletions(-) diff --git a/src/components/JsonEditor/JsonEditor.scss b/src/components/JsonEditor/JsonEditor.scss index cab49ea0df..df5f06835e 100644 --- a/src/components/JsonEditor/JsonEditor.scss +++ b/src/components/JsonEditor/JsonEditor.scss @@ -42,7 +42,7 @@ pointer-events: none; background: transparent; color: #555572; - overflow: auto; + overflow: hidden; code { display: block; @@ -90,7 +90,7 @@ .inputLayer { display: block; width: 100%; - min-width: 100%; + min-width: calc(var(--modal-min-width) * (1 - var(--modal-label-ratio))); background: transparent; color: transparent; caret-color: #333; diff --git a/src/components/MultiSelect/MultiSelect.react.js b/src/components/MultiSelect/MultiSelect.react.js index 532b853fd9..f742c6c6d2 100644 --- a/src/components/MultiSelect/MultiSelect.react.js +++ b/src/components/MultiSelect/MultiSelect.react.js @@ -81,7 +81,7 @@ export default class MultiSelect extends React.Component { render() { let popover = null; if (this.state.open) { - const width = this.dropdownRef.current.clientWidth; + const width = this.props.menuWidth || this.dropdownRef.current.clientWidth; const classes = [styles.menu]; if (this.props.dense) { diff --git a/src/dashboard/Data/Config/ConfigConflictDiff.scss b/src/dashboard/Data/Config/ConfigConflictDiff.scss index a3fa52cd2b..55c9259518 100644 --- a/src/dashboard/Data/Config/ConfigConflictDiff.scss +++ b/src/dashboard/Data/Config/ConfigConflictDiff.scss @@ -6,12 +6,13 @@ * the root directory of this source tree. */ .container { + contain: inline-size; width: 100%; - min-width: 100%; + min-width: 0; overflow: auto; - height: 200px; + height: 80px; min-height: 80px; - resize: both; + resize: vertical; text-align: left; } diff --git a/src/dashboard/Data/Config/ConfigDialog.react.js b/src/dashboard/Data/Config/ConfigDialog.react.js index 03c5327f09..7c2517c1d5 100644 --- a/src/dashboard/Data/Config/ConfigDialog.react.js +++ b/src/dashboard/Data/Config/ConfigDialog.react.js @@ -10,6 +10,7 @@ import Dropdown from 'components/Dropdown/Dropdown.react'; import Field from 'components/Field/Field.react'; import FileInput from 'components/FileInput/FileInput.react'; import GeoPointInput from 'components/GeoPointInput/GeoPointInput.react'; +import Icon from 'components/Icon/Icon.react'; import Label from 'components/Label/Label.react'; import Modal from 'components/Modal/Modal.react'; import NonPrintableHighlighter, { hasNonPrintableChars, getNonPrintableCharsFromJson, hasNonAlphanumericChars, getNonAlphanumericCharsFromJson, getRegexValidation, getRegexValidationFromJson } from 'components/NonPrintableHighlighter/NonPrintableHighlighter.react'; @@ -18,6 +19,8 @@ import Parse from 'parse'; import React from 'react'; import TextInput from 'components/TextInput/TextInput.react'; import Toggle from 'components/Toggle/Toggle.react'; +import Popover from 'components/Popover/Popover.react'; +import Position from 'lib/Position'; import Button from 'components/Button/Button.react'; import JsonEditor from 'components/JsonEditor/JsonEditor.react'; import validateNumeric from 'lib/validateNumeric'; @@ -120,6 +123,7 @@ export default class ConfigDialog extends React.Component { constructor(props) { super(); + this.optionsRef = React.createRef(); this.state = { value: null, type: 'String', @@ -129,6 +133,7 @@ export default class ConfigDialog extends React.Component { wordWrap: false, showDiff: false, confirmOverride: false, + optionsMenuOpen: false, error: null, syntaxColors: null, }; @@ -335,6 +340,14 @@ export default class ConfigDialog extends React.Component { }); } + updateOptionsMenuPos = () => { + if (this.optionsRef.current) { + const pos = Position.inWindow(this.optionsRef.current); + pos.y -= 4; + this.setState({ optionsMenuPos: pos }); + } + }; + formatValue() { const { value, error } = ConfigDialog.formatJSON(this.state.value); this.setState({ value, error }); @@ -566,37 +579,58 @@ export default class ConfigDialog extends React.Component { onClick={this.compactValue.bind(this)} disabled={!this.canFormatValue()} /> - {this.state.error && ( {this.state.error} )} )} - {isDiffableType && isExistingParam && ( -