Compare commits
35 Commits
9.1.3
...
5.0.0-rc.9
Author | SHA1 | Date | |
---|---|---|---|
f5b7f2b9a5 | |||
509f392ab0 | |||
cf5fce8d5e | |||
f1248b69e6 | |||
4498dddbe3 | |||
812786f44e | |||
de24d54517 | |||
c295aeeca2 | |||
a8add78fe1 | |||
e3a16ed02d | |||
fd37f3fbab | |||
85e95cc32b | |||
de71ba74bb | |||
a01c877534 | |||
2d508a3ef0 | |||
4285b6c3e3 | |||
5542517b9c | |||
fef3539608 | |||
f4d5729cb3 | |||
d343bf7885 | |||
9ce7f0e538 | |||
4a23df3909 | |||
14016c781f | |||
47caebfe86 | |||
5cfd9c6020 | |||
47bc6f105d | |||
40fa2593a9 | |||
680bcf7b8a | |||
ef08330341 | |||
6cc042e2ba | |||
9b26455740 | |||
18bce5987c | |||
f1108fea76 | |||
64b3e3e41a | |||
a82f863e24 |
63
CHANGELOG.md
63
CHANGELOG.md
@ -1,3 +1,66 @@
|
||||
<a name="5.0.0-rc.9"></a>
|
||||
# [5.0.0-rc.9](https://github.com/angular/angular/compare/5.0.0-rc.8...5.0.0-rc.9) (2017-10-31)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **compiler:** always use relative paths to refer to generated code ([fd37f3f](https://github.com/angular/angular/commit/fd37f3f)), closes [#20031](https://github.com/angular/angular/issues/20031)
|
||||
* **compiler:** re-export less symbols in `.ngfactory.ts` files ([#19884](https://github.com/angular/angular/issues/19884)) ([e3a16ed](https://github.com/angular/angular/commit/e3a16ed)), closes [#19883](https://github.com/angular/angular/issues/19883)
|
||||
* **compiler:** report errors properly in G3 in certain conditions ([#20041](https://github.com/angular/angular/issues/20041)) ([de24d54](https://github.com/angular/angular/commit/de24d54))
|
||||
* **core** add missing globals from each rollup configuration ([#20028](https://github.com/angular/angular/issues/20028)) ([812786f](https://github.com/angular/angular/commit/812786f))
|
||||
|
||||
|
||||
|
||||
<a name="5.0.0-rc.8"></a>
|
||||
# [5.0.0-rc.8](https://github.com/angular/angular/compare/5.0.0-rc.7...5.0.0-rc.8) (2017-10-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **compiler-cli:** avoid producing source mappings for host views ([#19965](https://github.com/angular/angular/issues/19965)) ([2d508a3](https://github.com/angular/angular/commit/2d508a3))
|
||||
* **platform-server:** add missing packages to the UMD global rollup config ([4285b6c](https://github.com/angular/angular/commit/4285b6c))
|
||||
|
||||
|
||||
|
||||
<a name="5.0.0-rc.7"></a>
|
||||
# [5.0.0-rc.7](https://github.com/angular/angular/compare/5.0.0-rc.6...5.0.0-rc.7) (2017-10-27)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **compiler:** don’t store invalid state when using `listLazyRoutes` ([#19953](https://github.com/angular/angular/issues/19953)) ([4a23df3](https://github.com/angular/angular/commit/4a23df3))
|
||||
* **compiler:** make watch mode work on windows ([#19953](https://github.com/angular/angular/issues/19953)) ([f4d5729](https://github.com/angular/angular/commit/f4d5729)), closes [#19951](https://github.com/angular/angular/issues/19951)
|
||||
* **compiler:** recover from structural errors in watch mode ([#19953](https://github.com/angular/angular/issues/19953)) ([d343bf7](https://github.com/angular/angular/commit/d343bf7))
|
||||
* **compiler:** translate emit diagnostics with `noEmitOnError: true`. ([#19953](https://github.com/angular/angular/issues/19953)) ([9ce7f0e](https://github.com/angular/angular/commit/9ce7f0e)), closes [#19935](https://github.com/angular/angular/issues/19935)
|
||||
* **service-worker:** don't block initialization on registration ([#19936](https://github.com/angular/angular/issues/19936)) ([47caebf](https://github.com/angular/angular/commit/47caebf))
|
||||
* **service-worker:** fix improper call of Observable.merge ([#19962](https://github.com/angular/angular/issues/19962)) ([14016c7](https://github.com/angular/angular/commit/14016c7))
|
||||
* **service-worker:** listen for messages on the right event source ([#19954](https://github.com/angular/angular/issues/19954)) ([5cfd9c6](https://github.com/angular/angular/commit/5cfd9c6))
|
||||
|
||||
|
||||
|
||||
<a name="5.0.0-rc.6"></a>
|
||||
# [5.0.0-rc.6](https://github.com/angular/angular/compare/5.0.0-rc.5...5.0.0-rc.6) (2017-10-25)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **compiler:** automatically set `emitDecoratorMetadata` when `"annotationsAs": "static fields”` ([#19927](https://github.com/angular/angular/issues/19927)) ([ef08330](https://github.com/angular/angular/commit/ef08330)), closes [#19916](https://github.com/angular/angular/issues/19916)
|
||||
* **compiler:** don’t type check templates with `skipTemplateCodegen` ([#19909](https://github.com/angular/angular/issues/19909)) ([18bce59](https://github.com/angular/angular/commit/18bce59))
|
||||
* **compiler-cli:** only use error collector when needed. ([#19912](https://github.com/angular/angular/issues/19912)) ([9b26455](https://github.com/angular/angular/commit/9b26455))
|
||||
* **compiler-cli:** produce correct paths for windows output ([#19915](https://github.com/angular/angular/issues/19915)) ([6cc042e](https://github.com/angular/angular/commit/6cc042e))
|
||||
|
||||
|
||||
|
||||
<a name="5.0.0-rc.5"></a>
|
||||
# [5.0.0-rc.5](https://github.com/angular/angular/compare/5.0.0-rc.4...5.0.0-rc.5) (2017-10-24)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **compiler-cli:** report all diagnostic error messages ([#19886](https://github.com/angular/angular/issues/19886)) ([a82f863](https://github.com/angular/angular/commit/a82f863))
|
||||
|
||||
|
||||
|
||||
<a name="5.0.0-rc.4"></a>
|
||||
# [5.0.0-rc.4](https://github.com/angular/angular/compare/5.0.0-rc.3...5.0.0-rc.4) (2017-10-24)
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
"angular-in-memory-web-api": "~0.4.6",
|
||||
"core-js": "^2.4.1",
|
||||
"express": "^4.14.1",
|
||||
"rxjs": "^5.1.0",
|
||||
"rxjs": "^5.5.0",
|
||||
"systemjs": "0.19.39",
|
||||
"web-animations-js": "^2.3.1",
|
||||
"zone.js": "^0.8.4"
|
||||
|
@ -2,26 +2,26 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@angular-devkit/build-optimizer@~0.0.23":
|
||||
version "0.0.24"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.0.24.tgz#f361f34dd9f2a6b5ba14ab32327697419cc0ef7e"
|
||||
"@angular-devkit/build-optimizer@~0.0.28":
|
||||
version "0.0.31"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.0.31.tgz#511bc00e18c787a6cd4efe37b8cdb9f1bc6d4472"
|
||||
dependencies:
|
||||
loader-utils "^1.1.0"
|
||||
source-map "^0.5.6"
|
||||
typescript "^2.3.3"
|
||||
webpack-sources "^1.0.1"
|
||||
|
||||
"@angular-devkit/core@0.0.16":
|
||||
version "0.0.16"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.0.16.tgz#498efc22948e7e17fe7e826a67b5c23a60c5e873"
|
||||
"@angular-devkit/core@0.0.20":
|
||||
version "0.0.20"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.0.20.tgz#2ad36dd210fccd0e156d01c6499082ad4cd8c2af"
|
||||
dependencies:
|
||||
source-map "^0.5.6"
|
||||
|
||||
"@angular-devkit/schematics@~0.0.25":
|
||||
version "0.0.26"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.0.26.tgz#58b9b004dbe6bfd125674b883a63180a521f2d2d"
|
||||
"@angular-devkit/schematics@~0.0.34":
|
||||
version "0.0.34"
|
||||
resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.0.34.tgz#c3ef61b0e49e585d9982f2828e9a67b3879a6b1b"
|
||||
dependencies:
|
||||
"@angular-devkit/core" "0.0.16"
|
||||
"@angular-devkit/core" "0.0.20"
|
||||
"@ngtools/json-schema" "^1.1.0"
|
||||
minimist "^1.2.0"
|
||||
rxjs "^5.4.2"
|
||||
@ -33,19 +33,19 @@
|
||||
tslib "^1.7.1"
|
||||
|
||||
"@angular/cli@^1.3.1":
|
||||
version "1.4.5"
|
||||
resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-1.4.5.tgz#b982e13799b19e13eb820c2e17ef2c62a3b10881"
|
||||
version "1.4.9"
|
||||
resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-1.4.9.tgz#cd5cd7a8f3bf3a1c28dfcdc523a011f0fcebfb96"
|
||||
dependencies:
|
||||
"@angular-devkit/build-optimizer" "~0.0.23"
|
||||
"@angular-devkit/schematics" "~0.0.25"
|
||||
"@angular-devkit/build-optimizer" "~0.0.28"
|
||||
"@angular-devkit/schematics" "~0.0.34"
|
||||
"@ngtools/json-schema" "1.1.0"
|
||||
"@ngtools/webpack" "1.7.2"
|
||||
"@schematics/angular" "~0.0.38"
|
||||
"@ngtools/webpack" "1.7.4"
|
||||
"@schematics/angular" "~0.0.46"
|
||||
autoprefixer "^6.5.3"
|
||||
chalk "^2.0.1"
|
||||
circular-dependency-plugin "^3.0.0"
|
||||
common-tags "^1.3.1"
|
||||
copy-webpack-plugin "^4.0.1"
|
||||
copy-webpack-plugin "^4.1.1"
|
||||
core-object "^3.1.0"
|
||||
css-loader "^0.28.1"
|
||||
cssnano "^3.10.0"
|
||||
@ -53,7 +53,7 @@
|
||||
ember-cli-string-utils "^1.0.0"
|
||||
exports-loader "^0.6.3"
|
||||
extract-text-webpack-plugin "3.0.0"
|
||||
file-loader "^0.10.0"
|
||||
file-loader "^1.1.5"
|
||||
fs-extra "^4.0.0"
|
||||
glob "^7.0.3"
|
||||
html-webpack-plugin "^2.29.0"
|
||||
@ -82,12 +82,13 @@
|
||||
stylus "^0.54.5"
|
||||
stylus-loader "^3.0.1"
|
||||
typescript ">=2.0.0 <2.6.0"
|
||||
url-loader "^0.6.0"
|
||||
webpack "~3.6.0"
|
||||
url-loader "^0.6.2"
|
||||
webpack "~3.7.1"
|
||||
webpack-concat-plugin "1.4.0"
|
||||
webpack-dev-middleware "~1.12.0"
|
||||
webpack-dev-server "~2.7.1"
|
||||
webpack-merge "^4.1.0"
|
||||
webpack-sources "^1.0.0"
|
||||
zone.js "^0.8.14"
|
||||
optionalDependencies:
|
||||
node-sass "^4.3.0"
|
||||
@ -172,18 +173,20 @@
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@ngtools/json-schema/-/json-schema-1.1.0.tgz#c3a0c544d62392acc2813a42c8a0dc6f58f86922"
|
||||
|
||||
"@ngtools/webpack@1.7.2", "@ngtools/webpack@^1.2.11":
|
||||
version "1.7.2"
|
||||
resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.7.2.tgz#3fc4de01786dcc2f50d8cbaaa117311e56799977"
|
||||
"@ngtools/webpack@1.7.4", "@ngtools/webpack@^1.2.11":
|
||||
version "1.7.4"
|
||||
resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.7.4.tgz#5015c47ebd339045dd89a1bef0497f4524d2c8ed"
|
||||
dependencies:
|
||||
enhanced-resolve "^3.1.0"
|
||||
loader-utils "^1.0.2"
|
||||
magic-string "^0.22.3"
|
||||
source-map "^0.5.6"
|
||||
|
||||
"@schematics/angular@~0.0.38":
|
||||
version "0.0.39"
|
||||
resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.0.39.tgz#6dc2b461e95e4f4756a48693f2f13a771f6d6cb5"
|
||||
"@schematics/angular@~0.0.46":
|
||||
version "0.0.48"
|
||||
resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.0.48.tgz#6fa1bfb2676ba34c243811d2083173821d3cf07c"
|
||||
dependencies:
|
||||
"@angular-devkit/core" "0.0.20"
|
||||
|
||||
"@types/angular-animate@^1.5.5":
|
||||
version "1.5.8"
|
||||
@ -222,25 +225,33 @@
|
||||
"@types/angular" "*"
|
||||
|
||||
"@types/angular@*", "@types/angular@^1.5.16":
|
||||
version "1.6.32"
|
||||
resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.6.32.tgz#fc791aad038227d9413eb5e552993e1076f8a509"
|
||||
version "1.6.36"
|
||||
resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.6.36.tgz#15e73d632274b5655a391470844863548c7755f4"
|
||||
|
||||
"@types/body-parser@*":
|
||||
version "1.16.7"
|
||||
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.16.7.tgz#455fc23fd0ddaaeda6cd6cbb653558276e5920fa"
|
||||
dependencies:
|
||||
"@types/express" "*"
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/express-serve-static-core@*":
|
||||
version "4.0.53"
|
||||
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.53.tgz#1723a35d1447f2c55e13c8721eab3448e42f4d82"
|
||||
version "4.0.55"
|
||||
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.55.tgz#f53868838a955f98b380819ec9134f5df7d9482f"
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/express@^4.0.35":
|
||||
version "4.0.37"
|
||||
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.37.tgz#625ac3765169676e01897ca47011c26375784971"
|
||||
"@types/express@*", "@types/express@^4.0.35":
|
||||
version "4.0.39"
|
||||
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.39.tgz#1441f21d52b33be8d4fa8a865c15a6a91cd0fa09"
|
||||
dependencies:
|
||||
"@types/body-parser" "*"
|
||||
"@types/express-serve-static-core" "*"
|
||||
"@types/serve-static" "*"
|
||||
|
||||
"@types/jasmine@*":
|
||||
version "2.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.6.0.tgz#997b41a27752b4850af2683bc4a8d8222c25bd02"
|
||||
version "2.6.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.6.2.tgz#6e6d4cb183cd55c7a1ad6270bced10fdd5367a3c"
|
||||
|
||||
"@types/jasmine@~2.5.53":
|
||||
version "2.5.54"
|
||||
@ -257,12 +268,12 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b"
|
||||
|
||||
"@types/node@*":
|
||||
version "8.0.32"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.32.tgz#869a716538b6eec65ab3893f183d557be3cda206"
|
||||
version "8.0.47"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.47.tgz#968e596f91acd59069054558a00708c445ca30c2"
|
||||
|
||||
"@types/node@^6.0.45", "@types/node@^6.0.46":
|
||||
version "6.0.88"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.88.tgz#f618f11a944f6a18d92b5c472028728a3e3d4b66"
|
||||
version "6.0.90"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.90.tgz#0ed74833fa1b73dcdb9409dcb1c97ec0a8b13b02"
|
||||
|
||||
"@types/q@^0.0.32":
|
||||
version "0.0.32"
|
||||
@ -273,8 +284,8 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz#74cb77fb6052edaff2a8984ddafd88d419f25cac"
|
||||
|
||||
"@types/serve-static@*":
|
||||
version "1.7.32"
|
||||
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.32.tgz#0f6732e4dab0813771dd8fc8fe14940f34728b4c"
|
||||
version "1.13.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.0.tgz#2ef359d8d5982bc011a7a8fa36016e629e8b7635"
|
||||
dependencies:
|
||||
"@types/express-serve-static-core" "*"
|
||||
"@types/mime" "*"
|
||||
@ -307,7 +318,7 @@ acorn@^4.0.3:
|
||||
version "4.0.13"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
|
||||
|
||||
acorn@^5.0.0, acorn@^5.1.1:
|
||||
acorn@^5.0.0, acorn@^5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7"
|
||||
|
||||
@ -346,13 +357,13 @@ ajv@^4.9.1:
|
||||
json-stable-stringify "^1.0.1"
|
||||
|
||||
ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5:
|
||||
version "5.2.3"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2"
|
||||
version "5.3.0"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda"
|
||||
dependencies:
|
||||
co "^4.6.0"
|
||||
fast-deep-equal "^1.0.0"
|
||||
fast-json-stable-stringify "^2.0.0"
|
||||
json-schema-traverse "^0.3.0"
|
||||
json-stable-stringify "^1.0.1"
|
||||
|
||||
align-text@^0.1.1, align-text@^0.1.3:
|
||||
version "0.1.4"
|
||||
@ -530,11 +541,7 @@ async@1.5.2, async@^1.5.2:
|
||||
version "1.5.2"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
|
||||
|
||||
async@^0.9.0:
|
||||
version "0.9.2"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
|
||||
|
||||
async@^2.1.2, async@^2.1.5, async@^2.4.1:
|
||||
async@^2.1.2, async@^2.1.5, async@^2.4.1, async@^2.5.0:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d"
|
||||
dependencies:
|
||||
@ -851,8 +858,8 @@ browser-sync@^2.18.5:
|
||||
yargs "6.4.0"
|
||||
|
||||
browserify-aes@^1.0.0, browserify-aes@^1.0.4:
|
||||
version "1.0.8"
|
||||
resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.8.tgz#c8fa3b1b7585bb7ba77c5560b60996ddec6d5309"
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
|
||||
dependencies:
|
||||
buffer-xor "^1.0.3"
|
||||
cipher-base "^1.0.0"
|
||||
@ -989,8 +996,8 @@ caniuse-api@^1.5.2:
|
||||
lodash.uniq "^4.5.0"
|
||||
|
||||
caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
|
||||
version "1.0.30000744"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000744.tgz#00758ff7dd5f7138d34a15608dccf71a59656ffe"
|
||||
version "1.0.30000752"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000752.tgz#daa129d54ce700e94ad14388bdef514ec1e2dd54"
|
||||
|
||||
canonical-path@0.0.2:
|
||||
version "0.0.2"
|
||||
@ -1027,17 +1034,9 @@ chalk@^1.1.1, chalk@^1.1.3:
|
||||
strip-ansi "^3.0.0"
|
||||
supports-color "^2.0.0"
|
||||
|
||||
chalk@^2.0.0, chalk@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e"
|
||||
dependencies:
|
||||
ansi-styles "^3.1.0"
|
||||
escape-string-regexp "^1.0.5"
|
||||
supports-color "^4.0.0"
|
||||
|
||||
chalk@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.0.1.tgz#dbec49436d2ae15f536114e76d14656cdbc0f44d"
|
||||
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
|
||||
dependencies:
|
||||
ansi-styles "^3.1.0"
|
||||
escape-string-regexp "^1.0.5"
|
||||
@ -1215,10 +1214,10 @@ component-inherit@0.0.3:
|
||||
resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
|
||||
|
||||
compressible@~2.0.11:
|
||||
version "2.0.11"
|
||||
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.11.tgz#16718a75de283ed8e604041625a2064586797d8a"
|
||||
version "2.0.12"
|
||||
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66"
|
||||
dependencies:
|
||||
mime-db ">= 1.29.0 < 2"
|
||||
mime-db ">= 1.30.0 < 2"
|
||||
|
||||
compression@^1.5.2:
|
||||
version "1.7.1"
|
||||
@ -1258,8 +1257,8 @@ concurrently@^3.0.0:
|
||||
tree-kill "^1.1.0"
|
||||
|
||||
connect-history-api-fallback@^1.1.0, connect-history-api-fallback@^1.2.0, connect-history-api-fallback@^1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169"
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz#3db24f973f4b923b0e82f619ce0df02411ca623d"
|
||||
|
||||
connect-logger@0.0.1:
|
||||
version "0.0.1"
|
||||
@ -1327,9 +1326,9 @@ cookie@0.3.1:
|
||||
version "0.3.1"
|
||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
|
||||
|
||||
copy-webpack-plugin@^4.0.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.1.1.tgz#53ae69e04955ebfa9fda411f54cbb968531d71fd"
|
||||
copy-webpack-plugin@^4.0.1, copy-webpack-plugin@^4.1.1:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.2.0.tgz#252bb94597f96399d23d7fad355f8d3a661ac096"
|
||||
dependencies:
|
||||
bluebird "^3.5.1"
|
||||
fs-extra "^4.0.2"
|
||||
@ -1579,8 +1578,8 @@ dashdash@^1.12.0:
|
||||
assert-plus "^1.0.0"
|
||||
|
||||
date-fns@^1.23.0:
|
||||
version "1.28.5"
|
||||
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.5.tgz#257cfc45d322df45ef5658665967ee841cd73faf"
|
||||
version "1.29.0"
|
||||
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
|
||||
|
||||
date-now@^0.1.4:
|
||||
version "0.1.4"
|
||||
@ -1711,8 +1710,8 @@ diff@^2.2.1:
|
||||
resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99"
|
||||
|
||||
diff@^3.1.0:
|
||||
version "3.3.1"
|
||||
resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75"
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
|
||||
|
||||
diffie-hellman@^5.0.0:
|
||||
version "5.0.2"
|
||||
@ -1840,8 +1839,8 @@ ejs@^2.5.7:
|
||||
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a"
|
||||
|
||||
electron-to-chromium@^1.2.7:
|
||||
version "1.3.24"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.24.tgz#9b7b88bb05ceb9fa016a177833cc2dde388f21b6"
|
||||
version "1.3.27"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d"
|
||||
|
||||
elliptic@^6.0.0:
|
||||
version "6.4.0"
|
||||
@ -1978,20 +1977,20 @@ error-ex@^1.2.0:
|
||||
dependencies:
|
||||
is-arrayish "^0.2.1"
|
||||
|
||||
es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14:
|
||||
version "0.10.30"
|
||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939"
|
||||
es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
|
||||
version "0.10.35"
|
||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.35.tgz#18ee858ce6a3c45c7d79e91c15fcca9ec568494f"
|
||||
dependencies:
|
||||
es6-iterator "2"
|
||||
es6-symbol "~3.1"
|
||||
es6-iterator "~2.0.1"
|
||||
es6-symbol "~3.1.1"
|
||||
|
||||
es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512"
|
||||
es6-iterator@^2.0.1, es6-iterator@~2.0.1:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
|
||||
dependencies:
|
||||
d "1"
|
||||
es5-ext "^0.10.14"
|
||||
es6-symbol "^3.1"
|
||||
es5-ext "^0.10.35"
|
||||
es6-symbol "^3.1.1"
|
||||
|
||||
es6-map@^0.1.3:
|
||||
version "0.1.5"
|
||||
@ -2018,7 +2017,7 @@ es6-set@~0.1.5:
|
||||
es6-symbol "3.1.1"
|
||||
event-emitter "~0.3.5"
|
||||
|
||||
es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1:
|
||||
es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
|
||||
dependencies:
|
||||
@ -2185,8 +2184,8 @@ express@2.5.x:
|
||||
qs "0.4.x"
|
||||
|
||||
express@^4.13.3, express@^4.14.1:
|
||||
version "4.16.1"
|
||||
resolved "https://registry.yarnpkg.com/express/-/express-4.16.1.tgz#6b33b560183c9b253b7b62144df33a4654ac9ed0"
|
||||
version "4.16.2"
|
||||
resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
|
||||
dependencies:
|
||||
accepts "~1.3.4"
|
||||
array-flatten "1.1.1"
|
||||
@ -2263,6 +2262,10 @@ fast-deep-equal@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
|
||||
|
||||
fast-json-stable-stringify@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
|
||||
|
||||
fastparse@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
|
||||
@ -2285,18 +2288,19 @@ fd-slicer@~1.0.1:
|
||||
dependencies:
|
||||
pend "~1.2.0"
|
||||
|
||||
file-loader@^0.10.0:
|
||||
version "0.10.1"
|
||||
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.1.tgz#815034119891fc6441fb5a64c11bc93c22ddd842"
|
||||
dependencies:
|
||||
loader-utils "^1.0.2"
|
||||
|
||||
file-loader@^0.9.0:
|
||||
version "0.9.0"
|
||||
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.9.0.tgz#1d2daddd424ce6d1b07cfe3f79731bed3617ab42"
|
||||
dependencies:
|
||||
loader-utils "~0.2.5"
|
||||
|
||||
file-loader@^1.1.5:
|
||||
version "1.1.5"
|
||||
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.5.tgz#91c25b6b6fbe56dae99f10a425fd64933b5c9daa"
|
||||
dependencies:
|
||||
loader-utils "^1.0.2"
|
||||
schema-utils "^0.3.0"
|
||||
|
||||
filename-regex@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
|
||||
@ -2812,8 +2816,8 @@ html-loader@^0.4.3:
|
||||
object-assign "^4.1.0"
|
||||
|
||||
html-minifier@^3.0.1, html-minifier@^3.2.3:
|
||||
version "3.5.5"
|
||||
resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.5.tgz#3bdc9427e638bbe3dbde96c0eb988b044f02739e"
|
||||
version "3.5.6"
|
||||
resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.6.tgz#7e4e661a09999599c7d8e8a2b8d7fb7430bb5c3e"
|
||||
dependencies:
|
||||
camel-case "3.0.x"
|
||||
clean-css "4.1.x"
|
||||
@ -3049,8 +3053,8 @@ is-binary-path@^1.0.0:
|
||||
binary-extensions "^1.0.0"
|
||||
|
||||
is-buffer@^1.0.2, is-buffer@^1.1.5, is-buffer@~1.1.1:
|
||||
version "1.1.5"
|
||||
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
|
||||
version "1.1.6"
|
||||
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
|
||||
|
||||
is-builtin-module@^1.0.0:
|
||||
version "1.0.0"
|
||||
@ -3240,8 +3244,8 @@ istanbul-lib-coverage@^1.1.1:
|
||||
resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
|
||||
|
||||
istanbul-lib-instrument@^1.1.3:
|
||||
version "1.8.0"
|
||||
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz#66f6c9421cc9ec4704f76f2db084ba9078a2b532"
|
||||
version "1.9.1"
|
||||
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e"
|
||||
dependencies:
|
||||
babel-generator "^6.18.0"
|
||||
babel-template "^6.16.0"
|
||||
@ -3499,8 +3503,8 @@ less-loader@^4.0.5:
|
||||
pify "^2.3.0"
|
||||
|
||||
less@^2.7.2:
|
||||
version "2.7.2"
|
||||
resolved "https://registry.yarnpkg.com/less/-/less-2.7.2.tgz#368d6cc73e1fb03981183280918743c5dcf9b3df"
|
||||
version "2.7.3"
|
||||
resolved "https://registry.yarnpkg.com/less/-/less-2.7.3.tgz#cc1260f51c900a9ec0d91fb6998139e02507b63b"
|
||||
optionalDependencies:
|
||||
errno "^0.1.1"
|
||||
graceful-fs "^4.1.2"
|
||||
@ -3508,12 +3512,12 @@ less@^2.7.2:
|
||||
mime "^1.2.11"
|
||||
mkdirp "^0.5.0"
|
||||
promise "^7.1.1"
|
||||
request "^2.72.0"
|
||||
request "2.81.0"
|
||||
source-map "^0.5.3"
|
||||
|
||||
license-webpack-plugin@^1.0.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-1.1.0.tgz#99117ae985fb6c2a70df301b8a1ae0268f17f433"
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-1.1.1.tgz#76b2cedccc78f139fd7877e576f756cfc141b8c2"
|
||||
dependencies:
|
||||
ejs "^2.5.7"
|
||||
|
||||
@ -3635,8 +3639,8 @@ log4js@^0.6.31:
|
||||
semver "~4.3.3"
|
||||
|
||||
loglevel@^1.4.1:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.5.0.tgz#3863984a2c326b986fbb965f378758a6dc8a4324"
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.5.1.tgz#189078c94ab9053ee215a0acdbf24244ea0f6502"
|
||||
|
||||
longest@^1.0.1:
|
||||
version "1.0.1"
|
||||
@ -3776,7 +3780,11 @@ miller-rabin@^4.0.0:
|
||||
bn.js "^4.0.0"
|
||||
brorand "^1.0.1"
|
||||
|
||||
"mime-db@>= 1.29.0 < 2", mime-db@~1.30.0:
|
||||
"mime-db@>= 1.30.0 < 2":
|
||||
version "1.31.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.31.0.tgz#a49cd8f3ebf3ed1a482b60561d9105ad40ca74cb"
|
||||
|
||||
mime-db@~1.30.0:
|
||||
version "1.30.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
|
||||
|
||||
@ -3863,8 +3871,8 @@ mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd
|
||||
minimist "0.0.8"
|
||||
|
||||
moment@*:
|
||||
version "2.18.1"
|
||||
resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
|
||||
version "2.19.1"
|
||||
resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167"
|
||||
|
||||
ms@0.7.1:
|
||||
version "0.7.1"
|
||||
@ -4732,8 +4740,8 @@ pretty-error@^2.0.2:
|
||||
utila "~0.4"
|
||||
|
||||
private@~0.1.5:
|
||||
version "0.1.7"
|
||||
resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
|
||||
version "0.1.8"
|
||||
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
|
||||
|
||||
process-nextick-args@~1.0.6:
|
||||
version "1.0.7"
|
||||
@ -4811,8 +4819,8 @@ q@1.4.1:
|
||||
resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
|
||||
|
||||
q@^1.1.2, q@^1.4.1:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1"
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
|
||||
|
||||
qjobs@^1.1.4:
|
||||
version "1.1.5"
|
||||
@ -4892,8 +4900,8 @@ raw-loader@^0.5.1:
|
||||
resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
|
||||
|
||||
rc@^1.1.7:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077"
|
||||
dependencies:
|
||||
deep-extend "~0.4.0"
|
||||
ini "~1.3.0"
|
||||
@ -5068,7 +5076,7 @@ request-progress@~2.0.1:
|
||||
dependencies:
|
||||
throttleit "^1.0.0"
|
||||
|
||||
request@2, request@^2.72.0, request@^2.78.0, request@^2.79.0:
|
||||
request@2, request@^2.78.0, request@^2.79.0:
|
||||
version "2.83.0"
|
||||
resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
|
||||
dependencies:
|
||||
@ -5143,8 +5151,8 @@ resolve@1.1.7:
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
|
||||
|
||||
resolve@^1.1.6, resolve@^1.1.7, resolve@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86"
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
|
||||
dependencies:
|
||||
path-parse "^1.0.5"
|
||||
|
||||
@ -5179,10 +5187,10 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
|
||||
inherits "^2.0.1"
|
||||
|
||||
rollup-plugin-commonjs@^8.0.2:
|
||||
version "8.2.1"
|
||||
resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.1.tgz#5e40c78375eb163c14c76bce69da1750e5905a2e"
|
||||
version "8.2.5"
|
||||
resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.5.tgz#924421278a6f879fd976b2ef1a28391b1e4f2a6e"
|
||||
dependencies:
|
||||
acorn "^5.1.1"
|
||||
acorn "^5.1.2"
|
||||
estree-walker "^0.5.0"
|
||||
magic-string "^0.22.4"
|
||||
resolve "^1.4.0"
|
||||
@ -5223,9 +5231,9 @@ rx@4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
|
||||
|
||||
rxjs@^5.1.0, rxjs@^5.4.2:
|
||||
version "5.4.3"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.3.tgz#0758cddee6033d68e0fd53676f0f3596ce3d483f"
|
||||
rxjs@^5.4.2, rxjs@^5.5.0:
|
||||
version "5.5.2"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3"
|
||||
dependencies:
|
||||
symbol-observable "^1.0.1"
|
||||
|
||||
@ -5481,8 +5489,8 @@ sntp@1.x.x:
|
||||
hoek "2.x.x"
|
||||
|
||||
sntp@2.x.x:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b"
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
|
||||
dependencies:
|
||||
hoek "4.x.x"
|
||||
|
||||
@ -5604,12 +5612,12 @@ source-map-explorer@^1.3.2:
|
||||
underscore "^1.8.3"
|
||||
|
||||
source-map-loader@^0.2.0:
|
||||
version "0.2.2"
|
||||
resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.2.tgz#1249348ff6a66ea64a2957fc98f74cb6bba67505"
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.3.tgz#d4b0c8cd47d54edce3e6bfa0f523f452b5b0e521"
|
||||
dependencies:
|
||||
async "^0.9.0"
|
||||
async "^2.5.0"
|
||||
loader-utils "~0.2.2"
|
||||
source-map "~0.1.33"
|
||||
source-map "~0.6.1"
|
||||
|
||||
source-map-support@^0.4.0, source-map-support@^0.4.1, source-map-support@^0.4.2, source-map-support@~0.4.0:
|
||||
version "0.4.18"
|
||||
@ -5617,7 +5625,7 @@ source-map-support@^0.4.0, source-map-support@^0.4.1, source-map-support@^0.4.2,
|
||||
dependencies:
|
||||
source-map "^0.5.6"
|
||||
|
||||
source-map@0.1.x, source-map@~0.1.33, source-map@~0.1.7:
|
||||
source-map@0.1.x, source-map@~0.1.7:
|
||||
version "0.1.43"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
|
||||
dependencies:
|
||||
@ -5633,7 +5641,7 @@ source-map@^0.4.2:
|
||||
dependencies:
|
||||
amdefine ">=0.0.4"
|
||||
|
||||
source-map@^0.6.1:
|
||||
source-map@^0.6.1, source-map@~0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
|
||||
@ -5700,7 +5708,11 @@ sshpk@^1.7.0:
|
||||
jsbn "~0.1.0"
|
||||
tweetnacl "~0.14.0"
|
||||
|
||||
"statuses@>= 1.3.1 < 2", statuses@~1.3.0, statuses@~1.3.1:
|
||||
"statuses@>= 1.3.1 < 2":
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
|
||||
|
||||
statuses@~1.3.0, statuses@~1.3.1:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
|
||||
|
||||
@ -5849,8 +5861,8 @@ supports-color@^3.1.1, supports-color@^3.2.3:
|
||||
has-flag "^1.0.0"
|
||||
|
||||
supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0:
|
||||
version "4.4.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e"
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
|
||||
dependencies:
|
||||
has-flag "^2.0.0"
|
||||
|
||||
@ -5881,8 +5893,8 @@ tapable@^0.2.7:
|
||||
resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
|
||||
|
||||
tar-pack@^3.4.0:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984"
|
||||
version "3.4.1"
|
||||
resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
|
||||
dependencies:
|
||||
debug "^2.2.0"
|
||||
fstream "^1.0.10"
|
||||
@ -6025,8 +6037,8 @@ tsickle@^0.21.0:
|
||||
source-map-support "^0.4.2"
|
||||
|
||||
tslib@^1.7.1:
|
||||
version "1.7.1"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.7.1.tgz#bc8004164691923a79fe8378bbeb3da2017538ec"
|
||||
version "1.8.0"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.0.tgz#dc604ebad64bcbf696d613da6c954aa0e7ea1eb6"
|
||||
|
||||
tslint@^3.15.1:
|
||||
version "3.15.1"
|
||||
@ -6078,11 +6090,11 @@ ua-parser-js@0.7.12:
|
||||
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb"
|
||||
|
||||
uglify-js@3.1.x:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.3.tgz#d61f0453b4718cab01581f3162aa90bab7520b42"
|
||||
version "3.1.5"
|
||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.5.tgz#4c1a6d53b2fe77e4710dd94631853effd3ff5143"
|
||||
dependencies:
|
||||
commander "~2.11.0"
|
||||
source-map "~0.5.1"
|
||||
source-map "~0.6.1"
|
||||
|
||||
uglify-js@^2.6.1, uglify-js@^2.8.29:
|
||||
version "2.8.29"
|
||||
@ -6172,7 +6184,7 @@ url-join@^1.0.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
|
||||
|
||||
url-loader@^0.6.0:
|
||||
url-loader@^0.6.2:
|
||||
version "0.6.2"
|
||||
resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7"
|
||||
dependencies:
|
||||
@ -6384,16 +6396,16 @@ webpack-sources@^0.1.0:
|
||||
source-list-map "~0.1.7"
|
||||
source-map "~0.5.3"
|
||||
|
||||
webpack-sources@^1.0.1:
|
||||
webpack-sources@^1.0.0, webpack-sources@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf"
|
||||
dependencies:
|
||||
source-list-map "^2.0.0"
|
||||
source-map "~0.5.3"
|
||||
|
||||
webpack@~3.6.0:
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.6.0.tgz#a89a929fbee205d35a4fa2cc487be9cbec8898bc"
|
||||
webpack@~3.7.1:
|
||||
version "3.7.1"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.7.1.tgz#6046b5c415ff7df7a0dc54c5b6b86098e8b952da"
|
||||
dependencies:
|
||||
acorn "^5.0.0"
|
||||
acorn-dynamic-import "^2.0.0"
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "angular-srcs",
|
||||
"version": "5.0.0-rc.4",
|
||||
"version": "5.0.0-rc.9",
|
||||
"private": true,
|
||||
"branchPattern": "2.0.*",
|
||||
"description": "Angular - a web framework for modern web apps",
|
||||
@ -24,7 +24,7 @@
|
||||
"dependencies": {
|
||||
"core-js": "^2.4.1",
|
||||
"reflect-metadata": "^0.1.3",
|
||||
"rxjs": "^5.5.0",
|
||||
"rxjs": "^5.5.2",
|
||||
"tslib": "^1.7.1",
|
||||
"zone.js": "^0.8.12"
|
||||
},
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -15,7 +15,7 @@ const globals = {
|
||||
'@angular/animations': 'ng.animations'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/animations/esm5/browser.js',
|
||||
dest: '../../../dist/packages-dist/animations/bundles/animations-browser.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -16,7 +16,7 @@ const globals = {
|
||||
'rxjs/Subject': 'Rx',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../../dist/packages-dist/animations/esm5/browser/testing.js',
|
||||
dest: '../../../../dist/packages-dist/animations/bundles/animations-browser-testing.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -16,7 +16,7 @@ const globals = {
|
||||
'rxjs/Subject': 'Rx',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/animations/esm5/animations.js',
|
||||
dest: '../../dist/packages-dist/animations/bundles/animations.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -11,6 +11,7 @@ const globals = {
|
||||
'@angular/platform-browser': 'ng.platformBrowser',
|
||||
'@angular/common': 'ng.common',
|
||||
'rxjs/Observable': 'Rx',
|
||||
'rxjs/Observer': 'Rx',
|
||||
'rxjs/Subject': 'Rx',
|
||||
|
||||
'rxjs/observable/of': 'Rx.Observable.prototype',
|
||||
@ -20,7 +21,7 @@ const globals = {
|
||||
'rxjs/operator/map': 'Rx.Observable.prototype',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/common/esm5/http.js',
|
||||
dest: '../../../dist/packages-dist/common/bundles/common-http.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -15,11 +15,14 @@ const globals = {
|
||||
'@angular/common': 'ng.common',
|
||||
'@angular/common/http': 'ng.common.http',
|
||||
'rxjs/Observable': 'Rx',
|
||||
'rxjs/Observer': 'Rx',
|
||||
'rxjs/ReplaySubject': 'Rx',
|
||||
'rxjs/Subject': 'Rx',
|
||||
|
||||
'rxjs/operator/startWith': 'Rx.Observable.prototype',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../../dist/packages-dist/common/esm5/http/testing.js',
|
||||
dest: '../../../../dist/packages-dist/common/bundles/common-http-testing.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,16 +6,18 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
'rxjs/Observable': 'Rx',
|
||||
'rxjs/Observer': 'Rx',
|
||||
'rxjs/Subject': 'Rx',
|
||||
'rxjs/Subscription': 'Rx',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/common/esm5/common.js',
|
||||
dest: '../../dist/packages-dist/common/bundles/common.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -16,7 +16,7 @@ const globals = {
|
||||
'rxjs/Subject': 'Rx'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/common/esm5/testing.js',
|
||||
dest: '../../../dist/packages-dist/common/bundles/common-testing.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,10 +6,10 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import commonjs from 'rollup-plugin-commonjs';
|
||||
import * as path from 'path';
|
||||
const commonjs = require('rollup-plugin-commonjs');
|
||||
const path = require('path');
|
||||
|
||||
import 'reflect-metadata';
|
||||
require('reflect-metadata');
|
||||
|
||||
var m = /^\@angular\/((\w|\-)+)(\/(\w|\d|\/|\-)+)?$/;
|
||||
var location = normalize('../../dist/packages-dist') + '/';
|
||||
@ -49,7 +49,7 @@ function resolve(id, from) {
|
||||
// hack to get around issues with default exports
|
||||
var banner = `ts['default'] = ts['default'] || ts; fs['default'] = fs['default'] || fs;`;
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/compiler-cli/src/ngc.js',
|
||||
dest: './browser-bundle.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -38,10 +38,10 @@ export function translateDiagnostics(host: TypeCheckHost, untranslatedDiagnostic
|
||||
source: SOURCE,
|
||||
code: DEFAULT_ERROR_CODE
|
||||
});
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
ts.push(diagnostic);
|
||||
}
|
||||
ts.push(diagnostic);
|
||||
});
|
||||
return {ts, ng};
|
||||
}
|
||||
|
@ -45,6 +45,12 @@ function createEmitCallback(options: api.CompilerOptions): api.TsEmitCallback|un
|
||||
if (!transformDecorators && !transformTypesToClosure) {
|
||||
return undefined;
|
||||
}
|
||||
if (transformDecorators) {
|
||||
// This is needed as a workaround for https://github.com/angular/tsickle/issues/635
|
||||
// Otherwise tsickle might emit references to non imported values
|
||||
// as TypeScript elided the import.
|
||||
options.emitDecoratorMetadata = true;
|
||||
}
|
||||
const tsickleHost: tsickle.TsickleHost = {
|
||||
shouldSkipTsickleProcessing: (fileName) =>
|
||||
/\.d\.ts$/.test(fileName) || GENERATED_FILES.test(fileName),
|
||||
|
@ -89,7 +89,7 @@ export class NgTools_InternalApi_NG_2 {
|
||||
// as we only needed this to support Angular CLI 1.5.0 rc.*
|
||||
const ngProgram = createProgram({
|
||||
rootNames: options.program.getRootFileNames(),
|
||||
options: options.angularCompilerOptions,
|
||||
options: {...options.angularCompilerOptions, collectAllErrors: true},
|
||||
host: options.host
|
||||
});
|
||||
const lazyRoutes = ngProgram.listLazyRoutes(options.entryModule);
|
||||
|
@ -129,6 +129,7 @@ export function performWatchCompilation(host: PerformWatchHost):
|
||||
return {close, ready: cb => readyPromise.then(cb), firstCompileResult};
|
||||
|
||||
function cacheEntry(fileName: string): CacheEntry {
|
||||
fileName = path.normalize(fileName);
|
||||
let entry = fileCache.get(fileName);
|
||||
if (!entry) {
|
||||
entry = {};
|
||||
@ -191,6 +192,10 @@ export function performWatchCompilation(host: PerformWatchHost):
|
||||
};
|
||||
}
|
||||
ingoreFilesForWatch.clear();
|
||||
const oldProgram = cachedProgram;
|
||||
// We clear out the `cachedProgram` here as a
|
||||
// program can only be used as `oldProgram` 1x
|
||||
cachedProgram = undefined;
|
||||
const compileResult = performCompilation({
|
||||
rootNames: cachedOptions.rootNames,
|
||||
options: cachedOptions.options,
|
||||
@ -245,7 +250,7 @@ export function performWatchCompilation(host: PerformWatchHost):
|
||||
if (event === FileChangeEvent.CreateDeleteDir) {
|
||||
fileCache.clear();
|
||||
} else {
|
||||
fileCache.delete(fileName);
|
||||
fileCache.delete(path.normalize(fileName));
|
||||
}
|
||||
|
||||
if (!ingoreFilesForWatch.has(path.normalize(fileName))) {
|
||||
|
@ -150,6 +150,9 @@ export interface CompilerOptions extends ts.CompilerOptions {
|
||||
* in JIT mode. This is off by default.
|
||||
*/
|
||||
enableSummariesForJit?: boolean;
|
||||
|
||||
/** @internal */
|
||||
collectAllErrors?: boolean;
|
||||
}
|
||||
|
||||
export interface CompilerHost extends ts.CompilerHost {
|
||||
|
@ -192,7 +192,8 @@ export class TsCompilerAotCompilerTypeCheckHostAdapter implements ts.CompilerHos
|
||||
const containingFilePackageName = getPackageName(containingFile);
|
||||
|
||||
let moduleName: string;
|
||||
if (importedFilePackagName === containingFilePackageName) {
|
||||
if (importedFilePackagName === containingFilePackageName ||
|
||||
GENERATED_FILES.test(originalImportedFile)) {
|
||||
const rootedContainingFile = relativeToRootDirs(containingFile, this.rootDirs);
|
||||
const rootedImportedFile = relativeToRootDirs(importedFile, this.rootDirs);
|
||||
|
||||
@ -426,6 +427,12 @@ export class TsCompilerAotCompilerTypeCheckHostAdapter implements ts.CompilerHos
|
||||
}
|
||||
|
||||
isSourceFile(filePath: string): boolean {
|
||||
// Don't generate any files nor typecheck them
|
||||
// if skipTemplateCodegen is set and fullTemplateTypeCheck is not yet set,
|
||||
// for backwards compatibility.
|
||||
if (this.options.skipTemplateCodegen && !this.options.fullTemplateTypeCheck) {
|
||||
return false;
|
||||
}
|
||||
// If we have a summary from a previous compilation,
|
||||
// treat the file never as a source file.
|
||||
if (this.librarySummaries.has(filePath)) {
|
||||
|
@ -6,7 +6,9 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import {createLoweredSymbol, isLoweredSymbol} from '@angular/compiler';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {CollectorOptions, MetadataCollector, MetadataValue, ModuleMetadata, isMetadataGlobalReferenceExpression} from '../metadata/index';
|
||||
|
||||
export interface LoweringRequest {
|
||||
@ -181,11 +183,13 @@ function createVariableStatementForDeclarations(declarations: Declaration[]): ts
|
||||
/* modifiers */ undefined, ts.createVariableDeclarationList(varDecls, ts.NodeFlags.Const));
|
||||
}
|
||||
|
||||
export function getExpressionLoweringTransformFactory(requestsMap: RequestsMap):
|
||||
(context: ts.TransformationContext) => (sourceFile: ts.SourceFile) => ts.SourceFile {
|
||||
export function getExpressionLoweringTransformFactory(
|
||||
requestsMap: RequestsMap, program: ts.Program): (context: ts.TransformationContext) =>
|
||||
(sourceFile: ts.SourceFile) => ts.SourceFile {
|
||||
// Return the factory
|
||||
return (context: ts.TransformationContext) => (sourceFile: ts.SourceFile): ts.SourceFile => {
|
||||
const requests = requestsMap.getRequests(sourceFile);
|
||||
// We need to use the original SourceFile for reading metadata, and not the transformed one.
|
||||
const requests = requestsMap.getRequests(program.getSourceFile(sourceFile.fileName));
|
||||
if (requests && requests.size) {
|
||||
return transformSourceFile(sourceFile, requests, context);
|
||||
}
|
||||
@ -223,14 +227,12 @@ function shouldLower(node: ts.Node | undefined): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
const REWRITE_PREFIX = '\u0275';
|
||||
|
||||
function isPrimitive(value: any): boolean {
|
||||
return Object(value) !== value;
|
||||
}
|
||||
|
||||
function isRewritten(value: any): boolean {
|
||||
return isMetadataGlobalReferenceExpression(value) && value.name.startsWith(REWRITE_PREFIX);
|
||||
return isMetadataGlobalReferenceExpression(value) && isLoweredSymbol(value.name);
|
||||
}
|
||||
|
||||
function isLiteralFieldNamed(node: ts.Node, names: Set<string>): boolean {
|
||||
@ -274,7 +276,7 @@ export class LowerMetadataCache implements RequestsMap {
|
||||
|
||||
private getMetadataAndRequests(sourceFile: ts.SourceFile): MetadataAndLoweringRequests {
|
||||
let identNumber = 0;
|
||||
const freshIdent = () => REWRITE_PREFIX + identNumber++;
|
||||
const freshIdent = () => createLoweredSymbol(identNumber++);
|
||||
const requests = new Map<number, LoweringRequest>();
|
||||
|
||||
const isExportedSymbol = (() => {
|
||||
|
@ -144,12 +144,14 @@ class _NodeEmitterVisitor implements StatementVisitor, ExpressionVisitor {
|
||||
const span = node.sourceSpan;
|
||||
if (span.start.file == span.end.file) {
|
||||
const file = span.start.file;
|
||||
let source = this._templateSources.get(file);
|
||||
if (!source) {
|
||||
source = ts.createSourceMapSource(file.url, file.content, pos => pos);
|
||||
this._templateSources.set(file, source);
|
||||
if (file.url) {
|
||||
let source = this._templateSources.get(file);
|
||||
if (!source) {
|
||||
source = ts.createSourceMapSource(file.url, file.content, pos => pos);
|
||||
this._templateSources.set(file, source);
|
||||
}
|
||||
return {pos: span.start.offset, end: span.end.offset, source};
|
||||
}
|
||||
return {pos: span.start.offset, end: span.end.offset, source};
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
@ -18,7 +18,7 @@ import {CompilerHost, CompilerOptions, CustomTransformers, DEFAULT_ERROR_CODE, D
|
||||
import {CodeGenerator, TsCompilerAotCompilerTypeCheckHostAdapter, getOriginalReferences} from './compiler_host';
|
||||
import {LowerMetadataCache, getExpressionLoweringTransformFactory} from './lower_expressions';
|
||||
import {getAngularEmitterTransformFactory} from './node_emitter_transform';
|
||||
import {GENERATED_FILES, StructureIsReused, createMessageDiagnostic, isInRootDir, tsStructureIsReused} from './util';
|
||||
import {GENERATED_FILES, StructureIsReused, createMessageDiagnostic, isInRootDir, ngToTsDiagnostic, tsStructureIsReused} from './util';
|
||||
|
||||
|
||||
|
||||
@ -149,11 +149,9 @@ class AngularCompilerProgram implements Program {
|
||||
|
||||
getTsSemanticDiagnostics(sourceFile?: ts.SourceFile, cancellationToken?: ts.CancellationToken):
|
||||
ts.Diagnostic[] {
|
||||
if (sourceFile) {
|
||||
return this.tsProgram.getSemanticDiagnostics(sourceFile, cancellationToken);
|
||||
}
|
||||
const sourceFiles = sourceFile ? [sourceFile] : this.tsProgram.getSourceFiles();
|
||||
let diags: ts.Diagnostic[] = [];
|
||||
this.tsProgram.getSourceFiles().forEach(sf => {
|
||||
sourceFiles.forEach(sf => {
|
||||
if (!GENERATED_FILES.test(sf.fileName)) {
|
||||
diags.push(...this.tsProgram.getSemanticDiagnostics(sf, cancellationToken));
|
||||
}
|
||||
@ -177,15 +175,17 @@ class AngularCompilerProgram implements Program {
|
||||
if (this._analyzedModules) {
|
||||
throw new Error('Angular structure already loaded');
|
||||
}
|
||||
const {tmpProgram, sourceFiles, rootNames} = this._createProgramWithBasicStubs();
|
||||
return this.compiler.loadFilesAsync(sourceFiles)
|
||||
.catch(this.catchAnalysisError.bind(this))
|
||||
.then(analyzedModules => {
|
||||
if (this._analyzedModules) {
|
||||
throw new Error('Angular structure loaded both synchronously and asynchronsly');
|
||||
}
|
||||
this._updateProgramWithTypeCheckStubs(tmpProgram, analyzedModules, rootNames);
|
||||
});
|
||||
return Promise.resolve()
|
||||
.then(() => {
|
||||
const {tmpProgram, sourceFiles, rootNames} = this._createProgramWithBasicStubs();
|
||||
return this.compiler.loadFilesAsync(sourceFiles).then(analyzedModules => {
|
||||
if (this._analyzedModules) {
|
||||
throw new Error('Angular structure loaded both synchronously and asynchronsly');
|
||||
}
|
||||
this._updateProgramWithTypeCheckStubs(tmpProgram, analyzedModules, rootNames);
|
||||
});
|
||||
})
|
||||
.catch(e => this._createProgramOnError(e));
|
||||
}
|
||||
|
||||
listLazyRoutes(route?: string): LazyRoute[] {
|
||||
@ -300,6 +300,10 @@ class AngularCompilerProgram implements Program {
|
||||
}
|
||||
}
|
||||
this.emittedSourceFiles = emittedSourceFiles;
|
||||
// translate the diagnostics in the emitResult as well.
|
||||
const translatedEmitDiags = translateDiagnostics(this.hostAdapter, emitResult.diagnostics);
|
||||
emitResult.diagnostics = translatedEmitDiags.ts.concat(
|
||||
this.structuralDiagnostics.concat(translatedEmitDiags.ng).map(ngToTsDiagnostic));
|
||||
|
||||
if (!outSrcMapping.length) {
|
||||
// if no files were emitted by TypeScript, also don't emit .json files
|
||||
@ -386,7 +390,7 @@ class AngularCompilerProgram implements Program {
|
||||
customTransformers?: CustomTransformers): ts.CustomTransformers {
|
||||
const beforeTs: ts.TransformerFactory<ts.SourceFile>[] = [];
|
||||
if (!this.options.disableExpressionLowering) {
|
||||
beforeTs.push(getExpressionLoweringTransformFactory(this.metadataCache));
|
||||
beforeTs.push(getExpressionLoweringTransformFactory(this.metadataCache, this.tsProgram));
|
||||
}
|
||||
beforeTs.push(getAngularEmitterTransformFactory(genFiles));
|
||||
if (customTransformers && customTransformers.beforeTs) {
|
||||
@ -400,14 +404,13 @@ class AngularCompilerProgram implements Program {
|
||||
if (this._analyzedModules) {
|
||||
return;
|
||||
}
|
||||
const {tmpProgram, sourceFiles, rootNames} = this._createProgramWithBasicStubs();
|
||||
let analyzedModules: NgAnalyzedModules|null;
|
||||
try {
|
||||
analyzedModules = this.compiler.loadFilesSync(sourceFiles);
|
||||
const {tmpProgram, sourceFiles, rootNames} = this._createProgramWithBasicStubs();
|
||||
const analyzedModules = this.compiler.loadFilesSync(sourceFiles);
|
||||
this._updateProgramWithTypeCheckStubs(tmpProgram, analyzedModules, rootNames);
|
||||
} catch (e) {
|
||||
analyzedModules = this.catchAnalysisError(e);
|
||||
this._createProgramOnError(e);
|
||||
}
|
||||
this._updateProgramWithTypeCheckStubs(tmpProgram, analyzedModules, rootNames);
|
||||
}
|
||||
|
||||
private _createCompiler() {
|
||||
@ -422,14 +425,15 @@ class AngularCompilerProgram implements Program {
|
||||
this.oldProgramLibrarySummaries);
|
||||
const aotOptions = getAotCompilerOptions(this.options);
|
||||
this._structuralDiagnostics = [];
|
||||
const errorCollector = (err: any) => {
|
||||
this._structuralDiagnostics !.push({
|
||||
messageText: err.toString(),
|
||||
category: ts.DiagnosticCategory.Error,
|
||||
source: SOURCE,
|
||||
code: DEFAULT_ERROR_CODE
|
||||
});
|
||||
};
|
||||
const errorCollector =
|
||||
(this.options.collectAllErrors || this.options.fullTemplateTypeCheck) ? (err: any) => {
|
||||
this._structuralDiagnostics !.push({
|
||||
messageText: err.toString(),
|
||||
category: ts.DiagnosticCategory.Error,
|
||||
source: SOURCE,
|
||||
code: DEFAULT_ERROR_CODE
|
||||
});
|
||||
} : undefined;
|
||||
this._compiler = createAotCompiler(this._hostAdapter, aotOptions, errorCollector).compiler;
|
||||
}
|
||||
|
||||
@ -452,13 +456,13 @@ class AngularCompilerProgram implements Program {
|
||||
};
|
||||
|
||||
|
||||
let rootNames = this.rootNames;
|
||||
let rootNames = [...this.rootNames];
|
||||
if (this.options.generateCodeForLibraries !== false) {
|
||||
// if we should generateCodeForLibraries, enver include
|
||||
// if we should generateCodeForLibraries, never include
|
||||
// generated files in the program as otherwise we will
|
||||
// ovewrite them and typescript will report the error
|
||||
// TS5055: Cannot write file ... because it would overwrite input file.
|
||||
rootNames = this.rootNames.filter(fn => !GENERATED_FILES.test(fn));
|
||||
rootNames = rootNames.filter(fn => !GENERATED_FILES.test(fn));
|
||||
}
|
||||
if (this.options.noResolve) {
|
||||
this.rootNames.forEach(rootName => {
|
||||
@ -479,23 +483,21 @@ class AngularCompilerProgram implements Program {
|
||||
}
|
||||
|
||||
private _updateProgramWithTypeCheckStubs(
|
||||
tmpProgram: ts.Program, analyzedModules: NgAnalyzedModules|null, rootNames: string[]) {
|
||||
this._analyzedModules = analyzedModules || emptyModules;
|
||||
if (analyzedModules) {
|
||||
tmpProgram.getSourceFiles().forEach(sf => {
|
||||
if (sf.fileName.endsWith('.ngfactory.ts')) {
|
||||
const {generate, baseFileName} = this.hostAdapter.shouldGenerateFile(sf.fileName);
|
||||
if (generate) {
|
||||
// Note: ! is ok as hostAdapter.shouldGenerateFile will always return a basefileName
|
||||
// for .ngfactory.ts files.
|
||||
const genFile = this.compiler.emitTypeCheckStub(sf.fileName, baseFileName !);
|
||||
if (genFile) {
|
||||
this.hostAdapter.updateGeneratedFile(genFile);
|
||||
}
|
||||
tmpProgram: ts.Program, analyzedModules: NgAnalyzedModules, rootNames: string[]) {
|
||||
this._analyzedModules = analyzedModules;
|
||||
tmpProgram.getSourceFiles().forEach(sf => {
|
||||
if (sf.fileName.endsWith('.ngfactory.ts')) {
|
||||
const {generate, baseFileName} = this.hostAdapter.shouldGenerateFile(sf.fileName);
|
||||
if (generate) {
|
||||
// Note: ! is ok as hostAdapter.shouldGenerateFile will always return a basefileName
|
||||
// for .ngfactory.ts files.
|
||||
const genFile = this.compiler.emitTypeCheckStub(sf.fileName, baseFileName !);
|
||||
if (genFile) {
|
||||
this.hostAdapter.updateGeneratedFile(genFile);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
this._tsProgram = ts.createProgram(rootNames, this.options, this.hostAdapter, tmpProgram);
|
||||
// Note: the new ts program should be completely reusable by TypeScript as:
|
||||
// - we cache all the files in the hostAdapter
|
||||
@ -506,27 +508,37 @@ class AngularCompilerProgram implements Program {
|
||||
}
|
||||
}
|
||||
|
||||
private catchAnalysisError(e: any): NgAnalyzedModules|null {
|
||||
private _createProgramOnError(e: any) {
|
||||
// Still fill the analyzedModules and the tsProgram
|
||||
// so that we don't cause other errors for users who e.g. want to emit the ngProgram.
|
||||
this._analyzedModules = emptyModules;
|
||||
this.oldTsProgram = undefined;
|
||||
this._hostAdapter.isSourceFile = () => false;
|
||||
this._tsProgram = ts.createProgram(this.rootNames, this.options, this.hostAdapter);
|
||||
if (isSyntaxError(e)) {
|
||||
const parserErrors = getParseErrors(e);
|
||||
if (parserErrors && parserErrors.length) {
|
||||
this._structuralDiagnostics =
|
||||
parserErrors.map<Diagnostic>(e => ({
|
||||
messageText: e.contextualMessage(),
|
||||
category: ts.DiagnosticCategory.Error,
|
||||
span: e.span,
|
||||
source: SOURCE,
|
||||
code: DEFAULT_ERROR_CODE
|
||||
}));
|
||||
this._structuralDiagnostics = [
|
||||
...(this._structuralDiagnostics || []),
|
||||
...parserErrors.map<Diagnostic>(e => ({
|
||||
messageText: e.contextualMessage(),
|
||||
category: ts.DiagnosticCategory.Error,
|
||||
span: e.span,
|
||||
source: SOURCE,
|
||||
code: DEFAULT_ERROR_CODE
|
||||
}))
|
||||
];
|
||||
} else {
|
||||
this._structuralDiagnostics = [{
|
||||
messageText: e.message,
|
||||
category: ts.DiagnosticCategory.Error,
|
||||
source: SOURCE,
|
||||
code: DEFAULT_ERROR_CODE
|
||||
}];
|
||||
this._structuralDiagnostics = [
|
||||
...(this._structuralDiagnostics || []), {
|
||||
messageText: e.message,
|
||||
category: ts.DiagnosticCategory.Error,
|
||||
source: SOURCE,
|
||||
code: DEFAULT_ERROR_CODE
|
||||
}
|
||||
];
|
||||
}
|
||||
return null;
|
||||
return;
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
@ -702,6 +714,10 @@ function getNgOptionDiagnostics(options: CompilerOptions): Diagnostic[] {
|
||||
return [];
|
||||
}
|
||||
|
||||
function normalizeSeparators(path: string): string {
|
||||
return path.replace(/\\/g, '/');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a function that can adjust a path from source path to out path,
|
||||
* based on an existing mapping from source to out path.
|
||||
@ -723,18 +739,19 @@ export function createSrcToOutPathMapper(
|
||||
} = path): (srcFileName: string) => string {
|
||||
let srcToOutPath: (srcFileName: string) => string;
|
||||
if (outDir) {
|
||||
let path: {} = {}; // Ensure we error if we use `path` instead of `host`.
|
||||
if (sampleSrcFileName == null || sampleOutFileName == null) {
|
||||
throw new Error(`Can't calculate the rootDir without a sample srcFileName / outFileName. `);
|
||||
}
|
||||
const srcFileDir = host.dirname(sampleSrcFileName).replace(/\\/g, '/');
|
||||
const outFileDir = host.dirname(sampleOutFileName).replace(/\\/g, '/');
|
||||
const srcFileDir = normalizeSeparators(host.dirname(sampleSrcFileName));
|
||||
const outFileDir = normalizeSeparators(host.dirname(sampleOutFileName));
|
||||
if (srcFileDir === outFileDir) {
|
||||
return (srcFileName) => srcFileName;
|
||||
}
|
||||
// calculate the common suffix, stopping
|
||||
// at `outDir`.
|
||||
const srcDirParts = srcFileDir.split('/');
|
||||
const outDirParts = path.relative(outDir, outFileDir).split('/');
|
||||
const outDirParts = normalizeSeparators(host.relative(outDir, outFileDir)).split('/');
|
||||
let i = 0;
|
||||
while (i < Math.min(srcDirParts.length, outDirParts.length) &&
|
||||
srcDirParts[srcDirParts.length - 1 - i] === outDirParts[outDirParts.length - 1 - i])
|
||||
@ -750,7 +767,7 @@ export function createSrcToOutPathMapper(
|
||||
export function i18nExtract(
|
||||
formatName: string | null, outFile: string | null, host: ts.CompilerHost,
|
||||
options: CompilerOptions, bundle: MessageBundle): string[] {
|
||||
formatName = formatName || 'null';
|
||||
formatName = formatName || 'xlf';
|
||||
// Checks the format and returns the extension
|
||||
const ext = i18nGetExtension(formatName);
|
||||
const content = i18nSerialize(bundle, formatName, options);
|
||||
@ -784,7 +801,7 @@ export function i18nSerialize(
|
||||
}
|
||||
|
||||
export function i18nGetExtension(formatName: string): string {
|
||||
const format = (formatName || 'xlf').toLowerCase();
|
||||
const format = formatName.toLowerCase();
|
||||
|
||||
switch (format) {
|
||||
case 'xmb':
|
||||
|
@ -51,3 +51,29 @@ function pathStartsWithPrefix(prefix: string, fullPath: string): string|null {
|
||||
const rel = path.relative(prefix, fullPath);
|
||||
return rel.startsWith('..') ? null : rel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a ng.Diagnostic into a ts.Diagnostic.
|
||||
* This looses some information, and also uses an incomplete object as `file`.
|
||||
*
|
||||
* I.e. only use this where the API allows only a ts.Diagnostic.
|
||||
*/
|
||||
export function ngToTsDiagnostic(ng: Diagnostic): ts.Diagnostic {
|
||||
let file: ts.SourceFile|undefined;
|
||||
let start: number|undefined;
|
||||
let length: number|undefined;
|
||||
if (ng.span) {
|
||||
// Note: We can't use a real ts.SourceFile,
|
||||
// but we can at least mirror the properties `fileName` and `text`, which
|
||||
// are mostly used for error reporting.
|
||||
file = { fileName: ng.span.start.file.url, text: ng.span.start.file.content } as ts.SourceFile;
|
||||
start = ng.span.start.offset;
|
||||
length = ng.span.end.offset - start;
|
||||
}
|
||||
return {
|
||||
file,
|
||||
messageText: ng.messageText,
|
||||
category: ng.category,
|
||||
code: ng.code, start, length,
|
||||
};
|
||||
}
|
||||
|
@ -502,29 +502,69 @@ describe('ngc transformer command-line', () => {
|
||||
it('should add metadata as decorators', () => {
|
||||
writeConfig(`{
|
||||
"extends": "./tsconfig-base.json",
|
||||
"compilerOptions": {
|
||||
"emitDecoratorMetadata": true
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"annotationsAs": "decorators"
|
||||
},
|
||||
"files": ["mymodule.ts"]
|
||||
}`);
|
||||
write('aclass.ts', `export class AClass {}`);
|
||||
write('mymodule.ts', `
|
||||
import {NgModule, Component} from '@angular/core';
|
||||
import {NgModule} from '@angular/core';
|
||||
import {AClass} from './aclass';
|
||||
|
||||
@Component({template: ''})
|
||||
export class MyComp {
|
||||
fn(p: any) {}
|
||||
}
|
||||
|
||||
@NgModule({declarations: [MyComp]})
|
||||
export class MyModule {}
|
||||
`);
|
||||
@NgModule({declarations: []})
|
||||
export class MyModule {
|
||||
constructor(importedClass: AClass) {}
|
||||
}
|
||||
`);
|
||||
|
||||
const exitCode = main(['-p', basePath], errorSpy);
|
||||
expect(exitCode).toEqual(0);
|
||||
|
||||
const mymodulejs = path.resolve(outDir, 'mymodule.js');
|
||||
const mymoduleSource = fs.readFileSync(mymodulejs, 'utf8');
|
||||
expect(mymoduleSource).toContain('MyComp = __decorate([');
|
||||
expect(mymoduleSource).toContain('MyModule = __decorate([');
|
||||
expect(mymoduleSource).toContain(`import { AClass } from './aclass';`);
|
||||
expect(mymoduleSource).toContain(`__metadata("design:paramtypes", [AClass])`);
|
||||
});
|
||||
|
||||
it('should add metadata as static fields', () => {
|
||||
// Note: Don't specify emitDecoratorMetadata here on purpose,
|
||||
// as regression test for https://github.com/angular/angular/issues/19916.
|
||||
writeConfig(`{
|
||||
"extends": "./tsconfig-base.json",
|
||||
"compilerOptions": {
|
||||
"emitDecoratorMetadata": false
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"annotationsAs": "static fields"
|
||||
},
|
||||
"files": ["mymodule.ts"]
|
||||
}`);
|
||||
write('aclass.ts', `export class AClass {}`);
|
||||
write('mymodule.ts', `
|
||||
import {NgModule} from '@angular/core';
|
||||
import {AClass} from './aclass';
|
||||
|
||||
@NgModule({declarations: []})
|
||||
export class MyModule {
|
||||
constructor(importedClass: AClass) {}
|
||||
}
|
||||
`);
|
||||
|
||||
const exitCode = main(['-p', basePath], errorSpy);
|
||||
expect(exitCode).toEqual(0);
|
||||
|
||||
const mymodulejs = path.resolve(outDir, 'mymodule.js');
|
||||
const mymoduleSource = fs.readFileSync(mymodulejs, 'utf8');
|
||||
expect(mymoduleSource).not.toContain('__decorate');
|
||||
expect(mymoduleSource).toContain('args: [{ declarations: [] },] }');
|
||||
expect(mymoduleSource).not.toContain(`__metadata`);
|
||||
expect(mymoduleSource).toContain(`import { AClass } from './aclass';`);
|
||||
expect(mymoduleSource).toContain(`{ type: AClass, }`);
|
||||
});
|
||||
});
|
||||
|
||||
@ -1391,5 +1431,73 @@ describe('ngc transformer command-line', () => {
|
||||
main(['-p', path.join(basePath, 'src/tsconfig.json')], message => messages.push(message));
|
||||
expect(exitCode).toBe(0, 'Compile failed unexpectedly.\n ' + messages.join('\n '));
|
||||
});
|
||||
|
||||
it('should emit all structural errors', () => {
|
||||
write('src/tsconfig.json', `{
|
||||
"extends": "../tsconfig-base.json",
|
||||
"files": ["test-module.ts"]
|
||||
}`);
|
||||
write('src/lib/indirect2.ts', `
|
||||
declare var f: any;
|
||||
export const t2 = f\`<p>hello</p>\`;
|
||||
`);
|
||||
write('src/lib/indirect1.ts', `
|
||||
import {t2} from './indirect2';
|
||||
export const t1 = t2 + ' ';
|
||||
`);
|
||||
write('src/lib/test.component.ts', `
|
||||
import {Component} from '@angular/core';
|
||||
import {t1} from './indirect1';
|
||||
|
||||
@Component({
|
||||
template: t1
|
||||
})
|
||||
export class TestComponent {}
|
||||
`);
|
||||
write('src/test-module.ts', `
|
||||
import {NgModule} from '@angular/core';
|
||||
import {TestComponent} from './lib/test.component';
|
||||
|
||||
@NgModule({declarations: [TestComponent]})
|
||||
export class TestModule {}
|
||||
`);
|
||||
const messages: string[] = [];
|
||||
const exitCode =
|
||||
main(['-p', path.join(basePath, 'src/tsconfig.json')], message => messages.push(message));
|
||||
expect(exitCode).toBe(1, 'Compile was expected to fail');
|
||||
expect(messages[0]).toContain(['Tagged template expressions are not supported in metadata']);
|
||||
});
|
||||
|
||||
it('should allow using 2 classes with the same name in declarations with noEmitOnError=true',
|
||||
() => {
|
||||
write('src/tsconfig.json', `{
|
||||
"extends": "../tsconfig-base.json",
|
||||
"compilerOptions": {
|
||||
"noEmitOnError": true
|
||||
},
|
||||
"files": ["test-module.ts"]
|
||||
}`);
|
||||
function writeComp(fileName: string) {
|
||||
write(fileName, `
|
||||
import {Component} from '@angular/core';
|
||||
|
||||
@Component({selector: 'comp', template: ''})
|
||||
export class TestComponent {}
|
||||
`);
|
||||
}
|
||||
writeComp('src/comp1.ts');
|
||||
writeComp('src/comp2.ts');
|
||||
write('src/test-module.ts', `
|
||||
import {NgModule} from '@angular/core';
|
||||
import {TestComponent as Comp1} from './comp1';
|
||||
import {TestComponent as Comp2} from './comp2';
|
||||
|
||||
@NgModule({
|
||||
declarations: [Comp1, Comp2],
|
||||
})
|
||||
export class MyModule {}
|
||||
`);
|
||||
expect(main(['-p', path.join(basePath, 'src/tsconfig.json')])).toBe(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -105,6 +105,47 @@ describe('perform watch', () => {
|
||||
expect(getSourceFileSpy !).toHaveBeenCalledWith(mainTsPath, ts.ScriptTarget.ES5);
|
||||
expect(getSourceFileSpy !).toHaveBeenCalledWith(utilTsPath, ts.ScriptTarget.ES5);
|
||||
});
|
||||
|
||||
it('should recover from static analysis errors', () => {
|
||||
const config = createConfig();
|
||||
const host = new MockWatchHost(config);
|
||||
|
||||
const okFileContent = `
|
||||
import {NgModule} from '@angular/core';
|
||||
|
||||
@NgModule()
|
||||
export class MyModule {}
|
||||
`;
|
||||
const errorFileContent = `
|
||||
import {NgModule} from '@angular/core';
|
||||
|
||||
@NgModule(() => (1===1 ? null as any : null as any))
|
||||
export class MyModule {}
|
||||
`;
|
||||
const indexTsPath = path.resolve(testSupport.basePath, 'src', 'index.ts');
|
||||
|
||||
testSupport.write(indexTsPath, okFileContent);
|
||||
|
||||
performWatchCompilation(host);
|
||||
expectNoDiagnostics(config.options, host.diagnostics);
|
||||
|
||||
// Do it multiple times as the watch mode switches internal modes.
|
||||
// E.g. from regular compile to using summaries, ...
|
||||
for (let i = 0; i < 3; i++) {
|
||||
host.diagnostics = [];
|
||||
testSupport.write(indexTsPath, okFileContent);
|
||||
host.triggerFileChange(FileChangeEvent.Change, indexTsPath);
|
||||
expectNoDiagnostics(config.options, host.diagnostics);
|
||||
|
||||
host.diagnostics = [];
|
||||
testSupport.write(indexTsPath, errorFileContent);
|
||||
host.triggerFileChange(FileChangeEvent.Change, indexTsPath);
|
||||
|
||||
const errDiags = host.diagnostics.filter(d => d.category === ts.DiagnosticCategory.Error);
|
||||
expect(errDiags.length).toBe(1);
|
||||
expect(errDiags[0].messageText).toContain('Function calls are not supported.');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function createModuleAndCompSource(prefix: string, template: string = prefix + 'template') {
|
||||
@ -122,7 +163,8 @@ function createModuleAndCompSource(prefix: string, template: string = prefix + '
|
||||
}
|
||||
|
||||
class MockWatchHost {
|
||||
timeoutListeners: Array<(() => void)|null> = [];
|
||||
nextTimeoutListenerId = 1;
|
||||
timeoutListeners: {[id: string]: (() => void)} = {};
|
||||
fileChangeListeners: Array<((event: FileChangeEvent, fileName: string) => void)|null> = [];
|
||||
diagnostics: ng.Diagnostics = [];
|
||||
constructor(public config: ng.ParsedConfiguration) {}
|
||||
@ -141,16 +183,16 @@ class MockWatchHost {
|
||||
close: () => this.fileChangeListeners[id] = null,
|
||||
};
|
||||
}
|
||||
setTimeout(callback: () => void, ms: number): any {
|
||||
const id = this.timeoutListeners.length;
|
||||
this.timeoutListeners.push(callback);
|
||||
setTimeout(callback: () => void): any {
|
||||
const id = this.nextTimeoutListenerId++;
|
||||
this.timeoutListeners[id] = callback;
|
||||
return id;
|
||||
}
|
||||
clearTimeout(timeoutId: any): void { this.timeoutListeners[timeoutId] = null; }
|
||||
clearTimeout(timeoutId: any): void { delete this.timeoutListeners[timeoutId]; }
|
||||
flushTimeouts() {
|
||||
this.timeoutListeners.forEach(cb => {
|
||||
if (cb) cb();
|
||||
});
|
||||
const listeners = this.timeoutListeners;
|
||||
this.timeoutListeners = {};
|
||||
Object.keys(listeners).forEach(id => listeners[id]());
|
||||
}
|
||||
triggerFileChange(event: FileChangeEvent, fileName: string) {
|
||||
this.fileChangeListeners.forEach(listener => {
|
||||
|
@ -64,10 +64,10 @@ export function setup(): TestSupport {
|
||||
function write(fileName: string, content: string) {
|
||||
const dir = path.dirname(fileName);
|
||||
if (dir != '.') {
|
||||
const newDir = path.join(basePath, dir);
|
||||
const newDir = path.resolve(basePath, dir);
|
||||
if (!fs.existsSync(newDir)) fs.mkdirSync(newDir);
|
||||
}
|
||||
fs.writeFileSync(path.join(basePath, fileName), content, {encoding: 'utf-8'});
|
||||
fs.writeFileSync(path.resolve(basePath, fileName), content, {encoding: 'utf-8'});
|
||||
}
|
||||
|
||||
function writeFiles(...mockDirs: {[fileName: string]: string}[]) {
|
||||
|
@ -90,6 +90,14 @@ describe('NgCompilerHost', () => {
|
||||
.toBe('./a/child');
|
||||
});
|
||||
|
||||
it('should use a relative import when accessing generated files, even if crossing packages',
|
||||
() => {
|
||||
expect(host.fileNameToModuleName(
|
||||
'/tmp/node_modules/mod2/b.ngfactory.d.ts',
|
||||
'/tmp/node_modules/mod1/a.ngfactory.d.ts'))
|
||||
.toBe('../mod2/b.ngfactory');
|
||||
});
|
||||
|
||||
it('should support multiple rootDirs when accessing a source file form a source file', () => {
|
||||
const hostWithMultipleRoots = createHost({
|
||||
options: {
|
||||
|
@ -181,13 +181,15 @@ function convert(annotatedSource: string) {
|
||||
[fileName], {module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2017}, host);
|
||||
const moduleSourceFile = program.getSourceFile(fileName);
|
||||
const transformers: ts.CustomTransformers = {
|
||||
before: [getExpressionLoweringTransformFactory({
|
||||
getRequests(sourceFile: ts.SourceFile): RequestLocationMap{
|
||||
if (sourceFile.fileName == moduleSourceFile.fileName) {
|
||||
return requests;
|
||||
} else {return new Map();}
|
||||
}
|
||||
})]
|
||||
before: [getExpressionLoweringTransformFactory(
|
||||
{
|
||||
getRequests(sourceFile: ts.SourceFile): RequestLocationMap{
|
||||
if (sourceFile.fileName == moduleSourceFile.fileName) {
|
||||
return requests;
|
||||
} else {return new Map();}
|
||||
}
|
||||
},
|
||||
program)]
|
||||
};
|
||||
let result: string = '';
|
||||
const emitResult = program.emit(
|
||||
|
@ -11,7 +11,8 @@ import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {CompilerHost, LazyRoute} from '../../src/transformers/api';
|
||||
import {formatDiagnostics} from '../../src/perform_compile';
|
||||
import {CompilerHost, EmitFlags, LazyRoute} from '../../src/transformers/api';
|
||||
import {createSrcToOutPathMapper} from '../../src/transformers/program';
|
||||
import {GENERATED_FILES, StructureIsReused, tsStructureIsReused} from '../../src/transformers/util';
|
||||
import {TestSupport, expectNoDiagnosticsInProgram, setup} from '../test_support';
|
||||
@ -77,6 +78,15 @@ describe('ng program', () => {
|
||||
return {emitResult, program};
|
||||
}
|
||||
|
||||
function resolveFiles(rootNames: string[]) {
|
||||
const preOptions = testSupport.createCompilerOptions();
|
||||
const preHost = ts.createCompilerHost(preOptions);
|
||||
// don't resolve symlinks
|
||||
preHost.realpath = (f) => f;
|
||||
const preProgram = ts.createProgram(rootNames, preOptions, preHost);
|
||||
return preProgram.getSourceFiles().map(sf => sf.fileName);
|
||||
}
|
||||
|
||||
describe('reuse of old program', () => {
|
||||
it('should reuse generated code for libraries from old programs', () => {
|
||||
compileLib('lib');
|
||||
@ -309,11 +319,35 @@ describe('ng program', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('should typecheck templates even if skipTemplateCodegen is set', () => {
|
||||
it('should not typecheck templates if skipTemplateCodegen is set but fullTemplateTypeCheck is not',
|
||||
() => {
|
||||
testSupport.writeFiles({
|
||||
'src/main.ts': `
|
||||
import {NgModule} from '@angular/core';
|
||||
|
||||
@NgModule(() => {if (1==1) return null as any;})
|
||||
export class SomeClassWithInvalidMetadata {}
|
||||
`,
|
||||
});
|
||||
const options = testSupport.createCompilerOptions({skipTemplateCodegen: true});
|
||||
const host = ng.createCompilerHost({options});
|
||||
const program = ng.createProgram(
|
||||
{rootNames: [path.resolve(testSupport.basePath, 'src/main.ts')], options, host});
|
||||
expectNoDiagnosticsInProgram(options, program);
|
||||
const emitResult = program.emit({emitFlags: EmitFlags.All});
|
||||
expect(emitResult.diagnostics.length).toBe(0);
|
||||
|
||||
testSupport.shouldExist('built/src/main.metadata.json');
|
||||
});
|
||||
|
||||
it('should typecheck templates if skipTemplateCodegen and fullTemplateTypeCheck is set', () => {
|
||||
testSupport.writeFiles({
|
||||
'src/main.ts': createModuleAndCompSource('main', `{{nonExistent}}`),
|
||||
});
|
||||
const options = testSupport.createCompilerOptions({skipTemplateCodegen: true});
|
||||
const options = testSupport.createCompilerOptions({
|
||||
skipTemplateCodegen: true,
|
||||
fullTemplateTypeCheck: true,
|
||||
});
|
||||
const host = ng.createCompilerHost({options});
|
||||
const program = ng.createProgram(
|
||||
{rootNames: [path.resolve(testSupport.basePath, 'src/main.ts')], options, host});
|
||||
@ -348,13 +382,7 @@ describe('ng program', () => {
|
||||
testSupport.writeFiles({
|
||||
'src/main.ts': createModuleAndCompSource('main'),
|
||||
});
|
||||
const preOptions = testSupport.createCompilerOptions();
|
||||
const preHost = ts.createCompilerHost(preOptions);
|
||||
// don't resolve symlinks
|
||||
preHost.realpath = (f) => f;
|
||||
const preProgram =
|
||||
ts.createProgram([path.resolve(testSupport.basePath, 'src/main.ts')], preOptions, preHost);
|
||||
const allRootNames = preProgram.getSourceFiles().map(sf => sf.fileName);
|
||||
const allRootNames = resolveFiles([path.resolve(testSupport.basePath, 'src/main.ts')]);
|
||||
|
||||
// now do the actual test with noResolve
|
||||
const program = compile(undefined, {noResolve: true}, allRootNames);
|
||||
@ -554,8 +582,8 @@ describe('ng program', () => {
|
||||
});
|
||||
}
|
||||
|
||||
function createProgram(rootNames: string[]) {
|
||||
const options = testSupport.createCompilerOptions();
|
||||
function createProgram(rootNames: string[], overrideOptions: ng.CompilerOptions = {}) {
|
||||
const options = testSupport.createCompilerOptions(overrideOptions);
|
||||
const host = ng.createCompilerHost({options});
|
||||
const program = ng.createProgram(
|
||||
{rootNames: rootNames.map(p => path.resolve(testSupport.basePath, p)), options, host});
|
||||
@ -593,6 +621,34 @@ describe('ng program', () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it('should emit correctly after listing lazyRoutes', () => {
|
||||
testSupport.writeFiles({
|
||||
'src/main.ts': `
|
||||
import {NgModule} from '@angular/core';
|
||||
import {RouterModule} from '@angular/router';
|
||||
|
||||
@NgModule({
|
||||
imports: [RouterModule.forRoot([{loadChildren: './lazy/lazy#LazyModule'}])]
|
||||
})
|
||||
export class MainModule {}
|
||||
`,
|
||||
'src/lazy/lazy.ts': `
|
||||
import {NgModule} from '@angular/core';
|
||||
|
||||
@NgModule()
|
||||
export class ChildModule {}
|
||||
`,
|
||||
});
|
||||
const {program, options} = createProgram(['src/main.ts', 'src/lazy/lazy.ts']);
|
||||
expectNoDiagnosticsInProgram(options, program);
|
||||
program.listLazyRoutes();
|
||||
program.emit();
|
||||
|
||||
const lazyNgFactory =
|
||||
fs.readFileSync(path.resolve(testSupport.basePath, 'built/src/lazy/lazy.ngfactory.js'));
|
||||
expect(lazyNgFactory).toContain('import * as i1 from "./lazy";');
|
||||
});
|
||||
|
||||
it('should list lazyRoutes given an entryRoute recursively', () => {
|
||||
writeSomeRoutes();
|
||||
const {program, options} = createProgram(['src/main.ts']);
|
||||
@ -797,7 +853,7 @@ describe('ng program', () => {
|
||||
export class ChildModule {}
|
||||
`,
|
||||
});
|
||||
const program = createProgram(['src/main.ts']).program;
|
||||
const program = createProgram(['src/main.ts'], {collectAllErrors: true}).program;
|
||||
expect(normalizeRoutes(program.listLazyRoutes('src/main#MainModule'))).toEqual([{
|
||||
module: {name: 'MainModule', filePath: path.resolve(testSupport.basePath, 'src/main.ts')},
|
||||
referencedModule:
|
||||
@ -806,4 +862,114 @@ describe('ng program', () => {
|
||||
}]);
|
||||
});
|
||||
});
|
||||
|
||||
it('should report errors for ts and ng errors on emit with noEmitOnError=true', () => {
|
||||
testSupport.writeFiles({
|
||||
'src/main.ts': `
|
||||
import {Component, NgModule} from '@angular/core';
|
||||
|
||||
// Ts error
|
||||
let x: string = 1;
|
||||
|
||||
// Ng error
|
||||
@Component({selector: 'comp', templateUrl: './main.html'})
|
||||
export class MyComp {}
|
||||
|
||||
@NgModule({declarations: [MyComp]})
|
||||
export class MyModule {}
|
||||
`,
|
||||
'src/main.html': '{{nonExistent}}'
|
||||
});
|
||||
const options = testSupport.createCompilerOptions({noEmitOnError: true});
|
||||
const host = ng.createCompilerHost({options});
|
||||
const program1 = ng.createProgram(
|
||||
{rootNames: [path.resolve(testSupport.basePath, 'src/main.ts')], options, host});
|
||||
const errorDiags =
|
||||
program1.emit().diagnostics.filter(d => d.category === ts.DiagnosticCategory.Error);
|
||||
expect(formatDiagnostics(errorDiags))
|
||||
.toContain(`src/main.ts(5,13): error TS2322: Type '1' is not assignable to type 'string'.`);
|
||||
expect(formatDiagnostics(errorDiags))
|
||||
.toContain(
|
||||
`src/main.html(1,1): error TS100: Property 'nonExistent' does not exist on type 'MyComp'.`);
|
||||
});
|
||||
|
||||
describe('errors', () => {
|
||||
const fileWithStructuralError = `
|
||||
import {NgModule} from '@angular/core';
|
||||
|
||||
@NgModule(() => (1===1 ? null as any : null as any))
|
||||
export class MyModule {}
|
||||
`;
|
||||
const fileWithGoodContent = `
|
||||
import {NgModule} from '@angular/core';
|
||||
|
||||
@NgModule()
|
||||
export class MyModule {}
|
||||
`;
|
||||
|
||||
it('should not throw on structural errors but collect them', () => {
|
||||
testSupport.write('src/index.ts', fileWithStructuralError);
|
||||
|
||||
const options = testSupport.createCompilerOptions();
|
||||
const host = ng.createCompilerHost({options});
|
||||
const program = ng.createProgram(
|
||||
{rootNames: [path.resolve(testSupport.basePath, 'src/index.ts')], options, host});
|
||||
|
||||
const structuralErrors = program.getNgStructuralDiagnostics();
|
||||
expect(structuralErrors.length).toBe(1);
|
||||
expect(structuralErrors[0].messageText).toContain('Function calls are not supported.');
|
||||
});
|
||||
|
||||
it('should not throw on structural errors but collect them (loadNgStructureAsync)', (done) => {
|
||||
testSupport.write('src/index.ts', fileWithStructuralError);
|
||||
|
||||
const options = testSupport.createCompilerOptions();
|
||||
const host = ng.createCompilerHost({options});
|
||||
const program = ng.createProgram(
|
||||
{rootNames: [path.resolve(testSupport.basePath, 'src/index.ts')], options, host});
|
||||
program.loadNgStructureAsync().then(() => {
|
||||
const structuralErrors = program.getNgStructuralDiagnostics();
|
||||
expect(structuralErrors.length).toBe(1);
|
||||
expect(structuralErrors[0].messageText).toContain('Function calls are not supported.');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should be able report structural errors with noResolve:true and generateCodeForLibraries:false ' +
|
||||
'even if getSourceFile throws for non existent files',
|
||||
() => {
|
||||
testSupport.write('src/index.ts', fileWithGoodContent);
|
||||
|
||||
// compile angular and produce .ngsummary.json / ngfactory.d.ts files
|
||||
compile();
|
||||
|
||||
testSupport.write('src/ok.ts', fileWithGoodContent);
|
||||
testSupport.write('src/error.ts', fileWithStructuralError);
|
||||
|
||||
// Make sure the ok.ts file is before the error.ts file,
|
||||
// so we added a .ngfactory.ts file for it.
|
||||
const allRootNames = resolveFiles(
|
||||
['src/ok.ts', 'src/error.ts'].map(fn => path.resolve(testSupport.basePath, fn)));
|
||||
|
||||
const options = testSupport.createCompilerOptions({
|
||||
noResolve: true,
|
||||
generateCodeForLibraries: false,
|
||||
});
|
||||
const host = ng.createCompilerHost({options});
|
||||
const originalGetSourceFile = host.getSourceFile;
|
||||
host.getSourceFile =
|
||||
(fileName: string, languageVersion: ts.ScriptTarget,
|
||||
onError?: ((message: string) => void) | undefined): ts.SourceFile => {
|
||||
// We should never try to load .ngfactory.ts files
|
||||
if (fileName.match(/\.ngfactory\.ts$/)) {
|
||||
throw new Error(`Non existent ngfactory file: ` + fileName);
|
||||
}
|
||||
return originalGetSourceFile.call(host, fileName, languageVersion, onError);
|
||||
};
|
||||
const program = ng.createProgram({rootNames: allRootNames, options, host});
|
||||
const structuralErrors = program.getNgStructuralDiagnostics();
|
||||
expect(structuralErrors.length).toBe(1);
|
||||
expect(structuralErrors[0].messageText).toContain('Function calls are not supported.');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -15,7 +15,7 @@ const globals = {
|
||||
'rxjs/Subject': 'Rx',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/compiler/esm5/compiler.js',
|
||||
dest: '../../dist/packages-dist/compiler/bundles/compiler.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -193,6 +193,7 @@ export class AotCompiler {
|
||||
|
||||
private _createNgFactoryStub(
|
||||
outputCtx: OutputContext, file: NgAnalyzedFile, emitFlags: StubEmitFlags) {
|
||||
let componentId = 0;
|
||||
file.ngModules.forEach((ngModuleMeta, ngModuleIndex) => {
|
||||
// Note: the code below needs to executed for StubEmitFlags.Basic and StubEmitFlags.TypeCheck,
|
||||
// so we don't change the .ngfactory file too much when adding the typecheck block.
|
||||
@ -230,12 +231,14 @@ export class AotCompiler {
|
||||
if (!compMeta.isComponent) {
|
||||
return;
|
||||
}
|
||||
componentId++;
|
||||
this._createTypeCheckBlock(
|
||||
outputCtx, ngModuleMeta, this._metadataResolver.getHostComponentMetadata(compMeta),
|
||||
[compMeta.type], externalReferenceVars);
|
||||
this._createTypeCheckBlock(
|
||||
outputCtx, ngModuleMeta, compMeta, ngModuleMeta.transitiveModule.directives,
|
||||
outputCtx, `${compMeta.type.reference.name}_Host_${componentId}`, ngModuleMeta,
|
||||
this._metadataResolver.getHostComponentMetadata(compMeta), [compMeta.type],
|
||||
externalReferenceVars);
|
||||
this._createTypeCheckBlock(
|
||||
outputCtx, `${compMeta.type.reference.name}_${componentId}`, ngModuleMeta, compMeta,
|
||||
ngModuleMeta.transitiveModule.directives, externalReferenceVars);
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -246,12 +249,13 @@ export class AotCompiler {
|
||||
}
|
||||
|
||||
private _createTypeCheckBlock(
|
||||
ctx: OutputContext, moduleMeta: CompileNgModuleMetadata, compMeta: CompileDirectiveMetadata,
|
||||
directives: CompileIdentifierMetadata[], externalReferenceVars: Map<any, string>) {
|
||||
ctx: OutputContext, componentId: string, moduleMeta: CompileNgModuleMetadata,
|
||||
compMeta: CompileDirectiveMetadata, directives: CompileIdentifierMetadata[],
|
||||
externalReferenceVars: Map<any, string>) {
|
||||
const {template: parsedTemplate, pipes: usedPipes} =
|
||||
this._parseTemplate(compMeta, moduleMeta, directives);
|
||||
ctx.statements.push(...this._typeCheckCompiler.compileComponent(
|
||||
compMeta, parsedTemplate, usedPipes, externalReferenceVars));
|
||||
componentId, compMeta, parsedTemplate, usedPipes, externalReferenceVars));
|
||||
}
|
||||
|
||||
emitMessageBundle(analyzeResult: NgAnalyzedModules, locale: string|null): MessageBundle {
|
||||
|
@ -54,7 +54,7 @@ export function createAotUrlResolver(host: {
|
||||
*/
|
||||
export function createAotCompiler(
|
||||
compilerHost: AotCompilerHost, options: AotCompilerOptions,
|
||||
errorCollector: (error: any, type?: any) =>
|
||||
errorCollector?: (error: any, type?: any) =>
|
||||
void): {compiler: AotCompiler, reflector: StaticReflector} {
|
||||
let translations: string = options.translations || '';
|
||||
|
||||
|
@ -80,8 +80,10 @@ export class StaticReflector implements CompileReflector {
|
||||
const refSymbol =
|
||||
this.symbolResolver.getSymbolByModule(ref.moduleName !, ref.name !, containingFile);
|
||||
const declarationSymbol = this.findSymbolDeclaration(refSymbol);
|
||||
this.symbolResolver.recordModuleNameForFileName(refSymbol.filePath, ref.moduleName !);
|
||||
this.symbolResolver.recordImportAs(declarationSymbol, refSymbol);
|
||||
if (!containingFile) {
|
||||
this.symbolResolver.recordModuleNameForFileName(refSymbol.filePath, ref.moduleName !);
|
||||
this.symbolResolver.recordImportAs(declarationSymbol, refSymbol);
|
||||
}
|
||||
return declarationSymbol;
|
||||
}
|
||||
|
||||
@ -750,7 +752,7 @@ class PopulatedScope extends BindingScope {
|
||||
}
|
||||
|
||||
function positionalError(message: string, fileName: string, line: number, column: number): Error {
|
||||
const result = new Error(message);
|
||||
const result = syntaxError(message);
|
||||
(result as any).fileName = fileName;
|
||||
(result as any).line = line;
|
||||
(result as any).column = column;
|
||||
|
@ -10,7 +10,7 @@ import {Summary, SummaryResolver} from '../summary_resolver';
|
||||
|
||||
import {StaticSymbol, StaticSymbolCache} from './static_symbol';
|
||||
import {deserializeSummaries} from './summary_serializer';
|
||||
import {ngfactoryFilePath, stripGeneratedFileSuffix, summaryFileName} from './util';
|
||||
import {stripGeneratedFileSuffix, summaryFileName} from './util';
|
||||
|
||||
export interface AotSummaryResolverHost {
|
||||
/**
|
||||
@ -119,11 +119,7 @@ export class AotSummaryResolver implements SummaryResolver<StaticSymbol> {
|
||||
if (moduleName) {
|
||||
this.knownFileNameToModuleNames.set(filePath, moduleName);
|
||||
}
|
||||
importAs.forEach((importAs) => {
|
||||
this.importAs.set(
|
||||
importAs.symbol,
|
||||
this.staticSymbolCache.get(ngfactoryFilePath(filePath), importAs.importAs));
|
||||
});
|
||||
importAs.forEach((importAs) => { this.importAs.set(importAs.symbol, importAs.importAs); });
|
||||
}
|
||||
return hasSummary;
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ import {OutputContext, ValueTransformer, ValueVisitor, visitValue} from '../util
|
||||
|
||||
import {StaticSymbol, StaticSymbolCache} from './static_symbol';
|
||||
import {ResolvedStaticSymbol, StaticSymbolResolver} from './static_symbol_resolver';
|
||||
import {summaryForJitFileName, summaryForJitName} from './util';
|
||||
import {isLoweredSymbol, ngfactoryFilePath, summaryForJitFileName, summaryForJitName} from './util';
|
||||
|
||||
export function serializeSummaries(
|
||||
srcFileName: string, forJitCtx: OutputContext | null,
|
||||
@ -38,7 +38,7 @@ export function serializeSummaries(
|
||||
});
|
||||
const {json, exportAs} = toJsonSerializer.serialize();
|
||||
if (forJitCtx) {
|
||||
const forJitSerializer = new ForJitSerializer(forJitCtx, symbolResolver);
|
||||
const forJitSerializer = new ForJitSerializer(forJitCtx, symbolResolver, summaryResolver);
|
||||
types.forEach(({summary, metadata}) => { forJitSerializer.addSourceType(summary, metadata); });
|
||||
toJsonSerializer.unprocessedSymbolSummariesBySymbol.forEach((summary) => {
|
||||
if (summaryResolver.isLibraryFile(summary.symbol.filePath) && summary.type) {
|
||||
@ -55,7 +55,7 @@ export function deserializeSummaries(
|
||||
libraryFileName: string, json: string): {
|
||||
moduleName: string | null,
|
||||
summaries: Summary<StaticSymbol>[],
|
||||
importAs: {symbol: StaticSymbol, importAs: string}[]
|
||||
importAs: {symbol: StaticSymbol, importAs: StaticSymbol}[]
|
||||
} {
|
||||
const deserializer = new FromJsonDeserializer(symbolCache, summaryResolver);
|
||||
return deserializer.deserialize(libraryFileName, json);
|
||||
@ -83,6 +83,7 @@ class ToJsonSerializer extends ValueTransformer {
|
||||
// Note: This only contains symbols without members.
|
||||
private symbols: StaticSymbol[] = [];
|
||||
private indexBySymbol = new Map<StaticSymbol, number>();
|
||||
private reexportedBy = new Map<StaticSymbol, StaticSymbol>();
|
||||
// This now contains a `__symbol: number` in the place of
|
||||
// StaticSymbols, but otherwise has the same shape as the original objects.
|
||||
private processedSummaryBySymbol = new Map<StaticSymbol, any>();
|
||||
@ -126,9 +127,32 @@ class ToJsonSerializer extends ValueTransformer {
|
||||
}
|
||||
});
|
||||
metadata = clone;
|
||||
} else if (isCall(metadata)) {
|
||||
if (!isFunctionCall(metadata) && !isMethodCallOnVariable(metadata)) {
|
||||
// Don't store complex calls as we won't be able to simplify them anyways later on.
|
||||
metadata = {
|
||||
__symbolic: 'error',
|
||||
message: 'Complex function calls are not supported.',
|
||||
};
|
||||
}
|
||||
}
|
||||
// Note: We need to keep storing ctor calls for e.g.
|
||||
// `export const x = new InjectionToken(...)`
|
||||
unprocessedSummary.metadata = metadata;
|
||||
processedSummary.metadata = this.processValue(metadata, SerializationFlags.ResolveValue);
|
||||
if (metadata instanceof StaticSymbol &&
|
||||
this.summaryResolver.isLibraryFile(metadata.filePath)) {
|
||||
const declarationSymbol = this.symbols[this.indexBySymbol.get(metadata) !];
|
||||
if (!isLoweredSymbol(declarationSymbol.name)) {
|
||||
// Note: symbols that were introduced during codegen in the user file can have a reexport
|
||||
// if a user used `export *`. However, we can't rely on this as tsickle will change
|
||||
// `export *` into named exports, using only the information from the typechecker.
|
||||
// As we introduce the new symbols after typecheck, Tsickle does not know about them,
|
||||
// and omits them when expanding `export *`.
|
||||
// So we have to keep reexporting these symbols manually via .ngfactory files.
|
||||
this.reexportedBy.set(declarationSymbol, summary.symbol);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!unprocessedSummary.type && summary.type) {
|
||||
unprocessedSummary.type = summary.type;
|
||||
@ -161,12 +185,17 @@ class ToJsonSerializer extends ValueTransformer {
|
||||
summaries: this.processedSummaries,
|
||||
symbols: this.symbols.map((symbol, index) => {
|
||||
symbol.assertNoMembers();
|
||||
let importAs: string = undefined !;
|
||||
let importAs: string|number = undefined !;
|
||||
if (this.summaryResolver.isLibraryFile(symbol.filePath)) {
|
||||
const summary = this.unprocessedSymbolSummariesBySymbol.get(symbol);
|
||||
if (!summary || !summary.metadata || summary.metadata.__symbolic !== 'interface') {
|
||||
importAs = `${symbol.name}_${index}`;
|
||||
exportAs.push({symbol, exportAs: importAs});
|
||||
const reexportSymbol = this.reexportedBy.get(symbol);
|
||||
if (reexportSymbol) {
|
||||
importAs = this.indexBySymbol.get(reexportSymbol) !;
|
||||
} else {
|
||||
const summary = this.unprocessedSymbolSummariesBySymbol.get(symbol);
|
||||
if (!summary || !summary.metadata || summary.metadata.__symbolic !== 'interface') {
|
||||
importAs = `${symbol.name}_${index}`;
|
||||
exportAs.push({symbol, exportAs: importAs});
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
@ -246,29 +275,35 @@ class ToJsonSerializer extends ValueTransformer {
|
||||
}
|
||||
|
||||
class ForJitSerializer {
|
||||
private data = new Map<StaticSymbol, {
|
||||
private data: Array<{
|
||||
summary: CompileTypeSummary,
|
||||
metadata: CompileNgModuleMetadata|CompileDirectiveMetadata|CompilePipeMetadata|
|
||||
CompileTypeMetadata|null,
|
||||
isLibrary: boolean
|
||||
}>();
|
||||
}> = [];
|
||||
|
||||
constructor(private outputCtx: OutputContext, private symbolResolver: StaticSymbolResolver) {}
|
||||
constructor(
|
||||
private outputCtx: OutputContext, private symbolResolver: StaticSymbolResolver,
|
||||
private summaryResolver: SummaryResolver<StaticSymbol>) {}
|
||||
|
||||
addSourceType(
|
||||
summary: CompileTypeSummary, metadata: CompileNgModuleMetadata|CompileDirectiveMetadata|
|
||||
CompilePipeMetadata|CompileTypeMetadata) {
|
||||
this.data.set(summary.type.reference, {summary, metadata, isLibrary: false});
|
||||
this.data.push({summary, metadata, isLibrary: false});
|
||||
}
|
||||
|
||||
addLibType(summary: CompileTypeSummary) {
|
||||
this.data.set(summary.type.reference, {summary, metadata: null, isLibrary: true});
|
||||
this.data.push({summary, metadata: null, isLibrary: true});
|
||||
}
|
||||
|
||||
serialize(exportAs: {symbol: StaticSymbol, exportAs: string}[]): void {
|
||||
serialize(exportAsArr: {symbol: StaticSymbol, exportAs: string}[]): void {
|
||||
const exportAsBySymbol = new Map<StaticSymbol, string>();
|
||||
for (const {symbol, exportAs} of exportAsArr) {
|
||||
exportAsBySymbol.set(symbol, exportAs);
|
||||
}
|
||||
const ngModuleSymbols = new Set<StaticSymbol>();
|
||||
|
||||
Array.from(this.data.values()).forEach(({summary, metadata, isLibrary}) => {
|
||||
for (const {summary, metadata, isLibrary} of this.data) {
|
||||
if (summary.summaryKind === CompileSummaryKind.NgModule) {
|
||||
// collect the symbols that refer to NgModule classes.
|
||||
// Note: we can't just rely on `summary.type.summaryKind` to determine this as
|
||||
@ -276,7 +311,9 @@ class ForJitSerializer {
|
||||
// See serializeSummaries for details.
|
||||
ngModuleSymbols.add(summary.type.reference);
|
||||
const modSummary = <CompileNgModuleSummary>summary;
|
||||
modSummary.modules.forEach((mod) => { ngModuleSymbols.add(mod.reference); });
|
||||
for (const mod of modSummary.modules) {
|
||||
ngModuleSymbols.add(mod.reference);
|
||||
}
|
||||
}
|
||||
if (!isLibrary) {
|
||||
const fnName = summaryForJitName(summary.type.reference.name);
|
||||
@ -284,16 +321,15 @@ class ForJitSerializer {
|
||||
this.outputCtx, summary.type.reference,
|
||||
this.serializeSummaryWithDeps(summary, metadata !));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
exportAs.forEach((entry) => {
|
||||
const symbol = entry.symbol;
|
||||
if (ngModuleSymbols.has(symbol)) {
|
||||
const jitExportAsName = summaryForJitName(entry.exportAs);
|
||||
this.outputCtx.statements.push(
|
||||
o.variable(jitExportAsName).set(this.serializeSummaryRef(symbol)).toDeclStmt(null, [
|
||||
o.StmtModifier.Exported
|
||||
]));
|
||||
ngModuleSymbols.forEach((ngModuleSymbol) => {
|
||||
if (this.summaryResolver.isLibraryFile(ngModuleSymbol.filePath)) {
|
||||
let exportAs = exportAsBySymbol.get(ngModuleSymbol) || ngModuleSymbol.name;
|
||||
const jitExportAsName = summaryForJitName(exportAs);
|
||||
this.outputCtx.statements.push(o.variable(jitExportAsName)
|
||||
.set(this.serializeSummaryRef(ngModuleSymbol))
|
||||
.toDeclStmt(null, [o.StmtModifier.Exported]));
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -378,22 +414,26 @@ class FromJsonDeserializer extends ValueTransformer {
|
||||
deserialize(libraryFileName: string, json: string): {
|
||||
moduleName: string | null,
|
||||
summaries: Summary<StaticSymbol>[],
|
||||
importAs: {symbol: StaticSymbol, importAs: string}[]
|
||||
importAs: {symbol: StaticSymbol, importAs: StaticSymbol}[]
|
||||
} {
|
||||
const data: {moduleName: string | null, summaries: any[], symbols: any[]} = JSON.parse(json);
|
||||
const importAs: {symbol: StaticSymbol, importAs: string}[] = [];
|
||||
this.symbols = [];
|
||||
data.symbols.forEach((serializedSymbol) => {
|
||||
const symbol = this.symbolCache.get(
|
||||
this.summaryResolver.fromSummaryFileName(serializedSymbol.filePath, libraryFileName),
|
||||
serializedSymbol.name);
|
||||
this.symbols.push(symbol);
|
||||
if (serializedSymbol.importAs) {
|
||||
importAs.push({symbol: symbol, importAs: serializedSymbol.importAs});
|
||||
const allImportAs: {symbol: StaticSymbol, importAs: StaticSymbol}[] = [];
|
||||
this.symbols = data.symbols.map(
|
||||
(serializedSymbol) => this.symbolCache.get(
|
||||
this.summaryResolver.fromSummaryFileName(serializedSymbol.filePath, libraryFileName),
|
||||
serializedSymbol.name));
|
||||
data.symbols.forEach((serializedSymbol, index) => {
|
||||
const symbol = this.symbols[index];
|
||||
const importAs = serializedSymbol.importAs;
|
||||
if (typeof importAs === 'number') {
|
||||
allImportAs.push({symbol, importAs: this.symbols[importAs]});
|
||||
} else if (typeof importAs === 'string') {
|
||||
allImportAs.push(
|
||||
{symbol, importAs: this.symbolCache.get(ngfactoryFilePath(libraryFileName), importAs)});
|
||||
}
|
||||
});
|
||||
const summaries = visitValue(data.summaries, this, null);
|
||||
return {moduleName: data.moduleName, summaries, importAs};
|
||||
const summaries = visitValue(data.summaries, this, null) as Summary<StaticSymbol>[];
|
||||
return {moduleName: data.moduleName, summaries, importAs: allImportAs};
|
||||
}
|
||||
|
||||
visitStringMap(map: {[key: string]: any}, context: any): any {
|
||||
@ -407,3 +447,16 @@ class FromJsonDeserializer extends ValueTransformer {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function isCall(metadata: any): boolean {
|
||||
return metadata && metadata.__symbolic === 'call';
|
||||
}
|
||||
|
||||
function isFunctionCall(metadata: any): boolean {
|
||||
return isCall(metadata) && metadata.expression instanceof StaticSymbol;
|
||||
}
|
||||
|
||||
function isMethodCallOnVariable(metadata: any): boolean {
|
||||
return isCall(metadata) && metadata.expression && metadata.expression.__symbolic === 'select' &&
|
||||
metadata.expression.expression instanceof StaticSymbol;
|
||||
}
|
||||
|
@ -58,4 +58,14 @@ export function summaryForJitName(symbolName: string): string {
|
||||
|
||||
export function stripSummaryForJitNameSuffix(symbolName: string): string {
|
||||
return symbolName.replace(JIT_SUMMARY_NAME, '');
|
||||
}
|
||||
}
|
||||
|
||||
const LOWERED_SYMBOL = /\u0275\d+/;
|
||||
|
||||
export function isLoweredSymbol(name: string) {
|
||||
return LOWERED_SYMBOL.test(name);
|
||||
}
|
||||
|
||||
export function createLoweredSymbol(id: number): string {
|
||||
return `\u0275${id}`;
|
||||
}
|
||||
|
@ -39,6 +39,7 @@ export * from './aot/static_reflector';
|
||||
export * from './aot/static_symbol';
|
||||
export * from './aot/static_symbol_resolver';
|
||||
export * from './aot/summary_resolver';
|
||||
export {isLoweredSymbol, createLoweredSymbol} from './aot/util';
|
||||
export {LazyRoute} from './aot/lazy_routes';
|
||||
export * from './ast_path';
|
||||
export * from './summary_resolver';
|
||||
|
@ -9,7 +9,7 @@
|
||||
import {AotCompilerOptions} from '../aot/compiler_options';
|
||||
import {StaticReflector} from '../aot/static_reflector';
|
||||
import {StaticSymbol} from '../aot/static_symbol';
|
||||
import {CompileDiDependencyMetadata, CompileDirectiveMetadata, CompilePipeSummary, viewClassName} from '../compile_metadata';
|
||||
import {CompileDiDependencyMetadata, CompileDirectiveMetadata, CompilePipeSummary} from '../compile_metadata';
|
||||
import {BuiltinConverter, EventHandlerVars, LocalResolver, convertActionBinding, convertPropertyBinding, convertPropertyBindingBuiltins} from '../compiler_util/expression_converter';
|
||||
import {AST, ASTWithSource, Interpolation} from '../expression_parser/ast';
|
||||
import {Identifiers} from '../identifiers';
|
||||
@ -33,7 +33,8 @@ export class TypeCheckCompiler {
|
||||
* and also violate the point above.
|
||||
*/
|
||||
compileComponent(
|
||||
component: CompileDirectiveMetadata, template: TemplateAst[], usedPipes: CompilePipeSummary[],
|
||||
componentId: string, component: CompileDirectiveMetadata, template: TemplateAst[],
|
||||
usedPipes: CompilePipeSummary[],
|
||||
externalReferenceVars: Map<StaticSymbol, string>): o.Statement[] {
|
||||
const pipes = new Map<string, StaticSymbol>();
|
||||
usedPipes.forEach(p => pipes.set(p.name, p.type.reference));
|
||||
@ -48,7 +49,7 @@ export class TypeCheckCompiler {
|
||||
const visitor = viewBuilderFactory(null);
|
||||
visitor.visitAll([], template);
|
||||
|
||||
return visitor.build();
|
||||
return visitor.build(componentId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -103,8 +104,8 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
templateVisitAll(this, astNodes);
|
||||
}
|
||||
|
||||
build(targetStatements: o.Statement[] = []): o.Statement[] {
|
||||
this.children.forEach((child) => child.build(targetStatements));
|
||||
build(componentId: string, targetStatements: o.Statement[] = []): o.Statement[] {
|
||||
this.children.forEach((child) => child.build(componentId, targetStatements));
|
||||
const viewStmts: o.Statement[] =
|
||||
[o.variable(DYNAMIC_VAR_NAME).set(o.NULL_EXPR).toDeclStmt(o.DYNAMIC_TYPE)];
|
||||
let bindingCount = 0;
|
||||
@ -128,7 +129,7 @@ class ViewBuilder implements TemplateAstVisitor, LocalResolver {
|
||||
(stmt: o.Statement) => o.applySourceSpanToStatementIfNeeded(stmt, sourceSpan)));
|
||||
});
|
||||
|
||||
const viewName = `_View_${this.component.name}_${this.embeddedViewIndex}`;
|
||||
const viewName = `_View_${componentId}_${this.embeddedViewIndex}`;
|
||||
const viewFactory = new o.DeclareFunctionStmt(viewName, [], viewStmts);
|
||||
targetStatements.push(viewFactory);
|
||||
return targetStatements;
|
||||
|
@ -491,10 +491,11 @@ describe('compiler (unbundled Angular)', () => {
|
||||
const libInput: MockDirectory = {
|
||||
'lib': {
|
||||
'base.ts': `
|
||||
export class AValue {}
|
||||
export type AType = {};
|
||||
|
||||
export class AClass {
|
||||
constructor(a: AType) {}
|
||||
constructor(a: AType, b: AValue) {}
|
||||
}
|
||||
`
|
||||
}
|
||||
@ -502,7 +503,7 @@ describe('compiler (unbundled Angular)', () => {
|
||||
const appInput: MockDirectory = {
|
||||
'app': {
|
||||
'main.ts': `
|
||||
export * from '../lib/base';
|
||||
export {AClass} from '../lib/base';
|
||||
`
|
||||
}
|
||||
};
|
||||
@ -511,7 +512,105 @@ describe('compiler (unbundled Angular)', () => {
|
||||
const {genFiles: appGenFiles} =
|
||||
compile([appInput, libOutDir, angularSummaryFiles], {useSummaries: true});
|
||||
const appNgFactory = appGenFiles.find((f) => f.genFileUrl === '/app/main.ngfactory.ts');
|
||||
expect(toTypeScript(appNgFactory)).not.toContain('AType');
|
||||
const appNgFactoryTs = toTypeScript(appNgFactory);
|
||||
expect(appNgFactoryTs).not.toContain('AType');
|
||||
expect(appNgFactoryTs).toContain('AValue');
|
||||
});
|
||||
|
||||
it('should not reexport complex function calls', () => {
|
||||
const libInput: MockDirectory = {
|
||||
'lib': {
|
||||
'base.ts': `
|
||||
export class AClass {
|
||||
constructor(arg: any) {}
|
||||
|
||||
static create(arg: any = null): AClass { return new AClass(arg); }
|
||||
|
||||
call(arg: any) {}
|
||||
}
|
||||
|
||||
export function simple(arg: any) { return [arg]; }
|
||||
|
||||
export const ctor_arg = {};
|
||||
export const ctor_call = new AClass(ctor_arg);
|
||||
|
||||
export const static_arg = {};
|
||||
export const static_call = AClass.create(static_arg);
|
||||
|
||||
export const complex_arg = {};
|
||||
export const complex_call = AClass.create().call(complex_arg);
|
||||
|
||||
export const simple_arg = {};
|
||||
export const simple_call = simple(simple_arg);
|
||||
`
|
||||
}
|
||||
};
|
||||
const appInput: MockDirectory = {
|
||||
'app': {
|
||||
'main.ts': `
|
||||
import {ctor_call, static_call, complex_call, simple_call} from '../lib/base';
|
||||
|
||||
export const calls = [ctor_call, static_call, complex_call, simple_call];
|
||||
`,
|
||||
}
|
||||
};
|
||||
|
||||
const {outDir: libOutDir} = compile([libInput, angularSummaryFiles], {useSummaries: true});
|
||||
const {genFiles: appGenFiles} =
|
||||
compile([appInput, libOutDir, angularSummaryFiles], {useSummaries: true});
|
||||
const appNgFactory = appGenFiles.find((f) => f.genFileUrl === '/app/main.ngfactory.ts');
|
||||
const appNgFactoryTs = toTypeScript(appNgFactory);
|
||||
|
||||
// metadata of ctor calls is preserved, so we reexport the argument
|
||||
expect(appNgFactoryTs).toContain('ctor_arg');
|
||||
expect(appNgFactoryTs).toContain('ctor_call');
|
||||
|
||||
// metadata of static calls is preserved, so we reexport the argument
|
||||
expect(appNgFactoryTs).toContain('static_arg');
|
||||
expect(appNgFactoryTs).toContain('AClass');
|
||||
expect(appNgFactoryTs).toContain('static_call');
|
||||
|
||||
// metadata of complex calls is elided, so we don't reexport the argument
|
||||
expect(appNgFactoryTs).not.toContain('complex_arg');
|
||||
expect(appNgFactoryTs).toContain('complex_call');
|
||||
|
||||
// metadata of simple calls is preserved, so we reexport the argument
|
||||
expect(appNgFactoryTs).toContain('simple_arg');
|
||||
expect(appNgFactoryTs).toContain('simple_call');
|
||||
});
|
||||
|
||||
it('should not reexport already exported symbols except for lowered symbols', () => {
|
||||
const libInput: MockDirectory = {
|
||||
'lib': {
|
||||
'base.ts': `
|
||||
export const exportedVar = 1;
|
||||
|
||||
// A symbol introduced by lowering expressions
|
||||
export const ɵ1 = 'lowered symbol';
|
||||
`
|
||||
}
|
||||
};
|
||||
const appInput: MockDirectory = {
|
||||
'app': {
|
||||
'main.ts': `export * from '../lib/base';`,
|
||||
}
|
||||
};
|
||||
|
||||
const {outDir: libOutDir} = compile([libInput, angularSummaryFiles], {useSummaries: true});
|
||||
const {genFiles: appGenFiles} =
|
||||
compile([appInput, libOutDir, angularSummaryFiles], {useSummaries: true});
|
||||
const appNgFactory = appGenFiles.find((f) => f.genFileUrl === '/app/main.ngfactory.ts');
|
||||
const appNgFactoryTs = toTypeScript(appNgFactory);
|
||||
|
||||
// we don't need to reexport exported symbols via the .ngfactory
|
||||
// as we can refer to them via the reexport.
|
||||
expect(appNgFactoryTs).not.toContain('exportedVar');
|
||||
|
||||
// although ɵ1 is reexported via `export *`, we still need to reexport it
|
||||
// via the .ngfactory as tsickle expands `export *` into named exports,
|
||||
// and doesn't know about our lowered symbols as we introduce them
|
||||
// after the typecheck phase.
|
||||
expect(appNgFactoryTs).toContain('ɵ1');
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -1062,6 +1062,22 @@ describe('StaticReflector', () => {
|
||||
.useValue)
|
||||
.toEqual({path: 'foo', data: {e: 1}});
|
||||
});
|
||||
|
||||
describe('resolveExternalReference', () => {
|
||||
it('should register modules names in the StaticSymbolResolver if no containingFile is given',
|
||||
() => {
|
||||
init({
|
||||
'/tmp/root.ts': ``,
|
||||
'/tmp/a.ts': `export const x = 1;`,
|
||||
});
|
||||
let symbol =
|
||||
reflector.resolveExternalReference({moduleName: './a', name: 'x'}, '/tmp/root.ts');
|
||||
expect(symbolResolver.getKnownModuleName(symbol.filePath)).toBeFalsy();
|
||||
|
||||
symbol = reflector.resolveExternalReference({moduleName: 'a', name: 'x'});
|
||||
expect(symbolResolver.getKnownModuleName(symbol.filePath)).toBe('a');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
const DEFAULT_TEST_DATA: {[key: string]: any} = {
|
||||
|
@ -317,37 +317,96 @@ export function main() {
|
||||
expect(summaries[1].metadata).toBe('someString');
|
||||
});
|
||||
|
||||
it('should not create "importAs" names for reexported types in libraries', () => {
|
||||
it('should not create "importAs" names for ctor arguments which are types of reexported classes in libraries',
|
||||
() => {
|
||||
init();
|
||||
const externalSerialized = serializeSummaries(
|
||||
'someFile.ts', createMockOutputContext(), summaryResolver, symbolResolver,
|
||||
[
|
||||
{
|
||||
symbol: symbolCache.get('/tmp/external.ts', 'type'),
|
||||
metadata: {__symbolic: 'interface'}
|
||||
},
|
||||
{
|
||||
symbol: symbolCache.get('/tmp/external.ts', 'value'),
|
||||
metadata: {__symbolic: 'class'}
|
||||
},
|
||||
{
|
||||
symbol: symbolCache.get('/tmp/external.ts', 'reexportClass'),
|
||||
metadata: {
|
||||
__symbolic: 'class',
|
||||
'members': {
|
||||
'__ctor__': [{
|
||||
'__symbolic': 'constructor',
|
||||
'parameters': [
|
||||
symbolCache.get('/tmp/external.ts', 'type'),
|
||||
symbolCache.get('/tmp/external.ts', 'value'),
|
||||
]
|
||||
}]
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
],
|
||||
[]);
|
||||
expect(externalSerialized.exportAs).toEqual([]);
|
||||
init({
|
||||
'/tmp/external.ngsummary.json': externalSerialized.json,
|
||||
});
|
||||
const serialized = serializeSummaries(
|
||||
'someFile.ts', createMockOutputContext(), summaryResolver, symbolResolver, [{
|
||||
symbol: symbolCache.get('/tmp/test.ts', 'mainClass'),
|
||||
metadata: symbolCache.get('/tmp/external.d.ts', 'reexportClass'),
|
||||
}],
|
||||
[]);
|
||||
const importAs =
|
||||
deserializeSummaries(symbolCache, summaryResolver, 'someFile.d.ts', serialized.json)
|
||||
.importAs;
|
||||
expect(importAs).toEqual([
|
||||
{
|
||||
symbol: symbolCache.get('/tmp/external.d.ts', 'reexportClass'),
|
||||
importAs: symbolCache.get('/tmp/test.d.ts', 'mainClass'),
|
||||
},
|
||||
{
|
||||
symbol: symbolCache.get('/tmp/external.d.ts', 'value'),
|
||||
importAs: symbolCache.get('someFile.ngfactory.d.ts', 'value_3'),
|
||||
}
|
||||
]);
|
||||
});
|
||||
|
||||
it('should use existing reexports for "importAs" for symbols of libraries', () => {
|
||||
init();
|
||||
const externalSerialized = serializeSummaries(
|
||||
'someFile.ts', createMockOutputContext(), summaryResolver, symbolResolver,
|
||||
[
|
||||
{symbol: symbolCache.get('/tmp/external.ts', 'value'), metadata: 'aValue'},
|
||||
{
|
||||
symbol: symbolCache.get('/tmp/external.ts', 'type'),
|
||||
metadata: {__symbolic: 'interface'}
|
||||
},
|
||||
{
|
||||
symbol: symbolCache.get('/tmp/external.ts', 'reexportType'),
|
||||
metadata: symbolCache.get('/tmp/external.ts', 'type')
|
||||
symbol: symbolCache.get('/tmp/external.ts', 'reexportValue'),
|
||||
metadata: symbolCache.get('/tmp/external.ts', 'value')
|
||||
},
|
||||
],
|
||||
[]);
|
||||
expect(externalSerialized.exportAs).toEqual([]);
|
||||
init({
|
||||
'/tmp/external.ngsummary.json': externalSerialized.json,
|
||||
});
|
||||
const serialized = serializeSummaries(
|
||||
'someFile.ts', createMockOutputContext(), summaryResolver, symbolResolver, [{
|
||||
symbol: symbolCache.get('/tmp/test.ts', 'mainType'),
|
||||
metadata: symbolCache.get('/tmp/external.d.ts', 'reexportType'),
|
||||
symbol: symbolCache.get('/tmp/test.ts', 'mainValue'),
|
||||
metadata: symbolCache.get('/tmp/external.d.ts', 'reexportValue'),
|
||||
}],
|
||||
[]);
|
||||
expect(serialized.exportAs).toEqual([]);
|
||||
const importAs =
|
||||
deserializeSummaries(symbolCache, summaryResolver, 'someFile.d.ts', serialized.json)
|
||||
.importAs;
|
||||
expect(importAs).toEqual([]);
|
||||
expect(importAs).toEqual([{
|
||||
symbol: symbolCache.get('/tmp/external.d.ts', 'value'),
|
||||
importAs: symbolCache.get('/tmp/test.d.ts', 'mainValue'),
|
||||
}]);
|
||||
});
|
||||
|
||||
it('should create "importAs" names for non source symbols', () => {
|
||||
it('should create reexports in the ngfactory for symbols of libraries', () => {
|
||||
init();
|
||||
const serialized = serializeSummaries(
|
||||
'someFile.ts', createMockOutputContext(), summaryResolver, symbolResolver, [{
|
||||
@ -366,9 +425,10 @@ export function main() {
|
||||
const deserialized =
|
||||
deserializeSummaries(symbolCache, summaryResolver, 'someFile.d.ts', serialized.json);
|
||||
// Note: no entry for the symbol with members!
|
||||
expect(deserialized.importAs).toEqual([
|
||||
{symbol: symbolCache.get('/tmp/external.d.ts', 'lib'), importAs: 'lib_1'}
|
||||
]);
|
||||
expect(deserialized.importAs).toEqual([{
|
||||
symbol: symbolCache.get('/tmp/external.d.ts', 'lib'),
|
||||
importAs: symbolCache.get('someFile.ngfactory.d.ts', 'lib_1')
|
||||
}]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -17,7 +17,7 @@ const globals = {
|
||||
'rxjs/Subject': 'Rx'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/compiler/esm5/testing.js',
|
||||
dest: '../../../dist/packages-dist/compiler/bundles/compiler-testing.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'rxjs/Observable': 'Rx',
|
||||
@ -18,7 +18,7 @@ const globals = {
|
||||
'rxjs/operator/share': 'Rx.Observable.prototype'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/core/esm5/core.js',
|
||||
dest: '../../dist/packages-dist/core/bundles/core.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -15,7 +15,7 @@ const globals = {
|
||||
'rxjs/Subject': 'Rx',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/core/esm5/testing.js',
|
||||
dest: '../../../dist/packages-dist/core/bundles/core-testing.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -21,7 +21,7 @@ const globals = {
|
||||
'rxjs/operator/map': 'Rx.Observable.prototype'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/forms/esm5/forms.js',
|
||||
dest: '../../dist/packages-dist/forms/bundles/forms.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,18 +6,19 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
'@angular/compiler': 'ng.compiler',
|
||||
'@angular/platform-browser': 'ng.platformBrowser',
|
||||
'rxjs/Observable': 'Rx',
|
||||
'rxjs/Observer': 'Rx',
|
||||
'rxjs/Subject': 'Rx'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/http/esm5/http.js',
|
||||
dest: '../../dist/packages-dist/http/bundles/http.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -20,7 +20,7 @@ const globals = {
|
||||
'rxjs/operator/take': 'Rx.Observable.prototype'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/http/esm5/testing.js',
|
||||
dest: '../../../dist/packages-dist/http/bundles/http-testing.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,9 +6,9 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import commonjs from 'rollup-plugin-commonjs';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
import * as path from 'path';
|
||||
const commonjs = require('rollup-plugin-commonjs');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
const path = require('path');
|
||||
|
||||
var m = /^\@angular\/((\w|\-)+)(\/(\w|\d|\/|\-)+)?$/;
|
||||
var location = normalize('../../dist/packages-dist') + '/';
|
||||
@ -60,7 +60,7 @@ module.exports = function(provided) {
|
||||
}
|
||||
`;
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/language-service/esm5/language-service.js',
|
||||
dest: '../../dist/packages-dist/language-service/bundles/language-service.umd.js',
|
||||
format: 'amd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -16,7 +16,7 @@ const globals = {
|
||||
'@angular/platform-browser': 'ng.platformBrowser',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/platform-browser-dynamic/esm5/platform-browser-dynamic.js',
|
||||
dest: '../../dist/packages-dist/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -20,7 +20,7 @@ const globals = {
|
||||
'@angular/platform-browser-dynamic': 'ng.platformBrowserDynamic'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/platform-browser-dynamic/esm5/testing.js',
|
||||
dest:
|
||||
'../../../dist/packages-dist/platform-browser-dynamic/bundles/platform-browser-dynamic-testing.umd.js',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -17,7 +17,7 @@ const globals = {
|
||||
'@angular/animations/browser': 'ng.animations.browser'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/platform-browser/esm5/animations.js',
|
||||
dest: '../../../dist/packages-dist/platform-browser/bundles/platform-browser-animations.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,15 +6,15 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
'@angular/common': 'ng.common',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/platform-browser/esm5/platform-browser.js',
|
||||
dest: '../../dist/packages-dist/platform-browser/bundles/platform-browser.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -15,7 +15,7 @@ const globals = {
|
||||
'@angular/platform-browser': 'ng.platformBrowser'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/platform-browser/esm5/testing.js',
|
||||
dest: '../../../dist/packages-dist/platform-browser/bundles/platform-browser-testing.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,22 +6,30 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/animations': 'ng.animations',
|
||||
'@angular/animations/browser': 'ng.animations.browser',
|
||||
'@angular/core': 'ng.core',
|
||||
'@angular/common': 'ng.common',
|
||||
'@angular/common/http': 'ng.common.http',
|
||||
'@angular/compiler': 'ng.compiler',
|
||||
'@angular/http': 'ng.http',
|
||||
'@angular/platform-browser': 'ng.platformBrowser',
|
||||
'@angular/platform-browser/animations': 'ng.platformBrowser.animations',
|
||||
'@angular/platform-browser-dynamic': 'ng.platformBrowserDynamic',
|
||||
'rxjs/Observable': 'Rx',
|
||||
'rxjs/Observer': 'Rx',
|
||||
'rxjs/Subject': 'Rx',
|
||||
'rxjs/Subscription': 'Rx',
|
||||
'rxjs/operator/toPromise': 'Rx.Observable.prototype',
|
||||
'rxjs/operator/filter': 'Rx.Observable.prototype',
|
||||
'rxjs/operator/first': 'Rx.Observable.prototype'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/platform-server/esm5/platform-server.js',
|
||||
dest: '../../dist/packages-dist/platform-server/bundles/platform-server.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -15,11 +15,12 @@ const globals = {
|
||||
'@angular/compiler': 'ng.compiler',
|
||||
'@angular/compiler/testing': 'ng.compiler.testing',
|
||||
'@angular/platform-browser': 'ng.platformBrowser',
|
||||
'@angular/platform-browser/animations': 'ng.platformBrowser.animations',
|
||||
'@angular/platform-server': 'ng.platformServer',
|
||||
'@angular/platform-browser-dynamic/testing': 'ng.platformBrowserDynamic.testing'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/platform-server/esm5/testing.js',
|
||||
dest: '../../../dist/packages-dist/platform-server/bundles/platform-server-testing.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -18,7 +18,7 @@ const globals = {
|
||||
'@angular/platform-webworker': 'ng.platformWebworker',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/platform-webworker-dynamic/esm5/platform-webworker-dynamic.js',
|
||||
dest:
|
||||
'../../dist/packages-dist/platform-webworker-dynamic/bundles/platform-webworker-dynamic.umd.js',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -17,7 +17,7 @@ const globals = {
|
||||
'rxjs/Subject': 'Rx'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/platform-webworker/esm5/platform-webworker.js',
|
||||
dest: '../../dist/packages-dist/platform-webworker/bundles/platform-webworker.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,6 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
export default {plugins: [sourcemaps()]};
|
||||
module.exports = {
|
||||
plugins: [sourcemaps()]
|
||||
};
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -16,6 +16,7 @@ const globals = {
|
||||
|
||||
'rxjs/BehaviorSubject': 'Rx',
|
||||
'rxjs/Observable': 'Rx',
|
||||
'rxjs/Observer': 'Rx',
|
||||
'rxjs/Subject': 'Rx',
|
||||
'rxjs/Subscription': 'Rx',
|
||||
'rxjs/util/EmptyError': 'Rx',
|
||||
@ -39,7 +40,7 @@ const globals = {
|
||||
'rxjs/operator/concatMap': 'Rx.Observable.prototype'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/router/esm5/router.js',
|
||||
dest: '../../dist/packages-dist/router/bundles/router.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -17,7 +17,7 @@ const globals = {
|
||||
'@angular/router': 'ng.router'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/router/esm5/testing.js',
|
||||
dest: '../../../dist/packages-dist/router/bundles/router-testing.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -16,7 +16,8 @@ const globals = {
|
||||
'@angular/upgrade/static': 'ng.upgrade.static'
|
||||
};
|
||||
|
||||
export default {
|
||||
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/router/esm5/upgrade.js',
|
||||
dest: '../../../dist/packages-dist/router/bundles/router-upgrade.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,9 +6,9 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/all/@angular/service-worker/cli-custom/main.js',
|
||||
dest: '../../dist/packages-dist/service-worker/ngsw-config-tmp.js',
|
||||
format: 'iife',
|
||||
|
@ -6,12 +6,12 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/service-worker/esm5/config.js',
|
||||
dest: '../../../dist/packages-dist/service-worker/bundles/service-worker-config.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -34,7 +34,7 @@ const globals = {
|
||||
'rxjs/operator/toPromise': 'Rx.Observable.prototype',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/service-worker/esm5/service-worker.js',
|
||||
dest: '../../dist/packages-dist/service-worker/bundles/service-worker.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -106,8 +106,7 @@ export class NgswCommChannel {
|
||||
this.registration = <Observable<ServiceWorkerRegistration>>(
|
||||
op_switchMap.call(this.worker, () => serviceWorker.getRegistration()));
|
||||
|
||||
const rawEvents = <Observable<MessageEvent>>(op_switchMap.call(
|
||||
this.registration, (reg: ServiceWorkerRegistration) => obs_fromEvent(reg, 'message')));
|
||||
const rawEvents = obs_fromEvent(serviceWorker, 'message');
|
||||
|
||||
const rawEventPayload =
|
||||
<Observable<Object>>(op_map.call(rawEvents, (event: MessageEvent) => event.data));
|
||||
|
@ -30,8 +30,10 @@ export function ngswAppInitializer(
|
||||
op_filter.call(app.isStable, (stable: boolean) => !!stable) as Observable<boolean>;
|
||||
const isStable = op_take.call(onStable, 1) as Observable<boolean>;
|
||||
const whenStable = op_toPromise.call(isStable) as Promise<boolean>;
|
||||
return whenStable.then(() => navigator.serviceWorker.register(script, options))
|
||||
.then(() => undefined) as Promise<void>;
|
||||
|
||||
// Don't return the Promise, as that will block the application until the SW is registered, and
|
||||
// cause a crash if the SW registration fails.
|
||||
whenStable.then(() => navigator.serviceWorker.register(script, options));
|
||||
};
|
||||
return initializer;
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ export class SwPush {
|
||||
|
||||
const workerDrivenSubscriptions = <Observable<PushSubscription|null>>(op_switchMap.call(
|
||||
this.pushManager, (pm: PushManager) => pm.getSubscription().then(sub => { return sub; })));
|
||||
this.subscription = obs_merge.call(workerDrivenSubscriptions, this.subscriptionChanges);
|
||||
this.subscription = obs_merge(workerDrivenSubscriptions, this.subscriptionChanges);
|
||||
}
|
||||
|
||||
requestSubscription(options: {serverPublicKey: string}): Promise<PushSubscription> {
|
||||
|
@ -44,11 +44,9 @@ export function main() {
|
||||
});
|
||||
describe('SwPush', () => {
|
||||
let push: SwPush;
|
||||
let reg: MockServiceWorkerRegistration;
|
||||
beforeEach((done: DoneFn) => {
|
||||
beforeEach(() => {
|
||||
push = new SwPush(comm);
|
||||
mock.setupSw();
|
||||
mock.mockRegistration.then(r => reg = r).then(() => done());
|
||||
});
|
||||
it('receives push messages', (done: DoneFn) => {
|
||||
push.messages.subscribe(msg => {
|
||||
@ -57,7 +55,7 @@ export function main() {
|
||||
});
|
||||
done();
|
||||
});
|
||||
reg.sendMessage({
|
||||
mock.sendMessage({
|
||||
type: 'PUSH',
|
||||
data: {
|
||||
message: 'this was a push message',
|
||||
@ -76,11 +74,9 @@ export function main() {
|
||||
});
|
||||
describe('SwUpdate', () => {
|
||||
let update: SwUpdate;
|
||||
let reg: MockServiceWorkerRegistration;
|
||||
beforeEach((done: DoneFn) => {
|
||||
beforeEach(() => {
|
||||
update = new SwUpdate(comm);
|
||||
mock.setupSw();
|
||||
mock.mockRegistration.then(r => reg = r).then(() => done());
|
||||
});
|
||||
it('processes update availability notifications when sent', (done: DoneFn) => {
|
||||
update.available.subscribe(event => {
|
||||
@ -89,7 +85,7 @@ export function main() {
|
||||
expect(event.type).toEqual('UPDATE_AVAILABLE');
|
||||
done();
|
||||
});
|
||||
reg.sendMessage({
|
||||
mock.sendMessage({
|
||||
type: 'UPDATE_AVAILABLE',
|
||||
current: {
|
||||
version: 'A',
|
||||
@ -106,7 +102,7 @@ export function main() {
|
||||
expect(event.type).toEqual('UPDATE_ACTIVATED');
|
||||
done();
|
||||
});
|
||||
reg.sendMessage({
|
||||
mock.sendMessage({
|
||||
type: 'UPDATE_ACTIVATED',
|
||||
previous: {
|
||||
version: 'A',
|
||||
@ -119,7 +115,7 @@ export function main() {
|
||||
it('activates updates when requested', (done: DoneFn) => {
|
||||
mock.messages.subscribe((msg: {action: string, statusNonce: number}) => {
|
||||
expect(msg.action).toEqual('ACTIVATE_UPDATE');
|
||||
reg.sendMessage({
|
||||
mock.sendMessage({
|
||||
type: 'STATUS',
|
||||
nonce: msg.statusNonce,
|
||||
status: true,
|
||||
@ -130,7 +126,7 @@ export function main() {
|
||||
it('reports activation failure when requested', (done: DoneFn) => {
|
||||
mock.messages.subscribe((msg: {action: string, statusNonce: number}) => {
|
||||
expect(msg.action).toEqual('ACTIVATE_UPDATE');
|
||||
reg.sendMessage({
|
||||
mock.sendMessage({
|
||||
type: 'STATUS',
|
||||
nonce: msg.statusNonce,
|
||||
status: false,
|
||||
|
@ -85,7 +85,7 @@ export function main() {
|
||||
driver = new Driver(scope, scope, new CacheDatabase(scope, scope));
|
||||
|
||||
scope.clients.add('default');
|
||||
scope.clients.getMock('default') !.queue.subscribe(msg => { reg.sendMessage(msg); });
|
||||
scope.clients.getMock('default') !.queue.subscribe(msg => { mock.sendMessage(msg); });
|
||||
|
||||
mock.messages.subscribe(msg => { scope.handleMessage(msg, 'default'); });
|
||||
|
||||
|
@ -10,17 +10,26 @@ import {Subject} from 'rxjs/Subject';
|
||||
|
||||
export class MockServiceWorkerContainer {
|
||||
private onControllerChange: Function[] = [];
|
||||
private onMessage: Function[] = [];
|
||||
private registration: MockServiceWorkerRegistration|null = null;
|
||||
controller: MockServiceWorker|null = null;
|
||||
|
||||
messages = new Subject();
|
||||
|
||||
addEventListener(event: 'controllerchange', handler: Function) {
|
||||
this.onControllerChange.push(handler);
|
||||
addEventListener(event: 'controllerchange'|'message', handler: Function) {
|
||||
if (event === 'controllerchange') {
|
||||
this.onControllerChange.push(handler);
|
||||
} else if (event === 'message') {
|
||||
this.onMessage.push(handler);
|
||||
}
|
||||
}
|
||||
|
||||
removeEventListener(event: 'controllerchange', handler: Function) {
|
||||
this.onControllerChange = this.onControllerChange.filter(h => h !== handler);
|
||||
if (event === 'controllerchange') {
|
||||
this.onControllerChange = this.onControllerChange.filter(h => h !== handler);
|
||||
} else if (event === 'message') {
|
||||
this.onMessage = this.onMessage.filter(h => h !== handler);
|
||||
}
|
||||
}
|
||||
|
||||
async register(url: string): Promise<void> { return; }
|
||||
@ -36,6 +45,12 @@ export class MockServiceWorkerContainer {
|
||||
get mockRegistration(): Promise<MockServiceWorkerRegistration> {
|
||||
return Promise.resolve(this.registration !);
|
||||
}
|
||||
|
||||
sendMessage(value: Object): void {
|
||||
this.onMessage.forEach(onMessage => onMessage({
|
||||
data: value,
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
export class MockServiceWorker {
|
||||
@ -44,21 +59,4 @@ export class MockServiceWorker {
|
||||
postMessage(value: Object) { this.mock.messages.next(value); }
|
||||
}
|
||||
|
||||
export class MockServiceWorkerRegistration {
|
||||
private onMessage: Function[] = [];
|
||||
messages: Object[] = [];
|
||||
|
||||
constructor() {}
|
||||
|
||||
addEventListener(event: 'message', handler: Function) { this.onMessage.push(handler); }
|
||||
|
||||
removeEventListener(event: 'message', handler: Function) {
|
||||
this.onMessage = this.onMessage.filter(h => h !== handler);
|
||||
}
|
||||
|
||||
sendMessage(value: Object): void {
|
||||
this.onMessage.forEach(onMessage => onMessage({
|
||||
data: value,
|
||||
}));
|
||||
}
|
||||
}
|
||||
export class MockServiceWorkerRegistration {}
|
||||
|
@ -6,8 +6,8 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core',
|
||||
@ -22,7 +22,7 @@ const globals = {
|
||||
'rxjs/Observable': 'Rx',
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../dist/packages-dist/upgrade/esm5/upgrade.js',
|
||||
dest: '../../dist/packages-dist/upgrade/bundles/upgrade.umd.js',
|
||||
format: 'umd',
|
||||
|
@ -6,14 +6,14 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import resolve from 'rollup-plugin-node-resolve';
|
||||
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||
const resolve = require('rollup-plugin-node-resolve');
|
||||
const sourcemaps = require('rollup-plugin-sourcemaps');
|
||||
|
||||
const globals = {
|
||||
'@angular/core': 'ng.core'
|
||||
};
|
||||
|
||||
export default {
|
||||
module.exports = {
|
||||
entry: '../../../dist/packages-dist/upgrade/esm5/static.js',
|
||||
dest: '../../../dist/packages-dist/upgrade/bundles/upgrade-static.umd.js',
|
||||
format: 'umd',
|
||||
|
166
tools/tslint/rollupConfigRule.ts
Normal file
166
tools/tslint/rollupConfigRule.ts
Normal file
@ -0,0 +1,166 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright Google Inc. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import {RuleFailure} from 'tslint/lib';
|
||||
import {AbstractRule} from 'tslint/lib/rules';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
|
||||
function _isRollupPath(path: string) {
|
||||
return /rollup\.config\.js$/.test(path);
|
||||
}
|
||||
|
||||
// Regexes to blacklist.
|
||||
const sourceFilePathBlacklist = [
|
||||
/\.spec\.ts$/,
|
||||
/_spec\.ts$/,
|
||||
/_perf\.ts$/,
|
||||
/_example\.ts$/,
|
||||
/[/\\]test[/\\]/,
|
||||
/[/\\]testing_internal\.ts$/,
|
||||
/[/\\]integrationtest[/\\]/,
|
||||
/[/\\]packages[/\\]bazel[/\\]/,
|
||||
/[/\\]packages[/\\]benchpress[/\\]/,
|
||||
/[/\\]packages[/\\]examples[/\\]/,
|
||||
|
||||
// language-service bundles everything in its UMD, so we don't need a globals. There are
|
||||
// exceptions but we simply ignore those files from this rule.
|
||||
/[/\\]packages[/\\]language-service[/\\]/,
|
||||
|
||||
// Compiler CLI is never part of a browser (there's a browser-rollup but it's managed
|
||||
// separately.
|
||||
/[/\\]packages[/\\]compiler-cli[/\\]/,
|
||||
|
||||
// service-worker is a special package that has more than one rollup config. It confuses
|
||||
// this lint rule and we simply ignore those files.
|
||||
/[/\\]packages[/\\]service-worker[/\\]/,
|
||||
];
|
||||
|
||||
// Import package name whitelist. These will be ignored.
|
||||
const importsWhitelist = [
|
||||
'@angular/compiler-cli', // Not used in a browser.
|
||||
'@angular/compiler-cli/src/language_services', // Deep import from language-service.
|
||||
'chokidar', // Not part of compiler-cli/browser, but still imported.
|
||||
'reflect-metadata',
|
||||
'tsickle',
|
||||
'url', // Part of node, no need to alias in rollup.
|
||||
'zone.js',
|
||||
];
|
||||
|
||||
const packageScopedImportWhitelist: [RegExp, string[]][] = [
|
||||
[/service-worker[/\\]cli/, ['@angular/service-worker']],
|
||||
];
|
||||
|
||||
|
||||
// Return true if the file should be linted.
|
||||
function _pathShouldBeLinted(path: string) {
|
||||
return /[/\\]packages[/\\]/.test(path) && sourceFilePathBlacklist.every(re => !re.test(path));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* .--. _________________
|
||||
* {\ / q {\ / globalGlobalMap /
|
||||
* { `\ \ (-(~` <__________________/
|
||||
* { '.{`\ \ \ )
|
||||
* {'-{ ' \ .-""'-. \ \
|
||||
* {._{'.' \/ '.) \
|
||||
* {_.{. {` |
|
||||
* {._{ ' { ;'-=-. |
|
||||
* {-.{.' { ';-=-.` /
|
||||
* {._.{.; '-=- .'
|
||||
* {_.-' `'.__ _,-'
|
||||
* |||`
|
||||
* .='==,
|
||||
*/
|
||||
interface RollupMatchInfo {
|
||||
filePath: string;
|
||||
globals: {[packageName: string]: string};
|
||||
}
|
||||
const globalGlobalRollupMap = new Map<string, RollupMatchInfo>();
|
||||
|
||||
|
||||
export class Rule extends AbstractRule {
|
||||
public apply(sourceFile: ts.SourceFile): RuleFailure[] {
|
||||
const allImports = <ts.ImportDeclaration[]>sourceFile.statements.filter(
|
||||
x => x.kind === ts.SyntaxKind.ImportDeclaration);
|
||||
|
||||
// Ignore specs, non-package files, and examples.
|
||||
if (!_pathShouldBeLinted(sourceFile.fileName)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Find the rollup.config.js from this location, if it exists.
|
||||
// If rollup cannot be found, this is an error.
|
||||
let p = path.dirname(sourceFile.fileName);
|
||||
let checkedPaths = [];
|
||||
let match: RollupMatchInfo;
|
||||
|
||||
while (p.startsWith(process.cwd())) {
|
||||
if (globalGlobalRollupMap.has(p)) {
|
||||
// We already resolved for this directory, just return it.
|
||||
match = globalGlobalRollupMap.get(p);
|
||||
break;
|
||||
}
|
||||
|
||||
const allFiles = fs.readdirSync(p);
|
||||
const maybeRollupPath = allFiles.find(x => _isRollupPath(path.join(p, x)));
|
||||
if (maybeRollupPath) {
|
||||
const rollupFilePath = path.join(p, maybeRollupPath);
|
||||
const rollupConfig = require(rollupFilePath);
|
||||
match = {filePath: rollupFilePath, globals: rollupConfig && rollupConfig.globals};
|
||||
|
||||
// Update all paths that we checked along the way.
|
||||
checkedPaths.forEach(path => globalGlobalRollupMap.set(path, match));
|
||||
globalGlobalRollupMap.set(rollupFilePath, match);
|
||||
break;
|
||||
}
|
||||
|
||||
checkedPaths.push(p);
|
||||
p = path.dirname(p);
|
||||
}
|
||||
if (!match) {
|
||||
throw new Error(
|
||||
`Could not find rollup.config.js for ${JSON.stringify(sourceFile.fileName)}.`);
|
||||
}
|
||||
|
||||
const rollupFilePath = match.filePath;
|
||||
const globalConfig = match.globals || Object.create(null);
|
||||
|
||||
return allImports
|
||||
.map(importStatement => {
|
||||
const modulePath = (importStatement.moduleSpecifier as ts.StringLiteral).text;
|
||||
if (modulePath.startsWith('.')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (importsWhitelist.indexOf(modulePath) != -1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (const [re, arr] of packageScopedImportWhitelist) {
|
||||
if (re.test(sourceFile.fileName) && arr.indexOf(modulePath) != -1) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(modulePath in globalConfig)) {
|
||||
return new RuleFailure(
|
||||
sourceFile, importStatement.getStart(), importStatement.getWidth(),
|
||||
`Import ${JSON.stringify(modulePath)} could not be found in the rollup config ` +
|
||||
`at path ${JSON.stringify(rollupFilePath)}.`,
|
||||
this.ruleName, );
|
||||
}
|
||||
|
||||
return null;
|
||||
})
|
||||
.filter(x => !!x);
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"maxLength": 100,
|
||||
"maxLength": 120,
|
||||
"types": [
|
||||
"build",
|
||||
"ci",
|
||||
@ -8,6 +8,7 @@
|
||||
"fix",
|
||||
"perf",
|
||||
"refactor",
|
||||
"release",
|
||||
"style",
|
||||
"test"
|
||||
],
|
||||
|
@ -37,6 +37,8 @@ describe('validate-commit-message.js', function() {
|
||||
expect(validateMessage('refactor(platform-webworker): something')).toBe(VALID);
|
||||
expect(validateMessage('test(language-service): something')).toBe(VALID);
|
||||
expect(validateMessage('test(packaging): something')).toBe(VALID);
|
||||
expect(validateMessage('release: something')).toBe(VALID);
|
||||
expect(validateMessage('release(packaging): something')).toBe(VALID);
|
||||
expect(errors).toEqual([]);
|
||||
});
|
||||
|
||||
@ -65,16 +67,17 @@ describe('validate-commit-message.js', function() {
|
||||
.forEach((expectedErrorMessage, index) => {
|
||||
expect(expectedErrorMessage).toEqual(errors[index]);
|
||||
});
|
||||
expect(validateMessage('release(angular): something')).toBe(INVALID);
|
||||
});
|
||||
|
||||
|
||||
it('should validate 100 characters length', function() {
|
||||
var msg =
|
||||
'fix(compiler): something super mega extra giga tera long, maybe even longer and longer and longer... ';
|
||||
'fix(compiler): something super mega extra giga tera long, maybe even longer and longer and longer and longer and longer and longer... ';
|
||||
|
||||
expect(validateMessage(msg)).toBe(INVALID);
|
||||
expect(errors).toEqual([
|
||||
'INVALID COMMIT MSG: "fix(compiler): something super mega extra giga tera long, maybe even longer and longer and longer... "\n => ERROR: The commit message is longer than 100 characters'
|
||||
'INVALID COMMIT MSG: "fix(compiler): something super mega extra giga tera long, maybe even longer and longer and longer and longer and longer and longer... "\n => ERROR: The commit message is longer than 120 characters'
|
||||
]);
|
||||
});
|
||||
|
||||
@ -106,7 +109,7 @@ describe('validate-commit-message.js', function() {
|
||||
expect(errors).toEqual(
|
||||
['INVALID COMMIT MSG: "weird($filter): something"\n' +
|
||||
' => ERROR: weird is not an allowed type.\n' +
|
||||
' => TYPES: build, ci, docs, feat, fix, perf, refactor, style, test']);
|
||||
' => TYPES: build, ci, docs, feat, fix, perf, refactor, release, style, test']);
|
||||
});
|
||||
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
"no-jasmine-focus": true,
|
||||
"no-var-keyword": true,
|
||||
"require-internal-with-underscore": true,
|
||||
"rollup-config": true,
|
||||
"semicolon": [true],
|
||||
"variable-name": [true, "ban-keywords"],
|
||||
"no-inner-declarations": [true, "function"]
|
||||
|
@ -6194,9 +6194,9 @@ rx-lite@^3.1.2:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
|
||||
|
||||
rxjs@^5.5.0:
|
||||
version "5.5.0"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.0.tgz#26d8f3866eb700e247e0728a147c3d628993d812"
|
||||
rxjs@^5.5.2:
|
||||
version "5.5.2"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3"
|
||||
dependencies:
|
||||
symbol-observable "^1.0.1"
|
||||
|
||||
|
Reference in New Issue
Block a user