From 472c9d98c797ebbd1bf0cb67df52ecacf849832d Mon Sep 17 00:00:00 2001 From: Tero Parviainen Date: Tue, 15 Dec 2015 08:02:20 +0200 Subject: [PATCH] docs(upgrade) add PhoneCat upgrade tutorial --- public/docs/_examples/upgrade/README.md | 6 + .../_examples/upgrade/ts/classes/.bowerrc | 3 + .../_examples/upgrade/ts/classes/.gitignore | 6 + .../upgrade/ts/classes/app/css/.gitkeep | 0 .../upgrade/ts/classes/app/css/animations.css | 97 ++ .../upgrade/ts/classes/app/css/app.css | 99 ++ .../upgrade/ts/classes/app/img/.gitkeep | 0 .../app/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../classes/app/img/glyphicons-halflings.png | Bin 0 -> 12601 bytes .../upgrade/ts/classes/app/index.html | 31 + .../upgrade/ts/classes/app/js/app.module.ts | 40 + .../classes/app/js/core/checkmark.filter.ts | 6 + .../ts/classes/app/js/core/core.module.ts | 9 + .../ts/classes/app/js/core/phone.factory.ts | 10 + .../phone_detail/phone_detail.controller.ts | 22 + .../app/js/phone_detail/phone_detail.html | 118 ++ .../js/phone_detail/phone_detail.module.ts | 8 + .../js/phone_list/phone_list.controller.ts | 14 + .../classes/app/js/phone_list/phone_list.html | 28 + .../app/js/phone_list/phone_list.module.ts | 5 + .../_examples/upgrade/ts/classes/bower.json | 20 + .../upgrade/ts/classes/test/e2e/scenarios.ts | 103 ++ .../ts/classes/test/jasmine_matchers.d.ts | 6 + .../ts/classes/test/karma_test_shim.js | 44 + .../ts/classes/test/protractor-conf.js | 21 + .../upgrade/ts/classes/test/test_helper.ts | 3 + .../test/unit/checkmark.filter.spec.ts | 15 + .../classes/test/unit/phone.factory.spec.ts | 15 + .../test/unit/phone_detail.controller.spec.ts | 44 + .../test/unit/phone_list.controller.spec.ts | 44 + .../upgrade/ts/ng2_components/.bowerrc | 3 + .../upgrade/ts/ng2_components/.gitignore | 6 + .../ts/ng2_components/app/css/.gitkeep | 0 .../ts/ng2_components/app/css/animations.css | 97 ++ .../upgrade/ts/ng2_components/app/css/app.css | 99 ++ .../ts/ng2_components/app/img/.gitkeep | 0 .../app/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../app/img/glyphicons-halflings.png | Bin 0 -> 12601 bytes .../upgrade/ts/ng2_components/app/index.html | 41 + .../ts/ng2_components/app/js/app.module.ts | 50 + .../app/js/core/CheckmarkPipe.ts | 9 + .../ts/ng2_components/app/js/core/Phones.ts | 37 + .../ng2_components/app/js/core/core.module.ts | 8 + .../app/js/core/upgrade_adapter.ts | 9 + .../app/js/phone_detail/PhoneDetail.ts | 33 + .../phone_detail/PhoneDetail_without_pipes.ts | 29 + .../app/js/phone_detail/phone_detail.html | 115 ++ .../js/phone_detail/phone_detail.module.ts | 10 + .../app/js/phone_list/OrderByPipe.ts | 24 + .../app/js/phone_list/PhoneFilterPipe.ts | 22 + .../app/js/phone_list/PhoneList.ts | 26 + .../js/phone_list/PhoneList_without_pipes.ts | 22 + .../app/js/phone_list/phone_list.html | 32 + .../app/js/phone_list/phone_list.module.ts | 9 + .../phone_list/phone_list_without_async.html | 32 + .../phone_list/phone_list_without_pipes.html | 32 + .../upgrade/ts/ng2_components/bower.json | 20 + .../ts/ng2_components/test/e2e/scenarios.ts | 112 ++ .../ts/ng2_components/test/karma_test_shim.js | 54 + .../ts/ng2_components/test/protractor-conf.js | 21 + .../ts/ng2_components/test/test_helper.ts | 2 + .../test/unit/CheckmarkPipe.spec.ts | 15 + .../test/unit/OrderByPipe.spec.ts | 19 + .../test/unit/PhoneDetail.spec.ts | 49 + .../test/unit/PhoneFilterPipe.spec.ts | 28 + .../test/unit/PhoneList.spec.ts | 58 + .../ng2_components/test/unit/Phones.spec.ts | 16 + .../_examples/upgrade/ts/ng2_final/.bowerrc | 3 + .../_examples/upgrade/ts/ng2_final/.gitignore | 6 + .../upgrade/ts/ng2_final/app/css/.gitkeep | 0 .../ts/ng2_final/app/css/animations.css | 97 ++ .../upgrade/ts/ng2_final/app/css/app.css | 99 ++ .../upgrade/ts/ng2_final/app/img/.gitkeep | 0 .../app/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../app/img/glyphicons-halflings.png | Bin 0 -> 12601 bytes .../upgrade/ts/ng2_final/app/index.html | 40 + .../upgrade/ts/ng2_final/app/js/app.ts | 48 + .../ts/ng2_final/app/js/core/CheckmarkPipe.ts | 9 + .../ts/ng2_final/app/js/core/Phones.ts | 37 + .../ng2_final/app/js/core/upgrade_adapter.ts | 9 + .../app/js/phone_detail/PhoneDetail.ts | 30 + .../app/js/phone_detail/phone_detail.html | 115 ++ .../app/js/phone_list/OrderByPipe.ts | 24 + .../app/js/phone_list/PhoneFilterPipe.ts | 22 + .../ng2_final/app/js/phone_list/PhoneList.ts | 28 + .../app/js/phone_list/phone_list.html | 32 + .../_examples/upgrade/ts/ng2_final/bower.json | 20 + .../ts/ng2_final/test/e2e/scenarios.ts | 114 ++ .../ts/ng2_final/test/karma_test_shim.js | 54 + .../ts/ng2_final/test/protractor-conf.js | 25 + .../ng2_final/test/unit/CheckmarkPipe.spec.ts | 15 + .../ng2_final/test/unit/OrderByPipe.spec.ts | 19 + .../ng2_final/test/unit/PhoneDetail.spec.ts | 53 + .../test/unit/PhoneFilterPipe.spec.ts | 28 + .../ts/ng2_final/test/unit/PhoneList.spec.ts | 57 + .../ts/ng2_final/test/unit/Phones.spec.ts | 16 + .../_examples/upgrade/ts/ng2_initial/.bowerrc | 3 + .../upgrade/ts/ng2_initial/.gitignore | 6 + .../upgrade/ts/ng2_initial/app/css/.gitkeep | 0 .../ts/ng2_initial/app/css/animations.css | 97 ++ .../upgrade/ts/ng2_initial/app/css/app.css | 99 ++ .../upgrade/ts/ng2_initial/app/img/.gitkeep | 0 .../app/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../app/img/glyphicons-halflings.png | Bin 0 -> 12601 bytes .../upgrade/ts/ng2_initial/app/index.html | 52 + .../ts/ng2_initial/app/js/app.module.ts | 50 + .../ts/ng2_initial/app/js/core/Phones.ts | 38 + .../app/js/core/checkmark.filter.ts | 6 + .../ts/ng2_initial/app/js/core/core.module.ts | 10 + .../app/js/core/upgrade_adapter.ts | 9 + .../phone_detail/phone_detail.controller.ts | 25 + .../app/js/phone_detail/phone_detail.html | 118 ++ .../js/phone_detail/phone_detail.module.ts | 8 + .../js/phone_list/phone_list.controller.ts | 17 + .../app/js/phone_list/phone_list.html | 28 + .../app/js/phone_list/phone_list.module.ts | 5 + .../upgrade/ts/ng2_initial/bower.json | 20 + .../ts/ng2_initial/test/e2e/scenarios.ts | 99 ++ .../ts/ng2_initial/test/karma_test_shim.js | 54 + .../ts/ng2_initial/test/protractor-conf.js | 21 + .../ts/ng2_initial/test/test_helper.ts | 2 + .../ts/ng2_initial/test/unit/Phones.spec.ts | 16 + .../test/unit/checkmark.filter.spec.ts | 15 + .../test/unit/phone_detail.controller.spec.ts | 44 + .../test/unit/phone_list.controller.spec.ts | 39 + .../upgrade/ts/typescript-conversion/.bowerrc | 3 + .../ts/typescript-conversion/.gitignore | 6 + .../ts/typescript-conversion/app/css/.gitkeep | 0 .../app/css/animations.css | 97 ++ .../ts/typescript-conversion/app/css/app.css | 99 ++ .../ts/typescript-conversion/app/img/.gitkeep | 0 .../app/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../app/img/glyphicons-halflings.png | Bin 0 -> 12601 bytes .../ts/typescript-conversion/app/index.html | 40 + .../app/js/app.module.ts | 41 + .../app/js/core/checkmark.filter.ts | 6 + .../app/js/core/core.module.ts | 9 + .../app/js/core/phone.factory.ts | 10 + .../phone_detail/phone_detail.controller.ts | 14 + .../app/js/phone_detail/phone_detail.html | 118 ++ .../js/phone_detail/phone_detail.module.ts | 8 + .../js/phone_list/phone_list.controller.ts | 10 + .../app/js/phone_list/phone_list.html | 28 + .../app/js/phone_list/phone_list.module.ts | 5 + .../ts/typescript-conversion/bower.json | 20 + .../test/e2e/scenarios.ts | 103 ++ .../test/jasmine_matchers.d.ts | 6 + .../test/karma_test_shim.js | 44 + .../test/protractor-conf.js | 21 + .../typescript-conversion/test/test_helper.ts | 3 + .../test/unit/checkmark.filter.spec.ts | 15 + .../test/unit/phone.factory.spec.ts | 15 + .../test/unit/phone_detail.controller.spec.ts | 44 + .../test/unit/phone_list.controller.spec.ts | 44 + public/docs/ts/latest/guide/_data.json | 15 +- public/docs/ts/latest/guide/upgrade.jade | 1291 +++++++++++++++++ 156 files changed, 5947 insertions(+), 5 deletions(-) create mode 100644 public/docs/_examples/upgrade/README.md create mode 100644 public/docs/_examples/upgrade/ts/classes/.bowerrc create mode 100644 public/docs/_examples/upgrade/ts/classes/.gitignore create mode 100644 public/docs/_examples/upgrade/ts/classes/app/css/.gitkeep create mode 100644 public/docs/_examples/upgrade/ts/classes/app/css/animations.css create mode 100644 public/docs/_examples/upgrade/ts/classes/app/css/app.css create mode 100644 public/docs/_examples/upgrade/ts/classes/app/img/.gitkeep create mode 100644 public/docs/_examples/upgrade/ts/classes/app/img/glyphicons-halflings-white.png create mode 100644 public/docs/_examples/upgrade/ts/classes/app/img/glyphicons-halflings.png create mode 100644 public/docs/_examples/upgrade/ts/classes/app/index.html create mode 100644 public/docs/_examples/upgrade/ts/classes/app/js/app.module.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/app/js/core/checkmark.filter.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/app/js/core/core.module.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/app/js/core/phone.factory.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.controller.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.html create mode 100644 public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.module.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.controller.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.html create mode 100644 public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.module.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/bower.json create mode 100644 public/docs/_examples/upgrade/ts/classes/test/e2e/scenarios.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/test/jasmine_matchers.d.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/test/karma_test_shim.js create mode 100644 public/docs/_examples/upgrade/ts/classes/test/protractor-conf.js create mode 100644 public/docs/_examples/upgrade/ts/classes/test/test_helper.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/test/unit/checkmark.filter.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/test/unit/phone.factory.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/test/unit/phone_detail.controller.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/classes/test/unit/phone_list.controller.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/.bowerrc create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/.gitignore create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/css/.gitkeep create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/css/animations.css create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/css/app.css create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/img/.gitkeep create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/img/glyphicons-halflings-white.png create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/img/glyphicons-halflings.png create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/index.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/app.module.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/core/CheckmarkPipe.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/core/Phones.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/core/core.module.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/core/upgrade_adapter.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/PhoneDetail.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/PhoneDetail_without_pipes.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/phone_detail.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/phone_detail.module.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/OrderByPipe.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneFilterPipe.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneList.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneList_without_pipes.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list.module.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list_without_async.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list_without_pipes.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/bower.json create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/test/e2e/scenarios.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/test/karma_test_shim.js create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/test/protractor-conf.js create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/test/test_helper.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/test/unit/CheckmarkPipe.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/test/unit/OrderByPipe.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneDetail.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneFilterPipe.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneList.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_components/test/unit/Phones.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/.bowerrc create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/.gitignore create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/css/.gitkeep create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/css/animations.css create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/css/app.css create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/img/.gitkeep create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/img/glyphicons-halflings-white.png create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/img/glyphicons-halflings.png create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/index.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/js/app.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/js/core/CheckmarkPipe.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/js/core/Phones.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/js/core/upgrade_adapter.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_detail/PhoneDetail.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_detail/phone_detail.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/OrderByPipe.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/PhoneFilterPipe.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/PhoneList.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/phone_list.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/bower.json create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/test/e2e/scenarios.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/test/karma_test_shim.js create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/test/protractor-conf.js create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/test/unit/CheckmarkPipe.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/test/unit/OrderByPipe.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneDetail.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneFilterPipe.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneList.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_final/test/unit/Phones.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/.bowerrc create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/.gitignore create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/css/.gitkeep create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/css/animations.css create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/css/app.css create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/img/.gitkeep create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/img/glyphicons-halflings-white.png create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/img/glyphicons-halflings.png create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/index.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/app.module.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/Phones.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/checkmark.filter.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/core.module.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/upgrade_adapter.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.controller.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.module.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.controller.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.html create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.module.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/bower.json create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/test/e2e/scenarios.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/test/karma_test_shim.js create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/test/protractor-conf.js create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/test/test_helper.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/test/unit/Phones.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/test/unit/checkmark.filter.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/test/unit/phone_detail.controller.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/ng2_initial/test/unit/phone_list.controller.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/.bowerrc create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/.gitignore create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/css/.gitkeep create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/css/animations.css create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/css/app.css create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/img/.gitkeep create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/img/glyphicons-halflings-white.png create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/img/glyphicons-halflings.png create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/index.html create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/js/app.module.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/checkmark.filter.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/core.module.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/phone.factory.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.controller.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.html create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.module.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.controller.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.html create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.module.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/bower.json create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/test/e2e/scenarios.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/test/jasmine_matchers.d.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/test/karma_test_shim.js create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/test/protractor-conf.js create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/test/test_helper.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/checkmark.filter.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone.factory.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone_detail.controller.spec.ts create mode 100644 public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone_list.controller.spec.ts create mode 100644 public/docs/ts/latest/guide/upgrade.jade diff --git a/public/docs/_examples/upgrade/README.md b/public/docs/_examples/upgrade/README.md new file mode 100644 index 0000000000..507c99f2b7 --- /dev/null +++ b/public/docs/_examples/upgrade/README.md @@ -0,0 +1,6 @@ +Each subdirectory here is a version of the PhoneCat app. + +Each version is fully functional, but omits the JSON data and image +files in the interest of keeping things clean. To run each app +in its full form, copy the `img` and `phones` directories from +https://github.com/angular/angular-phonecat/tree/master/app under `app`. diff --git a/public/docs/_examples/upgrade/ts/classes/.bowerrc b/public/docs/_examples/upgrade/ts/classes/.bowerrc new file mode 100644 index 0000000000..5773025bf9 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "app/bower_components" +} diff --git a/public/docs/_examples/upgrade/ts/classes/.gitignore b/public/docs/_examples/upgrade/ts/classes/.gitignore new file mode 100644 index 0000000000..8cfe0da551 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/.gitignore @@ -0,0 +1,6 @@ +app/**/*.js +app/**/*.js.map +test/unit/**/*.js +test/unit/**/*.js.map +test/e2e/**/*.js +test/e2e/**/*.js.map diff --git a/public/docs/_examples/upgrade/ts/classes/app/css/.gitkeep b/public/docs/_examples/upgrade/ts/classes/app/css/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/upgrade/ts/classes/app/css/animations.css b/public/docs/_examples/upgrade/ts/classes/app/css/animations.css new file mode 100644 index 0000000000..46f3da6ecb --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/css/animations.css @@ -0,0 +1,97 @@ +/* + * animations css stylesheet + */ + +/* animate ngRepeat in phone listing */ + +.phone-listing.ng-enter, +.phone-listing.ng-leave, +.phone-listing.ng-move { + -webkit-transition: 0.5s linear all; + -moz-transition: 0.5s linear all; + -o-transition: 0.5s linear all; + transition: 0.5s linear all; +} + +.phone-listing.ng-enter, +.phone-listing.ng-move { + opacity: 0; + height: 0; + overflow: hidden; +} + +.phone-listing.ng-move.ng-move-active, +.phone-listing.ng-enter.ng-enter-active { + opacity: 1; + height: 120px; +} + +.phone-listing.ng-leave { + opacity: 1; + overflow: hidden; +} + +.phone-listing.ng-leave.ng-leave-active { + opacity: 0; + height: 0; + padding-top: 0; + padding-bottom: 0; +} + +/* cross fading between routes with ngView */ + +.view-container { + position: relative; +} + +.view-frame.ng-enter, +.view-frame.ng-leave { + background: white; + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.view-frame.ng-enter { + -webkit-animation: 0.5s fade-in; + -moz-animation: 0.5s fade-in; + -o-animation: 0.5s fade-in; + animation: 0.5s fade-in; + z-index: 100; +} + +.view-frame.ng-leave { + -webkit-animation: 0.5s fade-out; + -moz-animation: 0.5s fade-out; + -o-animation: 0.5s fade-out; + animation: 0.5s fade-out; + z-index: 99; +} + +@keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +@-moz-keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +@-webkit-keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} +@-moz-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} +@-webkit-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} + diff --git a/public/docs/_examples/upgrade/ts/classes/app/css/app.css b/public/docs/_examples/upgrade/ts/classes/app/css/app.css new file mode 100644 index 0000000000..951ea087cc --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/css/app.css @@ -0,0 +1,99 @@ +/* app css stylesheet */ + +body { + padding-top: 20px; +} + + +.phone-images { + background-color: white; + width: 450px; + height: 450px; + overflow: hidden; + position: relative; + float: left; +} + +.phones { + list-style: none; +} + +.thumb { + float: left; + margin: -0.5em 1em 1.5em 0; + padding-bottom: 1em; + height: 100px; + width: 100px; +} + +.phones li { + clear: both; + height: 115px; + padding-top: 15px; +} + +/** Detail View **/ +img.phone { + float: left; + margin-right: 3em; + margin-bottom: 2em; + background-color: white; + padding: 2em; + height: 400px; + width: 400px; + display: none; +} + +img.phone:first-child { + display: block; +} + + +ul.phone-thumbs { + margin: 0; + list-style: none; +} + +ul.phone-thumbs li { + border: 1px solid black; + display: inline-block; + margin: 1em; + background-color: white; +} + +ul.phone-thumbs img { + height: 100px; + width: 100px; + padding: 1em; +} + +ul.phone-thumbs img:hover { + cursor: pointer; +} + + +ul.specs { + clear: both; + margin: 0; + padding: 0; + list-style: none; +} + +ul.specs > li{ + display: inline-block; + width: 200px; + vertical-align: top; +} + +ul.specs > li > span{ + font-weight: bold; + font-size: 1.2em; +} + +ul.specs dt { + font-weight: bold; +} + +h1 { + border-bottom: 1px solid gray; +} diff --git a/public/docs/_examples/upgrade/ts/classes/app/img/.gitkeep b/public/docs/_examples/upgrade/ts/classes/app/img/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/upgrade/ts/classes/app/img/glyphicons-halflings-white.png b/public/docs/_examples/upgrade/ts/classes/app/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/public/docs/_examples/upgrade/ts/classes/app/img/glyphicons-halflings.png b/public/docs/_examples/upgrade/ts/classes/app/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..5b67ffda5ff5caa7f1dfeb119f9f35830fb7a789 GIT binary patch literal 12601 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 NM|m~5DjCz@{|hh;;@|)P literal 0 HcmV?d00001 diff --git a/public/docs/_examples/upgrade/ts/classes/app/index.html b/public/docs/_examples/upgrade/ts/classes/app/index.html new file mode 100644 index 0000000000..74c39250b6 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/index.html @@ -0,0 +1,31 @@ + + + + + Google Phone Gallery + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/public/docs/_examples/upgrade/ts/classes/app/js/app.module.ts b/public/docs/_examples/upgrade/ts/classes/app/js/app.module.ts new file mode 100644 index 0000000000..60b30ec24d --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/js/app.module.ts @@ -0,0 +1,40 @@ +// #docregion pre-bootstrap +// #docregion typings +/// +/// +/// +// #enddocregion + +import core from './core/core.module'; +import phoneList from './phone_list/phone_list.module'; +import phoneDetail from './phone_detail/phone_detail.module'; + +angular.module('phonecatApp', [ + 'ngRoute', + core.name, + phoneList.name, + phoneDetail.name +]).config(configure); + +configure.$inject = ['$routeProvider']; + +function configure($routeProvider) { + $routeProvider. + when('/phones', { + templateUrl: 'js/phone_list/phone_list.html', + controller: 'PhoneListCtrl', + controllerAs: 'vm' + }). + when('/phones/:phoneId', { + templateUrl: 'js/phone_detail/phone_detail.html', + controller: 'PhoneDetailCtrl', + controllerAs: 'vm' + }). + otherwise({ + redirectTo: '/phones' + }); +} +// #enddocregion pre-bootstrap +// #docregion bootstrap +angular.bootstrap(document.documentElement, ['phonecatApp']); +// #enddocregion bootstrap diff --git a/public/docs/_examples/upgrade/ts/classes/app/js/core/checkmark.filter.ts b/public/docs/_examples/upgrade/ts/classes/app/js/core/checkmark.filter.ts new file mode 100644 index 0000000000..cd0215064f --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/js/core/checkmark.filter.ts @@ -0,0 +1,6 @@ +// #docregion +export default function checkmarkFilter() { + return function(input:boolean):string { + return input ? '\u2713' : '\u2718'; + }; +} diff --git a/public/docs/_examples/upgrade/ts/classes/app/js/core/core.module.ts b/public/docs/_examples/upgrade/ts/classes/app/js/core/core.module.ts new file mode 100644 index 0000000000..c20ce33683 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/js/core/core.module.ts @@ -0,0 +1,9 @@ +// #docregion +import Phone from './phone.factory'; +import checkmarkFilter from './checkmark.filter'; + +export default angular.module('phonecat.core', [ + 'ngResource' + ]) + .factory('Phone', Phone) + .filter('checkmark', checkmarkFilter); diff --git a/public/docs/_examples/upgrade/ts/classes/app/js/core/phone.factory.ts b/public/docs/_examples/upgrade/ts/classes/app/js/core/phone.factory.ts new file mode 100644 index 0000000000..a8492b29fc --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/js/core/phone.factory.ts @@ -0,0 +1,10 @@ +// #docregion +Phone.$inject = ['$resource']; + +function Phone($resource) { + return $resource('phones/:phoneId.json', {}, { + query: {method:'GET', params:{phoneId:'phones'}, isArray:true} + }); +} + +export default Phone; diff --git a/public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.controller.ts b/public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.controller.ts new file mode 100644 index 0000000000..c5b96b6f08 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.controller.ts @@ -0,0 +1,22 @@ +// #docregion +interface PhoneRouteParams { + phoneId: string +} + +class PhoneDetailCtrl { + phone:any; + mainImageUrl:string; + constructor($routeParams:PhoneRouteParams, Phone) { + this.phone = Phone.get({phoneId: $routeParams.phoneId}, (phone) => + this.mainImageUrl = phone.images[0] + ); + } + + setImage(url:string) { + this.mainImageUrl = url; + } +} + +PhoneDetailCtrl.$inject = ['$routeParams', 'Phone']; + +export default PhoneDetailCtrl; diff --git a/public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.html b/public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.html new file mode 100644 index 0000000000..954c65c2cd --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.html @@ -0,0 +1,118 @@ +
+ +
+ +

