load("@npm//@babel/cli:index.bzl", "babel")
load("//tools:defaults.bzl", "jasmine_node_test", "ts_library")

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

ts_library(
    name = "test_lib",
    testonly = True,
    srcs = glob(
        ["**/*.ts"],
        exclude = ["integration/**/*.ts"],
    ),
    deps = [
        "//packages/compiler",
        "//packages/compiler-cli",
        "//packages/compiler-cli/ngcc",
        "//packages/compiler-cli/ngcc/test/helpers",
        "//packages/compiler-cli/src/ngtsc/diagnostics",
        "//packages/compiler-cli/src/ngtsc/file_system",
        "//packages/compiler-cli/src/ngtsc/file_system/testing",
        "//packages/compiler-cli/src/ngtsc/imports",
        "//packages/compiler-cli/src/ngtsc/logging/testing",
        "//packages/compiler-cli/src/ngtsc/partial_evaluator",
        "//packages/compiler-cli/src/ngtsc/reflection",
        "//packages/compiler-cli/src/ngtsc/testing",
        "//packages/compiler-cli/src/ngtsc/transform",
        "//packages/compiler-cli/src/ngtsc/translator",
        "//packages/compiler-cli/test/helpers",
        "@npm//@types/convert-source-map",
        "@npm//convert-source-map",
        "@npm//dependency-graph",
        "@npm//magic-string",
        "@npm//sourcemap-codec",
        "@npm//typescript",
        "@npm//yargs",
    ],
)

jasmine_node_test(
    name = "test",
    bootstrap = ["//tools/testing:node_no_angular_es5"],
    data = [
        "//packages/compiler-cli/test/ngtsc/fake_core:npm_package",
    ],
    deps = [
        ":test_lib",
    ],
)

ts_library(
    name = "integration_lib",
    testonly = True,
    srcs = glob(
        ["integration/**/*.ts"],
    ),
    deps = [
        "//packages/compiler-cli/ngcc",
        "//packages/compiler-cli/ngcc/test/helpers",
        "//packages/compiler-cli/src/ngtsc/file_system",
        "//packages/compiler-cli/src/ngtsc/file_system/testing",
        "//packages/compiler-cli/src/ngtsc/logging/testing",
        "//packages/compiler-cli/src/ngtsc/testing",
        "//packages/compiler-cli/test/helpers",
        "@npm//rxjs",
        "@npm//typescript",
    ],
)

# As of version 10, the release packages do not contain esm5 output anymore. The ngcc integration
# tests intend to test ES5 features though, so we downlevel the flat esm2015 file to ES5 using
# Babel. We can then link that into the mock file system as if the Angular core package is still
# built with previous APF versions where esm5 output was shipped. This allows us to ensure that ngcc
# properly processes libraries with esm5 output.
# **Note**: We are using Babel instead of `tsc` as TypeScript does not allow us to downlevel the
# file without setting the module resolution to either `amd` or `system`. We want to preserve ES
# modules.
babel(
    name = "fesm5_angular_core",
    outs = ["fesm5_angular_core.js"],
    args = [
        "$(execpath //packages/core:npm_package)/fesm2015/core.js",
        "--presets @babel/preset-env",
        "--out-file $(execpath fesm5_angular_core.js)",
    ],
    data = [
        "//packages/core:npm_package",
        "@npm//@babel/preset-env",
    ],
)

jasmine_node_test(
    name = "integration",
    timeout = "long",
    bootstrap = ["//tools/testing:node_no_angular_es5"],
    data = [
        ":fesm5_angular_core",
        "//packages/common:npm_package",
        "//packages/core:npm_package",
        "@npm//rxjs",
    ],
    shard_count = 4,
    tags = [
        # Disabled in AOT mode because we want ngcc to compile non-AOT Angular packages.
        "no-ivy-aot",
    ],
    deps = [
        ":integration_lib",
        "@npm//canonical-path",
        "@npm//convert-source-map",
    ],
)