Skip to content

Commit

Permalink
feat: npm repo support repository.directory field
Browse files Browse the repository at this point in the history
Related: #140

PR-URL: #163
Credit: @ybiquitous
Close: #163
Reviewd-By: @isaacs
  • Loading branch information
ybiquitous authored and isaacs committed Aug 4, 2020
1 parent 92fda43 commit ebf7ac9
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 42 deletions.
2 changes: 1 addition & 1 deletion lib/repo.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ const getRepo = async pkg => {
}

const info = hostedFromMani(mani)
const url = info ? info.browse() : unknownHostedUrl(rurl)
const url = info ? info.browse(mani.repository.directory) : unknownHostedUrl(rurl)

if (!url) {
throw Object.assign(new Error('no repository: could not get url'), {
Expand Down
9 changes: 9 additions & 0 deletions test/lib/repo.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,14 @@ const pacote = {
repository: { url: 'git+https://gothib.com/foo/unhostedgithttpsobj' }
}

: spec === 'directory' ? {
repository: {
type: 'git',
url: 'git+https://github.com/foo/test-repo-with-directory.git',
directory: 'some/directory'
}
}

: spec === '.' ? {
name: 'thispkg',
version: '1.2.3',
Expand Down Expand Up @@ -143,6 +151,7 @@ t.test('open repo urls', t => {
unhostedgitsshobj: 'https://gothib.com/foo/unhostedgitsshobj',
unhostedgithttpobj: 'http://gothib.com/foo/unhostedgithttpobj',
unhostedgithttpsobj: 'https://gothib.com/foo/unhostedgithttpsobj',
directory: 'https://github.com/foo/test-repo-with-directory/tree/master/some/directory',
'.': 'https://example.com/thispkg'
}
const keys = Object.keys(expect)
Expand Down
119 changes: 78 additions & 41 deletions test/tap/repo.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,16 @@ var test = require('tap').test
var rimraf = require('rimraf')
var fs = require('fs')
var path = require('path')
var fakeBrowser = path.join(common.pkg, '_script.sh')
var outFile = path.join(common.pkg, '_output')
var opts = { cwd: common.pkg }
var mkdirp = require('mkdirp')
var fakeBrowser = path.join(__dirname, '_script.sh')
var outFile = path.join(__dirname, '/_output')

var opts = { cwd: __dirname }

common.pendIfWindows('This is trickier to convert without opening new shells')

test('setup', function (t) {
mkdirp.sync(common.pkg)
var s = '#!/usr/bin/env bash\n' +
'echo "$@" > ' + JSON.stringify(common.pkg) + '/_output\n'
'echo "$@" > ' + JSON.stringify(__dirname) + '/_output\n'
fs.writeFileSync(fakeBrowser, s, 'ascii')
fs.chmodSync(fakeBrowser, '0755')
t.pass('made script')
Expand All @@ -41,41 +40,6 @@ test('npm repo underscore', function (t) {
})
})

test('npm repo underscore --json', function (t) {
mr({ port: common.port }, function (er, s) {
common.npm([
'repo', 'underscore',
'--json',
'--registry=' + common.registry,
'--loglevel=silent',
'--no-browser'
], opts, function (err, code, stdout, stderr) {
t.ifError(err, 'repo command ran without error')
t.equal(code, 0, 'exit ok')
t.matchSnapshot(stdout, 'should print json result')
s.close()
t.end()
})
})
})

test('npm repo underscore --no-browser', function (t) {
mr({ port: common.port }, function (er, s) {
common.npm([
'repo', 'underscore',
'--no-browser',
'--registry=' + common.registry,
'--loglevel=silent'
], opts, function (err, code, stdout, stderr) {
t.ifError(err, 'repo command ran without error')
t.equal(code, 0, 'exit ok')
t.matchSnapshot(stdout, 'should print alternative msg')
s.close()
t.end()
})
})
})

test('npm repo optimist - github (https://)', function (t) {
mr({ port: common.port }, function (er, s) {
common.npm([
Expand Down Expand Up @@ -168,6 +132,79 @@ test('npm repo test-repo-url-ssh - non-github (ssh://)', function (t) {
})
})

/* ----- Test by new mock registry: BEGIN ----- */

const Tacks = require('tacks')
const mockTar = require('../util/mock-tarball.js')

const { Dir, File } = Tacks
const testDir = path.join(__dirname, path.basename(__filename, '.js'))

let server
test('setup mocked registry', t => {
common.fakeRegistry.compat({}, (err, s) => {
t.ifError(err, 'registry mocked successfully')
server = s
t.end()
})
})

test('npm repo test-repo-with-directory', t => {
const fixture = new Tacks(Dir({
'package.json': File({})
}))
fixture.create(testDir)
const packument = {
name: 'test-repo-with-directory',
'dist-tags': { latest: '1.2.3' },
versions: {
'1.2.3': {
name: 'test-repo-with-directory',
version: '1.2.3',
dist: {
tarball: `${server.registry}/test-repo-with-directory/-/test-repo-with-directory-1.2.3.tgz`
},
repository: {
type: 'git',
url: 'git+https://github.com/foo/test-repo-with-directory.git',
directory: 'some/directory'
}
}
}
}
server.get('/test-repo-with-directory').reply(200, packument)
return mockTar({
'package.json': JSON.stringify({
name: 'test-repo-with-directory',
version: '1.2.3'
})
}).then(tarball => {
server.get('/test-repo-with-directory/-/test-repo-with-directory-1.2.3.tgz').reply(200, tarball)
return common.npm([
'repo', 'test-repo-with-directory',
'--registry=' + server.registry,
'--loglevel=silent',
'--browser=' + fakeBrowser
])
}).then(([code, stdout, stderr]) => {
t.equal(code, 0)
t.comment(stdout)
t.comment(stderr)

const res = fs.readFileSync(outFile, 'ascii')
t.equal(res, 'https://github.com/foo/test-repo-with-directory/tree/master/some/directory\n')
rimraf.sync(outFile)
})
})

test('cleanup mocked registry', t => {
server.close()
rimraf.sync(testDir)
t.end()
})

/* ----- Test by new mock registry: END ----- */

test('cleanup', function (t) {
fs.unlinkSync(fakeBrowser)
t.pass('cleaned up')
Expand Down

0 comments on commit ebf7ac9

Please sign in to comment.