1280 Commits

Author SHA1 Message Date
Kara Erickson
970b58b13f refactor(core): move server-only DomAdapter methods into ServerRenderer ()
PR Close 
2019-09-03 11:59:39 -07:00
Pete Bacon Darwin
a7f61e63fa refactor(ivy): remove i18nConfigureLocalize instruction ()
This has been replaced by the `loadTranslations()` function in
`@angular/localize/run_time`.

PR Close 
2019-08-30 12:53:26 -07:00
Pete Bacon Darwin
fa79f51645 refactor(ivy): update the compiler to emit $localize tags ()
This commit changes the Angular compiler (ivy-only) to generate `$localize`
tagged strings for component templates that use `i18n` attributes.

BREAKING CHANGE

Since `$localize` is a global function, it must be included in any applications
that use i18n. This is achieved by importing the `@angular/localize` package
into an appropriate bundle, where it will be executed before the renderer
needs to call `$localize`. For CLI based projects, this is best done in
the `polyfills.ts` file.

```ts
import '@angular/localize';
```

For non-CLI applications this could be added as a script to the index.html
file or another suitable script file.

PR Close 
2019-08-30 12:53:26 -07:00
Andrew Scott
260217a800 fix(ivy): Prevent errors when querying for elements outside Angular context ()
DebugElement.query also searches elements that may have been created
outside of Angular (ex: with `document.appendChild`). The current
behavior attempts to get the LContext of these nodes but throws an error
because the LContext does not exist.

PR Close 
2019-08-30 12:51:34 -07:00
cexbrayat
c8b065524e refactor(ivy): cleanup di tests from render3 ()
The tests were already migrated to acceptance with `ngFor`/`ngIf`, but were leftover in case JS blocks ended up supported in Ivy.

PR Close 
2019-08-30 12:49:04 -07:00
Pawel Kozlowski
8dc3f3647c perf(ivy): properly initialise global state in the element_text_create benchmark ()
PR Close 
2019-08-30 12:42:28 -07:00
Matias Niemelä
ba5e07efc7 perf(ivy): add a micro benchmark for map-based style and class bindings ()
This patch introduces a new micro benchmark that performance tests
against map-based style and class bindings in Ivy running together
on the same element.

PR Close 
2019-08-30 13:52:35 -04:00
Matias Niemelä
df8e6750a1 perf(ivy): add a micro benchmark for style and class bindings ()
This patch introduces a new micro benchmark that performance tests
against style and class bindings in Ivy running together on the same
element.

