utils.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.showRunPrompt = exports.printStartupDuration = exports.cleanOptions = exports.initEnv = exports.addConfigFile = exports.PLATFORMS = void 0;
  7. const fs_1 = __importDefault(require("fs"));
  8. const os_1 = __importDefault(require("os"));
  9. const path_1 = __importDefault(require("path"));
  10. const picocolors_1 = __importDefault(require("picocolors"));
  11. const perf_hooks_1 = require("perf_hooks");
  12. const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
  13. const nvue_1 = require("./nvue");
  14. const uvue_1 = require("./uvue");
  15. exports.PLATFORMS = [
  16. 'app',
  17. 'h5',
  18. 'mp-alipay',
  19. 'mp-baidu',
  20. 'mp-qq',
  21. 'mp-lark',
  22. 'mp-toutiao',
  23. 'mp-weixin',
  24. 'quickapp-webview',
  25. 'quickapp-webview-huawei',
  26. 'quickapp-webview-union',
  27. ];
  28. function resolveConfigFile() {
  29. const viteConfigJs = path_1.default.resolve(process.env.UNI_INPUT_DIR, 'vite.config.js');
  30. const viteConfigTs = path_1.default.resolve(process.env.UNI_INPUT_DIR, 'vite.config.ts');
  31. if (fs_1.default.existsSync(viteConfigTs)) {
  32. return viteConfigTs;
  33. }
  34. if (fs_1.default.existsSync(viteConfigJs)) {
  35. return viteConfigJs;
  36. }
  37. return path_1.default.resolve(process.env.UNI_CLI_CONTEXT, 'vite.config.js');
  38. }
  39. function addConfigFile(inlineConfig) {
  40. if ((0, uni_cli_shared_1.isInHBuilderX)()) {
  41. inlineConfig.configFile = resolveConfigFile();
  42. }
  43. return inlineConfig;
  44. }
  45. exports.addConfigFile = addConfigFile;
  46. let initialized = false;
  47. function initEnv(type, options) {
  48. if (initialized) {
  49. return;
  50. }
  51. initialized = true;
  52. if (options.platform === 'mp-360') {
  53. console.error(uni_cli_shared_1.M['mp.360.unsupported']);
  54. process.exit(0);
  55. }
  56. if (options.platform === 'web') {
  57. options.platform = 'h5';
  58. }
  59. if (options.plugin) {
  60. process.env.UNI_MP_PLUGIN = 'true';
  61. }
  62. // TODO 需要识别 mode
  63. if (type === 'dev') {
  64. process.env.NODE_ENV = 'development';
  65. }
  66. else if (type === 'build') {
  67. if (options.watch) {
  68. process.env.NODE_ENV = 'development';
  69. }
  70. else {
  71. process.env.NODE_ENV = 'production';
  72. }
  73. }
  74. if (!options.mode) {
  75. options.mode = process.env.NODE_ENV;
  76. }
  77. // vite 会修改 NODE_ENV,存储在 UNI_NODE_ENV 中,稍后校正 NODE_ENV
  78. process.env.UNI_NODE_ENV = process.env.VITE_USER_NODE_ENV =
  79. process.env.NODE_ENV;
  80. process.env.UNI_CLI_CONTEXT = (0, uni_cli_shared_1.isInHBuilderX)()
  81. ? path_1.default.resolve(process.env.UNI_HBUILDERX_PLUGINS, 'uniapp-cli-vite')
  82. : process.cwd();
  83. // TODO 待优化
  84. initUTSPlatform(options);
  85. if (options.platform === 'quickapp-webview-huawei' ||
  86. options.platform === 'quickapp-webview-union') {
  87. process.env.UNI_SUB_PLATFORM = options.platform;
  88. options.platform = 'quickapp-webview';
  89. }
  90. process.env.VITE_ROOT_DIR =
  91. process.env.VITE_ROOT_DIR || process.env.UNI_INPUT_DIR || process.cwd();
  92. process.env.UNI_INPUT_DIR =
  93. process.env.UNI_INPUT_DIR || path_1.default.resolve(process.cwd(), 'src');
  94. initCustomScripts(options);
  95. process.env.UNI_PLATFORM = options.platform;
  96. const hasOutputDir = !!process.env.UNI_OUTPUT_DIR;
  97. if (hasOutputDir) {
  98. ;
  99. options.outDir = process.env.UNI_OUTPUT_DIR;
  100. }
  101. else {
  102. if (!options.outDir) {
  103. ;
  104. options.outDir = path_1.default.resolve(process.cwd(), 'dist', process.env.NODE_ENV === 'production' ? 'build' : 'dev', (0, uni_cli_shared_1.getPlatformDir)());
  105. }
  106. process.env.UNI_OUTPUT_DIR = options.outDir;
  107. }
  108. // 兼容 HBuilderX 旧参数
  109. if (process.env.UNI_SUBPACKGE) {
  110. options.subpackage = process.env.UNI_SUBPACKGE;
  111. }
  112. if (options.subpackage) {
  113. process.env.UNI_SUBPACKAGE = options.subpackage;
  114. if (!hasOutputDir) {
  115. // 未指定,则自动补充
  116. process.env.UNI_OUTPUT_DIR = options.outDir =
  117. path_1.default.resolve(process.env.UNI_OUTPUT_DIR, options.subpackage);
  118. }
  119. }
  120. initAutomator(options);
  121. initDevtools(options);
  122. if (process.env.UNI_PLATFORM === 'app') {
  123. (0, nvue_1.initNVueEnv)();
  124. }
  125. if (process.env.NODE_ENV === 'development') {
  126. console.log(uni_cli_shared_1.M['dev.performance'] +
  127. (process.env.UNI_PLATFORM.startsWith('mp-')
  128. ? uni_cli_shared_1.M['dev.performance.mp']
  129. : '') +
  130. (process.env.UNI_PLATFORM === 'web' || process.env.UNI_PLATFORM === 'h5'
  131. ? uni_cli_shared_1.M['dev.performance.web']
  132. : ''));
  133. }
  134. if (options.sourcemap &&
  135. process.env.NODE_ENV === 'production') {
  136. process.env.SOURCEMAP = 'true';
  137. }
  138. (0, uni_cli_shared_1.initModulePaths)();
  139. (0, uvue_1.initUVueEnv)();
  140. const pkg = require('../../package.json');
  141. process.env.UNI_COMPILER_VERSION =
  142. process.env.UNI_COMPILER_VERSION ||
  143. pkg['uni-app']?.['compilerVersion'] ||
  144. '';
  145. process.env.UNI_COMPILER_VERSION_TYPE = pkg.version.includes('alpha')
  146. ? 'a'
  147. : 'r';
  148. (0, uni_cli_shared_1.initPreContext)(process.env.UNI_PLATFORM, process.env.UNI_CUSTOM_CONTEXT, process.env.UNI_UTS_PLATFORM, process.env.UNI_APP_X === 'true');
  149. if (process.env.UNI_PLATFORM === 'app' ||
  150. process.env.UNI_PLATFORM === 'web' ||
  151. process.env.UNI_PLATFORM === 'h5') {
  152. console.log(uni_cli_shared_1.M['app.compiler.version'].replace('{version}', process.env.UNI_COMPILER_VERSION +
  153. `(${process.env.UNI_APP_X === 'true' ? 'uni-app x' : 'vue3'})`));
  154. }
  155. console.log(uni_cli_shared_1.M['compiling']);
  156. }
  157. exports.initEnv = initEnv;
  158. function initUTSPlatform(options) {
  159. if (options.platform === 'app-android') {
  160. process.env.UNI_UTS_PLATFORM = 'app-android';
  161. options.platform = 'app';
  162. }
  163. else if (options.platform === 'app-ios') {
  164. process.env.UNI_UTS_PLATFORM = 'app-ios';
  165. options.platform = 'app';
  166. }
  167. else {
  168. // 运行时,可能传入了 UNI_APP_PLATFORM = 'android'|'ios'
  169. if (process.env.UNI_APP_PLATFORM === 'android') {
  170. process.env.UNI_UTS_PLATFORM = 'app-android';
  171. }
  172. if (process.env.UNI_APP_PLATFORM === 'ios') {
  173. process.env.UNI_UTS_PLATFORM = 'app-ios';
  174. }
  175. if (options.platform === 'app-plus') {
  176. options.platform = 'app';
  177. }
  178. if (options.platform === 'app') {
  179. // app 平台未指定 UTS_PLATFORM 时,设置未 app,一般是发行模式
  180. if (!process.env.UNI_UTS_PLATFORM) {
  181. process.env.UNI_UTS_PLATFORM = 'app';
  182. }
  183. }
  184. }
  185. if (options.platform === 'h5') {
  186. process.env.UNI_UTS_PLATFORM = 'web';
  187. }
  188. // 非 app 平台,自动补充 UNI_UTS_PLATFORM
  189. // app 平台,必须主动传入
  190. if (options.platform !== 'app') {
  191. if (!process.env.UNI_UTS_PLATFORM) {
  192. process.env.UNI_UTS_PLATFORM = options.platform;
  193. }
  194. }
  195. process.env.UNI_UTS_TARGET_LANGUAGE = 'javascript';
  196. if (process.env.UNI_UTS_PLATFORM === 'app-android') {
  197. process.env.UNI_UTS_TARGET_LANGUAGE = 'kotlin';
  198. }
  199. else if (process.env.UNI_UTS_PLATFORM === 'app-ios') {
  200. process.env.UNI_UTS_TARGET_LANGUAGE = 'swift';
  201. }
  202. }
  203. function initDevtools({ devtools, devtoolsHost, devtoolsPort }) {
  204. if (!devtools) {
  205. return;
  206. }
  207. process.env.__VUE_PROD_DEVTOOLS__ = 'true';
  208. if (devtoolsHost) {
  209. process.env.__VUE_DEVTOOLS_HOST__ = devtoolsHost;
  210. }
  211. if (devtoolsPort) {
  212. process.env.__VUE_DEVTOOLS_PORT__ = devtoolsPort + '';
  213. }
  214. }
  215. function initAutomator({ autoHost, autoPort }) {
  216. const hasAutoHostOrPort = autoHost || autoPort || process.env.UNI_AUTOMATOR_HOST;
  217. // 发行分包,插件也不需要自动化测试
  218. if (!hasAutoHostOrPort ||
  219. process.env.UNI_SUBPACKAGE ||
  220. process.env.UNI_MP_PLUGIN) {
  221. return;
  222. }
  223. process.env.UNI_AUTOMATOR_WS_ENDPOINT =
  224. 'ws://' +
  225. (autoHost || process.env.UNI_AUTOMATOR_HOST || resolveHostname()) +
  226. ':' +
  227. (autoPort || process.env.UNI_AUTOMATOR_PORT);
  228. }
  229. function resolveHostname() {
  230. const interfaces = os_1.default.networkInterfaces();
  231. const keys = Object.keys(interfaces);
  232. for (const key of keys) {
  233. const interfaceInfos = interfaces[key];
  234. if (!interfaceInfos) {
  235. continue;
  236. }
  237. for (const info of interfaceInfos) {
  238. if ((info.family === 'IPv4' ||
  239. /* Node >= v18 */ info.family === 4) &&
  240. !info.address.includes('127.0.0.1')) {
  241. return info.address;
  242. }
  243. }
  244. }
  245. return 'localhost';
  246. }
  247. function cleanOptions(options) {
  248. const ret = { ...options };
  249. delete ret['--'];
  250. delete ret.c;
  251. delete ret.config;
  252. delete ret.platform;
  253. delete ret.p;
  254. delete ret.ssr;
  255. delete ret.base;
  256. delete ret.debug;
  257. delete ret.d;
  258. delete ret.filter;
  259. delete ret.f;
  260. delete ret.logLevel;
  261. delete ret.l;
  262. delete ret.clearScreen;
  263. delete ret.m;
  264. delete ret.mode;
  265. delete ret.autoHost;
  266. delete ret.autoPort;
  267. return ret;
  268. }
  269. exports.cleanOptions = cleanOptions;
  270. function printStartupDuration(logger, whitespace = true) {
  271. // @ts-ignore
  272. if (global.__vite_start_time) {
  273. // @ts-ignore
  274. const startupDuration = perf_hooks_1.performance.now() - global.__vite_start_time;
  275. logger.info(`${whitespace ? `\n ` : ''}${picocolors_1.default.cyan(`ready in ${Math.ceil(startupDuration)}ms.`)}\n`);
  276. }
  277. }
  278. exports.printStartupDuration = printStartupDuration;
  279. function initCustomScripts(options) {
  280. const custom = (0, uni_cli_shared_1.parseScripts)(process.env.UNI_SCRIPT || options.platform, // process.env.UNI_SCRIPT 是 HBuilderX 传递的
  281. path_1.default.join(process.env.VITE_ROOT_DIR, 'package.json'));
  282. if (!custom) {
  283. return;
  284. }
  285. options.platform = custom.platform;
  286. process.env.UNI_CUSTOM_SCRIPT = custom.name;
  287. process.env.UNI_CUSTOM_DEFINE = JSON.stringify(custom.define);
  288. process.env.UNI_CUSTOM_CONTEXT = JSON.stringify(custom.context);
  289. }
  290. function showRunPrompt(platform) {
  291. if (!(0, uni_cli_shared_1.isInHBuilderX)()) {
  292. const devtools = getPlatformDevtools(getOriginalPlatform(platform));
  293. const outputDir = path_1.default.relative(process.env.UNI_CLI_CONTEXT, process.env.UNI_OUTPUT_DIR);
  294. (0, uni_cli_shared_1.output)('log', `${uni_cli_shared_1.M['prompt.run.message']
  295. .replace('{devtools}', uni_cli_shared_1.M[devtools])
  296. .replace('{outputDir}', picocolors_1.default.cyan(outputDir))}`);
  297. }
  298. }
  299. exports.showRunPrompt = showRunPrompt;
  300. function getOriginalPlatform(platform) {
  301. if (platform.startsWith('quickapp-webview') && process.env.UNI_SUB_PLATFORM) {
  302. return process.env.UNI_SUB_PLATFORM;
  303. }
  304. return platform;
  305. }
  306. function getPlatformDevtools(platform) {
  307. return `prompt.run.devtools.${platform}`;
  308. }