""" Rules for building typescript flatbuffers with Bazel. """ load("@aspect_rules_js//js:defs.bzl", "js_library") load(":build_defs.bzl", "flatbuffer_library_public") DEFAULT_FLATC_TS_ARGS = [ "--gen-object-api", "--gen-mutable", "--reflect-names", "--gen-name-strings", "--ts-flat-files", "--keep-prefix", ] def flatbuffer_ts_library( name, srcs, compatible_with = None, target_compatible_with = None, deps = [], include_paths = None, flatc_args = DEFAULT_FLATC_TS_ARGS, visibility = None, restricted_to = None, gen_reflections = False): """Generates a ts_library rule for a given flatbuffer definition. Args: name: Name of the generated ts_library rule. srcs: Source .fbs file(s). deps: Other flatbuffer_ts_library's to depend on. Note that currently you must specify all your transitive dependencies manually. include_paths: Optional, list of paths the includes files can be found in. flatc_args: Optional list of additional arguments to pass to flatc (e.g. --gen-mutable). visibility: The visibility of the generated cc_library. By default, use the default visibility of the project. compatible_with: Optional, The list of environments this rule can be built for, in addition to default-supported environments. restricted_to: Optional, The list of environments this rule can be built for, instead of default-supported environments. target_compatible_with: Optional, The list of target platform constraints to use. gen_reflections: Optional, if true this will generate the flatbuffer reflection binaries for the schemas. """ srcs_lib = "%s_srcs" % (name) out_base = [s.replace(".fbs", "").split("/")[-1].split(":")[-1] for s in srcs] if len(srcs) != 1: fail("flatbuffer_ts_library only supports one .fbs file per target currently.") outs = ["%s_generated.cjs" % s for s in out_base] includes = [d + "_includes" for d in deps] reflection_name = "%s_reflection" % name if gen_reflections else "" flatbuffer_library_public( name = srcs_lib, srcs = srcs, outs = outs, language_flag = "--ts", includes = includes, include_paths = include_paths, extra_env = "ESBUILD_BIN=$(ESBUILD_BIN)", flatc_args = flatc_args + ["--filename-suffix _generated"], compatible_with = compatible_with, restricted_to = restricted_to, reflection_name = reflection_name, reflection_visibility = visibility, target_compatible_with = target_compatible_with, flatc_path = "@com_github_google_flatbuffers//ts:compile_flat_file", toolchains = ["@aspect_rules_esbuild//esbuild:resolved_toolchain"], tools = ["@aspect_rules_esbuild//esbuild:resolved_toolchain"], ) js_library( name = name, visibility = visibility, compatible_with = compatible_with, restricted_to = restricted_to, target_compatible_with = target_compatible_with, srcs = outs, ) native.filegroup( name = "%s_includes" % (name), srcs = srcs + includes, compatible_with = compatible_with, restricted_to = restricted_to, visibility = visibility, )