{"version":3,"sources":["jsdelivr-header.js","/npm/firemock@0.60.11/dist/cjs/index.js"],"names":[],"mappings":"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","file":"/npm/firemock@0.60.11/dist/cjs/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/firemock@0.60.11/dist/cjs/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar types = require('@forest-fire/types');\nvar nativeDash = require('native-dash');\nvar merge = require('deepmerge');\nvar brilliantErrors = require('brilliant-errors');\nvar emailValidator = require('email-validator');\nvar fastEquals = require('fast-equals');\nvar copy = require('fast-copy');\nvar firebaseKey = require('firebase-key');\nvar serializedQuery = require('@forest-fire/serialized-query');\nvar typedConversions = require('typed-conversions');\n\nfunction _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\nvar merge__default = /*#__PURE__*/_interopDefaultLegacy(merge);\nvar copy__default = /*#__PURE__*/_interopDefaultLegacy(copy);\n\nexports.SortOrder = void 0;\r\n(function (SortOrder) {\r\n    SortOrder[SortOrder[\"asc\"] = 0] = \"asc\";\r\n    SortOrder[SortOrder[\"desc\"] = 1] = \"desc\";\r\n})(exports.SortOrder || (exports.SortOrder = {}));\n\nclass FireMockError extends Error {\r\n    constructor(message, classification = 'firemock/error') {\r\n        super(message);\r\n        this.firemodel = true;\r\n        const [cat, subcat] = classification.split('/');\r\n        this.code = subcat || 'error';\r\n        this.name = classification;\r\n    }\r\n}\n\nfunction isUserCredential(u) {\r\n    if (typeof u !== 'object')\r\n        return false;\r\n    const check = u;\r\n    return check.user && check.credential && check.additionalUserInfo\r\n        ? true\r\n        : false;\r\n}\r\n/**\r\n * Boolean flag and type guard that checks whether this is Firemock `IMock` user\r\n * definition.\r\n */\r\nfunction isMockUserRecord(u) {\r\n    if (typeof u !== 'object')\r\n        return false;\r\n    const check = u;\r\n    return check.kind && check.kind === 'MockUserRecord';\r\n}\r\n/**\r\n * Boolean flag and type guard that checks whether this is Admin SDK's `UserRecord`.\r\n *\r\n * Note: the `IMockUser` is a superset of this.\r\n */\r\nfunction isUserRecord(u) {\r\n    const check = u;\r\n    return (check.metadata &&\r\n        check.providerData &&\r\n        check.emailVerified !== undefined &&\r\n        check.kind === undefined);\r\n}\r\n/**\r\n * Boolean flat to detect if user-like object is a `User` from the client SDK\r\n */\r\nfunction isUser(user) {\r\n    return !isMockUserRecord(user) &&\r\n        !isUserRecord(user) &&\r\n        user.uid !== undefined\r\n        ? true\r\n        : false;\r\n}\n\n/**\r\n * takes a partial user auth and adds enough to make it officially\r\n * a full UserCrediental\r\n */\r\nfunction completeUserCredential(partial) {\r\n    const fakeUserCredential = {\r\n        user: {\r\n            // TODO: Implement\r\n            // ...clientApiUser,\r\n            displayName: '',\r\n            email: '',\r\n            isAnonymous: true,\r\n            metadata: {},\r\n            phoneNumber: '',\r\n            photoURL: '',\r\n            providerData: [],\r\n            providerId: '',\r\n            refreshToken: '',\r\n            // TODO: Check if this util method work as expected\r\n            uid: nativeDash.uuid()\r\n        },\r\n        additionalUserInfo: {\r\n            isNewUser: false,\r\n            profile: '',\r\n            providerId: '',\r\n            username: 'fake',\r\n        },\r\n        operationType: '',\r\n        credential: {\r\n            signInMethod: 'fake',\r\n            providerId: 'fake',\r\n            toJSON: () => '', // added recently\r\n        },\r\n        // TODO: Implement\r\n    };\r\n    return merge__default['default'](fakeUserCredential, partial);\r\n}\r\nconst fakeApplicationVerifier = {\r\n    // eslint-disable-next-line @typescript-eslint/require-await\r\n    async confirm(verificationCode) {\r\n        return completeUserCredential({});\r\n    },\r\n    verificationId: 'verification',\r\n};\n\nfunction createAnonymousUser(uid) {\r\n    return {\r\n        uid,\r\n        isAnonymous: true,\r\n        // TODO: Implement \r\n        // ...authUsersApi,\r\n    };\r\n}\n\n/**\r\n * Converts a known user to the `User` format used in the Firebase client SDK\r\n */\r\nfunction toUser(mockUser) {\r\n    // TODO: implement\r\n    const user = {\r\n        uid: mockUser.uid,\r\n        email: mockUser.email,\r\n        emailVerified: mockUser.emailVerified,\r\n        displayName: mockUser.displayName,\r\n        isAnonymous: mockUser.isAnonymous,\r\n        providerId: mockUser.providerId,\r\n        providerData: mockUser.providerData,\r\n        // TODO: implement\r\n    };\r\n    return {\r\n        ...user,\r\n        toJSON: () => ({\r\n            uid: user.uid,\r\n            isAnonymous: user.isAnonymous,\r\n            email: user.email,\r\n            emailVerified: user.emailVerified,\r\n            phoneNumber: user.phoneNumber,\r\n            photoURL: user.photoURL,\r\n        }),\r\n    };\r\n}\n\nfunction toUserCredential(user) {\r\n    return {\r\n        credential: {\r\n            providerId: user.providerId,\r\n            signInMethod: '',\r\n            toJSON() {\r\n                return { providerId: user.providerId };\r\n            },\r\n        },\r\n        /** the client SDK's `User` type */\r\n        user: toUser(user),\r\n        additionalUserInfo: {\r\n            isNewUser: false,\r\n            profile: {},\r\n            providerId: user.providerId,\r\n            username: user.email,\r\n        },\r\n        /** not sure what this is intended to be */\r\n        operationType: '',\r\n    };\r\n}\n\nfunction toUserRecord(user) {\r\n    if (!user) {\r\n        return undefined;\r\n    }\r\n    const u = { ...user };\r\n    delete u.password;\r\n    delete u.providerId;\r\n    return u;\r\n}\n\nconst dotify = (path) => {\r\n    const dotPath = path.replace(/[\\\\/]/g, '.');\r\n    return removeDotsAtExtremes(dotPath.slice(0, 1) === '.' ? dotPath.slice(1) : dotPath);\r\n};\r\nfunction dotifyKeys(obj) {\r\n    const result = {};\r\n    Object.keys(obj).forEach((key) => {\r\n        result[dotify(key)] = obj[key];\r\n    });\r\n    return result;\r\n}\r\nfunction removeDotsAtExtremes(path) {\r\n    const front = path.slice(0, 1) === '.' ? path.slice(1) : path;\r\n    return front.slice(-1) === '.' ? front.slice(0, front.length - 1) : front;\r\n}\n\n/**\r\n * provides a friendly way to pause execution when using\r\n * async/await symantics\r\n */\r\nasync function wait(ms) {\r\n    return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\n\n/**\r\n * Provides a string lookup of a AWS region's\r\n * geographic name based on it's more technical AWS region\r\n * name.\r\n *\r\n * For instance, `us-east-1` looks up to \"N. Virginia\", etc.\r\n */\r\nvar AwsRegionName;\r\n(function (AwsRegionName) {\r\n    // US\r\n    AwsRegionName[\"us-east-1\"] = \"N. Virginia\";\r\n    AwsRegionName[\"us-east-2\"] = \"Ohio\";\r\n    AwsRegionName[\"us-west-1\"] = \"N. California\";\r\n    AwsRegionName[\"us-west-2\"] = \"Oregon\";\r\n    // Africa\r\n    AwsRegionName[\"af-south-1\"] = \"Cape Town\";\r\n    // AP\r\n    AwsRegionName[\"ap-east-1\"] = \"Hong Kong\";\r\n    AwsRegionName[\"ap-south-1\"] = \"Mumbai\";\r\n    AwsRegionName[\"ap-northeast-1\"] = \"Tokyo\";\r\n    AwsRegionName[\"ap-northeast-2\"] = \"Seoul\";\r\n    AwsRegionName[\"ap-northeast-3\"] = \"Osaka\";\r\n    AwsRegionName[\"ap-southeast-1\"] = \"Singapore\";\r\n    AwsRegionName[\"ap-southeast-2\"] = \"Sydney\";\r\n    // Canada\r\n    AwsRegionName[\"ca-central-1\"] = \"Canada (central)\";\r\n    // EU\r\n    AwsRegionName[\"eu-central-1\"] = \"Frankfurt\";\r\n    AwsRegionName[\"eu-west-1\"] = \"Ireland\";\r\n    AwsRegionName[\"eu-west-2\"] = \"London\";\r\n    AwsRegionName[\"eu-west-3\"] = \"Paris\";\r\n    AwsRegionName[\"eu-north-1\"] = \"Stockholm\";\r\n    AwsRegionName[\"eu-south-1\"] = \"Milan\";\r\n    // Middle East\r\n    AwsRegionName[\"me-south-1\"] = \"Bahrain\";\r\n    // South America\r\n    AwsRegionName[\"sa-east-1\"] = \"S\\u0101o Paulo\";\r\n})(AwsRegionName || (AwsRegionName = {}));\n\nvar HttpStatusCodes;\r\n(function (HttpStatusCodes) {\r\n    /**\r\n     * The client SHOULD continue with its request. This interim response is used to inform\r\n     * the client that the initial part of the request has been received and has not yet\r\n     * been rejected by the server. The client SHOULD continue by sending the remainder\r\n     * of the request or, if the request has already been completed, ignore this response.\r\n     * The server MUST send a final response after the request has been completed.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"Continue\"] = 100] = \"Continue\";\r\n    /** The request has succeeded. */\r\n    HttpStatusCodes[HttpStatusCodes[\"Success\"] = 200] = \"Success\";\r\n    /**\r\n     * The request has been fulfilled and resulted in a new resource being created. The newly\r\n     * created resource can be referenced by the URI(s) returned in the entity of the response,\r\n     * with the most specific URI for the resource given by a Location header field. The response\r\n     * SHOULD include an entity containing a list of resource characteristics and location(s) from\r\n     * which the user or user agent can choose the one most appropriate. The entity format is\r\n     * specified by the media type given in the Content-Type header field. The origin server MUST\r\n     * create the resource before returning the `201` status code. If the action cannot be carried\r\n     * out immediately, the server SHOULD respond with `202` (Accepted) response instead.\r\n     *\r\n     * A `201` response MAY contain an ETag response header field indicating the current value of\r\n     * the entity tag for the requested variant just created.\r\n  \n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"Created\"] = 201] = \"Created\";\r\n    /**\r\n     * The request has been accepted for processing, but the processing has not been completed.\r\n     * The request might or might not eventually be acted upon, as it might be disallowed when\r\n     * processing actually takes place. There is no facility for re-sending a status code from an\r\n     * asynchronous operation such as this.\r\n     *\r\n     * The 202 response is intentionally non-committal. Its purpose is to allow a server to accept\r\n     * a request for some other process (perhaps a batch-oriented process that is only run once\r\n     * per day) without requiring that the user agent's connection to the server persist until the\r\n     * process is completed. The entity returned with this response SHOULD include an indication\r\n     * of the request's current status and either a pointer to a status monitor or some estimate\r\n     * of when the user can expect the request to be fulfilled.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"Accepted\"] = 202] = \"Accepted\";\r\n    /**\r\n     * The server has fulfilled the request but does not need to return an entity-body, and might\r\n     * want to return updated meta-information. The response MAY include new or updated\r\n     * meta-information in the form of entity-headers, which if present SHOULD be associated with\r\n     * the requested variant.\r\n     *\r\n     * If the client is a _user agent_, it **SHOULD NOT** change its document view from that which\r\n     * caused the request to be sent. This response is primarily intended to allow input for\r\n     * actions to take place without causing a change to the user agent's active document view,\r\n     * although any new or updated metainformation **SHOULD** be applied to the document\r\n     * currently in the user agent's active view.\r\n     *\r\n     * The `204` response **MUST NOT** include a `message-body`, and thus is always terminated\r\n     * by the first empty line after the header fields.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"NoContent\"] = 204] = \"NoContent\";\r\n    HttpStatusCodes[HttpStatusCodes[\"MovedPermenantly\"] = 301] = \"MovedPermenantly\";\r\n    HttpStatusCodes[HttpStatusCodes[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\r\n    /**\r\n     * If the client has performed a conditional GET request and access is allowed, but the\r\n     * document has not been modified, the server SHOULD respond with this status code. The\r\n     * `304` response MUST NOT contain a _message-body_, and thus is always terminated by the\r\n     * first empty line after the header fields.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"NotModified\"] = 304] = \"NotModified\";\r\n    /**\r\n     * The request could not be understood by the server due to malformed syntax.\r\n     * The client SHOULD NOT repeat the request without modifications.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"BadRequest\"] = 400] = \"BadRequest\";\r\n    /**\r\n     * The request requires user authentication. The response MUST include a WWW-Authenticate\r\n     * header field containing a challenge applicable to the requested resource.\r\n     * The client MAY repeat the request with a suitable Authorization header field. If the\r\n     * request already included Authorization credentials, then the `401`\r\n     * response indicates that authorization has been refused for those credentials. If the `401`\r\n     * response contains the same challenge as the prior response, and the user agent has already\r\n     * attempted authentication at least once, then the user SHOULD be presented the entity that\r\n     * was given in the response, since that entity might include relevant diagnostic information.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"Unauthorized\"] = 401] = \"Unauthorized\";\r\n    HttpStatusCodes[HttpStatusCodes[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\r\n    /**\r\n     * The request could not be understood by the server due to malformed syntax. The client\r\n     * SHOULD NOT repeat the request without modifications.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"Forbidden\"] = 403] = \"Forbidden\";\r\n    /**\r\n     * The server has not found anything matching the Request-URI. No indication is given of\r\n     * whether the condition is temporary or permanent. The `410` (Gone) status code SHOULD be\r\n     * used if the server knows, through some internally configurable mechanism, that an old\r\n     * resource is permanently unavailable and has no forwarding address.\r\n     *\r\n     * This status code is commonly used when the server does not wish to reveal exactly\r\n     * why the request has been refused, or when no other response is applicable.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"NotFound\"] = 404] = \"NotFound\";\r\n    /**\r\n     * The method specified in the Request-Line is not allowed for the resource identified\r\n     * by the Request-URI. The response MUST include an Allow header containing a list of\r\n     * valid methods for the requested resource.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\r\n    /**\r\n     * The client did not produce a request within the time that the server was\r\n     * prepared to wait. The client MAY repeat the request without modifications\r\n     * at any later time.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\r\n    /**\r\n     * The request could not be completed due to a conflict with the current state of the\r\n     * resource. This code is only allowed in situations where it is expected that the\r\n     * user might be able to resolve the conflict and resubmit the request. The response\r\n     * body SHOULD include enough information for the user to recognize the source of the\r\n     * conflict. Ideally, the response entity would include enough information for the\r\n     * user or user agent to fix the problem; however, that might not be possible and\r\n     * is not required.\r\n     *\r\n     * Conflicts are most likely to occur in response to a PUT request. For example,\r\n     * if versioning were being used and the entity being PUT included changes to a resource\r\n     * which conflict with those made by an earlier (third-party) request, the server might\r\n     * use the 409 response to indicate that it can't complete the request. In this case,\r\n     * the response entity would likely contain a list of the differences between the\r\n     * two versions in a format defined by the response Content-Type.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"Conflict\"] = 409] = \"Conflict\";\r\n    /**\r\n     * The requested resource is no longer available at the server and no forwarding address\r\n     * is known. This condition is expected to be considered permanent. Clients with link\r\n     * editing capabilities SHOULD delete references to the Request-URI after user approval.\r\n     * If the server does not know, or has no facility to determine, whether or not the\r\n     * condition is permanent, the status code 404 (Not Found) SHOULD be used instead.\r\n     * This response is cacheable unless indicated otherwise.\r\n     *\r\n     * The 410 response is primarily intended to assist the task of web maintenance by\r\n     * notifying the recipient that the resource is intentionally unavailable and that\r\n     * the server owners desire that remote links to that resource be removed. Such an\r\n     * event is common for limited-time, promotional services and for resources belonging\r\n     * to individuals no longer working at the server's site. It is not necessary to mark\r\n     * all permanently unavailable resources as \"gone\" or to keep the mark for any length\r\n     * of time -- that is left to the discretion of the server owner.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"Gone\"] = 410] = \"Gone\";\r\n    /**\r\n     * Indicates that the server refuses to brew coffee because it is, permanently, a teapot.\r\n     * A combined coffee/tea pot that is temporarily out of coffee should instead return 503.\r\n     * This error is a reference to Hyper Text Coffee Pot Control Protocol defined in April\r\n     * Fools' jokes in 1998 and 2014.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"IAmATeapot\"] = 418] = \"IAmATeapot\";\r\n    HttpStatusCodes[HttpStatusCodes[\"UnprocessableEntity\"] = 422] = \"UnprocessableEntity\";\r\n    /**\r\n     * The 429 status code indicates that the user has sent too many requests in a given\r\n     * amount of time (\"rate limiting\").\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\r\n    /**\r\n     * The server encountered an unexpected condition which prevented it from fulfilling\r\n     * the request.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"InternalServerError\"] = 500] = \"InternalServerError\";\r\n    /**\r\n     * The server does not support the functionality required to fulfill the request. This\r\n     * is the appropriate response when the server does not recognize the request method\r\n     * and is not capable of supporting it for any resource.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"NotImplemented\"] = 501] = \"NotImplemented\";\r\n    /**\r\n     * The server, while acting as a gateway or proxy, received an invalid response from\r\n     * the upstream server it accessed in attempting to fulfill the request.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"BadGateway\"] = 502] = \"BadGateway\";\r\n    /**\r\n     * Indicates that the server is not ready to handle the request.\r\n     *\r\n     * Common causes are a server that is down for maintenance or that is overloaded.\r\n     * This response should be used for temporary conditions and the `Retry-After` HTTP\r\n     * header should, if possible, contain the estimated time for the recovery of the\r\n     * service.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\r\n    HttpStatusCodes[HttpStatusCodes[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\r\n    /**\r\n     * The 511 status code indicates that the client needs to authenticate to gain\r\n     * network access.\r\n     *\r\n     * The response representation SHOULD contain a link to a resource that allows\r\n     * the user to submit credentials (e.g. with a HTML form).\r\n     *\r\n     * Note that the 511 response SHOULD NOT contain a challenge or the login interface\r\n     * itself, because browsers would show the login interface as being associated with\r\n     * the originally requested URL, which may cause confusion.\r\n     */\r\n    HttpStatusCodes[HttpStatusCodes[\"AuthenticationRequired\"] = 511] = \"AuthenticationRequired\";\r\n})(HttpStatusCodes || (HttpStatusCodes = {}));\n\nvar ExifCompression;\r\n(function (ExifCompression) {\r\n    ExifCompression[ExifCompression[\"Uncompressed\"] = 1] = \"Uncompressed\";\r\n    ExifCompression[ExifCompression[\"CCITT\"] = 2] = \"CCITT\";\r\n    ExifCompression[ExifCompression[\"T4Group3Fax\"] = 3] = \"T4Group3Fax\";\r\n    ExifCompression[ExifCompression[\"T6Group3Fax\"] = 4] = \"T6Group3Fax\";\r\n    ExifCompression[ExifCompression[\"LZW\"] = 5] = \"LZW\";\r\n    ExifCompression[ExifCompression[\"JpgOldStyle\"] = 6] = \"JpgOldStyle\";\r\n    ExifCompression[ExifCompression[\"Jpg\"] = 7] = \"Jpg\";\r\n    ExifCompression[ExifCompression[\"AdobeDeflate\"] = 8] = \"AdobeDeflate\";\r\n    ExifCompression[ExifCompression[\"JBigBw\"] = 9] = \"JBigBw\";\r\n    ExifCompression[ExifCompression[\"JBigColor\"] = 10] = \"JBigColor\";\r\n    ExifCompression[ExifCompression[\"JpegAlt\"] = 99] = \"JpegAlt\";\r\n    ExifCompression[ExifCompression[\"Kodak262\"] = 262] = \"Kodak262\";\r\n    ExifCompression[ExifCompression[\"Next\"] = 32766] = \"Next\";\r\n    ExifCompression[ExifCompression[\"SonyRawCompressed\"] = 32767] = \"SonyRawCompressed\";\r\n    ExifCompression[ExifCompression[\"PackedRaw\"] = 32769] = \"PackedRaw\";\r\n    ExifCompression[ExifCompression[\"SamsungSrwCompressed\"] = 32770] = \"SamsungSrwCompressed\";\r\n    ExifCompression[ExifCompression[\"CCIRLEW\"] = 32771] = \"CCIRLEW\";\r\n    ExifCompression[ExifCompression[\"SamsungSrwCompressed2\"] = 32772] = \"SamsungSrwCompressed2\";\r\n    ExifCompression[ExifCompression[\"Packbits\"] = 32773] = \"Packbits\";\r\n    ExifCompression[ExifCompression[\"Thunderscan\"] = 32809] = \"Thunderscan\";\r\n    ExifCompression[ExifCompression[\"KodakKdcCompressed\"] = 32867] = \"KodakKdcCompressed\";\r\n    ExifCompression[ExifCompression[\"IT8CTPAD\"] = 32895] = \"IT8CTPAD\";\r\n    ExifCompression[ExifCompression[\"IT8LW\"] = 32896] = \"IT8LW\";\r\n    ExifCompression[ExifCompression[\"IT8MP\"] = 32897] = \"IT8MP\";\r\n    ExifCompression[ExifCompression[\"IT8BL\"] = 32898] = \"IT8BL\";\r\n    ExifCompression[ExifCompression[\"PixarFilm\"] = 32908] = \"PixarFilm\";\r\n    ExifCompression[ExifCompression[\"PixarLog\"] = 32909] = \"PixarLog\";\r\n    ExifCompression[ExifCompression[\"Deflate\"] = 32946] = \"Deflate\";\r\n    ExifCompression[ExifCompression[\"DCS\"] = 32947] = \"DCS\";\r\n    ExifCompression[ExifCompression[\"AperioJpeg2000YCbCr\"] = 33003] = \"AperioJpeg2000YCbCr\";\r\n    ExifCompression[ExifCompression[\"AperioJpeg2000RGB\"] = 33005] = \"AperioJpeg2000RGB\";\r\n    ExifCompression[ExifCompression[\"JBig\"] = 34661] = \"JBig\";\r\n    ExifCompression[ExifCompression[\"SGILog\"] = 34676] = \"SGILog\";\r\n    ExifCompression[ExifCompression[\"SGILog24\"] = 34677] = \"SGILog24\";\r\n    ExifCompression[ExifCompression[\"Jpeg2000\"] = 34712] = \"Jpeg2000\";\r\n    ExifCompression[ExifCompression[\"NikonNEFCompressed\"] = 34713] = \"NikonNEFCompressed\";\r\n    ExifCompression[ExifCompression[\"JBig2TiffFx\"] = 34715] = \"JBig2TiffFx\";\r\n    ExifCompression[ExifCompression[\"MicrosoftBinaryLevelCodec\"] = 34718] = \"MicrosoftBinaryLevelCodec\";\r\n    ExifCompression[ExifCompression[\"MicrosoftProgressiveTransformCodec\"] = 34719] = \"MicrosoftProgressiveTransformCodec\";\r\n    ExifCompression[ExifCompression[\"MicrosoftVector\"] = 34720] = \"MicrosoftVector\";\r\n    ExifCompression[ExifCompression[\"ESRCLerc\"] = 34887] = \"ESRCLerc\";\r\n    ExifCompression[ExifCompression[\"LossyJpeg\"] = 34892] = \"LossyJpeg\";\r\n    ExifCompression[ExifCompression[\"LZMA2\"] = 34925] = \"LZMA2\";\r\n    ExifCompression[ExifCompression[\"Zstd\"] = 34926] = \"Zstd\";\r\n    ExifCompression[ExifCompression[\"WepP\"] = 34927] = \"WepP\";\r\n    ExifCompression[ExifCompression[\"PNG\"] = 34933] = \"PNG\";\r\n    ExifCompression[ExifCompression[\"JpegXR\"] = 34934] = \"JpegXR\";\r\n    ExifCompression[ExifCompression[\"KodakDCRCompressed\"] = 65000] = \"KodakDCRCompressed\";\r\n    ExifCompression[ExifCompression[\"PentaxPEFCompressed\"] = 65535] = \"PentaxPEFCompressed\";\r\n})(ExifCompression || (ExifCompression = {}));\r\nvar ExifLightSource;\r\n(function (ExifLightSource) {\r\n    ExifLightSource[ExifLightSource[\"Unknown\"] = 0] = \"Unknown\";\r\n    ExifLightSource[ExifLightSource[\"Daylight\"] = 1] = \"Daylight\";\r\n    ExifLightSource[ExifLightSource[\"Flourescent\"] = 2] = \"Flourescent\";\r\n    ExifLightSource[ExifLightSource[\"Tungsten\"] = 3] = \"Tungsten\";\r\n    ExifLightSource[ExifLightSource[\"Flash\"] = 4] = \"Flash\";\r\n    ExifLightSource[ExifLightSource[\"FineWeather\"] = 5] = \"FineWeather\";\r\n    ExifLightSource[ExifLightSource[\"Cloudy\"] = 6] = \"Cloudy\";\r\n    ExifLightSource[ExifLightSource[\"Shade\"] = 7] = \"Shade\";\r\n    ExifLightSource[ExifLightSource[\"DaylightFlourescent\"] = 8] = \"DaylightFlourescent\";\r\n    ExifLightSource[ExifLightSource[\"DayWhiteFlourescent\"] = 9] = \"DayWhiteFlourescent\";\r\n    ExifLightSource[ExifLightSource[\"CoolWhiteFlourescent\"] = 10] = \"CoolWhiteFlourescent\";\r\n    ExifLightSource[ExifLightSource[\"WhiteFlourescent\"] = 11] = \"WhiteFlourescent\";\r\n    ExifLightSource[ExifLightSource[\"WarmWhiteFlourescent\"] = 12] = \"WarmWhiteFlourescent\";\r\n    ExifLightSource[ExifLightSource[\"StandardLightA\"] = 13] = \"StandardLightA\";\r\n    ExifLightSource[ExifLightSource[\"StandardLightB\"] = 14] = \"StandardLightB\";\r\n    ExifLightSource[ExifLightSource[\"StandardLightC\"] = 15] = \"StandardLightC\";\r\n    ExifLightSource[ExifLightSource[\"D55\"] = 16] = \"D55\";\r\n    ExifLightSource[ExifLightSource[\"D65\"] = 17] = \"D65\";\r\n    ExifLightSource[ExifLightSource[\"D75\"] = 18] = \"D75\";\r\n    ExifLightSource[ExifLightSource[\"D50\"] = 19] = \"D50\";\r\n    ExifLightSource[ExifLightSource[\"ISOStudioTungten\"] = 20] = \"ISOStudioTungten\";\r\n    ExifLightSource[ExifLightSource[\"Other\"] = 255] = \"Other\";\r\n})(ExifLightSource || (ExifLightSource = {}));\r\nvar ExifFlashValues;\r\n(function (ExifFlashValues) {\r\n    ExifFlashValues[ExifFlashValues[\"NoFlash\"] = 0] = \"NoFlash\";\r\n    ExifFlashValues[ExifFlashValues[\"Fired\"] = 1] = \"Fired\";\r\n    ExifFlashValues[ExifFlashValues[\"FiredReturnNotDetected\"] = 5] = \"FiredReturnNotDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"FiredReturnDetected\"] = 7] = \"FiredReturnDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"OnDidNotFire\"] = 8] = \"OnDidNotFire\";\r\n    ExifFlashValues[ExifFlashValues[\"OnFired\"] = 9] = \"OnFired\";\r\n    ExifFlashValues[ExifFlashValues[\"OnReturnNotDetected\"] = 13] = \"OnReturnNotDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"OnReturnDetected\"] = 15] = \"OnReturnDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"OffDidNotFire\"] = 16] = \"OffDidNotFire\";\r\n    ExifFlashValues[ExifFlashValues[\"OffDidNotFireReturnNotDetected\"] = 20] = \"OffDidNotFireReturnNotDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"AutoDidNotFire\"] = 24] = \"AutoDidNotFire\";\r\n    ExifFlashValues[ExifFlashValues[\"AutoFired\"] = 25] = \"AutoFired\";\r\n    ExifFlashValues[ExifFlashValues[\"AutoFiredReturnNotDetected\"] = 29] = \"AutoFiredReturnNotDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"AutoFiredReturnDetected\"] = 31] = \"AutoFiredReturnDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"NoFlashFunction\"] = 32] = \"NoFlashFunction\";\r\n    ExifFlashValues[ExifFlashValues[\"OffNoFlashFunction\"] = 48] = \"OffNoFlashFunction\";\r\n    ExifFlashValues[ExifFlashValues[\"FiredRedEyeReduction\"] = 65] = \"FiredRedEyeReduction\";\r\n    ExifFlashValues[ExifFlashValues[\"FiredRedEyeReductionReturnNotDetected\"] = 69] = \"FiredRedEyeReductionReturnNotDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"FiredRedEyeReductionReturnDetected\"] = 71] = \"FiredRedEyeReductionReturnDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"OnRedEyeReduction\"] = 73] = \"OnRedEyeReduction\";\r\n    ExifFlashValues[ExifFlashValues[\"OnRedEyeReductionReturnNotDetected\"] = 77] = \"OnRedEyeReductionReturnNotDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"OnRedEyeReductionReturnDetected\"] = 79] = \"OnRedEyeReductionReturnDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"OffRedEyeReduction\"] = 80] = \"OffRedEyeReduction\";\r\n    ExifFlashValues[ExifFlashValues[\"AutoDidNotFireRedEyeReduction\"] = 88] = \"AutoDidNotFireRedEyeReduction\";\r\n    ExifFlashValues[ExifFlashValues[\"AutoFiredRedEyeReduction\"] = 89] = \"AutoFiredRedEyeReduction\";\r\n    ExifFlashValues[ExifFlashValues[\"AutoFiredRedEyeReductionNotDetected\"] = 89] = \"AutoFiredRedEyeReductionNotDetected\";\r\n    ExifFlashValues[ExifFlashValues[\"AutoFiredRedEyeReductionDetected\"] = 93] = \"AutoFiredRedEyeReductionDetected\";\r\n})(ExifFlashValues || (ExifFlashValues = {}));\r\nvar ExifPreviewColorSpace;\r\n(function (ExifPreviewColorSpace) {\r\n    ExifPreviewColorSpace[ExifPreviewColorSpace[\"Unknown\"] = 0] = \"Unknown\";\r\n    ExifPreviewColorSpace[ExifPreviewColorSpace[\"GrayGamma22\"] = 1] = \"GrayGamma22\";\r\n    ExifPreviewColorSpace[ExifPreviewColorSpace[\"sRGB\"] = 2] = \"sRGB\";\r\n    ExifPreviewColorSpace[ExifPreviewColorSpace[\"AdobeRGB\"] = 3] = \"AdobeRGB\";\r\n    ExifPreviewColorSpace[ExifPreviewColorSpace[\"ProPhotoRGB\"] = 4] = \"ProPhotoRGB\";\r\n})(ExifPreviewColorSpace || (ExifPreviewColorSpace = {}));\r\nvar ExifEmbedPolicy;\r\n(function (ExifEmbedPolicy) {\r\n    ExifEmbedPolicy[ExifEmbedPolicy[\"AllowCopying\"] = 0] = \"AllowCopying\";\r\n    ExifEmbedPolicy[ExifEmbedPolicy[\"EmbedIfUsed\"] = 1] = \"EmbedIfUsed\";\r\n    ExifEmbedPolicy[ExifEmbedPolicy[\"NeverEmbed\"] = 2] = \"NeverEmbed\";\r\n    ExifEmbedPolicy[ExifEmbedPolicy[\"NoRestrictions\"] = 3] = \"NoRestrictions\";\r\n})(ExifEmbedPolicy || (ExifEmbedPolicy = {}));\r\nvar ExifSubjectDistance;\r\n(function (ExifSubjectDistance) {\r\n    ExifSubjectDistance[ExifSubjectDistance[\"Unknown\"] = 0] = \"Unknown\";\r\n    ExifSubjectDistance[ExifSubjectDistance[\"Macro\"] = 1] = \"Macro\";\r\n    ExifSubjectDistance[ExifSubjectDistance[\"Close\"] = 2] = \"Close\";\r\n    ExifSubjectDistance[ExifSubjectDistance[\"Distant\"] = 3] = \"Distant\";\r\n})(ExifSubjectDistance || (ExifSubjectDistance = {}));\r\nvar ExifSharpness;\r\n(function (ExifSharpness) {\r\n    ExifSharpness[ExifSharpness[\"Normal\"] = 0] = \"Normal\";\r\n    ExifSharpness[ExifSharpness[\"Soft\"] = 1] = \"Soft\";\r\n    ExifSharpness[ExifSharpness[\"Hard\"] = 2] = \"Hard\";\r\n})(ExifSharpness || (ExifSharpness = {}));\r\nvar ExifSceneCaptureType;\r\n(function (ExifSceneCaptureType) {\r\n    ExifSceneCaptureType[ExifSceneCaptureType[\"Standard\"] = 0] = \"Standard\";\r\n    ExifSceneCaptureType[ExifSceneCaptureType[\"Landscape\"] = 1] = \"Landscape\";\r\n    ExifSceneCaptureType[ExifSceneCaptureType[\"Portrait\"] = 2] = \"Portrait\";\r\n    ExifSceneCaptureType[ExifSceneCaptureType[\"Night\"] = 3] = \"Night\";\r\n    ExifSceneCaptureType[ExifSceneCaptureType[\"Other\"] = 4] = \"Other\";\r\n})(ExifSceneCaptureType || (ExifSceneCaptureType = {}));\r\nvar ExifGainControl;\r\n(function (ExifGainControl) {\r\n    ExifGainControl[ExifGainControl[\"None\"] = 0] = \"None\";\r\n    ExifGainControl[ExifGainControl[\"LowGainUp\"] = 1] = \"LowGainUp\";\r\n    ExifGainControl[ExifGainControl[\"HighGainUp\"] = 2] = \"HighGainUp\";\r\n    ExifGainControl[ExifGainControl[\"LowGainDown\"] = 3] = \"LowGainDown\";\r\n    ExifGainControl[ExifGainControl[\"HighGainDown\"] = 4] = \"HighGainDown\";\r\n})(ExifGainControl || (ExifGainControl = {}));\r\nvar ExifContrast;\r\n(function (ExifContrast) {\r\n    ExifContrast[ExifContrast[\"Normal\"] = 0] = \"Normal\";\r\n    ExifContrast[ExifContrast[\"Low\"] = 1] = \"Low\";\r\n    ExifContrast[ExifContrast[\"High\"] = 2] = \"High\";\r\n})(ExifContrast || (ExifContrast = {}));\r\nvar ExifSaturation;\r\n(function (ExifSaturation) {\r\n    ExifSaturation[ExifSaturation[\"Normal\"] = 0] = \"Normal\";\r\n    ExifSaturation[ExifSaturation[\"Low\"] = 1] = \"Low\";\r\n    ExifSaturation[ExifSaturation[\"High\"] = 2] = \"High\";\r\n})(ExifSaturation || (ExifSaturation = {}));\n\n/**\r\n * Ways in which missing data can be treated.\r\n *\r\n * [Official Docs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#alarms-and-missing-data)\r\n */\r\nvar StepFunctionMissingDataTreatment;\r\n(function (StepFunctionMissingDataTreatment) {\r\n    /** The alarm does not consider missing data points when evaluating whether to change state. */\r\n    StepFunctionMissingDataTreatment[\"missing\"] = \"missing\";\r\n    /** The current alarm state is maintained. */\r\n    StepFunctionMissingDataTreatment[\"ignore\"] = \"ignore\";\r\n    /** Missing data points are treated as breaching the threshold. */\r\n    StepFunctionMissingDataTreatment[\"breaching\"] = \"breaching\";\r\n    /** Missing data points are treated as being within the threshold. */\r\n    StepFunctionMissingDataTreatment[\"notBreaching\"] = \"notBreaching\";\r\n})(StepFunctionMissingDataTreatment || (StepFunctionMissingDataTreatment = {}));\n\nasync function networkDelay(delay) {\r\n    let waitFor;\r\n    if (typeof delay === 'number') {\r\n        waitFor = delay;\r\n    }\r\n    else if (Array.isArray(delay)) {\r\n        waitFor = nativeDash.between(...delay);\r\n    }\r\n    else {\r\n        const lookup = {\r\n            [types.NetworkDelay.lifi]: [10, 10000],\r\n            [types.NetworkDelay.mobile2g]: [300, 1200],\r\n            [types.NetworkDelay.mobile3g]: [200, 750],\r\n            [types.NetworkDelay.mobile4g]: [75, 200],\r\n            [types.NetworkDelay.wifi]: [25, 75],\r\n            [types.NetworkDelay.lazer]: [1, 5],\r\n        };\r\n        waitFor = nativeDash.between(...lookup[delay]);\r\n    }\r\n    await wait(waitFor);\r\n}\n\nfunction normalizeRef(r) {\r\n    r = r.replace('/', '.');\r\n    r = r.slice(0, 1) === '.' ? r.slice(1) : r;\r\n    return r;\r\n}\r\nfunction parts(r) {\r\n    return normalizeRef(r).split('.');\r\n}\r\n/**\r\n * return the last component of the path\r\n * which typically would represent the 'id'\r\n * of a list-node\r\n */\r\nfunction leafNode(r) {\r\n    return parts(r).pop();\r\n}\r\n/**\r\n * Joins a set of paths together and converts into\r\n * correctly formatted \"dot notation\" directory path\r\n */\r\nfunction join(...paths) {\r\n    return paths\r\n        .map((p) => {\r\n        return p.replace(/[/\\\\]/gm, '.');\r\n    })\r\n        .map((p) => (p.slice(-1) === '.' ? p.slice(0, p.length - 1) : p))\r\n        .map((p) => (p.slice(0, 1) === '.' ? p.slice(1) : p))\r\n        .join('.');\r\n}\r\n/**\r\n * Given a path, returns the parent path and child key\r\n */\r\nfunction keyAndParent(dotPath) {\r\n    const sections = dotPath.split('.');\r\n    const changeKey = sections.pop();\r\n    const parent = sections.join('.');\r\n    return { parent, key: changeKey };\r\n}\r\n/** Get the parent DB path */\r\nfunction getParent(dotPath) {\r\n    return keyAndParent(dotPath).parent;\r\n}\r\n/** Get the Key from the end of a path string */\r\nfunction getKey(dotPath) {\r\n    return keyAndParent(dotPath).key;\r\n}\r\nfunction stripLeadingDot(str) {\r\n    return str.slice(0, 1) === '.' ? str.slice(1) : str;\r\n}\r\nfunction removeDots(str) {\r\n    return str ? str.replace(/\\./g, '') : undefined;\r\n}\n\n/**\r\n * Sets a value at a nested point within base object passed in. This is meant as a\r\n * replacement to use of `lodash.set()`.\r\n *\r\n * @param obj the base object which is being mutated\r\n * @param dotPath the path into the object where the mutation will take place, delimited by `.`\r\n * @param value The value to set at the _dotPath_\r\n * @param createIfNonExistant by default, if the path to the object does not exist then an error is thrown but if you want you can state the desire to have the full path created\r\n */\r\nfunction set(obj, dotPath, value, createIfNonExistant = true) {\r\n    if (!dotPath && !createIfNonExistant) {\r\n        throw new FireMockError(`Attempt to set value into a dotPath but the dotPath was empty!`, 'not-allowed');\r\n    }\r\n    else if (!dotPath && createIfNonExistant && typeof value === 'object') {\r\n        Object.entries(value).forEach(([key, _value]) => {\r\n            set(obj, key, _value);\r\n        });\r\n        return;\r\n    }\r\n    const parts = dotPath === null || dotPath === void 0 ? void 0 : dotPath.split(/\\??\\./);\r\n    const allButLast = (parts === null || parts === void 0 ? void 0 : parts.slice(0, parts.length - 1)) || Object.keys(value);\r\n    const key = parts.pop();\r\n    let ref = obj;\r\n    // iterate the ref to the leaf node\r\n    allButLast.forEach((p) => {\r\n        if (!ref[p]) {\r\n            if (createIfNonExistant) {\r\n                ref[p] = {};\r\n            }\r\n            else {\r\n                throw new FireMockError(`The dotPath -- ${dotPath} -- does not exist in the passed in object. You must either expressly state that you want the object structure created or this a real error that must be addressed otherwise. The part of the path which this failed on was \"${p}\".`, 'not-allowed');\r\n            }\r\n        }\r\n        else if (typeof ref[p] !== 'object') {\r\n            throw new FireMockError(`Failed to set the path of \"${dotPath}\" of the passed in base object because the base object had a scalar value along that path and setting this would have changed the object's data structure in way which is not allowed! The scalar value was found in the \"${p}\" component of the path.`, 'not-allowed');\r\n        }\r\n        ref = ref[p];\r\n    });\r\n    ref[key] = value;\r\n}\n\nconst orderByChild = (child) => {\r\n    return (a, b) => {\r\n        return a[child] > b[child] ? 1 : a[child] === b[child] ? 0 : -1;\r\n    };\r\n};\r\nconst orderByKey$1 = (a, b) => {\r\n    return a.id > b.id ? -1 : a.id === b.id ? 0 : 1;\r\n};\r\nconst orderByValue$1 = (a, b) => {\r\n    return a.value > b.value ? -1 : a.value === b.value ? 0 : 1;\r\n};\r\nfunction isOrderByChild(query, fn) {\r\n    return query.identity.orderBy === types.RtdbOrder.orderByChild;\r\n}\n\nvar sortFns = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  orderByChild: orderByChild,\n  orderByKey: orderByKey$1,\n  orderByValue: orderByValue$1,\n  isOrderByChild: isOrderByChild\n});\n\nclass Auth {\r\n    constructor() {\r\n        throw new Error('You should not call this constructor directly! Instead use the auth() accessor to get to this API.');\r\n    }\r\n}\n\nconst data = {\r\n    providerId: 'emailPassword',\r\n    signInMethod: 'emailPassword',\r\n};\r\n/**\r\n * **EmailAuthProvider** API mocking. Details on the API can be found\r\n * here: https://firebase.google.com/docs/reference/js/firebase.auth.EmailAuthProvider\r\n */\r\nclass EmailAuthProvider {\r\n    constructor() {\r\n        this.providerId = data.providerId;\r\n    }\r\n    /**\r\n     * Produces a `credential` to a user account (typically an anonymous account)\r\n     * which can then be linked to the account using `linkWithCredential`.\r\n     */\r\n    static credential(email, password) {\r\n        return {\r\n            ...data,\r\n            toJSON() {\r\n                return JSON.stringify(data);\r\n            },\r\n        };\r\n    }\r\n    /**\r\n     * Initialize an EmailAuthProvider credential using an email and an email link after\r\n     * a sign in with email link operation.\r\n     */\r\n    static credentialWithLink(email, emailLink) {\r\n        return {\r\n            ...data,\r\n            toJSON() {\r\n                return JSON.stringify(data);\r\n            },\r\n        };\r\n    }\r\n}\r\nEmailAuthProvider.PROVIDER_ID = 'emailPassword';\n\nclass FacebookAuthProvider {\r\n    constructor() {\r\n        this.providerId = 'facebook';\r\n    }\r\n    static credential(token) {\r\n        throw new Error('FacebookAuthProvider not implemented yet');\r\n    }\r\n    addScope(scope) {\r\n        throw new Error('not implemented');\r\n    }\r\n    setCustomParameters(params) {\r\n        throw new Error('not implemented');\r\n    }\r\n}\n\nclass GithubAuthProvider {\r\n    static credential(idToken, accessToken) {\r\n        throw new Error('not implemented');\r\n    }\r\n    addScope(scope) {\r\n        throw new Error('not implemented');\r\n    }\r\n    setCustomParameters(params) {\r\n        throw new Error('not implemented');\r\n    }\r\n}\r\nGithubAuthProvider.PROVIDER_ID = 'github';\n\nclass GoogleAuthProvider {\r\n    static credential(idToken, accessToken) {\r\n        throw new Error('not implemented');\r\n    }\r\n    addScope(scope) {\r\n        throw new Error('not implemented');\r\n    }\r\n    setCustomParameters(params) {\r\n        throw new Error('not implemented');\r\n    }\r\n}\r\nGoogleAuthProvider.PROVIDER_ID = 'google';\n\nclass TwitterAuthProvider {\r\n    constructor() {\r\n        this.providerId = 'twitter';\r\n    }\r\n    static credential(idToken, accessToken) {\r\n        throw new Error('not implemented');\r\n    }\r\n    addScope(scope) {\r\n        throw new Error('not implemented');\r\n    }\r\n    setCustomParameters(params) {\r\n        throw new Error('not implemented');\r\n    }\r\n}\r\nTwitterAuthProvider.PROVIDER_ID = 'twitter';\n\nclass SAMLAuthProvider {\r\n    constructor() {\r\n        this.providerId = 'saml';\r\n    }\r\n}\n\nclass OAuthProvider {\r\n    // tslint:disable-next-line: no-empty\r\n    constructor(providerId) {\r\n        this.providerId = 'oauth';\r\n        this.providerId = providerId;\r\n    }\r\n    addScope(_scope) {\r\n        throw new Error('not implemented');\r\n    }\r\n    credential(_idToken, _accessToken) {\r\n        throw new Error('not implemented');\r\n    }\r\n    // tslint:disable-next-line: ban-types\r\n    setCustomParameters(_customOAuthParameters) {\r\n        throw new Error('not implemented');\r\n    }\r\n}\n\nclass PhoneAuthProvider {\r\n    constructor() {\r\n        this.providerId = 'phone';\r\n    }\r\n    static credential(_verificationId, _verificationCode) {\r\n        throw new Error('not implemented');\r\n    }\r\n    verifyPhoneNumber(_phoneNumber, _applicationVerifier) {\r\n        throw new Error('not-implemented');\r\n    }\r\n}\r\nPhoneAuthProvider.PROVIDER_ID = 'phone';\n\nclass RecaptchaVerifier {\r\n    clear() {\r\n        // TODO:\r\n    }\r\n    render() {\r\n        throw new Error('not-implemented');\r\n    }\r\n    verify() {\r\n        throw new Error('not-implemented');\r\n    }\r\n}\n\n/**\r\n * The mocked Auth API for a Client SDK\r\n */\r\nconst authProviders = {\r\n    Auth: Auth,\r\n    EmailAuthProvider,\r\n    FacebookAuthProvider,\r\n    GithubAuthProvider,\r\n    GoogleAuthProvider,\r\n    TwitterAuthProvider,\r\n    SAMLAuthProvider,\r\n    OAuthProvider,\r\n    PhoneAuthProvider,\r\n    RecaptchaVerifier,\r\n};\r\nconst fn = () => {\r\n    throw new Error('not allowed');\r\n};\r\nvar _authProviders = (authProviders || fn);\n\nfunction getIdToken(api) {\r\n    return async () => {\r\n        const user = api.getCurrentUser();\r\n        await networkDelay(types.NetworkDelay.wifi);\r\n        if (!user) {\r\n            throw new Error('not logged in');\r\n        }\r\n        if (user.tokenIds) {\r\n            return nativeDash.atRandom(user.tokenIds);\r\n        }\r\n        else {\r\n            return Math.random().toString(36).substr(2, 10);\r\n        }\r\n    };\r\n}\n\nfunction getIdTokenResult(api) {\r\n    return async (forceRefresh) => {\r\n        return {\r\n            authTime: '',\r\n            claims: {},\r\n            expirationTime: '',\r\n            issuedAtTime: '',\r\n            signInProvider: '',\r\n            signInSecondFactor: '',\r\n            token: await getIdToken(api)(),\r\n        };\r\n    };\r\n}\n\nconst notImplemented$2 = {\r\n    /** Deletes and signs out the user. */\r\n    delete() {\r\n        throw new Error('the Mock Auth feature for delete() is not yet implemented');\r\n    },\r\n    linkAndRetrieveDataWithCredential(credential) {\r\n        throw new Error(`linkAndRetrieveDataWithCredential() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n    linkWithCredential(credential) {\r\n        throw new Error(`linkWithCredential() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n    async linkWithPhoneNumber(phoneNUmber, applicationVerificer) {\r\n        return Promise.resolve(fakeApplicationVerifier);\r\n    },\r\n    linkWithPopup(provider) {\r\n        throw new Error(`linkWithPopup() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n    linkWithRedirect(provider) {\r\n        throw new Error(`linkWithRedirect() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n    reauthenticateAndRetrieveDataWithCredential(credential) {\r\n        throw new Error(`reauthenticateAndRetrieveDataWithCredential() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n    reauthenticateWithCredential(credential) {\r\n        throw new Error(`reauthenticateWithCredential() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n    async reauthenticateWithPhoneNumber(phoneNumber, applicationVerifier) {\r\n        return Promise.resolve(fakeApplicationVerifier);\r\n    },\r\n    reauthenticateWithPopup(provider) {\r\n        throw new Error(`reauthenticateWithPopup() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n    reauthenticateWithRedirect(provider) {\r\n        throw new Error(`reauthenticateWithRedirect() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n    reload() {\r\n        return;\r\n    },\r\n    sendEmailVerification(actionCodeSettings) {\r\n        throw new Error(`sendEmailVerification() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n    toJSON() {\r\n        return {};\r\n    },\r\n    unlink(provider) {\r\n        throw new Error(`unlink() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n    updatePhoneNumber(phoneCredential) {\r\n        throw new Error(`updatePhoneNumber() is not implemented yet in the client-sdk's mock auth`);\r\n    },\r\n};\n\n/**\r\n * **updateEmail**\r\n *\r\n * Gives a logged in user the ability to update their email address.\r\n *\r\n * Possible Errors:\r\n *\r\n * - auth/invalid-email\r\n * - auth/email-already-in-use\r\n * - auth/requires-recent-login\r\n *\r\n * [Documentation](https://firebase.google.com/docs/reference/js/firebase.User#update-email)\r\n *\r\n * > Note: The `forceLogin` is not part of Firebase API but allows mock user to force the\r\n * error condition associated with a user who's been logged in a long time.\r\n */\r\nconst updateEmail = (api) => async (newEmail, forceLogin) => {\r\n    if (forceLogin) {\r\n        throw new FireMockError(\"updating a user's email address requires that the user have recently logged in; use 'reauthenticateWithCredential' to address this error.\", 'auth/requires-recent-login');\r\n    }\r\n    await networkDelay(types.NetworkDelay.wifi);\r\n    api.updateUser(api.getCurrentUser(), { email: newEmail });\r\n};\n\n/**\r\n * **updatePassword**\r\n *\r\n * Updates the password for a logged in user. For security reasons, this operations\r\n * requires the user to have recently signed in.\r\n *\r\n * Errors:\r\n *\r\n * - auth/weak-password\r\n * - auth/required-recent-login ( can use `reauthenticateWithCredential` to resolve this )\r\n *\r\n * > Note: the `notRecentLogin` is NOT part of the normal API but allows mock users to force\r\n * the `auth/required-recent-login` error.\r\n *\r\n * [Docs](https://firebase.google.com/docs/reference/js/firebase.User#updatepassword)\r\n */\r\nconst updatePassword = (api) => async (newPassword, notRecentLogin) => {\r\n    if (notRecentLogin) {\r\n        throw new FireMockError(\"updating a user's password requires that the user have recently logged in; use 'reauthenticateWithCredential' to address this error.\", 'auth/required-recent-login');\r\n    }\r\n    await networkDelay(types.NetworkDelay.wifi);\r\n    api.updateUser(api.getCurrentUser(), {\r\n        password: newPassword,\r\n    });\r\n};\n\n/**\r\n * Updates a user's profile data.\r\n *\r\n * Example:\r\n *\r\n * ```typescript\r\n * user.updateProfile({\r\n      displayName: \"Jane Q. User\",\r\n      photoURL: \"https://example.com/jane-q-user/profile.jpg\"\r\n  })\r\n * ```\r\n\n [Documentation](https://firebase.google.com/docs/reference/js/firebase.User#updateprofile)\r\n */\r\nconst updateProfile = (api) => async (profile) => {\r\n    await networkDelay(types.NetworkDelay.wifi);\r\n    api.updateUser(api.getCurrentUser(), profile);\r\n};\n\n/**\r\n * Combines the property and API aspects into a `User` object where\r\n * the API aspects are provided access to the `IMockAuthMgmt` api to\r\n * ensure function calls effect the correct AUTH instance.\r\n */\r\nfunction createUser(api, user) {\r\n    const fns = {\r\n        ...notImplemented$2,\r\n        getIdToken: getIdToken(api),\r\n        getIdTokenResult: getIdTokenResult(api),\r\n        updateEmail: updateEmail(api),\r\n        updatePassword: updatePassword(api),\r\n        updateProfile: updateProfile(api),\r\n    };\r\n    return {\r\n        isAnonymous: false,\r\n        emailVerified: user.email ? true : false,\r\n        ...fns,\r\n        ...user,\r\n    };\r\n}\n\nlet _currentUser = null;\r\nconst toMockUser = (user, metadata) => {\r\n    return {\r\n        kind: 'MockUserRecord',\r\n        uid: user.uid,\r\n        email: user.email,\r\n        emailVerified: user.emailVerified,\r\n        disabled: false,\r\n        customClaims: {},\r\n        password: user.password,\r\n        metadata,\r\n        providerData: undefined,\r\n        toJSON: () => ({}),\r\n    };\r\n};\r\n/**\r\n * Creates an Auth Admin Manager API which can be used for advanced\r\n * test use cases. This API will be appropriately adjusted based on\r\n * whether this is an Admin or Client SDK.\r\n */\r\nfunction createAuthManager(sdk) {\r\n    const _anonymousUidQueue = [];\r\n    let _providers;\r\n    const _authObservers = [];\r\n    let _knownUsers = [];\r\n    let _networkDelay;\r\n    const getAuthObservers = () => {\r\n        return _authObservers;\r\n    };\r\n    const addAuthObserver = (ob) => {\r\n        _authObservers.push(ob);\r\n    };\r\n    const hasProvider = (provider) => {\r\n        return _providers.includes(provider);\r\n    };\r\n    const addProvider = (provider) => {\r\n        if (_providers.includes(provider)) {\r\n            throw new FireMockError(`Failed adding \"${provider}\" as a new Firemock auth provider as it was already listed as a provider!`, 'already-exists');\r\n        }\r\n        _providers.push(provider);\r\n    };\r\n    const removeProvider = (provider) => {\r\n        if (!_providers.includes(provider)) {\r\n            throw new FireMockError(`Failed to remove \"${provider}\" as a Firemock auth provider as it was not listed as a provider!`, 'does-not-exists');\r\n        }\r\n        _providers = _providers.filter((i) => i !== provider);\r\n    };\r\n    const findKnownUser = (prop, value) => {\r\n        return _knownUsers.find((u) => u[prop] === value);\r\n    };\r\n    const getCurrentUser = () => {\r\n        const u = _currentUser ? findKnownUser('uid', _currentUser) : undefined;\r\n        return u;\r\n    };\r\n    const setCurrentUser = (user, force) => {\r\n        var _a;\r\n        let lookingFor;\r\n        if (!user) {\r\n            _currentUser = undefined;\r\n        }\r\n        else if (typeof user === 'string') {\r\n            lookingFor = user;\r\n        }\r\n        else if (isUser(user) || isMockUserRecord(user)) {\r\n            lookingFor = user.uid;\r\n        }\r\n        else if (isUserCredential(user)) {\r\n            lookingFor = user.user.uid;\r\n        }\r\n        const u = findKnownUser('uid', lookingFor);\r\n        const uid = u ? u.uid : undefined;\r\n        if (!uid && !force) {\r\n            throw new FireMockError(`Attempt to set current user failed as UID [${lookingFor}] could not be found in the known users being managed by the Auth service!`, 'user-missing');\r\n        }\r\n        if (_currentUser !== uid || force) {\r\n            _currentUser = uid;\r\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-return\r\n            (_a = getAuthObservers()) === null || _a === void 0 ? void 0 : _a.map((o) => {\r\n                const currentUser = getCurrentUser();\r\n                return o(currentUser ? createUser(authManager, toUser(currentUser)) : undefined);\r\n            });\r\n        }\r\n        return u;\r\n    };\r\n    const login = (user) => {\r\n        if (!user) {\r\n            throw new FireMockError(`Attempt to login without passing a valid user representation!`, 'not-allowed');\r\n        }\r\n        return createUser(authManager, toUser(setCurrentUser(user)));\r\n    };\r\n    const logout = () => {\r\n        if (_providers) {\r\n            if (_providers.includes('anonymous')) {\r\n                setCurrentUser(getAnonymousUid());\r\n            }\r\n            else {\r\n                setCurrentUser(undefined, true);\r\n            }\r\n        }\r\n    };\r\n    const createNewUid = () => {\r\n        return `${Math.random().toString(36).substr(2, 10)}`;\r\n    };\r\n    const getAnonymousUid = () => {\r\n        if (_anonymousUidQueue.length > 0) {\r\n            const uid = _anonymousUidQueue.shift();\r\n            return uid;\r\n        }\r\n        else {\r\n            return `anonymous-user-${createNewUid()}`;\r\n        }\r\n    };\r\n    const addToUserPool = (user) => {\r\n        let mockUser;\r\n        // for those that need fake data:\r\n        const metadata = {\r\n            lastSignInTime: undefined,\r\n            creationTime: new Date().toUTCString(),\r\n            toJSON: () => ({}),\r\n        };\r\n        if (isMockUserRecord(user)) {\r\n            mockUser = user;\r\n        }\r\n        else if (isUserRecord(user)) {\r\n            mockUser = {\r\n                password: '123456789',\r\n                ...user,\r\n                kind: 'MockUserRecord',\r\n            };\r\n        }\r\n        else if (isUserCredential(user)) {\r\n            mockUser = {\r\n                kind: 'MockUserRecord',\r\n                uid: user.user.uid,\r\n                emailVerified: user.user.emailVerified,\r\n                disabled: false,\r\n                customClaims: {},\r\n                phoneNumber: user.user.phoneNumber,\r\n                isAnonymous: user.user.isAnonymous,\r\n                photoURL: user.user.photoURL,\r\n                tokenIds: [],\r\n                metadata,\r\n                providerData: undefined,\r\n                toJSON: () => ({}),\r\n            };\r\n        }\r\n        else if (isUser(user)) {\r\n            mockUser = toMockUser(user, metadata);\r\n        }\r\n        else if ('email' in user) {\r\n            mockUser = {\r\n                kind: 'MockUserRecord',\r\n                uid: user.uid || nativeDash.uuid(),\r\n                emailVerified: true,\r\n                disabled: false,\r\n                customClaims: {},\r\n                tokenIds: [],\r\n                metadata,\r\n                providerData: undefined,\r\n                ...user,\r\n            };\r\n        }\r\n        _knownUsers.push(mockUser);\r\n        return _knownUsers.length;\r\n    };\r\n    const removeFromUserPool = (uid) => {\r\n        _knownUsers = _knownUsers.filter((i) => i.uid !== uid);\r\n        return _knownUsers.length;\r\n    };\r\n    const knownUsers = () => {\r\n        return _knownUsers;\r\n    };\r\n    const initializeAuth = async (config) => {\r\n        const fullConfig = {\r\n            providers: (config === null || config === void 0 ? void 0 : config.providers) || ['anonymous'],\r\n            users: (config === null || config === void 0 ? void 0 : config.users) || [],\r\n            options: {\r\n                networkDelay: types.NetworkDelay.wifi,\r\n                ...config === null || config === void 0 ? void 0 : config.options,\r\n            },\r\n        };\r\n        _providers =\r\n            typeof fullConfig.providers === 'function'\r\n                ? await fullConfig.providers()\r\n                : fullConfig.providers;\r\n        setNetworkDelay(fullConfig.options.networkDelay);\r\n        const users = typeof fullConfig.users === 'function'\r\n            ? await fullConfig.users()\r\n            : fullConfig.users;\r\n        _knownUsers = [];\r\n        users === null || users === void 0 ? void 0 : users.forEach((u) => {\r\n            addToUserPool(u);\r\n        });\r\n    };\r\n    const updateUser = (user, updates) => {\r\n        let u;\r\n        if (!isMockUserRecord(updates)) {\r\n            updates = {\r\n                // ...(updates.disabled !== undefined\r\n                //   ? { disabled: updates.disabled }\r\n                //   : {}),\r\n                ...(updates.displayName !== undefined\r\n                    ? { displayName: updates.displayName }\r\n                    : {}),\r\n                ...(updates.email !== undefined ? { email: updates.email } : {}),\r\n                ...(updates.emailVerified !== undefined\r\n                    ? { emailVerified: updates.emailVerified }\r\n                    : {}),\r\n                // ...(updates.password !== undefined\r\n                //   ? { password: updates.password }\r\n                //   : {}),\r\n                ...(updates.photoURL !== undefined\r\n                    ? { photoURL: updates.photoURL }\r\n                    : {}),\r\n                ...(updates.multiFactor !== undefined\r\n                    ? { clientMultiFactor: { enrolledFactors: [] } }\r\n                    : {}),\r\n            };\r\n        }\r\n        if (typeof user === 'string') {\r\n            u = findKnownUser('uid', user);\r\n            if (!u) {\r\n                throw new FireMockError(`Attempt to update the user with UID of \"${user}\" failed because this user is not defined in the mock Auth instance!`);\r\n            }\r\n        }\r\n        else {\r\n            u = user;\r\n        }\r\n        _knownUsers = _knownUsers.map((i) => i.uid === u.uid ? { ...i, ...updates } : i);\r\n    };\r\n    const queueAnonymousUidPool = () => {\r\n        //\r\n    };\r\n    const authProviders = types.isAdminSdk(sdk)\r\n        ? undefined\r\n        : _authProviders;\r\n    const getAuthProvidersNames = () => {\r\n        return _providers;\r\n    };\r\n    const networkDelay$1 = async () => {\r\n        await networkDelay(_networkDelay);\r\n    };\r\n    const setNetworkDelay = (delay) => {\r\n        _networkDelay = delay;\r\n    };\r\n    const authManager = {\r\n        getAuthObservers,\r\n        addAuthObserver,\r\n        getCurrentUser,\r\n        setCurrentUser,\r\n        login,\r\n        logout,\r\n        createNewUid,\r\n        getAnonymousUid,\r\n        findKnownUser,\r\n        hasProvider,\r\n        updateUser,\r\n        addToUserPool,\r\n        knownUsers,\r\n        initializeAuth,\r\n        queueAnonymousUidPool,\r\n        addProvider,\r\n        removeProvider,\r\n        networkDelay: networkDelay$1,\r\n        removeFromUserPool,\r\n        setNetworkDelay,\r\n        authProviders,\r\n        getAuthProvidersNames,\r\n    };\r\n    return authManager;\r\n}\n\n/**\r\n * Passing the in the management API returns the Firebase Client Auth API\r\n */\r\nconst createClientAuth = (api) => {\r\n    return {\r\n        ...notImplemented$1,\r\n        ...implemented$1(api),\r\n    };\r\n};\n\nconst implemented$1 = (api) => ({\r\n    tenantId: '',\r\n    languageCode: '',\r\n    settings: {\r\n        appVerificationDisabledForTesting: false,\r\n    },\r\n    app: {\r\n        name: 'mocked-app',\r\n        options: {},\r\n        async delete() {\r\n            return;\r\n        },\r\n        automaticDataCollectionEnabled: false,\r\n    },\r\n    onAuthStateChanged(observer, error, completed) {\r\n        api.addAuthObserver(observer);\r\n        const currentUser = api.getCurrentUser();\r\n        observer(currentUser ? createUser(api, toUser(currentUser)) : undefined);\r\n        return undefined;\r\n    },\r\n    async setPersistence() {\r\n        console.warn(`currently firemock accepts calls to setPersistence() but it doesn't support it.`);\r\n        return;\r\n    },\r\n    signInAnonymously: async () => {\r\n        await api.networkDelay();\r\n        if (api.hasProvider('anonymous')) {\r\n            const user = createUser(api, {\r\n                isAnonymous: true,\r\n                uid: api.getAnonymousUid(),\r\n            });\r\n            const credential = {\r\n                signInMethod: 'anonymous',\r\n                providerId: 'anonymous',\r\n                toJSON: () => ({\r\n                    signInMethod: 'anonymous',\r\n                    providerId: 'anonymous',\r\n                }),\r\n            };\r\n            const userCredentials = completeUserCredential({ user, credential });\r\n            api.addToUserPool(userCredentials);\r\n            api.setCurrentUser(userCredentials);\r\n            return userCredentials;\r\n        }\r\n        else {\r\n            throw new FireMockError('you must enable anonymous auth in the Firebase Console', 'auth/operation-not-allowed');\r\n        }\r\n    },\r\n    async updateCurrentUser(updates) {\r\n        api.updateUser(api.getCurrentUser().uid, updates);\r\n    },\r\n    /**\r\n     * Sign into Firebase with Email and Password:\r\n     * [Docs](https://firebase.google.com/docs/reference/js/firebase.auth.Auth#signinwithemailandpassword)\r\n     *\r\n     * Error Codes:\r\n     *  - auth/invalid-email\r\n     *  - auth/user-disabled\r\n     *  - auth/user-not-found\r\n     *  - auth/wrong-password\r\n     */\r\n    async signInWithEmailAndPassword(email, password) {\r\n        await api.networkDelay();\r\n        if (!emailValidationAllowed(api)()) {\r\n            throw new FireMockError('email authentication not allowed', 'auth/operation-not-allowed');\r\n        }\r\n        if (!emailIsValidFormat()(email)) {\r\n            throw new FireMockError(`invalid email: ${email}`, 'auth/invalid-email');\r\n        }\r\n        const user = api.findKnownUser('email', email);\r\n        if (!user) {\r\n            throw new FireMockError(`The email \"${email}\" is not a known user in the mock database`, `auth/user-not-found`);\r\n        }\r\n        if (user.disabled) {\r\n            throw new FireMockError(`The user identified by \"${user.email}\" has been disabled!`, `auth/user-disabled`);\r\n        }\r\n        if (!emailHasCorrectPassword(api)(email, password)) {\r\n            throw new FireMockError(`Invalid password for ${email}`, 'auth/wrong-password');\r\n        }\r\n        const partial = {\r\n            user: {\r\n                email: user.email,\r\n                isAnonymous: false,\r\n                emailVerified: user.emailVerified,\r\n                uid: userUid(api)(email),\r\n                displayName: user.displayName,\r\n                ...createUser(api, user),\r\n            },\r\n            credential: {\r\n                signInMethod: 'signInWithEmailAndPassword',\r\n                providerId: '',\r\n            },\r\n            additionalUserInfo: {\r\n                username: email,\r\n            },\r\n        };\r\n        const u = completeUserCredential(partial);\r\n        api.setCurrentUser(u);\r\n        return u;\r\n    },\r\n    /**\r\n     * Add a new user with the Email/Password provider.\r\n     *\r\n     * Possible errors:\r\n     * - auth/email-already-in-use\r\n     * - auth/invalid-email\r\n     * - auth/operation-not-allowed\r\n     * - auth/weak-password\r\n     *\r\n     * [Docs](https://firebase.google.com/docs/reference/js/firebase.auth.Auth#createuserwithemailandpassword)\r\n     */\r\n    async createUserWithEmailAndPassword(email, password) {\r\n        await api.networkDelay();\r\n        if (!emailValidationAllowed(api)()) {\r\n            throw new FireMockError('email authentication not allowed', 'auth/operation-not-allowed');\r\n        }\r\n        if (emailExistsAsUserInAuth(api)(email)) {\r\n            throw new FireMockError(`\"${email}\" user already exists`, 'auth/email-already-in-use');\r\n        }\r\n        if (!emailIsValidFormat()(email)) {\r\n            throw new FireMockError(`\"${email}\" is not a valid email format`, 'auth/invalid-email');\r\n        }\r\n        const uid = userUid(api)(email);\r\n        const partial = {\r\n            user: {\r\n                ...createUser(api, { email, uid }),\r\n                isAnonymous: false,\r\n                emailVerified: false,\r\n            },\r\n            credential: {\r\n                signInMethod: 'signInWithEmailAndPassword',\r\n                providerId: '',\r\n            },\r\n            additionalUserInfo: {\r\n                username: email,\r\n            },\r\n        };\r\n        const u = completeUserCredential(partial);\r\n        api.addToUserPool({ uid: partial.user.uid, email, password });\r\n        api.setCurrentUser(u);\r\n        return u;\r\n    },\r\n    async confirmPasswordReset(code, newPassword) {\r\n        return;\r\n    },\r\n    async sendPasswordResetEmail(email, actionCodeSetting) {\r\n        console.group('Firemock: sendPasswordResetEmail()');\r\n        console.log(`an email is being sent to \"${email}\".`);\r\n        console.log(`the \"action code settings\" are:`, actionCodeSetting);\r\n        console.groupEnd();\r\n    },\r\n    async signOut() {\r\n        api.logout();\r\n    },\r\n    get currentUser() {\r\n        return completeUserCredential({}).user;\r\n    },\r\n});\n\n/**\r\n * Implements the interface's functions but functions just\r\n * throw errors.\r\n */\r\nconst notImplemented$1 = {\r\n    useEmulator(url, opts) {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    emulatorConfig: null,\r\n    onAuthStateChanged(nextOrObserver) {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async signInAnonymously() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async updateCurrentUser(user) {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async confirmPasswordReset(code, newPassword) {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async verifyPasswordResetCode(code) {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async useDeviceLanguage() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async setPersistence() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    // async isSignInWithEmailLink(emailLink: string) {\r\n    //   throw createError(\r\n    //     'auth/not-implemented',\r\n    //     'This feature is not implemented yet in FireMock auth module'\r\n    //   );\r\n    // },\r\n    async signInWithEmailAndPassword(email, password) {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async createUserWithEmailAndPassword(email, password) {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async sendPasswordResetEmail(email, actionCodeSetting) {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async signOut() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async applyActionCode(code) {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async checkActionCode(code) {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async fetchSignInMethodsForEmail() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async getRedirectResult() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    isSignInWithEmailLink() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    onIdTokenChanged() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async sendSignInLinkToEmail() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async signInAndRetrieveDataWithCredential() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async signInWithCredential() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async signInWithCustomToken() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async signInWithEmailLink() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async signInWithPhoneNumber() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async signInWithPopup() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    async signInWithRedirect() {\r\n        throw brilliantErrors.createError('auth/not-implemented', 'This feature is not implemented yet in FireMock auth module');\r\n    },\r\n    // async useDeviceLanguage() {\r\n    //   throw createError(\r\n    //     'auth/not-implemented',\r\n    //     'This feature is not implemented yet in FireMock auth module'\r\n    //   );\r\n    // },\r\n    // async verifyPasswordResetCode(code: string) {\r\n    //   throw createError(\r\n    //     'auth/not-implemented',\r\n    //     'This feature is not implemented yet in FireMock auth module'\r\n    //   );\r\n    // },\r\n};\n\nconst emailExistsAsUserInAuth = (api) => (email) => {\r\n    const emails = api.knownUsers().map((i) => i.email);\r\n    return emails.includes(email);\r\n};\r\nconst emailIsValidFormat = (_api) => (email) => {\r\n    return emailValidator.validate(email);\r\n};\r\nconst emailHasCorrectPassword = (api) => (email, password) => {\r\n    const config = api.knownUsers().find((i) => i.email === email);\r\n    return config ? config.password === password : false;\r\n};\r\nconst userUid = (api) => (email) => {\r\n    const user = api.findKnownUser('email', email);\r\n    return user ? user.uid : nativeDash.uuid();\r\n};\r\nconst emailValidationAllowed = (api) => () => {\r\n    return api.hasProvider('emailPassword');\r\n};\n\nconst claims = (api) => ({\r\n    /**\r\n     * Sets additional developer claims on an existing user identified by the provided uid,\r\n     * typically used to define user roles and levels of access.\r\n     */\r\n    // eslint-disable-next-line @typescript-eslint/require-await\r\n    async setCustomUserClaims(uid, customClaims) {\r\n        api.updateUser(uid, { customClaims });\r\n    },\r\n});\n\nconst tokens = (api) => ({\r\n    /**\r\n     * Verifies a Firebase ID token (JWT). If the token is valid, the promise is fulfilled\r\n     * with the token's decoded claims; otherwise, the promise is rejected. An optional\r\n     * flag can be passed to additionally check whether the ID token was revoked.\r\n     *\r\n     * @param idToken The ID token to verify\r\n     * @param checkRevoked Whether to check if the ID token was revoked. This requires an\r\n     * extra request to the Firebase Auth backend to check the tokensValidAfterTime time\r\n     * for the corresponding user. When not specified, this additional check is not applied.\r\n     */\r\n    verifyIdToken(idToken, checkRevoked) {\r\n        throw new Error('not implemented');\r\n    },\r\n});\n\nconst users = (api) => ({\r\n    // https://firebase.google.com/docs/auth/admin/manage-users#create_a_user\r\n    // eslint-disable-next-line @typescript-eslint/require-await\r\n    async createUser(properties) {\r\n        const UserRecord = {\r\n            ...properties,\r\n            metadata: {\r\n                lastSignInTime: null,\r\n                creationTime: String(new Date()),\r\n                toJSON() {\r\n                    return JSON.stringify(properties);\r\n                },\r\n            },\r\n            multiFactor: null,\r\n            toJSON: () => null,\r\n            providerData: null,\r\n            emailVerified: false,\r\n        };\r\n        api.addToUserPool(UserRecord);\r\n        return UserRecord;\r\n    },\r\n    /** Updates an existing user (admin-sdk). */\r\n    async updateUser(user, properties) {\r\n        let uid;\r\n        if (typeof user !== 'string' && (isUser(user) || isMockUserRecord(user))) {\r\n            uid = user.uid;\r\n        }\r\n        else {\r\n            uid = user;\r\n        }\r\n        api.updateUser(uid, properties);\r\n        return Promise.resolve(toUserRecord(api.getCurrentUser()));\r\n    },\r\n    async deleteUser(uid) {\r\n        await api.networkDelay();\r\n        api.removeFromUserPool(uid);\r\n    },\r\n    async getUserByEmail(email) {\r\n        await api.networkDelay();\r\n        return toUserRecord(api.findKnownUser('email', email));\r\n    },\r\n    async getUserByPhoneNumber(phoneNumber) {\r\n        return Promise.resolve(toUserRecord(api.findKnownUser('phoneNumber', phoneNumber)));\r\n    },\r\n    async listUsers(maxResults, pageToken) {\r\n        await api.networkDelay();\r\n        return {\r\n            users: maxResults\r\n                ? api.knownUsers().slice(0, maxResults)\r\n                : api.knownUsers(),\r\n        };\r\n    },\r\n});\n\nconst implemented = (api) => ({\r\n    ...users(api),\r\n    ...claims(api),\r\n    ...tokens(),\r\n});\n\nconst notImplemented = {\r\n//\r\n};\n\n/**\r\n * Passing the in the management API returns the Firebase Client Auth API\r\n */\r\nconst createAdminAuth = (api) => {\r\n    return {\r\n        ...implemented(api),\r\n        ...notImplemented\r\n    };\r\n};\n\n/**\r\n * A factory function which generates the appropriate Auth API (for the\r\n * passed in SDK) as well as a `authManager` API to manipulate the auth state\r\n * with super-powers.\r\n */\r\nfunction createAuth(sdk, mockAuth) {\r\n    const authManager = createAuthManager(sdk);\r\n    authManager.initializeAuth(mockAuth);\r\n    return (types.isAdminSdk(sdk)\r\n        ? [createAdminAuth(authManager), authManager]\r\n        : [createClientAuth(authManager), authManager]);\r\n}\n\n// TODO: Removed because this state is going to hanlded in `createStore.ts`\r\n// let _listeners: IListener[] = [];\r\n/**\r\n * **addListener**\r\n *\r\n * Adds a listener for watched events; setup by\r\n * the `query.on()` API call.\r\n *\r\n * This listener is\r\n * pushed onto a private stack but can be interogated\r\n * with a call to `getListeners()` or if you're only\r\n * interested in the _paths_ which are being watched\r\n * you can call `listenerPaths()`.\r\n */\r\n// TODO: the code below has been moved into `createStore.ts`\r\n// export async function addListener(\r\n//   pathOrQuery: string | SerializedRealTimeQuery<any>,\r\n//   eventType: IRtdbDbEvent,\r\n//   callback: IFirebaseEventHandler,\r\n//   cancelCallbackOrContext?: (err?: Error) => void,\r\n//   context?: IDictionary\r\n// ): Promise<IRtdbDataSnapshot> {\r\n//   const query = (typeof pathOrQuery === 'string'\r\n//     ? new SerializedRealTimeQuery(join(pathOrQuery))\r\n//     : pathOrQuery) as SerializedRealTimeQuery;\r\n//   pathOrQuery = (typeof pathOrQuery === 'string'\r\n//     ? join(pathOrQuery)\r\n//     : query.path) as string;\r\n//   _listeners.push({\r\n//     id: Math.random().toString(36).substr(2, 10),\r\n//     query,\r\n//     eventType,\r\n//     callback,\r\n//     cancelCallbackOrContext,\r\n//     context,\r\n//   });\r\n//   function ref(dbPath: string) {\r\n//     return new Reference(dbPath);\r\n//   }\r\n//   const snapshot = await query\r\n//     .deserialize({ ref })\r\n//     .once(eventType === 'value' ? 'value' : 'child_added');\r\n//   if (eventType === 'value') {\r\n//     callback(snapshot);\r\n//   } else {\r\n//     const list = hashToArray(snapshot.val());\r\n//     if (eventType === 'child_added') {\r\n//       list.forEach((i: IDictionary) =>\r\n//         callback(new SnapShot(join(query.path, i.id), i))\r\n//       );\r\n//     }\r\n//   }\r\n//   return snapshot;\r\n// }\r\n/**\r\n * **removeListener**\r\n *\r\n * Removes an active listener (or multiple if the info provided matches more\r\n * than one).\r\n *\r\n * If you provide the `context` property it will use this to identify\r\n * the listener, if not then it will use `eventType` (if available) as\r\n * well as `callback` (if available) to identify the callback(s)\r\n */\r\n// TODO: This has been moved into  `createStore.ts`\r\n// export function removeListener(\r\n//   eventType?: IRtdbDbEvent,\r\n//   callback?: (snap: IRtdbDataSnapshot, key?: string) => void,\r\n//   context?: IDictionary\r\n// ): number {\r\n//   if (!eventType) {\r\n//     return removeAllListeners();\r\n//   }\r\n//   if (!callback) {\r\n//     const removed = _listeners.filter((l) => l.eventType === eventType);\r\n//     _listeners = _listeners.filter((l) => l.eventType !== eventType);\r\n//     return cancelCallback(removed);\r\n//   }\r\n//   if (!context) {\r\n//     // use eventType and callback to identify\r\n//     const removed = _listeners\r\n//       .filter((l) => l.callback === callback)\r\n//       .filter((l) => l.eventType === eventType);\r\n//     _listeners = _listeners.filter(\r\n//       (l) => l.eventType !== eventType || l.callback !== callback\r\n//     );\r\n//     return cancelCallback(removed);\r\n//   } else {\r\n//     // if we have context then we can ignore other params\r\n//     const removed = _listeners\r\n//       .filter((l) => l.callback === callback)\r\n//       .filter((l) => l.eventType === eventType)\r\n//       .filter((l) => l.context === context);\r\n//     _listeners = _listeners.filter(\r\n//       (l) =>\r\n//         l.context !== context ||\r\n//         l.callback !== callback ||\r\n//         l.eventType !== eventType\r\n//     );\r\n//     return cancelCallback(removed);\r\n//   }\r\n// }\r\n/**\r\n * internal function responsible for the actual removal of\r\n * a listener.\r\n */\r\n// function cancelCallback<TSdk extends ISdk>(\r\n//   removed: IMockListener<TSdk>[]\r\n// ): number {\r\n//   let count = 0;\r\n//   removed.forEach((l) => {\r\n//     if (typeof l.cancelCallbackOrContext === 'function') {\r\n//       (l.cancelCallbackOrContext as () => any)();\r\n//       count++;\r\n//     }\r\n//   });\r\n//   return count;\r\n// }\r\n// TODO: This method should be rewritten or we have to write tests without depending of this method.\r\n/// Because it is only being used in tests\r\n// export function removeAllListeners<TSdk extends ISdk>(store: IMockStore<TSdk>) {\r\n//   const _listeners = store.getAllListeners();\r\n//   return (): number => {\r\n//     const howMany = cancelCallback(_listeners);\r\n//     _listeners = [];\r\n//     return howMany;\r\n//   };\r\n// }\r\n/**\r\n * **listenerCount**\r\n *\r\n * Provides a numberic count of listeners on the database.\r\n * Optionally you can state the `EventType` and get a count\r\n * of only this type of event.\r\n */\r\n// export function listenerCount(type?: IRtdbDbEvent) {\r\n//   return type\r\n//     ? _listeners.filter((l) => l.eventType === type).length\r\n//     : _listeners.length;\r\n// }\r\n/**\r\n * **listenerPaths**\r\n *\r\n * Provides a list of _paths_ in the database which have listeners\r\n * attached to them. Optionally you can state the `EventType` and filter down to\r\n * only this type of event or \"set of events\".\r\n *\r\n * You can also just state \"child\" as the event and it will resolve to all child\r\n * events: `[ 'child_added', 'child_changed', 'child_removed', 'child_moved' ]`\r\n */\r\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\nfunction listenerPaths(store) {\r\n    const _listeners = store.getAllListeners();\r\n    return (lookFor) => {\r\n        if (lookFor && !Array.isArray(lookFor)) {\r\n            lookFor =\r\n                lookFor === 'child'\r\n                    ? ['child_added', 'child_changed', 'child_removed', 'child_moved']\r\n                    : [lookFor];\r\n        }\r\n        return lookFor\r\n            ? _listeners\r\n                .filter((l) => lookFor.includes(l.eventType))\r\n                .map((l) => l.query.path)\r\n            : _listeners.map((l) => l.query.path);\r\n    };\r\n}\r\n/**\r\n * **getListeners**\r\n *\r\n * Returns the list of listeners.Optionally you can state the `EventType` and\r\n * filter down to only this type of event or \"set of events\".\r\n *\r\n * You can also just state \"child\" as the event and it will resolve to all child\r\n * events: `[ 'child_added', 'child_changed', 'child_removed', 'child_moved' ]`\r\n */\r\nfunction getListeners(store) {\r\n    const _listeners = store.getAllListeners();\r\n    return (...lookFor) => {\r\n        const childEvents = [\r\n            'child_added',\r\n            'child_changed',\r\n            'child_removed',\r\n            'child_moved',\r\n        ];\r\n        const allEvents = childEvents.concat(['value']);\r\n        const events = lookFor.length === 0\r\n            ? allEvents\r\n            : lookFor.length === 1 && lookFor[0] === 'child'\r\n                ? childEvents\r\n                : lookFor;\r\n        return _listeners.filter((l) => events.includes(l.eventType));\r\n    };\r\n}\r\nfunction keyDidNotPreviouslyExist(e, dbSnapshot) {\r\n    return nativeDash.get(dbSnapshot, e.key) === undefined ? true : false;\r\n}\r\n/**\r\n * **notify**\r\n *\r\n * Based on a dictionary of paths/values it reduces this to events to\r\n * send to zero or more listeners.\r\n */\r\nfunction notify(api) {\r\n    return function (events, dbSnapshot) {\r\n        events.forEach((evt) => {\r\n            const isDeleteEvent = evt.value === null || evt.value === undefined;\r\n            switch (evt.listenerEvent) {\r\n                case 'child_removed':\r\n                    if (isDeleteEvent) {\r\n                        evt.callback(snapshot(api, evt.key, evt.priorValue));\r\n                    }\r\n                    return;\r\n                case 'child_added':\r\n                    if (!isDeleteEvent && keyDidNotPreviouslyExist(evt, dbSnapshot)) {\r\n                        evt.callback(snapshot(api, evt.key, evt.value));\r\n                    }\r\n                    return;\r\n                case 'child_changed':\r\n                    if (!isDeleteEvent) {\r\n                        evt.callback(snapshot(api, evt.key, evt.value));\r\n                    }\r\n                    return;\r\n                case 'child_moved':\r\n                    if (!isDeleteEvent && keyDidNotPreviouslyExist(evt, dbSnapshot)) {\r\n                        // TODO: if we implement sorting then add the previousKey value\r\n                        evt.callback(snapshot(api, evt.key, evt.value));\r\n                    }\r\n                    return;\r\n                case 'value': {\r\n                    const snapKey = snapshot(api, evt.listenerPath, evt.value).key;\r\n                    if (snapKey === evt.key) {\r\n                        // root set\r\n                        evt.callback(snapshot(api, evt.listenerPath, evt.value === null || evt.value === undefined\r\n                            ? undefined\r\n                            : { [evt.key]: evt.value }));\r\n                    }\r\n                    else {\r\n                        // property set\r\n                        const value = evt.value === null ? api.getDb(evt.listenerPath) : evt.value;\r\n                        evt.callback(snapshot(api, evt.listenerPath, value));\r\n                    }\r\n                }\r\n            } // end switch\r\n        });\r\n    };\r\n}\r\n/**\r\n * **findChildListeners**\r\n *\r\n * Finds \"child events\" listening to a given _parent path_; optionally\r\n * allowing for specification of the specific `EventType` or `EventType(s)`.\r\n *\r\n * @param changePath the _parent path_ that children are detected off of\r\n * @param eventTypes <optional> the specific child event (or events) to filter down to; if you have more than one then you should be aware that this property is destructured so the calling function should pass in an array of parameters rather than an array as the second parameter\r\n */\r\nfunction findChildListeners(store) {\r\n    const _listeners = store.getAllListeners();\r\n    return (changePath, ...eventTypes) => {\r\n        changePath = stripLeadingDot(changePath.replace(/\\//g, '.'));\r\n        eventTypes =\r\n            eventTypes.length !== 0\r\n                ? eventTypes\r\n                : ['child_added', 'child_changed', 'child_moved', 'child_removed'];\r\n        const decendants = _listeners\r\n            .filter((l) => eventTypes.includes(l.eventType))\r\n            .filter((l) => changePath.startsWith(dotify(l.query.path)))\r\n            .reduce((acc, listener) => {\r\n            const id = removeDots(changePath\r\n                .replace(listener.query.path, '')\r\n                .split('.')\r\n                .filter((i) => i)[0]);\r\n            const remainingPath = stripLeadingDot(changePath.replace(stripLeadingDot(listener.query.path), ''));\r\n            const changeIsAtRoot = id === remainingPath;\r\n            acc.push({ ...listener, ...{ id, changeIsAtRoot } });\r\n            return acc;\r\n        }, []);\r\n        return decendants;\r\n    };\r\n}\r\n/**\r\n * Finds all value listeners on a given path or below.\r\n * Unlike child listeners, Value listeners listen to changes at\r\n * all points below the registered path.\r\n *\r\n * @param path path to root listening point\r\n */\r\nfunction findValueListeners(store) {\r\n    const _listeners = store.getAllListeners();\r\n    return (path) => {\r\n        // TODO: Fix this type issue\r\n        return _listeners.filter((l) => join(path).indexOf(join(l.query.path)) !== -1 && l.eventType === 'value');\r\n    };\r\n}\n\nfunction onDisconnect(_store, _query) {\r\n    const disconnect = {\r\n        cancel: async () => {\r\n            return Promise.resolve();\r\n        },\r\n        remove: async () => {\r\n            return Promise.resolve();\r\n        },\r\n        set: async () => {\r\n            return Promise.resolve();\r\n        },\r\n        setWithPriority: async () => {\r\n            return Promise.resolve();\r\n        },\r\n        update: async () => {\r\n            return Promise.resolve();\r\n        },\r\n    };\r\n    return disconnect;\r\n}\n\n/* eslint-disable @typescript-eslint/no-unsafe-return */\r\n/** an filter function for queries with a `limitToFirst` value */\r\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\nfunction limitToFirst(query) {\r\n    const value = query.identity.limitToFirst;\r\n    return (list) => {\r\n        if (value === undefined) {\r\n            return list;\r\n        }\r\n        return list.slice(0, value);\r\n    };\r\n}\r\n/** an filter function for queries with a `limitToLast` value */\r\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\nfunction limitToLast(query) {\r\n    const value = query.identity.limitToLast;\r\n    return (list) => {\r\n        if (value === undefined) {\r\n            return list;\r\n        }\r\n        return list.slice(-1 * value);\r\n    };\r\n}\n\nfunction startAt(query) {\r\n    const key = query.identity.startAtKey || query.identity.orderByKey;\r\n    const value = query.identity.startAt;\r\n    return (record) => {\r\n        if (value === undefined) {\r\n            return true;\r\n        }\r\n        return key ? record[key] >= value : record >= value;\r\n    };\r\n}\r\nfunction endAt(query) {\r\n    const key = query.identity.endAtKey || query.identity.orderByKey;\r\n    const value = query.identity.endAt;\r\n    return (record) => {\r\n        if (value === undefined) {\r\n            return true;\r\n        }\r\n        return key ? record[key] <= value : record <= value;\r\n    };\r\n}\r\n/** a filter function for queries with a `equalTo` value */\r\nfunction equalTo(query) {\r\n    const key = query.identity.equalToKey || query.identity.orderByKey;\r\n    const value = query.identity.equalTo;\r\n    return (record) => {\r\n        if (value === undefined) {\r\n            return true;\r\n        }\r\n        return key ? record[key] === value : record === value;\r\n    };\r\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nconst orderByKey = (list) => {\r\n    const keys = Object.keys(list).sort();\r\n    const hash = {};\r\n    keys.forEach((k) => {\r\n        hash[k] = list[k];\r\n    });\r\n    return hash;\r\n};\r\nconst orderByValue = (list, direction = exports.SortOrder.asc) => {\r\n    const values = typedConversions.hashToArray(list).sort((a, b) => a.value > b.value\r\n        ? direction === exports.SortOrder.asc\r\n            ? 1\r\n            : -1\r\n        : direction === exports.SortOrder.asc\r\n            ? -1\r\n            : 1);\r\n    return values.reduce((agg, curr) => {\r\n        agg[curr.id] = curr.value;\r\n        return agg;\r\n    }, {});\r\n};\r\nconst sortFn = (query) => \r\n// eslint-disable-next-line @typescript-eslint/no-unsafe-return\r\nquery.identity.orderBy === types.RtdbOrder.orderByChild\r\n    ? orderByChild(query.identity.orderByKey)\r\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n    : sortFns[query.identity.orderBy];\r\nfunction runQuery(query, data) {\r\n    /**\r\n     * A boolean _flag_ to indicate whether the path is of the query points to a Dictionary\r\n     * of Objects. This is indicative of a **Firemodel** list node.\r\n     */\r\n    const isListOfObjects = typeof data === 'object' &&\r\n        Object.keys(data).every((i) => typeof data[i] === 'object');\r\n    const dataIsAScalar = ['string', 'boolean', 'number'].includes(typeof data);\r\n    if (dataIsAScalar) {\r\n        return data;\r\n    }\r\n    const dataIsAnObject = !Array.isArray(data) && typeof data === 'object';\r\n    if (dataIsAnObject && !isListOfObjects) {\r\n        data =\r\n            query.identity.orderBy === 'orderByKey'\r\n                ? orderByKey(data)\r\n                : orderByValue(data);\r\n        // allows non-array data that can come from a 'value' listener\r\n        // to pass through at this point\r\n        const limitToKeys = query.identity.limitToFirst\r\n            ? Object.keys(data).slice(0, query.identity.limitToFirst)\r\n            : query.identity.limitToLast\r\n                ? Object.keys(data).slice(-1 * query.identity.limitToLast)\r\n                : false;\r\n        if (limitToKeys) {\r\n            Object.keys(data).forEach((k) => {\r\n                if (!limitToKeys.includes(k)) {\r\n                    delete data[k];\r\n                }\r\n            });\r\n        }\r\n        return data;\r\n    }\r\n    const dataList = isListOfObjects || dataIsAnObject ? typedConversions.hashToArray(data) : data;\r\n    if (!dataList) {\r\n        return undefined;\r\n    }\r\n    const limitFilter = _limitFilter(query);\r\n    const queryFilter = _queryFilter(query);\r\n    let list;\r\n    console.log(dataList);\r\n    if (Array.isArray(dataList)) {\r\n        list = limitFilter(queryFilter(dataList.sort(sortFn(query))));\r\n    }\r\n    console.log(list);\r\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-return\r\n    return isListOfObjects\r\n        ? // this is list of records to convert back to hash for Firebase compatability\r\n            typedConversions.arrayToHash(list)\r\n        : dataIsAnObject\r\n            ? // if it was an Object but values weren't objects then this is probably\r\n                // a key/value pairing\r\n                list.reduce((agg, curr) => {\r\n                    if (curr.id && curr.value) {\r\n                        // definitely looks like a id/value pairing\r\n                        agg[curr.id] = curr.value;\r\n                    }\r\n                    else if (curr.id) {\r\n                        // has an ID so offset using the id but use the remainder of the hash\r\n                        // as the value\r\n                        const hash = { ...curr };\r\n                        delete hash.id;\r\n                        agg[curr.id] = hash;\r\n                    }\r\n                    else {\r\n                        console.log({\r\n                            message: `Unsure what to do with part of a data structure resulting from the the query: ${JSON.stringify(query.identity)}.\\n\\nThe item in question was: \"${JSON.stringify(curr)}\".`,\r\n                            severity: 0,\r\n                        });\r\n                    }\r\n                    return agg;\r\n                }, {})\r\n            : list;\r\n}\r\nfunction _limitFilter(query) {\r\n    const first = limitToFirst(query);\r\n    const last = limitToLast(query);\r\n    return (list) => {\r\n        return first(last(list));\r\n    };\r\n}\r\nfunction _queryFilter(query) {\r\n    return (list) => {\r\n        return list\r\n            .filter(equalTo(query))\r\n            .filter(startAt(query))\r\n            .filter(endAt(query));\r\n    };\r\n}\n\nfunction isMultiPath(data) {\r\n    Object.keys(data).map((d) => {\r\n        if (!d) {\r\n            data[d] = '/';\r\n        }\r\n    });\r\n    const indexesAreStrings = Object.keys(data).every((i) => typeof i === 'string');\r\n    const indexesLookLikeAPath = Object.keys(data).every((i) => i.indexOf('/') !== -1);\r\n    return indexesAreStrings && indexesLookLikeAPath ? true : false;\r\n}\r\nfunction reference(store, path = '') {\r\n    const serializedQuery$1 = typeof path === \"string\" ? new serializedQuery.SerializedRealTimeQuery(path) : path;\r\n    const query_ = query(store, serializedQuery$1);\r\n    const ref = {\r\n        endBefore(_value, key) {\r\n            return query_.endBefore(key);\r\n        },\r\n        get() {\r\n            return query_.get();\r\n        },\r\n        startAfter(_value, key) {\r\n            return query_.startAfter(key);\r\n        },\r\n        orderByKey: query_.orderByKey,\r\n        endAt: query_.endAt,\r\n        // eslint-disable-next-line @typescript-eslint/unbound-method\r\n        // endBefore: query_.endBefore,\r\n        equalTo: query_.equalTo,\r\n        // eslint-disable-next-line @typescript-eslint/unbound-method\r\n        // get: query_.get,\r\n        isEqual: query_.isEqual,\r\n        limitToFirst: query_.limitToFirst,\r\n        limitToLast: query_.limitToLast,\r\n        off: query_.off,\r\n        on: query_.on,\r\n        once: query_.once,\r\n        orderByChild: query_.orderByChild,\r\n        // eslint-disable-next-line @typescript-eslint/unbound-method\r\n        orderByPriority: query_.orderByPriority,\r\n        orderByValue: query_.orderByValue,\r\n        get ref() {\r\n            return query_.ref;\r\n        },\r\n        // eslint-disable-next-line @typescript-eslint/unbound-method\r\n        // startAfter: query_.startAfter,\r\n        startAt: query_.startAt,\r\n        get key() {\r\n            return serializedQuery$1.path\r\n                ? serializedQuery$1.path.split('/').pop()\r\n                : null;\r\n        },\r\n        child: (path) => {\r\n            return reference(store, path);\r\n        },\r\n        onDisconnect: () => {\r\n            return onDisconnect();\r\n        },\r\n        get parent() {\r\n            return reference(store, !serializedQuery$1.path || serializedQuery$1.path.split('/').length === 1\r\n                ? null\r\n                : serializedQuery$1.path\r\n                    .split('/')\r\n                    .slice(0, serializedQuery$1.path.split('/').length - 1)\r\n                    .join('/'));\r\n        },\r\n        push: (value, onComplete) => {\r\n            try {\r\n                const key = store.pushDb(serializedQuery$1.path, value);\r\n                if (onComplete)\r\n                    onComplete(undefined);\r\n                const _ref = reference(store, join(serializedQuery$1.path, key));\r\n                const _refPromise = Promise.resolve(_ref);\r\n                return { ..._ref, ..._refPromise };\r\n            }\r\n            catch (e) {\r\n                if (onComplete)\r\n                    onComplete(e);\r\n            }\r\n        },\r\n        remove: async (onComplete) => {\r\n            try {\r\n                store.removeDb(serializedQuery$1.path);\r\n                if (onComplete)\r\n                    onComplete(undefined);\r\n            }\r\n            catch (e) {\r\n                if (onComplete)\r\n                    onComplete(e);\r\n            }\r\n        },\r\n        get root() {\r\n            return reference(store, null);\r\n        },\r\n        set: async (value, onComplete) => {\r\n            try {\r\n                store.setDb(serializedQuery$1.path, value);\r\n                if (onComplete)\r\n                    onComplete(null);\r\n                return store.networkDelay();\r\n            }\r\n            catch (e) {\r\n                if (onComplete)\r\n                    onComplete(e);\r\n            }\r\n        },\r\n        setPriority: async () => {\r\n            throw new FireMockError(`Setting priorities with setPriority() is not supported in Firemock and in general isn't a good idea with the Real Time Database.`, 'not-supported');\r\n        },\r\n        setWithPriority: async () => {\r\n            throw new FireMockError(`Setting priorities with setWithPriority() is not supported in Firemock and in general isn't a good idea with the Real Time Database.`, 'not-supported');\r\n        },\r\n        toJSON: () => {\r\n            return {\r\n                identity: ref.toString(),\r\n                query: serializedQuery$1.identity,\r\n            };\r\n        },\r\n        toString: () => {\r\n            return `FireMock::Query@${process.env.FIREBASE_DATA_ROOT_URL}/${JSON.stringify(serializedQuery$1.identity)}`;\r\n        },\r\n        transaction: async () => {\r\n            return Promise.resolve({\r\n                committed: true,\r\n                snapshot: null,\r\n                toJSON() {\r\n                    return {};\r\n                },\r\n            });\r\n        },\r\n        update: async (values, onComplete) => {\r\n            try {\r\n                if (isMultiPath(values)) {\r\n                    store.multiPathUpdate(values);\r\n                }\r\n                else {\r\n                    store.updateDb(serializedQuery$1.path, values);\r\n                }\r\n                if (onComplete)\r\n                    onComplete(undefined);\r\n            }\r\n            catch (e) {\r\n                if (onComplete)\r\n                    onComplete(e);\r\n            }\r\n        },\r\n    };\r\n    return ref;\r\n}\n\nfunction snapshot(store, key, value) {\r\n    const val = () => (Array.isArray(value) ? typedConversions.arrayToHash(value) : value);\r\n    let sortingFunction;\r\n    const snapshotKey = getKey(join(key));\r\n    return {\r\n        get key() {\r\n            return snapshotKey;\r\n        },\r\n        val,\r\n        get ref() {\r\n            return reference(store, snapshotKey);\r\n        },\r\n        toJSON() {\r\n            return JSON.stringify(value);\r\n        },\r\n        child(path) {\r\n            const _value = nativeDash.get(value, path, null);\r\n            return _value ? snapshot(store, path, _value) : null;\r\n        },\r\n        hasChild(path) {\r\n            if (typeof value === 'object') {\r\n                return Object.keys(value).indexOf(path) !== -1;\r\n            }\r\n            return false;\r\n        },\r\n        hasChildren() {\r\n            if (typeof value === 'object') {\r\n                return Object.keys(value).length > 0;\r\n            }\r\n            return false;\r\n        },\r\n        numChildren() {\r\n            if (typeof value === 'object' && value) {\r\n                return Object.keys(value).length;\r\n            }\r\n            return 0;\r\n        },\r\n        exists() {\r\n            return value !== null;\r\n        },\r\n        forEach(actionCb) {\r\n            const cloned = value.slice(0);\r\n            const sorted = cloned.sort(sortingFunction);\r\n            sorted.map((item) => {\r\n                const noId = { ...{}, ...item };\r\n                delete noId.id;\r\n                const halt = actionCb(snapshot(store, item.id, noId));\r\n                if (halt) {\r\n                    return true;\r\n                }\r\n            });\r\n            return false;\r\n        },\r\n        /** NOTE: mocking proxies this call through to val(), no use of \"priority\" */\r\n        exportVal() {\r\n            return val();\r\n        },\r\n        getPriority() {\r\n            return null;\r\n        },\r\n    };\r\n    // return {\r\n    //   sortingFunction(fn: SortingFunction) {\r\n    //     sortingFunction = fn;\r\n    //   },\r\n    //   ...partialSnapshot,\r\n    // };\r\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nconst query = (store, serializedQuery) => {\r\n    const partialQuery = {\r\n        endBefore(_value) {\r\n            return query(store, serializedQuery);\r\n        },\r\n        startAfter(_value, _key) {\r\n            return query(store, serializedQuery);\r\n        },\r\n        toString() {\r\n            return `FireMock::Query@${process.env.FIREBASE_DATA_ROOT_URL}/${JSON.stringify(serializedQuery.identity)}`;\r\n        },\r\n        get: async () => {\r\n            await store.networkDelay();\r\n            const data = store.getDb(serializedQuery.path);\r\n            const results = runQuery(serializedQuery, data);\r\n            // TODO: See how this was implemented before\r\n            return snapshot(store, leafNode(serializedQuery.path), results ? results : null);\r\n        },\r\n        endAt: (value, key) => {\r\n            serializedQuery.endAt(value, key);\r\n            return query(store, serializedQuery);\r\n        },\r\n        equalTo: (value, key) => {\r\n            if (key && serializedQuery.identity.orderBy === types.RtdbOrder.orderByKey) {\r\n                throw new Error(`You can not use \"equalTo(val, key)\" with a \"key\" property defined when using a key sort!`);\r\n            }\r\n            serializedQuery.equalTo(value, key);\r\n            return query(store, serializedQuery);\r\n        },\r\n        isEqual: (other) => {\r\n            return serializedQuery.hashCode() === other._query.hashCode();\r\n        },\r\n        limitToFirst: (limit) => {\r\n            serializedQuery.limitToFirst(limit);\r\n            return query(store, serializedQuery);\r\n        },\r\n        limitToLast: (limit) => {\r\n            serializedQuery.limitToLast(limit);\r\n            return query(store, serializedQuery);\r\n        },\r\n        off: (_eventType, _callback) => {\r\n            console.log('off() not implemented yet on Firemock');\r\n        },\r\n        on: (eventType, callback, cancelCallbackOrContext, context) => {\r\n            store.addListener(serializedQuery, eventType, callback, cancelCallbackOrContext, context);\r\n            return callback;\r\n        },\r\n        once: async (_eventType) => {\r\n            await store.networkDelay();\r\n            const data = store.getDb(serializedQuery.path);\r\n            const results = runQuery(serializedQuery, data);\r\n            console.log(serializedQuery, results);\r\n            // TODO: See how this was implemented before\r\n            return snapshot(store, leafNode(serializedQuery.path), results ? results : null);\r\n        },\r\n        orderByChild: (prop) => {\r\n            serializedQuery.orderByChild(prop);\r\n            return query(store, serializedQuery);\r\n        },\r\n        orderByKey: () => {\r\n            serializedQuery.orderByKey();\r\n            return query(store, serializedQuery);\r\n        },\r\n        orderByPriority: () => {\r\n            // TODO: should we implement? this idea of Priority is code smell these days\r\n            // _query.order();\r\n            return query(store, serializedQuery);\r\n        },\r\n        orderByValue: () => {\r\n            serializedQuery.orderByValue();\r\n            return query(store, serializedQuery);\r\n        },\r\n        get ref() {\r\n            return reference(store, serializedQuery);\r\n        },\r\n        startAt: (value, key) => {\r\n            serializedQuery.startAt(value, key);\r\n            return query(store, serializedQuery);\r\n        },\r\n        toJSON: () => ({\r\n            url: reference(store, serializedQuery).toString(),\r\n            dbConfig: store.config,\r\n        }),\r\n    };\r\n    return partialQuery;\r\n};\n\n/* eslint-disable @typescript-eslint/require-await */\r\nfunction createFirebaseApp(sdk, store) {\r\n    var _a;\r\n    const name = ((_a = store.config) === null || _a === void 0 ? void 0 : _a.name) || \"default\";\r\n    const client = {\r\n        name,\r\n        options: {},\r\n        automaticDataCollectionEnabled: false,\r\n        delete: async () => {\r\n            throw new Error(\"delete() not implemented\");\r\n        },\r\n    };\r\n    const admin = {\r\n        name,\r\n        auth() {\r\n            throw new FireMockError(`database.auth() does not have an implementation in Firemock`);\r\n        },\r\n        database() {\r\n            throw new FireMockError(`database.database() does not have an implementation in Firemock`);\r\n        },\r\n        delete() {\r\n            throw new FireMockError(`database.delete() does not have an implementation in Firemock`);\r\n        },\r\n    };\r\n    return (types.isAdminSdk(sdk) ? admin : client);\r\n}\n\n/* eslint-disable @typescript-eslint/no-empty-function */\r\nfunction createRtdbAdminMock(store, config) {\r\n    const db = {\r\n        app: createFirebaseApp(types.SDK.RealTimeAdmin, store),\r\n        ref(path) {\r\n            return reference(store, path);\r\n        },\r\n        refFromURL(url) {\r\n            return reference(store, url);\r\n        },\r\n        // eslint-disable-next-line @typescript-eslint/require-await\r\n        async getRules() {\r\n            return JSON.stringify(store.rules);\r\n        },\r\n        // eslint-disable-next-line @typescript-eslint/require-await\r\n        async getRulesJSON() {\r\n            return store.rules;\r\n        },\r\n        goOffline() { },\r\n        goOnline() { },\r\n        async setRules() { },\r\n    };\r\n    const [auth, authManager] = createAuth(types.SDK.RealTimeAdmin, config);\r\n    return {\r\n        sdk: types.SDK.RealTimeAdmin,\r\n        db,\r\n        store,\r\n        auth,\r\n        authManager\r\n    };\r\n}\n\n/* eslint-disable @typescript-eslint/no-unsafe-return */\r\nfunction createRtdbClientMock(store, config) {\r\n    const db = {\r\n        useEmulator(_host, _port) { },\r\n        get app() {\r\n            return createFirebaseApp(types.SDK.RealTimeClient, store);\r\n        },\r\n        ref(path) {\r\n            return reference(store, path);\r\n        },\r\n        refFromURL(url) {\r\n            return reference(store, url);\r\n        },\r\n        goOffline() { },\r\n        goOnline() { },\r\n    };\r\n    const [auth, authManager] = createAuth(types.SDK.RealTimeClient, config);\r\n    return {\r\n        sdk: types.SDK.RealTimeClient,\r\n        db,\r\n        store,\r\n        auth,\r\n        authManager\r\n    };\r\n}\n\nfunction getFromDotPath(obj, dotPath) {\r\n    return ['', '/'].includes(dotPath) ? obj : nativeDash.get(obj, dotPath);\r\n}\r\n/**\r\n * internal function responsible for the actual removal of\r\n * a listener.\r\n */\r\nfunction cancelCallback(removed) {\r\n    let count = 0;\r\n    removed.forEach((l) => {\r\n        if (typeof l.cancelCallbackOrContext === 'function') {\r\n            l.cancelCallbackOrContext();\r\n            count++;\r\n        }\r\n    });\r\n    return count;\r\n}\r\nfunction createStore(sdk, config, initialState) {\r\n    if (types.isFirestoreDatabase(sdk)) {\r\n        throw new FireMockError('Currently Firemock is not implemented for the Firestore Database!');\r\n    }\r\n    /**\r\n     * The in-memory dictionary/hash mantained by the mock RTDB to represent\r\n     * the state of the database\r\n     */\r\n    const _state = initialState || {};\r\n    /** flag to indicate whether dispatch events should be fired */\r\n    let _silenceEvents = false;\r\n    /** the artificial time delay used to simulate a real DB's network latency */\r\n    let _networkDelay = types.NetworkDelay.lazer;\r\n    let _listeners = [];\r\n    const networkDelay$1 = async () => {\r\n        await networkDelay(_networkDelay);\r\n    };\r\n    const setNetworkDelay = (delay) => {\r\n        _networkDelay = delay;\r\n    };\r\n    const addListener = (pathOrQuery, eventType, callback, cancelCallbackOrContext, context) => {\r\n        const query = typeof pathOrQuery === 'string'\r\n            ? // TODO: this needs to be generalized across RTDB and Firestore\r\n                new serializedQuery.SerializedRealTimeQuery(pathOrQuery)\r\n            : pathOrQuery;\r\n        const listener = {\r\n            id: Math.random().toString(36).substr(2, 10),\r\n            query,\r\n            eventType,\r\n            callback,\r\n            cancelCallbackOrContext,\r\n            context,\r\n        };\r\n        _listeners.push(listener);\r\n        return listener;\r\n    };\r\n    const groupEventsByWatcher = (data, dbSnapshot) => {\r\n        var _a;\r\n        const _data = dotifyKeys(data);\r\n        const eventPaths = Object.keys(_data).map((i) => dotify(i));\r\n        const response = [];\r\n        const relativePath = (full, partial) => {\r\n            return full.replace(partial, '');\r\n        };\r\n        const justKey = (obj) => (obj ? Object.keys(obj)[0] : null);\r\n        const justValue = (obj) => justKey(obj) ? obj[justKey(obj)] : null;\r\n        (_a = api.getAllListeners()) === null || _a === void 0 ? void 0 : _a.forEach((listener) => {\r\n            const eventPathsUnderListener = eventPaths.filter((path) => path.includes(dotify(listener.query.path)));\r\n            if (eventPathsUnderListener.length === 0) {\r\n                // if there are no listeners then there's nothing to do\r\n                return;\r\n            }\r\n            const paths = [];\r\n            const listenerPath = dotify(listener.query.path);\r\n            const changeObject = eventPathsUnderListener.reduce((changes, path) => {\r\n                paths.push(path);\r\n                if (dotify(listener.query.path) === path) {\r\n                    changes = _data[path];\r\n                }\r\n                else {\r\n                    set(changes, dotify(relativePath(path, listenerPath)), _data[path]);\r\n                }\r\n                return changes;\r\n            }, {});\r\n            const key = listener.eventType === 'value'\r\n                ? changeObject\r\n                    ? justKey(changeObject)\r\n                    : listener.query.path.split('.').pop()\r\n                : dotify(join(serializedQuery.slashNotation(listener.query.path), justKey(changeObject)));\r\n            const newResponse = {\r\n                listenerId: listener.id,\r\n                listenerPath,\r\n                listenerEvent: listener.eventType,\r\n                callback: listener.callback,\r\n                eventPaths: paths,\r\n                key,\r\n                changes: justValue(changeObject),\r\n                value: listener.eventType === 'value'\r\n                    ? api.getDb(listener.query.path)\r\n                    : api.getDb(key),\r\n                priorValue: listener.eventType === 'value'\r\n                    ? getFromDotPath(dbSnapshot, listener.query.path)\r\n                    : justValue(getFromDotPath(dbSnapshot, listener.query.path)),\r\n            };\r\n            response.push(newResponse);\r\n        });\r\n        return response;\r\n    };\r\n    const removeAllListeners = () => {\r\n        const howMany = cancelCallback(_listeners);\r\n        _listeners = [];\r\n        return howMany;\r\n    };\r\n    const getAllListeners = () => {\r\n        return _listeners;\r\n    };\r\n    const api = {\r\n        api: types.isAdminSdk(sdk)\r\n            ? types.ApiKind.admin\r\n            : types.ApiKind.client,\r\n        config,\r\n        state: _state,\r\n        networkDelay: networkDelay$1,\r\n        setNetworkDelay,\r\n        addListener,\r\n        removeListener(eventType, callback, context) {\r\n            if (!eventType) {\r\n                return removeAllListeners();\r\n            }\r\n            if (!callback) {\r\n                const removed = _listeners.filter((l) => l.eventType === eventType);\r\n                _listeners = _listeners.filter((l) => l.eventType !== eventType);\r\n                return cancelCallback(removed);\r\n            }\r\n            if (!context) {\r\n                // use eventType and callback to identify\r\n                const removed = _listeners\r\n                    .filter((l) => l.callback === callback)\r\n                    .filter((l) => l.eventType === eventType);\r\n                _listeners = _listeners.filter((l) => l.eventType !== eventType || l.callback !== callback);\r\n                return cancelCallback(removed);\r\n            }\r\n            else {\r\n                // if we have context then we can ignore other params\r\n                const removed = _listeners\r\n                    .filter((l) => l.callback === callback)\r\n                    .filter((l) => l.eventType === eventType)\r\n                    .filter((l) => l.context === context);\r\n                _listeners = _listeners.filter((l) => l.context !== context ||\r\n                    l.callback !== callback ||\r\n                    l.eventType !== eventType);\r\n                return cancelCallback(removed);\r\n            }\r\n        },\r\n        removeAllListeners,\r\n        getAllListeners,\r\n        listenerPaths(lookFor) {\r\n            if (lookFor && !Array.isArray(lookFor)) {\r\n                lookFor =\r\n                    lookFor === 'child'\r\n                        ? ['child_added', 'child_changed', 'child_removed', 'child_moved']\r\n                        : [lookFor];\r\n            }\r\n            return lookFor\r\n                ? _listeners\r\n                    .filter((l) => lookFor.includes(l.eventType))\r\n                    .map((l) => l.query.path)\r\n                : _listeners.map((l) => l.query.path);\r\n        },\r\n        silenceEvents: () => {\r\n            _silenceEvents = true;\r\n        },\r\n        restoreEvents: () => {\r\n            _silenceEvents = false;\r\n        },\r\n        shouldSendEvents: () => {\r\n            return !_silenceEvents;\r\n        },\r\n        clearDb() {\r\n            const keys = Object.keys(_state);\r\n            keys.forEach((key) => delete _state[key]);\r\n        },\r\n        getDb(path) {\r\n            const dotifyPath = path ? dotify(path) : undefined;\r\n            return (dotifyPath ? getFromDotPath(_state, dotifyPath) : _state);\r\n        },\r\n        setDb(path, value, silent = false) {\r\n            const dotPath = join(path);\r\n            const oldRef = getFromDotPath(_state, dotPath);\r\n            const oldValue = typeof oldRef === 'object' ? { ...oldRef, ...{} } : oldRef;\r\n            const isReference = ['object', 'array'].includes(typeof value);\r\n            const dbSnapshot = copy__default['default']({ ..._state });\r\n            // ignore if no change\r\n            if ((isReference && fastEquals.deepEqual(oldValue, value)) ||\r\n                (!isReference && oldValue === value)) {\r\n                return;\r\n            }\r\n            if (value === null) {\r\n                const parentValue = getFromDotPath(_state, getParent(dotPath));\r\n                if (typeof parentValue === 'object') {\r\n                    delete parentValue[getKey(dotPath)];\r\n                    set(_state, getParent(dotPath), parentValue);\r\n                }\r\n                else {\r\n                    set(_state, dotPath, undefined);\r\n                }\r\n            }\r\n            else {\r\n                set(_state, dotPath, value);\r\n            }\r\n            if (!silent) {\r\n                const events = groupEventsByWatcher({ [dotPath]: value }, dbSnapshot);\r\n                notify(this)(events, dbSnapshot);\r\n            }\r\n        },\r\n        mergeDb(path, value) {\r\n            const dotPath = join(path);\r\n            const old = getFromDotPath(_state, dotPath);\r\n            const merge = merge__default['default'](old, value);\r\n            this.setDb(path || '', merge);\r\n        },\r\n        updateDb(path, value) {\r\n            const dotPath = join(path);\r\n            const oldValue = getFromDotPath(_state, dotPath);\r\n            let changed = true;\r\n            if (typeof value === 'object' &&\r\n                Object.keys(value).every((k) => (oldValue ? oldValue[k] : null) ===\r\n                    value[k])) {\r\n                changed = false;\r\n            }\r\n            if (typeof value !== 'object' && value === oldValue) {\r\n                changed = false;\r\n            }\r\n            if (!changed) {\r\n                return;\r\n            }\r\n            const newValue = typeof oldValue === 'object'\r\n                ? { ...oldValue, ...value }\r\n                : value;\r\n            this.setDb(dotPath, newValue);\r\n        },\r\n        multiPathUpdate(data) {\r\n            const snapshot = copy__default['default'](_state);\r\n            Object.keys(data).map((key) => {\r\n                const value = data[key];\r\n                const path = key;\r\n                if (getFromDotPath(_state, path) !== value) {\r\n                    // silent set\r\n                    this.setDb(path, value, true);\r\n                }\r\n            });\r\n            const events = groupEventsByWatcher(data, snapshot);\r\n            notify(this)(events, snapshot);\r\n        },\r\n        removeDb(path) {\r\n            if (!this.getDb(path)) {\r\n                return;\r\n            }\r\n            this.setDb(path, null);\r\n        },\r\n        pushDb(path, value) {\r\n            const pushId = firebaseKey.key();\r\n            const fullPath = join(path, pushId);\r\n            const valuePlusId = typeof value === 'object' ? { ...value, id: pushId } : value;\r\n            this.setDb(fullPath, valuePlusId);\r\n            return pushId;\r\n        },\r\n        reset() {\r\n            _listeners = [];\r\n            this.clearDb();\r\n        },\r\n    };\r\n    return api;\r\n}\n\n/**\r\n * A factory object which returns an implementation to handle either RTDB or\r\n * Firestore database as well as distinguishing between the minor variance between\r\n * admin and client SDK's\r\n */\r\nfunction createDatabase(sdk, \r\n/**\r\n * DB and Auth configuration for mock firebase\r\n */\r\nconfig = {}, \r\n/**\r\n * The initial state of the database\r\n */\r\ninitialState = {}) {\r\n    const store = createStore(sdk, config.db, {\r\n        ...((config === null || config === void 0 ? void 0 : config.db) && types.isMockConfig(config.db) ? config.db.mockData : {}),\r\n        ...initialState,\r\n    });\r\n    if (types.isFirestoreDatabase(sdk)) {\r\n        throw new FireMockError(`Attempt to mock a Firestore database failed because this has not been implemented yet!`);\r\n    }\r\n    const db = {\r\n        app: createFirebaseApp(sdk, store),\r\n        ref(path) {\r\n            return reference(store, path);\r\n        },\r\n        refFromURL(url) {\r\n            return reference(store, url);\r\n        },\r\n        // eslint-disable-next-line @typescript-eslint/require-await\r\n        async getRules() {\r\n            return JSON.stringify(store.rules);\r\n        },\r\n        // eslint-disable-next-line @typescript-eslint/require-await\r\n        async getRulesJSON() {\r\n            return store.rules;\r\n        },\r\n        goOffline() {\r\n            throw new Error('goOffline() is not implemented');\r\n        },\r\n        goOnline() {\r\n            throw new Error('goOnline() is not implemented');\r\n        },\r\n        setRules() {\r\n            throw new Error('setRules() is not implemented');\r\n        },\r\n    };\r\n    const [auth, authManager] = createAuth(sdk, config.auth);\r\n    return {\r\n        db,\r\n        auth,\r\n        authManager,\r\n        sdk,\r\n        store,\r\n    };\r\n}\n\n/**\r\n * A class representing the Firestore Admin SDK's API surface which interacts with the mock\r\n * database rather than a real DB.\r\n */\r\nclass FirestoreAdminMock {\r\n    constructor(sdk, config, store) {\r\n        this._sdk = sdk;\r\n        this._dbConfig = config;\r\n        this._store = store;\r\n    }\r\n    settings(settings) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    collection(collectionPath) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    doc(documentPath) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    collectionGroup(collectionId) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    getAll(...documentRefsOrReadOptions) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    recursiveDelete(ref, bulkWriter) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    terminate() {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    listCollections() {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    runTransaction(updateFunction, transactionOptions) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    batch() {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    bulkWriter(options) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    bundle(bundleId) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    goOffline() {\r\n        console.log(`The mock database [ ${this._sdk} / ${this._dbConfig.databaseURL} ] has gone offline, triggered by call to goOffline()`);\r\n    }\r\n    goOnline() {\r\n        console.log(`The mock database [ ${this._sdk} / ${this._dbConfig.databaseURL} ] has gone online, triggered by call to goOnline()`);\r\n    }\r\n}\n\n/**\r\n * A class representing the Firestore Client SDK's API surface which interacts with the mock\r\n * database rather than a real DB.\r\n */\r\nclass FirestoreClientMock {\r\n    constructor(sdk, config, store) {\r\n        this._sdk = sdk;\r\n        this._dbConfig = config;\r\n        this._store = store;\r\n    }\r\n    settings() {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    collection(_collectionPath) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    doc(_documentPath) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    collectionGroup(_collectionId) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    getAll(...documentRefsOrReadOptions) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    recursiveDelete(ref, bulkWriter) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    terminate() {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    listCollections() {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    runTransaction(updateFunction, transactionOptions) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    batch() {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    bulkWriter(options) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    bundle(bundleId) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    goOffline() {\r\n        console.log(`The mock database [ ${this._sdk} / ${this._dbConfig.databaseURL} ] has gone offline, triggered by call to goOffline()`);\r\n    }\r\n    goOnline() {\r\n        console.log(`The mock database [ ${this._sdk} / ${this._dbConfig.databaseURL} ] has gone online, triggered by call to goOnline()`);\r\n    }\r\n    refFromURL(path) {\r\n        // TODO: look into how best to implement this\r\n        throw brilliantErrors.createError('not-implemented', `refFromURL() is not yet supported on Admin API for RTDB.`);\r\n    }\r\n}\n\nexports.FireMockError = FireMockError;\nexports.FirestoreAdminMock = FirestoreAdminMock;\nexports.FirestoreClientMock = FirestoreClientMock;\nexports.completeUserCredential = completeUserCredential;\nexports.createAnonymousUser = createAnonymousUser;\nexports.createAuth = createAuth;\nexports.createAuthManager = createAuthManager;\nexports.createDatabase = createDatabase;\nexports.createFirebaseApp = createFirebaseApp;\nexports.createRtdbAdminMock = createRtdbAdminMock;\nexports.createRtdbClientMock = createRtdbClientMock;\nexports.createStore = createStore;\nexports.fakeApplicationVerifier = fakeApplicationVerifier;\nexports.findChildListeners = findChildListeners;\nexports.findValueListeners = findValueListeners;\nexports.getListeners = getListeners;\nexports.isMockUserRecord = isMockUserRecord;\nexports.isUser = isUser;\nexports.isUserCredential = isUserCredential;\nexports.isUserRecord = isUserRecord;\nexports.listenerPaths = listenerPaths;\nexports.notify = notify;\nexports.onDisconnect = onDisconnect;\nexports.query = query;\nexports.reference = reference;\nexports.snapshot = snapshot;\nexports.toUser = toUser;\nexports.toUserCredential = toUserCredential;\nexports.toUserRecord = toUserRecord;\n"]}