Skip to content

Commit 5c2fefd

Browse files
committed
feat: handle various styles of repository in the packument
1 parent 007ff95 commit 5c2fefd

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

lib/loader.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@ const Utils = require('./utils');
1212
const internals = {};
1313

1414

15+
internals.parseRepository = (packument) => {
16+
17+
if (typeof packument.repository === 'string') {
18+
return packument.repository;
19+
}
20+
21+
if (!packument.repository || !packument.repository.url) {
22+
throw new Error(`Unable to determine the git repository for ${packument.name}`);
23+
}
24+
25+
return packument.repository.url;
26+
};
27+
28+
1529
internals.createPackageLoader = async (packageName) => {
1630

1731
try {
@@ -20,7 +34,9 @@ internals.createPackageLoader = async (packageName) => {
2034
'user-agent': `${Package.name}@${Package.version}, see ${Package.homepage}`
2135
});
2236

23-
return internals.createRepositoryLoader(packument.repository.url);
37+
const repository = internals.parseRepository(packument);
38+
39+
return internals.createRepositoryLoader(repository);
2440
}
2541
catch (err) {
2642

test/index.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,61 @@ describe('node-support', () => {
528528
await expect(NodeSupport.detect({ packageName: 'node-support' }))
529529
.to.reject('Something went wrong');
530530
});
531+
532+
it('throws when packument does not contain a `repository` field', async () => {
533+
534+
Nock('https://registry.npmjs.org')
535+
.get('/node-support')
536+
.reply(200, JSON.stringify({ name: 'node-support' }));
537+
538+
await expect(NodeSupport.detect({ packageName: 'node-support' }))
539+
.to.reject('Unable to determine the git repository for node-support');
540+
});
541+
542+
it('throws when packument does not contain a `repository.url` field', async () => {
543+
544+
Nock('https://registry.npmjs.org')
545+
.get('/node-support')
546+
.reply(200, JSON.stringify({ name: 'node-support', repository: {} }));
547+
548+
await expect(NodeSupport.detect({ packageName: 'node-support' }))
549+
.to.reject('Unable to determine the git repository for node-support');
550+
});
551+
552+
it('returns node versions from `.travis.yml` in the package repository (string repository)', async () => {
553+
554+
listRemoteStub
555+
.returns('9cef39d21ad229dea4b10295f55b0d9a83800b23\tHEAD\n');
556+
557+
Nock('https://raw.githubusercontent.com')
558+
.get('/pkgjs/node-support/HEAD/package.json')
559+
.reply(200, Fs.readFileSync(Path.join(__dirname, '..', 'package.json')))
560+
.get('/pkgjs/node-support/HEAD/.travis.yml')
561+
.reply(200, Fs.readFileSync(Path.join(__dirname, '..', '.travis.yml')));
562+
563+
Nock('https://registry.npmjs.org')
564+
.get('/node-support')
565+
.reply(200, JSON.stringify({
566+
name: 'node-support',
567+
repository: 'git+https://github.com/pkgjs/node-support.git'
568+
}));
569+
570+
const result = await NodeSupport.detect({ packageName: 'node-support' });
571+
572+
expect(listRemoteStub.callCount).to.equal(1);
573+
expect(listRemoteStub.args[0]).to.equal([['http://github.com/pkgjs/node-support.git', 'HEAD']]);
574+
575+
expect(result).to.equal({
576+
name: 'node-support',
577+
version: '0.0.0-development',
578+
commit: '9cef39d21ad229dea4b10295f55b0d9a83800b23',
579+
timestamp: 1580673602000,
580+
travis: {
581+
raw: ['10', '12', '13']
582+
},
583+
engines: '>=10'
584+
});
585+
});
531586
});
532587
});
533588
});

0 commit comments

Comments
 (0)