Skip to content
This repository was archived by the owner on Jan 18, 2022. It is now read-only.

Commit 4d5d80f

Browse files
committed
Add CSS modules before compiling
1 parent 6187633 commit 4d5d80f

10 files changed

+68
-20
lines changed

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@
4545
"postcss": "^5.2.11",
4646
"postcss-modules": "^0.6.4",
4747
"posthtml": "^0.9.2",
48-
"posthtml-css-modules": "^0.1.1",
4948
"rollup-pluginutils": "^2.0.1",
5049
"vue-template-compiler": "^2.1.10",
5150
"vue-template-es2015-compiler": "^1.5.0",
52-
"vue-template-validator": "^1.1.5"
51+
"vue-template-validator": "^1.1.5",
52+
"posthtml-attrs-parser": "^0.1.1"
5353
},
5454
"devDependencies": {
5555
"babel-eslint": "^7.1.1",

src/options.js

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export default {
3636
},
3737
styleToImports: false,
3838
autoStyles: true,
39+
disableCssModuleStaticReplacement: false,
3940
modules: {
4041
generateScopedName: '[name]__[local]___[hash:base64:5]'
4142
}

src/template/html.js

+27-9
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,30 @@
1-
// import posthtml from 'posthtml'
2-
// import parseAttrs from 'posthtml-attrs-parser'
3-
4-
export default function (template, extras, options) {
5-
if ('module' in extras) {
6-
// return posthtml([
7-
//
8-
// ])
1+
import postHtml from 'posthtml'
2+
import parseAttrs from 'posthtml-attrs-parser'
3+
4+
const plugin = (modules) => {
5+
return function cssModules (tree) {
6+
tree.match({attrs: {'class': /\w+/}}, node => {
7+
const attrs = parseAttrs(node.attrs)
8+
9+
if (attrs.class) {
10+
attrs.class = attrs.class.map(c => modules[c] || c)
11+
12+
node.attrs = attrs.compose()
13+
}
14+
15+
return node
16+
})
17+
}
18+
}
19+
20+
export default async function (template, extras, options) {
21+
if ('modules' in extras && Object.keys(extras.modules).length) {
22+
const output = await postHtml([
23+
plugin(extras.modules)
24+
]).process(template)
25+
26+
return output.html
927
}
1028

11-
return Promise.resolve(template)
29+
return template
1230
}

src/template/index.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ const compilers = {
44
html: compileHTML
55
}
66

7-
export function compile (template, extras, options) {
8-
return compilers[template.lang].call(null, template, extras, options)
7+
export default async function (template, extras, options) {
8+
const lang = template.lang || 'html'
9+
10+
return await compilers[lang].call(null, template, extras, options)
911
}

src/vueTransform.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import parse5 from 'parse5'
44
import validateTemplate from 'vue-template-validator'
55
import transpileVueTemplate from 'vue-template-es2015-compiler'
66
import { compile } from './style/index'
7+
import templateProcessor from './template/index'
78
import { relative } from 'path'
89
import MagicString from 'magic-string'
910
import debug from './debug'
@@ -111,11 +112,15 @@ function injectTemplate (script, template, lang, options, modules) {
111112
/**
112113
* Compile template: DeIndent and minify html.
113114
*/
114-
function processTemplate (source, id, content, options) {
115+
async function processTemplate (source, id, content, options, nodes, modules) {
115116
if (source === undefined) return undefined
116117

117118
const { code } = source
118-
const template = deIndent(code)
119+
const template = deIndent(
120+
await (options.disableCssModuleStaticReplacement !== true
121+
? templateProcessor(code, { modules }, options)
122+
: code)
123+
)
119124

120125
if (!options.compileTemplate) {
121126
const warnings = validateTemplate(code, content)
@@ -130,8 +135,8 @@ function processTemplate (source, id, content, options) {
130135
return htmlMinifier.minify(template, options.htmlMinifier)
131136
}
132137

133-
function processScript (source, id, content, options, nodes, modules) {
134-
const template = processTemplate(nodes.template[0], id, content, options, nodes, modules)
138+
async function processScript (source, id, content, options, nodes, modules) {
139+
const template = await processTemplate(nodes.template[0], id, content, options, nodes, modules)
135140

136141
const lang = source.attrs.lang || 'js'
137142

@@ -235,7 +240,7 @@ export default async function vueTransform (code, id, options) {
235240
const nodes = parseTemplate(code)
236241
const css = await processStyle(nodes.style, id, code, options, nodes)
237242
const modules = getModules(css)
238-
const js = processScript(nodes.script[0], id, code, options, nodes, modules)
243+
const js = await processScript(nodes.script[0], id, code, options, nodes, modules)
239244

240245
const isProduction = process.env.NODE_ENV === 'production'
241246
const isWithStripped = options.stripWith !== false

test/expects/css-modules-static.css

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.test {
2+
color: red;
3+
}

test/expects/css-modules-static.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var cssModulesStatic = { template: "<div class=\"file__test keep-me\">Foo</div>",cssModules: {"test":"file__test"},};
2+
3+
export default cssModulesStatic;

test/expects/css-modules.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
var cssModules = { template: "<div :class=\"$style.test\">Foo</div>",cssModules: {"test":"file__test___32Lja"},};
1+
var cssModules = { template: "<div :class=\"$style.test\">Foo</div>",cssModules: {"test":"file__test"},};
22

33
export default cssModules;

test/fixtures/css-modules-static.vue

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<template>
2+
<div class="test keep-me">Foo</div>
3+
</template>
4+
5+
<script lang="babel">
6+
export default {}
7+
</script>
8+
9+
<style lang="css" module>
10+
.test {
11+
color: red;
12+
}
13+
</style>

test/test.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ function test(name) {
2626
entry: entry,
2727
plugins: [vuePlugin({
2828
css: cssHandler,
29+
modules: {
30+
generateScopedName: '[name]__[local]'
31+
},
2932
compileTemplate: ['compileTemplate', 'slot', 'table', 'table-n-slot'].indexOf(name) > -1
3033
})]
3134
}).then(function (bundle) {
@@ -34,7 +37,7 @@ function test(name) {
3437
assert.equal(code.trim(), expected.trim(), 'should compile code correctly')
3538

3639
// Check css output
37-
if (['style', 'css-modules'].indexOf(name) > -1) {
40+
if (['style', 'css-modules', 'css-modules-static'].indexOf(name) > -1) {
3841
var css = read('expects/' + name + '.css')
3942
assert.equal(css.trim(), actualCss.trim(), 'should output style tag content')
4043
} else {

0 commit comments

Comments
 (0)