Skip to content

Commit df00b3e

Browse files
authored
feat(GeneratorAPI): forceOverwrite option for extendPackage (#6307)
1 parent 9e5b194 commit df00b3e

File tree

6 files changed

+58
-10
lines changed

6 files changed

+58
-10
lines changed

packages/@vue/cli-plugin-webpack-4/generator.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ module.exports = (api) => {
4444
return toMerge
4545
},
4646
{
47-
warnIncompatibleVersions: false
47+
warnIncompatibleVersions: false,
48+
forceOverwrite: true
4849
}
4950
)
5051
}

packages/@vue/cli/__tests__/Generator.spec.js

+35
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,41 @@ test('api: extendPackage + { warnIncompatibleVersions: false }', async () => {
523523
})
524524
})
525525

526+
test('api: extendPackage + { forceOverwrite: true }', async () => {
527+
const generator = new Generator('/', {
528+
pkg: {
529+
devDependencies: {
530+
'sass-loader': '^11.0.0'
531+
}
532+
},
533+
plugins: [{
534+
id: 'test',
535+
apply: api => {
536+
api.extendPackage(
537+
{
538+
devDependencies: {
539+
'sass-loader': '^10.0.0'
540+
}
541+
},
542+
{ warnIncompatibleVersions: false, forceOverwrite: true }
543+
)
544+
}
545+
}]
546+
})
547+
548+
await generator.generate()
549+
const pkg = JSON.parse(fs.readFileSync('/package.json', 'utf-8'))
550+
551+
// should not warn about the version conflicts
552+
expect(logs.warn.length).toBe(0)
553+
// should use the newer version
554+
expect(pkg).toEqual({
555+
devDependencies: {
556+
'sass-loader': '^10.0.0'
557+
}
558+
})
559+
})
560+
526561
test('api: render fs directory', async () => {
527562
const generator = new Generator('/', {
528563
plugins: [

packages/@vue/cli/lib/GeneratorAPI.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -219,12 +219,15 @@ class GeneratorAPI {
219219
* that dependency fields are always deep merged regardless of this option.
220220
* @param {boolean} [options.warnIncompatibleVersions=true] Output warning
221221
* if two dependency version ranges don't intersect.
222+
* @param {boolean} [options.forceOverwrite=false] force using the dependency
223+
* version provided in the first argument, instead of trying to get the newer ones
222224
*/
223225
extendPackage (fields, options = {}) {
224226
const extendOptions = {
225227
prune: false,
226228
merge: true,
227-
warnIncompatibleVersions: true
229+
warnIncompatibleVersions: true,
230+
forceOverwrite: false
228231
}
229232

230233
// this condition statement is added for compatibility reason, because

packages/@vue/cli/lib/util/mergeDeps.js

+12-7
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ module.exports = function mergeDeps (
2828
sources,
2929
{
3030
prune,
31-
warnIncompatibleVersions
31+
warnIncompatibleVersions,
32+
forceOverwrite
3233
}
3334
) {
3435
const result = Object.assign({}, sourceDeps)
@@ -63,11 +64,15 @@ module.exports = function mergeDeps (
6364
const r = tryGetNewerRange(sourceRangeSemver, injectingRangeSemver)
6465
const didGetNewer = !!r
6566

66-
// if failed to infer newer version, use existing one because it's likely
67-
// built-in
68-
result[depName] = didGetNewer
69-
? injectSemver(injectingRange, r)
70-
: sourceRange
67+
if (forceOverwrite) {
68+
result[depName] = injectingRange
69+
} else if (didGetNewer) {
70+
result[depName] = injectSemver(injectingRange, r)
71+
} else {
72+
// if failed to infer newer version, use existing one because it's likely
73+
// built-in
74+
result[depName] = sourceRange
75+
}
7176

7277
// if changed, update source
7378
if (result[depName] === injectingRange) {
@@ -85,7 +90,7 @@ module.exports = function mergeDeps (
8590
`conflicting versions for project dependency "${depName}":\n\n` +
8691
`- ${sourceRange} injected by generator "${sourceGeneratorId}"\n` +
8792
`- ${injectingRange} injected by generator "${generatorId}"\n\n` +
88-
`Using ${didGetNewer ? `newer ` : ``}version (${
93+
`Using ${(!forceOverwrite && didGetNewer) ? `newer ` : ``}version (${
8994
result[depName]
9095
}), but this may cause build errors.`
9196
)

packages/@vue/cli/types/cli-test.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ const generator: GeneratorPlugin = (api, options, rootOptions, invoking) => {
112112
{
113113
merge: true,
114114
prune: true,
115-
warnIncompatibleVersions: true
115+
warnIncompatibleVersions: true,
116+
forceOverwrite: true
116117
}
117118
)
118119

packages/@vue/cli/types/index.d.ts

+3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ type ExtendPackageOptions =
3838
prune?: boolean
3939
merge?: boolean
4040
warnIncompatibleVersions?: boolean
41+
forceOverwrite?: boolean
4142
}
4243
| boolean
4344

@@ -121,6 +122,8 @@ declare class GeneratorAPI {
121122
* that dependency fields are always deep merged regardless of this option.
122123
* @param [options.warnIncompatibleVersions=true] Output warning
123124
* if two dependency version ranges don't intersect.
125+
* @param [options.forceOverwrite=false] force using the dependency
126+
* version provided in the first argument, instead of trying to get the newer ones
124127
*/
125128
extendPackage(
126129
fields: (pkg: Record<string, any>) => object,

0 commit comments

Comments
 (0)