Skip to content

Commit a3dcc5e

Browse files
author
Michael Vurchio
committed
Preprocess style outside markup. multiple class use ok
1 parent f781c15 commit a3dcc5e

File tree

5 files changed

+33
-19
lines changed

5 files changed

+33
-19
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# Svelte preprocess CSS Modules
2+
@todo test ::before, test multiple use, test nested
23

34
Generate CSS Modules classname on Svelte components
45

@@ -79,8 +80,7 @@ CSS Modules classname are generated to the html class values prefixed by `$style
7980

8081
```html
8182
<style>
82-
.blue { color: blue;
83-
}
83+
.blue { color: blue;}
8484
.red-2iBDzf { color: red; }
8585
.text-center { text-align: center; }
8686
</style>

example/webpack/App.svelte

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,19 +65,22 @@ button {
6565
.cancel {
6666
background-color: #f2f2f2;
6767
}
68+
.active {
69+
font-weight: 700;
70+
}
6871
</style>
6972

7073
<div class="$style.overlay" />
7174
<div class="$style.modal">
7275
<section>
73-
<header>My Modal title</header>
76+
<header class="$style.active">My Modal title</header>
7477
<div class="$style.body">
7578
<Time />
7679
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Placeat, deserunt.</p>
7780
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Placeat, deserunt. Lorem ipsum dolor sit amet. </p>
7881
</div>
7982
<footer>
80-
<button>Ok</button>
83+
<button class="$style.active">Ok</button>
8184
<button class="$style.cancel">Cancel</button>
8285
</footer>
8386
</section>

example/webpack/Time.svelte

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
</script>
1313

1414
<style>
15+
.datetime {
16+
color: gray;
17+
}
1518
div {
1619
text-align: right;
1720
font-size: 1.2rem;

example/webpack/webpack.config.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ module.exports = {
2121
options: {
2222
preprocess: [
2323
cssModules({
24-
localIdentName: '[hash:base64:10]',
2524
includePaths: ['./']
2625
})
2726
],

index.js

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ const regex = {
1111
style: /<style(\s[^]*?)?>([^]*?)<\/style>/gi
1212
};
1313

14+
let moduleClasses = {};
15+
1416
function generateName(resourcePath, styles, className) {
1517
const filePath = resourcePath
1618
const fileName = path.basename(filePath)
@@ -51,38 +53,44 @@ const markup = async ({ content, filename }) => {
5153
}
5254

5355
const styles = content.match(regex.style);
54-
let parsedStyles = null;
56+
moduleClasses[filename] = {};
5557

56-
let parsedSource = content.replace(regex.module, (match, className) => {
58+
return { code: content.replace(regex.module, (match, className) => {
5759
let replacement = '';
58-
5960
if (styles.length) {
6061
const classRegex = new RegExp(`\\.(${className})\\b(?![-_])`, 'gm');
61-
const toBeParsed = parsedStyles ? parsedStyles : styles[0];
6262

63-
if (classRegex.test(toBeParsed)) {
63+
if (classRegex.test(styles[0])) {
6464
const interpolatedName = generateName(
6565
filename,
6666
styles[0],
6767
className
6868
);
69-
parsedStyles = toBeParsed.replace(
70-
classRegex,
71-
() => `:global(.${interpolatedName})`
72-
);
69+
moduleClasses[filename][className] = interpolatedName;
7370
replacement = interpolatedName;
7471
}
7572
}
7673
return replacement;
77-
});
74+
})};
75+
};
7876

79-
if (parsedStyles) {
80-
parsedSource = parsedSource.replace(regex.style, parsedStyles);
77+
const style = async ({ content, filename }) => {
78+
let code = content;
79+
const classes = moduleClasses[filename];
80+
81+
if (Object.keys(classes).length === 0) {
82+
return { code };
8183
}
8284

83-
return {
84-
code: parsedSource
85+
for (const className in classes) {
86+
const classRegex = new RegExp(`\\.(${className})\\b(?![-_])`, 'gm');
87+
code = code.replace(
88+
classRegex,
89+
() => `:global(.${classes[className]})`
90+
);
8591
}
92+
93+
return { code };
8694
};
8795

8896
module.exports = (options) => {
@@ -91,5 +99,6 @@ module.exports = (options) => {
9199
}
92100
return {
93101
markup,
102+
style,
94103
}
95104
};

0 commit comments

Comments
 (0)