diff options
Diffstat (limited to '')
| -rw-r--r-- | node_modules/node-gyp/lib/process-release.js | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/node_modules/node-gyp/lib/process-release.js b/node_modules/node-gyp/lib/process-release.js new file mode 100644 index 0000000..75f3fc1 --- /dev/null +++ b/node_modules/node-gyp/lib/process-release.js @@ -0,0 +1,144 @@ +'use strict' + +const semver = require('semver') +const path = require('path') +const log = require('./log') + +// versions where -headers.tar.gz started shipping +const headersTarballRange = '>= 3.0.0 || ~0.12.10 || ~0.10.42' +const bitsre = /\/win-(x86|x64|arm64)\// +const bitsreV3 = /\/win-(x86|ia32|x64)\// // io.js v3.x.x shipped with "ia32" but should +// have been "x86" + +// Captures all the logic required to determine download URLs, local directory and +// file names. Inputs come from command-line switches (--target, --dist-url), +// `process.version` and `process.release` where it exists. +function processRelease (argv, gyp, defaultVersion, defaultRelease) { + let version = (semver.valid(argv[0]) && argv[0]) || gyp.opts.target || defaultVersion + const versionSemver = semver.parse(version) + let overrideDistUrl = gyp.opts['dist-url'] || gyp.opts.disturl + let isNamedForLegacyIojs + let name + let distBaseUrl + let baseUrl + let libUrl32 + let libUrl64 + let libUrlArm64 + let tarballUrl + let canGetHeaders + + if (!versionSemver) { + // not a valid semver string, nothing we can do + return { version } + } + // flatten version into String + version = versionSemver.version + + // defaultVersion should come from process.version so ought to be valid semver + const isDefaultVersion = version === semver.parse(defaultVersion).version + + // can't use process.release if we're using --target=x.y.z + if (!isDefaultVersion) { + defaultRelease = null + } + + if (defaultRelease) { + // v3 onward, has process.release + name = defaultRelease.name.replace(/io\.js/, 'iojs') // remove the '.' for directory naming purposes + } else { + // old node or alternative --target= + // semver.satisfies() doesn't like prerelease tags so test major directly + isNamedForLegacyIojs = versionSemver.major >= 1 && versionSemver.major < 4 + // isNamedForLegacyIojs is required to support Electron < 4 (in particular Electron 3) + // as previously this logic was used to ensure "iojs" was used to download iojs releases + // and "node" for node releases. Unfortunately the logic was broad enough that electron@3 + // published release assets as "iojs" so that the node-gyp logic worked. Once Electron@3 has + // been EOL for a while (late 2019) we should remove this hack. + name = isNamedForLegacyIojs ? 'iojs' : 'node' + } + + // check for the nvm.sh standard mirror env variables + if (!overrideDistUrl && process.env.NODEJS_ORG_MIRROR) { + overrideDistUrl = process.env.NODEJS_ORG_MIRROR + } + + if (overrideDistUrl) { + log.verbose('download', 'using dist-url', overrideDistUrl) + } + + if (overrideDistUrl) { + distBaseUrl = overrideDistUrl.replace(/\/+$/, '') + } else { + distBaseUrl = 'https://nodejs.org/dist' + } + distBaseUrl = new URL(distBaseUrl + '/v' + version + '/') + + // new style, based on process.release so we have a lot of the data we need + if (defaultRelease && defaultRelease.headersUrl && !overrideDistUrl) { + baseUrl = new URL('./', defaultRelease.headersUrl) + libUrl32 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x86', versionSemver.major) + libUrl64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x64', versionSemver.major) + libUrlArm64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'arm64', versionSemver.major) + tarballUrl = defaultRelease.headersUrl + } else { + // older versions without process.release are captured here and we have to make + // a lot of assumptions, additionally if you --target=x.y.z then we can't use the + // current process.release + baseUrl = distBaseUrl + libUrl32 = resolveLibUrl(name, baseUrl, 'x86', versionSemver.major) + libUrl64 = resolveLibUrl(name, baseUrl, 'x64', versionSemver.major) + libUrlArm64 = resolveLibUrl(name, baseUrl, 'arm64', versionSemver.major) + + // making the bold assumption that anything with a version number >3.0.0 will + // have a *-headers.tar.gz file in its dist location, even some frankenstein + // custom version + canGetHeaders = semver.satisfies(versionSemver, headersTarballRange) + tarballUrl = new URL(name + '-v' + version + (canGetHeaders ? '-headers' : '') + '.tar.gz', baseUrl).href + } + + return { + version, + semver: versionSemver, + name, + baseUrl: baseUrl.href, + tarballUrl, + shasumsUrl: new URL('SHASUMS256.txt', baseUrl).href, + versionDir: (name !== 'node' ? name + '-' : '') + version, + ia32: { + libUrl: libUrl32.href, + libPath: normalizePath(path.relative(baseUrl.pathname, libUrl32.pathname)) + }, + x64: { + libUrl: libUrl64.href, + libPath: normalizePath(path.relative(baseUrl.pathname, libUrl64.pathname)) + }, + arm64: { + libUrl: libUrlArm64.href, + libPath: normalizePath(path.relative(baseUrl.pathname, libUrlArm64.pathname)) + } + } +} + +function normalizePath (p) { + return path.normalize(p).replace(/\\/g, '/') +} + +function resolveLibUrl (name, defaultUrl, arch, versionMajor) { + if (!defaultUrl.pathname) defaultUrl = new URL(defaultUrl) + const base = new URL('./', defaultUrl) + const hasLibUrl = bitsre.test(defaultUrl.pathname) || (versionMajor === 3 && bitsreV3.test(defaultUrl.pathname)) + + if (!hasLibUrl) { + // let's assume it's a baseUrl then + if (versionMajor >= 1) { + return new URL('win-' + arch + '/' + name + '.lib', base) + } + // prior to io.js@1.0.0 32-bit node.lib lives in /, 64-bit lives in /x64/ + return new URL((arch === 'x86' ? '' : arch + '/') + name + '.lib', base) + } + + // else we have a proper url to a .lib, just make sure it's the right arch + return new URL(defaultUrl.pathname.replace(versionMajor === 3 ? bitsreV3 : bitsre, '/win-' + arch + '/'), defaultUrl) +} + +module.exports = processRelease |