Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Karrys <luke@lukekarrys.com>2022-10-12 23:20:11 +0300
committerNathan Fritz <fritzy@github.com>2022-10-13 03:20:06 +0300
commit2a740b14c3789d80825b1345f2e99765fcb90351 (patch)
treeb035aa91eca377f1caef62a3ba42372f0f1b1dd6
parent9f4d3672644761a13ec0924e8a3e22385c831ad0 (diff)
deps: hosted-git-info@6.0.0
BREAKING CHANGE: links generated from git urls will now use `HEAD` instead of `master` as the default ref
-rw-r--r--node_modules/.gitignore6
-rw-r--r--node_modules/hosted-git-info/lib/from-url.js196
-rw-r--r--node_modules/hosted-git-info/lib/hosts.js228
-rw-r--r--node_modules/hosted-git-info/lib/index.js352
-rw-r--r--node_modules/hosted-git-info/package.json17
-rw-r--r--node_modules/normalize-package-data/node_modules/hosted-git-info/LICENSE13
-rw-r--r--node_modules/normalize-package-data/node_modules/hosted-git-info/lib/git-host-info.js (renamed from node_modules/hosted-git-info/lib/git-host-info.js)0
-rw-r--r--node_modules/normalize-package-data/node_modules/hosted-git-info/lib/git-host.js (renamed from node_modules/hosted-git-info/lib/git-host.js)0
-rw-r--r--node_modules/normalize-package-data/node_modules/hosted-git-info/lib/index.js248
-rw-r--r--node_modules/normalize-package-data/node_modules/hosted-git-info/package.json58
-rw-r--r--node_modules/npm-package-arg/node_modules/hosted-git-info/LICENSE13
-rw-r--r--node_modules/npm-package-arg/node_modules/hosted-git-info/lib/git-host-info.js192
-rw-r--r--node_modules/npm-package-arg/node_modules/hosted-git-info/lib/git-host.js114
-rw-r--r--node_modules/npm-package-arg/node_modules/hosted-git-info/lib/index.js248
-rw-r--r--node_modules/npm-package-arg/node_modules/hosted-git-info/package.json58
-rw-r--r--package-lock.json45
-rw-r--r--package.json2
-rw-r--r--test/lib/commands/repo.js2
18 files changed, 1565 insertions, 227 deletions
diff --git a/node_modules/.gitignore b/node_modules/.gitignore
index 3ca5d9de9..f99ca28d5 100644
--- a/node_modules/.gitignore
+++ b/node_modules/.gitignore
@@ -157,10 +157,16 @@
!/node-gyp/node_modules/nopt
!/nopt
!/normalize-package-data
+!/normalize-package-data/node_modules/
+/normalize-package-data/node_modules/*
+!/normalize-package-data/node_modules/hosted-git-info
!/npm-audit-report
!/npm-install-checks
!/npm-normalize-package-bin
!/npm-package-arg
+!/npm-package-arg/node_modules/
+/npm-package-arg/node_modules/*
+!/npm-package-arg/node_modules/hosted-git-info
!/npm-packlist
!/npm-pick-manifest
!/npm-pick-manifest/node_modules/
diff --git a/node_modules/hosted-git-info/lib/from-url.js b/node_modules/hosted-git-info/lib/from-url.js
new file mode 100644
index 000000000..b3e519e1f
--- /dev/null
+++ b/node_modules/hosted-git-info/lib/from-url.js
@@ -0,0 +1,196 @@
+'use strict'
+
+const url = require('url')
+
+const safeUrl = (u) => {
+ try {
+ return new url.URL(u)
+ } catch {
+ // this fn should never throw
+ }
+}
+
+const lastIndexOfBefore = (str, char, beforeChar) => {
+ const startPosition = str.indexOf(beforeChar)
+ return str.lastIndexOf(char, startPosition > -1 ? startPosition : Infinity)
+}
+
+// accepts input like git:github.com:user/repo and inserts the // after the first :
+const correctProtocol = (arg, protocols) => {
+ const firstColon = arg.indexOf(':')
+ const proto = arg.slice(0, firstColon + 1)
+ if (Object.prototype.hasOwnProperty.call(protocols, proto)) {
+ return arg
+ }
+
+ const firstAt = arg.indexOf('@')
+ if (firstAt > -1) {
+ if (firstAt > firstColon) {
+ return `git+ssh://${arg}`
+ } else {
+ return arg
+ }
+ }
+
+ const doubleSlash = arg.indexOf('//')
+ if (doubleSlash === firstColon + 1) {
+ return arg
+ }
+
+ return `${arg.slice(0, firstColon + 1)}//${arg.slice(firstColon + 1)}`
+}
+
+// look for github shorthand inputs, such as npm/cli
+const isGitHubShorthand = (arg) => {
+ // it cannot contain whitespace before the first #
+ // it cannot start with a / because that's probably an absolute file path
+ // but it must include a slash since repos are username/repository
+ // it cannot start with a . because that's probably a relative file path
+ // it cannot start with an @ because that's a scoped package if it passes the other tests
+ // it cannot contain a : before a # because that tells us that there's a protocol
+ // a second / may not exist before a #
+ const firstHash = arg.indexOf('#')
+ const firstSlash = arg.indexOf('/')
+ const secondSlash = arg.indexOf('/', firstSlash + 1)
+ const firstColon = arg.indexOf(':')
+ const firstSpace = /\s/.exec(arg)
+ const firstAt = arg.indexOf('@')
+
+ const spaceOnlyAfterHash = !firstSpace || (firstHash > -1 && firstSpace.index > firstHash)
+ const atOnlyAfterHash = firstAt === -1 || (firstHash > -1 && firstAt > firstHash)
+ const colonOnlyAfterHash = firstColon === -1 || (firstHash > -1 && firstColon > firstHash)
+ const secondSlashOnlyAfterHash = secondSlash === -1 || (firstHash > -1 && secondSlash > firstHash)
+ const hasSlash = firstSlash > 0
+ // if a # is found, what we really want to know is that the character
+ // immediately before # is not a /
+ const doesNotEndWithSlash = firstHash > -1 ? arg[firstHash - 1] !== '/' : !arg.endsWith('/')
+ const doesNotStartWithDot = !arg.startsWith('.')
+
+ return spaceOnlyAfterHash && hasSlash && doesNotEndWithSlash &&
+ doesNotStartWithDot && atOnlyAfterHash && colonOnlyAfterHash &&
+ secondSlashOnlyAfterHash
+}
+
+// attempt to correct an scp style url so that it will parse with `new URL()`
+const correctUrl = (giturl) => {
+ // ignore @ that come after the first hash since the denotes the start
+ // of a committish which can contain @ characters
+ const firstAt = lastIndexOfBefore(giturl, '@', '#')
+ // ignore colons that come after the hash since that could include colons such as:
+ // git@github.com:user/package-2#semver:^1.0.0
+ const lastColonBeforeHash = lastIndexOfBefore(giturl, ':', '#')
+
+ if (lastColonBeforeHash > firstAt) {
+ // the last : comes after the first @ (or there is no @)
+ // like it would in:
+ // proto://hostname.com:user/repo
+ // username@hostname.com:user/repo
+ // :password@hostname.com:user/repo
+ // username:password@hostname.com:user/repo
+ // proto://username@hostname.com:user/repo
+ // proto://:password@hostname.com:user/repo
+ // proto://username:password@hostname.com:user/repo
+ // then we replace the last : with a / to create a valid path
+ giturl = giturl.slice(0, lastColonBeforeHash) + '/' + giturl.slice(lastColonBeforeHash + 1)
+ }
+
+ if (lastIndexOfBefore(giturl, ':', '#') === -1 && giturl.indexOf('//') === -1) {
+ // we have no : at all
+ // as it would be in:
+ // username@hostname.com/user/repo
+ // then we prepend a protocol
+ giturl = `git+ssh://${giturl}`
+ }
+
+ return giturl
+}
+
+module.exports = (giturl, opts, { gitHosts, protocols }) => {
+ if (!giturl) {
+ return
+ }
+
+ const correctedUrl = isGitHubShorthand(giturl)
+ ? `github:${giturl}`
+ : correctProtocol(giturl, protocols)
+ const parsed = safeUrl(correctedUrl) || safeUrl(correctUrl(correctedUrl))
+ if (!parsed) {
+ return
+ }
+
+ const gitHostShortcut = gitHosts.byShortcut[parsed.protocol]
+ const gitHostDomain = gitHosts.byDomain[parsed.hostname.startsWith('www.')
+ ? parsed.hostname.slice(4)
+ : parsed.hostname]
+ const gitHostName = gitHostShortcut || gitHostDomain
+ if (!gitHostName) {
+ return
+ }
+
+ const gitHostInfo = gitHosts[gitHostShortcut || gitHostDomain]
+ let auth = null
+ if (protocols[parsed.protocol]?.auth && (parsed.username || parsed.password)) {
+ auth = `${parsed.username}${parsed.password ? ':' + parsed.password : ''}`
+ }
+
+ let committish = null
+ let user = null
+ let project = null
+ let defaultRepresentation = null
+
+ try {
+ if (gitHostShortcut) {
+ let pathname = parsed.pathname.startsWith('/') ? parsed.pathname.slice(1) : parsed.pathname
+ const firstAt = pathname.indexOf('@')
+ // we ignore auth for shortcuts, so just trim it out
+ if (firstAt > -1) {
+ pathname = pathname.slice(firstAt + 1)
+ }
+
+ const lastSlash = pathname.lastIndexOf('/')
+ if (lastSlash > -1) {
+ user = decodeURIComponent(pathname.slice(0, lastSlash))
+ // we want nulls only, never empty strings
+ if (!user) {
+ user = null
+ }
+ project = decodeURIComponent(pathname.slice(lastSlash + 1))
+ } else {
+ project = decodeURIComponent(pathname)
+ }
+
+ if (project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ if (parsed.hash) {
+ committish = decodeURIComponent(parsed.hash.slice(1))
+ }
+
+ defaultRepresentation = 'shortcut'
+ } else {
+ if (!gitHostInfo.protocols.includes(parsed.protocol)) {
+ return
+ }
+
+ const segments = gitHostInfo.extract(parsed)
+ if (!segments) {
+ return
+ }
+
+ user = segments.user && decodeURIComponent(segments.user)
+ project = decodeURIComponent(segments.project)
+ committish = decodeURIComponent(segments.committish)
+ defaultRepresentation = protocols[parsed.protocol]?.name || parsed.protocol.slice(0, -1)
+ }
+ } catch (err) {
+ /* istanbul ignore else */
+ if (err instanceof URIError) {
+ return
+ } else {
+ throw err
+ }
+ }
+
+ return [gitHostName, user, auth, project, committish, defaultRepresentation, opts]
+}
diff --git a/node_modules/hosted-git-info/lib/hosts.js b/node_modules/hosted-git-info/lib/hosts.js
new file mode 100644
index 000000000..013712b78
--- /dev/null
+++ b/node_modules/hosted-git-info/lib/hosts.js
@@ -0,0 +1,228 @@
+/* eslint-disable max-len */
+
+'use strict'
+
+const maybeJoin = (...args) => args.every(arg => arg) ? args.join('') : ''
+const maybeEncode = (arg) => arg ? encodeURIComponent(arg) : ''
+const formatHashFragment = (f) => f.toLowerCase().replace(/^\W+|\/|\W+$/g, '').replace(/\W+/g, '-')
+
+const defaults = {
+ sshtemplate: ({ domain, user, project, committish }) =>
+ `git@${domain}:${user}/${project}.git${maybeJoin('#', committish)}`,
+ sshurltemplate: ({ domain, user, project, committish }) =>
+ `git+ssh://git@${domain}/${user}/${project}.git${maybeJoin('#', committish)}`,
+ edittemplate: ({ domain, user, project, committish, editpath, path }) =>
+ `https://${domain}/${user}/${project}${maybeJoin('/', editpath, '/', maybeEncode(committish || 'HEAD'), '/', path)}`,
+ browsetemplate: ({ domain, user, project, committish, treepath }) =>
+ `https://${domain}/${user}/${project}${maybeJoin('/', treepath, '/', maybeEncode(committish))}`,
+ browsetreetemplate: ({ domain, user, project, committish, treepath, path, fragment, hashformat }) =>
+ `https://${domain}/${user}/${project}/${treepath}/${maybeEncode(committish || 'HEAD')}/${path}${maybeJoin('#', hashformat(fragment || ''))}`,
+ browseblobtemplate: ({ domain, user, project, committish, blobpath, path, fragment, hashformat }) =>
+ `https://${domain}/${user}/${project}/${blobpath}/${maybeEncode(committish || 'HEAD')}/${path}${maybeJoin('#', hashformat(fragment || ''))}`,
+ docstemplate: ({ domain, user, project, treepath, committish }) =>
+ `https://${domain}/${user}/${project}${maybeJoin('/', treepath, '/', maybeEncode(committish))}#readme`,
+ httpstemplate: ({ auth, domain, user, project, committish }) =>
+ `git+https://${maybeJoin(auth, '@')}${domain}/${user}/${project}.git${maybeJoin('#', committish)}`,
+ filetemplate: ({ domain, user, project, committish, path }) =>
+ `https://${domain}/${user}/${project}/raw/${maybeEncode(committish || 'HEAD')}/${path}`,
+ shortcuttemplate: ({ type, user, project, committish }) =>
+ `${type}:${user}/${project}${maybeJoin('#', committish)}`,
+ pathtemplate: ({ user, project, committish }) =>
+ `${user}/${project}${maybeJoin('#', committish)}`,
+ bugstemplate: ({ domain, user, project }) =>
+ `https://${domain}/${user}/${project}/issues`,
+ hashformat: formatHashFragment,
+}
+
+const hosts = {}
+hosts.github = {
+ // First two are insecure and generally shouldn't be used any more, but
+ // they are still supported.
+ protocols: ['git:', 'http:', 'git+ssh:', 'git+https:', 'ssh:', 'https:'],
+ domain: 'github.com',
+ treepath: 'tree',
+ blobpath: 'blob',
+ editpath: 'edit',
+ filetemplate: ({ auth, user, project, committish, path }) =>
+ `https://${maybeJoin(auth, '@')}raw.githubusercontent.com/${user}/${project}/${maybeEncode(committish || 'HEAD')}/${path}`,
+ gittemplate: ({ auth, domain, user, project, committish }) =>
+ `git://${maybeJoin(auth, '@')}${domain}/${user}/${project}.git${maybeJoin('#', committish)}`,
+ tarballtemplate: ({ domain, user, project, committish }) =>
+ `https://codeload.${domain}/${user}/${project}/tar.gz/${maybeEncode(committish || 'HEAD')}`,
+ extract: (url) => {
+ let [, user, project, type, committish] = url.pathname.split('/', 5)
+ if (type && type !== 'tree') {
+ return
+ }
+
+ if (!type) {
+ committish = url.hash.slice(1)
+ }
+
+ if (project && project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ if (!user || !project) {
+ return
+ }
+
+ return { user, project, committish }
+ },
+}
+
+hosts.bitbucket = {
+ protocols: ['git+ssh:', 'git+https:', 'ssh:', 'https:'],
+ domain: 'bitbucket.org',
+ treepath: 'src',
+ blobpath: 'src',
+ editpath: '?mode=edit',
+ edittemplate: ({ domain, user, project, committish, treepath, path, editpath }) =>
+ `https://${domain}/${user}/${project}${maybeJoin('/', treepath, '/', maybeEncode(committish || 'HEAD'), '/', path, editpath)}`,
+ tarballtemplate: ({ domain, user, project, committish }) =>
+ `https://${domain}/${user}/${project}/get/${maybeEncode(committish || 'HEAD')}.tar.gz`,
+ extract: (url) => {
+ let [, user, project, aux] = url.pathname.split('/', 4)
+ if (['get'].includes(aux)) {
+ return
+ }
+
+ if (project && project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ if (!user || !project) {
+ return
+ }
+
+ return { user, project, committish: url.hash.slice(1) }
+ },
+}
+
+hosts.gitlab = {
+ protocols: ['git+ssh:', 'git+https:', 'ssh:', 'https:'],
+ domain: 'gitlab.com',
+ treepath: 'tree',
+ blobpath: 'tree',
+ editpath: '-/edit',
+ httpstemplate: ({ auth, domain, user, project, committish }) =>
+ `git+https://${maybeJoin(auth, '@')}${domain}/${user}/${project}.git${maybeJoin('#', committish)}`,
+ tarballtemplate: ({ domain, user, project, committish }) =>
+ `https://${domain}/${user}/${project}/repository/archive.tar.gz?ref=${maybeEncode(committish || 'HEAD')}`,
+ extract: (url) => {
+ const path = url.pathname.slice(1)
+ if (path.includes('/-/') || path.includes('/archive.tar.gz')) {
+ return
+ }
+
+ const segments = path.split('/')
+ let project = segments.pop()
+ if (project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ const user = segments.join('/')
+ if (!user || !project) {
+ return
+ }
+
+ return { user, project, committish: url.hash.slice(1) }
+ },
+}
+
+hosts.gist = {
+ protocols: ['git:', 'git+ssh:', 'git+https:', 'ssh:', 'https:'],
+ domain: 'gist.github.com',
+ editpath: 'edit',
+ sshtemplate: ({ domain, project, committish }) =>
+ `git@${domain}:${project}.git${maybeJoin('#', committish)}`,
+ sshurltemplate: ({ domain, project, committish }) =>
+ `git+ssh://git@${domain}/${project}.git${maybeJoin('#', committish)}`,
+ edittemplate: ({ domain, user, project, committish, editpath }) =>
+ `https://${domain}/${user}/${project}${maybeJoin('/', maybeEncode(committish))}/${editpath}`,
+ browsetemplate: ({ domain, project, committish }) =>
+ `https://${domain}/${project}${maybeJoin('/', maybeEncode(committish))}`,
+ browsetreetemplate: ({ domain, project, committish, path, hashformat }) =>
+ `https://${domain}/${project}${maybeJoin('/', maybeEncode(committish))}${maybeJoin('#', hashformat(path))}`,
+ browseblobtemplate: ({ domain, project, committish, path, hashformat }) =>
+ `https://${domain}/${project}${maybeJoin('/', maybeEncode(committish))}${maybeJoin('#', hashformat(path))}`,
+ docstemplate: ({ domain, project, committish }) =>
+ `https://${domain}/${project}${maybeJoin('/', maybeEncode(committish))}`,
+ httpstemplate: ({ domain, project, committish }) =>
+ `git+https://${domain}/${project}.git${maybeJoin('#', committish)}`,
+ filetemplate: ({ user, project, committish, path }) =>
+ `https://gist.githubusercontent.com/${user}/${project}/raw${maybeJoin('/', maybeEncode(committish))}/${path}`,
+ shortcuttemplate: ({ type, project, committish }) =>
+ `${type}:${project}${maybeJoin('#', committish)}`,
+ pathtemplate: ({ project, committish }) =>
+ `${project}${maybeJoin('#', committish)}`,
+ bugstemplate: ({ domain, project }) =>
+ `https://${domain}/${project}`,
+ gittemplate: ({ domain, project, committish }) =>
+ `git://${domain}/${project}.git${maybeJoin('#', committish)}`,
+ tarballtemplate: ({ project, committish }) =>
+ `https://codeload.github.com/gist/${project}/tar.gz/${maybeEncode(committish || 'HEAD')}`,
+ extract: (url) => {
+ let [, user, project, aux] = url.pathname.split('/', 4)
+ if (aux === 'raw') {
+ return
+ }
+
+ if (!project) {
+ if (!user) {
+ return
+ }
+
+ project = user
+ user = null
+ }
+
+ if (project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ return { user, project, committish: url.hash.slice(1) }
+ },
+ hashformat: function (fragment) {
+ return fragment && 'file-' + formatHashFragment(fragment)
+ },
+}
+
+hosts.sourcehut = {
+ protocols: ['git+ssh:', 'https:'],
+ domain: 'git.sr.ht',
+ treepath: 'tree',
+ blobpath: 'tree',
+ filetemplate: ({ domain, user, project, committish, path }) =>
+ `https://${domain}/${user}/${project}/blob/${maybeEncode(committish) || 'HEAD'}/${path}`,
+ httpstemplate: ({ domain, user, project, committish }) =>
+ `https://${domain}/${user}/${project}.git${maybeJoin('#', committish)}`,
+ tarballtemplate: ({ domain, user, project, committish }) =>
+ `https://${domain}/${user}/${project}/archive/${maybeEncode(committish) || 'HEAD'}.tar.gz`,
+ bugstemplate: ({ user, project }) =>
+ `https://todo.sr.ht/${user}/${project}`,
+ extract: (url) => {
+ let [, user, project, aux] = url.pathname.split('/', 4)
+
+ // tarball url
+ if (['archive'].includes(aux)) {
+ return
+ }
+
+ if (project && project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ if (!user || !project) {
+ return
+ }
+
+ return { user, project, committish: url.hash.slice(1) }
+ },
+}
+
+for (const [name, host] of Object.entries(hosts)) {
+ hosts[name] = Object.assign({}, defaults, host)
+}
+
+module.exports = hosts
diff --git a/node_modules/hosted-git-info/lib/index.js b/node_modules/hosted-git-info/lib/index.js
index d5d63c668..89805ebb4 100644
--- a/node_modules/hosted-git-info/lib/index.js
+++ b/node_modules/hosted-git-info/lib/index.js
@@ -1,248 +1,174 @@
'use strict'
-const url = require('url')
-const gitHosts = require('./git-host-info.js')
-const GitHost = module.exports = require('./git-host.js')
+
const LRU = require('lru-cache')
+const hosts = require('./hosts.js')
+const fromUrl = require('./from-url.js')
+
const cache = new LRU({ max: 1000 })
-const protocolToRepresentationMap = {
- 'git+ssh:': 'sshurl',
- 'git+https:': 'https',
- 'ssh:': 'sshurl',
- 'git:': 'git',
-}
+class GitHost {
+ constructor (type, user, auth, project, committish, defaultRepresentation, opts = {}) {
+ Object.assign(this, GitHost.#gitHosts[type], {
+ type,
+ user,
+ auth,
+ project,
+ committish,
+ default: defaultRepresentation,
+ opts,
+ })
+ }
-function protocolToRepresentation (protocol) {
- return protocolToRepresentationMap[protocol] || protocol.slice(0, -1)
-}
+ static #gitHosts = { byShortcut: {}, byDomain: {} }
+ static #protocols = {
+ 'git+ssh:': { name: 'sshurl' },
+ 'ssh:': { name: 'sshurl' },
+ 'git+https:': { name: 'https', auth: true },
+ 'git:': { auth: true },
+ 'http:': { auth: true },
+ 'https:': { auth: true },
+ 'git+http:': { auth: true },
+ }
-const authProtocols = {
- 'git:': true,
- 'https:': true,
- 'git+https:': true,
- 'http:': true,
- 'git+http:': true,
-}
+ static addHost (name, host) {
+ GitHost.#gitHosts[name] = host
+ GitHost.#gitHosts.byDomain[host.domain] = name
+ GitHost.#gitHosts.byShortcut[`${name}:`] = name
+ GitHost.#protocols[`${name}:`] = { name }
+ }
-const knownProtocols = Object.keys(gitHosts.byShortcut)
- .concat(['http:', 'https:', 'git:', 'git+ssh:', 'git+https:', 'ssh:'])
+ static fromUrl (giturl, opts) {
+ if (typeof giturl !== 'string') {
+ return
+ }
-module.exports.fromUrl = function (giturl, opts) {
- if (typeof giturl !== 'string') {
- return
- }
+ const key = giturl + JSON.stringify(opts || {})
- const key = giturl + JSON.stringify(opts || {})
+ if (!cache.has(key)) {
+ const hostArgs = fromUrl(giturl, opts, {
+ gitHosts: GitHost.#gitHosts,
+ protocols: GitHost.#protocols,
+ })
+ cache.set(key, hostArgs ? new GitHost(...hostArgs) : undefined)
+ }
- if (!cache.has(key)) {
- cache.set(key, fromUrl(giturl, opts))
+ return cache.get(key)
}
- return cache.get(key)
-}
+ #fill (template, opts) {
+ if (typeof template !== 'function') {
+ return null
+ }
+
+ const options = { ...this, ...this.opts, ...opts }
-function fromUrl (giturl, opts) {
- if (!giturl) {
- return
- }
-
- const correctedUrl = isGitHubShorthand(giturl) ? 'github:' + giturl : correctProtocol(giturl)
- const parsed = parseGitUrl(correctedUrl)
- if (!parsed) {
- return parsed
- }
-
- const gitHostShortcut = gitHosts.byShortcut[parsed.protocol]
- const gitHostDomain =
- gitHosts.byDomain[parsed.hostname.startsWith('www.') ?
- parsed.hostname.slice(4) :
- parsed.hostname]
- const gitHostName = gitHostShortcut || gitHostDomain
- if (!gitHostName) {
- return
- }
-
- const gitHostInfo = gitHosts[gitHostShortcut || gitHostDomain]
- let auth = null
- if (authProtocols[parsed.protocol] && (parsed.username || parsed.password)) {
- auth = `${parsed.username}${parsed.password ? ':' + parsed.password : ''}`
- }
-
- let committish = null
- let user = null
- let project = null
- let defaultRepresentation = null
-
- try {
- if (gitHostShortcut) {
- let pathname = parsed.pathname.startsWith('/') ? parsed.pathname.slice(1) : parsed.pathname
- const firstAt = pathname.indexOf('@')
- // we ignore auth for shortcuts, so just trim it out
- if (firstAt > -1) {
- pathname = pathname.slice(firstAt + 1)
- }
-
- const lastSlash = pathname.lastIndexOf('/')
- if (lastSlash > -1) {
- user = decodeURIComponent(pathname.slice(0, lastSlash))
- // we want nulls only, never empty strings
- if (!user) {
- user = null
- }
- project = decodeURIComponent(pathname.slice(lastSlash + 1))
- } else {
- project = decodeURIComponent(pathname)
- }
-
- if (project.endsWith('.git')) {
- project = project.slice(0, -4)
- }
-
- if (parsed.hash) {
- committish = decodeURIComponent(parsed.hash.slice(1))
- }
-
- defaultRepresentation = 'shortcut'
- } else {
- if (!gitHostInfo.protocols.includes(parsed.protocol)) {
- return
- }
-
- const segments = gitHostInfo.extract(parsed)
- if (!segments) {
- return
- }
-
- user = segments.user && decodeURIComponent(segments.user)
- project = decodeURIComponent(segments.project)
- committish = decodeURIComponent(segments.committish)
- defaultRepresentation = protocolToRepresentation(parsed.protocol)
+ // the path should always be set so we don't end up with 'undefined' in urls
+ if (!options.path) {
+ options.path = ''
}
- } catch (err) {
- /* istanbul ignore else */
- if (err instanceof URIError) {
- return
- } else {
- throw err
+
+ // template functions will insert the leading slash themselves
+ if (options.path.startsWith('/')) {
+ options.path = options.path.slice(1)
+ }
+
+ if (options.noCommittish) {
+ options.committish = null
}
+
+ const result = template(options)
+ return options.noGitPlus && result.startsWith('git+') ? result.slice(4) : result
}
- return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts)
-}
+ hash () {
+ return this.committish ? `#${this.committish}` : ''
+ }
-// accepts input like git:github.com:user/repo and inserts the // after the first :
-const correctProtocol = (arg) => {
- const firstColon = arg.indexOf(':')
- const proto = arg.slice(0, firstColon + 1)
- if (knownProtocols.includes(proto)) {
- return arg
+ ssh (opts) {
+ return this.#fill(this.sshtemplate, opts)
}
- const firstAt = arg.indexOf('@')
- if (firstAt > -1) {
- if (firstAt > firstColon) {
- return `git+ssh://${arg}`
- } else {
- return arg
+ sshurl (opts) {
+ return this.#fill(this.sshurltemplate, opts)
+ }
+
+ browse (path, ...args) {
+ // not a string, treat path as opts
+ if (typeof path !== 'string') {
+ return this.#fill(this.browsetemplate, path)
}
+
+ if (typeof args[0] !== 'string') {
+ return this.#fill(this.browsetreetemplate, { ...args[0], path })
+ }
+
+ return this.#fill(this.browsetreetemplate, { ...args[1], fragment: args[0], path })
}
- const doubleSlash = arg.indexOf('//')
- if (doubleSlash === firstColon + 1) {
- return arg
+ // If the path is known to be a file, then browseFile should be used. For some hosts
+ // the url is the same as browse, but for others like GitHub a file can use both `/tree/`
+ // and `/blob/` in the path. When using a default committish of `HEAD` then the `/tree/`
+ // path will redirect to a specific commit. Using the `/blob/` path avoids this and
+ // does not redirect to a different commit.
+ browseFile (path, ...args) {
+ if (typeof args[0] !== 'string') {
+ return this.#fill(this.browseblobtemplate, { ...args[0], path })
+ }
+
+ return this.#fill(this.browseblobtemplate, { ...args[1], fragment: args[0], path })
}
- return arg.slice(0, firstColon + 1) + '//' + arg.slice(firstColon + 1)
-}
+ docs (opts) {
+ return this.#fill(this.docstemplate, opts)
+ }
-// look for github shorthand inputs, such as npm/cli
-const isGitHubShorthand = (arg) => {
- // it cannot contain whitespace before the first #
- // it cannot start with a / because that's probably an absolute file path
- // but it must include a slash since repos are username/repository
- // it cannot start with a . because that's probably a relative file path
- // it cannot start with an @ because that's a scoped package if it passes the other tests
- // it cannot contain a : before a # because that tells us that there's a protocol
- // a second / may not exist before a #
- const firstHash = arg.indexOf('#')
- const firstSlash = arg.indexOf('/')
- const secondSlash = arg.indexOf('/', firstSlash + 1)
- const firstColon = arg.indexOf(':')
- const firstSpace = /\s/.exec(arg)
- const firstAt = arg.indexOf('@')
-
- const spaceOnlyAfterHash = !firstSpace || (firstHash > -1 && firstSpace.index > firstHash)
- const atOnlyAfterHash = firstAt === -1 || (firstHash > -1 && firstAt > firstHash)
- const colonOnlyAfterHash = firstColon === -1 || (firstHash > -1 && firstColon > firstHash)
- const secondSlashOnlyAfterHash = secondSlash === -1 || (firstHash > -1 && secondSlash > firstHash)
- const hasSlash = firstSlash > 0
- // if a # is found, what we really want to know is that the character
- // immediately before # is not a /
- const doesNotEndWithSlash = firstHash > -1 ? arg[firstHash - 1] !== '/' : !arg.endsWith('/')
- const doesNotStartWithDot = !arg.startsWith('.')
-
- return spaceOnlyAfterHash && hasSlash && doesNotEndWithSlash &&
- doesNotStartWithDot && atOnlyAfterHash && colonOnlyAfterHash &&
- secondSlashOnlyAfterHash
-}
+ bugs (opts) {
+ return this.#fill(this.bugstemplate, opts)
+ }
-// attempt to correct an scp style url so that it will parse with `new URL()`
-const correctUrl = (giturl) => {
- const firstAt = giturl.indexOf('@')
- const lastHash = giturl.lastIndexOf('#')
- let firstColon = giturl.indexOf(':')
- let lastColon = giturl.lastIndexOf(':', lastHash > -1 ? lastHash : Infinity)
-
- let corrected
- if (lastColon > firstAt) {
- // the last : comes after the first @ (or there is no @)
- // like it would in:
- // proto://hostname.com:user/repo
- // username@hostname.com:user/repo
- // :password@hostname.com:user/repo
- // username:password@hostname.com:user/repo
- // proto://username@hostname.com:user/repo
- // proto://:password@hostname.com:user/repo
- // proto://username:password@hostname.com:user/repo
- // then we replace the last : with a / to create a valid path
- corrected = giturl.slice(0, lastColon) + '/' + giturl.slice(lastColon + 1)
- // // and we find our new : positions
- firstColon = corrected.indexOf(':')
- lastColon = corrected.lastIndexOf(':')
- }
-
- if (firstColon === -1 && giturl.indexOf('//') === -1) {
- // we have no : at all
- // as it would be in:
- // username@hostname.com/user/repo
- // then we prepend a protocol
- corrected = `git+ssh://${corrected}`
- }
-
- return corrected
-}
+ https (opts) {
+ return this.#fill(this.httpstemplate, opts)
+ }
+
+ git (opts) {
+ return this.#fill(this.gittemplate, opts)
+ }
-// try to parse the url as its given to us, if that throws
-// then we try to clean the url and parse that result instead
-// THIS FUNCTION SHOULD NEVER THROW
-const parseGitUrl = (giturl) => {
- let result
- try {
- result = new url.URL(giturl)
- } catch {
- // this fn should never throw
+ shortcut (opts) {
+ return this.#fill(this.shortcuttemplate, opts)
}
- if (result) {
- return result
+ path (opts) {
+ return this.#fill(this.pathtemplate, opts)
}
- const correctedUrl = correctUrl(giturl)
- try {
- result = new url.URL(correctedUrl)
- } catch {
- // this fn should never throw
+ tarball (opts) {
+ return this.#fill(this.tarballtemplate, { ...opts, noCommittish: false })
}
- return result
+ file (path, opts) {
+ return this.#fill(this.filetemplate, { ...opts, path })
+ }
+
+ edit (path, opts) {
+ return this.#fill(this.edittemplate, { ...opts, path })
+ }
+
+ getDefaultRepresentation () {
+ return this.default
+ }
+
+ toString (opts) {
+ if (this.default && typeof this[this.default] === 'function') {
+ return this[this.default](opts)
+ }
+
+ return this.sshurl(opts)
+ }
}
+
+for (const [name, host] of Object.entries(hosts)) {
+ GitHost.addHost(name, host)
+}
+
+module.exports = GitHost
diff --git a/node_modules/hosted-git-info/package.json b/node_modules/hosted-git-info/package.json
index 07a5587ca..35feb7e15 100644
--- a/node_modules/hosted-git-info/package.json
+++ b/node_modules/hosted-git-info/package.json
@@ -1,6 +1,6 @@
{
"name": "hosted-git-info",
- "version": "5.1.0",
+ "version": "6.0.0",
"description": "Provides metadata and conversions from repository urls for GitHub, Bitbucket and GitLab",
"main": "./lib/index.js",
"repository": {
@@ -21,9 +21,6 @@
"homepage": "https://github.com/npm/hosted-git-info",
"scripts": {
"posttest": "npm run lint",
- "postversion": "npm publish",
- "prepublishOnly": "git push origin --follow-tags",
- "preversion": "npm test",
"snap": "tap",
"test": "tap",
"test:coverage": "tap --coverage-report=html",
@@ -37,7 +34,7 @@
},
"devDependencies": {
"@npmcli/eslint-config": "^3.0.1",
- "@npmcli/template-oss": "3.5.0",
+ "@npmcli/template-oss": "4.5.1",
"tap": "^16.0.1"
},
"files": [
@@ -45,14 +42,18 @@
"lib/"
],
"engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
},
"tap": {
"color": 1,
- "coverage": true
+ "coverage": true,
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
},
"templateOSS": {
"//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
- "version": "3.5.0"
+ "version": "4.5.1"
}
}
diff --git a/node_modules/normalize-package-data/node_modules/hosted-git-info/LICENSE b/node_modules/normalize-package-data/node_modules/hosted-git-info/LICENSE
new file mode 100644
index 000000000..45055763d
--- /dev/null
+++ b/node_modules/normalize-package-data/node_modules/hosted-git-info/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2015, Rebecca Turner
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/hosted-git-info/lib/git-host-info.js b/node_modules/normalize-package-data/node_modules/hosted-git-info/lib/git-host-info.js
index cdc1e4601..cdc1e4601 100644
--- a/node_modules/hosted-git-info/lib/git-host-info.js
+++ b/node_modules/normalize-package-data/node_modules/hosted-git-info/lib/git-host-info.js
diff --git a/node_modules/hosted-git-info/lib/git-host.js b/node_modules/normalize-package-data/node_modules/hosted-git-info/lib/git-host.js
index bb65d4d99..bb65d4d99 100644
--- a/node_modules/hosted-git-info/lib/git-host.js
+++ b/node_modules/normalize-package-data/node_modules/hosted-git-info/lib/git-host.js
diff --git a/node_modules/normalize-package-data/node_modules/hosted-git-info/lib/index.js b/node_modules/normalize-package-data/node_modules/hosted-git-info/lib/index.js
new file mode 100644
index 000000000..d5d63c668
--- /dev/null
+++ b/node_modules/normalize-package-data/node_modules/hosted-git-info/lib/index.js
@@ -0,0 +1,248 @@
+'use strict'
+const url = require('url')
+const gitHosts = require('./git-host-info.js')
+const GitHost = module.exports = require('./git-host.js')
+const LRU = require('lru-cache')
+const cache = new LRU({ max: 1000 })
+
+const protocolToRepresentationMap = {
+ 'git+ssh:': 'sshurl',
+ 'git+https:': 'https',
+ 'ssh:': 'sshurl',
+ 'git:': 'git',
+}
+
+function protocolToRepresentation (protocol) {
+ return protocolToRepresentationMap[protocol] || protocol.slice(0, -1)
+}
+
+const authProtocols = {
+ 'git:': true,
+ 'https:': true,
+ 'git+https:': true,
+ 'http:': true,
+ 'git+http:': true,
+}
+
+const knownProtocols = Object.keys(gitHosts.byShortcut)
+ .concat(['http:', 'https:', 'git:', 'git+ssh:', 'git+https:', 'ssh:'])
+
+module.exports.fromUrl = function (giturl, opts) {
+ if (typeof giturl !== 'string') {
+ return
+ }
+
+ const key = giturl + JSON.stringify(opts || {})
+
+ if (!cache.has(key)) {
+ cache.set(key, fromUrl(giturl, opts))
+ }
+
+ return cache.get(key)
+}
+
+function fromUrl (giturl, opts) {
+ if (!giturl) {
+ return
+ }
+
+ const correctedUrl = isGitHubShorthand(giturl) ? 'github:' + giturl : correctProtocol(giturl)
+ const parsed = parseGitUrl(correctedUrl)
+ if (!parsed) {
+ return parsed
+ }
+
+ const gitHostShortcut = gitHosts.byShortcut[parsed.protocol]
+ const gitHostDomain =
+ gitHosts.byDomain[parsed.hostname.startsWith('www.') ?
+ parsed.hostname.slice(4) :
+ parsed.hostname]
+ const gitHostName = gitHostShortcut || gitHostDomain
+ if (!gitHostName) {
+ return
+ }
+
+ const gitHostInfo = gitHosts[gitHostShortcut || gitHostDomain]
+ let auth = null
+ if (authProtocols[parsed.protocol] && (parsed.username || parsed.password)) {
+ auth = `${parsed.username}${parsed.password ? ':' + parsed.password : ''}`
+ }
+
+ let committish = null
+ let user = null
+ let project = null
+ let defaultRepresentation = null
+
+ try {
+ if (gitHostShortcut) {
+ let pathname = parsed.pathname.startsWith('/') ? parsed.pathname.slice(1) : parsed.pathname
+ const firstAt = pathname.indexOf('@')
+ // we ignore auth for shortcuts, so just trim it out
+ if (firstAt > -1) {
+ pathname = pathname.slice(firstAt + 1)
+ }
+
+ const lastSlash = pathname.lastIndexOf('/')
+ if (lastSlash > -1) {
+ user = decodeURIComponent(pathname.slice(0, lastSlash))
+ // we want nulls only, never empty strings
+ if (!user) {
+ user = null
+ }
+ project = decodeURIComponent(pathname.slice(lastSlash + 1))
+ } else {
+ project = decodeURIComponent(pathname)
+ }
+
+ if (project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ if (parsed.hash) {
+ committish = decodeURIComponent(parsed.hash.slice(1))
+ }
+
+ defaultRepresentation = 'shortcut'
+ } else {
+ if (!gitHostInfo.protocols.includes(parsed.protocol)) {
+ return
+ }
+
+ const segments = gitHostInfo.extract(parsed)
+ if (!segments) {
+ return
+ }
+
+ user = segments.user && decodeURIComponent(segments.user)
+ project = decodeURIComponent(segments.project)
+ committish = decodeURIComponent(segments.committish)
+ defaultRepresentation = protocolToRepresentation(parsed.protocol)
+ }
+ } catch (err) {
+ /* istanbul ignore else */
+ if (err instanceof URIError) {
+ return
+ } else {
+ throw err
+ }
+ }
+
+ return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts)
+}
+
+// accepts input like git:github.com:user/repo and inserts the // after the first :
+const correctProtocol = (arg) => {
+ const firstColon = arg.indexOf(':')
+ const proto = arg.slice(0, firstColon + 1)
+ if (knownProtocols.includes(proto)) {
+ return arg
+ }
+
+ const firstAt = arg.indexOf('@')
+ if (firstAt > -1) {
+ if (firstAt > firstColon) {
+ return `git+ssh://${arg}`
+ } else {
+ return arg
+ }
+ }
+
+ const doubleSlash = arg.indexOf('//')
+ if (doubleSlash === firstColon + 1) {
+ return arg
+ }
+
+ return arg.slice(0, firstColon + 1) + '//' + arg.slice(firstColon + 1)
+}
+
+// look for github shorthand inputs, such as npm/cli
+const isGitHubShorthand = (arg) => {
+ // it cannot contain whitespace before the first #
+ // it cannot start with a / because that's probably an absolute file path
+ // but it must include a slash since repos are username/repository
+ // it cannot start with a . because that's probably a relative file path
+ // it cannot start with an @ because that's a scoped package if it passes the other tests
+ // it cannot contain a : before a # because that tells us that there's a protocol
+ // a second / may not exist before a #
+ const firstHash = arg.indexOf('#')
+ const firstSlash = arg.indexOf('/')
+ const secondSlash = arg.indexOf('/', firstSlash + 1)
+ const firstColon = arg.indexOf(':')
+ const firstSpace = /\s/.exec(arg)
+ const firstAt = arg.indexOf('@')
+
+ const spaceOnlyAfterHash = !firstSpace || (firstHash > -1 && firstSpace.index > firstHash)
+ const atOnlyAfterHash = firstAt === -1 || (firstHash > -1 && firstAt > firstHash)
+ const colonOnlyAfterHash = firstColon === -1 || (firstHash > -1 && firstColon > firstHash)
+ const secondSlashOnlyAfterHash = secondSlash === -1 || (firstHash > -1 && secondSlash > firstHash)
+ const hasSlash = firstSlash > 0
+ // if a # is found, what we really want to know is that the character
+ // immediately before # is not a /
+ const doesNotEndWithSlash = firstHash > -1 ? arg[firstHash - 1] !== '/' : !arg.endsWith('/')
+ const doesNotStartWithDot = !arg.startsWith('.')
+
+ return spaceOnlyAfterHash && hasSlash && doesNotEndWithSlash &&
+ doesNotStartWithDot && atOnlyAfterHash && colonOnlyAfterHash &&
+ secondSlashOnlyAfterHash
+}
+
+// attempt to correct an scp style url so that it will parse with `new URL()`
+const correctUrl = (giturl) => {
+ const firstAt = giturl.indexOf('@')
+ const lastHash = giturl.lastIndexOf('#')
+ let firstColon = giturl.indexOf(':')
+ let lastColon = giturl.lastIndexOf(':', lastHash > -1 ? lastHash : Infinity)
+
+ let corrected
+ if (lastColon > firstAt) {
+ // the last : comes after the first @ (or there is no @)
+ // like it would in:
+ // proto://hostname.com:user/repo
+ // username@hostname.com:user/repo
+ // :password@hostname.com:user/repo
+ // username:password@hostname.com:user/repo
+ // proto://username@hostname.com:user/repo
+ // proto://:password@hostname.com:user/repo
+ // proto://username:password@hostname.com:user/repo
+ // then we replace the last : with a / to create a valid path
+ corrected = giturl.slice(0, lastColon) + '/' + giturl.slice(lastColon + 1)
+ // // and we find our new : positions
+ firstColon = corrected.indexOf(':')
+ lastColon = corrected.lastIndexOf(':')
+ }
+
+ if (firstColon === -1 && giturl.indexOf('//') === -1) {
+ // we have no : at all
+ // as it would be in:
+ // username@hostname.com/user/repo
+ // then we prepend a protocol
+ corrected = `git+ssh://${corrected}`
+ }
+
+ return corrected
+}
+
+// try to parse the url as its given to us, if that throws
+// then we try to clean the url and parse that result instead
+// THIS FUNCTION SHOULD NEVER THROW
+const parseGitUrl = (giturl) => {
+ let result
+ try {
+ result = new url.URL(giturl)
+ } catch {
+ // this fn should never throw
+ }
+
+ if (result) {
+ return result
+ }
+
+ const correctedUrl = correctUrl(giturl)
+ try {
+ result = new url.URL(correctedUrl)
+ } catch {
+ // this fn should never throw
+ }
+
+ return result
+}
diff --git a/node_modules/normalize-package-data/node_modules/hosted-git-info/package.json b/node_modules/normalize-package-data/node_modules/hosted-git-info/package.json
new file mode 100644
index 000000000..07a5587ca
--- /dev/null
+++ b/node_modules/normalize-package-data/node_modules/hosted-git-info/package.json
@@ -0,0 +1,58 @@
+{
+ "name": "hosted-git-info",
+ "version": "5.1.0",
+ "description": "Provides metadata and conversions from repository urls for GitHub, Bitbucket and GitLab",
+ "main": "./lib/index.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/npm/hosted-git-info.git"
+ },
+ "keywords": [
+ "git",
+ "github",
+ "bitbucket",
+ "gitlab"
+ ],
+ "author": "GitHub Inc.",
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/npm/hosted-git-info/issues"
+ },
+ "homepage": "https://github.com/npm/hosted-git-info",
+ "scripts": {
+ "posttest": "npm run lint",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "preversion": "npm test",
+ "snap": "tap",
+ "test": "tap",
+ "test:coverage": "tap --coverage-report=html",
+ "lint": "eslint \"**/*.js\"",
+ "postlint": "template-oss-check",
+ "lintfix": "npm run lint -- --fix",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "dependencies": {
+ "lru-cache": "^7.5.1"
+ },
+ "devDependencies": {
+ "@npmcli/eslint-config": "^3.0.1",
+ "@npmcli/template-oss": "3.5.0",
+ "tap": "^16.0.1"
+ },
+ "files": [
+ "bin/",
+ "lib/"
+ ],
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ },
+ "tap": {
+ "color": 1,
+ "coverage": true
+ },
+ "templateOSS": {
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
+ "version": "3.5.0"
+ }
+}
diff --git a/node_modules/npm-package-arg/node_modules/hosted-git-info/LICENSE b/node_modules/npm-package-arg/node_modules/hosted-git-info/LICENSE
new file mode 100644
index 000000000..45055763d
--- /dev/null
+++ b/node_modules/npm-package-arg/node_modules/hosted-git-info/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2015, Rebecca Turner
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/npm-package-arg/node_modules/hosted-git-info/lib/git-host-info.js b/node_modules/npm-package-arg/node_modules/hosted-git-info/lib/git-host-info.js
new file mode 100644
index 000000000..cdc1e4601
--- /dev/null
+++ b/node_modules/npm-package-arg/node_modules/hosted-git-info/lib/git-host-info.js
@@ -0,0 +1,192 @@
+/* eslint-disable max-len */
+'use strict'
+const maybeJoin = (...args) => args.every(arg => arg) ? args.join('') : ''
+const maybeEncode = (arg) => arg ? encodeURIComponent(arg) : ''
+
+const defaults = {
+ sshtemplate: ({ domain, user, project, committish }) => `git@${domain}:${user}/${project}.git${maybeJoin('#', committish)}`,
+ sshurltemplate: ({ domain, user, project, committish }) => `git+ssh://git@${domain}/${user}/${project}.git${maybeJoin('#', committish)}`,
+ edittemplate: ({ domain, user, project, committish, editpath, path }) => `https://${domain}/${user}/${project}${maybeJoin('/', editpath, '/', maybeEncode(committish || 'master'), '/', path)}`,
+ browsetemplate: ({ domain, user, project, committish, treepath }) => `https://${domain}/${user}/${project}${maybeJoin('/', treepath, '/', maybeEncode(committish))}`,
+ browsefiletemplate: ({ domain, user, project, committish, treepath, path, fragment, hashformat }) => `https://${domain}/${user}/${project}/${treepath}/${maybeEncode(committish || 'master')}/${path}${maybeJoin('#', hashformat(fragment || ''))}`,
+ docstemplate: ({ domain, user, project, treepath, committish }) => `https://${domain}/${user}/${project}${maybeJoin('/', treepath, '/', maybeEncode(committish))}#readme`,
+ httpstemplate: ({ auth, domain, user, project, committish }) => `git+https://${maybeJoin(auth, '@')}${domain}/${user}/${project}.git${maybeJoin('#', committish)}`,
+ filetemplate: ({ domain, user, project, committish, path }) => `https://${domain}/${user}/${project}/raw/${maybeEncode(committish) || 'master'}/${path}`,
+ shortcuttemplate: ({ type, user, project, committish }) => `${type}:${user}/${project}${maybeJoin('#', committish)}`,
+ pathtemplate: ({ user, project, committish }) => `${user}/${project}${maybeJoin('#', committish)}`,
+ bugstemplate: ({ domain, user, project }) => `https://${domain}/${user}/${project}/issues`,
+ hashformat: formatHashFragment,
+}
+
+const gitHosts = {}
+gitHosts.github = Object.assign({}, defaults, {
+ // First two are insecure and generally shouldn't be used any more, but
+ // they are still supported.
+ protocols: ['git:', 'http:', 'git+ssh:', 'git+https:', 'ssh:', 'https:'],
+ domain: 'github.com',
+ treepath: 'tree',
+ editpath: 'edit',
+ filetemplate: ({ auth, user, project, committish, path }) => `https://${maybeJoin(auth, '@')}raw.githubusercontent.com/${user}/${project}/${maybeEncode(committish) || 'master'}/${path}`,
+ gittemplate: ({ auth, domain, user, project, committish }) => `git://${maybeJoin(auth, '@')}${domain}/${user}/${project}.git${maybeJoin('#', committish)}`,
+ tarballtemplate: ({ domain, user, project, committish }) => `https://codeload.${domain}/${user}/${project}/tar.gz/${maybeEncode(committish) || 'master'}`,
+ extract: (url) => {
+ let [, user, project, type, committish] = url.pathname.split('/', 5)
+ if (type && type !== 'tree') {
+ return
+ }
+
+ if (!type) {
+ committish = url.hash.slice(1)
+ }
+
+ if (project && project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ if (!user || !project) {
+ return
+ }
+
+ return { user, project, committish }
+ },
+})
+
+gitHosts.bitbucket = Object.assign({}, defaults, {
+ protocols: ['git+ssh:', 'git+https:', 'ssh:', 'https:'],
+ domain: 'bitbucket.org',
+ treepath: 'src',
+ editpath: '?mode=edit',
+ edittemplate: ({ domain, user, project, committish, treepath, path, editpath }) => `https://${domain}/${user}/${project}${maybeJoin('/', treepath, '/', maybeEncode(committish || 'master'), '/', path, editpath)}`,
+ tarballtemplate: ({ domain, user, project, committish }) => `https://${domain}/${user}/${project}/get/${maybeEncode(committish) || 'master'}.tar.gz`,
+ extract: (url) => {
+ let [, user, project, aux] = url.pathname.split('/', 4)
+ if (['get'].includes(aux)) {
+ return
+ }
+
+ if (project && project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ if (!user || !project) {
+ return
+ }
+
+ return { user, project, committish: url.hash.slice(1) }
+ },
+})
+
+gitHosts.gitlab = Object.assign({}, defaults, {
+ protocols: ['git+ssh:', 'git+https:', 'ssh:', 'https:'],
+ domain: 'gitlab.com',
+ treepath: 'tree',
+ editpath: '-/edit',
+ httpstemplate: ({ auth, domain, user, project, committish }) => `git+https://${maybeJoin(auth, '@')}${domain}/${user}/${project}.git${maybeJoin('#', committish)}`,
+ tarballtemplate: ({ domain, user, project, committish }) => `https://${domain}/${user}/${project}/repository/archive.tar.gz?ref=${maybeEncode(committish) || 'master'}`,
+ extract: (url) => {
+ const path = url.pathname.slice(1)
+ if (path.includes('/-/') || path.includes('/archive.tar.gz')) {
+ return
+ }
+
+ const segments = path.split('/')
+ let project = segments.pop()
+ if (project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ const user = segments.join('/')
+ if (!user || !project) {
+ return
+ }
+
+ return { user, project, committish: url.hash.slice(1) }
+ },
+})
+
+gitHosts.gist = Object.assign({}, defaults, {
+ protocols: ['git:', 'git+ssh:', 'git+https:', 'ssh:', 'https:'],
+ domain: 'gist.github.com',
+ editpath: 'edit',
+ sshtemplate: ({ domain, project, committish }) => `git@${domain}:${project}.git${maybeJoin('#', committish)}`,
+ sshurltemplate: ({ domain, project, committish }) => `git+ssh://git@${domain}/${project}.git${maybeJoin('#', committish)}`,
+ edittemplate: ({ domain, user, project, committish, editpath }) => `https://${domain}/${user}/${project}${maybeJoin('/', maybeEncode(committish))}/${editpath}`,
+ browsetemplate: ({ domain, project, committish }) => `https://${domain}/${project}${maybeJoin('/', maybeEncode(committish))}`,
+ browsefiletemplate: ({ domain, project, committish, path, hashformat }) => `https://${domain}/${project}${maybeJoin('/', maybeEncode(committish))}${maybeJoin('#', hashformat(path))}`,
+ docstemplate: ({ domain, project, committish }) => `https://${domain}/${project}${maybeJoin('/', maybeEncode(committish))}`,
+ httpstemplate: ({ domain, project, committish }) => `git+https://${domain}/${project}.git${maybeJoin('#', committish)}`,
+ filetemplate: ({ user, project, committish, path }) => `https://gist.githubusercontent.com/${user}/${project}/raw${maybeJoin('/', maybeEncode(committish))}/${path}`,
+ shortcuttemplate: ({ type, project, committish }) => `${type}:${project}${maybeJoin('#', committish)}`,
+ pathtemplate: ({ project, committish }) => `${project}${maybeJoin('#', committish)}`,
+ bugstemplate: ({ domain, project }) => `https://${domain}/${project}`,
+ gittemplate: ({ domain, project, committish }) => `git://${domain}/${project}.git${maybeJoin('#', committish)}`,
+ tarballtemplate: ({ project, committish }) => `https://codeload.github.com/gist/${project}/tar.gz/${maybeEncode(committish) || 'master'}`,
+ extract: (url) => {
+ let [, user, project, aux] = url.pathname.split('/', 4)
+ if (aux === 'raw') {
+ return
+ }
+
+ if (!project) {
+ if (!user) {
+ return
+ }
+
+ project = user
+ user = null
+ }
+
+ if (project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ return { user, project, committish: url.hash.slice(1) }
+ },
+ hashformat: function (fragment) {
+ return fragment && 'file-' + formatHashFragment(fragment)
+ },
+})
+
+gitHosts.sourcehut = Object.assign({}, defaults, {
+ protocols: ['git+ssh:', 'https:'],
+ domain: 'git.sr.ht',
+ treepath: 'tree',
+ browsefiletemplate: ({ domain, user, project, committish, treepath, path, fragment, hashformat }) => `https://${domain}/${user}/${project}/${treepath}/${maybeEncode(committish || 'main')}/${path}${maybeJoin('#', hashformat(fragment || ''))}`,
+ filetemplate: ({ domain, user, project, committish, path }) => `https://${domain}/${user}/${project}/blob/${maybeEncode(committish) || 'main'}/${path}`,
+ httpstemplate: ({ domain, user, project, committish }) => `https://${domain}/${user}/${project}.git${maybeJoin('#', committish)}`,
+ tarballtemplate: ({ domain, user, project, committish }) => `https://${domain}/${user}/${project}/archive/${maybeEncode(committish) || 'main'}.tar.gz`,
+ bugstemplate: ({ domain, user, project }) => `https://todo.sr.ht/${user}/${project}`,
+ docstemplate: ({ domain, user, project, treepath, committish }) => `https://${domain}/${user}/${project}${maybeJoin('/', treepath, '/', maybeEncode(committish))}#readme`,
+ extract: (url) => {
+ let [, user, project, aux] = url.pathname.split('/', 4)
+
+ // tarball url
+ if (['archive'].includes(aux)) {
+ return
+ }
+
+ if (project && project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ if (!user || !project) {
+ return
+ }
+
+ return { user, project, committish: url.hash.slice(1) }
+ },
+})
+
+const names = Object.keys(gitHosts)
+gitHosts.byShortcut = {}
+gitHosts.byDomain = {}
+for (const name of names) {
+ gitHosts.byShortcut[`${name}:`] = name
+ gitHosts.byDomain[gitHosts[name].domain] = name
+}
+
+function formatHashFragment (fragment) {
+ return fragment.toLowerCase().replace(/^\W+|\/|\W+$/g, '').replace(/\W+/g, '-')
+}
+
+module.exports = gitHosts
diff --git a/node_modules/npm-package-arg/node_modules/hosted-git-info/lib/git-host.js b/node_modules/npm-package-arg/node_modules/hosted-git-info/lib/git-host.js
new file mode 100644
index 000000000..bb65d4d99
--- /dev/null
+++ b/node_modules/npm-package-arg/node_modules/hosted-git-info/lib/git-host.js
@@ -0,0 +1,114 @@
+'use strict'
+const gitHosts = require('./git-host-info.js')
+
+class GitHost {
+ constructor (type, user, auth, project, committish, defaultRepresentation, opts = {}) {
+ Object.assign(this, gitHosts[type])
+ this.type = type
+ this.user = user
+ this.auth = auth
+ this.project = project
+ this.committish = committish
+ this.default = defaultRepresentation
+ this.opts = opts
+ }
+
+ hash () {
+ return this.committish ? `#${this.committish}` : ''
+ }
+
+ ssh (opts) {
+ return this._fill(this.sshtemplate, opts)
+ }
+
+ _fill (template, opts) {
+ if (typeof template === 'function') {
+ const options = { ...this, ...this.opts, ...opts }
+
+ // the path should always be set so we don't end up with 'undefined' in urls
+ if (!options.path) {
+ options.path = ''
+ }
+
+ // template functions will insert the leading slash themselves
+ if (options.path.startsWith('/')) {
+ options.path = options.path.slice(1)
+ }
+
+ if (options.noCommittish) {
+ options.committish = null
+ }
+
+ const result = template(options)
+ return options.noGitPlus && result.startsWith('git+') ? result.slice(4) : result
+ }
+
+ return null
+ }
+
+ sshurl (opts) {
+ return this._fill(this.sshurltemplate, opts)
+ }
+
+ browse (path, fragment, opts) {
+ // not a string, treat path as opts
+ if (typeof path !== 'string') {
+ return this._fill(this.browsetemplate, path)
+ }
+
+ if (typeof fragment !== 'string') {
+ opts = fragment
+ fragment = null
+ }
+ return this._fill(this.browsefiletemplate, { ...opts, fragment, path })
+ }
+
+ docs (opts) {
+ return this._fill(this.docstemplate, opts)
+ }
+
+ bugs (opts) {
+ return this._fill(this.bugstemplate, opts)
+ }
+
+ https (opts) {
+ return this._fill(this.httpstemplate, opts)
+ }
+
+ git (opts) {
+ return this._fill(this.gittemplate, opts)
+ }
+
+ shortcut (opts) {
+ return this._fill(this.shortcuttemplate, opts)
+ }
+
+ path (opts) {
+ return this._fill(this.pathtemplate, opts)
+ }
+
+ tarball (opts) {
+ return this._fill(this.tarballtemplate, { ...opts, noCommittish: false })
+ }
+
+ file (path, opts) {
+ return this._fill(this.filetemplate, { ...opts, path })
+ }
+
+ edit (path, opts) {
+ return this._fill(this.edittemplate, { ...opts, path })
+ }
+
+ getDefaultRepresentation () {
+ return this.default
+ }
+
+ toString (opts) {
+ if (this.default && typeof this[this.default] === 'function') {
+ return this[this.default](opts)
+ }
+
+ return this.sshurl(opts)
+ }
+}
+module.exports = GitHost
diff --git a/node_modules/npm-package-arg/node_modules/hosted-git-info/lib/index.js b/node_modules/npm-package-arg/node_modules/hosted-git-info/lib/index.js
new file mode 100644
index 000000000..d5d63c668
--- /dev/null
+++ b/node_modules/npm-package-arg/node_modules/hosted-git-info/lib/index.js
@@ -0,0 +1,248 @@
+'use strict'
+const url = require('url')
+const gitHosts = require('./git-host-info.js')
+const GitHost = module.exports = require('./git-host.js')
+const LRU = require('lru-cache')
+const cache = new LRU({ max: 1000 })
+
+const protocolToRepresentationMap = {
+ 'git+ssh:': 'sshurl',
+ 'git+https:': 'https',
+ 'ssh:': 'sshurl',
+ 'git:': 'git',
+}
+
+function protocolToRepresentation (protocol) {
+ return protocolToRepresentationMap[protocol] || protocol.slice(0, -1)
+}
+
+const authProtocols = {
+ 'git:': true,
+ 'https:': true,
+ 'git+https:': true,
+ 'http:': true,
+ 'git+http:': true,
+}
+
+const knownProtocols = Object.keys(gitHosts.byShortcut)
+ .concat(['http:', 'https:', 'git:', 'git+ssh:', 'git+https:', 'ssh:'])
+
+module.exports.fromUrl = function (giturl, opts) {
+ if (typeof giturl !== 'string') {
+ return
+ }
+
+ const key = giturl + JSON.stringify(opts || {})
+
+ if (!cache.has(key)) {
+ cache.set(key, fromUrl(giturl, opts))
+ }
+
+ return cache.get(key)
+}
+
+function fromUrl (giturl, opts) {
+ if (!giturl) {
+ return
+ }
+
+ const correctedUrl = isGitHubShorthand(giturl) ? 'github:' + giturl : correctProtocol(giturl)
+ const parsed = parseGitUrl(correctedUrl)
+ if (!parsed) {
+ return parsed
+ }
+
+ const gitHostShortcut = gitHosts.byShortcut[parsed.protocol]
+ const gitHostDomain =
+ gitHosts.byDomain[parsed.hostname.startsWith('www.') ?
+ parsed.hostname.slice(4) :
+ parsed.hostname]
+ const gitHostName = gitHostShortcut || gitHostDomain
+ if (!gitHostName) {
+ return
+ }
+
+ const gitHostInfo = gitHosts[gitHostShortcut || gitHostDomain]
+ let auth = null
+ if (authProtocols[parsed.protocol] && (parsed.username || parsed.password)) {
+ auth = `${parsed.username}${parsed.password ? ':' + parsed.password : ''}`
+ }
+
+ let committish = null
+ let user = null
+ let project = null
+ let defaultRepresentation = null
+
+ try {
+ if (gitHostShortcut) {
+ let pathname = parsed.pathname.startsWith('/') ? parsed.pathname.slice(1) : parsed.pathname
+ const firstAt = pathname.indexOf('@')
+ // we ignore auth for shortcuts, so just trim it out
+ if (firstAt > -1) {
+ pathname = pathname.slice(firstAt + 1)
+ }
+
+ const lastSlash = pathname.lastIndexOf('/')
+ if (lastSlash > -1) {
+ user = decodeURIComponent(pathname.slice(0, lastSlash))
+ // we want nulls only, never empty strings
+ if (!user) {
+ user = null
+ }
+ project = decodeURIComponent(pathname.slice(lastSlash + 1))
+ } else {
+ project = decodeURIComponent(pathname)
+ }
+
+ if (project.endsWith('.git')) {
+ project = project.slice(0, -4)
+ }
+
+ if (parsed.hash) {
+ committish = decodeURIComponent(parsed.hash.slice(1))
+ }
+
+ defaultRepresentation = 'shortcut'
+ } else {
+ if (!gitHostInfo.protocols.includes(parsed.protocol)) {
+ return
+ }
+
+ const segments = gitHostInfo.extract(parsed)
+ if (!segments) {
+ return
+ }
+
+ user = segments.user && decodeURIComponent(segments.user)
+ project = decodeURIComponent(segments.project)
+ committish = decodeURIComponent(segments.committish)
+ defaultRepresentation = protocolToRepresentation(parsed.protocol)
+ }
+ } catch (err) {
+ /* istanbul ignore else */
+ if (err instanceof URIError) {
+ return
+ } else {
+ throw err
+ }
+ }
+
+ return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts)
+}
+
+// accepts input like git:github.com:user/repo and inserts the // after the first :
+const correctProtocol = (arg) => {
+ const firstColon = arg.indexOf(':')
+ const proto = arg.slice(0, firstColon + 1)
+ if (knownProtocols.includes(proto)) {
+ return arg
+ }
+
+ const firstAt = arg.indexOf('@')
+ if (firstAt > -1) {
+ if (firstAt > firstColon) {
+ return `git+ssh://${arg}`
+ } else {
+ return arg
+ }
+ }
+
+ const doubleSlash = arg.indexOf('//')
+ if (doubleSlash === firstColon + 1) {
+ return arg
+ }
+
+ return arg.slice(0, firstColon + 1) + '//' + arg.slice(firstColon + 1)
+}
+
+// look for github shorthand inputs, such as npm/cli
+const isGitHubShorthand = (arg) => {
+ // it cannot contain whitespace before the first #
+ // it cannot start with a / because that's probably an absolute file path
+ // but it must include a slash since repos are username/repository
+ // it cannot start with a . because that's probably a relative file path
+ // it cannot start with an @ because that's a scoped package if it passes the other tests
+ // it cannot contain a : before a # because that tells us that there's a protocol
+ // a second / may not exist before a #
+ const firstHash = arg.indexOf('#')
+ const firstSlash = arg.indexOf('/')
+ const secondSlash = arg.indexOf('/', firstSlash + 1)
+ const firstColon = arg.indexOf(':')
+ const firstSpace = /\s/.exec(arg)
+ const firstAt = arg.indexOf('@')
+
+ const spaceOnlyAfterHash = !firstSpace || (firstHash > -1 && firstSpace.index > firstHash)
+ const atOnlyAfterHash = firstAt === -1 || (firstHash > -1 && firstAt > firstHash)
+ const colonOnlyAfterHash = firstColon === -1 || (firstHash > -1 && firstColon > firstHash)
+ const secondSlashOnlyAfterHash = secondSlash === -1 || (firstHash > -1 && secondSlash > firstHash)
+ const hasSlash = firstSlash > 0
+ // if a # is found, what we really want to know is that the character
+ // immediately before # is not a /
+ const doesNotEndWithSlash = firstHash > -1 ? arg[firstHash - 1] !== '/' : !arg.endsWith('/')
+ const doesNotStartWithDot = !arg.startsWith('.')
+
+ return spaceOnlyAfterHash && hasSlash && doesNotEndWithSlash &&
+ doesNotStartWithDot && atOnlyAfterHash && colonOnlyAfterHash &&
+ secondSlashOnlyAfterHash
+}
+
+// attempt to correct an scp style url so that it will parse with `new URL()`
+const correctUrl = (giturl) => {
+ const firstAt = giturl.indexOf('@')
+ const lastHash = giturl.lastIndexOf('#')
+ let firstColon = giturl.indexOf(':')
+ let lastColon = giturl.lastIndexOf(':', lastHash > -1 ? lastHash : Infinity)
+
+ let corrected
+ if (lastColon > firstAt) {
+ // the last : comes after the first @ (or there is no @)
+ // like it would in:
+ // proto://hostname.com:user/repo
+ // username@hostname.com:user/repo
+ // :password@hostname.com:user/repo
+ // username:password@hostname.com:user/repo
+ // proto://username@hostname.com:user/repo
+ // proto://:password@hostname.com:user/repo
+ // proto://username:password@hostname.com:user/repo
+ // then we replace the last : with a / to create a valid path
+ corrected = giturl.slice(0, lastColon) + '/' + giturl.slice(lastColon + 1)
+ // // and we find our new : positions
+ firstColon = corrected.indexOf(':')
+ lastColon = corrected.lastIndexOf(':')
+ }
+
+ if (firstColon === -1 && giturl.indexOf('//') === -1) {
+ // we have no : at all
+ // as it would be in:
+ // username@hostname.com/user/repo
+ // then we prepend a protocol
+ corrected = `git+ssh://${corrected}`
+ }
+
+ return corrected
+}
+
+// try to parse the url as its given to us, if that throws
+// then we try to clean the url and parse that result instead
+// THIS FUNCTION SHOULD NEVER THROW
+const parseGitUrl = (giturl) => {
+ let result
+ try {
+ result = new url.URL(giturl)
+ } catch {
+ // this fn should never throw
+ }
+
+ if (result) {
+ return result
+ }
+
+ const correctedUrl = correctUrl(giturl)
+ try {
+ result = new url.URL(correctedUrl)
+ } catch {
+ // this fn should never throw
+ }
+
+ return result
+}
diff --git a/node_modules/npm-package-arg/node_modules/hosted-git-info/package.json b/node_modules/npm-package-arg/node_modules/hosted-git-info/package.json
new file mode 100644
index 000000000..07a5587ca
--- /dev/null
+++ b/node_modules/npm-package-arg/node_modules/hosted-git-info/package.json
@@ -0,0 +1,58 @@
+{
+ "name": "hosted-git-info",
+ "version": "5.1.0",
+ "description": "Provides metadata and conversions from repository urls for GitHub, Bitbucket and GitLab",
+ "main": "./lib/index.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/npm/hosted-git-info.git"
+ },
+ "keywords": [
+ "git",
+ "github",
+ "bitbucket",
+ "gitlab"
+ ],
+ "author": "GitHub Inc.",
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/npm/hosted-git-info/issues"
+ },
+ "homepage": "https://github.com/npm/hosted-git-info",
+ "scripts": {
+ "posttest": "npm run lint",
+ "postversion": "npm publish",
+ "prepublishOnly": "git push origin --follow-tags",
+ "preversion": "npm test",
+ "snap": "tap",
+ "test": "tap",
+ "test:coverage": "tap --coverage-report=html",
+ "lint": "eslint \"**/*.js\"",
+ "postlint": "template-oss-check",
+ "lintfix": "npm run lint -- --fix",
+ "template-oss-apply": "template-oss-apply --force"
+ },
+ "dependencies": {
+ "lru-cache": "^7.5.1"
+ },
+ "devDependencies": {
+ "@npmcli/eslint-config": "^3.0.1",
+ "@npmcli/template-oss": "3.5.0",
+ "tap": "^16.0.1"
+ },
+ "files": [
+ "bin/",
+ "lib/"
+ ],
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ },
+ "tap": {
+ "color": 1,
+ "coverage": true
+ },
+ "templateOSS": {
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
+ "version": "3.5.0"
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index c6f4e15ee..f36c79009 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -109,7 +109,7 @@
"fs-minipass": "^2.1.0",
"glob": "^8.0.1",
"graceful-fs": "^4.2.10",
- "hosted-git-info": "^5.1.0",
+ "hosted-git-info": "^6.0.0",
"ini": "^3.0.1",
"init-package-json": "^3.0.2",
"is-cidr": "^4.0.2",
@@ -2411,6 +2411,18 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/@npmcli/template-oss/node_modules/hosted-git-info": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.1.0.tgz",
+ "integrity": "sha512-Ek+QmMEqZF8XrbFdwoDjSbm7rT23pCgEMOJmz6GPk/s4yH//RQfNPArhIxbguNxROq/+5lNBwCDHMhA903Kx1Q==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^7.5.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
"node_modules/@octokit/auth-token": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.1.tgz",
@@ -5968,14 +5980,15 @@
}
},
"node_modules/hosted-git-info": {
- "version": "5.1.0",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.0.0.tgz",
+ "integrity": "sha512-NURrKJX36ihI69iCqcvN4uuIk9fHcc1C+uax/5fPh4Tr5WJnATir+QM/CMJNKrcOOvxQDsAdS5C9oJliM80X7g==",
"inBundle": true,
- "license": "ISC",
"dependencies": {
"lru-cache": "^7.5.1"
},
"engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/html-encoding-sniffer": {
@@ -7985,6 +7998,18 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/normalize-package-data/node_modules/hosted-git-info": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.1.0.tgz",
+ "integrity": "sha512-Ek+QmMEqZF8XrbFdwoDjSbm7rT23pCgEMOJmz6GPk/s4yH//RQfNPArhIxbguNxROq/+5lNBwCDHMhA903Kx1Q==",
+ "inBundle": true,
+ "dependencies": {
+ "lru-cache": "^7.5.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -8041,6 +8066,18 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/npm-package-arg/node_modules/hosted-git-info": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.1.0.tgz",
+ "integrity": "sha512-Ek+QmMEqZF8XrbFdwoDjSbm7rT23pCgEMOJmz6GPk/s4yH//RQfNPArhIxbguNxROq/+5lNBwCDHMhA903Kx1Q==",
+ "inBundle": true,
+ "dependencies": {
+ "lru-cache": "^7.5.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
"node_modules/npm-packlist": {
"version": "7.0.0",
"inBundle": true,
diff --git a/package.json b/package.json
index fc3d25a7c..b952e64c4 100644
--- a/package.json
+++ b/package.json
@@ -75,7 +75,7 @@
"fs-minipass": "^2.1.0",
"glob": "^8.0.1",
"graceful-fs": "^4.2.10",
- "hosted-git-info": "^5.1.0",
+ "hosted-git-info": "^6.0.0",
"ini": "^3.0.1",
"init-package-json": "^3.0.2",
"is-cidr": "^4.0.2",
diff --git a/test/lib/commands/repo.js b/test/lib/commands/repo.js
index 4c983f135..86f1b8e27 100644
--- a/test/lib/commands/repo.js
+++ b/test/lib/commands/repo.js
@@ -221,7 +221,7 @@ t.test('open repo urls', async 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',
+ directory: 'https://github.com/foo/test-repo-with-directory/tree/HEAD/some/directory',
'.': 'https://example.com/thispkg',
}
const keys = Object.keys(expect)