3281 Commits

Author SHA1 Message Date
Kristiyan Kostadinov
c0757d1d44 fix(ivy): attached flag not being reset when view is destroyed ()
Currently we only reset the `Attached` flag of a view if it is detached through its parent, however this means that if a root view is destroyed, its flag will never be reset. This manifested itself in one of the Material tests where we were destroying the root view.

This PR resolves FW-1130.

PR Close 
2019-03-01 16:56:03 -08:00
Alex Rickabaugh
a06824aef6 fix(ivy): correctly evaluate enum references in template expressions ()
The ngtsc partial evaluator previously would not handle an enum reference
inside a template string expression correctly. Enums are resolved to an
`EnumValue` type, which has a `resolved` property with the actual value.

When effectively toString-ing a `ResolvedValue` as part of visiting a
template expression, the partial evaluator needs to translate `EnumValue`s
to their fully resolved value, which this commit does.

PR Close 
2019-03-01 15:47:24 -08:00
Alex Eagle
ba602dbaec build: update Bazel to 0.23 ()
PR Close 
2019-03-01 15:24:05 -08:00
Alex Rickabaugh
b1df9a30f4 fix(ivy): use the imported name of decorators for detection ()
Currently, ngtsc has a bug where if you alias the name of a decorator when
importing it, it won't be detected properly. This is because the compiler
uses the aliased name and not the original, declared name of the decorator
for detection.

This commit fixes the compiler to compare against the declared name of
decorators when available, and adds a test to prevent regression.

PR Close 
2019-03-01 15:19:34 -08:00
Alex Rickabaugh
3e5c1bcb9f fix(ivy): track cyclic imports that are added ()
ngtsc has cyclic import detection, to determine when adding an import to a
directive or pipe would create a cycle. However, this detection must also
account for already inserted imports, as it's possible for both directions
of a circular import to be inserted by Ivy (as opposed to at least one of
those edges existing in the user's program).

This commit fixes the circular import detection for components to take into
consideration already added edges. This is difficult for one critical
reason: only edges to files which will *actually* be imported should be
considered. However, that depends on which directives & pipes are used in
a given template, which is currently only known by running the
TemplateDefinitionBuilder during the 'compile' phase. This is too late; the
decision whether to use remote scoping (which consults the import graph) is
made during the 'resolve' phase, before any compilation has taken place.

Thus, the only way to correctly consider synthetic edges is for the compiler
to know exactly which directives & pipes are used in a template during
'resolve'. There are two ways to achieve this:

1) refactor `TemplateDefinitionBuilder` to do its work in two phases, with
directive matching occurring as a separate step which can be performed
earlier.

2) use the `R3TargetBinder` in the 'resolve' phase to independently bind the
template and get information about used directives.

Option 1 is ideal, but option 2 is currently used for practical reasons. The
cost of binding the template can be shared with template-typechecking.

PR Close 
2019-03-01 15:18:50 -08:00
Alex Rickabaugh
b50283ed67 fix(ivy): support dynamic host attribute bindings ()
In the @Component decorator, the 'host' field is an object which represents
host bindings. The type of this field is complex, but is generally of the
form {[key: string]: string}. Several different kinds of bindings can be
specified, depending on the structure of the key.

For example:

```
@Component({
  host: {'[prop]': 'someExpr'}
})
```

will bind an expression 'someExpr' to the property 'prop'. This is known to
be a property binding because of the square brackets in the binding key.

If the binding key is a plain string (no brackets or parentheses), then it
is known as an attribute binding. In this case, the right-hand side is not
interpreted as an expression, but is instead a constant string.

There is no actual requirement that at build time, these constant strings
are known to the compiler, but this was previously enforced as a side effect
of requiring the binding expressions for property and event bindings to be
statically known (as they need to be parsed). This commit breaks that
relationship and allows the attribute bindings to be dynamic. In the case
that they are dynamic, the references to the dynamic values are reflected
into the Ivy instructions for attribute bindings.

