motion
Version:
motion - moving development forward
136 lines (107 loc) • 3.44 kB
JavaScript
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: []
});
}