From 144961bc0beea0ddf2d4c307b8fbc35af238cf26 Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Fri, 29 Aug 2025 10:16:52 -0700 Subject: [PATCH 1/3] Fix bug caused by type fix --- packages/ai/package.json | 3 +- packages/ai/src/factory-browser.ts | 34 ++++++++++++++++ packages/ai/src/index.ts | 40 +------------------ .../test-utils/get-fake-firebase-services.ts | 8 +++- 4 files changed, 44 insertions(+), 41 deletions(-) create mode 100644 packages/ai/src/factory-browser.ts diff --git a/packages/ai/package.json b/packages/ai/package.json index b05f5f44f79..5b219d1bf94 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -35,7 +35,7 @@ "dev": "rollup -c -w", "update-responses": "../../scripts/update_vertexai_responses.sh", "testsetup": "yarn update-responses && yarn ts-node ./test-utils/convert-mocks.ts", - "test": "run-p --npm-path npm lint test:browser", + "test": "run-p --npm-path npm lint type-check test:browser", "test:ci": "yarn testsetup && node ../../scripts/run_tests_in_ci.js -s test", "test:skip-clone": "karma start", "test:browser": "yarn testsetup && karma start", @@ -44,6 +44,7 @@ "test:integration:node": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha integration/**/*.test.ts --config ../../config/mocharc.node.js", "api-report": "api-extractor run --local --verbose", "typings:public": "node ../../scripts/build/use_typings.js ./dist/ai-public.d.ts", + "type-check": "yarn tsc --noEmit", "trusted-type-check": "tsec -p tsconfig.json --noEmit" }, "peerDependencies": { diff --git a/packages/ai/src/factory-browser.ts b/packages/ai/src/factory-browser.ts new file mode 100644 index 00000000000..ba4e5be4709 --- /dev/null +++ b/packages/ai/src/factory-browser.ts @@ -0,0 +1,34 @@ + +import { ComponentContainer, InstanceFactoryOptions } from "@firebase/component"; +import { AIError } from "./errors"; +import { decodeInstanceIdentifier } from "./helpers"; +import { chromeAdapterFactory } from "./methods/chrome-adapter"; +import { AIService } from "./service"; +import { AIErrorCode } from "./types"; + +export function factory( + container: ComponentContainer, + { instanceIdentifier }: InstanceFactoryOptions +): AIService { + if (!instanceIdentifier) { + throw new AIError( + AIErrorCode.ERROR, + 'AIService instance identifier is undefined.' + ); + } + + const backend = decodeInstanceIdentifier(instanceIdentifier); + + // getImmediate for FirebaseApp will always succeed + const app = container.getProvider('app').getImmediate(); + const auth = container.getProvider('auth-internal'); + const appCheckProvider = container.getProvider('app-check-internal'); + + return new AIService( + app, + backend, + auth, + appCheckProvider, + chromeAdapterFactory + ); +} diff --git a/packages/ai/src/index.ts b/packages/ai/src/index.ts index 4df73974ef1..9d787c832dd 100644 --- a/packages/ai/src/index.ts +++ b/packages/ai/src/index.ts @@ -22,20 +22,11 @@ */ import { registerVersion, _registerComponent } from '@firebase/app'; -import { AIService } from './service'; import { AI_TYPE } from './constants'; -import { - Component, - ComponentContainer, - ComponentType, - InstanceFactoryOptions -} from '@firebase/component'; +import { Component, ComponentType } from '@firebase/component'; import { name, version } from '../package.json'; -import { decodeInstanceIdentifier } from './helpers'; -import { AIError } from './api'; -import { AIErrorCode } from './types'; -import { chromeAdapterFactory } from './methods/chrome-adapter'; import { LanguageModel } from './types/language-model'; +import { factory } from './factory-browser'; declare global { interface Window { @@ -43,33 +34,6 @@ declare global { } } -function factory( - container: ComponentContainer, - { instanceIdentifier }: InstanceFactoryOptions -): AIService { - if (!instanceIdentifier) { - throw new AIError( - AIErrorCode.ERROR, - 'AIService instance identifier is undefined.' - ); - } - - const backend = decodeInstanceIdentifier(instanceIdentifier); - - // getImmediate for FirebaseApp will always succeed - const app = container.getProvider('app').getImmediate(); - const auth = container.getProvider('auth-internal'); - const appCheckProvider = container.getProvider('app-check-internal'); - - return new AIService( - app, - backend, - auth, - appCheckProvider, - chromeAdapterFactory - ); -} - function registerAI(): void { _registerComponent( new Component(AI_TYPE, factory, ComponentType.PUBLIC).setMultipleInstances( diff --git a/packages/ai/test-utils/get-fake-firebase-services.ts b/packages/ai/test-utils/get-fake-firebase-services.ts index 20ae7fb70be..63789c1a00e 100644 --- a/packages/ai/test-utils/get-fake-firebase-services.ts +++ b/packages/ai/test-utils/get-fake-firebase-services.ts @@ -24,7 +24,7 @@ import { import { Component, ComponentType } from '@firebase/component'; import { FirebaseAppCheckInternal } from '@firebase/app-check-interop-types'; import { AI_TYPE } from '../src/constants'; -import { factory } from '../src'; +import { factory } from '../src/factory-browser'; const fakeConfig = { projectId: 'projectId', @@ -38,7 +38,11 @@ export function getFullApp(fakeAppParams?: { appId?: string; apiKey?: string; }): FirebaseApp { - _registerComponent(new Component(AI_TYPE, factory, ComponentType.PUBLIC)); + _registerComponent( + new Component(AI_TYPE, factory, ComponentType.PUBLIC).setMultipleInstances( + true + ) + ); _registerComponent( new Component( 'app-check-internal', From 407261bf345fea3f60f75722adcd7bedffa2320e Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Fri, 29 Aug 2025 10:45:22 -0700 Subject: [PATCH 2/3] run format, add header --- packages/ai/src/factory-browser.ts | 31 ++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/packages/ai/src/factory-browser.ts b/packages/ai/src/factory-browser.ts index ba4e5be4709..98b91812397 100644 --- a/packages/ai/src/factory-browser.ts +++ b/packages/ai/src/factory-browser.ts @@ -1,10 +1,29 @@ +/** + * @license + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ -import { ComponentContainer, InstanceFactoryOptions } from "@firebase/component"; -import { AIError } from "./errors"; -import { decodeInstanceIdentifier } from "./helpers"; -import { chromeAdapterFactory } from "./methods/chrome-adapter"; -import { AIService } from "./service"; -import { AIErrorCode } from "./types"; +import { + ComponentContainer, + InstanceFactoryOptions +} from '@firebase/component'; +import { AIError } from './errors'; +import { decodeInstanceIdentifier } from './helpers'; +import { chromeAdapterFactory } from './methods/chrome-adapter'; +import { AIService } from './service'; +import { AIErrorCode } from './types'; export function factory( container: ComponentContainer, From d8194d2a1a6c19ffa1a0e889ad87f4a7e925ddac Mon Sep 17 00:00:00 2001 From: Christina Holland Date: Fri, 29 Aug 2025 11:18:14 -0700 Subject: [PATCH 3/3] add changeset --- .changeset/heavy-teachers-enjoy.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/heavy-teachers-enjoy.md diff --git a/.changeset/heavy-teachers-enjoy.md b/.changeset/heavy-teachers-enjoy.md new file mode 100644 index 00000000000..a5cf0820429 --- /dev/null +++ b/.changeset/heavy-teachers-enjoy.md @@ -0,0 +1,5 @@ +--- +'@firebase/ai': patch +--- + +Refactor component registration.