PR Close 
2019-03-01 15:18:13 -08:00
Alex Rickabaugh
a23a0bc3a4 feat(ivy): support tracking the provenance of DynamicValue ()
DynamicValues are generated whenever a partially evaluated expression is
unable to be resolved statically. They contain a reference to the ts.Node
which wasn't resolvable.

They can also be nested. For example, the expression 'a + b' is resolvable
only if 'a' and 'b' are themselves resolvable. If either 'a' or 'b' resolve
to a DynamicValue, the whole expression must also resolve to a DynamicValue.

Previously, if 'a' resolved to a DynamicValue, the entire expression might
have been resolved to the same DynamicValue. This correctly indicated that
the expression wasn't resolvable, but didn't return a reference to the
shallow node that couldn't be resolved (the expression 'a + b'), only a
reference to the deep node that couldn't be resolved ('a').

In certain situations, it's very useful to know the shallow unresolvable
node (for example, to use it verbatim in the output). To support this,
the partial evaluator is updated to always wrap DynamicValue to point to
each unresolvable expression as it's processed, ensuring the receiver can
determine exactly which expression node failed to resolve.

PR Close 
2019-03-01 15:18:13 -08:00
Kara Erickson
7ac58bec8a fix(ivy): move views that are already attached in insert() ()
Currently if a user accidentally calls ViewContainerRef.insert() with
a view that has already been attached, we do not clean up the references
properly, so we create a view tree with a cycle. This causes an infinite
loop when the view is destroyed.

This PR ensures that we fall back to ViewContainerRef.move() behavior
if we try to insert a view that is already attached. This fixes the
cycle and honors the user intention.

PR Close 
2019-03-01 15:17:24 -08:00
Matias Niemelä
ff8e4dddb2 test(animations): fix unit-based delays within the animation DSL ()
Closes 

PR Close 
2019-03-01 15:16:48 -08:00
Misko Hevery
f01d1c4c8d docs(ivy): add link to recursive benchmark ()
PR Close 
2019-03-01 10:17:33 -08:00
Alan
b5629d98d8 fix(bazel): api extractor don't generate tsdoc metadata ()
tsdoc metadata is not needed for `ng_module` and with `@microsoft/api-extractor` version 7.0.21 there is a new flag to disable it's generation.

See: https://github.com/Microsoft/web-build-tools/issues/1051

PR Close 
2019-03-01 10:16:43 -08:00
Keen Yee Liau
c532646f5b fix(bazel): ng serve should always watch ()
PR Close 
2019-02-28 12:07:25 -08:00
Greg Magolan
ea09430039 build: rules_nodejs 0.26.0 & use @npm instead of @ngdeps now that downstream angular build uses angular bundles ()
PR Close 
2019-02-28 12:06:36 -08:00
Keen Yee Liau
5fdf24e843 fix(bazel): add favicon to web package ()
This would fix the RESOURCE_NOT_FOUND error.

PR Close 
2019-02-28 10:38:00 -08:00
Rado Kirov
03d2e5cb1d refactor: Consistently use index access on index signature types. ()
This change helps highlight certain misoptimizations with Closure
compiler. It is also stylistically preferable to consistently use index
access on index sig types.

Roughly, when one sees '.foo' they know it is always checked for typos
in the prop name by the type system (unless 'any'), while "['foo']" is
always not.

Once all angular repos are conforming this will become a tsetse.info
check, enforced by bazel.

