!3031 Support importing a specific file of the shared library

Merge pull request !3031 from 常佳兴/master
This commit is contained in:
openharmony_ci 2022-12-01 14:54:45 +00:00 committed by Gitee
commit a67b34361f
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
53 changed files with 138 additions and 169 deletions

View File

@ -153,14 +153,12 @@ JSTaggedValue BuiltinsPromiseJob::DynamicImportJob(EcmaRuntimeCallInfo *argv)
specifierString.GetTaggedValue());
fileNameStr = ConvertToString(moduleName.GetTaggedValue());
} else {
bool npm;
CString npmKey = "";
CString recordNameStr = ConvertToString(recordName.GetTaggedValue());
CString requestModule = ConvertToString(specifierString.GetTaggedValue());
const JSPandaFile *jsPandaFile = JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, baseFilename,
recordNameStr.c_str());
std::tie(entryPoint, npm) = ModuleManager::ConcatFileNameWithMerge(
jsPandaFile, baseFilename, recordNameStr, requestModule, npmKey);
entryPoint =
ModuleManager::ConcatFileNameWithMerge(jsPandaFile, baseFilename, recordNameStr, requestModule);
fileNameStr = baseFilename;
moduleName = factory->NewFromUtf8(entryPoint);
}

View File

@ -3213,9 +3213,6 @@ void SourceTextModule::Dump(std::ostream &os) const
os << " - EcmaModuleRecordName: ";
GetEcmaModuleRecordName().Dump(os);
os << "\n";
os << " - NpmKey: ";
GetNpmKey().Dump(os);
os << "\n";
os << " - RequestedModules: ";
GetRequestedModules().Dump(os);
os << "\n";
@ -4998,7 +4995,6 @@ void SourceTextModule::DumpForSnapshot(std::vector<std::pair<CString, JSTaggedVa
vec.push_back(std::make_pair(CString("Namespace"), GetNamespace()));
vec.push_back(std::make_pair(CString("EcmaModuleFilename"), GetEcmaModuleFilename()));
vec.push_back(std::make_pair(CString("EcmaModuleRecordName"), GetEcmaModuleRecordName()));
vec.push_back(std::make_pair(CString("NpmKey"), GetNpmKey()));
vec.push_back(std::make_pair(CString("RequestedModules"), GetRequestedModules()));
vec.push_back(std::make_pair(CString("ImportEntries"), GetImportEntries()));
vec.push_back(std::make_pair(CString("LocalExportEntries"), GetLocalExportEntries()));

View File

@ -154,6 +154,9 @@ void JSPandaFile::InitializeMergedPF()
info.hasTSTypes = fieldAccessor.GetValue<uint8_t>().value() != 0;
} else if (std::strcmp(TYPE_SUMMARY_OFFSET, fieldName) == 0) {
info.typeSummaryOffset = fieldAccessor.GetValue<uint32_t>().value();
} else if (std::strlen(fieldName) > PACKAGE_NAME_LEN &&
std::strncmp(fieldName, PACKAGE_NAME, PACKAGE_NAME_LEN) == 0) {
info.npmPackageName = fieldName + PACKAGE_NAME_LEN;
}
});
if (hasCjsFiled) {
@ -201,6 +204,9 @@ bool JSPandaFile::IsCjs(const CString &recordName) const
CString JSPandaFile::FindEntryPoint(const CString &recordName) const
{
if (HasRecord(recordName)) {
return recordName;
}
Span<const uint32_t> classIndexes = pf_->GetClasses();
CString entryPoint;
for (const uint32_t index : classIndexes) {

View File

@ -36,7 +36,7 @@ public:
CUnorderedMap<uint32_t, uint64_t> constpoolMap;
bool hasTSTypes {false};
uint32_t typeSummaryOffset {0};
CString npmPackageName;
bool HasTSTypes() const
{
return hasTSTypes;
@ -80,6 +80,10 @@ public:
static constexpr char NODE_MODULES_ZERO[] = "node_modules/0/";
static constexpr char NODE_MODULES_ONE[] = "node_modules/1/";
static constexpr char MERGE_ABC_NAME[] = "modules.abc";
static constexpr char MERGE_ABC_ETS_MODULES[] = "/ets/modules.abc";
static constexpr char PACKAGE_NAME[] = "pkgName@";
static constexpr int PACKAGE_NAME_LEN = 8;
static constexpr int MODULE_PREFIX_LENGTH = 8;
JSPandaFile(const panda_file::File *pf, const CString &descriptor);
~JSPandaFile();

View File

@ -1,2 +1,2 @@
index.js;index;module;index.js
module.js;module;module;module.js
index.js;index;esm;index.js;entry
module.js;module;esm;module.js;entry

View File

@ -268,7 +268,6 @@ JSHandle<SourceTextModule> ModuleManager::HostResolveImportedModuleWithMerge(con
if (entry != -1) {
return JSHandle<SourceTextModule>(thread, dict->GetValue(entry));
}
const JSPandaFile *jsPandaFile =
JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, moduleFileName, recordName.c_str());
if (jsPandaFile == nullptr) {
@ -569,18 +568,23 @@ void ModuleManager::Iterate(const RootVisitor &v)
v(Root::ROOT_VM, ObjectSlot(reinterpret_cast<uintptr_t>(&resolvedModules_)));
}
std::tuple<CString, bool> ModuleManager::ConcatFileNameWithMerge(const JSPandaFile *jsPandaFile, CString &baseFilename,
CString &moduleRecordName, CString &moduleRequestName,
CString &npmKey)
CString ModuleManager::ConcatFileNameWithMerge(const JSPandaFile *jsPandaFile, CString &baseFilename,
CString moduleRecordName, CString moduleRequestName)
{
CString entryPoint;
size_t pos = 0;
bool npm = false;
if (moduleRequestName.find("@bundle:") != CString::npos) {
pos = moduleRequestName.find('/');
pos = moduleRequestName.find('/', pos + 1);
ASSERT(pos != CString::npos);
entryPoint = moduleRequestName.substr(pos + 1);
} else if (moduleRequestName.find("@module:") != CString::npos) {
moduleRequestName = moduleRequestName.substr(JSPandaFile::MODULE_PREFIX_LENGTH);
pos = moduleRequestName.find('/');
ASSERT(pos != CString::npos);
baseFilename =
JSPandaFile::BUNDLE_INSTALL_PATH + moduleRequestName.substr(0, pos) + JSPandaFile::MERGE_ABC_ETS_MODULES;
entryPoint = moduleRequestName.substr(pos + 1);
} else if (moduleRequestName.rfind(".js") != CString::npos || moduleRequestName.find("./") == 0 ||
moduleRequestName.find("../") == 0) {
pos = moduleRequestName.rfind(".js");
@ -620,11 +624,11 @@ std::tuple<CString, bool> ModuleManager::ConcatFileNameWithMerge(const JSPandaFi
}
}
} else {
npm = true;
pos = moduleRecordName.find(JSPandaFile::NODE_MODULES);
CString key = "";
if (pos != CString::npos) {
key = npmKey + "/" + JSPandaFile::NODE_MODULES + "/" + moduleRequestName;
auto info = const_cast<JSPandaFile *>(jsPandaFile)->FindRecordInfo(moduleRecordName);
key = info.npmPackageName + "/" + JSPandaFile::NODE_MODULES + "/" + moduleRequestName;
entryPoint = jsPandaFile->FindEntryPoint(key);
}
@ -641,12 +645,10 @@ std::tuple<CString, bool> ModuleManager::ConcatFileNameWithMerge(const JSPandaFi
if (entryPoint.empty()) {
LOG_ECMA(ERROR) << "find entryPoint failed\n"
<< "moduleRequestName : " << moduleRequestName << "\n"
<< "moduleRecordName : " << moduleRecordName << "\n"
<< "npmKey : " << npmKey;
<< "moduleRecordName : " << moduleRecordName << "\n";
}
npmKey = key;
}
return std::make_tuple(entryPoint, npm);
return entryPoint;
}
CString ModuleManager::GetRecordName(JSTaggedValue module)

View File

@ -71,9 +71,8 @@ public:
isExecuteBuffer_ = mode;
}
void ConcatFileName(std::string &dirPath, std::string &requestPath, std::string &fileName);
static std::tuple<CString, bool> ConcatFileNameWithMerge(const JSPandaFile *jsPandaFile, CString &baseFilename,
CString &moduleRecordName, CString &moduleRequestName,
CString &npmKey);
static CString ConcatFileNameWithMerge(const JSPandaFile *jsPandaFile, CString &baseFilename,
CString moduleRecordName, CString moduleRequestName);
static CString GetRecordName(JSTaggedValue module);
static int GetExportObjectIndex(EcmaVM *vm, JSHandle<SourceTextModule> ecmaModule, const std::string &key);
private:

View File

@ -88,24 +88,10 @@ JSHandle<SourceTextModule> SourceTextModule::HostResolveImportedModuleWithMerge(
const JSPandaFile *jsPandaFile =
JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, baseFilename, moduleRecordName);
JSTaggedValue npmKey = module->GetNpmKey();
CString npmKeyStr = "";
if (!npmKey.IsUndefined()) {
npmKeyStr = ConvertToString(EcmaString::Cast(npmKey.GetTaggedObject()));
}
CString moduleRequestName = ConvertToString(EcmaString::Cast(moduleRequest->GetTaggedObject()));
CString entryPoint = "";
bool npm = false;
std::tie(entryPoint, npm) = ModuleManager::ConcatFileNameWithMerge(
jsPandaFile, baseFilename, moduleRecordName, moduleRequestName, npmKeyStr);
JSHandle<SourceTextModule> newModule = moduleManager->HostResolveImportedModuleWithMerge(baseFilename, entryPoint);
if (npm) {
JSHandle<EcmaString> newNpmkey = thread->GetEcmaVM()->GetFactory()->NewFromUtf8(npmKeyStr.c_str());
newModule->SetNpmKey(thread, newNpmkey);
} else {
newModule->SetNpmKey(thread, module->GetNpmKey());
}
return newModule;
CString entryPoint =
ModuleManager::ConcatFileNameWithMerge(jsPandaFile, baseFilename, moduleRecordName, moduleRequestName);
return moduleManager->HostResolveImportedModuleWithMerge(baseFilename, entryPoint);
}
// old way with bundle
@ -481,7 +467,8 @@ void SourceTextModule::ModuleDeclarationEnvironmentSetup(JSThread *thread,
SourceTextModule::ResolveExport(thread, importedModule, importName, resolveVector);
// ii. If resolution is null or "ambiguous", throw a SyntaxError exception.
if (resolution->IsNull() || resolution->IsString()) {
CString msg = "find importName " + ConvertToString(importName.GetTaggedValue()) + " failed";
CString msg = "find importName " + ConvertToString(importName.GetTaggedValue()) + " failed ";
msg += "RecordName : " + ConvertToString(module->GetEcmaModuleRecordName());
THROW_ERROR(thread, ErrorType::SYNTAX_ERROR, msg.c_str());
}
// iii. Call envRec.CreateImportBinding(
@ -546,7 +533,8 @@ void SourceTextModule::ModuleDeclarationArrayEnvironmentSetup(JSThread *thread,
SourceTextModule::ResolveExport(thread, importedModule, importName, resolveVector);
// ii. If resolution is null or "ambiguous", throw a SyntaxError exception.
if (resolution->IsNull() || resolution->IsString()) {
CString msg = "find importName " + ConvertToString(importName.GetTaggedValue()) + " failed";
CString msg = "find importName " + ConvertToString(importName.GetTaggedValue()) + " failed ";
msg += "RecordName : " + ConvertToString(module->GetEcmaModuleRecordName());
THROW_ERROR(thread, ErrorType::SYNTAX_ERROR, msg.c_str());
}
// iii. Call envRec.CreateImportBinding(
@ -1159,7 +1147,8 @@ void SourceTextModule::CheckResolvedBinding(JSThread *thread, const JSHandle<Sou
SourceTextModule::ResolveExport(thread, module, exportName, resolveVector);
// b. If resolution is null or "ambiguous", throw a SyntaxError exception.
if (resolution->IsNull() || resolution->IsString()) {
CString msg = "find exportName " + ConvertToString(exportName.GetTaggedValue()) + " failed";
CString msg = "find exportName " + ConvertToString(exportName.GetTaggedValue()) + " failed ";
msg += "RecordName : " + ConvertToString(module->GetEcmaModuleRecordName());
THROW_ERROR(thread, ErrorType::SYNTAX_ERROR, msg.c_str());
}
// c. Assert: resolution is a ResolvedBinding Record.
@ -1189,7 +1178,8 @@ void SourceTextModule::CheckResolvedIndexBinding(JSThread *thread, const JSHandl
SourceTextModule::ResolveExport(thread, module, exportName, resolveVector);
// b. If resolution is null or "ambiguous", throw a SyntaxError exception.
if (resolution->IsNull() || resolution->IsString()) {
CString msg = "find exportName " + ConvertToString(exportName.GetTaggedValue()) + " failed";
CString msg = "find exportName " + ConvertToString(exportName.GetTaggedValue()) + " failed ";
msg += "RecordName : " + ConvertToString(module->GetEcmaModuleRecordName());
THROW_ERROR(thread, ErrorType::SYNTAX_ERROR, msg.c_str());
}
// c. Assert: resolution is a ResolvedBinding Record.

View File

@ -83,8 +83,7 @@ public:
ACCESSORS(Namespace, NAMESPACE_OFFSET, ECMA_MODULE_FILENAME);
ACCESSORS(EcmaModuleFilename, ECMA_MODULE_FILENAME, ECMA_MODULE_RECORDNAME);
ACCESSORS(EcmaModuleRecordName, ECMA_MODULE_RECORDNAME, REQUESTED_MODULES_OFFSET);
ACCESSORS(NpmKey, REQUESTED_MODULES_OFFSET, NPM_KEY_OFFSET);
ACCESSORS(RequestedModules, NPM_KEY_OFFSET, IMPORT_ENTRIES_OFFSET);
ACCESSORS(RequestedModules, REQUESTED_MODULES_OFFSET, IMPORT_ENTRIES_OFFSET);
ACCESSORS(ImportEntries, IMPORT_ENTRIES_OFFSET, LOCAL_EXPORT_ENTTRIES_OFFSET);
ACCESSORS(LocalExportEntries, LOCAL_EXPORT_ENTTRIES_OFFSET, INDIRECT_EXPORT_ENTTRIES_OFFSET);
ACCESSORS(IndirectExportEntries, INDIRECT_EXPORT_ENTTRIES_OFFSET, START_EXPORT_ENTTRIES_OFFSET);

View File

@ -218,12 +218,7 @@ HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge1)
CString moduleRecordName = "moduleTest1";
CString moduleRequestName = "@bundle:com.bundleName.test/moduleName/requestModuleName1";
CString result = "requestModuleName1";
CString npmKey = "";
bool npm = false;
CString entryPoint = "";
std::tie(entryPoint, npm) =
ModuleManager::ConcatFileNameWithMerge(pf, baseFilename, moduleRecordName, moduleRequestName, npmKey);
EXPECT_FALSE(npm);
CString entryPoint = ModuleManager::ConcatFileNameWithMerge(pf, baseFilename, moduleRecordName, moduleRequestName);
EXPECT_EQ(result, entryPoint);
}
@ -248,12 +243,7 @@ HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge2)
CString moduleRequestName = "./requestModule.js";
CString result = "requestModule";
pf->InsertJSRecordInfo(result);
CString entryPoint = "";
CString npmKey = "";
bool npm = false;
std::tie(entryPoint, npm) =
ModuleManager::ConcatFileNameWithMerge(pf, baseFilename, moduleRecordName, moduleRequestName, npmKey);
EXPECT_FALSE(npm);
CString entryPoint = ModuleManager::ConcatFileNameWithMerge(pf, baseFilename, moduleRecordName, moduleRequestName);
EXPECT_EQ(result, entryPoint);
// Test moduleRecordName with "/"
@ -261,9 +251,7 @@ HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge2)
moduleRequestName = "./requestModule.js";
result = "moduleName/requestModule";
pf->InsertJSRecordInfo(result);
std::tie(entryPoint, npm) =
ModuleManager::ConcatFileNameWithMerge(pf, baseFilename, moduleRecordName, moduleRequestName, npmKey);
EXPECT_FALSE(npm);
entryPoint = ModuleManager::ConcatFileNameWithMerge(pf, baseFilename, moduleRecordName, moduleRequestName);
EXPECT_EQ(result, entryPoint);
}
@ -288,12 +276,8 @@ HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge3)
CString moduleRequestName = "./secord.js";
CString result = "secord";
CString requestFileName = "secord.abc";
CString entryPoint = "";
CString npmKey = "";
bool npm = false;
std::tie(entryPoint, npm) =
ModuleManager::ConcatFileNameWithMerge(pf, baseFilename, moduleRecordName, moduleRequestName, npmKey);
EXPECT_FALSE(npm);
CString entryPoint =
ModuleManager::ConcatFileNameWithMerge(pf, baseFilename, moduleRecordName, moduleRequestName);
EXPECT_EQ(baseFilename, requestFileName);
EXPECT_EQ(result, entryPoint);
@ -306,9 +290,7 @@ HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge3)
moduleRequestName = "./test/secord.js";
result = "secord";
requestFileName = "test/test/secord.abc";
std::tie(entryPoint, npm) =
ModuleManager::ConcatFileNameWithMerge(pf2, baseFilename, moduleRecordName, moduleRequestName, npmKey);
EXPECT_FALSE(npm);
entryPoint = ModuleManager::ConcatFileNameWithMerge(pf2, baseFilename, moduleRecordName, moduleRequestName);
EXPECT_EQ(baseFilename, requestFileName);
EXPECT_EQ(result, entryPoint);
}
@ -328,17 +310,16 @@ HWTEST_F_L0(EcmaModuleTest, ConcatFileNameWithMerge4)
auto res = parser.Parse(data);
std::unique_ptr<const File> pfPtr = pandasm::AsmEmitter::Emit(res.Value());
JSPandaFile *pf = pfManager->NewJSPandaFile(pfPtr.release(), baseFilename);
const CUnorderedMap<CString, JSPandaFile::JSRecordInfo> &recordInfo = pf->GetJSRecordInfo();
// Test moduleRequestName is npm package
CString moduleRecordName = "node_modules/moduleTest4";
CString moduleRequestName = "json";
CString result = "";
CString entryPoint = "";
CString npmKey = "";
bool npm = false;
std::tie(entryPoint, npm) =
ModuleManager::ConcatFileNameWithMerge(pf, baseFilename, moduleRecordName, moduleRequestName, npmKey);
EXPECT_TRUE(npm);
CString moduleRecordName = "node_modules/0/moduleTest4/index";
CString moduleRequestName = "json/index";
CString result = "node_modules/0/moduleTest4/node_modules/json/index";
JSPandaFile::JSRecordInfo info;
info.npmPackageName = "node_modules/0/moduleTest4";
const_cast<CUnorderedMap<CString, JSPandaFile::JSRecordInfo> &>(recordInfo).insert({moduleRecordName, info});
const_cast<CUnorderedMap<CString, JSPandaFile::JSRecordInfo> &>(recordInfo).insert({result, info});
CString entryPoint = ModuleManager::ConcatFileNameWithMerge(pf, baseFilename, moduleRecordName, moduleRequestName);
EXPECT_EQ(result, entryPoint);
}

