diff --git a/.changeset/funny-ways-carry.md b/.changeset/funny-ways-carry.md new file mode 100644 index 00000000000..b1340649384 --- /dev/null +++ b/.changeset/funny-ways-carry.md @@ -0,0 +1,5 @@ +--- +'@firebase/app': patch +--- + +Make the error more helpful when `getApp()` is called before `initializeApp()`. diff --git a/packages/app/src/api.test.ts b/packages/app/src/api.test.ts index c44c38cedc7..ab361df6ff1 100644 --- a/packages/app/src/api.test.ts +++ b/packages/app/src/api.test.ts @@ -199,9 +199,20 @@ describe('API tests', () => { expect(getApp(appName)).to.equal(app); }); - it('throws retrieving a non existing App', () => { + it('throws retrieving a non existing App (custom name)', () => { expect(() => getApp('RandomName')).throws(/No Firebase App 'RandomName'/); }); + + it('throws retrieving a non existing App (default name)', () => { + expect(() => getApp()).throws(/No Firebase App/); + }); + + it('does not throw on a non existing App (default name) if a defaults object exists', () => { + global.__FIREBASE_DEFAULTS__ = { config: { apiKey: 'abcd' } }; + const app = getApp(); + expect(app.options.apiKey).to.equal('abcd'); + global.__FIREBASE_DEFAULTS__ = undefined; + }); }); describe('getApps', () => { diff --git a/packages/app/src/api.ts b/packages/app/src/api.ts index b76a00e2d1b..d43c4ac65c2 100644 --- a/packages/app/src/api.ts +++ b/packages/app/src/api.ts @@ -202,7 +202,7 @@ export function initializeApp( */ export function getApp(name: string = DEFAULT_ENTRY_NAME): FirebaseApp { const app = _apps.get(name); - if (!app && name === DEFAULT_ENTRY_NAME) { + if (!app && name === DEFAULT_ENTRY_NAME && getDefaultAppConfig()) { return initializeApp(); } if (!app) { diff --git a/packages/app/src/errors.ts b/packages/app/src/errors.ts index 6cd50e90942..25582398663 100644 --- a/packages/app/src/errors.ts +++ b/packages/app/src/errors.ts @@ -34,7 +34,7 @@ export const enum AppError { const ERRORS: ErrorMap = { [AppError.NO_APP]: "No Firebase App '{$appName}' has been created - " + - 'call Firebase App.initializeApp()', + 'call initializeApp() first', [AppError.BAD_APP_NAME]: "Illegal App name: '{$appName}", [AppError.DUPLICATE_APP]: "Firebase App named '{$appName}' already exists with different options or config", diff --git a/packages/app/src/internal.test.ts b/packages/app/src/internal.test.ts index b9f9b584553..47ea2e80c40 100644 --- a/packages/app/src/internal.test.ts +++ b/packages/app/src/internal.test.ts @@ -30,6 +30,7 @@ import { _getProvider, _removeServiceInstance } from './internal'; +import { logger } from './logger'; declare module '@firebase/component' { interface NameServiceMapping { @@ -60,10 +61,12 @@ describe('Internal API tests', () => { it('does NOT throw registering duplicate components', () => { const app = initializeApp({}) as FirebaseAppImpl; const testComp = createTestComponent('test'); + const debugStub = stub(logger, 'debug'); _addComponent(app, testComp); expect(() => _addComponent(app, testComp)).to.not.throw(); + expect(debugStub).to.be.called; expect(app.container.getProvider('test').getComponent()).to.equal( testComp );