spiritjs
Version:
The animation toolkit for the web
220 lines (211 loc) • 7.03 kB
JavaScript
;
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;