PR Close 
2019-02-28 02:49:14 -08:00
Pete Bacon Darwin
cb20b3b40a docs(compiler): correct lexer argument descriptions ()
PR Close 
2019-02-28 02:44:19 -08:00
Pete Bacon Darwin
f7c867ebc2 fix(ivy): correctly tokenize escaped characters in templates ()
Previously the start of a character indicated by an escape sequence
was being incorrectly computed by the lexer, which caused tokens
to include the start of the escaped character sequence in the
preceding token. In particular this affected the name extracted
from opening tags if the name was terminated by an escape sequence.
For example, `<t\n>` would have the name `t\` rather than `t`.

This fix refactors the lexer to use a "cursor" object to iterate over
the characters in the template source. There are two cursor implementations,
one expects a simple string, the other expects a string that contains
JavaScript escape sequences that need to be unescaped.

PR Close 
2019-02-28 02:44:19 -08:00
Pete Bacon Darwin
76979e12c9 refactor(compiler): remove not-null operator hack from lexer ()
The parts of a token are supposed to be an array of not-null strings,
but we were using `null` for tags that had no prefix. This has been
fixed to use the empty string in such cases, which allows the `null !`
hack to be removed.

PR Close 
2019-02-28 02:44:19 -08:00
Andrew Kushnir
772b24ccc3 fix(ivy): avoid missing imports for types that can be represented as values ()
Prior to this change, TypeScript stripped out some imports in case we reference a type that can be represented as a value (for ex. classes). This fix ensures that we use correct symbol identifier, which makes TypeScript retain the necessary import statements.

PR Close 
2019-02-27 15:13:40 -08:00
Pawel Kozlowski
91a161aa13 refactor(ivy): simplify logic of projectable nodes insertion ()
This commit removes code duplication around projectables nodes insertion.
It also simplfy the overall logic by using recursive function calls instead
of hand-unrolled stack (we can always optimise this part if needed).

PR Close 
2019-02-27 14:05:34 -08:00
Kristiyan Kostadinov
efa10e33a9 fix(ivy): resolve forwardRef when analyzing NgModule ()
Fixes forward refs not being resolved when an NgModule is being analyzed by ngtsc.

This PR resolves FW-1094.

PR Close 
2019-02-27 14:02:41 -08:00
Matias Niemelä
a6ae759b46 fix(animations): ensure position and display styles are handled outside of keyframes/web-animations ()
When web-animations and/or CSS keyframes are used for animations certain
CSS style values (such as `display` and `position`) may be ignored by a
keyframe-based animation. Angular should special-case these styles to
ensure that they get applied as inline styles throughout the duration of
the animation.

Closes 
Closes 

Jira Issue: FW-1091
Jira Issue: FW-1092

PR Close 
2019-02-27 11:57:31 -08:00
Alex Rickabaugh
827e89cfc4 feat(ivy): support inline <style> and <link> tags in components ()
Angular supports using <style> and <link> tags inline in component
templates, but previously such tags were not implemented within the ngtsc
compiler. This commit introduces that support.

FW-1069 #resolve

PR Close 
2019-02-27 11:56:40 -08:00
Andrew Kushnir
40833ba54b fix(ivy): process property bindings in i18n blocks similar to non-i18n bindings ()
Prior to this change i18n block bindings were converted to Expressions right away (once we first access them), when in non-i18n cases we processed them differently: the actual conversion happens at instructions generation. Because of this discrepancy, the output for bindings in i18n blocks was generated incorrectly (with invalid indicies in pipeBindN fns and invalid references to non-existent local variables). Now the bindings processing is unified and i18nExp instructions should contain right bind expressions.

PR Close 
2019-02-27 11:56:12 -08:00
Alan Agius
34bdebcdd2 feat(ivy): add support for windows concrete types for paths ()
This commit introduces support for the windows paths in the new concrete types mechanism that was introduced in this PR https://github.com/angular/angular/pull/28523

Normalized posix paths that start with either a `/` or `C:/` are considered to be an absolute path.

Note: `C:/` is used as a reference, as other drive letters are also supported.

Fixes 

PR Close 
2019-02-27 11:27:04 -08:00
Andrew Kushnir
034de06ab1 fix(ivy): avoid duplicate i18n consts to be present in generated output ()
Prior to this change, the logic that outputs i18n consts (like `const MSG_XXX = goog.getMsg(...)`) didn't have a check whether a given const that represent a certain i18n message was already included into the generated output. This commit adds the logic to mark corresponding i18n contexts after translation was generated, to avoid duplicate consts in the output.

PR Close 
2019-02-27 10:33:41 -08:00
George Kalpakas
2dd44d712d ci(core): fix legacy-unit-tests-saucelabs job ()
Karma is not configured to retrieve the imported scripts using those
absolute deep paths. Using relative paths instead.
See [here][1] for an example failing job.

[1]: https://circleci.com/gh/angular/angular/220751

PR Close 
2019-02-27 10:32:40 -08:00
Alex Rickabaugh
d127d05dc3 fix(ivy): correctly resolve shorthand property declarations ()
The partial evaluator in ngtsc can handle a shorthand property declaration
in the middle evaluation, but fails if evaluation starts at the shorthand
property itself. This is because evaluation starts at the ts.Identifier
of the property (the ts.Expression representing it), not the ts.Declaration
for the property.

The fix for this is to detect in TypeScriptReflectionHost when a ts.Symbol
refers to a shorthand property, and to use the ts.TypeChecker method
getShorthandAssignmentValueSymbol() to resolve the value of the assignment
instead.

FW-1089 #resolve

PR Close 
2019-02-27 08:48:54 -08:00
Greg Magolan
7b944c46d3 style: format ()
PR Close 
2019-02-27 08:47:26 -08:00
Greg Magolan
c4c3c1231b build(bazel): allow a user to control a subset of angularCompilerOption in their tsconfig file when using ng_module ()
PR Close 
2019-02-27 08:47:26 -08:00
Wassim Chegham
dad5a258b8 style: enforce buildifier lint on CI ()
PR Close 
2019-02-26 16:57:41 -08:00
Wassim Chegham
ce68b4d839 style: enforce buildifier lint on CI ()
PR Close 
2019-02-26 16:57:41 -08:00
Keen Yee Liau
dc335194ab fix(bazel): Add SHA256 for rules_sass ()
This will make the debugging output go away
DEBUG: Rule 'io_bazel_rules_sass' modified arguments {"sha256": "6caffb8277b3033d6b5117b77437faaa6cd3c6679d6d6c81284511225aa54711"}

PR Close 
2019-02-26 16:56:47 -08:00
George Kalpakas
262ba67525 fix(core): traverse and sanitize content of unsafe elements ()
In the past, the sanitizer would remove unsafe elements, but still
traverse and sanitize (and potentially preserve) their content. This was
problematic in the case of `<style></style>` tags, whose content would
be converted to HTML text nodes.

In order to fix this, the sanitizer's behavior was changed in  to
ignore the content of _all_ unsafe elements. While this fixed the
problem with `<style></style>` tags, it unnecessarily removed the
contents for _any_ unsafe element. This was an unneeded breaking change.

This commit partially restores the old sanitizer behavior (namely
traversing content of unsafe elements), but introduces a list of
elements whose content should not be traversed if the elements
themselves are considered unsafe. Currently, this list contains `style`,
`script` and `template`.

Related to  and .

Fixes 

PR Close 
2019-02-26 13:32:09 -08:00
Marc Laval
dc9f0af080 fix(ivy): static host classes and styles should work on root component ()
PR Close 
2019-02-26 13:29:36 -08:00
Marc Laval
8f8f9a6e61 fix(ivy): ngtsc should correctly bind to context in nested template with many bindings ()
PR Close 
2019-02-26 11:54:13 -08:00
Kristiyan Kostadinov
25a2fef303 fix(ivy): ViewRef.rootNodes not including projected nodes ()
Currently if an embedded view contains projected nodes, its `rootNodes` array will include `null` instead of the root nodes inside the projection slot. This manifested itself in one of the Material unit tests where we stamp out a template and then move its `rootNodes` into the overlay container.

This PR is related to FW-1087.

PR Close 
2019-02-26 10:49:01 -08:00
Adam Yi
edb6c2d814 feat(bazel): add ts_config extending support for ng_module ()
PR Close 
2019-02-26 02:01:37 +00:00
Misko Hevery
3cb497c6ac refactor(ivy): simplify differentiation of LView, RNode, LView, LContainer, StylingContext ()
For efficiency reasons we often put several different data types (`RNode`, `LView`, `LContainer`,
`StylingContext`) in same location in `LView`. This is because we don't want to pre-allocate
space
for it because the storage is sparse. This file contains utilities for dealing with such data
types.
How do we know what is stored at a given location in `LView`.
- `Array.isArray(value) === false` => `RNode` (The normal storage value)
- `Array.isArray(value) === true` => than the `value[0]` represents the wrapped value.
  - `typeof value[TYPE] === 'object'` => `LView`
     - This happens when we have a component at a given location
  - `typeof value[TYPE] === 'number'` => `StylingContext`
     - This happens when we have style/class binding at a given location.
  - `typeof value[TYPE] === true` => `LContainer`
     - This happens when we have `LContainer` binding at a given location.
NOTE: it is assumed that `Array.isArray` and `typeof` operations are very efficient.

PR Close 
2019-02-26 02:01:07 +00:00
Misko Hevery
bd65f58784 refactor(ivy): moved wrapped reference to 0 position in array ()
`LView`, `LContainer`, `StylingContext` are all arrays which wrap either
an `HTMLElement`, `LView`, `LContainer`, `StylingContext`. It is often
necessary to retrieve the correct type of element from the location
which means that we often have to wrap the arrays. Logically it makes
more sense if the thing  which we are wrapping is at `0` location. Also
it may be more performant since data is more local which may result in
more L2 cache hits in CPU.
PR Close 
2019-02-26 02:01:07 +00:00
Misko Hevery
22880eae16 feat(ivy): add debug view of internal deta structures ()
This change contains conditionally attached classes which provide human readable (debug) level
information for `LView`, `LContainer` and other internal data structures. These data structures
are stored internally as array which makes it very difficult during debugging to reason about the
current state of the system.

Patching the array with extra property does change the array's hidden class' but it does not
change the cost of access, therefore this patching should not have significant if any impact in
`ngDevMode` mode. (see: https://jsperf.com/array-vs-monkey-patch-array)

So instead of seeing:

```
Array(30) [Object, 659, null, …]
```

```
LViewDebug {
  views: [...],
  flags: {attached: true, ...}
  nodes: [
    {html: '<div id="123">', ..., nodes: [
      {html: '<span>', ..., nodes: null}
    ]}
  ]
}
```

PR Close 
2019-02-25 08:15:35 -08:00
Brandon
f79cd5963e docs(core): export the ...Decorator interfaces to ensure they are documented ()
If an interface is not exported publicly from its package, then the doc-gen
does not see it, and so cannot include it in the generated documentation.

This was the case for a number of `...Decorator` interfaces, such as
`PipeDecorator` and `InputDecorator.

