{"version":3,"sources":["jsdelivr-header.js","/npm/object-fsm@1.0.1/src/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,IAAI,QAAU,QAAQ,qBAClB,MAAQ,QAAQ,QAAR,CAAiB,aAW7B,SAAS,UAAU,GACf,GAAI,EAAK,OAAO,MAAM,EAC1B,CAEA,SAAS,MAAM,GACX,IAAK,IAAI,KAAO,UAAU,UACtB,EAAI,GAAO,UAAU,UAAU,GAGnC,OADA,WAAW,GACJ,CACX,CAEA,SAAS,WAAW,GAChB,EAAI,IAAM,CAAC,EACX,EAAI,IAAI,OAAS,GACjB,EAAI,IAAI,OAAS,CAAC,EAClB,EAAI,IAAI,oBAAqB,EAC7B,EAAI,IAAI,iBAAkB,CAC9B,CA3BA,OAAO,QAAU,UAEjB,QAAQ,UAAU,WAkClB,UAAU,UAAU,SAAW,SAAU,GACrC,MAAqB,iBAAV,GACP,MAAM,qCACC,IAEX,KAAK,IAAI,OAAO,KAAK,GAChB,KAAK,eACN,KAAK,aAAe,IACjB,EACX,EAOA,UAAU,UAAU,UAAY,SAAU,GACtC,IAAI,EAAO,KACX,EAAO,SAAQ,SAAU,GACrB,EAAK,SAAS,EAClB,GACJ,EAQA,UAAU,UAAU,iBAAmB,SAAU,GAC7C,QAAI,KAAK,cAAc,KACnB,KAAK,aAAe,GACb,EAGf,EAQA,UAAU,UAAU,cAAgB,SAAU,GAC1C,OAA2C,IAApC,KAAK,IAAI,OAAO,QAAQ,EACnC,EAQA,UAAU,UAAU,cAAgB,SAAU,GAC1C,OAAO,KAAK,IAAI,OAAO,eAAe,EAC1C,EAQA,UAAU,UAAU,mBAAqB,SAAU,GAE/C,IADA,IAAI,GAAa,EACR,EAAI,EAAG,EAAI,EAAO,OAAQ,IAC/B,EAAa,GAAc,KAAK,cAAc,EAAO,IAEzD,OAAO,CACX,EAUA,UAAU,UAAU,SAAW,SAAS,EAAW,EAAY,EAAS,GAC1C,iBAAf,IACP,EAAa,CAAC,IAElB,IAAI,EAAa,EAAW,OAAO,GACnC,OAA4C,IAAxC,KAAK,mBAAmB,IACxB,MAAM,qBAAwB,EAAY,wCACnC,IAEX,KAAK,IAAI,OAAO,GAAa,CACzB,UAAW,EACX,QAAS,EACT,QAAS,IAEN,EACX,EASA,UAAU,UAAU,YAAc,SAAU,GACxC,GAAI,KAAK,eAAe,GAAQ,CAC5B,KAAK,IAAI,iBAAkB,EAE3B,IAAI,EAAc,KAAK,IAAI,OAAO,GAC9B,EAAY,KAAK,aACjB,EAAU,EAAY,QAC1B,KAAK,KAAK,iBAAkB,EAAW,EAAS,GAEhD,IAAI,EAAO,KACX,KAAK,IAAI,0BAA4B,WACjC,EAAK,IAAI,iBAAkB,EAC3B,EAAK,IAAI,oBAAqB,EAC9B,EAAK,aAAe,EACpB,EAAK,KAAK,gBAAiB,EAAW,EAAS,EACnD,EAEA,IAAI,OAAqB,EACzB,GAAmC,mBAAxB,EAAY,QAAwB,CAC3C,IAAI,EAAc,MAAM,UAAU,MAAM,KAAK,WAAW,MAAM,GAC9D,EAAqB,EAAY,QAAQ,MAAM,KAAM,EACzD,CAMA,OAJoC,IAAhC,KAAK,IAAI,oBACT,KAAK,qBAGF,CACX,CACI,MAAM,uBAAyB,EAAQ,4DAE/C,EAQA,UAAU,UAAU,eAAiB,SAAU,GAC3C,OAAO,KAAK,cAAc,KAC4C,IAAjE,KAAK,IAAI,OAAO,GAAO,UAAU,QAAQ,KAAK,gBACd,IAA7B,KAAK,IAAI,eACrB,EAQA,UAAU,UAAU,gBAAkB,WAClC,KAAK,IAAI,oBAAqB,CAClC,EAMA,UAAU,UAAU,mBAAqB,WACa,mBAAvC,KAAK,IAAI,4BAChB,KAAK,IAAI,4BACT,KAAK,IAAI,0BAA4B,KAE7C","file":"/npm/object-fsm@1.0.1/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/object-fsm@1.0.1/src/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","var Emitter = require('component-emitter');\nvar debug = require('debug')('ObjectFSM');\n\nmodule.exports = ObjectFsm;\n\nEmitter(ObjectFsm.prototype);\n\n/**\n * Mixes FSM into the object.\n * @param obj The object that will become an FSM\n * @constructor\n */\nfunction ObjectFsm(obj) {\n    if (obj) return mixin(obj);\n}\n\nfunction mixin(obj) {\n    for (var key in ObjectFsm.prototype) {\n        obj[key] = ObjectFsm.prototype[key];\n    }\n    initialize(obj);\n    return obj;\n}\n\nfunction initialize(obj) {\n    obj.fsm = {};\n    obj.fsm.states = [];\n    obj.fsm.events = {};\n    obj.fsm.transitionDeferred = false;\n    obj.fsm.switchingStates = false;\n}\n\n/**\n * Adds a state to FSM\n * Note that FSM automatically enters the state added first\n * @param {string} state State name\n * @returns {boolean} result Whether adding a state succeeded or not\n * @public\n */\nObjectFsm.prototype.addState = function (state) {\n    if (typeof state !== 'string') {\n        debug('addState: state must be a string');\n        return false;\n    }\n    this.fsm.states.push(state);\n    if (!this.currentState)\n        this.currentState = state;\n    return true;\n};\n\n/**\n * Adds a list of states to FSM\n * @param {Array.<string>} states\n * @public\n */\nObjectFsm.prototype.addStates = function (states) {\n    var that = this;\n    states.forEach(function (state) {\n        that.addState(state);\n    });\n};\n\n/**\n * Sets a starting state. FSM immediately moves to that state.\n * @param {string} state\n * @returns {boolean} Whether setting a starting state has succeeded\n * @public\n */\nObjectFsm.prototype.setStartingState = function (state) {\n    if (this.containsState(state)) {\n        this.currentState = state;\n        return true;\n    }\n    return false;\n};\n\n/**\n * Returns true if FSM has state {state}\n * @param state\n * @returns {boolean}\n * @public\n */\nObjectFsm.prototype.containsState = function (state) {\n    return this.fsm.states.indexOf(state) !== -1;\n};\n\n/**\n * Checks if FSM has given event\n * @param {string} event\n * @returns {boolean}\n * @public\n */\nObjectFsm.prototype.containsEvent = function (event) {\n    return this.fsm.events.hasOwnProperty(event);\n};\n\n/**\n * Returns true if all passed states present in FSM\n * @param {Array<string>} states\n * @returns {boolean}\n * @public\n */\nObjectFsm.prototype.containsEveryState = function (states) {\n    var allPresent = true;\n    for (var i = 0; i < states.length; i++) {\n        allPresent = allPresent && this.containsState(states[i]);\n    }\n    return allPresent;\n};\n\n/**\n * Adds a new event to FSM\n * @param {string} eventName Event name\n * @param {(Array.<string>|string)} statesFrom A one or more states in which FSM can handle this event\n * @param {string} stateTo State to which the event transitions FSM\n * @param {function(*):*=} handler Function that is invoked upon event\n * @public\n */\nObjectFsm.prototype.addEvent = function(eventName, statesFrom, stateTo, handler) {\n    if (typeof statesFrom === 'string') {\n        statesFrom = [statesFrom];\n    }\n    var everyState = statesFrom.concat(stateTo);\n    if (this.containsEveryState(everyState) === false) {\n        debug('Cannot add event \\'' + eventName + '\\' due to missing states from or to.');\n        return false;\n    }\n    this.fsm.events[eventName] = {\n        validFrom: statesFrom,\n        validTo: stateTo,\n        handler: handler\n    };\n    return true;\n};\n\n/**\n * Notifies FSM about an event\n * @param {string} event Existing event\n * @param {...*} arguments Will be passed to event handler\n * @returns {*} Return value of the event handler\n * @public\n */\nObjectFsm.prototype.handleEvent = function (event) {\n    if (this.canHandleEvent(event)) {\n        this.fsm.switchingStates = true;\n\n        var eventObject = this.fsm.events[event];\n        var fromState = this.currentState;\n        var toState = eventObject.validTo;\n        this.emit('willTransition', fromState, toState, event);\n\n        var that = this;\n        this.fsm.finalizeTransitionClosure = function () {\n            that.fsm.switchingStates = false;\n            that.fsm.transitionDeferred = false;\n            that.currentState = toState;\n            that.emit('didTransition', fromState, toState, event);\n        };\n\n        var handlerReturnValue = undefined;\n        if (typeof eventObject.handler === 'function') {\n            var handlerArgs = Array.prototype.slice.call(arguments).slice(1);\n            handlerReturnValue = eventObject.handler.apply(this, handlerArgs);\n        }\n\n        if (this.fsm.transitionDeferred === false) {\n            this.finalizeTransition();\n        }\n\n        return handlerReturnValue;\n    } else {\n        debug('cannot handle event ' + event + ' due to invalid conditions, such as concurrent transition');\n    }\n};\n\n/**\n * Returns true if FSM is able to handle event right now\n * @param event\n * @returns {boolean}\n * @public\n */\nObjectFsm.prototype.canHandleEvent = function (event) {\n    return this.containsEvent(event) &&\n        (this.fsm.events[event].validFrom.indexOf(this.currentState) !== -1) &&\n            this.fsm.switchingStates === false;\n};\n\n/**\n * Defers an ongoing transition until future call to finalizeTransition.\n * Use for any asynchronous event hanling.\n * NOTE: this function can be called only in event handler (during an event), or in `willTransition` event handler.\n * @public\n */\nObjectFsm.prototype.deferTransition = function () {\n    this.fsm.transitionDeferred = true;\n};\n\n/**\n * Finalizes a deferred transition.\n * @public\n */\nObjectFsm.prototype.finalizeTransition = function () {\n    if (typeof this.fsm.finalizeTransitionClosure === 'function') {\n        this.fsm.finalizeTransitionClosure();\n        this.fsm.finalizeTransitionClosure = null;\n    }\n};\n"]}