Skip to content

Commit fa1a7d8

Browse files
committed
Add icss-scoped contract
1 parent c04b57b commit fa1a7d8

File tree

2 files changed

+54
-4
lines changed

2 files changed

+54
-4
lines changed

src/index.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,13 @@ const isForbidden = name => name.includes(".") || name.includes("#");
9898
const createGenerator = (i = 0) => name =>
9999
`__value__${name.replace(/\W/g, "_")}__${i++}`;
100100

101+
const getScopedAliases = (messages, values) =>
102+
fromPairs(
103+
messages
104+
.filter(msg => msg.type === "icss-scoped")
105+
.map(msg => [msg.value, values[msg.name]])
106+
);
107+
101108
const getMessages = exports =>
102109
Object.keys(exports).map(name => ({
103110
plugin: "postcss-icss-values",
@@ -156,7 +163,14 @@ module.exports = postcss.plugin(plugin, () => (css, result) => {
156163
atrule.remove();
157164
});
158165

159-
replaceSymbols(css, valuesExports);
166+
replaceSymbols(
167+
css,
168+
Object.assign(
169+
{},
170+
valuesExports,
171+
getScopedAliases(result.messages, valuesExports)
172+
)
173+
);
160174

161175
css.prepend(
162176
createICSSRules(icssImports, Object.assign({}, icssExports, valuesExports))

test/test.js

+39-3
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,25 @@ import plugin from "../src";
55

66
const strip = input => stripIndent(input).trim();
77

8-
const compile = input => postcss([plugin]).process(strip(input));
8+
const messagesPlugin = messages => (css, result) =>
9+
result.messages.push(...messages);
10+
11+
const compile = (input, messages) =>
12+
postcss([messagesPlugin(messages), plugin]).process(strip(input));
913

1014
const getWarnings = result => result.warnings().map(warning => warning.text);
1115

1216
const getMessages = result =>
1317
result.messages.filter(msg => msg.type !== "warning");
1418

15-
const run = ({ fixture, expected, warnings = [], messages = [] }) =>
16-
compile(fixture).then(result => {
19+
const run = ({
20+
fixture,
21+
expected,
22+
warnings = [],
23+
inputMessages = [],
24+
messages = []
25+
}) =>
26+
compile(fixture, inputMessages).then(result => {
1727
expect(result.css.trim()).toEqual(strip(expected));
1828
expect(getWarnings(result)).toEqual(warnings);
1929
expect(getMessages(result)).toEqual(messages);
@@ -428,3 +438,29 @@ test("warn on using dot or hash in value name", () => {
428438
]
429439
});
430440
});
441+
442+
test("icss-scoped contract", () => {
443+
const inputMessages = [
444+
{ type: "icss-scoped", name: "a", value: "__scope__a" }
445+
];
446+
return run({
447+
fixture: `
448+
:export {
449+
a: __scope__a
450+
}
451+
@value a from 'path';
452+
.__scope__a {}
453+
`,
454+
inputMessages,
455+
expected: `
456+
:import('path') {
457+
__value__a__0: a
458+
}
459+
:export {
460+
a: __value__a__0
461+
}
462+
.__value__a__0 {}
463+
`,
464+
messages: [...inputMessages, getMsg("a", "__value__a__0")]
465+
});
466+
});

0 commit comments

Comments
 (0)