utils.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  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.getExtApiComponents = exports.addExtApiComponents = exports.getUniCloudObjectInfo = exports.getUniCloudSpaceList = exports.parseUTSImportFilename = exports.parseUTSRelativeFilename = exports.stringifyMap = exports.isVue = exports.uvueOutDir = exports.kotlinOutDir = exports.createResolveError = exports.parseImports = exports.createTryResolve = exports.wrapResolve = exports.ENTRY_FILENAME = exports.DEFAULT_APPID = exports.UVUE_CLASS_NAME_PREFIX = void 0;
  7. const fs_1 = __importDefault(require("fs"));
  8. const path_1 = __importDefault(require("path"));
  9. const es_module_lexer_1 = require("es-module-lexer");
  10. const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
  11. const shared_1 = require("@vue/shared");
  12. const errors_1 = require("./uvue/compiler/errors");
  13. exports.UVUE_CLASS_NAME_PREFIX = 'Gen';
  14. exports.DEFAULT_APPID = 'HBuilder';
  15. exports.ENTRY_FILENAME = 'main.uts';
  16. function wrapResolve(resolve) {
  17. return async (source, importer, options) => {
  18. try {
  19. return await resolve(source, importer, options);
  20. }
  21. catch (e) {
  22. // import "@/pages/logo.png" 可能会报 Cannot find module 错误
  23. }
  24. return null;
  25. };
  26. }
  27. exports.wrapResolve = wrapResolve;
  28. function createTryResolve(importer, resolve, offsetStart, origCode = '') {
  29. return async (source, code, { ss, se }) => {
  30. const resolved = await wrapResolve(resolve)(source, importer);
  31. if (!resolved) {
  32. const { start, end } = (0, uni_cli_shared_1.offsetToStartAndEnd)(code, ss, se);
  33. if (offsetStart) {
  34. if (start.line === 1) {
  35. start.column = start.column + offsetStart.column;
  36. if (end.line === 1) {
  37. end.column = end.column + offsetStart.column;
  38. }
  39. }
  40. const offsetLine = offsetStart.line - 1;
  41. start.line = start.line + offsetLine;
  42. end.line = end.line + offsetLine;
  43. }
  44. throw createResolveError(origCode || code, (0, uni_cli_shared_1.createResolveErrorMsg)(source, importer), start, end);
  45. }
  46. };
  47. }
  48. exports.createTryResolve = createTryResolve;
  49. async function parseImports(code, tryResolve) {
  50. await es_module_lexer_1.init;
  51. let res = [[], [], false];
  52. try {
  53. res = (0, es_module_lexer_1.parse)(code);
  54. }
  55. catch (err) {
  56. const message = err.message;
  57. if (message) {
  58. const matches = message.match(/@:(\d+):(\d+)/);
  59. if (matches) {
  60. throw (0, uni_cli_shared_1.createRollupError)('', '', (0, errors_1.createCompilerError)(0, {
  61. start: {
  62. offset: 0,
  63. line: parseInt(matches[1]),
  64. column: parseInt(matches[2]),
  65. },
  66. }, { 0: `Parse error` }, ''), code);
  67. }
  68. }
  69. throw err;
  70. }
  71. const imports = res[0];
  72. const importsCode = [];
  73. for (const specifier of imports) {
  74. const source = code.slice(specifier.s, specifier.e);
  75. if (tryResolve) {
  76. const res = await tryResolve(source, code, specifier);
  77. if (res === false) {
  78. // 忽略该import
  79. continue;
  80. }
  81. }
  82. importsCode.push(`import "${source}"`);
  83. }
  84. return importsCode.concat(parseUniExtApiImports(code)).join('\n');
  85. }
  86. exports.parseImports = parseImports;
  87. function createResolveError(code, msg, start, end) {
  88. return (0, uni_cli_shared_1.createRollupError)('', '', (0, errors_1.createCompilerError)(0, {
  89. start,
  90. end,
  91. }, { 0: msg }, ''), code);
  92. }
  93. exports.createResolveError = createResolveError;
  94. // @ts-expect-error 暂时不用
  95. function genImportsCode(code, imports) {
  96. const chars = code.split('');
  97. const keepChars = [];
  98. imports.forEach(({ ss, se }) => {
  99. for (let i = ss; i <= se; i++) {
  100. keepChars.push(i);
  101. }
  102. });
  103. for (let i = 0; i < chars.length; i++) {
  104. if (!keepChars.includes(i)) {
  105. const char = chars[i];
  106. if (char !== '\r' && char !== '\n') {
  107. chars[i] = ' ';
  108. }
  109. }
  110. }
  111. return chars.join('');
  112. }
  113. function parseUniExtApiImports(code) {
  114. if (!process.env.UNI_UTS_PLATFORM) {
  115. return [];
  116. }
  117. const extApis = (0, uni_cli_shared_1.parseUniExtApiNamespacesJsOnce)(process.env.UNI_UTS_PLATFORM, process.env.UNI_UTS_TARGET_LANGUAGE);
  118. const pattern = /uni\.(\w+)/g;
  119. const apis = new Set();
  120. let match;
  121. while ((match = pattern.exec(code)) !== null) {
  122. apis.add(match[1]);
  123. }
  124. const imports = [];
  125. apis.forEach((api) => {
  126. const extApi = extApis[api];
  127. if (extApi) {
  128. imports.push(`import "${extApi[0]}"`);
  129. }
  130. });
  131. return imports;
  132. }
  133. function kotlinOutDir() {
  134. return path_1.default.join(process.env.UNI_OUTPUT_DIR, '../.kotlin');
  135. }
  136. exports.kotlinOutDir = kotlinOutDir;
  137. function uvueOutDir() {
  138. return path_1.default.join(process.env.UNI_OUTPUT_DIR, '../.uvue');
  139. }
  140. exports.uvueOutDir = uvueOutDir;
  141. function isVue(filename) {
  142. return filename.endsWith('.vue') || filename.endsWith('.uvue');
  143. }
  144. exports.isVue = isVue;
  145. function stringifyMap(obj, ts = false) {
  146. return serialize(obj, ts);
  147. }
  148. exports.stringifyMap = stringifyMap;
  149. function serialize(obj, ts = false) {
  150. if ((0, shared_1.isString)(obj)) {
  151. return `"${obj}"`;
  152. }
  153. else if ((0, shared_1.isPlainObject)(obj)) {
  154. const entries = Object.entries(obj).map(([key, value]) => `[${serialize(key, ts)},${serialize(value, ts)}]`);
  155. if (entries.length) {
  156. return `utsMapOf([${entries.join(',')}])`;
  157. }
  158. if (ts) {
  159. return `utsMapOf<string, any | null>()`;
  160. }
  161. return `utsMapOf()`;
  162. }
  163. else if ((0, shared_1.isArray)(obj)) {
  164. return `[${obj.map((item) => serialize(item, ts)).join(',')}]`;
  165. }
  166. else {
  167. return String(obj);
  168. }
  169. }
  170. function parseUTSRelativeFilename(filename, root) {
  171. if (!path_1.default.isAbsolute(filename)) {
  172. return filename;
  173. }
  174. return (0, uni_cli_shared_1.normalizeNodeModules)(path_1.default.relative(root ?? process.env.UNI_INPUT_DIR, filename));
  175. }
  176. exports.parseUTSRelativeFilename = parseUTSRelativeFilename;
  177. function parseUTSImportFilename(filename) {
  178. if (!path_1.default.isAbsolute(filename)) {
  179. return filename;
  180. }
  181. return (0, uni_cli_shared_1.normalizePath)(path_1.default.join(uvueOutDir(), (0, uni_cli_shared_1.normalizeNodeModules)(path_1.default.relative(process.env.UNI_INPUT_DIR, filename))));
  182. }
  183. exports.parseUTSImportFilename = parseUTSImportFilename;
  184. let uniCloudSpaceList;
  185. function getUniCloudSpaceList() {
  186. if (uniCloudSpaceList) {
  187. return uniCloudSpaceList;
  188. }
  189. if (!process.env.UNI_CLOUD_SPACES) {
  190. uniCloudSpaceList = [];
  191. return uniCloudSpaceList;
  192. }
  193. try {
  194. const spaces = JSON.parse(process.env.UNI_CLOUD_SPACES);
  195. if (!Array.isArray(spaces)) {
  196. uniCloudSpaceList = [];
  197. return uniCloudSpaceList;
  198. }
  199. uniCloudSpaceList = spaces.map((space) => {
  200. if (space.provider === 'tcb') {
  201. space.provider = 'tencent';
  202. }
  203. if (!space.provider && space.clientSecret) {
  204. space.provider = 'aliyun';
  205. }
  206. switch (space.provider) {
  207. case 'aliyun':
  208. return {
  209. provider: space.provider || 'aliyun',
  210. spaceName: space.name,
  211. spaceId: space.id,
  212. clientSecret: space.clientSecret,
  213. endpoint: space.apiEndpoint,
  214. workspaceFolder: space.workspaceFolder,
  215. };
  216. case 'alipay': {
  217. return {
  218. provider: space.provider,
  219. spaceName: space.name,
  220. spaceId: space.id,
  221. spaceAppId: space.spaceAppId,
  222. accessKey: space.accessKey,
  223. secretKey: space.secretKey,
  224. workspaceFolder: space.workspaceFolder,
  225. };
  226. }
  227. case 'tencent':
  228. default: {
  229. return {
  230. provider: space.provider,
  231. spaceName: space.name,
  232. spaceId: space.id,
  233. workspaceFolder: space.workspaceFolder,
  234. };
  235. }
  236. }
  237. });
  238. }
  239. catch (e) {
  240. console.error(e);
  241. }
  242. uniCloudSpaceList = uniCloudSpaceList || [];
  243. if (uniCloudSpaceList.length > 1) {
  244. console.warn('Multi uniCloud space is not supported yet.');
  245. }
  246. return uniCloudSpaceList;
  247. }
  248. exports.getUniCloudSpaceList = getUniCloudSpaceList;
  249. function getUniCloudObjectInfo(uniCloudSpaceList) {
  250. let uniCloudWorkspaceFolder = process.env.UNI_INPUT_DIR.endsWith('src')
  251. ? path_1.default.resolve(process.env.UNI_INPUT_DIR, '..')
  252. : process.env.UNI_INPUT_DIR;
  253. let serviceProvider = 'aliyun';
  254. if (uniCloudSpaceList && uniCloudSpaceList.length > 0) {
  255. const space = uniCloudSpaceList[0];
  256. if (space.workspaceFolder) {
  257. uniCloudWorkspaceFolder = space.workspaceFolder;
  258. }
  259. serviceProvider = space.provider === 'tencent' ? 'tcb' : space.provider;
  260. }
  261. else {
  262. serviceProvider =
  263. ['aliyun', 'tcb', 'alipay'].find((item) => fs_1.default.existsSync(path_1.default.resolve(uniCloudWorkspaceFolder, 'uniCloud-' + item))) || 'aliyun';
  264. }
  265. try {
  266. const { getWorkspaceObjectInfo } = require('../../../lib/unicloud-utils');
  267. return getWorkspaceObjectInfo(uniCloudWorkspaceFolder, serviceProvider);
  268. }
  269. catch (e) {
  270. console.error(e.message);
  271. process.exit(1);
  272. }
  273. }
  274. exports.getUniCloudObjectInfo = getUniCloudObjectInfo;
  275. const extApiComponents = new Set();
  276. function addExtApiComponents(components) {
  277. components.forEach((component) => {
  278. extApiComponents.add(component);
  279. });
  280. }
  281. exports.addExtApiComponents = addExtApiComponents;
  282. function getExtApiComponents() {
  283. return extApiComponents;
  284. }
  285. exports.getExtApiComponents = getExtApiComponents;
  286. // export const initAutoImportOnce = once(initAutoImport)
  287. // function initAutoImport(autoImportOptions?: AutoImportOptions) {
  288. // const options = initAutoImportOptions(
  289. // process.env.UNI_UTS_PLATFORM,
  290. // autoImportOptions || {}
  291. // )
  292. // if ((options.imports as any[]).length === 0) {
  293. // return {
  294. // transform(code: string, id: string) {
  295. // return { code }
  296. // },
  297. // }
  298. // }
  299. // const autoImport = AutoImport(options) as {
  300. // transform(
  301. // code: string,
  302. // id: string
  303. // ): Promise<{ code: string; map?: SourceMapInput }>
  304. // }
  305. // const { transform } = autoImport
  306. // autoImport.transform = async function (code, id) {
  307. // const result = await transform.call(this, code, id)
  308. // if (result) {
  309. // return result
  310. // }
  311. // return { code }
  312. // }
  313. // return autoImport
  314. // }