mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-01 19:58:15 +00:00
[TS] Generate entry point module (#6674)
This commit is contained in:
@@ -29,7 +29,10 @@ namespace flatbuffers {
|
||||
|
||||
struct ImportDefinition {
|
||||
std::string name;
|
||||
std::string statement;
|
||||
std::string import_statement;
|
||||
std::string export_statement;
|
||||
std::string bare_file_path;
|
||||
std::string rel_file_path;
|
||||
const Definition *dependent;
|
||||
const Definition *dependency;
|
||||
};
|
||||
@@ -49,6 +52,7 @@ class TsGenerator : public BaseGenerator {
|
||||
bool generate() {
|
||||
generateEnums();
|
||||
generateStructs();
|
||||
generateEntry();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -62,12 +66,12 @@ class TsGenerator : public BaseGenerator {
|
||||
"// " + std::string(FlatBuffersGeneratedWarning()) + "\n\n";
|
||||
|
||||
for (auto it = bare_imports.begin(); it != bare_imports.end(); it++)
|
||||
code += it->second.statement + "\n";
|
||||
code += it->second.import_statement + "\n";
|
||||
if (!bare_imports.empty()) code += "\n";
|
||||
|
||||
for (auto it = imports.begin(); it != imports.end(); it++)
|
||||
if (it->second.dependency != &definition) // do not import itself
|
||||
code += it->second.statement + "\n";
|
||||
code += it->second.import_statement + "\n";
|
||||
if (!imports.empty()) code += "\n\n";
|
||||
|
||||
code += classcode;
|
||||
@@ -77,6 +81,8 @@ class TsGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
private:
|
||||
import_set imports_all_;
|
||||
|
||||
// Generate code for all enums.
|
||||
void generateEnums() {
|
||||
for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
|
||||
@@ -88,6 +94,7 @@ class TsGenerator : public BaseGenerator {
|
||||
GenEnum(enum_def, &enumcode, imports, false);
|
||||
GenEnum(enum_def, &enumcode, imports, true);
|
||||
SaveType(enum_def, enumcode, imports, bare_imports);
|
||||
imports_all_.insert(imports.begin(), imports.end());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,9 +109,19 @@ class TsGenerator : public BaseGenerator {
|
||||
std::string declcode;
|
||||
GenStruct(parser_, struct_def, &declcode, imports);
|
||||
SaveType(struct_def, declcode, imports, bare_imports);
|
||||
imports_all_.insert(imports.begin(), imports.end());
|
||||
}
|
||||
}
|
||||
|
||||
// Generate code for a single entry point module.
|
||||
void generateEntry() {
|
||||
std::string code;
|
||||
for (auto it = imports_all_.begin(); it != imports_all_.end(); it++)
|
||||
code += it->second.export_statement + "\n";
|
||||
std::string path = "./" + path_ + file_name_ + ".ts";
|
||||
SaveFile(path.c_str(), code, false);
|
||||
}
|
||||
|
||||
// Generate a documentation comment, if available.
|
||||
static void GenDocComment(const std::vector<std::string> &dc,
|
||||
std::string *code_ptr,
|
||||
@@ -465,30 +482,40 @@ class TsGenerator : public BaseGenerator {
|
||||
}
|
||||
}
|
||||
std::string import_statement;
|
||||
std::string export_statement;
|
||||
import_statement += "import { ";
|
||||
export_statement += "export { ";
|
||||
std::string symbols_expression;
|
||||
if (long_import_name.empty()) {
|
||||
import_statement += import_name;
|
||||
symbols_expression += import_name;
|
||||
if (parser_.opts.generate_object_based_api)
|
||||
import_statement += ", " + import_name + "T";
|
||||
symbols_expression += ", " + import_name + "T";
|
||||
} else {
|
||||
import_statement += dependency.name + " as " + long_import_name;
|
||||
symbols_expression += dependency.name + " as " + long_import_name;
|
||||
if (parser_.opts.generate_object_based_api)
|
||||
import_statement +=
|
||||
symbols_expression +=
|
||||
", " + dependency.name + "T as " + long_import_name + "T";
|
||||
}
|
||||
import_statement += " } from '";
|
||||
std::string file_name;
|
||||
import_statement += symbols_expression + " } from '";
|
||||
export_statement += symbols_expression + " } from '";
|
||||
std::string bare_file_path;
|
||||
std::string rel_file_path;
|
||||
const auto &dep_comps = dependent.defined_namespace->components;
|
||||
for (size_t i = 0; i < dep_comps.size(); i++)
|
||||
file_name += i == 0 ? ".." : (kPathSeparator + std::string(".."));
|
||||
if (dep_comps.size() == 0) file_name += ".";
|
||||
rel_file_path += i == 0 ? ".." : (kPathSeparator + std::string(".."));
|
||||
if (dep_comps.size() == 0) rel_file_path += ".";
|
||||
for (auto it = depc_comps.begin(); it != depc_comps.end(); it++)
|
||||
file_name += kPathSeparator + ToDasherizedCase(*it);
|
||||
file_name += kPathSeparator + ToDasherizedCase(dependency.name);
|
||||
import_statement += file_name + "';";
|
||||
bare_file_path += kPathSeparator + ToDasherizedCase(*it);
|
||||
bare_file_path += kPathSeparator + ToDasherizedCase(dependency.name);
|
||||
rel_file_path += bare_file_path;
|
||||
import_statement += rel_file_path + "';";
|
||||
export_statement += "." + bare_file_path + "';";
|
||||
ImportDefinition import;
|
||||
import.name = long_import_name.empty() ? import_name : long_import_name;
|
||||
import.statement = import_statement;
|
||||
import.bare_file_path = bare_file_path;
|
||||
import.rel_file_path = rel_file_path;
|
||||
import.import_statement = import_statement;
|
||||
import.export_statement = export_statement;
|
||||
import.dependency = &dependency;
|
||||
import.dependent = &dependent;
|
||||
imports.insert(std::make_pair(unique_name, import));
|
||||
@@ -514,28 +541,38 @@ class TsGenerator : public BaseGenerator {
|
||||
}
|
||||
}
|
||||
std::string import_statement;
|
||||
std::string export_statement;
|
||||
import_statement += "import { ";
|
||||
export_statement += "export { ";
|
||||
std::string symbols_expression;
|
||||
if (long_import_name.empty())
|
||||
import_statement += import_name;
|
||||
symbols_expression += import_name;
|
||||
else
|
||||
import_statement += dependency.name + " as " + long_import_name;
|
||||
symbols_expression += dependency.name + " as " + long_import_name;
|
||||
if (dependency.is_union) {
|
||||
import_statement += ", unionTo" + import_name;
|
||||
import_statement += ", unionListTo" + import_name;
|
||||
symbols_expression += ", unionTo" + import_name;
|
||||
symbols_expression += ", unionListTo" + import_name;
|
||||
}
|
||||
import_statement += " } from '";
|
||||
std::string file_name;
|
||||
import_statement += symbols_expression + " } from '";
|
||||
export_statement += symbols_expression + " } from '";
|
||||
std::string bare_file_path;
|
||||
std::string rel_file_path;
|
||||
const auto &dep_comps = dependent.defined_namespace->components;
|
||||
for (size_t i = 0; i < dep_comps.size(); i++)
|
||||
file_name += i == 0 ? ".." : (kPathSeparator + std::string(".."));
|
||||
if (dep_comps.size() == 0) file_name += ".";
|
||||
rel_file_path += i == 0 ? ".." : (kPathSeparator + std::string(".."));
|
||||
if (dep_comps.size() == 0) rel_file_path += ".";
|
||||
for (auto it = depc_comps.begin(); it != depc_comps.end(); it++)
|
||||
file_name += kPathSeparator + ToDasherizedCase(*it);
|
||||
file_name += kPathSeparator + ToDasherizedCase(dependency.name);
|
||||
import_statement += file_name + "';";
|
||||
bare_file_path += kPathSeparator + ToDasherizedCase(*it);
|
||||
bare_file_path += kPathSeparator + ToDasherizedCase(dependency.name);
|
||||
rel_file_path += bare_file_path;
|
||||
import_statement += rel_file_path + "';";
|
||||
export_statement += "." + bare_file_path + "';";
|
||||
ImportDefinition import;
|
||||
import.name = long_import_name.empty() ? import_name : long_import_name;
|
||||
import.statement = import_statement;
|
||||
import.bare_file_path = bare_file_path;
|
||||
import.rel_file_path = rel_file_path;
|
||||
import.import_statement = import_statement;
|
||||
import.export_statement = export_statement;
|
||||
import.dependency = &dependency;
|
||||
import.dependent = &dependent;
|
||||
imports.insert(std::make_pair(unique_name, import));
|
||||
@@ -546,7 +583,7 @@ class TsGenerator : public BaseGenerator {
|
||||
std::string fileName) {
|
||||
ImportDefinition import;
|
||||
import.name = import_name;
|
||||
import.statement = "import " + import_name + " from '" + fileName + "';";
|
||||
import.import_statement = "import " + import_name + " from '" + fileName + "';";
|
||||
imports.insert(std::make_pair(import_name, import));
|
||||
}
|
||||
|
||||
|
||||
16
tests/monster_test.js
Normal file
16
tests/monster_test.js
Normal file
@@ -0,0 +1,16 @@
|
||||
export { Monster as MyGameExample2Monster, MonsterT as MyGameExample2MonsterT } from './my-game/example2/monster';
|
||||
export { Ability, AbilityT } from './my-game/example/ability';
|
||||
export { Any, unionToAny, unionListToAny } from './my-game/example/any';
|
||||
export { AnyAmbiguousAliases, unionToAnyAmbiguousAliases, unionListToAnyAmbiguousAliases } from './my-game/example/any-ambiguous-aliases';
|
||||
export { AnyUniqueAliases, unionToAnyUniqueAliases, unionListToAnyUniqueAliases } from './my-game/example/any-unique-aliases';
|
||||
export { Color } from './my-game/example/color';
|
||||
export { Monster, MonsterT } from './my-game/example/monster';
|
||||
export { Race } from './my-game/example/race';
|
||||
export { Referrable, ReferrableT } from './my-game/example/referrable';
|
||||
export { Stat, StatT } from './my-game/example/stat';
|
||||
export { StructOfStructs, StructOfStructsT } from './my-game/example/struct-of-structs';
|
||||
export { Test, TestT } from './my-game/example/test';
|
||||
export { TestSimpleTableWithEnum, TestSimpleTableWithEnumT } from './my-game/example/test-simple-table-with-enum';
|
||||
export { TypeAliases, TypeAliasesT } from './my-game/example/type-aliases';
|
||||
export { Vec3, Vec3T } from './my-game/example/vec3';
|
||||
export { InParentNamespace, InParentNamespaceT } from './my-game/in-parent-namespace';
|
||||
16
tests/monster_test.ts
Normal file
16
tests/monster_test.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
export { Monster as MyGameExample2Monster, MonsterT as MyGameExample2MonsterT } from './my-game/example2/monster';
|
||||
export { Ability, AbilityT } from './my-game/example/ability';
|
||||
export { Any, unionToAny, unionListToAny } from './my-game/example/any';
|
||||
export { AnyAmbiguousAliases, unionToAnyAmbiguousAliases, unionListToAnyAmbiguousAliases } from './my-game/example/any-ambiguous-aliases';
|
||||
export { AnyUniqueAliases, unionToAnyUniqueAliases, unionListToAnyUniqueAliases } from './my-game/example/any-unique-aliases';
|
||||
export { Color } from './my-game/example/color';
|
||||
export { Monster, MonsterT } from './my-game/example/monster';
|
||||
export { Race } from './my-game/example/race';
|
||||
export { Referrable, ReferrableT } from './my-game/example/referrable';
|
||||
export { Stat, StatT } from './my-game/example/stat';
|
||||
export { StructOfStructs, StructOfStructsT } from './my-game/example/struct-of-structs';
|
||||
export { Test, TestT } from './my-game/example/test';
|
||||
export { TestSimpleTableWithEnum, TestSimpleTableWithEnumT } from './my-game/example/test-simple-table-with-enum';
|
||||
export { TypeAliases, TypeAliasesT } from './my-game/example/type-aliases';
|
||||
export { Vec3, Vec3T } from './my-game/example/vec3';
|
||||
export { InParentNamespace, InParentNamespaceT } from './my-game/in-parent-namespace';
|
||||
@@ -12,7 +12,8 @@
|
||||
"baseUrl": ".",
|
||||
"noEmit": false
|
||||
},
|
||||
"include": [
|
||||
"include": [
|
||||
"monster_test.ts",
|
||||
"my-game/**/*.ts",
|
||||
"optional_scalars/**/*.ts",
|
||||
"namespace_test/**/*.ts",
|
||||
|
||||
5
tests/union_vector/union_vector.js
Normal file
5
tests/union_vector/union_vector.js
Normal file
@@ -0,0 +1,5 @@
|
||||
export { Attacker, AttackerT } from './attacker';
|
||||
export { BookReader, BookReaderT } from './book-reader';
|
||||
export { Character, unionToCharacter, unionListToCharacter } from './character';
|
||||
export { Movie, MovieT } from './movie';
|
||||
export { Rapunzel, RapunzelT } from './rapunzel';
|
||||
5
tests/union_vector/union_vector.ts
Normal file
5
tests/union_vector/union_vector.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export { Attacker, AttackerT } from './attacker';
|
||||
export { BookReader, BookReaderT } from './book-reader';
|
||||
export { Character, unionToCharacter, unionListToCharacter } from './character';
|
||||
export { Movie, MovieT } from './movie';
|
||||
export { Rapunzel, RapunzelT } from './rapunzel';
|
||||
Reference in New Issue
Block a user