As of TypeScript 3.9, the tsc emit is not compatible with Closure Compiler due to https://github.com/microsoft/TypeScript/pull/32011. There is some hope that this will be fixed by a solution like the one proposed in https://github.com/microsoft/TypeScript/issues/38374 but currently it's unclear if / when that will happen. Since the Closure support has been somewhat already broken, and the tsickle pass has been a source of headaches for some time for Angular packages, we are removing it for now while we rethink our strategy to make Angular Closure compatible outside of Google. This change has no effect on our Closure compatibility within Google which work well because all the code is compiled from sources and passed through tsickle. This change only disables the tsickle pass but doesn't remove it. A follow up PR should either remove all the traces of tscikle or re-enable the fixed version. BREAKING CHANGE: Angular npm packages no longer contain jsdoc comments to support Closure Compiler's advanced optimizations The support for Closure compiler in Angular packages has been experimental and broken for quite some time. As of TS3.9 Closure is unusable with the JavaScript emit. Please follow https://github.com/microsoft/TypeScript/issues/38374 for more information and updates. If you used Closure compiler with Angular in the past, you will likely be better off consuming Angular packages built from sources directly rather than consuming the version we publish on npm which is primarily optimized for Webpack/Rollup + Terser build pipeline. As a temporary workaround you might consider using your current build pipeline with Closure flag `--compilation_level=SIMPLE`. This flag will ensure that your build pipeline produces buildable and runnable artifacts, at the cost of increased payload size due to advanced optimizations being disabled. If you were affected by this change, please help us understand your needs by leaving a comment on https://github.com/angular/angular/issues/37234. PR Close #37221
172 lines
6.2 KiB
Python
172 lines
6.2 KiB
Python
# Copyright Google Inc. All Rights Reserved.
|
|
#
|
|
# Use of this source code is governed by an MIT-style license that can be
|
|
# found in the LICENSE file at https://angular.io/license
|
|
"""Angular integration testing
|
|
"""
|
|
|
|
load("//tools/npm_integration_test:npm_integration_test.bzl", "npm_integration_test")
|
|
|
|
# The @npm packages at the root node_modules are used by integration tests
|
|
# with `file:../../node_modules/foobar` references
|
|
NPM_PACKAGE_ARCHIVES = [
|
|
"check-side-effects",
|
|
"core-js",
|
|
"google-closure-compiler",
|
|
"jasmine",
|
|
"typescript",
|
|
"rxjs",
|
|
"systemjs",
|
|
"tsickle",
|
|
"tslib",
|
|
"protractor",
|
|
"puppeteer",
|
|
"rollup",
|
|
"rollup-plugin-commonjs",
|
|
"rollup-plugin-node-resolve",
|
|
"webdriver-manager",
|
|
"@angular/cli",
|
|
"@angular-devkit/build-angular",
|
|
"@bazel/bazelisk",
|
|
"@types/jasmine",
|
|
"@types/jasminewd2",
|
|
"@types/node",
|
|
]
|
|
|
|
# The generated npm packages should ALWAYS be replaced in integration tests
|
|
# so we pass them to the `check_npm_packages` attribute of npm_integration_test
|
|
GENERATED_NPM_PACKAGES = [
|
|
"@angular/animations",
|
|
"@angular/bazel",
|
|
"@angular/benchpress",
|
|
"@angular/common",
|
|
"@angular/compiler",
|
|
"@angular/compiler-cli",
|
|
"@angular/core",
|
|
"@angular/elements",
|
|
"@angular/forms",
|
|
"@angular/language-service",
|
|
"@angular/localize",
|
|
"@angular/platform-browser",
|
|
"@angular/platform-browser-dynamic",
|
|
"@angular/platform-server",
|
|
"@angular/platform-webworker",
|
|
"@angular/platform-webworker-dynamic",
|
|
"@angular/router",
|
|
"@angular/service-worker",
|
|
"@angular/upgrade",
|
|
"zone.js",
|
|
]
|
|
|
|
def npm_package_archives():
|
|
"""Function to generate pkg_tar definitions for WORKSPACE yarn_install manual_build_file_contents"""
|
|
npm_packages_to_archive = NPM_PACKAGE_ARCHIVES
|
|
result = """load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")
|
|
"""
|
|
for name in npm_packages_to_archive:
|
|
label_name = _npm_package_archive_label(name)
|
|
last_segment_name = name if name.find("/") == -1 else name.split("/")[-1]
|
|
result += """pkg_tar(
|
|
name = "{label_name}",
|
|
srcs = ["//{name}:{last_segment_name}__all_files"],
|
|
extension = "tar.gz",
|
|
strip_prefix = "./node_modules/{name}",
|
|
# should not be built unless it is a dependency of another rule
|
|
tags = ["manual"],
|
|
)
|
|
""".format(name = name, label_name = label_name, last_segment_name = last_segment_name)
|
|
return result
|
|
|
|
def _npm_package_archive_label(package_name):
|
|
return package_name.replace("/", "_").replace("@", "") + "_archive"
|
|
|
|
def _angular_integration_test(name, **kwargs):
|
|
"Set defaults for the npm_integration_test common to the angular repo"
|
|
payload_size_tracking = kwargs.pop("payload_size_tracking", [])
|
|
pinned_npm_packages = kwargs.pop("pinned_npm_packages", [])
|
|
data = [
|
|
# We need the yarn_bin & yarn_files available at runtime
|
|
"@nodejs//:yarn_bin",
|
|
"@nodejs//:yarn_files",
|
|
]
|
|
|
|
# By default run `yarn install` followed by `yarn test` using
|
|
# the bazel managed hermetic version of yarn inside
|
|
DEFAULT_COMMANDS = [
|
|
"patch-package-json",
|
|
# Workaround https://github.com/yarnpkg/yarn/issues/2165
|
|
# Yarn will cache file://dist URIs and not update Angular code
|
|
"rm -rf ./.yarn_local_cache",
|
|
"mkdir .yarn_local_cache",
|
|
"$(rootpath @nodejs//:yarn_bin) install --cache-folder ./.yarn_local_cache",
|
|
"$(rootpath @nodejs//:yarn_bin) test",
|
|
]
|
|
|
|
commands = kwargs.pop("commands", [])
|
|
if commands == "default":
|
|
commands = DEFAULT_COMMANDS
|
|
elif commands == "payload_size_tracking":
|
|
commands = DEFAULT_COMMANDS + [
|
|
"$(rootpath @nodejs//:yarn_bin) build",
|
|
"$(rootpath //:scripts/ci/track-payload-size.sh) %s dist/*.js true ${RUNFILES}/angular/$(rootpath //goldens:size-tracking/integration-payloads.json)" % name,
|
|
]
|
|
data = data + [
|
|
"//goldens:size-tracking/integration-payloads.json",
|
|
"//:scripts/ci/track-payload-size.sh",
|
|
"//:scripts/ci/payload-size.sh",
|
|
"//:scripts/ci/payload-size.js",
|
|
]
|
|
|
|
# Complete list of npm packages to override in the test's package.json file mapped to
|
|
# tgz archive to use for the replacement. This is the full list for all integration
|
|
# tests. Any given integration does not need to use all of these packages.
|
|
npm_packages = {}
|
|
for pkg in NPM_PACKAGE_ARCHIVES:
|
|
if pkg not in pinned_npm_packages:
|
|
npm_packages["@npm//:" + _npm_package_archive_label(pkg)] = pkg
|
|
for pkg in GENERATED_NPM_PACKAGES:
|
|
last_segment_name = pkg if pkg.find("/") == -1 else pkg.split("/")[-1]
|
|
npm_packages["//packages/%s:npm_package_archive" % last_segment_name] = pkg
|
|
|
|
npm_integration_test(
|
|
name = name + "_test",
|
|
check_npm_packages = GENERATED_NPM_PACKAGES,
|
|
commands = commands,
|
|
npm_packages = npm_packages,
|
|
tags = kwargs.pop("tags", []) + [
|
|
# `integration` tag is used for filtering out these tests from the normal
|
|
# developer workflow
|
|
"integration",
|
|
# Integration do not work inside of a sandbox as they may run host applications such
|
|
# as chrome (which is run by ng) that require access to files outside of the sandbox.
|
|
"no-sandbox",
|
|
# Remote doesn't work as it needs network access right now
|
|
"no-remote-exec",
|
|
],
|
|
data = kwargs.pop("data", []) + data,
|
|
# 15-minute timeout
|
|
timeout = "long",
|
|
# Tells bazel that this test should be allocated a large amount of memory.
|
|
# See https://docs.bazel.build/versions/2.0.0/be/common-definitions.html#common-attributes-tests.
|
|
size = "enormous",
|
|
**kwargs
|
|
)
|
|
|
|
def angular_integration_test(name, **kwargs):
|
|
"Sets up the integration test target based on the test folder name"
|
|
native.filegroup(
|
|
name = "_%s_sources" % name,
|
|
srcs = native.glob(
|
|
include = ["%s/**" % name],
|
|
exclude = [
|
|
"%s/node_modules/**" % name,
|
|
"%s/.yarn_local_cache/**" % name,
|
|
],
|
|
),
|
|
)
|
|
_angular_integration_test(
|
|
name = name,
|
|
test_files = kwargs.pop("test_files", "_%s_sources" % name),
|
|
**kwargs
|
|
)
|