diff --git a/.changeset/wild-vans-camp.md b/.changeset/wild-vans-camp.md new file mode 100644 index 00000000000..9ca0764e97d --- /dev/null +++ b/.changeset/wild-vans-camp.md @@ -0,0 +1,6 @@ +--- +'@firebase/app-check-compat': patch +'firebase': patch +--- + +Fixed App Check compat package to correctly export and handle `ReCaptchaV3Provider` and `CustomProvider` classes. diff --git a/packages/app-check-compat/src/index.ts b/packages/app-check-compat/src/index.ts index 8229d6b508c..925b6ca7b5e 100644 --- a/packages/app-check-compat/src/index.ts +++ b/packages/app-check-compat/src/index.ts @@ -28,6 +28,7 @@ import { } from '@firebase/component'; import { AppCheckService } from './service'; import { FirebaseAppCheck } from '@firebase/app-check-types'; +import { ReCaptchaV3Provider, CustomProvider } from '@firebase/app-check'; const factory: InstanceFactory<'appCheck-compat'> = ( container: ComponentContainer @@ -40,7 +41,14 @@ const factory: InstanceFactory<'appCheck-compat'> = ( export function registerAppCheck(): void { (firebase as _FirebaseNamespace).INTERNAL.registerComponent( - new Component('appCheck-compat', factory, ComponentType.PUBLIC) + new Component( + 'appCheck-compat', + factory, + ComponentType.PUBLIC + ).setServiceProps({ + ReCaptchaV3Provider, + CustomProvider + }) ); } diff --git a/packages/app-check-compat/src/service.test.ts b/packages/app-check-compat/src/service.test.ts index b10e45d3f11..6679c6b4823 100644 --- a/packages/app-check-compat/src/service.test.ts +++ b/packages/app-check-compat/src/service.test.ts @@ -65,7 +65,7 @@ describe('Firebase App Check > Service', () => { it( 'activate("string") calls modular initializeAppCheck() with a ' + - 'ReCaptchaV3Provider', + 'ReCaptchaV3Provider', () => { const initializeAppCheckStub = stub(appCheckExp, 'initializeAppCheck'); service = new AppCheckService(app); @@ -79,8 +79,8 @@ describe('Firebase App Check > Service', () => { ); it( - 'activate(CustomProvider) calls modular initializeAppCheck() with' + - ' a CustomProvider', + 'activate({getToken: () => token}) calls modular initializeAppCheck() with' + + ' a CustomProvider', () => { const initializeAppCheckStub = stub(appCheckExp, 'initializeAppCheck'); service = new AppCheckService(app); @@ -103,6 +103,37 @@ describe('Firebase App Check > Service', () => { } ); + it( + 'activate(new RecaptchaV3Provider(...)) calls modular initializeAppCheck() with' + + ' a RecaptchaV3Provider', + () => { + const initializeAppCheckStub = stub(appCheckExp, 'initializeAppCheck'); + service = new AppCheckService(app); + service.activate(new ReCaptchaV3Provider('a-site-key')); + expect(initializeAppCheckStub).to.be.calledWith(app, { + provider: match.instanceOf(ReCaptchaV3Provider), + isTokenAutoRefreshEnabled: undefined + }); + initializeAppCheckStub.restore(); + } + ); + + it( + 'activate(new CustomProvider(...)) calls modular initializeAppCheck() with' + + ' a CustomProvider', + () => { + const initializeAppCheckStub = stub(appCheckExp, 'initializeAppCheck'); + service = new AppCheckService(app); + const customGetTokenStub = stub(); + service.activate(new CustomProvider({ getToken: customGetTokenStub })); + expect(initializeAppCheckStub).to.be.calledWith(app, { + provider: match.instanceOf(CustomProvider), + isTokenAutoRefreshEnabled: undefined + }); + initializeAppCheckStub.restore(); + } + ); + it('setTokenAutoRefreshEnabled() calls modular setTokenAutoRefreshEnabled()', () => { const setTokenAutoRefreshEnabledStub: SinonStub = stub( appCheckExp, @@ -167,7 +198,7 @@ describe('Firebase App Check > Service', () => { it('onTokenChanged() throws if activate() has not been called', async () => { service = createTestService(app); - expect(() => service.onTokenChanged(() => { })).to.throw( + expect(() => service.onTokenChanged(() => {})).to.throw( AppCheckError.USE_BEFORE_ACTIVATION ); }); diff --git a/packages/app-check-compat/src/service.ts b/packages/app-check-compat/src/service.ts index adffc834ae0..fb0045aad9a 100644 --- a/packages/app-check-compat/src/service.ts +++ b/packages/app-check-compat/src/service.ts @@ -46,6 +46,11 @@ export class AppCheckService let provider: ReCaptchaV3Provider | CustomProvider; if (typeof siteKeyOrProvider === 'string') { provider = new ReCaptchaV3Provider(siteKeyOrProvider); + } else if ( + siteKeyOrProvider instanceof ReCaptchaV3Provider || + siteKeyOrProvider instanceof CustomProvider + ) { + provider = siteKeyOrProvider; } else { provider = new CustomProvider({ getToken: siteKeyOrProvider.getToken }); } diff --git a/packages/firebase/compat/index.d.ts b/packages/firebase/compat/index.d.ts index e90812b454f..a81d7d37e92 100644 --- a/packages/firebase/compat/index.d.ts +++ b/packages/firebase/compat/index.d.ts @@ -1580,7 +1580,9 @@ declare namespace firebase.appCheck { export interface AppCheck { /** * Activate AppCheck - * @param provider reCAPTCHA provider, custom token provider, or reCAPTCHA site key. + * @param provider This can be a `ReCaptchaV3Provider` instance, + * a `CustomProvider` instance, an object with a custom `getToken()` + * method, or a reCAPTCHA site key. * @param isTokenAutoRefreshEnabled If true, the SDK automatically * refreshes App Check tokens as needed. If undefined, defaults to the * value of `app.automaticDataCollectionEnabled`, which defaults to @@ -1591,6 +1593,7 @@ declare namespace firebase.appCheck { | ReCaptchaV3Provider | CustomProvider | AppCheckProvider + | { getToken: () => AppCheckToken } | string, isTokenAutoRefreshEnabled?: boolean ): void;