From da4d2d1ea60fad968046acc23d353e157d2ebfea Mon Sep 17 00:00:00 2001 From: Maneesh Tewani Date: Mon, 7 Apr 2025 12:49:31 -0700 Subject: [PATCH 1/3] Added data connect to schematics (#3638) --- package-lock.json | 23 +- package.json | 4 +- src/schematics/deploy/actions.jasmine.ts | 3 + src/schematics/interfaces.ts | 42 ++- src/schematics/setup/index.ts | 64 ++++- src/schematics/utils.ts | 341 +++++++++++++++++------ 6 files changed, 376 insertions(+), 101 deletions(-) diff --git a/package-lock.json b/package-lock.json index eb7345108..0fe303560 100644 --- a/package-lock.json +++ b/package-lock.json @@ -80,7 +80,8 @@ "ts-patch": "^3.2.1", "ts-transformer-keys": "^0.4.4", "tslint": "~6.1.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.7", + "yaml": "^2.7.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -10112,6 +10113,14 @@ "node": ">=10" } }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -22521,11 +22530,15 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/yargs": { diff --git a/package.json b/package.json index c1b65f784..a3752fe74 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "test:chrome-headless": "npx --yes firebase-tools@latest emulators:exec --project=demo-123 \"ng test --watch=false --browsers=ChromeHeadless\"", "test:firefox-headless": "npx --yes firebase-tools@latest emulators:exec --project=demo-123 \"ng test --watch=false --browsers=FirefoxHeadless\"", "lint": "ng lint", + "lint:fix": "ng lint --fix", "test:node": "node -r tsconfig-paths/register ./dist/out-tsc/jasmine/tools/jasmine.mjs --input-type=commonjs", "test:node-esm": "node -r tsconfig-paths/register ./dist/out-tsc/jasmine/tools/jasmine.mjs", "test:typings": "node ./tools/run-typings-test.js", @@ -116,7 +117,8 @@ "ts-patch": "^3.2.1", "ts-transformer-keys": "^0.4.4", "tslint": "~6.1.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.7", + "yaml": "^2.7.0" }, "typings": "index.d.ts" } diff --git a/src/schematics/deploy/actions.jasmine.ts b/src/schematics/deploy/actions.jasmine.ts index 890e76350..abae2e375 100644 --- a/src/schematics/deploy/actions.jasmine.ts +++ b/src/schematics/deploy/actions.jasmine.ts @@ -63,6 +63,9 @@ const initMocks = () => { create: () => Promise.reject(), } }, + init() { + return Promise.resolve() + }, deploy: (_: FirebaseDeployConfig) => Promise.resolve(), use: () => Promise.resolve(), logger: { diff --git a/src/schematics/interfaces.ts b/src/schematics/interfaces.ts index 916ac7725..a21df2168 100644 --- a/src/schematics/interfaces.ts +++ b/src/schematics/interfaces.ts @@ -21,7 +21,7 @@ export const featureOptions = [ { name: 'App Check', value: FEATURES.AppCheck }, { name: 'Firestore', value: FEATURES.Firestore }, { name: 'Realtime Database', value: FEATURES.Database }, - // { name: 'Data Connect', value: FEATURES.DataConnect }, + { name: 'Data Connect', value: FEATURES.DataConnect }, { name: 'Cloud Functions (callable)', value: FEATURES.Functions }, { name: 'Cloud Messaging', value: FEATURES.Messaging }, { name: 'Performance Monitoring', value: FEATURES.Performance }, @@ -132,6 +132,8 @@ export interface FirebaseTools { serve(options: any): Promise; use(options: any, lol: any): Promise; + + init(feature: string, options: any): Promise; } export interface FirebaseHostingRewrite { @@ -149,9 +151,14 @@ export interface FirebaseHostingConfig { export type FirebaseFunctionsConfig = Record; +export interface DataConnectConfig { + source?: string; +} + export interface FirebaseJSON { hosting?: FirebaseHostingConfig[] | FirebaseHostingConfig; functions?: FirebaseFunctionsConfig; + dataconnect?: DataConnectConfig; } export interface FirebaseRcTarget { @@ -225,3 +232,36 @@ export interface Workspace { defaultProject?: string; projects: Record; } + +export interface ConnectorConfig { + location: string; + connector: string; + service: string; +} +export interface ConnectorYaml { + connectorId: string; + generate?: { + javascriptSdk?: { + package: string; + outputDir: string; + packageJsonDir?: string; + angular?: boolean; + } + } +} +export interface DataConnectYaml { + location: string; + serviceId: string; + connectorDirs: string[]; +} +export interface DataConnectConnectorConfig { + connectorYaml: ConnectorYaml; + connectorConfig?: ConnectorConfig; + angular?: boolean; + package?: string; +} + +export interface PackageJson { + dependencies: Record; + devDependencies: Record; +} diff --git a/src/schematics/setup/index.ts b/src/schematics/setup/index.ts index fb26e8250..06e29f789 100644 --- a/src/schematics/setup/index.ts +++ b/src/schematics/setup/index.ts @@ -1,17 +1,20 @@ -import { writeFileSync } from 'fs'; +import { readFileSync, writeFileSync } from 'fs'; import { join } from 'path'; import { asWindowsPath, normalize } from '@angular-devkit/core'; import { SchematicContext, Tree, chain } from '@angular-devkit/schematics'; import { addRootProvider } from '@schematics/angular/utility'; import { getFirebaseTools } from '../firebaseTools'; import { - DeployOptions, FEATURES, FirebaseApp, FirebaseProject, + DataConnectConnectorConfig, + DeployOptions, FEATURES, FirebaseApp, FirebaseJSON, FirebaseProject, } from '../interfaces'; import { addIgnoreFiles, featureToRules, getFirebaseProjectNameFromHost, getProject, + parseDataConnectConfig, + setupTanstackDependencies, } from '../utils'; import { appPrompt, featuresPrompt, projectPrompt, userPrompt } from './prompts'; @@ -19,6 +22,9 @@ export interface SetupConfig extends DeployOptions { firebaseProject: FirebaseProject, firebaseApp?: FirebaseApp, sdkConfig?: Record, + firebaseJsonConfig?: FirebaseJSON; + dataConnectConfig?: DataConnectConnectorConfig | null; + firebaseJsonPath: string; } export const setupProject = @@ -35,7 +41,7 @@ export const setupProject = config.sdkConfig ? `{ ${Object.entries(config.sdkConfig).map(([k, v]) => `${k}: ${JSON.stringify(v)}`).join(", ")} }` : "" }))`; }), - ...featureToRules(features, projectName), + ...featureToRules(features, projectName, config.dataConnectConfig), ]); } }; @@ -56,6 +62,10 @@ export const ngAddSetupProject = ( // Add the firebase files if they don't exist already so login.use works if (!host.exists('/firebase.json')) { writeFileSync(join(projectRoot, 'firebase.json'), '{}'); } + + let firebaseJson: FirebaseJSON = JSON.parse( + readFileSync(join(projectRoot, "firebase.json")).toString() + ); const user = await userPrompt({ projectRoot }); const defaultUser = await firebaseTools.login(options); @@ -72,6 +82,11 @@ export const ngAddSetupProject = ( let firebaseApp: FirebaseApp|undefined; let sdkConfig: Record|undefined; + const setupConfig: SetupConfig = { + ...options, firebaseProject, firebaseApp, sdkConfig, + firebaseJsonConfig: firebaseJson, + firebaseJsonPath: projectRoot + }; if (features.length) { firebaseApp = await appPrompt(firebaseProject, undefined, { projectRoot }); @@ -79,12 +94,45 @@ export const ngAddSetupProject = ( const result = await firebaseTools.apps.sdkconfig('web', firebaseApp.appId, { nonInteractive: true, projectRoot }); sdkConfig = result.sdkConfig; delete sdkConfig.locationId; - + setupConfig.sdkConfig = sdkConfig; + setupConfig.firebaseApp = firebaseApp; + // set up data connect locally if data connect hasn't already been initialized. + if(features.includes(FEATURES.DataConnect)) { + if (!firebaseJson.dataconnect) { + try { + await firebaseTools.init("dataconnect", { + projectRoot, + project: firebaseProject.projectId, + }); + // Update firebaseJson values to include newly added dataconnect field in firebase.json. + firebaseJson = JSON.parse( + readFileSync(join(projectRoot, "firebase.json")).toString() + ); + setupConfig.firebaseJsonConfig = firebaseJson; + } catch (e) { + console.error(e); + } + } + let dataConnectConfig = parseDataConnectConfig(setupConfig); + if(!dataConnectConfig?.connectorYaml.generate?.javascriptSdk) { + await firebaseTools.init("dataconnect:sdk", { + projectRoot, + project: firebaseProject.projectId, + }); + } + // Parse through sdk again + dataConnectConfig = parseDataConnectConfig(setupConfig); + if(dataConnectConfig?.angular) { + context.logger.info('Generated Angular SDK Enabled.'); + } else { + context.logger.info('Generated Angular SDK Disabled. Please add `angular: true` to your connector.yaml'); + } + setupTanstackDependencies(host, context); + setupConfig.dataConnectConfig = dataConnectConfig; + } + } - return setupProject(host, context, features, { - ...options, firebaseProject, firebaseApp, sdkConfig, - }); - + return setupProject(host, context, features, setupConfig); } }; diff --git a/src/schematics/utils.ts b/src/schematics/utils.ts index 73fea996b..b42afb07c 100644 --- a/src/schematics/utils.ts +++ b/src/schematics/utils.ts @@ -1,16 +1,37 @@ -import { readFileSync } from 'fs'; -import { join } from 'path'; -import { Rule, SchematicsException, Tree, chain } from '@angular-devkit/schematics'; -import { addRootProvider } from '@schematics/angular/utility'; -import { overwriteIfExists } from './common'; -import { DeployOptions, FEATURES, FirebaseApp, FirebaseRc, Workspace } from './interfaces'; +import { readFileSync } from "fs"; +import { join } from "path"; +import { + Rule, + SchematicContext, + SchematicsException, + Tree, + chain, +} from "@angular-devkit/schematics"; +import { NodePackageInstallTask } from "@angular-devkit/schematics/tasks"; +import { addRootProvider } from "@schematics/angular/utility"; +import { parse } from "yaml"; +import { overwriteIfExists, safeReadJSON, stringifyFormatted } from "./common"; +import { + ConnectorConfig, + ConnectorYaml, + DataConnectConnectorConfig, + DataConnectYaml, + DeployOptions, + FEATURES, + FirebaseApp, + FirebaseRc, + PackageJson, + Workspace, +} from "./interfaces"; +import { SetupConfig } from "./setup"; -export const shortAppId = (app?: FirebaseApp) => app?.appId?.split('/').pop(); +export const shortAppId = (app?: FirebaseApp) => app?.appId?.split("/").pop(); -export function getWorkspace( - host: Tree -): { path: string; workspace: Workspace } { - const path = '/angular.json'; +export function getWorkspace(host: Tree): { + path: string; + workspace: Workspace; +} { + const path = "/angular.json"; const configBuffer = path && host.read(path); if (!configBuffer) { @@ -18,16 +39,16 @@ export function getWorkspace( } // eslint-disable-next-line @typescript-eslint/no-var-requires - const { parse } = require('jsonc-parser'); + const { parse } = require("jsonc-parser"); - const workspace = parse(configBuffer.toString()) as Workspace|undefined; + const workspace = parse(configBuffer.toString()) as Workspace | undefined; if (!workspace) { - throw new SchematicsException('Could not parse angular.json'); + throw new SchematicsException("Could not parse angular.json"); } return { path, - workspace + workspace, }; } @@ -37,31 +58,31 @@ export const getProject = (options: DeployOptions, host: Tree) => { if (!projectName) { throw new SchematicsException( - 'No Angular project selected and no default project in the workspace' + "No Angular project selected and no default project in the workspace" ); } const project = workspace.projects[projectName]; if (!project) { throw new SchematicsException( - 'The specified Angular project is not defined in this workspace' + "The specified Angular project is not defined in this workspace" ); } - if (project.projectType !== 'application') { + if (project.projectType !== "application") { throw new SchematicsException( `Deploy requires an Angular project type of "application" in angular.json` ); } - return {project, projectName}; + return { project, projectName }; }; export function getFirebaseProjectNameFromHost( host: Tree, target: string -): [string|undefined, string|undefined] { - const buffer = host.read('/.firebaserc'); +): [string | undefined, string | undefined] { + const buffer = host.read("/.firebaserc"); if (!buffer) { return [undefined, undefined]; } @@ -72,8 +93,8 @@ export function getFirebaseProjectNameFromHost( export function getFirebaseProjectNameFromFs( root: string, target: string -): [string|undefined, string|undefined] { - const path = join(root, '.firebaserc'); +): [string | undefined, string | undefined] { + const path = join(root, ".firebaserc"); try { const buffer = readFileSync(path); const rc: FirebaseRc = JSON.parse(buffer.toString()); @@ -83,10 +104,13 @@ export function getFirebaseProjectNameFromFs( } } -const projectFromRc = (rc: FirebaseRc, target: string): [string|undefined, string|undefined] => { +const projectFromRc = ( + rc: FirebaseRc, + target: string +): [string | undefined, string | undefined] => { const defaultProject = rc.projects?.default; const project = Object.keys(rc.targets || {}).find( - project => !!rc.targets?.[project]?.hosting?.[target] + (project) => !!rc.targets?.[project]?.hosting?.[target] ); const site = project && rc.targets?.[project]?.hosting?.[target]?.[0]; return [project || defaultProject, site]; @@ -104,26 +128,43 @@ export function addFixesToServer(host: Tree) { if (text === null) { throw new SchematicsException(`File ${serverPath} does not exist.`); } - const sourceText = text.toString('utf-8'); - const addZonePatch = !sourceText.includes('import \'zone.js/dist/zone-patch-rxjs\';'); + const sourceText = text.toString("utf-8"); + const addZonePatch = !sourceText.includes( + "import 'zone.js/dist/zone-patch-rxjs';" + ); if (addZonePatch) { - overwriteIfExists(host, serverPath, sourceText.replace('import \'zone.js/dist/zone-node\';', `import 'zone.js/dist/zone-node'; -${addZonePatch ? 'import \'zone.js/dist/zone-patch-rxjs\';' : ''}`)); + overwriteIfExists( + host, + serverPath, + sourceText.replace( + "import 'zone.js/dist/zone-node';", + `import 'zone.js/dist/zone-node'; +${addZonePatch ? "import 'zone.js/dist/zone-patch-rxjs';" : ""}` + ) + ); } return host; } -export function featureToRules(features: FEATURES[], projectName: string) { - return features.map(feature => { - switch (feature) { +export function featureToRules( + features: FEATURES[], + projectName: string, + dataConnectConfig?: DataConnectConnectorConfig | null +) { + return features + .map((feature) => { + switch (feature) { case FEATURES.AppCheck: // TODO make this smarter in Angular Universal - return addRootProvider(projectName, ({code, external}) => { - external('initializeAppCheck', '@angular/fire/app-check'); - external('ReCaptchaEnterpriseProvider', '@angular/fire/app-check'); - return code`${external('provideAppCheck', '@angular/fire/app-check')}(() => { + return addRootProvider(projectName, ({ code, external }) => { + external("initializeAppCheck", "@angular/fire/app-check"); + external("ReCaptchaEnterpriseProvider", "@angular/fire/app-check"); + return code`${external( + "provideAppCheck", + "@angular/fire/app-check" + )}(() => { // TODO get a reCAPTCHA Enterprise here https://console.cloud.google.com/security/recaptcha?project=_ const provider = new ReCaptchaEnterpriseProvider(/* reCAPTCHA Enterprise site key */); return initializeAppCheck(undefined, { provider, isTokenAutoRefreshEnabled: true }); @@ -131,83 +172,144 @@ export function featureToRules(features: FEATURES[], projectName: string) { }); case FEATURES.Analytics: return chain([ - addRootProvider(projectName, ({code, external}) => { - external('getAnalytics', '@angular/fire/analytics'); - return code`${external('provideAnalytics', '@angular/fire/analytics')}(() => getAnalytics())`; + addRootProvider(projectName, ({ code, external }) => { + external("getAnalytics", "@angular/fire/analytics"); + return code`${external( + "provideAnalytics", + "@angular/fire/analytics" + )}(() => getAnalytics())`; }), // TODO if using Angular router - addRootProvider(projectName, ({code, external}) => { - return code`${external('ScreenTrackingService', '@angular/fire/analytics')}`; + addRootProvider(projectName, ({ code, external }) => { + return code`${external( + "ScreenTrackingService", + "@angular/fire/analytics" + )}`; }), - ...(features.includes(FEATURES.Authentication) ? [ - addRootProvider(projectName, ({code, external}) => { - return code`${external('UserTrackingService', '@angular/fire/analytics')}`; - }) - ] : []), - ]) + ...(features.includes(FEATURES.Authentication) + ? [ + addRootProvider(projectName, ({ code, external }) => { + return code`${external( + "UserTrackingService", + "@angular/fire/analytics" + )}`; + }), + ] + : []), + ]); case FEATURES.Authentication: - return addRootProvider(projectName, ({code, external}) => { - external('getAuth', '@angular/fire/auth'); - return code`${external('provideAuth', '@angular/fire/auth')}(() => getAuth())`; + return addRootProvider(projectName, ({ code, external }) => { + external("getAuth", "@angular/fire/auth"); + return code`${external( + "provideAuth", + "@angular/fire/auth" + )}(() => getAuth())`; }); case FEATURES.Database: - return addRootProvider(projectName, ({code, external}) => { - external('getDatabase', '@angular/fire/database'); - return code`${external('provideDatabase', '@angular/fire/database')}(() => getDatabase())`; + return addRootProvider(projectName, ({ code, external }) => { + external("getDatabase", "@angular/fire/database"); + return code`${external( + "provideDatabase", + "@angular/fire/database" + )}(() => getDatabase())`; }); case FEATURES.DataConnect: - throw "unimplemented."; - // TODO need to add the generation of the project, grab the connector config - // that requires this go async - // return addRootProvider(projectName, ({code, external}) => { - // external('getDataConnect', '@angular/fire/data-connect'); - // return code`${external('provideDataConnect', '@angular/fire/data-connect')}(() => getDataConnect())`; - // }); + return addRootProvider(projectName, ({ code, external }) => { + external("getDataConnect", "@angular/fire/data-connect"); + let configAsStr = "{}"; + + const config = dataConnectConfig; + let angularConfig: undefined | string; + if (config) { + if (config.package) { + configAsStr = external("connectorConfig", config.package); + } else { + configAsStr = `{${Object.keys(config.connectorConfig as ConnectorConfig).map( + (key) => `${key}: "${(config.connectorConfig as ConnectorConfig)[key]}"` + ).join(',')}}`; + } + if (config.angular) { + angularConfig = `, ${external( + "provideTanStackQuery", + "@tanstack/angular-query-experimental" + )}(new ${external( + "QueryClient", + "@tanstack/angular-query-experimental" + )}())`; + } + } + return code`${external( + "provideDataConnect", + "@angular/fire/data-connect" + )}(() => getDataConnect(${configAsStr}))${angularConfig ?? ""}`; + }); case FEATURES.Firestore: - return addRootProvider(projectName, ({code, external}) => { - external('getFirestore', '@angular/fire/firestore'); - return code`${external('provideFirestore', '@angular/fire/firestore')}(() => getFirestore())`; + return addRootProvider(projectName, ({ code, external }) => { + external("getFirestore", "@angular/fire/firestore"); + return code`${external( + "provideFirestore", + "@angular/fire/firestore" + )}(() => getFirestore())`; }); case FEATURES.Functions: - return addRootProvider(projectName, ({code, external}) => { - external('getFunctions', '@angular/fire/functions'); - return code`${external('provideFunctions', '@angular/fire/functions')}(() => getFunctions())`; + return addRootProvider(projectName, ({ code, external }) => { + external("getFunctions", "@angular/fire/functions"); + return code`${external( + "provideFunctions", + "@angular/fire/functions" + )}(() => getFunctions())`; }); case FEATURES.Messaging: // TODO add the service worker - return addRootProvider(projectName, ({code, external}) => { - external('getMessaging', '@angular/fire/messaging'); - return code`${external('provideMessaging', '@angular/fire/messaging')}(() => getMessaging())`; + return addRootProvider(projectName, ({ code, external }) => { + external("getMessaging", "@angular/fire/messaging"); + return code`${external( + "provideMessaging", + "@angular/fire/messaging" + )}(() => getMessaging())`; }); case FEATURES.Performance: - return addRootProvider(projectName, ({code, external}) => { - external('getPerformance', '@angular/fire/performance'); - return code`${external('providePerformance', '@angular/fire/performance')}(() => getPerformance())`; + return addRootProvider(projectName, ({ code, external }) => { + external("getPerformance", "@angular/fire/performance"); + return code`${external( + "providePerformance", + "@angular/fire/performance" + )}(() => getPerformance())`; }); case FEATURES.Storage: - return addRootProvider(projectName, ({code, external}) => { - external('getStorage', '@angular/fire/storage'); - return code`${external('provideStorage', '@angular/fire/storage')}(() => getStorage())`; + return addRootProvider(projectName, ({ code, external }) => { + external("getStorage", "@angular/fire/storage"); + return code`${external( + "provideStorage", + "@angular/fire/storage" + )}(() => getStorage())`; }); case FEATURES.RemoteConfig: // TODO consider downloading the defaults - return addRootProvider(projectName, ({code, external}) => { - external('getRemoteConfig', '@angular/fire/remote-config'); - return code`${external('provideRemoteConfig', '@angular/fire/remote-config')}(() => getRemoteConfig())`; + return addRootProvider(projectName, ({ code, external }) => { + external("getRemoteConfig", "@angular/fire/remote-config"); + return code`${external( + "provideRemoteConfig", + "@angular/fire/remote-config" + )}(() => getRemoteConfig())`; }); case FEATURES.VertexAI: - return addRootProvider(projectName, ({code, external}) => { - external('getVertexAI', '@angular/fire/vertexai'); - return code`${external('provideVertexAI', '@angular/fire/vertexai')}(() => getVertexAI())`; + return addRootProvider(projectName, ({ code, external }) => { + external("getVertexAI", "@angular/fire/vertexai"); + return code`${external( + "provideVertexAI", + "@angular/fire/vertexai" + )}(() => getVertexAI())`; }); default: return undefined; } - }).filter((it): it is Rule => !!it); + }) + .filter((it): it is Rule => !!it); } export const addIgnoreFiles = (host: Tree) => { - const path = '/.gitignore'; + const path = "/.gitignore"; if (!host.exists(path)) { return host; } @@ -218,14 +320,81 @@ export const addIgnoreFiles = (host: Tree) => { } const content = buffer.toString(); - if (!content.includes('# Firebase')) { - overwriteIfExists(host, path, content.concat(` + if (!content.includes("# Firebase")) { + overwriteIfExists( + host, + path, + content.concat(` # Firebase .firebase *-debug.log .runtimeconfig.json -`)); +`) + ); } return host; }; + +export function parseDataConnectConfig( + config: SetupConfig +): DataConnectConnectorConfig | null { + if (!config.firebaseJsonConfig) { + throw new Error("No firebase json"); + } + if (!config.firebaseJsonConfig.dataconnect?.source) { + throw new Error( + "Couldn't find data connect configuration. Running `firebase init dataconnect`" + ); + } + const dataConnectFolder = join( + config.firebaseJsonPath, + config.firebaseJsonConfig.dataconnect?.source + ); + const sourcePath = join(dataConnectFolder, "dataconnect.yaml"); + try { + const fileAsStr = readFileSync(sourcePath).toString(); + const dataConnectYaml: DataConnectYaml = parse(fileAsStr); + const connectorPath = join( + dataConnectFolder, + dataConnectYaml.connectorDirs[0], + "connector.yaml" + ); + const connectorAsStr = readFileSync(connectorPath).toString(); + const connectorJson: ConnectorYaml = parse(connectorAsStr); + if (!connectorJson?.generate?.javascriptSdk) { + return { connectorYaml: connectorJson }; + } + return { + connectorYaml: connectorJson, + connectorConfig: { + connector: connectorJson.connectorId, + location: dataConnectYaml.location, + service: dataConnectYaml.serviceId, + }, + package: connectorJson.generate.javascriptSdk.package, + angular: connectorJson.generate.javascriptSdk.angular, + }; + } catch (e) { + console.error("Couldn't parse dataconnect.yaml", e); + return null; + } +} + +export function setupTanstackDependencies( + host: Tree, + context: SchematicContext +) { + const packageJson: PackageJson = safeReadJSON("package.json", host); + const tanstackFirebasePackage = "@tanstack-query-firebase/angular"; + if ( + !packageJson.dependencies[tanstackFirebasePackage] && + !packageJson.devDependencies[tanstackFirebasePackage] + ) { + packageJson.dependencies[tanstackFirebasePackage] = + "^1.0.0"; + packageJson.dependencies["@tanstack/angular-query-experimental"] = "5.66.4"; + overwriteIfExists(host, "package.json", stringifyFormatted(packageJson)); + context.addTask(new NodePackageInstallTask()); + } +} From ec4e3bd89e33862d976fc9114baa88a860847ae7 Mon Sep 17 00:00:00 2001 From: James Daniels Date: Tue, 8 Apr 2025 23:22:20 -0400 Subject: [PATCH 2/3] Bump action, bump minor (#3644) * Bump minor * Bump upload/download artifact --- .github/workflows/test.yml | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6d109a60e..ebb9d9b3e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,7 +47,7 @@ jobs: - name: Build run: ./tools/build.sh - name: 'Upload Artifact' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: angularfire-${{ github.run_id }} path: dist @@ -82,7 +82,7 @@ jobs: if: steps.node_modules_cache.outputs.cache-hit != 'true' run: npm ci - name: Download Artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 - name: Relocate Artifacts run: mv angularfire-${{ github.run_id }} dist - name: Test Node @@ -133,7 +133,7 @@ jobs: path: ~/.cache/firebase/emulators key: firebase_emulators - name: Download Artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 - name: Relocate Artifacts run: mv angularfire-${{ github.run_id }} dist - name: Test browser @@ -210,7 +210,7 @@ jobs: registry-url: 'https://registry.npmjs.org' check-latest: false - name: 'Download Artifacts' - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 - name: Publish run: | cd ./angularfire-${{ github.run_id }}/packages-dist diff --git a/package.json b/package.json index a3752fe74..20357e87b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/fire", - "version": "19.0.0", + "version": "19.1.0", "description": "Angular + Firebase = ❤️", "private": true, "scripts": { From 20bee94a2e657d71098bc84a7db653ef3809bc3e Mon Sep 17 00:00:00 2001 From: Alexander Nohe Date: Wed, 14 May 2025 09:19:03 -0700 Subject: [PATCH 3/3] Add AI package (#3650) * Bump to dependency on firebase 11.8.0 (currently a prerelease) * Add new AI entry --------- Co-authored-by: James Daniels --- package-lock.json | 1146 ++++++++++++++++++++++++++++++-------- package.json | 7 +- src/ai/ai.module.ts | 79 +++ src/ai/ai.spec.ts | 38 ++ src/ai/ai.ts | 30 + src/ai/firebase.ts | 14 + src/ai/ng-package.json | 6 + src/ai/package.json | 3 + src/ai/public_api.ts | 3 + src/package.json | 2 +- src/vertexai/firebase.ts | 4 + tools/build.ts | 1 + 12 files changed, 1099 insertions(+), 234 deletions(-) create mode 100644 src/ai/ai.module.ts create mode 100644 src/ai/ai.spec.ts create mode 100644 src/ai/ai.ts create mode 100644 src/ai/firebase.ts create mode 100644 src/ai/ng-package.json create mode 100644 src/ai/package.json create mode 100644 src/ai/public_api.ts diff --git a/package-lock.json b/package-lock.json index 0fe303560..e264b4f59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@angular/fire", - "version": "19.0.0", + "version": "19.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@angular/fire", - "version": "19.0.0", + "version": "19.1.0", "license": "MIT", "dependencies": { "@angular-devkit/architect": "~0.1900.0", @@ -20,7 +20,7 @@ "@angular/router": "^19.0.0", "@schematics/angular": "^19.0.0", "esbuild": "^0.24.0", - "firebase": "^11.2.0", + "firebase": "11.8.0-20250512211235", "firebase-functions": "^6.1.0", "fs-extra": "^8.0.1", "fuzzy": "^0.1.3", @@ -4264,36 +4264,82 @@ "license": "MIT", "peer": true }, + "node_modules/@firebase/ai": { + "version": "1.3.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-1.3.0-20250512211235.tgz", + "integrity": "sha512-L/3vFDzzmAScgRVcZXiqyQHLXTjyBvfC4bVHvsHGlUyBYjlS+xcPUFdNHFowM84r6qyp/X94pO58ERgRO/CUCg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/component": "0.6.14", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, "node_modules/@firebase/analytics": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.11.tgz", - "integrity": "sha512-zwuPiRE0+hgcS95JZbJ6DFQN4xYFO8IyGxpeePTV51YJMwCf3lkBa6FnZ/iXIqDKcBPMgMuuEZozI0BJWaLEYg==", + "version": "0.10.14-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.14-20250512211235.tgz", + "integrity": "sha512-yPo0D9Ec5jSWRmI6JYt8PCzTVUHtTvnmhN7s09Wh2ckrbv7kgejIAYOjKOK30Umro+teA6wTsY07Q27C1dOM4A==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/installations": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/installations": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.13.0-20250512211235" } }, "node_modules/@firebase/analytics-compat": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.17.tgz", - "integrity": "sha512-SJNVOeTvzdqZQvXFzj7yAirXnYcLDxh57wBFROfeowq/kRN1AqOw1tG6U4OiFOEhqi7s3xLze/LMkZatk2IEww==", + "version": "0.2.20-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.20-20250512211235.tgz", + "integrity": "sha512-2MmqqNlHlbs6454pOnKnNbtz8cF54UYgCiFWc0tXV6VNrSAGAyWgY3Ujve5+ayuSmzMuTaLNKk8kOPC90nNmCA==", "license": "Apache-2.0", "dependencies": { - "@firebase/analytics": "0.10.11", + "@firebase/analytics": "0.10.14-20250512211235", "@firebase/analytics-types": "0.8.3", - "@firebase/component": "0.6.12", - "@firebase/util": "1.10.3", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "peerDependencies": { - "@firebase/app-compat": "0.x" + "@firebase/app-compat": "0.4.0-20250512211235" + } + }, + "node_modules/@firebase/analytics-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/analytics-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/analytics-types": { @@ -4302,15 +4348,41 @@ "integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==", "license": "Apache-2.0" }, + "node_modules/@firebase/analytics/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/analytics/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@firebase/app": { - "version": "0.10.18", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.18.tgz", - "integrity": "sha512-VuqEwD/QRisKd/zsFsqgvSAx34mZ3WEF47i97FD6Vw4GWAhdjepYf0Hmi6K0b4QMSgWcv/x0C30Slm5NjjERXg==", + "version": "0.13.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.13.0-20250512211235.tgz", + "integrity": "sha512-9qcJX9fKMFuZf5+8BxK0Dg1gJU+x4shoH+VFiKnZ7ri6sJ0OP67Y4PnHDYdzKmx7/HJt0KSyZMDUX/hT2Wbl/g==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -4319,41 +4391,67 @@ } }, "node_modules/@firebase/app-check": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.11.tgz", - "integrity": "sha512-42zIfRI08/7bQqczAy7sY2JqZYEv3a1eNa4fLFdtJ54vNevbBIRSEA3fZgRqWFNHalh5ohsBXdrYgFqaRIuCcQ==", + "version": "0.10.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.10.0-20250512211235.tgz", + "integrity": "sha512-zFbNyt3j6ixg6/Gh3WdA+FvMhUxIRASEq/NRC+Jtofm5la5ZJ88wdLDJ/kSHtdMINQfKuneHbJJ832u5BTqpYQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.13.0-20250512211235" } }, "node_modules/@firebase/app-check-compat": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.18.tgz", - "integrity": "sha512-qjozwnwYmAIdrsVGrJk+hnF1WBois54IhZR6gO0wtZQoTvWL/GtiA2F31TIgAhF0ayUiZhztOv1RfC7YyrZGDQ==", + "version": "0.3.23-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.23-20250512211235.tgz", + "integrity": "sha512-iI2mGM/f8z4aQhoB57HnErh8vCqyQJFVQS7USLy6dUyL15FcIe5HQ88N4oD9glagu4IDRlZ+Rohlrw9ObbyNxA==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-check": "0.8.11", + "@firebase/app-check": "0.10.0-20250512211235", "@firebase/app-check-types": "0.5.3", - "@firebase/component": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@firebase/app-compat": "0.x" + "@firebase/app-compat": "0.4.0-20250512211235" + } + }, + "node_modules/@firebase/app-check-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app-check-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/app-check-interop-types": { @@ -4368,16 +4466,68 @@ "integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==", "license": "Apache-2.0" }, + "node_modules/@firebase/app-check/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app-check/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@firebase/app-compat": { - "version": "0.2.48", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.48.tgz", - "integrity": "sha512-wVNU1foBIaJncUmiALyRxhHHHC3ZPMLIETTAk+2PG87eP9B/IDBsYUiTpHyboDPEI8CgBPat/zN2v+Snkz6lBw==", + "version": "0.4.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.4.0-20250512211235.tgz", + "integrity": "sha512-epnyKsA97L0FMigDHWOcgJ2TeMnlpuyiGIVZdnQiElKfRs3UFgDvBb6AK5dHgT4REe7ZbXqGa/8TSUUGFhEcmw==", "license": "Apache-2.0", "dependencies": { - "@firebase/app": "0.10.18", - "@firebase/component": "0.6.12", + "@firebase/app": "0.13.0-20250512211235", + "@firebase/component": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { "tslib": "^2.1.0" }, "engines": { @@ -4390,22 +4540,48 @@ "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", "license": "Apache-2.0" }, + "node_modules/@firebase/app/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@firebase/auth": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.8.2.tgz", - "integrity": "sha512-q+071y2LWe0bVnjqaX3BscqZwzdP0GKN2YBKapLq4bV88MPfCtWwGKmDhNDEDUmioOjudGXkUY5cvvKqk3mlUg==", + "version": "1.10.3-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.10.3-20250512211235.tgz", + "integrity": "sha512-f7Lov3vogDMyroncY7OipDmNL5bqZcDxdIVe1qN/LEaaKygG2wPxKMa+LjSFwxwo/oGp/i6R4ixT8otMkOL2MQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@firebase/app": "0.x", + "@firebase/app": "0.13.0-20250512211235", "@react-native-async-storage/async-storage": "^1.18.1" }, "peerDependenciesMeta": { @@ -4415,22 +4591,48 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.17.tgz", - "integrity": "sha512-Shi6rqLqzU9KLXnUCmlLvVByq1kiG3oe7Wpbf5m1CgS7NiRx2pSSn0HLaRRozdkaizNzMGGj+3oHmNYQ7kU6xA==", + "version": "0.5.23-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.23-20250512211235.tgz", + "integrity": "sha512-dWBbbYAiNmrD6+P5m2TgQ9GWPIffjedQ9HRXnPyqKytTiEQzxvYBd91NS3y3YI6bBg1RWAWccMnwtQVjl1eK6A==", "license": "Apache-2.0", "dependencies": { - "@firebase/auth": "1.8.2", - "@firebase/auth-types": "0.12.3", - "@firebase/component": "0.6.12", - "@firebase/util": "1.10.3", + "@firebase/auth": "1.10.3-20250512211235", + "@firebase/auth-types": "0.13.0", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@firebase/app-compat": "0.x" + "@firebase/app-compat": "0.4.0-20250512211235" + } + }, + "node_modules/@firebase/auth-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/auth-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/auth-interop-types": { @@ -4440,22 +4642,48 @@ "license": "Apache-2.0" }, "node_modules/@firebase/auth-types": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.3.tgz", - "integrity": "sha512-Zq9zI0o5hqXDtKg6yDkSnvMCMuLU6qAVS51PANQx+ZZX5xnzyNLEBO3GZgBUPsV5qIMFhjhqmLDxUqCbnAYy2A==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.0.tgz", + "integrity": "sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==", "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, + "node_modules/@firebase/auth/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/auth/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@firebase/component": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.12.tgz", - "integrity": "sha512-YnxqjtohLbnb7raXt2YuA44cC1wA9GiehM/cmxrsoxKlFxBLy2V0OkRSj9gpngAE0UoJ421Wlav9ycO7lTPAUw==", + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.14.tgz", + "integrity": "sha512-kf/zAT8GQJ9nYoHuj0mv7twp1QzifKYrO+GsmsVHHM+Hi9KkmI7E3B3J0CtihHpb34vinl4gbJrYJ2p2wfvc9A==", "license": "Apache-2.0", "dependencies": { - "@firebase/util": "1.10.3", + "@firebase/util": "1.11.1", "tslib": "^2.1.0" }, "engines": { @@ -4463,32 +4691,58 @@ } }, "node_modules/@firebase/data-connect": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.2.0.tgz", - "integrity": "sha512-7OrZtQoLSk2fiGijhIdUnTSqEFti3h1EMhw9nNiSZ6jJGduw4Pz6jrVvxjpZJtGH/JiljbMkBnPBS2h8CTRKEw==", + "version": "0.3.6-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.3.6-20250512211235.tgz", + "integrity": "sha512-ZMs7lX9/Sd7XNRaylht535sY1mFUasLCY0toKQWF4KIAdUeij0TNzqWpeULNqNJXtczu+eRrG3Nct1rY4JtiiQ==", "license": "Apache-2.0", "dependencies": { "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.13.0-20250512211235" + } + }, + "node_modules/@firebase/data-connect/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/data-connect/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/database": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.11.tgz", - "integrity": "sha512-gLrw/XeioswWUXgpVKCPAzzoOuvYNqK5fRUeiJTzO7Mlp9P6ylFEyPJlRBl1djqYye641r3MX6AmIeMXwjgwuQ==", + "version": "1.0.16-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.16-20250512211235.tgz", + "integrity": "sha512-l2jVH/uCzbuAhCYk37+YWFHE2nIkGyTiFL3RthkDvoT+KHDzvaIxnWmjnbAgrQEYSHaimziiw0DmpQM+Safb0g==", "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.3", "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "faye-websocket": "0.11.4", "tslib": "^2.1.0" }, @@ -4497,16 +4751,42 @@ } }, "node_modules/@firebase/database-compat": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.2.tgz", - "integrity": "sha512-5zvdnMsfDHvrQAVM6jBS7CkBpu+z3YbpFdhxRsrK1FP45IEfxlzpeuEUb17D/tpM10vfq4Ok0x5akIBaCv7gfA==", + "version": "2.0.7-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.7-20250512211235.tgz", + "integrity": "sha512-8bt/9/EXqxce32RDg254yfkEUsG9x9h3K6+IFdsCeLhPH9mQLosrcRBSHusHGX65oNbY1ATgxkt/+v+uhoj+nw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/database": "1.0.11", - "@firebase/database-types": "1.0.8", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/database": "1.0.16-20250512211235", + "@firebase/database-types": "1.0.12-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { "tslib": "^2.1.0" }, "engines": { @@ -4514,24 +4794,63 @@ } }, "node_modules/@firebase/database-types": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.8.tgz", - "integrity": "sha512-6lPWIGeufhUq1heofZULyVvWFhD01TUrkkB9vyhmksjZ4XF7NaivQp9rICMk7QNhqwa+uDCaj4j+Q8qqcSVZ9g==", + "version": "1.0.12-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.12-20250512211235.tgz", + "integrity": "sha512-FsZ/VeSyNLaJWQGLP0Yy955Zonlm/WSPhpdOpof84ToKAekUQobxlI08skPe+Gk2dAUnKrdqfGJPO9pagsByYA==", "license": "Apache-2.0", "dependencies": { "@firebase/app-types": "0.9.3", - "@firebase/util": "1.10.3" + "@firebase/util": "1.12.0-20250512211235" + } + }, + "node_modules/@firebase/database-types/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/firestore": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.7.6.tgz", - "integrity": "sha512-aVDboR+upR/44qZDLR4tnZ9pepSOFBbDJnwk7eWzmTyQq2nZAVG+HIhrqpQawmUVcDRkuJv2K2UT2+oqR8F8TA==", + "version": "4.7.13-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.7.13-20250512211235.tgz", + "integrity": "sha512-m3xEnbYrsgp58a5if00Vqrrglm/22yU7amZ3CjwqUD+/M6TFSf1a9lvMqF9S33AuPbwHDxUb3hJ4ogpTQ+uSjQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "@firebase/webchannel-wrapper": "1.0.3", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", @@ -4541,26 +4860,52 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.13.0-20250512211235" } }, "node_modules/@firebase/firestore-compat": { - "version": "0.3.41", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.41.tgz", - "integrity": "sha512-J/PgWKEt0yugETOE7lOabT16hsV21cLzSxERD7ZhaiwBQkBTSf0Mx9RhjZRT0Ttqe4weM90HGZFyUBqYA73fVA==", + "version": "0.3.48-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.48-20250512211235.tgz", + "integrity": "sha512-8nWD3QRkN9rUoApULVfBMg112QNYstUWRm58cMwcdp0Wkx6+RV+9YraDYzg7GmsEklL4CnGF36HGNrtzraxOTg==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/firestore": "4.7.6", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/firestore": "4.7.13-20250512211235", "@firebase/firestore-types": "3.0.3", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@firebase/app-compat": "0.x" + "@firebase/app-compat": "0.4.0-20250512211235" + } + }, + "node_modules/@firebase/firestore-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/firestore-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/firestore-types": { @@ -4573,43 +4918,95 @@ "@firebase/util": "1.x" } }, + "node_modules/@firebase/firestore/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/firestore/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@firebase/functions": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.12.1.tgz", - "integrity": "sha512-QucRiFrvMMmIGTRhL7ZK2IeBnAWP7lAmfFREMpEtX47GjVqDqGxdFs+Mg7XBzxSc9UjDO4Rxf+aE9xJHU6bGwg==", + "version": "0.12.5-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.12.5-20250512211235.tgz", + "integrity": "sha512-3BTjMHjx4ulr22+G1/ut8ZQW6OTGmpS5LC+2MhTl/W8OgSYP+3Hc844OhhlDq4kBjcWO752PG2+I1JwJNK6rPA==", "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.3", "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.13.0-20250512211235" } }, "node_modules/@firebase/functions-compat": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.18.tgz", - "integrity": "sha512-N7+RN5GVus2ORB8cqfSNhfSn4iaYws6F8uCCfn4mtjC7zYS/KH6muzNAhZUdUqlv5YazbVmvxlAoYYF39i8Qzg==", + "version": "0.3.22-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.22-20250512211235.tgz", + "integrity": "sha512-/CrVsUlcVKoCtuzpYzIfBYjdiCBtpMkDIY3M2/MIKv5gwB90ydX4E2OP/E57Ne85eiYfezYoGurt27OXSno/Fg==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/functions": "0.12.1", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/functions": "0.12.5-20250512211235", "@firebase/functions-types": "0.6.3", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@firebase/app-compat": "0.x" + "@firebase/app-compat": "0.4.0-20250512211235" + } + }, + "node_modules/@firebase/functions-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/functions-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/functions-types": { @@ -4618,35 +5015,87 @@ "integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==", "license": "Apache-2.0" }, + "node_modules/@firebase/functions/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/functions/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@firebase/installations": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.12.tgz", - "integrity": "sha512-ES/WpuAV2k2YtBTvdaknEo7IY8vaGjIjS3zhnHSAIvY9KwTR8XZFXOJoZ3nSkjN1A5R4MtEh+07drnzPDg9vaw==", + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.15-20250512211235.tgz", + "integrity": "sha512-RinZjbNpImsz0JGi6u6B6Yb7ezrE6ej2pdBT7K3ju1cScpBmKRBeWSl7AevD5PEH+W9E5i6U2VX+q2gycI3ZRA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/util": "1.10.3", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/util": "1.12.0-20250512211235", "idb": "7.1.1", "tslib": "^2.1.0" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.13.0-20250512211235" } }, "node_modules/@firebase/installations-compat": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.12.tgz", - "integrity": "sha512-RhcGknkxmFu92F6Jb3rXxv6a4sytPjJGifRZj8MSURPuv2Xu+/AispCXEfY1ZraobhEHTG5HLGsP6R4l9qB5aA==", + "version": "0.2.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.15-20250512211235.tgz", + "integrity": "sha512-i7sV28ZLE8p65lHyy/vni93aiIKIyo7PuOUNyaMnfdam++Sv2mBkNj0koo9B6LidDaWxZ3gZJ2bTxSyPOOukYg==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/installations": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/installations": "0.6.15-20250512211235", "@firebase/installations-types": "0.5.3", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "peerDependencies": { - "@firebase/app-compat": "0.x" + "@firebase/app-compat": "0.4.0-20250512211235" + } + }, + "node_modules/@firebase/installations-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/installations-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/installations-types": { @@ -4658,6 +5107,32 @@ "@firebase/app-types": "0.x" } }, + "node_modules/@firebase/installations/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/installations/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@firebase/logger": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.4.tgz", @@ -4671,35 +5146,61 @@ } }, "node_modules/@firebase/messaging": { - "version": "0.12.16", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.16.tgz", - "integrity": "sha512-VJ8sCEIeP3+XkfbJA7410WhYGHdloYFZXoHe/vt+vNVDGw8JQPTQSVTRvjrUprEf5I4Tbcnpr2H34lS6zhCHSA==", + "version": "0.12.19-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.19-20250512211235.tgz", + "integrity": "sha512-h4fraiJuJrLSOSI6WIFlbV1u6L6/8zPfTzcNxqyjCIVj5eFVpgoLIW5lQ2O+G6h6RQiWG29AJkuWGnp26BOJ6Q==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/installations": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/installations": "0.6.15-20250512211235", "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "idb": "7.1.1", "tslib": "^2.1.0" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.13.0-20250512211235" } }, "node_modules/@firebase/messaging-compat": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.16.tgz", - "integrity": "sha512-9HZZ88Ig3zQ0ok/Pwt4gQcNsOhoEy8hDHoGsV1am6ulgMuGuDVD2gl11Lere2ksL+msM12Lddi2x/7TCqmODZw==", + "version": "0.2.19-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.19-20250512211235.tgz", + "integrity": "sha512-vTL0hMyPosU/WRvZ1xmi01aURJyjUI3zeBByYnnwSUJN01eF0YX7eM1RId/HSFcHoT/HgfsHFvINUFjy58TVUQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/messaging": "0.12.16", - "@firebase/util": "1.10.3", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/messaging": "0.12.19-20250512211235", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "peerDependencies": { - "@firebase/app-compat": "0.x" + "@firebase/app-compat": "0.4.0-20250512211235" + } + }, + "node_modules/@firebase/messaging-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/messaging-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/messaging-interop-types": { @@ -4708,37 +5209,90 @@ "integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==", "license": "Apache-2.0" }, + "node_modules/@firebase/messaging/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/messaging/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@firebase/performance": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.12.tgz", - "integrity": "sha512-8mYL4z2jRlKXAi2hjk4G7o2sQLnJCCuTbyvti/xmHf5ZvOIGB01BZec0aDuBIXO+H1MLF62dbye/k91Fr+yc8g==", + "version": "0.7.4-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.4-20250512211235.tgz", + "integrity": "sha512-defCXX20kxX05/3b4qI+V2PreeH/qwn1Egvp82geS+hGyK6cDRFGgV7q94tIcc6idQJoRhsSW32ABKdI99XpWg==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/installations": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/installations": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0", + "web-vitals": "^4.2.4" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.13.0-20250512211235" } }, "node_modules/@firebase/performance-compat": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.12.tgz", - "integrity": "sha512-DyCbDTIwtBTGsEiQxTz/TD23a0na2nrDozceQ5kVkszyFYvliB0YK/9el0wAGIG91SqgTG9pxHtYErzfZc0VWw==", + "version": "0.2.17-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.17-20250512211235.tgz", + "integrity": "sha512-5uUlGWbEyoTzGa0JaS6OIUl5T69VwK4gYRAjcET79kuVSZU85l4M1gsDbXqhl/YH1o/gpQEPmm1T1UrK9bRQbw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/performance": "0.6.12", + "@firebase/performance": "0.7.4-20250512211235", "@firebase/performance-types": "0.2.3", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "peerDependencies": { - "@firebase/app-compat": "0.x" + "@firebase/app-compat": "0.4.0-20250512211235" + } + }, + "node_modules/@firebase/performance-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/performance-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/performance-types": { @@ -4747,37 +5301,89 @@ "integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==", "license": "Apache-2.0" }, + "node_modules/@firebase/performance/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/performance/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@firebase/remote-config": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.5.0.tgz", - "integrity": "sha512-weiEbpBp5PBJTHUWR4GwI7ZacaAg68BKha5QnZ8Go65W4oQjEWqCW/rfskABI/OkrGijlL3CUmCB/SA6mVo0qA==", + "version": "0.6.2-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.6.2-20250512211235.tgz", + "integrity": "sha512-FR/IDz/AkQiSXXZw80OJEl/MT++URfbrrUDev3p1Dgc5yuz2hGCReuiq/YYVTA3n/yppwY+BnRdVidV9dRaHSQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/installations": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/installations": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.13.0-20250512211235" } }, "node_modules/@firebase/remote-config-compat": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.12.tgz", - "integrity": "sha512-91jLWPtubIuPBngg9SzwvNCWzhMLcyBccmt7TNZP+y1cuYFNOWWHKUXQ3IrxCLB7WwLqQaEu7fTDAjHsTyBsSw==", + "version": "0.2.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.15-20250512211235.tgz", + "integrity": "sha512-DiHaFVywKBG1GGziN/NA5k8qkvJ68gX+AFe63yQOmzAfvH59W+dbxAgSG116pGrfF3xDH/e/lho4Cs3M6tbL8g==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", + "@firebase/component": "0.6.15-20250512211235", "@firebase/logger": "0.4.4", - "@firebase/remote-config": "0.5.0", + "@firebase/remote-config": "0.6.2-20250512211235", "@firebase/remote-config-types": "0.4.0", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "peerDependencies": { - "@firebase/app-compat": "0.x" + "@firebase/app-compat": "0.4.0-20250512211235" + } + }, + "node_modules/@firebase/remote-config-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/remote-config-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/remote-config-types": { @@ -4786,40 +5392,92 @@ "integrity": "sha512-7p3mRE/ldCNYt8fmWMQ/MSGRmXYlJ15Rvs9Rk17t8p0WwZDbeK7eRmoI1tvCPaDzn9Oqh+yD6Lw+sGLsLg4kKg==", "license": "Apache-2.0" }, + "node_modules/@firebase/remote-config/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/remote-config/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@firebase/storage": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.5.tgz", - "integrity": "sha512-sB/7HNuW0N9tITyD0RxVLNCROuCXkml5i/iPqjwOGKC0xiUfpCOjBE+bb0ABMoN1qYZfqk0y9IuI2TdomjmkNw==", + "version": "0.13.9-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.9-20250512211235.tgz", + "integrity": "sha512-68vuBOmYVUu93Tbri++ubk8ECASRQWYnB1cvPpfBT0WoLSgdgxj+2F/+buXqzFZT/3ae8FBcEdgK6cD0gcT7tA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/util": "1.10.3", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@firebase/app": "0.x" + "@firebase/app": "0.13.0-20250512211235" } }, "node_modules/@firebase/storage-compat": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.15.tgz", - "integrity": "sha512-Z9afjrK2O9o1ZHWCpprCGZ1BTc3BbvpZvi6tkSteC8H3W/fMM6x+RoSunlzD3hEVV5bkbwdJIqNClLMchvyoPA==", + "version": "0.3.19-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.19-20250512211235.tgz", + "integrity": "sha512-Qz3kRo4qc6wRSDq/sCRT9ITqT/Of4puErdhideN+GBi40m42bLWOqBkxpkzPmHphOmFNwKUBA8/9Cksr/fj6IA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/storage": "0.13.5", + "@firebase/component": "0.6.15-20250512211235", + "@firebase/storage": "0.13.9-20250512211235", "@firebase/storage-types": "0.8.3", - "@firebase/util": "1.10.3", + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@firebase/app-compat": "0.x" + "@firebase/app-compat": "0.4.0-20250512211235" + } + }, + "node_modules/@firebase/storage-compat/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.0-20250512211235", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/storage-compat/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/storage-types": { @@ -4832,36 +5490,43 @@ "@firebase/util": "1.x" } }, - "node_modules/@firebase/util": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.3.tgz", - "integrity": "sha512-wfoF5LTy0m2ufUapV0ZnpcGQvuavTbJ5Qr1Ze9OJGL70cSMvhDyjS4w2121XdA3lGZSTOsDOyGhpoDtYwck85A==", + "node_modules/@firebase/storage/node_modules/@firebase/component": { + "version": "0.6.15-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.15-20250512211235.tgz", + "integrity": "sha512-8U//EzcIE6frUcWUMcmrVzWBAXLBZt2eGWwt8Of1y+yU6t3Zwwu+1JpCz0hbiHpzXnkuTFjPwWA6fKgZQTk0MQ==", "license": "Apache-2.0", "dependencies": { + "@firebase/util": "1.12.0-20250512211235", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@firebase/vertexai": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@firebase/vertexai/-/vertexai-1.0.3.tgz", - "integrity": "sha512-SQHg/RPb3LwQs/xiLcvAZYz9NXyDSZUIIwvgsKh6e4wdULAfyPCZIu6Y2ZYIhZLfk9Q44cKZ+++7RPTaqQJdYA==", + "node_modules/@firebase/storage/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", "tslib": "^2.1.0" }, "engines": { "node": ">=18.0.0" + } + }, + "node_modules/@firebase/util": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.11.1.tgz", + "integrity": "sha512-RXg4WE8C2LUrvoV/TMGRTu223zZf9Dq9MR8yHZio9nF9TpLnpCPURw9VWWB2WATDl6HfIdWfl2x2SJYtHkN4hw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" }, - "peerDependencies": { - "@firebase/app": "0.x", - "@firebase/app-types": "0.x" + "engines": { + "node": ">=18.0.0" } }, "node_modules/@firebase/webchannel-wrapper": { @@ -4967,18 +5632,18 @@ } }, "node_modules/@grpc/grpc-js/node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "version": "22.15.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.18.tgz", + "integrity": "sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@grpc/grpc-js/node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/@grpc/proto-loader": { @@ -11897,39 +12562,39 @@ } }, "node_modules/firebase": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.2.0.tgz", - "integrity": "sha512-ztwPhBLAZMVNZjBeQzzTM4rk2rsRXmdFYcnvjAXh+StbiFVshHKaPO9VRGMUzF48du4Mkz6jN1wkmYCuUJPxLA==", + "version": "11.8.0-20250512211235", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.8.0-20250512211235.tgz", + "integrity": "sha512-0juBB1XpC52s4BF/6OwJd7ka8imyXIIbsnjp6yVr1n8W0GpYIpvXzKP0oahiV2Wiv9l0DfVRZpsMB0OJvk9nQw==", "license": "Apache-2.0", "dependencies": { - "@firebase/analytics": "0.10.11", - "@firebase/analytics-compat": "0.2.17", - "@firebase/app": "0.10.18", - "@firebase/app-check": "0.8.11", - "@firebase/app-check-compat": "0.3.18", - "@firebase/app-compat": "0.2.48", + "@firebase/ai": "1.3.0-20250512211235", + "@firebase/analytics": "0.10.14-20250512211235", + "@firebase/analytics-compat": "0.2.20-20250512211235", + "@firebase/app": "0.13.0-20250512211235", + "@firebase/app-check": "0.10.0-20250512211235", + "@firebase/app-check-compat": "0.3.23-20250512211235", + "@firebase/app-compat": "0.4.0-20250512211235", "@firebase/app-types": "0.9.3", - "@firebase/auth": "1.8.2", - "@firebase/auth-compat": "0.5.17", - "@firebase/data-connect": "0.2.0", - "@firebase/database": "1.0.11", - "@firebase/database-compat": "2.0.2", - "@firebase/firestore": "4.7.6", - "@firebase/firestore-compat": "0.3.41", - "@firebase/functions": "0.12.1", - "@firebase/functions-compat": "0.3.18", - "@firebase/installations": "0.6.12", - "@firebase/installations-compat": "0.2.12", - "@firebase/messaging": "0.12.16", - "@firebase/messaging-compat": "0.2.16", - "@firebase/performance": "0.6.12", - "@firebase/performance-compat": "0.2.12", - "@firebase/remote-config": "0.5.0", - "@firebase/remote-config-compat": "0.2.12", - "@firebase/storage": "0.13.5", - "@firebase/storage-compat": "0.3.15", - "@firebase/util": "1.10.3", - "@firebase/vertexai": "1.0.3" + "@firebase/auth": "1.10.3-20250512211235", + "@firebase/auth-compat": "0.5.23-20250512211235", + "@firebase/data-connect": "0.3.6-20250512211235", + "@firebase/database": "1.0.16-20250512211235", + "@firebase/database-compat": "2.0.7-20250512211235", + "@firebase/firestore": "4.7.13-20250512211235", + "@firebase/firestore-compat": "0.3.48-20250512211235", + "@firebase/functions": "0.12.5-20250512211235", + "@firebase/functions-compat": "0.3.22-20250512211235", + "@firebase/installations": "0.6.15-20250512211235", + "@firebase/installations-compat": "0.2.15-20250512211235", + "@firebase/messaging": "0.12.19-20250512211235", + "@firebase/messaging-compat": "0.2.19-20250512211235", + "@firebase/performance": "0.7.4-20250512211235", + "@firebase/performance-compat": "0.2.17-20250512211235", + "@firebase/remote-config": "0.6.2-20250512211235", + "@firebase/remote-config-compat": "0.2.15-20250512211235", + "@firebase/storage": "0.13.9-20250512211235", + "@firebase/storage-compat": "0.3.19-20250512211235", + "@firebase/util": "1.12.0-20250512211235" } }, "node_modules/firebase-admin": { @@ -12104,6 +12769,19 @@ "firebase-admin": "^11.10.0 || ^12.0.0" } }, + "node_modules/firebase/node_modules/@firebase/util": { + "version": "1.12.0-20250512211235", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.0-20250512211235.tgz", + "integrity": "sha512-o7CkpIAymb6irDYCoK0wKZiEMMgHX4oGdsXEXvsIPBWjoZsUavF6HH4iYVGslL4KkasEEjJiLNiomxxGbJPqKg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -21828,6 +22506,12 @@ "license": "MIT", "optional": true }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index 20357e87b..db59db2b2 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "@angular/router": "^19.0.0", "@schematics/angular": "^19.0.0", "esbuild": "^0.24.0", - "firebase": "^11.2.0", + "firebase": "11.8.0-20250512211235", "firebase-functions": "^6.1.0", "fs-extra": "^8.0.1", "fuzzy": "^0.1.3", @@ -120,5 +120,8 @@ "typescript": ">=5.5 <5.7", "yaml": "^2.7.0" }, - "typings": "index.d.ts" + "typings": "index.d.ts", + "overrides": { + "firebase": "11.8.0-20250512211235" + } } diff --git a/src/ai/ai.module.ts b/src/ai/ai.module.ts new file mode 100644 index 000000000..444fd67b3 --- /dev/null +++ b/src/ai/ai.module.ts @@ -0,0 +1,79 @@ +import { + EnvironmentProviders, + InjectionToken, + Injector, + NgModule, + NgZone, + Optional, + makeEnvironmentProviders, +} from '@angular/core'; +import { VERSION, ɵAngularFireSchedulers, ɵgetDefaultInstanceOf } from '@angular/fire'; +import { FirebaseApp, FirebaseApps } from '@angular/fire/app'; +import { AppCheckInstances } from '@angular/fire/app-check'; +import { AI as FirebaseAI } from 'firebase/ai'; +import { registerVersion } from 'firebase/app'; +import { AI, AIInstances, AI_PROVIDER_NAME } from './ai'; + +export const PROVIDED_AI_INSTANCES = new InjectionToken('angularfire2.ai-instances'); + +export function defaultAIInstanceFactory(provided: FirebaseAI[]|undefined, defaultApp: FirebaseApp) { + const defaultAI = ɵgetDefaultInstanceOf(AI_PROVIDER_NAME, provided, defaultApp); + return defaultAI && new AI(defaultAI); +} + +export function AIInstanceFactory(fn: (injector: Injector) => FirebaseAI) { + return (zone: NgZone, injector: Injector) => { + const ai = zone.runOutsideAngular(() => fn(injector)); + return new AI(ai); + }; +} + +const AI_INSTANCES_PROVIDER = { + provide: AIInstances, + deps: [ + [new Optional(), PROVIDED_AI_INSTANCES ], + ] +}; + +const DEFAULT_AI_INSTANCE_PROVIDER = { + provide: AI, + useFactory: defaultAIInstanceFactory, + deps: [ + [new Optional(), PROVIDED_AI_INSTANCES ], + FirebaseApp, + ] +}; + +@NgModule({ + providers: [ + DEFAULT_AI_INSTANCE_PROVIDER, + AI_INSTANCES_PROVIDER, + ] +}) +export class AIModule { + constructor() { + registerVersion('angularfire', VERSION.full, 'ai'); + } +} + +export function provideAI(fn: (injector: Injector) => FirebaseAI, ...deps: any[]): EnvironmentProviders { + registerVersion('angularfire', VERSION.full, 'ai'); + + return makeEnvironmentProviders([ + DEFAULT_AI_INSTANCE_PROVIDER, + AI_INSTANCES_PROVIDER, + { + provide: PROVIDED_AI_INSTANCES, + useFactory: AIInstanceFactory(fn), + multi: true, + deps: [ + NgZone, + Injector, + ɵAngularFireSchedulers, + FirebaseApps, + [new Optional(), AppCheckInstances ], + ...deps, + ] + } + ]); +} diff --git a/src/ai/ai.spec.ts b/src/ai/ai.spec.ts new file mode 100644 index 000000000..9b6fc1008 --- /dev/null +++ b/src/ai/ai.spec.ts @@ -0,0 +1,38 @@ +import { TestBed } from '@angular/core/testing'; +import { AI, getAI, provideAI } from '@angular/fire/ai'; +import { FirebaseApp, getApp, initializeApp, provideFirebaseApp } from '@angular/fire/app'; +import { COMMON_CONFIG } from '../test-config'; +import { rando } from '../utils'; + +describe('AI', () => { + let app: FirebaseApp; + let ai: AI; + let providedAI: AI; + let appName: string; + + describe('single injection', () => { + + beforeEach(() => { + appName = rando(); + TestBed.configureTestingModule({ + providers: [ + provideFirebaseApp(() => initializeApp(COMMON_CONFIG, appName)), + provideAI(() => { + providedAI = getAI(getApp(appName)); + return providedAI; + }), + ], + }); + app = TestBed.inject(FirebaseApp); + ai = TestBed.inject(AI); + }); + + it('should be injectable', () => { + expect(providedAI).toBeTruthy(); + expect(ai).toEqual(providedAI); + expect(ai.app).toEqual(app); + }); + + }); + +}); diff --git a/src/ai/ai.ts b/src/ai/ai.ts new file mode 100644 index 000000000..f0e4ffc86 --- /dev/null +++ b/src/ai/ai.ts @@ -0,0 +1,30 @@ +import { ɵgetAllInstancesOf } from '@angular/fire'; +import { AI as FirebaseAI } from 'firebase/ai'; +import { from, timer } from 'rxjs'; +import { concatMap, distinct } from 'rxjs/operators'; + +// see notes in core/firebase.app.module.ts for why we're building the class like this +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface AI extends FirebaseAI {} + +export class AI { + constructor(ai: FirebaseAI) { + return ai; + } +} + +export const AI_PROVIDER_NAME = 'AI'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface AIInstances extends Array {} + +export class AIInstances { + constructor() { + return ɵgetAllInstancesOf(AI_PROVIDER_NAME); + } +} + +export const AIInstance$ = timer(0, 300).pipe( + concatMap(() => from(ɵgetAllInstancesOf(AI_PROVIDER_NAME))), + distinct(), +); diff --git a/src/ai/firebase.ts b/src/ai/firebase.ts new file mode 100644 index 000000000..4e33d0635 --- /dev/null +++ b/src/ai/firebase.ts @@ -0,0 +1,14 @@ +// DO NOT MODIFY, this file is autogenerated by tools/build.ts +export * from 'firebase/ai'; +import { ɵzoneWrap } from '@angular/fire'; +import { + getAI as _getAI, + getGenerativeModel as _getGenerativeModel, + getImagenModel as _getImagenModel, + getVertexAI as _getVertexAI +} from 'firebase/ai'; + +export const getAI = ɵzoneWrap(_getAI, true); +export const getGenerativeModel = ɵzoneWrap(_getGenerativeModel, true); +export const getImagenModel = ɵzoneWrap(_getImagenModel, true); +export const getVertexAI = ɵzoneWrap(_getVertexAI, true); diff --git a/src/ai/ng-package.json b/src/ai/ng-package.json new file mode 100644 index 000000000..d3032da35 --- /dev/null +++ b/src/ai/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "public_api.ts" + } +} diff --git a/src/ai/package.json b/src/ai/package.json new file mode 100644 index 000000000..8dce418a5 --- /dev/null +++ b/src/ai/package.json @@ -0,0 +1,3 @@ +{ + "$schema": "../../node_modules/ng-packagr/package.schema.json" +} diff --git a/src/ai/public_api.ts b/src/ai/public_api.ts new file mode 100644 index 000000000..aee859b99 --- /dev/null +++ b/src/ai/public_api.ts @@ -0,0 +1,3 @@ +export { AI, AIInstances, AIInstance$ } from './ai'; +export { provideAI, AIModule } from './ai.module'; +export * from './firebase'; diff --git a/src/package.json b/src/package.json index b4e78e8ad..a3c12b4bc 100644 --- a/src/package.json +++ b/src/package.json @@ -36,7 +36,7 @@ "@angular/platform-server": { "optional": true } }, "dependencies": { - "firebase": "^11.2.0", + "firebase": "^11.8.0", "rxfire": "^6.1.0", "@angular-devkit/schematics": "^19.0.0", "@schematics/angular": "^19.0.0", diff --git a/src/vertexai/firebase.ts b/src/vertexai/firebase.ts index c988e7e2a..9c24d52b9 100644 --- a/src/vertexai/firebase.ts +++ b/src/vertexai/firebase.ts @@ -2,9 +2,13 @@ export * from 'firebase/vertexai'; import { ɵzoneWrap } from '@angular/fire'; import { + getAI as _getAI, getGenerativeModel as _getGenerativeModel, + getImagenModel as _getImagenModel, getVertexAI as _getVertexAI } from 'firebase/vertexai'; +export const getAI = ɵzoneWrap(_getAI, true); export const getGenerativeModel = ɵzoneWrap(_getGenerativeModel, true); +export const getImagenModel = ɵzoneWrap(_getImagenModel, true); export const getVertexAI = ɵzoneWrap(_getVertexAI, true); diff --git a/tools/build.ts b/tools/build.ts index a8ced7106..c947ad765 100644 --- a/tools/build.ts +++ b/tools/build.ts @@ -114,6 +114,7 @@ ${exportedZoneWrappedFns} await writeFile(filePath, fileOutput); }; return Promise.all([ + reexport('ai', 'firebase', 'firebase/ai', tsKeys()), reexport('analytics', 'firebase', 'firebase/analytics', tsKeys(), { isSupported: { blockUntilFirst: false }, logEvent: { blockUntilFirst: false, logLevel: LogLevel.VERBOSE },