• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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