{"version":3,"sources":["packages/animations/animations-browser-testing.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","animations","browser","testing","this","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","MockAnimationDriver","prototype","validateStyleProperty","prop","ɵvalidateStyleProperty","matchesElement","element","selector","ɵmatchesElement","containsElement","elm1","elm2","ɵcontainsElement","query","multi","ɵinvokeQuery","computeStyle","defaultValue","animate","keyframes","duration","delay","easing","previousPlayers","player","MockAnimationPlayer","log","push","_super","_this","call","__finished","__started","previousStyles","_onInitFns","currentSnapshot","ɵallowPreviousPlayerStylesMerge","forEach","styles_1","keys","__extends","__","constructor","create","onInit","fn","init","finish","destroy","triggerMicrotask","play","hasStarted","beforeDestroy","captures","kf","AUTO_STYLE","NoopAnimationPlayer","defineProperty","value"],"mappings":"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","sourcesContent":["/**\n * @license Angular v11.2.14\n * (c) 2010-2021 Google LLC. https://angular.io/\n * License: MIT\n */\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/animations'), require('@angular/animations/browser')) :\n    typeof define === 'function' && define.amd ? define('@angular/animations/browser/testing', ['exports', '@angular/animations', '@angular/animations/browser'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.animations = global.ng.animations || {}, global.ng.animations.browser = global.ng.animations.browser || {}, global.ng.animations.browser.testing = {}), global.ng.animations, global.ng.animations.browser));\n}(this, (function (exports, animations, browser) { 'use strict';\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n    /* global Reflect, Promise */\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b)\n                if (b.hasOwnProperty(p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    }\n    var __assign = function () {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s)\n                    if (Object.prototype.hasOwnProperty.call(s, p))\n                        t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n    function __decorate(decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n            r = Reflect.decorate(decorators, target, key, desc);\n        else\n            for (var i = decorators.length - 1; i >= 0; i--)\n                if (d = decorators[i])\n                    r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    }\n    function __param(paramIndex, decorator) {\n        return function (target, key) { decorator(target, key, paramIndex); };\n    }\n    function __metadata(metadataKey, metadataValue) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\")\n            return Reflect.metadata(metadataKey, metadataValue);\n    }\n    function __awaiter(thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try {\n                step(generator.next(value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function rejected(value) { try {\n                step(generator[\"throw\"](value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    }\n    function __generator(thisArg, body) {\n        var _ = { label: 0, sent: function () { if (t[0] & 1)\n                throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\n        function verb(n) { return function (v) { return step([n, v]); }; }\n        function step(op) {\n            if (f)\n                throw new TypeError(\"Generator is already executing.\");\n            while (_)\n                try {\n                    if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)\n                        return t;\n                    if (y = 0, t)\n                        op = [op[0] & 2, t.value];\n                    switch (op[0]) {\n                        case 0:\n                        case 1:\n                            t = op;\n                            break;\n                        case 4:\n                            _.label++;\n                            return { value: op[1], done: false };\n                        case 5:\n                            _.label++;\n                            y = op[1];\n                            op = [0];\n                            continue;\n                        case 7:\n                            op = _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                        default:\n                            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                                _ = 0;\n                                continue;\n                            }\n                            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {\n                                _.label = op[1];\n                                break;\n                            }\n                            if (op[0] === 6 && _.label < t[1]) {\n                                _.label = t[1];\n                                t = op;\n                                break;\n                            }\n                            if (t && _.label < t[2]) {\n                                _.label = t[2];\n                                _.ops.push(op);\n                                break;\n                            }\n                            if (t[2])\n                                _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                    }\n                    op = body.call(thisArg, _);\n                }\n                catch (e) {\n                    op = [6, e];\n                    y = 0;\n                }\n                finally {\n                    f = t = 0;\n                }\n            if (op[0] & 5)\n                throw op[1];\n            return { value: op[0] ? op[1] : void 0, done: true };\n        }\n    }\n    var __createBinding = Object.create ? (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });\n    }) : (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        o[k2] = m[k];\n    });\n    function __exportStar(m, exports) {\n        for (var p in m)\n            if (p !== \"default\" && !exports.hasOwnProperty(p))\n                __createBinding(exports, m, p);\n    }\n    function __values(o) {\n        var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n        if (m)\n            return m.call(o);\n        if (o && typeof o.length === \"number\")\n            return {\n                next: function () {\n                    if (o && i >= o.length)\n                        o = void 0;\n                    return { value: o && o[i++], done: !o };\n                }\n            };\n        throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n    }\n    function __read(o, n) {\n        var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n        if (!m)\n            return o;\n        var i = m.call(o), r, ar = [], e;\n        try {\n            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)\n                ar.push(r.value);\n        }\n        catch (error) {\n            e = { error: error };\n        }\n        finally {\n            try {\n                if (r && !r.done && (m = i[\"return\"]))\n                    m.call(i);\n            }\n            finally {\n                if (e)\n                    throw e.error;\n            }\n        }\n        return ar;\n    }\n    function __spread() {\n        for (var ar = [], i = 0; i < arguments.length; i++)\n            ar = ar.concat(__read(arguments[i]));\n        return ar;\n    }\n    function __spreadArrays() {\n        for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n            s += arguments[i].length;\n        for (var r = Array(s), k = 0, i = 0; i < il; i++)\n            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n                r[k] = a[j];\n        return r;\n    }\n    ;\n    function __await(v) {\n        return this instanceof __await ? (this.v = v, this) : new __await(v);\n    }\n    function __asyncGenerator(thisArg, _arguments, generator) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var g = generator.apply(thisArg, _arguments || []), i, q = [];\n        return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n        function verb(n) { if (g[n])\n            i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n        function resume(n, v) { try {\n            step(g[n](v));\n        }\n        catch (e) {\n            settle(q[0][3], e);\n        } }\n        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n        function fulfill(value) { resume(\"next\", value); }\n        function reject(value) { resume(\"throw\", value); }\n        function settle(f, v) { if (f(v), q.shift(), q.length)\n            resume(q[0][0], q[0][1]); }\n    }\n    function __asyncDelegator(o) {\n        var i, p;\n        return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n    }\n    function __asyncValues(o) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var m = o[Symbol.asyncIterator], i;\n        return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }\n    }\n    function __makeTemplateObject(cooked, raw) {\n        if (Object.defineProperty) {\n            Object.defineProperty(cooked, \"raw\", { value: raw });\n        }\n        else {\n            cooked.raw = raw;\n        }\n        return cooked;\n    }\n    ;\n    var __setModuleDefault = Object.create ? (function (o, v) {\n        Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    }) : function (o, v) {\n        o[\"default\"] = v;\n    };\n    function __importStar(mod) {\n        if (mod && mod.__esModule)\n            return mod;\n        var result = {};\n        if (mod != null)\n            for (var k in mod)\n                if (Object.hasOwnProperty.call(mod, k))\n                    __createBinding(result, mod, k);\n        __setModuleDefault(result, mod);\n        return result;\n    }\n    function __importDefault(mod) {\n        return (mod && mod.__esModule) ? mod : { default: mod };\n    }\n    function __classPrivateFieldGet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to get private field on non-instance\");\n        }\n        return privateMap.get(receiver);\n    }\n    function __classPrivateFieldSet(receiver, privateMap, value) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to set private field on non-instance\");\n        }\n        privateMap.set(receiver, value);\n        return value;\n    }\n\n    /**\n     * @publicApi\n     */\n    var MockAnimationDriver = /** @class */ (function () {\n        function MockAnimationDriver() {\n        }\n        MockAnimationDriver.prototype.validateStyleProperty = function (prop) {\n            return browser.ɵvalidateStyleProperty(prop);\n        };\n        MockAnimationDriver.prototype.matchesElement = function (element, selector) {\n            return browser.ɵmatchesElement(element, selector);\n        };\n        MockAnimationDriver.prototype.containsElement = function (elm1, elm2) {\n            return browser.ɵcontainsElement(elm1, elm2);\n        };\n        MockAnimationDriver.prototype.query = function (element, selector, multi) {\n            return browser.ɵinvokeQuery(element, selector, multi);\n        };\n        MockAnimationDriver.prototype.computeStyle = function (element, prop, defaultValue) {\n            return defaultValue || '';\n        };\n        MockAnimationDriver.prototype.animate = function (element, keyframes, duration, delay, easing, previousPlayers) {\n            if (previousPlayers === void 0) { previousPlayers = []; }\n            var player = new MockAnimationPlayer(element, keyframes, duration, delay, easing, previousPlayers);\n            MockAnimationDriver.log.push(player);\n            return player;\n        };\n        return MockAnimationDriver;\n    }());\n    MockAnimationDriver.log = [];\n    /**\n     * @publicApi\n     */\n    var MockAnimationPlayer = /** @class */ (function (_super) {\n        __extends(MockAnimationPlayer, _super);\n        function MockAnimationPlayer(element, keyframes, duration, delay, easing, previousPlayers) {\n            var _this = _super.call(this, duration, delay) || this;\n            _this.element = element;\n            _this.keyframes = keyframes;\n            _this.duration = duration;\n            _this.delay = delay;\n            _this.easing = easing;\n            _this.previousPlayers = previousPlayers;\n            _this.__finished = false;\n            _this.__started = false;\n            _this.previousStyles = {};\n            _this._onInitFns = [];\n            _this.currentSnapshot = {};\n            if (browser.ɵallowPreviousPlayerStylesMerge(duration, delay)) {\n                previousPlayers.forEach(function (player) {\n                    if (player instanceof MockAnimationPlayer) {\n                        var styles_1 = player.currentSnapshot;\n                        Object.keys(styles_1).forEach(function (prop) { return _this.previousStyles[prop] = styles_1[prop]; });\n                    }\n                });\n            }\n            return _this;\n        }\n        /* @internal */\n        MockAnimationPlayer.prototype.onInit = function (fn) {\n            this._onInitFns.push(fn);\n        };\n        /* @internal */\n        MockAnimationPlayer.prototype.init = function () {\n            _super.prototype.init.call(this);\n            this._onInitFns.forEach(function (fn) { return fn(); });\n            this._onInitFns = [];\n        };\n        MockAnimationPlayer.prototype.finish = function () {\n            _super.prototype.finish.call(this);\n            this.__finished = true;\n        };\n        MockAnimationPlayer.prototype.destroy = function () {\n            _super.prototype.destroy.call(this);\n            this.__finished = true;\n        };\n        /* @internal */\n        MockAnimationPlayer.prototype.triggerMicrotask = function () { };\n        MockAnimationPlayer.prototype.play = function () {\n            _super.prototype.play.call(this);\n            this.__started = true;\n        };\n        MockAnimationPlayer.prototype.hasStarted = function () {\n            return this.__started;\n        };\n        MockAnimationPlayer.prototype.beforeDestroy = function () {\n            var _this = this;\n            var captures = {};\n            Object.keys(this.previousStyles).forEach(function (prop) {\n                captures[prop] = _this.previousStyles[prop];\n            });\n            if (this.hasStarted()) {\n                // when assembling the captured styles, it's important that\n                // we build the keyframe styles in the following order:\n                // {other styles within keyframes, ... previousStyles }\n                this.keyframes.forEach(function (kf) {\n                    Object.keys(kf).forEach(function (prop) {\n                        if (prop != 'offset') {\n                            captures[prop] = _this.__finished ? kf[prop] : animations.AUTO_STYLE;\n                        }\n                    });\n                });\n            }\n            this.currentSnapshot = captures;\n        };\n        return MockAnimationPlayer;\n    }(animations.NoopAnimationPlayer));\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * Generated bundle index. Do not edit.\n     */\n\n    exports.MockAnimationDriver = MockAnimationDriver;\n    exports.MockAnimationPlayer = MockAnimationPlayer;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=animations-browser-testing.umd.js.map\n"]}