# Copyright 2017 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# BEGIN-DEV-ONLY
# Parts of this BUILD file only necessary when building within the bazelbuild/rules_typescript repo.
# The generated `@bazel/typescript` npm package contains a trimmed BUILD file using # DEV-ONLY fences.
#
# To update BUILD.bazel files after changing Go code, run
# bazel run //:gazelle
#
# Exclude node_modules, see
# https://github.com/bazelbuild/rules_go/blob/master/go/tools/gazelle/README.rst#directives
# gazelle:exclude node_modules
load("@bazel_gazelle//:def.bzl", "gazelle")

# END-DEV-ONLY
load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary", "npm_package")

# BEGIN-DEV-ONLY
load("@build_bazel_rules_nodejs//internal/js_library:js_library.bzl", "js_library")
load("//:version.bzl", "COMPAT_VERSION")

# ts_library defaults to this label in the top-level package.
# Point to where the file actually lives.
alias(
    name = "tsconfig.json",
    actual = "//examples:tsconfig.json",
    visibility = ["//visibility:public"],
)

exports_files(["LICENSE"])

gazelle(
    name = "gazelle",
    prefix = "github.com/bazelbuild/rules_typescript",
)

# Runtime libraries needed by the protobufjs library.
# Any JS code produced by the ts_proto_library rule has a runtime dependency on these scripts.
js_library(
    name = "protobufjs_bootstrap_scripts",
    srcs = [
        "@build_bazel_rules_typescript_protobufs_compiletime_deps//node_modules/long:dist/long.js",
        "@build_bazel_rules_typescript_protobufs_compiletime_deps//node_modules/protobufjs:dist/minimal/protobuf.min.js",
    ],
    # Make devmode loading work when it does require("protobufjs/minimal")
    # so this is shimmed to define it to equal global.protobuf
    amd_names = {
        "long": "Long",
        "protobufjs/minimal": "protobuf",
    },
    visibility = ["//visibility:public"],
)

npm_package(
    name = "npm_package",
    srcs = [
        "BUILD.bazel",
        "LICENSE",
        "README.md",
        "WORKSPACE",
        "defs.bzl",
        "package.bzl",
        "package.json",
        "version.bzl",
        "//devserver:npm_package_assets",
        "//internal:npm_package_assets",
        "//third_party/github.com/bazelbuild/bazel/src/main/protobuf:npm_package_assets",
        "//ts_auto_deps:npm_package_assets",
    ],
    replacements = {
        "(#|\/\/)\\s+BEGIN-DEV-ONLY[\\w\W]+?(#|\/\/)\\s+END-DEV-ONLY": "",
        # Do a simple replacement needed to make the local development differ
        # from how our release is used.
        "//devserver:devserver_bin": "//devserver",
        "0.0.0-COMPAT_VERSION": COMPAT_VERSION,
    },
    deps = [
        "//devserver:devserver-darwin",
        "//devserver:devserver-linux",
        "//devserver:devserver-windows",
        "//internal:generated_BUILD",
        "//internal:tsc_wrapped",
        "//ts_auto_deps:ts_auto_deps-darwin",
        "//ts_auto_deps:ts_auto_deps-linux",
        "//ts_auto_deps:ts_auto_deps-windows",
    ],
)

# Produces the release we publish to GitHub. Users download this starlark package
# to get the @build_bazel_rules_typescript workspace.
# FIXME(gregmagolan): strip the npm_package prefix from within the generated archive
# pkg_tar(
#     name = "release",
#     srcs = ["//:npm_package"],
#     extension = "tgz",
# )

# END-DEV-ONLY
# A nodejs_binary for @bazel/typescript/tsc_wrapped to use by default in
# ts_library that depends on @npm//@bazel/typescript instead of the
# output of the //internal/tsc_wrapped ts_library rule. This
# default is for downstream users that depend on the @bazel/typescript npm
# package. A generated @npm//@bazel/typescript/bin:tsc_wrapped target
# would not work because it does not have the node `--expose-gc` flag
# set which is required to support the call to `global.gc()`.
nodejs_binary(
    name = "@bazel/typescript/tsc_wrapped",
    data = ["@npm//@bazel/typescript"],
    entry_point = "@bazel/typescript/internal/tsc_wrapped/tsc_wrapped.js",
    install_source_map_support = False,
    templated_args = ["--node_options=--expose-gc"],
    visibility = ["//visibility:public"],
)
