| # Copyright 2021 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import("//build/config/chromeos/ui_mode.gni") |
| import("//third_party/node/node.gni") |
| |
| template("ts_library") { |
| node(target_name) { |
| script = "//tools/typescript/ts_library.py" |
| |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "extra_deps", |
| "in_files", |
| "tsconfig_base", |
| "manifest_excludes", |
| "testonly", |
| "visibility", |
| ]) |
| |
| inputs = [ |
| "//tools/typescript/tsconfig_base.json", |
| "//tools/typescript/path_mappings.py", |
| "//tools/typescript/validate_tsconfig.py", |
| ] |
| outputs = [ "$target_gen_dir/tsconfig_$target_name.json" ] |
| |
| assert(defined(in_files) || defined(invoker.definitions)) |
| |
| root_dir = "." |
| if (defined(invoker.root_dir)) { |
| root_dir = invoker.root_dir |
| } |
| |
| out_dir = target_gen_dir |
| if (defined(invoker.out_dir)) { |
| out_dir = invoker.out_dir |
| } |
| |
| composite = false |
| if (defined(invoker.composite)) { |
| composite = invoker.composite |
| } |
| |
| if (defined(in_files)) { |
| outputs += [ "$target_gen_dir/${target_name}_manifest.json" ] |
| foreach(_source, in_files) { |
| inputs += [ "$root_dir/$_source" ] |
| _dirname = |
| rebase_path(get_path_info(_source, "gen_dir"), target_gen_dir) |
| _filename = get_path_info(_source, "name") |
| outputs += [ "$out_dir/$_dirname/$_filename.js" ] |
| |
| if (composite) { |
| outputs += [ "$out_dir/$_dirname/$_filename.d.ts" ] |
| } |
| } |
| } |
| |
| args = [ |
| "--root_gen_dir", |
| rebase_path(root_gen_dir, target_gen_dir), |
| "--root_src_dir", |
| rebase_path("//", target_gen_dir), |
| |
| "--root_dir", |
| rebase_path(root_dir, root_build_dir), |
| "--gen_dir", |
| rebase_path(target_gen_dir, root_build_dir), |
| "--out_dir", |
| rebase_path(out_dir, root_build_dir), |
| "--output_suffix", |
| target_name, |
| ] |
| |
| if (defined(in_files)) { |
| args += [ "--in_files" ] + in_files |
| } |
| |
| if (defined(manifest_excludes)) { |
| assert(defined(in_files)) |
| args += [ "--manifest_excludes" ] + manifest_excludes |
| } |
| |
| if (defined(invoker.definitions)) { |
| inputs += invoker.definitions |
| definitions = [] |
| foreach(_definition, invoker.definitions) { |
| definitions += [ rebase_path(_definition, target_gen_dir) ] |
| } |
| args += [ "--definitions" ] + definitions |
| } |
| |
| if (defined(deps)) { |
| args += [ "--raw_deps" ] |
| foreach(_dep, deps) { |
| # Pass all dependency names to the script, because they are needed to |
| # automatically infer path mappings. Normalize their form, because |
| # |deps| can hold relative paths. |
| args += |
| [ get_label_info(_dep, "dir") + ":" + get_label_info(_dep, "name") ] |
| } |
| |
| args += [ "--deps" ] |
| foreach(dep, deps) { |
| name = get_label_info(dep, "name") |
| args += [ rebase_path(get_label_info(dep, "dir"), ".") + |
| "/tsconfig_$name.json" ] |
| } |
| } |
| |
| if (defined(tsconfig_base)) { |
| inputs += [ tsconfig_base ] |
| args += [ |
| "--tsconfig_base", |
| rebase_path(tsconfig_base, target_gen_dir), |
| ] |
| } |
| |
| if (composite) { |
| args += [ "--composite" ] |
| } |
| |
| if (defined(invoker.enable_source_maps) && invoker.enable_source_maps) { |
| args += [ "--enable_source_maps" ] |
| } |
| |
| if (defined(extra_deps)) { |
| # ts_library() targets are conventionally named with "build_ts" or |
| # "library". These should always be listed in deps and not extra_deps |
| foreach(_extra_dep, extra_deps) { |
| assert(get_label_info(_extra_dep, "name") != "build_ts" && |
| get_label_info(_extra_dep, "name") != "library", |
| "Did you mean to list ${_extra_dep} in deps instead of " + |
| "extra_deps? extra_deps should not hold any ts_library() " + |
| "targets.") |
| } |
| if (!defined(deps)) { |
| deps = [] |
| } |
| deps += extra_deps |
| } |
| |
| path_mappings = [ |
| "/tools/typescript/definitions/*|" + |
| rebase_path("//tools/typescript/definitions/*", target_gen_dir), |
| # NOTE: path_mappings corresponding to files generated by |
| # other ts_library() deps are automatically inferred from |deps| in |
| # path_mappings.py. Don't add any such mappings here. |
| ] |
| |
| # The |platform| flag is used in path_mappings.py and validate_tsconfig.py, |
| # to limit some logic to certain platforms, like preventing special iOS |
| # exceptions being abused on other platforms. |
| if (is_ios) { |
| platform = "ios" |
| args += [ |
| "--platform", |
| platform, |
| ] |
| } else if (is_chromeos_ash) { |
| platform = "chromeos_ash" |
| args += [ |
| "--platform", |
| platform, |
| ] |
| } |
| |
| args += [ "--path_mappings" ] + path_mappings |
| if (defined(invoker.path_mappings)) { |
| args += invoker.path_mappings |
| } |
| } |
| } |