Skip to content

Commit edd1571

Browse files
committed
test: advanced features
1 parent bd2581f commit edd1571

File tree

4 files changed

+184
-7
lines changed

4 files changed

+184
-7
lines changed

Diff for: package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"jest": "^22.4.2",
4444
"jsdom": "^11.6.2",
4545
"lint-staged": "^7.0.0",
46+
"mini-css-extract-plugin": "^0.2.0",
4647
"node-sass": "^4.7.2",
4748
"normalize-newline": "^3.0.0",
4849
"postcss-loader": "^2.1.2",
@@ -69,7 +70,7 @@
6970
"postcss": "^6.0.20",
7071
"postcss-selector-parser": "^3.1.1",
7172
"prettier": "^1.11.1",
72-
"source-map": "^0.7.2",
73+
"source-map": "^0.5.6",
7374
"vue-component-compiler": "vuejs/vue-component-compiler#master",
7475
"vue-hot-reload-api": "^2.3.0",
7576
"vue-style-loader": "^4.0.2",

Diff for: test/advanced.spec.js

+174-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,176 @@
1-
test('advanced', () => {
1+
const path = require('path')
2+
const { SourceMapConsumer } = require('source-map')
3+
const normalizeNewline = require('normalize-newline')
4+
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
25

6+
const {
7+
mfs,
8+
genId,
9+
bundle,
10+
mockBundleAndRun
11+
} = require('./utils')
12+
13+
test('support chaining with other loaders', done => {
14+
mockBundleAndRun({
15+
entry: 'basic.vue',
16+
modify: config => {
17+
config.module.rules[0] = {
18+
test: /\.vue$/,
19+
use: [
20+
'vue-loader',
21+
require.resolve('./mock-loaders/js')
22+
]
23+
}
24+
}
25+
}, ({ module }) => {
26+
expect(module.data().msg).toBe('Changed!')
27+
done()
28+
})
29+
})
30+
31+
test('expose filename', done => {
32+
mockBundleAndRun({
33+
entry: 'basic.vue'
34+
}, ({ module }) => {
35+
expect(module.__file).toBe(path.normalize('test/fixtures/basic.vue'))
36+
done()
37+
})
38+
})
39+
40+
test('source map', done => {
41+
bundle({
42+
entry: 'basic.vue',
43+
devtool: '#source-map'
44+
}, code => {
45+
const map = mfs.readFileSync('/test.build.js.map', 'utf-8')
46+
const smc = new SourceMapConsumer(JSON.parse(map))
47+
let line
48+
let col
49+
const targetRE = /^\s+msg: 'Hello from Component A!'/
50+
code.split(/\r?\n/g).some((l, i) => {
51+
if (targetRE.test(l)) {
52+
line = i + 1
53+
col = 0
54+
return true
55+
}
56+
})
57+
const pos = smc.originalPositionFor({
58+
line: line,
59+
column: col
60+
})
61+
expect(pos.source.indexOf('basic.vue') > -1)
62+
expect(pos.line).toBe(9)
63+
done()
64+
})
65+
})
66+
67+
test('extract CSS', done => {
68+
bundle({
69+
entry: 'extract-css.vue',
70+
modify: config => {
71+
config.module.rules = [
72+
{
73+
test: /\.vue$/,
74+
use: 'vue-loader'
75+
},
76+
{
77+
test: /\.css$/,
78+
use: [
79+
MiniCssExtractPlugin.loader,
80+
'css-loader'
81+
]
82+
},
83+
{
84+
test: /\.stylus$/,
85+
use: [
86+
MiniCssExtractPlugin.loader,
87+
'css-loader',
88+
'stylus-loader'
89+
]
90+
}
91+
]
92+
},
93+
plugins: [
94+
new MiniCssExtractPlugin({
95+
filename: 'test.output.css'
96+
})
97+
]
98+
}, code => {
99+
const css = normalizeNewline(mfs.readFileSync('/test.output.css').toString())
100+
const id = `data-v-${genId('extract-css.vue')}`
101+
expect(css).toContain(`h1 {\n color: #f00;\n}`)
102+
// extract + scoped
103+
expect(css).toContain(`h2[${id}] {\n color: green;\n}`)
104+
done()
105+
})
3106
})
107+
108+
// TODO
109+
// test('multiple rule definitions', done => {
110+
// mockBundleAndRun({
111+
// modify: config => {
112+
// // remove default rule
113+
// config.module.rules.shift()
114+
// },
115+
// entry: './test/fixtures/multiple-rules.js',
116+
// module: {
117+
// rules: [
118+
// {
119+
// test: /\.vue$/,
120+
// oneOf: [
121+
// {
122+
// include: /-1\.vue$/,
123+
// loader: loaderPath,
124+
// options: {
125+
// postcss: [
126+
// css => {
127+
// css.walkDecls('font-size', decl => {
128+
// decl.value = `${parseInt(decl.value, 10) * 2}px`
129+
// })
130+
// }
131+
// ],
132+
// compilerModules: [{
133+
// postTransformNode: el => {
134+
// el.staticClass = '"multiple-rule-1"'
135+
// }
136+
// }]
137+
// }
138+
// },
139+
// {
140+
// include: /-2\.vue$/,
141+
// loader: loaderPath,
142+
// options: {
143+
// postcss: [
144+
// css => {
145+
// css.walkDecls('font-size', decl => {
146+
// decl.value = `${parseInt(decl.value, 10) / 2}px`
147+
// })
148+
// }
149+
// ],
150+
// compilerModules: [{
151+
// postTransformNode: el => {
152+
// el.staticClass = '"multiple-rule-2"'
153+
// }
154+
// }]
155+
// }
156+
// }
157+
// ]
158+
// }
159+
// ]
160+
// }
161+
// }, (window, module) => {
162+
// const vnode1 = mockRender(window.rules[0])
163+
// const vnode2 = mockRender(window.rules[1])
164+
// expect(vnode1.data.staticClass).toBe('multiple-rule-1')
165+
// expect(vnode2.data.staticClass).toBe('multiple-rule-2')
166+
// const styles = window.document.querySelectorAll('style')
167+
// const expr = /\.multiple-rule-\d\s*\{\s*font-size:\s*([.0-9]+)px;/
168+
// for (let i = 0, l = styles.length; i < l; i++) {
169+
// const content = styles[i].textContent
170+
// if (expr.test(content)) {
171+
// expect(parseFloat(RegExp.$1)).toBe(14)
172+
// }
173+
// }
174+
// done()
175+
// })
176+
// })

Diff for: test/fixtures/extract-css.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ h1
33
color red
44
</style>
55

6-
<style>
6+
<style scoped>
77
h2 {
88
color: green;
99
}

Diff for: yarn.lock

+7-4
Original file line numberDiff line numberDiff line change
@@ -5038,6 +5038,13 @@ min-document@^2.19.0:
50385038
dependencies:
50395039
dom-walk "^0.1.0"
50405040

5041+
mini-css-extract-plugin@^0.2.0:
5042+
version "0.2.0"
5043+
resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.2.0.tgz#7a16b0e1096c86de8e4d1c3b063aa1aeae88d41d"
5044+
dependencies:
5045+
loader-utils "^1.1.0"
5046+
webpack-sources "^1.1.0"
5047+
50415048
minimalistic-assert@^1.0.0:
50425049
version "1.0.0"
50435050
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
@@ -7172,10 +7179,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
71727179
version "0.6.1"
71737180
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
71747181

7175-
source-map@^0.7.2:
7176-
version "0.7.2"
7177-
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.2.tgz#115c3e891aaa9a484869fd2b89391a225feba344"
7178-
71797182
spawn-sync@^1.0.15:
71807183
version "1.0.15"
71817184
resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476"

0 commit comments

Comments
 (0)