UNPKG

motion

Version:

motion - moving development forward

136 lines (107 loc) 3.44 kB
exports.__esModule = true; exports.sortObject = sortObject; exports.createHash = createHash; exports.stringifyObject = stringifyObject; exports.extendedToString = extendedToString; exports.createClassName = createClassName; exports.isEmpty = isEmpty; exports.isPseudo = isPseudo; exports.isMediaQuery = isMediaQuery; exports.seperateStyles = seperateStyles; function sortObject(obj) { return Object.keys(obj).sort().reduce(function (acc, key) { var val = obj[key]; if (val || val === 0) acc[key] = val; return acc; }, {}); } function createHash(str) { var i = str.length; if (i === 0) return 0; var hash = 5381; while (i) hash = hash * 33 ^ str.charCodeAt(--i); return hash >>> 0; } function stringifyObject(obj) { var keys = Object.keys(obj); var str = ''; for (var i = 0, len = keys.length; i < len; i++) { str += keys[i] + obj[keys[i]]; } return str; } var SYMBOL_SET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''); function extendedToString(num, base) { var conversion = ''; if (base > SYMBOL_SET.length || base <= 1 || !Number.isInteger(base)) throw new Error(base + ' should be an integer between 1 and ' + SYMBOL_SET.length); while (num >= 1) { conversion = SYMBOL_SET[num - base * Math.floor(num / base)] + conversion; num = Math.floor(num / base); } return base < 11 ? parseInt(conversion) : conversion; } function createClassName(options, tag, obj) { if (options && options.selector) { return options.selector(tag); } var hash = extendedToString(createHash(stringifyObject(obj)), 62); return hash ? '_' + hash : undefined; } function isEmpty(obj) { return !Object.keys(obj).length; } var pseudos = { active: ':active', hover: ':hover', focus: ':focus', link: ':link', visited: ':visited', checked: ':checked', disabled: ':disabled', empty: ':empty', invalid: ':invalid' }; function isPseudo(_ref) { var style = _ref.style; var rule = _ref.rule; return (rule.charAt(0) === ':' || pseudos[rule]) && typeof style === 'object'; } function isMediaQuery(_ref2) { var style = _ref2.style; var rule = _ref2.rule; return rule.charAt(0) === '@' && typeof style === 'object'; } function handle(options, tag, type, acc, _ref3) { var style = _ref3.style; var rule = _ref3.rule; var pseudos = arguments.length <= 5 || arguments[5] === undefined ? [] : arguments[5]; var hash = createClassName(options, tag, sortObject(style)); var rules = pseudos.length ? [[].concat(rule, style, pseudos)] : rule; acc[type] = acc[type].concat(rules); acc.style[rule] = hash; return acc; } function seperateStyles(options, tag, styles) { return Object.keys(styles).reduce(function (acc, rule) { var content = { style: styles[rule] === '' ? 'auto' : styles[rule], rule: rule }; if (isPseudo(content)) { if (pseudos[rule]) content.rule = pseudos[rule]; // translate to :active return handle(options, tag, 'pseudos', acc, content); } if (isMediaQuery(content)) { var _seperateStyles = seperateStyles(options, tag, content.style); var style = _seperateStyles.style; var _pseudos = _seperateStyles.pseudos; return handle(options, tag, 'mediaQueries', acc, { rule: rule, style: style }, _pseudos); } acc.style[rule] = content.style; return acc; }, { style: {}, pseudos: [], mediaQueries: [] }); }