Skip to content

Commit 0f76b8e

Browse files
dhenscheyyx990803
authored andcommittedApr 27, 2018
feat(plugin-api): allow non-semver versioned dependencies (#1184)
close #1177
1 parent 7704868 commit 0f76b8e

File tree

2 files changed

+120
-4
lines changed

2 files changed

+120
-4
lines changed
 

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

+107
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,79 @@ test('api: extendPackage function', async () => {
115115
})
116116
})
117117

118+
test('api: extendPackage allow git, github, http, file version ranges', async () => {
119+
const generator = new Generator('/', { plugins: [
120+
{
121+
id: 'test',
122+
apply: api => {
123+
api.extendPackage({
124+
dependencies: {
125+
foo: 'git+ssh://git@github.com:npm/npm.git#v1.0.27',
126+
baz: 'git://github.com/npm/npm.git#v1.0.27',
127+
bar: 'expressjs/express',
128+
bad: 'mochajs/mocha#4727d357ea',
129+
bac: 'http://asdf.com/asdf.tar.gz',
130+
bae: 'file:../dyl',
131+
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:^1.0.0'
132+
}
133+
})
134+
}
135+
}
136+
] })
137+
138+
await generator.generate()
139+
140+
const pkg = JSON.parse(fs.readFileSync('/package.json', 'utf-8'))
141+
expect(pkg).toEqual({
142+
dependencies: {
143+
foo: 'git+ssh://git@github.com:npm/npm.git#v1.0.27',
144+
baz: 'git://github.com/npm/npm.git#v1.0.27',
145+
bar: 'expressjs/express',
146+
bad: 'mochajs/mocha#4727d357ea',
147+
bac: 'http://asdf.com/asdf.tar.gz',
148+
bae: 'file:../dyl',
149+
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:^1.0.0'
150+
}
151+
})
152+
})
153+
154+
test('api: extendPackage merge nonstrictly semver deps', async () => {
155+
const generator = new Generator('/', { plugins: [
156+
{
157+
id: 'test',
158+
apply: api => {
159+
api.extendPackage({
160+
dependencies: {
161+
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:1.0.0',
162+
bar: 'expressjs/express'
163+
}
164+
})
165+
}
166+
},
167+
{
168+
id: 'test2',
169+
apply: api => {
170+
api.extendPackage({
171+
dependencies: {
172+
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:1.2.0',
173+
bar: 'expressjs/express'
174+
}
175+
})
176+
}
177+
}
178+
] })
179+
180+
await generator.generate()
181+
182+
const pkg = JSON.parse(fs.readFileSync('/package.json', 'utf-8'))
183+
expect(pkg).toEqual({
184+
dependencies: {
185+
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:1.2.0',
186+
bar: 'expressjs/express'
187+
}
188+
})
189+
})
190+
118191
test('api: extendPackage merge dependencies', async () => {
119192
const generator = new Generator('/', { plugins: [
120193
{
@@ -209,6 +282,40 @@ test('api: extendPackage dependencies conflict', async () => {
209282
})).toBe(true)
210283
})
211284

285+
test('api: extendPackage merge warn nonstrictly semver deps', async () => {
286+
new Generator('/', { plugins: [
287+
{
288+
id: 'test3',
289+
apply: api => {
290+
api.extendPackage({
291+
dependencies: {
292+
bar: 'expressjs/express'
293+
}
294+
})
295+
}
296+
},
297+
{
298+
id: 'test4',
299+
apply: api => {
300+
api.extendPackage({
301+
dependencies: {
302+
bar: 'expressjs/express#1234'
303+
}
304+
})
305+
}
306+
}
307+
] })
308+
309+
expect(logs.warn.some(([msg]) => {
310+
return (
311+
msg.match(/conflicting versions for project dependency "bar"/) &&
312+
msg.match(/expressjs\/express injected by generator "test3"/) &&
313+
msg.match(/expressjs\/express#1234 injected by generator "test4"/) &&
314+
msg.match(/Using version \(expressjs\/express\)/)
315+
)
316+
})).toBe(true)
317+
})
318+
212319
test('api: render fs directory', async () => {
213320
const generator = new Generator('/', { plugins: [
214321
{

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

+13-4
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@ module.exports = function resolveDeps (generatorId, to, from, sources) {
77
const r1 = to[name]
88
const r2 = from[name]
99
const sourceGeneratorId = sources[name]
10+
const isValidURI = r2.match(/^(?:file|git|git\+ssh|git\+http|git\+https|git\+file|https?):/) != null
11+
const isValidGitHub = r2.match(/^[^/]+\/[^/]+/) != null
1012

11-
if (!semver.validRange(r2)) {
13+
// if they are the same, do nothing. Helps when non semver type deps are used
14+
if (r1 === r2) continue
15+
16+
if (!isValidGitHub && !isValidURI && !semver.validRange(r2)) {
1217
warn(
1318
`invalid version range for dependency "${name}":\n\n` +
1419
`- ${r2} injected by generator "${generatorId}"`
@@ -20,17 +25,19 @@ module.exports = function resolveDeps (generatorId, to, from, sources) {
2025
res[name] = r2
2126
sources[name] = generatorId
2227
} else {
23-
const r = tryGetNewerRange(r1, r2)
28+
const r1semver = extractSemver(r1)
29+
const r2semver = extractSemver(r2)
30+
const r = tryGetNewerRange(r1semver, r2semver)
2431
const didGetNewer = !!r
2532
// if failed to infer newer version, use existing one because it's likely
2633
// built-in
27-
res[name] = didGetNewer ? r : r1
34+
res[name] = didGetNewer ? injectSemver(r2, r) : r1
2835
// if changed, update source
2936
if (res[name] === r2) {
3037
sources[name] = generatorId
3138
}
3239
// warn incompatible version requirements
33-
if (!semver.intersects(r1, r2)) {
40+
if (!semver.validRange(r1semver) || !semver.validRange(r2semver) || !semver.intersects(r1semver, r2semver)) {
3441
warn(
3542
`conflicting versions for project dependency "${name}":\n\n` +
3643
`- ${r1} injected by generator "${sourceGeneratorId}"\n` +
@@ -45,6 +52,8 @@ module.exports = function resolveDeps (generatorId, to, from, sources) {
4552

4653
const leadRE = /^(~|\^|>=?)/
4754
const rangeToVersion = r => r.replace(leadRE, '').replace(/x/g, '0')
55+
const extractSemver = r => r.replace(/^.+#semver:/, '')
56+
const injectSemver = (r, v) => semver.validRange(r) ? v : r.replace(/#semver:.+$/, `#semver:${v}`)
4857

4958
function tryGetNewerRange (r1, r2) {
5059
const v1 = rangeToVersion(r1)

0 commit comments

Comments
 (0)
Please sign in to comment.