# Copyright 2017 The Chromium Authors.  All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//third_party/closure_compiler/closure_args.gni")
import("//ui/webui/webui_features.gni")

script_path = "//third_party/closure_compiler"
compiler_path = "$script_path/compiler/compiler.jar"
externs_path = "$script_path/externs"
interfaces_path = "$script_path/interfaces"
chrome_externs = "$externs_path/chrome.js"
polymer_externs = "$externs_path/polymer-1.0.js"

# Defines a target that creates an ordering for .js files to be used by
# js_binary to compile.
#
# Variables:
#   sources:
#     List of Javascript files to include in the library. Uses target_name.js by
#     default.
#
#   deps:
#     List of js_library targets to depend on
#
#   extra_deps:
#     List of any other rules to depend on. E.g. a rule that generates js source
#     files
#
#   externs_list:
#     A list of .js files to pass to the compiler as externs
#
#   extra_sources:
#     A list of .js files to pass to the compiler as interfaces
#
# Example:
#   js_library("apple_tree") {
#     sources = ["tree_main.js"]
#     deps = [
#       ":branch",
#       ":trunk",
#       ":root",
#     ]
#   }

template("js_library") {
  action(target_name) {
    script = "$script_path/js_library.py"
    forward_variables_from(invoker,
                           [
                             "sources",
                             "deps",
                             "externs_list",
                             "extra_sources",
                             "extra_deps",
                           ])
    output_file = "$target_gen_dir/$target_name.js_library"
    outputs = [
      output_file,
    ]
    args = [ "--output" ] + [ rebase_path(output_file, root_build_dir) ]

    if (!defined(sources)) {
      sources = [
        target_name + ".js",
      ]
    }

    args += [ "--sources" ] + rebase_path(sources, root_build_dir)
    if (defined(extra_sources)) {
      args += rebase_path(extra_sources, root_build_dir)
      sources += extra_sources
    }

    if (defined(deps)) {
      args += [ "--deps" ]
      foreach(dep, deps) {
        # Get the output path for each dep
        dep_gen_dir = get_label_info(dep, "target_gen_dir")
        dep_name = get_label_info(dep, "name")
        dep_output_path = "$dep_gen_dir/$dep_name.js_library"
        args += [ rebase_path(dep_output_path, root_build_dir) ]
      }
    }
    if (defined(externs_list)) {
      args += [ "--externs" ] + rebase_path(externs_list, root_build_dir)
      sources += externs_list
    }
    if (defined(extra_deps)) {
      if (!defined(deps)) {
        deps = []
      }
      deps += extra_deps
    }
  }
}

# Defines a target that compiles javascript files using the Closure compiler.
# This will produce a minified javascript output file. Additional checks and
# optimizations can be configured using the closure_flags attribute.
#
# Variables:
#   sources:
#     List of .js files to compile. Will be target_name.js by default. Use
#     sources = [] to specify no input files (when making a target that just
#     group compiles other targets, for example).
#
#   deps:
#     List of js_library rules to depend on
#
#   outputs:
#     A file to write the compiled .js to.
#     Only takes in a single file, but must be placed in a list
#
#   bootstrap_file:
#      A .js files to include before all others
#
#   config_files:
#     A list of .js files to include after the bootstrap_file but before all
#     others
#
#   closure_flags:
#     A list of custom flags to pass to the Closure compiler.  Do not include
#     the leading dashes
#
#   externs_list:
#     A list of .js files to pass to the compiler as externs
#
# Example:
#   js_binary("tree") {
#     sources = ["tree_main.js"]
#     deps = [":apple_tree"]
#     outputs = [ "$target_gen_dir/tree.js" ]
#     bootstrap_file = "bootstrap.js"
#     config_files = [
#       "config1.js",
#       "config2.js",
#     ]
#     closure_flags = ["jscomp_error=undefinedVars"]
#     externs_list = [ "externs.js" ]
#   }

template("js_binary") {
  action(target_name) {
    script = "$script_path/js_binary.py"
    forward_variables_from(invoker,
                           [
                             "sources",
                             "deps",
                             "outputs",
                             "bootstrap_file",
                             "config_files",
                             "closure_flags",
                             "externs_list",
                             "extra_deps",
                           ])
    args = [
      "--compiler",
      rebase_path(compiler_path, root_build_dir),
    ]

    if (!defined(outputs)) {
      outputs = [
        "$target_gen_dir/$target_name.js",
      ]
    }
    args += [ "--output" ] + rebase_path(outputs, root_build_dir)

    if (!defined(sources)) {
      sources = [
        "$target_name.js",
      ]
    }

    if (defined(deps)) {
      args += [ "--deps" ]
      foreach(dep, deps) {
        # Get the output path for each dep
        dep_gen_dir = get_label_info(dep, "target_gen_dir")
        dep_name = get_label_info(dep, "name")
        dep_output_path = "$dep_gen_dir/$dep_name.js_library"
        args += [ rebase_path(dep_output_path, root_build_dir) ]
      }
    }

    args += [ "--sources" ] + rebase_path(sources, root_build_dir)

    if (defined(bootstrap_file)) {
      args += [
        "--bootstrap",
        rebase_path(bootstrap_file, root_build_dir),
      ]
      sources += [ bootstrap_file ]
    }
    if (defined(config_files)) {
      args += [ "--config" ] + rebase_path(config_files, root_build_dir)
      sources += config_files
    }

    # |minifying_closure_args| from
    # //third_party/closure_compiler/closure_args.gni
    if (!defined(closure_flags)) {
      closure_flags = default_closure_args
    }
    args += [ "--flags" ] + closure_flags
    args += [
      "--externs",
      rebase_path("$chrome_externs", root_build_dir),
      rebase_path("$polymer_externs", root_build_dir),
    ]
    if (defined(externs_list)) {
      args += rebase_path(externs_list, root_build_dir)
      sources += externs_list
    }

    if (defined(extra_deps)) {
      if (!defined(deps)) {
        deps = []
      }
      deps += extra_deps
    }
  }
}

# Defines a target that compiles a group of js_library targets.
template("js_type_check") {
  if (closure_compile) {
    js_binary(target_name) {
      sources = []
      forward_variables_from(invoker, [ "deps" ])
    }
  } else {
    not_needed(invoker, "*")
    group(target_name) {
    }
  }
}
