1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
lens/scripts/fix-canvas-deps.ts
Sebastian Malton 988307ee7d Add script to download the correct version of canvas
Signed-off-by: Sebastian Malton <sebastian@malton.name>
2023-01-10 15:18:10 -05:00

61 lines
2.0 KiB
TypeScript

/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import child_process from "child_process";
import { remove } from "fs-extra";
import fetch from "node-fetch";
import { platform } from "process";
import { SemVer } from "semver";
import stream from "stream";
import { promisify } from "util";
import { extract } from "tar";
// From "Node Major Version" to NODE_MODULE_VERSION
const NODE_MODULE_VERSIONS: Partial<Record<string, string>> = {
"16": "93",
"17": "102",
"18": "108",
"19": "111",
};
function canvasPrebuiltUrlBuilder(canvasVersion: SemVer, nodeVersion: string) {
const compiler = platform === "linux"
? "glibc"
: "unknown";
return `https://github.com/Automattic/node-canvas/releases/download/v${canvasVersion.format()}/canvas-v${canvasVersion.format()}-node-v${nodeVersion}-${platform}-${compiler}-x64.tar.gz`;
}
const exec = promisify(child_process.exec);
const pipeline = promisify(stream.pipeline);
const electronVersionCommand = "npm list --depth=0 --json";
const { stdout } = await exec(electronVersionCommand);
const output = JSON.parse(stdout);
const nodeVersion = new SemVer(output.dependencies["@types/node"].version);
const nodeModuleVersion = NODE_MODULE_VERSIONS[`${nodeVersion.major}`];
if (!nodeModuleVersion) {
throw new Error(`Unknown node major version "${nodeVersion.major}". You need to update the NODE_MODULE_VERSIONS table above from https://nodejs.org/en/download/releases/`);
}
const canvasVersion = new SemVer(output.dependencies["canvas"].version);
const canvasPrebuildUrl = canvasPrebuiltUrlBuilder(canvasVersion, nodeModuleVersion);
await remove("./node_modules/canvas/build/Release");
const canvasPrebuilt = await fetch(canvasPrebuildUrl);
if (canvasPrebuilt.status !== 200) {
throw new Error(`Failed to download prebuilt from ${canvasPrebuildUrl}: ${canvasPrebuilt.statusText}`);
}
const dest = extract({
cwd: "./node_modules/canvas/build",
});
await pipeline(canvasPrebuilt.body, dest);