@arkts/sdk-downloader
Version:
Download and extract the ArkTS SDK.
108 lines (105 loc) • 3.9 kB
JavaScript
import { SdkArch, SdkOS, SdkVersion, createDownloader, getSdkUrl } from "./download-CqQ1ND4L.js";
import fs from "node:fs";
import path from "node:path";
import process from "node:process";
import P from "pino";
import pretty from "pino-pretty";
//#region src/errors/cli.ts
var CliError = class extends Error {
constructor(message, cliOptions) {
super(message);
this.cliOptions = cliOptions;
}
};
//#endregion
//#region src/command-line.ts
function isLogType(logType) {
return [
"explicit",
"full",
"silent"
].includes(logType);
}
async function logSdkDirStructure(logger, unResolveSdkDir) {
const sdkDir = path.resolve(unResolveSdkDir);
const sdkDirContents = fs.readdirSync(sdkDir);
logger.info({ sdkDirContents }, `SDK directory structure:`);
sdkDirContents.forEach((item) => {
const ohUniPackageJson = path.resolve(sdkDir, item, "oh-uni-package.json");
logger.info({
msg: `|- ${path.resolve(sdkDir, item)}`,
ohUniPackageJson: fs.existsSync(ohUniPackageJson) ? JSON.parse(fs.readFileSync(ohUniPackageJson, "utf-8")) : null
});
});
}
async function runCommandLineDownload(options) {
if (!options.apiVersion || !options.arch || !options.os) throw new CliError("Please provide --api-version, --arch, and --os options.", options);
if (!isLogType(options.logType)) throw new CliError(`Invalid log type: ${options.logType}. Valid options are 'explicit', 'full', or 'silent'.`, options);
const url = getSdkUrl(SdkVersion[options.apiVersion], SdkArch[options.arch], SdkOS[options.os]);
if (!url) throw new CliError(`No SDK found for version ${options.apiVersion}, architecture ${options.arch}, and OS ${options.os}.`, options);
const logger = options.logger ?? P(pretty({
colorize: true,
colorizeObjects: true,
singleLine: true
}));
logger.info(options, `CLI Options:`);
const abortController = new AbortController();
process.on("exit", () => abortController.abort());
const downloader = await createDownloader({
url,
cacheDir: options.cacheDir,
targetDir: options.targetDir,
resumeDownload: true,
signal: abortController.signal
});
downloader.on("*", (ev, data) => {
if (options.logType === "silent") return;
if (options.logType === "full") return logger.info({
event: ev,
data
}, `Event: ${ev}`);
});
if (options.logType === "explicit") {
let lastLogTime = 0;
downloader.on("download-progress", (progress) => {
const now = Date.now();
if (now - lastLogTime >= options.logTimeout) {
logger.info({
...progress,
msg: `Percentage: ${progress.percentage.toFixed(2)}%, current speed: ${progress.network}${progress.unit}/s`
});
lastLogTime = now;
}
});
downloader.on("zip-extracted", (entry) => {
const now = Date.now();
if (now - lastLogTime >= options.logTimeout) {
logger.info(entry, `Extracted file in zip: ${entry.path}...`);
lastLogTime = now;
}
});
downloader.on("tar-extracted", (entry) => {
const now = Date.now();
if (now - lastLogTime >= options.logTimeout) {
logger.info(entry, `Extracted file in tar.gz: ${entry.path}...`);
lastLogTime = now;
}
});
}
logger.info(`Starting download from ${url}`);
await downloader.startDownload();
logger.info(`Download completed and saved to ${options.targetDir}, starting SHA256 check...`);
await downloader.checkSha256();
logger.info(`SHA256 check passed, SDK is ready in ${options.targetDir}, starting extract tar...`);
await downloader.extractTar();
logger.info(`SDK extracted successfully, starting extract zip...`);
await downloader.extractZip();
logger.info(`SDK extracted successfully, cleanup...`);
await downloader.clean();
logger.info(`Cleanup completed, SDK is ready in ${options.targetDir}.`);
await logSdkDirStructure(logger, options.targetDir);
return { logger };
}
//#endregion
export { logSdkDirStructure, runCommandLineDownload };
//# sourceMappingURL=command-line-CAjWCubB.js.map