nw
Version:
An installer for NW.js
64 lines (58 loc) • 3.42 kB
JavaScript
import fs from 'node:fs';
import path from 'node:path';
import process from 'node:process';
import url from 'node:url';
import semver from 'semver';
import util from '../src/util.js';
/**
* @typedef {object} ParseOptions
* @property {string | "latest" | "stable" | "lts"} version Runtime version
* @property {"normal" | "sdk"} flavor Build flavor
* @property {"linux" | "osx" | "win"} platform Target platform
* @property {"ia32" | "x64" | "arm64"} arch Target arch
* @property {string} downloadUrl Download server.
* @property {string} cacheDir Cache directory
* @property {string} srcDir Source directory
* @property {boolean} cache If false, remove cache and redownload.
* @property {boolean} ffmpeg If true, ffmpeg is not downloaded.
* @property {false | "gyp"} nativeAddon Rebuild native modules
* @property {boolean} unref Unref the child process and unblock the caller
*/
/**
* Parse options.
*
* @param {ParseOptions} options
* @return {Promise<ParseOptions>}
*/
export default async function parse(options) {
const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
/**
* @type {fs.PathLike}
*/
const nodeManifestPath = path.resolve(__dirname, '..', 'package.json');
/**
* @type {object}
*/
const nodeManifest = JSON.parse(await fs.promises.readFile(nodeManifestPath, { encoding: 'utf-8' }));
options.version = options.version ?? nodeManifest.version;
const parsedVersion = semver.parse(options.version);
options.version = [
parsedVersion.major,
parsedVersion.minor,
parsedVersion.patch
].join('.');
options.flavor = options.flavor || process.env.npm_config_nwjs_build_type || process.env.NWJS_BUILD_TYPE || 'normal';
if (String(parsedVersion?.prerelease[0]).endsWith('sdk')) {
options.flavor = 'sdk';
}
options.platform = options.platform || util.PLATFORM_KV[process.env.npm_config_nwjs_platform || process.env.NWJS_PLATFORM || process.platform];
options.arch = options.arch || util.ARCH_KV[process.env.npm_config_nwjs_process_arch || process.env.NWJS_ARCH || process.arch];
options.downloadUrl = options.downloadUrl || process.env.npm_config_nwjs_urlbase || process.env.NWJS_URLBASE || 'https://dl.nwjs.io';
options.cacheDir = options.npm_config_nwjs_urlbase || process.env.npm_config_nwjs_cache_dir || process.env.NWJS_CACHE_DIR || path.resolve(__dirname, '..');
options.srcDir = options.srcDir || process.cwd();
options.cache ??= process.env.npm_config_nwjs_cache !== 'false' && process.env.NWJS_CACHE !== 'false';
options.ffmpeg ??= process.env.npm_config_nwjs_ffmpeg === 'true' || process.env.NWJS_FFMPEG === 'true';
options.nativeAddon ??= (process.env.npm_config_nwjs_native_addon === 'gyp' || process.env.NWJS_NATIVE_ADDON === 'gyp') ? 'gyp' : false;
options.unref ??= process.env.npm_config_nwjs_unref === 'true' || process.env.NWJS_UNREF === 'true';
return { ...options };
}