diff --git a/apps/api/package.json b/apps/api/package.json index 63f2ef6629..d8a1a37ce5 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -78,7 +78,7 @@ "bullmq": "^5.81.2", "drizzle-orm": "^0.45.2", "fast-xml-parser": "^5.9.3", - "firebase-admin": "^13.7.0", + "firebase-admin": "^14.4.0", "google-auth-library": "^11.0.2", "hono": "^4.13.5", "i18next": "^26.3.6", diff --git a/apps/api/src/services/fcm.test.ts b/apps/api/src/services/fcm.test.ts index e80c836221..cc466a7e81 100644 --- a/apps/api/src/services/fcm.test.ts +++ b/apps/api/src/services/fcm.test.ts @@ -1,24 +1,29 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { FirebaseMessagingError } from 'firebase-admin/messaging'; -const { messagingSend, initializeApp, cert, appsList } = vi.hoisted(() => ({ +const { messagingSend, initializeApp, getApp, cert, appsList } = vi.hoisted(() => ({ messagingSend: vi.fn(), initializeApp: vi.fn(() => ({})), + getApp: vi.fn(() => ({})), cert: vi.fn((sa: unknown) => sa), appsList: [] as unknown[], })); -vi.mock('firebase-admin', () => ({ - default: { - get apps() { - return appsList; - }, - app: vi.fn(() => ({})), - initializeApp, - credential: { cert }, - messaging: () => ({ send: messagingSend }), - }, +vi.mock('firebase-admin/app', () => ({ + getApps: vi.fn(() => appsList), + getApp, + initializeApp, + cert, })); +vi.mock('firebase-admin/messaging', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getMessaging: vi.fn(() => ({ send: messagingSend })), + }; +}); + import { isFcmConfigured, sendFcmNotification, @@ -98,6 +103,35 @@ describe('sendFcmNotification', () => { }); }); + it('reports unregistered:true for a real v14-shaped FirebaseMessagingError (registration-token-not-registered)', async () => { + process.env.FIREBASE_SERVICE_ACCOUNT = JSON.stringify({ private_key: 'x', client_email: 'y' }); + // Construct via the SDK's own error class (not a plain {code} object) so a + // firebase-admin major bump that reshapes error internals fails this test + // first, before it silently breaks sendFcmNotification's code matching. + // The public .d.ts hides the constructor (marked @internal), so we go + // through the runtime shape directly — this is what admin.messaging().send() + // actually throws. + const Ctor = FirebaseMessagingError as unknown as new (info: { + code: string; + message: string; + }) => FirebaseMessagingError; + const err = new Ctor({ + code: 'registration-token-not-registered', + message: 'Requested entity was not found.', + }); + expect(err).toBeInstanceOf(Error); + expect(err.code).toBe('messaging/registration-token-not-registered'); + messagingSend.mockRejectedValueOnce(err); + + const res = await sendFcmNotification('dead-tok', { title: 't', body: 'b' }); + + expect(res).toEqual({ + ok: false, + reason: 'messaging/registration-token-not-registered', + unregistered: true, + }); + }); + it('reports a live failure without unregistered on any other error', async () => { process.env.FIREBASE_SERVICE_ACCOUNT = JSON.stringify({ private_key: 'x', client_email: 'y' }); messagingSend.mockRejectedValueOnce({ code: 'messaging/internal-error' }); diff --git a/apps/api/src/services/fcm.ts b/apps/api/src/services/fcm.ts index f27e2d7983..ab8815450a 100644 --- a/apps/api/src/services/fcm.ts +++ b/apps/api/src/services/fcm.ts @@ -1,14 +1,19 @@ -import admin from 'firebase-admin'; +import { initializeApp, getApp, getApps, cert, type App, type ServiceAccount } from 'firebase-admin/app'; +import { getMessaging } from 'firebase-admin/messaging'; /** * Native Firebase Cloud Messaging (FCM) sender for Android. Mirrors apns.ts's * never-throws, structured-result contract so expoPush.ts's dispatcher can * treat both native providers identically (#3639). + * + * Uses the modular `firebase-admin/app` + `firebase-admin/messaging` API — + * firebase-admin 14 removed the legacy `admin.app`/`admin.messaging()` + * compat namespace from the package's default export. */ -let firebaseApp: admin.app.App | null = null; +let firebaseApp: App | null = null; -function parseServiceAccount(raw: string): admin.ServiceAccount { +function parseServiceAccount(raw: string): ServiceAccount { let parsed: { privateKey?: string; private_key?: string }; try { parsed = JSON.parse(raw); @@ -21,7 +26,7 @@ function parseServiceAccount(raw: string): admin.ServiceAccount { if (typeof parsed.privateKey === 'string') { parsed.privateKey = parsed.privateKey.replace(/\\n/g, '\n'); } - return parsed as admin.ServiceAccount; + return parsed as ServiceAccount; } /** True iff FIREBASE_SERVICE_ACCOUNT is present. Mirrors isApnsConfigured(). */ @@ -29,14 +34,14 @@ export function isFcmConfigured(): boolean { return !!process.env.FIREBASE_SERVICE_ACCOUNT; } -function initFirebase(): admin.app.App { +function initFirebase(): App { if (firebaseApp) return firebaseApp; const raw = process.env.FIREBASE_SERVICE_ACCOUNT; if (!raw) throw new Error('FIREBASE_SERVICE_ACCOUNT is not set'); const serviceAccount = parseServiceAccount(raw); - firebaseApp = admin.apps.length - ? admin.app() - : admin.initializeApp({ credential: admin.credential.cert(serviceAccount) }); + firebaseApp = getApps().length + ? getApp() + : initializeApp({ credential: cert(serviceAccount) }); return firebaseApp; } @@ -91,8 +96,8 @@ export async function sendFcmNotification(token: string, payload: FcmPayload): P return { ok: false, reason: 'not_configured' }; } try { - initFirebase(); - const messageId = await admin.messaging().send({ + const app = initFirebase(); + const messageId = await getMessaging(app).send({ token, notification: { title: payload.title, body: payload.body }, data: stringifyData(payload.data), diff --git a/package.json b/package.json index ddc49a2593..d78b26eeb3 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,6 @@ "qs@>=6.7.0 <=6.15.1": ">=6.15.2", "smol-toml@<1.6.1": ">=1.6.1", "svgo@=4.0.0": ">=4.0.1", - "@tootallnate/once@<3.0.1": ">=3.0.1", "undici@>=6.0.0 <6.27.0": ">=6.27.0 <7.0.0", "undici@>=7.0.0 <7.28.0": ">=7.28.0 <8.0.0", "ws@>=8.0.0 <8.20.1": ">=8.20.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9bd2458d48..25c5b935f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,7 +40,6 @@ overrides: qs@>=6.7.0 <=6.15.1: '>=6.15.2' smol-toml@<1.6.1: '>=1.6.1' svgo@=4.0.0: '>=4.0.1' - '@tootallnate/once@<3.0.1': '>=3.0.1' undici@>=6.0.0 <6.27.0: '>=6.27.0 <7.0.0' undici@>=7.0.0 <7.28.0: '>=7.28.0 <8.0.0' ws@>=8.0.0 <8.20.1: '>=8.20.1' @@ -195,8 +194,8 @@ importers: specifier: '>=5.10.1' version: 5.10.1 firebase-admin: - specifier: ^13.7.0 - version: 13.7.0 + specifier: ^14.4.0 + version: 14.4.0 google-auth-library: specifier: ^11.0.2 version: 11.0.2 @@ -2923,36 +2922,44 @@ packages: '@fastify/busboy@3.2.2': resolution: {integrity: sha512-yXSS27qPExaXeuLvMRMXOLtpipzfQYNjG3FkunDWKGfMYjKuhFXko9CVzqxm8jcF+lmtS9Fd89QNdh9XDjnbNg==} - '@firebase/app-check-interop-types@0.3.3': - resolution: {integrity: sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==} + '@firebase/app-check-interop-types@0.3.5': + resolution: {integrity: sha512-qId34pVZ2CXTmtu4ofW5leiI93DvnOvIcr/5GT7MZPw5WXAi6nZoU+g9cNRgl7K90UJSbK0cXxten4meYMPyZg==} - '@firebase/app-types@0.9.3': - resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==} + '@firebase/app-types@0.9.6': + resolution: {integrity: sha512-yPLahy7Esfu2w/yme3msVK4xTkDXQqq6szfQn8yVOQpCKiT5GVFjqNpLbuz6NkX0WuTwUidkmPewW3r4xkvpeg==} - '@firebase/auth-interop-types@0.2.4': - resolution: {integrity: sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==} + '@firebase/auth-interop-types@0.2.6': + resolution: {integrity: sha512-FgwZqDrBqgK0BHI70QTv1v/5wmuDF9f8fsJFvKSxoRlK2PPfSQtZAk2jhXu4pe9BZzFi/e4UYusU/bEQHdf6Qg==} - '@firebase/component@0.7.1': - resolution: {integrity: sha512-mFzsm7CLHR60o08S23iLUY8m/i6kLpOK87wdEFPLhdlCahaxKmWOwSVGiWoENYSmFJJoDhrR3gKSCxz7ENdIww==} + '@firebase/component@0.7.5': + resolution: {integrity: sha512-vuFDcL91Q+2ZuBJkyOh86T4q0B4ffNTDjc/A38tybO56odQABxRTFLTIowCWqAKeIcgo37GowWMVgFF73gD8Qw==} engines: {node: '>=20.0.0'} - '@firebase/database-compat@2.1.1': - resolution: {integrity: sha512-heAEVZ9Z8c8PnBUcmGh91JHX0cXcVa1yESW/xkLuwaX7idRFyLiN8sl73KXpR8ZArGoPXVQDanBnk6SQiekRCQ==} + '@firebase/database-compat@2.1.7': + resolution: {integrity: sha512-lBq9sJm8MnJINKJnkAKSOj2MbC66xGoSVCcGkPtstl+lkoKEBtD46qHLbuDgW/WbLPoKVm17RIN8BxHj+Z2F2w==} engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app': + optional: true + '@firebase/app-compat': + optional: true - '@firebase/database-types@1.0.17': - resolution: {integrity: sha512-4eWaM5fW3qEIHjGzfi3cf0Jpqi1xQsAdT6rSDE1RZPrWu8oGjgrq6ybMjobtyHQFgwGCykBm4YM89qDzc+uG/w==} + '@firebase/database-types@1.0.22': + resolution: {integrity: sha512-YAZNXsjY9EQQ+pKw/3ax8n5FgolHC7Qew7EY5RceYdl0R2ZP+kCv1O0DkKlcceue8uQCOreHCNN7PWVFpY1Nug==} - '@firebase/database@1.1.1': - resolution: {integrity: sha512-LwIXe8+mVHY5LBPulWECOOIEXDiatyECp/BOlu0gOhe+WOcKjWHROaCbLlkFTgHMY7RHr5MOxkLP/tltWAH3dA==} + '@firebase/database@1.1.5': + resolution: {integrity: sha512-/JGpvszLoNXNgzilRXocigGfFF4hbcPA9wN1i1kjJx6oKkXgkHteZYl3lQs1lJX3ETDf6bv7zI15lPMVUp4sAQ==} engines: {node: '>=20.0.0'} - '@firebase/logger@0.5.0': - resolution: {integrity: sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==} + '@firebase/logger@0.5.2': + resolution: {integrity: sha512-J2VO4NFTc0xQFrxV1B/lm5balicm9cwuX2acR9Yn41fN8KgUeQFo+VJV222IqW2FPSXKDu9uo5WdQFWf9TPbYg==} engines: {node: '>=20.0.0'} - '@firebase/util@1.14.0': - resolution: {integrity: sha512-/gnejm7MKkVIXnSJGpc9L2CvvvzJvtDPeAEq5jAwgVlf/PeNxot+THx/bpD20wQ8uL5sz0xqgXy1nisOYMU+mw==} + '@firebase/util@1.15.3': + resolution: {integrity: sha512-c/z/gaIlaaLZEuGbE6sLUuJ61tskg1JghvhcNQzW948ASBinbVBBRnZTC4b4yt4LaEtJQkYlyzqLHcutFwEIvA==} engines: {node: '>=20.0.0'} '@floating-ui/core@1.8.0': @@ -2988,25 +2995,29 @@ packages: '@fontsource/plus-jakarta-sans@5.2.8': resolution: {integrity: sha512-P5qE49fqdeD+7DXH1KBxmMPlB17LTz1zvBhFH0tFzfnYTKVJVyb0pR6plh0ZGXxcB+Oayb54FZZw3V42/DawTw==} - '@google-cloud/firestore@7.11.6': - resolution: {integrity: sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==} - engines: {node: '>=14.0.0'} + '@google-cloud/firestore-api@0.2.0': + resolution: {integrity: sha512-wfHJPZmLqzpy6FN6U+7HkkP/AKhGsbHSpEy/qL2TyI3/pKRAvpamQxZ2qvps5hMRgAjfuHCim+oeJj9RveCaqg==} + engines: {node: '>=18'} - '@google-cloud/paginator@5.0.2': - resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} - engines: {node: '>=14.0.0'} + '@google-cloud/firestore@9.2.0': + resolution: {integrity: sha512-4BI2686ygMkef0Pe4QnX9hnWeGCUjaAP5m+Ow5/yNWwGxGadO741Ct28MRXW9czg0pnvz919INKbQdCgUMcfeA==} + engines: {node: '>=22'} - '@google-cloud/projectify@4.0.0': - resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} - engines: {node: '>=14.0.0'} + '@google-cloud/paginator@7.1.0': + resolution: {integrity: sha512-PNCXdAQgNoQODZuqyhmkN2nUpB2q9UFzawZ1oyCDyEyhcheRoCKJJhSKhEIeKpM/NCLnC6Q4We4HEkGCwNDnCA==} + engines: {node: '>=22'} - '@google-cloud/promisify@4.0.0': - resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} - engines: {node: '>=14'} + '@google-cloud/projectify@6.1.0': + resolution: {integrity: sha512-tKAx9q6vTtbgZcqCojKWK8k6Dy2XBsE7BkNrrBsblxNXrKImYnljqeGfYh9qnTrlTjC9F19pTyCkGcl3pFMW/w==} + engines: {node: '>=22'} - '@google-cloud/storage@7.19.0': - resolution: {integrity: sha512-n2FjE7NAOYyshogdc7KQOl/VZb4sneqPjWouSyia9CMDdMhRX5+RIbqalNmC7LOLzuLAN89VlF2HvG8na9G+zQ==} - engines: {node: '>=14'} + '@google-cloud/promisify@6.1.0': + resolution: {integrity: sha512-H+Rytzi5zYMyoAmU/zgYLgq7fJ9FY4QQEg4k6gfFx/RY1COJ2xxyIfe8bZ62lqEbWM1DJH7IYETqTFmqNtuUhQ==} + engines: {node: '>=22'} + + '@google-cloud/storage@8.2.0': + resolution: {integrity: sha512-7ckgSjeEprV92VrlLjpYFA3PFerflvFtF7Ea86oQXGNCprGZq5rtpAVK0zgWnCy+44mLjms42M7MiWa433gz2A==} + engines: {node: '>=22'} '@googleapis/admin@36.0.0': resolution: {integrity: sha512-zVnjc4tIF4HqN4PInKlyks1i2tiMbWVPmgqb7Q4HG5/pwVnFZSzDSHSqQwybQ7PcSyXP01Iw0ycAqklbaUTKiA==} @@ -3028,11 +3039,6 @@ packages: resolution: {integrity: sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==} engines: {node: '>=12.10.0'} - '@grpc/proto-loader@0.7.15': - resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} - engines: {node: '>=6'} - hasBin: true - '@grpc/proto-loader@0.8.0': resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} engines: {node: '>=6'} @@ -5495,10 +5501,6 @@ packages: '@tiptap/starter-kit@3.31.3': resolution: {integrity: sha512-WKof9RewdmGHvWJ1wn0/HVNG2mV+HOgVRyJkKekuM9fgr6BZAAH/xZsWE1eon+94JnQ+KtK2ThydXQM/qc6b2A==} - '@tootallnate/once@3.0.1': - resolution: {integrity: sha512-VyMVKRrpHTT8PnotUeV8L/mDaMwD5DaAKCFLP73zAqAtvF0FCqky+Ki7BYbFCYQmqFyTe9316Ed5zS70QUR9eg==} - engines: {node: '>= 10'} - '@turbo/darwin-64@2.10.5': resolution: {integrity: sha512-ENvPwy3x5yS7MwNYHeWjqOBXkwIMp39Pd+/zXC6PoiNzF8EIvvLZOZZ+ny6L9x4WgS5vxUii2LM5gM+zjPdnWw==} cpu: [x64] @@ -5556,9 +5558,6 @@ packages: '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - '@types/caseless@0.12.5': - resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} - '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -5740,9 +5739,6 @@ packages: '@types/koa@3.0.2': resolution: {integrity: sha512-7TRzVOBcH/q8CfPh9AmHBQ8TZtimT4Sn+rw8//hXveI6+F41z93W8a+0B0O8L7apKQv+vKBIEZSECiL0Oo1JFA==} - '@types/long@4.0.2': - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - '@types/mailparser@3.4.6': resolution: {integrity: sha512-wVV3cnIKzxTffaPH8iRnddX1zahbYB1ZEoAxyhoBo3TBCBuK6nZ8M8JYO/RhsCuuBVOw/DEN/t/ENbruwlxn6Q==} @@ -5811,9 +5807,6 @@ packages: '@types/readdir-glob@1.1.5': resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} - '@types/request@2.48.13': - resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==} - '@types/sanitize-html@2.16.1': resolution: {integrity: sha512-n9wjs8bCOTyN/ynwD8s/nTcTreIHB1vf31vhLMGqUPNHaweKC4/fAl4Dj+hUlCTKYgm4P3k83fmiFfzkZ6sgMA==} @@ -5839,9 +5832,6 @@ packages: resolution: {integrity: sha512-d3RZcMmYRuL5f+jG5YM5ISs9z/HCwI2xjqXxhLon54dlpBWfVLVStOFTalO7UcX7RXaIJ6oylqOTg3Cbu6zU1Q==} deprecated: This is a stub types definition. strip-bom provides its own type definitions, so you do not need this installed. - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -6183,10 +6173,6 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -7779,10 +7765,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - farmhash-modern@1.1.0: - resolution: {integrity: sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==} - engines: {node: '>=18.0.0'} - fast-deep-equal@2.0.1: resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} @@ -7907,9 +7889,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - firebase-admin@13.7.0: - resolution: {integrity: sha512-o3qS8zCJbApe7aKzkO2Pa380t9cHISqeSd3blqYTtOuUUUua3qZTLwNWgGUOss3td6wbzrZhiHIj3c8+fC046Q==} - engines: {node: '>=18'} + firebase-admin@14.4.0: + resolution: {integrity: sha512-yEx+GCsHvjH2svh4j1ATW57o8tlfjRQ0klTxvn7XCKUPXWiUQaRTHSzPSqhXtsLYSe4IwTqR7qqrh2sA45A0HA==} + engines: {node: '>=22'} fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} @@ -8096,6 +8078,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 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 + google-auth-library@10.5.0: + resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==} + engines: {node: '>=18'} + google-auth-library@10.9.1: resolution: {integrity: sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==} engines: {node: '>=18'} @@ -8108,9 +8094,13 @@ packages: resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} engines: {node: '>=14'} - google-gax@4.6.1: - resolution: {integrity: sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==} - engines: {node: '>=14'} + google-gax@5.0.8: + resolution: {integrity: sha512-M4vpZcXQIC1gqIVGQ7eaU3jXQA6zecStyTXu514TYfThlgSurYJOxHZo9fzU6hAgwPWvuEynAVHWyaIk80VeEA==} + engines: {node: '>=18'} + + google-gax@6.4.0: + resolution: {integrity: sha512-0Hj8GyPBtrBHQiB3GVb0jETZaXn1mTRhpwM2PLUEqSjct4YTHbT6N6rdfMqzInaX17FV+lWumUe50UjuNmMzLg==} + engines: {node: '>=22'} google-logging-utils@0.0.2: resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} @@ -8139,6 +8129,10 @@ packages: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} + gtoken@8.0.0: + resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} + engines: {node: '>=18'} + h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} @@ -8320,10 +8314,6 @@ packages: http-parser-js@0.5.10: resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -8606,9 +8596,6 @@ packages: joi@17.13.8: resolution: {integrity: sha512-iPKOGmiRw1jxf/JOPwxmCcUQAOdF359mdzYiP2DJ+TMX0YK2zjK3D+zYOaGjpumWxOFF/l2xVWjRVK5bGSLdEw==} - jose@4.15.9: - resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - jose@6.2.12: resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} @@ -8731,9 +8718,9 @@ packages: jwa@2.0.1: resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - jwks-rsa@3.2.2: - resolution: {integrity: sha512-BqTyEDV+lS8F2trk3A+qJnxV5Q9EqKCBJOPti3W97r7qTympCZjb7h2X6f2kc+0K3rsSTY1/6YG2eaXKoj497w==} - engines: {node: '>=14'} + jwks-rsa@4.1.0: + resolution: {integrity: sha512-sbkByqyATKYJP5F4RXj03N5TUNC0QLTjCAZvwTzC4BwJZ8e0/cWxN8YROnyUth2g1/ONWi4eSFHeu6oYalrc3Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >= 23.0.0} jws@4.0.1: resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} @@ -9054,12 +9041,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru-memoizer@2.3.0: - resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} + lru-memoizer@3.0.0: + resolution: {integrity: sha512-m83w/cYXLdUIboKSPxzPAGfYnk+vqeDYXuoSrQRw1q+yVEd8IXhvMufN8Q5TIPe7e2jyX4SRNrDJI2Skw1yznQ==} lucide-react@1.21.0: resolution: {integrity: sha512-reEZMXq8Qdd5jg5XYkQ5TR1fB/GiQ7ih4vcrthYDtgjSDwh0i6/YLiGjsWsIwgN49gpAnd4J2elSNzncMEEUUQ==} @@ -10214,9 +10197,13 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - proto3-json-serializer@2.0.2: - resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} - engines: {node: '>=14.0.0'} + proto3-json-serializer@3.0.4: + resolution: {integrity: sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==} + engines: {node: '>=18'} + + proto3-json-serializer@4.0.2: + resolution: {integrity: sha512-VUQlb/J2WjOG8BKhdLwJUz+MKxSMtBGYh+TaNmRtiYVhlIzXjzeAGIx7gtc3lXlA2iURzfF2+cXaQvC2ofwzpg==} + engines: {node: '>=22'} protobufjs@8.7.0: resolution: {integrity: sha512-uu52JNxLh3vsL7tXU/h0gDaywufvuUCTbGSi0NKQKBZ2ZopkmrWQJSQO/EFqzu/5YhiwgVM8rq/a/iVpx4eZ0g==} @@ -10659,9 +10646,13 @@ packages: retext-smartypants@6.2.0: resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} - retry-request@7.0.2: - resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} - engines: {node: '>=14'} + retry-request@8.0.4: + resolution: {integrity: sha512-pI6/7eabUYkZxamkOq0g0uMxKLLGnjzhefY+vL8bVXag5rto4OU2YBTPytWLuHH7aEKD6fn7kJycQfid0Mwnkw==} + engines: {node: '>=18'} + + retry-request@9.0.1: + resolution: {integrity: sha512-4kGHEBl0ME6gR+8QB1sPMyg58jUxLUcCZNeqLDrfqzk0eWQN8XJFmeu7fmZCjlZCRW0S2u64Ik1HkO/0sWgCYQ==} + engines: {node: '>=22'} retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} @@ -10675,6 +10666,10 @@ packages: resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==} engines: {node: '>= 0.8.15'} + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} @@ -11122,9 +11117,13 @@ packages: tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} - teeny-request@9.0.0: - resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} - engines: {node: '>=14'} + teeny-request@10.1.4: + resolution: {integrity: sha512-R1Cg4Vu0UULeDfHL/kjABLaTW++9yD/B6n2g48y5dJ04hsEaxcfmAqbNDzNsbqAYJyIpZafjklLG9YxRu9uzOg==} + engines: {node: '>=18'} + + teeny-request@11.0.1: + resolution: {integrity: sha512-bNr5j2YjSdajgCVsp+8JVjRf1uHIbpNISLeKp/7V1NnVMX3Gh6H/kECNGlm2Q3I68ACODQ0iv6aZ3Rvm8WgLGA==} + engines: {node: '>=22'} teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} @@ -11549,10 +11548,6 @@ packages: utrie@1.0.2: resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} - uuid@14.0.1: - resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} - hasBin: true - uuid@14.0.2: resolution: {integrity: sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==} hasBin: true @@ -12023,9 +12018,6 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml-language-server@1.23.0: resolution: {integrity: sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==} hasBin: true @@ -13994,46 +13986,48 @@ snapshots: '@fastify/busboy@3.2.2': {} - '@firebase/app-check-interop-types@0.3.3': {} + '@firebase/app-check-interop-types@0.3.5': {} - '@firebase/app-types@0.9.3': {} + '@firebase/app-types@0.9.6': + dependencies: + '@firebase/logger': 0.5.2 - '@firebase/auth-interop-types@0.2.4': {} + '@firebase/auth-interop-types@0.2.6': {} - '@firebase/component@0.7.1': + '@firebase/component@0.7.5': dependencies: - '@firebase/util': 1.14.0 + '@firebase/util': 1.15.3 tslib: 2.8.1 - '@firebase/database-compat@2.1.1': + '@firebase/database-compat@2.1.7': dependencies: - '@firebase/component': 0.7.1 - '@firebase/database': 1.1.1 - '@firebase/database-types': 1.0.17 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.14.0 + '@firebase/component': 0.7.5 + '@firebase/database': 1.1.5 + '@firebase/database-types': 1.0.22 + '@firebase/logger': 0.5.2 + '@firebase/util': 1.15.3 tslib: 2.8.1 - '@firebase/database-types@1.0.17': + '@firebase/database-types@1.0.22': dependencies: - '@firebase/app-types': 0.9.3 - '@firebase/util': 1.14.0 + '@firebase/app-types': 0.9.6 + '@firebase/util': 1.15.3 - '@firebase/database@1.1.1': + '@firebase/database@1.1.5': dependencies: - '@firebase/app-check-interop-types': 0.3.3 - '@firebase/auth-interop-types': 0.2.4 - '@firebase/component': 0.7.1 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.14.0 + '@firebase/app-check-interop-types': 0.3.5 + '@firebase/auth-interop-types': 0.2.6 + '@firebase/component': 0.7.5 + '@firebase/logger': 0.5.2 + '@firebase/util': 1.15.3 faye-websocket: 0.11.4 tslib: 2.8.1 - '@firebase/logger@0.5.0': + '@firebase/logger@0.5.2': dependencies: tslib: 2.8.1 - '@firebase/util@1.14.0': + '@firebase/util@1.15.3': dependencies: tslib: 2.8.1 @@ -14066,47 +14060,52 @@ snapshots: '@fontsource/plus-jakarta-sans@5.2.8': {} - '@google-cloud/firestore@7.11.6': + '@google-cloud/firestore-api@0.2.0': dependencies: + google-gax: 5.0.8 + transitivePeerDependencies: + - supports-color + optional: true + + '@google-cloud/firestore@9.2.0': + dependencies: + '@google-cloud/firestore-api': 0.2.0 '@opentelemetry/api': 1.9.1 fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 - google-gax: 4.6.1 + google-gax: 6.4.0 protobufjs: 8.7.0 transitivePeerDependencies: - - encoding - supports-color optional: true - '@google-cloud/paginator@5.0.2': + '@google-cloud/paginator@7.1.0': dependencies: - arrify: 2.0.1 extend: 3.0.2 optional: true - '@google-cloud/projectify@4.0.0': + '@google-cloud/projectify@6.1.0': optional: true - '@google-cloud/promisify@4.0.0': + '@google-cloud/promisify@6.1.0': optional: true - '@google-cloud/storage@7.19.0': + '@google-cloud/storage@8.2.0': dependencies: - '@google-cloud/paginator': 5.0.2 - '@google-cloud/projectify': 4.0.0 - '@google-cloud/promisify': 4.0.0 + '@google-cloud/paginator': 7.1.0 + '@google-cloud/projectify': 6.1.0 + '@google-cloud/promisify': 6.1.0 abort-controller: 3.0.0 async-retry: 1.3.3 duplexify: 4.1.3 - fast-xml-parser: 5.10.1 + fast-xml-parser: 5.11.1 gaxios: 6.7.1 google-auth-library: 9.15.1 html-entities: 2.6.0 mime: 3.0.0 p-limit: 3.1.0 - retry-request: 7.0.2 - teeny-request: 9.0.0 - uuid: 14.0.1 + retry-request: 9.0.1 + teeny-request: 11.0.1 transitivePeerDependencies: - encoding - supports-color @@ -14142,14 +14141,6 @@ snapshots: '@js-sdsl/ordered-map': 4.4.2 optional: true - '@grpc/proto-loader@0.7.15': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 8.7.0 - yargs: 17.7.3 - optional: true - '@grpc/proto-loader@0.8.0': dependencies: lodash.camelcase: 4.3.0 @@ -16669,9 +16660,6 @@ snapshots: '@tiptap/extensions': 3.31.3(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3) '@tiptap/pm': 3.31.3 - '@tootallnate/once@3.0.1': - optional: true - '@turbo/darwin-64@2.10.5': optional: true @@ -16731,9 +16719,6 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 26.4.1 - '@types/caseless@0.12.5': - optional: true - '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -16942,7 +16927,7 @@ snapshots: '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 26.4.1 + '@types/node': 26.5.1 '@types/keygrip@1.0.6': {} @@ -16961,9 +16946,6 @@ snapshots: '@types/koa-compose': 3.2.9 '@types/node': 26.4.1 - '@types/long@4.0.2': - optional: true - '@types/mailparser@3.4.6': dependencies: '@types/node': 26.4.1 @@ -17046,14 +17028,6 @@ snapshots: dependencies: '@types/node': 26.4.1 - '@types/request@2.48.13': - dependencies: - '@types/caseless': 0.12.5 - '@types/node': 26.4.1 - '@types/tough-cookie': 4.0.5 - form-data: 4.0.6 - optional: true - '@types/sanitize-html@2.16.1': dependencies: htmlparser2: 10.1.0 @@ -17085,9 +17059,6 @@ snapshots: dependencies: strip-bom: 5.0.0 - '@types/tough-cookie@4.0.5': - optional: true - '@types/trusted-types@2.0.7': optional: true @@ -17527,9 +17498,6 @@ snapshots: aria-query@5.3.2: {} - arrify@2.0.1: - optional: true - asap@2.0.6: {} asn1@0.2.6: @@ -19321,8 +19289,6 @@ snapshots: extend@3.0.2: {} - farmhash-modern@1.1.0: {} - fast-deep-equal@2.0.1: optional: true @@ -19468,22 +19434,21 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - firebase-admin@13.7.0: + firebase-admin@14.4.0: dependencies: '@fastify/busboy': 3.2.2 - '@firebase/database-compat': 2.1.1 - '@firebase/database-types': 1.0.17 - farmhash-modern: 1.1.0 + '@firebase/database-compat': 2.1.7 + '@firebase/database-types': 1.0.22 fast-deep-equal: 3.1.3 google-auth-library: 10.9.1 jsonwebtoken: 9.0.3 - jwks-rsa: 3.2.2 - node-forge: 1.4.0 - uuid: 14.0.1 + jwks-rsa: 4.1.0 optionalDependencies: - '@google-cloud/firestore': 7.11.6 - '@google-cloud/storage': 7.19.0 + '@google-cloud/firestore': 9.2.0 + '@google-cloud/storage': 8.2.0 transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-compat' - encoding - supports-color @@ -19592,7 +19557,7 @@ snapshots: https-proxy-agent: 7.0.6 is-stream: 2.0.1 node-fetch: 2.7.0 - uuid: 14.0.1 + uuid: 14.0.2 transitivePeerDependencies: - encoding - supports-color @@ -19718,6 +19683,19 @@ snapshots: path-is-absolute: 1.0.1 optional: true + google-auth-library@10.5.0: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.3.0 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 + gtoken: 8.0.0 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + optional: true + google-auth-library@10.9.1: dependencies: base64-js: 1.5.1 @@ -19753,22 +19731,37 @@ snapshots: - supports-color optional: true - google-gax@4.6.1: + google-gax@5.0.8: dependencies: '@grpc/grpc-js': 1.14.4 - '@grpc/proto-loader': 0.7.15 - '@types/long': 4.0.2 - abort-controller: 3.0.0 + '@grpc/proto-loader': 0.8.0 duplexify: 4.1.3 - google-auth-library: 9.15.1 - node-fetch: 2.7.0 + google-auth-library: 10.5.0 + google-logging-utils: 1.1.3 + node-fetch: 3.3.2 object-hash: 3.0.0 - proto3-json-serializer: 2.0.2 + proto3-json-serializer: 3.0.4 protobufjs: 8.7.0 - retry-request: 7.0.2 - uuid: 14.0.1 + retry-request: 8.0.4 + rimraf: 5.0.10 + transitivePeerDependencies: + - supports-color + optional: true + + google-gax@6.4.0: + dependencies: + '@grpc/grpc-js': 1.14.4 + '@grpc/proto-loader': 0.8.0 + '@opentelemetry/api': 1.9.1 + duplexify: 4.1.3 + google-auth-library: 11.0.2 + google-logging-utils: 2.0.1 + node-fetch: 3.3.2 + object-hash: 3.0.0 + proto3-json-serializer: 4.0.2 + protobufjs: 8.7.0 + retry-request: 9.0.1 transitivePeerDependencies: - - encoding - supports-color optional: true @@ -19803,6 +19796,14 @@ snapshots: - supports-color optional: true + gtoken@8.0.0: + dependencies: + gaxios: 7.3.0 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + optional: true + h3@1.15.11: dependencies: cookie-es: 1.2.3 @@ -20096,15 +20097,6 @@ snapshots: http-parser-js@0.5.10: {} - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 3.0.1 - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -20362,8 +20354,6 @@ snapshots: '@sideway/pinpoint': 2.0.0 optional: true - jose@4.15.9: {} - jose@6.2.12: {} jose@6.2.3: {} @@ -20515,13 +20505,14 @@ snapshots: ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - jwks-rsa@3.2.2: + jwks-rsa@4.1.0: dependencies: '@types/jsonwebtoken': 9.0.10 debug: 4.4.3 - jose: 4.15.9 + jose: 6.2.12 limiter: 1.1.5 - lru-memoizer: 2.3.0 + lru-cache: 11.5.2 + lru-memoizer: 3.0.0 transitivePeerDependencies: - supports-color @@ -20797,14 +20788,10 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - lru-memoizer@2.3.0: + lru-memoizer@3.0.0: dependencies: lodash.clonedeep: 4.5.0 - lru-cache: 6.0.0 + lru-cache: 11.5.2 lucide-react@1.21.0(react@19.2.8): dependencies: @@ -22414,7 +22401,12 @@ snapshots: proto-list@1.2.4: optional: true - proto3-json-serializer@2.0.2: + proto3-json-serializer@3.0.4: + dependencies: + protobufjs: 8.7.0 + optional: true + + proto3-json-serializer@4.0.2: dependencies: protobufjs: 8.7.0 optional: true @@ -22952,13 +22944,19 @@ snapshots: nlcst-to-string: 4.0.0 unist-util-visit: 5.1.0 - retry-request@7.0.2: + retry-request@8.0.4: dependencies: - '@types/request': 2.48.13 extend: 3.0.2 - teeny-request: 9.0.0 + teeny-request: 10.1.4 + transitivePeerDependencies: + - supports-color + optional: true + + retry-request@9.0.1: + dependencies: + extend: 3.0.2 + teeny-request: 11.0.1 transitivePeerDependencies: - - encoding - supports-color optional: true @@ -22969,6 +22967,11 @@ snapshots: rgbcolor@1.0.1: optional: true + rimraf@5.0.10: + dependencies: + glob: 13.0.6 + optional: true + robust-predicates@3.0.2: {} rolldown@1.2.3: @@ -23584,15 +23587,23 @@ snapshots: dependencies: bintrees: 1.0.2 - teeny-request@9.0.0: + teeny-request@10.1.4: dependencies: - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + stream-events: 1.0.5 + transitivePeerDependencies: + - supports-color + optional: true + + teeny-request@11.0.1: + dependencies: + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 stream-events: 1.0.5 - uuid: 14.0.1 transitivePeerDependencies: - - encoding - supports-color optional: true @@ -23959,8 +23970,6 @@ snapshots: base64-arraybuffer: 1.0.2 optional: true - uuid@14.0.1: {} - uuid@14.0.2: {} v9u-smb2@1.0.6: @@ -24459,8 +24468,6 @@ snapshots: yallist@3.1.1: {} - yallist@4.0.0: {} - yaml-language-server@1.23.0: dependencies: '@vscode/l10n': 0.0.18