Commit graph

8563 commits

Author SHA1 Message Date
Pawel Kozlowski
410d81f0e2 refactor(core): disallow standalone components in importProvidersFrom calls (#45837)
This commit narrows down acceptable argument types of the
`importProvidersFrom` function. More specifically, it rejects
standalone components as a source of imports.

PR Close #45837
2022-05-03 13:12:36 -07:00
Alex Rickabaugh
8ba4ddcb69 refactor(compiler-cli): improve error for imports in non-standalone cmp (#45851)
This commit improves the error message for using `imports` on a component
that isn't set to `standalone: true`. Two concrete improvements are made:

* A related information message is added to the diagnostic which suggests
  the fix of adding `standalone: true`.
* The component is marked as poisoned, preventing other errors which might
  be caused by an incorrectly configured template scope from being generated
  and thus masking the original problem.

Fixes #45850

PR Close #45851
2022-05-03 11:04:09 -07:00
JoostK
9cf14ff03d feat(compiler-cli): exclude abstract classes from strictInjectionParameters requirement (#44615)
In AOT compilations, the `strictInjectionParameters` compiler option can
be enabled to report errors when an `@Injectable` annotated class has a
constructor with parameters that do not provide an injection token, e.g.
only a primitive type or interface.

Since Ivy it's become required that any class with Angular behavior
(e.g. the `ngOnDestroy` lifecycle hook) is decorated using an Angular
decorator, which meant that `@Injectable()` may need to have been added
to abstract base classes. Doing so would then report an error if
`strictInjectionParameters` is enabled, if the abstract class has an
incompatible constructor for DI purposes. This may be fine though, as
a subclass may call the constructor explicitly without relying on
Angular's DI mechanism.

Therefore, this commit excludes abstract classes from the
`strictInjectionParameters` check. This avoids an error from being
reported at compile time. If the constructor ends up being used by
Angular's DI system at runtime, then the factory function of the
abstract class will throw an error by means of the `ɵɵinvalidFactory`
instruction.

In addition to the runtime error, this commit also analyzes the inheritance
chain of an injectable without a constructor to verify that their inherited
constructor is valid.

Closes #37914

PR Close #44615
2022-05-03 10:39:56 -07:00
Andrew Kushnir
401dec46eb feat(core): update TestBed to recognize Standalone Components (#45809)
This commit updates an internal logic of the TestBed to recognize Standalone Components to be able to apply the necessary overrides correctly.

PR Close #45809
2022-05-03 10:33:52 -07:00
Kristiyan Kostadinov
bb8d7091c6 fix(compiler): exclude empty styles from emitted metadata (#45459)
Excludes styles that resolve to empty strings from the emitted metadata so that they don't result in empty `<style>` tags at runtime.

Fixes #31191.

PR Close #45459
2022-05-03 09:38:36 -07:00
Alex Rickabaugh
d322052db3 refactor(core): guard against importProvidersFrom in components (#45838)
`importProvidersFrom` provides a bridge from the world of NgModule-based DI
configuration to the new, "standalone" world of direct providers and
environment injectors. Early user feedback suggested some confusion around
where this function was supposed to be used, particularly around importing
NgModule-based providers into standalone component `providers` arrays, which
is not the intended use. This confusion is exacerbated by the fact that due
to the unified `Provider` type, this kind of misconfiguration was happily
accepted by the type system.

This commit changes the return type of `importProvidersFrom` to wrap the
returned providers in an opaque type that prevents them from being used in
component provider contexts. This, together with stronger documentation
around the purpose and functionality of `importProvidersFrom`, should
address some of the above confusion.

PR Close #45838
2022-05-02 15:50:44 -07:00
Pawel Kozlowski
3d5363cc5e docs(core): add public API for standalone entities (#45798)
This commit adds public API docs for standalome components,
directives and pipes.

PR Close #45798
2022-05-02 15:09:31 -07:00
Dylan Hunn
fce50637c5 docs(forms): Add documentation for typed forms. (#45841)
Update the JSDoc on forms model classes with more specific information about the new types.

PR Close #45841
2022-05-02 15:03:40 -07:00
Andrew Kushnir
ad5ffffc7b refactor(core): rename INJECTOR_INITIALIZER -> ENVIRONMENT_INITIALIZER (#45845)
This commit renames the `INJECTOR_INITIALIZER` to `ENVIRONMENT_INITIALIZER` to better represent the intention of the token.

PR Close #45845
2022-05-02 15:02:06 -07:00
JoostK
3ebf9e7442 refactor(compiler-cli): improve error message formatting (#45827)
Changes the message from:

```
The component 'HelloComponent' appears in 'imports', but is not standalone
and cannot be imported directly It must be imported via an NgModule.
```
to

```
The component 'HelloComponent' appears in 'imports', but is not standalone
and cannot be imported directly. It must be imported via an NgModule.
```

PR Close #45827
2022-05-02 14:59:01 -07:00
JoostK
9cfea3d522 fix(compiler-cli): report invalid imports in standalone components during resolve phase (#45827)
The analysis phase of the compiler should operate on individual classes, independently
of the analysis of other classes. The validation that `Component.imports` only
contains standalone entities or NgModules however did happen during the analysis phase,
introducing a dependency on other classes and causing inconsistencies due to ordering
and/or asynchronous timing differences.

This commit fixes the issue by moving the validation to the resolve phase, which occurs
after all classes have been analyzed.

Fixes #45819

PR Close #45827
2022-05-02 14:59:01 -07:00
Pawel Kozlowski
38f2906422 docs(core): add public API docs for the ApplicationRef (#45836)
This commits add the missing documentation for the ApplicationRef
destroy() method.

PR Close #45836
2022-05-02 14:58:27 -07:00
Andrew Kushnir
22c71be94c fix(platform-server): update renderApplication to move appId to options (#45844)
This commit updates the `renderApplication` function to move the `appId` argument to the options object. The goal is to achieve a symmetry with the `bootstrapApplication` call (use to bootstrap apps for the browser environment).

PR Close #45844
2022-05-02 14:57:55 -07:00
Zack Elliott
752ddbc165 feat(compiler-cli): Support template binding to protected component members (#45823)
This commit adds support for creating template bindings to protected members within the component class.

PR Close #45823
2022-05-02 14:40:11 -07:00
Ryan Day
f0b5e830a5 build(bazel): change ngc-wrapped to use new bazelOpts.devmode (#45804)
bazelOpts.es5Mode is being removed and replaced with devmode. Adding a
check for either will allow a smooth migration.

PR Close #45804
2022-05-02 13:10:06 -07:00
Andrew Kushnir
fde4942cdf fix(core): throw if standalone components are present in @NgModule.bootstrap (#45825)
This commit updates the logic to detect a situation when a standalone component is used in the NgModule-based bootstrap (`@NgModule.bootstrap`). Both AOT and JIT compilers are updated to handle this situation.

PR Close #45825
2022-05-02 11:43:17 -07:00
Cédric Exbrayat
e702cafcf2 feat(core): allow to throw on unknown elements in tests (#45479)
Allows to provide a TestBed option to throw on unknown elements in templates:

```ts
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting(), {
    errorOnUnknownElements: true
  }
);
```

The default value of `errorOnUnknownElements` is `false`, so this is not a breaking change.

PR Close #45479
2022-05-02 09:38:13 -07:00
Dylan Hunn
6a3ca0eb45 Revert "feat(core): allow to throw on unknown elements in tests (#45479)" (#45839)
This reverts commit 6662a97c61.

PR Close #45839
2022-05-02 09:36:28 -07:00
Cédric Exbrayat
6662a97c61 feat(core): allow to throw on unknown elements in tests (#45479)
Allows to provide a TestBed option to throw on unknown elements in templates:

```ts
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting(), {
    errorOnUnknownElements: true
  }
);
```

The default value of `errorOnUnknownElements` is `false`, so this is not a breaking change.

PR Close #45479
2022-05-02 09:22:34 -07:00
JoostK
a88bf2090e refactor(compiler-cli): increase minimum version of partial declarations (#45782)
In v14, the partial compilation output of components have changed in a way
that prevents older versions of Angular to compile the partial declarations
correctly.

In particular, we used to emit used directives/components in separate arrays called
`components` and `directives`, and used pipes in a property called `pipes`:

```js
TestComponent.ɵcmp = i0.ɵɵngDeclareComponent({
  minVersion: "12.0.0",
  version: "13.3.0",
  type: TestComponent,
  selector: "ng-component",
  ngImport: i0,
  template: ``,
  isInline: true,
  directives: [{ type: i1.SomeDir, selector: "[some-dir]" }],
  components: [{ type: i1.SomeCmp, selector: "some-cmp" }],
  pipes: { 'async': i2.AsyncPipe },
});
```

In the above example, the `version` property indicates which exact compiler
version was used to compile the component, but the `minVersion` allows older
versions of the compiler/Angular linker to "link" the partial declaration to
its final AOT compilation output.

In v14, the used directives, components and pipes are now emitted together
into a single array under the `dependencies` property:

```js
TestComponent.ɵcmp = i0.ɵɵngDeclareComponent({
  minVersion: "12.0.0",
  version: "13.3.0",
  type: TestComponent,
  selector: "ng-component",
  ngImport: i0,
  template: ``,
  isInline: true,
  dependencies: [
    { kind: "directive", type: i1.SomeDir, selector: "[some-dir]" },
    { kind: "component", type: i1.SomeCmp, selector: "some-cmp" },
    { kind: "pipe", type: i2.AsyncPipe },
  ],
});
```

This change has been made in support of standalone components, but it does mean
that older compiler versions can no longer link these partial declarations
as desirable as none of the components, directives and pipes would be included
in the AOT-compiled code.

By increasing the `minVersion` property, we hint to older compiler versions that
they are not capable of processing the partial declaration. This allows reporting
an error at compile time instead of resulting in runtime failures due to missing
components, directives and pipes.

PR Close #45782
2022-04-29 17:19:16 -04:00
Andrew Kushnir
dff5586d52 feat(platform-server): implement renderApplication function (#45785)
This commit adds the `renderApplication` function to bootstrap an Angular app using a root standalone component to support SSR scenarios.

PR Close #45785
2022-04-29 17:18:54 -04:00
George Kalpakas
e1454aeb7b build(common): update CLDR to version 41 (#45714)
Update CLDR, which is used to generate the locales files, to version 41.
Also, make necessary code changes to account for changes in the CLDR
data.

Fixes #43301

PR Close #45714
2022-04-29 12:20:08 -04:00
George Kalpakas
57a9c17e7c build(common): specify CLDR version to use by cldr (#45714)
While generating locales, two sets of data (both derived from the
[CLDR project][1]) are used:
- JSON data with the [`cldrjs` package][2], which is used for most
  operations.
- XML data with the [`cldr` package][3], which is used for generating
  plural-related data.

The JSON data is brought in from the [unicode-org/cldr-json][4]
repository. Since we control the version of the repository that we use,
we can control the CLDR version that these correspond to.

Previously, however, we used the XML data that were bundled with the
[`cldr` package[3]. As a result, the two sets of data could correspond
to different CLDR versions, resulting in incorrect/inconsistent locales
files.

This commit addresses the problem by utilizing the `load()` method of
the [`cldr` package][3], which allows passing in a custom path to the
CLDR XML data (instead of using the bundled data. This way, we can
ensure that the data used for all operations correspond to the same CLDR
version.

Related discussion: #43301

[1]: https://github.com/unicode-org/cldr
[2]: https://www.npmjs.com/package/cldrjs
[3]: https://www.npmjs.com/package/cldr
[4]: https://github.com/unicode-org/cldr-json

PR Close #45714
2022-04-29 12:20:08 -04:00
George Kalpakas
61b6b4f710 refactor(common): minor refactoring/simplification in generate-locales-tool (#45714)
Make some minor changes in `generate-locales-tool` to make the code
simpler and/or avoid unnecessary work.

PR Close #45714
2022-04-29 12:20:08 -04:00
George Kalpakas
521bfc127c refactor(common): improve dayPeriods-related types in generate-locales-tool (#45714)
Update some TypeScript types in `generate-locales-tool/day-periods.ts`
to more closely reflect the actual shapes of the returned objects.

Examples of the related raw JSON data for the `en` locale can be seen
here:
- [dayPeriods][1]
- [dayPeriodRules][2]

[1]: https://github.com/unicode-org/cldr-json/blob/41.0.0/cldr-json/cldr-dates-full/main/en/ca-gregorian.json#L223-L300
[2]: https://github.com/unicode-org/cldr-json/blob/41.0.0/cldr-json/cldr-core/supplemental/dayPeriods.json#L404-L427

PR Close #45714
2022-04-29 12:20:08 -04:00
George Kalpakas
0e5e4e298a refactor(common): consistently name tooling related to closure-locale.ts (#45714)
Previously, some functions/targets related to the
generation/verification of the `closure-locale.ts` file included
`closure_locales` instead of `closure_locale` in their name, which was
inconsistent and confusing.
Rename all tooling to use `closure_locale` (which more closely matches
the generated file's name).

PR Close #45714
2022-04-29 12:20:08 -04:00
Kristiyan Kostadinov
29039fcdbc feat(core): support TypeScript 4.7 (#45749)
Adds support for TypeScript 4.7. Changes include:
* Bumping the TS version as well as some Bazel dependencies to include https://github.com/bazelbuild/rules_nodejs/pull/3420.
* Adding a backwards-compatibility layer for calls to `updateTypeParameterDeclaration`.
* Making `LView` generic in order to make it easier to type the context based on the usage. Currently the context can be 4 different types which coupled with stricter type checking would required a lot of extra casting all over `core`.
* Fixing a bunch of miscellaneous type errors.
* Removing assertions of `ReferenceEntry.isDefinition` in a few of the language service tests. The field isn't returned by TS anymore and we weren't using it for anything.
* Resolving in error in the language service that was caused by TS attempting to parse HTML files when we try to open them. Previous TS was silently setting them as `ScriptKind.Unknown` and ignoring the errors, but now it throws. I've worked around it by setting them as `ScriptKind.JSX`.

PR Close #45749
2022-04-29 12:19:45 -04:00
Pawel Kozlowski
fcc548a95f test(core): verify inheritance for standalone components (#45796)
This commit verifies that component inheritance works properly
for various combinations of standalone and non-stndalone components.

PR Close #45796
2022-04-29 12:19:04 -04:00
Andrew Scott
d4fc12fa19 fix(router): Remove deprecated initialNavigation option (#45729)
BREAKING CHANGE:
`initialNavigation: 'enabled'` was deprecated in v11 and is replaced by
`initialNavigation: 'enabledBlocking'`.

PR Close #45729
2022-04-28 14:40:03 -07:00
Andrew Kushnir
8dda4638b0 refactor(core): do not allow standalone flag overrides via TestBed APIs (#45788)
This commit adds a check into the TestBed APIs to throw an error if the `standalone` flag is overridden.

PR Close #45788
2022-04-28 09:47:26 -07:00
Renovate Bot
0840ece9e2 build: lock file maintenance (#45751)
PR Close #45751
2022-04-28 09:39:06 -07:00
Andrew Kushnir
a097be9497 test(core): verify importProvidersFrom work correctly with ModuleWithProviders (#45787)
This commit adds a test to make sure the NgModule providers are collected correctly by the `importProvidersFrom` function when the `ModuleWithProviders` type is used and some providers are overridden.

PR Close #45787
2022-04-28 09:37:54 -07:00
Andrew Kushnir
4e413d9240 fix(core): support nested arrays of providers in EnvironmentInjector (#45789)
This commit updates the `EnvironmentInjector` logic to support arrays of providers as an argument(for example, when an injector is created via `createEnvironmentInjector` function).

PR Close #45789
2022-04-28 09:37:18 -07:00
Pawel Kozlowski
29417935de test(core): verify nested array in standalone component imports (#45794)
This test verifies that nested arrays are supported in the standalone's
component import field.

PR Close #45794
2022-04-28 09:35:45 -07:00
Pawel Kozlowski
2f5fd41a19 refactor(core): verify that standalone entities are not declared in NgModule (#45777)
This commits adds JiT checks to verify that a standalone component, directive,
pipe are not declared in any NgModule.

PR Close #45777
2022-04-27 15:46:10 -07:00
Pawel Kozlowski
aafac7228f fix(core): verify standalone component imports in JiT (#45777)
This commits adds verifications assuring that items imported into
standalone components are one of:
- standalone component / directive / pipe;
- NgModule;
- forwardRef resolving to one of the above.
It explicitly disallows modules with providers.

PR Close #45777
2022-04-27 15:46:09 -07:00
Dylan Hunn
58e8f4b708 Revert "fix(compiler): scope css keyframes in emulated view encapsulation (#42608)" (#45786)
This reverts commit 4d6a1d6722.

PR Close #45786
2022-04-27 15:00:41 -07:00
Andrew Scott
f3eb7d9ecb fix(core): Ensure the StandaloneService is retained after closure minification (#45783)
In order to survive closure minification correctly, static properties need to
be annotated with @nocollapse.

For more history, see https://github.com/angular/angular/pull/28050

PR Close #45783
2022-04-27 13:05:33 -07:00
dario-piotrowicz
4d6a1d6722 fix(compiler): scope css keyframes in emulated view encapsulation (#42608)
Ensure that keyframes rules, defined within components with emulated
view encapsulation, are scoped to avoid collisions with keyframes in
other components.

This is achieved by renaming these keyframes to add a prefix that makes
them unique across the application.

In order to enable the handling of keyframes names defined as strings
the previous strategy of replacing quoted css content with `%QUOTED%`
(introduced in commit 7f689a2) has been removed and in its place now
only specific characters inside quotes are being replaced with
placeholder text (those are `;`, `:` and `,`, more can be added in
the future if the need arises).

Closes #33885

BREAKING CHANGE:

Keyframes names are now prefixed with the component's "scope name".
For example, the following keyframes rule in a component definition,
whose "scope name" is host-my-cmp:

   @keyframes foo { ... }

will become:

   @keyframes host-my-cmp_foo { ... }

Any TypeScript/JavaScript code which relied on the names of keyframes rules
will no longer match.

The recommended solutions in this case are to either:
- change the component's view encapsulation to the `None` or `ShadowDom`
- define keyframes rules in global stylesheets (e.g styles.css)
- define keyframes rules programmatically in code.

PR Close #42608
2022-04-27 10:27:17 -07:00
Alex Rickabaugh
3d4548450a refactor(compiler-cli): support schemas in standalone components (#45752)
This commit adds support for `@Component.schemas` in both JIT and AOT.

PR Close #45752
2022-04-27 10:25:53 -07:00
Alex Rickabaugh
882f595a13 refactor(core): support ModuleWithProviders directly in importProvidersFrom (#45722)
There were two problems with the `importProvidersFrom` function related to
`ModuleWithProviders` values:

* The public type did not accept `ModuleWithProviders` values directly.
* The implementation of `walkProviderTree` delegates collection of MWP providers
  to its caller, in order for the ordering of such providers to be correct.
  However, `importProvidersFrom` was not performing that collection, causing MWP
  providers passed in at the top level to be dropped.

PR Close #45722
2022-04-27 09:05:51 -07:00
Alex Rickabaugh
3896f570fa refactor(core): move ModuleWithProviders type (#45722)
This commit moves the ModuleWithProviders type from `metadata` to `di`, avoiding
the need for `di` to reference `metadata` (in this particular case).

PR Close #45722
2022-04-27 09:05:51 -07:00
Pawel Kozlowski
39c1681895 test(core): add more tests for the standalone components (#45709)
Add more tests verifying the following conditions:
- discovery of DI providers from exported NgModules
- forwardRef in standalone component imports

PR Close #45709
2022-04-27 09:05:33 -07:00
Pawel Kozlowski
2b5c2d6938 refactor(core): create a standalone injector during applicationBootstrap (#45766)
This commit changes the injectors hiearchy created during applicationBootstrap.
From now on a standalone injector (holding all the ambient providers of a
standalone component) is create as a child of the application injector.
This change alligns injectors hierarchy for bootstrapped and dynamically
created standalone components.

PR Close #45766
2022-04-27 09:03:50 -07:00
Andrew Scott
7b367d9d90 refactor(router): Remove unnecessary setTimeout in UrlTree redirects (#45735)
Using `setTimeout` in the Router navigation pipeline creates fragile and
unpredictable behavior. Additionally, it creates a new macrotask, which
would trigger an unnecessary change detection in the application.

This `setTimeout` was added in
15e397816f.
Both tests added in that commit still pass. Additionally, the comment
for _why_ the `setTimeout` was added doesn't really explain how the
described bug would occur. There has been a lot of work in the Router
since then to stabalize edge case scenarios so it's possible it existed
before but doesn't anymore.

Removing this `setTimeout` revealed tests that
relied on the navigation not completing. For example, the test suite did
not have a route which matched the redirect, but the test passed because
it ended before the redirect was flushed, so the `Router` never threw an
error. Similar situations exist for the other use of `setTimeout` in the Route
(the one in the location change listener).
There were no other failures in TGP other than incorrectly written
tests.

BREAKING CHANGE:
When a guard returns a `UrlTree`, the router would previously schedule
the redirect navigation within a `setTimeout`. This timeout is now removed,
which can result in test failures due to incorrectly written tests.
Tests which perform navigations should ensure that all timeouts are
flushed before making assertions. Tests should ensure they are capable
of handling all redirects from the original navigation.

PR Close #45735
2022-04-27 08:56:31 -07:00
Alex Rickabaugh
284329e51e refactor(core): delay standalone component scoping in JIT (#45720)
This commit moves standalone component scoping into the closures for
`directiveDefs` and `pipeDefs` in JIT mode. This is necessary to support
recursive standalone components, which necessarily use a `forwardRef` within
their import cycle. Previously, the JIT compiler for standalone components
attempted immediate `forwardRef` resolution, resulting in infinite recursion.

PR Close #45720
2022-04-26 10:07:41 -07:00
Alex Rickabaugh
4e0784c2f0 refactor(compiler-cli): optimize InjectorDef imports generation (#45701)
Before standalone, everything that could appear in an NgModule's `imports`
was relevant to DI, and needed to be emitted in the `imports` of the
generated `InjectorDef` definition. With the introduction of standalone
types, NgModule `imports` can now contain components, directives, and pipes
which are standalone. Only standalone components need to be included in
the `imports` of the generated injector definition - directives and pipes
have no effect on DI. Having them present doesn't cause any errors in the
runtime (they're filtered out by the injector itself) but it does prevent
tree-shaking.

With this commit, the generation of `InjectorDef` now filters the `imports`
to exclude directives and pipes as much as possible. It's not _always_
possible because an expression in `imports` may pull in both a directive and
a `ModuleWithProviders` reference, and we have no way of referencing just
the MWP part of that expression. Therefore this is an optimization, not a
rule of `InjectorDef` compilation.

PR Close #45701
2022-04-26 10:07:23 -07:00
Alex Rickabaugh
b0379c8186 refactor(compiler-cli): NgModule handler resolves imports individually (#45701)
Previously, the NgModule handler would resolve the `imports` field as one
unit, producing an array of `Reference`s. With this refactoring, if
`imports` is a literal array, each individual element will be resolved
independently. This will allow filtering in the future at the element level,
since there will be a separate `ts.Expression` for each individual element.

PR Close #45701
2022-04-26 10:07:23 -07:00
Alex Rickabaugh
18db4ef7ff refactor(compiler-cli): introduce ResolvedModuleWithProviders (#45701)
This commit updates the `ForeignFunctionResolver` used by the NgModule
handler to resolve `ModuleWithProvider` types. Previously, this resolver
returned the NgModule `Reference` directly, but there are two problems with
this:

* It's not completely accurate, as the expression returned by the MWP call
  will not return the NgModule at runtime.
* We need the ability to distinguish the MWP call itself from an ordinary
  NgModule reference in future optimizations.

PR Close #45701
2022-04-26 10:07:23 -07:00
Alex Rickabaugh
c614f31fc1 refactor(compiler-cli): rework ForeignFunctionResolvers (#45701)
This commit reworks the partial evaluation system's concept of a
ForeignFunctionResolver. Previously, resolvers were expected to return a
`ts.Expression` which the partial evaluator would continue evaluating,
eventually returning a value.

This works well for "transparent" foreign functions like `forwardRef`,
but for things like `ModuleWithProviders` it breaks down, because the
desired resolution value (the NgModule `Reference`) is _not_ the "correct"
evaluation of the function call.

To support better FFR implementations, this commit refactors the FFR system
so that resolvers operate on the `ts.CallExpression` instead, and are
given a callback to resolve further expressions if needed. If they cannot
resolve a given call expression, they have an `unresolvable` value that they
can return to indicate that.

PR Close #45701
2022-04-26 10:07:23 -07:00