2018-08-09 14:23:56 +01:00
#!/bin/bash
2019-09-05 23:45:58 +03:00
# Do not immediately exit on error to allow the `assertSucceeded` function to handle the error.
#
# NOTE:
2020-02-02 16:03:34 +02:00
# Each statement should be followed by an `assert*` or `exit 1` statement.
2019-09-05 23:45:58 +03:00
set +e -x
2018-08-09 14:23:56 +01:00
2019-09-05 23:45:58 +03:00
function assertFailed {
if [ [ $? -eq 0 ] ] ; then
echo " FAIL: $1 " ;
exit 1;
fi
}
function assertSucceeded {
if [ [ $? -ne 0 ] ] ; then
echo " FAIL: $1 " ;
exit 1;
fi
}
2020-02-02 16:03:34 +02:00
function assertEquals {
local value1 = $1 ;
local value2 = $2 ;
if [ [ " $value1 " != " $value2 " ] ] ; then
echo " FAIL: Expected ' $value1 ' to equal ' $value2 '. "
exit 1;
fi
}
function assertNotEquals {
local value1 = $1 ;
local value2 = $2 ;
if [ [ " $value1 " = = " $value2 " ] ] ; then
echo " FAIL: Expected ' $value1 ' not to equal ' $value2 '. "
exit 1;
fi
}
2019-10-14 12:51:02 +03:00
ngcc --help
assertSucceeded "Expected 'ngcc --help' to succeed."
2018-08-09 15:59:10 +01:00
2020-03-11 12:42:56 +01:00
ngcc --unknown-option 2>& 1 | grep 'Unknown arguments: unknown-option, unknownOption'
assertSucceeded "Expected ngcc to report bad option."
2019-10-14 12:51:02 +03:00
# node --inspect-brk $(npm bin)/ngcc -f esm2015
2019-04-03 16:37:36 +01:00
# Run ngcc and check it logged compilation output as expected
2019-10-14 12:51:02 +03:00
ngcc | grep 'Compiling'
assertSucceeded "Expected 'ngcc' to log 'Compiling'."
2019-09-05 23:45:58 +03:00
2018-08-09 15:59:10 +01:00
2018-08-17 22:00:00 +01:00
# Did it add the appropriate build markers?
2019-03-20 13:47:58 +00:00
# - esm2015
2019-06-03 21:39:30 +03:00
cat node_modules/@angular/common/package.json | awk 'ORS=" "' | grep '"__processed_by_ivy_ngcc__":[^}]*"esm2015": "'
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to add build marker for 'esm2015' in '@angular/common'."
2019-03-20 13:47:58 +00:00
2018-10-03 17:00:05 +01:00
# - fesm2015
2019-06-03 21:39:30 +03:00
cat node_modules/@angular/common/package.json | awk 'ORS=" "' | grep '"__processed_by_ivy_ngcc__":[^}]*"fesm2015": "'
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to add build marker for 'fesm2015' in '@angular/common'."
2019-09-05 23:45:58 +03:00
2020-05-06 16:54:44 +02:00
# `es2015` is an alias of `fesm2015`.
2019-06-03 21:39:30 +03:00
cat node_modules/@angular/common/package.json | awk 'ORS=" "' | grep '"__processed_by_ivy_ngcc__":[^}]*"es2015": "'
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to add build marker for 'es2015' in '@angular/common'."
2019-03-20 13:47:58 +00:00
2020-05-06 16:54:44 +02:00
# `module` is an alias of `fesm2015`
2019-06-03 21:39:30 +03:00
cat node_modules/@angular/common/package.json | awk 'ORS=" "' | grep '"__processed_by_ivy_ngcc__":[^}]*"module": "'
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to add build marker for 'module' in '@angular/common'."
2019-09-05 23:45:58 +03:00
2018-10-17 15:44:44 -07:00
# Did it replace the PRE_R3 markers correctly?
grep "= SWITCH_COMPILE_COMPONENT__POST_R3__" node_modules/@angular/core/fesm2015/core.js
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to replace 'SWITCH_COMPILE_COMPONENT__PRE_R3__' in '@angular/core' (fesm2015)."
2019-09-05 23:45:58 +03:00
2020-05-06 16:54:44 +02:00
grep "= SWITCH_COMPILE_COMPONENT__POST_R3__" node_modules/@angular/core/bundles/core.umd.js
assertSucceeded "Expected 'ngcc' to replace 'SWITCH_COMPILE_COMPONENT__PRE_R3__' in '@angular/core' (main)."
2019-09-05 23:45:58 +03:00
2018-10-03 17:00:05 +01:00
# Did it compile @angular/core/ApplicationModule correctly?
2021-03-05 16:25:04 -08:00
grep "ApplicationModule.ɵmod = /\*@__PURE__\*/ ɵɵdefineNgModule" node_modules/@angular/core/fesm2015/core.js
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to correctly compile 'ApplicationModule' in '@angular/core' (fesm2015)."
2019-09-05 23:45:58 +03:00
2021-03-05 16:25:04 -08:00
grep "ApplicationModule.ɵmod = /\*@__PURE__\*/ ɵɵdefineNgModule" node_modules/@angular/core/bundles/core.umd.js
2020-05-06 16:54:44 +02:00
assertSucceeded "Expected 'ngcc' to correctly compile 'ApplicationModule' in '@angular/core' (main)."
2019-09-05 23:45:58 +03:00
2021-03-05 16:25:04 -08:00
grep "ApplicationModule.ɵmod = /\*@__PURE__\*/ ɵngcc0.ɵɵdefineNgModule" node_modules/@angular/core/esm2015/src/application_module.js
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to correctly compile 'ApplicationModule' in '@angular/core' (esm2015)."
2019-09-05 23:45:58 +03:00
2019-11-06 17:03:56 +00:00
# Did it place the `setClassMetadata` call correctly?
2020-05-27 14:09:01 -07:00
cat node_modules/@angular/core/fesm2015/core.js | awk 'ORS=" "' | grep "ApplicationRef.ctorParameters.*setClassMetadata(ApplicationRef"
assertSucceeded "Expected 'ngcc' to place 'setClassMetadata' after static properties like 'ctorParameters' in '@angular/core' (fesm2015)."
2019-11-06 17:03:56 +00:00
2018-10-03 17:00:05 +01:00
2018-11-12 00:07:42 +01:00
# Did it transform @angular/core typing files correctly?
2019-03-06 09:05:06 +01:00
grep "import [*] as ɵngcc0 from './src/r3_symbols';" node_modules/@angular/core/core.d.ts
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to add an import for 'src/r3_symbols' in '@angular/core' typings."
2019-09-05 23:45:58 +03:00
2021-03-08 17:37:26 +00:00
grep "static ɵinj: ɵngcc0.ɵɵInjectorDeclaration<ApplicationModule>;" node_modules/@angular/core/core.d.ts
2019-10-14 15:28:01 -07:00
assertSucceeded "Expected 'ngcc' to add a definition for 'ApplicationModule.ɵinj' in '@angular/core' typings."
2019-09-05 23:45:58 +03:00
2018-11-12 00:07:42 +01:00
2019-01-02 23:25:58 +01:00
# Did it generate a base factory call for synthesized constructors correctly?
2021-03-14 21:03:59 +00:00
grep "/\*@__PURE__\*/ function () { let ɵMatTable_BaseFactory; return function MatTable_Factory(t) { return (ɵMatTable_BaseFactory || (ɵMatTable_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatTable)))(t || MatTable); }; }();" node_modules/@angular/material/esm2015/table/table.js
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to generate a base factory for 'MatTable' in '@angular/material' (esm2015)."
2019-09-05 23:45:58 +03:00
2021-03-14 21:03:59 +00:00
grep "/\*@__PURE__\*/ function () { var ɵMatTable_BaseFactory; return function MatTable_Factory(t) { return (ɵMatTable_BaseFactory || (ɵMatTable_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatTable)))(t || MatTable); }; }();" node_modules/@angular/material/esm5/table/table.js
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to generate a base factory for 'MatTable' in '@angular/material' (esm5)."
2019-09-05 23:45:58 +03:00
2019-01-02 23:25:58 +01:00
2019-10-25 19:45:08 +02:00
# Did it generate an abstract directive definition for undecorated classes with inputs and view queries?
2021-03-05 16:25:04 -08:00
grep "_MatMenuBase.ɵdir = /\*@__PURE__\*/ ɵngcc0.ɵɵdefineDirective({ type: _MatMenuBase" node_modules/@angular/material/esm2015/menu/menu.js
2019-10-25 19:45:08 +02:00
assertSucceeded "Expected 'ngcc' to generate an abstract directive definition for 'MatMenuBase' in '@angular/material' (esm2015)."
2019-09-05 23:45:58 +03:00
2021-03-05 16:25:04 -08:00
grep "_MatMenuBase.ɵdir = /\*@__PURE__\*/ ɵngcc0.ɵɵdefineDirective({ type: _MatMenuBase" node_modules/@angular/material/esm5/menu/menu.js
2019-10-25 19:45:08 +02:00
assertSucceeded "Expected 'ngcc' to generate an abstract directive definition for 'MatMenuBase' in '@angular/material' (esm5)."
2019-09-05 23:45:58 +03:00
2019-06-03 18:41:47 +02:00
2020-05-27 14:09:01 -07:00
# TODO: This assertion is disabled because @angular/common no longer contains __decorate calls.
# We should either remove this assertion or use a syntentic JS file as input.
# Discuss with the ngcc folks.
2019-07-27 15:14:55 +02:00
# Did it handle namespace imported decorators in UMD using `__decorate` syntax?
2020-05-27 14:09:01 -07:00
#grep "type: i0.Injectable" node_modules/@angular/common/bundles/common.umd.js
#assertSucceeded "Expected 'ngcc' to correctly handle '__decorate' syntax in '@angular/common' (umd)."
2019-09-05 23:45:58 +03:00
2020-05-27 14:09:01 -07:00
# TODO: This assertion is disabled because @angular/common no longer contains __decorate calls.
# We should either remove this assertion or use a syntentic JS file as input.
# Discuss with the ngcc folks.
2019-09-05 23:45:58 +03:00
# (and ensure the @angular/common package is indeed using `__decorate` syntax)
2020-05-27 14:09:01 -07:00
#grep "JsonPipe = __decorate(" node_modules/@angular/common/bundles/common.umd.js.__ivy_ngcc_bak
#assertSucceeded "Expected '@angular/common' (umd) to actually use '__decorate' syntax."
2019-09-05 23:45:58 +03:00
2019-07-27 15:14:55 +02:00
# Did it handle namespace imported decorators in UMD using static properties?
2019-12-03 12:39:16 +00:00
grep "type: i0.Injectable," node_modules/@angular/cdk/bundles/cdk-a11y.umd.js
2019-10-14 12:51:02 +03:00
assertSucceeded "Expected 'ngcc' to correctly handle decorators via static properties in '@angular/cdk/a11y' (umd)."
2019-09-05 23:45:58 +03:00
# (and ensure the @angular/cdk/a11y package is indeed using static properties)
grep "FocusMonitor.decorators =" node_modules/@angular/cdk/bundles/cdk-a11y.umd.js.__ivy_ngcc_bak
assertSucceeded "Expected '@angular/cdk/a11y' (umd) to actually have decorators via static properties."
2019-07-05 11:19:11 +01:00
2019-12-23 16:07:34 +02:00
# Did it transform imports in UMD correctly?
# (E.g. no trailing commas, so that it remains compatible with legacy browsers, such as IE11.)
grep "factory(exports, require('rxjs'), require('rxjs/operators'))" node_modules/@angular/core/bundles/core.umd.js
assertSucceeded "Expected 'ngcc' to not add trailing commas to CommonJS block in UMD."
grep "define('@angular/core', \['exports', 'rxjs', 'rxjs/operators'], factory)" node_modules/@angular/core/bundles/core.umd.js
assertSucceeded "Expected 'ngcc' to not add trailing commas to AMD block in UMD."
grep "factory((global.ng = global.ng || {}, global.ng.core = {}), global.rxjs, global.rxjs.operators)" node_modules/@angular/core/bundles/core.umd.js
assertSucceeded "Expected 'ngcc' to not add trailing commas to globals block in UMD."
grep "(this, (function (exports, rxjs, operators) {" node_modules/@angular/core/bundles/core.umd.js
assertSucceeded "Expected 'ngcc' to not add trailing commas to factory function parameters in UMD."
2020-02-02 16:03:34 +02:00
# Can it correctly clean up and re-compile when dependencies are already compiled by a different version?
readonly actualNgccVersion = ` node --print "require('@angular/compiler-cli/package.json').version" `
readonly mockNgccVersion = "3.0.0"
# Mock the ngcc version marker on a package to make it appear as if it is compiled by a different ngcc version.
node mock-ngcc-version-marker @angular/material/button $mockNgccVersion
assertSucceeded "Expected to successfully mock the 'ngcc' version marker in '@angular/material/button'."
assertEquals $mockNgccVersion ` node --print "require('@angular/material/button/package.json').__processed_by_ivy_ngcc__.main" `
assertEquals 1 ` cat node_modules/@angular/material/button/button.d.ts | grep 'import \* as ɵngcc0' | wc -l`
# Re-compile packages (which requires cleaning up those compiled by a different ngcc version).
2020-04-17 14:19:31 +01:00
ngcc --properties main
2020-02-02 16:03:34 +02:00
assertSucceeded "Expected 'ngcc' to successfully re-compile the packages."
# Ensure previously compiled packages were correctly cleaned up (i.e. no multiple
# `import ... ɵngcc0` statements) and re-compiled by the current ngcc version.
assertEquals $actualNgccVersion ` node --print "require('@angular/material/button/package.json').__processed_by_ivy_ngcc__.main" `
assertEquals 1 ` cat node_modules/@angular/material/button/button.d.ts | grep 'import \* as ɵngcc0' | wc -l`
2020-01-15 21:54:36 +02:00
# Can it compile `@angular/platform-server` in UMD + typings without errors?
# (The CLI prefers the `main` property (which maps to UMD) over `module` when compiling `@angular/platform-server`.
# See https://github.com/angular/angular-cli/blob/e36853338/packages/angular_devkit/build_angular/src/angular-cli-files/models/webpack-configs/server.ts#L34)
2020-02-04 11:45:40 -08:00
if [ [ -z " $cache " ] ] ; then
cache = ".yarn_local_cache"
fi
2020-01-15 21:54:36 +02:00
rm -rf node_modules/@angular/platform-server && \
yarn install --cache-folder $cache --check-files && \
test -d node_modules/@angular/platform-server
assertSucceeded "Expected to re-install '@angular/platform-server'."
ngcc --properties main --target @angular/platform-server
assertSucceeded "Expected 'ngcc' to successfully compile '@angular/platform-server' (main)."
2020-02-02 16:03:34 +02:00
2018-10-03 17:00:05 +01:00
# Can it be safely run again (as a noop)?
2019-04-03 16:37:36 +01:00
# And check that it logged skipping compilation as expected
2019-10-14 12:51:02 +03:00
ngcc -l debug | grep 'Skipping'
assertSucceeded "Expected 'ngcc -l debug' to successfully rerun (as a noop) and log 'Skipping'."
2019-04-03 16:37:36 +01:00
2019-08-29 18:47:54 +03:00
# Does it process the tasks in parallel?
2019-10-14 12:51:02 +03:00
ngcc -l debug | grep 'Running ngcc on ClusterExecutor'
assertSucceeded "Expected 'ngcc -l debug' to run in parallel mode (using 'ClusterExecutor')."
2019-08-29 18:47:54 +03:00
2019-04-03 16:37:36 +01:00
# Check that running it with logging level error outputs nothing
2019-10-14 12:51:02 +03:00
ngcc -l error | grep '.'
assertFailed "Expected 'ngcc -l error' to not output anything."
2018-08-09 15:59:10 +01:00
2019-03-20 13:47:58 +00:00
# Does running it with --formats fail?
2019-10-14 12:51:02 +03:00
ngcc --formats fesm2015
assertFailed "Expected 'ngcc --formats fesm2015' to fail (since '--formats' is deprecated)."
2019-03-20 13:47:58 +00:00
2020-04-28 15:32:05 +01:00
# Does it timeout if there is another ngcc process running
LOCKFILE = node_modules/@angular/compiler-cli/ngcc/__ngcc_lock_file__
touch $LOCKFILE
trap " [[ -f $LOCKFILE ]] && rm $LOCKFILE " EXIT
ngcc
exitCode = $?
assertEquals $exitCode 177
rm $LOCKFILE
2018-10-03 17:00:05 +01:00
# Now try compiling the app using the ngcc compiled libraries
2018-08-09 14:23:56 +01:00
ngc -p tsconfig-app.json
2019-09-05 23:45:58 +03:00
assertSucceeded "Expected the app to successfully compile with the ngcc-processed libraries."
2018-08-09 14:23:56 +01:00
2018-10-15 11:02:38 +01:00
# Did it compile the main.ts correctly (including the ngIf and MatButton directives)?
grep "directives: \[.*\.NgIf.*\]" dist/src/main.js
2019-09-05 23:45:58 +03:00
assertSucceeded "Expected the compiled app's 'main.ts' to list 'NgIf' in 'directives'."
2018-10-15 11:02:38 +01:00
grep "directives: \[.*\.MatButton.*\]" dist/src/main.js
2019-09-05 23:45:58 +03:00
assertSucceeded "Expected the compiled app's 'main.ts' to list 'MatButton' in 'directives'."
2019-10-14 12:51:02 +03:00
# 'ivy-ngcc' should fail with an appropriate error message.
ivy-ngcc
assertFailed "Expected 'ivy-ngcc' to fail (since it was renamed to 'ngcc')."
ivy-ngcc 2>& 1 | grep "Error: The 'ivy-ngcc' command was renamed to just 'ngcc'. Please update your usage."
assertSucceeded "Expected 'ivy-ngcc' to show an appropriate error message."