Merge pull request #3182 from github/koesie10/vscode-versions
Add scripts for updating the Node and Chromium versions
This commit is contained in:
@@ -13,15 +13,11 @@ You can find this info by selecting "About Visual Studio Code" from the top menu
|
|||||||
|
|
||||||
## Updating the Node.js version
|
## Updating the Node.js version
|
||||||
|
|
||||||
The following files will need to be updated:
|
To update the Node.js version, run:
|
||||||
|
|
||||||
- `extensions/ql-vscode/.nvmrc` - this will enable nvm to automatically switch to the correct Node
|
```bash
|
||||||
version when you're in the project folder. It will also change the Node version the GitHub Actions
|
npx ts-node scripts/update-node-version.ts
|
||||||
workflows use.
|
```
|
||||||
- `extensions/ql-vscode/package.json` - the "engines.node: '[VERSION]'" setting
|
|
||||||
- `extensions/ql-vscode/package.json` - the "@types/node: '[VERSION]'" dependency
|
|
||||||
|
|
||||||
Then run `npm install` to update the `extensions/ql-vscode/package-lock.json` file.
|
|
||||||
|
|
||||||
## Node.js version used in tests
|
## Node.js version used in tests
|
||||||
|
|
||||||
|
|||||||
@@ -32,32 +32,12 @@ When updating the minimum version in `package.json`, you should also follow the
|
|||||||
### Updating the Chromium target version
|
### Updating the Chromium target version
|
||||||
|
|
||||||
For the webview code, we use [esbuild](https://esbuild.github.io/) to bundle the code. This requires a target version of Chromium to be specified.
|
For the webview code, we use [esbuild](https://esbuild.github.io/) to bundle the code. This requires a target version of Chromium to be specified.
|
||||||
This version should be the same as the version of Chromium that is bundled with the new minimum VS Code version. There are two
|
This version should be the same as the version of Chromium that is bundled with the new minimum VS Code version. To update
|
||||||
methods to find this version.
|
the version, run:
|
||||||
|
|
||||||
#### Using the About Visual Studio Code dialog
|
```bash
|
||||||
|
npx ts-node scripts/update-chromium-version.ts
|
||||||
Download the new minimum VS Code version from [the previous release versions](https://code.visualstudio.com/docs/supporting/faq#_previous-release-versions). Then,
|
```
|
||||||
select "About Visual Studio Code" from the top menu. This will show the version of Chromium that is bundled with that version of VS Code.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
In this case, the `target` would be `chrome114`.
|
|
||||||
|
|
||||||
#### Using the VS Code source code
|
|
||||||
|
|
||||||
You can find the version of Electron that VS Code uses by looking at its `package.json` file for a specific version
|
|
||||||
(for example [the `package.json` for `1.82.0`](https://github.com/microsoft/vscode/blob/1.82.0/package.json#L153)).
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Then, you can find the version of Chromium that is bundled with that version of Electron by looking at the
|
|
||||||
Chromium version that is shown for that Electron version on [the Electron releases site](https://releases.electronjs.org/releases/stable)
|
|
||||||
(for example [the `25.8.0` release](https://releases.electronjs.org/release/v25.8.0)):
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
In this case, the `target` would be `chrome114`.
|
|
||||||
|
|
||||||
#### Troubleshooting
|
#### Troubleshooting
|
||||||
|
|
||||||
|
|||||||
4
extensions/ql-vscode/gulpfile.ts/chromium-version.json
Normal file
4
extensions/ql-vscode/gulpfile.ts/chromium-version.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"chromiumVersion": "114",
|
||||||
|
"electronVersion": "25.8.0"
|
||||||
|
}
|
||||||
@@ -3,6 +3,8 @@ import esbuild from "gulp-esbuild";
|
|||||||
import { createProject } from "gulp-typescript";
|
import { createProject } from "gulp-typescript";
|
||||||
import { goodReporter } from "./typescript";
|
import { goodReporter } from "./typescript";
|
||||||
|
|
||||||
|
import * as chromiumVersion from "./chromium-version.json";
|
||||||
|
|
||||||
const tsProject = createProject("src/view/tsconfig.json");
|
const tsProject = createProject("src/view/tsconfig.json");
|
||||||
|
|
||||||
export function compileViewEsbuild() {
|
export function compileViewEsbuild() {
|
||||||
@@ -13,7 +15,7 @@ export function compileViewEsbuild() {
|
|||||||
bundle: true,
|
bundle: true,
|
||||||
format: "iife",
|
format: "iife",
|
||||||
platform: "browser",
|
platform: "browser",
|
||||||
target: "chrome114", // Electron 25, VS Code 1.85
|
target: `chrome${chromiumVersion.chromiumVersion}`,
|
||||||
jsx: "automatic",
|
jsx: "automatic",
|
||||||
sourcemap: "linked",
|
sourcemap: "linked",
|
||||||
sourceRoot: "..",
|
sourceRoot: "..",
|
||||||
|
|||||||
42
extensions/ql-vscode/scripts/update-chromium-version.ts
Normal file
42
extensions/ql-vscode/scripts/update-chromium-version.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import { join, resolve } from "path";
|
||||||
|
import { outputFile, readJSON } from "fs-extra";
|
||||||
|
import { minVersion } from "semver";
|
||||||
|
import { getVersionInformation } from "./util/vscode-versions";
|
||||||
|
|
||||||
|
const extensionDirectory = resolve(__dirname, "..");
|
||||||
|
|
||||||
|
async function updateChromiumVersion() {
|
||||||
|
const packageJson = await readJSON(
|
||||||
|
resolve(extensionDirectory, "package.json"),
|
||||||
|
);
|
||||||
|
|
||||||
|
const minimumVsCodeVersion = minVersion(packageJson.engines.vscode)?.version;
|
||||||
|
if (!minimumVsCodeVersion) {
|
||||||
|
throw new Error("Could not find minimum VS Code version");
|
||||||
|
}
|
||||||
|
|
||||||
|
const versionInformation = await getVersionInformation(minimumVsCodeVersion);
|
||||||
|
|
||||||
|
const chromiumMajorVersion = versionInformation.chromiumVersion.split(".")[0];
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
`VS Code ${minimumVsCodeVersion} uses Chromium ${chromiumMajorVersion}`,
|
||||||
|
);
|
||||||
|
|
||||||
|
await outputFile(
|
||||||
|
join(extensionDirectory, "gulpfile.ts", "chromium-version.json"),
|
||||||
|
`${JSON.stringify(
|
||||||
|
{
|
||||||
|
chromiumVersion: chromiumMajorVersion,
|
||||||
|
electronVersion: versionInformation.electronVersion,
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
2,
|
||||||
|
)}\n`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateChromiumVersion().catch((e: unknown) => {
|
||||||
|
console.error(e);
|
||||||
|
process.exit(2);
|
||||||
|
});
|
||||||
71
extensions/ql-vscode/scripts/update-node-version.ts
Normal file
71
extensions/ql-vscode/scripts/update-node-version.ts
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import { join, resolve } from "path";
|
||||||
|
import { execSync } from "child_process";
|
||||||
|
import { outputFile, readFile, readJSON } from "fs-extra";
|
||||||
|
import { getVersionInformation } from "./util/vscode-versions";
|
||||||
|
import { fetchJson } from "./util/fetch";
|
||||||
|
|
||||||
|
const extensionDirectory = resolve(__dirname, "..");
|
||||||
|
|
||||||
|
interface Release {
|
||||||
|
tag_name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function updateNodeVersion() {
|
||||||
|
const latestVsCodeRelease = await fetchJson<Release>(
|
||||||
|
"https://api.github.com/repos/microsoft/vscode/releases/latest",
|
||||||
|
);
|
||||||
|
const latestVsCodeVersion = latestVsCodeRelease.tag_name;
|
||||||
|
|
||||||
|
console.log(`Latest VS Code version is ${latestVsCodeVersion}`);
|
||||||
|
|
||||||
|
const versionInformation = await getVersionInformation(latestVsCodeVersion);
|
||||||
|
console.log(
|
||||||
|
`VS Code ${versionInformation.vscodeVersion} uses Electron ${versionInformation.electronVersion} and Node ${versionInformation.nodeVersion}`,
|
||||||
|
);
|
||||||
|
|
||||||
|
let currentNodeVersion = (
|
||||||
|
await readFile(join(extensionDirectory, ".nvmrc"), "utf8")
|
||||||
|
).trim();
|
||||||
|
if (currentNodeVersion.startsWith("v")) {
|
||||||
|
currentNodeVersion = currentNodeVersion.slice(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentNodeVersion === versionInformation.nodeVersion) {
|
||||||
|
console.log("Node version is already up to date");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("Node version needs to be updated, updating now");
|
||||||
|
|
||||||
|
await outputFile(
|
||||||
|
join(extensionDirectory, ".nvmrc"),
|
||||||
|
`v${versionInformation.nodeVersion}\n`,
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log("Updated .nvmrc");
|
||||||
|
|
||||||
|
const packageJson = await readJSON(
|
||||||
|
join(extensionDirectory, "package.json"),
|
||||||
|
"utf8",
|
||||||
|
);
|
||||||
|
|
||||||
|
packageJson.engines.node = `^${versionInformation.nodeVersion}`;
|
||||||
|
packageJson.devDependencies["@types/node"] =
|
||||||
|
`${versionInformation.nodeVersion}`;
|
||||||
|
|
||||||
|
await outputFile(
|
||||||
|
join(extensionDirectory, "package.json"),
|
||||||
|
`${JSON.stringify(packageJson, null, 2)}\n`,
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log("Updated package.json, now running npm install");
|
||||||
|
|
||||||
|
execSync("npm install", { cwd: extensionDirectory, stdio: "inherit" });
|
||||||
|
|
||||||
|
console.log("Node version updated successfully");
|
||||||
|
}
|
||||||
|
|
||||||
|
updateNodeVersion().catch((e: unknown) => {
|
||||||
|
console.error(e);
|
||||||
|
process.exit(2);
|
||||||
|
});
|
||||||
10
extensions/ql-vscode/scripts/util/fetch.ts
Normal file
10
extensions/ql-vscode/scripts/util/fetch.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
export async function fetchJson<T>(url: string): Promise<T> {
|
||||||
|
const response = await fetch(url);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(
|
||||||
|
`Could not fetch ${url}: ${response.status} ${response.statusText}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (await response.json()) as T;
|
||||||
|
}
|
||||||
69
extensions/ql-vscode/scripts/util/vscode-versions.ts
Normal file
69
extensions/ql-vscode/scripts/util/vscode-versions.ts
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
import { minVersion } from "semver";
|
||||||
|
import { fetchJson } from "./fetch";
|
||||||
|
|
||||||
|
type VsCodePackageJson = {
|
||||||
|
devDependencies: {
|
||||||
|
electron: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getVsCodePackageJson(
|
||||||
|
version: string,
|
||||||
|
): Promise<VsCodePackageJson> {
|
||||||
|
return await fetchJson(
|
||||||
|
`https://raw.githubusercontent.com/microsoft/vscode/${version}/package.json`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ElectronVersion {
|
||||||
|
version: string;
|
||||||
|
date: string;
|
||||||
|
node: string;
|
||||||
|
v8: string;
|
||||||
|
uv: string;
|
||||||
|
zlib: string;
|
||||||
|
openssl: string;
|
||||||
|
modules: string;
|
||||||
|
chrome: string;
|
||||||
|
files: string[];
|
||||||
|
body?: string;
|
||||||
|
apm?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getElectronReleases(): Promise<ElectronVersion[]> {
|
||||||
|
return await fetchJson("https://releases.electronjs.org/releases.json");
|
||||||
|
}
|
||||||
|
|
||||||
|
type VersionInformation = {
|
||||||
|
vscodeVersion: string;
|
||||||
|
electronVersion: string;
|
||||||
|
nodeVersion: string;
|
||||||
|
chromiumVersion: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function getVersionInformation(
|
||||||
|
vscodeVersion: string,
|
||||||
|
): Promise<VersionInformation> {
|
||||||
|
const vsCodePackageJson = await getVsCodePackageJson(vscodeVersion);
|
||||||
|
const electronVersion = minVersion(vsCodePackageJson.devDependencies.electron)
|
||||||
|
?.version;
|
||||||
|
if (!electronVersion) {
|
||||||
|
throw new Error("Could not find Electron version");
|
||||||
|
}
|
||||||
|
|
||||||
|
const electronReleases = await getElectronReleases();
|
||||||
|
|
||||||
|
const electronRelease = electronReleases.find(
|
||||||
|
(release) => release.version === electronVersion,
|
||||||
|
);
|
||||||
|
if (!electronRelease) {
|
||||||
|
throw new Error(`Could not find Electron release ${electronVersion}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
vscodeVersion,
|
||||||
|
electronVersion,
|
||||||
|
nodeVersion: electronRelease.node,
|
||||||
|
chromiumVersion: electronRelease.chrome,
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user