diff --git a/.bazelrc b/.bazelrc
index b9f08a6e1942..3a243dcd8781 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -74,6 +74,8 @@ build:release --stamp
build:snapshot --workspace_status_command="yarn -s ng-dev release build-env-stamp --mode=snapshot"
build:snapshot --stamp
+build:local --//:enable_package_json_tar_deps
+
###############################
# Output #
###############################
diff --git a/.prettierignore b/.prettierignore
index 8c38d582deaa..438c9f4edca4 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -12,4 +12,5 @@
.yarn/
dist/
third_party/
-/tests/legacy-cli/e2e/assets/9.0-project/
\ No newline at end of file
+/tests/legacy-cli/e2e/assets/9.0-project/
+/tools/test/*.json
\ No newline at end of file
diff --git a/BUILD.bazel b/BUILD.bazel
index ce0a61d81f62..d36206cd6cb9 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -2,6 +2,8 @@
#
# 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
+load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
+
package(default_visibility = ["//visibility:public"])
licenses(["notice"])
@@ -11,6 +13,7 @@ exports_files([
"tsconfig.json", # @external
"tsconfig-test.json", # @external
"tsconfig-build.json", # @external
+ "package.json",
])
# Detect if the build is running under --stamp
@@ -18,3 +21,16 @@ config_setting(
name = "stamp",
values = {"stamp": "true"},
)
+
+# If set will replace dependency versions with tarballs for packages in this repo
+bool_flag(
+ name = "enable_package_json_tar_deps",
+ build_setting_default = False,
+)
+
+config_setting(
+ name = "package_json_use_tar_deps",
+ flag_values = {
+ ":enable_package_json_tar_deps": "true",
+ },
+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ca83725eb977..c543132bdd0f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,39 @@
+
+
+# 13.1.3 (2022-01-12)
+
+### @angular/cli
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- |
+| [4c9d72c65](https://github.com/angular/angular-cli/commit/4c9d72c659d912bd9ef4590a2e88340932a96868) | fix | remove extra space in `Unable to find compatible package` during `ng add` |
+
+### @schematics/angular
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------- |
+| [9b07191b1](https://github.com/angular/angular-cli/commit/9b07191b1ccdcd2a6bb17686471acddd5862dcf5) | fix | set `skipTest` flag for resolvers when using ng new --skip-tests |
+
+### @angular-devkit/build-angular
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ |
+| [5b39e0eca](https://github.com/angular/angular-cli/commit/5b39e0eca6e8a3825f66ad6cd1818e551bf98f08) | fix | automatically purge stale build cache entries |
+| [6046e06b9](https://github.com/angular/angular-cli/commit/6046e06b926af29f89c605504f5356ec553c6390) | fix | correctly resolve `core-js/proposals/reflect-metadata` |
+| [de68daa55](https://github.com/angular/angular-cli/commit/de68daa5581dd1f257382da16704d442b540ec41) | fix | enable `:where` CSS pseudo-class |
+| [6a617ff4a](https://github.com/angular/angular-cli/commit/6a617ff4a2fe75968965dc5dcf0f3ba7bae92935) | fix | ensure `$localize` calls are replaced in watch mode |
+| [92b4e067b](https://github.com/angular/angular-cli/commit/92b4e067b24bdcd1bb7e40612b5355ce61e040ce) | fix | load translations fresh start |
+| [d674dcd1a](https://github.com/angular/angular-cli/commit/d674dcd1af409910dd4f41ac676349aee363ebdb) | fix | localized bundle generation fails in watch mode |
+| [6876ad36e](https://github.com/angular/angular-cli/commit/6876ad36efaadac5c4d371cff96c9a4cfa0e3d2b) | fix | use `contenthash` instead of `chunkhash` for chunks |
+| [11fd02105](https://github.com/angular/angular-cli/commit/11fd02105908e155c4a9c7f87e9641127cc2f378) | fix | websocket client only injected if required |
+| [6ca0e41a9](https://github.com/angular/angular-cli/commit/6ca0e41a9b54aef0a8ea626be73e06d19370f3a7) | perf | update `esbuild` to `0.14.11` |
+
+## Special Thanks
+
+Alan Agius, Bill Barry, Derek Cormier, Elio Goettelmann, Joey Perrott, Kasper Christensen, Lukas Spirig and Zoltan Lehoczky
+
+
+
# 13.1.2 (2021-12-15)
diff --git a/WORKSPACE b/WORKSPACE
index a98d2c045686..2f089fde7c90 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -5,6 +5,15 @@ workspace(
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+http_archive(
+ name = "bazel_skylib",
+ sha256 = "c6966ec828da198c5d9adbaa94c05e3a1c7f21bd012a0b29ba8ddbccb2c93b0d",
+ urls = [
+ "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz",
+ "https://github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz",
+ ],
+)
+
http_archive(
name = "build_bazel_rules_nodejs",
sha256 = "cfc289523cf1594598215901154a6c2515e8bf3671fd708264a6f6aefe02bf39",
@@ -17,6 +26,10 @@ http_archive(
urls = ["https://github.com/bazelbuild/rules_pkg/releases/download/0.5.1/rules_pkg-0.5.1.tar.gz"],
)
+load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
+
+bazel_skylib_workspace()
+
load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies")
rules_pkg_dependencies()
@@ -50,3 +63,16 @@ yarn_install(
package_json = "//:package.json",
yarn_lock = "//:yarn.lock",
)
+
+http_archive(
+ name = "aspect_bazel_lib",
+ sha256 = "534c9c61b72c257c95302d544984fd8ee63953c233292c5b6952ca5b33cd225e",
+ strip_prefix = "bazel-lib-0.4.2",
+ url = "https://github.com/aspect-build/bazel-lib/archive/v0.4.2.tar.gz",
+)
+
+load("@aspect_bazel_lib//lib:repositories.bzl", "aspect_bazel_lib_dependencies", "register_jq_toolchains")
+
+aspect_bazel_lib_dependencies()
+
+register_jq_toolchains(version = "1.6")
diff --git a/docs/design/analytics.md b/docs/design/analytics.md
index 00f5c9d91c15..a3a2785eeba5 100644
--- a/docs/design/analytics.md
+++ b/docs/design/analytics.md
@@ -98,9 +98,6 @@ Node version is our App ID, but a dimension is also used to get the numeric MAJO
# Debugging
-Using `DEBUG=universal-analytics` will report all calls to the universal-analytics library,
-including queuing events and sending them to the server.
-
Using `DEBUG=ng:analytics` will report additional information regarding initialization and
decisions made during the usage analytics process, e.g. if the user has analytics disabled.
diff --git a/package.json b/package.json
index 6c1e713685c4..8351694ba0ab 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@angular/devkit-repo",
- "version": "13.1.2",
+ "version": "13.1.3",
"private": true,
"description": "Software Development Kit for Angular",
"bin": {
@@ -139,11 +139,11 @@
"conventional-commits-parser": "^3.0.0",
"copy-webpack-plugin": "10.0.0",
"core-js": "3.19.3",
- "critters": "0.0.15",
+ "critters": "0.0.16",
"css-loader": "6.5.1",
"debug": "^4.1.1",
- "esbuild": "0.14.2",
- "esbuild-wasm": "0.14.2",
+ "esbuild": "0.14.11",
+ "esbuild-wasm": "0.14.11",
"eslint": "8.4.1",
"eslint-config-prettier": "8.3.0",
"eslint-plugin-header": "3.1.1",
@@ -205,7 +205,7 @@
"sass-loader": "12.4.0",
"sauce-connect-proxy": "https://saucelabs.com/downloads/sc-4.6.4-linux.tar.gz",
"semver": "7.3.5",
- "shelljs": "^0.8.4",
+ "shelljs": "^0.8.5",
"source-map": "0.7.3",
"source-map-loader": "3.0.0",
"source-map-support": "0.5.21",
diff --git a/packages/angular/cli/BUILD.bazel b/packages/angular/cli/BUILD.bazel
index a0c937b35a89..ba4a82bd9839 100644
--- a/packages/angular/cli/BUILD.bazel
+++ b/packages/angular/cli/BUILD.bazel
@@ -316,7 +316,14 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
+ pkg_deps = [
+ "//packages/angular_devkit/architect:package.json",
+ "//packages/angular_devkit/build_angular:package.json",
+ "//packages/angular_devkit/build_webpack:package.json",
+ "//packages/angular_devkit/core:package.json",
+ "//packages/angular_devkit/schematics:package.json",
+ "//packages/schematics/angular:package.json",
+ ],
deps = [
":README.md",
":angular-cli",
diff --git a/packages/angular/cli/commands/add-impl.ts b/packages/angular/cli/commands/add-impl.ts
index b9a520a315e0..a2cd46602e22 100644
--- a/packages/angular/cli/commands/add-impl.ts
+++ b/packages/angular/cli/commands/add-impl.ts
@@ -168,7 +168,7 @@ export class AddCommand extends SchematicCommand {
}
if (!newIdentifier) {
- spinner.warn("Unable to find compatible package. Using 'latest' tag.");
+ spinner.warn("Unable to find compatible package. Using 'latest' tag.");
} else {
packageIdentifier = newIdentifier;
spinner.succeed(
diff --git a/packages/angular/pwa/BUILD.bazel b/packages/angular/pwa/BUILD.bazel
index c86dd005ff3e..37d9e0807fbf 100644
--- a/packages/angular/pwa/BUILD.bazel
+++ b/packages/angular/pwa/BUILD.bazel
@@ -76,7 +76,10 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
+ pkg_deps = [
+ "//packages/angular_devkit/schematics:package.json",
+ "//packages/schematics/angular:package.json",
+ ],
deps = [
":README.md",
":license",
diff --git a/packages/angular_devkit/architect/BUILD.bazel b/packages/angular_devkit/architect/BUILD.bazel
index b63c471bbf5a..d59a08ff91fc 100644
--- a/packages/angular_devkit/architect/BUILD.bazel
+++ b/packages/angular_devkit/architect/BUILD.bazel
@@ -99,7 +99,9 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
+ pkg_deps = [
+ "//packages/angular_devkit/core:package.json",
+ ],
deps = [
":README.md",
":architect",
diff --git a/packages/angular_devkit/architect_cli/BUILD.bazel b/packages/angular_devkit/architect_cli/BUILD.bazel
index 762d0c34d893..19505a0fcb05 100644
--- a/packages/angular_devkit/architect_cli/BUILD.bazel
+++ b/packages/angular_devkit/architect_cli/BUILD.bazel
@@ -37,7 +37,10 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
+ pkg_deps = [
+ "//packages/angular_devkit/architect:package.json",
+ "//packages/angular_devkit/core:package.json",
+ ],
deps = [
":README.md",
":architect_cli",
diff --git a/packages/angular_devkit/benchmark/BUILD.bazel b/packages/angular_devkit/benchmark/BUILD.bazel
index 34686c5575cc..5357a92bbeb3 100644
--- a/packages/angular_devkit/benchmark/BUILD.bazel
+++ b/packages/angular_devkit/benchmark/BUILD.bazel
@@ -78,7 +78,9 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
+ pkg_deps = [
+ "//packages/angular_devkit/core:package.json",
+ ],
deps = [
"src/test/exit-code-one.js",
"src/test/fibonacci.js",
diff --git a/packages/angular_devkit/build_angular/BUILD.bazel b/packages/angular_devkit/build_angular/BUILD.bazel
index dd8a1beb977a..8e8f35af9d28 100644
--- a/packages/angular_devkit/build_angular/BUILD.bazel
+++ b/packages/angular_devkit/build_angular/BUILD.bazel
@@ -221,7 +221,11 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
+ pkg_deps = [
+ "//packages/angular_devkit/architect:package.json",
+ "//packages/angular_devkit/build_webpack:package.json",
+ "//packages/angular_devkit/core:package.json",
+ ],
deps = [
":README.md",
":build_angular",
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index 95f4e65940c0..2192596060c1 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -29,9 +29,9 @@
"circular-dependency-plugin": "5.2.2",
"copy-webpack-plugin": "10.0.0",
"core-js": "3.19.3",
- "critters": "0.0.15",
+ "critters": "0.0.16",
"css-loader": "6.5.1",
- "esbuild-wasm": "0.14.2",
+ "esbuild-wasm": "0.14.11",
"glob": "7.2.0",
"https-proxy-agent": "5.0.0",
"inquirer": "8.2.0",
@@ -72,7 +72,7 @@
"webpack-subresource-integrity": "5.0.0"
},
"optionalDependencies": {
- "esbuild": "0.14.2"
+ "esbuild": "0.14.11"
},
"peerDependencies": {
"@angular/compiler-cli": "^13.0.0 || ^13.1.0-next",
diff --git a/packages/angular_devkit/build_angular/src/babel/webpack-loader.ts b/packages/angular_devkit/build_angular/src/babel/webpack-loader.ts
index 958b0cf7f99b..3653ab20c4fc 100644
--- a/packages/angular_devkit/build_angular/src/babel/webpack-loader.ts
+++ b/packages/angular_devkit/build_angular/src/babel/webpack-loader.ts
@@ -10,6 +10,7 @@ import remapping from '@ampproject/remapping';
import { custom } from 'babel-loader';
import { ScriptTarget } from 'typescript';
import { loadEsmModule } from '../utils/load-esm';
+import { VERSION } from '../utils/package-version';
import { ApplicationPresetOptions, I18nPluginCreators } from './presets/application';
interface AngularCustomOptions extends Omit {
@@ -196,7 +197,7 @@ export default custom(() => {
...baseOptions,
...rawOptions,
cacheIdentifier: JSON.stringify({
- buildAngular: require('../../package.json').version,
+ buildAngular: VERSION,
customOptions,
baseOptions,
rawOptions,
diff --git a/packages/angular_devkit/build_angular/src/builders/browser/index.ts b/packages/angular_devkit/build_angular/src/builders/browser/index.ts
index 255c07b47f25..7aa57d8090fc 100644
--- a/packages/angular_devkit/build_angular/src/builders/browser/index.ts
+++ b/packages/angular_devkit/build_angular/src/builders/browser/index.ts
@@ -39,6 +39,7 @@ import {
import { normalizeCacheOptions } from '../../utils/normalize-cache';
import { ensureOutputPaths } from '../../utils/output-paths';
import { generateEntryPoints } from '../../utils/package-chunk-sort';
+import { purgeStaleBuildCache } from '../../utils/purge-cache';
import { augmentAppWithServiceWorker } from '../../utils/service-worker';
import { Spinner } from '../../utils/spinner';
import { getSupportedBrowsers } from '../../utils/supported-browsers';
@@ -73,6 +74,12 @@ export type BrowserBuilderOutput = json.JsonObject &
outputPath: string;
};
+/**
+ * Maximum time in milliseconds for single build/rebuild
+ * This accounts for CI variability.
+ */
+export const BUILD_TIMEOUT = 30_000;
+
async function initialize(
options: BrowserBuilderSchema,
context: BuilderContext,
@@ -157,6 +164,9 @@ export function buildWebpackBrowser(
),
);
+ // Purge old build disk cache.
+ await purgeStaleBuildCache(context);
+
checkInternetExplorerSupport(sysProjectRoot, context.logger);
return {
diff --git a/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/localize_watch_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/localize_watch_spec.ts
new file mode 100644
index 000000000000..6b1e00abab3b
--- /dev/null
+++ b/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/localize_watch_spec.ts
@@ -0,0 +1,95 @@
+/**
+ * @license
+ * Copyright Google LLC 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
+ */
+
+import { concatMap, count, take, timeout } from 'rxjs/operators';
+import { BUILD_TIMEOUT, buildWebpackBrowser } from '../../index';
+import { BASE_OPTIONS, BROWSER_BUILDER_INFO, describeBuilder } from '../setup';
+
+describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => {
+ describe('Behavior: "localize works in watch mode"', () => {
+ beforeEach(() => {
+ harness.useProject('test', {
+ root: '.',
+ sourceRoot: 'src',
+ cli: {
+ cache: {
+ enabled: false,
+ },
+ },
+ i18n: {
+ locales: {
+ 'fr': 'src/locales/messages.fr.xlf',
+ },
+ },
+ });
+ });
+
+ it('localize works in watch mode', async () => {
+ harness.useTarget('build', {
+ ...BASE_OPTIONS,
+ watch: true,
+ localize: true,
+ });
+
+ await harness.writeFile(
+ 'src/app/app.component.html',
+ `
+ Hello {{ title }}!
+ `,
+ );
+
+ await harness.writeFile('src/locales/messages.fr.xlf', TRANSLATION_FILE_CONTENT);
+
+ const buildCount = await harness
+ .execute()
+ .pipe(
+ timeout(BUILD_TIMEOUT),
+ concatMap(async ({ result }, index) => {
+ expect(result?.success).toBe(true);
+
+ switch (index) {
+ case 0: {
+ harness.expectFile('dist/fr/main.js').content.toContain('Bonjour');
+
+ // Trigger rebuild
+ await harness.appendToFile('src/app/app.component.html', '\n\n');
+ break;
+ }
+ case 1: {
+ harness.expectFile('dist/fr/main.js').content.toContain('Bonjour');
+ break;
+ }
+ }
+ }),
+ take(2),
+ count(),
+ )
+ .toPromise();
+
+ expect(buildCount).toBe(2);
+ });
+ });
+});
+
+const TRANSLATION_FILE_CONTENT = `
+
+
+
+
+
+ Bonjour !
+
+ src/app/app.component.html
+ 2,3
+
+ An introduction header for this sample
+
+
+
+
+`;
diff --git a/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts
index 6dfe95b144c9..cb553c366c80 100644
--- a/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts
+++ b/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts
@@ -8,7 +8,7 @@
import { logging } from '@angular-devkit/core';
import { concatMap, count, take, timeout } from 'rxjs/operators';
-import { buildWebpackBrowser } from '../../index';
+import { BUILD_TIMEOUT, buildWebpackBrowser } from '../../index';
import { BASE_OPTIONS, BROWSER_BUILDER_INFO, describeBuilder } from '../setup';
describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => {
@@ -70,7 +70,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => {
const buildCount = await harness
.execute({ outputLogsOnFailure: false })
.pipe(
- timeout(60000),
+ timeout(BUILD_TIMEOUT),
concatMap(async ({ result, logs }, index) => {
switch (index) {
case 0:
@@ -219,7 +219,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => {
const buildCount = await harness
.execute({ outputLogsOnFailure: false })
.pipe(
- timeout(60000),
+ timeout(BUILD_TIMEOUT),
concatMap(async ({ result, logs }, index) => {
switch (index) {
case 0:
@@ -307,7 +307,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => {
const buildCount = await harness
.execute({ outputLogsOnFailure: false })
.pipe(
- timeout(30000),
+ timeout(BUILD_TIMEOUT),
concatMap(async ({ result, logs }, index) => {
switch (index) {
case 0:
diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/index.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/index.ts
index 208c095bac90..87e48524573c 100644
--- a/packages/angular_devkit/build_angular/src/builders/dev-server/index.ts
+++ b/packages/angular_devkit/build_angular/src/builders/dev-server/index.ts
@@ -28,6 +28,7 @@ import { IndexHtmlTransform } from '../../utils/index-file/index-html-generator'
import { createTranslationLoader } from '../../utils/load-translations';
import { NormalizedCachedOptions, normalizeCacheOptions } from '../../utils/normalize-cache';
import { generateEntryPoints } from '../../utils/package-chunk-sort';
+import { purgeStaleBuildCache } from '../../utils/purge-cache';
import { assertCompatibleAngularVersion } from '../../utils/version';
import {
generateI18nBrowserWebpackConfigFromContext,
@@ -90,6 +91,9 @@ export function serveWebpackBrowser(
throw new Error('The builder requires a target.');
}
+ // Purge old build disk cache.
+ await purgeStaleBuildCache(context);
+
options.port = await checkPort(options.port ?? 4200, options.host || 'localhost');
if (options.hmr) {
@@ -374,7 +378,7 @@ async function setupLocalize(
addError(compilation, message);
},
});
- i18nLoaderOptions.translation = localeDescription.translation;
+ i18nLoaderOptions.translation = localeDescription.translation ?? {};
}
compilation.hooks.finishModules.tap('build-angular', () => {
diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/tests/behavior/build_localize_replaced_watch_spec.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/tests/behavior/build_localize_replaced_watch_spec.ts
new file mode 100644
index 000000000000..5ada84dcc828
--- /dev/null
+++ b/packages/angular_devkit/build_angular/src/builders/dev-server/tests/behavior/build_localize_replaced_watch_spec.ts
@@ -0,0 +1,82 @@
+/**
+ * @license
+ * Copyright Google LLC 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
+ */
+
+/* eslint-disable max-len */
+import fetch from 'node-fetch'; // eslint-disable-line import/no-extraneous-dependencies
+import { concatMap, count, take, timeout } from 'rxjs/operators';
+import { URL } from 'url';
+import { serveWebpackBrowser } from '../../index';
+import {
+ BASE_OPTIONS,
+ BUILD_TIMEOUT,
+ DEV_SERVER_BUILDER_INFO,
+ describeBuilder,
+ setupBrowserTarget,
+} from '../setup';
+
+describeBuilder(serveWebpackBrowser, DEV_SERVER_BUILDER_INFO, (harness) => {
+ describe('Behavior: "i18n $localize calls are replaced during watching"', () => {
+ beforeEach(() => {
+ harness.useProject('test', {
+ root: '.',
+ sourceRoot: 'src',
+ cli: {
+ cache: {
+ enabled: false,
+ },
+ },
+ i18n: {
+ sourceLocale: {
+ 'code': 'fr',
+ },
+ },
+ });
+
+ setupBrowserTarget(harness, { localize: ['fr'] });
+ });
+
+ it('$localize are replaced in watch', async () => {
+ harness.useTarget('serve', {
+ ...BASE_OPTIONS,
+ });
+
+ await harness.writeFile(
+ 'src/app/app.component.html',
+ `
+ Hello {{ title }}!
+ `,
+ );
+
+ const buildCount = await harness
+ .execute()
+ .pipe(
+ timeout(BUILD_TIMEOUT),
+ concatMap(async ({ result }, index) => {
+ expect(result?.success).toBe(true);
+
+ const response = await fetch(new URL('main.js', `${result?.baseUrl}`));
+ expect(await response?.text()).not.toContain('$localize`:');
+
+ switch (index) {
+ case 0: {
+ await harness.modifyFile('src/app/app.component.html', (content) =>
+ content.replace('introduction', 'intro'),
+ );
+ break;
+ }
+ }
+ }),
+ take(2),
+ count(),
+ )
+ .toPromise();
+
+ expect(buildCount).toBe(2);
+ });
+ });
+});
diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/tests/setup.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/tests/setup.ts
index 92cd146a40c4..a6330da2a7cb 100644
--- a/packages/angular_devkit/build_angular/src/builders/dev-server/tests/setup.ts
+++ b/packages/angular_devkit/build_angular/src/builders/dev-server/tests/setup.ts
@@ -38,7 +38,7 @@ export const BASE_OPTIONS = Object.freeze({
* Maximum time for single build/rebuild
* This accounts for CI variability.
*/
-export const BUILD_TIMEOUT = 15000;
+export const BUILD_TIMEOUT = 15_000;
/**
* Cached browser builder option schema
diff --git a/packages/angular_devkit/build_angular/src/builders/extract-i18n/index.ts b/packages/angular_devkit/build_angular/src/builders/extract-i18n/index.ts
index 169763a86767..59ca53297c68 100644
--- a/packages/angular_devkit/build_angular/src/builders/extract-i18n/index.ts
+++ b/packages/angular_devkit/build_angular/src/builders/extract-i18n/index.ts
@@ -17,6 +17,7 @@ import webpack, { Configuration } from 'webpack';
import { ExecutionTransformer } from '../../transforms';
import { createI18nOptions } from '../../utils/i18n-options';
import { loadEsmModule } from '../../utils/load-esm';
+import { purgeStaleBuildCache } from '../../utils/purge-cache';
import { assertCompatibleAngularVersion } from '../../utils/version';
import { generateBrowserWebpackConfigFromContext } from '../../utils/webpack-browser-config';
import { getCommonConfig } from '../../webpack/configs';
@@ -130,6 +131,9 @@ export async function execute(
// Check Angular version.
assertCompatibleAngularVersion(context.workspaceRoot);
+ // Purge old build disk cache.
+ await purgeStaleBuildCache(context);
+
const browserTarget = targetFromTargetString(options.browserTarget);
const browserOptions = await context.validateOptions(
await context.getTargetOptions(browserTarget),
diff --git a/packages/angular_devkit/build_angular/src/builders/karma/index.ts b/packages/angular_devkit/build_angular/src/builders/karma/index.ts
index 1bcb2a348d53..ae5dcfbff171 100644
--- a/packages/angular_devkit/build_angular/src/builders/karma/index.ts
+++ b/packages/angular_devkit/build_angular/src/builders/karma/index.ts
@@ -14,6 +14,7 @@ import { Observable, from } from 'rxjs';
import { defaultIfEmpty, switchMap } from 'rxjs/operators';
import { Configuration } from 'webpack';
import { ExecutionTransformer } from '../../transforms';
+import { purgeStaleBuildCache } from '../../utils/purge-cache';
import { assertCompatibleAngularVersion } from '../../utils/version';
import { generateBrowserWebpackConfigFromContext } from '../../utils/webpack-browser-config';
import { getCommonConfig, getStylesConfig } from '../../webpack/configs';
@@ -32,6 +33,9 @@ async function initialize(
context: BuilderContext,
webpackConfigurationTransformer?: ExecutionTransformer,
): Promise<[typeof import('karma'), Configuration]> {
+ // Purge old build disk cache.
+ await purgeStaleBuildCache(context);
+
const { config } = await generateBrowserWebpackConfigFromContext(
// only two properties are missing:
// * `outputPath` which is fixed for tests
diff --git a/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts b/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts
index 27c379a1582b..0122bce230e4 100644
--- a/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts
+++ b/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts
@@ -11,6 +11,7 @@ import { join, resolve } from 'path';
import { Observable, from, of } from 'rxjs';
import { catchError, mapTo, switchMap } from 'rxjs/operators';
import { normalizeCacheOptions } from '../../utils/normalize-cache';
+import { purgeStaleBuildCache } from '../../utils/purge-cache';
import { Schema as NgPackagrBuilderOptions } from './schema';
/**
@@ -22,6 +23,9 @@ export function execute(
): Observable {
return from(
(async () => {
+ // Purge old build disk cache.
+ await purgeStaleBuildCache(context);
+
const root = context.workspaceRoot;
const packager = (await import('ng-packagr')).ngPackagr();
diff --git a/packages/angular_devkit/build_angular/src/builders/server/index.ts b/packages/angular_devkit/build_angular/src/builders/server/index.ts
index 216050d1d5df..848d9ab1a396 100644
--- a/packages/angular_devkit/build_angular/src/builders/server/index.ts
+++ b/packages/angular_devkit/build_angular/src/builders/server/index.ts
@@ -19,6 +19,7 @@ import { NormalizedBrowserBuilderSchema, deleteOutputDir } from '../../utils';
import { i18nInlineEmittedFiles } from '../../utils/i18n-inlining';
import { I18nOptions } from '../../utils/i18n-options';
import { ensureOutputPaths } from '../../utils/output-paths';
+import { purgeStaleBuildCache } from '../../utils/purge-cache';
import { assertCompatibleAngularVersion } from '../../utils/version';
import { generateI18nBrowserWebpackConfigFromContext } from '../../utils/webpack-browser-config';
import { getCommonConfig, getStylesConfig } from '../../webpack/configs';
@@ -146,6 +147,9 @@ async function initialize(
i18n: I18nOptions;
target: ScriptTarget;
}> {
+ // Purge old build disk cache.
+ await purgeStaleBuildCache(context);
+
const originalOutputPath = options.outputPath;
const { config, i18n, target } = await generateI18nBrowserWebpackConfigFromContext(
{
diff --git a/packages/angular_devkit/build_angular/src/utils/i18n-inlining.ts b/packages/angular_devkit/build_angular/src/utils/i18n-inlining.ts
index cf30f6481811..0a563642add2 100644
--- a/packages/angular_devkit/build_angular/src/utils/i18n-inlining.ts
+++ b/packages/angular_devkit/build_angular/src/utils/i18n-inlining.ts
@@ -47,28 +47,10 @@ function emittedFilesToInlineOptions(
};
originalFiles.push(originalPath);
- // Remove temporary original file as the content has now been read
- try {
- fs.unlinkSync(originalPath);
- } catch (e) {
- context.logger.debug(
- `Unable to delete i18n temporary file [${originalPath}]: ${e.toString()}`,
- );
- }
-
try {
const originalMapPath = originalPath + '.map';
action.map = fs.readFileSync(originalMapPath, 'utf8');
originalFiles.push(originalMapPath);
-
- // Remove temporary original map file as the content has now been read
- try {
- fs.unlinkSync(originalMapPath);
- } catch (e) {
- context.logger.debug(
- `Unable to delete i18n temporary file [${originalMapPath}]: ${e.toString()}`,
- );
- }
} catch (err) {
if (err.code !== 'ENOENT') {
throw err;
diff --git a/packages/angular_devkit/build_angular/src/utils/i18n-options.ts b/packages/angular_devkit/build_angular/src/utils/i18n-options.ts
index da6652062b25..d088394bf7dc 100644
--- a/packages/angular_devkit/build_angular/src/utils/i18n-options.ts
+++ b/packages/angular_devkit/build_angular/src/utils/i18n-options.ts
@@ -248,11 +248,12 @@ export async function configureI18nBuild {
- try {
- fs.rmdirSync(tempPath, { recursive: true, maxRetries: 3 });
- } catch {}
+ process.on('exit', () => deleteTempDirectory(tempPath));
+ process.once('SIGINT', () => {
+ deleteTempDirectory(tempPath);
+
+ // Needed due to `ora` as otherwise process will not terminate.
+ process.kill(process.pid, 'SIGINT');
});
}
@@ -275,6 +276,30 @@ function findLocaleDataPath(locale: string, resolver: (locale: string) => string
}
}
+/** Remove temporary directory used for i18n processing. */
+function deleteTempDirectory(tempPath: string): void {
+ // The below should be removed and replaced with just `rmSync` when support for Node.Js 12 is removed.
+ const { rmSync, rmdirSync } = fs as typeof fs & {
+ rmSync?: (
+ path: fs.PathLike,
+ options?: {
+ force?: boolean;
+ maxRetries?: number;
+ recursive?: boolean;
+ retryDelay?: number;
+ },
+ ) => void;
+ };
+
+ try {
+ if (rmSync) {
+ rmSync(tempPath, { force: true, recursive: true, maxRetries: 3 });
+ } else {
+ rmdirSync(tempPath, { recursive: true, maxRetries: 3 });
+ }
+ } catch {}
+}
+
export function loadTranslations(
locale: string,
desc: LocaleDescription,
@@ -283,6 +308,7 @@ export function loadTranslations(
logger: { warn: (message: string) => void; error: (message: string) => void },
usedFormats?: Set,
) {
+ let translations: Record | undefined = undefined;
for (const file of desc.files) {
const loadResult = loader(path.join(workspaceRoot, file.path));
@@ -304,19 +330,20 @@ export function loadTranslations(
file.format = loadResult.format;
file.integrity = loadResult.integrity;
- if (desc.translation) {
+ if (translations) {
// Merge translations
for (const [id, message] of Object.entries(loadResult.translations)) {
- if (desc.translation[id] !== undefined) {
+ if (translations[id] !== undefined) {
logger.warn(
`WARNING [${file.path}]: Duplicate translations for message '${id}' when merging`,
);
}
- desc.translation[id] = message;
+ translations[id] = message;
}
} else {
// First or only translation file
- desc.translation = loadResult.translations;
+ translations = loadResult.translations;
}
}
+ desc.translation = translations;
}
diff --git a/packages/angular_devkit/build_angular/src/utils/index-file/inline-fonts.ts b/packages/angular_devkit/build_angular/src/utils/index-file/inline-fonts.ts
index 6d2a25263f8b..af7719687883 100644
--- a/packages/angular_devkit/build_angular/src/utils/index-file/inline-fonts.ts
+++ b/packages/angular_devkit/build_angular/src/utils/index-file/inline-fonts.ts
@@ -13,10 +13,9 @@ import proxyAgent from 'https-proxy-agent';
import { join } from 'path';
import { URL } from 'url';
import { NormalizedCachedOptions } from '../normalize-cache';
+import { VERSION } from '../package-version';
import { htmlRewritingStream } from './html-rewriting-stream';
-const packageVersion = require('../../../package.json').version;
-
interface FontProviderDetails {
preconnectUrl: string;
}
@@ -156,7 +155,7 @@ export class InlineFontsProcessor {
}
private async getResponse(url: URL): Promise {
- const key = `${packageVersion}|${url}`;
+ const key = `${VERSION}|${url}`;
if (this.cachePath) {
const entry = await cacache.get.info(this.cachePath, key);
diff --git a/packages/angular_devkit/build_angular/src/utils/normalize-cache.ts b/packages/angular_devkit/build_angular/src/utils/normalize-cache.ts
index cf3f9fc46f43..5cc6585e8735 100644
--- a/packages/angular_devkit/build_angular/src/utils/normalize-cache.ts
+++ b/packages/angular_devkit/build_angular/src/utils/normalize-cache.ts
@@ -7,12 +7,17 @@
*/
import { json } from '@angular-devkit/core';
-import { resolve } from 'path';
+import { join, resolve } from 'path';
import { cachingDisabled } from './environment-options';
+import { VERSION } from './package-version';
export interface NormalizedCachedOptions {
+ /** Whether disk cache is enabled. */
enabled: boolean;
+ /** Disk cache path. Example: `/.angular/cache/v12.0.0`. */
path: string;
+ /** Disk cache base path. Example: `/.angular/cache`. */
+ basePath: string;
}
interface CacheMetadata {
@@ -49,8 +54,11 @@ export function normalizeCacheOptions(
}
}
+ const cacheBasePath = resolve(worspaceRoot, path);
+
return {
enabled: cacheEnabled,
- path: resolve(worspaceRoot, path),
+ basePath: cacheBasePath,
+ path: join(cacheBasePath, VERSION),
};
}
diff --git a/packages/angular_devkit/build_angular/src/utils/package-version.ts b/packages/angular_devkit/build_angular/src/utils/package-version.ts
new file mode 100644
index 000000000000..4634959bd831
--- /dev/null
+++ b/packages/angular_devkit/build_angular/src/utils/package-version.ts
@@ -0,0 +1,9 @@
+/**
+ * @license
+ * Copyright Google LLC 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
+ */
+
+export const VERSION: string = require('../../package.json').version;
diff --git a/packages/angular_devkit/build_angular/src/utils/purge-cache.ts b/packages/angular_devkit/build_angular/src/utils/purge-cache.ts
new file mode 100644
index 000000000000..6f11bbd938be
--- /dev/null
+++ b/packages/angular_devkit/build_angular/src/utils/purge-cache.ts
@@ -0,0 +1,53 @@
+/**
+ * @license
+ * Copyright Google LLC 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
+ */
+
+import { BuilderContext } from '@angular-devkit/architect';
+import { PathLike, existsSync, promises as fsPromises } from 'fs';
+import { join } from 'path';
+import { normalizeCacheOptions } from './normalize-cache';
+
+/** Delete stale cache directories used by previous versions of build-angular. */
+export async function purgeStaleBuildCache(context: BuilderContext): Promise {
+ const projectName = context.target?.project;
+ if (!projectName) {
+ return;
+ }
+
+ const metadata = await context.getProjectMetadata(projectName);
+ const { basePath, path, enabled } = normalizeCacheOptions(metadata, context.workspaceRoot);
+
+ if (!enabled || !existsSync(basePath)) {
+ return;
+ }
+
+ // The below should be removed and replaced with just `rm` when support for Node.Js 12 is removed.
+ const { rm, rmdir } = fsPromises as typeof fsPromises & {
+ rm?: (
+ path: PathLike,
+ options?: {
+ force?: boolean;
+ maxRetries?: number;
+ recursive?: boolean;
+ retryDelay?: number;
+ },
+ ) => Promise;
+ };
+
+ const entriesToDelete = (await fsPromises.readdir(basePath, { withFileTypes: true }))
+ .filter((d) => join(basePath, d.name) !== path && d.isDirectory())
+ .map((d) => {
+ const subPath = join(basePath, d.name);
+ try {
+ return rm
+ ? rm(subPath, { force: true, recursive: true, maxRetries: 3 })
+ : rmdir(subPath, { recursive: true, maxRetries: 3 });
+ } catch {}
+ });
+
+ await Promise.all(entriesToDelete);
+}
diff --git a/packages/angular_devkit/build_angular/src/webpack/configs/common.ts b/packages/angular_devkit/build_angular/src/webpack/configs/common.ts
index 3d24edec28e9..b82b1eb9930b 100644
--- a/packages/angular_devkit/build_angular/src/webpack/configs/common.ts
+++ b/packages/angular_devkit/build_angular/src/webpack/configs/common.ts
@@ -125,7 +125,7 @@ export async function getCommonConfig(wco: WebpackConfigOptions): Promise = {}) {}
+ constructor(public options: JavaScriptOptimizerOptions) {}
apply(compiler: Compiler) {
const { OriginalSource, SourceMapSource } = compiler.webpack.sources;
@@ -142,22 +152,25 @@ export class JavaScriptOptimizerPlugin {
}
}
- let target = 2017;
+ let target: OptimizeRequestOptions['target'] = 2017;
if (this.options.target) {
if (this.options.target <= ScriptTarget.ES5) {
target = 5;
} else if (this.options.target < ScriptTarget.ESNext) {
- target = Number(ScriptTarget[this.options.target].slice(2));
+ target = Number(
+ ScriptTarget[this.options.target].slice(2),
+ ) as OptimizeRequestOptions['target'];
} else {
target = 2020;
}
}
// Setup the options used by all worker tasks
- const optimizeOptions = {
+ const optimizeOptions: OptimizeRequestOptions = {
sourcemap: this.options.sourcemap,
define,
keepNames: this.options.keepNames,
+ keepIdentifierNames: this.options.keepIdentifierNames,
target,
removeLicenses: this.options.removeLicenses,
advanced: this.options.advanced,
diff --git a/packages/angular_devkit/build_angular/src/webpack/plugins/javascript-optimizer-worker.ts b/packages/angular_devkit/build_angular/src/webpack/plugins/javascript-optimizer-worker.ts
index fd5dc266ba7e..9e520ea02efb 100644
--- a/packages/angular_devkit/build_angular/src/webpack/plugins/javascript-optimizer-worker.ts
+++ b/packages/angular_devkit/build_angular/src/webpack/plugins/javascript-optimizer-worker.ts
@@ -11,6 +11,52 @@ import type { TransformFailure, TransformResult } from 'esbuild';
import { minify } from 'terser';
import { EsbuildExecutor } from './esbuild-executor';
+/**
+ * The options to use when optimizing.
+ */
+export interface OptimizeRequestOptions {
+ /**
+ * Controls advanced optimizations.
+ * Currently these are only terser related:
+ * * terser compress passes are set to 2
+ * * terser pure_getters option is enabled
+ */
+ advanced?: boolean;
+ /**
+ * Specifies the string tokens that should be replaced with a defined value.
+ */
+ define?: Record;
+ /**
+ * Controls whether class, function, and variable names should be left intact
+ * throughout the output code.
+ */
+ keepIdentifierNames: boolean;
+
+ /**
+ * Controls whether to retain the original name of classes and functions.
+ */
+ keepNames: boolean;
+ /**
+ * Controls whether license text is removed from the output code.
+ * Within the CLI, this option is linked to the license extraction functionality.
+ */
+ removeLicenses?: boolean;
+ /**
+ * Controls whether source maps should be generated.
+ */
+ sourcemap?: boolean;
+ /**
+ * Specifies the target ECMAScript version for the output code.
+ */
+ target: 5 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020;
+ /**
+ * Controls whether esbuild should only use the WASM-variant instead of trying to
+ * use the native variant. Some platforms may not support the native-variant and
+ * this option allows one support test to be conducted prior to all the workers starting.
+ */
+ alwaysUseWasm: boolean;
+}
+
/**
* A request to optimize JavaScript using the supplied options.
*/
@@ -18,43 +64,7 @@ interface OptimizeRequest {
/**
* The options to use when optimizing.
*/
- options: {
- /**
- * Controls advanced optimizations.
- * Currently these are only terser related:
- * * terser compress passes are set to 2
- * * terser pure_getters option is enabled
- */
- advanced: boolean;
- /**
- * Specifies the string tokens that should be replaced with a defined value.
- */
- define?: Record;
- /**
- * Controls whether class, function, and variable names should be left intact
- * throughout the output code.
- */
- keepNames: boolean;
- /**
- * Controls whether license text is removed from the output code.
- * Within the CLI, this option is linked to the license extraction functionality.
- */
- removeLicenses: boolean;
- /**
- * Controls whether source maps should be generated.
- */
- sourcemap: boolean;
- /**
- * Specifies the target ECMAScript version for the output code.
- */
- target: 5 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020;
- /**
- * Controls whether esbuild should only use the WASM-variant instead of trying to
- * use the native variant. Some platforms may not support the native-variant and
- * this option allows one support test to be conducted prior to all the workers starting.
- */
- alwaysUseWasm: boolean;
- };
+ options: OptimizeRequestOptions;
/**
* The JavaScript asset to optimize.
@@ -142,7 +152,7 @@ async function optimizeWithEsbuild(
let result: TransformResult;
try {
result = await esbuild.transform(content, {
- minifyIdentifiers: !options.keepNames,
+ minifyIdentifiers: !options.keepIdentifierNames,
minifySyntax: true,
// NOTE: Disabling whitespace ensures unused pure annotations are kept
minifyWhitespace: false,
@@ -151,6 +161,10 @@ async function optimizeWithEsbuild(
sourcefile: name,
sourcemap: options.sourcemap && 'external',
define: options.define,
+ // This option should always be disabled for browser builds as we don't rely on `.name`
+ // and causes deadcode to be retained which makes `NG_BUILD_MANGLE` unusable to investigate tree-shaking issues.
+ // We enable `keepNames` only for server builds as Domino relies on `.name`.
+ // Once we no longer rely on Domino for SSR we should be able to remove this.
keepNames: options.keepNames,
target: `es${options.target}`,
});
@@ -193,9 +207,9 @@ async function optimizeWithEsbuild(
async function optimizeWithTerser(
name: string,
code: string,
- sourcemaps: boolean,
+ sourcemaps: boolean | undefined,
target: OptimizeRequest['options']['target'],
- advanced: boolean,
+ advanced: boolean | undefined,
): Promise<{ code: string; map?: object }> {
const result = await minify(
{ [name]: code },
@@ -207,6 +221,8 @@ async function optimizeWithTerser(
ecma: target,
// esbuild in the first pass is used to minify identifiers instead of mangle here
mangle: false,
+ // esbuild in the first pass is used to minify function names
+ keep_fnames: true,
format: {
// ASCII output is enabled here as well to prevent terser from converting back to UTF-8
ascii_only: true,
diff --git a/packages/angular_devkit/build_angular/src/webpack/utils/helpers.ts b/packages/angular_devkit/build_angular/src/webpack/utils/helpers.ts
index 4944cb0d0c4d..d8a59c72efb9 100644
--- a/packages/angular_devkit/build_angular/src/webpack/utils/helpers.ts
+++ b/packages/angular_devkit/build_angular/src/webpack/utils/helpers.ts
@@ -19,6 +19,7 @@ import {
ExtraEntryPointClass,
} from '../../builders/browser/schema';
import { WebpackConfigOptions } from '../../utils/build-options';
+import { VERSION } from '../../utils/package-version';
export interface HashFormat {
chunk: string;
@@ -32,13 +33,13 @@ export function getOutputHashFormat(option: string, length = 20): HashFormat {
none: { chunk: '', extract: '', file: '', script: '' },
media: { chunk: '', extract: '', file: `.[hash:${length}]`, script: '' },
bundles: {
- chunk: `.[chunkhash:${length}]`,
+ chunk: `.[contenthash:${length}]`,
extract: `.[contenthash:${length}]`,
file: '',
script: `.[hash:${length}]`,
},
all: {
- chunk: `.[chunkhash:${length}]`,
+ chunk: `.[contenthash:${length}]`,
extract: `.[contenthash:${length}]`,
file: `.[hash:${length}]`,
script: `.[hash:${length}]`,
@@ -122,8 +123,6 @@ export function getCacheSettings(
): WebpackOptionsNormalized['cache'] {
const { enabled, path: cacheDirectory } = wco.buildOptions.cache;
if (enabled) {
- const packageVersion = require('../../../package.json').version;
-
return {
type: 'filesystem',
profile: wco.buildOptions.verbose,
@@ -134,7 +133,7 @@ export function getCacheSettings(
// None of which are "named".
name: createHash('sha1')
.update(angularVersion)
- .update(packageVersion)
+ .update(VERSION)
.update(wco.projectRoot)
.update(JSON.stringify(wco.tsConfig))
.update(
diff --git a/packages/angular_devkit/build_optimizer/BUILD.bazel b/packages/angular_devkit/build_optimizer/BUILD.bazel
index cb7c5521ca65..eafe852cb896 100644
--- a/packages/angular_devkit/build_optimizer/BUILD.bazel
+++ b/packages/angular_devkit/build_optimizer/BUILD.bazel
@@ -68,7 +68,6 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
deps = [
":README.md",
":build_optimizer",
diff --git a/packages/angular_devkit/build_webpack/BUILD.bazel b/packages/angular_devkit/build_webpack/BUILD.bazel
index 1d45f47ef9bb..c6f9e4bd29d0 100644
--- a/packages/angular_devkit/build_webpack/BUILD.bazel
+++ b/packages/angular_devkit/build_webpack/BUILD.bazel
@@ -109,7 +109,9 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
+ pkg_deps = [
+ "//packages/angular_devkit/architect:package.json",
+ ],
deps = [
":README.md",
":build_webpack",
diff --git a/packages/angular_devkit/core/BUILD.bazel b/packages/angular_devkit/core/BUILD.bazel
index 3b62ad837e67..abf0abe9ed06 100644
--- a/packages/angular_devkit/core/BUILD.bazel
+++ b/packages/angular_devkit/core/BUILD.bazel
@@ -85,7 +85,6 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
deps = [
":README.md",
":core",
diff --git a/packages/angular_devkit/schematics/BUILD.bazel b/packages/angular_devkit/schematics/BUILD.bazel
index b46d30160dd8..0cccea0629fc 100644
--- a/packages/angular_devkit/schematics/BUILD.bazel
+++ b/packages/angular_devkit/schematics/BUILD.bazel
@@ -73,7 +73,9 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
+ pkg_deps = [
+ "//packages/angular_devkit/core:package.json",
+ ],
deps = [
":README.md",
":collection-schema.json",
diff --git a/packages/angular_devkit/schematics_cli/BUILD.bazel b/packages/angular_devkit/schematics_cli/BUILD.bazel
index 1ffe0cb979a1..57ac54222695 100644
--- a/packages/angular_devkit/schematics_cli/BUILD.bazel
+++ b/packages/angular_devkit/schematics_cli/BUILD.bazel
@@ -98,7 +98,10 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
+ pkg_deps = [
+ "//packages/angular_devkit/schematics:package.json",
+ "//packages/angular_devkit/core:package.json",
+ ],
deps = [
":README.md",
":license",
diff --git a/packages/ngtools/webpack/BUILD.bazel b/packages/ngtools/webpack/BUILD.bazel
index 5b627642a2cc..5031fd5b268a 100644
--- a/packages/ngtools/webpack/BUILD.bazel
+++ b/packages/ngtools/webpack/BUILD.bazel
@@ -76,7 +76,6 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
deps = [
":README.md",
":license",
diff --git a/packages/schematics/angular/BUILD.bazel b/packages/schematics/angular/BUILD.bazel
index 6f21b54e5021..c83b9ceb3bd3 100644
--- a/packages/schematics/angular/BUILD.bazel
+++ b/packages/schematics/angular/BUILD.bazel
@@ -140,7 +140,10 @@ genrule(
pkg_npm(
name = "npm_package",
- srcs = [":package.json"],
+ pkg_deps = [
+ "//packages/angular_devkit/schematics:package.json",
+ "//packages/angular_devkit/core:package.json",
+ ],
deps = [
"library/library-long.md",
":README.md",
diff --git a/packages/schematics/angular/application/index.ts b/packages/schematics/angular/application/index.ts
index 151d10518cca..b78dab4d8b3d 100644
--- a/packages/schematics/angular/application/index.ts
+++ b/packages/schematics/angular/application/index.ts
@@ -92,14 +92,23 @@ function addAppToWorkspaceFile(
}
if (options.skipTests || options.minimal) {
- ['class', 'component', 'directive', 'guard', 'interceptor', 'pipe', 'service'].forEach(
- (type) => {
- if (!(`@schematics/angular:${type}` in schematics)) {
- schematics[`@schematics/angular:${type}`] = {};
- }
- (schematics[`@schematics/angular:${type}`] as JsonObject).skipTests = true;
- },
- );
+ const schematicsWithTests = [
+ 'class',
+ 'component',
+ 'directive',
+ 'guard',
+ 'interceptor',
+ 'pipe',
+ 'resolver',
+ 'service',
+ ];
+
+ schematicsWithTests.forEach((type) => {
+ if (!(`@schematics/angular:${type}` in schematics)) {
+ schematics[`@schematics/angular:${type}`] = {};
+ }
+ (schematics[`@schematics/angular:${type}`] as JsonObject).skipTests = true;
+ });
}
if (options.strict) {
diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts
index a372512bb262..3c9e090c80ff 100644
--- a/packages/schematics/angular/application/index_spec.ts
+++ b/packages/schematics/angular/application/index_spec.ts
@@ -179,6 +179,24 @@ describe('Application Schematic', () => {
expect(karmaConf).toContain(`dir: require('path').join(__dirname, '../../coverage/foo')`);
});
+ it('should set the skipTests flag for other schematics when using --skipTests=true', async () => {
+ const options: ApplicationOptions = { ...defaultOptions, skipTests: true };
+ const tree = await schematicRunner
+ .runSchematicAsync('application', options, workspaceTree)
+ .toPromise();
+ const config = JSON.parse(tree.readContent('/angular.json'));
+ const schematics = config.projects.foo.schematics;
+
+ expect(schematics['@schematics/angular:class']).toEqual({ skipTests: true });
+ expect(schematics['@schematics/angular:component']).toEqual({ skipTests: true });
+ expect(schematics['@schematics/angular:directive']).toEqual({ skipTests: true });
+ expect(schematics['@schematics/angular:guard']).toEqual({ skipTests: true });
+ expect(schematics['@schematics/angular:interceptor']).toEqual({ skipTests: true });
+ expect(schematics['@schematics/angular:pipe']).toEqual({ skipTests: true });
+ expect(schematics['@schematics/angular:resolver']).toEqual({ skipTests: true });
+ expect(schematics['@schematics/angular:service']).toEqual({ skipTests: true });
+ });
+
it('minimal=true should not create e2e and test targets', async () => {
const options = { ...defaultOptions, minimal: true };
const tree = await schematicRunner
diff --git a/packages/schematics/angular/workspace/files/__dot__gitignore.template b/packages/schematics/angular/workspace/files/__dot__gitignore.template
index 105c00f22e08..0711527ef9d5 100644
--- a/packages/schematics/angular/workspace/files/__dot__gitignore.template
+++ b/packages/schematics/angular/workspace/files/__dot__gitignore.template
@@ -1,20 +1,18 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
-# compiled output
+# Compiled output
/dist
/tmp
/out-tsc
-# Only exists if Bazel was run
/bazel-out
-# dependencies
+# Node
/node_modules
-
-# profiling files
-chrome-profiler-events*.json
+npm-debug.log
+yarn-error.log
# IDEs and editors
-/.idea
+.idea/
.project
.classpath
.c9/
@@ -22,7 +20,7 @@ chrome-profiler-events*.json
.settings/
*.sublime-workspace
-# IDE - VSCode
+# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
@@ -30,17 +28,15 @@ chrome-profiler-events*.json
!.vscode/extensions.json
.history/*
-# misc
+# Miscellaneous
/.angular/cache
-/.sass-cache
+.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
-npm-debug.log
-yarn-error.log
testem.log
/typings
-# System Files
+# System files
.DS_Store
Thumbs.db
diff --git a/scripts/build-bazel.ts b/scripts/build-bazel.ts
index 8a62137bdad1..beb35eec4514 100644
--- a/scripts/build-bazel.ts
+++ b/scripts/build-bazel.ts
@@ -113,13 +113,6 @@ async function _build(logger: logging.Logger, mode: BuildMode): Promise {
+ config.cli ??= {};
+ config.cli.cache = {
+ environment: 'all',
+ enabled: true,
+ path: cachePath,
+ };
+ });
+
+ // Create a dummy stale disk cache directory.
+ await createDir(staleCachePath);
+ await expectFileToExist(staleCachePath);
+
+ await ng('build');
+ await expectFileToExist(cachePath);
+ await expectFileNotToExist(staleCachePath);
+}
diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel
index 23428d243f2f..22bdbd33f1be 100644
--- a/tools/BUILD.bazel
+++ b/tools/BUILD.bazel
@@ -7,6 +7,10 @@ load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
package(default_visibility = ["//visibility:public"])
+exports_files([
+ "package_json_release_filter.jq",
+])
+
nodejs_binary(
name = "ng_cli_schema",
data = [
diff --git a/tools/defaults.bzl b/tools/defaults.bzl
index 6b9a26df4fef..5ce1876b1c1d 100644
--- a/tools/defaults.bzl
+++ b/tools/defaults.bzl
@@ -1,9 +1,13 @@
"""Re-export of some bazel rules with repository-wide defaults."""
load("@npm//@bazel/typescript:index.bzl", _ts_library = "ts_library")
-load("@build_bazel_rules_nodejs//:index.bzl", _pkg_npm = "pkg_npm")
+load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin", _pkg_npm = "pkg_npm")
load("@rules_pkg//:pkg.bzl", "pkg_tar")
load("@npm//@angular/dev-infra-private/bazel:extract_js_module_output.bzl", "extract_js_module_output")
+load("@aspect_bazel_lib//lib:utils.bzl", "to_label")
+load("@aspect_bazel_lib//lib:jq.bzl", "jq")
+load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory")
+load("//tools:link_package_json_to_tarballs.bzl", "link_package_json_to_tarballs")
_DEFAULT_TSCONFIG = "//:tsconfig-build.json"
_DEFAULT_TSCONFIG_TEST = "//:tsconfig-test.json"
@@ -44,8 +48,20 @@ def ts_library(
**kwargs
)
-def pkg_npm(name, use_prodmode_output = False, **kwargs):
- """Default values for pkg_npm"""
+def pkg_npm(name, pkg_deps = [], use_prodmode_output = False, **kwargs):
+ """Override of pkg_npm to produce package outputs and version substitutions conventional to the angular-cli project.
+
+ Produces a package and a tar of that package. Expects a package.json file
+ in the same folder to exist.
+
+ Args:
+ name: Name of the pkg_npm rule. '_archive.tar.gz' is appended to create the tarball.
+ pkg_deps: package.json files of dependent packages. These are used for local path substitutions when --config=local is set.
+ use_prodmode_output: False to ship ES5 devmode output, True to ship ESM output. Defaults to False.
+ **kwargs: Additional arguments passed to the real pkg_npm.
+ """
+ pkg_json = ":package.json"
+
visibility = kwargs.pop("visibility", None)
common_substitutions = dict(kwargs.pop("substitutions", {}))
@@ -79,6 +95,57 @@ def pkg_npm(name, use_prodmode_output = False, **kwargs):
deps = deps,
)
+ # Merge package.json with root package.json and perform various substitutions to
+ # prepare it for release. For jq docs, see https://stedolan.github.io/jq/manual/.
+ jq(
+ name = "basic_substitutions",
+ # Note: this jq filter relies on the order of the inputs
+ # buildifier: do not sort
+ srcs = ["//:package.json", pkg_json],
+ filter_file = "//tools:package_json_release_filter.jq",
+ args = ["--slurp"],
+ out = "substituted/package.json",
+ )
+
+ # Copy package.json files to bazel-out so we can use their bazel-out paths to determine
+ # the corresponding package npm package tar.gz path for substitutions.
+ copy_to_bin(
+ name = "package_json_copy",
+ srcs = [pkg_json],
+ )
+ pkg_deps_copies = []
+ for pkg_dep in pkg_deps:
+ pkg_label = to_label(pkg_dep)
+ if pkg_label.name != "package.json":
+ fail("ERROR: only package.json files allowed in pkg_deps of pkg_npm macro")
+ pkg_deps_copies.append("@%s//%s:package_json_copy" % (pkg_label.workspace_name, pkg_label.package))
+
+ # Substitute dependencies on other packages in this repo with tarballs.
+ link_package_json_to_tarballs(
+ name = "tar_substitutions",
+ src = "substituted/package.json",
+ pkg_deps = [":package_json_copy"] + pkg_deps_copies,
+ out = "substituted_with_tars/package.json",
+ )
+
+ # Move the generated package.json along with other deps into a directory for pkg_npm
+ # to package up because pkg_npm requires that all inputs be in the same directory.
+ copy_to_directory(
+ name = "package",
+ srcs = select({
+ # Do tar substitution if config_setting 'package_json_use_tar_deps' is true (local builds)
+ "//:package_json_use_tar_deps": [":%s_js_module_output" % name, "substituted_with_tars/package.json"],
+ "//conditions:default": [":%s_js_module_output" % name, "substituted/package.json"],
+ }),
+ replace_prefixes = {
+ "substituted_with_tars/": "",
+ "substituted/": "",
+ },
+ exclude_prefixes = [
+ "packages", # Exclude compiled outputs of dependent packages
+ ],
+ )
+
_pkg_npm(
name = name,
# We never set a `package_name` for NPM packages, neither do we enable validation.
@@ -101,7 +168,7 @@ def pkg_npm(name, use_prodmode_output = False, **kwargs):
"//conditions:default": substitutions,
}),
visibility = visibility,
- deps = [":%s_js_module_output" % name],
+ nested_packages = ["package"],
tgz = None,
**kwargs
)
diff --git a/tools/link_package_json_to_tarballs.bzl b/tools/link_package_json_to_tarballs.bzl
new file mode 100644
index 000000000000..809e3a50add9
--- /dev/null
+++ b/tools/link_package_json_to_tarballs.bzl
@@ -0,0 +1,87 @@
+# 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
+load("@aspect_bazel_lib//lib:jq.bzl", "jq")
+load("@aspect_bazel_lib//lib:utils.bzl", "to_label")
+
+def link_package_json_to_tarballs(name, src, pkg_deps, out):
+ """Substitute tar paths into a package.json file for the packages it depends on.
+
+ src and pkg_deps must be labels in the bazel-out tree for the derived path to the npm_package_archive.tar.gz to be correct.
+
+ Args:
+ name: Name of the rule
+ src: package.json file to perform substitions on
+ pkg_deps: package.json files of dependencies to substitute
+ out: Output package.json file
+ """
+
+ src_pkg = to_label(src).package
+
+ # Generate partial jq filters for each dependent package that, when run
+ # against a package.json file, can replace its dependency with a tar path.
+ filter_files = []
+ for i, pkg_dep in enumerate(pkg_deps):
+ pkg_dep_name = "%s_%s.name" % (name, i)
+ pkg_dep_filter = "%s_%s.filter" % (name, i)
+ jq(
+ name = "%s_%s_name" % (name, i),
+ srcs = [pkg_dep],
+ filter = ".name",
+ out = pkg_dep_name,
+ )
+
+ srcs = [
+ pkg_dep_name,
+ pkg_dep,
+ ]
+
+ # Add dependent tars as srcs to include them in the dependency graph, except
+ # for the tar for this package as that would create a circular dependency.
+ pkg_label = to_label(pkg_dep)
+ if pkg_label.package != src_pkg:
+ pkg_tar = "@%s//%s:npm_package_archive.tar.gz" % (pkg_label.workspace_name, pkg_label.package)
+ srcs.append(pkg_tar)
+
+ # Deriving the absolute path to the tar in the execroot requries different
+ # commands depending on whether or not the action is sandboxed.
+ abs_path_sandbox = "readlink $(execpath {pkg_dep})".format(pkg_dep = pkg_dep)
+ abs_path_nosandbox = "(cd $$(dirname $(execpath {pkg_dep})) && pwd)".format(pkg_dep = pkg_dep)
+
+ native.genrule(
+ name = "%s_%s_filter" % (name, i),
+ srcs = srcs,
+ cmd = """
+ TAR=$$(dirname $$({abs_path_sandbox} || {abs_path_nosandbox}))/npm_package_archive.tar.gz
+ PKGNAME=$$(cat $(execpath {pkg_name}))
+ if [[ "$$TAR" != *bazel-out* ]]; then
+ echo "ERROR: package.json passed to substitute_tar_deps must be in the output tree. You can use copy_to_bin to copy a source file to the output tree."
+ exit 1
+ fi
+ echo "(..|objects|select(has($${{PKGNAME}})))[$${{PKGNAME}}] |= \\"file:$${{TAR}}\\"" > $@
+ """.format(
+ pkg_name = pkg_dep_name,
+ abs_path_sandbox = abs_path_sandbox,
+ abs_path_nosandbox = abs_path_nosandbox,
+ ),
+ outs = [pkg_dep_filter],
+ )
+ filter_files.append(pkg_dep_filter)
+
+ # Combine all of the filter files into a single filter by joining with |
+ filter = "%s.filter" % name
+ native.genrule(
+ name = "%s_filter" % name,
+ srcs = filter_files,
+ cmd = "cat $(SRCS) | sed '$$!s#$$# |#' > $@",
+ outs = [filter],
+ )
+
+ # Generate final package.json with tar substitutions using the above filter
+ jq(
+ name = name,
+ srcs = [src],
+ filter_file = filter,
+ out = out,
+ )
diff --git a/tools/package_json_release_filter.jq b/tools/package_json_release_filter.jq
new file mode 100644
index 000000000000..e025697e1fc3
--- /dev/null
+++ b/tools/package_json_release_filter.jq
@@ -0,0 +1,32 @@
+# 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
+#
+# This filter combines a subproject package.json with the root package.json
+# and performs substitutions to prepare it for release. It should be called
+# with the --slurp argument and be passed the root pacakge.json followed by
+# the subproject package.json.
+#
+# See jq docs for filter syntax: https://stedolan.github.io/jq/manual/.
+
+.[0] as $root
+| .[1] as $proj
+
+# Get the fields from root package.json that should override the project
+# package.json, i.e., every field except the following
+| ($root
+ | del(.bin, .description, .dependencies, .name, .main, .peerDependencies, .optionalDependencies, .typings, .version, .private, .workspaces, .resolutions, .scripts, .["ng-update"])
+) as $root_overrides
+
+# Use the project package.json as a base and override other fields from root
+| $proj + $root_overrides
+
+# Combine keywords from both
+| .keywords = ($root.keywords + $proj.keywords | unique)
+
+# Remove devDependencies
+| del(.devDependencies)
+
+# Add engines
++ {"engines": {"node": "^12.20.0 || ^14.15.0 || >=16.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0"}}
\ No newline at end of file
diff --git a/tools/test/BUILD.bazel b/tools/test/BUILD.bazel
new file mode 100644
index 000000000000..2e651ae3e654
--- /dev/null
+++ b/tools/test/BUILD.bazel
@@ -0,0 +1,32 @@
+load("@bazel_skylib//rules:diff_test.bzl", "diff_test")
+load("@aspect_bazel_lib//lib:jq.bzl", "jq")
+
+jq(
+ name = "final_package_json",
+ # This jq filter relies on the order of the inputs
+ # buildifier: do not sort
+ srcs = [
+ "root_package.json",
+ "project_package.json",
+ ],
+ args = [
+ "--slurp",
+ ],
+ filter_file = "//tools:package_json_release_filter.jq",
+)
+
+# jq outputs CR on windows https://github.com/stedolan/jq/issues/92
+# strip the CRs to do a correct comparison on all platforms
+genrule(
+ name = "final_package_json_cr_stripped",
+ srcs = [":final_package_json"],
+ outs = ["final_package_json_cr_stripped.json"],
+ cmd = "cat $(execpath :final_package_json) | sed \"s#\\r##\" > $@",
+)
+
+# Test correctness of the filter that prepares each project's package.json file for release
+diff_test(
+ name = "package_json_filter_test",
+ file1 = "expected_package.json",
+ file2 = ":final_package_json_cr_stripped",
+)
diff --git a/tools/test/expected_package.json b/tools/test/expected_package.json
new file mode 100644
index 000000000000..b0df6c051c75
--- /dev/null
+++ b/tools/test/expected_package.json
@@ -0,0 +1,42 @@
+{
+ "name": "project",
+ "version": "0.0.0-SNAPSHOT",
+ "description": "Project package.json",
+ "main": "project/index.js",
+ "bin": {
+ "projectfoo": "./bin/project-foo.js"
+ },
+ "keywords": [
+ "a",
+ "b",
+ "c"
+ ],
+ "scripts": {
+ "build": "node project-build-script"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/angular/angular-cli.git"
+ },
+ "author": "Angular Authors",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/angular/angular-cli/issues"
+ },
+ "homepage": "https://github.com/angular/angular-cli",
+ "dependencies": {
+ "@project/foo": "1.0.0",
+ "@project/bar": "2.0.0"
+ },
+ "ng-update": {
+ "migrations": "@project/migration-collection.json",
+ "packageGroup": {
+ "@project/abc": "0.0.0"
+ }
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.15.0 || >=16.10.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ }
+}
diff --git a/tools/test/project_package.json b/tools/test/project_package.json
new file mode 100644
index 000000000000..894c9f4cf3f2
--- /dev/null
+++ b/tools/test/project_package.json
@@ -0,0 +1,39 @@
+{
+ "name": "project",
+ "version": "0.0.0-SNAPSHOT",
+ "description": "Project package.json",
+ "main": "project/index.js",
+ "bin": {
+ "projectfoo": "./bin/project-foo.js"
+ },
+ "keywords": [
+ "b",
+ "c"
+ ],
+ "scripts": {
+ "build": "node project-build-script"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/angular/angular-cli.git"
+ },
+ "author": "Angular Authors",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/angular/angular-cli/issues"
+ },
+ "homepage": "https://github.com/angular/angular-cli",
+ "dependencies": {
+ "@project/foo": "1.0.0",
+ "@project/bar": "2.0.0"
+ },
+ "devDependencies": {
+ "@project/devdep": "1.2.3"
+ },
+ "ng-update": {
+ "migrations": "@project/migration-collection.json",
+ "packageGroup": {
+ "@project/abc": "0.0.0"
+ }
+ }
+}
diff --git a/tools/test/root_package.json b/tools/test/root_package.json
new file mode 100644
index 000000000000..e0b263aef042
--- /dev/null
+++ b/tools/test/root_package.json
@@ -0,0 +1,37 @@
+{
+ "name": "root",
+ "version": "1.0.0-next.1",
+ "private": true,
+ "description": "Root package.json",
+ "bin": {
+ "root-foo": "./bin/root-foo.js",
+ "root-bar": "./bin/root-bar.js"
+ },
+ "keywords": [
+ "a",
+ "b"
+ ],
+ "scripts": {
+ "build": "node root-build-script"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/angular/angular-cli.git"
+ },
+ "author": "Angular Authors",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/angular/angular-cli/issues"
+ },
+ "homepage": "https://github.com/angular/angular-cli",
+ "workspaces": {
+ "packages": ["packages/root/foo/*", "packages/root/bar/*"]
+ },
+ "resolutions": {
+ "root/foo/bar": "1.0.0"
+ },
+ "devDependencies": {
+ "@root/foo": "1.0.0",
+ "@root/bar": "2.0.0"
+ }
+}
diff --git a/yarn.lock b/yarn.lock
index 3b08ea88b06f..808af0609d97 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4086,13 +4086,13 @@ critters@0.0.14:
postcss "^8.3.7"
pretty-bytes "^5.3.0"
-critters@0.0.15:
- version "0.0.15"
- resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.15.tgz#b1c8d18fd18e614471733d7d749deac0f386b738"
- integrity sha512-AE7hkXb3eZUbEvS1SKZa+OU4o2kUOXtzVeE/2E/mjU/0mV1wpBT1HfUCWVRS4zwvkBNJ0AQYsVjAoFm+kIhfdw==
+critters@0.0.16:
+ version "0.0.16"
+ resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.16.tgz#ffa2c5561a65b43c53b940036237ce72dcebfe93"
+ integrity sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==
dependencies:
chalk "^4.1.0"
- css-select "^4.1.3"
+ css-select "^4.2.0"
parse5 "^6.0.1"
parse5-htmlparser2-tree-adapter "^6.0.1"
postcss "^8.3.7"
@@ -4168,7 +4168,18 @@ css-select@^4.1.3:
domutils "^2.6.0"
nth-check "^2.0.0"
-css-what@^5.0.0:
+css-select@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd"
+ integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^5.1.0"
+ domhandler "^4.3.0"
+ domutils "^2.8.0"
+ nth-check "^2.0.1"
+
+css-what@^5.0.0, css-what@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe"
integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==
@@ -4548,7 +4559,7 @@ domexception@^1.0.1:
dependencies:
webidl-conversions "^4.0.2"
-domhandler@^4.2.0:
+domhandler@^4.2.0, domhandler@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626"
integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==
@@ -4565,7 +4576,7 @@ dompurify@^2.2.6:
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.4.tgz#1cf5cf0105ccb4debdf6db162525bd41e6ddacc6"
integrity sha512-6BVcgOAVFXjI0JTjEvZy901Rghm+7fDQOrNIcxB4+gdhj6Kwp6T9VBhBY/AbagKHJocRkDYGd6wvI+p4/10xtQ==
-domutils@^2.6.0:
+domutils@^2.6.0, domutils@^2.8.0:
version "2.8.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
@@ -4817,6 +4828,11 @@ esbuild-android-arm64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.12.tgz#e1f199dc05405cdc6670c00fb6c793822bf8ae4c"
integrity sha512-TSVZVrb4EIXz6KaYjXfTzPyyRpXV5zgYIADXtQsIenjZ78myvDGaPi11o4ZSaHIwFHsuwkB6ne5SZRBwAQ7maw==
+esbuild-android-arm64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.11.tgz#b8b34e35a5b43880664ac7a3fbc70243d7ed894f"
+ integrity sha512-6iHjgvMnC/SzDH8TefL+/3lgCjYWwAd1LixYfmz/TBPbDQlxcuSkX0yiQgcJB9k+ibZ54yjVXziIwGdlc+6WNw==
+
esbuild-android-arm64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.2.tgz#256b7cf2f9d382a2a92a4ff4e13187587c9b7c6a"
@@ -4827,6 +4843,11 @@ esbuild-darwin-64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.13.12.tgz#f5c59e622955c01f050e5a7ac9c1d41db714b94d"
integrity sha512-c51C+N+UHySoV2lgfWSwwmlnLnL0JWj/LzuZt9Ltk9ub1s2Y8cr6SQV5W3mqVH1egUceew6KZ8GyI4nwu+fhsw==
+esbuild-darwin-64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.11.tgz#ba805de98c0412e50fcd0636451797da157b0625"
+ integrity sha512-olq84ikh6TiBcrs3FnM4eR5VPPlcJcdW8BnUz/lNoEWYifYQ+Po5DuYV1oz1CTFMw4k6bQIZl8T3yxL+ZT2uvQ==
+
esbuild-darwin-64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.2.tgz#891a59ce6bc3aded0265f982469b3eb9571b92f8"
@@ -4837,6 +4858,11 @@ esbuild-darwin-arm64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.12.tgz#8abae74c2956a8aa568fc52c78829338c4a4b988"
integrity sha512-JvAMtshP45Hd8A8wOzjkY1xAnTKTYuP/QUaKp5eUQGX+76GIie3fCdUUr2ZEKdvpSImNqxiZSIMziEiGB5oUmQ==
+esbuild-darwin-arm64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.11.tgz#4d3573e448af76ce33e16231f3d9f878542d6fe8"
+ integrity sha512-Jj0ieWLREPBYr/TZJrb2GFH8PVzDqiQWavo1pOFFShrcmHWDBDrlDxPzEZ67NF/Un3t6sNNmeI1TUS/fe1xARg==
+
esbuild-darwin-arm64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.2.tgz#ab834fffa9c612b2901ca1e77e4695d4d8aa63a2"
@@ -4847,6 +4873,11 @@ esbuild-freebsd-64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.12.tgz#6ad2ab8c0364ee7dd2d6e324d876a8e60ae75d12"
integrity sha512-r6On/Skv9f0ZjTu6PW5o7pdXr8aOgtFOEURJZYf1XAJs0IQ+gW+o1DzXjVkIoT+n1cm3N/t1KRJfX71MPg/ZUA==
+esbuild-freebsd-64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.11.tgz#9294e6ab359ec93590ab097b0f2017de7c78ab4d"
+ integrity sha512-C5sT3/XIztxxz/zwDjPRHyzj/NJFOnakAanXuyfLDwhwupKPd76/PPHHyJx6Po6NI6PomgVp/zi6GRB8PfrOTA==
+
esbuild-freebsd-64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.2.tgz#f7fc87a83f02de27d5a48472571efa1a432ae86d"
@@ -4857,6 +4888,11 @@ esbuild-freebsd-arm64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.12.tgz#6f38155f4c300ac4c8adde1fde3cc6a4440a8294"
integrity sha512-F6LmI2Q1gii073kmBE3NOTt/6zLL5zvZsxNLF8PMAwdHc+iBhD1vzfI8uQZMJA1IgXa3ocr3L3DJH9fLGXy6Yw==
+esbuild-freebsd-arm64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.11.tgz#ae3e0b09173350b66cf8321583c9a1c1fcb8bb55"
+ integrity sha512-y3Llu4wbs0bk4cwjsdAtVOesXb6JkdfZDLKMt+v1U3tOEPBdSu6w8796VTksJgPfqvpX22JmPLClls0h5p+L9w==
+
esbuild-freebsd-arm64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.2.tgz#bc8758420431106751f3180293cac0b5bc4ce2ee"
@@ -4867,6 +4903,11 @@ esbuild-linux-32@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.13.12.tgz#b1d15e330188a8c21de75c3f0058628a3eefade7"
integrity sha512-U1UZwG3UIwF7/V4tCVAo/nkBV9ag5KJiJTt+gaCmLVWH3bPLX7y+fNlhIWZy8raTMnXhMKfaTvWZ9TtmXzvkuQ==
+esbuild-linux-32@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.11.tgz#ddadbc7038aa5a6b1675bb1503cf79a0cbf1229a"
+ integrity sha512-Cg3nVsxArjyLke9EuwictFF3Sva+UlDTwHIuIyx8qpxRYAOUTmxr2LzYrhHyTcGOleLGXUXYsnUVwKqnKAgkcg==
+
esbuild-linux-32@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.2.tgz#0cc2dcd816d6d66e255bc7aeac139b1d04246812"
@@ -4877,6 +4918,11 @@ esbuild-linux-64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.13.12.tgz#25bd64b66162b02348e32d8f12e4c9ee61f1d070"
integrity sha512-YpXSwtu2NxN3N4ifJxEdsgd6Q5d8LYqskrAwjmoCT6yQnEHJSF5uWcxv783HWN7lnGpJi9KUtDvYsnMdyGw71Q==
+esbuild-linux-64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.11.tgz#d698e3ce3a231ddfeec6b5df8c546ae8883fcd88"
+ integrity sha512-oeR6dIrrojr8DKVrxtH3xl4eencmjsgI6kPkDCRIIFwv4p+K7ySviM85K66BN01oLjzthpUMvBVfWSJkBLeRbg==
+
esbuild-linux-64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.2.tgz#c790f739aa75b15c153609ea3457153fbe4db93d"
@@ -4887,6 +4933,11 @@ esbuild-linux-arm64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.12.tgz#ba582298457cc5c9ac823a275de117620c06537f"
integrity sha512-sgDNb8kb3BVodtAlcFGgwk+43KFCYjnFOaOfJibXnnIojNWuJHpL6aQJ4mumzNWw8Rt1xEtDQyuGK9f+Y24jGA==
+esbuild-linux-arm64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.11.tgz#85faea9fa99ad355b5e3b283197a4dfd0a110fe7"
+ integrity sha512-+e6ZCgTFQYZlmg2OqLkg1jHLYtkNDksxWDBWNtI4XG4WxuOCUErLqfEt9qWjvzK3XBcCzHImrajkUjO+rRkbMg==
+
esbuild-linux-arm64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.2.tgz#96858a1f89ad30274dec780d0e3dd8b5691c6b0c"
@@ -4897,6 +4948,11 @@ esbuild-linux-arm@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.13.12.tgz#6bc81c957bff22725688cc6359c29a25765be09b"
integrity sha512-SyiT/JKxU6J+DY2qUiSLZJqCAftIt3uoGejZ0HDnUM2MGJqEGSGh7p1ecVL2gna3PxS4P+j6WAehCwgkBPXNIw==
+esbuild-linux-arm@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.11.tgz#74cbcf0b8a22c8401bcbcd6ebd4cbf2baca8b7b4"
+ integrity sha512-vcwskfD9g0tojux/ZaTJptJQU3a7YgTYsptK1y6LQ/rJmw7U5QJvboNawqM98Ca3ToYEucfCRGbl66OTNtp6KQ==
+
esbuild-linux-arm@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.2.tgz#03e193225afa9b1215d2ec6efe8edf0c03eeed6f"
@@ -4907,6 +4963,11 @@ esbuild-linux-mips64le@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.12.tgz#ef3c4aba3e585d847cbade5945a8b4a5c62c7ce2"
integrity sha512-qQJHlZBG+QwVIA8AbTEtbvF084QgDi4DaUsUnA+EolY1bxrG+UyOuGflM2ZritGhfS/k7THFjJbjH2wIeoKA2g==
+esbuild-linux-mips64le@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.11.tgz#490429211a3233f5cbbd8575b7758b897e42979a"
+ integrity sha512-Rrs99L+p54vepmXIb87xTG6ukrQv+CzrM8eoeR+r/OFL2Rg8RlyEtCeshXJ2+Q66MXZOgPJaokXJZb9snq28bw==
+
esbuild-linux-mips64le@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.2.tgz#972f218d2cb5125237376d40ad60a6e5356a782c"
@@ -4917,16 +4978,31 @@ esbuild-linux-ppc64le@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.12.tgz#a21fb64e80c38bef06122e48283990fc6db578e1"
integrity sha512-2dSnm1ldL7Lppwlo04CGQUpwNn5hGqXI38OzaoPOkRsBRWFBozyGxTFSee/zHFS+Pdh3b28JJbRK3owrrRgWNw==
+esbuild-linux-ppc64le@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.11.tgz#fc79d60710213b5b98345f5b138d48245616827a"
+ integrity sha512-JyzziGAI0D30Vyzt0HDihp4s1IUtJ3ssV2zx9O/c+U/dhUHVP2TmlYjzCfCr2Q6mwXTeloDcLS4qkyvJtYptdQ==
+
esbuild-linux-ppc64le@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.2.tgz#20b71622ac09142b0e523f633af0829def7fed6b"
integrity sha512-vxptskw8JfCDD9QqpRO0XnsM1osuWeRjPaXX1TwdveLogYsbdFtcuiuK/4FxGiNMUr1ojtnCS2rMPbY8puc5NA==
+esbuild-linux-s390x@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.11.tgz#ca4b93556bbba6cc95b0644f2ee93c982165ba07"
+ integrity sha512-DoThrkzunZ1nfRGoDN6REwmo8ZZWHd2ztniPVIR5RMw/Il9wiWEYBahb8jnMzQaSOxBsGp0PbyJeVLTUatnlcw==
+
esbuild-netbsd-64@0.13.12:
version "0.13.12"
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.12.tgz#1ea7fc8cfce88a20a4047b867ef184049a6641ae"
integrity sha512-D4raxr02dcRiQNbxOLzpqBzcJNFAdsDNxjUbKkDMZBkL54Z0vZh4LRndycdZAMcIdizC/l/Yp/ZsBdAFxc5nbA==
+esbuild-netbsd-64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.11.tgz#edb340bc6653c88804cac2253e21b74258fce165"
+ integrity sha512-12luoRQz+6eihKYh1zjrw0CBa2aw3twIiHV/FAfjh2NEBDgJQOY4WCEUEN+Rgon7xmLh4XUxCQjnwrvf8zhACw==
+
esbuild-netbsd-64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.2.tgz#dbd6a25117902ef67aa11d8779dd9c6bca7fbe82"
@@ -4937,6 +5013,11 @@ esbuild-openbsd-64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.12.tgz#adde32f2f1b05dc4bd4fc544d6ea5a4379f9ca4d"
integrity sha512-KuLCmYMb2kh05QuPJ+va60bKIH5wHL8ypDkmpy47lzwmdxNsuySeCMHuTv5o2Af1RUn5KLO5ZxaZeq4GEY7DaQ==
+esbuild-openbsd-64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.11.tgz#caeff5f946f79a60ce7bcf88871ca4c71d3476e8"
+ integrity sha512-l18TZDjmvwW6cDeR4fmizNoxndyDHamGOOAenwI4SOJbzlJmwfr0jUgjbaXCUuYVOA964siw+Ix+A+bhALWg8Q==
+
esbuild-openbsd-64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.2.tgz#3c5f199eed459b2f88865548394c0b77383d9ca4"
@@ -4947,6 +5028,11 @@ esbuild-sunos-64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.13.12.tgz#a7ecaf52b7364fbee76dc8aa707fa3e1cff3342c"
integrity sha512-jBsF+e0woK3miKI8ufGWKG3o3rY9DpHvCVRn5eburMIIE+2c+y3IZ1srsthKyKI6kkXLvV4Cf/E7w56kLipMXw==
+esbuild-sunos-64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.11.tgz#90ce7e1749c2958a53509b4bae7b8f7d98f276d6"
+ integrity sha512-bmYzDtwASBB8c+0/HVOAiE9diR7+8zLm/i3kEojUH2z0aIs6x/S4KiTuT5/0VKJ4zk69kXel1cNWlHBMkmavQg==
+
esbuild-sunos-64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.2.tgz#900a681db6b76c6a7f60fc28d2bfe5b11698641c"
@@ -4957,7 +5043,12 @@ esbuild-wasm@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.13.12.tgz#1f78316c12e66ca7dffded832d5a9630b34b7657"
integrity sha512-eGdiSewbnJffEvyA0qQmr+w3HurBMVp4QhOfICzeeoL9naC8qC3PFaw6hZaqSgks5DXnQONtUGUFLsX3eXpq8A==
-esbuild-wasm@0.14.2, esbuild-wasm@^0.14.0:
+esbuild-wasm@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.14.11.tgz#bd09f4c42969cddcae39007d284f8ef747aae85d"
+ integrity sha512-9e1R6hv0hiU+BkJI2edqUuWfXUbOP2Mox+Ijl/uY1vLLlSsunkrcADqD/4Rz+VCEDzw6ecscJM+uJqR2fRmEUg==
+
+esbuild-wasm@^0.14.0:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.14.2.tgz#49c59c610a0be48becec87a7d9019d143468f2f9"
integrity sha512-Rs8NjWoo1UdsVjhxT2o6kLCX9Sh65pyd3/h4XeJ3jjQNM6NgL+/CSowuJgvOIjDAXMLXpc6fdGnyZQDil9IUJA==
@@ -4967,6 +5058,11 @@ esbuild-windows-32@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.13.12.tgz#a8756033dc905c4b7bea19be69f7ee68809f8770"
integrity sha512-L9m4lLFQrFeR7F+eLZXG82SbXZfUhyfu6CexZEil6vm+lc7GDCE0Q8DiNutkpzjv1+RAbIGVva9muItQ7HVTkQ==
+esbuild-windows-32@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.11.tgz#d067f4ce15b29efba6336e6a23597120fafe49ec"
+ integrity sha512-J1Ys5hMid8QgdY00OBvIolXgCQn1ARhYtxPnG6ESWNTty3ashtc4+As5nTrsErnv8ZGUcWZe4WzTP/DmEVX1UQ==
+
esbuild-windows-32@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.2.tgz#61e0ba5bd95b277a55d2b997ac4c04dfe2559220"
@@ -4977,6 +5073,11 @@ esbuild-windows-64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.13.12.tgz#ae694aa66ca078acb8509b2da31197ed1f40f798"
integrity sha512-k4tX4uJlSbSkfs78W5d9+I9gpd+7N95W7H2bgOMFPsYREVJs31+Q2gLLHlsnlY95zBoPQMIzHooUIsixQIBjaQ==
+esbuild-windows-64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.11.tgz#13e86dd37a6cd61a5276fa2d271342d0f74da864"
+ integrity sha512-h9FmMskMuGeN/9G9+LlHPAoiQk9jlKDUn9yA0MpiGzwLa82E7r1b1u+h2a+InprbSnSLxDq/7p5YGtYVO85Mlg==
+
esbuild-windows-64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.2.tgz#6ab59ef721ff75c682a1c8ae0570dabb637abddb"
@@ -4987,6 +5088,11 @@ esbuild-windows-arm64@0.13.12:
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.12.tgz#782c5a8bd6d717ea55aaafe648f9926ca36a4a88"
integrity sha512-2tTv/BpYRIvuwHpp2M960nG7uvL+d78LFW/ikPItO+2GfK51CswIKSetSpDii+cjz8e9iSPgs+BU4o8nWICBwQ==
+esbuild-windows-arm64@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.11.tgz#e8edfdf1d712085e6dc3fba18a0c225aaae32b75"
+ integrity sha512-dZp7Krv13KpwKklt9/1vBFBMqxEQIO6ri7Azf8C+ob4zOegpJmha2XY9VVWP/OyQ0OWk6cEeIzMJwInRZrzBUQ==
+
esbuild-windows-arm64@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.2.tgz#aca2a4f83d2f0d1592ad4be832ed0045fc888cda"
@@ -5015,7 +5121,31 @@ esbuild@0.13.12:
esbuild-windows-64 "0.13.12"
esbuild-windows-arm64 "0.13.12"
-esbuild@0.14.2, esbuild@^0.14.0:
+esbuild@0.14.11:
+ version "0.14.11"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.11.tgz#ac4acb78907874832afb704c3afe58ad37715c27"
+ integrity sha512-xZvPtVj6yecnDeFb3KjjCM6i7B5TCAQZT77kkW/CpXTMnd6VLnRPKrUB1XHI1pSq6a4Zcy3BGueQ8VljqjDGCg==
+ optionalDependencies:
+ esbuild-android-arm64 "0.14.11"
+ esbuild-darwin-64 "0.14.11"
+ esbuild-darwin-arm64 "0.14.11"
+ esbuild-freebsd-64 "0.14.11"
+ esbuild-freebsd-arm64 "0.14.11"
+ esbuild-linux-32 "0.14.11"
+ esbuild-linux-64 "0.14.11"
+ esbuild-linux-arm "0.14.11"
+ esbuild-linux-arm64 "0.14.11"
+ esbuild-linux-mips64le "0.14.11"
+ esbuild-linux-ppc64le "0.14.11"
+ esbuild-linux-s390x "0.14.11"
+ esbuild-netbsd-64 "0.14.11"
+ esbuild-openbsd-64 "0.14.11"
+ esbuild-sunos-64 "0.14.11"
+ esbuild-windows-32 "0.14.11"
+ esbuild-windows-64 "0.14.11"
+ esbuild-windows-arm64 "0.14.11"
+
+esbuild@^0.14.0:
version "0.14.2"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.2.tgz#9c1e1a652549cc33e44885eea42ea2cc6267edc2"
integrity sha512-l076A6o/PIgcyM24s0dWmDI/b8RQf41uWoJu9I0M71CtW/YSw5T5NUeXxs5lo2tFQD+O4CW4nBHJXx3OY5NpXg==
@@ -7994,7 +8124,7 @@ npmlog@^6.0.0:
gauge "^4.0.0"
set-blocking "^2.0.0"
-nth-check@^2.0.0:
+nth-check@^2.0.0, nth-check@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2"
integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==
@@ -9873,10 +10003,10 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-shelljs@^0.8.4:
- version "0.8.4"
- resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2"
- integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==
+shelljs@^0.8.5:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c"
+ integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==
dependencies:
glob "^7.0.0"
interpret "^1.0.0"