swift.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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.checkIOSVersionTips = exports.resolveIOSDepFiles = exports.compile = exports.runSwiftDev = exports.runSwiftProd = void 0;
  30. const fs_extra_1 = __importDefault(require("fs-extra"));
  31. const path_1 = __importStar(require("path"));
  32. const utils_1 = require("./utils");
  33. const shared_1 = require("./shared");
  34. const stacktrace_1 = require("./stacktrace");
  35. function parseSwiftPackage(filename) {
  36. const res = (0, utils_1.resolvePackage)(filename);
  37. if (!res) {
  38. return {
  39. id: '',
  40. namespace: '',
  41. };
  42. }
  43. const namespace = (0, utils_1.parseSwiftPackageWithPluginId)(res.name, res.is_uni_modules);
  44. return {
  45. id: res.id,
  46. namespace,
  47. };
  48. }
  49. async function runSwiftProd(filename, components, { isPlugin, isX, extApis, }) {
  50. // 文件有可能是 app-android 里边的,因为编译到 ios 时,为了保证不报错,可能会去读取 android 下的 uts
  51. if (filename.includes('app-android')) {
  52. return;
  53. }
  54. const inputDir = process.env.UNI_INPUT_DIR;
  55. const outputDir = process.env.UNI_OUTPUT_DIR;
  56. const result = await compile(filename, {
  57. inputDir,
  58. outputDir,
  59. sourceMap: true,
  60. components,
  61. isX,
  62. isPlugin,
  63. extApis,
  64. });
  65. if (!result) {
  66. return;
  67. }
  68. if (result.error) {
  69. throw (0, stacktrace_1.parseUTSSyntaxError)(result.error, inputDir);
  70. }
  71. (0, utils_1.genUTSPlatformResource)(filename, {
  72. inputDir,
  73. outputDir,
  74. platform: 'app-ios',
  75. extname: '.swift',
  76. components,
  77. package: parseSwiftPackage(filename).namespace,
  78. });
  79. }
  80. exports.runSwiftProd = runSwiftProd;
  81. let isEnvReady = true;
  82. async function runSwiftDev(filename, { components, isX, isPlugin, extApis }) {
  83. // 文件有可能是 app-android 里边的,因为编译到 ios 时,为了保证不报错,可能会去读取 android 下的 uts
  84. if (filename.includes('app-android')) {
  85. return;
  86. }
  87. if (!isEnvReady) {
  88. console.error(`已跳过uts插件[${(0, utils_1.resolvePackage)(filename)?.id}]的编译`);
  89. return;
  90. }
  91. const compilerServer = (0, utils_1.getCompilerServer)('uts-development-ios');
  92. if (!compilerServer) {
  93. throw `项目使用了uts插件,正在安装 uts iOS 运行扩展...`;
  94. }
  95. if (compilerServer.checkEnv) {
  96. const { code, msg } = compilerServer.checkEnv();
  97. if (code) {
  98. isEnvReady = false;
  99. console.error(msg);
  100. return;
  101. }
  102. }
  103. const inputDir = process.env.UNI_INPUT_DIR;
  104. const outputDir = process.env.UNI_OUTPUT_DIR;
  105. const result = (await compile(filename, {
  106. inputDir,
  107. outputDir,
  108. sourceMap: true,
  109. components,
  110. isX,
  111. isPlugin,
  112. extApis,
  113. }));
  114. if (!result) {
  115. return;
  116. }
  117. if (result.error) {
  118. throw (0, stacktrace_1.parseUTSSyntaxError)(result.error, inputDir);
  119. }
  120. result.type = 'swift';
  121. const swiftFile = (0, utils_1.resolveUTSPlatformFile)(filename, {
  122. inputDir,
  123. outputDir,
  124. platform: 'app-ios',
  125. extname: '.swift',
  126. components,
  127. package: '',
  128. });
  129. result.changed = [];
  130. // 开发模式下,需要生成 framework
  131. if (fs_extra_1.default.existsSync(swiftFile)) {
  132. let projectPath = inputDir;
  133. const isCli = isCliProject(projectPath);
  134. if (isCli) {
  135. projectPath = path_1.default.resolve(projectPath, '..');
  136. }
  137. const { id, is_uni_modules } = (0, utils_1.resolvePackage)(filename);
  138. const { code, msg } = await compilerServer.compile({
  139. projectPath,
  140. isCli,
  141. type: is_uni_modules ? 1 : 2,
  142. pluginName: id,
  143. utsPath: resolveCompilerUTSPath(inputDir, is_uni_modules),
  144. swiftPath: resolveCompilerSwiftPath(outputDir, is_uni_modules),
  145. });
  146. result.code = code;
  147. result.msg = msg;
  148. result.changed = [swiftFile];
  149. }
  150. return result;
  151. }
  152. exports.runSwiftDev = runSwiftDev;
  153. function resolveCompilerUTSPath(projectPath, is_uni_modules) {
  154. return path_1.default.resolve(projectPath, is_uni_modules ? 'uni_modules' : 'utssdk');
  155. }
  156. function resolveCompilerSwiftPath(outputDir, is_uni_modules) {
  157. return path_1.default.resolve(outputDir, is_uni_modules ? 'uni_modules' : 'utssdk');
  158. }
  159. function isCliProject(projectPath) {
  160. if (projectPath.endsWith('src')) {
  161. return true;
  162. }
  163. return false;
  164. }
  165. async function compile(filename, { inputDir, outputDir, sourceMap, components, isX, isPlugin, extApis, }) {
  166. const { bundle, UTSTarget } = (0, utils_1.getUTSCompiler)();
  167. // let time = Date.now()
  168. const componentsCode = (0, utils_1.genComponentsCode)(filename, components, isX);
  169. const { namespace, id: pluginId } = parseSwiftPackage(filename);
  170. const input = {
  171. root: inputDir,
  172. filename,
  173. pluginId,
  174. paths: {},
  175. };
  176. const isUTSFileExists = fs_extra_1.default.existsSync(filename);
  177. if (componentsCode) {
  178. if (!isUTSFileExists) {
  179. input.fileContent = componentsCode;
  180. }
  181. else {
  182. input.fileContent =
  183. fs_extra_1.default.readFileSync(filename, 'utf8') + `\n` + componentsCode;
  184. }
  185. }
  186. else {
  187. // uts文件不存在,且也无组件
  188. if (!isUTSFileExists) {
  189. return;
  190. }
  191. }
  192. const options = {
  193. input,
  194. output: {
  195. isX,
  196. isPlugin,
  197. outDir: outputDir,
  198. package: namespace,
  199. sourceMap: sourceMap ? (0, utils_1.resolveUTSSourceMapPath)() : false,
  200. extname: 'swift',
  201. imports: ['DCloudUTSFoundation'],
  202. logFilename: true,
  203. noColor: !(0, utils_1.isColorSupported)(),
  204. transform: {
  205. uniExtApiDefaultNamespace: 'DCloudUTSExtAPI',
  206. uniExtApiNamespaces: extApis,
  207. },
  208. },
  209. };
  210. const result = await bundle(UTSTarget.SWIFT, options);
  211. sourceMap &&
  212. (0, utils_1.moveRootIndexSourceMap)(filename, {
  213. inputDir,
  214. outputDir,
  215. platform: 'app-ios',
  216. extname: '.swift',
  217. components,
  218. package: '',
  219. });
  220. return result;
  221. }
  222. exports.compile = compile;
  223. const deps = ['Info.plist', 'config.json'];
  224. function resolveIOSDepFiles(filename) {
  225. const dir = (0, utils_1.resolveIOSDir)(filename);
  226. return deps.map((dep) => path_1.default.resolve(dir, dep));
  227. }
  228. exports.resolveIOSDepFiles = resolveIOSDepFiles;
  229. function checkIOSVersionTips(pluginId, pluginDir, is_uni_modules) {
  230. const configJsonFile = (0, path_1.join)(pluginDir, is_uni_modules ? 'utssdk' : '', 'app-ios', 'config.json');
  231. if (configJsonFile && fs_extra_1.default.existsSync(configJsonFile)) {
  232. try {
  233. const configJson = (0, shared_1.parseJson)(fs_extra_1.default.readFileSync(configJsonFile, 'utf8'));
  234. if (configJson.deploymentTarget) {
  235. return `uts插件[${pluginId}]需在 iOS ${configJson.deploymentTarget} 版本及以上方可正常使用`;
  236. }
  237. }
  238. catch (e) { }
  239. }
  240. }
  241. exports.checkIOSVersionTips = checkIOSVersionTips;