UNPKG

weapp-ide-cli

Version:

让微信开发者工具,用起来更加方便!

333 lines (320 loc) 10.8 kB
// 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 };