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