From 4c412e04e2ca6469528eefefe8756ffd778e29b3 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 18:13:45 +0000 Subject: [PATCH 01/18] parse --- package-lock.json | 149 +++++++++++++++++++++++++++++++++++----------- package.json | 2 +- 2 files changed, 115 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3c650d34c4..af6a554edc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.0.3", + "parse": "8.2.0-alpha.2", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", @@ -2175,6 +2175,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz", + "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.48.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", @@ -4116,6 +4128,56 @@ "node": "20 || 22 || 24" } }, + "node_modules/@parse/push-adapter/node_modules/@babel/runtime-corejs3": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz", + "integrity": "sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.43.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@parse/push-adapter/node_modules/parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", + "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "7.28.6", + "@babel/runtime-corejs3": "7.28.6", + "crypto-js": "4.2.0", + "idb-keyval": "6.2.2", + "react-native-crypto-js": "1.0.0", + "ws": "8.19.0" + }, + "engines": { + "node": ">=20.19.0 <21 || >=22.12.0 <23 || >=24.1.0 <25" + } + }, + "node_modules/@parse/push-adapter/node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -8720,9 +8782,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.46.0.tgz", - "integrity": "sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==", + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.48.0.tgz", + "integrity": "sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -18129,13 +18191,13 @@ } }, "node_modules/parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", - "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", + "version": "8.2.0-alpha.2", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.2.0-alpha.2.tgz", + "integrity": "sha512-M4RrnK7ROGLybMKKc9cZpO4/u8K1BhcljG+8q+BniLjo+//o8YqWESsyZ7YcQLqMGtJ2qxqyPJ/ZjseOyk6Ujw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "7.28.6", - "@babel/runtime-corejs3": "7.28.6", + "@babel/runtime-corejs3": "7.29.0", "crypto-js": "4.2.0", "idb-keyval": "6.2.2", "react-native-crypto-js": "1.0.0", @@ -18172,18 +18234,6 @@ "node": ">=6" } }, - "node_modules/parse/node_modules/@babel/runtime-corejs3": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz", - "integrity": "sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.43.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/parse/node_modules/ws": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", @@ -23921,6 +23971,14 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==" }, + "@babel/runtime-corejs3": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz", + "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==", + "requires": { + "core-js-pure": "^3.48.0" + } + }, "@babel/template": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", @@ -25322,6 +25380,35 @@ "npmlog": "7.0.1", "parse": "8.0.3", "web-push": "3.6.7" + }, + "dependencies": { + "@babel/runtime-corejs3": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz", + "integrity": "sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==", + "requires": { + "core-js-pure": "^3.43.0" + } + }, + "parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", + "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", + "requires": { + "@babel/runtime": "7.28.6", + "@babel/runtime-corejs3": "7.28.6", + "crypto-js": "4.2.0", + "idb-keyval": "6.2.2", + "react-native-crypto-js": "1.0.0", + "ws": "8.19.0" + } + }, + "ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "requires": {} + } } }, "@pkgjs/parseargs": { @@ -28546,9 +28633,9 @@ } }, "core-js-pure": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.46.0.tgz", - "integrity": "sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==" + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.48.0.tgz", + "integrity": "sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==" }, "core-util-is": { "version": "1.0.3", @@ -35066,26 +35153,18 @@ } }, "parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", - "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", + "version": "8.2.0-alpha.2", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.2.0-alpha.2.tgz", + "integrity": "sha512-M4RrnK7ROGLybMKKc9cZpO4/u8K1BhcljG+8q+BniLjo+//o8YqWESsyZ7YcQLqMGtJ2qxqyPJ/ZjseOyk6Ujw==", "requires": { "@babel/runtime": "7.28.6", - "@babel/runtime-corejs3": "7.28.6", + "@babel/runtime-corejs3": "7.29.0", "crypto-js": "4.2.0", "idb-keyval": "6.2.2", "react-native-crypto-js": "1.0.0", "ws": "8.19.0" }, "dependencies": { - "@babel/runtime-corejs3": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz", - "integrity": "sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==", - "requires": { - "core-js-pure": "^3.43.0" - } - }, "ws": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", diff --git a/package.json b/package.json index 3861630153..9aa69ebf32 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.0.3", + "parse": "8.2.0-alpha.2", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", From e61e6bff9d0ffc329911117a0279a1fff09496f1 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 18:18:43 +0000 Subject: [PATCH 02/18] parse@8.1.0 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index af6a554edc..719cfa5cc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.2.0-alpha.2", + "parse": "8.1.0", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", @@ -18191,9 +18191,9 @@ } }, "node_modules/parse": { - "version": "8.2.0-alpha.2", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.2.0-alpha.2.tgz", - "integrity": "sha512-M4RrnK7ROGLybMKKc9cZpO4/u8K1BhcljG+8q+BniLjo+//o8YqWESsyZ7YcQLqMGtJ2qxqyPJ/ZjseOyk6Ujw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.1.0.tgz", + "integrity": "sha512-QJvYHrNXXKfo8F9wUPB5eeT8VOTc9tObWuf07dAKgQi3375gC3bejyxIezOh3c6SOmCVpvBL2Ro0jspQbeEgkA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "7.28.6", @@ -35153,9 +35153,9 @@ } }, "parse": { - "version": "8.2.0-alpha.2", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.2.0-alpha.2.tgz", - "integrity": "sha512-M4RrnK7ROGLybMKKc9cZpO4/u8K1BhcljG+8q+BniLjo+//o8YqWESsyZ7YcQLqMGtJ2qxqyPJ/ZjseOyk6Ujw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.1.0.tgz", + "integrity": "sha512-QJvYHrNXXKfo8F9wUPB5eeT8VOTc9tObWuf07dAKgQi3375gC3bejyxIezOh3c6SOmCVpvBL2Ro0jspQbeEgkA==", "requires": { "@babel/runtime": "7.28.6", "@babel/runtime-corejs3": "7.29.0", diff --git a/package.json b/package.json index 9aa69ebf32..c95b8016ea 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.2.0-alpha.2", + "parse": "8.1.0", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", From 6f5ff1e2d051996d422f5f068bae861eb755e95c Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 18:21:32 +0000 Subject: [PATCH 03/18] parse@8.0.4-alpha.1 --- package-lock.json | 54 +++++++++++++++-------------------------------- package.json | 2 +- 2 files changed, 18 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index 719cfa5cc2..add68410a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.1.0", + "parse": "8.0.4-alpha.1", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", @@ -2176,12 +2176,12 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz", - "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz", + "integrity": "sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==", "license": "MIT", "dependencies": { - "core-js-pure": "^3.48.0" + "core-js-pure": "^3.43.0" }, "engines": { "node": ">=6.9.0" @@ -4128,18 +4128,6 @@ "node": "20 || 22 || 24" } }, - "node_modules/@parse/push-adapter/node_modules/@babel/runtime-corejs3": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz", - "integrity": "sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.43.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@parse/push-adapter/node_modules/parse": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", @@ -18191,13 +18179,13 @@ } }, "node_modules/parse": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.1.0.tgz", - "integrity": "sha512-QJvYHrNXXKfo8F9wUPB5eeT8VOTc9tObWuf07dAKgQi3375gC3bejyxIezOh3c6SOmCVpvBL2Ro0jspQbeEgkA==", + "version": "8.0.4-alpha.1", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.4-alpha.1.tgz", + "integrity": "sha512-a+w25Wk74GvOKYdetAVq8wc9cjvGrcANwmr+r07uVCnGiUdC688lbk3r+xjBialipfqTmKAqxogLRJQkMlITUg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "7.28.6", - "@babel/runtime-corejs3": "7.29.0", + "@babel/runtime-corejs3": "7.28.6", "crypto-js": "4.2.0", "idb-keyval": "6.2.2", "react-native-crypto-js": "1.0.0", @@ -23972,11 +23960,11 @@ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==" }, "@babel/runtime-corejs3": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz", - "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz", + "integrity": "sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==", "requires": { - "core-js-pure": "^3.48.0" + "core-js-pure": "^3.43.0" } }, "@babel/template": { @@ -25382,14 +25370,6 @@ "web-push": "3.6.7" }, "dependencies": { - "@babel/runtime-corejs3": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz", - "integrity": "sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==", - "requires": { - "core-js-pure": "^3.43.0" - } - }, "parse": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", @@ -35153,12 +35133,12 @@ } }, "parse": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.1.0.tgz", - "integrity": "sha512-QJvYHrNXXKfo8F9wUPB5eeT8VOTc9tObWuf07dAKgQi3375gC3bejyxIezOh3c6SOmCVpvBL2Ro0jspQbeEgkA==", + "version": "8.0.4-alpha.1", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.4-alpha.1.tgz", + "integrity": "sha512-a+w25Wk74GvOKYdetAVq8wc9cjvGrcANwmr+r07uVCnGiUdC688lbk3r+xjBialipfqTmKAqxogLRJQkMlITUg==", "requires": { "@babel/runtime": "7.28.6", - "@babel/runtime-corejs3": "7.29.0", + "@babel/runtime-corejs3": "7.28.6", "crypto-js": "4.2.0", "idb-keyval": "6.2.2", "react-native-crypto-js": "1.0.0", diff --git a/package.json b/package.json index c95b8016ea..4bf103e93d 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.1.0", + "parse": "8.0.4-alpha.1", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", From 494deeba8681a8b42486fef217a39a453555a91f Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 18:26:49 +0000 Subject: [PATCH 04/18] parse@8.0.3 --- package-lock.json | 73 +++++------------------------------------------ package.json | 2 +- 2 files changed, 8 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index add68410a2..f5f55dde7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.0.4-alpha.1", + "parse": "8.0.3", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", @@ -4128,44 +4128,6 @@ "node": "20 || 22 || 24" } }, - "node_modules/@parse/push-adapter/node_modules/parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", - "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "7.28.6", - "@babel/runtime-corejs3": "7.28.6", - "crypto-js": "4.2.0", - "idb-keyval": "6.2.2", - "react-native-crypto-js": "1.0.0", - "ws": "8.19.0" - }, - "engines": { - "node": ">=20.19.0 <21 || >=22.12.0 <23 || >=24.1.0 <25" - } - }, - "node_modules/@parse/push-adapter/node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -18179,9 +18141,9 @@ } }, "node_modules/parse": { - "version": "8.0.4-alpha.1", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.4-alpha.1.tgz", - "integrity": "sha512-a+w25Wk74GvOKYdetAVq8wc9cjvGrcANwmr+r07uVCnGiUdC688lbk3r+xjBialipfqTmKAqxogLRJQkMlITUg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", + "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "7.28.6", @@ -25368,27 +25330,6 @@ "npmlog": "7.0.1", "parse": "8.0.3", "web-push": "3.6.7" - }, - "dependencies": { - "parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", - "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", - "requires": { - "@babel/runtime": "7.28.6", - "@babel/runtime-corejs3": "7.28.6", - "crypto-js": "4.2.0", - "idb-keyval": "6.2.2", - "react-native-crypto-js": "1.0.0", - "ws": "8.19.0" - } - }, - "ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "requires": {} - } } }, "@pkgjs/parseargs": { @@ -35133,9 +35074,9 @@ } }, "parse": { - "version": "8.0.4-alpha.1", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.4-alpha.1.tgz", - "integrity": "sha512-a+w25Wk74GvOKYdetAVq8wc9cjvGrcANwmr+r07uVCnGiUdC688lbk3r+xjBialipfqTmKAqxogLRJQkMlITUg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", + "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", "requires": { "@babel/runtime": "7.28.6", "@babel/runtime-corejs3": "7.28.6", diff --git a/package.json b/package.json index 4bf103e93d..3861630153 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.0.4-alpha.1", + "parse": "8.0.3", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", From 4faaa8ca75ac4fb669faaad1407601c851ae0155 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 18:55:42 +0000 Subject: [PATCH 05/18] parse@8.0.4-alpha.1 --- package-lock.json | 73 ++++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5f55dde7a..add68410a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.0.3", + "parse": "8.0.4-alpha.1", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", @@ -4128,6 +4128,44 @@ "node": "20 || 22 || 24" } }, + "node_modules/@parse/push-adapter/node_modules/parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", + "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "7.28.6", + "@babel/runtime-corejs3": "7.28.6", + "crypto-js": "4.2.0", + "idb-keyval": "6.2.2", + "react-native-crypto-js": "1.0.0", + "ws": "8.19.0" + }, + "engines": { + "node": ">=20.19.0 <21 || >=22.12.0 <23 || >=24.1.0 <25" + } + }, + "node_modules/@parse/push-adapter/node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -18141,9 +18179,9 @@ } }, "node_modules/parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", - "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", + "version": "8.0.4-alpha.1", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.4-alpha.1.tgz", + "integrity": "sha512-a+w25Wk74GvOKYdetAVq8wc9cjvGrcANwmr+r07uVCnGiUdC688lbk3r+xjBialipfqTmKAqxogLRJQkMlITUg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "7.28.6", @@ -25330,6 +25368,27 @@ "npmlog": "7.0.1", "parse": "8.0.3", "web-push": "3.6.7" + }, + "dependencies": { + "parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", + "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", + "requires": { + "@babel/runtime": "7.28.6", + "@babel/runtime-corejs3": "7.28.6", + "crypto-js": "4.2.0", + "idb-keyval": "6.2.2", + "react-native-crypto-js": "1.0.0", + "ws": "8.19.0" + } + }, + "ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "requires": {} + } } }, "@pkgjs/parseargs": { @@ -35074,9 +35133,9 @@ } }, "parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", - "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", + "version": "8.0.4-alpha.1", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.4-alpha.1.tgz", + "integrity": "sha512-a+w25Wk74GvOKYdetAVq8wc9cjvGrcANwmr+r07uVCnGiUdC688lbk3r+xjBialipfqTmKAqxogLRJQkMlITUg==", "requires": { "@babel/runtime": "7.28.6", "@babel/runtime-corejs3": "7.28.6", diff --git a/package.json b/package.json index 3861630153..4bf103e93d 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.0.3", + "parse": "8.0.4-alpha.1", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", From b26a9580b61e1ed5aff32187c34b76e3a6f912d7 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 19:49:12 +0000 Subject: [PATCH 06/18] parse@8.2.0 --- package-lock.json | 1301 ++++++++++++++++++++++++++++----------------- package.json | 4 +- 2 files changed, 813 insertions(+), 492 deletions(-) diff --git a/package-lock.json b/package-lock.json index add68410a2..a1a1ec7d55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@graphql-tools/schema": "10.0.23", "@graphql-tools/utils": "10.8.6", "@parse/fs-files-adapter": "3.0.0", - "@parse/push-adapter": "8.2.0", + "@parse/push-adapter": "8.3.0", "bcryptjs": "3.0.3", "commander": "14.0.3", "cors": "2.8.6", @@ -38,7 +38,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.0.4-alpha.1", + "parse": "8.2.0", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", @@ -2176,12 +2176,12 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz", - "integrity": "sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz", + "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==", "license": "MIT", "dependencies": { - "core-js-pure": "^3.43.0" + "core-js-pure": "^3.48.0" }, "engines": { "node": ">=6.9.0" @@ -2614,9 +2614,9 @@ } }, "node_modules/@google-cloud/storage": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.18.0.tgz", - "integrity": "sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.19.0.tgz", + "integrity": "sha512-n2FjE7NAOYyshogdc7KQOl/VZb4sneqPjWouSyia9CMDdMhRX5+RIbqalNmC7LOLzuLAN89VlF2HvG8na9G+zQ==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -2626,7 +2626,7 @@ "abort-controller": "^3.0.0", "async-retry": "^1.3.3", "duplexify": "^4.1.3", - "fast-xml-parser": "^4.4.1", + "fast-xml-parser": "^5.3.4", "gaxios": "^6.0.2", "google-auth-library": "^9.6.3", "html-entities": "^2.5.2", @@ -2724,9 +2724,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.2.tgz", - "integrity": "sha512-QzVUtEFyu05UNx2xr0fCQmStUO17uVQhGNowtxs00IgTZT6/W2PBLfUkj30s0FKJ29VtTa3ArVNIhNP6akQhqA==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", + "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -3054,7 +3054,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, + "devOptional": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -3071,7 +3071,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=12" }, @@ -3083,7 +3083,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, + "devOptional": true, "engines": { "node": ">=12" }, @@ -3095,13 +3095,13 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "devOptional": true }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, + "devOptional": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3118,7 +3118,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, + "devOptional": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3133,7 +3133,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, + "devOptional": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -4097,13 +4097,13 @@ "integrity": "sha512-Bb+qLtXQ/1SA2Ck6JLVhfD9JQf6cCwgeDZZJjcIdHzUtdPTFu1hj51xdD7tUCL47Ed2i3aAx6K/M6AjLWYVs3A==" }, "node_modules/@parse/node-apn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@parse/node-apn/-/node-apn-7.0.1.tgz", - "integrity": "sha512-2xBiaznvupLOoXFaxWxcWcqCGlRn9rvqeAQnv8ogL8hZPe1Rd0es+F8ppE7g4QIy5DPJv0R4fruB8amGM6K/qA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@parse/node-apn/-/node-apn-7.1.0.tgz", + "integrity": "sha512-a40P5nScLDi9Pf7koKKkbwI73px0q+iLaKYNrr7kyKJebq/4duGOy3mMevZS0zltn171k3jB5BWCC27dPGsMmw==", "license": "MIT", "dependencies": { "debug": "4.4.3", - "jsonwebtoken": "9.0.2", + "jsonwebtoken": "9.0.3", "node-forge": "1.3.2", "verror": "1.10.1" }, @@ -4111,59 +4111,64 @@ "node": ">=18" } }, - "node_modules/@parse/push-adapter": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@parse/push-adapter/-/push-adapter-8.2.0.tgz", - "integrity": "sha512-z5RB1TwNELNSvummTVP1fgncOT424j13HeKxsGHpAftUmjE+hUtSsIeG49chD0gac22Zmrk+7flYjRwQpUs6+w==", + "node_modules/@parse/node-apn/node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", "license": "MIT", "dependencies": { - "@parse/node-apn": "7.0.1", - "expo-server-sdk": "4.0.0", - "firebase-admin": "13.6.0", - "npmlog": "7.0.1", - "parse": "8.0.3", - "web-push": "3.6.7" + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" }, "engines": { - "node": "20 || 22 || 24" + "node": ">=12", + "npm": ">=6" } }, - "node_modules/@parse/push-adapter/node_modules/parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", - "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", - "license": "Apache-2.0", + "node_modules/@parse/node-apn/node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", "dependencies": { - "@babel/runtime": "7.28.6", - "@babel/runtime-corejs3": "7.28.6", - "crypto-js": "4.2.0", - "idb-keyval": "6.2.2", - "react-native-crypto-js": "1.0.0", - "ws": "8.19.0" - }, - "engines": { - "node": ">=20.19.0 <21 || >=22.12.0 <23 || >=24.1.0 <25" + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "node_modules/@parse/push-adapter/node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "node_modules/@parse/node-apn/node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@parse/push-adapter": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@parse/push-adapter/-/push-adapter-8.3.0.tgz", + "integrity": "sha512-snHVH0j5pqleU3uBUjHCzTR1ex8FFnAaDbKX3Bz+L6w2mLT2Zio2e7fxxrDCorluVBVJvorSsSjgZQsWCXL+Cg==", + "license": "MIT", + "dependencies": { + "@parse/node-apn": "7.1.0", + "expo-server-sdk": "5.0.0", + "firebase-admin": "13.6.1", + "npmlog": "7.0.1", + "parse": "8.2.0", + "web-push": "3.6.7" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": "20 || 22 || 24" } }, "node_modules/@pkgjs/parseargs": { @@ -4697,18 +4702,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/ansi-escapes": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", @@ -4993,19 +4986,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@saithodev/semantic-release-backmerge/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -5493,18 +5473,6 @@ "node": ">=18" } }, - "node_modules/@semantic-release/github/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@semantic-release/github/node_modules/aggregate-error": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", @@ -5568,19 +5536,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/github/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@semantic-release/github/node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", @@ -7199,15 +7154,12 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/aggregate-error": { @@ -7579,7 +7531,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "devOptional": true }, "node_modules/base64-js": { "version": "1.5.1", @@ -7616,9 +7568,10 @@ "license": "Apache-2.0" }, "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", "engines": { "node": "*" } @@ -8862,7 +8815,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, + "devOptional": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -8908,7 +8861,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 12" } @@ -9518,7 +9471,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "devOptional": true }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", @@ -10291,59 +10244,26 @@ } }, "node_modules/expo-server-sdk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/expo-server-sdk/-/expo-server-sdk-4.0.0.tgz", - "integrity": "sha512-zi83XtG2pqyP3gyn1JIRYkydo2i6HU3CYaWo/VvhZG/F29U+QIDv6LBEUsWf4ddZlVE7c9WN1N8Be49rHgO8OQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/expo-server-sdk/-/expo-server-sdk-5.0.0.tgz", + "integrity": "sha512-GEp1XYLU80iS/hdRo3c2n092E8TgTXcHSuw6Lw68dSoWaAgiLPI2R+e5hp5+hGF1TtJZOi2nxtJX63+XA3iz9g==", "license": "MIT", "dependencies": { - "node-fetch": "^2.6.0", "promise-limit": "^2.7.0", - "promise-retry": "^2.0.1" + "promise-retry": "^2.0.1", + "undici": "^7.2.0" }, "engines": { "node": ">=20" } }, - "node_modules/expo-server-sdk/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/expo-server-sdk/node_modules/undici": { + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", + "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/expo-server-sdk/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/expo-server-sdk/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/expo-server-sdk/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "node": ">=20.18.1" } }, "node_modules/express": { @@ -10427,7 +10347,8 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" }, "node_modules/extract-files": { "version": "13.0.0", @@ -10512,9 +10433,9 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.7.tgz", + "integrity": "sha512-JzVLro9NQv92pOM/jTCR6mHlJh2FGwtomH8ZQjhFj/R29P2Fnj38OgPJVtcvYw6SuKClhgYuwUZf5b3rd8u2mA==", "funding": [ { "type": "github", @@ -10524,7 +10445,7 @@ "license": "MIT", "optional": true, "dependencies": { - "strnum": "^1.1.1" + "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" @@ -10570,7 +10491,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -10893,9 +10814,9 @@ } }, "node_modules/firebase-admin": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.6.0.tgz", - "integrity": "sha512-GdPA/t0+Cq8p1JnjFRBmxRxAGvF/kl2yfdhALl38PrRp325YxyQ5aNaHui0XmaKcKiGRFIJ/EgBNWFoDP0onjw==", + "version": "13.6.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.6.1.tgz", + "integrity": "sha512-Zgc6yPtmPxAZo+FoK6LMG6zpSEsoSK8ifIR+IqF4oWuC3uWZU40OjxgfLTSFcsRlj/k/wD66zNv2UiTRreCNSw==", "license": "Apache-2.0", "dependencies": { "@fastify/busboy": "^3.0.0", @@ -11020,7 +10941,7 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, + "devOptional": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -11227,28 +11148,6 @@ "node": ">=14" } }, - "node_modules/gaxios/node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/gaxios/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/gaxios/node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -11304,6 +11203,170 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/gcp-metadata": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", + "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/gcp-metadata/node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gcp-metadata/node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gcp-metadata/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gcp-metadata/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "optional": true, + "peer": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/gcp-metadata/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/gcp-metadata/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gcp-metadata/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -11598,6 +11661,15 @@ "node": ">=14" } }, + "node_modules/google-auth-library/node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/google-auth-library/node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -11613,6 +11685,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" @@ -11703,10 +11776,12 @@ } }, "node_modules/google-logging-utils": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">=14" } @@ -11855,6 +11930,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" @@ -12113,18 +12189,6 @@ "node": ">= 14" } }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/http2-wrapper": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", @@ -12140,16 +12204,16 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -12559,7 +12623,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "devOptional": true }, "node_modules/issue-parser": { "version": "7.0.1", @@ -12747,7 +12811,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, + "devOptional": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -12989,6 +13053,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", "dependencies": { "bignumber.js": "^9.0.0" } @@ -14360,7 +14425,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -14599,6 +14664,21 @@ "mongodb-runner": "bin/runner.js" } }, + "node_modules/mongodb-runner/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/mongodb-runner/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -14655,6 +14735,56 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/mongodb-runner/node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-runner/node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-runner/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/mongodb-runner/node_modules/mongodb": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.21.0.tgz", @@ -14701,6 +14831,60 @@ } } }, + "node_modules/mongodb-runner/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/mongodb-runner/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/mongodb-runner/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true + }, + "node_modules/mongodb-runner/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/mongodb-runner/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -14869,7 +15053,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -18154,7 +18338,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "devOptional": true }, "node_modules/param-case": { "version": "3.0.4", @@ -18179,13 +18363,13 @@ } }, "node_modules/parse": { - "version": "8.0.4-alpha.1", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.4-alpha.1.tgz", - "integrity": "sha512-a+w25Wk74GvOKYdetAVq8wc9cjvGrcANwmr+r07uVCnGiUdC688lbk3r+xjBialipfqTmKAqxogLRJQkMlITUg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.2.0.tgz", + "integrity": "sha512-jSx4zIqCja6O2HKhkzZ6JTm4fBUQS6sQpvFCAsqzaU4XlEhoRLm9mM1tZeYhvxTVA6zymvj/EJZ4YDOXCTRbmA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "7.28.6", - "@babel/runtime-corejs3": "7.28.6", + "@babel/runtime-corejs3": "7.29.0", "crypto-js": "4.2.0", "idb-keyval": "6.2.2", "react-native-crypto-js": "1.0.0", @@ -18307,7 +18491,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -18322,7 +18506,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, + "devOptional": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -20244,7 +20428,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "devOptional": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -20256,7 +20440,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -20688,7 +20872,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "devOptional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -20737,7 +20921,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "devOptional": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -20786,9 +20970,9 @@ } }, "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", "funding": [ { "type": "github", @@ -21035,6 +21219,19 @@ "node": ">=14" } }, + "node_modules/teeny-request/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/teeny-request/node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -21050,6 +21247,20 @@ "node": ">= 6" } }, + "node_modules/teeny-request/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/teeny-request/node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -22029,29 +22240,6 @@ "node": ">= 16" } }, - "node_modules/web-push/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/web-push/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/web-push/node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -22075,7 +22263,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 8" } @@ -22136,7 +22324,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "devOptional": true, "dependencies": { "isexe": "^2.0.0" }, @@ -22300,7 +22488,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "devOptional": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -22317,7 +22505,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -22332,7 +22520,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -22344,7 +22532,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "devOptional": true }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", @@ -23960,11 +24148,11 @@ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==" }, "@babel/runtime-corejs3": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.6.tgz", - "integrity": "sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz", + "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==", "requires": { - "core-js-pure": "^3.43.0" + "core-js-pure": "^3.48.0" } }, "@babel/template": { @@ -24282,9 +24470,9 @@ "optional": true }, "@google-cloud/storage": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.18.0.tgz", - "integrity": "sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.19.0.tgz", + "integrity": "sha512-n2FjE7NAOYyshogdc7KQOl/VZb4sneqPjWouSyia9CMDdMhRX5+RIbqalNmC7LOLzuLAN89VlF2HvG8na9G+zQ==", "optional": true, "requires": { "@google-cloud/paginator": "^5.0.0", @@ -24293,7 +24481,7 @@ "abort-controller": "^3.0.0", "async-retry": "^1.3.3", "duplexify": "^4.1.3", - "fast-xml-parser": "^4.4.1", + "fast-xml-parser": "^5.3.4", "gaxios": "^6.0.2", "google-auth-library": "^9.6.3", "html-entities": "^2.5.2", @@ -24356,9 +24544,9 @@ "requires": {} }, "@grpc/grpc-js": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.2.tgz", - "integrity": "sha512-QzVUtEFyu05UNx2xr0fCQmStUO17uVQhGNowtxs00IgTZT6/W2PBLfUkj30s0FKJ29VtTa3ArVNIhNP6akQhqA==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", + "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", "optional": true, "requires": { "@grpc/proto-loader": "^0.8.0", @@ -24579,7 +24767,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, + "devOptional": true, "requires": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -24593,25 +24781,25 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true + "devOptional": true }, "ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true + "devOptional": true }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "devOptional": true }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, + "devOptional": true, "requires": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -24622,7 +24810,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, + "devOptional": true, "requires": { "ansi-regex": "^6.0.1" } @@ -24631,7 +24819,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, + "devOptional": true, "requires": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -25347,50 +25535,67 @@ "integrity": "sha512-Bb+qLtXQ/1SA2Ck6JLVhfD9JQf6cCwgeDZZJjcIdHzUtdPTFu1hj51xdD7tUCL47Ed2i3aAx6K/M6AjLWYVs3A==" }, "@parse/node-apn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@parse/node-apn/-/node-apn-7.0.1.tgz", - "integrity": "sha512-2xBiaznvupLOoXFaxWxcWcqCGlRn9rvqeAQnv8ogL8hZPe1Rd0es+F8ppE7g4QIy5DPJv0R4fruB8amGM6K/qA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@parse/node-apn/-/node-apn-7.1.0.tgz", + "integrity": "sha512-a40P5nScLDi9Pf7koKKkbwI73px0q+iLaKYNrr7kyKJebq/4duGOy3mMevZS0zltn171k3jB5BWCC27dPGsMmw==", "requires": { "debug": "4.4.3", - "jsonwebtoken": "9.0.2", + "jsonwebtoken": "9.0.3", "node-forge": "1.3.2", "verror": "1.10.1" - } - }, - "@parse/push-adapter": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@parse/push-adapter/-/push-adapter-8.2.0.tgz", - "integrity": "sha512-z5RB1TwNELNSvummTVP1fgncOT424j13HeKxsGHpAftUmjE+hUtSsIeG49chD0gac22Zmrk+7flYjRwQpUs6+w==", - "requires": { - "@parse/node-apn": "7.0.1", - "expo-server-sdk": "4.0.0", - "firebase-admin": "13.6.0", - "npmlog": "7.0.1", - "parse": "8.0.3", - "web-push": "3.6.7" }, "dependencies": { - "parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.3.tgz", - "integrity": "sha512-WQPrnfnXy6/p25OFD6qOAVK9hIhhU882Nw1AW5RjAJbO2G7YqChJxBgL94aexsaTnP9ajVzjGISSQ+mESrkMIA==", + "jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", "requires": { - "@babel/runtime": "7.28.6", - "@babel/runtime-corejs3": "7.28.6", - "crypto-js": "4.2.0", - "idb-keyval": "6.2.2", - "react-native-crypto-js": "1.0.0", - "ws": "8.19.0" + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" } }, - "ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "requires": {} + "jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "requires": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "requires": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } } } }, + "@parse/push-adapter": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@parse/push-adapter/-/push-adapter-8.3.0.tgz", + "integrity": "sha512-snHVH0j5pqleU3uBUjHCzTR1ex8FFnAaDbKX3Bz+L6w2mLT2Zio2e7fxxrDCorluVBVJvorSsSjgZQsWCXL+Cg==", + "requires": { + "@parse/node-apn": "7.1.0", + "expo-server-sdk": "5.0.0", + "firebase-admin": "13.6.1", + "npmlog": "7.0.1", + "parse": "8.2.0", + "web-push": "3.6.7" + } + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -25803,15 +26008,6 @@ } } }, - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, "ansi-escapes": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", @@ -25999,16 +26195,6 @@ } } }, - "https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - }, "human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -26344,15 +26530,6 @@ "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true }, - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, "aggregate-error": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", @@ -26392,16 +26569,6 @@ "unicorn-magic": "^0.1.0" } }, - "https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - }, "indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", @@ -27489,13 +27656,9 @@ "requires": {} }, "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "requires": { - "debug": "4" - } + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" }, "aggregate-error": { "version": "3.1.0", @@ -27778,7 +27941,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "devOptional": true }, "base64-js": { "version": "1.5.1", @@ -27797,9 +27960,9 @@ "dev": true }, "bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==" }, "binary-extensions": { "version": "2.2.0", @@ -28665,7 +28828,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, + "devOptional": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -28698,7 +28861,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true + "devOptional": true }, "debug": { "version": "4.4.3", @@ -29143,7 +29306,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "devOptional": true }, "ecdsa-sig-formatter": { "version": "1.0.11", @@ -29674,41 +29837,19 @@ } }, "expo-server-sdk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/expo-server-sdk/-/expo-server-sdk-4.0.0.tgz", - "integrity": "sha512-zi83XtG2pqyP3gyn1JIRYkydo2i6HU3CYaWo/VvhZG/F29U+QIDv6LBEUsWf4ddZlVE7c9WN1N8Be49rHgO8OQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/expo-server-sdk/-/expo-server-sdk-5.0.0.tgz", + "integrity": "sha512-GEp1XYLU80iS/hdRo3c2n092E8TgTXcHSuw6Lw68dSoWaAgiLPI2R+e5hp5+hGF1TtJZOi2nxtJX63+XA3iz9g==", "requires": { - "node-fetch": "^2.6.0", "promise-limit": "^2.7.0", - "promise-retry": "^2.0.1" + "promise-retry": "^2.0.1", + "undici": "^7.2.0" }, "dependencies": { - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } + "undici": { + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", + "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==" } } }, @@ -29831,12 +29972,12 @@ "dev": true }, "fast-xml-parser": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.7.tgz", + "integrity": "sha512-JzVLro9NQv92pOM/jTCR6mHlJh2FGwtomH8ZQjhFj/R29P2Fnj38OgPJVtcvYw6SuKClhgYuwUZf5b3rd8u2mA==", "optional": true, "requires": { - "strnum": "^1.1.1" + "strnum": "^2.1.2" } }, "fastq": { @@ -29874,7 +30015,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, + "devOptional": true, "requires": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -30089,9 +30230,9 @@ } }, "firebase-admin": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.6.0.tgz", - "integrity": "sha512-GdPA/t0+Cq8p1JnjFRBmxRxAGvF/kl2yfdhALl38PrRp325YxyQ5aNaHui0XmaKcKiGRFIJ/EgBNWFoDP0onjw==", + "version": "13.6.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.6.1.tgz", + "integrity": "sha512-Zgc6yPtmPxAZo+FoK6LMG6zpSEsoSK8ifIR+IqF4oWuC3uWZU40OjxgfLTSFcsRlj/k/wD66zNv2UiTRreCNSw==", "requires": { "@fastify/busboy": "^3.0.0", "@firebase/database-compat": "^2.0.0", @@ -30175,7 +30316,7 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, + "devOptional": true, "requires": { "fetch-blob": "^3.1.2" } @@ -30318,20 +30459,6 @@ "uuid": "^9.0.1" }, "dependencies": { - "agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" - }, - "https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "requires": { - "agent-base": "^7.1.2", - "debug": "4" - } - }, "node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -30366,6 +30493,115 @@ } } }, + "gcp-metadata": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", + "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", + "optional": true, + "peer": true, + "requires": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "optional": true, + "peer": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "optional": true, + "peer": true, + "requires": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + } + }, + "gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "optional": true, + "peer": true, + "requires": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + } + }, + "glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "optional": true, + "peer": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "optional": true, + "peer": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "optional": true, + "peer": true + }, + "node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "optional": true, + "peer": true, + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, + "rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "optional": true, + "peer": true, + "requires": { + "glob": "^10.3.7" + } + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "optional": true, + "peer": true + } + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -30583,6 +30819,11 @@ "json-bigint": "^1.0.0" } }, + "google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==" + }, "jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -30664,9 +30905,11 @@ } }, "google-logging-utils": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "optional": true, + "peer": true }, "gopd": { "version": "1.2.0", @@ -30939,17 +31182,6 @@ "requires": { "agent-base": "^7.1.0", "debug": "^4.3.4" - }, - "dependencies": { - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - } } }, "http2-wrapper": { @@ -30963,12 +31195,11 @@ } }, "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "requires": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" } }, @@ -31241,7 +31472,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "devOptional": true }, "issue-parser": { "version": "7.0.1", @@ -31388,7 +31619,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, + "devOptional": true, "requires": { "@isaacs/cliui": "^8.0.2", "@pkgjs/parseargs": "^0.11.0" @@ -32560,7 +32791,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true + "devOptional": true }, "minizlib": { "version": "2.1.2", @@ -32728,6 +32959,17 @@ "yargs": "^17.7.2" }, "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "debug": "4" + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -32769,6 +33011,44 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + } + }, + "gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "mongodb": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.21.0.tgz", @@ -32780,6 +33060,45 @@ "mongodb-connection-string-url": "^3.0.2" } }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "optional": true, + "peer": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "optional": true, + "peer": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -32890,7 +33209,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true + "devOptional": true }, "node-emoji": { "version": "2.2.0", @@ -35111,7 +35430,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "devOptional": true }, "param-case": { "version": "3.0.4", @@ -35133,12 +35452,12 @@ } }, "parse": { - "version": "8.0.4-alpha.1", - "resolved": "https://registry.npmjs.org/parse/-/parse-8.0.4-alpha.1.tgz", - "integrity": "sha512-a+w25Wk74GvOKYdetAVq8wc9cjvGrcANwmr+r07uVCnGiUdC688lbk3r+xjBialipfqTmKAqxogLRJQkMlITUg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-8.2.0.tgz", + "integrity": "sha512-jSx4zIqCja6O2HKhkzZ6JTm4fBUQS6sQpvFCAsqzaU4XlEhoRLm9mM1tZeYhvxTVA6zymvj/EJZ4YDOXCTRbmA==", "requires": { "@babel/runtime": "7.28.6", - "@babel/runtime-corejs3": "7.28.6", + "@babel/runtime-corejs3": "7.29.0", "crypto-js": "4.2.0", "idb-keyval": "6.2.2", "react-native-crypto-js": "1.0.0", @@ -35225,7 +35544,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "devOptional": true }, "path-parse": { "version": "1.0.7", @@ -35237,7 +35556,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, + "devOptional": true, "requires": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -36552,7 +36871,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "devOptional": true, "requires": { "shebang-regex": "^3.0.0" } @@ -36561,7 +36880,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "devOptional": true }, "showdown": { "version": "2.1.0", @@ -36890,7 +37209,7 @@ "version": "npm:string-width@4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "devOptional": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -36928,7 +37247,7 @@ "version": "npm:strip-ansi@6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "devOptional": true, "requires": { "ansi-regex": "^5.0.1" } @@ -36961,9 +37280,9 @@ "dev": true }, "strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", "optional": true }, "stubs": { @@ -37132,6 +37451,15 @@ "uuid": "^9.0.0" }, "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "requires": { + "debug": "4" + } + }, "http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -37143,6 +37471,16 @@ "debug": "4" } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -37806,23 +38144,6 @@ "minimist": "^1.2.5" }, "dependencies": { - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "requires": { - "debug": "^4.3.4" - } - }, - "https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - }, "jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -37848,7 +38169,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true + "devOptional": true }, "webidl-conversions": { "version": "7.0.0", @@ -37888,7 +38209,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "devOptional": true, "requires": { "isexe": "^2.0.0" } @@ -38042,7 +38363,7 @@ "version": "npm:wrap-ansi@7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "devOptional": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -38053,7 +38374,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "devOptional": true, "requires": { "color-convert": "^2.0.1" } @@ -38062,7 +38383,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "devOptional": true, "requires": { "color-name": "~1.1.4" } @@ -38071,7 +38392,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "devOptional": true } } }, diff --git a/package.json b/package.json index 4bf103e93d..9a67b990a6 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@graphql-tools/schema": "10.0.23", "@graphql-tools/utils": "10.8.6", "@parse/fs-files-adapter": "3.0.0", - "@parse/push-adapter": "8.2.0", + "@parse/push-adapter": "8.3.0", "bcryptjs": "3.0.3", "commander": "14.0.3", "cors": "2.8.6", @@ -48,7 +48,7 @@ "mongodb": "7.0.0", "mustache": "4.2.0", "otpauth": "9.4.0", - "parse": "8.0.4-alpha.1", + "parse": "8.2.0", "path-to-regexp": "8.3.0", "pg-monitor": "3.1.0", "pg-promise": "12.6.0", From 4fd61cc3edf4d0ea4ef3ea73e5acce2308980dc6 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 20:39:39 +0000 Subject: [PATCH 07/18] feat --- spec/GridFSBucketStorageAdapter.spec.js | 25 +++ spec/ParseFile.spec.js | 261 ++++++++++++++++++++++ spec/Utils.spec.js | 63 ++++++ src/Adapters/Files/FilesAdapter.js | 12 +- src/Adapters/Files/GridFSBucketAdapter.js | 30 +++ src/Controllers/AdaptableController.js | 5 + src/Controllers/FilesController.js | 10 + src/Routers/FilesRouter.js | 226 +++++++++++++++++-- src/Utils.js | 31 +++ 9 files changed, 649 insertions(+), 14 deletions(-) diff --git a/spec/GridFSBucketStorageAdapter.spec.js b/spec/GridFSBucketStorageAdapter.spec.js index 57f94c2dab..6a274125bc 100644 --- a/spec/GridFSBucketStorageAdapter.spec.js +++ b/spec/GridFSBucketStorageAdapter.spec.js @@ -476,6 +476,31 @@ describe_only_db('mongo')('GridFSBucket', () => { } }); + it('reports supportsStreaming as true', () => { + const gfsAdapter = new GridFSBucketAdapter(databaseURI); + expect(gfsAdapter.supportsStreaming).toBe(true); + }); + + it('creates file from Readable stream', async () => { + const { Readable } = require('stream'); + const gfsAdapter = new GridFSBucketAdapter(databaseURI); + const data = Buffer.from('streamed file content'); + const stream = Readable.from(data); + await gfsAdapter.createFile('streamFile.txt', stream); + const result = await gfsAdapter.getFileData('streamFile.txt'); + expect(result.toString('utf8')).toBe('streamed file content'); + }); + + it('creates encrypted file from Readable stream (buffers for encryption)', async () => { + const { Readable } = require('stream'); + const gfsAdapter = new GridFSBucketAdapter(databaseURI, {}, 'test-encryption-key'); + const data = Buffer.from('encrypted streamed content'); + const stream = Readable.from(data); + await gfsAdapter.createFile('encryptedStream.txt', stream); + const result = await gfsAdapter.getFileData('encryptedStream.txt'); + expect(result.toString('utf8')).toBe('encrypted streamed content'); + }); + describe('MongoDB Client Metadata', () => { it('should not pass metadata to MongoClient by default', async () => { const gfsAdapter = new GridFSBucketAdapter(databaseURI); diff --git a/spec/ParseFile.spec.js b/spec/ParseFile.spec.js index 46496a0768..73b8dd1b5b 100644 --- a/spec/ParseFile.spec.js +++ b/spec/ParseFile.spec.js @@ -1878,4 +1878,265 @@ describe('Parse.File testing', () => { ).toBeRejectedWith(jasmine.objectContaining({ status: 400 })); }); }); + + describe('streaming binary uploads', () => { + describe('createSizeLimitedStream', () => { + const { createSizeLimitedStream } = require('../lib/Routers/FilesRouter'); + const { Readable } = require('stream'); + + it('passes data through when under limit', async () => { + const input = Readable.from(Buffer.from('hello')); + const limited = createSizeLimitedStream(input, 100); + const chunks = []; + for await (const chunk of limited) { + chunks.push(chunk); + } + expect(Buffer.concat(chunks).toString()).toBe('hello'); + }); + + it('destroys stream when data exceeds limit', async () => { + const input = Readable.from(Buffer.from('hello world, this is too long')); + const limited = createSizeLimitedStream(input, 5); + const chunks = []; + try { + for await (const chunk of limited) { + chunks.push(chunk); + } + fail('should have thrown'); + } catch (e) { + expect(e.message).toContain('exceeds'); + } + }); + + it('passes through when Content-Length is within limit', async () => { + const input = Readable.from(Buffer.from('hi')); + input.headers = { 'content-length': '2' }; + const limited = createSizeLimitedStream(input, 100); + const chunks = []; + for await (const chunk of limited) { + chunks.push(chunk); + } + expect(Buffer.concat(chunks).toString()).toBe('hi'); + }); + }); + + it('streams binary upload with X-Parse-Upload-Mode header', async () => { + const headers = { + 'Content-Type': 'application/octet-stream', + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest', + 'X-Parse-Upload-Mode': 'stream', + }; + let response; + try { + response = await request({ + method: 'POST', + headers: headers, + url: 'http://localhost:8378/1/files/stream-test.txt', + body: 'streaming file content', + }); + } catch (e) { + fail('Request failed: status=' + e.status + ' text=' + e.text + ' data=' + JSON.stringify(e.data)); + return; + } + const b = response.data; + expect(b.name).toMatch(/_stream-test.txt$/); + expect(b.url).toMatch(/stream-test\.txt$/); + const getResponse = await request({ url: b.url }); + expect(getResponse.text).toEqual('streaming file content'); + }); + + it('uses buffered path without X-Parse-Upload-Mode header', async () => { + const headers = { + 'Content-Type': 'application/octet-stream', + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest', + }; + const response = await request({ + method: 'POST', + headers: headers, + url: 'http://localhost:8378/1/files/buffered-test.txt', + body: 'buffered file content', + }); + const b = response.data; + expect(b.name).toMatch(/_buffered-test.txt$/); + const getResponse = await request({ url: b.url }); + expect(getResponse.text).toEqual('buffered file content'); + }); + + it('rejects streaming upload exceeding size limit', async () => { + await reconfigureServer({ maxUploadSize: '10b' }); + const headers = { + 'Content-Type': 'application/octet-stream', + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest', + 'X-Parse-Upload-Mode': 'stream', + }; + try { + await request({ + method: 'POST', + headers: headers, + url: 'http://localhost:8378/1/files/big-file.txt', + body: 'this content is definitely longer than 10 bytes', + }); + fail('should have thrown'); + } catch (response) { + expect(response.data.code).toBe(Parse.Error.FILE_SAVE_ERROR); + expect(response.data.error).toContain('exceeds'); + } + }); + + it('rejects streaming upload with Content-Length exceeding limit', async () => { + await reconfigureServer({ maxUploadSize: '10b' }); + const headers = { + 'Content-Type': 'application/octet-stream', + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest', + 'X-Parse-Upload-Mode': 'stream', + 'Content-Length': '99999', + }; + try { + await request({ + method: 'POST', + headers: headers, + url: 'http://localhost:8378/1/files/big-file.txt', + body: 'hi', + }); + fail('should have thrown'); + } catch (response) { + expect(response.data.code).toBe(Parse.Error.FILE_SAVE_ERROR); + expect(response.data.error).toContain('exceeds'); + } + }); + + it('fires beforeSave trigger with request.stream = true on streaming upload', async () => { + let receivedStream; + let receivedData; + Parse.Cloud.beforeSave(Parse.File, (request) => { + receivedStream = request.stream; + receivedData = request.file._data; + request.file.addMetadata('source', 'stream'); + request.file.addTag('env', 'test'); + }); + const headers = { + 'Content-Type': 'application/octet-stream', + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest', + 'X-Parse-Upload-Mode': 'stream', + }; + const response = await request({ + method: 'POST', + headers: headers, + url: 'http://localhost:8378/1/files/trigger-test.txt', + body: 'trigger test content', + }); + expect(response.data.name).toMatch(/_trigger-test.txt$/); + expect(receivedStream).toBe(true); + expect(receivedData).toBeFalsy(); + const getResponse = await request({ url: response.data.url }); + expect(getResponse.text).toEqual('trigger test content'); + }); + + it('rejects streaming upload when beforeSave trigger throws', async () => { + Parse.Cloud.beforeSave(Parse.File, () => { + throw new Parse.Error(Parse.Error.SCRIPT_FAILED, 'Upload rejected'); + }); + const headers = { + 'Content-Type': 'application/octet-stream', + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest', + 'X-Parse-Upload-Mode': 'stream', + }; + try { + await request({ + method: 'POST', + headers: headers, + url: 'http://localhost:8378/1/files/rejected.txt', + body: 'rejected content', + }); + fail('should have thrown'); + } catch (response) { + expect(response.data.code).toBe(Parse.Error.SCRIPT_FAILED); + expect(response.data.error).toBe('Upload rejected'); + } + }); + + it('skips save when beforeSave trigger returns Parse.File with URL on streaming upload', async () => { + Parse.Cloud.beforeSave(Parse.File, () => { + const file = new Parse.File('existing.txt'); + file._url = 'http://example.com/existing.txt'; + return file; + }); + const headers = { + 'Content-Type': 'application/octet-stream', + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest', + 'X-Parse-Upload-Mode': 'stream', + }; + const response = await request({ + method: 'POST', + headers: headers, + url: 'http://localhost:8378/1/files/skip-save.txt', + body: 'should not be saved', + }); + expect(response.data.url).toBe('http://example.com/existing.txt'); + expect(response.data.name).toBe('existing.txt'); + }); + + it('fires afterSave trigger with request.stream = true on streaming upload', async () => { + let afterSaveStream; + let afterSaveData; + let afterSaveUrl; + Parse.Cloud.afterSave(Parse.File, (request) => { + afterSaveStream = request.stream; + afterSaveData = request.file._data; + afterSaveUrl = request.file._url; + }); + const headers = { + 'Content-Type': 'application/octet-stream', + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest', + 'X-Parse-Upload-Mode': 'stream', + }; + const response = await request({ + method: 'POST', + headers: headers, + url: 'http://localhost:8378/1/files/after-save.txt', + body: 'after save content', + }); + expect(response.data.name).toMatch(/_after-save.txt$/); + expect(afterSaveStream).toBe(true); + expect(afterSaveData).toBeFalsy(); + expect(afterSaveUrl).toBeTruthy(); + }); + + it('verifies FilesAdapter default supportsStreaming is false', () => { + const { FilesAdapter } = require('../lib/Adapters/Files/FilesAdapter'); + const adapter = new FilesAdapter(); + expect(adapter.supportsStreaming).toBe(false); + }); + + it('legacy JSON-wrapped upload still works', async () => { + await reconfigureServer({ + fileUpload: { + enableForPublic: true, + fileExtensions: ['*'], + }, + }); + const response = await request({ + method: 'POST', + url: 'http://localhost:8378/1/files/legacy.txt', + body: JSON.stringify({ + _ApplicationId: 'test', + _JavaScriptKey: 'test', + _ContentType: 'text/plain', + base64: Buffer.from('legacy content').toString('base64'), + }), + }); + const b = response.data; + expect(b.name).toMatch(/_legacy.txt$/); + const getResponse = await request({ url: b.url }); + expect(getResponse.text).toEqual('legacy content'); + }); + }); }); diff --git a/spec/Utils.spec.js b/spec/Utils.spec.js index a473064376..26056036f3 100644 --- a/spec/Utils.spec.js +++ b/spec/Utils.spec.js @@ -175,6 +175,69 @@ describe('Utils', () => { }); }); + describe('parseSizeToBytes', () => { + it('parses megabyte string', () => { + expect(Utils.parseSizeToBytes('20mb')).toBe(20 * 1024 * 1024); + }); + + it('parses Mb string (case-insensitive)', () => { + expect(Utils.parseSizeToBytes('20Mb')).toBe(20 * 1024 * 1024); + }); + + it('parses kilobyte string', () => { + expect(Utils.parseSizeToBytes('512kb')).toBe(512 * 1024); + }); + + it('parses gigabyte string', () => { + expect(Utils.parseSizeToBytes('1gb')).toBe(1 * 1024 * 1024 * 1024); + }); + + it('parses bytes suffix', () => { + expect(Utils.parseSizeToBytes('100b')).toBe(100); + }); + + it('parses plain number as bytes', () => { + expect(Utils.parseSizeToBytes(1048576)).toBe(1048576); + }); + + it('parses numeric string as bytes', () => { + expect(Utils.parseSizeToBytes('1048576')).toBe(1048576); + }); + + it('parses decimal value and floors result', () => { + expect(Utils.parseSizeToBytes('1.5mb')).toBe(Math.floor(1.5 * 1024 * 1024)); + }); + + it('trims whitespace around value', () => { + expect(Utils.parseSizeToBytes(' 20mb ')).toBe(20 * 1024 * 1024); + }); + + it('allows whitespace between number and unit', () => { + expect(Utils.parseSizeToBytes('20 mb')).toBe(20 * 1024 * 1024); + }); + + it('parses zero', () => { + expect(Utils.parseSizeToBytes('0')).toBe(0); + expect(Utils.parseSizeToBytes(0)).toBe(0); + }); + + it('throws on invalid string', () => { + expect(() => Utils.parseSizeToBytes('abc')).toThrow(); + }); + + it('throws on negative value', () => { + expect(() => Utils.parseSizeToBytes('-5mb')).toThrow(); + }); + + it('throws on empty string', () => { + expect(() => Utils.parseSizeToBytes('')).toThrow(); + }); + + it('throws on unsupported unit', () => { + expect(() => Utils.parseSizeToBytes('10tb')).toThrow(); + }); + }); + describe('createSanitizedError', () => { it('should return "Permission denied" when enableSanitizedErrorResponse is true', () => { const config = { enableSanitizedErrorResponse: true }; diff --git a/src/Adapters/Files/FilesAdapter.js b/src/Adapters/Files/FilesAdapter.js index 0e9b555853..0ada581069 100644 --- a/src/Adapters/Files/FilesAdapter.js +++ b/src/Adapters/Files/FilesAdapter.js @@ -26,7 +26,7 @@ export class FilesAdapter { /** Responsible for storing the file in order to be retrieved later by its filename * * @param {string} filename - the filename to save - * @param {*} data - the buffer of data from the file + * @param {Buffer|import('stream').Readable} data - the file data as a Buffer, or a Readable stream if the adapter supports streaming (see supportsStreaming) * @param {string} contentType - the supposed contentType * @discussion the contentType can be undefined if the controller was not able to determine it * @param {object} options - (Optional) options to be passed to file adapter (S3 File Adapter Only) @@ -38,6 +38,16 @@ export class FilesAdapter { */ createFile(filename: string, data, contentType: string, options: Object): Promise {} + /** Whether this adapter supports receiving Readable streams in createFile(). + * If false (default), streams are buffered to a Buffer before being passed. + * Override and return true to receive Readable streams directly. + * + * @return {boolean} + */ + get supportsStreaming() { + return false; + } + /** Responsible for deleting the specified file * * @param {string} filename - the filename to delete diff --git a/src/Adapters/Files/GridFSBucketAdapter.js b/src/Adapters/Files/GridFSBucketAdapter.js index 8e1a849030..18c4eaa3d6 100644 --- a/src/Adapters/Files/GridFSBucketAdapter.js +++ b/src/Adapters/Files/GridFSBucketAdapter.js @@ -45,6 +45,10 @@ export class GridFSBucketAdapter extends FilesAdapter { this._mongoOptions = _mongoOptions; } + get supportsStreaming() { + return true; + } + _connect() { if (!this._connectionPromise) { // Only use driverInfo if clientMetadata option is set @@ -77,6 +81,32 @@ export class GridFSBucketAdapter extends FilesAdapter { const stream = await bucket.openUploadStream(filename, { metadata: options.metadata, }); + + // If data is a stream and encryption is enabled, buffer first + // (AES-256-GCM needs complete data for format: [encrypted][IV][authTag]) + if (typeof data?.pipe === 'function' && this._encryptionKey !== null) { + data = await new Promise((resolve, reject) => { + const chunks = []; + data.on('data', chunk => chunks.push(chunk)); + data.on('end', () => resolve(Buffer.concat(chunks))); + data.on('error', reject); + }); + } + + if (typeof data?.pipe === 'function') { + // Pipe readable stream directly into GridFS upload stream + return new Promise((resolve, reject) => { + data.pipe(stream); + stream.on('finish', resolve); + stream.on('error', reject); + data.on('error', (err) => { + stream.destroy(err); + reject(err); + }); + }); + } + + // Buffer path (existing behavior) if (this._encryptionKey !== null) { try { const iv = crypto.randomBytes(16); diff --git a/src/Controllers/AdaptableController.js b/src/Controllers/AdaptableController.js index 15551a6e38..610b48b3fd 100644 --- a/src/Controllers/AdaptableController.js +++ b/src/Controllers/AdaptableController.js @@ -48,6 +48,11 @@ export class AdaptableController { // Makes sure the prototype matches const mismatches = Object.getOwnPropertyNames(Type.prototype).reduce((obj, key) => { + // Skip getters — they provide optional defaults that adapters don't need to implement + const descriptor = Object.getOwnPropertyDescriptor(Type.prototype, key); + if (descriptor && typeof descriptor.get === 'function') { + return obj; + } const adapterType = typeof adapter[key]; const expectedType = typeof Type.prototype[key]; if (adapterType !== expectedType) { diff --git a/src/Controllers/FilesController.js b/src/Controllers/FilesController.js index a88c527b00..fa11386ea8 100644 --- a/src/Controllers/FilesController.js +++ b/src/Controllers/FilesController.js @@ -29,6 +29,16 @@ export class FilesController extends AdaptableController { filename = randomHexString(32) + '_' + filename; } + // Fallback: buffer stream for adapters that don't support streaming + if (typeof data?.pipe === 'function' && !this.adapter.supportsStreaming) { + data = await new Promise((resolve, reject) => { + const chunks = []; + data.on('data', chunk => chunks.push(chunk)); + data.on('end', () => resolve(Buffer.concat(chunks))); + data.on('error', reject); + }); + } + const location = await this.adapter.getFileLocation(config, filename); await this.adapter.createFile(filename, data, contentType, options); return { diff --git a/src/Routers/FilesRouter.js b/src/Routers/FilesRouter.js index f0bb483d7b..83931a7cfa 100644 --- a/src/Routers/FilesRouter.js +++ b/src/Routers/FilesRouter.js @@ -5,6 +5,60 @@ import Config from '../Config'; import logger from '../logger'; const triggers = require('../triggers'); const Utils = require('../Utils'); +import { Readable } from 'stream'; + +/** + * Wraps a readable stream in a Readable that enforces a byte size limit. + * Data flow is lazy: the source is not read until a consumer starts reading + * from the returned stream (via pipe or 'data' listener). This ensures the + * consumer's error listener is attached before any data (or error) is emitted. + */ +export function createSizeLimitedStream(source, maxBytes) { + let totalBytes = 0; + let started = false; + let sourceEnded = false; + + const output = new Readable({ + read() { + if (!started) { + started = true; + + source.on('data', (chunk) => { + totalBytes += chunk.length; + if (totalBytes > maxBytes) { + source.removeAllListeners('data'); + source.removeAllListeners('end'); + source.resume(); + output.destroy( + new Parse.Error( + Parse.Error.FILE_SAVE_ERROR, + `File size exceeds maximum allowed: ${maxBytes} bytes.` + ) + ); + return; + } + if (!output.push(chunk)) { + source.pause(); + } + }); + + source.on('end', () => { + sourceEnded = true; + output.push(null); + }); + + source.on('error', (err) => output.destroy(err)); + } + + // Resume source in case it was paused due to backpressure + if (!sourceEnded) { + source.resume(); + } + } + }); + + return output; +} export class FilesRouter { expressRouter({ maxUploadSize = '20Mb' } = {}) { @@ -18,15 +72,10 @@ export class FilesRouter { router.post( '/files/:filename', - express.raw({ - type: () => { - return true; - }, - limit: maxUploadSize, - }), // Allow uploads without Content-Type, or with any Content-Type. + this._bodyParsingMiddleware(maxUploadSize), Middlewares.handleParseHeaders, Middlewares.handleParseSession, - this.createHandler + this.createHandler.bind(this) ); router.delete( @@ -111,6 +160,20 @@ export class FilesRouter { } } + _bodyParsingMiddleware(maxUploadSize) { + const rawParser = express.raw({ + type: () => true, + limit: maxUploadSize, + }); + return (req, res, next) => { + if (req.get('X-Parse-Upload-Mode') === 'stream') { + req._maxUploadSizeBytes = Utils.parseSizeToBytes(maxUploadSize); + return next(); + } + return rawParser(req, res, next); + }; + } + async createHandler(req, res, next) { const config = req.config; const user = req.auth.user; @@ -139,11 +202,6 @@ export class FilesRouter { const { filename } = req.params; const contentType = req.get('Content-type'); - if (!req.body || !req.body.length) { - next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR, 'Invalid file upload.')); - return; - } - const error = filesController.validateFilename(filename); if (error) { next(error); @@ -182,6 +240,24 @@ export class FilesRouter { } } + // Dispatch to the appropriate handler based on whether the body was buffered + if (req.body instanceof Buffer) { + return this._handleBufferedUpload(req, res, next); + } + return this._handleStreamUpload(req, res, next); + } + + async _handleBufferedUpload(req, res, next) { + const config = req.config; + const filesController = config.filesController; + const { filename } = req.params; + const contentType = req.get('Content-type'); + + if (!req.body || !req.body.length) { + next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR, 'Invalid file upload.')); + return; + } + const base64 = req.body.toString('base64'); const file = new Parse.File(filename, { base64 }, contentType); const { metadata = {}, tags = {} } = req.fileData || {}; @@ -221,7 +297,12 @@ export class FilesRouter { // if the file returned by the trigger has already been saved skip saving anything if (!saveResult) { // update fileSize - const bufferData = Buffer.from(fileObject.file._data, 'base64'); + let bufferData; + if (fileObject.file._source?.format === 'buffer') { + bufferData = fileObject.file._source.buffer; + } else { + bufferData = Buffer.from(fileObject.file._data, 'base64'); + } fileObject.fileSize = Buffer.byteLength(bufferData); // prepare file options const fileOptions = { @@ -265,6 +346,125 @@ export class FilesRouter { } } + async _handleStreamUpload(req, res, next) { + const config = req.config; + const filesController = config.filesController; + const { filename } = req.params; + let contentType = req.get('Content-Type'); + const maxBytes = req._maxUploadSizeBytes; + + try { + // Early rejection via Content-Length header + const contentLength = req.get('Content-Length'); + if (contentLength && parseInt(contentLength, 10) > maxBytes) { + req.resume(); + next(new Parse.Error( + Parse.Error.FILE_SAVE_ERROR, + `File size exceeds maximum allowed: ${maxBytes} bytes.` + )); + return; + } + + const mime = (await import('mime')).default; + + // Infer content type from extension or add extension from content type + const hasExtension = filename && filename.includes('.'); + if (hasExtension && !contentType) { + contentType = mime.getType(filename); + } else if (!hasExtension && contentType) { + // extension will be added by filesController.createFile + } + + // Create size-limited stream wrapping the request + const stream = createSizeLimitedStream(req, maxBytes); + + // Build a Parse.File with no _data (streaming mode) + const file = new Parse.File(filename, { base64: '' }, contentType); + const { metadata = {}, tags = {} } = req.fileData || {}; + + // Validate metadata and tags for prohibited keywords + Utils.checkProhibitedKeywords(config, metadata); + Utils.checkProhibitedKeywords(config, tags); + + file.setTags(tags); + file.setMetadata(metadata); + + const fileSize = req.get('Content-Length') + ? parseInt(req.get('Content-Length'), 10) + : null; + const fileObject = { file, fileSize, stream: true }; + + // Run beforeSaveFile trigger + const triggerResult = await triggers.maybeRunFileTrigger( + triggers.Types.beforeSave, + fileObject, + config, + req.auth + ); + + let saveResult; + // If a new ParseFile is returned, check if it's an already saved file + if (triggerResult instanceof Parse.File) { + fileObject.file = triggerResult; + if (triggerResult.url()) { + fileObject.fileSize = null; + saveResult = { + url: triggerResult.url(), + name: triggerResult._name, + }; + // Consume and discard the stream since we're skipping save + req.resume(); + } + } + + // If the file returned by the trigger has already been saved, skip saving + if (!saveResult) { + // Prepare file options + const fileOptions = { + metadata: fileObject.file._metadata, + }; + const fileTags = + Object.keys(fileObject.file._tags).length > 0 ? { tags: fileObject.file._tags } : {}; + Object.assign(fileOptions, fileTags); + + // Pass stream directly to filesController — it will buffer if adapter doesn't support streaming + const sourceType = fileObject.file._source?.type || contentType; + const createFileResult = await filesController.createFile( + config, + fileObject.file._name, + stream, + sourceType, + fileOptions + ); + + // Update file with new data + fileObject.file._name = createFileResult.name; + fileObject.file._url = createFileResult.url; + fileObject.file._requestTask = null; + fileObject.file._previousSave = Promise.resolve(fileObject.file); + saveResult = { + url: createFileResult.url, + name: createFileResult.name, + }; + } + + // Run afterSaveFile trigger + await triggers.maybeRunFileTrigger(triggers.Types.afterSave, fileObject, config, req.auth); + res.status(201); + res.set('Location', saveResult.url); + res.json(saveResult); + } catch (e) { + // Consume stream on error to prevent connection hanging + req.resume(); + logger.error('Error creating a file: ', e); + const error = triggers.resolveError(e, { + code: Parse.Error.FILE_SAVE_ERROR, + message: `Could not store file: ${filename}.`, + }); + next(error); + } + } + async deleteHandler(req, res, next) { try { const { filesController } = req.config; diff --git a/src/Utils.js b/src/Utils.js index 0eca833552..e3d4e2fb4f 100644 --- a/src/Utils.js +++ b/src/Utils.js @@ -469,6 +469,37 @@ class Utils { } return current; } + + /** + * Parses a human-readable size string into a byte count. + * @param {number | string} size - A number (returned as-is), a numeric string + * (treated as bytes), or a string with a unit suffix: `b`, `kb`, `mb`, `gb` + * (case-insensitive). Examples: `'20mb'`, `'512kb'`, `'1.5gb'`, `1048576`. + * @returns {number} The size in bytes, floored to the nearest integer. + * @throws {Error} If the string does not match the expected format. + */ + static parseSizeToBytes(size) { + if (typeof size === 'number') { + return size; + } + const str = String(size).trim().toLowerCase(); + const match = str.match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/); + if (!match) { + throw new Error(`Invalid size value: ${size}`); + } + const num = parseFloat(match[1]); + const unit = match[2]; + switch (unit) { + case 'kb': + return Math.floor(num * 1024); + case 'mb': + return Math.floor(num * 1024 * 1024); + case 'gb': + return Math.floor(num * 1024 * 1024 * 1024); + default: + return Math.floor(num); + } + } } module.exports = Utils; From ed84568680c21782742e5d80483e9fb7dce7ee43 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:14:07 +0000 Subject: [PATCH 08/18] fix https://github.com/parse-community/parse-server/pull/10065#discussion_r2835051410 --- spec/ParseFile.spec.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/spec/ParseFile.spec.js b/spec/ParseFile.spec.js index 73b8dd1b5b..c536e164e9 100644 --- a/spec/ParseFile.spec.js +++ b/spec/ParseFile.spec.js @@ -1908,16 +1908,6 @@ describe('Parse.File testing', () => { } }); - it('passes through when Content-Length is within limit', async () => { - const input = Readable.from(Buffer.from('hi')); - input.headers = { 'content-length': '2' }; - const limited = createSizeLimitedStream(input, 100); - const chunks = []; - for await (const chunk of limited) { - chunks.push(chunk); - } - expect(Buffer.concat(chunks).toString()).toBe('hi'); - }); }); it('streams binary upload with X-Parse-Upload-Mode header', async () => { From 1896d0d372675638d00bf88eaebe302d11c1c0de Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:15:25 +0000 Subject: [PATCH 09/18] fix https://github.com/parse-community/parse-server/pull/10065#discussion_r2835051413 --- spec/ParseFile.spec.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spec/ParseFile.spec.js b/spec/ParseFile.spec.js index c536e164e9..644c3be1ec 100644 --- a/spec/ParseFile.spec.js +++ b/spec/ParseFile.spec.js @@ -1880,6 +1880,10 @@ describe('Parse.File testing', () => { }); describe('streaming binary uploads', () => { + afterEach(() => { + Parse.Cloud._removeAllHooks(); + }); + describe('createSizeLimitedStream', () => { const { createSizeLimitedStream } = require('../lib/Routers/FilesRouter'); const { Readable } = require('stream'); From c6b132dda64722461dd6f6a7561b870d947193a7 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:19:14 +0000 Subject: [PATCH 10/18] fix https://github.com/parse-community/parse-server/pull/10065#discussion_r2835051416 --- src/Routers/FilesRouter.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Routers/FilesRouter.js b/src/Routers/FilesRouter.js index 83931a7cfa..615af74731 100644 --- a/src/Routers/FilesRouter.js +++ b/src/Routers/FilesRouter.js @@ -26,9 +26,6 @@ export function createSizeLimitedStream(source, maxBytes) { source.on('data', (chunk) => { totalBytes += chunk.length; if (totalBytes > maxBytes) { - source.removeAllListeners('data'); - source.removeAllListeners('end'); - source.resume(); output.destroy( new Parse.Error( Parse.Error.FILE_SAVE_ERROR, @@ -54,6 +51,15 @@ export function createSizeLimitedStream(source, maxBytes) { if (!sourceEnded) { source.resume(); } + }, + destroy(err, callback) { + source.removeAllListeners('data'); + source.removeAllListeners('end'); + source.removeAllListeners('error'); + if (!sourceEnded) { + source.resume(); + } + callback(err); } }); From a26a05ab907a34f8b725ff8dea214199625f93d3 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:23:26 +0000 Subject: [PATCH 11/18] fix https://github.com/parse-community/parse-server/pull/10065#discussion_r2835051423 --- src/Routers/FilesRouter.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Routers/FilesRouter.js b/src/Routers/FilesRouter.js index 615af74731..67257ef554 100644 --- a/src/Routers/FilesRouter.js +++ b/src/Routers/FilesRouter.js @@ -389,8 +389,14 @@ export class FilesRouter { const { metadata = {}, tags = {} } = req.fileData || {}; // Validate metadata and tags for prohibited keywords - Utils.checkProhibitedKeywords(config, metadata); - Utils.checkProhibitedKeywords(config, tags); + try { + Utils.checkProhibitedKeywords(config, metadata); + Utils.checkProhibitedKeywords(config, tags); + } catch (error) { + req.resume(); + next(new Parse.Error(Parse.Error.INVALID_KEY_NAME, error)); + return; + } file.setTags(tags); file.setMetadata(metadata); From 3c1abc7d326993ae1f2f1dff98b244e268858d29 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:25:06 +0000 Subject: [PATCH 12/18] fix https://github.com/parse-community/parse-server/pull/10065#discussion_r2835051426 --- spec/Utils.spec.js | 12 ++++++++++++ src/Utils.js | 3 +++ 2 files changed, 15 insertions(+) diff --git a/spec/Utils.spec.js b/spec/Utils.spec.js index 26056036f3..853ddc9b3c 100644 --- a/spec/Utils.spec.js +++ b/spec/Utils.spec.js @@ -236,6 +236,18 @@ describe('Utils', () => { it('throws on unsupported unit', () => { expect(() => Utils.parseSizeToBytes('10tb')).toThrow(); }); + + it('throws on NaN', () => { + expect(() => Utils.parseSizeToBytes(NaN)).toThrow(); + }); + + it('throws on Infinity', () => { + expect(() => Utils.parseSizeToBytes(Infinity)).toThrow(); + }); + + it('throws on negative number', () => { + expect(() => Utils.parseSizeToBytes(-1)).toThrow(); + }); }); describe('createSanitizedError', () => { diff --git a/src/Utils.js b/src/Utils.js index e3d4e2fb4f..6cc7256434 100644 --- a/src/Utils.js +++ b/src/Utils.js @@ -480,6 +480,9 @@ class Utils { */ static parseSizeToBytes(size) { if (typeof size === 'number') { + if (!Number.isFinite(size) || size < 0) { + throw new Error(`Invalid size value: ${size}`); + } return size; } const str = String(size).trim().toLowerCase(); From 6245865b67835fef787e23772e36b606c28a509d Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:27:02 +0000 Subject: [PATCH 13/18] fix https://github.com/parse-community/parse-server/pull/10065#discussion_r2835157748 --- spec/ParseFile.spec.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spec/ParseFile.spec.js b/spec/ParseFile.spec.js index 644c3be1ec..346149b5b2 100644 --- a/spec/ParseFile.spec.js +++ b/spec/ParseFile.spec.js @@ -2057,9 +2057,11 @@ describe('Parse.File testing', () => { it('skips save when beforeSave trigger returns Parse.File with URL on streaming upload', async () => { Parse.Cloud.beforeSave(Parse.File, () => { - const file = new Parse.File('existing.txt'); - file._url = 'http://example.com/existing.txt'; - return file; + return Parse.File.fromJSON({ + __type: 'File', + name: 'existing.txt', + url: 'http://example.com/existing.txt', + }); }); const headers = { 'Content-Type': 'application/octet-stream', From b265af018bd62761b7fa8e91730e83a76013fb88 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:26:44 +0000 Subject: [PATCH 14/18] fix https://github.com/parse-community/parse-server/pull/10065#discussion_r2835210427 --- src/Routers/FilesRouter.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Routers/FilesRouter.js b/src/Routers/FilesRouter.js index 67257ef554..4132bb51a5 100644 --- a/src/Routers/FilesRouter.js +++ b/src/Routers/FilesRouter.js @@ -358,6 +358,7 @@ export class FilesRouter { const { filename } = req.params; let contentType = req.get('Content-Type'); const maxBytes = req._maxUploadSizeBytes; + let stream; try { // Early rejection via Content-Length header @@ -382,7 +383,7 @@ export class FilesRouter { } // Create size-limited stream wrapping the request - const stream = createSizeLimitedStream(req, maxBytes); + stream = createSizeLimitedStream(req, maxBytes); // Build a Parse.File with no _data (streaming mode) const file = new Parse.File(filename, { base64: '' }, contentType); @@ -393,7 +394,7 @@ export class FilesRouter { Utils.checkProhibitedKeywords(config, metadata); Utils.checkProhibitedKeywords(config, tags); } catch (error) { - req.resume(); + stream.destroy(); next(new Parse.Error(Parse.Error.INVALID_KEY_NAME, error)); return; } @@ -424,8 +425,8 @@ export class FilesRouter { url: triggerResult.url(), name: triggerResult._name, }; - // Consume and discard the stream since we're skipping save - req.resume(); + // Destroy stream to remove listeners and drain request + stream.destroy(); } } @@ -466,8 +467,12 @@ export class FilesRouter { res.set('Location', saveResult.url); res.json(saveResult); } catch (e) { - // Consume stream on error to prevent connection hanging - req.resume(); + // Destroy stream to remove listeners and drain request, or resume directly + if (stream) { + stream.destroy(); + } else { + req.resume(); + } logger.error('Error creating a file: ', e); const error = triggers.resolveError(e, { code: Parse.Error.FILE_SAVE_ERROR, From 0ba62f3d0ecf3be1309d3d0704c9d6b8c3e079d1 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:30:44 +0000 Subject: [PATCH 15/18] fix https://github.com/parse-community/parse-server/pull/10065#discussion_r2835210434 --- src/Utils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Utils.js b/src/Utils.js index 6cc7256434..1e072725d7 100644 --- a/src/Utils.js +++ b/src/Utils.js @@ -472,7 +472,7 @@ class Utils { /** * Parses a human-readable size string into a byte count. - * @param {number | string} size - A number (returned as-is), a numeric string + * @param {number | string} size - A number (floored to an integer), a numeric string * (treated as bytes), or a string with a unit suffix: `b`, `kb`, `mb`, `gb` * (case-insensitive). Examples: `'20mb'`, `'512kb'`, `'1.5gb'`, `1048576`. * @returns {number} The size in bytes, floored to the nearest integer. @@ -483,7 +483,7 @@ class Utils { if (!Number.isFinite(size) || size < 0) { throw new Error(`Invalid size value: ${size}`); } - return size; + return Math.floor(size); } const str = String(size).trim().toLowerCase(); const match = str.match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/); From ad6a28f88f512d00daeccc081f412b6abbc4463d Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:38:10 +0000 Subject: [PATCH 16/18] coverage --- spec/ParseFile.spec.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/spec/ParseFile.spec.js b/spec/ParseFile.spec.js index 346149b5b2..da69edc416 100644 --- a/spec/ParseFile.spec.js +++ b/spec/ParseFile.spec.js @@ -1940,6 +1940,24 @@ describe('Parse.File testing', () => { expect(getResponse.text).toEqual('streaming file content'); }); + it('infers content type from extension when Content-Type header is missing', async () => { + const headers = { + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest', + 'X-Parse-Upload-Mode': 'stream', + }; + const response = await request({ + method: 'POST', + headers: headers, + url: 'http://localhost:8378/1/files/inferred.txt', + body: 'inferred content type', + }); + const b = response.data; + expect(b.name).toMatch(/_inferred.txt$/); + const getResponse = await request({ url: b.url }); + expect(getResponse.text).toEqual('inferred content type'); + }); + it('uses buffered path without X-Parse-Upload-Mode header', async () => { const headers = { 'Content-Type': 'application/octet-stream', From a6704365f089251871d13a2d3aabf0d7f22f3683 Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:39:29 +0000 Subject: [PATCH 17/18] fix https://github.com/parse-community/parse-server/pull/10065#discussion_r2835496991 --- src/Routers/FilesRouter.js | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Routers/FilesRouter.js b/src/Routers/FilesRouter.js index 4132bb51a5..59cad704b6 100644 --- a/src/Routers/FilesRouter.js +++ b/src/Routers/FilesRouter.js @@ -17,13 +17,14 @@ export function createSizeLimitedStream(source, maxBytes) { let totalBytes = 0; let started = false; let sourceEnded = false; + let onData, onEnd, onError; const output = new Readable({ read() { if (!started) { started = true; - source.on('data', (chunk) => { + onData = (chunk) => { totalBytes += chunk.length; if (totalBytes > maxBytes) { output.destroy( @@ -37,14 +38,18 @@ export function createSizeLimitedStream(source, maxBytes) { if (!output.push(chunk)) { source.pause(); } - }); + }; - source.on('end', () => { + onEnd = () => { sourceEnded = true; output.push(null); - }); + }; + + onError = (err) => output.destroy(err); - source.on('error', (err) => output.destroy(err)); + source.on('data', onData); + source.on('end', onEnd); + source.on('error', onError); } // Resume source in case it was paused due to backpressure @@ -53,9 +58,11 @@ export function createSizeLimitedStream(source, maxBytes) { } }, destroy(err, callback) { - source.removeAllListeners('data'); - source.removeAllListeners('end'); - source.removeAllListeners('error'); + if (onData) source.removeListener('data', onData); + if (onEnd) source.removeListener('end', onEnd); + if (onError) source.removeListener('error', onError); + // Suppress errors emitted during drain (e.g. client disconnect) + source.on('error', () => {}); if (!sourceEnded) { source.resume(); } From 9a2ff04f8b9a563d194638ee40c0bfc262ce00fd Mon Sep 17 00:00:00 2001 From: Manuel Trezza <5673677+mtrezza@users.noreply.github.com> Date: Fri, 20 Feb 2026 23:41:41 +0000 Subject: [PATCH 18/18] lint --- src/Routers/FilesRouter.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Routers/FilesRouter.js b/src/Routers/FilesRouter.js index 59cad704b6..f53e1c9d87 100644 --- a/src/Routers/FilesRouter.js +++ b/src/Routers/FilesRouter.js @@ -58,9 +58,15 @@ export function createSizeLimitedStream(source, maxBytes) { } }, destroy(err, callback) { - if (onData) source.removeListener('data', onData); - if (onEnd) source.removeListener('end', onEnd); - if (onError) source.removeListener('error', onError); + if (onData) { + source.removeListener('data', onData); + } + if (onEnd) { + source.removeListener('end', onEnd); + } + if (onError) { + source.removeListener('error', onError); + } // Suppress errors emitted during drain (e.g. client disconnect) source.on('error', () => {}); if (!sourceEnded) {