Skip to content

Commit ecf651f

Browse files
committed
Enforces require.resolve for loaders
1 parent 9c50971 commit ecf651f

File tree

10 files changed

+57
-28
lines changed

10 files changed

+57
-28
lines changed

packages/@vue/cli-plugin-babel/index.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ module.exports = (api, options) => {
4545
})
4646
.end()
4747
.use('cache-loader')
48-
.loader('cache-loader')
48+
.loader(require.resolve('cache-loader'))
4949
.options(api.genCacheConfig('babel-loader', {
5050
'@babel/core': require('@babel/core/package.json').version,
5151
'@vue/babel-preset-app': require('@vue/babel-preset-app/package.json').version,
@@ -61,7 +61,7 @@ module.exports = (api, options) => {
6161
if (useThreads) {
6262
const threadLoaderConfig = jsRule
6363
.use('thread-loader')
64-
.loader('thread-loader')
64+
.loader(require.resolve('thread-loader'))
6565

6666
if (typeof options.parallel === 'number') {
6767
threadLoaderConfig.options({ workers: options.parallel })
@@ -70,6 +70,6 @@ module.exports = (api, options) => {
7070

7171
jsRule
7272
.use('babel-loader')
73-
.loader('babel-loader')
73+
.loader(require.resolve('babel-loader'))
7474
})
7575
}

packages/@vue/cli-plugin-babel/package.json

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
"@vue/babel-preset-app": "^4.0.0-rc.0",
2525
"@vue/cli-shared-utils": "^4.0.0-rc.0",
2626
"babel-loader": "^8.0.6",
27+
"cache-loader": "^2.0.1",
28+
"thread-loader": "^2.1.2",
2729
"webpack": "^4.0.0"
2830
},
2931
"peerDependencies": {

packages/@vue/cli-plugin-eslint/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ module.exports = (api, options) => {
4545
.end()
4646
.test(/\.(vue|(j|t)sx?)$/)
4747
.use('eslint-loader')
48-
.loader('eslint-loader')
48+
.loader(require.resolve('eslint-loader'))
4949
.options({
5050
extensions,
5151
cache: true,

packages/@vue/cli-plugin-typescript/__tests__/tsPluginBabel.spec.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ test('using correct loader', () => {
1616
const config = service.resolveWebpackConfig()
1717
// eslint-disable-next-line no-shadow
1818
const rule = config.module.rules.find(rule => rule.test.test('foo.ts'))
19-
expect(rule.use[0].loader).toMatch('cache-loader')
20-
expect(rule.use[1].loader).toMatch('babel-loader')
21-
expect(rule.use[2].loader).toMatch('ts-loader')
19+
expect(rule.use[0].loader).toMatch(require.resolve('cache-loader'))
20+
expect(rule.use[1].loader).toMatch(require.resolve('babel-loader'))
21+
expect(rule.use[2].loader).toMatch(require.resolve('ts-loader'))
2222
})
2323

2424
const creatorOptions = {

packages/@vue/cli-plugin-typescript/index.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ module.exports = (api, projectOptions) => {
2828
}
2929

3030
addLoader({
31-
loader: 'cache-loader',
31+
loader: require.resolve('cache-loader'),
3232
options: api.genCacheConfig('ts-loader', {
3333
'ts-loader': require('ts-loader/package.json').version,
3434
'typescript': require('typescript/package.json').version,
@@ -38,7 +38,7 @@ module.exports = (api, projectOptions) => {
3838

3939
if (useThreads) {
4040
addLoader({
41-
loader: 'thread-loader',
41+
loader: require.resolve('thread-loader'),
4242
options:
4343
typeof projectOptions.parallel === 'number'
4444
? { workers: projectOptions.parallel }
@@ -48,11 +48,14 @@ module.exports = (api, projectOptions) => {
4848

4949
if (api.hasPlugin('babel')) {
5050
addLoader({
51-
loader: 'babel-loader'
51+
// TODO: I guess the intent is to require the `babel-loader` provided by the Babel vue
52+
// plugin, but that means we now rely on the hoisting. It should instead we queried
53+
// against the plugin itself, or through a peer dependency.
54+
loader: require.resolve('babel-loader')
5255
})
5356
}
5457
addLoader({
55-
loader: 'ts-loader',
58+
loader: require.resolve('ts-loader'),
5659
options: {
5760
transpileOnly: true,
5861
appendTsSuffixTo: ['\\.vue$'],
@@ -61,7 +64,7 @@ module.exports = (api, projectOptions) => {
6164
}
6265
})
6366
// make sure to append TSX suffix
64-
tsxRule.use('ts-loader').loader('ts-loader').tap(options => {
67+
tsxRule.use('ts-loader').loader(require.resolve('ts-loader')).tap(options => {
6568
options = Object.assign({}, options)
6669
delete options.appendTsSuffixTo
6770
options.appendTsxSuffixTo = ['\\.vue$']

packages/@vue/cli-plugin-typescript/package.json

+2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@
2525
"dependencies": {
2626
"@types/webpack-env": "^1.13.9",
2727
"@vue/cli-shared-utils": "^4.0.0-rc.0",
28+
"cache-loader": "^2.0.1",
2829
"fork-ts-checker-webpack-plugin": "^1.3.4",
2930
"globby": "^9.2.0",
31+
"thread-loader": "^2.1.2",
3032
"ts-loader": "^6.0.1",
3133
"tslint": "^5.16.0",
3234
"webpack": "^4.0.0",

packages/@vue/cli-service/lib/config/base.js

+9-9
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ module.exports = (api, options) => {
7979
.rule('vue')
8080
.test(/\.vue$/)
8181
.use('cache-loader')
82-
.loader('cache-loader')
82+
.loader(require.resolve('cache-loader'))
8383
.options(vueLoaderCacheConfig)
8484
.end()
8585
.use('vue-loader')
86-
.loader('vue-loader')
86+
.loader(require.resolve('vue-loader'))
8787
.options(Object.assign({
8888
compilerOptions: {
8989
whitespace: 'condense'
@@ -100,7 +100,7 @@ module.exports = (api, options) => {
100100
.rule('images')
101101
.test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
102102
.use('url-loader')
103-
.loader('url-loader')
103+
.loader(require.resolve('url-loader'))
104104
.options(genUrlLoaderOptions('img'))
105105

106106
// do not base64-inline SVGs.
@@ -109,7 +109,7 @@ module.exports = (api, options) => {
109109
.rule('svg')
110110
.test(/\.(svg)(\?.*)?$/)
111111
.use('file-loader')
112-
.loader('file-loader')
112+
.loader(require.resolve('file-loader'))
113113
.options({
114114
name: genAssetSubPath('img')
115115
})
@@ -118,14 +118,14 @@ module.exports = (api, options) => {
118118
.rule('media')
119119
.test(/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/)
120120
.use('url-loader')
121-
.loader('url-loader')
121+
.loader(require.resolve('url-loader'))
122122
.options(genUrlLoaderOptions('media'))
123123

124124
webpackConfig.module
125125
.rule('fonts')
126126
.test(/\.(woff2?|eot|ttf|otf)(\?.*)?$/i)
127127
.use('url-loader')
128-
.loader('url-loader')
128+
.loader(require.resolve('url-loader'))
129129
.options(genUrlLoaderOptions('fonts'))
130130

131131
// Other common pre-processors ---------------------------------------------
@@ -136,15 +136,15 @@ module.exports = (api, options) => {
136136
.oneOf('pug-vue')
137137
.resourceQuery(/vue/)
138138
.use('pug-plain-loader')
139-
.loader('pug-plain-loader')
139+
.loader(require.resolve('pug-plain-loader'))
140140
.end()
141141
.end()
142142
.oneOf('pug-template')
143143
.use('raw')
144-
.loader('raw-loader')
144+
.loader(require.resolve('raw-loader'))
145145
.end()
146146
.use('pug-plain-loader')
147-
.loader('pug-plain-loader')
147+
.loader(require.resolve('pug-plain-loader'))
148148
.end()
149149
.end()
150150

packages/@vue/cli-service/lib/config/css.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ module.exports = (api, rootOptions) => {
113113
} else {
114114
rule
115115
.use('vue-style-loader')
116-
.loader('vue-style-loader')
116+
.loader(require.resolve('vue-style-loader'))
117117
.options({
118118
sourceMap,
119119
shadowMode
@@ -140,13 +140,13 @@ module.exports = (api, rootOptions) => {
140140

141141
rule
142142
.use('css-loader')
143-
.loader('css-loader')
143+
.loader(require.resolve('css-loader'))
144144
.options(cssLoaderOptions)
145145

146146
if (needInlineMinification) {
147147
rule
148148
.use('cssnano')
149-
.loader('postcss-loader')
149+
.loader(require.resolve('postcss-loader'))
150150
.options({
151151
sourceMap,
152152
plugins: [require('cssnano')(cssnanoOptions)]
@@ -156,14 +156,14 @@ module.exports = (api, rootOptions) => {
156156
if (hasPostCSSConfig) {
157157
rule
158158
.use('postcss-loader')
159-
.loader('postcss-loader')
159+
.loader(require.resolve('postcss-loader'))
160160
.options(Object.assign({ sourceMap }, loaderOptions.postcss))
161161
}
162162

163163
if (loader) {
164164
rule
165165
.use(loader)
166-
.loader(loader)
166+
.loader(require.resolve(loader))
167167
.options(Object.assign({ sourceMap }, options))
168168
}
169169
}

packages/@vue/cli-service/package.json

+23-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,29 @@
8080
"webpack-merge": "^4.2.1"
8181
},
8282
"peerDependencies": {
83-
"vue-template-compiler": "^2.0.0"
83+
"less-loader": "*",
84+
"pug-plain-loader": "*",
85+
"raw-loader": "*",
86+
"sass-loader": "*",
87+
"stylus-loader": "*",
88+
"vue-template-compiler": "^2.0.0",
89+
},
90+
"peerDependenciesMeta": {
91+
"less-loader": {
92+
"optional": true
93+
},
94+
"pug-plain-loader": {
95+
"optional": true
96+
},
97+
"raw-loader": {
98+
"optional": true
99+
},
100+
"sass-loader": {
101+
"optional": true
102+
},
103+
"stylus-loader": {
104+
"optional": true
105+
}
84106
},
85107
"devDependencies": {
86108
"fibers": ">= 3.1.1 <5.0.0",

packages/@vue/cli-ui/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ exports.clientAddonConfig = function ({ id, port = 8042 }) {
2323
.rule('gql')
2424
.test(/\.(gql|graphql)$/)
2525
.use('gql-loader')
26-
.loader('graphql-tag/loader')
26+
.loader(require.resolve('graphql-tag/loader'))
2727
.end()
2828
},
2929
devServer: {

0 commit comments

Comments
 (0)