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