{{vm.phone.name}}

+ +

{{vm.phone.description}}

+ +
    +
  • + +
  • +
+ +
    +
  • + Availability and Networks +
    +
    Availability
    +
    {{availability}}
    +
    +
  • +
  • + Battery +
    +
    Type
    +
    {{vm.phone.battery.type}}
    +
    Talk Time
    +
    {{vm.phone.battery.talkTime}}
    +
    Standby time (max)
    +
    {{vm.phone.battery.standbyTime}}
    +
    +
  • +
  • + Storage and Memory +
    +
    RAM
    +
    {{vm.phone.storage.ram}}
    +
    Internal Storage
    +
    {{vm.phone.storage.flash}}
    +
    +
  • +
  • + Connectivity +
    +
    Network Support
    +
    {{vm.phone.connectivity.cell}}
    +
    WiFi
    +
    {{vm.phone.connectivity.wifi}}
    +
    Bluetooth
    +
    {{vm.phone.connectivity.bluetooth}}
    +
    Infrared
    +
    {{vm.phone.connectivity.infrared | checkmark}}
    +
    GPS
    +
    {{vm.phone.connectivity.gps | checkmark}}
    +
    +
  • +
  • + Android +
    +
    OS Version
    +
    {{vm.phone.android.os}}
    +
    UI
    +
    {{vm.phone.android.ui}}
    +
    +
  • +
  • + Size and Weight +
    +
    Dimensions
    +
    {{dim}}
    +
    Weight
    +
    {{vm.phone.sizeAndWeight.weight}}
    +
    +
  • +
  • + Display +
    +
    Screen size
    +
    {{vm.phone.display.screenSize}}
    +
    Screen resolution
    +
    {{vm.phone.display.screenResolution}}
    +
    Touch screen
    +
    {{vm.phone.display.touchScreen | checkmark}}
    +
    +
  • +
  • + Hardware +
    +
    CPU
    +
    {{vm.phone.hardware.cpu}}
    +
    USB
    +
    {{vm.phone.hardware.usb}}
    +
    Audio / headphone jack
    +
    {{vm.phone.hardware.audioJack}}
    +
    FM Radio
    +
    {{vm.phone.hardware.fmRadio | checkmark}}
    +
    Accelerometer
    +
    {{vm.phone.hardware.accelerometer | checkmark}}
    +
    +
  • +
  • + Camera +
    +
    Primary
    +
    {{vm.phone.camera.primary}}
    +
    Features
    +
    {{vm.phone.camera.features.join(', ')}}
    +
    +
  • +
  • + Additional Features +
    {{vm.phone.additionalFeatures}}
    +
  • +
