angular-cn/packages/compiler-cli/ngcc/test
Alex Rickabaugh 02bab8cf90 fix(ivy): in ngcc, handle inline exports in commonjs code (#32129)
One of the compiler's tasks is to enumerate the exports of a given ES
module. This can happen for example to resolve `foo.bar` where `foo` is a
namespace import:

```typescript
import * as foo from './foo';

@NgModule({
  directives: [foo.DIRECTIVES],
})
```

In this case, the compiler must enumerate the exports of `foo.ts` in order
to evaluate the expression `foo.DIRECTIVES`.

When this operation occurs under ngcc, it must deal with the different
module formats and types of exports that occur. In commonjs code, a problem
arises when certain exports are downleveled.

```typescript
export const DIRECTIVES = [
  FooDir,
  BarDir,
];
```

can be downleveled to:

```javascript
exports.DIRECTIVES = [
  FooDir,
  BarDir,
```

Previously, ngtsc and ngcc expected that any export would have an associated
`ts.Declaration` node. `export class`, `export function`, etc. all retain
`ts.Declaration`s even when downleveled. But the `export const` construct
above does not. Therefore, ngcc would not detect `DIRECTIVES` as an export
of `foo.ts`, and the evaluation of `foo.DIRECTIVES` would therefore fail.

To solve this problem, the core concept of an exported `Declaration`
according to the `ReflectionHost` API is split into a `ConcreteDeclaration`
which has a `ts.Declaration`, and an `InlineDeclaration` which instead has
a `ts.Expression`. Differentiating between these allows ngcc to return an
`InlineDeclaration` for `DIRECTIVES` and correctly keep track of this
export.

PR Close #32129
2019-08-15 14:45:59 -07:00
..
analysis refactor(ivy): ngcc - remove `formatProperty` from `EntryPointBundle` (#32052) 2019-08-08 11:14:38 -07:00
dependencies fix(ivy): ngcc - do not consider builtin NodeJS modules as missing (#31872) 2019-08-05 13:06:49 -07:00
entry_point_finder fix(ivy): ngcc - handle pathMappings to files rather then directories (#30525) 2019-07-09 09:40:46 -07:00
helpers refactor(ivy): ngcc - remove `formatProperty` from `EntryPointBundle` (#32052) 2019-08-08 11:14:38 -07:00
host fix(ivy): in ngcc, handle inline exports in commonjs code (#32129) 2019-08-15 14:45:59 -07:00
integration fix(ivy): ngcc - correctly update `package.json` when `createNewEntryPointFormats` is true (#32052) 2019-08-08 11:14:38 -07:00
logging feat(compiler-cli): ngcc - make logging more configurable (#29591) 2019-04-01 11:53:28 -07:00
migrations refactor(ivy): ngcc - remove `formatProperty` from `EntryPointBundle` (#32052) 2019-08-08 11:14:38 -07:00
packages feat(ivy): show error when trying to publish NGCC'd packages (#32031) 2019-08-08 11:17:38 -07:00
rendering refactor(ivy): combine query load instructions (#32100) 2019-08-12 10:32:08 -07:00
writing fix(ivy): ngcc - correctly update `package.json` when `createNewEntryPointFormats` is true (#32052) 2019-08-08 11:14:38 -07:00
BUILD.bazel feat(ivy): ngcc - support ngcc "migrations" (#31544) 2019-07-23 21:11:40 -07:00
utils_spec.ts refactor(ivy): ngcc - implement new module resolver (#29643) 2019-04-29 12:37:21 -07:00