Skip to content

Commit 45bb050

Browse files
committed
Tidy up contracts
1 parent 4dddfa1 commit 45bb050

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

src/index.js

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -122,32 +122,44 @@ const getMessages = aliases =>
122122
.map(name => ({ plugin, type: "icss-scoped", name, value: aliases[name] }))
123123
.reduce((acc, msg) => [...acc, msg], []);
124124

125+
const getContract = (result, type, prop, value) =>
126+
result.messages
127+
.filter(msg => msg.type === type)
128+
.reduce(
129+
(acc, msg) => Object.assign({}, acc, { [msg[prop]]: msg[value] }),
130+
{}
131+
);
132+
133+
const composeAliases = (aliases, composed) =>
134+
Object.keys(aliases).reduce(
135+
(acc, name) =>
136+
Object.assign({}, acc, {
137+
[name]: aliases[name] + (composed[name] ? ` ${composed[name]}` : "")
138+
}),
139+
{}
140+
);
141+
125142
module.exports = postcss.plugin(plugin, (options = {}) => (css, result) => {
126143
const generateScopedName =
127144
options.generateScopedName ||
128145
genericNames("[name]__[local]---[hash:base64:5]");
129146
const input = (css && css.source && css.source.input) || {};
147+
const icssScoped = getContract(result, "icss-scoped", "name", "value");
148+
const icssComposed = getContract(result, "icss-composed", "name", "value");
149+
const icssValue = getContract(result, "icss-value", "value", "name");
130150
const aliases = {};
131151
walkRules(css, rule => {
132152
const getAlias = name => {
133153
if (aliases[name]) {
134154
return aliases[name];
135155
}
136156
// icss-value contract
137-
if (
138-
result.messages.find(
139-
msg => msg.type === "icss-value" && msg.value === name
140-
)
141-
) {
157+
if (icssValue[name]) {
142158
return name;
143159
}
144160
const alias = generateScopedName(name, input.from, input.css);
145161
// icss-scoped contract
146-
if (
147-
result.messages.find(
148-
msg => msg.type === "icss-scoped" && msg.name === name
149-
)
150-
) {
162+
if (icssScoped[name]) {
151163
result.warn(`'${name}' already declared`, { node: rule });
152164
}
153165
aliases[name] = alias;
@@ -163,14 +175,7 @@ module.exports = postcss.plugin(plugin, (options = {}) => (css, result) => {
163175
throw rule.error(e.message);
164176
}
165177
});
166-
// icss-composed contract
167-
const composedAliases = Object.keys(aliases).reduce((acc, name) => {
168-
const composedMsg = result.messages.find(
169-
msg => msg.type === "icss-composed" && msg.name === name
170-
);
171-
acc[name] = aliases[name] + (composedMsg ? ` ${composedMsg.value}` : "");
172-
return acc;
173-
}, {});
174178
result.messages.push(...getMessages(aliases));
175-
addExports(css, composedAliases);
179+
// icss-composed contract
180+
addExports(css, composeAliases(aliases, icssComposed));
176181
});

0 commit comments

Comments
 (0)