22
33load ("@bazel_skylib//lib:paths.bzl" , "paths" )
44
5+ ClosureTsCompileInfo = provider (doc = "info about a closure ts compile rule" , fields = {
6+ "sources" : "DepSet<File>: direct + transitive sources" ,
7+ })
8+
59def _output_for_ts_input (ctx , src ):
610 filename = paths .replace_extension (src .basename , ".js" )
711 return ctx .actions .declare_file (filename , sibling = src )
@@ -10,46 +14,59 @@ def _output_for_externs(ctx):
1014 return ctx .actions .declare_file (ctx .label .name + ".externs.js" )
1115
1216def _tsickle_action (ctx ):
17+ direct = ctx .files .srcs
18+ transitive = [dep [ClosureTsCompileInfo ].sources for dep in ctx .attr .deps ]
19+
1320 args = ctx .actions .args ()
14- args .add_all ([src .short_path for src in ctx . files . srcs ])
21+ args .add_all ([src .short_path for src in direct ])
1522
1623 env = {
1724 "BAZEL_BINDIR" : ctx .bin_dir .path ,
1825 "BAZEL_WORKSPACE" : ctx .label .workspace_name ,
1926 "BAZEL_PACKAGE" : ctx .label .package ,
2027 }
2128
22- ts_inputs = []
23- d_ts_inputs = []
24- for src in ctx . files . srcs :
29+ direct_ts = []
30+ direct_dts = []
31+ for src in direct :
2532 if src .basename .endswith (".d.ts" ):
26- d_ts_inputs .append (src )
33+ direct_dts .append (src )
2734 else :
28- ts_inputs .append (src )
35+ direct_ts .append (src )
2936
30- outputs = [_output_for_ts_input (ctx , f ) for f in ts_inputs ]
31- if len (d_ts_inputs ) > 0 :
37+ outputs = [_output_for_ts_input (ctx , f ) for f in direct_ts ]
38+ if len (direct_dts ) > 0 :
3239 externs_output = _output_for_externs (ctx )
3340 outputs .append (externs_output )
3441 env ["EXTERNS_PATH" ] = externs_output .short_path
3542
43+ inputs = depset (direct = direct , transitive = transitive )
44+
3645 ctx .actions .run (
3746 mnemonic = "TsickleCompile" ,
3847 executable = ctx .executable ._compiler ,
3948 arguments = [args ],
40- inputs = ts_inputs + d_ts_inputs ,
49+ inputs = inputs ,
4150 outputs = outputs ,
4251 env = env ,
4352 )
4453
45- return outputs
54+ return struct (
55+ inputs = inputs ,
56+ outputs = outputs ,
57+ )
4658
4759def _closure_ts_compile_impl (ctx ):
48- outputs = _tsickle_action (ctx )
60+ result = _tsickle_action (ctx )
4961
50- return [DefaultInfo (
51- files = depset (outputs ),
52- )]
62+ return [
63+ DefaultInfo (
64+ files = depset (result .outputs ),
65+ ),
66+ ClosureTsCompileInfo (
67+ sources = result .inputs ,
68+ ),
69+ ]
5370
5471closure_ts_compile = rule (
5572 implementation = _closure_ts_compile_impl ,
@@ -59,11 +76,16 @@ closure_ts_compile = rule(
5976 allow_files = True ,
6077 mandatory = True ,
6178 ),
79+ "deps" : attr .label_list (
80+ doc = "list of ClosureTsCompileInfo dependencies" ,
81+ providers = [ClosureTsCompileInfo ],
82+ ),
6283 "_compiler" : attr .label (
6384 default = "//tools/tsicklecompiler" ,
6485 doc = "the tsickle driver tool" ,
6586 executable = True ,
6687 cfg = "exec" ,
6788 ),
6889 },
90+ provides = [ClosureTsCompileInfo ],
6991)
0 commit comments