blob: dc9f3e9ba8d23df74f10d4615e55a5a4181bb3e4 [file] [log] [blame]
load("@builtin//encoding.star", "json")
load("@builtin//path.star", "path")
load("@builtin//struct.star", "module")
load("./config.star", "config")
load("./tsc.star", "tsc")
# TODO: crbug.com/1478909 - Specify typescript inputs in GN config.
def __filegroups(ctx):
return {
"third_party/devtools-frontend/src/node_modules/typescript:typescript": {
"type": "glob",
"includes": ["*"],
},
"third_party/devtools-frontend/src/node_modules:node_modules": {
"type": "glob",
"includes": ["*.js", "*.json", "*.ts"],
},
}
def __step_config(ctx, step_config):
step_config["input_deps"].update({
"third_party/devtools-frontend/src/third_party/typescript/ts_library.py": [
"third_party/devtools-frontend/src/node_modules/typescript:typescript",
"third_party/devtools-frontend/src/node_modules:node_modules",
],
})
# TODO: b/308405411 - Enable remote-devtools-frontend-typescript by default.
if config.get(ctx, "remote-devtools-frontend-typescript"):
step_config["rules"].extend([
{
"name": "devtools-frontend/typescript/ts_library",
"command_prefix": "python3 ../../third_party/devtools-frontend/src/third_party/typescript/ts_library.py",
"exclude_input_patterns": [
"*.stamp",
],
"remote": True,
"handler": "devtools_frontend/typescript_ts_library",
"output_local": True,
},
])
return step_config
def _ts_library(ctx, cmd):
# Handler for https://crsrc.org/c/third_party/devtools-frontend/src/third_party/typescript/ts_library.py
# Note that this is a different script from https://crsrc.org/c/tools/typescript/ts_library.py
deps = []
sources = []
tsconfig_path = None
flag = None
for i, arg in enumerate(cmd.args):
if flag != "" and arg.startswith("-"):
flag = ""
if arg == "--tsconfig_output_location":
tsconfig_path = ctx.fs.canonpath(cmd.args[i + 1])
continue
if arg in ("--deps", "--sources"):
flag = arg
continue
if flag == "--deps":
deps.append(arg)
continue
if flag == "--sources":
sources.append(ctx.fs.canonpath(arg))
continue
if not tsconfig_path:
fail("missing --tsconfig_output_location")
tsconfig = {"files": [], "references": []}
tsconfig_dir = path.dir(tsconfig_path)
for s in sources:
tsconfig["files"].append(path.rel(tsconfig_dir, s))
for d in deps:
tsconfig["references"].append({"path": d})
refpath = path.join(tsconfig_dir, d)
refdir = path.dir(refpath)
# TODO: crbug.com/1503020 - Fix devtools_entrypoint to propagate .d.ts output.
dpath = path.join(refdir, path.base(refdir) + ".d.ts")
if ctx.fs.exists(dpath):
sources.append(dpath)
inputs = tsc.scandeps(ctx, tsconfig_path, tsconfig)
# Sources and imported files might be located in different dirs. source vs gen.
# Try to collect the corresponding files in source or gen dir.
# TODO: crbug.com/1505319 - Fix devtools_module import issues.
files = {}
gen_dir = None
# Infer source files from gen file.
for f in cmd.inputs + inputs:
if f.startswith("out/"):
# Remove out/{subdir}/gen.
splits = f.split("/", 3)
if len(splits) < 4:
continue
gen_dir = path.join(splits[0], splits[1], splits[2])
f = splits[3]
if ctx.fs.exists(f) and not f in files:
files[f] = True
continue
if f.endswith(".js"):
f = f.removesuffix(".js") + ".d.ts"
if ctx.fs.exists(f) and not f in files:
files[f] = True
# Infer gen files from source file.
if gen_dir:
for f in cmd.inputs + inputs:
if f.endswith(".ts"):
f = path.join(gen_dir, f)
f = f.removesuffix(".ts") + ".d.ts"
if ctx.fs.exists(f) and not f in files:
files[f] = True
if f.endswith(".js"):
f = path.join(gen_dir, f)
f = f.removesuffix(".js") + ".d.ts"
if ctx.fs.exists(f) and not f in files:
files[f] = True
ctx.actions.fix(inputs = cmd.inputs + inputs + sources + files.keys())
devtools_frontend = module(
"devtools_frontend",
step_config = __step_config,
handlers = {
"devtools_frontend/typescript_ts_library": _ts_library,
},
filegroups = __filegroups,
)