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});