1245 Commits

Author SHA1 Message Date
Alan Agius
6153530220 fix(@angular-devkit/build-webpack): emit result when webpack is closed
With this change we emit the compilation result when the compilation is closed, when the compilation is not in watch mode.

This is needed so that when persistent caching is enabled and architect promise API is used (`.result`) instead of `.output` we wait for the cache to be written prior to terminating the process/resolving the result promise.

The `result` API currently, takes the first emit 4f9df9f4a4/packages/angular_devkit/architect/src/schedule-by-name.ts (L118-L120)

Closes #21419
2021-07-27 12:15:02 -04:00
Charles Lyding
4bcd1dc9ee fix(@angular-devkit/build-angular): allow classes with pure annotated static properties to be optimized
When script optimizations are enabled, classes containing downlevelled static properties are wrapped in a pure annotated IIFE to allow the class to be removed if it is otherwise unused. Only properties with initializer values that do not have the potential for side effects can be safely wrapped. Previously, pure annotations were not considered when analyzing the values and this caused classes to be retained that could be considered safe for removal. To resolve this issue, pure annotations are now considered when analyzing a property's initializer value for potential side effects.
2021-07-21 14:54:57 -07:00
LeonEck
ceade0c27e fix(@angular-devkit/build-angular): dasherize disable-host-check suggestion
Camel case arguments have been deprecated and therefore shouldn't be suggested.
2021-07-19 07:06:51 +02:00
Alan Agius
1be3b07836 fix(@angular-devkit/build-angular): exclude outputPath from persistent build cache key
With this change we exclude `outputPath` from cache key due to i18n extraction which causes it to change on every build 736a5f89de/packages/angular_devkit/build_angular/src/utils/i18n-options.ts (L264-L265)

Closes #21275
2021-07-14 13:13:37 -07:00
Charles Lyding
2c2b499193 fix(@angular-devkit/build-angular): limit advanced terser passes to two
Limiting the terser passes to two helps to workaround an issue with terser wherein terser will errantly inline a function argument containing a `yield` expression inside an inner arrow function.  This results in a syntax error since the yield expression is no longer within the scope of a generator.
2021-07-13 15:21:06 +01:00
Charles Lyding
fefd6d0421 perf(@angular-devkit/build-angular): use esbuild as a CSS optimizer for component styles
The stylesheet optimization pipeline now uses `esbuild` for component stylesheets. The usage of `esbuild` provides noticeable build time improvements as well as, on average, smaller output sizes.
`esbuild` currently does not support stylesheet sourcemaps. However, since the Angular CLI does not support component stylesheet sourcemaps when optimizing, this lack of support is problematic.
Global stylesheets will continue to use `cssnano` as an optimizer due to sourcemaps being required for global stylesheets even when optimizing. When `esbuild` adds stylesheet sourcemap support, global stylesheets may be transitioned to `esbuild` as well.
2021-07-13 15:20:49 +01:00
Alan Agius
2ac8e9c0e1 fix(@angular-devkit/build-angular): display incompatibility errors
The logger API writes logs in an async fasion which previously caused messages not to be printed in the terminal when `process.exit` was invoked.

Closes #21322
2021-07-12 16:40:35 +01:00
Alan Agius
9a04975a21 fix(@angular-devkit/build-angular): extractLicenses didn't have an effect when using server builder 2021-07-12 16:39:34 +01:00
Alan Agius
54c170b20d test(@angular-devkit/build-angular): refactor server builder tests to use test harness 2021-07-12 16:39:34 +01:00
Alan Agius
3d71c63b3a fix(@angular-devkit/build-angular): fix issue were @media all causing critical CSS inling to fail
Workaround for Critters as it doesn't work when `@media all {}` is minified to `@media {}`.

