1import * as fs from 'fs'; 2import * as path from 'path'; 3import { logger } from './compile_info'; 4const { projectConfig } = require('../main'); 5 6const red: string = '\u001b[31m'; 7const reset: string = '\u001b[39m'; 8 9const REG_OHM_URL: RegExp = /^@bundle:(\S+)\/(\S+)\/(ets|js)\/(\S+)$/; 10 11export class OHMResolverPlugin { 12 private source: any; 13 private target: any; 14 15 constructor(source = 'resolve', target = 'resolve') { 16 this.source = source; 17 this.target = target; 18 } 19 20 apply(resolver) { 21 const target: any = resolver.ensureHook(this.target); 22 resolver.getHook(this.source).tapAsync('OHMResolverPlugin', (request, resolveContext, callback) => { 23 if (isOhmUrl(request.request)) { 24 const resolvedSourceFile: string = resolveSourceFile(request.request); 25 const obj = Object.assign({}, request, { 26 request: resolvedSourceFile 27 }); 28 return resolver.doResolve(target, obj, null, resolveContext, callback); 29 } 30 callback(); 31 }); 32 } 33} 34 35export function isOhmUrl(moduleRequest: string): boolean { 36 return !!/^@(\S+):/.test(moduleRequest); 37} 38 39function addExtension(file: string, srcPath: string): string { 40 let extension: string = '.d.ts'; 41 if (fs.existsSync(file + '.ets') && fs.statSync(file + '.ets').isFile()) { 42 extension = '.ets'; 43 } 44 if (fs.existsSync(file + '.ts') && fs.statSync(file + '.ts').isFile()) { 45 if (extension !== '.d.ts') { 46 logger.error(red, `ArkTS:ERROR Failed to compile with files with same name ${srcPath} in the same directory`, reset); 47 } 48 extension = '.ts'; 49 } 50 if (fs.existsSync(file + '.js') && fs.statSync(file + '.js').isFile()) { 51 if (extension !== '.d.ts') { 52 logger.error(red, `ArkTS:ERROR Failed to compile with files with same name ${srcPath} in the same directory`, reset); 53 } 54 extension = '.js'; 55 } 56 return file + extension; 57} 58 59export function resolveSourceFile(ohmUrl: string): string { 60 if (!projectConfig.aceBuildJson) { 61 logger.error(red, `ArkTS:ERROR Failed to resolve OhmUrl because of aceBuildJson not existing `, reset); 62 return ohmUrl; 63 } 64 65 const result: RegExpMatchArray = ohmUrl.match(REG_OHM_URL); 66 const moduleName: string = result[2]; 67 const srcKind: string = result[3]; 68 69 const modulePath: string = projectConfig.modulePathMap[moduleName]; 70 const srcRoot: string = projectConfig.isOhosTest ? 'src/ohosTest' : 'src/main'; 71 let file: string = path.join(modulePath, srcRoot, srcKind, result[4]); 72 file = addExtension(file, result[4]); 73 74 if (!fs.existsSync(file) || !fs.statSync(file).isFile()) { 75 if (projectConfig.isOhosTest) { 76 file = path.join(modulePath, 'src/main', srcKind, result[4]); 77 file = addExtension(file, result[4]); 78 79 if (fs.existsSync(file) && fs.statSync(file).isFile()) { 80 return file; 81 } 82 } 83 84 logger.error(red, `ArkTS:ERROR Failed to resolve existed file by this ohm url ${ohmUrl} `, reset); 85 } 86 87 return file; 88} 89