import { ErrorFactory, contains, deepExtend, createSubscribe, isBrowser } from '@firebase/util'; import { __assign } from 'tslib'; import { Component } from '@firebase/component'; import * as modularAPIs from '@firebase/app'; import { deleteApp, _addComponent, _addOrOverwriteComponent, _DEFAULT_ENTRY_NAME, registerVersion } from '@firebase/app'; import { Logger } from '@firebase/logger'; /** * @license * Copyright 2020 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. */ /** * Global context object for a collection of services using * a shared authentication state. * * marked as internal because it references internal types exported from @firebase/app * @internal */ var FirebaseAppImpl = /** @class */ (function () { function FirebaseAppImpl(_delegate, firebase) { var _this = this; this._delegate = _delegate; this.firebase = firebase; // add itself to container _addComponent(_delegate, new Component('app-compat', function () { return _this; }, "PUBLIC" /* ComponentType.PUBLIC */)); this.container = _delegate.container; } Object.defineProperty(FirebaseAppImpl.prototype, "automaticDataCollectionEnabled", { get: function () { return this._delegate.automaticDataCollectionEnabled; }, set: function (val) { this._delegate.automaticDataCollectionEnabled = val; }, enumerable: false, configurable: true }); Object.defineProperty(FirebaseAppImpl.prototype, "name", { get: function () { return this._delegate.name; }, enumerable: false, configurable: true }); Object.defineProperty(FirebaseAppImpl.prototype, "options", { get: function () { return this._delegate.options; }, enumerable: false, configurable: true }); FirebaseAppImpl.prototype.delete = function () { var _this = this; return new Promise(function (resolve) { _this._delegate.checkDestroyed(); resolve(); }).then(function () { _this.firebase.INTERNAL.removeApp(_this.name); return deleteApp(_this._delegate); }); }; /** * Return a service instance associated with this app (creating it * on demand), identified by the passed instanceIdentifier. * * NOTE: Currently storage and functions are the only ones that are leveraging this * functionality. They invoke it by calling: * * ```javascript * firebase.app().storage('STORAGE BUCKET ID') * ``` * * The service name is passed to this already * @internal */ FirebaseAppImpl.prototype._getService = function (name, instanceIdentifier) { var _a; if (instanceIdentifier === void 0) { instanceIdentifier = _DEFAULT_ENTRY_NAME; } this._delegate.checkDestroyed(); // Initialize instance if InstatiationMode is `EXPLICIT`. var provider = this._delegate.container.getProvider(name); if (!provider.isInitialized() && ((_a = provider.getComponent()) === null || _a === void 0 ? void 0 : _a.instantiationMode) === "EXPLICIT" /* InstantiationMode.EXPLICIT */) { provider.initialize(); } // getImmediate will always succeed because _getService is only called for registered components. return provider.getImmediate({ identifier: instanceIdentifier }); }; /** * Remove a service instance from the cache, so we will create a new instance for this service * when people try to get it again. * * NOTE: currently only firestore uses this functionality to support firestore shutdown. * * @param name The service name * @param instanceIdentifier instance identifier in case multiple instances are allowed * @internal */ FirebaseAppImpl.prototype._removeServiceInstance = function (name, instanceIdentifier) { if (instanceIdentifier === void 0) { instanceIdentifier = _DEFAULT_ENTRY_NAME; } this._delegate.container // eslint-disable-next-line @typescript-eslint/no-explicit-any .getProvider(name) .clearInstance(instanceIdentifier); }; /** * @param component the component being added to this app's container * @internal */ FirebaseAppImpl.prototype._addComponent = function (component) { _addComponent(this._delegate, component); }; FirebaseAppImpl.prototype._addOrOverwriteComponent = function (component) { _addOrOverwriteComponent(this._delegate, component); }; FirebaseAppImpl.prototype.toJSON = function () { return { name: this.name, automaticDataCollectionEnabled: this.automaticDataCollectionEnabled, options: this.options }; }; return FirebaseAppImpl; }()); // TODO: investigate why the following needs to be commented out // Prevent dead-code elimination of these methods w/o invalid property // copying. // (FirebaseAppImpl.prototype.name && FirebaseAppImpl.prototype.options) || // FirebaseAppImpl.prototype.delete || // console.log('dc'); /** * @license * Copyright 2019 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. */ var _a; var ERRORS = (_a = {}, _a["no-app" /* AppError.NO_APP */] = "No Firebase App '{$appName}' has been created - " + 'call Firebase App.initializeApp()', _a["invalid-app-argument" /* AppError.INVALID_APP_ARGUMENT */] = 'firebase.{$appName}() takes either no argument or a ' + 'Firebase App instance.', _a); var ERROR_FACTORY = new ErrorFactory('app-compat', 'Firebase', ERRORS); /** * @license * Copyright 2019 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. */ /** * Because auth can't share code with other components, we attach the utility functions * in an internal namespace to share code. * This function return a firebase namespace object without * any utility functions, so it can be shared between the regular firebaseNamespace and * the lite version. */ function createFirebaseNamespaceCore(firebaseAppImpl) { var apps = {}; // // eslint-disable-next-line @typescript-eslint/no-explicit-any // const components = new Map>(); // A namespace is a plain JavaScript Object. var namespace = { // Hack to prevent Babel from modifying the object returned // as the firebase namespace. // @ts-ignore __esModule: true, initializeApp: initializeAppCompat, // @ts-ignore app: app, registerVersion: modularAPIs.registerVersion, setLogLevel: modularAPIs.setLogLevel, onLog: modularAPIs.onLog, // @ts-ignore apps: null, SDK_VERSION: modularAPIs.SDK_VERSION, INTERNAL: { registerComponent: registerComponentCompat, removeApp: removeApp, useAsService: useAsService, modularAPIs: modularAPIs } }; // Inject a circular default export to allow Babel users who were previously // using: // // import firebase from 'firebase'; // which becomes: var firebase = require('firebase').default; // // instead of // // import * as firebase from 'firebase'; // which becomes: var firebase = require('firebase'); // eslint-disable-next-line @typescript-eslint/no-explicit-any namespace['default'] = namespace; // firebase.apps is a read-only getter. Object.defineProperty(namespace, 'apps', { get: getApps }); /** * Called by App.delete() - but before any services associated with the App * are deleted. */ function removeApp(name) { delete apps[name]; } /** * Get the App object for a given name (or DEFAULT). */ function app(name) { name = name || modularAPIs._DEFAULT_ENTRY_NAME; if (!contains(apps, name)) { throw ERROR_FACTORY.create("no-app" /* AppError.NO_APP */, { appName: name }); } return apps[name]; } // @ts-ignore app['App'] = firebaseAppImpl; /** * Create a new App instance (name must be unique). * * This function is idempotent. It can be called more than once and return the same instance using the same options and config. */ function initializeAppCompat(options, rawConfig) { if (rawConfig === void 0) { rawConfig = {}; } var app = modularAPIs.initializeApp(options, rawConfig); if (contains(apps, app.name)) { return apps[app.name]; } var appCompat = new firebaseAppImpl(app, namespace); apps[app.name] = appCompat; return appCompat; } /* * Return an array of all the non-deleted FirebaseApps. */ function getApps() { // Make a copy so caller cannot mutate the apps list. return Object.keys(apps).map(function (name) { return apps[name]; }); } function registerComponentCompat(component) { var componentName = component.name; var componentNameWithoutCompat = componentName.replace('-compat', ''); if (modularAPIs._registerComponent(component) && component.type === "PUBLIC" /* ComponentType.PUBLIC */) { // create service namespace for public components // The Service namespace is an accessor function ... var serviceNamespace = function (appArg) { if (appArg === void 0) { appArg = app(); } // eslint-disable-next-line @typescript-eslint/no-explicit-any if (typeof appArg[componentNameWithoutCompat] !== 'function') { // Invalid argument. // This happens in the following case: firebase.storage('gs:/') throw ERROR_FACTORY.create("invalid-app-argument" /* AppError.INVALID_APP_ARGUMENT */, { appName: componentName }); } // Forward service instance lookup to the FirebaseApp. // eslint-disable-next-line @typescript-eslint/no-explicit-any return appArg[componentNameWithoutCompat](); }; // ... and a container for service-level properties. if (component.serviceProps !== undefined) { deepExtend(serviceNamespace, component.serviceProps); } // eslint-disable-next-line @typescript-eslint/no-explicit-any namespace[componentNameWithoutCompat] = serviceNamespace; // Patch the FirebaseAppImpl prototype // eslint-disable-next-line @typescript-eslint/no-explicit-any firebaseAppImpl.prototype[componentNameWithoutCompat] = // TODO: The eslint disable can be removed and the 'ignoreRestArgs' // option added to the no-explicit-any rule when ESlint releases it. // eslint-disable-next-line @typescript-eslint/no-explicit-any function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var serviceFxn = this._getService.bind(this, componentName); return serviceFxn.apply(this, component.multipleInstances ? args : []); }; } return component.type === "PUBLIC" /* ComponentType.PUBLIC */ ? // eslint-disable-next-line @typescript-eslint/no-explicit-any namespace[componentNameWithoutCompat] : null; } // Map the requested service to a registered service name // (used to map auth to serverAuth service when needed). function useAsService(app, name) { if (name === 'serverAuth') { return null; } var useService = name; return useService; } return namespace; } /** * @license * Copyright 2019 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. */ /** * Return a firebase namespace object. * * In production, this will be called exactly once and the result * assigned to the 'firebase' global. It may be called multiple times * in unit tests. */ function createFirebaseNamespace() { var namespace = createFirebaseNamespaceCore(FirebaseAppImpl); namespace.INTERNAL = __assign(__assign({}, namespace.INTERNAL), { createFirebaseNamespace: createFirebaseNamespace, extendNamespace: extendNamespace, createSubscribe: createSubscribe, ErrorFactory: ErrorFactory, deepExtend: deepExtend }); /** * Patch the top-level firebase namespace with additional properties. * * firebase.INTERNAL.extendNamespace() */ function extendNamespace(props) { deepExtend(namespace, props); } return namespace; } var firebase$1 = createFirebaseNamespace(); /** * @license * Copyright 2019 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. */ var logger = new Logger('@firebase/app-compat'); var name = "@firebase/app-compat"; var version = "0.2.27"; /** * @license * Copyright 2019 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. */ function registerCoreComponents(variant) { // Register `app` package. registerVersion(name, version, variant); } /** * @license * Copyright 2020 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. */ // Firebase Lite detection // eslint-disable-next-line @typescript-eslint/no-explicit-any if (isBrowser() && self.firebase !== undefined) { logger.warn("\n Warning: Firebase is already defined in the global scope. Please make sure\n Firebase library is only loaded once.\n "); // eslint-disable-next-line var sdkVersion = self.firebase.SDK_VERSION; if (sdkVersion && sdkVersion.indexOf('LITE') >= 0) { logger.warn("\n Warning: You are trying to load Firebase while using Firebase Performance standalone script.\n You should load Firebase Performance with this instance of Firebase to avoid loading duplicate code.\n "); } } var firebase = firebase$1; registerCoreComponents(); export { firebase as default }; //# sourceMappingURL=index.esm5.js.map