This commit adds these interfaces to the public export to fix this problem.

PR Close 
2019-02-24 12:40:02 -08:00
Alex Eagle
350802b207 build: update to latest bazel rules ()
PR Close 
2019-02-22 17:27:09 -08:00
Filipe Silva
f75acbd99b fix(compiler): use correct variable in invalid function ()
Related to  (but does not close it).

PR Close 
2019-02-22 15:06:05 -08:00
Sarun Intaralawan
395fb186a4 docs(router): reword relativeLinkResolution docs to not mention version numbers ()
PR Close 
2019-02-22 14:35:54 -08:00
Ben Lesh
c64b13e593 refactor(ivy): split util functions into different files ()
Google3 detected circular references here, so splitting up this rather hodge-podge list of functions into slightly better organizational units.

PR Close 
2019-02-22 13:17:30 -08:00
Ben Lesh
7bae49b419 fix(ivy): assertDomNode will now work properly in a worker ()
PR Close 
2019-02-22 13:17:30 -08:00
Ben Lesh
929fe029c2 refactor(ivy): LView is a proper linked list ()
- TView no longer stores childIndex
- LView now as CHILD_HEAD and CHILD_TAIL

TView used to store the head of the list, therefor all LViews had to have the same head, which is incorrect.

PR Close 
2019-02-22 13:17:30 -08:00
Ben Lesh
ba6aa93aa3 refactor(ivy): LContainer now stored in LView[PARENT] ()
- Removes CONTAINER_INDEX
- LView[PARENT] now contains LContainer when necessary
- Removes now unused arguments to methods after refactor

PR Close 
2019-02-22 13:17:30 -08:00
Greg Magolan
75357ecb32 build(bazel): run a number of web tests with karma_web_test in saucelabs in CircleCI ()
PR Close 
2019-02-22 13:07:08 -08:00