utils.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. "use strict";
  2. var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
  3. if (k2 === undefined) k2 = k;
  4. var desc = Object.getOwnPropertyDescriptor(m, k);
  5. if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
  6. desc = { enumerable: true, get: function() { return m[k]; } };
  7. }
  8. Object.defineProperty(o, k2, desc);
  9. }) : (function(o, m, k, k2) {
  10. if (k2 === undefined) k2 = k;
  11. o[k2] = m[k];
  12. }));
  13. var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
  14. Object.defineProperty(o, "default", { enumerable: true, value: v });
  15. }) : function(o, v) {
  16. o["default"] = v;
  17. });
  18. var __importStar = (this && this.__importStar) || function (mod) {
  19. if (mod && mod.__esModule) return mod;
  20. var result = {};
  21. if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
  22. __setModuleDefault(result, mod);
  23. return result;
  24. };
  25. var __importDefault = (this && this.__importDefault) || function (mod) {
  26. return (mod && mod.__esModule) ? mod : { "default": mod };
  27. };
  28. Object.defineProperty(exports, "__esModule", { value: true });
  29. exports.resolveSourceMapFile = exports.relative = exports.isColorSupported = exports.parseSwiftPackageWithPluginId = exports.parseKotlinPackageWithPluginId = exports.genConfigJson = exports.genComponentsCode = exports.resolveIOSComponents = exports.resolveAndroidComponents = exports.getCompilerServer = exports.createResolveTypeReferenceName = exports.resolveUTSPlatformFile = exports.resolveIOSDir = exports.resolveAndroidDir = exports.isRootIndex = exports.moveRootIndexSourceMap = exports.genUTSPlatformResource = exports.resolvePackage = exports.getUTSCompiler = exports.resolveUTSSourceMapPath = exports.ERR_MSG_PLACEHOLDER = void 0;
  30. const path_1 = __importStar(require("path"));
  31. const fs_extra_1 = __importDefault(require("fs-extra"));
  32. const shared_1 = require("@vue/shared");
  33. const fast_glob_1 = __importDefault(require("fast-glob"));
  34. const shared_2 = require("./shared");
  35. exports.ERR_MSG_PLACEHOLDER = `___ERR_MSG___`;
  36. function resolveUTSSourceMapPath() {
  37. return (0, shared_2.resolveSourceMapPath)();
  38. }
  39. exports.resolveUTSSourceMapPath = resolveUTSSourceMapPath;
  40. function getUTSCompiler() {
  41. // eslint-disable-next-line no-restricted-globals
  42. return require('@dcloudio/uts');
  43. }
  44. exports.getUTSCompiler = getUTSCompiler;
  45. function resolvePackage(filename) {
  46. const parts = (0, shared_2.normalizePath)(filename).split('/');
  47. const isUniModules = parts.includes('uni_modules');
  48. const index = isUniModules
  49. ? parts.findIndex((part) => part === 'uni_modules')
  50. : parts.findIndex((part) => part === 'utssdk');
  51. if (index > -1) {
  52. const id = parts[index + 1];
  53. const name = (0, shared_1.camelize)(prefix(id));
  54. return {
  55. id,
  56. name,
  57. namespace: 'UTSSDK' + (isUniModules ? 'Modules' : '') + (0, shared_1.capitalize)(name),
  58. is_uni_modules: isUniModules,
  59. extname: '.uts',
  60. };
  61. }
  62. }
  63. exports.resolvePackage = resolvePackage;
  64. function genUTSPlatformResource(filename, options) {
  65. const platformFile = resolveUTSPlatformFile(filename, options);
  66. const { platform } = options;
  67. const utsInputDir = resolveUTSPlatformDir(filename, platform);
  68. const utsOutputDir = resolveUTSPlatformDir(platformFile, platform);
  69. // 拷贝所有非uts,vue文件及目录
  70. if (fs_extra_1.default.existsSync(utsInputDir)) {
  71. fs_extra_1.default.copySync(utsInputDir, utsOutputDir, {
  72. filter(src) {
  73. if (src.endsWith('config.json')) {
  74. return false;
  75. }
  76. return !['.uts', '.vue'].includes(path_1.default.extname(src));
  77. },
  78. });
  79. }
  80. copyConfigJson(utsInputDir, utsOutputDir, options.components, options.package);
  81. // 生产模式下,需要将生成的平台文件转移到 src 下
  82. const srcDir = path_1.default.resolve(utsOutputDir, 'src');
  83. if (!fs_extra_1.default.existsSync(srcDir)) {
  84. fs_extra_1.default.mkdirSync(srcDir);
  85. }
  86. if (fs_extra_1.default.existsSync(platformFile)) {
  87. fs_extra_1.default.moveSync(platformFile, path_1.default.resolve(utsOutputDir, 'src/index' + options.extname), {
  88. overwrite: true,
  89. });
  90. }
  91. }
  92. exports.genUTSPlatformResource = genUTSPlatformResource;
  93. function moveRootIndexSourceMap(filename, { inputDir, platform, extname }) {
  94. if (isRootIndex(filename, platform)) {
  95. const sourceMapFilename = path_1.default
  96. .resolve(resolveUTSSourceMapPath(), path_1.default.relative(inputDir, filename))
  97. .replace(path_1.default.extname(filename), extname + '.map');
  98. if (fs_extra_1.default.existsSync(sourceMapFilename)) {
  99. const newSourceMapFilename = path_1.default.resolve(path_1.default.dirname(sourceMapFilename), platform, path_1.default.basename(sourceMapFilename));
  100. fs_extra_1.default.moveSync(sourceMapFilename, newSourceMapFilename, {
  101. overwrite: true,
  102. });
  103. }
  104. }
  105. }
  106. exports.moveRootIndexSourceMap = moveRootIndexSourceMap;
  107. function isRootIndex(filename, platform) {
  108. return path_1.default.basename(path_1.default.dirname(filename)) !== platform;
  109. }
  110. exports.isRootIndex = isRootIndex;
  111. function resolveAndroidDir(filename) {
  112. return resolveUTSPlatformDir(filename, 'app-android');
  113. }
  114. exports.resolveAndroidDir = resolveAndroidDir;
  115. function resolveIOSDir(filename) {
  116. return resolveUTSPlatformDir(filename, 'app-ios');
  117. }
  118. exports.resolveIOSDir = resolveIOSDir;
  119. function resolveUTSPlatformDir(filename, platform) {
  120. const maybePlatformDir = path_1.default.dirname(filename);
  121. if (isRootIndex(filename, platform)) {
  122. return path_1.default.join(maybePlatformDir, platform);
  123. }
  124. return maybePlatformDir;
  125. }
  126. function resolveUTSPlatformFile(filename, { inputDir, outputDir, platform, extname }) {
  127. let platformFile = path_1.default
  128. .resolve(outputDir, path_1.default.relative(inputDir, filename))
  129. .replace(path_1.default.extname(filename), extname);
  130. // 如果是根目录的 index.uts 编译出来的 index.kt,则移动到平台目录下
  131. if (isRootIndex(filename, platform)) {
  132. if (fs_extra_1.default.existsSync(platformFile)) {
  133. const newPlatformFile = path_1.default.resolve(path_1.default.dirname(platformFile), platform + '/index' + extname);
  134. fs_extra_1.default.moveSync(platformFile, newPlatformFile, {
  135. overwrite: true,
  136. });
  137. platformFile = newPlatformFile;
  138. }
  139. }
  140. return platformFile;
  141. }
  142. exports.resolveUTSPlatformFile = resolveUTSPlatformFile;
  143. function resolveTypeAliasDeclNames(items) {
  144. const names = [];
  145. items.forEach((item) => {
  146. if (item.type === 'TsTypeAliasDeclaration') {
  147. names.push(item.id.value);
  148. }
  149. });
  150. return names;
  151. }
  152. function createResolveTypeReferenceName(namespace, ast, interfaceTypes) {
  153. const names = resolveTypeAliasDeclNames(ast.body);
  154. return (name) => {
  155. if (names.includes(name) || interfaceTypes.includes(name)) {
  156. return namespace + (0, shared_1.capitalize)(name) + 'JSONObject';
  157. }
  158. return name;
  159. };
  160. }
  161. exports.createResolveTypeReferenceName = createResolveTypeReferenceName;
  162. function getCompilerServer(pluginName) {
  163. if (!process.env.UNI_HBUILDERX_PLUGINS) {
  164. console.error(`HBuilderX is not found`);
  165. return;
  166. }
  167. const compilerServerPath = path_1.default.resolve(process.env.UNI_HBUILDERX_PLUGINS, `${pluginName}/out/${pluginName === 'uniapp-runextension' ? 'main.js' : 'external.js'}`);
  168. if (fs_extra_1.default.existsSync(compilerServerPath)) {
  169. // eslint-disable-next-line no-restricted-globals
  170. return require(compilerServerPath);
  171. }
  172. else {
  173. if ((0, shared_2.runByHBuilderX)()) {
  174. (0, shared_2.installHBuilderXPlugin)(pluginName);
  175. }
  176. else {
  177. console.error(compilerServerPath + ' is not found');
  178. }
  179. }
  180. }
  181. exports.getCompilerServer = getCompilerServer;
  182. function resolveComponents(platform, pluginDir, is_uni_modules) {
  183. const components = {};
  184. const platformDir = path_1.default.resolve(pluginDir, is_uni_modules ? 'utssdk' : '', platform);
  185. if (fs_extra_1.default.existsSync(platformDir)) {
  186. fast_glob_1.default
  187. .sync('**/*.vue', { cwd: platformDir, absolute: true })
  188. .forEach((file) => {
  189. let name = parseVueComponentName(file);
  190. if (!name) {
  191. if (file.endsWith('index.vue')) {
  192. name = path_1.default.basename(pluginDir);
  193. }
  194. }
  195. if (name && !components[name]) {
  196. components[name] = file;
  197. }
  198. });
  199. }
  200. return components;
  201. }
  202. function resolveAndroidComponents(pluginDir, is_uni_modules) {
  203. return resolveComponents('app-android', pluginDir, is_uni_modules);
  204. }
  205. exports.resolveAndroidComponents = resolveAndroidComponents;
  206. function resolveIOSComponents(pluginDir, is_uni_modules) {
  207. return resolveComponents('app-ios', pluginDir, is_uni_modules);
  208. }
  209. exports.resolveIOSComponents = resolveIOSComponents;
  210. const nameRE = /export\s+default\s+[\s\S]*?name\s*:\s*['|"](.*?)['|"]/;
  211. function parseVueComponentName(file) {
  212. const content = fs_extra_1.default.readFileSync(file, 'utf8');
  213. const matches = content.match(nameRE);
  214. if (matches) {
  215. return matches[1];
  216. }
  217. }
  218. function genComponentsCode(filename, components, isX) {
  219. const codes = [];
  220. const dirname = path_1.default.dirname(filename);
  221. Object.keys(components).forEach((name) => {
  222. const source = (0, shared_2.normalizePath)(path_1.default.relative(dirname, components[name]));
  223. const className = (0, shared_1.capitalize)((0, shared_1.camelize)(name));
  224. codes.push(`export { default as ${className}Component${isX ? `, ${className}Node` : ''} } from '${source.startsWith('.') ? source : './' + source}'`);
  225. });
  226. return codes.join('\n');
  227. }
  228. exports.genComponentsCode = genComponentsCode;
  229. function genConfigJson(platform, components, pluginRelativeDir, is_uni_modules, inputDir, outputDir) {
  230. if (!Object.keys(components).length) {
  231. return;
  232. }
  233. const pluginId = (0, path_1.basename)(pluginRelativeDir);
  234. const utsInputDir = (0, path_1.resolve)(inputDir, pluginRelativeDir, is_uni_modules ? 'utssdk' : '', platform);
  235. const utsOutputDir = (0, path_1.resolve)(outputDir, pluginRelativeDir, is_uni_modules ? 'utssdk' : '', platform);
  236. copyConfigJson(utsInputDir, utsOutputDir, components, platform === 'app-android'
  237. ? parseKotlinPackageWithPluginId(pluginId, is_uni_modules) + '.'
  238. : parseSwiftPackageWithPluginId(pluginId, is_uni_modules));
  239. }
  240. exports.genConfigJson = genConfigJson;
  241. function copyConfigJson(inputDir, outputDir, componentsObj, namespace) {
  242. const configJsonFilename = (0, path_1.resolve)(inputDir, 'config.json');
  243. const outputConfigJsonFilename = (0, path_1.resolve)(outputDir, 'config.json');
  244. if (Object.keys(componentsObj).length) {
  245. //存在组件
  246. const components = genComponentsConfigJson(componentsObj, namespace);
  247. if (fs_extra_1.default.existsSync(configJsonFilename)) {
  248. fs_extra_1.default.outputFileSync(outputConfigJsonFilename, JSON.stringify((0, shared_1.extend)({ components }, (0, shared_2.parseJson)(fs_extra_1.default.readFileSync(configJsonFilename, 'utf8'))), null, 2));
  249. }
  250. else {
  251. fs_extra_1.default.outputFileSync(outputConfigJsonFilename, JSON.stringify({ components }, null, 2));
  252. }
  253. }
  254. else {
  255. if (fs_extra_1.default.existsSync(configJsonFilename)) {
  256. fs_extra_1.default.copySync(configJsonFilename, outputConfigJsonFilename);
  257. }
  258. }
  259. }
  260. function genComponentsConfigJson(components, namespace) {
  261. const res = [];
  262. Object.keys(components).forEach((name) => {
  263. res.push({
  264. name,
  265. class: namespace + (0, shared_1.capitalize)((0, shared_1.camelize)(name)) + 'Component',
  266. });
  267. });
  268. return res;
  269. }
  270. function prefix(id) {
  271. if (process.env.UNI_UTS_MODULE_PREFIX &&
  272. !id.startsWith(process.env.UNI_UTS_MODULE_PREFIX)) {
  273. return process.env.UNI_UTS_MODULE_PREFIX + '-' + id;
  274. }
  275. return id;
  276. }
  277. function parseKotlinPackageWithPluginId(id, is_uni_modules) {
  278. return 'uts.sdk.' + (is_uni_modules ? 'modules.' : '') + (0, shared_1.camelize)(prefix(id));
  279. }
  280. exports.parseKotlinPackageWithPluginId = parseKotlinPackageWithPluginId;
  281. function parseSwiftPackageWithPluginId(id, is_uni_modules) {
  282. return ('UTSSDK' +
  283. (is_uni_modules ? 'Modules' : '') +
  284. (0, shared_1.capitalize)((0, shared_1.camelize)(prefix(id))));
  285. }
  286. exports.parseSwiftPackageWithPluginId = parseSwiftPackageWithPluginId;
  287. function isColorSupported() {
  288. if ('NO_COLOR' in process.env || (0, shared_2.isInHBuilderX)()) {
  289. return false;
  290. }
  291. return true;
  292. }
  293. exports.isColorSupported = isColorSupported;
  294. function relative(filename, inputDir) {
  295. if (path_1.default.isAbsolute(filename)) {
  296. return (0, shared_2.normalizePath)(path_1.default.relative(inputDir, filename));
  297. }
  298. return filename;
  299. }
  300. exports.relative = relative;
  301. function resolveSourceMapFile(outputDir, kotlinFile) {
  302. return (path_1.default.resolve((0, shared_2.resolveSourceMapPath)(), path_1.default.relative(outputDir, kotlinFile)) +
  303. '.map');
  304. }
  305. exports.resolveSourceMapFile = resolveSourceMapFile;