• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use rollupObject file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16
17import { expect } from 'chai';
18import mocha from 'mocha';
19import path from 'path';
20import fs from 'fs';
21import ts from 'typescript';
22
23import RollUpPluginMock from '../mock/rollup_mock/rollup_plugin_mock';
24import { ModuleSourceFile } from '../../../lib/fast_build/ark_compiler/module/module_source_file';
25import { ModuleInfo } from '../../../lib/fast_build/ark_compiler/module/module_mode';
26import ModuleModeMock from '../mock/class_mock/module_mode_mock';
27import {
28  EXPECT_ENTRY_TS,
29  EXPECT_INDEX_ETS,
30  MODULE_TEST_PATH,
31  EXPECT_TO_JS
32} from '../mock/rollup_mock/path_config';
33import {
34  RELEASE,
35  EXTNAME_ETS,
36  EXTNAME_TS,
37  EXTNAME_JS
38} from '../../../lib/fast_build/ark_compiler/common/ark_define';
39import {
40  META,
41  ENTRYABILITY_TS_PATH_DEFAULT,
42  INDEX_ETS_PATH_DEFAULT,
43  OHURL_RES,
44  ENTRYABILITY_TS,
45  INDEX_ETS,
46  OHURL_SHAREDLIBRARY,
47  OH_UIABILITY,
48  OH_HILOG
49} from '../mock/rollup_mock/common';
50import projectConfig from '../utils/processProjectConfig';
51import { ModuleInfo as ModuleInfoMock } from '../mock/rollup_mock/module_info';
52import { scanFiles } from "../utils/utils";
53import { SourceMapGenerator } from '../../../lib/fast_build/ark_compiler/generate_sourcemap';
54
55const ROLLUP_IMPORT_NODE: string = 'ImportDeclaration';
56const ROLLUP_EXPORTNAME_NODE: string = 'ExportNamedDeclaration';
57const ROLLUP_EXPORTALL_NODE: string = 'ExportAllDeclaration';
58const ROLLUP_DYNAMICIMPORT_NODE: string = 'ImportExpression';
59const ROLLUP_LITERAL_NODE: string = 'Literal';
60
61mocha.describe('test module_source_file file api', function () {
62  mocha.before(function () {
63    this.rollup = new RollUpPluginMock();
64  });
65
66  mocha.after(() => {
67    delete this.rollup;
68  });
69
70  mocha.it('1-1-1: test getOhmUrl under build debug: systemOrLibOhmUrl is not undefined', function () {
71    this.rollup.build();
72    SourceMapGenerator.initInstance(this.rollup);
73    const modeMock = new ModuleModeMock(this.rollup);
74    const mockFileList: object = this.rollup.getModuleIds();
75    this.moduleInfos = new Map<String, ModuleInfo>();
76
77    for (const moduleId of mockFileList) {
78      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS) || moduleId.endsWith(EXTNAME_JS)) {
79        const code: string = fs.readFileSync(moduleId, 'utf-8');
80        const moduleSource = new ModuleSourceFile(moduleId, code);
81        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
82        const metaInfo: object = moduleInfo[META];
83        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
84        moduleInfo.setImportedIdMaps();
85        moduleInfo.setNodeImportDeclaration();
86        const importMap: object = moduleInfo.importedIdMaps;
87        const moduleNodeMap: Map<string, any> =
88          moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE,
89            ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE);
90        let hasDynamicImport: boolean = false;
91        for (const nodeSet of moduleNodeMap.values()) {
92          nodeSet.forEach(node => {
93            if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) {
94              hasDynamicImport = true;
95            }
96            if (node.source) {
97              if (node.source.type === ROLLUP_LITERAL_NODE) {
98                const ohmUrl: string | undefined =
99                  moduleSource.getOhmUrl(this.rollup, node.source.value, importMap[node.source.value]);
100                expect(ohmUrl === OH_UIABILITY || ohmUrl === OH_HILOG).to.be.true;
101              } else {
102                const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n`
103                  + `DynamicImport only accept stringLiteral as argument currently.\n`;
104                console.log(errorMsg);
105              }
106            }
107          });
108        }
109      }
110    }
111    SourceMapGenerator.cleanSourceMapObject();
112  });
113
114  mocha.it('1-1-2: test getOhmUrl under build debug: filePath exist', function () {
115    this.rollup.build();
116    SourceMapGenerator.initInstance(this.rollup);
117    const modeMock = new ModuleModeMock(this.rollup);
118    const mockFileList: object = this.rollup.getModuleIds();
119    this.moduleInfos = new Map<String, ModuleInfo>();
120
121    for (const moduleId of mockFileList) {
122      if (moduleId.endsWith(EXTNAME_ETS)) {
123        const code: string = fs.readFileSync(moduleId, 'utf-8');
124        const moduleSource = new ModuleSourceFile(moduleId, code);
125        ModuleSourceFile.projectConfig = modeMock.projectConfig;
126        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
127        const metaInfo: object = moduleInfo[META];
128        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
129        moduleInfo.setImportedIdMaps(moduleId);
130        moduleInfo.setNodeImportExpression();
131        const importMap: object = moduleInfo.importedIdMaps;
132        const moduleNodeMap: Map<string, any> =
133          moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE,
134            ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE);
135        let hasDynamicImport: boolean = false;
136        for (const nodeSet of moduleNodeMap.values()) {
137          nodeSet.forEach(node => {
138            if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) {
139              hasDynamicImport = true;
140            }
141            if (node.source) {
142              if (node.source.type === ROLLUP_LITERAL_NODE) {
143                const ohmUrl: string | undefined =
144                  moduleSource.getOhmUrl(this.rollup, node.source.value, importMap['requestFile']);
145                expect(ohmUrl === OHURL_RES).to.be.true;
146              } else {
147                const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n`
148                  + `DynamicImport only accept stringLiteral as argument currently.\n`;
149                console.log(errorMsg);
150              }
151            }
152          });
153        }
154      }
155    }
156    SourceMapGenerator.cleanSourceMapObject();
157  });
158
159  mocha.it('1-1-3: test getOhmUrl under build debug: harOhmUrl is not undefined', function () {
160    this.rollup.build();
161    SourceMapGenerator.initInstance(this.rollup);
162    const modeMock = new ModuleModeMock(this.rollup);
163    const mockFileList: object = this.rollup.getModuleIds();
164    this.moduleInfos = new Map<String, ModuleInfo>();
165
166    for (const moduleId of mockFileList) {
167      if (moduleId.endsWith(EXTNAME_ETS) || moduleId.endsWith(EXTNAME_JS)) {
168        const code: string = fs.readFileSync(moduleId, 'utf-8');
169        const moduleSource = new ModuleSourceFile(moduleId, code);
170        ModuleSourceFile.projectConfig = modeMock.projectConfig;
171        ModuleSourceFile.projectConfig.harNameOhmMap = projectConfig.harNameOhmMap;
172        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
173        const metaInfo: object = moduleInfo[META];
174        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
175        moduleInfo.setImportedIdMaps(moduleId);
176        moduleInfo.setNodeImportExpression();
177        const importMap: object = moduleInfo.importedIdMaps;
178        const moduleNodeMap: Map<string, any> =
179          moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE,
180            ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE);
181        let hasDynamicImport: boolean = false;
182        for (const nodeSet of moduleNodeMap.values()) {
183          nodeSet.forEach(node => {
184            if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) {
185              hasDynamicImport = true;
186            }
187            if (node.source) {
188              if (node.source.type === ROLLUP_LITERAL_NODE) {
189                const ohmUrl: string | undefined =
190                  moduleSource.getOhmUrl(this.rollup, node.source.value, importMap['requestFile']);
191                expect(ohmUrl === OHURL_SHAREDLIBRARY).to.be.true;
192              } else {
193                const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n`
194                  + `DynamicImport only accept stringLiteral as argument currently.\n`;
195                console.log(errorMsg);
196              }
197            }
198          });
199        }
200      }
201    }
202    SourceMapGenerator.cleanSourceMapObject();
203  });
204
205  mocha.it('1-2: test getOhmUrl under build release', function () {
206    this.rollup.build(RELEASE);
207    SourceMapGenerator.initInstance(this.rollup);
208    const modeMock = new ModuleModeMock(this.rollup);
209    const mockFileList: object = this.rollup.getModuleIds();
210    this.moduleInfos = new Map<String, ModuleInfo>();
211    for (const moduleId of mockFileList) {
212      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS) || moduleId.endsWith(EXTNAME_JS)) {
213        const code: string = fs.readFileSync(moduleId, 'utf-8');
214        const moduleSource = new ModuleSourceFile(moduleId, code);
215        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
216        const metaInfo: object = moduleInfo[META];
217        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
218        moduleInfo.setImportedIdMaps();
219        moduleInfo.setNodeImportDeclaration();
220        const importMap: object = moduleInfo.importedIdMaps;
221        const moduleNodeMap: Map<string, any> =
222          moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE,
223            ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE);
224        let hasDynamicImport: boolean = false;
225        for (const nodeSet of moduleNodeMap.values()) {
226          nodeSet.forEach(node => {
227            if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) {
228              hasDynamicImport = true;
229            }
230            if (node.source) {
231              if (node.source.type === ROLLUP_LITERAL_NODE) {
232                const ohmUrl: string | undefined =
233                  moduleSource.getOhmUrl(this.rollup, node.source.value, importMap[node.source.value]);
234                expect(ohmUrl === OH_UIABILITY || ohmUrl === OH_HILOG).to.be.true;
235              } else {
236                const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n`
237                  + `DynamicImport only accept stringLiteral as argument currently.\n`;
238                console.log(errorMsg);
239              }
240            }
241          });
242        }
243      }
244    }
245    SourceMapGenerator.cleanSourceMapObject();
246  });
247
248  mocha.it('1-3: test getOhmUrl under preview debug', function () {
249    this.rollup.preview();
250    SourceMapGenerator.initInstance(this.rollup);
251    const modeMock = new ModuleModeMock(this.rollup);
252    const mockFileList: object = this.rollup.getModuleIds();
253    this.moduleInfos = new Map<String, ModuleInfo>();
254    for (const moduleId of mockFileList) {
255      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS) || moduleId.endsWith(EXTNAME_JS)) {
256        const code: string = fs.readFileSync(moduleId, 'utf-8');
257        const moduleSource = new ModuleSourceFile(moduleId, code);
258        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
259        const metaInfo: object = moduleInfo[META];
260        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
261        moduleInfo.setImportedIdMaps();
262        moduleInfo.setNodeImportDeclaration();
263        const importMap: object = moduleInfo.importedIdMaps;
264        const moduleNodeMap: Map<string, any> =
265          moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE,
266            ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE);
267        let hasDynamicImport: boolean = false;
268        for (const nodeSet of moduleNodeMap.values()) {
269          nodeSet.forEach(node => {
270            if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) {
271              hasDynamicImport = true;
272            }
273            if (node.source) {
274              if (node.source.type === ROLLUP_LITERAL_NODE) {
275                const ohmUrl: string | undefined =
276                  moduleSource.getOhmUrl(this.rollup, node.source.value, importMap[node.source.value]);
277                expect(ohmUrl === OH_UIABILITY || ohmUrl === OH_HILOG).to.be.true;
278              } else {
279                const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n`
280                  + `DynamicImport only accept stringLiteral as argument currently.\n`;
281                console.log(errorMsg);
282              }
283            }
284          });
285        }
286      }
287    }
288    SourceMapGenerator.cleanSourceMapObject();
289  });
290
291  mocha.it('1-4: test getOhmUrl under hot reload debug', function () {
292    this.rollup.hotReload();
293    SourceMapGenerator.initInstance(this.rollup);
294    const modeMock = new ModuleModeMock(this.rollup);
295    const mockFileList: object = this.rollup.getModuleIds();
296    this.moduleInfos = new Map<String, ModuleInfo>();
297    for (const moduleId of mockFileList) {
298      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS) || moduleId.endsWith(EXTNAME_JS)) {
299        const code: string = fs.readFileSync(moduleId, 'utf-8');
300        const moduleSource = new ModuleSourceFile(moduleId, code);
301        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
302        const metaInfo: object = moduleInfo[META];
303        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
304        moduleInfo.setImportedIdMaps();
305        moduleInfo.setNodeImportDeclaration();
306        const importMap: object = moduleInfo.importedIdMaps;
307        const moduleNodeMap: Map<string, any> =
308          moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE,
309            ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE);
310        let hasDynamicImport: boolean = false;
311        for (const nodeSet of moduleNodeMap.values()) {
312          nodeSet.forEach(node => {
313            if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) {
314              hasDynamicImport = true;
315            }
316            if (node.source) {
317              if (node.source.type === ROLLUP_LITERAL_NODE) {
318                const ohmUrl: string | undefined =
319                  moduleSource.getOhmUrl(this.rollup, node.source.value, importMap[node.source.value]);
320                expect(ohmUrl === OH_UIABILITY || ohmUrl === OH_HILOG).to.be.true;
321              } else {
322                const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n`
323                  + `DynamicImport only accept stringLiteral as argument currently.\n`;
324                console.log(errorMsg);
325              }
326            }
327          });
328        }
329      }
330    }
331    SourceMapGenerator.cleanSourceMapObject();
332  });
333
334  mocha.it('2-1: test processJsModuleRequest under build debug', function () {
335    this.rollup.build();
336    SourceMapGenerator.initInstance(this.rollup);
337    const modeMock = new ModuleModeMock(this.rollup);
338    const mockFileList: object = this.rollup.getModuleIds();
339    this.moduleInfos = new Map<String, ModuleInfo>();
340    for (const moduleId of mockFileList) {
341      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
342        const code: string = fs.readFileSync(moduleId, 'utf-8');
343        const moduleSource = new ModuleSourceFile(moduleId, code);
344        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
345        const metaInfo: object = moduleInfo[META];
346        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
347        moduleInfo.setImportedIdMaps();
348        moduleSource.processJsModuleRequest(this.rollup);
349        const EntryAbility_ts = fs.readFileSync(EXPECT_ENTRY_TS).toString();
350        const Index_ets = fs.readFileSync(EXPECT_INDEX_ETS).toString();
351        expect(moduleSource.source === EntryAbility_ts || moduleSource.source === Index_ets).to.be.true;
352      }
353    }
354    SourceMapGenerator.cleanSourceMapObject();
355  });
356
357  mocha.it('2-2: test processJsModuleRequest under build release', function () {
358    this.rollup.build(RELEASE);
359    SourceMapGenerator.initInstance(this.rollup);
360    const modeMock = new ModuleModeMock(this.rollup);
361    const mockFileList: object = this.rollup.getModuleIds();
362    this.moduleInfos = new Map<String, ModuleInfo>();
363    for (const moduleId of mockFileList) {
364      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
365        const code: string = fs.readFileSync(moduleId, 'utf-8');
366        const moduleSource = new ModuleSourceFile(moduleId, code);
367        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
368        const metaInfo: object = moduleInfo[META];
369        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
370        moduleInfo.setImportedIdMaps();
371        moduleSource.processJsModuleRequest(this.rollup);
372        const EntryAbility_ts = fs.readFileSync(EXPECT_ENTRY_TS).toString();
373        const Index_ets = fs.readFileSync(EXPECT_INDEX_ETS).toString();
374        expect(moduleSource.source === EntryAbility_ts || moduleSource.source === Index_ets).to.be.true;
375      }
376    }
377    SourceMapGenerator.cleanSourceMapObject();
378  });
379
380  mocha.it('2-3: test processJsModuleRequest under preview debug', function () {
381    this.rollup.preview();
382    SourceMapGenerator.initInstance(this.rollup);
383    const modeMock = new ModuleModeMock(this.rollup);
384    const mockFileList: object = this.rollup.getModuleIds();
385    this.moduleInfos = new Map<String, ModuleInfo>();
386    for (const moduleId of mockFileList) {
387      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
388        const code: string = fs.readFileSync(moduleId, 'utf-8');
389        const moduleSource = new ModuleSourceFile(moduleId, code);
390        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
391        const metaInfo: object = moduleInfo[META];
392        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
393        moduleInfo.setImportedIdMaps();
394        moduleSource.processJsModuleRequest(this.rollup);
395        const EntryAbility_ts = fs.readFileSync(EXPECT_ENTRY_TS).toString();
396        const Index_ets = fs.readFileSync(EXPECT_INDEX_ETS).toString();
397        expect(moduleSource.source === EntryAbility_ts || moduleSource.source === Index_ets).to.be.true;
398      }
399    }
400    SourceMapGenerator.cleanSourceMapObject();
401  });
402
403  mocha.it('2-4: test processJsModuleRequest under hot reload debug', function () {
404    this.rollup.hotReload();
405    SourceMapGenerator.initInstance(this.rollup);
406    const modeMock = new ModuleModeMock(this.rollup);
407    const mockFileList: object = this.rollup.getModuleIds();
408    this.moduleInfos = new Map<String, ModuleInfo>();
409    for (const moduleId of mockFileList) {
410      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
411        const code: string = fs.readFileSync(moduleId, 'utf-8');
412        const moduleSource = new ModuleSourceFile(moduleId, code);
413        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
414        const metaInfo: object = moduleInfo[META];
415        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
416        moduleInfo.setImportedIdMaps();
417        moduleSource.processJsModuleRequest(this.rollup);
418        const EntryAbility_ts = fs.readFileSync(EXPECT_ENTRY_TS).toString();
419        const Index_ets = fs.readFileSync(EXPECT_INDEX_ETS).toString();
420        expect(moduleSource.source === EntryAbility_ts || moduleSource.source === Index_ets).to.be.true;
421      }
422    }
423    SourceMapGenerator.cleanSourceMapObject();
424  });
425
426  mocha.it('3-1-1: test processTransformedJsModuleRequest under build debug: hasDynamicImport is false', function () {
427    this.rollup.build();
428    SourceMapGenerator.initInstance(this.rollup);
429    const modeMock = new ModuleModeMock(this.rollup);
430    const mockFileList: object = this.rollup.getModuleIds();
431    this.moduleInfos = new Map<String, ModuleInfo>();
432    for (const moduleId of mockFileList) {
433      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
434        const code: string = JSON.stringify(fs.readFileSync(moduleId, 'utf-8'));
435        const moduleSource = new ModuleSourceFile(moduleId, code);
436        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
437        const metaInfo: object = moduleInfo[META];
438        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
439        moduleInfo.setImportedIdMaps();
440        moduleInfo.setNodeImportDeclaration();
441        moduleSource.processTransformedJsModuleRequest(this.rollup);
442        const json = fs.readFileSync(EXPECT_TO_JS, 'utf-8');
443        const etsToJs = JSON.parse(json).expect_index_ets_to_js;
444        const tsToJs = JSON.parse(json).expect_entryability_ts_to_js;
445        expect(moduleSource.source === etsToJs || moduleSource.source === tsToJs).to.be.true;
446      }
447    }
448    SourceMapGenerator.cleanSourceMapObject();
449  });
450
451  mocha.it('3-1-2: test processTransformedJsModuleRequest under build debug: hasDynamicImport is true', async function () {
452    this.rollup.build();
453    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
454    let newSourceMaps = sourceMapGenerator.getSourceMaps();
455
456    const modeMock = new ModuleModeMock(this.rollup);
457    const mockFileList: object = this.rollup.getModuleIds();
458    this.moduleInfos = new Map<String, ModuleInfo>();
459    for (const moduleId of mockFileList) {
460      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
461        const code: string = JSON.stringify(fs.readFileSync(moduleId, 'utf-8'));
462        const moduleSource = new ModuleSourceFile(moduleId, code);
463        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
464        const metaInfo: object = moduleInfo[META];
465        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
466        moduleInfo.setImportedIdMaps();
467        moduleInfo.setNodeImportExpression();
468        ModuleSourceFile.projectConfig = modeMock.projectConfig;
469        await moduleSource.processTransformedJsModuleRequest(this.rollup);
470        for (const key in newSourceMaps) {
471          expect(newSourceMaps[key].mappings.length > 0).to.be.true;
472          expect(newSourceMaps[key].file.includes(ENTRYABILITY_TS) !== -1
473            || newSourceMaps[key].file.includes(INDEX_ETS) !== -1).to.be.true;
474          expect(newSourceMaps[key].sources.includes(ENTRYABILITY_TS_PATH_DEFAULT) !== -1
475            || newSourceMaps[key].sources.includes(INDEX_ETS_PATH_DEFAULT) !== -1).to.be.true;
476        }
477      }
478    }
479
480    for (const key of Object.keys(newSourceMaps)) {
481      delete newSourceMaps[key];
482    }
483    SourceMapGenerator.cleanSourceMapObject();
484  });
485
486  mocha.it('3-2: test processTransformedJsModuleRequest under build release', function () {
487    this.rollup.build(RELEASE);
488    SourceMapGenerator.initInstance(this.rollup);
489    const modeMock = new ModuleModeMock(this.rollup);
490    const mockFileList: object = this.rollup.getModuleIds();
491    this.moduleInfos = new Map<String, ModuleInfo>();
492    for (const moduleId of mockFileList) {
493      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
494        const code: string = JSON.stringify(fs.readFileSync(moduleId, 'utf-8'));
495        const moduleSource = new ModuleSourceFile(moduleId, code);
496        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
497        const metaInfo: object = moduleInfo[META];
498        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
499        moduleInfo.setImportedIdMaps();
500        moduleInfo.setNodeImportDeclaration();
501        moduleSource.processTransformedJsModuleRequest(this.rollup);
502        const json = fs.readFileSync(EXPECT_TO_JS, 'utf-8');
503        const etsToJs = JSON.parse(json).expect_index_ets_to_js;
504        const tsToJs = JSON.parse(json).expect_entryability_ts_to_js;
505        expect(moduleSource.source === etsToJs || moduleSource.source === tsToJs).to.be.true;
506      }
507    }
508    SourceMapGenerator.cleanSourceMapObject();
509  });
510
511  mocha.it('3-3: test processTransformedJsModuleRequest under preview debug', function () {
512    this.rollup.preview();
513    SourceMapGenerator.initInstance(this.rollup);
514    const modeMock = new ModuleModeMock(this.rollup);
515    const mockFileList: object = this.rollup.getModuleIds();
516    this.moduleInfos = new Map<String, ModuleInfo>();
517    for (const moduleId of mockFileList) {
518      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
519        const code: string = JSON.stringify(fs.readFileSync(moduleId, 'utf-8'));
520        const moduleSource = new ModuleSourceFile(moduleId, code);
521        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
522        const metaInfo: object = moduleInfo[META];
523        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
524        moduleInfo.setImportedIdMaps();
525        moduleInfo.setNodeImportDeclaration();
526        moduleSource.processTransformedJsModuleRequest(this.rollup);
527        const json = fs.readFileSync(EXPECT_TO_JS, 'utf-8');
528        const etsToJs = JSON.parse(json).expect_index_ets_to_js;
529        const tsToJs = JSON.parse(json).expect_entryability_ts_to_js;
530        expect(moduleSource.source === etsToJs || moduleSource.source === tsToJs).to.be.true;
531      }
532    }
533    SourceMapGenerator.cleanSourceMapObject();
534  });
535
536  mocha.it('3-4: test processTransformedJsModuleRequest under hot reload debug', function () {
537    this.rollup.hotReload();
538    SourceMapGenerator.initInstance(this.rollup);
539    const modeMock = new ModuleModeMock(this.rollup);
540    const mockFileList: object = this.rollup.getModuleIds();
541    this.moduleInfos = new Map<String, ModuleInfo>();
542    for (const moduleId of mockFileList) {
543      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
544        const code: string = JSON.stringify(fs.readFileSync(moduleId, 'utf-8'));
545        const moduleSource = new ModuleSourceFile(moduleId, code);
546        const moduleInfo: object = this.rollup.getModuleInfo(moduleId);
547        const metaInfo: object = moduleInfo[META];
548        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
549        moduleInfo.setImportedIdMaps();
550        moduleInfo.setNodeImportDeclaration();
551        moduleSource.processTransformedJsModuleRequest(this.rollup);
552        const json = fs.readFileSync(EXPECT_TO_JS, 'utf-8');
553        const etsToJs = JSON.parse(json).expect_index_ets_to_js;
554        const tsToJs = JSON.parse(json).expect_entryability_ts_to_js;
555        expect(moduleSource.source === etsToJs || moduleSource.source === tsToJs).to.be.true;
556      }
557    }
558    SourceMapGenerator.cleanSourceMapObject();
559  });
560
561  mocha.it('4-1: test processTransformedTsModuleRequest under build debug', function () {
562    this.rollup.build();
563    const modeMock = new ModuleModeMock(this.rollup);
564    const allFiles = new Set<string>();
565    this.moduleInfos = new Map<String, ModuleInfo>();
566    scanFiles(MODULE_TEST_PATH, allFiles);
567    for (const moduleId of allFiles.values()) {
568      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
569        const code: string = fs.readFileSync(moduleId, 'utf-8');
570        const moduleInfo = new ModuleInfoMock(moduleId,
571          this.rollup.share.projectConfig.entryModuleName,
572          this.rollup.share.projectConfig.modulePath);
573        moduleInfo.setImportedIdMaps();
574        this.rollup.moduleInfos.push(moduleInfo);
575        const metaInfo: object = moduleInfo[META];
576        SourceMapGenerator.initInstance(this.rollup);
577        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
578        const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
579        const moduleSource = new ModuleSourceFile(moduleId, sourceFile);
580        ModuleSourceFile.processModuleSourceFiles(this.rollup);
581        moduleSource.processTransformedTsModuleRequest(this.rollup);
582        expect(moduleSource.source.fileName === moduleId).to.be.true;
583        expect(moduleSource.source.text === code).to.be.true;
584        expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true;
585        expect(moduleSource.source.isDeclarationFile === false).to.be.true;
586        expect(moduleSource.source.hasNoDefaultLib === false).to.be.true;
587        expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true;
588        SourceMapGenerator.cleanSourceMapObject();
589      }
590    }
591  });
592
593  mocha.it('4-2: test processTransformedTsModuleRequest under build release', function () {
594    this.rollup.build(RELEASE);
595    const modeMock = new ModuleModeMock(this.rollup);
596    const allFiles = new Set<string>();
597    scanFiles(MODULE_TEST_PATH, allFiles);
598    for (const moduleId of allFiles.values()) {
599      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
600        const code: string = fs.readFileSync(moduleId, 'utf-8');
601        const moduleInfo = new ModuleInfoMock(moduleId,
602          this.rollup.share.projectConfig.entryModuleName,
603          this.rollup.share.projectConfig.modulePath);
604        moduleInfo.setImportedIdMaps();
605        this.rollup.moduleInfos.push(moduleInfo);
606        const metaInfo: object = moduleInfo[META];
607        SourceMapGenerator.initInstance(this.rollup);
608        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
609        const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
610        const moduleSource = new ModuleSourceFile(moduleId, sourceFile);
611        ModuleSourceFile.processModuleSourceFiles(this.rollup);
612        moduleSource.processTransformedTsModuleRequest(this.rollup);
613        expect(moduleSource.source.fileName === moduleId).to.be.true;
614        expect(moduleSource.source.text === code).to.be.true;
615        expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true;
616        expect(moduleSource.source.isDeclarationFile === false).to.be.true;
617        expect(moduleSource.source.hasNoDefaultLib === false).to.be.true;
618        expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true;
619        SourceMapGenerator.cleanSourceMapObject();
620      }
621    }
622  });
623
624  mocha.it('4-3: test processTransformedTsModuleRequest under preview debug', function () {
625    this.rollup.preview();
626    const modeMock = new ModuleModeMock(this.rollup);
627    const allFiles = new Set<string>();
628    scanFiles(MODULE_TEST_PATH, allFiles);
629    for (const moduleId of allFiles.values()) {
630      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
631        const code: string = fs.readFileSync(moduleId, 'utf-8');
632        const moduleInfo = new ModuleInfoMock(moduleId,
633          this.rollup.share.projectConfig.entryModuleName,
634          this.rollup.share.projectConfig.modulePath);
635        moduleInfo.setImportedIdMaps();
636        this.rollup.moduleInfos.push(moduleInfo);
637        const metaInfo: object = moduleInfo[META];
638        SourceMapGenerator.initInstance(this.rollup);
639        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
640        const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
641        const moduleSource = new ModuleSourceFile(moduleId, sourceFile);
642        ModuleSourceFile.processModuleSourceFiles(this.rollup);
643        moduleSource.processTransformedTsModuleRequest(this.rollup);
644        expect(moduleSource.source.fileName === moduleId).to.be.true;
645        expect(moduleSource.source.text === code).to.be.true;
646        expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true;
647        expect(moduleSource.source.isDeclarationFile === false).to.be.true;
648        expect(moduleSource.source.hasNoDefaultLib === false).to.be.true;
649        expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true;
650        SourceMapGenerator.cleanSourceMapObject();
651      }
652    }
653  });
654
655  mocha.it('4-4: test processTransformedTsModuleRequest under reload debug', function () {
656    this.rollup.hotReload();
657    const modeMock = new ModuleModeMock(this.rollup);
658    const allFiles = new Set<string>();
659    scanFiles(MODULE_TEST_PATH, allFiles);
660    for (const moduleId of allFiles.values()) {
661      if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) {
662        const code: string = fs.readFileSync(moduleId, 'utf-8');
663        const moduleInfo = new ModuleInfoMock(moduleId,
664          this.rollup.share.projectConfig.entryModuleName,
665          this.rollup.share.projectConfig.modulePath);
666        moduleInfo.setImportedIdMaps();
667        this.rollup.moduleInfos.push(moduleInfo);
668        const metaInfo: object = moduleInfo[META];
669        SourceMapGenerator.initInstance(this.rollup);
670        modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos);
671        const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
672        const moduleSource = new ModuleSourceFile(moduleId, sourceFile);
673        ModuleSourceFile.processModuleSourceFiles(this.rollup);
674        moduleSource.processTransformedTsModuleRequest(this.rollup);
675        expect(moduleSource.source.fileName === moduleId).to.be.true;
676        expect(moduleSource.source.text === code).to.be.true;
677        expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true;
678        expect(moduleSource.source.isDeclarationFile === false).to.be.true;
679        expect(moduleSource.source.hasNoDefaultLib === false).to.be.true;
680        expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true;
681        SourceMapGenerator.cleanSourceMapObject();
682      }
683    }
684  });
685});