Upgrade npm bazel rules to latest

Later than v2, rollup_bundle needs additional configuration to find
workspace files. It also no longer minifies, so needed to add an
additional post-bundle step to maintain api.

We had to rename the `Object` class to `ObjectGenerated` in the
flatbuffers TypeScript generator. This lets us avoid name clashes with
the builtin `Object` class.
Upstream issue: https://github.com/google/flatbuffers/issues/6994

Change-Id: I45ab717bfc9ff8ef24aa05644fb845879cc09d98
Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
diff --git a/third_party/flatbuffers/build_defs.bzl b/third_party/flatbuffers/build_defs.bzl
index 5994848..5add25f 100644
--- a/third_party/flatbuffers/build_defs.bzl
+++ b/third_party/flatbuffers/build_defs.bzl
@@ -5,7 +5,7 @@
 Rules for building C++ flatbuffers with Bazel.
 """
 
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
 
 flatc_path = "@com_github_google_flatbuffers//:flatc"
 
diff --git a/third_party/flatbuffers/include/flatbuffers/code_generators.h b/third_party/flatbuffers/include/flatbuffers/code_generators.h
index d64ab03..270c061 100644
--- a/third_party/flatbuffers/include/flatbuffers/code_generators.h
+++ b/third_party/flatbuffers/include/flatbuffers/code_generators.h
@@ -133,10 +133,13 @@
   // Ensure that a type is prefixed with its namespace even within
   // its own namespace to avoid conflict between generated method
   // names and similarly named classes or structs
+  // frc971 modifications: Add the `js_ts` flag to tweak the behaviour for
+  // TypeScript. We can't have a class called `Object`. We modify it to be
+  // `ObjectGenerated`.
   std::string WrapInNameSpace(const Namespace *ns,
-                              const std::string &name) const;
+                              const std::string &name, bool js_ts = false) const;
 
-  std::string WrapInNameSpace(const Definition &def) const;
+  std::string WrapInNameSpace(const Definition &def, bool js_ts = false) const;
 
   std::string GetNameSpace(const Definition &def) const;
 
diff --git a/third_party/flatbuffers/src/code_generators.cpp b/third_party/flatbuffers/src/code_generators.cpp
index 46d65f7..30f8cb3 100644
--- a/third_party/flatbuffers/src/code_generators.cpp
+++ b/third_party/flatbuffers/src/code_generators.cpp
@@ -120,15 +120,21 @@
 
 // Ensure that a type is prefixed with its namespace.
 std::string BaseGenerator::WrapInNameSpace(const Namespace *ns,
-                                           const std::string &name) const {
+                                           const std::string &name,
+                                           bool js_ts) const {
   std::string qualified_name = qualifying_start_;
   for (auto it = ns->components.begin(); it != ns->components.end(); ++it)
     qualified_name += *it + qualifying_separator_;
-  return qualified_name + name;
+  std::string result = qualified_name + name;
+  if (js_ts && name == "Object") {
+    result += "Generated";
+  }
+  return result;
 }
 
-std::string BaseGenerator::WrapInNameSpace(const Definition &def) const {
-  return WrapInNameSpace(def.defined_namespace, def.name);
+std::string BaseGenerator::WrapInNameSpace(const Definition &def,
+                                           bool js_ts) const {
+  return WrapInNameSpace(def.defined_namespace, def.name, js_ts);
 }
 
 std::string BaseGenerator::GetNameSpace(const Definition &def) const {
diff --git a/third_party/flatbuffers/src/idl_gen_js_ts.cpp b/third_party/flatbuffers/src/idl_gen_js_ts.cpp
index 0240f51..42aea8e 100644
--- a/third_party/flatbuffers/src/idl_gen_js_ts.cpp
+++ b/third_party/flatbuffers/src/idl_gen_js_ts.cpp
@@ -40,6 +40,11 @@
 
 enum AnnotationType { kParam = 0, kType = 1, kReturns = 2 };
 
+// frc971 modification: We need to rename the `Object` class to `ObjectGenerated`
+// to avoid compilation errors with reserved keywords.
+#define WRAP_IN_NAMESPACE(...) \
+    WrapInNameSpace(__VA_ARGS__, true)
+
 const JsTsLanguageParameters &GetJsLangParams(IDLOptions::Language lang) {
   static JsTsLanguageParameters js_language_parameters[] = {
     {
@@ -353,7 +358,7 @@
           exports += "this." + enum_def_name + " = " + enum_def_name + ";\n";
         }
       }
-      code += WrapInNameSpace(enum_def) + (reverse ? "Name" : "") + " = {\n";
+      code += WRAP_IN_NAMESPACE(enum_def) + (reverse ? "Name" : "") + " = {\n";
     }
     for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
       auto &ev = **it;
@@ -433,7 +438,7 @@
         if (type.base_type == BASE_TYPE_BOOL) { getter = "!!" + getter; }
         if (type.enum_def) {
           getter = "/** " +
-                   GenTypeAnnotation(kType, WrapInNameSpace(*type.enum_def), "",
+                   GenTypeAnnotation(kType, WRAP_IN_NAMESPACE(*type.enum_def), "",
                                      false) +
                    " */ (" + getter + ")";
         }
@@ -456,15 +461,15 @@
         value.type.base_type != BASE_TYPE_VECTOR) {
       if (auto val = value.type.enum_def->FindByValue(value.constant)) {
         if (lang_.language == IDLOptions::kTs) {
-          return GenPrefixedTypeName(WrapInNameSpace(*value.type.enum_def),
+          return GenPrefixedTypeName(WRAP_IN_NAMESPACE(*value.type.enum_def),
                                      value.type.enum_def->file) +
                  "." + val->name;
         } else {
-          return WrapInNameSpace(*value.type.enum_def) + "." + val->name;
+          return WRAP_IN_NAMESPACE(*value.type.enum_def) + "." + val->name;
         }
       } else {
         return "/** " +
-               GenTypeAnnotation(kType, WrapInNameSpace(*value.type.enum_def),
+               GenTypeAnnotation(kType, WRAP_IN_NAMESPACE(*value.type.enum_def),
                                  "", false) +
                "} */ (" + value.constant + ")";
       }
@@ -501,7 +506,7 @@
         if (IsString(type)) {
           name = "string|Uint8Array";
         } else {
-          name = WrapInNameSpace(*type.struct_def);
+          name = WRAP_IN_NAMESPACE(*type.struct_def);
         }
         return (allowNull) ? (name + "|null") : (name);
       }
@@ -514,7 +519,7 @@
       default:
         if (IsScalar(type.base_type)) {
           if (type.enum_def) {
-            const auto enum_name = WrapInNameSpace(*type.enum_def);
+            const auto enum_name = WRAP_IN_NAMESPACE(*type.enum_def);
             return (allowNull) ? (enum_name + "|null") : (enum_name);
           }
           
@@ -744,7 +749,7 @@
           imported_files.insert(ev.union_type.struct_def->file);
         }
 
-        type = GenPrefixedTypeName(WrapInNameSpace(*(ev.union_type.struct_def)),
+        type = GenPrefixedTypeName(WRAP_IN_NAMESPACE(*(ev.union_type.struct_def)),
                                    ev.union_type.struct_def->file);
       } else {
         FLATBUFFERS_ASSERT(false);
@@ -775,7 +780,7 @@
         type = "string";  // no need to wrap string type in namespace
       } else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {
         type = GenPrefixedTypeName(
-            GetObjApiClassName(WrapInNameSpace(*(ev.union_type.struct_def)),
+            GetObjApiClassName(WRAP_IN_NAMESPACE(*(ev.union_type.struct_def)),
                                opts),
             union_enum.file);
       } else {
@@ -820,7 +825,7 @@
       }
 
       const auto enum_type = GenPrefixedTypeName(
-          WrapInNameSpace(*(union_type.enum_def)), union_type.enum_def->file);
+          WRAP_IN_NAMESPACE(*(union_type.enum_def)), union_type.enum_def->file);
       const auto &union_enum = *(union_type.enum_def);
 
       const auto union_enum_loop = [&](const std::string &accessor_str) {
@@ -838,7 +843,7 @@
             ret += "return " + accessor_str + "'') as string;";
           } else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {
             const auto type = GenPrefixedTypeName(
-                WrapInNameSpace(*(ev.union_type.struct_def)),
+                WRAP_IN_NAMESPACE(*(ev.union_type.struct_def)),
                 ev.union_type.struct_def->file);
             ret += "return " + accessor_str + "new " + type + "())! as " +
                    type + ";";
@@ -878,7 +883,7 @@
     if (union_type.enum_def) {
       const auto &enum_def = *union_type.enum_def;
       const auto enum_type =
-          GenPrefixedTypeName(WrapInNameSpace(enum_def), enum_def.file);
+          GenPrefixedTypeName(WRAP_IN_NAMESPACE(enum_def), enum_def.file);
       const std::string union_accessor = "this." + field_name;
 
       const auto union_has_string = UnionHasStringType(enum_def);
@@ -888,7 +893,7 @@
 
       if (!is_array) {
         const auto conversion_function =
-            GenPrefixedTypeName(WrapInNameSpace(enum_def.defined_namespace,
+            GenPrefixedTypeName(WRAP_IN_NAMESPACE(enum_def.defined_namespace,
                                                 GenUnionConvFuncName(enum_def)),
                                 enum_def.file);
         const auto target_enum = "this." + field_name + "Type()";
@@ -904,7 +909,7 @@
         ret += "  })()";
       } else {
         const auto conversion_function = GenPrefixedTypeName(
-            WrapInNameSpace(enum_def.defined_namespace,
+            WRAP_IN_NAMESPACE(enum_def.defined_namespace,
                             GenUnionListConvFuncName(enum_def)),
             enum_def.file);
         const auto target_enum_accesor = "this." + field_name + "Type";
@@ -1008,7 +1013,7 @@
     std::string pack_func_create_call;
 
     const auto struct_name =
-        GenPrefixedTypeName(WrapInNameSpace(struct_def), struct_def.file);
+        GenPrefixedTypeName(WRAP_IN_NAMESPACE(struct_def), struct_def.file);
 
     if (has_create) {
       pack_func_create_call = "  return " + struct_name + ".create" +
@@ -1080,7 +1085,7 @@
           case BASE_TYPE_STRUCT: {
             const auto &sd = *field.value.type.struct_def;
             field_type += GenPrefixedTypeName(
-                WrapInNameSpace(sd.defined_namespace,
+                WRAP_IN_NAMESPACE(sd.defined_namespace,
                                 GetObjApiClassName(sd, parser.opts)),
                 field.value.type.struct_def->file);
 
@@ -1105,7 +1110,7 @@
               case BASE_TYPE_STRUCT: {
                 const auto &sd = *field.value.type.struct_def;
                 field_type += GenPrefixedTypeName(
-                    WrapInNameSpace(sd.defined_namespace,
+                    WRAP_IN_NAMESPACE(sd.defined_namespace,
                                     GetObjApiClassName(sd, parser.opts)),
                     field.value.type.struct_def->file);
                 field_type += ")[]";
@@ -1118,12 +1123,12 @@
                   field_offset_decl =
                       "builder.createStructOffsetList(this." + field_name +
                       ", " +
-                      GenPrefixedTypeName(WrapInNameSpace(struct_def),
+                      GenPrefixedTypeName(WRAP_IN_NAMESPACE(struct_def),
                                           struct_def.file) +
                       ".start" + MakeCamel(field_name) + "Vector)";
                 } else {
                   field_offset_decl =
-                      GenPrefixedTypeName(WrapInNameSpace(struct_def),
+                      GenPrefixedTypeName(WRAP_IN_NAMESPACE(struct_def),
                                           struct_def.file) +
                       ".create" + MakeCamel(field_name) +
                       "Vector(builder, builder.createObjectOffsetList(" +
@@ -1139,7 +1144,7 @@
                             field_binded_method + ", this." + field_name +
                             "Length())";
                 field_offset_decl =
-                    GenPrefixedTypeName(WrapInNameSpace(struct_def),
+                    GenPrefixedTypeName(WRAP_IN_NAMESPACE(struct_def),
                                         struct_def.file) +
                     ".create" + MakeCamel(field_name) +
                     "Vector(builder, builder.createObjectOffsetList(" +
@@ -1154,7 +1159,7 @@
                 field_val = GenUnionValTS(field_name, vectortype, true);
 
                 field_offset_decl =
-                    GenPrefixedTypeName(WrapInNameSpace(struct_def),
+                    GenPrefixedTypeName(WRAP_IN_NAMESPACE(struct_def),
                                         struct_def.file) +
                     ".create" + MakeCamel(field_name) +
                     "Vector(builder, builder.createObjectOffsetList(" +
@@ -1180,7 +1185,7 @@
                             "Length())";
 
                 field_offset_decl =
-                    GenPrefixedTypeName(WrapInNameSpace(struct_def),
+                    GenPrefixedTypeName(WRAP_IN_NAMESPACE(struct_def),
                                         struct_def.file) +
                     ".create" + MakeCamel(field_name) +
                     "Vector(builder, this." + field_name + ")";
@@ -1314,11 +1319,17 @@
     // Emit constructor
     if (lang_.language == IDLOptions::kTs) {
       object_name = struct_def.name;
+      if (object_name == "Object") {
+        object_name += "Generated";
+      }
       GenDocComment(struct_def.doc_comment, code_ptr, "@constructor");
       if (!object_namespace.empty()) {
         code += "export namespace " + object_namespace + "{\n";
       }
       code += "export class " + struct_def.name;
+      if (struct_def.name.compare("Object") == 0) {
+        code += "Generated";
+      }
       code += " {\n";
       if (lang_.language != IDLOptions::kTs) {
         code += "  /**\n";
@@ -1336,7 +1347,7 @@
       code += "  bb_pos:number = 0;\n";
     } else {
       bool isStatement = struct_def.defined_namespace->components.empty();
-      object_name = WrapInNameSpace(struct_def);
+      object_name = WRAP_IN_NAMESPACE(struct_def);
       GenDocComment(struct_def.doc_comment, code_ptr, "@constructor");
       if (isStatement) {
         if (parser_.opts.use_goog_js_export_format) {
@@ -1485,7 +1496,7 @@
       else {
         switch (field.value.type.base_type) {
           case BASE_TYPE_STRUCT: {
-            auto type = WrapInNameSpace(*field.value.type.struct_def);
+            auto type = WRAP_IN_NAMESPACE(*field.value.type.struct_def);
             GenDocComment(
                 field.doc_comment, code_ptr,
                 GenTypeAnnotation(kParam, type + "=", "obj") +
@@ -1628,7 +1639,7 @@
               if (field.value.type.enum_def) {
                 code += "/** " +
                         GenTypeAnnotation(
-                            kType, WrapInNameSpace(*field.value.type.enum_def),
+                            kType, WRAP_IN_NAMESPACE(*field.value.type.enum_def),
                             "", false) +
                         " */ (" + field.value.constant + ")";
               } else {
@@ -1802,7 +1813,7 @@
       } else {
         code += object_name + ".getFullyQualifiedName = function() {\n";
       }
-      code += "  return '" + WrapInNameSpace(struct_def) + "';\n";
+      code += "  return '" + WRAP_IN_NAMESPACE(struct_def) + "';\n";
       code += "}\n\n";
     }
 
@@ -2053,8 +2064,12 @@
         }
 
         if (lang_.language == IDLOptions::kTs) {
+          std::string methodPrefix = struct_def.name;
+          if (methodPrefix == "Object") {
+            methodPrefix += "Generated";
+          }
           code += "):flatbuffers.Offset {\n";
-          code += "  " + struct_def.name + ".start" + Verbose(struct_def) +
+          code += "  " + methodPrefix + ".start" + Verbose(struct_def) +
                   "(builder);\n";
         } else {
           code += ") {\n";
@@ -2064,6 +2079,9 @@
 
         std::string methodPrefix =
             lang_.language == IDLOptions::kTs ? struct_def.name : object_name;
+        if (methodPrefix == "Object") {
+          methodPrefix += "Generated";
+        }
         for (auto it = struct_def.fields.vec.begin();
              it != struct_def.fields.vec.end(); ++it) {
           const auto &field = **it;
diff --git a/third_party/flatbuffers/ts/BUILD b/third_party/flatbuffers/ts/BUILD
index 2787fbc..05d20bf 100644
--- a/third_party/flatbuffers/ts/BUILD
+++ b/third_party/flatbuffers/ts/BUILD
@@ -1,4 +1,4 @@
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
 
 ts_library(
     name = "flatbuffers_ts",