xref: /aosp_15_r20/external/angle/build/config/siso/tsc.star (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker# -*- bazel-starlark -*-
2*8975f5c5SAndroid Build Coastguard Workerload("@builtin//encoding.star", "json")
3*8975f5c5SAndroid Build Coastguard Workerload("@builtin//path.star", "path")
4*8975f5c5SAndroid Build Coastguard Workerload("@builtin//struct.star", "module")
5*8975f5c5SAndroid Build Coastguard Worker
6*8975f5c5SAndroid Build Coastguard Workerdef _load(ctx, tsconfig_path, loaded):
7*8975f5c5SAndroid Build Coastguard Worker    if tsconfig_path in loaded:
8*8975f5c5SAndroid Build Coastguard Worker        return loaded[tsconfig_path]
9*8975f5c5SAndroid Build Coastguard Worker    tsconfig = json.decode(str(ctx.fs.read(tsconfig_path)))
10*8975f5c5SAndroid Build Coastguard Worker    loaded[tsconfig_path] = tsconfig
11*8975f5c5SAndroid Build Coastguard Worker    return tsconfig
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Workerdef _paths(ctx, tsconfig_path, tsconfig, loaded):
14*8975f5c5SAndroid Build Coastguard Worker    paths = [tsconfig_path]
15*8975f5c5SAndroid Build Coastguard Worker    tsconfig_dir = path.dir(tsconfig_path)
16*8975f5c5SAndroid Build Coastguard Worker    if "files" in tsconfig:
17*8975f5c5SAndroid Build Coastguard Worker        for file in tsconfig["files"]:
18*8975f5c5SAndroid Build Coastguard Worker            paths.append(path.join(tsconfig_dir, file))
19*8975f5c5SAndroid Build Coastguard Worker            if file.endswith(".js"):
20*8975f5c5SAndroid Build Coastguard Worker                # Add if d.ts version of the file exists.
21*8975f5c5SAndroid Build Coastguard Worker                file_dts = path.join(tsconfig_dir, file[:-2] + "d.ts")
22*8975f5c5SAndroid Build Coastguard Worker                if ctx.fs.exists(file_dts):
23*8975f5c5SAndroid Build Coastguard Worker                    paths.append(file_dts)
24*8975f5c5SAndroid Build Coastguard Worker    return paths
25*8975f5c5SAndroid Build Coastguard Worker
26*8975f5c5SAndroid Build Coastguard Workerdef _scan_inputs(ctx, tsconfig_path, tsconfig, loaded, scanned):
27*8975f5c5SAndroid Build Coastguard Worker    if tsconfig_path in scanned:
28*8975f5c5SAndroid Build Coastguard Worker        return scanned[tsconfig_path]
29*8975f5c5SAndroid Build Coastguard Worker    inputs = {}
30*8975f5c5SAndroid Build Coastguard Worker    for fname in _paths(ctx, tsconfig_path, tsconfig, loaded):
31*8975f5c5SAndroid Build Coastguard Worker        if fname not in inputs:
32*8975f5c5SAndroid Build Coastguard Worker            inputs[fname] = True
33*8975f5c5SAndroid Build Coastguard Worker    tsconfig_dir = path.dir(tsconfig_path)
34*8975f5c5SAndroid Build Coastguard Worker    tsconfig_deps = [ref["path"] for ref in tsconfig.get("references", [])]
35*8975f5c5SAndroid Build Coastguard Worker    if "extends" in tsconfig:
36*8975f5c5SAndroid Build Coastguard Worker        tsconfig_deps.append(tsconfig["extends"])
37*8975f5c5SAndroid Build Coastguard Worker    for tsconfig_dep in tsconfig_deps:
38*8975f5c5SAndroid Build Coastguard Worker        ref_path = path.join(tsconfig_dir, tsconfig_dep)
39*8975f5c5SAndroid Build Coastguard Worker        if ref_path not in inputs:
40*8975f5c5SAndroid Build Coastguard Worker            inputs[ref_path] = True
41*8975f5c5SAndroid Build Coastguard Worker        ref_tsconfig = _load(ctx, ref_path, loaded)
42*8975f5c5SAndroid Build Coastguard Worker        for fname in _scan_inputs(ctx, ref_path, ref_tsconfig, loaded, scanned):
43*8975f5c5SAndroid Build Coastguard Worker            if fname not in inputs:
44*8975f5c5SAndroid Build Coastguard Worker                inputs[fname] = True
45*8975f5c5SAndroid Build Coastguard Worker    scanned[tsconfig_path] = inputs.keys()
46*8975f5c5SAndroid Build Coastguard Worker    return scanned[tsconfig_path]
47*8975f5c5SAndroid Build Coastguard Worker
48*8975f5c5SAndroid Build Coastguard Workerdef _scandeps(ctx, tsconfig_path, tsconfig):
49*8975f5c5SAndroid Build Coastguard Worker    loaded = {tsconfig_path: tsconfig}
50*8975f5c5SAndroid Build Coastguard Worker    scanned = {}
51*8975f5c5SAndroid Build Coastguard Worker    inputs = _scan_inputs(ctx, tsconfig_path, tsconfig, loaded, scanned)
52*8975f5c5SAndroid Build Coastguard Worker    return inputs
53*8975f5c5SAndroid Build Coastguard Worker
54*8975f5c5SAndroid Build Coastguard Workertsc = module(
55*8975f5c5SAndroid Build Coastguard Worker    "tsc",
56*8975f5c5SAndroid Build Coastguard Worker    scandeps = _scandeps,
57*8975f5c5SAndroid Build Coastguard Worker)
58