diff --git a/public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.module.ts b/public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.module.ts new file mode 100644 index 0000000000..16e7ac0baf --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/js/phone_detail/phone_detail.module.ts @@ -0,0 +1,8 @@ +// #docregion +import PhoneDetailCtrl from './phone_detail.controller'; + +export default angular.module('phonecat.detail', [ + 'ngRoute', + 'phonecat.core' + ]) + .controller('PhoneDetailCtrl', PhoneDetailCtrl); diff --git a/public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.controller.ts b/public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.controller.ts new file mode 100644 index 0000000000..f1a5beb808 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.controller.ts @@ -0,0 +1,14 @@ +// #docregion +class PhoneListCtrl { + phones:any[]; + orderProp:string; + query:string; + constructor(Phone) { + this.phones = Phone.query(); + this.orderProp = 'age'; + } +} + +PhoneListCtrl.$inject = ['Phone']; + +export default PhoneListCtrl; diff --git a/public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.html b/public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.html new file mode 100644 index 0000000000..471f474e89 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.html @@ -0,0 +1,28 @@ +
+
+
+ + + Search: + Sort by: + + +
+
+ + + + +
+
+
diff --git a/public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.module.ts b/public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.module.ts new file mode 100644 index 0000000000..758b937927 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/app/js/phone_list/phone_list.module.ts @@ -0,0 +1,5 @@ +// #docregion +import PhoneListCtrl from './phone_list.controller'; + +export default angular.module('phonecat.list', ['phonecat.core']) + .controller('PhoneListCtrl', PhoneListCtrl); diff --git a/public/docs/_examples/upgrade/ts/classes/bower.json b/public/docs/_examples/upgrade/ts/classes/bower.json new file mode 100644 index 0000000000..03c0d72ea4 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/bower.json @@ -0,0 +1,20 @@ +{ + "name": "angular-phonecat", + "description": "A starter project for AngularJS", + "version": "0.0.0", + "homepage": "https://github.com/angular/angular-phonecat", + "license": "MIT", + "private": true, + "dependencies": { + "angular": "1.5.0-beta.2", + "angular-mocks": "1.5.0-beta.2", + "jquery": "~2.1.1", + "bootstrap": "~3.1.1", + "angular-route": "1.5.0-beta.2", + "angular-resource": "1.5.0-beta.2", + "angular-animate": "1.5.0-beta.2" + }, + "resolutions": { + "angular": "1.5.0-beta.2" + } +} diff --git a/public/docs/_examples/upgrade/ts/classes/test/e2e/scenarios.ts b/public/docs/_examples/upgrade/ts/classes/test/e2e/scenarios.ts new file mode 100644 index 0000000000..4cdbefc047 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/test/e2e/scenarios.ts @@ -0,0 +1,103 @@ +'use strict'; + +/* http://docs.angularjs.org/guide/dev_guide.e2e-testing */ +// #docregion declares +declare var browser:any, element:any, by:any; +// #enddocregion declares + +describe('PhoneCat App', function() { + + it('should redirect index.html to index.html#/phones', function() { + browser.get('app/index.html'); + browser.getLocationAbsUrl().then(function(url) { + expect(url).toEqual('/phones'); + }); + }); + + + describe('Phone list view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones'); + }); + + + it('should filter the phone list as a user types into the search box', function() { + var phoneList = element.all(by.repeater('phone in vm.phones')); + var query = element(by.model('vm.query')); + + expect(phoneList.count()).toBe(20); + + query.sendKeys('nexus'); + expect(phoneList.count()).toBe(1); + + query.clear(); + query.sendKeys('motorola'); + expect(phoneList.count()).toBe(8); + }); + + + it('should be possible to control phone order via the drop down select box', function() { + + var phoneNameColumn = element.all(by.repeater('phone in vm.phones').column('phone.name')); + var query = element(by.model('vm.query')); + + function getNames() { + return phoneNameColumn.map(function(elm) { + return elm.getText(); + }); + } + + query.sendKeys('tablet'); //let's narrow the dataset to make the test assertions shorter + + expect(getNames()).toEqual([ + "Motorola XOOM\u2122 with Wi-Fi", + "MOTOROLA XOOM\u2122" + ]); + + element(by.model('vm.orderProp')).element(by.css('option[value="name"]')).click(); + + expect(getNames()).toEqual([ + "MOTOROLA XOOM\u2122", + "Motorola XOOM\u2122 with Wi-Fi" + ]); + }); + + + it('should render phone specific links', function() { + var query = element(by.model('vm.query')); + query.sendKeys('nexus'); + element.all(by.css('.phones li a')).first().click(); + browser.getLocationAbsUrl().then(function(url) { + expect(url).toEqual('/phones/nexus-s'); + }); + }); + }); + + + describe('Phone detail view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones/nexus-s'); + }); + + + it('should display nexus-s page', function() { + expect(element(by.binding('vm.phone.name')).getText()).toBe('Nexus S'); + }); + + + it('should display the first phone image as the main phone image', function() { + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + + + it('should swap main image if a thumbnail image is clicked on', function() { + element(by.css('.phone-thumbs li:nth-child(3) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.2.jpg/); + + element(by.css('.phone-thumbs li:nth-child(1) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + }); +}); diff --git a/public/docs/_examples/upgrade/ts/classes/test/jasmine_matchers.d.ts b/public/docs/_examples/upgrade/ts/classes/test/jasmine_matchers.d.ts new file mode 100644 index 0000000000..6d24879775 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/test/jasmine_matchers.d.ts @@ -0,0 +1,6 @@ +// #docregion +declare module jasmine { + interface Matchers { + toEqualData(expected: any):boolean; + } +} diff --git a/public/docs/_examples/upgrade/ts/classes/test/karma_test_shim.js b/public/docs/_examples/upgrade/ts/classes/test/karma_test_shim.js new file mode 100644 index 0000000000..15cbee5d7d --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/test/karma_test_shim.js @@ -0,0 +1,44 @@ +// #docregion +// Cancel Karma's synchronous start, +// we will call `__karma__.start()` later, once all the specs are loaded. +__karma__.loaded = function() {}; + +System.config({ + packages: { + 'base/app/js': { + defaultExtension: false, + format: 'register', + map: Object.keys(window.__karma__.files). + filter(onlyAppFiles). + reduce(function createPathRecords(pathsMapping, appPath) { + // creates local module name mapping to global path with karma's fingerprint in path, e.g.: + // './hero.service': '/base/src/app/hero.service.js?f4523daf879cfb7310ef6242682ccf10b2041b3e' + var moduleName = appPath.replace(/^\/base\/app\/js\//, './').replace(/\.js$/, ''); + pathsMapping[moduleName] = appPath + '?' + window.__karma__.files[appPath] + return pathsMapping; + }, {}) + + } + } +}); + +Promise.all( + Object.keys(window.__karma__.files) // All files served by Karma. + .filter(onlySpecFiles) + .map(function(moduleName) { + // loads all spec files via their global module names + return System.import(moduleName); +})) +.then(function() { + __karma__.start(); +}, function(error) { + __karma__.error(error.stack || error); +}); + +function onlyAppFiles(filePath) { + return /^\/base\/app\/js\/.*\.js$/.test(filePath) +} + +function onlySpecFiles(path) { + return /\.spec\.js$/.test(path); +} diff --git a/public/docs/_examples/upgrade/ts/classes/test/protractor-conf.js b/public/docs/_examples/upgrade/ts/classes/test/protractor-conf.js new file mode 100644 index 0000000000..118c7b9ec2 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/test/protractor-conf.js @@ -0,0 +1,21 @@ +exports.config = { + allScriptsTimeout: 11000, + + specs: [ + 'e2e/*.js' + ], + + capabilities: { + 'browserName': 'chrome' + }, + + chromeOnly: true, + + baseUrl: 'http://localhost:8000/', + + framework: 'jasmine', + + jasmineNodeOpts: { + defaultTimeoutInterval: 30000 + } +}; diff --git a/public/docs/_examples/upgrade/ts/classes/test/test_helper.ts b/public/docs/_examples/upgrade/ts/classes/test/test_helper.ts new file mode 100644 index 0000000000..75f83fab7a --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/test/test_helper.ts @@ -0,0 +1,3 @@ +// #docregion +/// +/// diff --git a/public/docs/_examples/upgrade/ts/classes/test/unit/checkmark.filter.spec.ts b/public/docs/_examples/upgrade/ts/classes/test/unit/checkmark.filter.spec.ts new file mode 100644 index 0000000000..bae35e6875 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/test/unit/checkmark.filter.spec.ts @@ -0,0 +1,15 @@ +// #docregion top +import '../../app/js/core/core.module'; +// #enddocregion top + +describe('checkmarkFilter', function() { + + beforeEach(angular.mock.module('phonecat.core')); + + it('should convert boolean values to unicode checkmark or cross', + inject(function(checkmarkFilter) { + expect(checkmarkFilter(true)).toBe('\u2713'); + expect(checkmarkFilter(false)).toBe('\u2718'); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/classes/test/unit/phone.factory.spec.ts b/public/docs/_examples/upgrade/ts/classes/test/unit/phone.factory.spec.ts new file mode 100644 index 0000000000..d7c95d347e --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/test/unit/phone.factory.spec.ts @@ -0,0 +1,15 @@ +// #docregion top +import '../../app/js/core/core.module'; +// #enddocregion top + +describe('phoneFactory', function() { + + // load modules + beforeEach(angular.mock.module('phonecat.core')); + + // Test service availability + it('check the existence of Phone factory', inject(function(Phone) { + expect(Phone).toBeDefined(); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/classes/test/unit/phone_detail.controller.spec.ts b/public/docs/_examples/upgrade/ts/classes/test/unit/phone_detail.controller.spec.ts new file mode 100644 index 0000000000..02a3e20240 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/test/unit/phone_detail.controller.spec.ts @@ -0,0 +1,44 @@ +// #docregion top +import '../../app/js/phone_detail/phone_detail.module'; +// #enddocregion top + +describe('PhoneDetailCtrl', function(){ + var scope, $httpBackend, ctrl, + xyzPhoneData = function() { + return { + name: 'phone xyz', + images: ['image/url1.png', 'image/url2.png'] + } + }; + + beforeEach(angular.mock.module('phonecat.detail')); + + beforeEach(function(){ + jasmine.addMatchers({ + toEqualData: function(util, customEqualityTesters) { + return { + compare: function(actual, expected) { + return {pass: angular.equals(actual, expected)}; + } + }; + } + }); + }); + + beforeEach(inject(function(_$httpBackend_, $rootScope, $routeParams, $controller) { + $httpBackend = _$httpBackend_; + $httpBackend.expectGET('phones/xyz.json').respond(xyzPhoneData()); + + $routeParams.phoneId = 'xyz'; + scope = $rootScope.$new(); + ctrl = $controller('PhoneDetailCtrl', {$scope: scope}); + })); + + + it('should fetch phone detail', function() { + expect(ctrl.phone).toEqualData({}); + $httpBackend.flush(); + + expect(ctrl.phone).toEqualData(xyzPhoneData()); + }); +}); diff --git a/public/docs/_examples/upgrade/ts/classes/test/unit/phone_list.controller.spec.ts b/public/docs/_examples/upgrade/ts/classes/test/unit/phone_list.controller.spec.ts new file mode 100644 index 0000000000..efec5d5f08 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/classes/test/unit/phone_list.controller.spec.ts @@ -0,0 +1,44 @@ +// #docregion top +import '../../app/js/phone_list/phone_list.module'; +// #enddocregion top + +describe('PhoneListCtrl', function(){ + var scope, ctrl, $httpBackend; + + beforeEach(angular.mock.module('phonecat.list')); + + beforeEach(function(){ + jasmine.addMatchers({ + toEqualData: function(util, customEqualityTesters) { + return { + compare: function(actual, expected) { + return {pass: angular.equals(actual, expected)}; + } + }; + } + }); + }); + + beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) { + $httpBackend = _$httpBackend_; + $httpBackend.expectGET('phones/phones.json'). + respond([{name: 'Nexus S'}, {name: 'Motorola DROID'}]); + + scope = $rootScope.$new(); + ctrl = $controller('PhoneListCtrl', {$scope: scope}); + })); + + + it('should create "phones" model with 2 phones fetched from xhr', function() { + expect(ctrl.phones).toEqualData([]); + $httpBackend.flush(); + + expect(ctrl.phones).toEqualData( + [{name: 'Nexus S'}, {name: 'Motorola DROID'}]); + }); + + + it('should set the default value of orderProp model', function() { + expect(ctrl.orderProp).toBe('age'); + }); +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_components/.bowerrc b/public/docs/_examples/upgrade/ts/ng2_components/.bowerrc new file mode 100644 index 0000000000..5773025bf9 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "app/bower_components" +} diff --git a/public/docs/_examples/upgrade/ts/ng2_components/.gitignore b/public/docs/_examples/upgrade/ts/ng2_components/.gitignore new file mode 100644 index 0000000000..8cfe0da551 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/.gitignore @@ -0,0 +1,6 @@ +app/**/*.js +app/**/*.js.map +test/unit/**/*.js +test/unit/**/*.js.map +test/e2e/**/*.js +test/e2e/**/*.js.map diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/css/.gitkeep b/public/docs/_examples/upgrade/ts/ng2_components/app/css/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/css/animations.css b/public/docs/_examples/upgrade/ts/ng2_components/app/css/animations.css new file mode 100644 index 0000000000..46f3da6ecb --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/css/animations.css @@ -0,0 +1,97 @@ +/* + * animations css stylesheet + */ + +/* animate ngRepeat in phone listing */ + +.phone-listing.ng-enter, +.phone-listing.ng-leave, +.phone-listing.ng-move { + -webkit-transition: 0.5s linear all; + -moz-transition: 0.5s linear all; + -o-transition: 0.5s linear all; + transition: 0.5s linear all; +} + +.phone-listing.ng-enter, +.phone-listing.ng-move { + opacity: 0; + height: 0; + overflow: hidden; +} + +.phone-listing.ng-move.ng-move-active, +.phone-listing.ng-enter.ng-enter-active { + opacity: 1; + height: 120px; +} + +.phone-listing.ng-leave { + opacity: 1; + overflow: hidden; +} + +.phone-listing.ng-leave.ng-leave-active { + opacity: 0; + height: 0; + padding-top: 0; + padding-bottom: 0; +} + +/* cross fading between routes with ngView */ + +.view-container { + position: relative; +} + +.view-frame.ng-enter, +.view-frame.ng-leave { + background: white; + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.view-frame.ng-enter { + -webkit-animation: 0.5s fade-in; + -moz-animation: 0.5s fade-in; + -o-animation: 0.5s fade-in; + animation: 0.5s fade-in; + z-index: 100; +} + +.view-frame.ng-leave { + -webkit-animation: 0.5s fade-out; + -moz-animation: 0.5s fade-out; + -o-animation: 0.5s fade-out; + animation: 0.5s fade-out; + z-index: 99; +} + +@keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +@-moz-keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +@-webkit-keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} +@-moz-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} +@-webkit-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} + diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/css/app.css b/public/docs/_examples/upgrade/ts/ng2_components/app/css/app.css new file mode 100644 index 0000000000..f41c420776 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/css/app.css @@ -0,0 +1,99 @@ +/* app css stylesheet */ + +body { + padding-top: 20px; +} + + +.phone-images { + background-color: white; + width: 450px; + height: 450px; + overflow: hidden; + position: relative; + float: left; +} + +.phones { + list-style: none; +} + +.thumb { + float: left; + margin: -0.5em 1em 1.5em 0; + padding-bottom: 1em; + height: 100px; + width: 100px; +} + +.phones li { + clear: both; + height: 115px; + padding-top: 15px; +} + +/** Detail View **/ +img.phone { + float: left; + margin-right: 3em; + margin-bottom: 2em; + background-color: white; + padding: 2em; + height: 400px; + width: 400px; + display: none; +} + +img.phone:first-of-type { + display: block; +} + + +ul.phone-thumbs { + margin: 0; + list-style: none; +} + +ul.phone-thumbs li { + border: 1px solid black; + display: inline-block; + margin: 1em; + background-color: white; +} + +ul.phone-thumbs img { + height: 100px; + width: 100px; + padding: 1em; +} + +ul.phone-thumbs img:hover { + cursor: pointer; +} + + +ul.specs { + clear: both; + margin: 0; + padding: 0; + list-style: none; +} + +ul.specs > li{ + display: inline-block; + width: 200px; + vertical-align: top; +} + +ul.specs > li > span{ + font-weight: bold; + font-size: 1.2em; +} + +ul.specs dt { + font-weight: bold; +} + +h1 { + border-bottom: 1px solid gray; +} diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/img/.gitkeep b/public/docs/_examples/upgrade/ts/ng2_components/app/img/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/img/glyphicons-halflings-white.png b/public/docs/_examples/upgrade/ts/ng2_components/app/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/img/glyphicons-halflings.png b/public/docs/_examples/upgrade/ts/ng2_components/app/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..5b67ffda5ff5caa7f1dfeb119f9f35830fb7a789 GIT binary patch literal 12601 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 NM|m~5DjCz@{|hh;;@|)P literal 0 HcmV?d00001 diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/index.html b/public/docs/_examples/upgrade/ts/ng2_components/app/index.html new file mode 100644 index 0000000000..be97a6cfe2 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/index.html @@ -0,0 +1,41 @@ + + + + + Google Phone Gallery + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/app.module.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/app.module.ts new file mode 100644 index 0000000000..c421e8123e --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/app.module.ts @@ -0,0 +1,50 @@ +/// +/// +/// + +// #docregion adapter-import +import {UpgradeAdapter} from 'angular2/upgrade'; +// #enddocregion adapter-import +// #docregion adapter-state-import +import upgradeAdapter from './core/upgrade_adapter'; +// #enddocregion adapter-state-import +// #docregion http-import +import {HTTP_PROVIDERS} from 'angular2/http'; +// #enddocregion http-import +import core from './core/core.module'; +import phoneList from './phone_list/phone_list.module'; +import phoneDetail from './phone_detail/phone_detail.module'; + +upgradeAdapter.addProvider(HTTP_PROVIDERS); +// #docregion upgrade-route-params +upgradeAdapter.upgradeNg1Provider('$routeParams'); +// #enddocregion +angular.module('phonecatApp', [ + 'ngRoute', + core.name, + phoneList.name, + phoneDetail.name +]).config(configure); + +configure.$inject = ['$routeProvider']; + +function configure($routeProvider) { + // #docregion list-route + $routeProvider. + when('/phones', { + template: '' + }). + // #enddocregion list-route + // #docregion detail-route + when('/phones/:phoneId', { + template: '' + }). + // #enddocregion detail-route + otherwise({ + redirectTo: '/phones' + }); +} + +// #docregion app-bootstrap +upgradeAdapter.bootstrap(document.documentElement, ['phonecatApp']); +// #enddocregion app-bootstrap diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/CheckmarkPipe.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/CheckmarkPipe.ts new file mode 100644 index 0000000000..5156f14b50 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/CheckmarkPipe.ts @@ -0,0 +1,9 @@ +// #docregion +import {Pipe} from 'angular2/core'; + +@Pipe({name: 'checkmark'}) +export class CheckmarkPipe { + transform(input:string): string { + return input ? '\u2713' : '\u2718'; + } +} diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/Phones.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/Phones.ts new file mode 100644 index 0000000000..8186c4810c --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/Phones.ts @@ -0,0 +1,37 @@ +// #docregion full +import {Injectable} from 'angular2/core'; +import {Http, Response} from 'angular2/http'; +import {Observable} from 'rxjs'; +import 'rxjs/add/operator/map'; + +// #docregion phone-interface +export interface Phone { + name: string; + snippet: string; + images: string[]; +} +// #enddocregion phone-interface + +// #docregion fullclass +// #docregion class +@Injectable() +export class Phones { +// #enddocregion class + + constructor(private http: Http) { } + + query():Observable { + return this.http.get(`phones/phones.json`) + .map((res:Response) => res.json()); + } + + get(id: string):Observable { + return this.http.get(`phones/${id}.json`) + .map((res:Response) => res.json()); + } + +// #docregion class +} +// #enddocregion class +// #enddocregion fullclass +// #docregion full diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/core.module.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/core.module.ts new file mode 100644 index 0000000000..8faf35f705 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/core.module.ts @@ -0,0 +1,8 @@ +// #docregion +import {Phones} from './Phones'; +import upgradeAdapter from './upgrade_adapter'; + +upgradeAdapter.addProvider(Phones); + +export default angular.module('phonecat.core', []) + .factory('phones', upgradeAdapter.downgradeNg2Provider(Phones)); diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/upgrade_adapter.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/upgrade_adapter.ts new file mode 100644 index 0000000000..e21be0e4d8 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/core/upgrade_adapter.ts @@ -0,0 +1,9 @@ +// #docregion full +import {UpgradeAdapter} from 'angular2/upgrade'; + +// #docregion adapter-init +const upgradeAdapter = new UpgradeAdapter(); +// #enddocregion adapter-init + +export default upgradeAdapter; +// #enddocregion full diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/PhoneDetail.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/PhoneDetail.ts new file mode 100644 index 0000000000..ea2876ba10 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/PhoneDetail.ts @@ -0,0 +1,33 @@ +// #docregion +// #docregion top +import {Component, Inject} from 'angular2/core'; +import {Phones, Phone} from '../core/Phones'; +import {CheckmarkPipe} from '../core/CheckmarkPipe'; + +interface PhoneRouteParams { + phoneId: string +} + +@Component({ + selector: 'pc-phone-detail', + templateUrl: 'js/phone_detail/phone_detail.html', + pipes: [CheckmarkPipe] +}) +class PhoneDetail { +// #enddocregion top + phone:Phone = undefined; + mainImageUrl:string; + constructor(@Inject('$routeParams') $routeParams:PhoneRouteParams, + phones:Phones) { + phones.get($routeParams.phoneId) + .subscribe(phone => { + this.phone = phone; + this.mainImageUrl = phone.images[0]; + }); + } + + setImage(url:string) { + this.mainImageUrl = url; + } +} +export default PhoneDetail; diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/PhoneDetail_without_pipes.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/PhoneDetail_without_pipes.ts new file mode 100644 index 0000000000..ca7bc1c0d2 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/PhoneDetail_without_pipes.ts @@ -0,0 +1,29 @@ +// #docregion +import {Component, Inject} from 'angular2/core'; +import {Phones, Phone} from '../core/Phones'; + +interface PhoneRouteParams { + phoneId: string +} + +@Component({ + selector: 'pc-phone-detail', + templateUrl: 'js/phone_detail/phone_detail.html' +}) +class PhoneDetail { + phone:Phone = undefined; + mainImageUrl:string; + constructor(@Inject('$routeParams') $routeParams:PhoneRouteParams, + phones:Phones) { + phones.get($routeParams.phoneId) + .subscribe(phone => { + this.phone = phone; + this.mainImageUrl = phone.images[0]; + }); + } + + setImage(url:string) { + this.mainImageUrl = url; + } +} +export default PhoneDetail; diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/phone_detail.html b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/phone_detail.html new file mode 100644 index 0000000000..51cc10aad5 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/phone_detail.html @@ -0,0 +1,115 @@ + +
+ +
+

{{phone?.name}}

+

{{phone?.description}}

+
    +
  • + +
  • +
+
    +
  • + Availability and Networks +
    +
    Availability
    +
    {{availability}}
    +
    +
  • +
  • + Battery +
    +
    Type
    +
    {{phone?.battery?.type}}
    +
    Talk Time
    +
    {{phone?.battery?.talkTime}}
    +
    Standby time (max)
    +
    {{phone?.battery?.standbyTime}}
    +
    +
  • +
  • + Storage and Memory +
    +
    RAM
    +
    {{phone?.storage?.ram}}
    +
    Internal Storage
    +
    {{phone?.storage?.flash}}
    +
    +
  • +
  • + Connectivity +
    +
    Network Support
    +
    {{phone?.connectivity?.cell}}
    +
    WiFi
    +
    {{phone?.connectivity?.wifi}}
    +
    Bluetooth
    +
    {{phone?.connectivity?.bluetooth}}
    +
    Infrared
    +
    {{phone?.connectivity?.infrared | checkmark}}
    +
    GPS
    +
    {{phone?.connectivity?.gps | checkmark}}
    +
    +
  • +
  • + Android +
    +
    OS Version
    +
    {{phone?.android?.os}}
    +
    UI
    +
    {{phone?.android?.ui}}
    +
    +
  • +
  • + Size and Weight +
    +
    Dimensions
    +
    {{dim}}
    +
    Weight
    +
    {{phone?.sizeAndWeight?.weight}}
    +
    +
  • +
  • + Display +
    +
    Screen size
    +
    {{phone?.display?.screenSize}}
    +
    Screen resolution
    +
    {{phone?.display?.screenResolution}}
    +
    Touch screen
    +
    {{phone?.display?.touchScreen | checkmark}}
    +
    +
  • +
  • + Hardware +
    +
    CPU
    +
    {{phone?.hardware?.cpu}}
    +
    USB
    +
    {{phone?.hardware?.usb}}
    +
    Audio / headphone jack
    +
    {{phone?.hardware?.audioJack}}
    +
    FM Radio
    +
    {{phone?.hardware?.fmRadio | checkmark}}
    +
    Accelerometer
    +
    {{phone?.hardware?.accelerometer | checkmark}}
    +
    +
  • +
  • + Camera +
    +
    Primary
    +
    {{phone?.camera?.primary}}
    +
    Features
    +
    {{phone?.camera?.features?.join(', ')}}
    +
    +
  • +
  • + Additional Features +
    {{phone?.additionalFeatures}}
    +
  • +
diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/phone_detail.module.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/phone_detail.module.ts new file mode 100644 index 0000000000..3ae85d8d51 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_detail/phone_detail.module.ts @@ -0,0 +1,10 @@ +// #docregion +import PhoneDetail from './PhoneDetail'; +import upgradeAdapter from '../core/upgrade_adapter'; + +export default angular.module('phonecat.detail', [ + 'ngRoute', + 'phonecat.core' + ]) + .directive('pcPhoneDetail', + upgradeAdapter.downgradeNg2Component(PhoneDetail)) diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/OrderByPipe.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/OrderByPipe.ts new file mode 100644 index 0000000000..3b82f03c9b --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/OrderByPipe.ts @@ -0,0 +1,24 @@ +// #docregion +import {Pipe} from 'angular2/core'; + +@Pipe({name: 'orderBy'}) +export default class OrderByPipe { + + transform(input:T[], args:string[]): T[] { + if (input) { + let property = args[0]; + return input.slice().sort((a, b) => { + if (a[property] < b[property]) { + return -1; + } else if (b[property] < a[property]) { + return 1; + } else { + return 0; + } + }); + } else { + return input; + } + } + +} diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneFilterPipe.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneFilterPipe.ts new file mode 100644 index 0000000000..cca575ece2 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneFilterPipe.ts @@ -0,0 +1,22 @@ +// #docregion +import {Pipe} from 'angular2/core'; +import {Phone} from '../core/Phones'; + +@Pipe({name: 'phoneFilter'}) +export default class PhoneFilterPipe { + + transform(input:Phone[], args:string[]): Phone[] { + let query = args[0]; + if (query) { + query = query.toLowerCase(); + return input.filter((phone) => { + const name = phone.name.toLowerCase(); + const snippet = phone.snippet.toLowerCase(); + return name.indexOf(query) >= 0 || snippet.indexOf(query) >= 0; + }); + } else { + return input; + } + } + +} diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneList.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneList.ts new file mode 100644 index 0000000000..cc83468d4d --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneList.ts @@ -0,0 +1,26 @@ +// #docregion full +// #docregion top +import {Component} from 'angular2/core'; +import {Observable} from 'rxjs'; +import {Phones, Phone} from '../core/Phones'; +import PhoneFilterPipe from './PhoneFilterPipe'; +import OrderByPipe from './OrderByPipe'; + +@Component({ + selector: 'pc-phone-list', + templateUrl: 'js/phone_list/phone_list.html', + pipes: [PhoneFilterPipe, OrderByPipe], +}) +class PhoneList { +// #enddocregion top + + phones:Observable; + orderProp:string; + query:string; + constructor(phones:Phones) { + this.phones = phones.query(); + this.orderProp = 'age'; + } +} + +export default PhoneList; diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneList_without_pipes.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneList_without_pipes.ts new file mode 100644 index 0000000000..ec9dc0d9db --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/PhoneList_without_pipes.ts @@ -0,0 +1,22 @@ +// #docregion top +import {Component} from 'angular2/core'; +import {Observable} from 'rxjs'; +import {Phones, Phone} from '../core/Phones'; + +@Component({ + selector: 'pc-phone-list', + templateUrl: 'js/phone_list/phone_list.html' +}) +class PhoneList { +// #enddocregion top + + phones:Observable; + orderProp:string; + query:string; + constructor(phones:Phones) { + this.phones = phones.query(); + this.orderProp = 'age'; + } +} + +export default PhoneList; diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list.html b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list.html new file mode 100644 index 0000000000..71b84a9e88 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list.html @@ -0,0 +1,32 @@ +
+
+
+ + + + Search: + Sort by: + + + +
+
+ + + + + + +
+
+
diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list.module.ts b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list.module.ts new file mode 100644 index 0000000000..f3a0de081d --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list.module.ts @@ -0,0 +1,9 @@ +// #docregion +import PhoneList from './PhoneList'; +import upgradeAdapter from '../core/upgrade_adapter'; + +export default angular.module('phonecat.list', [ + 'phonecat.core' + ]) + .directive('pcPhoneList', + upgradeAdapter.downgradeNg2Component(PhoneList)); diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list_without_async.html b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list_without_async.html new file mode 100644 index 0000000000..ac9f18d67d --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list_without_async.html @@ -0,0 +1,32 @@ +
+
+
+ + + + Search: + Sort by: + + + +
+
+ + + + + + +
+
+
diff --git a/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list_without_pipes.html b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list_without_pipes.html new file mode 100644 index 0000000000..a19d9a5455 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/app/js/phone_list/phone_list_without_pipes.html @@ -0,0 +1,32 @@ +
+
+
+ + + + Search: + Sort by: + + + +
+
+ + + + + + +
+
+
diff --git a/public/docs/_examples/upgrade/ts/ng2_components/bower.json b/public/docs/_examples/upgrade/ts/ng2_components/bower.json new file mode 100644 index 0000000000..03c0d72ea4 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/bower.json @@ -0,0 +1,20 @@ +{ + "name": "angular-phonecat", + "description": "A starter project for AngularJS", + "version": "0.0.0", + "homepage": "https://github.com/angular/angular-phonecat", + "license": "MIT", + "private": true, + "dependencies": { + "angular": "1.5.0-beta.2", + "angular-mocks": "1.5.0-beta.2", + "jquery": "~2.1.1", + "bootstrap": "~3.1.1", + "angular-route": "1.5.0-beta.2", + "angular-resource": "1.5.0-beta.2", + "angular-animate": "1.5.0-beta.2" + }, + "resolutions": { + "angular": "1.5.0-beta.2" + } +} diff --git a/public/docs/_examples/upgrade/ts/ng2_components/test/e2e/scenarios.ts b/public/docs/_examples/upgrade/ts/ng2_components/test/e2e/scenarios.ts new file mode 100644 index 0000000000..7f443cfd84 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/test/e2e/scenarios.ts @@ -0,0 +1,112 @@ +'use strict'; + +/* http://docs.angularjs.org/guide/dev_guide.e2e-testing */ + +describe('PhoneCat App', function() { + + it('should redirect index.html to index.html#/phones', function() { + browser.get('app/index.html'); + browser.getLocationAbsUrl().then(function(url) { + expect(url).toEqual('/phones'); + }); + }); + + + describe('Phone list view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones'); + }); + + it('should filter the phone list as a user types into the search box', function() { + var phoneList = element.all(by.css('.phones li')); + var query = element(by.css('input')); + + expect(phoneList.count()).toBe(20); + + query.sendKeys('nexus'); + expect(phoneList.count()).toBe(1); + + query.clear(); + // https://github.com/angular/protractor/issues/2019 + let str = 'motorola'; + for (let i:number = 0; i < str.length; i++) { + query.sendKeys(str.charAt(i)); + } + + expect(phoneList.count()).toBe(8); + }); + + + it('should be possible to control phone order via the drop down select box', function() { + var phoneNameColumn = element.all(by.css('.phones .name')); + var query = element(by.css('input')); + + function getNames() { + return phoneNameColumn.map(function(elm) { + return elm.getText(); + }); + } + + //let's narrow the dataset to make the test assertions shorter + // https://github.com/angular/protractor/issues/2019 + let str = 'tablet'; + for (let i:number = 0; i < str.length; i++) { + query.sendKeys(str.charAt(i)); + } + + expect(getNames()).toEqual([ + "Motorola XOOM\u2122 with Wi-Fi", + "MOTOROLA XOOM\u2122" + ]); + + element(by.css('select')).element(by.css('option[value="name"]')).click(); + + expect(getNames()).toEqual([ + "MOTOROLA XOOM\u2122", + "Motorola XOOM\u2122 with Wi-Fi" + ]); + }); + + + it('should render phone specific links', function() { + var query = element(by.css('input')); + // https://github.com/angular/protractor/issues/2019 + let str = 'nexus'; + for (let i:number = 0; i < str.length; i++) { + query.sendKeys(str.charAt(i)); + } + element.all(by.css('.phones li a')).first().click(); + browser.getLocationAbsUrl().then(function(url) { + expect(url).toEqual('/phones/nexus-s'); + }); + }); + }); + + + describe('Phone detail view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones/nexus-s'); + }); + + + it('should display nexus-s page', function() { + expect(element(by.css('h1')).getText()).toBe('Nexus S'); + }); + + + it('should display the first phone image as the main phone image', function() { + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + + + it('should swap main image if a thumbnail image is clicked on', function() { + element(by.css('.phone-thumbs li:nth-of-type(3) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.2.jpg/); + + element(by.css('.phone-thumbs li:nth-of-type(1) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + }); +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_components/test/karma_test_shim.js b/public/docs/_examples/upgrade/ts/ng2_components/test/karma_test_shim.js new file mode 100644 index 0000000000..43c3d123ee --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/test/karma_test_shim.js @@ -0,0 +1,54 @@ +// #docregion +// Cancel Karma's synchronous start, +// we will call `__karma__.start()` later, once all the specs are loaded. +__karma__.loaded = function() {}; + +System.config({ + packages: { + 'base/app/js': { + defaultExtension: false, + format: 'register', + map: Object.keys(window.__karma__.files). + filter(onlyAppFiles). + reduce(function createPathRecords(pathsMapping, appPath) { + // creates local module name mapping to global path with karma's fingerprint in path, e.g.: + // './hero.service': '/base/src/app/hero.service.js?f4523daf879cfb7310ef6242682ccf10b2041b3e' + var moduleName = appPath.replace(/^\/base\/app\/js\//, './').replace(/\.js$/, ''); + pathsMapping[moduleName] = appPath + '?' + window.__karma__.files[appPath] + return pathsMapping; + }, {}) + }, + 'rxjs': { + defaultExtension: 'js' + } + }, + map: { + 'rxjs' : '/base/node_modules/rxjs' + } +}); + +// #docregion ng2 +System.import('angular2/src/platform/browser/browser_adapter').then(function(browser_adapter) { + browser_adapter.BrowserDomAdapter.makeCurrent(); +}).then(function() { + return Promise.all( + Object.keys(window.__karma__.files) // All files served by Karma. + .filter(onlySpecFiles) + .map(function(moduleName) { + // loads all spec files via their global module names + return System.import(moduleName); + })); +}).then(function() { + __karma__.start(); +}, function(error) { + __karma__.error(error.stack || error); +}); +// #enddocregion ng2 + +function onlyAppFiles(filePath) { + return /^\/base\/app\/js\/.*\.js$/.test(filePath) +} + +function onlySpecFiles(path) { + return /\.spec\.js$/.test(path); +} diff --git a/public/docs/_examples/upgrade/ts/ng2_components/test/protractor-conf.js b/public/docs/_examples/upgrade/ts/ng2_components/test/protractor-conf.js new file mode 100644 index 0000000000..490e9bd078 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/test/protractor-conf.js @@ -0,0 +1,21 @@ +exports.config = { + allScriptsTimeout: 11000, + + specs: [ + 'e2e/*.js' + ], + + capabilities: { + 'browserName': 'chrome' + }, + + directConnect: true, + + baseUrl: 'http://localhost:8000/', + + framework: 'jasmine', + + jasmineNodeOpts: { + defaultTimeoutInterval: 30000 + } +}; diff --git a/public/docs/_examples/upgrade/ts/ng2_components/test/test_helper.ts b/public/docs/_examples/upgrade/ts/ng2_components/test/test_helper.ts new file mode 100644 index 0000000000..dca9476b5e --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/test/test_helper.ts @@ -0,0 +1,2 @@ +// #docregion +/// diff --git a/public/docs/_examples/upgrade/ts/ng2_components/test/unit/CheckmarkPipe.spec.ts b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/CheckmarkPipe.spec.ts new file mode 100644 index 0000000000..9d5b92f6e0 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/CheckmarkPipe.spec.ts @@ -0,0 +1,15 @@ +// #docregion +import {describe, beforeEachProviders, it, inject, expect} from 'angular2/testing'; +import {CheckmarkPipe} from '../../app/js/core/CheckmarkPipe'; + +describe('CheckmarkPipe', function() { + + beforeEachProviders(() => [CheckmarkPipe]); + + it('should convert boolean values to unicode checkmark or cross', + inject([CheckmarkPipe], (checkmarkPipe) => { + expect(checkmarkPipe.transform(true)).toBe('\u2713'); + expect(checkmarkPipe.transform(false)).toBe('\u2718'); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_components/test/unit/OrderByPipe.spec.ts b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/OrderByPipe.spec.ts new file mode 100644 index 0000000000..737ad10b82 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/OrderByPipe.spec.ts @@ -0,0 +1,19 @@ +// #docregion +import {describe, beforeEachProviders, it, inject} from 'angular2/testing'; + +import OrderByPipe from '../../app/js/phone_list/OrderByPipe'; + +describe('OrderByPipe', function() { + + let input:any[] = [ + {name: 'Nexus S', snippet: 'The Nexus S Phone', images: []}, + {name: 'Motorola DROID', snippet: 'An Android-for-business smartphone', images: []} + ]; + + beforeEachProviders(() => [OrderByPipe]); + + it('should order by the given property', inject([OrderByPipe], (orderByPipe) => { + expect(orderByPipe.transform(input, ['name'])).toEqual([input[1], input[0]]); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneDetail.spec.ts b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneDetail.spec.ts new file mode 100644 index 0000000000..4775c5fdd5 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneDetail.spec.ts @@ -0,0 +1,49 @@ +// #docregion +import {provide} from 'angular2/core'; +import {HTTP_PROVIDERS} from 'angular2/http'; +import {Observable} from 'rxjs'; +import {FromObservable} from 'rxjs/observable/from'; + +import { + describe, + beforeEachProviders, + injectAsync, + it, + expect, + TestComponentBuilder +} from 'angular2/testing'; +import PhoneDetail from '../../app/js/phone_detail/PhoneDetail'; +import {Phones, Phone} from '../../app/js/core/Phones'; + +function xyzPhoneData():Phone { + return { + name: 'phone xyz', + snippet: '', + images: ['image/url1.png', 'image/url2.png'] + } +} + +class MockPhones extends Phones { + get(id):Observable { + return FromObservable.create([xyzPhoneData()]); + } +} + +describe('PhoneDetail', function(){ + + beforeEachProviders(() => [ + provide(Phones, {useClass: MockPhones}), + provide('$routeParams', {useValue: {phoneId: 'xyz'}}), + HTTP_PROVIDERS + ]); + + it('should fetch phone detail', injectAsync([TestComponentBuilder], (tcb) => { + return tcb.createAsync(PhoneDetail).then((fixture) => { + fixture.detectChanges(); + let compiled = fixture.debugElement.nativeElement; + + expect(compiled.querySelector('.h1')).toHaveText(xyzPhoneData().name); + }); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneFilterPipe.spec.ts b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneFilterPipe.spec.ts new file mode 100644 index 0000000000..73e1772201 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneFilterPipe.spec.ts @@ -0,0 +1,28 @@ +// #docregion +import {describe, beforeEachProviders, it, inject} from 'angular2/testing'; + +import PhoneFilterPipe from '../../app/js/phone_list/PhoneFilterPipe'; +import {Phone} from '../../app/js/core/Phones'; + +describe('PhoneFilterPipe', function() { + + let phones:Phone[] = [ + {name: 'Nexus S', snippet: 'The Nexus S Phone', images: []}, + {name: 'Motorola DROID', snippet: 'an Android-for-business smartphone', images: []} + ]; + + beforeEachProviders(() => [PhoneFilterPipe]); + + it('should return input when no query', inject([PhoneFilterPipe], (phoneFilterPipe) => { + expect(phoneFilterPipe.transform(phones, [])).toEqual(phones); + })); + + it('should match based on name', inject([PhoneFilterPipe], (phoneFilterPipe) => { + expect(phoneFilterPipe.transform(phones, ['nexus'])).toEqual([phones[0]]); + })); + + it('should match based on snippet', inject([PhoneFilterPipe], (phoneFilterPipe) => { + expect(phoneFilterPipe.transform(phones, ['android'])).toEqual([phones[1]]); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneList.spec.ts b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneList.spec.ts new file mode 100644 index 0000000000..e058f25e34 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/PhoneList.spec.ts @@ -0,0 +1,58 @@ +// #docregion +import {provide} from 'angular2/core'; +import {HTTP_PROVIDERS} from 'angular2/http'; +import {Observable} from 'rxjs'; +import {FromObservable} from 'rxjs/observable/from'; + +import { + describe, + beforeEachProviders, + injectAsync, + it, + expect, + TestComponentBuilder +} from 'angular2/testing'; +import PhoneList from '../../app/js/phone_list/PhoneList'; +import {Phones, Phone} from '../../app/js/core/Phones'; + +class MockPhones extends Phones { + query():Observable { + return FromObservable.create([ + [{name: 'Nexus S'}, {name: 'Motorola DROID'}] + ]) + } +} + +describe('PhoneList', function(){ + + beforeEachProviders(() => [ + provide(Phones, {useClass: MockPhones}), + HTTP_PROVIDERS + ]); + + + it('should create "phones" model with 2 phones fetched from xhr', + injectAsync([TestComponentBuilder], (tcb) => { + return tcb.createAsync(PhoneList).then((fixture) => { + fixture.detectChanges(); + fixture.detectChanges(); + + let compiled = fixture.debugElement.nativeElement; + + expect(compiled.querySelectorAll('.phone-listing').length).toBe(2); + expect(compiled.querySelector('.phone-listing:nth-child(1)')).toHaveText('Nexus S'); + expect(compiled.querySelector('.phone-listing:nth-child(2)')).toHaveText('Motorola DROID'); + }); + })); + + + it('should set the default value of orderProp model', + injectAsync([TestComponentBuilder], (tcb) => { + return tcb.createAsync(PhoneList).then((fixture) => { + fixture.detectChanges(); + let compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('select option:last-child').selected).toBe(true); + }); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_components/test/unit/Phones.spec.ts b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/Phones.spec.ts new file mode 100644 index 0000000000..61f3fc1117 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_components/test/unit/Phones.spec.ts @@ -0,0 +1,16 @@ +// #docregion +import {describe, beforeEachProviders, it, inject} from 'angular2/testing'; +import {HTTP_PROVIDERS} from 'angular2/http'; +import {Phones} from '../../app/js/core/Phones'; + +describe('Phones', function() { + + // load providers + beforeEachProviders(() => [Phones, HTTP_PROVIDERS]); + + // Test service availability + it('check the existence of Phones', inject([Phones], (phones) => { + expect(phones).toBeDefined(); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_final/.bowerrc b/public/docs/_examples/upgrade/ts/ng2_final/.bowerrc new file mode 100644 index 0000000000..5773025bf9 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "app/bower_components" +} diff --git a/public/docs/_examples/upgrade/ts/ng2_final/.gitignore b/public/docs/_examples/upgrade/ts/ng2_final/.gitignore new file mode 100644 index 0000000000..8cfe0da551 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/.gitignore @@ -0,0 +1,6 @@ +app/**/*.js +app/**/*.js.map +test/unit/**/*.js +test/unit/**/*.js.map +test/e2e/**/*.js +test/e2e/**/*.js.map diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/css/.gitkeep b/public/docs/_examples/upgrade/ts/ng2_final/app/css/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/css/animations.css b/public/docs/_examples/upgrade/ts/ng2_final/app/css/animations.css new file mode 100644 index 0000000000..46f3da6ecb --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/css/animations.css @@ -0,0 +1,97 @@ +/* + * animations css stylesheet + */ + +/* animate ngRepeat in phone listing */ + +.phone-listing.ng-enter, +.phone-listing.ng-leave, +.phone-listing.ng-move { + -webkit-transition: 0.5s linear all; + -moz-transition: 0.5s linear all; + -o-transition: 0.5s linear all; + transition: 0.5s linear all; +} + +.phone-listing.ng-enter, +.phone-listing.ng-move { + opacity: 0; + height: 0; + overflow: hidden; +} + +.phone-listing.ng-move.ng-move-active, +.phone-listing.ng-enter.ng-enter-active { + opacity: 1; + height: 120px; +} + +.phone-listing.ng-leave { + opacity: 1; + overflow: hidden; +} + +.phone-listing.ng-leave.ng-leave-active { + opacity: 0; + height: 0; + padding-top: 0; + padding-bottom: 0; +} + +/* cross fading between routes with ngView */ + +.view-container { + position: relative; +} + +.view-frame.ng-enter, +.view-frame.ng-leave { + background: white; + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.view-frame.ng-enter { + -webkit-animation: 0.5s fade-in; + -moz-animation: 0.5s fade-in; + -o-animation: 0.5s fade-in; + animation: 0.5s fade-in; + z-index: 100; +} + +.view-frame.ng-leave { + -webkit-animation: 0.5s fade-out; + -moz-animation: 0.5s fade-out; + -o-animation: 0.5s fade-out; + animation: 0.5s fade-out; + z-index: 99; +} + +@keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +@-moz-keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +@-webkit-keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} +@-moz-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} +@-webkit-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} + diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/css/app.css b/public/docs/_examples/upgrade/ts/ng2_final/app/css/app.css new file mode 100644 index 0000000000..f41c420776 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/css/app.css @@ -0,0 +1,99 @@ +/* app css stylesheet */ + +body { + padding-top: 20px; +} + + +.phone-images { + background-color: white; + width: 450px; + height: 450px; + overflow: hidden; + position: relative; + float: left; +} + +.phones { + list-style: none; +} + +.thumb { + float: left; + margin: -0.5em 1em 1.5em 0; + padding-bottom: 1em; + height: 100px; + width: 100px; +} + +.phones li { + clear: both; + height: 115px; + padding-top: 15px; +} + +/** Detail View **/ +img.phone { + float: left; + margin-right: 3em; + margin-bottom: 2em; + background-color: white; + padding: 2em; + height: 400px; + width: 400px; + display: none; +} + +img.phone:first-of-type { + display: block; +} + + +ul.phone-thumbs { + margin: 0; + list-style: none; +} + +ul.phone-thumbs li { + border: 1px solid black; + display: inline-block; + margin: 1em; + background-color: white; +} + +ul.phone-thumbs img { + height: 100px; + width: 100px; + padding: 1em; +} + +ul.phone-thumbs img:hover { + cursor: pointer; +} + + +ul.specs { + clear: both; + margin: 0; + padding: 0; + list-style: none; +} + +ul.specs > li{ + display: inline-block; + width: 200px; + vertical-align: top; +} + +ul.specs > li > span{ + font-weight: bold; + font-size: 1.2em; +} + +ul.specs dt { + font-weight: bold; +} + +h1 { + border-bottom: 1px solid gray; +} diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/img/.gitkeep b/public/docs/_examples/upgrade/ts/ng2_final/app/img/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/img/glyphicons-halflings-white.png b/public/docs/_examples/upgrade/ts/ng2_final/app/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/img/glyphicons-halflings.png b/public/docs/_examples/upgrade/ts/ng2_final/app/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..5b67ffda5ff5caa7f1dfeb119f9f35830fb7a789 GIT binary patch literal 12601 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 NM|m~5DjCz@{|hh;;@|)P literal 0 HcmV?d00001 diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/index.html b/public/docs/_examples/upgrade/ts/ng2_final/app/index.html new file mode 100644 index 0000000000..0dc9748e51 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/index.html @@ -0,0 +1,40 @@ + + + + + + Google Phone Gallery + + + + + + + + + + + + + + + + + + + diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/js/app.ts b/public/docs/_examples/upgrade/ts/ng2_final/app/js/app.ts new file mode 100644 index 0000000000..43b5b0b01c --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/js/app.ts @@ -0,0 +1,48 @@ +// #docregion +// #docregion importbootstrap +import {Component, provide} from 'angular2/core'; +import {bootstrap} from 'angular2/platform/browser'; + +import {Phones} from './core/Phones'; +import PhoneList from './phone_list/PhoneList'; +import PhoneDetail from './phone_detail/PhoneDetail'; +// #enddocregion importbootstrap + +// #docregion http-import +import {HTTP_PROVIDERS} from 'angular2/http'; +// #enddocregion http-import + +// #docregion router-import +import { + RouteConfig, + LocationStrategy, + HashLocationStrategy, + ROUTER_DIRECTIVES, + ROUTER_PROVIDERS +} from 'angular2/router'; +// #enddocregion router-import + +// #docregion appcomponent +@RouteConfig([ + {path:'/phones', as: 'Phones', component: PhoneList}, + {path:'/phones/:phoneId', as: 'Phone', component: PhoneDetail}, + {path:'/', redirectTo: ['/phones']} +]) +@Component({ + selector: 'pc-app', + template: '', + directives: [ROUTER_DIRECTIVES] +}) +class AppComponent { +} +// #enddocregion appcomponent + +// #docregion bootstrap +bootstrap(AppComponent, [ + HTTP_PROVIDERS, + ROUTER_PROVIDERS, + ROUTER_DIRECTIVES, + provide(LocationStrategy, {useClass: HashLocationStrategy}), + Phones +]); +// #enddocregion bootstrap diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/js/core/CheckmarkPipe.ts b/public/docs/_examples/upgrade/ts/ng2_final/app/js/core/CheckmarkPipe.ts new file mode 100644 index 0000000000..5156f14b50 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/js/core/CheckmarkPipe.ts @@ -0,0 +1,9 @@ +// #docregion +import {Pipe} from 'angular2/core'; + +@Pipe({name: 'checkmark'}) +export class CheckmarkPipe { + transform(input:string): string { + return input ? '\u2713' : '\u2718'; + } +} diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/js/core/Phones.ts b/public/docs/_examples/upgrade/ts/ng2_final/app/js/core/Phones.ts new file mode 100644 index 0000000000..8186c4810c --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/js/core/Phones.ts @@ -0,0 +1,37 @@ +// #docregion full +import {Injectable} from 'angular2/core'; +import {Http, Response} from 'angular2/http'; +import {Observable} from 'rxjs'; +import 'rxjs/add/operator/map'; + +// #docregion phone-interface +export interface Phone { + name: string; + snippet: string; + images: string[]; +} +// #enddocregion phone-interface + +// #docregion fullclass +// #docregion class +@Injectable() +export class Phones { +// #enddocregion class + + constructor(private http: Http) { } + + query():Observable { + return this.http.get(`phones/phones.json`) + .map((res:Response) => res.json()); + } + + get(id: string):Observable { + return this.http.get(`phones/${id}.json`) + .map((res:Response) => res.json()); + } + +// #docregion class +} +// #enddocregion class +// #enddocregion fullclass +// #docregion full diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/js/core/upgrade_adapter.ts b/public/docs/_examples/upgrade/ts/ng2_final/app/js/core/upgrade_adapter.ts new file mode 100644 index 0000000000..e21be0e4d8 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/js/core/upgrade_adapter.ts @@ -0,0 +1,9 @@ +// #docregion full +import {UpgradeAdapter} from 'angular2/upgrade'; + +// #docregion adapter-init +const upgradeAdapter = new UpgradeAdapter(); +// #enddocregion adapter-init + +export default upgradeAdapter; +// #enddocregion full diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_detail/PhoneDetail.ts b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_detail/PhoneDetail.ts new file mode 100644 index 0000000000..3b3de30fee --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_detail/PhoneDetail.ts @@ -0,0 +1,30 @@ +// #docregion +// #docregion top +import {Component, Inject} from 'angular2/core'; +import {RouteParams} from 'angular2/router'; +import {Phones, Phone} from '../core/Phones'; +import {CheckmarkPipe} from '../core/CheckmarkPipe'; + +@Component({ + selector: 'pc-phone-detail', + templateUrl: 'js/phone_detail/phone_detail.html', + pipes: [CheckmarkPipe] +}) +class PhoneDetail { +// #enddocregion top + phone:Phone = undefined; + mainImageUrl:string; + constructor(params:RouteParams, + phones:Phones) { + phones.get(params.get('phoneId')) + .subscribe(phone => { + this.phone = phone; + this.mainImageUrl = phone.images[0]; + }); + } + + setImage(url:string) { + this.mainImageUrl = url; + } +} +export default PhoneDetail; diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_detail/phone_detail.html b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_detail/phone_detail.html new file mode 100644 index 0000000000..51cc10aad5 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_detail/phone_detail.html @@ -0,0 +1,115 @@ + +
+ +
+

{{phone?.name}}

+

{{phone?.description}}

+
    +
  • + +
  • +
+
    +
  • + Availability and Networks +
    +
    Availability
    +
    {{availability}}
    +
    +
  • +
  • + Battery +
    +
    Type
    +
    {{phone?.battery?.type}}
    +
    Talk Time
    +
    {{phone?.battery?.talkTime}}
    +
    Standby time (max)
    +
    {{phone?.battery?.standbyTime}}
    +
    +
  • +
  • + Storage and Memory +
    +
    RAM
    +
    {{phone?.storage?.ram}}
    +
    Internal Storage
    +
    {{phone?.storage?.flash}}
    +
    +
  • +
  • + Connectivity +
    +
    Network Support
    +
    {{phone?.connectivity?.cell}}
    +
    WiFi
    +
    {{phone?.connectivity?.wifi}}
    +
    Bluetooth
    +
    {{phone?.connectivity?.bluetooth}}
    +
    Infrared
    +
    {{phone?.connectivity?.infrared | checkmark}}
    +
    GPS
    +
    {{phone?.connectivity?.gps | checkmark}}
    +
    +
  • +
  • + Android +
    +
    OS Version
    +
    {{phone?.android?.os}}
    +
    UI
    +
    {{phone?.android?.ui}}
    +
    +
  • +
  • + Size and Weight +
    +
    Dimensions
    +
    {{dim}}
    +
    Weight
    +
    {{phone?.sizeAndWeight?.weight}}
    +
    +
  • +
  • + Display +
    +
    Screen size
    +
    {{phone?.display?.screenSize}}
    +
    Screen resolution
    +
    {{phone?.display?.screenResolution}}
    +
    Touch screen
    +
    {{phone?.display?.touchScreen | checkmark}}
    +
    +
  • +
  • + Hardware +
    +
    CPU
    +
    {{phone?.hardware?.cpu}}
    +
    USB
    +
    {{phone?.hardware?.usb}}
    +
    Audio / headphone jack
    +
    {{phone?.hardware?.audioJack}}
    +
    FM Radio
    +
    {{phone?.hardware?.fmRadio | checkmark}}
    +
    Accelerometer
    +
    {{phone?.hardware?.accelerometer | checkmark}}
    +
    +
  • +
  • + Camera +
    +
    Primary
    +
    {{phone?.camera?.primary}}
    +
    Features
    +
    {{phone?.camera?.features?.join(', ')}}
    +
    +
  • +
  • + Additional Features +
    {{phone?.additionalFeatures}}
    +
  • +
diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/OrderByPipe.ts b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/OrderByPipe.ts new file mode 100644 index 0000000000..3b82f03c9b --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/OrderByPipe.ts @@ -0,0 +1,24 @@ +// #docregion +import {Pipe} from 'angular2/core'; + +@Pipe({name: 'orderBy'}) +export default class OrderByPipe { + + transform(input:T[], args:string[]): T[] { + if (input) { + let property = args[0]; + return input.slice().sort((a, b) => { + if (a[property] < b[property]) { + return -1; + } else if (b[property] < a[property]) { + return 1; + } else { + return 0; + } + }); + } else { + return input; + } + } + +} diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/PhoneFilterPipe.ts b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/PhoneFilterPipe.ts new file mode 100644 index 0000000000..cca575ece2 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/PhoneFilterPipe.ts @@ -0,0 +1,22 @@ +// #docregion +import {Pipe} from 'angular2/core'; +import {Phone} from '../core/Phones'; + +@Pipe({name: 'phoneFilter'}) +export default class PhoneFilterPipe { + + transform(input:Phone[], args:string[]): Phone[] { + let query = args[0]; + if (query) { + query = query.toLowerCase(); + return input.filter((phone) => { + const name = phone.name.toLowerCase(); + const snippet = phone.snippet.toLowerCase(); + return name.indexOf(query) >= 0 || snippet.indexOf(query) >= 0; + }); + } else { + return input; + } + } + +} diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/PhoneList.ts b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/PhoneList.ts new file mode 100644 index 0000000000..e7aa1dead1 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/PhoneList.ts @@ -0,0 +1,28 @@ +// #docregion full +// #docregion top +import {Component} from 'angular2/core'; +import {RouterLink} from 'angular2/router'; +import {Observable} from 'rxjs'; +import {Phones, Phone} from '../core/Phones'; +import PhoneFilterPipe from './PhoneFilterPipe'; +import OrderByPipe from './OrderByPipe'; + +@Component({ + selector: 'pc-phone-list', + templateUrl: 'js/phone_list/phone_list.html', + pipes: [PhoneFilterPipe, OrderByPipe], + directives: [RouterLink] +}) +class PhoneList { +// #enddocregion top + + phones:Observable; + orderProp:string; + query:string; + constructor(phones:Phones) { + this.phones = phones.query(); + this.orderProp = 'age'; + } +} + +export default PhoneList; diff --git a/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/phone_list.html b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/phone_list.html new file mode 100644 index 0000000000..d605ff1f85 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/app/js/phone_list/phone_list.html @@ -0,0 +1,32 @@ +
+
+
+ + + + Search: + Sort by: + + + +
+
+ + + + + + +
+
+
diff --git a/public/docs/_examples/upgrade/ts/ng2_final/bower.json b/public/docs/_examples/upgrade/ts/ng2_final/bower.json new file mode 100644 index 0000000000..03c0d72ea4 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/bower.json @@ -0,0 +1,20 @@ +{ + "name": "angular-phonecat", + "description": "A starter project for AngularJS", + "version": "0.0.0", + "homepage": "https://github.com/angular/angular-phonecat", + "license": "MIT", + "private": true, + "dependencies": { + "angular": "1.5.0-beta.2", + "angular-mocks": "1.5.0-beta.2", + "jquery": "~2.1.1", + "bootstrap": "~3.1.1", + "angular-route": "1.5.0-beta.2", + "angular-resource": "1.5.0-beta.2", + "angular-animate": "1.5.0-beta.2" + }, + "resolutions": { + "angular": "1.5.0-beta.2" + } +} diff --git a/public/docs/_examples/upgrade/ts/ng2_final/test/e2e/scenarios.ts b/public/docs/_examples/upgrade/ts/ng2_final/test/e2e/scenarios.ts new file mode 100644 index 0000000000..a8280cfed7 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/test/e2e/scenarios.ts @@ -0,0 +1,114 @@ +'use strict'; + +/* http://docs.angularjs.org/guide/dev_guide.e2e-testing */ + +describe('PhoneCat App', function() { + + // #docregion redirect + it('should redirect index.html to index.html#/phones', function() { + browser.get('app/index.html'); + browser.waitForAngular(); + browser.getCurrentUrl().then(function(url) { + expect(url.endsWith('/phones')).toBe(true); + }); + }); + // #enddocregion redirect + + describe('Phone list view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones'); + }); + + it('should filter the phone list as a user types into the search box', function() { + var phoneList = element.all(by.css('.phones li')); + var query = element(by.css('input')); + + expect(phoneList.count()).toBe(20); + + query.sendKeys('nexus'); + expect(phoneList.count()).toBe(1); + + query.clear(); + // https://github.com/angular/protractor/issues/2019 + let str = 'motorola'; + for (let i:number = 0; i < str.length; i++) { + query.sendKeys(str.charAt(i)); + } + + expect(phoneList.count()).toBe(8); + }); + + + it('should be possible to control phone order via the drop down select box', function() { + var phoneNameColumn = element.all(by.css('.phones .name')); + var query = element(by.css('input')); + + function getNames() { + return phoneNameColumn.map(function(elm) { + return elm.getText(); + }); + } + + //let's narrow the dataset to make the test assertions shorter + // https://github.com/angular/protractor/issues/2019 + let str = 'tablet'; + for (let i:number = 0; i < str.length; i++) { + query.sendKeys(str.charAt(i)); + } + + expect(getNames()).toEqual([ + "Motorola XOOM\u2122 with Wi-Fi", + "MOTOROLA XOOM\u2122" + ]); + + element(by.css('select')).element(by.css('option[value="name"]')).click(); + expect(getNames()).toEqual([ + "MOTOROLA XOOM\u2122", + "Motorola XOOM\u2122 with Wi-Fi" + ]); + }); + + + // #docregion links + it('should render phone specific links', function() { + var query = element(by.css('input')); + // https://github.com/angular/protractor/issues/2019 + let str = 'nexus'; + for (let i:number = 0; i < str.length; i++) { + query.sendKeys(str.charAt(i)); + } + element.all(by.css('.phones li a')).first().click(); + browser.getCurrentUrl().then(function(url) { + expect(url.endsWith('/phones/nexus-s')).toBe(true); + }); + }); + }); + // #enddocregion links + + describe('Phone detail view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones/nexus-s'); + }); + + + it('should display nexus-s page', function() { + expect(element(by.css('h1')).getText()).toBe('Nexus S'); + }); + + + it('should display the first phone image as the main phone image', function() { + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + + + it('should swap main image if a thumbnail image is clicked on', function() { + element(by.css('.phone-thumbs li:nth-of-type(3) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.2.jpg/); + + element(by.css('.phone-thumbs li:nth-of-type(1) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + }); +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_final/test/karma_test_shim.js b/public/docs/_examples/upgrade/ts/ng2_final/test/karma_test_shim.js new file mode 100644 index 0000000000..43c3d123ee --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/test/karma_test_shim.js @@ -0,0 +1,54 @@ +// #docregion +// Cancel Karma's synchronous start, +// we will call `__karma__.start()` later, once all the specs are loaded. +__karma__.loaded = function() {}; + +System.config({ + packages: { + 'base/app/js': { + defaultExtension: false, + format: 'register', + map: Object.keys(window.__karma__.files). + filter(onlyAppFiles). + reduce(function createPathRecords(pathsMapping, appPath) { + // creates local module name mapping to global path with karma's fingerprint in path, e.g.: + // './hero.service': '/base/src/app/hero.service.js?f4523daf879cfb7310ef6242682ccf10b2041b3e' + var moduleName = appPath.replace(/^\/base\/app\/js\//, './').replace(/\.js$/, ''); + pathsMapping[moduleName] = appPath + '?' + window.__karma__.files[appPath] + return pathsMapping; + }, {}) + }, + 'rxjs': { + defaultExtension: 'js' + } + }, + map: { + 'rxjs' : '/base/node_modules/rxjs' + } +}); + +// #docregion ng2 +System.import('angular2/src/platform/browser/browser_adapter').then(function(browser_adapter) { + browser_adapter.BrowserDomAdapter.makeCurrent(); +}).then(function() { + return Promise.all( + Object.keys(window.__karma__.files) // All files served by Karma. + .filter(onlySpecFiles) + .map(function(moduleName) { + // loads all spec files via their global module names + return System.import(moduleName); + })); +}).then(function() { + __karma__.start(); +}, function(error) { + __karma__.error(error.stack || error); +}); +// #enddocregion ng2 + +function onlyAppFiles(filePath) { + return /^\/base\/app\/js\/.*\.js$/.test(filePath) +} + +function onlySpecFiles(path) { + return /\.spec\.js$/.test(path); +} diff --git a/public/docs/_examples/upgrade/ts/ng2_final/test/protractor-conf.js b/public/docs/_examples/upgrade/ts/ng2_final/test/protractor-conf.js new file mode 100644 index 0000000000..a1ea324632 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/test/protractor-conf.js @@ -0,0 +1,25 @@ +exports.config = { + allScriptsTimeout: 11000, + + specs: [ + 'e2e/*.js' + ], + + capabilities: { + 'browserName': 'chrome' + }, + + directConnect: true, + + baseUrl: 'http://localhost:8000/', + + framework: 'jasmine', + + jasmineNodeOpts: { + defaultTimeoutInterval: 30000 + }, + + // #docregion ng2 + useAllAngular2AppRoots: true + // #enddocregion ng2 +}; diff --git a/public/docs/_examples/upgrade/ts/ng2_final/test/unit/CheckmarkPipe.spec.ts b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/CheckmarkPipe.spec.ts new file mode 100644 index 0000000000..9d5b92f6e0 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/CheckmarkPipe.spec.ts @@ -0,0 +1,15 @@ +// #docregion +import {describe, beforeEachProviders, it, inject, expect} from 'angular2/testing'; +import {CheckmarkPipe} from '../../app/js/core/CheckmarkPipe'; + +describe('CheckmarkPipe', function() { + + beforeEachProviders(() => [CheckmarkPipe]); + + it('should convert boolean values to unicode checkmark or cross', + inject([CheckmarkPipe], (checkmarkPipe) => { + expect(checkmarkPipe.transform(true)).toBe('\u2713'); + expect(checkmarkPipe.transform(false)).toBe('\u2718'); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_final/test/unit/OrderByPipe.spec.ts b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/OrderByPipe.spec.ts new file mode 100644 index 0000000000..737ad10b82 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/OrderByPipe.spec.ts @@ -0,0 +1,19 @@ +// #docregion +import {describe, beforeEachProviders, it, inject} from 'angular2/testing'; + +import OrderByPipe from '../../app/js/phone_list/OrderByPipe'; + +describe('OrderByPipe', function() { + + let input:any[] = [ + {name: 'Nexus S', snippet: 'The Nexus S Phone', images: []}, + {name: 'Motorola DROID', snippet: 'An Android-for-business smartphone', images: []} + ]; + + beforeEachProviders(() => [OrderByPipe]); + + it('should order by the given property', inject([OrderByPipe], (orderByPipe) => { + expect(orderByPipe.transform(input, ['name'])).toEqual([input[1], input[0]]); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneDetail.spec.ts b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneDetail.spec.ts new file mode 100644 index 0000000000..5df57def16 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneDetail.spec.ts @@ -0,0 +1,53 @@ +import {provide} from 'angular2/core'; +// #docregion routeparams +import {RouteParams} from 'angular2/router'; +// #enddocregion routeparams +import {HTTP_PROVIDERS} from 'angular2/http'; +import {Observable} from 'rxjs'; +import {FromObservable} from 'rxjs/observable/from'; + +import { + describe, + beforeEachProviders, + injectAsync, + it, + expect, + TestComponentBuilder +} from 'angular2/testing'; +import PhoneDetail from '../../app/js/phone_detail/PhoneDetail'; +import {Phones, Phone} from '../../app/js/core/Phones'; + +function xyzPhoneData():Phone { + return { + name: 'phone xyz', + snippet: '', + images: ['image/url1.png', 'image/url2.png'] + } +} + +class MockPhones extends Phones { + get(id):Observable { + return FromObservable.create([xyzPhoneData()]); + } +} + +// #docregion routeparams +describe('PhoneDetail', function(){ + + beforeEachProviders(() => [ + provide(Phones, {useClass: MockPhones}), + provide(RouteParams, {useValue: new RouteParams({phoneId: 'xyz'})}), + HTTP_PROVIDERS + ]); + // #enddocregion routeparams + + it('should fetch phone detail', injectAsync([TestComponentBuilder], (tcb) => { + return tcb.createAsync(PhoneDetail).then((fixture) => { + fixture.detectChanges(); + let compiled = fixture.debugElement.nativeElement; + + expect(compiled.querySelector('.h1')).toHaveText(xyzPhoneData().name); + }); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneFilterPipe.spec.ts b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneFilterPipe.spec.ts new file mode 100644 index 0000000000..73e1772201 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneFilterPipe.spec.ts @@ -0,0 +1,28 @@ +// #docregion +import {describe, beforeEachProviders, it, inject} from 'angular2/testing'; + +import PhoneFilterPipe from '../../app/js/phone_list/PhoneFilterPipe'; +import {Phone} from '../../app/js/core/Phones'; + +describe('PhoneFilterPipe', function() { + + let phones:Phone[] = [ + {name: 'Nexus S', snippet: 'The Nexus S Phone', images: []}, + {name: 'Motorola DROID', snippet: 'an Android-for-business smartphone', images: []} + ]; + + beforeEachProviders(() => [PhoneFilterPipe]); + + it('should return input when no query', inject([PhoneFilterPipe], (phoneFilterPipe) => { + expect(phoneFilterPipe.transform(phones, [])).toEqual(phones); + })); + + it('should match based on name', inject([PhoneFilterPipe], (phoneFilterPipe) => { + expect(phoneFilterPipe.transform(phones, ['nexus'])).toEqual([phones[0]]); + })); + + it('should match based on snippet', inject([PhoneFilterPipe], (phoneFilterPipe) => { + expect(phoneFilterPipe.transform(phones, ['android'])).toEqual([phones[1]]); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneList.spec.ts b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneList.spec.ts new file mode 100644 index 0000000000..c1a98f94bd --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/PhoneList.spec.ts @@ -0,0 +1,57 @@ +// #docregion +import {provide} from 'angular2/core'; +import {HTTP_PROVIDERS} from 'angular2/http'; +import {Observable} from 'rxjs'; +import {FromObservable} from 'rxjs/observable/from'; +import { + describe, + beforeEachProviders, + injectAsync, + it, + expect, + TestComponentBuilder +} from 'angular2/testing'; +import PhoneList from '../../app/js/phone_list/PhoneList'; +import {Phones, Phone} from '../../app/js/core/Phones'; + +class MockPhones extends Phones { + query():Observable { + return FromObservable.create([ + [{name: 'Nexus S'}, {name: 'Motorola DROID'}] + ]) + } +} + +describe('PhoneList', function(){ + + beforeEachProviders(() => [ + provide(Phones, {useClass: MockPhones}), + HTTP_PROVIDERS + ]); + + + it('should create "phones" model with 2 phones fetched from xhr', + injectAsync([TestComponentBuilder], (tcb) => { + return tcb.createAsync(PhoneList).then((fixture) => { + fixture.detectChanges(); + fixture.detectChanges(); + + let compiled = fixture.debugElement.nativeElement; + + expect(compiled.querySelectorAll('.phone-listing').length).toBe(2); + expect(compiled.querySelector('.phone-listing:nth-child(1)')).toHaveText('Nexus S'); + expect(compiled.querySelector('.phone-listing:nth-child(2)')).toHaveText('Motorola DROID'); + }); + })); + + + it('should set the default value of orderProp model', + injectAsync([TestComponentBuilder], (tcb) => { + return tcb.createAsync(PhoneList).then((fixture) => { + fixture.detectChanges(); + let compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('select option:last-child').selected).toBe(true); + }); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_final/test/unit/Phones.spec.ts b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/Phones.spec.ts new file mode 100644 index 0000000000..61f3fc1117 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_final/test/unit/Phones.spec.ts @@ -0,0 +1,16 @@ +// #docregion +import {describe, beforeEachProviders, it, inject} from 'angular2/testing'; +import {HTTP_PROVIDERS} from 'angular2/http'; +import {Phones} from '../../app/js/core/Phones'; + +describe('Phones', function() { + + // load providers + beforeEachProviders(() => [Phones, HTTP_PROVIDERS]); + + // Test service availability + it('check the existence of Phones', inject([Phones], (phones) => { + expect(phones).toBeDefined(); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/.bowerrc b/public/docs/_examples/upgrade/ts/ng2_initial/.bowerrc new file mode 100644 index 0000000000..5773025bf9 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "app/bower_components" +} diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/.gitignore b/public/docs/_examples/upgrade/ts/ng2_initial/.gitignore new file mode 100644 index 0000000000..8cfe0da551 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/.gitignore @@ -0,0 +1,6 @@ +app/**/*.js +app/**/*.js.map +test/unit/**/*.js +test/unit/**/*.js.map +test/e2e/**/*.js +test/e2e/**/*.js.map diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/css/.gitkeep b/public/docs/_examples/upgrade/ts/ng2_initial/app/css/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/css/animations.css b/public/docs/_examples/upgrade/ts/ng2_initial/app/css/animations.css new file mode 100644 index 0000000000..46f3da6ecb --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/css/animations.css @@ -0,0 +1,97 @@ +/* + * animations css stylesheet + */ + +/* animate ngRepeat in phone listing */ + +.phone-listing.ng-enter, +.phone-listing.ng-leave, +.phone-listing.ng-move { + -webkit-transition: 0.5s linear all; + -moz-transition: 0.5s linear all; + -o-transition: 0.5s linear all; + transition: 0.5s linear all; +} + +.phone-listing.ng-enter, +.phone-listing.ng-move { + opacity: 0; + height: 0; + overflow: hidden; +} + +.phone-listing.ng-move.ng-move-active, +.phone-listing.ng-enter.ng-enter-active { + opacity: 1; + height: 120px; +} + +.phone-listing.ng-leave { + opacity: 1; + overflow: hidden; +} + +.phone-listing.ng-leave.ng-leave-active { + opacity: 0; + height: 0; + padding-top: 0; + padding-bottom: 0; +} + +/* cross fading between routes with ngView */ + +.view-container { + position: relative; +} + +.view-frame.ng-enter, +.view-frame.ng-leave { + background: white; + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.view-frame.ng-enter { + -webkit-animation: 0.5s fade-in; + -moz-animation: 0.5s fade-in; + -o-animation: 0.5s fade-in; + animation: 0.5s fade-in; + z-index: 100; +} + +.view-frame.ng-leave { + -webkit-animation: 0.5s fade-out; + -moz-animation: 0.5s fade-out; + -o-animation: 0.5s fade-out; + animation: 0.5s fade-out; + z-index: 99; +} + +@keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +@-moz-keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +@-webkit-keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} +@-moz-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} +@-webkit-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} + diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/css/app.css b/public/docs/_examples/upgrade/ts/ng2_initial/app/css/app.css new file mode 100644 index 0000000000..951ea087cc --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/css/app.css @@ -0,0 +1,99 @@ +/* app css stylesheet */ + +body { + padding-top: 20px; +} + + +.phone-images { + background-color: white; + width: 450px; + height: 450px; + overflow: hidden; + position: relative; + float: left; +} + +.phones { + list-style: none; +} + +.thumb { + float: left; + margin: -0.5em 1em 1.5em 0; + padding-bottom: 1em; + height: 100px; + width: 100px; +} + +.phones li { + clear: both; + height: 115px; + padding-top: 15px; +} + +/** Detail View **/ +img.phone { + float: left; + margin-right: 3em; + margin-bottom: 2em; + background-color: white; + padding: 2em; + height: 400px; + width: 400px; + display: none; +} + +img.phone:first-child { + display: block; +} + + +ul.phone-thumbs { + margin: 0; + list-style: none; +} + +ul.phone-thumbs li { + border: 1px solid black; + display: inline-block; + margin: 1em; + background-color: white; +} + +ul.phone-thumbs img { + height: 100px; + width: 100px; + padding: 1em; +} + +ul.phone-thumbs img:hover { + cursor: pointer; +} + + +ul.specs { + clear: both; + margin: 0; + padding: 0; + list-style: none; +} + +ul.specs > li{ + display: inline-block; + width: 200px; + vertical-align: top; +} + +ul.specs > li > span{ + font-weight: bold; + font-size: 1.2em; +} + +ul.specs dt { + font-weight: bold; +} + +h1 { + border-bottom: 1px solid gray; +} diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/img/.gitkeep b/public/docs/_examples/upgrade/ts/ng2_initial/app/img/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/img/glyphicons-halflings-white.png b/public/docs/_examples/upgrade/ts/ng2_initial/app/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/img/glyphicons-halflings.png b/public/docs/_examples/upgrade/ts/ng2_initial/app/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..5b67ffda5ff5caa7f1dfeb119f9f35830fb7a789 GIT binary patch literal 12601 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 NM|m~5DjCz@{|hh;;@|)P literal 0 HcmV?d00001 diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/index.html b/public/docs/_examples/upgrade/ts/ng2_initial/app/index.html new file mode 100644 index 0000000000..a0739be79e --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/index.html @@ -0,0 +1,52 @@ + + + + + Google Phone Gallery + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/app.module.ts b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/app.module.ts new file mode 100644 index 0000000000..b8ea6945ee --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/app.module.ts @@ -0,0 +1,50 @@ +/// +/// +/// + +// #docregion adapter-import +import {UpgradeAdapter} from 'angular2/upgrade'; +// #enddocregion adapter-import +// #docregion adapter-state-import +import upgradeAdapter from './core/upgrade_adapter'; +// #enddocregion adapter-state-import +// #docregion http-import +import {HTTP_PROVIDERS} from 'angular2/http'; +// #enddocregion http-import +import core from './core/core.module'; +import phoneList from './phone_list/phone_list.module'; +import phoneDetail from './phone_detail/phone_detail.module'; + +// #docregion add-http-providers +upgradeAdapter.addProvider(HTTP_PROVIDERS); +// #enddocregion add-http-providers + +angular.module('phonecatApp', [ + 'ngRoute', + core.name, + phoneList.name, + phoneDetail.name +]).config(configure); + +configure.$inject = ['$routeProvider']; + +function configure($routeProvider) { + $routeProvider. + when('/phones', { + templateUrl: 'js/phone_list/phone_list.html', + controller: 'PhoneListCtrl', + controllerAs: 'vm' + }). + when('/phones/:phoneId', { + templateUrl: 'js/phone_detail/phone_detail.html', + controller: 'PhoneDetailCtrl', + controllerAs: 'vm' + }). + otherwise({ + redirectTo: '/phones' + }); +} + +// #docregion bootstrap +upgradeAdapter.bootstrap(document.documentElement, ['phonecatApp']); +// #enddocregion bootstrap diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/Phones.ts b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/Phones.ts new file mode 100644 index 0000000000..14625c5c9e --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/Phones.ts @@ -0,0 +1,38 @@ +// #docregion full +import {Injectable} from 'angular2/core'; +import {Http, Response} from 'angular2/http'; +import {Observable} from 'rxjs'; + +import 'rxjs/add/operator/map'; + +// #docregion phone-interface +export interface Phone { + name: string; + snippet: string; + images: string[]; +} +// #enddocregion phone-interface + +// #docregion fullclass +// #docregion class +@Injectable() +export class Phones { +// #enddocregion class + + constructor(private http: Http) { } + + query():Observable { + return this.http.get(`phones/phones.json`) + .map((res:Response) => res.json()); + } + + get(id: string):Observable { + return this.http.get(`phones/${id}.json`) + .map((res:Response) => res.json()); + } + +// #docregion class +} +// #enddocregion class +// #enddocregion fullclass +// #docregion full diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/checkmark.filter.ts b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/checkmark.filter.ts new file mode 100644 index 0000000000..84544b80a1 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/checkmark.filter.ts @@ -0,0 +1,6 @@ +// #docregion +export default function checkmarkFilter() { + return function(input:string):string { + return input ? '\u2713' : '\u2718'; + }; +} diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/core.module.ts b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/core.module.ts new file mode 100644 index 0000000000..cfc2fcf20a --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/core.module.ts @@ -0,0 +1,10 @@ +// #docregion +import {Phones} from './Phones'; +import checkmarkFilter from './checkmark.filter'; +import upgradeAdapter from './upgrade_adapter'; + +upgradeAdapter.addProvider(Phones); + +export default angular.module('phonecat.core', []) + .factory('phones', upgradeAdapter.downgradeNg2Provider(Phones)) + .filter('checkmark', checkmarkFilter); diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/upgrade_adapter.ts b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/upgrade_adapter.ts new file mode 100644 index 0000000000..e21be0e4d8 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/core/upgrade_adapter.ts @@ -0,0 +1,9 @@ +// #docregion full +import {UpgradeAdapter} from 'angular2/upgrade'; + +// #docregion adapter-init +const upgradeAdapter = new UpgradeAdapter(); +// #enddocregion adapter-init + +export default upgradeAdapter; +// #enddocregion full diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.controller.ts b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.controller.ts new file mode 100644 index 0000000000..554eef41a0 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.controller.ts @@ -0,0 +1,25 @@ +// #docregion +import {Phones, Phone} from '../core/Phones'; + +interface PhoneRouteParams { + phoneId: string +} + +class PhoneDetailCtrl { + phone:Phone; + mainImageUrl:string; + constructor($routeParams:PhoneRouteParams, phones:Phones) { + phones.get($routeParams.phoneId) + .subscribe(phone => { + this.phone = phone; + this.mainImageUrl = phone.images[0]; + }); + } + setImage(url:string) { + this.mainImageUrl = url; + } +} + +PhoneDetailCtrl.$inject = ['$routeParams', 'phones']; + +export default PhoneDetailCtrl; diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.html b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.html new file mode 100644 index 0000000000..954c65c2cd --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.html @@ -0,0 +1,118 @@ +
+ +
+ +

{{vm.phone.name}}

+ +

{{vm.phone.description}}

+ +
    +
  • + +
  • +
+ +
    +
  • + Availability and Networks +
    +
    Availability
    +
    {{availability}}
    +
    +
  • +
  • + Battery +
    +
    Type
    +
    {{vm.phone.battery.type}}
    +
    Talk Time
    +
    {{vm.phone.battery.talkTime}}
    +
    Standby time (max)
    +
    {{vm.phone.battery.standbyTime}}
    +
    +
  • +
  • + Storage and Memory +
    +
    RAM
    +
    {{vm.phone.storage.ram}}
    +
    Internal Storage
    +
    {{vm.phone.storage.flash}}
    +
    +
  • +
  • + Connectivity +
    +
    Network Support
    +
    {{vm.phone.connectivity.cell}}
    +
    WiFi
    +
    {{vm.phone.connectivity.wifi}}
    +
    Bluetooth
    +
    {{vm.phone.connectivity.bluetooth}}
    +
    Infrared
    +
    {{vm.phone.connectivity.infrared | checkmark}}
    +
    GPS
    +
    {{vm.phone.connectivity.gps | checkmark}}
    +
    +
  • +
  • + Android +
    +
    OS Version
    +
    {{vm.phone.android.os}}
    +
    UI
    +
    {{vm.phone.android.ui}}
    +
    +
  • +
  • + Size and Weight +
    +
    Dimensions
    +
    {{dim}}
    +
    Weight
    +
    {{vm.phone.sizeAndWeight.weight}}
    +
    +
  • +
  • + Display +
    +
    Screen size
    +
    {{vm.phone.display.screenSize}}
    +
    Screen resolution
    +
    {{vm.phone.display.screenResolution}}
    +
    Touch screen
    +
    {{vm.phone.display.touchScreen | checkmark}}
    +
    +
  • +
  • + Hardware +
    +
    CPU
    +
    {{vm.phone.hardware.cpu}}
    +
    USB
    +
    {{vm.phone.hardware.usb}}
    +
    Audio / headphone jack
    +
    {{vm.phone.hardware.audioJack}}
    +
    FM Radio
    +
    {{vm.phone.hardware.fmRadio | checkmark}}
    +
    Accelerometer
    +
    {{vm.phone.hardware.accelerometer | checkmark}}
    +
    +
  • +
  • + Camera +
    +
    Primary
    +
    {{vm.phone.camera.primary}}
    +
    Features
    +
    {{vm.phone.camera.features.join(', ')}}
    +
    +
  • +
  • + Additional Features +
    {{vm.phone.additionalFeatures}}
    +
  • +
diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.module.ts b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.module.ts new file mode 100644 index 0000000000..16e7ac0baf --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_detail/phone_detail.module.ts @@ -0,0 +1,8 @@ +// #docregion +import PhoneDetailCtrl from './phone_detail.controller'; + +export default angular.module('phonecat.detail', [ + 'ngRoute', + 'phonecat.core' + ]) + .controller('PhoneDetailCtrl', PhoneDetailCtrl); diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.controller.ts b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.controller.ts new file mode 100644 index 0000000000..d8ddf9a507 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.controller.ts @@ -0,0 +1,17 @@ +// #docregion +import {Phones, Phone} from '../core/Phones'; + +class PhoneListCtrl { + phones:Phone[]; + orderProp:string; + query:string; + constructor(phones:Phones) { + phones.query() + .subscribe(phones => this.phones = phones); + this.orderProp = 'age'; + } +} + +PhoneListCtrl.$inject = ['phones']; + +export default PhoneListCtrl; diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.html b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.html new file mode 100644 index 0000000000..471f474e89 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.html @@ -0,0 +1,28 @@ +
+
+
+ + + Search: + Sort by: + + +
+
+ + + + +
+
+
diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.module.ts b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.module.ts new file mode 100644 index 0000000000..d2e7200778 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/app/js/phone_list/phone_list.module.ts @@ -0,0 +1,5 @@ +// #docregion +import PhoneListCtrl from './phone_list.controller'; + +export default angular.module('phonecat.list', []) + .controller('PhoneListCtrl', PhoneListCtrl); diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/bower.json b/public/docs/_examples/upgrade/ts/ng2_initial/bower.json new file mode 100644 index 0000000000..9ee83a5022 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/bower.json @@ -0,0 +1,20 @@ +{ + "name": "angular-phonecat", + "description": "A starter project for AngularJS", + "version": "0.0.0", + "homepage": "https://github.com/angular/angular-phonecat", + "license": "MIT", + "private": true, + "dependencies": { + "angular": "1.5.0-beta.0", + "angular-mocks": "1.5.0-beta.0", + "jquery": "~2.1.1", + "bootstrap": "~3.1.1", + "angular-route": "1.5.0-beta.0", + "angular-resource": "1.5.0-beta.0", + "angular-animate": "1.5.0-beta.0" + }, + "resolutions": { + "angular": "1.5.0-beta.0" + } +} diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/test/e2e/scenarios.ts b/public/docs/_examples/upgrade/ts/ng2_initial/test/e2e/scenarios.ts new file mode 100644 index 0000000000..f20d0a294c --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/test/e2e/scenarios.ts @@ -0,0 +1,99 @@ +'use strict'; + +/* http://docs.angularjs.org/guide/dev_guide.e2e-testing */ + +describe('PhoneCat App', function() { + + it('should redirect index.html to index.html#/phones', function() { + browser.get('app/index.html'); + browser.getLocationAbsUrl().then(function(url) { + expect(url).toEqual('/phones'); + }); + }); + + + describe('Phone list view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones'); + }); + + it('should filter the phone list as a user types into the search box', function() { + var phoneList = element.all(by.repeater('phone in vm.phones')); + var query = element(by.model('vm.query')); + + expect(phoneList.count()).toBe(20); + + query.sendKeys('nexus'); + expect(phoneList.count()).toBe(1); + + query.clear(); + query.sendKeys('motorola'); + expect(phoneList.count()).toBe(8); + }); + + + it('should be possible to control phone order via the drop down select box', function() { + + var phoneNameColumn = element.all(by.repeater('phone in vm.phones').column(0)); + var query = element(by.model('vm.query')); + + function getNames() { + return phoneNameColumn.map(function(elm) { + return elm.getText(); + }); + } + + query.sendKeys('tablet'); //let's narrow the dataset to make the test assertions shorter + + expect(getNames()).toEqual([ + "Motorola XOOM\u2122 with Wi-Fi", + "MOTOROLA XOOM\u2122" + ]); + + element(by.model('vm.orderProp')).element(by.css('option[value="name"]')).click(); + + expect(getNames()).toEqual([ + "MOTOROLA XOOM\u2122", + "Motorola XOOM\u2122 with Wi-Fi" + ]); + }); + + + it('should render phone specific links', function() { + var query = element(by.model('vm.query')); + query.sendKeys('nexus'); + element.all(by.css('.phones li a')).first().click(); + browser.getLocationAbsUrl().then(function(url) { + expect(url).toEqual('/phones/nexus-s'); + }); + }); + }); + + + describe('Phone detail view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones/nexus-s'); + }); + + + it('should display nexus-s page', function() { + expect(element(by.binding('vm.phone.name')).getText()).toBe('Nexus S'); + }); + + + it('should display the first phone image as the main phone image', function() { + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + + + it('should swap main image if a thumbnail image is clicked on', function() { + element(by.css('.phone-thumbs li:nth-child(3) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.2.jpg/); + + element(by.css('.phone-thumbs li:nth-child(1) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + }); +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/test/karma_test_shim.js b/public/docs/_examples/upgrade/ts/ng2_initial/test/karma_test_shim.js new file mode 100644 index 0000000000..43c3d123ee --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/test/karma_test_shim.js @@ -0,0 +1,54 @@ +// #docregion +// Cancel Karma's synchronous start, +// we will call `__karma__.start()` later, once all the specs are loaded. +__karma__.loaded = function() {}; + +System.config({ + packages: { + 'base/app/js': { + defaultExtension: false, + format: 'register', + map: Object.keys(window.__karma__.files). + filter(onlyAppFiles). + reduce(function createPathRecords(pathsMapping, appPath) { + // creates local module name mapping to global path with karma's fingerprint in path, e.g.: + // './hero.service': '/base/src/app/hero.service.js?f4523daf879cfb7310ef6242682ccf10b2041b3e' + var moduleName = appPath.replace(/^\/base\/app\/js\//, './').replace(/\.js$/, ''); + pathsMapping[moduleName] = appPath + '?' + window.__karma__.files[appPath] + return pathsMapping; + }, {}) + }, + 'rxjs': { + defaultExtension: 'js' + } + }, + map: { + 'rxjs' : '/base/node_modules/rxjs' + } +}); + +// #docregion ng2 +System.import('angular2/src/platform/browser/browser_adapter').then(function(browser_adapter) { + browser_adapter.BrowserDomAdapter.makeCurrent(); +}).then(function() { + return Promise.all( + Object.keys(window.__karma__.files) // All files served by Karma. + .filter(onlySpecFiles) + .map(function(moduleName) { + // loads all spec files via their global module names + return System.import(moduleName); + })); +}).then(function() { + __karma__.start(); +}, function(error) { + __karma__.error(error.stack || error); +}); +// #enddocregion ng2 + +function onlyAppFiles(filePath) { + return /^\/base\/app\/js\/.*\.js$/.test(filePath) +} + +function onlySpecFiles(path) { + return /\.spec\.js$/.test(path); +} diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/test/protractor-conf.js b/public/docs/_examples/upgrade/ts/ng2_initial/test/protractor-conf.js new file mode 100644 index 0000000000..118c7b9ec2 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/test/protractor-conf.js @@ -0,0 +1,21 @@ +exports.config = { + allScriptsTimeout: 11000, + + specs: [ + 'e2e/*.js' + ], + + capabilities: { + 'browserName': 'chrome' + }, + + chromeOnly: true, + + baseUrl: 'http://localhost:8000/', + + framework: 'jasmine', + + jasmineNodeOpts: { + defaultTimeoutInterval: 30000 + } +}; diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/test/test_helper.ts b/public/docs/_examples/upgrade/ts/ng2_initial/test/test_helper.ts new file mode 100644 index 0000000000..dca9476b5e --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/test/test_helper.ts @@ -0,0 +1,2 @@ +// #docregion +/// diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/Phones.spec.ts b/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/Phones.spec.ts new file mode 100644 index 0000000000..61f3fc1117 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/Phones.spec.ts @@ -0,0 +1,16 @@ +// #docregion +import {describe, beforeEachProviders, it, inject} from 'angular2/testing'; +import {HTTP_PROVIDERS} from 'angular2/http'; +import {Phones} from '../../app/js/core/Phones'; + +describe('Phones', function() { + + // load providers + beforeEachProviders(() => [Phones, HTTP_PROVIDERS]); + + // Test service availability + it('check the existence of Phones', inject([Phones], (phones) => { + expect(phones).toBeDefined(); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/checkmark.filter.spec.ts b/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/checkmark.filter.spec.ts new file mode 100644 index 0000000000..bae35e6875 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/checkmark.filter.spec.ts @@ -0,0 +1,15 @@ +// #docregion top +import '../../app/js/core/core.module'; +// #enddocregion top + +describe('checkmarkFilter', function() { + + beforeEach(angular.mock.module('phonecat.core')); + + it('should convert boolean values to unicode checkmark or cross', + inject(function(checkmarkFilter) { + expect(checkmarkFilter(true)).toBe('\u2713'); + expect(checkmarkFilter(false)).toBe('\u2718'); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/phone_detail.controller.spec.ts b/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/phone_detail.controller.spec.ts new file mode 100644 index 0000000000..12f8402b73 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/phone_detail.controller.spec.ts @@ -0,0 +1,44 @@ +// #docregion +import {Observable} from 'rxjs'; +import {describe, beforeEach, it} from 'angular2/testing'; +import '../../app/js/phone_detail/phone_detail.module'; +import {Phones} from '../../app/js/core/Phones'; + +import {FromObservable} from 'rxjs/observable/from'; + +describe('PhoneDetailCtrl', function(){ + var scope, phones, $controller, + xyzPhoneData = function() { + return { + name: 'phone xyz', + snippet: '', + images: ['image/url1.png', 'image/url2.png'] + } + }; + + beforeEach(angular.mock.module('phonecat.detail')); + + // Supply a hand-instantianted instance of the Phones service + beforeEach(angular.mock.module(function($provide) { + $provide.factory('phones', function() { + return new Phones(null); + }); + })); + + beforeEach(inject(function(_phones_, _$controller_, $rootScope, $routeParams) { + phones = _phones_; + $controller = _$controller_; + $routeParams.phoneId = 'xyz'; + scope = $rootScope.$new(); + })); + + + it('should fetch phone detail', function() { + spyOn(phones, 'get').and.returnValue(FromObservable.create([xyzPhoneData()])); + + let ctrl = $controller('PhoneDetailCtrl', {$scope: scope}); + + expect(phones.get).toHaveBeenCalledWith('xyz'); + expect(ctrl.phone).toEqual(xyzPhoneData()); + }); +}); diff --git a/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/phone_list.controller.spec.ts b/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/phone_list.controller.spec.ts new file mode 100644 index 0000000000..1c216aeb30 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/ng2_initial/test/unit/phone_list.controller.spec.ts @@ -0,0 +1,39 @@ +// #docregion +import {Observable} from 'rxjs'; +import {describe, beforeEach, it} from 'angular2/testing'; +import '../../app/js/phone_list/phone_list.module'; +import {Phones} from '../../app/js/core/Phones'; + +import {FromObservable} from 'rxjs/observable/from'; + +describe('PhoneListCtrl', function(){ + var scope, ctrl, $httpBackend; + + beforeEach(angular.mock.module('phonecat.list')); + + // Supply a hand-instantianted instance of the Phones service + beforeEach(angular.mock.module(function($provide) { + $provide.factory('phones', function() { + return new Phones(null); + }); + })); + + beforeEach(inject(function(phones, $rootScope, $controller) { + spyOn(phones, 'query').and.returnValue(FromObservable.create([ + [{name: 'Nexus S'}, {name: 'Motorola DROID'}] + ])); + scope = $rootScope.$new(); + ctrl = $controller('PhoneListCtrl', {$scope: scope}); + })); + + + it('should create "phones" model with 2 phones fetched from xhr', function() { + expect(ctrl.phones).toEqual( + [{name: 'Nexus S'}, {name: 'Motorola DROID'}]); + }); + + + it('should set the default value of orderProp model', function() { + expect(ctrl.orderProp).toBe('age'); + }); +}); diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/.bowerrc b/public/docs/_examples/upgrade/ts/typescript-conversion/.bowerrc new file mode 100644 index 0000000000..5773025bf9 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "app/bower_components" +} diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/.gitignore b/public/docs/_examples/upgrade/ts/typescript-conversion/.gitignore new file mode 100644 index 0000000000..8cfe0da551 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/.gitignore @@ -0,0 +1,6 @@ +app/**/*.js +app/**/*.js.map +test/unit/**/*.js +test/unit/**/*.js.map +test/e2e/**/*.js +test/e2e/**/*.js.map diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/css/.gitkeep b/public/docs/_examples/upgrade/ts/typescript-conversion/app/css/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/css/animations.css b/public/docs/_examples/upgrade/ts/typescript-conversion/app/css/animations.css new file mode 100644 index 0000000000..46f3da6ecb --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/css/animations.css @@ -0,0 +1,97 @@ +/* + * animations css stylesheet + */ + +/* animate ngRepeat in phone listing */ + +.phone-listing.ng-enter, +.phone-listing.ng-leave, +.phone-listing.ng-move { + -webkit-transition: 0.5s linear all; + -moz-transition: 0.5s linear all; + -o-transition: 0.5s linear all; + transition: 0.5s linear all; +} + +.phone-listing.ng-enter, +.phone-listing.ng-move { + opacity: 0; + height: 0; + overflow: hidden; +} + +.phone-listing.ng-move.ng-move-active, +.phone-listing.ng-enter.ng-enter-active { + opacity: 1; + height: 120px; +} + +.phone-listing.ng-leave { + opacity: 1; + overflow: hidden; +} + +.phone-listing.ng-leave.ng-leave-active { + opacity: 0; + height: 0; + padding-top: 0; + padding-bottom: 0; +} + +/* cross fading between routes with ngView */ + +.view-container { + position: relative; +} + +.view-frame.ng-enter, +.view-frame.ng-leave { + background: white; + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.view-frame.ng-enter { + -webkit-animation: 0.5s fade-in; + -moz-animation: 0.5s fade-in; + -o-animation: 0.5s fade-in; + animation: 0.5s fade-in; + z-index: 100; +} + +.view-frame.ng-leave { + -webkit-animation: 0.5s fade-out; + -moz-animation: 0.5s fade-out; + -o-animation: 0.5s fade-out; + animation: 0.5s fade-out; + z-index: 99; +} + +@keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +@-moz-keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} +@-webkit-keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} +@-moz-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} +@-webkit-keyframes fade-out { + from { opacity: 1; } + to { opacity: 0; } +} + diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/css/app.css b/public/docs/_examples/upgrade/ts/typescript-conversion/app/css/app.css new file mode 100644 index 0000000000..f41c420776 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/css/app.css @@ -0,0 +1,99 @@ +/* app css stylesheet */ + +body { + padding-top: 20px; +} + + +.phone-images { + background-color: white; + width: 450px; + height: 450px; + overflow: hidden; + position: relative; + float: left; +} + +.phones { + list-style: none; +} + +.thumb { + float: left; + margin: -0.5em 1em 1.5em 0; + padding-bottom: 1em; + height: 100px; + width: 100px; +} + +.phones li { + clear: both; + height: 115px; + padding-top: 15px; +} + +/** Detail View **/ +img.phone { + float: left; + margin-right: 3em; + margin-bottom: 2em; + background-color: white; + padding: 2em; + height: 400px; + width: 400px; + display: none; +} + +img.phone:first-of-type { + display: block; +} + + +ul.phone-thumbs { + margin: 0; + list-style: none; +} + +ul.phone-thumbs li { + border: 1px solid black; + display: inline-block; + margin: 1em; + background-color: white; +} + +ul.phone-thumbs img { + height: 100px; + width: 100px; + padding: 1em; +} + +ul.phone-thumbs img:hover { + cursor: pointer; +} + + +ul.specs { + clear: both; + margin: 0; + padding: 0; + list-style: none; +} + +ul.specs > li{ + display: inline-block; + width: 200px; + vertical-align: top; +} + +ul.specs > li > span{ + font-weight: bold; + font-size: 1.2em; +} + +ul.specs dt { + font-weight: bold; +} + +h1 { + border-bottom: 1px solid gray; +} diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/img/.gitkeep b/public/docs/_examples/upgrade/ts/typescript-conversion/app/img/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/img/glyphicons-halflings-white.png b/public/docs/_examples/upgrade/ts/typescript-conversion/app/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/img/glyphicons-halflings.png b/public/docs/_examples/upgrade/ts/typescript-conversion/app/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..5b67ffda5ff5caa7f1dfeb119f9f35830fb7a789 GIT binary patch literal 12601 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 NM|m~5DjCz@{|hh;;@|)P literal 0 HcmV?d00001 diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/index.html b/public/docs/_examples/upgrade/ts/typescript-conversion/app/index.html new file mode 100644 index 0000000000..326cd44a44 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/index.html @@ -0,0 +1,40 @@ + + + + + Google Phone Gallery + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/app.module.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/app.module.ts new file mode 100644 index 0000000000..1ad958caec --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/app.module.ts @@ -0,0 +1,41 @@ +// #docregion pre-bootstrap +// #docregion typings +/// +/// +/// +// #enddocregion + +import core from './core/core.module'; +import phoneList from './phone_list/phone_list.module'; +import phoneDetail from './phone_detail/phone_detail.module'; + +angular.module('phonecatApp', [ + 'ngAnimate', + 'ngRoute', + core.name, + phoneList.name, + phoneDetail.name +]).config(configure); + +configure.$inject = ['$routeProvider']; + +function configure($routeProvider) { + $routeProvider. + when('/phones', { + templateUrl: 'js/phone_list/phone_list.html', + controller: 'PhoneListCtrl', + controllerAs: 'vm' + }). + when('/phones/:phoneId', { + templateUrl: 'js/phone_detail/phone_detail.html', + controller: 'PhoneDetailCtrl', + controllerAs: 'vm' + }). + otherwise({ + redirectTo: '/phones' + }); +} +// #enddocregion pre-bootstrap +// #docregion bootstrap +angular.bootstrap(document.documentElement, ['phonecatApp']); +// #enddocregion bootstrap diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/checkmark.filter.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/checkmark.filter.ts new file mode 100644 index 0000000000..b2615f15e4 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/checkmark.filter.ts @@ -0,0 +1,6 @@ +// #docregion +export default function checkmarkFilter() { + return function(input) { + return input ? '\u2713' : '\u2718'; + }; +} diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/core.module.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/core.module.ts new file mode 100644 index 0000000000..c20ce33683 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/core.module.ts @@ -0,0 +1,9 @@ +// #docregion +import Phone from './phone.factory'; +import checkmarkFilter from './checkmark.filter'; + +export default angular.module('phonecat.core', [ + 'ngResource' + ]) + .factory('Phone', Phone) + .filter('checkmark', checkmarkFilter); diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/phone.factory.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/phone.factory.ts new file mode 100644 index 0000000000..a8492b29fc --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/core/phone.factory.ts @@ -0,0 +1,10 @@ +// #docregion +Phone.$inject = ['$resource']; + +function Phone($resource) { + return $resource('phones/:phoneId.json', {}, { + query: {method:'GET', params:{phoneId:'phones'}, isArray:true} + }); +} + +export default Phone; diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.controller.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.controller.ts new file mode 100644 index 0000000000..c8745c0cd2 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.controller.ts @@ -0,0 +1,14 @@ +// #docregion +PhoneDetailCtrl.$inject = ['$routeParams', 'Phone']; + +function PhoneDetailCtrl($routeParams, Phone) { + var vm = this; + vm.phone = Phone.get({phoneId: $routeParams.phoneId}, function(phone) { + vm.mainImageUrl = phone.images[0]; + }); + vm.setImage = function(imageUrl) { + vm.mainImageUrl = imageUrl; + }; +} + +export default PhoneDetailCtrl; diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.html b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.html new file mode 100644 index 0000000000..954c65c2cd --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.html @@ -0,0 +1,118 @@ +
+ +
+ +

{{vm.phone.name}}

+ +

{{vm.phone.description}}

+ +
    +
  • + +
  • +
+ +
    +
  • + Availability and Networks +
    +
    Availability
    +
    {{availability}}
    +
    +
  • +
  • + Battery +
    +
    Type
    +
    {{vm.phone.battery.type}}
    +
    Talk Time
    +
    {{vm.phone.battery.talkTime}}
    +
    Standby time (max)
    +
    {{vm.phone.battery.standbyTime}}
    +
    +
  • +
  • + Storage and Memory +
    +
    RAM
    +
    {{vm.phone.storage.ram}}
    +
    Internal Storage
    +
    {{vm.phone.storage.flash}}
    +
    +
  • +
  • + Connectivity +
    +
    Network Support
    +
    {{vm.phone.connectivity.cell}}
    +
    WiFi
    +
    {{vm.phone.connectivity.wifi}}
    +
    Bluetooth
    +
    {{vm.phone.connectivity.bluetooth}}
    +
    Infrared
    +
    {{vm.phone.connectivity.infrared | checkmark}}
    +
    GPS
    +
    {{vm.phone.connectivity.gps | checkmark}}
    +
    +
  • +
  • + Android +
    +
    OS Version
    +
    {{vm.phone.android.os}}
    +
    UI
    +
    {{vm.phone.android.ui}}
    +
    +
  • +
  • + Size and Weight +
    +
    Dimensions
    +
    {{dim}}
    +
    Weight
    +
    {{vm.phone.sizeAndWeight.weight}}
    +
    +
  • +
  • + Display +
    +
    Screen size
    +
    {{vm.phone.display.screenSize}}
    +
    Screen resolution
    +
    {{vm.phone.display.screenResolution}}
    +
    Touch screen
    +
    {{vm.phone.display.touchScreen | checkmark}}
    +
    +
  • +
  • + Hardware +
    +
    CPU
    +
    {{vm.phone.hardware.cpu}}
    +
    USB
    +
    {{vm.phone.hardware.usb}}
    +
    Audio / headphone jack
    +
    {{vm.phone.hardware.audioJack}}
    +
    FM Radio
    +
    {{vm.phone.hardware.fmRadio | checkmark}}
    +
    Accelerometer
    +
    {{vm.phone.hardware.accelerometer | checkmark}}
    +
    +
  • +
  • + Camera +
    +
    Primary
    +
    {{vm.phone.camera.primary}}
    +
    Features
    +
    {{vm.phone.camera.features.join(', ')}}
    +
    +
  • +
  • + Additional Features +
    {{vm.phone.additionalFeatures}}
    +
  • +
diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.module.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.module.ts new file mode 100644 index 0000000000..5ea1739577 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_detail/phone_detail.module.ts @@ -0,0 +1,8 @@ +// #docregion +import PhoneDetailCtrl from './phone_detail.controller'; + +export default angular.module('phonecat.detail', [ + 'phonecat.core', + 'ngRoute' + ]) + .controller('PhoneDetailCtrl', PhoneDetailCtrl); diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.controller.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.controller.ts new file mode 100644 index 0000000000..63dc2a6548 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.controller.ts @@ -0,0 +1,10 @@ +// #docregion +PhoneListCtrl.$inject = ['Phone']; + +function PhoneListCtrl(Phone) { + var vm = this; + vm.phones = Phone.query(); + vm.orderProp = 'age'; +} + +export default PhoneListCtrl; diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.html b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.html new file mode 100644 index 0000000000..471f474e89 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.html @@ -0,0 +1,28 @@ +
+
+
+ + + Search: + Sort by: + + +
+
+ + + + +
+
+
diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.module.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.module.ts new file mode 100644 index 0000000000..758b937927 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/app/js/phone_list/phone_list.module.ts @@ -0,0 +1,5 @@ +// #docregion +import PhoneListCtrl from './phone_list.controller'; + +export default angular.module('phonecat.list', ['phonecat.core']) + .controller('PhoneListCtrl', PhoneListCtrl); diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/bower.json b/public/docs/_examples/upgrade/ts/typescript-conversion/bower.json new file mode 100644 index 0000000000..03c0d72ea4 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/bower.json @@ -0,0 +1,20 @@ +{ + "name": "angular-phonecat", + "description": "A starter project for AngularJS", + "version": "0.0.0", + "homepage": "https://github.com/angular/angular-phonecat", + "license": "MIT", + "private": true, + "dependencies": { + "angular": "1.5.0-beta.2", + "angular-mocks": "1.5.0-beta.2", + "jquery": "~2.1.1", + "bootstrap": "~3.1.1", + "angular-route": "1.5.0-beta.2", + "angular-resource": "1.5.0-beta.2", + "angular-animate": "1.5.0-beta.2" + }, + "resolutions": { + "angular": "1.5.0-beta.2" + } +} diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/test/e2e/scenarios.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/test/e2e/scenarios.ts new file mode 100644 index 0000000000..4cdbefc047 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/test/e2e/scenarios.ts @@ -0,0 +1,103 @@ +'use strict'; + +/* http://docs.angularjs.org/guide/dev_guide.e2e-testing */ +// #docregion declares +declare var browser:any, element:any, by:any; +// #enddocregion declares + +describe('PhoneCat App', function() { + + it('should redirect index.html to index.html#/phones', function() { + browser.get('app/index.html'); + browser.getLocationAbsUrl().then(function(url) { + expect(url).toEqual('/phones'); + }); + }); + + + describe('Phone list view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones'); + }); + + + it('should filter the phone list as a user types into the search box', function() { + var phoneList = element.all(by.repeater('phone in vm.phones')); + var query = element(by.model('vm.query')); + + expect(phoneList.count()).toBe(20); + + query.sendKeys('nexus'); + expect(phoneList.count()).toBe(1); + + query.clear(); + query.sendKeys('motorola'); + expect(phoneList.count()).toBe(8); + }); + + + it('should be possible to control phone order via the drop down select box', function() { + + var phoneNameColumn = element.all(by.repeater('phone in vm.phones').column('phone.name')); + var query = element(by.model('vm.query')); + + function getNames() { + return phoneNameColumn.map(function(elm) { + return elm.getText(); + }); + } + + query.sendKeys('tablet'); //let's narrow the dataset to make the test assertions shorter + + expect(getNames()).toEqual([ + "Motorola XOOM\u2122 with Wi-Fi", + "MOTOROLA XOOM\u2122" + ]); + + element(by.model('vm.orderProp')).element(by.css('option[value="name"]')).click(); + + expect(getNames()).toEqual([ + "MOTOROLA XOOM\u2122", + "Motorola XOOM\u2122 with Wi-Fi" + ]); + }); + + + it('should render phone specific links', function() { + var query = element(by.model('vm.query')); + query.sendKeys('nexus'); + element.all(by.css('.phones li a')).first().click(); + browser.getLocationAbsUrl().then(function(url) { + expect(url).toEqual('/phones/nexus-s'); + }); + }); + }); + + + describe('Phone detail view', function() { + + beforeEach(function() { + browser.get('app/index.html#/phones/nexus-s'); + }); + + + it('should display nexus-s page', function() { + expect(element(by.binding('vm.phone.name')).getText()).toBe('Nexus S'); + }); + + + it('should display the first phone image as the main phone image', function() { + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + + + it('should swap main image if a thumbnail image is clicked on', function() { + element(by.css('.phone-thumbs li:nth-child(3) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.2.jpg/); + + element(by.css('.phone-thumbs li:nth-child(1) img')).click(); + expect(element(by.css('img.phone.active')).getAttribute('src')).toMatch(/img\/phones\/nexus-s.0.jpg/); + }); + }); +}); diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/test/jasmine_matchers.d.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/test/jasmine_matchers.d.ts new file mode 100644 index 0000000000..6d24879775 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/test/jasmine_matchers.d.ts @@ -0,0 +1,6 @@ +// #docregion +declare module jasmine { + interface Matchers { + toEqualData(expected: any):boolean; + } +} diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/test/karma_test_shim.js b/public/docs/_examples/upgrade/ts/typescript-conversion/test/karma_test_shim.js new file mode 100644 index 0000000000..15cbee5d7d --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/test/karma_test_shim.js @@ -0,0 +1,44 @@ +// #docregion +// Cancel Karma's synchronous start, +// we will call `__karma__.start()` later, once all the specs are loaded. +__karma__.loaded = function() {}; + +System.config({ + packages: { + 'base/app/js': { + defaultExtension: false, + format: 'register', + map: Object.keys(window.__karma__.files). + filter(onlyAppFiles). + reduce(function createPathRecords(pathsMapping, appPath) { + // creates local module name mapping to global path with karma's fingerprint in path, e.g.: + // './hero.service': '/base/src/app/hero.service.js?f4523daf879cfb7310ef6242682ccf10b2041b3e' + var moduleName = appPath.replace(/^\/base\/app\/js\//, './').replace(/\.js$/, ''); + pathsMapping[moduleName] = appPath + '?' + window.__karma__.files[appPath] + return pathsMapping; + }, {}) + + } + } +}); + +Promise.all( + Object.keys(window.__karma__.files) // All files served by Karma. + .filter(onlySpecFiles) + .map(function(moduleName) { + // loads all spec files via their global module names + return System.import(moduleName); +})) +.then(function() { + __karma__.start(); +}, function(error) { + __karma__.error(error.stack || error); +}); + +function onlyAppFiles(filePath) { + return /^\/base\/app\/js\/.*\.js$/.test(filePath) +} + +function onlySpecFiles(path) { + return /\.spec\.js$/.test(path); +} diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/test/protractor-conf.js b/public/docs/_examples/upgrade/ts/typescript-conversion/test/protractor-conf.js new file mode 100644 index 0000000000..118c7b9ec2 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/test/protractor-conf.js @@ -0,0 +1,21 @@ +exports.config = { + allScriptsTimeout: 11000, + + specs: [ + 'e2e/*.js' + ], + + capabilities: { + 'browserName': 'chrome' + }, + + chromeOnly: true, + + baseUrl: 'http://localhost:8000/', + + framework: 'jasmine', + + jasmineNodeOpts: { + defaultTimeoutInterval: 30000 + } +}; diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/test/test_helper.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/test/test_helper.ts new file mode 100644 index 0000000000..75f83fab7a --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/test/test_helper.ts @@ -0,0 +1,3 @@ +// #docregion +/// +/// diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/checkmark.filter.spec.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/checkmark.filter.spec.ts new file mode 100644 index 0000000000..bae35e6875 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/checkmark.filter.spec.ts @@ -0,0 +1,15 @@ +// #docregion top +import '../../app/js/core/core.module'; +// #enddocregion top + +describe('checkmarkFilter', function() { + + beforeEach(angular.mock.module('phonecat.core')); + + it('should convert boolean values to unicode checkmark or cross', + inject(function(checkmarkFilter) { + expect(checkmarkFilter(true)).toBe('\u2713'); + expect(checkmarkFilter(false)).toBe('\u2718'); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone.factory.spec.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone.factory.spec.ts new file mode 100644 index 0000000000..d7c95d347e --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone.factory.spec.ts @@ -0,0 +1,15 @@ +// #docregion top +import '../../app/js/core/core.module'; +// #enddocregion top + +describe('phoneFactory', function() { + + // load modules + beforeEach(angular.mock.module('phonecat.core')); + + // Test service availability + it('check the existence of Phone factory', inject(function(Phone) { + expect(Phone).toBeDefined(); + })); + +}); diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone_detail.controller.spec.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone_detail.controller.spec.ts new file mode 100644 index 0000000000..02a3e20240 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone_detail.controller.spec.ts @@ -0,0 +1,44 @@ +// #docregion top +import '../../app/js/phone_detail/phone_detail.module'; +// #enddocregion top + +describe('PhoneDetailCtrl', function(){ + var scope, $httpBackend, ctrl, + xyzPhoneData = function() { + return { + name: 'phone xyz', + images: ['image/url1.png', 'image/url2.png'] + } + }; + + beforeEach(angular.mock.module('phonecat.detail')); + + beforeEach(function(){ + jasmine.addMatchers({ + toEqualData: function(util, customEqualityTesters) { + return { + compare: function(actual, expected) { + return {pass: angular.equals(actual, expected)}; + } + }; + } + }); + }); + + beforeEach(inject(function(_$httpBackend_, $rootScope, $routeParams, $controller) { + $httpBackend = _$httpBackend_; + $httpBackend.expectGET('phones/xyz.json').respond(xyzPhoneData()); + + $routeParams.phoneId = 'xyz'; + scope = $rootScope.$new(); + ctrl = $controller('PhoneDetailCtrl', {$scope: scope}); + })); + + + it('should fetch phone detail', function() { + expect(ctrl.phone).toEqualData({}); + $httpBackend.flush(); + + expect(ctrl.phone).toEqualData(xyzPhoneData()); + }); +}); diff --git a/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone_list.controller.spec.ts b/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone_list.controller.spec.ts new file mode 100644 index 0000000000..efec5d5f08 --- /dev/null +++ b/public/docs/_examples/upgrade/ts/typescript-conversion/test/unit/phone_list.controller.spec.ts @@ -0,0 +1,44 @@ +// #docregion top +import '../../app/js/phone_list/phone_list.module'; +// #enddocregion top + +describe('PhoneListCtrl', function(){ + var scope, ctrl, $httpBackend; + + beforeEach(angular.mock.module('phonecat.list')); + + beforeEach(function(){ + jasmine.addMatchers({ + toEqualData: function(util, customEqualityTesters) { + return { + compare: function(actual, expected) { + return {pass: angular.equals(actual, expected)}; + } + }; + } + }); + }); + + beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) { + $httpBackend = _$httpBackend_; + $httpBackend.expectGET('phones/phones.json'). + respond([{name: 'Nexus S'}, {name: 'Motorola DROID'}]); + + scope = $rootScope.$new(); + ctrl = $controller('PhoneListCtrl', {$scope: scope}); + })); + + + it('should create "phones" model with 2 phones fetched from xhr', function() { + expect(ctrl.phones).toEqualData([]); + $httpBackend.flush(); + + expect(ctrl.phones).toEqualData( + [{name: 'Nexus S'}, {name: 'Motorola DROID'}]); + }); + + + it('should set the default value of orderProp model', function() { + expect(ctrl.orderProp).toBe('age'); + }); +}); diff --git a/public/docs/ts/latest/guide/_data.json b/public/docs/ts/latest/guide/_data.json index 02453a3398..1a8f3c296e 100644 --- a/public/docs/ts/latest/guide/_data.json +++ b/public/docs/ts/latest/guide/_data.json @@ -8,11 +8,11 @@ "cheatsheet": { "title": "Angular Cheat Sheet" }, - + "architecture": { "title": "Architecture Overview" }, - + "displaying-data": { "title": "Displaying Data", "intro": "In Angular, we display data by binding component properties to elements in HTML templates using interpolation and other forms of Property Binding." @@ -27,7 +27,7 @@ "title": "Forms", "intro": "A form creates a cohesive, effective, and compelling data entry experience. An Angular form coordinates a set of data-bound user controls, tracks changes, validates input, and presents errors." }, - + "dependency-injection": { "title": "Dependency Injection", "intro": "Angular's dependency injection system creates and delivers dependent services \"just-in-time\"." @@ -47,17 +47,22 @@ "title": "Attribute Directives", "intro": "Attribute directives attach behavior to elements." }, - + "structural-directives": { "title": "Structural Directives", "intro": "Angular has a powerful template engine that lets us easily manipulate the DOM structure of our elements." - }, + }, "hierarchical-dependency-injection": { "title": "Hierarchical Injectors", "intro": "Angular's hierarchical dependency injection system supports nested injectors in parallel with the component tree." }, + "upgrade": { + "title": "Upgrading from 1.x", + "intro": "Angular 1 applications can be incrementally upgraded to Angular 2." + }, + "glossary": { "title": "Glossary", "intro": "Brief definitions of the most important words in the Angular 2 vocabulary" diff --git a/public/docs/ts/latest/guide/upgrade.jade b/public/docs/ts/latest/guide/upgrade.jade new file mode 100644 index 0000000000..713d4ea441 --- /dev/null +++ b/public/docs/ts/latest/guide/upgrade.jade @@ -0,0 +1,1291 @@ +include ../../../../_includes/_util-fns + +:marked + Having an existing Angular 1 application doesn't mean that we can't + begin enjoying everything Angular 2 has to offer. That's beause + Angular 2 comes with built-in tools for migrating Angular 1 projects + over to the Angular 2 platform. + + One of the keys to a successful upgrade is to do it incrementally, + by running the two frameworks side by side in the same application, + and porting Angular 1 components to Angular 2 one by one. This makes + it possible to upgrade even large and complex applications without + disrupting other work. The `upgrade` module in Angular 2 has + been designed to make incremental upgrading seamless. + + In this chapter we will look at a complete example of preparing and + upgrading an application using the `upgrade` module. The app we're going + to work on is [Angular PhoneCat](https://github.com/angular/angular-phonecat) + from [the original Angular 1 tutorial](https://docs.angularjs.org/tutorial), + which is where many of us began our Angular adventures. Now we'll see how to + bring that application to the brave new world of Angular 2. + + During the process we'll learn + + - How to prepare and align an Angular 1 application with Angular 2 + + - How to use the SystemJS module loader and TypeScript with Angular 1 + + - How to develop and test a hybrid Angular 1+2 application + + - How to migrate an application to Angular 2 one component at a time + + To follow along with the tutorial, clone the + [angular-phonecat](https://github.com/angular/angular-phonecat) repository + and apply the steps as we go + +.alert.is-important + :marked + If you do clone this repository, note that it doesn't look like this guide + assumes yet. There's [a pull request](https://github.com/angular/angular-phonecat/pull/289) + that will change this. Meanwhile, you'll find a good starting point from + [this commit](https://github.com/teropa/angular-phonecat/commit/d6fb83e1c2db9d1812c7c478fdb8d92301ef0061). + +.l-main-section +:marked + ## Preparing for the Upgrade + + In terms of project structure, this is where our work begins + + ``` + angular-phonecat + ├── bower.json + ├── package.json + ├── app + │ ├── js + │ │ ├── core + │ │ │ ├── checkmark.filter.js + │ │ │ ├── core.module.js + │ │ │ └── phone.factory.js + │ │ ├── phone_detail + │ │ │ ├── phone_detail.html + │ │ │ ├── phone_detail.module.js + │ │ │ └── phone_detail.controller.js + │ │ ├── phone_list + │ │ │ ├── phone_list.html + │ │ │ ├── phone_list.module.js + │ │ │ └── phone_list.controller.js + │ │ └── app.module.js + │ ├── css + │ │ ├── animations.css + │ │ └── app.css + │ ├── img + │ │ └── ... + │ ├── phones + │ │ └── ... + │ └── index.html + └── test + ├── e2e + │ └── scenarios.js + ├── unit + │ ├── checkmark.filter.spec.js + │ ├── phone_detail.controller.spec.js + │ ├── phone.factory.spec.js + │ └── phone_list.controller.spec.js + ├── karma.conf.js + └── protractor-conf.js + ``` + + This is actually a pretty good starting point. In particular, this organization + follows the [Angular Style Guide](https://github.com/johnpapa/angular-styleguide), + which is an important [preparation step](preparation.html) before a successful upgrade. + + * Each controller, factory, and filter is in its own source file, as per the + [Rule of 1](https://github.com/johnpapa/angular-styleguide#single-responsibility). + * The `core`, `phoneDetail`, and `phoneList` modules are each in their + own subdirectory. Those subdirectories contain the JavaScript code as well as + the HTML templates that go with each particular feature. This is in line with the + [Folders-by-Feature Structure](https://github.com/johnpapa/angular-styleguide#style-y152) + and [Modularity](https://github.com/johnpapa/angular-styleguide#modularity) + rules. + +:marked + ## TypeScript And Module Loading + + Since we're going to be writing our Angular 2 code in TypeScript, it makes sense to + bring in the TypeScript compiler even before we begin upgrading. + + In order to use TypeScript's ES2015 module system to `import` and `export` code, we're + going to need a JavaScript module loader. Our application doesn't currently + use one, and is just using plain old `