weapp-ide-cli
Version:
让微信开发者工具,用起来更加方便!
333 lines (320 loc) • 10.8 kB
JavaScript
// src/logger.ts
import logger from "@weapp-core/logger";
var logger_default = logger;
// src/utils/path.ts
import process from "process";
import path from "pathe";
function resolvePath(filePath) {
if (path.isAbsolute(filePath)) {
return filePath;
}
return path.resolve(process.cwd(), filePath);
}
// src/utils/argv.ts
import process2 from "process";
function ensurePathArgument(argv, optionIndex) {
const paramIdx = optionIndex + 1;
const param = argv[paramIdx];
if (param && !param.startsWith("-")) {
argv[paramIdx] = resolvePath(param);
} else {
argv.splice(paramIdx, 0, process2.cwd());
}
return argv;
}
function transformArgv(argv, transforms) {
return transforms.reduce((current, transform) => transform(current), [
...argv
]);
}
function createAlias(entry) {
return (input2) => {
const argv = [...input2];
let optionIndex = argv.indexOf(entry.find);
if (optionIndex > -1) {
argv.splice(optionIndex, 1, entry.replacement);
} else {
optionIndex = argv.indexOf(entry.replacement);
}
if (optionIndex === -1) {
return argv;
}
return ensurePathArgument(argv, optionIndex);
};
}
function createPathCompat(option) {
return (input2) => {
const argv = [...input2];
const optionIndex = argv.indexOf(option);
if (optionIndex === -1) {
return argv;
}
return ensurePathArgument(argv, optionIndex);
};
}
// src/utils/exec.ts
import process3 from "process";
async function execute(cliPath, argv) {
const { execa } = await import("execa");
const task = execa(cliPath, argv);
task?.stdout?.pipe(process3.stdout);
task?.stderr?.pipe(process3.stderr);
await task;
}
// src/cli/minidev.ts
var MINIDEV_COMMAND = "minidev";
function isCommandNotFound(error) {
return Boolean(
error && typeof error === "object" && "code" in error && error.code === "ENOENT"
);
}
async function runMinidev(argv) {
try {
await execute(MINIDEV_COMMAND, [...argv]);
} catch (error) {
if (isCommandNotFound(error)) {
logger_default.error("\u672A\u68C0\u6D4B\u5230\u652F\u4ED8\u5B9D\u5C0F\u7A0B\u5E8F CLI\uFF1Aminidev");
logger_default.log("\u8BF7\u5148\u5B89\u88C5 minidev\uFF0C\u53EF\u4F7F\u7528\u4EE5\u4E0B\u4EFB\u4E00\u547D\u4EE4\uFF1A");
logger_default.log("- pnpm add -g minidev");
logger_default.log("- npm install -g minidev");
logger_default.log("- yarn global add minidev");
return;
}
throw error;
}
}
// src/config/paths.ts
import os from "os";
import path2 from "pathe";
var homedir = os.homedir();
var defaultCustomConfigDirPath = path2.join(homedir, ".weapp-ide-cli");
var defaultCustomConfigFilePath = path2.join(
defaultCustomConfigDirPath,
"config.json"
);
// src/config/custom.ts
import fs from "fs-extra";
var JSON_OPTIONS = {
encoding: "utf8",
spaces: 2
};
async function createCustomConfig(params) {
const trimmedCliPath = params.cliPath.trim();
if (!trimmedCliPath) {
throw new Error("cliPath cannot be empty");
}
const normalizedCliPath = resolvePath(trimmedCliPath);
await fs.ensureDir(defaultCustomConfigDirPath);
await fs.writeJSON(
defaultCustomConfigFilePath,
{
cliPath: normalizedCliPath
},
JSON_OPTIONS
);
return normalizedCliPath;
}
// src/cli/prompt.ts
import { stdin as input, stdout as output } from "process";
import { createInterface } from "readline/promises";
import fs2 from "fs-extra";
async function promptForCliPath() {
const rl = createInterface({ input, output });
try {
logger_default.log("\u8BF7\u8BBE\u7F6E\u5FAE\u4FE1web\u5F00\u53D1\u8005\u5DE5\u5177 CLI \u7684\u8DEF\u5F84");
logger_default.log("> \u63D0\u793A\uFF1A\u547D\u4EE4\u884C\u5DE5\u5177\u9ED8\u8BA4\u6240\u5728\u4F4D\u7F6E\uFF1A");
logger_default.log("- MacOS: <\u5B89\u88C5\u8DEF\u5F84>/Contents/MacOS/cli");
logger_default.log("- Windows: <\u5B89\u88C5\u8DEF\u5F84>/cli.bat");
logger_default.log("- Linux: <\u5B89\u88C5\u8DEF\u5F84>/files/bin/bin/wechat-devtools-cli");
const cliPath = (await rl.question("\u8BF7\u8F93\u5165\u5FAE\u4FE1web\u5F00\u53D1\u8005\u5DE5\u5177 CLI \u8DEF\u5F84\uFF1A")).trim();
if (!cliPath) {
logger_default.error("\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u5DF2\u53D6\u6D88\u672C\u6B21\u914D\u7F6E\u3002");
return null;
}
try {
const normalizedPath = await createCustomConfig({ cliPath });
logger_default.log(`\u5168\u5C40\u914D\u7F6E\u5B58\u50A8\u4F4D\u7F6E\uFF1A${defaultCustomConfigFilePath}`);
if (!await fs2.pathExists(normalizedPath)) {
logger_default.warn("\u5728\u5F53\u524D\u8DEF\u5F84\u672A\u627E\u5230\u5FAE\u4FE1web\u5F00\u53D1\u8005\u547D\u4EE4\u884C\u5DE5\u5177\uFF0C\u8BF7\u786E\u8BA4\u8DEF\u5F84\u662F\u5426\u6B63\u786E\u3002");
}
return normalizedPath;
} catch (error) {
const reason = error instanceof Error ? error.message : String(error);
logger_default.error(`\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25\uFF1A${reason}`);
return null;
}
} finally {
rl.close();
}
}
// src/runtime/platform.ts
import os2 from "os";
import process4 from "process";
import fs3 from "fs-extra";
import path3 from "pathe";
var SupportedPlatformsMap = {
Windows_NT: "Windows_NT",
Darwin: "Darwin",
Linux: "Linux"
};
function isOperatingSystemSupported(osName = os2.type()) {
return osName === SupportedPlatformsMap.Windows_NT || osName === SupportedPlatformsMap.Darwin || osName === SupportedPlatformsMap.Linux;
}
var operatingSystemName = os2.type();
function createLinuxCliResolver() {
let resolvedPath;
let attempted = false;
let pending = null;
return async () => {
if (attempted) {
return resolvedPath;
}
if (!pending) {
pending = (async () => {
try {
const envPath = await getFirstBinaryPath("wechat-devtools-cli");
if (envPath) {
resolvedPath = envPath;
}
} catch (error) {
const reason = error instanceof Error ? error.message : String(error);
logger_default.warn(`\u83B7\u53D6 Linux wechat-devtools-cli \u8DEF\u5F84\u5931\u8D25\uFF1A${reason}`);
} finally {
attempted = true;
}
return resolvedPath;
})();
}
return pending;
};
}
var linuxCliResolver = createLinuxCliResolver();
var WINDOWS_DEFAULT_CLI = "C:\\Program Files (x86)\\Tencent\\\u5FAE\u4FE1web\u5F00\u53D1\u8005\u5DE5\u5177\\cli.bat";
var DARWIN_DEFAULT_CLI = "/Applications/wechatwebdevtools.app/Contents/MacOS/cli";
var cliPathResolvers = {
[SupportedPlatformsMap.Windows_NT]: async () => WINDOWS_DEFAULT_CLI,
[SupportedPlatformsMap.Darwin]: async () => DARWIN_DEFAULT_CLI,
[SupportedPlatformsMap.Linux]: linuxCliResolver
};
async function getDefaultCliPath(targetOs = operatingSystemName) {
if (!isOperatingSystemSupported(targetOs)) {
return void 0;
}
const resolver = cliPathResolvers[targetOs];
const resolvedPath = await resolver();
return resolvedPath;
}
async function getFirstBinaryPath(command) {
const envPath = process4.env.PATH || "";
const pathDirs = envPath.split(path3.delimiter);
for (const dir of pathDirs) {
const fullPath = path3.join(dir, command);
try {
await fs3.access(fullPath, fs3.constants.X_OK);
return fullPath;
} catch {
continue;
}
}
return void 0;
}
// src/config/resolver.ts
import fs4 from "fs-extra";
async function getConfig() {
if (await fs4.pathExists(defaultCustomConfigFilePath)) {
try {
const config = await fs4.readJSON(defaultCustomConfigFilePath);
const cliPath = typeof config.cliPath === "string" ? config.cliPath.trim() : "";
if (cliPath) {
logger_default.log("> \u5168\u5C40\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF1A", defaultCustomConfigFilePath);
logger_default.log("> \u81EA\u5B9A\u4E49 CLI \u8DEF\u5F84\uFF1A", cliPath);
return {
cliPath,
source: "custom"
};
}
logger_default.warn("\u81EA\u5B9A\u4E49\u914D\u7F6E\u6587\u4EF6\u7F3A\u5C11\u6709\u6548\u7684 CLI \u8DEF\u5F84\uFF0C\u5C06\u5C1D\u8BD5\u4F7F\u7528\u9ED8\u8BA4\u8DEF\u5F84\u3002");
} catch (error) {
const reason = error instanceof Error ? error.message : String(error);
logger_default.warn(`\u89E3\u6790\u81EA\u5B9A\u4E49\u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u5C1D\u8BD5\u4F7F\u7528\u9ED8\u8BA4\u8DEF\u5F84\u3002\u539F\u56E0\uFF1A${reason}`);
}
}
const fallbackPath = await getDefaultCliPath();
if (fallbackPath) {
return {
cliPath: fallbackPath,
source: "default"
};
}
return {
cliPath: "",
source: "missing"
};
}
// src/cli/resolver.ts
import fs5 from "fs-extra";
async function resolveCliPath() {
const config = await getConfig();
if (!config.cliPath) {
return { cliPath: null, source: config.source };
}
const exists = await fs5.pathExists(config.cliPath);
return {
cliPath: exists ? config.cliPath : null,
source: config.source
};
}
// src/cli/run.ts
var ARG_TRANSFORMS = [
createAlias({ find: "-p", replacement: "--project" }),
createPathCompat("--result-output"),
createPathCompat("-r"),
createPathCompat("--qr-output"),
createPathCompat("-o"),
createPathCompat("--info-output"),
createPathCompat("-i")
];
async function parse(argv) {
const head = argv[0];
if (head && ["alipay", "ali", "minidev"].includes(head)) {
await runMinidev(argv.slice(1));
return;
}
if (!isOperatingSystemSupported(operatingSystemName)) {
logger_default.log(`\u5FAE\u4FE1web\u5F00\u53D1\u8005\u5DE5\u5177\u4E0D\u652F\u6301\u5F53\u524D\u5E73\u53F0\uFF1A${operatingSystemName} !`);
return;
}
if (head === "config") {
await promptForCliPath();
return;
}
const { cliPath, source } = await resolveCliPath();
if (!cliPath) {
const message = source === "custom" ? "\u5728\u5F53\u524D\u81EA\u5B9A\u4E49\u8DEF\u5F84\u4E2D\u672A\u627E\u5230\u5FAE\u4FE1web\u5F00\u53D1\u8005\u547D\u4EE4\u884C\u5DE5\u5177\uFF0C\u8BF7\u91CD\u65B0\u6307\u5B9A\u8DEF\u5F84\u3002" : "\u672A\u68C0\u6D4B\u5230\u5FAE\u4FE1web\u5F00\u53D1\u8005\u547D\u4EE4\u884C\u5DE5\u5177\uFF0C\u8BF7\u6267\u884C `weapp-ide-cli config` \u6307\u5B9A\u8DEF\u5F84\u3002";
logger_default.log(message);
await promptForCliPath();
return;
}
const formattedArgv = transformArgv(argv, ARG_TRANSFORMS);
await execute(cliPath, formattedArgv);
}
export {
logger_default,
resolvePath,
transformArgv,
createAlias,
createPathCompat,
execute,
runMinidev,
defaultCustomConfigDirPath,
defaultCustomConfigFilePath,
createCustomConfig,
promptForCliPath,
SupportedPlatformsMap,
isOperatingSystemSupported,
operatingSystemName,
getDefaultCliPath,
getConfig,
resolveCliPath,
parse
};