zss-engine
Version:
A CSS-in-JS transpiler engine for building zero-runtime stylesheets at build time.
53 lines (52 loc) • 2.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.splitAtomicAndNested = splitAtomicAndNested;
exports.processAtomicProps = processAtomicProps;
const helper_js_1 = require("./helper.js");
const transpile_atomic_js_1 = require("./transpile-atomic.js");
const hash_js_1 = require("./hash.js");
function splitAtomicAndNested(obj, flat, nonFlat) {
const queryFlat = flat;
const queryNonFlat = nonFlat;
Object.entries(obj).forEach(([property, value]) => {
if (property.startsWith(':') || property.startsWith('[')) {
queryNonFlat[property] = value;
}
else if ((0, helper_js_1.isAtRule)(property)) {
const innerFlat = {};
const innerNonFlat = {};
splitAtomicAndNested(value, innerFlat, innerNonFlat);
if (Object.keys(innerFlat).length)
queryFlat[property] = innerFlat;
if (Object.keys(innerNonFlat).length)
queryNonFlat[property] = innerNonFlat;
}
else {
queryFlat[property] = value;
}
});
}
function processAtomicProps(flatProps, atomicMap, parentAtRule) {
const resultQueue = [];
for (const [key, style] of Object.entries(flatProps)) {
if ((0, helper_js_1.isAtRule)(key)) {
processAtomicProps(style, atomicMap, key);
continue;
}
resultQueue.push([key, style]);
}
for (const [property, value] of resultQueue) {
const CSSProp = (0, helper_js_1.camelToKebabCase)(property);
const normalizedValue = (0, helper_js_1.applyCssValue)(value, CSSProp);
const singlePropObj = { [property]: normalizedValue };
const styleObj = parentAtRule ? { [parentAtRule]: singlePropObj } : singlePropObj;
const atomicHash = (0, hash_js_1.genBase36Hash)(styleObj, 1, 8);
if (atomicMap.has(atomicHash))
continue;
let styleSheet = (0, transpile_atomic_js_1.transpileAtomic)(property, value, atomicHash);
if (parentAtRule) {
styleSheet = `${parentAtRule} { ${styleSheet} }`;
}
atomicMap.set(atomicHash, styleSheet + '\n');
}
}