UNPKG

spiritjs

Version:

The animation toolkit for the web

220 lines (211 loc) 7.03 kB
"use strict"; exports.__esModule = true; exports["default"] = void 0; var _utils = require("../utils"); var _emitter = require("../utils/emitter"); var _events = require("../utils/events"); var _dec, _dec2, _dec3, _class, _class2; function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer && (Object.defineProperty(i, e, a), a = null), a; } /** * ------------------------------------------- * Single keyframe. * * @example * * { * "0.1s": { value: 10, ease: "Linear.easeNone" } * } * * @fires Keyframe#change * @fires Keyframe#change:time * @fires Keyframe#change:value * @fires Keyframe#change:ease * * @fires List#change * @fires List#change:time * @fires List#change:value * @fires List#change:ease * * ------------------------------------------- */ var Keyframe = (_dec = (0, _emitter.emitChange)('time', null, [{ validator: function validator(val) { return typeof val === 'number'; }, message: 'Time must be a number' }]), _dec2 = (0, _emitter.emitChange)('ease', null), _dec3 = (0, _emitter.emitChange)(), _dec(_class = _dec2(_class = (_class2 = /*#__PURE__*/function (_Emitter) { /** * Keyframe. * * @param {number} time position (in seconds) on timeline * @param {*} value value assigned * @param {string} ease easing value (optional) */ function Keyframe(time, value, ease) { var _this; if (ease === void 0) { ease = null; } _this = _Emitter.call(this) || this; _this._list = null; _this._value = null; _this.mappings = []; ease = ease || null; Object.assign(_this, { time: time, value: value, ease: ease }); return _this; } /** * Get next keyframe (linked list) * * @returns {Keyframe|null} */ _inheritsLoose(Keyframe, _Emitter); var _proto = Keyframe.prototype; _proto.next = function next() { return this._next; } /** * Get previous keyframe (linked list) * * @returns {Keyframe|null} */; _proto.prev = function prev() { return this._prev; } /** * Get the value * * @returns {*} */; /** * Check if current keyframe has an evaluable value * * @returns {boolean} */ _proto.isEval = function isEval() { return /{(.*?)}/.test(this._value); } /** * Convert to readable object * * @param {boolean} ignoreEval * @returns {object} { "0.2s": { value: 10, ease: "Linear.easeNone" }} */; _proto.toObject = function toObject(ignoreEval) { var _ref; if (ignoreEval === void 0) { ignoreEval = false; } var value; try { value = ignoreEval ? this._value : this.value; } catch (err) { value = this._value; } return _ref = {}, _ref[this.time + "s"] = { value: value, ease: this.ease }, _ref; } /** * Destroy events */; _proto.destroy = function destroy() { this.removeAllListeners(); }; return _createClass(Keyframe, [{ key: "value", get: function get() { var _this2 = this; if (this.isEval()) { // create available mappings for current value var mappings = this.mappings.reduce(function (result, mapping) { if (mapping.regex.global) { mapping.regex.lastIndex = 0; } if (mapping.regex.test(_this2._value)) { result[mapping.regex] = mapping; } return result; }, {}); // apply mappings var val = this._value; for (var mapping in mappings) { val = val.replace(mappings[mapping].regex, "mappings[" + mapping + "].map"); } var res; try { res = eval(val); // eslint-disable-line no-eval } catch (err) { if (this.mappings.length > 0) { throw err; } } return res; } return this._value; } /** * Set value * * @param {*} val */, set: function set(val) { this._value = val; } /** * Get the list where this keyframe is added to * * @returns {Keyframes|null} */ }, { key: "list", get: function get() { return this._list; } }]); }(_events.Emitter), (_applyDecoratedDescriptor(_class2.prototype, "value", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "value"), _class2.prototype)), _class2)) || _class) || _class); /** * Create keyframe instance from object * * @example { "0.2s": { value: 10, ease: "Linear.easeNone" }} * @param {object} obj * @returns {Keyframe} */ Keyframe.fromObject = function (obj) { if (!_utils.is.isObject(obj)) { throw new Error('Object is invalid'); } var keys = Object.keys(obj); if (keys.length === 0 || keys.length > 1) { throw new Error('Object is invalid'); } var time = keys[0]; var _obj$time = obj[time], value = _obj$time.value, ease = _obj$time.ease; if (!_utils.is.isObject(obj[time]) && (typeof obj[time] === 'string' || typeof obj[time] === 'number')) { value = obj[time]; ease = null; } time = parseFloat(time); if (isNaN(time)) { throw new Error('Object is invalid. Invalid time object { `1s`: ... }'); } if (value === undefined || value === null) { throw new Error('Object is invalid. No value found: {value}'); } return new Keyframe(time, value, ease); }; Keyframe.Events = ['change', 'change:time', 'change:value', 'change:ease']; var _default = exports["default"] = Keyframe;