PR Close 
2019-08-30 13:52:35 -04:00
Misko Hevery
77c382ccba feat(core): Adds DI support for providedIn: 'platform'|'any' ()
Extend the vocabulary of the `providedIn` to also include  `'platform'` and `'any'`` scope.
```
@Injectable({
  providedId: 'platform', // tree shakable injector for platform injector
})
class MyService {...}
```

PR Close 
2019-08-29 21:51:56 -07:00
Misko Hevery
8a47b48912 refactor: Move dom_adapter.ts to @angular/common ()
This work is needed in preparation for turning tokens into tree-shakable injectables.

PR Close 
2019-08-29 21:51:56 -07:00
Kara Erickson
7742a99cee ci: update size benchmarks for core with 9.0.0-next.4 ()
PR Close 
2019-08-28 21:39:24 -07:00
Pawel Kozlowski
5635505f2e refactor(ivy): remove unused ɵɵtextBinding instruction ()
PR Close 
2019-08-28 21:37:15 -07:00
Carlos Ortiz García
3aba7ebe6a feat(core): Introduce TestBed.inject to replace TestBed.get ()
TestBed.get is not type safe, fixing it would be a massive breaking
change. The Angular team has proposed replacing it with TestBed.inject
and deprecate TestBed.get.

Deprecation from TestBed.get will come as a separate commit.

Issue 
Fixes 

BREAKING CHANGE: Injector.get now accepts abstract classes to return
type-safe values. Previous implementation returned `any` through the
deprecated implementation.

PR Close 
2019-08-28 21:26:46 -07:00
Pawel Kozlowski
85864ed9f7 perf(ivy): add element and text creation benchmark ()
PR Close 
2019-08-28 17:12:38 -07:00
Kara Erickson
f3e4cb491e refactor(core): remove testing-only event utilities from DomAdapters ()
PR Close 
2019-08-28 17:10:30 -07:00
Kara Erickson
cb5701f8d9 refactor(core): remove testing-only node getters and invoke() from DomAdapters ()
PR Close 
2019-08-28 17:10:30 -07:00
Kara Erickson
c0680602f9 refactor(core): remove testing-only childNodes() and firstChild() fns from DomAdapters ()
PR Close 
2019-08-28 17:10:30 -07:00
Kara Erickson
30dabdf8fc refactor(core): remove testing-only DOM manipulation utils from DomAdapters ()
PR Close 
2019-08-28 17:10:30 -07:00
Kara Erickson
ede5786d1e refactor(core): remove testing-only style utils from DomAdapters ()
PR Close 
2019-08-28 17:10:29 -07:00
Kristiyan Kostadinov
c885178d5f refactor(ivy): move directive, component and pipe factories to ngFactoryFn ()
Reworks the compiler to output the factories for directives, components and pipes under a new static field called `ngFactoryFn`, instead of the usual `factory` property in their respective defs. This should eventually allow us to inject any kind of decorated class (e.g. a pipe).

**Note:** these changes are the first part of the refactor and they don't include injectables. I decided to leave injectables for a follow-up PR, because there's some more cases we need to handle when it comes to their factories. Furthermore, directives, components and pipes make up most of the compiler output tests that need to be refactored and it'll make follow-up PRs easier to review if the tests are cleaned up now.

This is part of the larger refactor for FW-1468.

PR Close 
2019-08-27 13:57:00 -07:00
Andrew Scott
14feb56139 fix(ivy): debug node names should match user declaration ()
PR Close 
2019-08-27 13:55:59 -07:00
Pawel Kozlowski
0874bf42b6 perf(ivy): store binding metadata in the ngDevMode only ()
Binding metadata are only needed:
- for property bindings;
- when TestBed tests are being run.

This commit guards binding metadata storage with the ngDevMode flag
which saves ~6% of a proerty binding processing time in the production
mode (and reduces bundle size).

PR Close 
2019-08-26 16:19:02 -07:00
Pawel Kozlowski
e63a7b0532 refactor(ivy): replace enter / leave view with selectView ()
After a series of recent refactorings `enterView` and `leaveView` became
identical. This PR merges both into one concept of view selectio (similar
to a node selection). This reduces number of concepts and code size.

PR Close 
2019-08-26 13:18:28 -07:00
Kara Erickson
cf4b944865 refactor(core): remove misc dom utils from DomAdapters ()
PR Close 
2019-08-26 10:39:09 -07:00
Kara Erickson
28c8b03797 refactor(core): remove shadow dom utility from DomAdapters ()
PR Close 
2019-08-26 10:39:09 -07:00
Kara Erickson
bceeeba405 refactor(core): remove animation utilities from DomAdapters ()
PR Close 
2019-08-26 10:39:09 -07:00
Kara Erickson
7bcd42e7be refactor(core): remove cookie and comment testing utilities from DomAdapters ()
PR Close 
2019-08-26 10:39:09 -07:00
Kara Erickson
4908a5cffc refactor(core): remove unused attribute utilities from DomAdapters ()
PR Close 
2019-08-26 10:39:09 -07:00
Kara Erickson
c3f9893d81 refactor(core): remove innerHTML and outerHTML testing utilities from DomAdapters ()
PR Close 
2019-08-26 10:39:09 -07:00
Andrew Kushnir
6b245a39ee fix(ivy): reset binding index before executing a template in refreshView call ()
Prior to this change, the `BINDING_INDEX` of a given lView was reset after processing a template. However change detection can be triggered as a result of View queries processing, thus leading to subsequent `refreshView` call (and executing a template), which in turn operates with the binding index that is not reset after the previous `refreshView` call. This commit updates the logic to reset binding index before we execute a template, so binding index is correct for instructions inside template function.

PR Close 
2019-08-22 10:16:24 -07:00
Pawel Kozlowski
53bfa7c6d6 perf(ivy): improve NaN checks in change detection ()
This commit drops our custom, change-detection specific, equality comparison util
in favour of the standard Object.is which has desired semantics.

There are multiple advantages of this approach:
- less code to maintain on our end;
- avoid NaN checks if both values are equal;
- re-write NaN checks so we don't trigger V8 deoptimizations.

PR Close 
2019-08-21 11:45:51 -07:00
Pawel Kozlowski
10629600c5 perf(ivy): split hooks processing into init and check phases ()
Angular hooks come after 2 flavours:
- init hooks (OnInit, AfterContentInit, AfterViewInit);
- check hooks (OnChanges, DoChanges, AfterContentChecked, AfterViewChecked).

We need to do more processing for init hooks to ensure that those hooks
are run once and only once for a given directive (even in case of errors).
As soon as all init hooks execute to completion we are only left with the
checks to execute.

It turns out that keeping track of the remaining init hooks to execute is
rather expensive (multiple LView flags reads, writes and checks). But we can
observe that non of this tracking is needed as soon as all init hooks are
completed.

This PR takes advantage of the above observations and splits hooks processing
functions into:
- init-specific (slower but less common);
- check-specific (faster and more common).

NOTE: there is code duplication in this PR and it is left like this intentinally:
hand-inlining this perf-critical code makes the view refresh process substentially
faster.

PR Close 
2019-08-21 11:44:27 -07:00
Miško Hevery
64770571b2 perf: don't create holey arrays ()
Don't use `Array` constructor with the size value (ex. `new Array(5)`) - this will create a `HOLEY_ELEMENTS` array (even if this array is filled in later on!);

https://v8.dev/blog/elements-kinds
https://stackoverflow.com/questions/32054170/how-to-resize-an-array

PR Close 
2019-08-21 08:27:43 -07:00
Andrew Scott
3dbc4ab572 fix(ivy): get name directly from nativeNode ()
nativeElement can return null so an error can occur when accessing
nodeName from nativeElement.

PR Close 
2019-08-20 09:57:17 -07:00
atscott
cfed0c0cf1 fix(ivy): Support selector-less directive as base classes ()
Following , this adds support for directives without a selector to
Ivy.

PR Close 
2019-08-20 09:56:54 -07:00
Misko Hevery
994264c0ba refactor(ivy): simplify walkTNodeTree method for readability ()
PR Close 
2019-08-19 10:12:38 -07:00
Pawel Kozlowski
172bb76964 docs(ivy): update micro-benchmark instructions ()
PR Close 
2019-08-19 10:10:39 -07:00
Pawel Kozlowski
4c3b791ff3 perf(ivy): avoid first template pass checks during view creation ()
PR Close 
2019-08-15 14:46:26 -07:00
Miško Hevery
2e4d17f3a9 perf(core): make sanitization tree-shakable in Ivy mode ()
In VE the `Sanitizer` is always available in `BrowserModule` because the VE retrieves it using injection.

In Ivy the injection is optional and we have instructions instead of component definition arrays. The implication of this is that in Ivy the instructions can pull in the sanitizer only when they are working with a property which is known to be unsafe. Because the Injection is optional this works even if no Sanitizer is present. So in Ivy we first use the sanitizer which is pulled in by the instruction, unless one is available through the `Injector` then we use that one instead.

This PR does few things:
1) It makes `Sanitizer` optional in Ivy.
2) It makes `DomSanitizer` tree shakable.
3) It aligns the semantics of Ivy `Sanitizer` with that of the Ivy sanitization rules.
4) It refactors `DomSanitizer` to use same functions as Ivy sanitization for consistency.

PR Close 
2019-08-15 10:30:12 -07:00
Pawel Kozlowski
253a1125bf test(ivy): add style binding node-based micro benchmark ()
PR Close 
2019-08-15 09:55:03 -07:00
Pawel Kozlowski
f41c41fd50 test(ivy): add property binding node-based micro benchmark ()
PR Close 
2019-08-15 09:55:03 -07:00
Pawel Kozlowski
33fab26930 test(ivy): remove code duplication from node perf benchmarks ()
PR Close 
2019-08-15 09:55:03 -07:00
Pawel Kozlowski
be665d8de1 perf(ivy): interpolation micro-benchmark ()
PR Close 
2019-08-15 09:55:03 -07:00
Pawel Kozlowski
c422c7210f perf(ivy): noop change detection micro-benchmark ()
PR Close 
2019-08-15 09:55:03 -07:00
Pete Bacon Darwin
7a75f7805c build(core): add missing tsconfig-build.json dependency ()
For some reason (on OS/X) this transitive dependency is not being passed
through to the final TS builds that rely on this rule, so the build fails
with a missing file error:

```
The specified path does not exist:
'/.../sandbox/darwin-sandbox/451/execroot/angular/packages/tsconfig-build.json'.
```

PR Close 
2019-08-14 11:56:13 -07:00
Pawel Kozlowski
b9dfe66028 perf(ivy): split view processing into render (create) and refresh (update) pass ()
PR Close 
2019-08-13 15:22:42 -07:00
Kristiyan Kostadinov
914900a561 refactor(ivy): remove load instruction ()
These changes remove the `ɵɵload` instruction which isn't being generated anymore.

PR Close 
2019-08-12 12:55:18 -07:00
Kristiyan Kostadinov
4ea3e7e000 refactor(ivy): combine query load instructions ()
Combines the `loadViewQuery` and `loadContentQuery` instructions since they have the exact same internal logic. Based on a discussion here: https://github.com/angular/angular/pull/32067#pullrequestreview-273001730

PR Close 
2019-08-12 10:32:08 -07:00
Pete Bacon Darwin
0ddf0c4895 fix(compiler): do not remove whitespace wrapping i18n expansions ()
Similar to interpolation, we do not want to completely remove whitespace
nodes that are siblings of an expansion.

For example, the following template

```html
<div>
  <strong>items left<strong> {count, plural, =1 {item} other {items}}
</div>
```

was being collapsed to

```html
<div><strong>items left<strong>{count, plural, =1 {item} other {items}}</div>
```

which results in the text looking like

```
items left4
```

instead it should be collapsed to

```html
<div><strong>items left<strong> {count, plural, =1 {item} other {items}}</div>
```

which results in the text looking like

```
items left 4
```

---

**Analysis of the code and manual testing has shown that this does not cause
the generated ids to change, so there is no breaking change here.**

PR Close 
2019-08-09 12:03:50 -07:00
Pawel Kozlowski
9d1f43f3ba perf(ivy): remove unnecessary view type checks ()
PR Close 
2019-08-08 12:13:00 -07:00