1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
"""
Rules for building typescript flatbuffers with Bazel.
"""
load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
load("@npm//@bazel/typescript:index.bzl", "ts_project")
load(":build_defs.bzl", "DEFAULT_INCLUDE_PATHS", "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 = DEFAULT_INCLUDE_PATHS,
flatc_args = DEFAULT_FLATC_TS_ARGS,
visibility = None,
restricted_to = None,
include_reflection = True,
gen_reflections = False,
package_name = None):
"""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.
include_reflection: Optional, Whether to depend on the flatbuffer
reflection library automatically. Only really relevant for the
target that builds the reflection library itself.
gen_reflections: Optional, if true this will generate the flatbuffer
reflection binaries for the schemas.
package_name: Optional, Package name to use for the generated code.
"""
srcs_lib = "%s_srcs" % (name)
out_base = [s.replace(".fbs", "").split("/")[-1].split(":")[-1] for s in srcs]
# Because of how we have to manage the bazel rules for typescript,
# reflection has to get special-cased to get imported when
# run within bazel. As such, generate the code using the _pregenerate
# suffix; then do a find/replace to fix-up all the reflection imports.
pre_outs = ["%s_pregenerated.ts" % s for s in out_base]
outs = ["%s_generated.ts" % 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 = pre_outs,
language_flag = "--ts",
includes = includes,
include_paths = include_paths,
flatc_args = flatc_args + ["--filename-suffix _pregenerated"],
compatible_with = compatible_with,
restricted_to = restricted_to,
reflection_name = reflection_name,
reflection_visibility = visibility,
target_compatible_with = target_compatible_with,
)
fix_import_cmd = " ".join([
"SRCS=($(SRCS));",
"OUTS=($(OUTS));",
"for i in $${!SRCS[@]}; do",
"sed \"s/'.*reflection\\/reflection_pregenerated/'flatbuffers_reflection\\/reflection_generated/; s/_pregenerated/_generated/\" $${SRCS[i]} > $${OUTS[i]};",
"done",
])
native.genrule(
name = name + "_reimporter",
srcs = pre_outs,
outs = outs,
cmd = fix_import_cmd,
)
ts_project(
name = name + "_ts",
srcs = outs,
declaration = True,
visibility = visibility,
compatible_with = compatible_with,
restricted_to = restricted_to,
target_compatible_with = target_compatible_with,
tsconfig = {
"compilerOptions": {
"declaration": True,
"lib": [
"ES2015",
"ES2020.BigInt",
"DOM",
],
"module": "commonjs",
"moduleResolution": "node",
"noUnusedLocals": True,
"strict": True,
"types": ["node"],
},
},
deps = deps + ["@com_github_google_flatbuffers//ts:flatbuffers"] + (["@com_github_google_flatbuffers//reflection/ts:reflection_ts_fbs"] if include_reflection else []),
)
js_library(
name = name,
visibility = visibility,
compatible_with = compatible_with,
restricted_to = restricted_to,
target_compatible_with = target_compatible_with,
deps = [name + "_ts"],
package_name = package_name,
)
native.filegroup(
name = "%s_includes" % (name),
srcs = srcs + includes,
compatible_with = compatible_with,
restricted_to = restricted_to,
visibility = visibility,
)
|