angular-cn/integration
Alex Rickabaugh 235a235fab feat: change @Injectable() to support tree-shakeable tokens (#22005)
This commit bundles 3 important changes, with the goal of enabling tree-shaking
of services which are never injected. Ordinarily, this tree-shaking is prevented
by the existence of a hard dependency on the service by the module in which it
is declared.

Firstly, @Injectable() is modified to accept a 'scope' parameter, which points
to an @NgModule(). This reverses the dependency edge, permitting the module to
not depend on the service which it "provides".

Secondly, the runtime is modified to understand the new relationship created
above. When a module receives a request to inject a token, and cannot find that
token in its list of providers, it will then look at the token for a special
ngInjectableDef field which indicates which module the token is scoped to. If
that module happens to be in the injector, it will behave as if the token
itself was in the injector to begin with.

Thirdly, the compiler is modified to read the @Injectable() metadata and to
generate the special ngInjectableDef field as part of TS compilation, using the
PartialModules system.

Additionally, this commit adds several unit and integration tests of various
flavors to test this change.

PR Close #22005
2018-02-12 14:34:59 -08:00
..
bazel build: update to latest bazel rules (#22127) 2018-02-09 17:21:54 -08:00
cli-hello-world ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
dynamic-compiler ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
hello_world__closure ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
hello_world__render3__cli ci(ivy): enable size tracking of a minimal cli render3 application (#21792) 2018-01-31 10:21:33 -08:00
hello_world__render3__closure perf(ivy): use buildOptimizer in hello_world__render3__rollup integration test (#21744) 2018-01-29 11:35:51 -08:00
hello_world__render3__rollup perf(ivy): improve Uglify configuration in hello world integration test (#21985) 2018-02-06 08:01:18 -08:00
hello_world__systemjs_umd ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
i18n ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
injectable-def feat: change @Injectable() to support tree-shakeable tokens (#22005) 2018-02-12 14:34:59 -08:00
language_service_plugin ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
typings_test_ts24 ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
typings_test_ts25 ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
typings_test_ts26 ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
.gitignore ci: Add back the CLI integration test with pinning (#21555) 2018-01-25 22:18:55 -08:00
README.md ci(ivy): enable size tracking of a minimal cli render3 application (#21792) 2018-01-31 10:21:33 -08:00
_payload-limits.json feat: change @Injectable() to support tree-shakeable tokens (#22005) 2018-02-12 14:34:59 -08:00
run_tests.sh test(ivy): temp disable payload limit tests (#21940) 2018-01-31 11:50:18 -08:00

README.md

Integration tests for Angular

This directory contains end-to-end tests for Angular. Each directory is a self-contained application that exactly mimics how a user might expect Angular to work, so they allow high-fidelity reproductions of real-world issues.

For this to work, we first build the Angular distribution just like we would publish it to npm, then install the distribution into each app.

To test Angular CLI applications, we generate integration tests such as cli-hello-world. This was generated with a current version of the CLI, and the only modification was replacement of @angular/* packages with their counterparts coming from file:../../dist/packages-dist/*. When a significant change is released in the CLI, the application should be re-generated from scratch:

$ cd integration
$ rm -rf cli-hello-world
$ ng new cli-hello-world
# Edit cli-hello-world/package.json to point the @angular packages to dist/packages-dist, and preserve local mods to
# ng build
# ng test
# typescript version

Render3 tests

The directory hello_world_cli contains a test for render3 used with the angular cli.

If the Angular CLI is modified to generate a render3 application this should be replaced with that project.

If the render3 is updated to support the Angular 5 bootstrap a version of this project should be created that uses the Angular 5 bootstrap.

Writing an integration test

The API for each test is:

  • Each sub-directory here is an integration test
  • Each test should have a package.json file
  • The test runner will run yarn and yarn test on the package

This means that the test should be started by test script, like

'scripts' { 'test': 'runProgramA && assertResultIsGood' }

Note that the package.json file uses a special file://../../dist scheme to reference the Angular packages, so that the locally-built Angular is installed into the test app.

Also, beware of floating (non-locked) dependencies. If in doubt you can install the package directly from file:../../node_modules.

Running integration tests

First you must run build.sh to create the current distribution.

You can iterate on the tests by keeping the dist folder up-to-date. See the package.json of the test(s) you're debugging, to see which dist/ folders they install from. Then run the right tsc --watch command to keep those dist folders up-to-date, for example:

$ ./node_modules/.bin/tsc -p packages/core/tsconfig-build.json --watch

Now you can run the integration test, it will re-install from the dist/ folder on each run.

$ ./integration/run_tests.sh