forked from google/flatbuffers
-
Notifications
You must be signed in to change notification settings - Fork 0
/
typescript.bzl
134 lines (129 loc) · 5.07 KB
/
typescript.bzl
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,
)