oxc/npm/oxlint/scripts/generate-packages.mjs
rzvxa 56cbdf5f0e ci(oxlint): add oxc_language_server binary to the oxlint package. (#3350)
I didn't introduce a new set of native packages for the `oxc_language_server` binary, This change temporarily bundles them as part of oxlint, We most probably would want to make it an optional dependency in the future if we start to add more futures like formatting, jump to definition, etc to it.
2024-05-27 02:46:43 +00:00

114 lines
3.3 KiB
JavaScript

// Code copied from [Rome](https://github.com/rome/tools/blob/main/npm/rome/scripts/generate-packages.mjs)
import { resolve } from "node:path";
import { fileURLToPath } from "node:url";
import * as fs from "node:fs";
const OXLINT_BIN_NAME = "oxlint";
const OXLS_BIN_NAME = "oxc_language_server";
const OXLINT_ROOT = resolve(fileURLToPath(import.meta.url), "../..");
const PACKAGES_ROOT = resolve(OXLINT_ROOT, "..");
const REPO_ROOT = resolve(PACKAGES_ROOT, "..");
const MANIFEST_PATH = resolve(OXLINT_ROOT, "package.json");
const rootManifest = JSON.parse(
fs.readFileSync(MANIFEST_PATH).toString("utf-8")
);
const LIBC_MAPPING = {
"gnu": "glibc",
"musl": "musl",
}
function generateNativePackage(target) {
const packageName = `@${OXLINT_BIN_NAME}/${target}`;
const packageRoot = resolve(PACKAGES_ROOT, `${OXLINT_BIN_NAME}-${target}`);
// Remove the directory just in case it already exists (it's autogenerated
// so there shouldn't be anything important there anyway)
fs.rmSync(packageRoot, { recursive: true, force: true });
// Create the package directory
console.log(`Create directory ${packageRoot}`);
fs.mkdirSync(packageRoot);
// Generate the package.json manifest
const { version, author, license, homepage, bugs, repository } = rootManifest;
const triple = target.split("-");
const platform = triple[0];
const arch = triple[1];
const libc = triple[2] && { libc: [LIBC_MAPPING[triple[2]]] }
const manifest = {
name: packageName,
version,
author,
license,
homepage,
bugs,
repository,
os: [platform],
cpu: [arch],
...libc
};
const manifestPath = resolve(packageRoot, "package.json");
console.log(`Create manifest ${manifestPath}`);
fs.writeFileSync(manifestPath, JSON.stringify(manifest));
// Copy the binary
const ext = platform === "win32" ? ".exe" : "";
const oxlintBinSource = resolve(REPO_ROOT, `${OXLINT_BIN_NAME}-${target}${ext}`);
const oxlintBinTarget = resolve(packageRoot, `${OXLINT_BIN_NAME}${ext}`);
const oxlsBinSource = resolve(REPO_ROOT, `${OXLS_BIN_NAME}-${target}${ext}`);
const oxlsBinTarget = resolve(packageRoot, `${OXLS_BIN_NAME}${ext}`);
console.log(`Copy linter binary ${oxlintBinSource}`);
fs.copyFileSync(oxlintBinSource, oxlintBinTarget);
fs.chmodSync(oxlintBinTarget, 0o755);
console.log(`Copy language server binary ${oxlsBinSource}`);
fs.copyFileSync(oxlsBinSource, oxlsBinTarget);
fs.chmodSync(oxlsBinTarget, 0o755);
}
function writeManifest() {
const manifestPath = resolve(PACKAGES_ROOT, OXLINT_BIN_NAME, "package.json");
const manifestData = JSON.parse(
fs.readFileSync(manifestPath).toString("utf-8")
);
const nativePackages = TARGETS.map((target) => [
`@${OXLINT_BIN_NAME}/${target}`,
rootManifest.version,
]);
manifestData["version"] = rootManifest.version;
manifestData["optionalDependencies"] = Object.fromEntries(nativePackages);
console.log(`Update manifest ${manifestPath}`);
const content = JSON.stringify(manifestData);
fs.writeFileSync(manifestPath, content);
}
// NOTE: Must update npm/oxlint/bin/oxlint
// and npm/oxlint/bin/oxc_language_server
const TARGETS = [
"win32-x64",
"win32-arm64",
"linux-x64-gnu",
"linux-arm64-gnu",
"linux-x64-musl",
"linux-arm64-musl",
"darwin-x64",
"darwin-arm64",
]
for (const target of TARGETS) {
generateNativePackage(target);
}
writeManifest();