-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
67 lines (54 loc) · 1.36 KB
/
index.js
File metadata and controls
67 lines (54 loc) · 1.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
"use strict";
const createMarkupForStyles = require("./src/style");
const createClassnames = require("./src/classnames");
const hash = require("./src/hash");
const walk = require("./src/walkObject");
const sheet = require("./src/sheet");
exports.StyleSheet = {
create: obj => obj
};
exports.css = exports.classnames = createClassnames(process);
let cache = new Map();
function process(styles) {
const src = {};
styles.forEach(function(obj) {
for (const [media, selector, style] of walk(obj)) {
let dest = src;
if (media) {
dest = dest[media] = dest[media] || {};
}
if (selector) {
dest = dest[selector] = dest[selector] || {};
}
Object.assign(dest, style);
}
});
const id = hash(JSON.stringify(src));
if (cache.has(id)) {
return cache.get(id);
}
const classname = `css-${id}`;
cache.set(id, classname);
sheet.insert(getRules(src, classname));
return classname;
}
function getRules(src, classname) {
const rules = [];
for (const [media, selector, style] of walk(src)) {
let rule = createMarkupForStyles(style);
if (!rule) {
continue;
}
rule = `.${classname}${selector}{${rule}}`;
if (media) {
rule = `${media}{${rule}}`;
}
rules.push(rule);
}
return rules;
}
// for tests
exports.reset = function reset() {
cache = new Map();
sheet.reset();
}