Compare commits

..

23 Commits
4.3.2 ... 4.3.3

Author SHA1 Message Date
24db1ed938 docs: add changelog for 4.3.3 2017-08-02 13:00:35 -07:00
82798e9d04 release: cut the 4.3.3 release 2017-08-02 12:57:34 -07:00
da8bb1b45b docs(aio): fixed list format in FormArray section 2017-07-31 11:40:27 -07:00
f5cbc2ee25 fix(compiler): fix for element needing implicit parent placed in top-level ng-container
fixes #18314
2017-07-31 11:40:20 -07:00
cbc1986c6f fix(aio): fix links to source for paths with symlinks
Fixes #18353
2017-07-31 11:39:47 -07:00
0982f993cb ci: short-circuit npm install for aio builds that use yarn only 2017-07-31 11:39:41 -07:00
a5a29b0591 docs(aio): delay ngUpgrade e2e test to avoid flakes 2017-07-31 11:39:36 -07:00
a8f3197f24 build: short-circuit build for AIO tasks 2017-07-31 11:39:31 -07:00
e6f37120fe docs(aio): fix deprecated protractor API usage
`browser.getLocationAbsUrl()` is deprecated.
We should use `browser.getCurrentUrl()` instead.
2017-07-31 11:39:25 -07:00
6840b7bda9 ci(aio): test the example e2e files using local build of Angular 2017-07-31 11:39:21 -07:00
68f458909a build(aio): ignore generated aot files
Assets such as images and data which are generated
by the aot build were not being ignored.
2017-07-31 11:39:14 -07:00
12acecf756 docs(aio): remove generated styles.css file
This file should have been ignored as it is created
during the build of the example
2017-07-31 11:39:10 -07:00
cfbed40ab6 build(aio): support overriding the Angular packages in examples with locally built ones 2017-07-31 11:39:03 -07:00
fe1a6b8e42 build(aio): refactor and test the example-boilerplate tool 2017-07-31 11:38:59 -07:00
13e29c4e89 ci: shard the aio example e2e tests 2017-07-31 11:38:53 -07:00
fd52b178ed ci(aio): support sharding of example e2e tests 2017-07-31 11:38:48 -07:00
ca1f071b2e build(aio): upgrade @angular/material to 2.0.0-meta.8 2017-07-31 11:38:43 -07:00
296adbbb72 build(aio): upgrade @angular/* to 4.3.1 2017-07-31 11:38:37 -07:00
c795ee1176 docs(aio): fix URLSearchParams interface link to MDN
Fixes #18367
2017-07-31 11:38:33 -07:00
b550618afd refactor(aio): move content-specific images to content/images/
Fixes #17053
2017-07-31 11:38:28 -07:00
d08d6eebff refactor(aio): rename unused directories to _unused 2017-07-31 11:38:23 -07:00
e9789abd05 fix(aio): fix link to logo in example 2017-07-31 11:38:17 -07:00
f2ec2cbb99 refactor(aio): move unused images to unused directories
This prevents the ServiceWorker from prefetching unnecessary files.
2017-07-31 11:38:09 -07:00
102 changed files with 748 additions and 672 deletions

View File

@ -55,7 +55,8 @@ env:
- CI_MODE=browserstack_optional - CI_MODE=browserstack_optional
- CI_MODE=docs_test - CI_MODE=docs_test
- CI_MODE=aio - CI_MODE=aio
- CI_MODE=aio_e2e - CI_MODE=aio_e2e AIO_SHARD=0
- CI_MODE=aio_e2e AIO_SHARD=1
- CI_MODE=bazel - CI_MODE=bazel
matrix: matrix:
@ -63,7 +64,6 @@ matrix:
allow_failures: allow_failures:
- env: "CI_MODE=saucelabs_optional" - env: "CI_MODE=saucelabs_optional"
- env: "CI_MODE=browserstack_optional" - env: "CI_MODE=browserstack_optional"
- env: "CI_MODE=aio_e2e"
before_install: before_install:
# source the env.sh script so that the exported variables are available to other scripts later on # source the env.sh script so that the exported variables are available to other scripts later on

View File

@ -1,3 +1,13 @@
<a name="4.3.3"></a>
## [4.3.3](https://github.com/angular/angular/compare/4.3.2...4.3.3) (2017-08-02)
### Bug Fixes
* **compiler:** fix for element needing implicit parent placed in top-level ng-container ([f5cbc2e](https://github.com/angular/angular/commit/f5cbc2e)), closes [#18314](https://github.com/angular/angular/issues/18314)
<a name="4.3.2"></a> <a name="4.3.2"></a>
## [4.3.2](https://github.com/angular/angular/compare/4.3.1...4.3.2) (2017-07-26) ## [4.3.2](https://github.com/angular/angular/compare/4.3.1...4.3.2) (2017-07-26)

View File

@ -43,13 +43,9 @@ dist/
**/app/**/*.ajs.js **/app/**/*.ajs.js
# aot # aot
**/*.ngfactory.ts */aot/**/*
**/*.ngsummary.json !*/aot/bs-config.json
**/*.ngsummary.ts !*/aot/index.html
**/*.shim.ngstyle.ts
**/*.metadata.json
!aot/bs-config.json
!aot/index.html
!rollup-config.js !rollup-config.js
# i18n # i18n

View File

@ -9,7 +9,7 @@ export class AppComponent {
wolves = 0; wolves = 0;
gender = 'f'; gender = 'f';
fly = true; fly = true;
logo = 'https://angular.io/resources/images/logos/angular/angular.png'; logo = 'https://angular.io/assets/images/logos/angular/angular.png';
count = 3; count = 3;
heroes: string[] = ['Magneta', 'Celeritas', 'Dynama']; heroes: string[] = ['Magneta', 'Celeritas', 'Dynama'];
inc(i: number) { inc(i: number) {

View File

@ -1,116 +0,0 @@
/* #docregion , quickstart, toh */
/* Master Styles */
h1 {
color: #369;
font-family: Arial, Helvetica, sans-serif;
font-size: 250%;
}
h2, h3 {
color: #444;
font-family: Arial, Helvetica, sans-serif;
font-weight: lighter;
}
body {
margin: 2em;
}
/* #enddocregion quickstart */
body, input[text], button {
color: #888;
font-family: Cambria, Georgia;
}
/* #enddocregion toh */
a {
cursor: pointer;
cursor: hand;
}
button {
font-family: Arial;
background-color: #eee;
border: none;
padding: 5px 10px;
border-radius: 4px;
cursor: pointer;
cursor: hand;
}
button:hover {
background-color: #cfd8dc;
}
button:disabled {
background-color: #eee;
color: #aaa;
cursor: auto;
}
/* Navigation link styles */
nav a {
padding: 5px 10px;
text-decoration: none;
margin-right: 10px;
margin-top: 10px;
display: inline-block;
background-color: #eee;
border-radius: 4px;
}
nav a:visited, a:link {
color: #607D8B;
}
nav a:hover {
color: #039be5;
background-color: #CFD8DC;
}
nav a.active {
color: #039be5;
}
/* items class */
.items {
margin: 0 0 2em 0;
list-style-type: none;
padding: 0;
width: 24em;
}
.items li {
cursor: pointer;
position: relative;
left: 0;
background-color: #EEE;
margin: .5em;
padding: .3em 0;
height: 1.6em;
border-radius: 4px;
}
.items li:hover {
color: #607D8B;
background-color: #DDD;
left: .1em;
}
.items li.selected {
background-color: #CFD8DC;
color: white;
}
.items li.selected:hover {
background-color: #BBD8DC;
}
.items .text {
position: relative;
top: -3px;
}
.items .badge {
display: inline-block;
font-size: small;
color: white;
padding: 0.8em 0.7em 0 0.7em;
background-color: #607D8B;
line-height: 1em;
position: relative;
left: -1px;
top: -4px;
height: 1.8em;
margin-right: .8em;
border-radius: 4px 0 0 4px;
}
/* #docregion toh */
/* everywhere else */
* {
font-family: Arial, Helvetica, sans-serif;
}

View File

@ -9,7 +9,8 @@ describe('PhoneCat Application', function() {
it('should redirect `index.html` to `index.html#!/phones', function() { it('should redirect `index.html` to `index.html#!/phones', function() {
browser.get('index.html'); browser.get('index.html');
expect(browser.getLocationAbsUrl()).toBe('/phones'); browser.sleep(1000); // Not sure why this is needed but it is. The route change works fine.
expect(browser.getCurrentUrl()).toMatch(/\/phones$/);
}); });
describe('View: Phone list', function() { describe('View: Phone list', function() {
@ -65,7 +66,7 @@ describe('PhoneCat Application', function() {
element.all(by.css('.phones li a')).first().click(); element.all(by.css('.phones li a')).first().click();
browser.sleep(1000); // Not sure why this is needed but it is. The route change works fine. browser.sleep(1000); // Not sure why this is needed but it is. The route change works fine.
expect(browser.getLocationAbsUrl()).toBe('/phones/nexus-s'); expect(browser.getCurrentUrl()).toMatch(/\/phones\/nexus-s$/);
}); });
}); });

View File

@ -1080,8 +1080,11 @@ To get access to the `FormArray` class, import it into `hero-detail.component.ts
To _work_ with a `FormArray` you do the following: To _work_ with a `FormArray` you do the following:
1. Define the items (`FormControls` or `FormGroups`) in the array. 1. Define the items (`FormControls` or `FormGroups`) in the array.
1. Initialize the array with items created from data in the _data model_. 1. Initialize the array with items created from data in the _data model_.
1. Add and remove items as the user requires. 1. Add and remove items as the user requires.
In this guide, you define a `FormArray` for `Hero.addresses` and In this guide, you define a `FormArray` for `Hero.addresses` and

View File

@ -1830,7 +1830,7 @@ Finally, you activate the observable with `subscribe` method and (re)set the com
#### _ParamMap_ API #### _ParamMap_ API
The `ParamMap` API is inspired by the [URLSearchParams interface](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParamsOPut). It provides methods The `ParamMap` API is inspired by the [URLSearchParams interface](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams). It provides methods
to handle parameter access for both route parameters (`paramMap`) and query parameters (`queryParamMap`). to handle parameter access for both route parameters (`paramMap`) and query parameters (`queryParamMap`).
<table> <table>

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

View File

Before

Width:  |  Height:  |  Size: 257 KiB

After

Width:  |  Height:  |  Size: 257 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -8,7 +8,7 @@
<div class="feature-section"> <div class="feature-section">
<div class="feature-header"> <div class="feature-header">
<div class="text-headline">Cross Platform</div> <div class="text-headline">Cross Platform</div>
<img src="assets/images/icons/feature-icon.svg" height="70px"> <img src="generated/images/marketing/features/feature-icon.svg" height="70px">
</div> </div>
<div class="feature-row"> <div class="feature-row">
@ -34,7 +34,7 @@
<div class="feature-section"> <div class="feature-section">
<div class="feature-header"> <div class="feature-header">
<div class="text-headline">Speed and Performance</div> <div class="text-headline">Speed and Performance</div>
<img src="assets/images/icons/feature-icon.svg" height="70px"> <img src="generated/images/marketing/features/feature-icon.svg" height="70px">
</div> </div>
<div class="feature-row"> <div class="feature-row">
@ -59,7 +59,7 @@
<div class="feature-section"> <div class="feature-section">
<div class="feature-header"> <div class="feature-header">
<div class="text-headline">Productivity</div> <div class="text-headline">Productivity</div>
<img src="assets/images/icons/feature-icon.svg" height="70px"> <img src="generated/images/marketing/features/feature-icon.svg" height="70px">
</div> </div>
<div class="feature-row"> <div class="feature-row">
@ -84,7 +84,7 @@
<div class="feature-section"> <div class="feature-section">
<div class="feature-header"> <div class="feature-header">
<div class="text-headline">Full Development Story</div> <div class="text-headline">Full Development Story</div>
<img src="assets/images/icons/feature-icon.svg" height="70px"> <img src="generated/images/marketing/features/feature-icon.svg" height="70px">
</div> </div>
<div class="feature-row"> <div class="feature-row">

View File

@ -30,7 +30,7 @@
<!--Announcement Bar--> <!--Announcement Bar-->
<div class="homepage-container"> <div class="homepage-container">
<div class="announcement-bar"> <div class="announcement-bar">
<img src="generated/images/marketing/angular-mix.png" height="40" width="151"> <img src="generated/images/marketing/home/angular-mix.png" height="40" width="151">
<p>Join us at our newest event, October 2017</p> <p>Join us at our newest event, October 2017</p>
<a class="button" href="https://angularmix.com/">Learn More</a> <a class="button" href="https://angularmix.com/">Learn More</a>
</div> </div>
@ -40,7 +40,7 @@
<div layout="row" layout-xs="column" class="home-row homepage-container"> <div layout="row" layout-xs="column" class="home-row homepage-container">
<div class="promo-img-container promo-1"> <div class="promo-img-container promo-1">
<div> <div>
<img height="222" width="340" src="assets/images/home/responsive-framework.svg" alt="responsive framework"> <img height="222" width="340" src="generated/images/marketing/home/responsive-framework.svg" alt="responsive framework">
</div> </div>
</div> </div>
@ -65,7 +65,7 @@
<div class="promo-img-container promo-2"> <div class="promo-img-container promo-2">
<div> <div>
<img height="222" width="323" src="assets/images/home/speed-performance.svg" alt="speed and performance"> <img height="222" width="323" src="generated/images/marketing/home/speed-performance.svg" alt="speed and performance">
</div> </div>
</div> </div>
</div> </div>
@ -74,7 +74,7 @@
<!-- Group 3--> <!-- Group 3-->
<div layout="row" layout-xs="column" class="home-row"> <div layout="row" layout-xs="column" class="home-row">
<div class="promo-img-container promo-3"> <div class="promo-img-container promo-3">
<div><img src="assets/images/home/joyful-development.png" alt="IDE example"></div> <div><img src="generated/images/marketing/home/joyful-development.svg" alt="IDE example"></div>
</div> </div>
<div class="text-container"> <div class="text-container">
@ -100,7 +100,7 @@
<div class="promo-img-container promo-4"> <div class="promo-img-container promo-4">
<div> <div>
<img src="assets/images/home/loved-by-millions.png" alt="angular on the map" width="455" height="228"> <img src="generated/images/marketing/home/loved-by-millions.svg" alt="angular on the map" width="455" height="228">
</div> </div>
</div> </div>
</div> </div>
@ -110,7 +110,7 @@
<a href="guide/quickstart"> <a href="guide/quickstart">
<div class="card"> <div class="card">
<img src="assets/images/icons/code-icon.svg" height="70px"> <img src="generated/images/marketing/home/code-icon.svg" height="70px">
<div class="card-text-container"> <div class="card-text-container">
<div class="text-headline">Get Started</div> <div class="text-headline">Get Started</div>
<p>Start building your Angular application.</p> <p>Start building your Angular application.</p>

View File

@ -10,8 +10,8 @@
}, },
"static.ignore": [ "static.ignore": [
"\\.js\\.map$", "\\.js\\.map$",
"^/assets/images/.*/unused/", "^(?:/|\\\\)assets(?:/|\\\\)images(?:/|\\\\).*(?:/|\\\\)_unused(?:/|\\\\)",
"^/generated/(?:docs/(?!api/api-list\\.json).*|images|live-examples|zips)/" "^(?:/|\\\\)generated(?:/|\\\\)(?:docs(?:/|\\\\)(?!api(?:/|\\\\)api-list\\.json).*|images(?:/|\\\\)(?!marketing(?:/|\\\\)).*|live-examples|zips)(?:/|\\\\)"
], ],
"static.versioned": [ "static.versioned": [
"\\.[0-9a-z]{20}\\." "\\.[0-9a-z]{20}\\."

View File

@ -33,8 +33,9 @@
"docs-test": "node tools/transforms/test.js", "docs-test": "node tools/transforms/test.js",
"serve-and-sync": "concurrently --kill-others \"yarn docs-watch\" \"yarn start\"", "serve-and-sync": "concurrently --kill-others \"yarn docs-watch\" \"yarn start\"",
"~~update-webdriver": "webdriver-manager update --standalone false --gecko false", "~~update-webdriver": "webdriver-manager update --standalone false --gecko false",
"boilerplate:add": "node ./tools/examples/add-example-boilerplate add", "boilerplate:add": "node ./tools/examples/example-boilerplate add",
"boilerplate:remove": "node ./tools/examples/add-example-boilerplate remove", "boilerplate:remove": "node ./tools/examples/example-boilerplate remove",
"boilerplate:test": "node tools/examples/test.js",
"generate-plunkers": "node ./tools/plunker-builder/generatePlunkers", "generate-plunkers": "node ./tools/plunker-builder/generatePlunkers",
"generate-zips": "node ./tools/example-zipper/generateZips", "generate-zips": "node ./tools/example-zipper/generateZips",
"sw-manifest": "ngu-sw-manifest --dist dist --in ngsw-manifest.json --out dist/ngsw-manifest.json", "sw-manifest": "ngu-sw-manifest --dist dist --in ngsw-manifest.json --out dist/ngsw-manifest.json",
@ -48,17 +49,18 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^4.2.4", "@angular/animations": "^4.3.1",
"@angular/common": "^4.2.4", "@angular/cdk": "^2.0.0-beta.8",
"@angular/compiler": "^4.2.4", "@angular/common": "^4.3.1",
"@angular/core": "^4.2.4", "@angular/compiler": "^4.3.1",
"@angular/forms": "^4.2.4", "@angular/core": "^4.3.1",
"@angular/http": "^4.2.4", "@angular/forms": "^4.3.1",
"@angular/material": "^2.0.0-beta.7", "@angular/http": "^4.3.1",
"@angular/platform-browser": "^4.2.4", "@angular/material": "^2.0.0-beta.8",
"@angular/platform-browser-dynamic": "^4.2.4", "@angular/platform-browser": "^4.3.1",
"@angular/platform-server": "^4.2.4", "@angular/platform-browser-dynamic": "^4.3.1",
"@angular/router": "^4.2.4", "@angular/platform-server": "^4.3.1",
"@angular/router": "^4.3.1",
"@angular/service-worker": "^1.0.0-beta.16", "@angular/service-worker": "^1.0.0-beta.16",
"classlist.js": "^1.1.20150312", "classlist.js": "^1.1.20150312",
"core-js": "^2.4.1", "core-js": "^2.4.1",
@ -72,7 +74,7 @@
}, },
"devDependencies": { "devDependencies": {
"@angular/cli": "angular/cli-builds#webpack-next", "@angular/cli": "angular/cli-builds#webpack-next",
"@angular/compiler-cli": "^4.2.4", "@angular/compiler-cli": "^4.3.1",
"@types/jasmine": "^2.5.52", "@types/jasmine": "^2.5.52",
"@types/node": "~6.0.60", "@types/node": "~6.0.60",
"archiver": "^1.3.0", "archiver": "^1.3.0",
@ -81,7 +83,7 @@
"concurrently": "^3.4.0", "concurrently": "^3.4.0",
"cross-spawn": "^5.1.0", "cross-spawn": "^5.1.0",
"dgeni": "^0.4.7", "dgeni": "^0.4.7",
"dgeni-packages": "^0.20.0-rc.6", "dgeni-packages": "^0.20.0",
"entities": "^1.1.1", "entities": "^1.1.1",
"eslint": "^3.19.0", "eslint": "^3.19.0",
"eslint-plugin-jasmine": "^2.2.0", "eslint-plugin-jasmine": "^2.2.0",

View File

@ -76,8 +76,8 @@ export class AppComponent implements OnInit {
get homeImageUrl() { get homeImageUrl() {
return this.isSideBySide ? return this.isSideBySide ?
'assets/images/logos/standard/logo-nav@2x.png' : 'assets/images/logos/angular/logo-nav@2x.png' :
'assets/images/logos/standard/shield-large.svg'; 'assets/images/logos/angular/shield-large.svg';
} }
get isOpened() { return this.isSideBySide && this.isSideNavDoc; } get isOpened() { return this.isSideBySide && this.isSideNavDoc; }
get mode() { return this.isSideBySide ? 'side' : 'over'; } get mode() { return this.isSideBySide ? 'side' : 'over'; }

View File

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 113 KiB

View File

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

View File

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 519 B

After

Width:  |  Height:  |  Size: 519 B

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 131 KiB

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 422 B

View File

Before

Width:  |  Height:  |  Size: 783 B

After

Width:  |  Height:  |  Size: 783 B

View File

Before

Width:  |  Height:  |  Size: 452 B

After

Width:  |  Height:  |  Size: 452 B

View File

Before

Width:  |  Height:  |  Size: 864 B

After

Width:  |  Height:  |  Size: 864 B

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

Before

Width:  |  Height:  |  Size: 782 B

After

Width:  |  Height:  |  Size: 782 B

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -1,148 +0,0 @@
const fs = fsExtra = require('fs-extra');
const globby = require('globby');
const path = require('path');
const Q = require("q");
const shelljs = require('shelljs');
const EXAMPLES_PATH = path.join(__dirname, '/../../content/examples');
const SHARED_PATH = path.join(__dirname, '/shared');
const BOILERPLATE_PATH = path.join(SHARED_PATH, 'boilerplate');
const EXAMPLES_TESTING_PATH = path.join(EXAMPLES_PATH, 'testing');
const files = {
exampleBoilerplate: [
'src/styles.css',
'src/systemjs-angular-loader.js',
'src/systemjs.config.js',
'src/tsconfig.json',
'bs-config.json',
'bs-config.e2e.json',
'package.json',
'tslint.json'
],
exampleUnitTestingBoilerplate: [
'src/browser-test-shim.js',
'karma-test-shim.js',
'karma.conf.js'
],
exampleConfigFilename: 'example-config.json'
};
// requires admin access because it adds symlinks
function add() {
const realPath = path.join(SHARED_PATH, '/node_modules');
const nodeModulesPaths = getNodeModulesPaths(EXAMPLES_PATH);
// we install the examples modules first
installNodeModules();
nodeModulesPaths.map((linkPath) => {
fs.ensureSymlinkSync(realPath, linkPath);
});
return copyExampleBoilerplate();
}
function copyExampleBoilerplate() {
console.log('Copying example boilerplate files');
const examplePaths = getExamplePaths(EXAMPLES_PATH);
// Make boilerplate files read-only to avoid that they be edited by mistake.
const destFileMode = '444';
let foo = copyFiles(files.exampleBoilerplate, BOILERPLATE_PATH, examplePaths, destFileMode)
// copy the unit test boilerplate
.then(() => {
const unittestPaths = getUnitTestingPaths(EXAMPLES_PATH);
return copyFiles(files.exampleUnitTestingBoilerplate, EXAMPLES_TESTING_PATH, unittestPaths, destFileMode);
})
.catch((err) => {
console.error(err);
throw err;
});
}
// Copies fileNames into destPaths, setting the mode of the
// files at the destination as optional_destFileMode if given.
// returns a promise
function copyFiles(fileNames, originPath, destPaths, optional_destFileMode) {
const copy = Q.denodeify(fsExtra.copy);
const chmod = Q.denodeify(fsExtra.chmod);
let copyPromises = [];
destPaths.map((destPath) => {
fileNames.forEach((fileName) => {
const originName = path.join(originPath, fileName);
const destName = path.join(destPath, fileName);
let p = copy(originName, destName, { clobber: true});
if(optional_destFileMode !== undefined) {
p = p.then(() => {
return chmod(destName, optional_destFileMode);
});
}
copyPromises.push(p);
});
});
return Q.all(copyPromises);
}
function getExamplePaths(basePath, includeBase) {
// includeBase defaults to false
return getPaths(basePath, files.exampleConfigFilename, includeBase);
}
function getFilenames(basePath, filename, includeBase) {
let includePatterns = [path.join(basePath, "**/" + filename)];
if (!includeBase) {
// ignore (skip) the top level version.
includePatterns.push("!" + path.join(basePath, "/" + filename));
}
// ignore (skip) the files in BOILERPLATE_PATH.
includePatterns.push("!" + path.join(BOILERPLATE_PATH, "/" + filename));
const nmPattern = path.join(basePath, "**/node_modules/**");
return globby.sync(includePatterns, {ignore: [nmPattern]});
}
function getNodeModulesPaths(basePath) {
return getExamplePaths(basePath).map((examplePath) => {
return path.join(examplePath, "/node_modules");
});
}
function getPaths(basePath, filename, includeBase) {
const filenames = getFilenames(basePath, filename, includeBase);
return filenames.map((fileName) => {
return path.dirname(fileName);
});
}
function getUnitTestingPaths(basePath) {
const examples = getPaths(basePath, files.exampleConfigFilename, true);
return examples.filter((example) => {
const exampleConfig = fs.readJsonSync(`${example}/${files.exampleConfigFilename}`, {throws: false});
return exampleConfig && !!exampleConfig.unittesting;
});
}
function installNodeModules() {
shelljs.exec('yarn', {cwd: SHARED_PATH});
}
function remove() {
shelljs.exec('git clean -xdf', {cwd: EXAMPLES_PATH});
}
module.exports = {
add: add,
remove: remove
};
// being executed from shell script
switch (process.argv[2]) {
case 'add':
add();
break;
case 'remove':
remove();
break;
default:
console.error(`There is no function with the name: ${process.argv}`);
}

View File

@ -0,0 +1,140 @@
const fs = require('fs-extra');
const glob = require('glob');
const path = require('canonical-path');
const shelljs = require('shelljs');
const yargs = require('yargs');
const SHARED_PATH = path.resolve(__dirname, 'shared');
const SHARED_NODE_MODULES_PATH = path.resolve(SHARED_PATH, 'node_modules');
const BOILERPLATE_BASE_PATH = path.resolve(SHARED_PATH, 'boilerplate');
const EXAMPLES_BASE_PATH = path.resolve(__dirname, '../../content/examples');
const TESTING_BASE_PATH = path.resolve(EXAMPLES_BASE_PATH, 'testing');
const BOILERPLATE_SRC_PATHS = [
'src/styles.css',
'src/systemjs-angular-loader.js',
'src/systemjs.config.js',
'src/tsconfig.json',
'bs-config.json',
'bs-config.e2e.json',
'package.json',
'tslint.json'
];
const BOILERPLATE_TEST_PATHS = [
'src/browser-test-shim.js',
'karma-test-shim.js',
'karma.conf.js'
];
const ANGULAR_DIST_PATH = path.resolve(__dirname, '../../../dist');
const ANGULAR_PACKAGES_PATH = path.resolve(ANGULAR_DIST_PATH, 'packages-dist');
const ANGULAR_PACKAGES = [
'animations',
'common',
'compiler',
'compiler-cli',
'core',
'forms',
'http',
'platform-browser',
'platform-browser-dynamic',
'platform-server',
'router',
'upgrade',
];
const ANGULAR_TOOLS_PACKAGES_PATH = path.resolve(ANGULAR_DIST_PATH, 'tools', '@angular');
const ANGULAR_TOOLS_PACKAGES = [
'tsc-wrapped'
];
const EXAMPLE_CONFIG_FILENAME = 'example-config.json';
class ExampleBoilerPlate {
/**
* Add boilerplate files to all the examples
*
* @param useLocal if true then overwrite the Angular library files with locally built ones
*/
add(useLocal) {
// first install the shared node_modules
this.installNodeModules(SHARED_PATH);
// Replace the Angular packages with those from the dist folder, if necessary
if (useLocal) {
ANGULAR_PACKAGES.forEach(packageName => this.overridePackage(ANGULAR_PACKAGES_PATH, packageName));
ANGULAR_TOOLS_PACKAGES.forEach(packageName => this.overridePackage(ANGULAR_TOOLS_PACKAGES_PATH, packageName));
}
// Get all the examples folders, indicated by those that contain a `example-config.json` file
const exampleFolders = this.getFoldersContaining(EXAMPLES_BASE_PATH, EXAMPLE_CONFIG_FILENAME, 'node_modules');
exampleFolders.forEach(exampleFolder => {
// Link the node modules - requires admin access (on Windows) because it adds symlinks
const destinationNodeModules = path.resolve(exampleFolder, 'node_modules');
fs.ensureSymlinkSync(SHARED_NODE_MODULES_PATH, destinationNodeModules);
// Copy the boilerplate source files
BOILERPLATE_SRC_PATHS.forEach(filePath => this.copyFile(BOILERPLATE_BASE_PATH, exampleFolder, filePath));
// Copy the boilerplate test files (if the example is configured to do unit testing)
const exampleConfig = this.loadJsonFile(path.resolve(exampleFolder, EXAMPLE_CONFIG_FILENAME));
if (exampleConfig.unittesting) {
BOILERPLATE_TEST_PATHS.forEach(filePath => this.copyFile(TESTING_BASE_PATH, exampleFolder, filePath));
}
});
}
/**
* Remove all the boilerplate files from all the examples
*/
remove() {
shelljs.exec('git clean -xdfq', {cwd: EXAMPLES_BASE_PATH});
}
main() {
yargs
.usage('$0 <cmd> [args]')
.command('add [--local]', 'add the boilerplate to each example',
{ local: { describe: 'Use the locally built Angular libraries, rather than ones from npm.' } },
argv => this.add(argv.local))
.command('remove', 'remove the boilerplate from each example', () => this.remove())
.demandCommand(1, 'Please supply a command from the list above')
.argv;
}
installNodeModules(basePath) {
shelljs.exec('yarn', {cwd: basePath});
}
overridePackage(basePath, packageName) {
const sourceFolder = path.resolve(basePath, packageName);
const destinationFolder = path.resolve(SHARED_NODE_MODULES_PATH, '@angular', packageName);
shelljs.rm('-rf', destinationFolder);
fs.ensureSymlinkSync(sourceFolder, destinationFolder);
}
getFoldersContaining(basePath, filename, ignore) {
const pattern = path.resolve(basePath, '**', filename);
const ignorePattern = path.resolve(basePath, '**', ignore, '**');
return glob.sync(pattern, { ignore: [ignorePattern] }).map(file => path.dirname(file));
}
copyFile(sourceFolder, destinationFolder, filePath) {
const sourcePath = path.resolve(sourceFolder, filePath);
const destinationPath = path.resolve(destinationFolder, filePath);
fs.copySync(sourcePath, destinationPath, { overwrite: true });
fs.chmodSync(destinationPath, 444);
}
loadJsonFile(filePath) {
return fs.readJsonSync(filePath, {throws: false}) || {};
}
}
module.exports = new ExampleBoilerPlate();
// If this file was run directly then run the main function,
if (require.main === module) {
module.exports.main();
}

View File

@ -0,0 +1,143 @@
const exampleBoilerPlate = require('./example-boilerplate');
const shelljs = require('shelljs');
const fs = require('fs-extra');
const glob = require('glob');
const path = require('canonical-path');
describe('example-boilerplate tool', () => {
describe('add', () => {
const numberOfBoilerPlateFiles = 8;
const numberOfBoilerPlateTestFiles = 3;
const exampleFolders = ['a/b', 'c/d'];
beforeEach(() => {
spyOn(exampleBoilerPlate, 'installNodeModules');
spyOn(exampleBoilerPlate, 'overridePackage');
spyOn(exampleBoilerPlate, 'getFoldersContaining').and.returnValue(exampleFolders);
spyOn(fs, 'ensureSymlinkSync');
spyOn(exampleBoilerPlate, 'copyFile');
spyOn(exampleBoilerPlate, 'loadJsonFile').and.returnValue({});
});
it('should install the node modules', () => {
exampleBoilerPlate.add();
expect(exampleBoilerPlate.installNodeModules).toHaveBeenCalledWith(path.resolve(__dirname, 'shared'));
});
it('should override the Angular node_modules with the locally built Angular packages if `useLocal` is true', () => {
const numberOfAngularPackages = 12;
const numberOfAngularToolsPackages = 1;
exampleBoilerPlate.add(true);
expect(exampleBoilerPlate.overridePackage).toHaveBeenCalledTimes(numberOfAngularPackages + numberOfAngularToolsPackages);
// for example
expect(exampleBoilerPlate.overridePackage).toHaveBeenCalledWith(path.resolve(__dirname, '../../../dist/packages-dist'), 'core');
expect(exampleBoilerPlate.overridePackage).toHaveBeenCalledWith(path.resolve(__dirname, '../../../dist/tools/@angular'), 'tsc-wrapped');
});
it('should process all the example folders', () => {
exampleBoilerPlate.add();
expect(exampleBoilerPlate.getFoldersContaining).toHaveBeenCalledWith(path.resolve(__dirname, '../../content/examples'), 'example-config.json', 'node_modules');
});
it('should symlink the node_modules', () => {
exampleBoilerPlate.add();
expect(fs.ensureSymlinkSync).toHaveBeenCalledTimes(exampleFolders.length);
expect(fs.ensureSymlinkSync).toHaveBeenCalledWith(path.resolve(__dirname, 'shared/node_modules'), path.resolve('a/b/node_modules'));
expect(fs.ensureSymlinkSync).toHaveBeenCalledWith(path.resolve(__dirname, 'shared/node_modules'), path.resolve('c/d/node_modules'));
});
it('should copy all the source boilerplate files', () => {
exampleBoilerPlate.add();
expect(exampleBoilerPlate.copyFile).toHaveBeenCalledTimes(numberOfBoilerPlateFiles * exampleFolders.length);
// for example
expect(exampleBoilerPlate.copyFile).toHaveBeenCalledWith(path.resolve(__dirname, 'shared/boilerplate'), 'a/b', 'package.json');
});
it('should try to load the example config file', () => {
exampleBoilerPlate.add();
expect(exampleBoilerPlate.loadJsonFile).toHaveBeenCalledTimes(exampleFolders.length);
expect(exampleBoilerPlate.loadJsonFile).toHaveBeenCalledWith(path.resolve('a/b/example-config.json'));
expect(exampleBoilerPlate.loadJsonFile).toHaveBeenCalledWith(path.resolve('c/d/example-config.json'));
});
it('should copy all the test boilerplate files if unit testing is configured', () => {
// configure unit testing for example a/b and not c/d
exampleBoilerPlate.loadJsonFile.and.callFake(filePath => filePath.indexOf('a/b') !== -1 ? { unittesting: true } : {});
exampleBoilerPlate.add();
expect(exampleBoilerPlate.copyFile).toHaveBeenCalledTimes((numberOfBoilerPlateFiles * 2) + numberOfBoilerPlateTestFiles);
// for example
expect(exampleBoilerPlate.copyFile).toHaveBeenCalledWith(path.resolve(__dirname, '../../content/examples/testing'), 'a/b', 'karma.conf.js');
expect(exampleBoilerPlate.copyFile).not.toHaveBeenCalledWith(path.resolve(__dirname, '../../content/examples/testing'), 'c/d', 'karma.conf.js');
});
});
describe('remove', () => {
it('should run `git clean`', () => {
spyOn(shelljs, 'exec');
exampleBoilerPlate.remove();
expect(shelljs.exec).toHaveBeenCalledWith('git clean -xdfq', {cwd: path.resolve(__dirname, '../../content/examples') });
});
});
describe('installNodeModules', () => {
it('should run `yarn` in the base path', () => {
spyOn(shelljs, 'exec');
exampleBoilerPlate.installNodeModules('some/base/path');
expect(shelljs.exec).toHaveBeenCalledWith('yarn', { cwd: 'some/base/path' });
});
});
describe('overridePackage', () => {
beforeEach(() => {
spyOn(shelljs, 'rm');
spyOn(fs, 'ensureSymlinkSync');
});
it('should remove the original package from the shared node_modules folder', () => {
exampleBoilerPlate.overridePackage('base/path', 'somePackage');
expect(shelljs.rm).toHaveBeenCalledWith('-rf', path.resolve(__dirname, 'shared/node_modules/@angular/somePackage'));
});
it('should symlink the source folder to the shared node_modules folder', () => {
exampleBoilerPlate.overridePackage('base/path', 'somePackage');
expect(fs.ensureSymlinkSync).toHaveBeenCalledWith(path.resolve('base/path/somePackage'), path.resolve(__dirname, 'shared/node_modules/@angular/somePackage'));
});
});
describe('getFoldersContaining', () => {
it('should use glob.sync', () => {
spyOn(glob, 'sync').and.returnValue(['a/b/config.json', 'c/d/config.json']);
const result = exampleBoilerPlate.getFoldersContaining('base/path', 'config.json', 'node_modules');
expect(glob.sync).toHaveBeenCalledWith(path.resolve('base/path/**/config.json'), { ignore: [path.resolve('base/path/**/node_modules/**')] });
expect(result).toEqual(['a/b', 'c/d']);
});
});
describe('copyFile', () => {
it('should use copySync and chmodSync', () => {
spyOn(fs, 'copySync');
spyOn(fs, 'chmodSync');
exampleBoilerPlate.copyFile('source/folder', 'destination/folder', 'some/file/path');
expect(fs.copySync).toHaveBeenCalledWith(
path.resolve('source/folder/some/file/path'),
path.resolve('destination/folder/some/file/path'),
{ overwrite: true });
expect(fs.chmodSync).toHaveBeenCalledWith(path.resolve('destination/folder/some/file/path'), 444);
});
});
describe('loadJsonFile', () => {
it('should use fs.readJsonSync', () => {
spyOn(fs, 'readJsonSync').and.returnValue({ some: 'value' });
const result = exampleBoilerPlate.loadJsonFile('some/file');
expect(fs.readJsonSync).toHaveBeenCalledWith('some/file', {throws: false});
expect(result).toEqual({ some: 'value' });
});
it('should return an empty object if readJsonSync fails', () => {
spyOn(fs, 'readJsonSync').and.returnValue(null);
const result = exampleBoilerPlate.loadJsonFile('some/file');
expect(result).toEqual({});
});
});
});

View File

@ -22,15 +22,24 @@ const IGNORED_EXAMPLES = [
* --filter to filter/select _example app subdir names * --filter to filter/select _example app subdir names
* e.g. --filter=foo // all example apps with 'foo' in their folder names. * e.g. --filter=foo // all example apps with 'foo' in their folder names.
* *
* --setup run yarn install, copy boilerplate and update webdriver * --setup run yarn install, copy boilerplate and update webdriver
* e.g. --setup * e.g. --setup
*
* --local to use the locally built Angular packages, rather than versions from npm
* Must be used in conjunction with --setup as this is when the packages are copied.
* e.g. --setup --local
*
* --shard to shard the specs into groups to allow you to run them in parallel
* e.g. --shard=0/2 // the even specs: 0, 2, 4, etc
* e.g. --shard=1/2 // the odd specs: 1, 3, 5, etc
* e.g. --shard=1/3 // the second of every three specs: 1, 4, 7, etc
*/ */
function runE2e() { function runE2e() {
let promise = Promise.resolve(); let promise = Promise.resolve();
if (argv.setup) { if (argv.setup) {
// Run setup. // Run setup.
console.log('runE2e: copy boilerplate'); console.log('runE2e: copy boilerplate');
const spawnInfo = spawnExt('yarn', ['boilerplate:add'], { cwd: AIO_PATH }); const spawnInfo = spawnExt('yarn', ['boilerplate:add', argv.local ? '-- --local': ''], { cwd: AIO_PATH });
promise = spawnInfo.promise promise = spawnInfo.promise
.then(() => { .then(() => {
console.log('runE2e: update webdriver'); console.log('runE2e: update webdriver');
@ -41,7 +50,7 @@ function runE2e() {
const outputFile = path.join(AIO_PATH, './protractor-results.txt'); const outputFile = path.join(AIO_PATH, './protractor-results.txt');
return promise return promise
.then(() => findAndRunE2eTests(argv.filter, outputFile)) .then(() => findAndRunE2eTests(argv.filter, outputFile, argv.shard))
.then((status) => { .then((status) => {
reportStatus(status, outputFile); reportStatus(status, outputFile);
if (status.failed.length > 0) { if (status.failed.length > 0) {
@ -55,7 +64,12 @@ function runE2e() {
// Finds all of the *e2e-spec.tests under the examples folder along with the corresponding apps // Finds all of the *e2e-spec.tests under the examples folder along with the corresponding apps
// that they should run under. Then run each app/spec collection sequentially. // that they should run under. Then run each app/spec collection sequentially.
function findAndRunE2eTests(filter, outputFile) { function findAndRunE2eTests(filter, outputFile, shard) {
const shardParts = shard ? shard.split('/') : [0,1];
const shardModulo = parseInt(shardParts[0], 10);
const shardDivider = parseInt(shardParts[1], 10);
// create an output file with header. // create an output file with header.
const startTime = new Date().getTime(); const startTime = new Date().getTime();
let header = `Doc Sample Protractor Results on ${new Date().toLocaleString()}\n`; let header = `Doc Sample Protractor Results on ${new Date().toLocaleString()}\n`;
@ -65,7 +79,9 @@ function findAndRunE2eTests(filter, outputFile) {
// Run the tests sequentially. // Run the tests sequentially.
const status = { passed: [], failed: [] }; const status = { passed: [], failed: [] };
return getE2eSpecPaths(EXAMPLES_PATH, filter) return getE2eSpecPaths(EXAMPLES_PATH, filter)
.then(e2eSpecPaths => e2eSpecPaths.reduce((promise, specPath) => { .then(e2eSpecPaths => e2eSpecPaths
.filter((paths, index) => index % shardDivider === shardModulo)
.reduce((promise, specPath) => {
return promise.then(() => { return promise.then(() => {
const examplePath = path.dirname(specPath); const examplePath = path.dirname(specPath);
return runE2eTests(examplePath, outputFile).then((ok) => { return runE2eTests(examplePath, outputFile).then((ok) => {

View File

@ -0,0 +1,17 @@
/*
* Use this script to run the tests for the doc generation
* We cannot use the Jasmine CLI directly because it doesn't seem to
* understand the glob and only runs one spec file.
*
* Equally we cannot use a jasmine.json config file because it doesn't
* allow us to set the projectBaseDir, which means that you have to run
* jasmine CLI from this directory.
*
* Using a file like this gives us full control and keeps the package.json
* file clean and simple.
*/
const Jasmine = require('jasmine');
const jasmine = new Jasmine({ projectBaseDir: __dirname });
jasmine.loadConfig({ spec_files: ['*.spec.js'] });
jasmine.execute();

View File

@ -1,7 +1,7 @@
{% macro githubHref(doc, versionInfo) -%} {% macro githubHref(doc, versionInfo) -%}
https://github.com/{$ versionInfo.gitRepoInfo.owner $}/{$ versionInfo.gitRepoInfo.repo $}/tree/{$ versionInfo.currentVersion.isSnapshot and versionInfo.currentVersion.SHA or versionInfo.currentVersion.raw $}/packages/{$ doc.fileInfo.projectRelativePath $}#L{$ doc.startingLine + 1 $}-L{$ doc.endingLine + 1 $} https://github.com/{$ versionInfo.gitRepoInfo.owner $}/{$ versionInfo.gitRepoInfo.repo $}/tree/{$ versionInfo.currentVersion.isSnapshot and versionInfo.currentVersion.SHA or versionInfo.currentVersion.raw $}/packages/{$ doc.fileInfo.realProjectRelativePath $}#L{$ doc.startingLine + 1 $}-L{$ doc.endingLine + 1 $}
{%- endmacro %} {%- endmacro %}
{% macro githubViewLink(doc, versionInfo) -%} {% macro githubViewLink(doc, versionInfo) -%}
<a href="{$ githubHref(doc, versionInfo) $}">{$ doc.fileInfo.projectRelativePath $}</a> <a href="{$ githubHref(doc, versionInfo) $}">{$ doc.fileInfo.realProjectRelativePath $}</a>
{%- endmacro %} {%- endmacro %}

View File

@ -2,9 +2,15 @@
# yarn lockfile v1 # yarn lockfile v1
"@angular/animations@^4.2.4": "@angular/animations@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-4.2.4.tgz#552d361fff163c56d0dfda4f963a16bfe4e44e98" resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-4.3.1.tgz#1f7e0bb803efc21c608246e6765a1c647f3d1a5f"
dependencies:
tslib "^1.7.1"
"@angular/cdk@^2.0.0-beta.8":
version "2.0.0-beta.8"
resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-2.0.0-beta.8.tgz#71961c851dfbeb19e085e898bf5e4461408f8b57"
dependencies: dependencies:
tslib "^1.7.1" tslib "^1.7.1"
@ -73,73 +79,73 @@
optionalDependencies: optionalDependencies:
node-sass "^4.3.0" node-sass "^4.3.0"
"@angular/common@^4.2.4": "@angular/common@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/common/-/common-4.2.4.tgz#9b7ee0e692ab03191a7cd9af331d0f492d3cefeb" resolved "https://registry.yarnpkg.com/@angular/common/-/common-4.3.1.tgz#260f487a7cdca326c436bd3ea9515c797de2ff72"
dependencies: dependencies:
tslib "^1.7.1" tslib "^1.7.1"
"@angular/compiler-cli@^4.2.4": "@angular/compiler-cli@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-4.2.4.tgz#cce941a28362fc1c042ab85890fcaab1e233dd57" resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-4.3.1.tgz#00b41afb6faeb4aef561b8427804ac8880aff63c"
dependencies: dependencies:
"@angular/tsc-wrapped" "4.2.4" "@angular/tsc-wrapped" "4.3.1"
minimist "^1.2.0" minimist "^1.2.0"
reflect-metadata "^0.1.2" reflect-metadata "^0.1.2"
"@angular/compiler@^4.2.4": "@angular/compiler@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-4.2.4.tgz#7936a87b2d483abcef840b868c1fcf67221c4914" resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-4.3.1.tgz#3a24d49ecf01ac2b6e07f63e378b8ff8e257fe09"
dependencies: dependencies:
tslib "^1.7.1" tslib "^1.7.1"
"@angular/core@^4.2.4": "@angular/core@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/core/-/core-4.2.4.tgz#e8df7a8dd5de5a327784dfc35b5da6344281cf1b" resolved "https://registry.yarnpkg.com/@angular/core/-/core-4.3.1.tgz#a9d0a7d644b96260674269b689a04feea632a8d3"
dependencies: dependencies:
tslib "^1.7.1" tslib "^1.7.1"
"@angular/forms@^4.2.4": "@angular/forms@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-4.2.4.tgz#ae09755332ea463f561df01aac2bd369e5d35dc9" resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-4.3.1.tgz#33914da2cb146430ff901471e682c76654622dfe"
dependencies: dependencies:
tslib "^1.7.1" tslib "^1.7.1"
"@angular/http@^4.2.4": "@angular/http@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/http/-/http-4.2.4.tgz#ed039c0d53a587d24575f4cabfd1db8e7f1e3f8b" resolved "https://registry.yarnpkg.com/@angular/http/-/http-4.3.1.tgz#e4f661f746711e88ecbea76a3c905babf97d315a"
dependencies: dependencies:
tslib "^1.7.1" tslib "^1.7.1"
"@angular/material@^2.0.0-beta.7": "@angular/material@^2.0.0-beta.8":
version "2.0.0-beta.7" version "2.0.0-beta.8"
resolved "https://registry.yarnpkg.com/@angular/material/-/material-2.0.0-beta.7.tgz#2584aaf1ffbe24779916345f1ac82921ccbc2577" resolved "https://registry.yarnpkg.com/@angular/material/-/material-2.0.0-beta.8.tgz#a92852abc9261aea26c2401f576645470be2cf38"
dependencies: dependencies:
tslib "^1.7.1" tslib "^1.7.1"
"@angular/platform-browser-dynamic@^4.2.4": "@angular/platform-browser-dynamic@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.2.4.tgz#5190fda79425ae49a49224985614c9780a370761" resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.3.1.tgz#84034da60a82ef36e7effda7b3ade6e645b330b3"
dependencies: dependencies:
tslib "^1.7.1" tslib "^1.7.1"
"@angular/platform-browser@^4.2.4": "@angular/platform-browser@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-4.2.4.tgz#00a44dcb2fd777b54bc17c1ce734aa18fe9fd039" resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-4.3.1.tgz#db727b06eed64bda5defec71815db26a4da2f690"
dependencies: dependencies:
tslib "^1.7.1" tslib "^1.7.1"
"@angular/platform-server@^4.2.4": "@angular/platform-server@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-4.2.4.tgz#acfd9c620b1d64c3da9f0c6192d6ccd59620d0d6" resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-4.3.1.tgz#3b915fc4013c6a947a8c147b4db0279b025936eb"
dependencies: dependencies:
parse5 "^3.0.1" parse5 "^3.0.1"
tslib "^1.7.1" tslib "^1.7.1"
xhr2 "^0.1.4" xhr2 "^0.1.4"
"@angular/router@^4.2.4": "@angular/router@^4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/router/-/router-4.2.4.tgz#2f193f3a36da19b11a08c9b40e391bd8fde59c56" resolved "https://registry.yarnpkg.com/@angular/router/-/router-4.3.1.tgz#5219d44526156d816065841127610165a015b450"
dependencies: dependencies:
tslib "^1.7.1" tslib "^1.7.1"
@ -150,9 +156,9 @@
base64-js "^1.1.2" base64-js "^1.1.2"
jshashes "^1.0.5" jshashes "^1.0.5"
"@angular/tsc-wrapped@4.2.4": "@angular/tsc-wrapped@4.3.1":
version "4.2.4" version "4.3.1"
resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-4.2.4.tgz#956ff14ccf2043243b0cc82336b221dbe6315aef" resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-4.3.1.tgz#f6616a4d2a3bbec1cded664fd1f526edce99ef41"
dependencies: dependencies:
tsickle "^0.21.0" tsickle "^0.21.0"
@ -1904,9 +1910,9 @@ devtools-timeline-model@1.1.6:
chrome-devtools-frontend "1.0.401423" chrome-devtools-frontend "1.0.401423"
resolve "1.1.7" resolve "1.1.7"
dgeni-packages@^0.20.0-rc.6: dgeni-packages@^0.20.0:
version "0.20.0-rc.6" version "0.20.0"
resolved "https://registry.yarnpkg.com/dgeni-packages/-/dgeni-packages-0.20.0-rc.6.tgz#d615e0631305dcf091386c802d0e424ef86206d2" resolved "https://registry.yarnpkg.com/dgeni-packages/-/dgeni-packages-0.20.0.tgz#e7da99b0a119ee2eb584202d054a5aa01f23e208"
dependencies: dependencies:
canonical-path "0.0.2" canonical-path "0.0.2"
catharsis "^0.8.1" catharsis "^0.8.1"

View File

@ -1,6 +1,6 @@
{ {
"name": "angular-srcs", "name": "angular-srcs",
"version": "4.3.2", "version": "4.3.3",
"private": true, "private": true,
"branchPattern": "2.0.*", "branchPattern": "2.0.*",
"description": "Angular - a web framework for modern web apps", "description": "Angular - a web framework for modern web apps",

View File

@ -9,7 +9,7 @@
"ng-xi18n": "./src/extract_i18n.js" "ng-xi18n": "./src/extract_i18n.js"
}, },
"dependencies": { "dependencies": {
"@angular/tsc-wrapped": "4.3.2", "@angular/tsc-wrapped": "4.3.3",
"reflect-metadata": "^0.1.2", "reflect-metadata": "^0.1.2",
"minimist": "^1.2.0" "minimist": "^1.2.0"
}, },

View File

@ -230,12 +230,9 @@ class _TreeBuilder {
} }
private _closeVoidElement(): void { private _closeVoidElement(): void {
if (this._elementStack.length > 0) { const el = this._getParentElement();
const el = this._elementStack[this._elementStack.length - 1]; if (el && this.getTagDefinition(el.name).isVoid) {
this._elementStack.pop();
if (this.getTagDefinition(el.name).isVoid) {
this._elementStack.pop();
}
} }
} }
@ -274,11 +271,10 @@ class _TreeBuilder {
} }
private _pushElement(el: html.Element) { private _pushElement(el: html.Element) {
if (this._elementStack.length > 0) { const parentEl = this._getParentElement();
const parentEl = this._elementStack[this._elementStack.length - 1];
if (this.getTagDefinition(parentEl.name).isClosedByChild(el.name)) { if (parentEl && this.getTagDefinition(parentEl.name).isClosedByChild(el.name)) {
this._elementStack.pop(); this._elementStack.pop();
}
} }
const tagDef = this.getTagDefinition(el.name); const tagDef = this.getTagDefinition(el.name);
@ -353,7 +349,7 @@ class _TreeBuilder {
* `<ng-container>` elements are skipped as they are not rendered as DOM element. * `<ng-container>` elements are skipped as they are not rendered as DOM element.
*/ */
private _getParentElementSkippingContainers(): private _getParentElementSkippingContainers():
{parent: html.Element, container: html.Element|null} { {parent: html.Element | null, container: html.Element|null} {
let container: html.Element|null = null; let container: html.Element|null = null;
for (let i = this._elementStack.length - 1; i >= 0; i--) { for (let i = this._elementStack.length - 1; i >= 0; i--) {
@ -363,7 +359,7 @@ class _TreeBuilder {
container = this._elementStack[i]; container = this._elementStack[i];
} }
return {parent: this._elementStack[this._elementStack.length - 1], container}; return {parent: null, container};
} }
private _addToParent(node: html.Node) { private _addToParent(node: html.Node) {

View File

@ -56,274 +56,272 @@ export function isNgTemplate(tagName: string): boolean {
return splitNsName(tagName)[1] === 'ng-template'; return splitNsName(tagName)[1] === 'ng-template';
} }
export function getNsPrefix(fullName: string): string export function getNsPrefix(fullName: string): string;
export function getNsPrefix(fullName: null): null; export function getNsPrefix(fullName: null): null;
export function getNsPrefix(fullName: string | null): string | export function getNsPrefix(fullName: string | null): string|null {
null { return fullName === null ? null : splitNsName(fullName)[0];
return fullName === null ? null : splitNsName(fullName)[0]; }
}
export function mergeNsAndName(prefix: string, localName: string): export function mergeNsAndName(prefix: string, localName: string): string {
string { return prefix ? `:${prefix}:${localName}` : localName;
return prefix ? `:${prefix}:${localName}` : localName; }
}
// see http://www.w3.org/TR/html51/syntax.html#named-character-references // see http://www.w3.org/TR/html51/syntax.html#named-character-references
// see https://html.spec.whatwg.org/multipage/entities.json // see https://html.spec.whatwg.org/multipage/entities.json
// This list is not exhaustive to keep the compiler footprint low. // This list is not exhaustive to keep the compiler footprint low.
// The `&#123;` / `&#x1ab;` syntax should be used when the named character reference does not // The `&#123;` / `&#x1ab;` syntax should be used when the named character reference does not
// exist. // exist.
export const NAMED_ENTITIES: {[k: string]: string} = { export const NAMED_ENTITIES: {[k: string]: string} = {
'Aacute': '\u00C1', 'Aacute': '\u00C1',
'aacute': '\u00E1', 'aacute': '\u00E1',
'Acirc': '\u00C2', 'Acirc': '\u00C2',
'acirc': '\u00E2', 'acirc': '\u00E2',
'acute': '\u00B4', 'acute': '\u00B4',
'AElig': '\u00C6', 'AElig': '\u00C6',
'aelig': '\u00E6', 'aelig': '\u00E6',
'Agrave': '\u00C0', 'Agrave': '\u00C0',
'agrave': '\u00E0', 'agrave': '\u00E0',
'alefsym': '\u2135', 'alefsym': '\u2135',
'Alpha': '\u0391', 'Alpha': '\u0391',
'alpha': '\u03B1', 'alpha': '\u03B1',
'amp': '&', 'amp': '&',
'and': '\u2227', 'and': '\u2227',
'ang': '\u2220', 'ang': '\u2220',
'apos': '\u0027', 'apos': '\u0027',
'Aring': '\u00C5', 'Aring': '\u00C5',
'aring': '\u00E5', 'aring': '\u00E5',
'asymp': '\u2248', 'asymp': '\u2248',
'Atilde': '\u00C3', 'Atilde': '\u00C3',
'atilde': '\u00E3', 'atilde': '\u00E3',
'Auml': '\u00C4', 'Auml': '\u00C4',
'auml': '\u00E4', 'auml': '\u00E4',
'bdquo': '\u201E', 'bdquo': '\u201E',
'Beta': '\u0392', 'Beta': '\u0392',
'beta': '\u03B2', 'beta': '\u03B2',
'brvbar': '\u00A6', 'brvbar': '\u00A6',
'bull': '\u2022', 'bull': '\u2022',
'cap': '\u2229', 'cap': '\u2229',
'Ccedil': '\u00C7', 'Ccedil': '\u00C7',
'ccedil': '\u00E7', 'ccedil': '\u00E7',
'cedil': '\u00B8', 'cedil': '\u00B8',
'cent': '\u00A2', 'cent': '\u00A2',
'Chi': '\u03A7', 'Chi': '\u03A7',
'chi': '\u03C7', 'chi': '\u03C7',
'circ': '\u02C6', 'circ': '\u02C6',
'clubs': '\u2663', 'clubs': '\u2663',
'cong': '\u2245', 'cong': '\u2245',
'copy': '\u00A9', 'copy': '\u00A9',
'crarr': '\u21B5', 'crarr': '\u21B5',
'cup': '\u222A', 'cup': '\u222A',
'curren': '\u00A4', 'curren': '\u00A4',
'dagger': '\u2020', 'dagger': '\u2020',
'Dagger': '\u2021', 'Dagger': '\u2021',
'darr': '\u2193', 'darr': '\u2193',
'dArr': '\u21D3', 'dArr': '\u21D3',
'deg': '\u00B0', 'deg': '\u00B0',
'Delta': '\u0394', 'Delta': '\u0394',
'delta': '\u03B4', 'delta': '\u03B4',
'diams': '\u2666', 'diams': '\u2666',
'divide': '\u00F7', 'divide': '\u00F7',
'Eacute': '\u00C9', 'Eacute': '\u00C9',
'eacute': '\u00E9', 'eacute': '\u00E9',
'Ecirc': '\u00CA', 'Ecirc': '\u00CA',
'ecirc': '\u00EA', 'ecirc': '\u00EA',
'Egrave': '\u00C8', 'Egrave': '\u00C8',
'egrave': '\u00E8', 'egrave': '\u00E8',
'empty': '\u2205', 'empty': '\u2205',
'emsp': '\u2003', 'emsp': '\u2003',
'ensp': '\u2002', 'ensp': '\u2002',
'Epsilon': '\u0395', 'Epsilon': '\u0395',
'epsilon': '\u03B5', 'epsilon': '\u03B5',
'equiv': '\u2261', 'equiv': '\u2261',
'Eta': '\u0397', 'Eta': '\u0397',
'eta': '\u03B7', 'eta': '\u03B7',
'ETH': '\u00D0', 'ETH': '\u00D0',
'eth': '\u00F0', 'eth': '\u00F0',
'Euml': '\u00CB', 'Euml': '\u00CB',
'euml': '\u00EB', 'euml': '\u00EB',
'euro': '\u20AC', 'euro': '\u20AC',
'exist': '\u2203', 'exist': '\u2203',
'fnof': '\u0192', 'fnof': '\u0192',
'forall': '\u2200', 'forall': '\u2200',
'frac12': '\u00BD', 'frac12': '\u00BD',
'frac14': '\u00BC', 'frac14': '\u00BC',
'frac34': '\u00BE', 'frac34': '\u00BE',
'frasl': '\u2044', 'frasl': '\u2044',
'Gamma': '\u0393', 'Gamma': '\u0393',
'gamma': '\u03B3', 'gamma': '\u03B3',
'ge': '\u2265', 'ge': '\u2265',
'gt': '>', 'gt': '>',
'harr': '\u2194', 'harr': '\u2194',
'hArr': '\u21D4', 'hArr': '\u21D4',
'hearts': '\u2665', 'hearts': '\u2665',
'hellip': '\u2026', 'hellip': '\u2026',
'Iacute': '\u00CD', 'Iacute': '\u00CD',
'iacute': '\u00ED', 'iacute': '\u00ED',
'Icirc': '\u00CE', 'Icirc': '\u00CE',
'icirc': '\u00EE', 'icirc': '\u00EE',
'iexcl': '\u00A1', 'iexcl': '\u00A1',
'Igrave': '\u00CC', 'Igrave': '\u00CC',
'igrave': '\u00EC', 'igrave': '\u00EC',
'image': '\u2111', 'image': '\u2111',
'infin': '\u221E', 'infin': '\u221E',
'int': '\u222B', 'int': '\u222B',
'Iota': '\u0399', 'Iota': '\u0399',
'iota': '\u03B9', 'iota': '\u03B9',
'iquest': '\u00BF', 'iquest': '\u00BF',
'isin': '\u2208', 'isin': '\u2208',
'Iuml': '\u00CF', 'Iuml': '\u00CF',
'iuml': '\u00EF', 'iuml': '\u00EF',
'Kappa': '\u039A', 'Kappa': '\u039A',
'kappa': '\u03BA', 'kappa': '\u03BA',
'Lambda': '\u039B', 'Lambda': '\u039B',
'lambda': '\u03BB', 'lambda': '\u03BB',
'lang': '\u27E8', 'lang': '\u27E8',
'laquo': '\u00AB', 'laquo': '\u00AB',
'larr': '\u2190', 'larr': '\u2190',
'lArr': '\u21D0', 'lArr': '\u21D0',
'lceil': '\u2308', 'lceil': '\u2308',
'ldquo': '\u201C', 'ldquo': '\u201C',
'le': '\u2264', 'le': '\u2264',
'lfloor': '\u230A', 'lfloor': '\u230A',
'lowast': '\u2217', 'lowast': '\u2217',
'loz': '\u25CA', 'loz': '\u25CA',
'lrm': '\u200E', 'lrm': '\u200E',
'lsaquo': '\u2039', 'lsaquo': '\u2039',
'lsquo': '\u2018', 'lsquo': '\u2018',
'lt': '<', 'lt': '<',
'macr': '\u00AF', 'macr': '\u00AF',
'mdash': '\u2014', 'mdash': '\u2014',
'micro': '\u00B5', 'micro': '\u00B5',
'middot': '\u00B7', 'middot': '\u00B7',
'minus': '\u2212', 'minus': '\u2212',
'Mu': '\u039C', 'Mu': '\u039C',
'mu': '\u03BC', 'mu': '\u03BC',
'nabla': '\u2207', 'nabla': '\u2207',
'nbsp': '\u00A0', 'nbsp': '\u00A0',
'ndash': '\u2013', 'ndash': '\u2013',
'ne': '\u2260', 'ne': '\u2260',
'ni': '\u220B', 'ni': '\u220B',
'not': '\u00AC', 'not': '\u00AC',
'notin': '\u2209', 'notin': '\u2209',
'nsub': '\u2284', 'nsub': '\u2284',
'Ntilde': '\u00D1', 'Ntilde': '\u00D1',
'ntilde': '\u00F1', 'ntilde': '\u00F1',
'Nu': '\u039D', 'Nu': '\u039D',
'nu': '\u03BD', 'nu': '\u03BD',
'Oacute': '\u00D3', 'Oacute': '\u00D3',
'oacute': '\u00F3', 'oacute': '\u00F3',
'Ocirc': '\u00D4', 'Ocirc': '\u00D4',
'ocirc': '\u00F4', 'ocirc': '\u00F4',
'OElig': '\u0152', 'OElig': '\u0152',
'oelig': '\u0153', 'oelig': '\u0153',
'Ograve': '\u00D2', 'Ograve': '\u00D2',
'ograve': '\u00F2', 'ograve': '\u00F2',
'oline': '\u203E', 'oline': '\u203E',
'Omega': '\u03A9', 'Omega': '\u03A9',
'omega': '\u03C9', 'omega': '\u03C9',
'Omicron': '\u039F', 'Omicron': '\u039F',
'omicron': '\u03BF', 'omicron': '\u03BF',
'oplus': '\u2295', 'oplus': '\u2295',
'or': '\u2228', 'or': '\u2228',
'ordf': '\u00AA', 'ordf': '\u00AA',
'ordm': '\u00BA', 'ordm': '\u00BA',
'Oslash': '\u00D8', 'Oslash': '\u00D8',
'oslash': '\u00F8', 'oslash': '\u00F8',
'Otilde': '\u00D5', 'Otilde': '\u00D5',
'otilde': '\u00F5', 'otilde': '\u00F5',
'otimes': '\u2297', 'otimes': '\u2297',
'Ouml': '\u00D6', 'Ouml': '\u00D6',
'ouml': '\u00F6', 'ouml': '\u00F6',
'para': '\u00B6', 'para': '\u00B6',
'permil': '\u2030', 'permil': '\u2030',
'perp': '\u22A5', 'perp': '\u22A5',
'Phi': '\u03A6', 'Phi': '\u03A6',
'phi': '\u03C6', 'phi': '\u03C6',
'Pi': '\u03A0', 'Pi': '\u03A0',
'pi': '\u03C0', 'pi': '\u03C0',
'piv': '\u03D6', 'piv': '\u03D6',
'plusmn': '\u00B1', 'plusmn': '\u00B1',
'pound': '\u00A3', 'pound': '\u00A3',
'prime': '\u2032', 'prime': '\u2032',
'Prime': '\u2033', 'Prime': '\u2033',
'prod': '\u220F', 'prod': '\u220F',
'prop': '\u221D', 'prop': '\u221D',
'Psi': '\u03A8', 'Psi': '\u03A8',
'psi': '\u03C8', 'psi': '\u03C8',
'quot': '\u0022', 'quot': '\u0022',
'radic': '\u221A', 'radic': '\u221A',
'rang': '\u27E9', 'rang': '\u27E9',
'raquo': '\u00BB', 'raquo': '\u00BB',
'rarr': '\u2192', 'rarr': '\u2192',
'rArr': '\u21D2', 'rArr': '\u21D2',
'rceil': '\u2309', 'rceil': '\u2309',
'rdquo': '\u201D', 'rdquo': '\u201D',
'real': '\u211C', 'real': '\u211C',
'reg': '\u00AE', 'reg': '\u00AE',
'rfloor': '\u230B', 'rfloor': '\u230B',
'Rho': '\u03A1', 'Rho': '\u03A1',
'rho': '\u03C1', 'rho': '\u03C1',
'rlm': '\u200F', 'rlm': '\u200F',
'rsaquo': '\u203A', 'rsaquo': '\u203A',
'rsquo': '\u2019', 'rsquo': '\u2019',
'sbquo': '\u201A', 'sbquo': '\u201A',
'Scaron': '\u0160', 'Scaron': '\u0160',
'scaron': '\u0161', 'scaron': '\u0161',
'sdot': '\u22C5', 'sdot': '\u22C5',
'sect': '\u00A7', 'sect': '\u00A7',
'shy': '\u00AD', 'shy': '\u00AD',
'Sigma': '\u03A3', 'Sigma': '\u03A3',
'sigma': '\u03C3', 'sigma': '\u03C3',
'sigmaf': '\u03C2', 'sigmaf': '\u03C2',
'sim': '\u223C', 'sim': '\u223C',
'spades': '\u2660', 'spades': '\u2660',
'sub': '\u2282', 'sub': '\u2282',
'sube': '\u2286', 'sube': '\u2286',
'sum': '\u2211', 'sum': '\u2211',
'sup': '\u2283', 'sup': '\u2283',
'sup1': '\u00B9', 'sup1': '\u00B9',
'sup2': '\u00B2', 'sup2': '\u00B2',
'sup3': '\u00B3', 'sup3': '\u00B3',
'supe': '\u2287', 'supe': '\u2287',
'szlig': '\u00DF', 'szlig': '\u00DF',
'Tau': '\u03A4', 'Tau': '\u03A4',
'tau': '\u03C4', 'tau': '\u03C4',
'there4': '\u2234', 'there4': '\u2234',
'Theta': '\u0398', 'Theta': '\u0398',
'theta': '\u03B8', 'theta': '\u03B8',
'thetasym': '\u03D1', 'thetasym': '\u03D1',
'thinsp': '\u2009', 'thinsp': '\u2009',
'THORN': '\u00DE', 'THORN': '\u00DE',
'thorn': '\u00FE', 'thorn': '\u00FE',
'tilde': '\u02DC', 'tilde': '\u02DC',
'times': '\u00D7', 'times': '\u00D7',
'trade': '\u2122', 'trade': '\u2122',
'Uacute': '\u00DA', 'Uacute': '\u00DA',
'uacute': '\u00FA', 'uacute': '\u00FA',
'uarr': '\u2191', 'uarr': '\u2191',
'uArr': '\u21D1', 'uArr': '\u21D1',
'Ucirc': '\u00DB', 'Ucirc': '\u00DB',
'ucirc': '\u00FB', 'ucirc': '\u00FB',
'Ugrave': '\u00D9', 'Ugrave': '\u00D9',
'ugrave': '\u00F9', 'ugrave': '\u00F9',
'uml': '\u00A8', 'uml': '\u00A8',
'upsih': '\u03D2', 'upsih': '\u03D2',
'Upsilon': '\u03A5', 'Upsilon': '\u03A5',
'upsilon': '\u03C5', 'upsilon': '\u03C5',
'Uuml': '\u00DC', 'Uuml': '\u00DC',
'uuml': '\u00FC', 'uuml': '\u00FC',
'weierp': '\u2118', 'weierp': '\u2118',
'Xi': '\u039E', 'Xi': '\u039E',
'xi': '\u03BE', 'xi': '\u03BE',
'Yacute': '\u00DD', 'Yacute': '\u00DD',
'yacute': '\u00FD', 'yacute': '\u00FD',
'yen': '\u00A5', 'yen': '\u00A5',
'yuml': '\u00FF', 'yuml': '\u00FF',
'Yuml': '\u0178', 'Yuml': '\u0178',
'Zeta': '\u0396', 'Zeta': '\u0396',
'zeta': '\u03B6', 'zeta': '\u03B6',
'zwj': '\u200D', 'zwj': '\u200D',
'zwnj': '\u200C', 'zwnj': '\u200C',
}; };

View File

@ -152,6 +152,16 @@ export function main() {
]); ]);
}); });
it('should append the required parent considering top level ng-container', () => {
expect(humanizeDom(
parser.parse('<ng-container><tr></tr></ng-container><p></p>', 'TestComp')))
.toEqual([
[html.Element, 'ng-container', 0],
[html.Element, 'tr', 1],
[html.Element, 'p', 0],
]);
});
it('should special case ng-container when adding a required parent', () => { it('should special case ng-container when adding a required parent', () => {
expect(humanizeDom(parser.parse( expect(humanizeDom(parser.parse(
'<table><thead><ng-container><tr></tr></ng-container></thead></table>', '<table><thead><ng-container><tr></tr></ng-container></thead></table>',

View File

@ -14,7 +14,29 @@ if [[ ${TRAVIS_TEST_RESULT=0} == 1 ]]; then
exit 1; exit 1;
fi fi
if [[ ${CI_MODE:-} == "bazel" ]]; then # No build needed for bazel or aio docs tests
if [[ ${CI_MODE:-} == "bazel" || ${CI_MODE:-} == "docs_test" ]]; then
exit 0;
fi
# Build angular.io, then exit (no Angular build required)
if [[ ${CI_MODE:-} == "aio" ]]; then
travisFoldStart "build.aio"
(
cd "`dirname $0`/../../aio"
yarn build
# If this is a PR for angular/angular@master or angular/angular@<stable-branch>, deploy a
# snapshot for previewing early (if preconditions are met) regardless of the test outcome.
if [[ ${TRAVIS_REPO_SLUG} == "angular/angular" ]] &&
([[ $TRAVIS_BRANCH == "master" ]] || [[ $TRAVIS_BRANCH == $STABLE_BRANCH ]]) &&
[[ $TRAVIS_PULL_REQUEST != "false" ]]; then
travisFoldStart "deploy.aio.pr-preview"
yarn deploy-preview -- --skip-build
travisFoldEnd "deploy.aio.pr-preview"
fi
)
travisFoldEnd "build.aio"
exit 0; exit 0;
fi fi
@ -38,24 +60,3 @@ travisFoldStart "tsc a bunch of useless stuff"
node dist/tools/@angular/tsc-wrapped/src/main -p packages/router/tsconfig-build.json node dist/tools/@angular/tsc-wrapped/src/main -p packages/router/tsconfig-build.json
node dist/tools/@angular/tsc-wrapped/src/main -p packages/forms/tsconfig-build.json node dist/tools/@angular/tsc-wrapped/src/main -p packages/forms/tsconfig-build.json
travisFoldEnd "tsc a bunch of useless stuff" travisFoldEnd "tsc a bunch of useless stuff"
# Build angular.io
if [[ ${CI_MODE:-} == "aio" ]]; then
travisFoldStart "build.aio"
(
cd "`dirname $0`/../../aio"
yarn build
# If this is a PR for angular/angular@master or angular/angular@<stable-branch>, deploy a
# snapshot for previewing early (if preconditions are met) regardless of the test outcome.
if [[ ${TRAVIS_REPO_SLUG} == "angular/angular" ]] &&
([[ $TRAVIS_BRANCH == "master" ]] || [[ $TRAVIS_BRANCH == $STABLE_BRANCH ]]) &&
[[ $TRAVIS_PULL_REQUEST != "false" ]]; then
travisFoldStart "deploy.aio.pr-preview"
yarn deploy-preview -- --skip-build
travisFoldEnd "deploy.aio.pr-preview"
fi
)
travisFoldEnd "build.aio"
fi

View File

@ -28,17 +28,18 @@ mkdir -p ${LOGS_DIR}
# Install node # Install node
#nvm install ${NODE_VERSION} #nvm install ${NODE_VERSION}
if [[ ${CI_MODE} != "aio" && ${CI_MODE} != 'docs_test' ]]; then
# Install version of npm that we are locked against # Install version of npm that we are locked against
travisFoldStart "install-npm" travisFoldStart "install-npm"
npm install -g npm@${NPM_VERSION} npm install -g npm@${NPM_VERSION}
travisFoldEnd "install-npm" travisFoldEnd "install-npm"
# Install all npm dependencies according to shrinkwrap.json # Install all npm dependencies according to shrinkwrap.json
travisFoldStart "npm-install" travisFoldStart "npm-install"
node tools/npm/check-node-modules --purge || npm install node tools/npm/check-node-modules --purge || npm install
travisFoldEnd "npm-install" travisFoldEnd "npm-install"
fi
if [[ ${TRAVIS} && (${CI_MODE} == "e2e" || ${CI_MODE} == "e2e_2" || ${CI_MODE} == "aio" || ${CI_MODE} == "aio_e2e" || ${CI_MODE} == "docs_test") ]]; then if [[ ${TRAVIS} && (${CI_MODE} == "e2e" || ${CI_MODE} == "e2e_2" || ${CI_MODE} == "aio" || ${CI_MODE} == "aio_e2e" || ${CI_MODE} == "docs_test") ]]; then

Some files were not shown because too many files have changed in this diff Show More