# 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)
    }

    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)
    }
    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) {
    }
  }
}
