123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- const log = require('npmlog')
- const pacote = require('pacote')
- const { URL } = require('url')
- const hostedFromMani = require('./utils/hosted-git-info-from-manifest.js')
- const openUrl = require('./utils/open-url.js')
- const BaseCommand = require('./base-command.js')
- class Repo extends BaseCommand {
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get description () {
- return 'Open package repository page in the browser'
- }
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get name () {
- return 'repo'
- }
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get params () {
- return ['browser', 'workspace', 'workspaces', 'include-workspace-root']
- }
- /* istanbul ignore next - see test/lib/load-all-commands.js */
- static get usage () {
- return ['[<pkgname> [<pkgname> ...]]']
- }
- exec (args, cb) {
- this.repo(args).then(() => cb()).catch(cb)
- }
- execWorkspaces (args, filters, cb) {
- this.repoWorkspaces(args, filters).then(() => cb()).catch(cb)
- }
- async repo (args) {
- if (!args || !args.length)
- args = ['.']
- await Promise.all(args.map(pkg => this.get(pkg)))
- }
- async repoWorkspaces (args, filters) {
- await this.setWorkspaces(filters)
- return this.repo(this.workspacePaths)
- }
- async get (pkg) {
- // XXX It is very odd that `where` is how pacote knows to look anywhere
- // other than the cwd.
- const opts = {
- ...this.npm.flatOptions,
- where: this.npm.localPrefix,
- fullMetadata: true,
- }
- const mani = await pacote.manifest(pkg, opts)
- const r = mani.repository
- const rurl = !r ? null
- : typeof r === 'string' ? r
- : typeof r === 'object' && typeof r.url === 'string' ? r.url
- : null
- if (!rurl) {
- throw Object.assign(new Error('no repository'), {
- pkgid: pkg,
- })
- }
- const info = hostedFromMani(mani)
- const url = info ?
- info.browse(mani.repository.directory) : unknownHostedUrl(rurl)
- if (!url) {
- throw Object.assign(new Error('no repository: could not get url'), {
- pkgid: pkg,
- })
- }
- log.silly('docs', 'url', url)
- await openUrl(this.npm, url, `${mani.name} repo available at the following URL`)
- }
- }
- module.exports = Repo
- const unknownHostedUrl = url => {
- try {
- const {
- protocol,
- hostname,
- pathname,
- } = new URL(url)
- /* istanbul ignore next - URL ctor should prevent this */
- if (!protocol || !hostname)
- return null
- const proto = /(git\+)http:$/.test(protocol) ? 'http:' : 'https:'
- const path = pathname.replace(/\.git$/, '')
- return `${proto}//${hostname}${path}`
- } catch (e) {
- return null
- }
- }
|