[6a3a178] | 1 | /* eslint-disable node/no-deprecated-api */
|
---|
| 2 |
|
---|
| 3 | 'use strict'
|
---|
| 4 |
|
---|
| 5 | const semver = require('semver')
|
---|
| 6 | const url = require('url')
|
---|
| 7 | const path = require('path')
|
---|
| 8 | const log = require('npmlog')
|
---|
| 9 |
|
---|
| 10 | // versions where -headers.tar.gz started shipping
|
---|
| 11 | const headersTarballRange = '>= 3.0.0 || ~0.12.10 || ~0.10.42'
|
---|
| 12 | const bitsre = /\/win-(x86|x64|arm64)\//
|
---|
| 13 | const bitsreV3 = /\/win-(x86|ia32|x64)\// // io.js v3.x.x shipped with "ia32" but should
|
---|
| 14 | // have been "x86"
|
---|
| 15 |
|
---|
| 16 | // Captures all the logic required to determine download URLs, local directory and
|
---|
| 17 | // file names. Inputs come from command-line switches (--target, --dist-url),
|
---|
| 18 | // `process.version` and `process.release` where it exists.
|
---|
| 19 | function processRelease (argv, gyp, defaultVersion, defaultRelease) {
|
---|
| 20 | var version = (semver.valid(argv[0]) && argv[0]) || gyp.opts.target || defaultVersion
|
---|
| 21 | var versionSemver = semver.parse(version)
|
---|
| 22 | var overrideDistUrl = gyp.opts['dist-url'] || gyp.opts.disturl
|
---|
| 23 | var isDefaultVersion
|
---|
| 24 | var isNamedForLegacyIojs
|
---|
| 25 | var name
|
---|
| 26 | var distBaseUrl
|
---|
| 27 | var baseUrl
|
---|
| 28 | var libUrl32
|
---|
| 29 | var libUrl64
|
---|
| 30 | var libUrlArm64
|
---|
| 31 | var tarballUrl
|
---|
| 32 | var canGetHeaders
|
---|
| 33 |
|
---|
| 34 | if (!versionSemver) {
|
---|
| 35 | // not a valid semver string, nothing we can do
|
---|
| 36 | return { version: version }
|
---|
| 37 | }
|
---|
| 38 | // flatten version into String
|
---|
| 39 | version = versionSemver.version
|
---|
| 40 |
|
---|
| 41 | // defaultVersion should come from process.version so ought to be valid semver
|
---|
| 42 | isDefaultVersion = version === semver.parse(defaultVersion).version
|
---|
| 43 |
|
---|
| 44 | // can't use process.release if we're using --target=x.y.z
|
---|
| 45 | if (!isDefaultVersion) {
|
---|
| 46 | defaultRelease = null
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | if (defaultRelease) {
|
---|
| 50 | // v3 onward, has process.release
|
---|
| 51 | name = defaultRelease.name.replace(/io\.js/, 'iojs') // remove the '.' for directory naming purposes
|
---|
| 52 | } else {
|
---|
| 53 | // old node or alternative --target=
|
---|
| 54 | // semver.satisfies() doesn't like prerelease tags so test major directly
|
---|
| 55 | isNamedForLegacyIojs = versionSemver.major >= 1 && versionSemver.major < 4
|
---|
| 56 | // isNamedForLegacyIojs is required to support Electron < 4 (in particular Electron 3)
|
---|
| 57 | // as previously this logic was used to ensure "iojs" was used to download iojs releases
|
---|
| 58 | // and "node" for node releases. Unfortunately the logic was broad enough that electron@3
|
---|
| 59 | // published release assets as "iojs" so that the node-gyp logic worked. Once Electron@3 has
|
---|
| 60 | // been EOL for a while (late 2019) we should remove this hack.
|
---|
| 61 | name = isNamedForLegacyIojs ? 'iojs' : 'node'
|
---|
| 62 | }
|
---|
| 63 |
|
---|
| 64 | // check for the nvm.sh standard mirror env variables
|
---|
| 65 | if (!overrideDistUrl && process.env.NODEJS_ORG_MIRROR) {
|
---|
| 66 | overrideDistUrl = process.env.NODEJS_ORG_MIRROR
|
---|
| 67 | }
|
---|
| 68 |
|
---|
| 69 | if (overrideDistUrl) {
|
---|
| 70 | log.verbose('download', 'using dist-url', overrideDistUrl)
|
---|
| 71 | }
|
---|
| 72 |
|
---|
| 73 | if (overrideDistUrl) {
|
---|
| 74 | distBaseUrl = overrideDistUrl.replace(/\/+$/, '')
|
---|
| 75 | } else {
|
---|
| 76 | distBaseUrl = 'https://nodejs.org/dist'
|
---|
| 77 | }
|
---|
| 78 | distBaseUrl += '/v' + version + '/'
|
---|
| 79 |
|
---|
| 80 | // new style, based on process.release so we have a lot of the data we need
|
---|
| 81 | if (defaultRelease && defaultRelease.headersUrl && !overrideDistUrl) {
|
---|
| 82 | baseUrl = url.resolve(defaultRelease.headersUrl, './')
|
---|
| 83 | libUrl32 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x86', versionSemver.major)
|
---|
| 84 | libUrl64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x64', versionSemver.major)
|
---|
| 85 | libUrlArm64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'arm64', versionSemver.major)
|
---|
| 86 | tarballUrl = defaultRelease.headersUrl
|
---|
| 87 | } else {
|
---|
| 88 | // older versions without process.release are captured here and we have to make
|
---|
| 89 | // a lot of assumptions, additionally if you --target=x.y.z then we can't use the
|
---|
| 90 | // current process.release
|
---|
| 91 | baseUrl = distBaseUrl
|
---|
| 92 | libUrl32 = resolveLibUrl(name, baseUrl, 'x86', versionSemver.major)
|
---|
| 93 | libUrl64 = resolveLibUrl(name, baseUrl, 'x64', versionSemver.major)
|
---|
| 94 | libUrlArm64 = resolveLibUrl(name, baseUrl, 'arm64', versionSemver.major)
|
---|
| 95 |
|
---|
| 96 | // making the bold assumption that anything with a version number >3.0.0 will
|
---|
| 97 | // have a *-headers.tar.gz file in its dist location, even some frankenstein
|
---|
| 98 | // custom version
|
---|
| 99 | canGetHeaders = semver.satisfies(versionSemver, headersTarballRange)
|
---|
| 100 | tarballUrl = url.resolve(baseUrl, name + '-v' + version + (canGetHeaders ? '-headers' : '') + '.tar.gz')
|
---|
| 101 | }
|
---|
| 102 |
|
---|
| 103 | return {
|
---|
| 104 | version: version,
|
---|
| 105 | semver: versionSemver,
|
---|
| 106 | name: name,
|
---|
| 107 | baseUrl: baseUrl,
|
---|
| 108 | tarballUrl: tarballUrl,
|
---|
| 109 | shasumsUrl: url.resolve(baseUrl, 'SHASUMS256.txt'),
|
---|
| 110 | versionDir: (name !== 'node' ? name + '-' : '') + version,
|
---|
| 111 | ia32: {
|
---|
| 112 | libUrl: libUrl32,
|
---|
| 113 | libPath: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl32).path))
|
---|
| 114 | },
|
---|
| 115 | x64: {
|
---|
| 116 | libUrl: libUrl64,
|
---|
| 117 | libPath: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl64).path))
|
---|
| 118 | },
|
---|
| 119 | arm64: {
|
---|
| 120 | libUrl: libUrlArm64,
|
---|
| 121 | libPath: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrlArm64).path))
|
---|
| 122 | }
|
---|
| 123 | }
|
---|
| 124 | }
|
---|
| 125 |
|
---|
| 126 | function normalizePath (p) {
|
---|
| 127 | return path.normalize(p).replace(/\\/g, '/')
|
---|
| 128 | }
|
---|
| 129 |
|
---|
| 130 | function resolveLibUrl (name, defaultUrl, arch, versionMajor) {
|
---|
| 131 | var base = url.resolve(defaultUrl, './')
|
---|
| 132 | var hasLibUrl = bitsre.test(defaultUrl) || (versionMajor === 3 && bitsreV3.test(defaultUrl))
|
---|
| 133 |
|
---|
| 134 | if (!hasLibUrl) {
|
---|
| 135 | // let's assume it's a baseUrl then
|
---|
| 136 | if (versionMajor >= 1) {
|
---|
| 137 | return url.resolve(base, 'win-' + arch + '/' + name + '.lib')
|
---|
| 138 | }
|
---|
| 139 | // prior to io.js@1.0.0 32-bit node.lib lives in /, 64-bit lives in /x64/
|
---|
| 140 | return url.resolve(base, (arch === 'x86' ? '' : arch + '/') + name + '.lib')
|
---|
| 141 | }
|
---|
| 142 |
|
---|
| 143 | // else we have a proper url to a .lib, just make sure it's the right arch
|
---|
| 144 | return defaultUrl.replace(versionMajor === 3 ? bitsreV3 : bitsre, '/win-' + arch + '/')
|
---|
| 145 | }
|
---|
| 146 |
|
---|
| 147 | module.exports = processRelease
|
---|