From 4d7c660ec2347a34c87ae6caa829ac5a55dad7b5 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 17:36:53 -0700 Subject: [PATCH 01/17] chore: remove universal-preview module --- modules/universal-preview/README.md | 49 ------------------------- modules/universal-preview/global.js | 1 - modules/universal-preview/mock.js | 1 - modules/universal-preview/package.json | 45 ----------------------- modules/universal-preview/parse5.d.ts | 7 ---- modules/universal-preview/parse5.js | 2 - modules/universal-preview/polyfills.js | 1 - modules/universal-preview/src/index.ts | 2 - modules/universal-preview/tsconfig.json | 49 ------------------------- modules/universal-preview/typings.json | 13 ------- 10 files changed, 170 deletions(-) delete mode 100644 modules/universal-preview/README.md delete mode 100644 modules/universal-preview/global.js delete mode 100644 modules/universal-preview/mock.js delete mode 100644 modules/universal-preview/package.json delete mode 100644 modules/universal-preview/parse5.d.ts delete mode 100644 modules/universal-preview/parse5.js delete mode 100644 modules/universal-preview/polyfills.js delete mode 100644 modules/universal-preview/src/index.ts delete mode 100644 modules/universal-preview/tsconfig.json delete mode 100644 modules/universal-preview/typings.json diff --git a/modules/universal-preview/README.md b/modules/universal-preview/README.md deleted file mode 100644 index 700fbf2c1..000000000 --- a/modules/universal-preview/README.md +++ /dev/null @@ -1,49 +0,0 @@ -![Angular 2 Universal](https://cloud.githubusercontent.com/assets/1016365/10639063/138338bc-7806-11e5-8057-d34c75f3cafc.png) - -# Angular 2 Universal -> Universal (isomorphic) JavaScript support for Angular 2 - -# Table of Contents -* [Modules](#modules) - * [Universal](#universal) - * [preboot.js](#prebootjs) -* [Best Practices](#best-practices) -* [What's in a name?](#whats-in-a-name) -* [License](#license) - -# Modules - -## Universal -> Manage your application lifecycle and serialize changes while on the server to be sent to the browser - -### Documentation -[Design Doc](https://docs.google.com/document/d/1q6g9UlmEZDXgrkY88AJZ6MUrUxcnwhBGS0EXbVlYicY) - -### Videos -Full Stack Angular 2 - AngularConnect, Oct 2015 -[![Full Stack Angular 2](https://img.youtube.com/vi/MtoHFDfi8FM/0.jpg)](https://www.youtube.com/watch?v=MtoHFDfi8FM) - -Angular 2 Server Rendering - Angular U, July 2015 -[![Angular 2 Server Rendering](http://img.youtube.com/vi/0wvZ7gakqV4/0.jpg)](http://www.youtube.com/watch?v=0wvZ7gakqV4) - -## preboot.js -> Control server-rendered page and transfer state before client-side web app loads to the client-side-app. - -# Best Practices -> When building Universal components in Angular 2 there are a few things to keep in mind - -* Know the difference between attributes and properties in relation to the DOM -* Don't manipulate the `nativeElement` directly. Use the `Renderer` -```typescript -constructor(element: ElementRef, renderer: Renderer) { - renderer.setElementStyle(element, 'fontSize', 'x-large'); -} -``` -* Don't use any of the browser types provided in the global namespace such as `navigator` or `document`. Anything outside of Angular will not be detected when serializing your application into html -* Keep your directives stateless as much as possible. For stateful directives you may need to provide an attribute that reflects the corresponding property with an initial string value such as `url` in `img` tag. For our native `` element the `src` attribute is reflected as the `src` property of the element type `HTMLImageElement`. - -# What's in a name? -We believe that using the word "universal" is correct when referring to a JavaScript Application that runs in more environments than the browser. (inspired by [Universal JavaScript](https://medium.com/@mjackson/universal-javascript-4761051b7ae9)) - -# License -[Apache-2.0](/LICENSE) diff --git a/modules/universal-preview/global.js b/modules/universal-preview/global.js deleted file mode 100644 index 2bd13c66b..000000000 --- a/modules/universal-preview/global.js +++ /dev/null @@ -1 +0,0 @@ -require('angular2-universal/global'); diff --git a/modules/universal-preview/mock.js b/modules/universal-preview/mock.js deleted file mode 100644 index 293df6dab..000000000 --- a/modules/universal-preview/mock.js +++ /dev/null @@ -1 +0,0 @@ -require('angular2-universal/mock'); diff --git a/modules/universal-preview/package.json b/modules/universal-preview/package.json deleted file mode 100644 index ccbb21c0b..000000000 --- a/modules/universal-preview/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "angular2-universal-preview", - "version": "0.80.0", - "description": "Universal (isomorphic) javascript support for Angular2", - "homepage": "https://github.com/angular/universal", - "license": "MIT", - "contributors": [ - "Tobias Bosch ", - "PatrickJS ", - "Jeff Whelpley " - ], - "typings": "dist/index.d.ts", - "main": "dist/index.js", - "browser": "dist/index.js", - "files": [ - "dist", - "parse5.d.ts", - "parse5.js", - "polyfills.js", - "global.js", - "mock.js" - ], - "scripts": { - "prebuild": "rm -rf dist", - "build": "tsc || true", - "prepublish": "npm run build" - }, - "devDependencies": { - "angular2-universal": "file:../universal", - "typescript": "^1.8.7" - }, - "dependencies": { - "angular2-universal": "*" - }, - "peerDependencies": { - "angular2-universal": "*" - }, - "repository": { - "type": "git", - "url": "https://github.com/angular/universal" - }, - "bugs": { - "url": "https://github.com/angular/universal/issues" - } -} diff --git a/modules/universal-preview/parse5.d.ts b/modules/universal-preview/parse5.d.ts deleted file mode 100644 index b66ecd2a3..000000000 --- a/modules/universal-preview/parse5.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Temporary typings as DefinitelyTyped does not have typings -// for parse5@1.x. -declare module 'parse5' { - export var Parser; - export var Serializer; - export var TreeAdapters; -} diff --git a/modules/universal-preview/parse5.js b/modules/universal-preview/parse5.js deleted file mode 100644 index 2e3838263..000000000 --- a/modules/universal-preview/parse5.js +++ /dev/null @@ -1,2 +0,0 @@ -// polyfills -require('angular2-universal/parse5'); diff --git a/modules/universal-preview/polyfills.js b/modules/universal-preview/polyfills.js deleted file mode 100644 index 36dce22b6..000000000 --- a/modules/universal-preview/polyfills.js +++ /dev/null @@ -1 +0,0 @@ -require('angular2-universal/polyfills'); diff --git a/modules/universal-preview/src/index.ts b/modules/universal-preview/src/index.ts deleted file mode 100644 index ae66adc27..000000000 --- a/modules/universal-preview/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -console.warn('DEPRECATION WARNING: `angular2-universal-preview` is no longer supported and will be removed in next release. use `angular2-universal`'); -export * from 'angular2-universal'; diff --git a/modules/universal-preview/tsconfig.json b/modules/universal-preview/tsconfig.json deleted file mode 100644 index e773a656d..000000000 --- a/modules/universal-preview/tsconfig.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "module": "commonjs", - "declaration": true, - "noImplicitAny": false, - "removeComments": false, - "noLib": false, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "sourceMap": true, - "listFiles": false, - "outDir": "dist", - "rootDir": "src" - }, - "exclude": [ - "typings/main", - "typings/main.d.ts", - "node_modules/angular2-express-engine", - "node_modules/angular2-hapi-engine", - "node_modules/angular2/ts", - "node_modules/angular2/src/testing", - "node_modules/angular2/src/test", - "node_modules/typescript", - "node_modules/reflect-metadata", - "preboot", - "node_modules/preboot/dist/src/node/browser_code_generator.d.ts", - "node_modules/preboot/dist/src/node", - "node_modules/preboot/test", - "node_modules/preboot/src", - "node_modules/angular2-universal", - "src/browser/test", - "src/node/test" - ], - "formatCodeOptions": { - "indentSize": 2, - "tabSize": 2, - "newLineCharacter": "\r\n", - "convertTabsToSpaces": true, - "insertSpaceAfterCommaDelimiter": true, - "insertSpaceAfterSemicolonInForStatements": true, - "insertSpaceBeforeAndAfterBinaryOperators": true, - "insertSpaceAfterKeywordsInControlFlowStatements": true, - "insertSpaceAfterFunctionKeywordForAnonymousFunctions": true, - "insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": false, - "placeOpenBraceOnNewLineForFunctions": false, - "placeOpenBraceOnNewLineForControlBlocks": false - } -} diff --git a/modules/universal-preview/typings.json b/modules/universal-preview/typings.json deleted file mode 100644 index 57eb2ae14..000000000 --- a/modules/universal-preview/typings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "angular2-universal-preview", - "dependencies": { - "xhr2": "github:gdi2290/typed-xhr2#86ebfa644796b3a6553d22e62bb5e77fcae1eb8d" - }, - "devDependencies": {}, - "ambientDependencies": { - "browserify": "github:DefinitelyTyped/DefinitelyTyped/browserify/browserify.d.ts#abc2bcfb8524b1e027e6298d3348012b5b06eda5", - "es6-collections": "github:DefinitelyTyped/DefinitelyTyped/es6-collections/es6-collections.d.ts#4de74cb527395c13ba20b438c3a7a419ad931f1c", - "es6-promise": "github:DefinitelyTyped/DefinitelyTyped/es6-promise/es6-promise.d.ts#e1699c41087960df7678f413312213fb1f980307", - "node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts#48c1e3c1d6baefa4f1a126f188c27c4fefd36bff" - } -} From d508fce76d5af830a8520f4492a868efa2d9f724 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 17:37:11 -0700 Subject: [PATCH 02/17] chore: remove deps from package.json --- package.json | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index c824874a2..1986dbac4 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "Jeff Whelpley " ], "scripts": { + "clean:all": "rm -rf ./modules/*/dist ./modules/*/node_modules ./modules/*/typings */dist */node_modules */typings ./dist ./node_modules ./typings", "prestart": "gulp build", "build": "gulp build", "serve": "gulp serve", @@ -33,7 +34,7 @@ "restart": "npm run update && gulp build && gulp server", "typings": "typings install", "doc": "gulp doc", - "postinstall": "npm run typings && npm run build && npm run webdriver-update" + "preinstall": "npm run typings" }, "repository": { "type": "git", @@ -87,41 +88,28 @@ "selenium-webdriver": "^2.46.1", "serve-index": "^1.7.0", "serve-static": "^1.10.0", + "ts-node": "^0.6.1", "tslint": "^3.2.1", "typescript": "^1.8.7", "typings": "^0.7.8", "yargs": "^3.14.0" }, "dependencies": { - "angular2": "2.0.0-beta.9", - "angular2-express-engine": "file:modules/express-engine", - "angular2-hapi-engine": "file:modules/hapi-engine", - "angular2-universal-preview": "file:modules/universal", - "preboot": "file:modules/preboot", - "browserify": "^11.0.0", - "css": "^2.2.1", - "es6-shim": "^0.33.8", "event-stream": "^3.3.1", "gulp": "^3.9.0", "gulp-insert": "^0.5.0", "gulp-rename": "^1.2.2", "gulp-uglify": "^1.2.0", "gutil": "^1.6.4", - "hapi": "13.0.0", "lodash": "^3.10.1", "nocycle": "^1.1.1", "parse5": "^1.5.0", "q": "^1.4.1", - "reflect-metadata": "0.1.2", "require-dir": "^0.3.0", "run-sequence": "^1.1.2", - "rxjs": "5.0.0-beta.2", - "systemjs": "^0.19.18", "through2": "^2.0.0", "vinyl-buffer": "^1.0.0", "vinyl-source-stream": "^1.1.0", - "vision": "4.0.1", - "xhr2": "^0.1.3", - "zone.js": "0.5.15" + "vision": "4.0.1" } } From 13852bc74c9aa9eb59bd3eb0611688f95a81f5ad Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 17:37:52 -0700 Subject: [PATCH 03/17] chore(typings): remove top level typings --- typings.json | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/typings.json b/typings.json index 145c4cb29..654502ad0 100644 --- a/typings.json +++ b/typings.json @@ -2,15 +2,13 @@ "name": "angular2-universal", "version": false, "ambientDependencies": { - "Q": "github:DefinitelyTyped/DefinitelyTyped/q/Q.d.ts#c7b1128cc9a8f5797bade826e7632b36b06a856c", - "lodash": "github:DefinitelyTyped/DefinitelyTyped/lodash/lodash.d.ts#ab3cc82066805007cbf0db233ddb5879f42be4d2", - "gulp-rename": "github:DefinitelyTyped/DefinitelyTyped/gulp-rename/gulp-rename.d.ts#2bbc03a4e408085a50e6315e40c8d42329e4e98e", + "browserify": "registry:dt/browserify#12.0.1+20160224211008", + "es6-shim": "registry:dt/es6-shim#0.31.2+20160215162030", + "jasmine": "registry:dt/jasmine#2.2.0+20160308082659", "node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts#2bbc03a4e408085a50e6315e40c8d42329e4e98e", - "vinyl-source-stream": "github:DefinitelyTyped/DefinitelyTyped/vinyl-source-stream/vinyl-source-stream.d.ts#2bbc03a4e408085a50e6315e40c8d42329e4e98e", - "browserify": "github:DefinitelyTyped/DefinitelyTyped/browserify/browserify.d.ts#2bbc03a4e408085a50e6315e40c8d42329e4e98e", - "jasmine": "github:DefinitelyTyped/DefinitelyTyped/jasmine/jasmine.d.ts#5d0f2126c8dac8fce0ff020218aea06607213b0d", - "through2": "github:DefinitelyTyped/DefinitelyTyped/through2/through2.d.ts#27d7b56688bfeba9c6fc1ce0ecb611d929982d44", - "es6-promise": "github:DefinitelyTyped/DefinitelyTyped/es6-promise/es6-promise.d.ts#9f0f926a12026287b5a4a229e5672c01e7549313", - "es6-collections": "github:DefinitelyTyped/DefinitelyTyped/es6-collections/es6-collections.d.ts#9f0f926a12026287b5a4a229e5672c01e7549313" + "through2": "registry:dt/through2#2.0.0+20160127111735" + }, + "dependencies": { + "es6-promise": "registry:npm/es6-promise#3.0.0+20160211003958" } } From 18a022c8e3a746dd00a27d038734c8ad080760ec Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 17:38:00 -0700 Subject: [PATCH 04/17] chore(tsconfig): remove top level tsconfig --- tsconfig.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tsconfig.json b/tsconfig.json index c5942966e..dea91019c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,6 +19,8 @@ "node_modules/angular2/bundles/typings", "modules/express-engine/dist", "modules/express-engine/node_modules", + "modules/hapi-engine/dist", + "modules/hapi-engine/node_modules", "modules/gulp-prerender/node_modules", "modules/gulp-prerender/dist", "modules/grunt-prerender/node_modules", From e0d5c2cd10f1bc4899c68b14fe41560bfe3f8716 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 17:39:14 -0700 Subject: [PATCH 05/17] chore(universal): update tsconfig.json --- modules/universal/tsconfig.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/modules/universal/tsconfig.json b/modules/universal/tsconfig.json index 5440a5165..57d79a939 100644 --- a/modules/universal/tsconfig.json +++ b/modules/universal/tsconfig.json @@ -16,13 +16,7 @@ "exclude": [ "typings/main", "typings/main.d.ts", - "node_modules/angular2-express-engine", - "node_modules/angular2-hapi-engine", - "node_modules/angular2/ts", - "node_modules/angular2/src/testing", - "node_modules/angular2/src/test", - "node_modules/typescript", - "node_modules/reflect-metadata", + "node_modules", "preboot", "node_modules/preboot/test", "node_modules/preboot/src", From 55cc69ae3fc6c0f4a7a3d4d47e800c2039255f13 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 17:39:19 -0700 Subject: [PATCH 06/17] chore(universal): update typings.json --- modules/universal/typings.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/universal/typings.json b/modules/universal/typings.json index 57eb2ae14..067fcb262 100644 --- a/modules/universal/typings.json +++ b/modules/universal/typings.json @@ -6,8 +6,7 @@ "devDependencies": {}, "ambientDependencies": { "browserify": "github:DefinitelyTyped/DefinitelyTyped/browserify/browserify.d.ts#abc2bcfb8524b1e027e6298d3348012b5b06eda5", - "es6-collections": "github:DefinitelyTyped/DefinitelyTyped/es6-collections/es6-collections.d.ts#4de74cb527395c13ba20b438c3a7a419ad931f1c", - "es6-promise": "github:DefinitelyTyped/DefinitelyTyped/es6-promise/es6-promise.d.ts#e1699c41087960df7678f413312213fb1f980307", + "es6-shim": "registry:dt/es6-shim#0.31.2+20160215162030", "node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts#48c1e3c1d6baefa4f1a126f188c27c4fefd36bff" } } From 97dcb91862a9d7409af34449b67c32eae3b82733 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 17:40:12 -0700 Subject: [PATCH 07/17] refactor(polyfills): update types --- modules/polyfills/dev.d.ts | 2 +- modules/polyfills/ie.d.ts | 2 +- modules/polyfills/polyfills.d.ts | 2 +- modules/polyfills/prod.d.ts | 2 +- modules/polyfills/test.d.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/polyfills/dev.d.ts b/modules/polyfills/dev.d.ts index 47a030580..0df84ec3d 100644 --- a/modules/polyfills/dev.d.ts +++ b/modules/polyfills/dev.d.ts @@ -1 +1 @@ -export * from './dist/ie'; +import './dist/dev'; diff --git a/modules/polyfills/ie.d.ts b/modules/polyfills/ie.d.ts index 47a030580..b715513e3 100644 --- a/modules/polyfills/ie.d.ts +++ b/modules/polyfills/ie.d.ts @@ -1 +1 @@ -export * from './dist/ie'; +import './dist/ie'; diff --git a/modules/polyfills/polyfills.d.ts b/modules/polyfills/polyfills.d.ts index 7091106bc..41721f29b 100644 --- a/modules/polyfills/polyfills.d.ts +++ b/modules/polyfills/polyfills.d.ts @@ -1 +1 @@ -export * from './dist/polyfills'; +import './dist/polyfills'; diff --git a/modules/polyfills/prod.d.ts b/modules/polyfills/prod.d.ts index 89ac4ca7b..aceb3a857 100644 --- a/modules/polyfills/prod.d.ts +++ b/modules/polyfills/prod.d.ts @@ -1 +1 @@ -export * from './dist/prod'; +import './dist/prod'; diff --git a/modules/polyfills/test.d.ts b/modules/polyfills/test.d.ts index 990366a86..6b2adc5fd 100644 --- a/modules/polyfills/test.d.ts +++ b/modules/polyfills/test.d.ts @@ -1 +1 @@ -export * from './dist/test'; +import './dist/test'; From 1d088576578bbc9d344dd8298b18a983b36796d9 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 18:04:57 -0700 Subject: [PATCH 08/17] chore(gitignore): exmples/dist --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 063d7633c..642460b51 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,5 @@ test/coverage /modules/angular2-grunt-prerender/tasks /modules/grunt-prerender/tasks + +/examples/dist From 910bf5200d0958a52779a3003e1f4eb5aa762536 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 18:07:47 -0700 Subject: [PATCH 09/17] chore: isolate examples --- examples/package.json | 51 +++++++++++ examples/src/index.ts | 82 ++++++++++++++++++ examples/{app => src}/public/css/base.css | 0 examples/{app => src}/public/css/bg.png | Bin examples/{app => src}/public/css/main.css | 0 examples/{app => src}/server/express/api.ts | 0 .../{app => src}/server/express/graph_api.ts | 0 .../{app => src}/server/express/routes.ts | 47 +++++----- .../{app => src}/server/express/server.ts | 6 +- examples/{app => src}/server/hapi/api.ts | 0 .../{app => src}/server/hapi/graph_api.ts | 0 examples/{app => src}/server/hapi/routes.ts | 0 examples/{app => src}/server/hapi/server.ts | 0 .../{app => src}/universal/falcor_todo/app.ts | 0 .../universal/falcor_todo/client.ts | 0 .../universal/falcor_todo/css/base.css | 0 .../universal/falcor_todo/css/bg.png | Bin .../universal/falcor_todo/css/main.css | 0 .../universal/falcor_todo/index.ng2.html | 0 .../falcor_todo/services/TodoStore.ts | 0 .../universal/falcor_todo/todo.html | 0 .../{app => src}/universal/test_page/app.ts | 53 +++++------ .../universal/test_page/browser.ts | 9 +- .../universal/test_page/index.ng2.html | 0 .../{app => src}/universal/test_router/app.ts | 0 .../universal/test_router/browser.ts | 0 .../universal/test_router/index.ng2.html | 0 examples/{app => src}/universal/todo/app.ts | 0 .../{app => src}/universal/todo/browser.ts | 0 .../{app => src}/universal/todo/css/base.css | 0 .../{app => src}/universal/todo/css/bg.png | Bin .../{app => src}/universal/todo/css/main.css | 0 .../universal/todo/index.ng2.html | 0 .../universal/todo/services/TodoStore.ts | 0 .../{app => src}/universal/todo/todo.html | 0 examples/tsconfig.json | 21 +++++ examples/typings.json | 12 +++ gulpfile.js | 1 - index.js | 81 +---------------- 39 files changed, 230 insertions(+), 133 deletions(-) create mode 100644 examples/package.json create mode 100644 examples/src/index.ts rename examples/{app => src}/public/css/base.css (100%) rename examples/{app => src}/public/css/bg.png (100%) rename examples/{app => src}/public/css/main.css (100%) rename examples/{app => src}/server/express/api.ts (100%) rename examples/{app => src}/server/express/graph_api.ts (100%) rename examples/{app => src}/server/express/routes.ts (73%) rename examples/{app => src}/server/express/server.ts (84%) rename examples/{app => src}/server/hapi/api.ts (100%) rename examples/{app => src}/server/hapi/graph_api.ts (100%) rename examples/{app => src}/server/hapi/routes.ts (100%) rename examples/{app => src}/server/hapi/server.ts (100%) rename examples/{app => src}/universal/falcor_todo/app.ts (100%) rename examples/{app => src}/universal/falcor_todo/client.ts (100%) rename examples/{app => src}/universal/falcor_todo/css/base.css (100%) rename examples/{app => src}/universal/falcor_todo/css/bg.png (100%) rename examples/{app => src}/universal/falcor_todo/css/main.css (100%) rename examples/{app => src}/universal/falcor_todo/index.ng2.html (100%) rename examples/{app => src}/universal/falcor_todo/services/TodoStore.ts (100%) rename examples/{app => src}/universal/falcor_todo/todo.html (100%) rename examples/{app => src}/universal/test_page/app.ts (82%) rename examples/{app => src}/universal/test_page/browser.ts (87%) rename examples/{app => src}/universal/test_page/index.ng2.html (100%) rename examples/{app => src}/universal/test_router/app.ts (100%) rename examples/{app => src}/universal/test_router/browser.ts (100%) rename examples/{app => src}/universal/test_router/index.ng2.html (100%) rename examples/{app => src}/universal/todo/app.ts (100%) rename examples/{app => src}/universal/todo/browser.ts (100%) rename examples/{app => src}/universal/todo/css/base.css (100%) rename examples/{app => src}/universal/todo/css/bg.png (100%) rename examples/{app => src}/universal/todo/css/main.css (100%) rename examples/{app => src}/universal/todo/index.ng2.html (100%) rename examples/{app => src}/universal/todo/services/TodoStore.ts (100%) rename examples/{app => src}/universal/todo/todo.html (100%) create mode 100644 examples/tsconfig.json create mode 100644 examples/typings.json diff --git a/examples/package.json b/examples/package.json new file mode 100644 index 000000000..5d4b275ae --- /dev/null +++ b/examples/package.json @@ -0,0 +1,51 @@ +{ + "name": "examples", + "version": "0.0.0", + "description": "Universal (isomorphic) javascript support for Angular2", + "main": "index.js", + "scripts": { + "prebuild": "rm -rf dist", + "remove-modules": "rm -rf dist node_modules/angular2-universal node_modules/preboot node_modules/angular2-universal-preview node_modules/angular2-express-engine", + "reload": "npm run remove-modules && npm install", + "build": "tsc || true", + "start": "npm run build && node dist/index.js", + "debug": "npm run build && node-debug dist/index.js", + "test": "echo \"Error: no test specified\" && exit 1", + "preinstall": "typings install" + }, + "author": "PatrickJS", + "license": "MIT", + "devDependencies": { + "connect-history-api-fallback": "^1.1.0", + "express": "^4.13.4", + "falcor": "^0.1.16", + "falcor-express": "^0.1.2", + "falcor-router": "^0.3.0", + "gulp-insert": "^0.5.0", + "gulp-rename": "^1.2.2", + "gulp-uglify": "^1.5.3", + "morgan": "^1.7.0", + "ts-node": "^0.6.1", + "vinyl-buffer": "^1.0.0", + "vinyl-source-stream": "^1.1.0", + "preboot": "file:../modules/preboot", + "angular2-express-engine": "file:../modules/express-engine", + "angular2-universal-preview": "file:../modules/universal" + }, + "dependencies": { + "angular2": "2.0.0-beta.9", + "css": "2.2.1", + "es6-shim": "^0.33.3", + "express": "^4.13.3", + "parse5": "^1.5.0", + "reflect-metadata": "0.1.2", + "rxjs": "5.0.0-beta.2", + "xhr2": "^0.1.3", + "zone.js": "0.5.15", + "systemjs": "^0.19.18" + }, + "repository": { + "type": "git", + "url": "https://github.com/angular/universal" + } +} diff --git a/examples/src/index.ts b/examples/src/index.ts new file mode 100644 index 000000000..7695fff78 --- /dev/null +++ b/examples/src/index.ts @@ -0,0 +1,82 @@ +var SERVER_IP = '127.0.0.1'; + +import 'angular2-universal-preview/polyfills'; + +var port = process.env.PORT || 3000; + +// Module dependencies +import http = require('http'); +import path = require('path'); + + +// Start server +var framework = process.argv[2] || 'express'; +var server = null; +var example = ''; +var ROOT = path.join(__dirname, '..'); + +if (framework === 'hapi') { + // hapi + + example = `./server/hapi/server`; + server = require(example)(ROOT, { + port, + address: SERVER_IP + }); + module.exports.Server = server + .start(() => { + console.log(`Listening on port: ${port}`); + // for smoke testing + // smokeTest(); + }); + +} else { + // express or other express compliant frameworks + + example = `./server/${framework}/server`; + try { + server = require(example)(ROOT); + } catch (e) { + console.trace(e); + process.exit(1); + } + + module.exports.Server = http + .createServer(server) + .listen(port, SERVER_IP, function() { + console.log(`Listening on port: ${port}`); + // for smoke testing + // smokeTest(); + }); + +} +console.log(`Using framework: "${framework}"`); + + +function smokeTest() { + var req = http.get({ + host: 'localhost', + port: 3000, + path: '/?server=true&client=false&preboot=false&bootstrap=false', + }, function(res) { + // console.log('STATUS: ' + res.statusCode); + // console.log('HEADERS: ' + JSON.stringify(res.headers, null, 2)); + + // Buffer the body entirely for processing as a whole. + var bodyChunks = []; + res. + on('data', function(chunk) { + // You can process streamed parts here... + bodyChunks.push(chunk); + }). + on('end', function() { + var body = Buffer.concat(bodyChunks); + // console.log('GOOD' /*, body.toString()*/ ); + // ...and/or process the entire body here. + }) + }); + + req.on('error', function(e) { + console.error('ERROR: ' + e.message); + }); +} diff --git a/examples/app/public/css/base.css b/examples/src/public/css/base.css similarity index 100% rename from examples/app/public/css/base.css rename to examples/src/public/css/base.css diff --git a/examples/app/public/css/bg.png b/examples/src/public/css/bg.png similarity index 100% rename from examples/app/public/css/bg.png rename to examples/src/public/css/bg.png diff --git a/examples/app/public/css/main.css b/examples/src/public/css/main.css similarity index 100% rename from examples/app/public/css/main.css rename to examples/src/public/css/main.css diff --git a/examples/app/server/express/api.ts b/examples/src/server/express/api.ts similarity index 100% rename from examples/app/server/express/api.ts rename to examples/src/server/express/api.ts diff --git a/examples/app/server/express/graph_api.ts b/examples/src/server/express/graph_api.ts similarity index 100% rename from examples/app/server/express/graph_api.ts rename to examples/src/server/express/graph_api.ts diff --git a/examples/app/server/express/routes.ts b/examples/src/server/express/routes.ts similarity index 73% rename from examples/app/server/express/routes.ts rename to examples/src/server/express/routes.ts index cdff864a8..75a92b454 100644 --- a/examples/app/server/express/routes.ts +++ b/examples/src/server/express/routes.ts @@ -6,11 +6,9 @@ var {Router} = require('express'); module.exports = function(ROOT) { var router = Router(); - var universalPath = `${ROOT}/dist/examples/app/universal`; - - var appPage = require(`${universalPath}/test_page/app`); - var todoApp = require(`${universalPath}/todo/app`); - var routerApp = require(`${universalPath}/test_router/app`); + var appPage = require('../../universal/test_page/app'); + var todoApp = require('../../universal/todo/app'); + var routerApp = require('../../universal/test_router/app'); var {enableProdMode, provide} = require('angular2/core'); var {ROUTER_PROVIDERS, APP_BASE_HREF} = require('angular2/router'); @@ -20,8 +18,10 @@ module.exports = function(ROOT) { var { NODE_HTTP_PROVIDERS, NODE_LOCATION_PROVIDERS, + NODE_PRELOAD_CACHE_HTTP_PROVIDERS, REQUEST_URL, PRIME_CACHE, + BASE_URL, queryParamsToBoolean } = require('angular2-universal-preview'); // require('angular2-universal') @@ -33,17 +33,24 @@ module.exports = function(ROOT) { let options = Object.assign(queryParams, { // client url for systemjs buildClientScripts: true, - componentUrl: 'examples/app/universal/test_page/browser', + componentUrl: 'examples/src/universal/test_page/browser', directives: [appPage.App, appPage.MyApp], providers: [ + NODE_LOCATION_PROVIDERS, + provide(REQUEST_URL, {useValue: req.originalUrl}), + provide(APP_BASE_HREF, {useValue: '/'}), + + provide(BASE_URL, {useExisting: req.originalUrl}), + provide(PRIME_CACHE, {useExisting: true}), + // NODE_HTTP_PROVIDERS, - // NODE_LOCATION_PROVIDERS, - // provide(BASE_URL, {useExisting: req.originalUrl}), - // provide(PRIME_CACHE, {useExisting: true}) + NODE_PRELOAD_CACHE_HTTP_PROVIDERS, ], data: {}, + precache: true, + preboot: queryParams.preboot === false ? null : { start: true, freeze: 'spinner', // show spinner w button click & freeze page @@ -56,7 +63,7 @@ module.exports = function(ROOT) { }); - res.render('app/universal/test_page/index', options); + res.render('src/universal/test_page/index', options); }); @@ -67,7 +74,7 @@ module.exports = function(ROOT) { let options = Object.assign(queryParams , { // client url for systemjs buildClientScripts: true, - componentUrl: 'examples/app/universal/todo/browser', + componentUrl: 'examples/src/universal/todo/browser', directives: [todoApp.TodoApp], providers: [ @@ -78,11 +85,11 @@ module.exports = function(ROOT) { ], data: {}, - preboot: queryParams.preboot === false ? null : true + preboot: queryParams.preboot === false ? null : {debug: true, uglify: false} }); - res.render('app/universal/todo/index', options); + res.render('src/universal/todo/index', options); }); @@ -93,7 +100,7 @@ module.exports = function(ROOT) { let options = Object.assign(queryParams , { // client url for systemjs buildClientScripts: true, - componentUrl: 'examples/app/universal/falcor_todo/client', + componentUrl: 'examples/src/universal/falcor_todo/client', directives: [todoApp.TodoApp], providers: [ @@ -104,11 +111,11 @@ module.exports = function(ROOT) { ], data: {}, - preboot: queryParams.preboot === false ? null : true + preboot: queryParams.preboot === false ? null : {debug: true, uglify: false} }); - res.render('app/universal/falcor_todo/index', options); + res.render('src/universal/falcor_todo/index', options); }); @@ -120,7 +127,7 @@ module.exports = function(ROOT) { let options = Object.assign(queryParams , { // client url for systemjs buildClientScripts: true, - componentUrl: 'examples/app/universal/test_router/browser', + componentUrl: 'examples/src/universal/test_router/browser', // ensure that we test only server routes client: false, @@ -134,11 +141,11 @@ module.exports = function(ROOT) { ], data: {}, - preboot: queryParams.preboot === false ? null : true + preboot: queryParams.preboot === false ? null : {debug: true, uglify: false} }); - res.render('app/universal/test_router/index', options); + res.render('src/universal/test_router/index', options); } @@ -154,7 +161,7 @@ module.exports = function(ROOT) { router.use('/angular2', serveStatic(`${ROOT}/node_modules/angular2`)); router.use('/rxjs', serveStatic(`${ROOT}/node_modules/rxjs`)); router.use('/node_modules', serveStatic(`${ROOT}/node_modules`)); - router.use('/examples/app', serveStatic(`${ROOT}/dist/examples/app`)); + router.use('/examples/src', serveStatic(`${ROOT}/dist`)); router.use(historyApiFallback({ // verbose: true diff --git a/examples/app/server/express/server.ts b/examples/src/server/express/server.ts similarity index 84% rename from examples/app/server/express/server.ts rename to examples/src/server/express/server.ts index 97b55014f..5af6c854e 100644 --- a/examples/app/server/express/server.ts +++ b/examples/src/server/express/server.ts @@ -8,7 +8,7 @@ module.exports = function(ROOT) { var {expressEngine} = require('angular2-universal-preview'); // rendering engine app.engine('ng2.html', expressEngine); - app.set('views', path.join(ROOT, 'examples')); + app.set('views', path.join(ROOT)); app.set('view engine', 'ng2.html'); app.set('view options', { doctype: 'html' }); @@ -16,8 +16,8 @@ module.exports = function(ROOT) { var api = require('./api'); var graphApi = require('./graph_api'); - app.use(serveStatic(`${ROOT}/dist`)); - app.use(serveStatic(`${ROOT}/examples/app/public`)); + app.use(serveStatic(path.join(ROOT, 'dist'))); + app.use(serveStatic(path.join(ROOT, 'public'))); app.use('/api', api(ROOT)); app.use('/graph_api', api(ROOT)); diff --git a/examples/app/server/hapi/api.ts b/examples/src/server/hapi/api.ts similarity index 100% rename from examples/app/server/hapi/api.ts rename to examples/src/server/hapi/api.ts diff --git a/examples/app/server/hapi/graph_api.ts b/examples/src/server/hapi/graph_api.ts similarity index 100% rename from examples/app/server/hapi/graph_api.ts rename to examples/src/server/hapi/graph_api.ts diff --git a/examples/app/server/hapi/routes.ts b/examples/src/server/hapi/routes.ts similarity index 100% rename from examples/app/server/hapi/routes.ts rename to examples/src/server/hapi/routes.ts diff --git a/examples/app/server/hapi/server.ts b/examples/src/server/hapi/server.ts similarity index 100% rename from examples/app/server/hapi/server.ts rename to examples/src/server/hapi/server.ts diff --git a/examples/app/universal/falcor_todo/app.ts b/examples/src/universal/falcor_todo/app.ts similarity index 100% rename from examples/app/universal/falcor_todo/app.ts rename to examples/src/universal/falcor_todo/app.ts diff --git a/examples/app/universal/falcor_todo/client.ts b/examples/src/universal/falcor_todo/client.ts similarity index 100% rename from examples/app/universal/falcor_todo/client.ts rename to examples/src/universal/falcor_todo/client.ts diff --git a/examples/app/universal/falcor_todo/css/base.css b/examples/src/universal/falcor_todo/css/base.css similarity index 100% rename from examples/app/universal/falcor_todo/css/base.css rename to examples/src/universal/falcor_todo/css/base.css diff --git a/examples/app/universal/falcor_todo/css/bg.png b/examples/src/universal/falcor_todo/css/bg.png similarity index 100% rename from examples/app/universal/falcor_todo/css/bg.png rename to examples/src/universal/falcor_todo/css/bg.png diff --git a/examples/app/universal/falcor_todo/css/main.css b/examples/src/universal/falcor_todo/css/main.css similarity index 100% rename from examples/app/universal/falcor_todo/css/main.css rename to examples/src/universal/falcor_todo/css/main.css diff --git a/examples/app/universal/falcor_todo/index.ng2.html b/examples/src/universal/falcor_todo/index.ng2.html similarity index 100% rename from examples/app/universal/falcor_todo/index.ng2.html rename to examples/src/universal/falcor_todo/index.ng2.html diff --git a/examples/app/universal/falcor_todo/services/TodoStore.ts b/examples/src/universal/falcor_todo/services/TodoStore.ts similarity index 100% rename from examples/app/universal/falcor_todo/services/TodoStore.ts rename to examples/src/universal/falcor_todo/services/TodoStore.ts diff --git a/examples/app/universal/falcor_todo/todo.html b/examples/src/universal/falcor_todo/todo.html similarity index 100% rename from examples/app/universal/falcor_todo/todo.html rename to examples/src/universal/falcor_todo/todo.html diff --git a/examples/app/universal/test_page/app.ts b/examples/src/universal/test_page/app.ts similarity index 82% rename from examples/app/universal/test_page/app.ts rename to examples/src/universal/test_page/app.ts index bf9f459fe..26001bb93 100644 --- a/examples/app/universal/test_page/app.ts +++ b/examples/src/universal/test_page/app.ts @@ -1,4 +1,7 @@ import {Component} from 'angular2/core'; +import {Http} from 'angular2/http'; + +const URL = 'http://127.0.0.1:3000'; function transformData(data) { @@ -95,7 +98,7 @@ export class MyApp { }) export class App { static queries = { - todos: '/api/todos' + todos: URL + '/api/todos' }; value: string = 'value8'; @@ -109,22 +112,22 @@ export class App { // .filter(res => res.status >= 200 && res.status < 300) // .map(res => res.json()) // .map(data => transformData(data)); // ensure correct data prop types - // todosObs2$ = this.http.get(App.queries.todos) - // .filter(res => res.status >= 200 && res.status < 300) - // .map(res => res.json()) - // .map(data => transformData(data)); // ensure correct data prop types + todosObs2$ = this.http.get(App.queries.todos) + .filter(res => res.status >= 200 && res.status < 300) + .map(res => res.json()) + .map(data => transformData(data)); // ensure correct data prop types // todosObs3$ = this.http.get(App.queries.todos) // .map(res => res.json()) // .map(data => transformData(data)); - constructor(/*private http: Http*/) { + constructor(private http: Http) { } ngOnInit() { - this.addItem(); - this.addItem(); - this.addItem(); + // this.addItem(); + // this.addItem(); + // this.addItem(); // this.todosObs1$.subscribe( // // onValue @@ -142,22 +145,22 @@ export class App { // console.log('complete request1'); // }); - // this.todosObs2$.subscribe( - // // onValue - // todos => { - // console.log('another call 2', todos); - // todos.map(todo => this.addItem(todo)); - // // this.anotherAjaxCall(); - // }, - // // onError - // err => { - // console.error('err', err); - // throw err; - // }, - // // onComplete - // () => { - // console.log('complete request2'); - // }); + this.todosObs2$.subscribe( + // onValue + todos => { + console.log('another call 2', todos); + todos.map(todo => this.addItem(todo)); + this.anotherAjaxCall(); + }, + // onError + err => { + console.error('err', err); + throw err; + }, + // onComplete + () => { + console.log('complete request2'); + }); } anotherAjaxCall() { diff --git a/examples/app/universal/test_page/browser.ts b/examples/src/universal/test_page/browser.ts similarity index 87% rename from examples/app/universal/test_page/browser.ts rename to examples/src/universal/test_page/browser.ts index 934332fc7..743ca4607 100644 --- a/examples/app/universal/test_page/browser.ts +++ b/examples/src/universal/test_page/browser.ts @@ -3,10 +3,7 @@ import * as angular from 'angular2/core'; console.timeEnd('angular2/core in client'); import {BROWSER_PROVIDERS, BROWSER_APP_PROVIDERS} from 'angular2/platform/browser'; -// import { -// Http, -// HTTP_PROVIDERS -// } from 'angular2/http'; +import {Http, HTTP_PROVIDERS} from 'angular2/http'; // import { // NG_PRELOAD_CACHE_PROVIDERS, @@ -18,9 +15,9 @@ import {App, MyApp} from './app'; export function main() { var app = angular.platform(BROWSER_PROVIDERS) .application([ - BROWSER_APP_PROVIDERS - /* + BROWSER_APP_PROVIDERS, HTTP_PROVIDERS, + /* NG_PRELOAD_CACHE_PROVIDERS, bind(PRIME_CACHE).toValue(true) */ diff --git a/examples/app/universal/test_page/index.ng2.html b/examples/src/universal/test_page/index.ng2.html similarity index 100% rename from examples/app/universal/test_page/index.ng2.html rename to examples/src/universal/test_page/index.ng2.html diff --git a/examples/app/universal/test_router/app.ts b/examples/src/universal/test_router/app.ts similarity index 100% rename from examples/app/universal/test_router/app.ts rename to examples/src/universal/test_router/app.ts diff --git a/examples/app/universal/test_router/browser.ts b/examples/src/universal/test_router/browser.ts similarity index 100% rename from examples/app/universal/test_router/browser.ts rename to examples/src/universal/test_router/browser.ts diff --git a/examples/app/universal/test_router/index.ng2.html b/examples/src/universal/test_router/index.ng2.html similarity index 100% rename from examples/app/universal/test_router/index.ng2.html rename to examples/src/universal/test_router/index.ng2.html diff --git a/examples/app/universal/todo/app.ts b/examples/src/universal/todo/app.ts similarity index 100% rename from examples/app/universal/todo/app.ts rename to examples/src/universal/todo/app.ts diff --git a/examples/app/universal/todo/browser.ts b/examples/src/universal/todo/browser.ts similarity index 100% rename from examples/app/universal/todo/browser.ts rename to examples/src/universal/todo/browser.ts diff --git a/examples/app/universal/todo/css/base.css b/examples/src/universal/todo/css/base.css similarity index 100% rename from examples/app/universal/todo/css/base.css rename to examples/src/universal/todo/css/base.css diff --git a/examples/app/universal/todo/css/bg.png b/examples/src/universal/todo/css/bg.png similarity index 100% rename from examples/app/universal/todo/css/bg.png rename to examples/src/universal/todo/css/bg.png diff --git a/examples/app/universal/todo/css/main.css b/examples/src/universal/todo/css/main.css similarity index 100% rename from examples/app/universal/todo/css/main.css rename to examples/src/universal/todo/css/main.css diff --git a/examples/app/universal/todo/index.ng2.html b/examples/src/universal/todo/index.ng2.html similarity index 100% rename from examples/app/universal/todo/index.ng2.html rename to examples/src/universal/todo/index.ng2.html diff --git a/examples/app/universal/todo/services/TodoStore.ts b/examples/src/universal/todo/services/TodoStore.ts similarity index 100% rename from examples/app/universal/todo/services/TodoStore.ts rename to examples/src/universal/todo/services/TodoStore.ts diff --git a/examples/app/universal/todo/todo.html b/examples/src/universal/todo/todo.html similarity index 100% rename from examples/app/universal/todo/todo.html rename to examples/src/universal/todo/todo.html diff --git a/examples/tsconfig.json b/examples/tsconfig.json new file mode 100644 index 000000000..fd913f719 --- /dev/null +++ b/examples/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "moduleResolution": "node", + "noImplicitAny": false, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "sourceMap": true, + "listFiles": false, + "outDir": "dist", + "rootDir": "src" + }, + "exclude": [ + "typings/main.d.ts", + "typings/main", + "node_modules", + "dist" + ] +} diff --git a/examples/typings.json b/examples/typings.json new file mode 100644 index 000000000..720e2d12d --- /dev/null +++ b/examples/typings.json @@ -0,0 +1,12 @@ +{ + "name": "examples", + "version": false, + "dependencies": {}, + "ambientDependencies": { + "es6-shim": "registry:dt/es6-shim#0.31.2+20160215162030", + "express": "registry:dt/express#4.0.0+20160208031452", + "mime": "registry:dt/mime#0.0.0+20151204023458", + "node": "registry:dt/node#4.0.0+20160311162451", + "serve-static": "registry:dt/serve-static#0.0.0+20160104095738" + } +} diff --git a/gulpfile.js b/gulpfile.js index 80e33d93d..1675df771 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,4 +1,3 @@ -/// var path = require('path'); var http = require('http'); var fs = require('fs'); diff --git a/index.js b/index.js index fc214a834..4c31b18c9 100644 --- a/index.js +++ b/index.js @@ -1,78 +1,3 @@ -var SERVER_IP = '127.0.0.1'; -require('angular2-universal-preview/polyfills'); -var port = process.env.PORT || 3000; - -// Module dependencies -var http = require('http'); - - -// Start server -var framework = process.argv[2] || 'express'; -var server = null; -var example = ''; - -if (framework === 'hapi') { - // hapi - - example = `./dist/examples/app/server/hapi/server`; - server = require(example)(__dirname, { - port, - address: SERVER_IP - }); - module.exports.Server = server - .start(() => { - console.log(`Listening on port: ${port}`); - // for smoke testing - // smokeTest(); - }); - -} else { - // express or other express compliant frameworks - - example = `./dist/examples/app/server/${framework}/server`; - try { - server = require(example)(__dirname); - } catch (e) { - console.trace(e); - process.exit(1); - } - - module.exports.Server = http - .createServer(server) - .listen(port, SERVER_IP, function() { - console.log(`Listening on port: ${port}`); - // for smoke testing - // smokeTest(); - }); - -} -console.log(`Using framework: "${framework}"`); - - -function smokeTest() { - var req = http.get({ - host: 'localhost', - port: 3000, - path: '/?server=true&client=false&preboot=false&bootstrap=false', - }, function(res) { - // console.log('STATUS: ' + res.statusCode); - // console.log('HEADERS: ' + JSON.stringify(res.headers, null, 2)); - - // Buffer the body entirely for processing as a whole. - var bodyChunks = []; - res. - on('data', function(chunk) { - // You can process streamed parts here... - bodyChunks.push(chunk); - }). - on('end', function() { - var body = Buffer.concat(bodyChunks); - // console.log('GOOD' /*, body.toString()*/ ); - // ...and/or process the entire body here. - }) - }); - - req.on('error', function(e) { - console.error('ERROR: ' + e.message); - }); -} +// Set up ts-node to enable loading of TypeScript files. +require('ts-node/register'); +module.exports = require('./examples/server.ts'); From ebefc1b11c17411f9a2c79450295bf77665bc5f8 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 18:08:24 -0700 Subject: [PATCH 10/17] fix(modules): build system --- .gitignore | 2 ++ modules/express-engine/package.json | 1 + modules/grunt-prerender/package.json | 2 +- modules/grunt-prerender/tsconfig.json | 1 - modules/gulp-prerender/package.json | 2 +- modules/gulp-prerender/tsconfig.json | 1 - modules/hapi-engine/package.json | 2 +- modules/preboot/package.json | 2 +- modules/universal/package.json | 13 +++++++++++-- 9 files changed, 18 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 642460b51..f416de94a 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,5 @@ test/coverage /examples/dist + +examples/typings diff --git a/modules/express-engine/package.json b/modules/express-engine/package.json index e0833a544..a8eea3e08 100644 --- a/modules/express-engine/package.json +++ b/modules/express-engine/package.json @@ -12,6 +12,7 @@ "Jeff Whelpley " ], "scripts": { + "prebuild": "rm -rf dist", "build": "tsc || true", "prepublish": "npm run build" }, diff --git a/modules/grunt-prerender/package.json b/modules/grunt-prerender/package.json index bf863a8fa..521a8f98f 100644 --- a/modules/grunt-prerender/package.json +++ b/modules/grunt-prerender/package.json @@ -12,7 +12,7 @@ "Jeff Whelpley " ], "scripts": { - "prebuild": "rimraf tasks", + "prebuild": "rm -rf tasks", "build": "tsc || true", "prepublish": "npm run build" }, diff --git a/modules/grunt-prerender/tsconfig.json b/modules/grunt-prerender/tsconfig.json index 16916af4a..ddddf749f 100644 --- a/modules/grunt-prerender/tsconfig.json +++ b/modules/grunt-prerender/tsconfig.json @@ -13,7 +13,6 @@ "outDir": "tasks" }, "files": [ - "../../typings/browser.d.ts", "./index.ts", "./src/prerender.ts" ], diff --git a/modules/gulp-prerender/package.json b/modules/gulp-prerender/package.json index 3491536bd..5824f7468 100644 --- a/modules/gulp-prerender/package.json +++ b/modules/gulp-prerender/package.json @@ -12,7 +12,7 @@ "Jeff Whelpley " ], "scripts": { - "prebuild": "rimraf dist", + "prebuild": "rm -rf dist", "build": "tsc || true", "prepublish": "npm run build" }, diff --git a/modules/gulp-prerender/tsconfig.json b/modules/gulp-prerender/tsconfig.json index 291acd3a7..1d6920c00 100644 --- a/modules/gulp-prerender/tsconfig.json +++ b/modules/gulp-prerender/tsconfig.json @@ -13,7 +13,6 @@ "outDir": "dist" }, "files": [ - "../../typings/browser.d.ts", "./index.ts" ], "formatCodeOptions": { diff --git a/modules/hapi-engine/package.json b/modules/hapi-engine/package.json index 49fd91303..6838eb534 100644 --- a/modules/hapi-engine/package.json +++ b/modules/hapi-engine/package.json @@ -12,7 +12,7 @@ "Jeff Whelpley " ], "scripts": { - "prebuild": "rimraf dist", + "prebuild": "rm -rf dist", "build": "tsc || true", "prepublish": "npm run build" }, diff --git a/modules/preboot/package.json b/modules/preboot/package.json index 0f560aa08..ff134fcdd 100644 --- a/modules/preboot/package.json +++ b/modules/preboot/package.json @@ -7,7 +7,7 @@ "typings": "dist/src/node/preboot_node.d.ts", "scripts": { "prebuild": "rm -rf dist", - "build": "tsc", + "build": "tsc || true", "prepublish": "npm run build" }, "files": [ diff --git a/modules/universal/package.json b/modules/universal/package.json index f44abe25a..1ceee145f 100644 --- a/modules/universal/package.json +++ b/modules/universal/package.json @@ -30,10 +30,19 @@ "prepublish": "npm run build" }, "devDependencies": { + "angular2-universal-preview": "file:.", "angular2-express-engine": "file:../express-engine", "angular2-hapi-engine": "file:../hapi-engine", + "angular2": "2.0.0-beta.9", "preboot": "file:../preboot", - "typescript": "^1.8.7" + "zone.js": "~0.5.15", + "es6-shim": "^0.33.3", + "es6-promise": "^3.0.2", + "reflect-metadata": "0.1.2", + "typescript": "^1.8.7", + "rxjs": "~5.0.0-beta.2", + "css": "^2.2.1", + "parse5": "^1.5.0" }, "dependencies": { "angular2-express-engine": "*", @@ -47,7 +56,7 @@ "angular2-express-engine": ">=0.5.5", "angular2-hapi-engine": ">=0.5.1", "rxjs": "~5.0.0-beta.2", - "angular2": "2.0.0-beta.8 - 2.0.0-beta.9", + "angular2": "2.0.0-beta.8 - 2.0.0-beta.10", "es6-shim": "^0.33.3", "zone.js": "~0.5.15", "css": "^2.2.1", From 6d65713cff4ff6d2cfb564e672d00c8e012c99e4 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 18:08:40 -0700 Subject: [PATCH 11/17] feat(universal/document): error messages --- modules/universal/src/node/platform/document.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/universal/src/node/platform/document.ts b/modules/universal/src/node/platform/document.ts index d8b3bb437..cec2b4971 100644 --- a/modules/universal/src/node/platform/document.ts +++ b/modules/universal/src/node/platform/document.ts @@ -16,6 +16,12 @@ export function parseFragment(el: string): Object { } export function parseDocument(documentHtml: string): Object { + if (!documentHtml) { + throw new Error('parseDocument requires a document string'); + } + if (typeof documentHtml !== 'string') { + throw new Error('parseDocument needs to be a string to be parsed correctly'); + } const doc = parser.parse(documentHtml); let rootNode; let bodyNode; From 727e10ec8b50d3c82a4bfd2e0d837fb2f0a8303b Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 18:08:58 -0700 Subject: [PATCH 12/17] refactor(buildNodeAppProviders): don't spread --- modules/universal/src/node/platform/node.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/universal/src/node/platform/node.ts b/modules/universal/src/node/platform/node.ts index 14fb49b91..fba3edcae 100644 --- a/modules/universal/src/node/platform/node.ts +++ b/modules/universal/src/node/platform/node.ts @@ -148,9 +148,9 @@ export function buildNodeProviders(providers?: Array): Array { export function buildNodeAppProviders(document?: any, providers?: Array): Array { return [ - ...NODE_APPLICATION_PROVIDERS, - ...(isPresent(document) ? [new Provider(DOCUMENT, {useFactory: () => document})] : []), - ...(isPresent(providers) ? providers : []) + NODE_APPLICATION_PROVIDERS, + (isPresent(document) && document) ? [new Provider(DOCUMENT, {useFactory: () => document})] : [], + (isPresent(providers) && providers) ? providers : [] ]; } From 221f1c89ed9ecb90aa9244414dc07209281137a4 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 18:09:14 -0700 Subject: [PATCH 13/17] fix(NgPreloadCacheHttp): correctly return obs --- .../universal/src/node/http/preload_cache.ts | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/modules/universal/src/node/http/preload_cache.ts b/modules/universal/src/node/http/preload_cache.ts index 446bb915b..ddb71f8c0 100644 --- a/modules/universal/src/node/http/preload_cache.ts +++ b/modules/universal/src/node/http/preload_cache.ts @@ -164,7 +164,7 @@ export class NgPreloadCacheHttp extends Http { preload(factory) { - var obs = new EventEmitter(true); + var obs = new EventEmitter(false); var currentNode = null; @@ -177,7 +177,8 @@ export class NgPreloadCacheHttp extends Http { this._async += 1; var request = factory(); - request.subscribe({ + request + .subscribe({ next: (response) => { let headers = {}; response.headers.forEach((value, name) => { @@ -189,21 +190,27 @@ export class NgPreloadCacheHttp extends Http { if (isPresent(currentNode)) { currentNode.res = res; } - obs.next(response); + // this._ngZone.run(() => { + obs.next(response); + // }); }, error: (e) => { - this._async -= 1; - obs.error(e); + // this._ngZone.run(() => { + obs.error(e) + this._async -= 1; + // }); }, complete: () => { this._activeNode = currentNode; - this._async -= 1; this._activeNode = null; - obs.complete(); + // this._ngZone.run(() => { + obs.complete(); + this._async -= 1; + // }); } }); - return request; + return obs; } request(url: string | Request, options?: RequestOptionsArgs): Observable { From 1b6dc371cc24d947ae8eccf45374abb23960a330 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 18:09:36 -0700 Subject: [PATCH 14/17] refactor(NodeConnection): use ngzone --- modules/universal/src/node/http/node_http.ts | 63 ++++++++++++-------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/modules/universal/src/node/http/node_http.ts b/modules/universal/src/node/http/node_http.ts index 48c18ad8e..8ce1326de 100644 --- a/modules/universal/src/node/http/node_http.ts +++ b/modules/universal/src/node/http/node_http.ts @@ -11,7 +11,7 @@ import { } from 'angular2/http'; import * as utils from 'angular2/src/http/http_utils'; import {isPresent} from 'angular2/src/facade/lang'; -import {Injectable} from 'angular2/core'; +import {Injectable, NgZone} from 'angular2/core'; import {Observable} from 'rxjs/Observable'; import 'rxjs/add/operator/map'; import * as http from 'http'; @@ -22,7 +22,7 @@ export class NodeConnection implements Connection { public request: Request; public response: Observable; - constructor(req: Request, baseResponseOptions?: ResponseOptions) { + constructor(req: Request, baseResponseOptions?: ResponseOptions, ngZome?: NgZone) { this.request = req; let reqInfo: any = url.parse(req.url); @@ -34,33 +34,45 @@ export class NodeConnection implements Connection { } this.response = new Observable(responseObserver => { - let nodeReq = http.request(reqInfo, (res: http.IncomingMessage) => { - let body = ''; - res.on('data', (chunk) => body += chunk); - - let status = res.statusCode; - let headers = new Headers(res.headers); - let url = res.url; - - res.on('end', () => { - let responseOptions = new ResponseOptions({body, status, headers, url}); - let response = new Response(responseOptions); - - if (utils.isSuccess(status)) { - responseObserver.next(response); - responseObserver.complete(); - return; - } - responseObserver.error(response); + let nodeReq; + ngZome.run(() => { + + nodeReq = http.request(reqInfo, (res: http.IncomingMessage) => { + let body = ''; + res.on('data', (chunk) => body += chunk); + + let status = res.statusCode; + let headers = new Headers(res.headers); + let url = res.url; + + res.on('end', () => { + let responseOptions = new ResponseOptions({body, status, headers, url}); + let response = new Response(responseOptions); + + if (utils.isSuccess(status)) { + ngZome.run(() => { + responseObserver.next(response); + }); + ngZome.run(() => { + responseObserver.complete(); + }); + return; + } + ngZome.run(() => { + responseObserver.error(response); + }); + }); }); - }); + }) let onError = (err) => { let responseOptions = new ResponseOptions({body: err, type: ResponseType.Error}); if (isPresent(baseResponseOptions)) { responseOptions = baseResponseOptions.merge(responseOptions); } - responseObserver.error(new Response(responseOptions)); + ngZome.run(() => { + responseObserver.error(new Response(responseOptions)); + }); }; nodeReq.on('error', onError); @@ -79,8 +91,11 @@ export class NodeConnection implements Connection { @Injectable() export class NodeBackend implements ConnectionBackend { - constructor(private _baseResponseOptions: ResponseOptions) {} + constructor( + private _baseResponseOptions: ResponseOptions, + private _ngZone: NgZone) {} + public createConnection(request: Request): NodeConnection { - return new NodeConnection(request, this._baseResponseOptions); + return new NodeConnection(request, this._baseResponseOptions, this._ngZone); } } From 2932f394a5d8ad0af7bff3d2c4878554b53c9974 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 18:09:52 -0700 Subject: [PATCH 15/17] refactor(http/index): use ngzone --- modules/universal/src/node/http/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/universal/src/node/http/index.ts b/modules/universal/src/node/http/index.ts index 3b9887057..bd3a77c90 100644 --- a/modules/universal/src/node/http/index.ts +++ b/modules/universal/src/node/http/index.ts @@ -7,8 +7,7 @@ import { BaseRequestOptions, BaseResponseOptions } from 'angular2/http'; -import {provide, PLATFORM_INITIALIZER} from 'angular2/core'; -; +import {provide, NgZone, PLATFORM_INITIALIZER} from 'angular2/core'; import * as nodeHttp from './node_http' import * as preloadCache from './preload_cache'; @@ -20,10 +19,10 @@ export var NODE_HTTP_PROVIDERS: Array = [ provide(ResponseOptions, {useClass: BaseResponseOptions}), provide(nodeHttp.NodeBackend, { - useFactory: (respOpt) => { - return new nodeHttp.NodeBackend(respOpt); + useFactory: (respOpt, ngZone) => { + return new nodeHttp.NodeBackend(respOpt, ngZone); }, - deps: [ResponseOptions] + deps: [ResponseOptions, NgZone] }), provide(ConnectionBackend, {useClass: nodeHttp.NodeBackend}), @@ -37,7 +36,8 @@ export var NODE_PRELOAD_CACHE_HTTP_PROVIDERS: Array = [ provide(ResponseOptions, {useClass: BaseResponseOptions}), provide(BrowserXhr, {useClass: preloadCache.NodeXhr}), - provide(ConnectionBackend, {useClass: preloadCache.NodeXhrBackend}), + // provide(ConnectionBackend, {useClass: preloadCache.NodeXhrBackend}), + provide(ConnectionBackend, {useClass: nodeHttp.NodeBackend}), provide(Http, {useClass: preloadCache.NgPreloadCacheHttp}) ]; From 37417429830952cd76ba4bc8d22bf5aaa4cedd4a Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 18:10:09 -0700 Subject: [PATCH 16/17] feat(bootloader): precache --- modules/universal/src/node/bootloader.ts | 109 ++++++++++++++++++----- 1 file changed, 89 insertions(+), 20 deletions(-) diff --git a/modules/universal/src/node/bootloader.ts b/modules/universal/src/node/bootloader.ts index efccc82fc..0d84e37d2 100644 --- a/modules/universal/src/node/bootloader.ts +++ b/modules/universal/src/node/bootloader.ts @@ -1,6 +1,7 @@ import {DOCUMENT} from 'angular2/platform/common_dom'; import {DOM} from 'angular2/src/platform/dom/dom_adapter'; import {NgZone, platform, PlatformRef, ApplicationRef} from 'angular2/core'; +import {Http} from 'angular2/http'; import {buildReflector, buildNodeProviders, buildNodeAppProviders} from './platform/node'; @@ -9,6 +10,7 @@ import {createPrebootCode} from './ng_preboot'; import {waitRouter} from './render'; export interface BootloaderConfig { + template?: any; document?: any; platformProviders?: Array; providers?: Array; @@ -16,6 +18,26 @@ export interface BootloaderConfig { component?: any; directives?: Array; preboot?: any; + precache?: boolean; +} + +function checkProviders(providers) { + let lastProviders = []; + for (let i = 0; i < providers.length; ++i) { + let provide = providers[i]; + if (!provide) { + console.log('undefined provider', providers); + // lastProviders.push(providers[i-1].name); + } + // else if (!provide.token) { + // console.log('undefined token', provide); + // lastProviders.push(providers[i-1].name); + // } + } + if (lastProviders.length) { + console.log('PROVIDERS ERRORS', lastProviders); + } + return providers; } export class Bootloader { @@ -46,16 +68,16 @@ export class Bootloader { static serializeDocument(document) { return serializeDocument(document); } document(document = null) { - var doc = document || this._config.document; + var doc = document || this._config.template || this._config.document; if (typeof doc === 'string') { - return Bootloader.parseDocument(document); + return Bootloader.parseDocument(doc); } return doc; } platform(providers?: any): PlatformRef { let pro = providers || this._config.platformProviders; - return platform(buildNodeProviders(pro)); + return platform(checkProviders(buildNodeProviders(pro))); } application(document?: any, providers?: any): ApplicationRef { @@ -82,50 +104,97 @@ export class Bootloader { serializeApplication(Component?: any | Array, componentProviders?: Array): Promise { let component = Component || this._config.component; let providers = componentProviders || this._config.componentProviders; - return this.bootstrap(component, providers) - .then(applicationRefs => { - let lastAppRef = applicationRefs; - let injector = applicationRefs.injector; - if (Array.isArray(applicationRefs)) { - lastAppRef = applicationRefs[applicationRefs.length - 1]; - injector = lastAppRef.injector; + + return this._applicationAll(component, providers) + .then((configRefs: any) => { + if ('precache' in this._config) { + if (!this._config.precache) { + return configRefs; + } + + let apps = configRefs.map((config, i) => { + let ngZone = config.appRef.injector.get(NgZone); + let http = config.cmpRef.injector.getOptional(Http); + + let promise = new Promise(resolve => { + if (http && http._async) { + ngZone.onEventDone.subscribe(() => { + if (http && http._async <= 0) { + resolve(config); + } + }); + } else { + resolve(config); + } + }); + return promise; + }); + return Promise.all(apps); + } - return { injector, lastAppRef }; + return configRefs + }) + .catch(err => { + console.log('Precache Error:', err); + throw err; }) - .then(({ injector, lastAppRef }: any) => { + .then((configRefs: any) => { if ('preboot' in this._config) { - if (!this._config.preboot) { return injector; } + if (!this._config.preboot) { return configRefs; } let prebootCode = createPrebootCode(this._config.directives, this._config.preboot); return prebootCode .then(code => { // TODO(gdi2290): manage the codegen better after preboot supports multiple appRoot - let el = lastAppRef.location.nativeElement; + let lastRef = configRefs[configRefs.length - 1]; + let el = lastRef.cmpRef.location.nativeElement; let script = parseFragment(code); let prebootEl = DOM.createElement('div'); DOM.setInnerHTML(prebootEl, code); DOM.insertAfter(el, prebootEl); - return injector; + return configRefs; }); } - return injector; + return configRefs; }) - .then((injector: any) => { - let document = injector.get(DOCUMENT); + .catch(err => { + console.log('preboot Error:', err); + throw err; + }) + .then((configRefs: any) => { + let document = configRefs[0].appRef.injector.get(DOCUMENT); let rendered = Bootloader.serializeDocument(document); return rendered; - }); + }) + .catch(err => { + console.log('Rendering Document Error:', err); + throw err; + }) + } - _bootstrapAll(Components?: Array, componentProviders?: Array) { + _bootstrapAll(Components?: Array, componentProviders?: Array): Promise> { let components = Components || this._config.directives; let providers = componentProviders || this._config.componentProviders; let directives = components.map(component => this.appRef.bootstrap(component, providers).then(waitRouter)); return Promise.all(directives); } + _applicationAll(Components?: Array, componentProviders?: Array): Promise> { + let components = Components || this._config.directives; + let providers = componentProviders || this._config.componentProviders || []; + let doc = this.document(this._config.template || this._config.document); + + let directives = components.map(component => { + var appRef = this.application(doc); + let compRef = appRef.bootstrap(component, providers).then(waitRouter) + return compRef.then(cmpRef => ({ appRef, cmpRef })); + }); + return Promise.all(directives); + } + dispose(): void { this.appRef.dispose(); this.platformRef.dispose(); From 18035257e0b4746fa84cbc874d886cb69be8de5d Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Thu, 17 Mar 2016 18:10:24 -0700 Subject: [PATCH 17/17] feat(express-engine): precache --- modules/express-engine/src/engine.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/express-engine/src/engine.ts b/modules/express-engine/src/engine.ts index e573e72cf..440d8270d 100644 --- a/modules/express-engine/src/engine.ts +++ b/modules/express-engine/src/engine.ts @@ -18,6 +18,7 @@ export interface expressEngineOptions { directives: Array; providers?: Array; preboot?: Object | any; + precache?: boolean; bootloader?: any; selector?: string; serializedCmp?: string; @@ -166,12 +167,14 @@ export function expressEngine(filePath: string, options: expressEngineOptions, d var bootloader = options.bootloader; if (!options.bootloader) { options.bootloader = { - document: parseDocument(clientHtml), + template: clientHtml, + document: clientHtml, providers: options.providers, componentProviders: options.componentProviders, platformProviders: options.platformProviders, directives: options.directives, - preboot: options.preboot + preboot: options.preboot, + precache: options.precache }; } bootloader = Bootloader.create(options.bootloader);