View File

@ -3830,7 +3830,6 @@ JSHandle<SourceTextModule> ObjectFactory::NewSourceTextModule()
obj->SetNamespace(thread_, undefinedValue);
obj->SetEcmaModuleFilename(thread_, undefinedValue);
obj->SetEcmaModuleRecordName(thread_, undefinedValue);
obj->SetNpmKey(thread_, undefinedValue);
obj->SetRequestedModules(thread_, undefinedValue);
obj->SetImportEntries(thread_, undefinedValue);
obj->SetLocalExportEntries(thread_, undefinedValue);

View File

@ -1219,7 +1219,7 @@ HWTEST_F_L0(EcmaDumpTest, HeapProfileDump)
break;
}
case JSType::SOURCE_TEXT_MODULE_RECORD: {
CHECK_DUMP_FIELDS(ModuleRecord::SIZE, SourceTextModule::SIZE, 13U);
CHECK_DUMP_FIELDS(ModuleRecord::SIZE, SourceTextModule::SIZE, 12U);
JSHandle<SourceTextModule> moduleSourceRecord = factory->NewSourceTextModule();
DUMP_FOR_HANDLE(moduleSourceRecord);
break;

View File

@ -82,17 +82,12 @@ GlobalTSTypeRef TSTypeParser::ResolveImportType(const JSPandaFile *jsPandaFile,
JSHandle<EcmaString> importVarNamePath(thread_, literal->Get(IMPORT_PATH_OFFSET_IN_LITERAL)); // #A#./A
JSHandle<EcmaString> relativePath = GenerateImportRelativePath(importVarNamePath);
CString cstringRelativePath = ConvertToString(*relativePath);
CString entryPoint = "";
CString npmKeyStr = "";
bool npm = false;
CString name = recordName;
CString baseFileName = jsPandaFile->GetJSPandaFileDesc();
std::tie(entryPoint, npm) =
CString entryPoint =
ModuleManager::ConcatFileNameWithMerge(jsPandaFile,
baseFileName,
name,
cstringRelativePath,
npmKeyStr);
recordName,
cstringRelativePath);
JSHandle<EcmaString> targetVarName = GenerateImportVar(importVarNamePath);
JSHandle<TaggedArray> arrayWithGT = GenerateExportTableFromRecord(jsPandaFile, entryPoint);
GlobalTSTypeRef importedGT = GetExportGTByName(targetVarName, arrayWithGT);

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;module;base.js;entry
module.js;module;module;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;module;base.js;entry
module_modify.js;module;module;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;module;base.js;entry
module.js;module;module;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify1.js;base;module;base.js
module_modify1.js;module;module;module.js
base_modify1.js;base;esm;base.js;entry
module_modify1.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify2.js;base;module;base.js
module_modify2.js;module;module;module.js
base_modify2.js;base;esm;base.js;entry
module_modify2.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base_modify.js;base;module;base.js
module_modify.js;module;module;module.js
base_modify.js;base;esm;base.js;entry
module_modify.js;module;esm;module.js;entry

View File

@ -1,2 +1,2 @@
base.js;base;module;base.js
module.js;module;module;module.js
base.js;base;esm;base.js;entry
module.js;module;esm;module.js;entry

View File

@ -1 +1 @@
base_modify.js;base;module;base.js
base_modify.js;base;esm;base.js;entry

View File

@ -1 +1 @@
test.js;retest;module;test.js
test.js;retest;esm;test.js;entry

View File

@ -1 +1 @@
test.js;test;module;test.js
test.js;test;esm;test.js;entry