| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 | /*! firebase-admin v12.1.1 */"use strict";/*! * @license * Copyright 2017 Google Inc. * * 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. */Object.defineProperty(exports, "__esModule", { value: true });exports.parseResourceName = exports.transformMillisecondsToSecondsString = exports.generateUpdateMask = exports.formatString = exports.toWebSafeBase64 = exports.findServiceAccountEmail = exports.getExplicitServiceAccountEmail = exports.findProjectId = exports.getExplicitProjectId = exports.addReadonlyGetter = exports.renameProperties = exports.getSdkVersion = void 0;const credential_internal_1 = require("../app/credential-internal");const validator = require("./validator");let sdkVersion;// TODO: Move to firebase-admin/app as an internal member.function getSdkVersion() {    if (!sdkVersion) {        const { version } = require('../../package.json'); // eslint-disable-line @typescript-eslint/no-var-requires        sdkVersion = version;    }    return sdkVersion;}exports.getSdkVersion = getSdkVersion;/** * Renames properties on an object given a mapping from old to new property names. * * For example, this can be used to map underscore_cased properties to camelCase. * * @param obj - The object whose properties to rename. * @param keyMap - The mapping from old to new property names. */function renameProperties(obj, keyMap) {    Object.keys(keyMap).forEach((oldKey) => {        if (oldKey in obj) {            const newKey = keyMap[oldKey];            // The old key's value takes precedence over the new key's value.            obj[newKey] = obj[oldKey];            delete obj[oldKey];        }    });}exports.renameProperties = renameProperties;/** * Defines a new read-only property directly on an object and returns the object. * * @param obj - The object on which to define the property. * @param prop - The name of the property to be defined or modified. * @param value - The value associated with the property. */function addReadonlyGetter(obj, prop, value) {    Object.defineProperty(obj, prop, {        value,        // Make this property read-only.        writable: false,        // Include this property during enumeration of obj's properties.        enumerable: true,    });}exports.addReadonlyGetter = addReadonlyGetter;/** * Returns the Google Cloud project ID associated with a Firebase app, if it's explicitly * specified in either the Firebase app options, credentials or the local environment. * Otherwise returns null. * * @param app - A Firebase app to get the project ID from. * * @returns A project ID string or null. */function getExplicitProjectId(app) {    const options = app.options;    if (validator.isNonEmptyString(options.projectId)) {        return options.projectId;    }    const credential = app.options.credential;    if (credential instanceof credential_internal_1.ServiceAccountCredential) {        return credential.projectId;    }    const projectId = process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT;    if (validator.isNonEmptyString(projectId)) {        return projectId;    }    return null;}exports.getExplicitProjectId = getExplicitProjectId;/** * Determines the Google Cloud project ID associated with a Firebase app. This method * first checks if a project ID is explicitly specified in either the Firebase app options, * credentials or the local environment in that order. If no explicit project ID is * configured, but the SDK has been initialized with ComputeEngineCredentials, this * method attempts to discover the project ID from the local metadata service. * * @param app - A Firebase app to get the project ID from. * * @returns A project ID string or null. */function findProjectId(app) {    const projectId = getExplicitProjectId(app);    if (projectId) {        return Promise.resolve(projectId);    }    const credential = app.options.credential;    if (credential instanceof credential_internal_1.ComputeEngineCredential) {        return credential.getProjectId();    }    return Promise.resolve(null);}exports.findProjectId = findProjectId;/** * Returns the service account email associated with a Firebase app, if it's explicitly * specified in either the Firebase app options, credentials or the local environment. * Otherwise returns null. * * @param app - A Firebase app to get the service account email from. * * @returns A service account email string or null. */function getExplicitServiceAccountEmail(app) {    const options = app.options;    if (validator.isNonEmptyString(options.serviceAccountId)) {        return options.serviceAccountId;    }    const credential = app.options.credential;    if (credential instanceof credential_internal_1.ServiceAccountCredential) {        return credential.clientEmail;    }    return null;}exports.getExplicitServiceAccountEmail = getExplicitServiceAccountEmail;/** * Determines the service account email associated with a Firebase app. This method first * checks if a service account email is explicitly specified in either the Firebase app options, * credentials or the local environment in that order. If no explicit service account email is * configured, but the SDK has been initialized with ComputeEngineCredentials, this * method attempts to discover the service account email from the local metadata service. * * @param app - A Firebase app to get the service account email from. * * @returns A service account email ID string or null. */function findServiceAccountEmail(app) {    const accountId = getExplicitServiceAccountEmail(app);    if (accountId) {        return Promise.resolve(accountId);    }    const credential = app.options.credential;    if (credential instanceof credential_internal_1.ComputeEngineCredential) {        return credential.getServiceAccountEmail();    }    return Promise.resolve(null);}exports.findServiceAccountEmail = findServiceAccountEmail;/** * Encodes data using web-safe-base64. * * @param data - The raw data byte input. * @returns The base64-encoded result. */function toWebSafeBase64(data) {    return data.toString('base64').replace(/\//g, '_').replace(/\+/g, '-');}exports.toWebSafeBase64 = toWebSafeBase64;/** * Formats a string of form 'project/{projectId}/{api}' and replaces * with corresponding arguments {projectId: '1234', api: 'resource'} * and returns output: 'project/1234/resource'. * * @param str - The original string where the param need to be *     replaced. * @param params - The optional parameters to replace in the *     string. * @returns The resulting formatted string. */function formatString(str, params) {    let formatted = str;    Object.keys(params || {}).forEach((key) => {        formatted = formatted.replace(new RegExp('{' + key + '}', 'g'), params[key]);    });    return formatted;}exports.formatString = formatString;/** * Generates the update mask for the provided object. * Note this will ignore the last key with value undefined. * * @param obj - The object to generate the update mask for. * @param terminalPaths - The optional map of keys for maximum paths to traverse. *      Nested objects beyond that path will be ignored. This is useful for *      keys with variable object values. * @param root - The path so far. * @returns The computed update mask list. */function generateUpdateMask(obj, terminalPaths = [], root = '') {    const updateMask = [];    if (!validator.isNonNullObject(obj)) {        return updateMask;    }    for (const key in obj) {        if (typeof obj[key] !== 'undefined') {            const nextPath = root ? `${root}.${key}` : key;            // We hit maximum path.            // Consider switching to Set<string> if the list grows too large.            if (terminalPaths.indexOf(nextPath) !== -1) {                // Add key and stop traversing this branch.                updateMask.push(key);            }            else {                const maskList = generateUpdateMask(obj[key], terminalPaths, nextPath);                if (maskList.length > 0) {                    maskList.forEach((mask) => {                        updateMask.push(`${key}.${mask}`);                    });                }                else {                    updateMask.push(key);                }            }        }    }    return updateMask;}exports.generateUpdateMask = generateUpdateMask;/** * Transforms milliseconds to a protobuf Duration type string. * Returns the duration in seconds with up to nine fractional * digits, terminated by 's'. Example: "3 seconds 0 nano seconds as 3s, * 3 seconds 1 nano seconds as 3.000000001s". * * @param milliseconds - The duration in milliseconds. * @returns The resulting formatted string in seconds with up to nine fractional * digits, terminated by 's'. */function transformMillisecondsToSecondsString(milliseconds) {    let duration;    const seconds = Math.floor(milliseconds / 1000);    const nanos = Math.floor((milliseconds - seconds * 1000) * 1000000);    if (nanos > 0) {        let nanoString = nanos.toString();        while (nanoString.length < 9) {            nanoString = '0' + nanoString;        }        duration = `${seconds}.${nanoString}s`;    }    else {        duration = `${seconds}s`;    }    return duration;}exports.transformMillisecondsToSecondsString = transformMillisecondsToSecondsString;/** * Parses the top level resources of a given resource name. * Supports both full and partial resources names, example: * `locations/{location}/functions/{functionName}`, * `projects/{project}/locations/{location}/functions/{functionName}`, or {functionName} * Does not support deeply nested resource names. * * @param resourceName - The resource name string. * @param resourceIdKey - The key of the resource name to be parsed. * @returns A parsed resource name object. */function parseResourceName(resourceName, resourceIdKey) {    if (!resourceName.includes('/')) {        return { resourceId: resourceName };    }    const CHANNEL_NAME_REGEX = new RegExp(`^(projects/([^/]+)/)?locations/([^/]+)/${resourceIdKey}/([^/]+)$`);    const match = CHANNEL_NAME_REGEX.exec(resourceName);    if (match === null) {        throw new Error('Invalid resource name format.');    }    const projectId = match[2];    const locationId = match[3];    const resourceId = match[4];    return { projectId, locationId, resourceId };}exports.parseResourceName = parseResourceName;
 |