| // This script creates output that is copy/pasted into /nodejs/private/node_versions.bzl to | |
| // add all published Node.js versions >= 8.0.0. | |
| // See the update-nodejs-versions script in package.json | |
| const https = require("https"); | |
| const MIN_VERSION = [8, 0, 0]; | |
| const MAX_VERSION = [24, 99, 99]; | |
| const REPOSITORY_TYPES = { | |
| "darwin-arm64.tar.gz": "darwin_arm64", | |
| "darwin-x64.tar.gz": "darwin_amd64", | |
| "linux-x64.tar.xz": "linux_amd64", | |
| "linux-arm64.tar.xz": "linux_arm64", | |
| "linux-s390x.tar.xz": "linux_s390x", | |
| "win-x64.zip": "windows_amd64", | |
| "win-arm64.zip": "windows_arm64", | |
| "linux-ppc64le.tar.xz": "linux_ppc64le", | |
| }; | |
| function getText(url) { | |
| return new Promise((resolve, reject) => { | |
| https.get(url, (res) => { | |
| if (res.statusCode !== 200) { | |
| return reject(new Error()); | |
| } | |
| const body = []; | |
| res.on("data", (chunk) => body.push(String(chunk))); | |
| res.on("end", () => resolve(body.join(""))); | |
| }); | |
| }); | |
| } | |
| async function getJson(url) { | |
| return JSON.parse(await getText(url)); | |
| } | |
| function versionCompare(lhs, rhs) { | |
| if (lhs[0] !== rhs[0]) { | |
| return lhs[0] - rhs[0]; | |
| } | |
| if (lhs[1] !== rhs[1]) { | |
| return lhs[1] - rhs[1]; | |
| } | |
| return lhs[2] - rhs[2]; | |
| } | |
| async function getNodeJsVersions() { | |
| const json = await getJson("https://nodejs.org/dist/index.json"); | |
| return (json.map(({version}) => version.slice(1).split('.').map(Number)) | |
| .filter( | |
| (version) => versionCompare(version, MIN_VERSION) >= 0 && | |
| versionCompare(version, MAX_VERSION) <= 0) | |
| .sort(versionCompare)); | |
| } | |
| async function getNodeJsVersion(version) { | |
| const text = await getText( | |
| `https://nodejs.org/dist/v${version.join(".")}/SHASUMS256.txt` | |
| ); | |
| return { | |
| version, | |
| repositories: text | |
| .split("\n") | |
| .filter(Boolean) | |
| .map((line) => { | |
| const [sha, filename] = line.split(/\s+/); | |
| const type = REPOSITORY_TYPES[filename.replace(/^node-v[\d.]+-/, "")]; | |
| return type ? { filename, sha, type } : undefined; | |
| }) | |
| .filter(Boolean), | |
| }; | |
| } | |
| async function main() { | |
| const versions = await getNodeJsVersions(); | |
| const nodeRepositories = await Promise.all(versions.map(getNodeJsVersion)); | |
| console.log('""" Generated code; do not edit'); | |
| console.log('Update by running npm run update-nodejs-versions\n"""\n'); | |
| // Suppress buildifier | |
| console.log('# @unsorted-dict-items'); | |
| console.log('NODE_VERSIONS = {'); | |
| nodeRepositories.forEach(({ version, repositories }) => { | |
| const versionStr = version.join("."); | |
| console.log( | |
| [ | |
| `"${versionStr}": {`, | |
| ...repositories.map( | |
| ({ filename, sha, type }) => | |
| ` "${versionStr}-${type}": ("${filename}", "${filename.replace( | |
| /(\.tar)?\.[^.]+$/, | |
| "" | |
| )}", "${sha}"),` | |
| ), | |
| "},", | |
| ] | |
| .map((line) => ` ${line}`) | |
| .join("\n") | |
| ); | |
| }); | |
| console.log("}"); | |
| } | |
| if (require.main === module) { | |
| main(); | |
| } |