# 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.

# gazelle:exclude worker_protocol.proto

package(default_visibility = ["//visibility:public"])

exports_files([
    "tsconfig.json",
    # Exported to be consumed for generating skydoc.
    "build_defs.bzl",
    "ts_config.bzl",
    "ts_repositories.bzl",
])

load("//internal:defaults.bzl", "ts_library")
load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary", "jasmine_node_test", "npm_package")

# Vanilla typescript compiler: run the tsc.js binary distributed by TypeScript
nodejs_binary(
    name = "tsc",
    data = [
        "@npm//:source-map-support",
        "@npm//:typescript",
    ],
    entry_point = "typescript/lib/tsc.js",
    visibility = ["//internal:__subpackages__"],
)

# Build our custom compiler using the vanilla one
ts_library(
    name = "tsc_wrapped",
    srcs = glob(
        [
            "tsc_wrapped/*.ts",
            "tsetse/*.ts",
            "tsetse/rules/*.ts",
        ],
        exclude = [
            "**/test_support.ts",
            "**/*_test.ts",
        ],
    ),
    compiler = ":tsc",
    data = [
        "//third_party/github.com/bazelbuild/bazel/src/main/protobuf:worker_protocol.proto",
    ],
    module_name = "@bazel/typescript",
    module_root = "tsc_wrapped/index.d.ts",
    supports_workers = False,
    tsconfig = "//internal:tsc_wrapped/tsconfig.json",
    visibility = ["//visibility:public"],
    # Cannot have any deps (except npm fine grained deps) because it doesn't
    # work with vanilla tsc.
    # Workaround for https://github.com/Microsoft/TypeScript/issues/22208
    deps = [
        "@npm//:@types/node",
        "@npm//:tsickle",
        "@npm//:tsutils",
        "@npm//:typescript",
    ],
)

# Other ts_library rules will use this custom compiler, which calls the
# TypeScript APIs to act like tsc, but adds capabilities like Bazel workers.
# TODO(gregmagolan): make @npm//:tsickle dependency optional
nodejs_binary(
    name = "tsc_wrapped_bin",
    data = [
        ":tsc_wrapped",
        "@npm//:protobufjs",
        "@npm//:source-map-support",
        "@npm//:tsickle",
        "@npm//:tsutils",
        "@npm//:typescript",
    ],
    entry_point = "build_bazel_rules_typescript/internal/tsc_wrapped/tsc_wrapped.js",
    templated_args = ["--node_options=--expose-gc"],
    visibility = ["//visibility:public"],
)

ts_library(
    name = "test_lib",
    srcs = glob(["tsc_wrapped/*_test.ts"]) + ["tsc_wrapped/test_support.ts"],
    tsconfig = "//internal:tsc_wrapped/tsconfig.json",
    deps = [
        ":tsc_wrapped",
        "@npm//:@types/jasmine",
        "@npm//:@types/node",
        "@npm//:typescript",
    ],
)

jasmine_node_test(
    name = "test",
    srcs = [],
    deps = [
        ":test_lib",
        "@npm//:jasmine",
        "@npm//:typescript",
    ],
)

genrule(
    name = "license_copy",
    srcs = ["//:LICENSE"],
    outs = ["LICENSE"],
    cmd = "cp $< $@",
)

genrule(
    name = "worker_protocol_copy",
    srcs = ["//third_party/github.com/bazelbuild/bazel/src/main/protobuf:worker_protocol.proto"],
    outs = ["worker_protocol.proto"],
    cmd = "cp $< $@",
)

genrule(
    name = "check_version_copy",
    srcs = ["//tools:check_version.js"],
    outs = ["check_version.js"],
    cmd = "cp $< $@",
)

npm_package(
    name = "npm_package",
    srcs = [
        "README.md",
        "package.json",
    ],
    deps = [
        ":check_version_copy",
        ":license_copy",
        ":tsc_wrapped",
        ":worker_protocol_copy",
    ],
)
