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/BUILD b/BUILD
index 62ee0d1..91997b9 100644
--- a/BUILD
+++ b/BUILD
@@ -1,6 +1,9 @@
 load("@bazel_gazelle//:def.bzl", "gazelle")
 
-exports_files(["tsconfig.json"])
+exports_files([
+    "tsconfig.json",
+    "rollup.config.js",
+])
 
 # gazelle:prefix github.com/frc971/971-Robot-Code
 # gazelle:build_file_name BUILD
diff --git a/WORKSPACE b/WORKSPACE
index 2a5927e..1d251eb 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -678,24 +678,17 @@
 )
 
 http_archive(
-    name = "build_bazel_rules_typescript",
-    strip_prefix = "rules_typescript-0.21.0",
-    url = "https://github.com/bazelbuild/rules_typescript/archive/0.21.0.zip",
-)
-
-http_archive(
     name = "build_bazel_rules_nodejs",
-    sha256 = "0d9660cf0894f1fe1e9840818553e0080fbce0851169812d77a70bdb9981c946",
-    urls = ["https://www.frc971.org/Build-Dependencies/rules_nodejs-0.37.0.tar.gz"],
+    sha256 = "cfc289523cf1594598215901154a6c2515e8bf3671fd708264a6f6aefe02bf39",
+    urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/4.4.6/rules_nodejs-4.4.6.tar.gz"],
 )
 
-# Setup the NodeJS toolchain
-load("@build_bazel_rules_nodejs//:defs.bzl", "node_repositories", "yarn_install")
+load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories", "yarn_install")
 
 node_repositories()
 
 # Setup Bazel managed npm dependencies with the `yarn_install` rule.
-#
+
 # To run yarn by hand, use:
 #  bazel run @nodejs_linux_amd64//:bin/yarn -- list
 # I'm sure there is a better path, but that works...
@@ -706,15 +699,6 @@
     yarn_lock = "//:yarn.lock",
 )
 
