template("node_action") {
  assert(defined(invoker.script), "Need script path to run")
  assert(defined(invoker.args), "Need script arguments")

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "sources",
                             "inputs",
                             "outputs",
                           ])
    if (!defined(inputs)) {
      inputs = []
    }
    inputs += [ invoker.script ]
    script = "//electron/build/run-node.py"
    args = [ rebase_path(invoker.script) ] + invoker.args
  }
}

template("asar") {
  assert(defined(invoker.sources),
         "Need sources in $target_name listing the source files")
  assert(defined(invoker.outputs),
         "Need asar name (as 1-element array, e.g. \$root_out_dir/foo.asar)")
  assert(defined(invoker.root), "Need the base dir for generating the ASAR")

  node_action(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "script",
                             "args",
                           ])

    script = "//electron/script/gn-asar.js"
    args = [
             "--base",
             rebase_path(root),
             "--files",
           ] + rebase_path(sources) +
           [
             "--out",
             rebase_path(outputs[0]),
           ]
  }

  node_action(target_name + "_header_hash") {
    invoker_out = invoker.outputs

    deps = [ ":" + invoker.target_name ]
    sources = invoker.outputs

    script = "//electron/script/gn-asar-hash.js"
    outputs = [ "$target_gen_dir/asar_hashes/$target_name.hash" ]

    args = [
      rebase_path(invoker_out[0]),
      rebase_path(outputs[0]),
    ]
  }
}

template("asar_hashed_info_plist") {
  node_action(target_name) {
    assert(defined(invoker.plist_file),
           "Need plist_file to add hashed assets to")
    assert(defined(invoker.keys), "Need keys to replace with asset hash")
    assert(defined(invoker.hash_targets), "Need hash_targets to read hash from")

    deps = invoker.hash_targets

    script = "//electron/script/gn-plist-but-with-hashes.js"
    inputs = [ invoker.plist_file ]
    outputs = [ "$target_gen_dir/hashed_plists/$target_name.plist" ]
    hash_files = []
    foreach(hash_target, invoker.hash_targets) {
      hash_files += get_target_outputs(hash_target)
    }
    args = [
             rebase_path(invoker.plist_file),
             rebase_path(outputs[0]),
           ] + invoker.keys + rebase_path(hash_files)
  }
}