Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vue-loader
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
pi-plusplus
fork-from-github
vue-loader
Commits
c3b379d2
Commit
c3b379d2
authored
Mar 20, 2018
by
Evan You
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: support rules with oneOf
parent
58239f64
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
81 additions
and
10 deletions
+81
-10
plugin.js
lib/plugin.js
+15
-8
styleInjection.js
lib/styleInjection.js
+2
-1
advanced.spec.js
test/advanced.spec.js
+54
-0
css-modules-simple.vue
test/fixtures/css-modules-simple.vue
+9
-0
style.spec.js
test/style.spec.js
+1
-1
No files found.
lib/plugin.js
View file @
c3b379d2
...
...
@@ -92,12 +92,6 @@ module.exports = class VueLoaderPlugin {
}
function
cloneRule
(
rule
,
normalizedRule
,
vueUse
)
{
if
(
rule
.
oneOf
)
{
return
Object
.
assign
({},
rule
,
{
oneOf
:
rule
.
oneOf
.
map
((
r
,
i
)
=>
cloneRule
(
r
,
normalizedRule
.
oneOf
[
i
]))
})
}
// Assuming `test` and `resourceQuery` tests are executed in series and
// synchronously (which is true based on RuleSet's implementation), we can
// save the current resource being matched from `test` so that we can access
...
...
@@ -114,11 +108,18 @@ function cloneRule (rule, normalizedRule, vueUse) {
if
(
parsed
.
lang
==
null
)
{
return
false
}
return
normalizedRule
.
resource
(
`
${
currentResource
}
.
${
parsed
.
lang
}
`
)
const
{
resource
,
resourceQuery
}
=
normalizedRule
if
(
resource
&&
!
resource
(
`
${
currentResource
}
.
${
parsed
.
lang
}
`
))
{
return
false
}
if
(
resourceQuery
&&
!
resourceQuery
(
query
))
{
return
false
}
return
true
},
use
:
[
...(
normalizedRule
.
use
||
[]).
map
(
cleanUse
),
...
vueUse
...
rule
.
oneOf
?
[]
:
vueUse
]
})
...
...
@@ -126,6 +127,12 @@ function cloneRule (rule, normalizedRule, vueUse) {
delete
res
.
loader
delete
res
.
options
if
(
rule
.
oneOf
)
{
res
.
oneOf
=
rule
.
oneOf
.
map
((
r
,
i
)
=>
{
return
cloneRule
(
r
,
normalizedRule
.
oneOf
[
i
],
vueUse
)
})
}
return
res
}
...
...
lib/styleInjection.js
View file @
c3b379d2
...
...
@@ -23,7 +23,8 @@ module.exports = function genStyleInjectionCode (
// make sure to only pass id when necessary so that we don't inject
// duplicate tags when multiple components import the same css file
const
scopedQuery
=
style
.
scoped
?
`&scoped&id=
${
id
}
`
:
``
const
query
=
`?vue&type=style&index=
${
i
}${
langQuery
}${
scopedQuery
}
`
const
moduleQuery
=
style
.
module
?
`&cssModules`
:
``
const
query
=
`?vue&type=style&index=
${
i
}${
langQuery
}${
scopedQuery
}${
moduleQuery
}
`
return
stringifyRequest
(
src
+
query
)
}
...
...
test/advanced.spec.js
View file @
c3b379d2
...
...
@@ -105,6 +105,60 @@ test('extract CSS', done => {
})
})
test
(
'support rules with oneOf'
,
async
()
=>
{
const
run
=
(
entry
,
assert
)
=>
new
Promise
((
resolve
,
reject
)
=>
{
mockBundleAndRun
({
entry
,
modify
:
config
=>
{
config
.
module
.
rules
=
[
{
test
:
/
\.
vue$/
,
loader
:
'vue-loader'
},
{
test
:
/
\.
css$/
,
use
:
'vue-style-loader'
,
oneOf
:
[
{
resourceQuery
:
/cssModules/
,
use
:
[
{
loader
:
'css-loader'
,
options
:
{
modules
:
true
,
localIdentName
:
'[local]_[hash:base64:5]'
}
}
]
},
{
use
:
[
'css-loader'
]
}
]
}
]
}
},
res
=>
{
const
{
jsdomError
,
bundleError
}
=
res
if
(
jsdomError
)
return
reject
(
jsdomError
)
if
(
bundleError
)
return
reject
(
bundleError
)
assert
(
res
)
resolve
()
})
})
await
run
(
'basic.vue'
,
({
window
})
=>
{
let
style
=
window
.
document
.
querySelector
(
'style'
).
textContent
style
=
normalizeNewline
(
style
)
expect
(
style
).
toContain
(
'comp-a h2 {
\
n color: #f00;
\
n}'
)
})
await
run
(
'css-modules-simple.vue'
,
({
window
,
instance
})
=>
{
const
className
=
instance
.
$style
.
red
expect
(
className
).
toMatch
(
/^red_
\w{5}
/
)
let
style
=
window
.
document
.
querySelector
(
'style'
).
textContent
style
=
normalizeNewline
(
style
)
expect
(
style
).
toContain
(
'.'
+
className
+
' {
\
n color: red;
\
n}'
)
})
})
// TODO
// test('multiple rule definitions', done => {
// mockBundleAndRun({
...
...
test/fixtures/css-modules-simple.vue
0 → 100644
View file @
c3b379d2
<
style
module
>
.red
{
color
:
red
;
}
</
style
>
<
script
>
export
default
{}
</
script
>
test/style.spec.js
View file @
c3b379d2
...
...
@@ -106,7 +106,7 @@ test('postcss', done => {
})
})
test
(
'
css-m
odules'
,
async
()
=>
{
test
(
'
CSS M
odules'
,
async
()
=>
{
function
testWithIdent
(
localIdentName
,
regexToMatch
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
const
baseLoaders
=
[
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment