| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 08:19:25 -07:00
										 |  |  | import destCopy from '../broccoli-dest-copy'; | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  | import compileWithTypescript, { INTERNAL_TYPINGS_PATH } | 
					
						
							|  |  |  | from '../broccoli-typescript'; | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  | var Funnel = require('broccoli-funnel'); | 
					
						
							| 
									
										
										
										
											2015-05-21 12:07:52 -04:00
										 |  |  | import mergeTrees from '../broccoli-merge-trees'; | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  | var path = require('path'); | 
					
						
							| 
									
										
										
										
											2015-06-09 13:35:58 -04:00
										 |  |  | import renderLodashTemplate from '../broccoli-lodash'; | 
					
						
							| 
									
										
										
										
											2015-06-08 11:05:32 -07:00
										 |  |  | import replace from '../broccoli-replace'; | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  | var stew = require('broccoli-stew'); | 
					
						
							| 
									
										
										
										
											2016-02-10 21:25:12 -08:00
										 |  |  | var writeFile = require('broccoli-file-creator'); | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-26 01:04:28 -07:00
										 |  |  | var projectRootDir = path.normalize(path.join(__dirname, '..', '..', '..', '..')); | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-13 01:58:17 -08:00
										 |  |  | module.exports = function makeNodeTree(projects, destinationPath) { | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  |   // list of npm packages that this build will create
 | 
					
						
							| 
									
										
										
										
											2015-09-09 19:00:22 -07:00
										 |  |  |   var outputPackages = ['angular2', 'benchpress']; | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  |   let srcTree = new Funnel('modules', { | 
					
						
							|  |  |  |     include: ['angular2/**'], | 
					
						
							|  |  |  |     exclude: [ | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       '**/e2e_test/**', | 
					
						
							|  |  |  |       'angular2/test/**', | 
					
						
							|  |  |  |       'angular2/examples/**', | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       'angular2/src/testing/**', | 
					
						
							|  |  |  |       'angular2/testing.ts', | 
					
						
							|  |  |  |       'angular2/testing_internal.ts', | 
					
						
							|  |  |  |       'angular2/src/upgrade/**', | 
					
						
							|  |  |  |       'angular2/upgrade.ts', | 
					
						
							|  |  |  |       'angular2/platform/testing/**', | 
					
						
							|  |  |  |       'angular2/manual_typings/**', | 
					
						
							|  |  |  |       'angular2/typings/**' | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  |     ] | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-06 16:10:45 -07:00
										 |  |  |   let externalTypings = [ | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |     'angular2/typings/hammerjs/hammerjs.d.ts', | 
					
						
							|  |  |  |     'angular2/typings/node/node.d.ts', | 
					
						
							|  |  |  |     'angular2/manual_typings/globals.d.ts', | 
					
						
							|  |  |  |     'angular2/typings/es6-collections/es6-collections.d.ts', | 
					
						
							| 
									
										
										
										
											2016-02-01 10:29:42 -08:00
										 |  |  |     'angular2/typings/es6-promise/es6-promise.d.ts' | 
					
						
							|  |  |  |   ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-06 16:10:45 -07:00
										 |  |  |   let externalTypingsTree = new Funnel('modules', {files: externalTypings}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let packageTypings = | 
					
						
							|  |  |  |       new Funnel('node_modules', {include: ['rxjs/**/*.d.ts', 'zone.js/**/*.d.ts']}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let compileSrcContext = mergeTrees([srcTree, externalTypingsTree, packageTypings]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  |   // Compile the sources and generate the @internal .d.ts
 | 
					
						
							| 
									
										
										
										
											2016-04-06 16:10:45 -07:00
										 |  |  |   let compiledSrcTreeWithInternals = compileTree(compileSrcContext, true, []); | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   var testTree = new Funnel('modules', { | 
					
						
							|  |  |  |     include: [ | 
					
						
							|  |  |  |       'angular2/manual_typings/**', | 
					
						
							|  |  |  |       'angular2/typings/**', | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       'angular2/test/**', | 
					
						
							|  |  |  |       'benchpress/**', | 
					
						
							|  |  |  |       '**/e2e_test/**', | 
					
						
							|  |  |  |       'angular2/examples/**/*_spec.ts', | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       'angular2/src/testing/**', | 
					
						
							|  |  |  |       'angular2/testing.ts', | 
					
						
							|  |  |  |       'angular2/testing_internal.ts', | 
					
						
							|  |  |  |       'angular2/src/upgrade/**', | 
					
						
							|  |  |  |       'angular2/upgrade.ts', | 
					
						
							|  |  |  |       'angular2/platform/testing/**', | 
					
						
							|  |  |  |     ], | 
					
						
							| 
									
										
										
										
											2015-04-13 23:56:07 -07:00
										 |  |  |     exclude: [ | 
					
						
							| 
									
										
										
										
											2015-04-26 18:04:45 -07:00
										 |  |  |       // the following code and tests are not compatible with CJS/node environment
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       'angular2/test/animate/**', | 
					
						
							|  |  |  |       'angular2/test/core/zone/**', | 
					
						
							|  |  |  |       'angular2/test/testing/fake_async_spec.ts', | 
					
						
							|  |  |  |       'angular2/test/testing/testing_public_spec.ts', | 
					
						
							|  |  |  |       'angular2/test/platform/xhr_impl_spec.ts', | 
					
						
							|  |  |  |       'angular2/test/platform/browser/**/*.ts', | 
					
						
							|  |  |  |       'angular2/test/common/forms/**', | 
					
						
							|  |  |  |       'angular2/manual_typings/**', | 
					
						
							|  |  |  |       'angular2/typings/**', | 
					
						
							| 
									
										
										
										
											2015-11-23 10:18:04 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // we call browser's bootstrap
 | 
					
						
							| 
									
										
										
										
											2016-02-09 11:12:41 -08:00
										 |  |  |       'angular2/test/router/route_config/route_config_spec.ts', | 
					
						
							| 
									
										
											  
											
												refactor(router): improve recognition and generation pipeline
This is a big change. @matsko also deserves much of the credit for the implementation.
Previously, `ComponentInstruction`s held all the state for async components.
Now, we introduce several subclasses for `Instruction` to describe each type of navigation.
BREAKING CHANGE:
Redirects now use the Link DSL syntax. Before:
```
@RouteConfig([
	{ path: '/foo', redirectTo: '/bar' },
	{ path: '/bar', component: BarCmp }
])
```
After:
```
@RouteConfig([
	{ path: '/foo', redirectTo: ['Bar'] },
	{ path: '/bar', component: BarCmp, name: 'Bar' }
])
```
BREAKING CHANGE:
This also introduces `useAsDefault` in the RouteConfig, which makes cases like lazy-loading
and encapsulating large routes with sub-routes easier.
Previously, you could use `redirectTo` like this to expand a URL like `/tab` to `/tab/posts`:
@RouteConfig([
	{ path: '/tab', redirectTo: '/tab/users' }
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
Now the recommended way to handle this is case is to use `useAsDefault` like so:
```
@RouteConfig([
	{ path: '/tab', component: TabsCmp, name: 'Tab' }
])
AppCmp { ... }
@RouteConfig([
	{ path: '/posts', component: PostsCmp, useAsDefault: true, name: 'Posts' },
	{ path: '/users', component: UsersCmp, name: 'Users' }
])
TabsCmp { ... }
```
In the above example, you can write just `['/Tab']` and the route `Users` is automatically selected as a child route.
Closes #4728
Closes #4228
Closes #4170
Closes #4490
Closes #4694
Closes #5200
Closes #5475
											
										 
											2015-11-23 18:07:37 -08:00
										 |  |  |       'angular2/test/router/integration/bootstrap_spec.ts', | 
					
						
							| 
									
										
										
										
											2015-11-23 10:18:04 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // we check the public api by importing angular2/angular2
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       'angular2/test/symbol_inspector/**/*.ts', | 
					
						
							|  |  |  |       'angular2/test/public_api_spec.ts', | 
					
						
							| 
									
										
										
										
											2015-11-23 10:18:04 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 16:38:27 -08:00
										 |  |  |       'angular2/test/web_workers/worker/renderer_integration_spec.ts', | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       'angular2/test/upgrade/**/*.ts', | 
					
						
							|  |  |  |       'angular1_router/**', | 
					
						
							|  |  |  |       'payload_tests/**' | 
					
						
							| 
									
										
										
										
											2015-04-13 23:56:07 -07:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  |   // Compile the tests against the src @internal .d.ts
 | 
					
						
							|  |  |  |   let srcPrivateDeclarations = | 
					
						
							|  |  |  |       new Funnel(compiledSrcTreeWithInternals, {srcDir: INTERNAL_TYPINGS_PATH}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-06 16:10:45 -07:00
										 |  |  |   let testAmbients = [ | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  |     'angular2/typings/jasmine/jasmine.d.ts', | 
					
						
							|  |  |  |     'angular2/typings/angular-protractor/angular-protractor.d.ts', | 
					
						
							| 
									
										
										
										
											2016-04-06 16:10:45 -07:00
										 |  |  |     'angular2/typings/selenium-webdriver/selenium-webdriver.d.ts' | 
					
						
							|  |  |  |   ]; | 
					
						
							|  |  |  |   let testAmbientsTree = new Funnel('modules', {files: testAmbients}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   testTree = mergeTrees( | 
					
						
							|  |  |  |       [testTree, srcPrivateDeclarations, testAmbientsTree, externalTypingsTree, packageTypings]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let compiledTestTree = compileTree(testTree, false, []); | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Merge the compiled sources and tests
 | 
					
						
							|  |  |  |   let compiledSrcTree = | 
					
						
							|  |  |  |       new Funnel(compiledSrcTreeWithInternals, {exclude: [`${INTERNAL_TYPINGS_PATH}/**`]}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let compiledTree = mergeTrees([compiledSrcTree, compiledTestTree]); | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-10 13:51:11 -07:00
										 |  |  |   // Down-level .d.ts files to be TS 1.8 compatible
 | 
					
						
							|  |  |  |   // TODO(alexeagle): this can be removed once we drop support for using Angular 2 with TS 1.8
 | 
					
						
							|  |  |  |   compiledTree = replace(compiledTree, { | 
					
						
							|  |  |  |     files: ['**/*.d.ts'], | 
					
						
							|  |  |  |     patterns: [ | 
					
						
							|  |  |  |       {match: /^(\s*(static\s+)?)readonly\s+/mg, replacement: "$1"}, | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  |   // Now we add the LICENSE file into all the folders that will become npm packages
 | 
					
						
							|  |  |  |   outputPackages.forEach(function(destDir) { | 
					
						
							|  |  |  |     var license = new Funnel('.', {files: ['LICENSE'], destDir: destDir}); | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  |     // merge the test tree
 | 
					
						
							|  |  |  |     compiledTree = mergeTrees([compiledTree, license]); | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Get all docs and related assets and prepare them for js build
 | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  |   var srcDocs = extractDocs(srcTree); | 
					
						
							|  |  |  |   var testDocs = extractDocs(testTree); | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   var BASE_PACKAGE_JSON = require(path.join(projectRootDir, 'package.json')); | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  |   var srcPkgJsons = extractPkgJsons(srcTree, BASE_PACKAGE_JSON); | 
					
						
							|  |  |  |   var testPkgJsons = extractPkgJsons(testTree, BASE_PACKAGE_JSON); | 
					
						
							| 
									
										
										
										
											2015-04-13 16:39:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 21:25:12 -08:00
										 |  |  |   // Copy es6 typings so quickstart doesn't require typings install
 | 
					
						
							|  |  |  |   let typingsTree = mergeTrees([ | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |     new Funnel('modules', | 
					
						
							|  |  |  |                { | 
					
						
							|  |  |  |                  include: [ | 
					
						
							|  |  |  |                    'angular2/typings/es6-collections/es6-collections.d.ts', | 
					
						
							|  |  |  |                    'angular2/typings/es6-promise/es6-promise.d.ts', | 
					
						
							|  |  |  |                  ] | 
					
						
							|  |  |  |                }), | 
					
						
							|  |  |  |     writeFile('angular2/typings/browser.d.ts', | 
					
						
							|  |  |  |               '// Typings needed for compilation with --target=es5\n' + | 
					
						
							|  |  |  |                   '///<reference path="./es6-collections/es6-collections.d.ts"/>\n' + | 
					
						
							|  |  |  |                   '///<reference path="./es6-promise/es6-promise.d.ts"/>\n' + | 
					
						
							|  |  |  |                   '// Workaround for https://github.com/ReactiveX/RxJS/issues/1270\n' + | 
					
						
							|  |  |  |                   '// to be removed when angular2 upgrades to rxjs beta.2\n' + | 
					
						
							|  |  |  |                   'declare type PromiseConstructor = typeof Promise;\n') | 
					
						
							| 
									
										
										
										
											2016-02-10 21:25:12 -08:00
										 |  |  |   ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var nodeTree = | 
					
						
							|  |  |  |       mergeTrees([compiledTree, srcDocs, testDocs, srcPkgJsons, testPkgJsons, typingsTree]); | 
					
						
							| 
									
										
										
										
											2015-05-19 17:39:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 12:50:58 -07:00
										 |  |  |   // Transform all tests to make them runnable in node
 | 
					
						
							|  |  |  |   nodeTree = replace(nodeTree, { | 
					
						
							|  |  |  |     files: ['**/test/**/*_spec.js'], | 
					
						
							| 
									
										
										
										
											2015-06-03 13:42:57 -07:00
										 |  |  |     patterns: [ | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2015-08-20 14:28:25 -07:00
										 |  |  |         match: /^/, | 
					
						
							| 
									
										
										
										
											2015-10-26 17:23:01 -07:00
										 |  |  |         replacement: | 
					
						
							| 
									
										
										
										
											2015-11-17 15:24:36 -08:00
										 |  |  |             () => | 
					
						
							|  |  |  |                 `var parse5Adapter = require('angular2/src/platform/server/parse5_adapter');\r\n` + | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |                 `parse5Adapter.Parse5DomAdapter.makeCurrent();` | 
					
						
							| 
									
										
										
										
											2015-08-20 14:28:25 -07:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |       {match: /$/, replacement: (_, relativePath) => "\r\n main(); \r\n"} | 
					
						
							| 
									
										
										
										
											2015-06-03 13:42:57 -07:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2015-05-22 12:50:58 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 18:02:35 -04:00
										 |  |  |   // Prepend 'use strict' directive to all JS files.
 | 
					
						
							|  |  |  |   // See https://github.com/Microsoft/TypeScript/issues/3576
 | 
					
						
							| 
									
										
										
										
											2015-10-26 17:23:01 -07:00
										 |  |  |   nodeTree = replace( | 
					
						
							|  |  |  |       nodeTree, {files: ['**/*.js'], patterns: [{match: /^/, replacement: () => `'use strict';`}]}); | 
					
						
							| 
									
										
										
										
											2015-06-19 18:02:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-19 17:39:57 -07:00
										 |  |  |   return destCopy(nodeTree, destinationPath); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | function compileTree(tree, genInternalTypings, rootFilePaths: string[] = []) { | 
					
						
							|  |  |  |   return compileWithTypescript(tree, { | 
					
						
							|  |  |  |     // build pipeline options
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |     "rootFilePaths": rootFilePaths, | 
					
						
							|  |  |  |     "internalTypings": genInternalTypings, | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  |     // tsc options
 | 
					
						
							| 
									
										
										
										
											2016-04-12 09:40:37 -07:00
										 |  |  |     "emitDecoratorMetadata": true, | 
					
						
							|  |  |  |     "experimentalDecorators": true, | 
					
						
							|  |  |  |     "declaration": true, | 
					
						
							|  |  |  |     "stripInternal": true, | 
					
						
							|  |  |  |     "module": "commonjs", | 
					
						
							|  |  |  |     "moduleResolution": "classic", | 
					
						
							|  |  |  |     "noEmitOnError": true, | 
					
						
							|  |  |  |     "rootDir": ".", | 
					
						
							|  |  |  |     "inlineSourceMap": true, | 
					
						
							|  |  |  |     "inlineSources": true, | 
					
						
							|  |  |  |     "target": "es5" | 
					
						
							| 
									
										
										
										
											2015-12-22 16:24:35 -08:00
										 |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function extractDocs(tree) { | 
					
						
							|  |  |  |   var docs = new Funnel(tree, {include: ['**/*.md', '**/*.png'], exclude: ['**/*.dart.md']}); | 
					
						
							|  |  |  |   return stew.rename(docs, 'README.js.md', 'README.md'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function extractPkgJsons(tree, BASE_PACKAGE_JSON) { | 
					
						
							|  |  |  |   // Generate shared package.json info
 | 
					
						
							|  |  |  |   var COMMON_PACKAGE_JSON = { | 
					
						
							|  |  |  |     version: BASE_PACKAGE_JSON.version, | 
					
						
							|  |  |  |     homepage: BASE_PACKAGE_JSON.homepage, | 
					
						
							|  |  |  |     bugs: BASE_PACKAGE_JSON.bugs, | 
					
						
							|  |  |  |     license: BASE_PACKAGE_JSON.license, | 
					
						
							|  |  |  |     repository: BASE_PACKAGE_JSON.repository, | 
					
						
							|  |  |  |     contributors: BASE_PACKAGE_JSON.contributors, | 
					
						
							|  |  |  |     dependencies: BASE_PACKAGE_JSON.dependencies, | 
					
						
							|  |  |  |     devDependencies: BASE_PACKAGE_JSON.devDependencies, | 
					
						
							|  |  |  |     defaultDevDependencies: {} | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var packageJsons = new Funnel(tree, {include: ['**/package.json']}); | 
					
						
							|  |  |  |   return renderLodashTemplate(packageJsons, {context: {'packageJson': COMMON_PACKAGE_JSON}}); | 
					
						
							|  |  |  | } |