-
Notifications
You must be signed in to change notification settings - Fork 522
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(esbuild): Script to update esbuild to the latest available versi…
…on (#2492)
- Loading branch information
1 parent
e9e8fe7
commit 472ed62
Showing
3 changed files
with
122 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
const https = require("https"); | ||
const { exec } = require('shelljs'); | ||
const { mkdirSync, rmdirSync, createWriteStream, readFileSync, writeFileSync } = require('fs'); | ||
const { join } = require('path'); | ||
const { tmpdir } = require('os'); | ||
|
||
const PLATFORMS = { | ||
"esbuild_darwin": "esbuild-darwin-64", | ||
"esbuild_windows": "esbuild-windows-64", | ||
"esbuild_linux": "esbuild-linux-64" | ||
} | ||
|
||
function replaceFileContent(filepath, replacements) { | ||
let fileContent = readFileSync(filepath, 'utf8'); | ||
|
||
replacements.forEach(replacement => { | ||
const match = replacement[0].exec(fileContent); | ||
|
||
if(match.length > 1) { | ||
fileContent = fileContent.replace(match[1], replacement[1]); | ||
} | ||
}); | ||
|
||
writeFileSync(filepath, fileContent); | ||
} | ||
|
||
function fetch(url) { | ||
return new Promise((resolve, reject) => { | ||
https.get(url, (res) => { | ||
if (res.statusCode !== 200) { | ||
console.error(res); | ||
return reject(); | ||
} | ||
|
||
let body = ''; | ||
res.on("data", (chunk) => body += chunk); | ||
res.on("end", () => resolve(JSON.parse(String(body)))); | ||
}); | ||
}); | ||
} | ||
|
||
function downloadFile(url, dest) { | ||
return new Promise((resolve, reject) => { | ||
const file = createWriteStream(dest); | ||
|
||
const request = https.get(url, (response) => { | ||
response.pipe(file); | ||
}); | ||
|
||
file.on('finish', () => { | ||
file.end(); | ||
resolve(); | ||
}); | ||
}); | ||
}; | ||
|
||
async function main() { | ||
const content = []; | ||
const fileReplacements = []; | ||
|
||
content.push('""" Generated code; do not edit\nUpdate by running yarn update-esbuild-versions\n\nHelper macro for fetching esbuild versions for internal tests and examples in rules_nodejs\n"""\n'); | ||
content.push('load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")\n'); | ||
|
||
if(process.argv.length !== 2 && process.argv.length !== 3) { | ||
console.log("Expected number of arguments is 0 or 1"); | ||
process.exit(1); | ||
} | ||
|
||
let version; | ||
if(process.argv.length === 3) { | ||
version = process.argv[2]; | ||
} else { | ||
version = (await fetch('https://registry.npmjs.org/esbuild/latest')).version; | ||
} | ||
|
||
content.push(`_VERSION = "${version}"\n`); | ||
fileReplacements.push([/_ESBUILD_VERSION = "(.+?)"/, version]); | ||
|
||
content.push('def esbuild_dependencies():'); | ||
content.push(' """Helper to install required dependencies for the esbuild rules"""\n'); | ||
content.push(' version = _VERSION\n'); | ||
|
||
const tmpDir = tmpdir(); | ||
mkdirSync(tmpDir, {recursive: true}); | ||
|
||
for(const platform of Object.keys(PLATFORMS)) { | ||
const downloadUrl = `https://registry.npmjs.org/${PLATFORMS[platform]}/-/${PLATFORMS[platform]}-${version}.tgz`; | ||
|
||
const downloadPath = join(tmpDir, PLATFORMS[platform]); | ||
await downloadFile(downloadUrl, downloadPath); | ||
const shasumOutput = exec(`shasum -a 256 ${downloadPath}`, { silent: true }).stdout; | ||
const shasum = shasumOutput.split(' ')[0]; | ||
|
||
fileReplacements.push([new RegExp(`"${platform}",.+?sha256 = "(.+?)"`, 's'), shasum]); | ||
|
||
content.push(' http_archive('); | ||
content.push(` name = "${platform}",`); | ||
content.push(' urls = ['); | ||
content.push(` "https://registry.npmjs.org/${PLATFORMS[platform]}/-/${PLATFORMS[platform]}-%s.tgz" % version,`); | ||
content.push(' ],'); | ||
content.push(' strip_prefix = "package",'); | ||
content.push(` build_file_content = """exports_files(["${platform === 'esbuild_windows' ? 'esbuild.exe' : 'bin/esbuild'}"])""",`); | ||
content.push(` sha256 = "${shasum}",`); | ||
content.push(' )'); | ||
} | ||
|
||
|
||
rmdirSync(tmpDir, {recursive: true}); | ||
|
||
console.log(content.join('\n')); | ||
|
||
// replace shasums in some manually edited files | ||
replaceFileContent('examples/esbuild/WORKSPACE', fileReplacements); | ||
replaceFileContent('packages/esbuild/_README.md', fileReplacements); | ||
} | ||
|
||
main(); |