-# Install all Bazel dependencies needed for npm packages that supply Bazel rules
-load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies")
-
-install_bazel_dependencies()
-
-load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace")
-
-ts_setup_workspace()
-
 # Flatbuffers
 local_repository(
     name = "com_github_google_flatbuffers",
diff --git a/aos/network/www/BUILD b/aos/network/www/BUILD
index 64d7452..f62ed67 100644
--- a/aos/network/www/BUILD
+++ b/aos/network/www/BUILD
@@ -1,5 +1,5 @@
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
-load("@build_bazel_rules_nodejs//:defs.bzl", "rollup_bundle")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
+load("//tools/build_rules:js.bzl", "rollup_bundle")
 load("//aos:config.bzl", "aos_config")
 
 filegroup(
@@ -43,7 +43,6 @@
 
 rollup_bundle(
     name = "main_bundle",
-    enable_code_splitting = False,
     entry_point = "main.ts",
     target_compatible_with = ["@platforms//os:linux"],
     visibility = ["//aos:__subpackages__"],
@@ -165,7 +164,6 @@
 
 rollup_bundle(
     name = "reflection_test_bundle",
-    enable_code_splitting = False,
     entry_point = "reflection_test_main.ts",
     target_compatible_with = ["@platforms//os:linux"],
     deps = [
diff --git a/aos/network/www/proxy.ts b/aos/network/www/proxy.ts
index c52f495..5461899 100644
--- a/aos/network/www/proxy.ts
+++ b/aos/network/www/proxy.ts
@@ -243,7 +243,7 @@
     this.webSocketConnection.send(array.buffer.slice(array.byteOffset));
   }
 
-  onIceCandidateError(e: RTCPeerConnectionIceErrorEvent): void {
+  onIceCandidateError(e: Event): void {
     console.warn(e);
   }
 
diff --git a/aos/network/www/reflection.ts b/aos/network/www/reflection.ts
index 4362806..18d4996 100644
--- a/aos/network/www/reflection.ts
+++ b/aos/network/www/reflection.ts
@@ -236,7 +236,7 @@
   }
 
   // Returns the Object definition associated with the given type index.
-  getType(typeIndex: number): reflection.Object {
+  getType(typeIndex: number): reflection.ObjectGenerated {
     if (typeIndex === -1) {
       return this.schema.rootTable();
     }
@@ -249,7 +249,7 @@
   // Retrieves the Field schema for the given field name within a given
   // type index.
   getField(fieldName: string, typeIndex: number): reflection.Field {
-    const schema: reflection.Object = this.getType(typeIndex);
+    const schema: reflection.ObjectGenerated = this.getType(typeIndex);
     const numFields = schema.fieldsLength();
     for (let ii = 0; ii < numFields; ++ii) {
       const field = schema.fields(ii);
diff --git a/frc971/analysis/BUILD b/frc971/analysis/BUILD
index 0269d65..0c18061 100644
--- a/frc971/analysis/BUILD
+++ b/frc971/analysis/BUILD
@@ -1,5 +1,5 @@
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
-load("@build_bazel_rules_nodejs//:defs.bzl", "rollup_bundle")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
+load("//tools/build_rules:js.bzl", "rollup_bundle")
 load("@com_github_google_flatbuffers//:build_defs.bzl", "flatbuffer_cc_library", "flatbuffer_ts_library")
 load("//aos:config.bzl", "aos_config")
 
@@ -57,7 +57,6 @@
 
 rollup_bundle(
     name = "plot_index_bundle",
-    enable_code_splitting = False,
     entry_point = "plot_index.ts",
     target_compatible_with = ["@platforms//os:linux"],
     deps = [
diff --git a/frc971/control_loops/drivetrain/BUILD b/frc971/control_loops/drivetrain/BUILD
index eaf37db..6d48192 100644
--- a/frc971/control_loops/drivetrain/BUILD
+++ b/frc971/control_loops/drivetrain/BUILD
@@ -2,7 +2,7 @@
 load("//aos:config.bzl", "aos_config")
 load("//tools/build_rules:select.bzl", "cpu_select")
 load("//aos:flatbuffers.bzl", "cc_static_flatbuffer")
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
 
 package(default_visibility = ["//visibility:public"])
 
diff --git a/frc971/wpilib/BUILD b/frc971/wpilib/BUILD
index 2c8ed29..b6e30d8 100644
--- a/frc971/wpilib/BUILD
+++ b/frc971/wpilib/BUILD
@@ -1,4 +1,4 @@
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
 load("@com_github_google_flatbuffers//:build_defs.bzl", "flatbuffer_cc_library", "flatbuffer_ts_library")
 load("//aos:config.bzl", "aos_config")
 
diff --git a/package.json b/package.json
index 2478e0a..96033c5 100644
--- a/package.json
+++ b/package.json
@@ -2,10 +2,13 @@
   "name": "971-Robot-Code",
   "license": "MIT",
   "devDependencies": {
-    "@bazel/bazel": "^0.29.0",
     "@types/flatbuffers": "latest",
-    "@bazel/ibazel": "^0.10.3",
-    "@bazel/typescript": "^0.37.0",
-    "typescript": "^3.1.6"
+    "@bazel/typescript": "latest",
+    "@bazel/rollup": "latest",
+    "@bazel/terser": "latest",
+    "@rollup/plugin-node-resolve": "latest",
+    "typescript": "latest",
+    "rollup": "latest",
+    "terser": "latest"
   }
 }
diff --git a/rollup.config.js b/rollup.config.js
new file mode 100644
index 0000000..6bcc548
--- /dev/null
+++ b/rollup.config.js
@@ -0,0 +1,6 @@
+import { nodeResolve } from '@rollup/plugin-node-resolve';
+
+export default {
+  context: "window",
+  plugins: [nodeResolve()]
+};
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",
diff --git a/tools/build_rules/js.bzl b/tools/build_rules/js.bzl
new file mode 100644
index 0000000..a014d13
--- /dev/null
+++ b/tools/build_rules/js.bzl
@@ -0,0 +1,61 @@
+load("@build_bazel_rules_nodejs//:providers.bzl", "JSModuleInfo")
+load("@npm//@bazel/rollup:index.bzl", upstream_rollup_bundle = "rollup_bundle")
+load("@npm//@bazel/terser:index.bzl", "terser_minified")
+
+def rollup_bundle(name, deps, visibility = None, **kwargs):
+    """Calls the upstream rollup_bundle() and exposes a .min.js file.
+
+    Legacy version of rollup_bundle() used to provide the .min.js file. This
+    wrapper provides the same interface by explicitly exposing a .min.js file.
+    """
+    upstream_rollup_bundle(
+        name = name,
+        visibility = visibility,
+        deps = deps + [
+            "@npm//@rollup/plugin-node-resolve",
+        ],
+        config_file = "//:rollup.config.js",
+        link_workspace_root = True,
+        **kwargs
+    )
+
+    terser_minified(
+        name = name + "__min",
+        src = name + ".js",
+    )
+
+    # Copy the __min.js file (a declared output inside the rule) so that it's a
+    # pre-declared output and publicly visible. I.e. via attr.output() below.
+    _expose_minified_js(
+        name = name + "__min_exposed",
+        src = ":%s__min" % name,
+        out = name + ".min.js",
+        visibility = visibility,
+    )
+
+def _expose_minified_js_impl(ctx):
+    """Copies the .min.js file in order to make it publicly accessible."""
+    sources = ctx.attr.src[JSModuleInfo].sources.to_list()
+    min_js = None
+    for src in sources:
+        if src.basename.endswith("__min.js"):
+            min_js = src
+            break
+
+    if min_js == None:
+        fail("Couldn't find .min.js in " + str(ctx.attr.src))
+
+    ctx.actions.run(
+        inputs = [min_js],
+        outputs = [ctx.outputs.out],
+        executable = "cp",
+        arguments = [min_js.path, ctx.outputs.out.path],
+    )
+
+_expose_minified_js = rule(
+    implementation = _expose_minified_js_impl,
+    attrs = {
+        "src": attr.label(providers = [JSModuleInfo]),
+        "out": attr.output(mandatory = True),
+    },
+)
diff --git a/tsconfig.json b/tsconfig.json
index ed8f3dc..aed3439 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -4,7 +4,8 @@
     "strict": false,
     "noImplicitAny": false,
     "target": "es6",
-    "lib": ["es6", "dom", "dom.iterable"]
+    "lib": ["es6", "dom", "dom.iterable"],
+    "moduleResolution": "node"
   },
   "bazelOptions": {
     "workspaceName": "971-Robot-Code"
diff --git a/y2019/vision/server/BUILD b/y2019/vision/server/BUILD
index 3952676..93172b4 100644
--- a/y2019/vision/server/BUILD
+++ b/y2019/vision/server/BUILD
@@ -1,7 +1,7 @@
 load("//aos/seasocks:gen_embedded.bzl", "gen_embedded")
 load("@com_google_protobuf//:protobuf.bzl", "cc_proto_library")
 load("//frc971/downloader:downloader.bzl", "aos_downloader_dir")
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
 
 ts_library(
     name = "demo",
diff --git a/y2019/vision/server/www/BUILD b/y2019/vision/server/www/BUILD
index 62c1f13..7c40eaa 100644
--- a/y2019/vision/server/www/BUILD
+++ b/y2019/vision/server/www/BUILD
@@ -1,5 +1,5 @@
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
-load("@build_bazel_rules_nodejs//:defs.bzl", "rollup_bundle")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
+load("//tools/build_rules:js.bzl", "rollup_bundle")
 
 package(default_visibility = ["//visibility:public"])
 
@@ -35,7 +35,6 @@
 
 rollup_bundle(
     name = "visualizer_bundle",
-    enable_code_splitting = False,
     entry_point = "main.ts",
     target_compatible_with = ["@platforms//os:linux"],
     deps = [
diff --git a/y2019/vision/server/www/main.ts b/y2019/vision/server/www/main.ts
index 9e90563..0b2937c 100644
--- a/y2019/vision/server/www/main.ts
+++ b/y2019/vision/server/www/main.ts
@@ -51,7 +51,8 @@
     const socket = new WebSocket(`ws://${server}/ws`);
 
     socket.addEventListener('message', (event) => {
-      const j = JSON.parse(event.data);
+      // data is a proto which we don't currently have TS support for.
+      const j = JSON.parse(event.data) as any;
       this.x = j.robotPose.x;
       this.y = j.robotPose.y;
       this.theta = j.robotPose.theta;
diff --git a/y2020/control_loops/drivetrain/BUILD b/y2020/control_loops/drivetrain/BUILD
index 570f0c1..56ac3a9 100644
--- a/y2020/control_loops/drivetrain/BUILD
+++ b/y2020/control_loops/drivetrain/BUILD
@@ -1,6 +1,6 @@
 load("@com_github_google_flatbuffers//:build_defs.bzl", "flatbuffer_cc_library", "flatbuffer_ts_library")
 load("//aos:config.bzl", "aos_config")
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
 
 genrule(
     name = "genrule_drivetrain",
diff --git a/y2020/control_loops/superstructure/BUILD b/y2020/control_loops/superstructure/BUILD
index 74ccece..abf24fc 100644
--- a/y2020/control_loops/superstructure/BUILD
+++ b/y2020/control_loops/superstructure/BUILD
@@ -1,5 +1,5 @@
 load("@com_github_google_flatbuffers//:build_defs.bzl", "flatbuffer_cc_library", "flatbuffer_ts_library")
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
 
 package(default_visibility = ["//visibility:public"])
 
diff --git a/y2020/www/BUILD b/y2020/www/BUILD
index cdfd9d7..27c0392 100644
--- a/y2020/www/BUILD
+++ b/y2020/www/BUILD
@@ -1,5 +1,5 @@
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
-load("@build_bazel_rules_nodejs//:defs.bzl", "rollup_bundle")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
+load("//tools/build_rules:js.bzl", "rollup_bundle")
 load("//frc971/downloader:downloader.bzl", "aos_downloader_dir")
 
 ts_library(
@@ -44,7 +44,6 @@
 
 rollup_bundle(
     name = "camera_main_bundle",
-    enable_code_splitting = False,
     entry_point = "camera_main.ts",
     target_compatible_with = ["@platforms//os:linux"],
     visibility = ["//y2020:__subpackages__"],
@@ -55,7 +54,6 @@
 
 rollup_bundle(
     name = "field_main_bundle",
-    enable_code_splitting = False,
     entry_point = "field_main.ts",
     target_compatible_with = ["@platforms//os:linux"],
     visibility = ["//y2020:__subpackages__"],
diff --git a/y2021_bot3/control_loops/superstructure/BUILD b/y2021_bot3/control_loops/superstructure/BUILD
index c6b36a1..8266edc 100644
--- a/y2021_bot3/control_loops/superstructure/BUILD
+++ b/y2021_bot3/control_loops/superstructure/BUILD
@@ -1,5 +1,5 @@
 load("@com_github_google_flatbuffers//:build_defs.bzl", "flatbuffer_cc_library")
-load("@npm_bazel_typescript//:defs.bzl", "ts_library")
+load("@npm//@bazel/typescript:index.bzl", "ts_library")
 
 package(default_visibility = ["//visibility:public"])
 
diff --git a/yarn.lock b/yarn.lock
index 821a804..dc90302 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,51 +2,35 @@
 # yarn lockfile v1
 
 
-"@bazel/bazel-darwin_x64@0.29.0":
-  version "0.29.0"
-  resolved "https://registry.yarnpkg.com/@bazel/bazel-darwin_x64/-/bazel-darwin_x64-0.29.0.tgz#d2ebcb95bc66031b0545dd8b0e597b3aa5b9024b"
-  integrity sha512-q6snNakVA3wzv3VIuFlsw3/xcB/ygsAMhkigsuZXv1yHmwnuBOI4UJ2r2+Ttc4HPHflS0aWuI/raHDq81vBYKw==
-
-"@bazel/bazel-linux_x64@0.29.0":
-  version "0.29.0"
-  resolved "https://registry.yarnpkg.com/@bazel/bazel-linux_x64/-/bazel-linux_x64-0.29.0.tgz#95250ad8463425bec81a95736056f432c186cb9d"
-  integrity sha512-QxWdtlsFKMi3SJ++osjA8QQbWOlGZXU0/TtUTiswsRwWdOEwZhOa2c1ljIQY5QBgzc3CCh2clRnkjWQj0/V/Dw==
-
-"@bazel/bazel-win32_x64@0.29.0":
-  version "0.29.0"
-  resolved "https://registry.yarnpkg.com/@bazel/bazel-win32_x64/-/bazel-win32_x64-0.29.0.tgz#62af30d4ccf0a31e656a6ac9337e928d29a4598d"
-  integrity sha512-r0DhNarJrzzcXrvRbey43hGVO4J2QBAS43VrgjrxVw+1kyjKkIOQIh3wKr/OKx2jKOX0y3hCrLpL/aivHqub4g==
-
-"@bazel/bazel@^0.29.0":
-  version "0.29.0"
-  resolved "https://registry.yarnpkg.com/@bazel/bazel/-/bazel-0.29.0.tgz#bf4ecf47d6e67e8df8d342d24c146bd732d78640"
-  integrity sha512-OBxPv+V73PtADVG4qsGJ7Zj0wJrJorRbHgYE8qsRBNKls6e6rf0jkjSIQvAvP1Dyt7x4MGyhIzzK/5IsPeQZIA==
+"@bazel/rollup@latest":
+  version "4.4.6"
+  resolved "https://registry.yarnpkg.com/@bazel/rollup/-/rollup-4.4.6.tgz#936d34c9c8159d42f84f1ac3c9ebb1bed27f691a"
+  integrity sha512-VujfM6QGuNpQZVzOf2nfAi3Xoi4EdA9nXXy6Gq4WiSaDPbgZrlXl/4Db+Hb6Nej5uvWqqppgvigCPHcWX9yM/w==
   dependencies:
-    "@bazel/hide-bazel-files" latest
-  optionalDependencies:
-    "@bazel/bazel-darwin_x64" "0.29.0"
-    "@bazel/bazel-linux_x64" "0.29.0"
-    "@bazel/bazel-win32_x64" "0.29.0"
+    "@bazel/worker" "4.4.6"
 
-"@bazel/hide-bazel-files@latest":
-  version "0.37.0"
-  resolved "https://registry.yarnpkg.com/@bazel/hide-bazel-files/-/hide-bazel-files-0.37.0.tgz#3c30a3f64f0b976c8c0e8dd236b0f26db0f6f860"
-  integrity sha512-aVReQa7UxWjBNTsZTAmFKHujTaDxlMUEq2BgvP7mYp1nnZjsCI30SjzPkTn77Ghw4/lK8lhht7AdfWPQp271pQ==
+"@bazel/terser@latest":
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/@bazel/terser/-/terser-4.5.0.tgz#f5fe56b5e398d2a7f5ae8db0463b5f00cdc4e6dc"
+  integrity sha512-CEjCwZCag8HpDi8d56rVSS0DRn/AzhDZqzM8G5+j2V+cyhn8Iv+yHLqMb4oOZ3Z4XMZQzw+MnHGv2MGvtOyvvw==
 
-"@bazel/ibazel@^0.10.3":
-  version "0.10.3"
-  resolved "https://registry.yarnpkg.com/@bazel/ibazel/-/ibazel-0.10.3.tgz#2e2b8a1d3e885946eac41db2b1aa6801fb319887"
-  integrity sha512-v1nXbMTHVlMM4z4uWp6XiRoHAyUlYggF1SOboLLWRp0+D22kWixqArWqnozLw2mOtnxr97BdLjluWiho6A8Hjg==
-
-"@bazel/typescript@^0.37.0":
-  version "0.37.0"
-  resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.37.0.tgz#9213d963cf132db614a9780b87815cda256a3e14"
-  integrity sha512-4Pz5x87ihPjKQxo/XMfFXJeGHiNEOdaIqLOqzuIXbwczJvMxPKMwnXzikr9XkjHrHs26zZo4iMtXALqW2j7C5w==
+"@bazel/typescript@latest":
+  version "4.4.6"
+  resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-4.4.6.tgz#fbaac22460b3aa4a0961c6c657d239af8f895778"
+  integrity sha512-J205En8MjmnWSPnz4CqJm1x4mzcdWM+HvAsOzzVb0DHx86O+mjPFwqleeAtPGLTE9aWskel81XICJfEuTlNtiw==
   dependencies:
+    "@bazel/worker" "4.4.6"
     protobufjs "6.8.8"
     semver "5.6.0"
     source-map-support "0.5.9"
-    tsutils "2.27.2"
+    tsutils "3.21.0"
+
+"@bazel/worker@4.4.6":
+  version "4.4.6"
+  resolved "https://registry.yarnpkg.com/@bazel/worker/-/worker-4.4.6.tgz#c9122c8ec765f62dc723203270a3c913caf8826a"
+  integrity sha512-1Sk0FGIc1m9rFwXhCnm46XDRng88vAnY1FBb7OQPonha/kuxjZTpPDP7q2ndSkqDNyCFKp94cPUFUT58Fgqvfw==
+  dependencies:
+    google-protobuf "^3.6.1"
 
 "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
   version "1.1.2"
@@ -101,6 +85,32 @@
   resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
   integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
 
+"@rollup/plugin-node-resolve@latest":
+  version "13.1.3"
+  resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz#2ed277fb3ad98745424c1d2ba152484508a92d79"
+  integrity sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==
+  dependencies:
+    "@rollup/pluginutils" "^3.1.0"
+    "@types/resolve" "1.17.1"
+    builtin-modules "^3.1.0"
+    deepmerge "^4.2.2"
+    is-module "^1.0.0"
+    resolve "^1.19.0"
+
+"@rollup/pluginutils@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b"
+  integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==
+  dependencies:
+    "@types/estree" "0.0.39"
+    estree-walker "^1.0.1"
+    picomatch "^2.2.2"
+
+"@types/estree@0.0.39":
+  version "0.0.39"
+  resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+  integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
+
 "@types/flatbuffers@latest":
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/@types/flatbuffers/-/flatbuffers-1.10.0.tgz#aa74e30ffdc86445f2f060e1808fc9d56b5603ba"
@@ -111,20 +121,96 @@
   resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef"
   integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==
 
+"@types/node@*":
+  version "17.0.8"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b"
+  integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==
+
 "@types/node@^10.1.0":
   version "10.14.18"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.18.tgz#b7d45fc950e6ffd7edc685e890d13aa7b8535dce"
   integrity sha512-ryO3Q3++yZC/+b8j8BdKd/dn9JlzlHBPdm80656xwYUdmPkpTGTjkAdt6BByiNupGPE8w0FhBgvYy/fX9hRNGQ==
 
+"@types/resolve@1.17.1":
+  version "1.17.1"
+  resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
+  integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==
+  dependencies:
+    "@types/node" "*"
+
 buffer-from@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
 
+builtin-modules@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887"
+  integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==
+
+commander@^2.20.0:
+  version "2.20.3"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+deepmerge@^4.2.2:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
+  integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
+
+estree-walker@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700"
+  integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
+
+fsevents@~2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+  integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+google-protobuf@^3.6.1:
+  version "3.19.1"
+  resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.19.1.tgz#5af5390e8206c446d8f49febaffd4b7f4ac28f41"
+  integrity sha512-Isv1RlNC+IzZzilcxnlVSf+JvuhxmY7DaxYCBy+zPS9XVuJRtlTTIXR9hnZ1YL1MMusJn/7eSy2swCzZIomQSg==
+
+has@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+  integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+  dependencies:
+    function-bind "^1.1.1"
+
+is-core-module@^2.8.0:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
+  integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
+  dependencies:
+    has "^1.0.3"
+
+is-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
+  integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
+
 long@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
   integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
 
+path-parse@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+  integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+picomatch@^2.2.2:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+  integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
 protobufjs@6.8.8:
   version "6.8.8"
   resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c"
@@ -144,6 +230,22 @@
     "@types/node" "^10.1.0"
     long "^4.0.0"
 
+resolve@^1.19.0:
+  version "1.21.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f"
+  integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==
+  dependencies:
+    is-core-module "^2.8.0"
+    path-parse "^1.0.7"
+    supports-preserve-symlinks-flag "^1.0.0"
+
+rollup@latest:
+  version "2.60.2"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.60.2.tgz#3f45ace36a9b10b4297181831ea0719922513463"
+  integrity sha512-1Bgjpq61sPjgoZzuiDSGvbI1tD91giZABgjCQBKM5aYLnzjq52GoDuWVwT/cm/MCxCMPU8gqQvkj8doQ5C8Oqw==
+  optionalDependencies:
+    fsevents "~2.3.2"
+
 semver@5.6.0:
   version "5.6.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
@@ -156,20 +258,49 @@
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
+source-map-support@~0.5.20:
+  version "0.5.21"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+  integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
 source-map@^0.6.0:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
 
+source-map@~0.7.2:
+  version "0.7.3"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+  integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
+supports-preserve-symlinks-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+  integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+terser@latest:
+  version "5.10.0"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc"
+  integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==
+  dependencies:
+    commander "^2.20.0"
+    source-map "~0.7.2"
+    source-map-support "~0.5.20"
+
 tslib@^1.8.1:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
 
-tsutils@2.27.2:
-  version "2.27.2"
-  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.2.tgz#60ba88a23d6f785ec4b89c6e8179cac9b431f1c7"
+tsutils@3.21.0:
+  version "3.21.0"
+  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+  integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
   dependencies:
     tslib "^1.8.1"
 
-typescript@^3.1.6:
-  version "3.1.6"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68"
+typescript@latest:
+  version "4.5.2"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998"
+  integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==