Closes #20804
2021-07-09 17:04:23 +01:00
Alan Agius
c65b049996 fix(@angular-devkit/build-angular): fail browser build when index generation fails
Currently, when there is an error during index generation this is just been logged in the console.
2021-07-09 17:02:32 +01:00
Charles Lyding
6eca86b817 refactor(@angular-devkit/build-angular): replace raw-loader with Webpack 5 asset modules
With Webpack 5, the `raw-loader` is no longer needed and its functionality is provided via configuration options within the Webpack configuration via asset modules.  Asset modules (https://webpack.js.org/guides/asset-modules/) provide a built-in way to provide `raw-loader`, `url-loader`, and `file-loader` functionality without additional dependencies.
2021-07-07 15:51:19 -04:00
Charles Lyding
beb78ef79e refactor(@angular-devkit/build-angular): use Webpack provided watcher typings instead of custom
Webpack 5 now provides type definitions for the majority of the watch subsystem. These type definitions allow the removal of the custom types that were previously used.
2021-07-07 09:24:09 -04:00
Alan Agius
a5c69722ff fix(@angular-devkit/build-angular): ensure NG_PERSISTENT_BUILD_CACHE always creates a cache in the specified cache directory
This change fixes `NG_PERSISTENT_BUILD_CACHE` sometimes creating cache
entries that live outside of the cache directory by using a hex encoding
rather than a base64 encoding. This error is caused because the base64
alphabet includes `/`. According to the webpack documentation [1] the
default `cacheLocation` is:

  path.resolve(cache.cacheDirectory, cache.name)

Which means cache names with a leading `/` would remove the
`cacheDirectory` altogether.

[1]: https://webpack.js.org/configuration/other-options/#cachecachelocation
2021-07-06 11:38:12 -04:00
Alan Agius
07763702fd fix(@angular-devkit/build-angular): force linker sourceMapping option to false.
This is an interim solution until https://github.com/angular/angular/issues/42769 is fixed.

Closes #21271
2021-07-06 11:37:52 -04:00
Alan Agius
32050cabe5 Revert "fix(@angular-devkit/build-angular): control linker template sourcemapping via builder sourcemap options"
This reverts commit d4c5f8518d4801b9fd76de289a015dcbb8d8f69b.

Following a debugging and investigation with @petebacondarwin it appears that when the external template handling in the linker generates Babel AST nodes that reference the external template files which breaks Babel when it tried to flatten final source-map, which ends up no emitting any source-maps.

As an interim solution we should revert this.

Closes #21271
2021-07-06 11:37:52 -04:00
Alan Agius
1f6a5519fb test(@angular-devkit/build-angular): modify RegExp to handle output of mini-css-extract-plugin v2.1+ 2021-07-06 10:21:28 -04:00
Charles Lyding
34e66ff4d2 refactor(@angular-devkit/build-angular): use Webpack provided loader types
Webpack now provides loader function type definitions. These type definitions are now used in custom loaders within the package.
This improves type safety and behavior correctness of the loaders when used with Webpack.
2021-07-02 15:44:39 -04:00
Alan Agius
8383c6b421 fix(@angular-devkit/build-angular): silence Sass compiler warnings from 3rd party stylesheets
With this change we enable `quietDeps`, which causes the Sass compiler not to emit warnings from a stylesheet that is loaded through load-path.

The `--verbose` option can be used to opt-out from this behaviour and display all warnings.

Closes #21235
2021-07-02 11:55:56 -04:00
Charles Lyding
3c2fb5c9c1 refactor(@angular-devkit/build-angular): avoid loading Webpack for differential loading sourcemaps
The `@ampproject/remapping` package is now used for source map processing instead of Webpack for differential loading and i18n processing. This dependency is already used within the recently added JavaScript optimizer refactoring and reduces the amount of code that needs to be loaded into each worker to support differential loading sourcemaps.
2021-07-02 11:54:24 -04:00
Charles Lyding
9afe185fc6 build: enable noImplicitOverride TypeScript option
The `noImplicitOverride` TypeScript option improves code quality by ensuring that properties from base classes are not accidentally overriden.
Reference: https://www.typescriptlang.org/tsconfig#noImplicitOverride
2021-07-02 06:40:36 -04:00
Alan Agius
212939d6a3 Revert "refactor: disable esbuild worker threads"
This reverts commit 47a1ccc50729ad25e4fa4e38704c8dbd3b1737f7.
2021-07-01 13:29:22 +02:00
Alan Agius
070a133647 fix(@angular-devkit/build-angular): configure webpack target in common configuration
Previously, `target` was unset for `test` which caused the target to be set incorrectly.

Closes #21239
2021-06-30 19:26:36 +02:00
Alan Agius
6a2b11906e perf(@angular-devkit/build-angular): cache JavaScriptOptimizerPlugin results
With this change we cache JavaScriptOptimizerPlugin results in memory or on the file system based on the caching strategy used.
2021-06-30 17:41:01 +02:00
Alan Agius
41e6457921 fix(@angular-devkit/build-angular): downlevel for await...of when targetting ES2018+
Closes #21196
2021-06-30 16:28:57 +02:00
Alan Agius
18cfa04317 feat(@angular-devkit/build-angular): add support to inline Adobe Fonts
With this change we add support to inline external Adobe fonts into the index html, we also add a `preconnect` hint which helps improve page load speed.

Closes #21186
2021-06-28 20:22:29 +02:00
Alan Agius
47a1ccc507 refactor: disable esbuild worker threads
This is a workaround for `TypeError [Error]: Cannot read property 'workerPort' of undefined`.
2021-06-28 17:57:57 +02:00
Alan Agius
9a751f0f81 fix(@angular-devkit/build-angular): handle ENOENT and ENOTDIR errors when deleting outputs
Closes #21202
2021-06-28 17:15:19 +02:00
Charles Lyding
fd4ae0fb16 refactor(@angular-devkit/build-angular): lazy load Webpack in differential loading processor
Webpack is a large dependency with a large dependency graph. By only loading Webpack when needed in the differential loading and i18n processors, initial startup time can be improved and memory usage can be reduced.
2021-06-28 14:42:12 +02:00
Charles Lyding
e49079d971 refactor(@angular-devkit/build-angular): remove jest-worker direct dependency
The worker pool for differential loading and i18n processing is now managed by the `piscina` dependency. This dependency is already used within the recently added JavaScript optimizer refactoring and reduces both the number of direct dependencies and amount of code to setup the worker pools.
2021-06-28 14:42:12 +02:00
Alan Agius
05a52c8c59 refactor: clean up remove unused code 2021-06-25 07:46:22 +02:00
Alan Agius
ebf3fab921 build: update eslint-plugin-import to 2.23.4 2021-06-25 07:46:12 +02:00
Charles Lyding
da32daa75d perf(@angular-devkit/build-angular): use combination of esbuild and terser as a JavaScript optimizer
The javascript optimization pipeline is now a two-phase process.  `esbuild` is used in the first phase to remove the majority of the unused code and shorten identifiers in each output bundle script.  `esbuild` can accomplish this in a fraction of the time that `terser` previously required.  However, `esbuild` does not yet implement all of the optimizations that `terser` performs.  As a result, `terser` is used as a second phase to further optimize and reduce the size of the output bundle scripts.  Since `terser` is operating on a smaller input size, the time required for `terser` to complete is significantly reduced.  To further improve performance when source maps are enabled, the source map merging is now performed within the optimization workers. A maximum of four (4) optimization workers are currently used and this value can be adjusted via the `NG_BUILD_MAX_WORKERS` environment variable.
2021-06-25 07:44:57 +02:00
Alan Agius
203e1a4d60 refactor(@angular-devkit/build-angular): remove unused mime-types from style configuration 2021-06-25 07:44:46 +02:00
Alan Agius
06181c2fbf fix(@angular-devkit/build-angular): parse web-workers in tests when webWorkerTsConfig is defined
The logic was inverted which caused workers not to be parsed when `webWorkerTsConfig` is defined.
2021-06-22 17:39:12 +01:00
Charles Lyding
d4c5f8518d fix(@angular-devkit/build-angular): control linker template sourcemapping via builder sourcemap options
This change allows the linker sourcemap behavior to be controlled by the Webpack sourcemap configuration. For example, if a vendor file is being processed and vendor sourcemaps are disabled, the linker will now skip its internal sourcemap loading and processing steps.
2021-06-21 11:12:00 +01:00
Alan Agius
ab17b1721c fix(@angular-devkit/build-angular): handle ng-packagr errors more gracefully.
Ng-packagr will throw an error when a compilation fails.
2021-06-21 11:11:09 +01:00
Alberto Calvo
0fe6cfef64 fix(@angular-devkit/build-angular): use the name as chunk filename instead of id 2021-06-16 08:15:38 -04:00
Charles Lyding
b3d7080147 build: enable esModuleInterop TypeScript option
The `esModuleInterop` option is recommended to be enable by TypeScript and corrects several assumptions TypeScript would otherwise make when importing CommonJS files.
This option change helps ensure compatibility as packages move towards ESM.
Reference: https://www.typescriptlang.org/tsconfig#esModuleInterop
2021-06-13 11:45:55 -04:00
Alan Agius
528b7f182e refactor(@angular-devkit/build-angular): extract webpack configurations from browser builder 2021-06-11 17:20:50 -04:00
Alan Agius
f90a8324b4 perf(@angular-devkit/build-angular): enable opt-in usage of file system cache
With this change we enable Webpack's filesystem cache, this important because `terser-webpack-plugin`, `css-minimizer-webpack-plugin` and `copy-webpack-plugin` all use Webpacks' caching API to avoid additional processing during the 2nd cold build.

This changes causes `node_modules` to be treated as immutable. Webpack will avoid hashing and timestamping them, assume the version is unique and will use it as a snapshot.

To opt-in using the experimental persistent build cache use the`NG_PERSISTENT_BUILD_CACHE` environment variable.

```
NG_PERSISTENT_BUILD_CACHE=1 ng serve
```
2021-06-11 12:11:49 -04:00
Alan Agius
83602515fa fix(@angular-devkit/build-angular): explicitly set compilation target in test configuration
When not set, and browserslist returns no reesults due to the file being empty or commented. Webpack will generate invalid code because it doesn't know which enviorment we want to target.

```diff
- (self["webpackChunktest_app"] = self["webpackChunktest_app"] || []).push([["vendor"],{

/***/ 8583:
```

Closes #21111
2021-06-11 09:51:25 -04:00
Alan Agius
071c8d10ce fix(@angular-devkit/build-angular): don't parse new Worker syntax when webWorkerTsConfig is not defined in karma builder
This is to retain version 11 behaviour.

Closes #21108
2021-06-11 09:42:25 -04:00
Alan Agius
cc4afa2de6 refactor(@angular-devkit/build-angular): ignore postcss-loader warning
Users should not install `postcss` in their workspace as this is a dependency of `@angular-devkit/build-angular`.
2021-06-11 09:24:48 -04:00
Alan Agius
dc5a58528a fix(@angular-devkit/build-angular): styles CSS files not available in unit tests
With this change we force styles to be extracted in css files during unit tests.

Closes #21054
2021-06-09 08:00:58 +02:00
Alan Agius
fe1825ae38 test: refactor karma tests to use test harness 2021-06-09 08:00:58 +02:00
Alan Agius
c43ace7383 fix(@angular-devkit/build-angular): add web-workers in lazy chunks in stats output
Web-workers are not marked as `initial` since their initialization can be guarded.

Closes #21059
2021-06-07 19:29:58 +02:00
Alan Agius
2d0d82ba5b fix(@angular-devkit/build-angular): correctly mark async chunks as non initial in dev-server 2021-06-07 17:09:49 +02:00
Alan Agius
699802d488 perf(@angular-devkit/build-angular): reduce memory usage by cleaning output directory before emitting
Unless `deleteOutputPath` is false, we should clean, this helps reduce assets in tests.
2021-06-07 17:09:27 +02:00
Charles Lyding
1168edb8d1 refactor(@angular-devkit/build-angular): add a loose mode for build optimizer enum pass
The `adjust-typescript-enums` plugin now includes an optional loose mode. This mode generates less code for an adjusted enum but differs from the canonical TypeScript enum structure emitted by the TypeScript compiler. This mode is only enabled for packages validated to operate correctly with this structure and is currently limited to first-party Angular packages. The adjusted structure is a variation of the previous build optimizer pass structure but better reflects the runtime behavior of the TypeScript emit structure.
2021-06-04 21:10:06 +02:00