// 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 BIN_NAME = "oxlint"; 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") ); function generateNativePackage(platform, arch) { const packageName = `@${BIN_NAME}/${platform}-${arch}`; const packageRoot = resolve(PACKAGES_ROOT, `${BIN_NAME}-${platform}-${arch}`); // 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 manifest = JSON.stringify({ name: packageName, version, author, license, homepage, bugs, repository, os: [platform], cpu: [arch], }); const manifestPath = resolve(packageRoot, "package.json"); console.log(`Create manifest ${manifestPath}`); fs.writeFileSync(manifestPath, manifest); // Copy the binary const ext = platform === "win32" ? ".exe" : ""; const binarySource = resolve(REPO_ROOT, `${BIN_NAME}-${platform}-${arch}${ext}`); const binaryTarget = resolve(packageRoot, `${BIN_NAME}${ext}`); console.log(`Copy binary ${binaryTarget}`); fs.copyFileSync(binarySource, binaryTarget); fs.chmodSync(binaryTarget, 0o755); } function writeManifest() { const manifestPath = resolve(PACKAGES_ROOT, BIN_NAME, "package.json"); const manifestData = JSON.parse( fs.readFileSync(manifestPath).toString("utf-8") ); const nativePackages = PLATFORMS.flatMap((platform) => ARCHITECTURES.map((arch) => [ `@${BIN_NAME}/${platform}-${arch}`, 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); } const PLATFORMS = ["win32", "darwin", "linux"]; const ARCHITECTURES = ["x64", "arm64"]; for (const platform of PLATFORMS) { for (const arch of ARCHITECTURES) { generateNativePackage(platform, arch); } } writeManifest();