From 760658ddfc01052430b245710cd7c555e67d6253 Mon Sep 17 00:00:00 2001 From: Kathy Walrath Date: Thu, 3 Mar 2016 22:50:42 -0800 Subject: [PATCH] docs(TOH-HTTP): TOH Http chapter closes #972 chore(toh): change inputs array for input decorator/hero now a class docs(dart): update to b12 Also update dart_to_js_script_rewriter dependency to ^1.0.1, and change most angular2.dart imports to be core.dart instead. The pipes example broke without the angular2.dart import, so I let it be. The server-communication sample has never worked for me, so I changed it but might have broken it further. closes #1007 docs: update to style-guide links closes #995 Fixed links to John Papa style guide to new repo location. docs(cb-ts-to-js): add cookbook about applying TypeScript examples to ES5 closes #893 docs(dart): change imports from bootstrap.dart to platform/browser.dart closes #1013 samples(dart): add info file for dart-doc-syncer to template-syntax closes #1018 samples(dart): add link to documentation chapter closes #1019 docs(toh-1): remove public access modifiers closes #1009 Remove public access modifier on AppComponent properties to be consistent throughout code tutorial docs(dependency-injection): tweak Dart wording closes #1017 docs(dart): tweak homepage banner closes #1016 docs(quickstart): fixed "hurray" typo. closes #1021 docs: update to beta.13 docs(dart/quickstart): merge 2 examples into 1 closes #1031 docs(dart): update to beta.13.1 closes #1032 Add additional tags to the angular.io dgeni package for the new api doc style proposal. Closes #1030 chore: remove angulardart.org link from footer closes #1034 fix(api-builder): add missing git package dependency This was causing the api-builder tests to fail chore(typo): quide -> guide in cheatsheets closes #1039 docs:Create Tour of Heroes chapter on http some text changes wired up web api text adding saving wired up CRUD remove unused files fixed toggle whitespace text text text updates text text tweaks added tests test fixed button click images fixed test tweaks docs(toh): add missing nav path to diagram per #1041 chore: fix typo in ts-to-js intro closes #1025 chore(bio): add Deborah's bio closes #1024 docs(bio): fixes Jules' bio links closes #1027 fix(e2e): fix race condition docs(toh-4): reword the getHeroesSlowly instructions closes #1011 rewording to: "replace `_heroService.getHeroes` with `_heroService.getHeroesSlowly`" docs: add DI cookbook chore: replace VSCode-specific settings.json with broadly recommended .editorconfig closes #1022 docs(template-syntax): fixed "a id" typo in basics section. closes #1048 chore: add "homepage" property to package.json closes #1038 docs(testing): update testing to use toh-5 closes #1003 docs(unit-testing): fix the path to node_modules & steps for adding a new spec closes #1043 package(harp): update harp version to fix async errors docs(component-styles): add chapter about styling components closes #1047 docs(lifecycle-hooks): Fixed missing ":marked" typo closes #1051 docs(todo app): replace remaining tasks reduce func with filter.length closes #1050 docs(component-styles): mark `__moduleName` experimental; use alert instead of callout. closes #1054 docs(pipes): Fixed "If follows..." typo closes #1053 Fixed typo in **pipes** section of guide. chore: update to beta.14 --- .editorconfig | 24 + .vscode/settings.json | 11 - gulpfile.js | 92 +- harp.json | 10 + package.json | 5 +- public/_includes/_footer.jade | 3 +- public/docs/_examples/.editorconfig | 20 + public/docs/_examples/.gitignore | 2 + .../dart/lib/backend_service.dart | 2 +- .../dart/lib/hero_detail_component.dart | 2 +- .../dart/lib/hero_list_component.dart | 2 +- .../architecture/dart/lib/hero_service.dart | 2 +- .../architecture/dart/lib/logger_service.dart | 2 +- .../_examples/architecture/dart/pubspec.yaml | 4 +- .../_examples/architecture/dart/web/main.dart | 3 +- .../dart/lib/app_component.dart | 2 +- .../dart/lib/highlight_directive.dart | 2 +- .../dart/lib/highlight_directive_1.dart | 2 +- .../dart/lib/highlight_directive_2.dart | 2 +- .../attribute-directives/dart/pubspec.yaml | 4 +- .../attribute-directives/dart/web/main.dart | 3 +- .../ts/app/highlight.directive.2.ts | 6 +- .../ts/app/highlight.directive.ts | 21 +- .../cb-component-communication/ts/app/hero.ts | 2 +- .../cb-dependency-injection/e2e-spec.js | 98 ++ .../cb-dependency-injection/ts/.gitignore | 1 + .../ts/app/app.component.html | 39 + .../ts/app/app.component.ts | 46 + .../ts/app/date-logger.service.ts | 37 + .../ts/app/hero-bio.component.ts | 29 + .../ts/app/hero-bios.component.ts | 52 + .../ts/app/hero-cache.service.ts | 19 + .../ts/app/hero-contact.component.ts | 39 + .../ts/app/hero-data.ts | 14 + .../ts/app/hero-of-the-month.component.ts | 75 ++ .../ts/app/hero.service.ts | 22 + .../cb-dependency-injection/ts/app/hero.ts | 9 + .../ts/app/highlight.directive.ts | 28 + .../ts/app/logger.service.ts | 16 + .../cb-dependency-injection/ts/app/main.ts | 25 + .../ts/app/parent-finder.component.ts | 227 +++++ .../ts/app/runners-up.ts | 25 + .../ts/app/sorted-heroes.component.ts | 51 + .../ts/app/user-context.service.ts | 32 + .../ts/app/user.service.ts | 10 + .../ts/example-config.json | 0 .../cb-dependency-injection/ts/index.html | 44 + .../cb-dependency-injection/ts/plnkr.json | 9 + .../cb-dependency-injection/ts/sample.css | 26 + public/docs/_examples/cb-ts-to-js/e2e-spec.js | 73 ++ .../cb-ts-to-js/js/app/data.service.js | 13 + .../hero-di-inject-additional.component.js | 47 + .../js/app/hero-di-inject.component.js | 39 + .../js/app/hero-di-inline.component.js | 16 + .../cb-ts-to-js/js/app/hero-di.component.js | 20 + .../cb-ts-to-js/js/app/hero-dsl.component.js | 23 + .../cb-ts-to-js/js/app/hero-io.component.js | 57 ++ .../js/app/hero-lifecycle.component.js | 21 + .../cb-ts-to-js/js/app/hero.component.js | 32 + .../js/app/heroes-bindings.component.js | 30 + .../js/app/heroes-queries.component.js | 73 ++ .../docs/_examples/cb-ts-to-js/js/app/main.js | 41 + .../cb-ts-to-js/js/example-config.json | 0 .../docs/_examples/cb-ts-to-js/js/index.html | 62 ++ .../docs/_examples/cb-ts-to-js/js/plnkr.json | 7 + .../docs/_examples/cb-ts-to-js/ts/.gitignore | 1 + .../cb-ts-to-js/ts/app/data.service.ts | 10 + .../hero-di-inject-additional.component.ts | 48 + .../ts/app/hero-di-inject.component.ts | 14 + .../cb-ts-to-js/ts/app/hero-di.component.ts | 15 + .../cb-ts-to-js/ts/app/hero-io.component.ts | 56 ++ .../ts/app/hero-lifecycle.component.ts | 19 + .../cb-ts-to-js/ts/app/hero.component.ts | 18 + .../ts/app/heroes-bindings.component.ts | 28 + .../ts/app/heroes-queries.component.ts | 79 ++ .../docs/_examples/cb-ts-to-js/ts/app/main.ts | 35 + .../cb-ts-to-js/ts/example-config.json | 0 .../docs/_examples/cb-ts-to-js/ts/index.html | 61 ++ .../docs/_examples/cb-ts-to-js/ts/plnkr.json | 8 + .../_examples/component-styles/e2e-spec.js | 69 ++ .../_examples/component-styles/ts/.gitignore | 1 + .../ts/app/hero-app-main.component.ts | 19 + .../ts/app/hero-app.component.ts | 25 + .../ts/app/hero-controls.component.ts | 26 + .../ts/app/hero-details-box.css | 3 + .../ts/app/hero-details.component.css | 28 + .../ts/app/hero-details.component.ts | 20 + .../ts/app/hero-team.component.css | 3 + .../ts/app/hero-team.component.ts | 19 + .../_examples/component-styles/ts/app/hero.ts | 7 + .../_examples/component-styles/ts/app/main.ts | 4 + .../ts/app/quest-summary.component.css | 5 + .../ts/app/quest-summary.component.html | 1 + .../ts/app/quest-summary.component.ts | 32 + .../component-styles/ts/example-config.json | 0 .../_examples/component-styles/ts/index.html | 40 + .../_examples/component-styles/ts/plnkr.json | 9 + .../dart/.analysis_options | 16 + .../dart/lib/app_component.dart | 60 +- .../dart/lib/app_component_1.dart | 10 +- .../dart/lib/app_component_2.dart | 24 +- .../dart/lib/app_config.dart | 32 +- .../dart/lib/car/car.dart | 12 +- .../dart/lib/car/car_component.dart | 28 +- .../dart/lib/car/car_creations.dart | 30 +- .../dart/lib/car/car_factory.dart | 8 +- .../dart/lib/car/car_injector.dart | 6 +- .../dart/lib/car/car_no_di.dart | 4 +- .../dart/lib/heroes/hero.dart | 1 - .../dart/lib/heroes/hero_list_component.dart | 13 +- .../lib/heroes/hero_list_component_1.dart | 11 +- .../lib/heroes/hero_list_component_2.dart | 14 +- .../dart/lib/heroes/hero_service.dart | 14 +- .../dart/lib/heroes/hero_service_1.dart | 1 - .../dart/lib/heroes/hero_service_2.dart | 6 +- .../lib/heroes/hero_service_provider.dart | 10 +- .../dart/lib/heroes/heroes_component.dart | 7 +- .../dart/lib/heroes/heroes_component_1.dart | 10 +- .../dart/lib/heroes/mock_heroes.dart | 1 - .../dart/lib/injector_component.dart | 33 +- .../dart/lib/logger_service.dart | 1 - .../dart/lib/providers_component.dart | 326 +++---- .../dart/lib/user_service.dart | 1 - .../dependency-injection/dart/pubspec.yaml | 4 +- .../dart/test/hero_list_component_test.dart | 4 +- .../dependency-injection/dart/web/index.html | 22 +- .../dependency-injection/dart/web/main.dart | 4 +- .../dependency-injection/dart/web/main_1.dart | 10 +- .../ts/app/injector.component.ts | 2 +- .../dart/lib/app_component.dart | 2 +- .../dart/lib/app_component_1.dart | 2 +- .../dart/lib/app_component_2.dart | 2 +- .../dart/lib/app_component_3.dart | 2 +- .../displaying-data/dart/pubspec.yaml | 4 +- .../displaying-data/dart/web/main.dart | 3 +- .../forms/dart/lib/hero_form_component.dart | 2 +- .../dart/lib/hero_form_component_initial.dart | 2 +- public/docs/_examples/forms/dart/pubspec.yaml | 4 +- .../docs/_examples/forms/dart/web/main.dart | 3 +- .../dart/lib/hero.dart | 2 +- .../dart/lib/hero_card_component.dart | 2 +- .../dart/lib/hero_editor_component.dart | 2 +- .../dart/lib/heroes_list_component.dart | 2 +- .../dart/lib/heroes_service.dart | 2 +- .../dart/lib/restore_service.dart | 2 +- .../dart/pubspec.yaml | 4 +- .../dart/web/main.dart | 3 +- .../homepage-hello-world/ts/index.1.html | 14 +- .../_examples/homepage-tabs/ts/index.1.html | 16 +- .../homepage-todo/ts/app/todo_app.ts | 18 +- .../_examples/homepage-todo/ts/index.1.html | 14 +- .../dart/lib/after_content_parent.dart | 2 +- .../dart/lib/after_view_component.dart | 2 +- .../dart/lib/app_component.dart | 2 +- .../dart/lib/child_component.dart | 2 +- .../dart/lib/counter_component.dart | 2 +- .../dart/lib/logger_service.dart | 2 +- .../dart/lib/on_changes_component.dart | 2 +- .../dart/lib/peek_a_boo_component.dart | 2 +- .../dart/lib/peek_a_boo_parent_component.dart | 2 +- .../dart/lib/spy_component.dart | 2 +- .../dart/lib/spy_directive.dart | 2 +- .../lifecycle-hooks/dart/pubspec.yaml | 4 +- .../lifecycle-hooks/dart/web/main.dart | 3 +- public/docs/_examples/package.json | 21 +- public/docs/_examples/pipes/dart/pubspec.yaml | 4 +- .../docs/_examples/pipes/dart/web/main.dart | 3 +- .../quickstart/dart/ex1/pubspec.yaml | 12 - .../quickstart/dart/ex1/web/main.dart | 10 - .../quickstart/dart/ex2/web/index.html | 16 - .../quickstart/dart/{ex2 => }/pubspec.yaml | 9 +- .../quickstart/dart/{ex1 => }/web/index.html | 0 .../quickstart/dart/{ex2 => }/web/main.dart | 4 +- .../_examples/quickstart/js/package.1.json | 4 +- .../_examples/quickstart/ts/package.1.json | 12 +- .../dart/lib/toh/hero_list_component.dart | 4 +- .../dart/lib/toh/hero_service.dart | 2 +- .../dart/lib/toh/toh_component.dart | 2 +- .../dart/lib/wiki/wiki_component.dart | 4 +- .../dart/lib/wiki/wiki_smart_component.dart | 2 +- .../dart/lib/wiki/wikipedia_service.dart | 3 +- .../server-communication/dart/pubspec.yaml | 4 +- .../server-communication/dart/web/main.dart | 3 +- .../dart/lib/heavy_loader_component.dart | 2 +- .../lib/structural_directives_component.dart | 2 +- .../dart/lib/unless_directive.dart | 2 +- .../structural-directives/dart/pubspec.yaml | 4 +- .../structural-directives/dart/web/main.dart | 3 +- .../template-syntax/dart/.docsync.json | 4 + .../dart/lib/app_component.dart | 2 +- .../dart/lib/hero_detail_component.dart | 2 +- .../dart/lib/my_click_directive.dart | 2 +- .../template-syntax/dart/pubspec.yaml | 6 +- .../template-syntax/dart/web/main.dart | 3 +- .../testing/ts/app/app.component.css | 31 + .../_examples/testing/ts/app/app.component.ts | 59 ++ .../testing/ts/app/backend.service.ts | 14 - .../_examples/testing/ts/app/bootstrap.ts | 11 - .../testing/ts/app/dashboard.component.css | 63 ++ .../testing/ts/app/dashboard.component.html | 11 + .../testing/ts/app/dashboard.component.ts | 44 + .../_examples/testing/ts/app/decorators.ts | 16 - .../testing/ts/app/hero-detail.component.css | 33 +- .../testing/ts/app/hero-detail.component.html | 36 +- .../testing/ts/app/hero-detail.component.ts | 66 +- .../_examples/testing/ts/app/hero.service.ts | 49 +- .../_examples/testing/ts/app/hero.spec.ts | 10 +- public/docs/_examples/testing/ts/app/hero.ts | 20 +- public/docs/_examples/testing/ts/app/hero2.ts | 19 - .../testing/ts/app/heroes.component.css | 75 +- .../testing/ts/app/heroes.component.html | 36 +- .../testing/ts/app/heroes.component.ts | 73 +- .../testing/ts/app/init-caps-pipe.spec.ts | 39 - .../testing/ts/app/init-caps-pipe.ts | 15 - public/docs/_examples/testing/ts/app/main.ts | 4 + .../_examples/testing/ts/app/mock-heroes.ts | 82 +- .../testing/ts/app/my-uppercase.pipe.1.ts | 9 + .../testing/ts/app/my-uppercase.pipe.spec.ts | 41 + .../testing/ts/app/my-uppercase.pipe.ts | 13 + .../hero-detail.component.spec.ts.not-yet | 0 ...il.component.wrapped-tests.spec.ts.not-yet | 0 .../hero.service.ng.spec.ts.not-yet} | 0 .../hero.service.no-ng.1.spec.ts.not-yet} | 0 .../hero.service.no-ng.spec.ts.not-yet} | 0 .../heroes.component.ng.spec.ts.not-yet | 0 .../heroes.component.no-ng.spec.ts.not-yet} | 0 .../user.spec.ts.not-yet} | 0 public/docs/_examples/testing/ts/app/user.ts | 6 - public/docs/_examples/testing/ts/index.html | 54 +- .../_examples/testing/ts/unit-tests-0.html | 8 +- .../_examples/testing/ts/unit-tests-1.html | 8 +- .../_examples/testing/ts/unit-tests-2.html | 8 +- .../_examples/testing/ts/unit-tests-3.html | 10 +- .../_examples/testing/ts/unit-tests-4.html | 25 +- .../_examples/testing/ts/unit-tests-5.html | 50 + .../testing/ts/unit-tests-5.html.not-yet | 44 - .../testing/ts/unit-tests-6.html.not-yet | 50 +- .../testing/ts/unit-tests-7.html.not-yet | 46 + .../ts-snippets/app.component.snippets.pt1.ts | 6 +- .../_examples/toh-1/ts/app/app.component.ts | 10 +- .../_examples/toh-2/ts/app/app.component.ts | 4 +- .../_examples/toh-3/ts/app/app.component.ts | 2 +- .../toh-3/ts/app/hero-detail.component.ts | 19 +- public/docs/_examples/toh-3/ts/app/hero.ts | 2 +- .../_examples/toh-4/ts/app/app.component.ts | 2 +- .../toh-4/ts/app/hero-detail.component.ts | 7 +- public/docs/_examples/toh-4/ts/app/hero.ts | 2 +- .../toh-5/dart/lib/app_component.dart | 2 +- .../toh-5/dart/lib/app_component_1.dart | 2 +- .../toh-5/dart/lib/app_component_2.dart | 2 +- .../toh-5/dart/lib/dashboard_component.dart | 2 +- .../toh-5/dart/lib/dashboard_component_1.dart | 2 +- .../toh-5/dart/lib/dashboard_component_2.dart | 2 +- .../toh-5/dart/lib/hero_detail_component.dart | 2 +- .../toh-5/dart/lib/hero_service.dart | 2 +- .../toh-5/dart/lib/heroes_component.dart | 2 +- public/docs/_examples/toh-5/dart/pubspec.yaml | 6 +- .../docs/_examples/toh-5/dart/web/main.dart | 2 +- .../toh-5/ts/app/hero-detail.component.ts | 9 +- public/docs/_examples/toh-5/ts/app/hero.ts | 2 +- .../toh-5/ts/app/heroes.component.css | 2 +- public/docs/_examples/toh-6/e2e-spec.js | 133 +++ public/docs/_examples/toh-6/ts/.gitignore | 1 + .../_examples/toh-6/ts/app/app.component.css | 31 + .../_examples/toh-6/ts/app/app.component.ts | 62 ++ .../toh-6/ts/app/dashboard.component.css | 63 ++ .../toh-6/ts/app/dashboard.component.html | 11 + .../toh-6/ts/app/dashboard.component.ts | 32 + .../docs/_examples/toh-6/ts/app/hero-data.ts | 12 + .../toh-6/ts/app/hero-detail.component.css | 30 + .../toh-6/ts/app/hero-detail.component.html | 13 + .../toh-6/ts/app/hero-detail.component.ts | 46 + .../_examples/toh-6/ts/app/hero.service.ts | 79 ++ public/docs/_examples/toh-6/ts/app/hero.ts | 4 + .../toh-6/ts/app/heroes.component.css | 59 ++ .../toh-6/ts/app/heroes.component.html | 22 + .../toh-6/ts/app/heroes.component.ts | 58 ++ public/docs/_examples/toh-6/ts/app/main.ts | 6 + .../_examples/toh-6/ts/example-config.json | 0 public/docs/_examples/toh-6/ts/index.html | 36 + public/docs/_examples/toh-6/ts/plnkr.json | 9 + public/docs/_examples/toh-6/ts/sample.css | 8 + public/docs/_examples/tslint.json | 93 ++ .../tutorial/ts/app/app.component.ts | 2 +- .../tutorial/ts/app/dashboard.component.ts | 2 +- .../tutorial/ts/app/hero-detail.component.ts | 7 +- public/docs/_examples/tutorial/ts/app/hero.ts | 2 +- .../tutorial/ts/app/heroes.component.css | 2 +- .../tutorial/ts/app/heroes.component.ts | 4 +- .../user-input/dart/lib/app_component.dart | 2 +- .../dart/lib/click_me_component.dart | 2 +- .../dart/lib/click_me_component_2.dart | 2 +- .../user-input/dart/lib/keyup_components.dart | 2 +- .../dart/lib/little_tour_component.dart | 2 +- .../dart/lib/loop_back_component.dart | 2 +- .../_examples/user-input/dart/pubspec.yaml | 4 +- .../_examples/user-input/dart/web/main.dart | 3 +- public/docs/dart/latest/_data.json | 10 +- public/docs/dart/latest/cookbook/_data.json | 24 +- .../latest/cookbook/dependency-injection.jade | 1 + .../dart/latest/cookbook/dynamic-forms.jade | 1 + .../docs/dart/latest/cookbook/ts-to-js.jade | 1 + public/docs/dart/latest/guide/_data.json | 7 +- .../dart/latest/guide/component-styles.jade | 1 + .../latest/guide/dependency-injection.jade | 280 +++++- .../dart/latest/guide/displaying-data.jade | 2 +- public/docs/dart/latest/quickstart.jade | 16 +- public/docs/js/latest/_data.json | 10 +- public/docs/js/latest/cookbook/_data.json | 28 +- .../latest/cookbook/dependency-injection.jade | 1 + .../js/latest/cookbook/dynamic-forms.jade | 1 + public/docs/js/latest/cookbook/index.jade | 4 +- public/docs/js/latest/cookbook/ts-to-js.jade | 471 +++++++++ public/docs/js/latest/guide/_data.json | 7 +- .../js/latest/guide/component-styles.jade | 1 + public/docs/ts/latest/_data.json | 10 +- public/docs/ts/latest/cookbook/_data.json | 16 +- .../latest/cookbook/dependency-injection.jade | 908 ++++++++++++++++++ public/docs/ts/latest/cookbook/index.jade | 2 + public/docs/ts/latest/cookbook/ts-to-js.jade | 1 + public/docs/ts/latest/guide/_data.json | 11 +- .../ts/latest/guide/attribute-directives.jade | 9 +- .../ts/latest/guide/component-styles.jade | 347 +++++++ .../ts/latest/guide/dependency-injection.jade | 381 +++++--- .../docs/ts/latest/guide/lifecycle-hooks.jade | 1 + public/docs/ts/latest/guide/pipes.jade | 197 ++-- public/docs/ts/latest/guide/router.jade | 3 +- .../docs/ts/latest/guide/template-syntax.jade | 14 +- public/docs/ts/latest/guide/testing.jade | 17 +- public/docs/ts/latest/guide/upgrade.jade | 6 +- public/docs/ts/latest/quickstart.jade | 2 +- .../testing/application-under-test.jade | 35 +- .../ts/latest/testing/first-app-tests.jade | 26 +- .../latest/testing/jasmine-testing-101.jade | 2 +- .../testing/testing-an-angular-pipe.jade | 194 ++-- public/docs/ts/latest/tutorial/_data.json | 5 + public/docs/ts/latest/tutorial/toh-pt1.jade | 24 +- public/docs/ts/latest/tutorial/toh-pt2.jade | 4 +- public/docs/ts/latest/tutorial/toh-pt3.jade | 26 +- public/docs/ts/latest/tutorial/toh-pt4.jade | 4 +- public/docs/ts/latest/tutorial/toh-pt6.jade | 233 +++++ public/resources/images/bios/deborah.jpg | Bin 0 -> 16116 bytes .../cookbooks/dependency-injection/alex.png | Bin 0 -> 20533 bytes .../cookbooks/dependency-injection/alice.png | Bin 0 -> 46898 bytes .../date-logger-entry.png | Bin 0 -> 10087 bytes .../hero-bio-and-content.png | Bin 0 -> 9554 bytes .../hero-bio-contact-no-host.png | Bin 0 -> 9975 bytes .../hero-bios-and-contacts.png | Bin 0 -> 29600 bytes .../dependency-injection/hero-bios.png | Bin 0 -> 16720 bytes .../dependency-injection/hero-of-month.png | Bin 0 -> 26538 bytes .../dependency-injection/highlight.png | Bin 0 -> 16043 bytes .../dependency-injection/logged-in-user.png | Bin 0 -> 8274 bytes .../minimal-logger-intellisense.png | Bin 0 -> 15037 bytes .../dependency-injection/sorted-heroes.png | Bin 0 -> 8187 bytes .../big-time-fail-screen.png | Bin 9275 -> 2091 bytes .../testing-an-angular-pipe/two-failures.png | Bin 0 -> 3056 bytes .../testing-an-angular-pipe/zero-failures.png | Bin 0 -> 5713 bytes .../devguide/toh/hero-details-save-button.png | Bin 0 -> 17969 bytes .../toh/heroes-list-delete-button.png | Bin 0 -> 17009 bytes .../images/devguide/toh/nav-diagram.png | Bin 61962 -> 57103 bytes tools/api-builder/angular.io-package/index.js | 7 +- .../angular.io-package/tag-defs/deprecated.js | 5 + .../angular.io-package/tag-defs/howToUse.js | 5 + .../angular.io-package/tag-defs/index.js | 6 + .../angular.io-package/tag-defs/internal.js | 8 + .../angular.io-package/tag-defs/whatItIs.js | 5 + .../templates/class.template.html | 3 + tools/api-builder/cheatsheet-package/index.js | 2 +- tools/plunker-builder/indexHtmlTranslator.js | 29 +- tools/plunker-builder/plunkerBuilder.js | 14 +- 370 files changed, 7393 insertions(+), 1622 deletions(-) create mode 100644 .editorconfig delete mode 100644 .vscode/settings.json create mode 100644 public/docs/_examples/.editorconfig create mode 100644 public/docs/_examples/cb-dependency-injection/e2e-spec.js create mode 100644 public/docs/_examples/cb-dependency-injection/ts/.gitignore create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/app.component.html create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/app.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/date-logger.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-bio.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-bios.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-cache.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-contact.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-data.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-of-the-month.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/highlight.directive.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/logger.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/main.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/parent-finder.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/runners-up.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/sorted-heroes.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/user-context.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/user.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/example-config.json create mode 100644 public/docs/_examples/cb-dependency-injection/ts/index.html create mode 100644 public/docs/_examples/cb-dependency-injection/ts/plnkr.json create mode 100644 public/docs/_examples/cb-dependency-injection/ts/sample.css create mode 100644 public/docs/_examples/cb-ts-to-js/e2e-spec.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/data.service.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/hero-di-inject-additional.component.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/hero-di-inject.component.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/hero-di-inline.component.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/hero-di.component.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/hero-dsl.component.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/hero-io.component.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/hero-lifecycle.component.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/hero.component.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/heroes-bindings.component.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/heroes-queries.component.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/app/main.js create mode 100644 public/docs/_examples/cb-ts-to-js/js/example-config.json create mode 100644 public/docs/_examples/cb-ts-to-js/js/index.html create mode 100644 public/docs/_examples/cb-ts-to-js/js/plnkr.json create mode 100644 public/docs/_examples/cb-ts-to-js/ts/.gitignore create mode 100644 public/docs/_examples/cb-ts-to-js/ts/app/data.service.ts create mode 100644 public/docs/_examples/cb-ts-to-js/ts/app/hero-di-inject-additional.component.ts create mode 100644 public/docs/_examples/cb-ts-to-js/ts/app/hero-di-inject.component.ts create mode 100644 public/docs/_examples/cb-ts-to-js/ts/app/hero-di.component.ts create mode 100644 public/docs/_examples/cb-ts-to-js/ts/app/hero-io.component.ts create mode 100644 public/docs/_examples/cb-ts-to-js/ts/app/hero-lifecycle.component.ts create mode 100644 public/docs/_examples/cb-ts-to-js/ts/app/hero.component.ts create mode 100644 public/docs/_examples/cb-ts-to-js/ts/app/heroes-bindings.component.ts create mode 100644 public/docs/_examples/cb-ts-to-js/ts/app/heroes-queries.component.ts create mode 100644 public/docs/_examples/cb-ts-to-js/ts/app/main.ts create mode 100644 public/docs/_examples/cb-ts-to-js/ts/example-config.json create mode 100644 public/docs/_examples/cb-ts-to-js/ts/index.html create mode 100644 public/docs/_examples/cb-ts-to-js/ts/plnkr.json create mode 100644 public/docs/_examples/component-styles/e2e-spec.js create mode 100644 public/docs/_examples/component-styles/ts/.gitignore create mode 100644 public/docs/_examples/component-styles/ts/app/hero-app-main.component.ts create mode 100644 public/docs/_examples/component-styles/ts/app/hero-app.component.ts create mode 100644 public/docs/_examples/component-styles/ts/app/hero-controls.component.ts create mode 100644 public/docs/_examples/component-styles/ts/app/hero-details-box.css create mode 100644 public/docs/_examples/component-styles/ts/app/hero-details.component.css create mode 100644 public/docs/_examples/component-styles/ts/app/hero-details.component.ts create mode 100644 public/docs/_examples/component-styles/ts/app/hero-team.component.css create mode 100644 public/docs/_examples/component-styles/ts/app/hero-team.component.ts create mode 100644 public/docs/_examples/component-styles/ts/app/hero.ts create mode 100644 public/docs/_examples/component-styles/ts/app/main.ts create mode 100644 public/docs/_examples/component-styles/ts/app/quest-summary.component.css create mode 100644 public/docs/_examples/component-styles/ts/app/quest-summary.component.html create mode 100644 public/docs/_examples/component-styles/ts/app/quest-summary.component.ts create mode 100644 public/docs/_examples/component-styles/ts/example-config.json create mode 100644 public/docs/_examples/component-styles/ts/index.html create mode 100644 public/docs/_examples/component-styles/ts/plnkr.json create mode 100644 public/docs/_examples/dependency-injection/dart/.analysis_options delete mode 100644 public/docs/_examples/quickstart/dart/ex1/pubspec.yaml delete mode 100644 public/docs/_examples/quickstart/dart/ex1/web/main.dart delete mode 100644 public/docs/_examples/quickstart/dart/ex2/web/index.html rename public/docs/_examples/quickstart/dart/{ex2 => }/pubspec.yaml (56%) rename public/docs/_examples/quickstart/dart/{ex1 => }/web/index.html (100%) rename public/docs/_examples/quickstart/dart/{ex2 => }/web/main.dart (63%) create mode 100644 public/docs/_examples/template-syntax/dart/.docsync.json create mode 100644 public/docs/_examples/testing/ts/app/app.component.css create mode 100644 public/docs/_examples/testing/ts/app/app.component.ts delete mode 100644 public/docs/_examples/testing/ts/app/backend.service.ts delete mode 100644 public/docs/_examples/testing/ts/app/bootstrap.ts create mode 100644 public/docs/_examples/testing/ts/app/dashboard.component.css create mode 100644 public/docs/_examples/testing/ts/app/dashboard.component.html create mode 100644 public/docs/_examples/testing/ts/app/dashboard.component.ts delete mode 100644 public/docs/_examples/testing/ts/app/decorators.ts delete mode 100644 public/docs/_examples/testing/ts/app/hero2.ts delete mode 100644 public/docs/_examples/testing/ts/app/init-caps-pipe.spec.ts delete mode 100644 public/docs/_examples/testing/ts/app/init-caps-pipe.ts create mode 100644 public/docs/_examples/testing/ts/app/main.ts create mode 100644 public/docs/_examples/testing/ts/app/my-uppercase.pipe.1.ts create mode 100644 public/docs/_examples/testing/ts/app/my-uppercase.pipe.spec.ts create mode 100644 public/docs/_examples/testing/ts/app/my-uppercase.pipe.ts rename public/docs/_examples/testing/ts/app/{ => old-specs}/hero-detail.component.spec.ts.not-yet (100%) rename public/docs/_examples/testing/ts/app/{ => old-specs}/hero-detail.component.wrapped-tests.spec.ts.not-yet (100%) rename public/docs/_examples/testing/ts/app/{hero.service.ng.spec.ts => old-specs/hero.service.ng.spec.ts.not-yet} (100%) rename public/docs/_examples/testing/ts/app/{hero.service.no-ng.1.spec.ts => old-specs/hero.service.no-ng.1.spec.ts.not-yet} (100%) rename public/docs/_examples/testing/ts/app/{hero.service.no-ng.spec.ts => old-specs/hero.service.no-ng.spec.ts.not-yet} (100%) rename public/docs/_examples/testing/ts/app/{ => old-specs}/heroes.component.ng.spec.ts.not-yet (100%) rename public/docs/_examples/testing/ts/app/{heroes.component.no-ng.spec.ts => old-specs/heroes.component.no-ng.spec.ts.not-yet} (100%) rename public/docs/_examples/testing/ts/app/{user.spec.ts => old-specs/user.spec.ts.not-yet} (100%) delete mode 100644 public/docs/_examples/testing/ts/app/user.ts create mode 100644 public/docs/_examples/testing/ts/unit-tests-5.html delete mode 100644 public/docs/_examples/testing/ts/unit-tests-5.html.not-yet create mode 100644 public/docs/_examples/testing/ts/unit-tests-7.html.not-yet create mode 100644 public/docs/_examples/toh-6/e2e-spec.js create mode 100644 public/docs/_examples/toh-6/ts/.gitignore create mode 100644 public/docs/_examples/toh-6/ts/app/app.component.css create mode 100644 public/docs/_examples/toh-6/ts/app/app.component.ts create mode 100644 public/docs/_examples/toh-6/ts/app/dashboard.component.css create mode 100644 public/docs/_examples/toh-6/ts/app/dashboard.component.html create mode 100644 public/docs/_examples/toh-6/ts/app/dashboard.component.ts create mode 100644 public/docs/_examples/toh-6/ts/app/hero-data.ts create mode 100644 public/docs/_examples/toh-6/ts/app/hero-detail.component.css create mode 100644 public/docs/_examples/toh-6/ts/app/hero-detail.component.html create mode 100644 public/docs/_examples/toh-6/ts/app/hero-detail.component.ts create mode 100644 public/docs/_examples/toh-6/ts/app/hero.service.ts create mode 100644 public/docs/_examples/toh-6/ts/app/hero.ts create mode 100644 public/docs/_examples/toh-6/ts/app/heroes.component.css create mode 100644 public/docs/_examples/toh-6/ts/app/heroes.component.html create mode 100644 public/docs/_examples/toh-6/ts/app/heroes.component.ts create mode 100644 public/docs/_examples/toh-6/ts/app/main.ts create mode 100644 public/docs/_examples/toh-6/ts/example-config.json create mode 100644 public/docs/_examples/toh-6/ts/index.html create mode 100644 public/docs/_examples/toh-6/ts/plnkr.json create mode 100644 public/docs/_examples/toh-6/ts/sample.css create mode 100644 public/docs/_examples/tslint.json create mode 100644 public/docs/dart/latest/cookbook/dependency-injection.jade create mode 100644 public/docs/dart/latest/cookbook/dynamic-forms.jade create mode 100644 public/docs/dart/latest/cookbook/ts-to-js.jade create mode 100644 public/docs/dart/latest/guide/component-styles.jade create mode 100644 public/docs/js/latest/cookbook/dependency-injection.jade create mode 100644 public/docs/js/latest/cookbook/dynamic-forms.jade create mode 100644 public/docs/js/latest/cookbook/ts-to-js.jade create mode 100644 public/docs/js/latest/guide/component-styles.jade create mode 100644 public/docs/ts/latest/cookbook/dependency-injection.jade create mode 100644 public/docs/ts/latest/cookbook/ts-to-js.jade create mode 100644 public/docs/ts/latest/guide/component-styles.jade create mode 100644 public/docs/ts/latest/tutorial/toh-pt6.jade create mode 100644 public/resources/images/bios/deborah.jpg create mode 100644 public/resources/images/cookbooks/dependency-injection/alex.png create mode 100644 public/resources/images/cookbooks/dependency-injection/alice.png create mode 100644 public/resources/images/cookbooks/dependency-injection/date-logger-entry.png create mode 100644 public/resources/images/cookbooks/dependency-injection/hero-bio-and-content.png create mode 100644 public/resources/images/cookbooks/dependency-injection/hero-bio-contact-no-host.png create mode 100644 public/resources/images/cookbooks/dependency-injection/hero-bios-and-contacts.png create mode 100644 public/resources/images/cookbooks/dependency-injection/hero-bios.png create mode 100644 public/resources/images/cookbooks/dependency-injection/hero-of-month.png create mode 100644 public/resources/images/cookbooks/dependency-injection/highlight.png create mode 100644 public/resources/images/cookbooks/dependency-injection/logged-in-user.png create mode 100644 public/resources/images/cookbooks/dependency-injection/minimal-logger-intellisense.png create mode 100644 public/resources/images/cookbooks/dependency-injection/sorted-heroes.png create mode 100644 public/resources/images/devguide/testing-an-angular-pipe/two-failures.png create mode 100644 public/resources/images/devguide/testing-an-angular-pipe/zero-failures.png create mode 100644 public/resources/images/devguide/toh/hero-details-save-button.png create mode 100644 public/resources/images/devguide/toh/heroes-list-delete-button.png create mode 100644 tools/api-builder/angular.io-package/tag-defs/deprecated.js create mode 100644 tools/api-builder/angular.io-package/tag-defs/howToUse.js create mode 100644 tools/api-builder/angular.io-package/tag-defs/index.js create mode 100644 tools/api-builder/angular.io-package/tag-defs/internal.js create mode 100644 tools/api-builder/angular.io-package/tag-defs/whatItIs.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..bab156b63a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,24 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + + +[*.md] +max_line_length = 0 +trim_trailing_whitespace = false + +[*.jade] +max_line_length = 0 +trim_trailing_whitespace = false + +# Indentation override +#[lib/**.js] +#[{package.json,.travis.yml}] +#[**/**.js] diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index bede42df52..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - // Controls the rendering size of tabs in characters. Accepted values: "auto", 2, 4, 6, etc. If set to "auto", the value will be guessed when a file is opened. - "editor.tabSize": 2, - // Controls if the editor will insert spaces for tabs. Accepted values: "auto", true, false. If set to "auto", the value will be guessed when a file is opened. - "editor.insertSpaces": true, - // When enabled, will trim trailing whitespace when you save a file. - "files.trimTrailingWhitespace": false, - // Specifies the folder path containing the tsserver and lib*.d.ts files to use. - "typescript.tsdk": "public/docs/_examples/node_modules/typescript/lib" -} diff --git a/gulpfile.js b/gulpfile.js index a005d1c5b8..44baa44792 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -69,12 +69,14 @@ var _excludeMatchers = _excludePatterns.map(function(excludePattern){ }); var _exampleBoilerplateFiles = [ - 'karma.conf.js', - 'karma-test-shim.js', - 'package.json', - 'styles.css', - 'tsconfig.json', - 'typings.json' + '.editorconfig', + 'karma.conf.js', + 'karma-test-shim.js', + 'package.json', + 'styles.css', + 'tsconfig.json', + 'tslint.json', + 'typings.json' ]; var _exampleDartWebBoilerPlateFiles = ['styles.css']; @@ -153,14 +155,17 @@ function findAndRunE2eTests(filter) { // to the outputFile. function runE2eTests(appDir, protractorConfigFilename, outputFile ) { // start the app - var appRunSpawnInfo = spawnExt('npm',['run','http-server', '--', '-s' ], { cwd: appDir }); - - // start protractor - var pcFilename = path.resolve(protractorConfigFilename); // need to resolve because we are going to be running from a different dir - var exePath = path.join(process.cwd(), "./node_modules/.bin/"); - var spawnInfo = spawnExt('protractor', - [ pcFilename, '--params.appDir=' + appDir, '--params.outputFile=' + outputFile], { cwd: exePath }); - return spawnInfo.promise.then(function(data) { + var appRunSpawnInfo = spawnExt('npm',['run','http-server:e2e', '--', '-s' ], { cwd: appDir }); + var tscRunSpawnInfo = spawnExt('npm',['run','tsc'], { cwd: appDir }); + + return tscRunSpawnInfo.promise.then(function(data) { + // start protractor + var pcFilename = path.resolve(protractorConfigFilename); // need to resolve because we are going to be running from a different dir + var exePath = path.join(process.cwd(), "./node_modules/.bin/"); + var spawnInfo = spawnExt('protractor', + [ pcFilename, '--params.appDir=' + appDir, '--params.outputFile=' + outputFile], { cwd: exePath }); + return spawnInfo.promise; + }).then(function(data) { // kill the app now that protractor has completed. // Ugh... proc.kill does not work properly on windows with child processes. // appRun.proc.kill(); @@ -243,14 +248,14 @@ gulp.task('add-example-boilerplate', function() { gutil.log("symlinking " + linkPath + ' -> ' + realPath) fsUtils.addSymlink(realPath, linkPath); }); - + realPath = path.join(EXAMPLES_PATH, '/typings'); var typingsPaths = getTypingsPaths(EXAMPLES_PATH); typingsPaths.forEach(function(linkPath) { - gutil.log("symlinking " + linkPath + ' -> ' + realPath) + gutil.log("symlinking " + linkPath + ' -> ' + realPath) fsUtils.addSymlink(realPath, linkPath); }); - + return copyExampleBoilerplate(); }); @@ -263,7 +268,7 @@ function copyExampleBoilerplate() { return path.join(EXAMPLES_PATH, fn); }); var examplePaths = getExamplePaths(EXAMPLES_PATH); - + var dartWebSourceFiles = _exampleDartWebBoilerPlateFiles.map(function(fn){ return path.join(EXAMPLES_PATH, fn); }); @@ -287,15 +292,15 @@ gulp.task('remove-example-boilerplate', function() { nodeModulesPaths.forEach(function(linkPath) { fsUtils.removeSymlink(linkPath); }); - + var typingsPaths = getTypingsPaths(EXAMPLES_PATH); typingsPaths.forEach(function(linkPath) { fsUtils.removeSymlink(linkPath); - }); - + }); + var examplePaths = getExamplePaths(EXAMPLES_PATH); var dartExampleWebPaths = getDartExampleWebPaths(EXAMPLES_PATH); - + return deleteFiles(_exampleBoilerplateFiles, examplePaths) .then(function() { return deleteFiles(_exampleDartWebBoilerPlateFiles, dartExampleWebPaths); @@ -346,7 +351,7 @@ gulp.task('build-js-api-docs', ['_shred-api-examples'], function() { }); gulp.task('build-plunkers', function() { - return copyExampleBoilerplate() + return copyExampleBoilerplate() .then(function() { return plunkerBuilder.buildPlunkers(EXAMPLES_PATH, LIVE_EXAMPLES_PATH, { errFn: gutil.log }); }); @@ -501,7 +506,7 @@ function harpCompile() { vars: { NODE_ENV: "production" } }); gutil.log("NODE_ENV: " + process.env.NODE_ENV); - + var deferred = Q.defer(); gutil.log('running harp compile...'); showHideExampleNodeModules('hide'); @@ -523,20 +528,20 @@ function harpCompile() { } function linkChecker(options) { - var deferred = Q.defer(); + var deferred = Q.defer(); var options = options || {}; - + var blcOptions = options.blcOptions || {}; var customData = options.customData || {}; - + var excludeBad; // don't bother reporting bad links matching this RegExp if (argv.excludeBad) { excludeBad = new RegExp(argv.excludeBad); } else { excludeBad = options.excludeBad === undefined ? /docs\/dart\/latest\/api/ : ''; } - - var previousPage; + + var previousPage; var siteUrl = argv.url || options.url || 'https://angular.io/'; // See https://github.com/stevenvachon/broken-link-checker#blcsitecheckeroptions-handlers @@ -546,12 +551,12 @@ function linkChecker(options) { //gutil.log('Scanning ' + pageUrl);docs/ts/latest/api/core/ }, junk: function(result, customData){}, - + // Analyze links link: function(result, customData){ if (!result.broken) { return; } if (excludeBad && excludeBad.test(result.url.resolved)) { return; } - + var currentPage = result.base.resolved if (previousPage !== currentPage) { previousPage = currentPage; @@ -563,10 +568,10 @@ function linkChecker(options) { //gutil.log(msg); //gutil.log(result); }, - + page: function(error, pageUrl, customData){}, site: function(error, siteUrl, customData){}, - + end: function(){ var stopTime = new Date().getTime(); var elapsed = 'Elapsed link-checking time: ' + ((stopTime - startTime)/1000) + ' seconds'; @@ -576,24 +581,24 @@ function linkChecker(options) { deferred.resolve(true); } }; - + // create an output file with header. var outputFile = path.join(process.cwd(), 'link-checker-results.txt'); var header = 'Link checker results for: ' + siteUrl + - '\nStarted: ' + (new Date()).toLocaleString() + + '\nStarted: ' + (new Date()).toLocaleString() + '\nSkipping bad links matching regex: ' +excludeBad.toString() + '\n\n'; gutil.log(header); fs.writeFileSync(outputFile, header); - + var siteChecker = new blc.SiteChecker(blcOptions, handlers); var startTime = new Date().getTime(); - - try { + + try { siteChecker.enqueue(siteUrl, customData); } catch (err) { deferred.reject(err); - } - return deferred.promise; + } + return deferred.promise; } // harp has issues with node_modules under the public dir @@ -701,7 +706,7 @@ function watchAndSync(options, cb) { env({ vars: { NODE_ENV: "production" } }); - + execCommands(['npm run harp -- server .'], {}, cb); var browserSync = require('browser-sync').create(); @@ -781,7 +786,7 @@ function apiExamplesWatch(postShredAction) { function devGuideExamplesWatch(shredOptions, postShredAction) { var includePattern = path.join(shredOptions.examplesDir, '**/*.*'); - // removed this version because gulp.watch has the same glob issue that dgeni has. + // removed this version because gulp.watch has the same glob issue that dgeni has. // var excludePattern = '!' + path.join(shredOptions.examplesDir, '**/node_modules/**/*.*'); // gulp.watch([includePattern, excludePattern], {readDelay: 500}, function (event, done) { var files = globby.sync( [includePattern], { ignore: [ '**/node_modules/**', '**/_fragments/**']}); @@ -989,7 +994,7 @@ function execCommands(cmds, options, cb) { if (!cmds || cmds.length == 0) cb(null, null, null); var exec = require('child_process').exec; // just to make it more portable. gutil.log("NODE_ENV: " + process.env.NODE_ENV); - + exec(cmds[0], options, function(err, stdout, stderr) { if (err == null) { if (options.shouldLog) { @@ -1019,4 +1024,3 @@ function checkAngularProjectPath() { throw new Error('API related tasks require the angular2 repo to be at ' + path.resolve(ANGULAR_PROJECT_PATH)); } } - diff --git a/harp.json b/harp.json index ea7c3b3a2a..be714f031d 100644 --- a/harp.json +++ b/harp.json @@ -47,6 +47,8 @@ "juleskremer": { "name": "Jules Kremer", "picture": "/resources/images/bios/juleskremer.jpg", + "twitter": "jules_kremer", + "website": "https://plus.google.com/+JulesKremer", "bio": "Jules is a TPM on the Angular team. When not working with developers, Jules is often bending into pretzel-like shapes, climbing mountains or drinking really awesome beer.", "type": "Lead" }, @@ -397,6 +399,14 @@ "website": "http://teropa.info/", "bio": "Tero is an independent software developer and writer. He's been building web applications for his whole professional career, and has almost figured out how to do vertical centering in CSS.", "type": "Community" + }, + "deborah": { + "name": "Deborah Kurata", + "picture": "/resources/images/bios/deborah.jpg", + "twitter": "deborahkurata", + "website": "http://blogs.msmvps.com/deborahk/", + "bio": "Deborah is an independent software developer and author. She is author of several Pluralsight courses including: 'Angular 2: Getting Started'", + "type": "Community" } } } diff --git a/package.json b/package.json index ece8163872..e8267dcdec 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "gulp-task-listing": "^1.0.1", "gulp-util": "^3.0.6", "gulp-watch": "^4.3.4", - "harp": "^0.20.1", + "harp": "^0.20.3", "html2jade": "^0.8.4", "indent-string": "^2.1.0", "jasmine-core": "^2.3.4", @@ -71,5 +71,6 @@ }, "dependencies": { "jstransformer-marked": "^1.0.1" - } + }, + "homepage": "http://angular.io/" } diff --git a/public/_includes/_footer.jade b/public/_includes/_footer.jade index 394072d8ed..2fd238dc06 100644 --- a/public/_includes/_footer.jade +++ b/public/_includes/_footer.jade @@ -19,7 +19,6 @@ else ul.text-body li Angular 2.0 li Angular 1 for JS - li Angular 1 for Dart li Angular Material li AngularFire @@ -54,4 +53,4 @@ else footer(class="background-steel") small.text-caption Powered by Google ©2010-2016. Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0. a(aria-label="View Style Guide" href=styleguide title="Style Guide" class="styleguide-trigger text-snow" md-button) - span.icon-favorite \ No newline at end of file + span.icon-favorite diff --git a/public/docs/_examples/.editorconfig b/public/docs/_examples/.editorconfig new file mode 100644 index 0000000000..f2abacf6d3 --- /dev/null +++ b/public/docs/_examples/.editorconfig @@ -0,0 +1,20 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + + +[*.md] +max_line_length = 0 +trim_trailing_whitespace = false + +# Indentation override +#[lib/**.js] +#[{package.json,.travis.yml}] +#[**/**.js] diff --git a/public/docs/_examples/.gitignore b/public/docs/_examples/.gitignore index 7a15251d4f..d821c82bea 100644 --- a/public/docs/_examples/.gitignore +++ b/public/docs/_examples/.gitignore @@ -1,3 +1,4 @@ +.editorconfig styles.css typings typings.json @@ -6,5 +7,6 @@ package.json karma.conf.js karma-test-shim.js tsconfig.json +tslint.json npm-debug*. **/protractor.config.js diff --git a/public/docs/_examples/architecture/dart/lib/backend_service.dart b/public/docs/_examples/architecture/dart/lib/backend_service.dart index ed425dfc82..d0f6886dbf 100644 --- a/public/docs/_examples/architecture/dart/lib/backend_service.dart +++ b/public/docs/_examples/architecture/dart/lib/backend_service.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; import 'logger_service.dart'; diff --git a/public/docs/_examples/architecture/dart/lib/hero_detail_component.dart b/public/docs/_examples/architecture/dart/lib/hero_detail_component.dart index d89b4e44a8..94c26abbd0 100644 --- a/public/docs/_examples/architecture/dart/lib/hero_detail_component.dart +++ b/public/docs/_examples/architecture/dart/lib/hero_detail_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; diff --git a/public/docs/_examples/architecture/dart/lib/hero_list_component.dart b/public/docs/_examples/architecture/dart/lib/hero_list_component.dart index 7027a01bd8..ba2b75de70 100644 --- a/public/docs/_examples/architecture/dart/lib/hero_list_component.dart +++ b/public/docs/_examples/architecture/dart/lib/hero_list_component.dart @@ -1,5 +1,5 @@ // #docplaster -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; import 'hero_detail_component.dart'; diff --git a/public/docs/_examples/architecture/dart/lib/hero_service.dart b/public/docs/_examples/architecture/dart/lib/hero_service.dart index e15db5f1cd..794e79927e 100644 --- a/public/docs/_examples/architecture/dart/lib/hero_service.dart +++ b/public/docs/_examples/architecture/dart/lib/hero_service.dart @@ -1,4 +1,4 @@ -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'backend_service.dart'; import 'hero.dart'; diff --git a/public/docs/_examples/architecture/dart/lib/logger_service.dart b/public/docs/_examples/architecture/dart/lib/logger_service.dart index e1815da9a8..2d6d1c4f75 100644 --- a/public/docs/_examples/architecture/dart/lib/logger_service.dart +++ b/public/docs/_examples/architecture/dart/lib/logger_service.dart @@ -1,7 +1,7 @@ // #docregion import 'dart:html'; -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; /// A service for logging messages of various types. /// diff --git a/public/docs/_examples/architecture/dart/pubspec.yaml b/public/docs/_examples/architecture/dart/pubspec.yaml index 9466bdac16..9be156cfc7 100644 --- a/public/docs/_examples/architecture/dart/pubspec.yaml +++ b/public/docs/_examples/architecture/dart/pubspec.yaml @@ -5,9 +5,9 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 + dart_to_js_script_rewriter: ^1.0.1 transformers: - angular2: platform_directives: 'package:angular2/common.dart#CORE_DIRECTIVES' diff --git a/public/docs/_examples/architecture/dart/web/main.dart b/public/docs/_examples/architecture/dart/web/main.dart index c96db07bb8..acb382ab8e 100644 --- a/public/docs/_examples/architecture/dart/web/main.dart +++ b/public/docs/_examples/architecture/dart/web/main.dart @@ -1,5 +1,6 @@ // #docregion -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/platform/browser.dart'; + import 'package:developer_guide_intro/backend_service.dart'; import 'package:developer_guide_intro/hero_list_component.dart'; import 'package:developer_guide_intro/hero_service.dart'; diff --git a/public/docs/_examples/attribute-directives/dart/lib/app_component.dart b/public/docs/_examples/attribute-directives/dart/lib/app_component.dart index 0d3ad7595b..2494fc3fd7 100644 --- a/public/docs/_examples/attribute-directives/dart/lib/app_component.dart +++ b/public/docs/_examples/attribute-directives/dart/lib/app_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'highlight_directive.dart'; diff --git a/public/docs/_examples/attribute-directives/dart/lib/highlight_directive.dart b/public/docs/_examples/attribute-directives/dart/lib/highlight_directive.dart index 0fb5832160..a6c0856cc4 100644 --- a/public/docs/_examples/attribute-directives/dart/lib/highlight_directive.dart +++ b/public/docs/_examples/attribute-directives/dart/lib/highlight_directive.dart @@ -1,6 +1,6 @@ // #docplaster // #docregion full -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; @Directive(selector: '[my-highlight]', host: const { '(mouseenter)': 'onMouseEnter()', diff --git a/public/docs/_examples/attribute-directives/dart/lib/highlight_directive_1.dart b/public/docs/_examples/attribute-directives/dart/lib/highlight_directive_1.dart index 4fef486203..3b79e66a3b 100644 --- a/public/docs/_examples/attribute-directives/dart/lib/highlight_directive_1.dart +++ b/public/docs/_examples/attribute-directives/dart/lib/highlight_directive_1.dart @@ -1,7 +1,7 @@ // #docregion library attribute_directives.highlight_directive; -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; @Directive(selector: '[my-highlight]') class Highlight { diff --git a/public/docs/_examples/attribute-directives/dart/lib/highlight_directive_2.dart b/public/docs/_examples/attribute-directives/dart/lib/highlight_directive_2.dart index 1561af0535..8c540b3a6a 100644 --- a/public/docs/_examples/attribute-directives/dart/lib/highlight_directive_2.dart +++ b/public/docs/_examples/attribute-directives/dart/lib/highlight_directive_2.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; @Directive(selector: '[my-highlight]', // #docregion host diff --git a/public/docs/_examples/attribute-directives/dart/pubspec.yaml b/public/docs/_examples/attribute-directives/dart/pubspec.yaml index 25f96209c1..897e7dd174 100644 --- a/public/docs/_examples/attribute-directives/dart/pubspec.yaml +++ b/public/docs/_examples/attribute-directives/dart/pubspec.yaml @@ -5,9 +5,9 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 + dart_to_js_script_rewriter: ^1.0.1 transformers: - angular2: platform_directives: 'package:angular2/common.dart#CORE_DIRECTIVES' diff --git a/public/docs/_examples/attribute-directives/dart/web/main.dart b/public/docs/_examples/attribute-directives/dart/web/main.dart index ce74487a47..0703b7ab25 100644 --- a/public/docs/_examples/attribute-directives/dart/web/main.dart +++ b/public/docs/_examples/attribute-directives/dart/web/main.dart @@ -1,5 +1,6 @@ // #docregion -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/platform/browser.dart'; + import 'package:attribute_directives/app_component.dart'; main() { diff --git a/public/docs/_examples/attribute-directives/ts/app/highlight.directive.2.ts b/public/docs/_examples/attribute-directives/ts/app/highlight.directive.2.ts index 9cf0b95970..1f42c5773f 100644 --- a/public/docs/_examples/attribute-directives/ts/app/highlight.directive.2.ts +++ b/public/docs/_examples/attribute-directives/ts/app/highlight.directive.2.ts @@ -12,8 +12,10 @@ import {Directive, ElementRef, Input} from 'angular2/core'; }) export class HighlightDirective { + // #docregion ctor - constructor(private el: ElementRef) { } + private _el:HTMLElement; + constructor(el: ElementRef) { this._el = el.nativeElement; } // #enddocregion ctor // #docregion mouse-methods @@ -21,7 +23,7 @@ export class HighlightDirective { onMouseLeave() { this._highlight(null); } private _highlight(color: string) { - this.el.nativeElement.style.backgroundColor = color; + this._el.style.backgroundColor = color; } // #enddocregion mouse-methods diff --git a/public/docs/_examples/attribute-directives/ts/app/highlight.directive.ts b/public/docs/_examples/attribute-directives/ts/app/highlight.directive.ts index 6a26780057..4380174c8f 100644 --- a/public/docs/_examples/attribute-directives/ts/app/highlight.directive.ts +++ b/public/docs/_examples/attribute-directives/ts/app/highlight.directive.ts @@ -12,6 +12,9 @@ import {Directive, ElementRef, Input} from 'angular2/core'; // #docregion class-1 export class HighlightDirective { + + private _defaultColor = 'red'; + private _el:HTMLElement; // #enddocregion class-1 // #enddocregion full /* @@ -20,21 +23,21 @@ export class HighlightDirective { // #enddocregion highlight */ // #docregion full + +// #docregion defaultColor + @Input() set defaultColor(colorName:string){ + this._defaultColor = colorName || this._defaultColor; + } +// #enddocregion defaultColor // #docregion class-1 + // #docregion color @Input('myHighlight') highlightColor: string; // #enddocregion color - private _defaultColor = 'red'; // #enddocregion class-1 - // #docregion defaultColor - @Input() set defaultColor(colorName:string){ - this._defaultColor = colorName || this._defaultColor; - } - // #enddocregion defaultColor // #docregion class-1 - - constructor(private el: ElementRef) { } + constructor(el: ElementRef) { this._el = el.nativeElement; } // #docregion mouse-enter onMouseEnter() { this._highlight(this.highlightColor || this._defaultColor); } @@ -42,7 +45,7 @@ export class HighlightDirective { onMouseLeave() { this._highlight(null); } private _highlight(color:string) { - this.el.nativeElement.style.backgroundColor = color; + this._el.style.backgroundColor = color; } } // #enddocregion class-1 diff --git a/public/docs/_examples/cb-component-communication/ts/app/hero.ts b/public/docs/_examples/cb-component-communication/ts/app/hero.ts index 5b99f17132..16ce60d8ed 100644 --- a/public/docs/_examples/cb-component-communication/ts/app/hero.ts +++ b/public/docs/_examples/cb-component-communication/ts/app/hero.ts @@ -1,4 +1,4 @@ -export interface Hero { +export class Hero { name: string; } diff --git a/public/docs/_examples/cb-dependency-injection/e2e-spec.js b/public/docs/_examples/cb-dependency-injection/e2e-spec.js new file mode 100644 index 0000000000..aeb0e68b17 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/e2e-spec.js @@ -0,0 +1,98 @@ +describe('Dependency Injection Cookbook', function () { + + beforeAll(function () { + browser.get(''); + }); + + it('should render Logged in User example', function () { + var loggedInUser = element.all(by.xpath('//h3[text()="Logged in user"]')).get(0); + expect(loggedInUser).toBeDefined(); + }); + + it('"Bombasto" should be the logged in user', function () { + loggedInUser = element.all(by.xpath('//div[text()="Name: Bombasto"]')).get(0); + expect(loggedInUser).toBeDefined(); + }); + + it('should render sorted heroes', function () { + var sortedHeroes = element.all(by.xpath('//h3[text()="Sorted Heroes" and position()=1]')).get(0); + expect(sortedHeroes).toBeDefined(); + }); + + it('Mr. Nice should be in sorted heroes', function () { + var sortedHero = element.all(by.xpath('//sorted-heroes/[text()="Mr. Nice" and position()=2]')).get(0); + expect(sortedHero).toBeDefined(); + }); + + it('RubberMan should be in sorted heroes', function () { + sortedHero = element.all(by.xpath('//sorted-heroes/[text()="RubberMan" and position()=3]')).get(0); + expect(sortedHero).toBeDefined(); + }); + + it('Magma should be in sorted heroes', function () { + sortedHero = element.all(by.xpath('//sorted-heroes/[text()="Magma"]')).get(0); + expect(sortedHero).toBeDefined(); + }); + + it('should render Hero of the Month', function () { + var heroOfTheMonth = element.all(by.xpath('//h3[text()="Hero of the month"]')).get(0); + expect(heroOfTheMonth).toBeDefined(); + }); + + it('should render Hero Bios', function () { + var heroBios = element.all(by.xpath('//h3[text()="Hero Bios"]')).get(0); + expect(heroBios).toBeDefined(); + }); + + it('should render Magma\'s description in Hero Bios', function () { + var magmaText = element.all(by.xpath('//textarea[text()="Hero of all trades"]')).get(0); + expect(magmaText).toBeDefined(); + }); + + it('should render Magma\'s phone in Hero Bios and Contacts', function () { + var magmaPhone = element.all(by.xpath('//div[text()="Phone #: 555-555-5555"]')).get(0); + expect(magmaPhone).toBeDefined(); + }); + + it('should render Hero-of-the-Month runner-ups', function () { + var runnersUp = element(by.id('rups')).getText(); + expect(runnersUp).toContain('RubberMan, Mr. Nice'); + }); + + it('should render DateLogger log entry in Hero-of-the-Month', function () { + var logs = element.all(by.id('logs')).get(0).getText(); + expect(logs).toContain('INFO: starting up at'); + }); + + it('should highlight Hero Bios and Contacts container when mouseover', function () { + var target = element(by.css('div[myHighlight="yellow"]')) + var yellow = "rgba(255, 255, 0, 1)"; + + expect(target.getCssValue('background-color')).not.toEqual(yellow); + browser.actions().mouseMove(target).perform(); + expect(target.getCssValue('background-color')).toEqual(yellow); + }); + + describe('in Parent Finder', function () { + var cathy1 = element(by.css('alex cathy')); + var craig1 = element(by.css('alex craig')); + var carol1 = element(by.css('alex carol p')); + var carol2 = element(by.css('barry carol p')); + + it('"Cathy" should find "Alex" via the component class', function () { + expect(cathy1.getText()).toContain('Found Alex via the component'); + }); + + it('"Craig" should not find "Alex" via the base class', function () { + expect(craig1.getText()).toContain('Did not find Alex via the base'); + }); + + it('"Carol" within "Alex" should have "Alex" parent', function () { + expect(carol1.getText()).toContain('Alex'); + }); + + it('"Carol" within "Barry" should have "Barry" parent', function () { + expect(carol2.getText()).toContain('Barry'); + }); + }) +}); diff --git a/public/docs/_examples/cb-dependency-injection/ts/.gitignore b/public/docs/_examples/cb-dependency-injection/ts/.gitignore new file mode 100644 index 0000000000..cf44e148ba --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/.gitignore @@ -0,0 +1 @@ +**/*.js \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/app.component.html b/public/docs/_examples/cb-dependency-injection/ts/app/app.component.html new file mode 100644 index 0000000000..c27281f2af --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/app.component.html @@ -0,0 +1,39 @@ +

DI Cookbook

+
+

Logged in user

+
Name: {{userContext.name}}
+
Role: {{userContext.role}}
+
+ +
+

Hero Bios

+ +
+ + +
+

Hero Bios and Contacts

+
+ +
+
+ + +
+ +
+ + +
+

Unsorted Heroes

+ +
+ +
+

Sorted Heroes

+ +
+ +
+ +
\ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/app.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/app.component.ts new file mode 100644 index 0000000000..2e4485f665 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/app.component.ts @@ -0,0 +1,46 @@ +// #docregion +import { Component } from 'angular2/core'; + +import { HeroBiosComponent, + HeroBiosAndContactsComponent} from './hero-bios.component'; +import { HeroOfTheMonthComponent } from './hero-of-the-month.component'; +import { HeroesBaseComponent, + SortedHeroesComponent } from './sorted-heroes.component'; +import { HighlightDirective } from './highlight.directive'; +import { ParentFinderComponent } from './parent-finder.component'; + +const DIRECTIVES = [ + HeroBiosComponent, HeroBiosAndContactsComponent, + HeroesBaseComponent, SortedHeroesComponent, + HeroOfTheMonthComponent, + HighlightDirective, + ParentFinderComponent +]; + +// #docregion import-services +import { LoggerService } from './logger.service'; +import { UserContextService } from './user-context.service'; +import { UserService } from './user.service'; + +@Component({ + selector: 'my-app', + templateUrl:'app/app.component.html', + directives: DIRECTIVES, +// #docregion providers + providers: [LoggerService, UserContextService, UserService] +// #enddocregion providers +}) +export class AppComponent { +// #enddocregion import-services + + private userId:number = 1; + + // #docregion ctor + constructor(logger:LoggerService, public userContext:UserContextService) { + userContext.loadUser(this.userId); + logger.logInfo('AppComponent initialized'); + } + // #enddocregion ctor +// #docregion import-services +} +// #enddocregion import-services diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/date-logger.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/date-logger.service.ts new file mode 100644 index 0000000000..125ba37c2b --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/date-logger.service.ts @@ -0,0 +1,37 @@ +/* tslint:disable:one-line:check-open-brace*/ +// #docregion +import { Injectable } from 'angular2/core'; +import { LoggerService } from './logger.service'; + +// #docregion minimal-logger +// class used as a restricting interface (hides other public members) +export abstract class MinimalLogger { + logInfo: (msg: string) => void; + logs: string[]; +} +// #enddocregion minimal-logger + +/* +// Transpiles to: +// #docregion minimal-logger-transpiled + var MinimalLogger = (function () { + function MinimalLogger() {} + return MinimalLogger; + }()); + exports("MinimalLogger", MinimalLogger); +// #enddocregion minimal-logger-transpiled + */ + +// #docregion date-logger-service +@Injectable() +// #docregion date-logger-service-signature +export class DateLoggerService extends LoggerService implements MinimalLogger +// #enddocregion date-logger-service-signature +{ + logInfo(msg: any) { super.logInfo(stamp(msg)); } + logDebug(msg: any) { super.logInfo(stamp(msg)); } + logError(msg: any) { super.logError(stamp(msg)); } +} + +function stamp(msg: any) { return msg + ' at ' + new Date(); } +// #enddocregion date-logger-service diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-bio.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-bio.component.ts new file mode 100644 index 0000000000..6b006fcc56 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-bio.component.ts @@ -0,0 +1,29 @@ +// #docregion +import {Component, Input, OnInit} from 'angular2/core'; + +import {Hero} from './hero'; +import {HeroCacheService} from './hero-cache.service'; + +// #docregion component +@Component({ + selector:'hero-bio', + // #docregion template + template:` +

{{hero.name}}

+ + `, + // #enddocregion template + providers: [HeroCacheService] +}) + +export class HeroBioComponent implements OnInit { + + @Input() heroId:number; + + constructor(private _heroCache:HeroCacheService) { } + + ngOnInit() { this._heroCache.fetchCachedHero(this.heroId); } + + get hero() { return this._heroCache.hero; } +} +// #enddocregion component diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-bios.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-bios.component.ts new file mode 100644 index 0000000000..9d14daf648 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-bios.component.ts @@ -0,0 +1,52 @@ +// #docplaster +// #docregion +import { Component} from 'angular2/core'; + +import { HeroContactComponent } from './hero-contact.component'; +import { HeroBioComponent } from './hero-bio.component'; +import { HeroService } from './hero.service'; +import { LoggerService } from './logger.service'; + +//////// HeroBiosComponent //// +// #docregion simple +@Component({ + selector:'hero-bios', + template:` + + + `, + directives:[HeroBioComponent], + providers: [HeroService] +}) +export class HeroBiosComponent{ +// #enddocregion simple +// #docregion ctor + constructor(logger: LoggerService) { + logger.logInfo('Creating HeroBiosComponent'); + } +// #enddocregion ctor +// #docregion simple +} +// #enddocregion simple + +//////// HeroBiosAndContactsComponent //// +// #docregion hero-bios-and-contacts +@Component({ + selector:'hero-bios-and-contacts', + // #docregion template + template:` + + + `, + // #enddocregion template + directives:[HeroBioComponent, HeroContactComponent], + // #docregion class-provider + providers: [HeroService] + // #enddocregion class-provider +}) +export class HeroBiosAndContactsComponent{ + constructor(logger: LoggerService) { + logger.logInfo('Creating HeroBiosAndContactsComponent'); + } +} +// #enddocregion hero-bios-and-contacts \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-cache.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-cache.service.ts new file mode 100644 index 0000000000..c0c7ce581f --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-cache.service.ts @@ -0,0 +1,19 @@ +// #docregion +import {Injectable} from 'angular2/core'; +import {Hero} from './hero'; +import {HeroService} from './hero.service'; + +// #docregion service +@Injectable() +export class HeroCacheService { + hero:Hero; + constructor(private _heroService:HeroService){} + + fetchCachedHero(id:number){ + if (!this.hero) { + this.hero = this._heroService.getHeroById(id); + } + return this.hero + } +} +// #enddocregion service diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-contact.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-contact.component.ts new file mode 100644 index 0000000000..42163d3f3e --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-contact.component.ts @@ -0,0 +1,39 @@ +// #docplaster +// #docregion +import {Component, ElementRef, Host, Inject, Optional} from 'angular2/core'; +import {HeroCacheService} from './hero-cache.service'; +import {LoggerService} from './logger.service'; + +// #docregion component +@Component({ + selector:'hero-contact', + template:` +
Phone #: {{phoneNumber}} + !!!
` +}) +export class HeroContactComponent { + + hasLogger = false; + + constructor( + // #docregion ctor-params + @Host() // limit to the host component's instance of the HeroCacheService + private _heroCache: HeroCacheService, + + @Host() // limit search for logger; hides the application-wide logger + @Optional() // ok if the logger doesn't exist + private _loggerService: LoggerService + // #enddocregion ctor-params + ) { + if (_loggerService) { + this.hasLogger = true; + _loggerService.logInfo('HeroContactComponent can log!'); + } + // #docregion ctor + } + // #enddocregion ctor + + get phoneNumber() { return this._heroCache.hero.phone; } + +} +// #enddocregion component diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-data.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-data.ts new file mode 100644 index 0000000000..18133fd771 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-data.ts @@ -0,0 +1,14 @@ +// #docregion +import {Hero} from './hero'; + +export class HeroData { + createDb() { + let heroes = [ + new Hero(1,"Windstorm"), + new Hero(2,"Bombasto"), + new Hero(3,"Magneta"), + new Hero(4,"Tornado") + ]; + return {heroes}; + } +} diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-of-the-month.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-of-the-month.component.ts new file mode 100644 index 0000000000..02dcae4824 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-of-the-month.component.ts @@ -0,0 +1,75 @@ +/* tslint:disable:one-line:check-open-brace*/ +// #docplaster +// #docregion opaque-token +import {OpaqueToken} from 'angular2/core'; + +export const TITLE = new OpaqueToken('title'); +// #enddocregion opaque-token + +// #docregion hero-of-the-month +import { Component, Inject, provide } from 'angular2/core'; + +import { DateLoggerService, + MinimalLogger } from './date-logger.service'; +import { Hero } from './hero'; +import { HeroService } from './hero.service'; +import { LoggerService } from './logger.service'; +import { RUNNERS_UP, + runnersUpFactory } from './runners-up'; + +// #enddocregion hero-of-the-month +// #docregion some-hero +const someHero = new Hero(42, 'Magma', 'Had a great month!', '555-555-5555'); +// #enddocregion some-hero + +const template = ` +

{{title}}

+
Winner: {{heroOfTheMonth.name}}
+
Reason for award: {{heroOfTheMonth.description}}
+
Runners-up: {{runnersUp}}
+ +

Logs:

+
+
{{log}}
+
+ `; + +// #docregion hero-of-the-month +@Component({ + selector: 'hero-of-the-month', + template: template, + providers: [ + // #docregion use-value + provide(Hero, {useValue: someHero}), + // #docregion provide-opaque-token + provide(TITLE, {useValue: 'Hero of the Month'}), + // #enddocregion provide-opaque-token + // #enddocregion use-value + // #docregion use-class + provide(HeroService, {useClass: HeroService}), + provide(LoggerService, {useClass: DateLoggerService}), + // #enddocregion use-class + // #docregion use-existing + provide(MinimalLogger, {useExisting: LoggerService}), + // #enddocregion use-existing + // #docregion provide-opaque-token, use-factory + provide(RUNNERS_UP, {useFactory: runnersUpFactory(2), deps: [Hero, HeroService]}) + // #enddocregion provide-opaque-token, use-factory + ] +}) +export class HeroOfTheMonthComponent { + logs: string[] = []; + +// #docregion ctor-signature + constructor( + logger: MinimalLogger, + public heroOfTheMonth: Hero, + @Inject(RUNNERS_UP) public runnersUp: string, + @Inject(TITLE) public title: string) +// #enddocregion ctor-signature + { + this.logs = logger.logs; + logger.logInfo('starting up'); + } +} +// #enddocregion hero-of-the-month diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero.service.ts new file mode 100644 index 0000000000..274753ae8d --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero.service.ts @@ -0,0 +1,22 @@ +// #docregion +import {Injectable} from 'angular2/core'; +import {Hero} from './hero'; + +@Injectable() +export class HeroService { + + //TODO move to database + private _heros:Array = [ + new Hero(1, 'RubberMan','Hero of many talents', '123-456-7899'), + new Hero(2, 'Magma','Hero of all trades', '555-555-5555'), + new Hero(3, 'Mr. Nice','The name says it all','111-222-3333') + ]; + + getHeroById(id:number):Hero{ + return this._heros.filter(hero => hero.id === id)[0]; + } + + getAllHeroes():Array{ + return this._heros; + } +} \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero.ts new file mode 100644 index 0000000000..51ce8ebbff --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero.ts @@ -0,0 +1,9 @@ +// #docregion +export class Hero{ + constructor( + public id: number, + public name:string, + public description?:string, + public phone?:string) { + } +} \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/highlight.directive.ts b/public/docs/_examples/cb-dependency-injection/ts/app/highlight.directive.ts new file mode 100644 index 0000000000..6d054e1a0b --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/highlight.directive.ts @@ -0,0 +1,28 @@ +// #docplaster +// #docregion +import {Directive, ElementRef, Input} from 'angular2/core'; + +@Directive({ + selector: '[myHighlight]', + host: { + '(mouseenter)': 'onMouseEnter()', + '(mouseleave)': 'onMouseLeave()' + } +}) +export class HighlightDirective { + + @Input('myHighlight') highlightColor: string; + + private _el: HTMLElement; + + constructor(el: ElementRef) { + this._el = el.nativeElement; + } + + onMouseEnter() { this._highlight(this.highlightColor || 'cyan'); } + onMouseLeave() { this._highlight(null); } + + private _highlight(color: string) { + this._el.style.backgroundColor = color; + } +} diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/logger.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/logger.service.ts new file mode 100644 index 0000000000..ecc75350e3 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/logger.service.ts @@ -0,0 +1,16 @@ +// #docregion +import {Injectable} from 'angular2/core'; + +@Injectable() +export class LoggerService { + logs: string[] = []; + + logInfo(msg: any) { this.log(`INFO: ${msg}`); } + logDebug(msg: any) { this.log(`DEBUG: ${msg}`); } + logError(msg: any) { this.log(`ERROR: ${msg}`, true); } + + private log(msg: any, isErr = false) { + this.logs.push(msg); + isErr ? console.error(msg) : console.log(msg); + } +} diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/main.ts b/public/docs/_examples/cb-dependency-injection/ts/app/main.ts new file mode 100644 index 0000000000..b1e35e2a67 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/main.ts @@ -0,0 +1,25 @@ +// #docregion +import { bootstrap } from 'angular2/platform/browser'; +import { provide } from 'angular2/core'; +import { XHRBackend } from 'angular2/http'; + +import { LocationStrategy, + HashLocationStrategy, + ROUTER_PROVIDERS } from 'angular2/router'; + +import { HeroData } from './hero-data'; +import { InMemoryBackendService, + SEED_DATA } from 'a2-in-memory-web-api/core'; + +import { AppComponent } from './app.component'; + +// #docregion bootstrap +bootstrap(AppComponent, [ + ROUTER_PROVIDERS, + provide(LocationStrategy, + {useClass: HashLocationStrategy}), + + provide(XHRBackend, { useClass: InMemoryBackendService }), // in-mem server + provide(SEED_DATA, { useClass: HeroData }) // in-mem server data +]).catch((err: any) => console.error(err)); +// #enddocregion bootstrap diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/parent-finder.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/parent-finder.component.ts new file mode 100644 index 0000000000..4099ec6af9 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/parent-finder.component.ts @@ -0,0 +1,227 @@ +/* tslint:disable:no-unused-variable */ +/* tslint:disable:one-line:check-open-brace*/ +// #docplaster +// #docregion +import { Component, forwardRef, Optional, provide, SkipSelf } from 'angular2/core'; + +// A component base class (see AlexComponent) +export abstract class Base { name = 'Count Basie'; } + +// Marker class, used as an interface +// #docregion parent +export abstract class Parent { name: string; } +// #enddocregion parent + +const DifferentParent = Parent; + +// #docregion provide-parent, provide-the-parent +// Helper method to provide the current component instance in the name of a `parentType`. +// #enddocregion provide-the-parent +// The `parentType` defaults to `Parent` when omitting the second parameter. +// #docregion provide-the-parent +const provideParent = +// #enddocregion provide-parent, provide-the-parent +// #docregion provide-parent + (component: any, parentType?: any) => + provide(parentType || Parent, { useExisting: forwardRef(() => component) }); +// #enddocregion provide-parent + +// Simpler syntax version that always provides the component in the name of `Parent`. +const provideTheParent = +// #docregion provide-the-parent + (component: any) => provide(Parent, { useExisting: forwardRef(() => component) }); +// #enddocregion provide-the-parent + + +///////// C - Child ////////// +// #docregion carol +const templateC = ` +
+

{{name}}

+

My parent is {{parent?.name}}

+
`; + +@Component({ + selector: 'carol', + template: templateC +}) +// #docregion carol-class +export class CarolComponent { + name= 'Carol'; + // #docregion carol-ctor + constructor( @Optional() public parent: Parent ) { } + // #enddocregion carol-ctor +} +// #enddocregion carol-class +// #enddocregion carol + +@Component({ + selector: 'chris', + template: templateC +}) +export class ChrisComponent { + name= 'Chris'; + constructor( @Optional() public parent: Parent ) { } +} + +////// Craig /////////// +/** + * Show we cannot inject a parent by its base class. + */ +// #docregion craig +@Component({ + selector: 'craig', + template: ` +
+

Craig

+ {{alex ? 'Found' : 'Did not find'}} Alex via the base class. +
` +}) +export class CraigComponent { + constructor( @Optional() public alex: Base ) { } +} +// #enddocregion craig + +// #docregion C_DIRECTIVES +const C_DIRECTIVES = [ + CarolComponent, ChrisComponent, CraigComponent, + forwardRef(() => CathyComponent) +]; +// #enddocregion C_DIRECTIVES + +//////// B - Parent ///////// +// #docregion barry +const templateB = ` +
+
+

{{name}}

+

My parent is {{parent?.name}}

+
+ + +
`; + +@Component({ + selector: 'barry', + template: templateB, + directives: C_DIRECTIVES, + providers: [ provide(Parent, { useExisting: forwardRef(() => BarryComponent) }) ] +}) +export class BarryComponent implements Parent { + name = 'Barry'; +// #docregion barry-ctor + constructor( @SkipSelf() @Optional() public parent: Parent ) { } +// #enddocregion barry-ctor +} +// #enddocregion barry + +@Component({ + selector: 'bob', + template: templateB, + directives: C_DIRECTIVES, + providers: [ provideParent(BobComponent) ] +}) +export class BobComponent implements Parent { + name= 'Bob'; + constructor( @SkipSelf() @Optional() public parent: Parent ) { } +} + +@Component({ + selector: 'beth', + template: templateB, + directives: C_DIRECTIVES, +// #docregion beth-providers + providers: [ provideParent(BethComponent, DifferentParent) ] +// #enddocregion beth-providers +}) +export class BethComponent implements Parent { + name= 'Beth'; + constructor( @SkipSelf() @Optional() public parent: Parent ) { } +} + +const B_DIRECTIVES = [ BarryComponent, BethComponent, BobComponent ]; + +///////// A - Grandparent ////// + +// #docregion alex, alex-1 +@Component({ + selector: 'alex', + template: ` +
+

{{name}}

+ + + +
`, +// #enddocregion alex-1 +// #docregion alex-providers + providers: [ provide(Parent, { useExisting: forwardRef(() => AlexComponent) }) ], +// #enddocregion alex-providers +// #docregion alex-1 + directives: C_DIRECTIVES +}) +// #enddocregion alex-1 +// Todo: Add `... implements Parent` to class signature +// #docregion alex-1 +// #docregion alex-class-signature +export class AlexComponent extends Base +// #enddocregion alex-class-signature +{ + name= 'Alex'; +} +// #enddocregion alex, alex-1 + +///// + +// #docregion alice +@Component({ + selector: 'alice', + template: ` +
+

{{name}}

+ + + + +
`, + directives: [ B_DIRECTIVES, C_DIRECTIVES ], +// #docregion alice-providers + providers: [ provideParent(AliceComponent) ] +// #enddocregion alice-providers +}) +// #docregion alice-class-signature +export class AliceComponent implements Parent +// #enddocregion alice-class-signature +{ + name= 'Alice'; +} +// #enddocregion alice + +////// Cathy /////////// +/** + * Show we can inject a parent by component type + */ +// #docregion cathy +@Component({ + selector: 'cathy', + template: ` +
+

Cathy

+ {{alex ? 'Found' : 'Did not find'}} Alex via the component class.
+
` +}) +export class CathyComponent { + constructor( @Optional() public alex: AlexComponent ) { } +} +// #enddocregion cathy + +///////// ParentFinder ////// +@Component({ + selector: 'parent-finder', + template: ` +

Parent Finder

+ + `, + directives: [ AlexComponent, AliceComponent ] +}) +export class ParentFinderComponent { } diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/runners-up.ts b/public/docs/_examples/cb-dependency-injection/ts/app/runners-up.ts new file mode 100644 index 0000000000..a2d79df35e --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/runners-up.ts @@ -0,0 +1,25 @@ +// #docplaster +// #docregion +import {OpaqueToken} from 'angular2/core'; +import {Hero} from './hero'; +import {HeroService} from './hero.service'; + +// #docregion runners-up +export const RUNNERS_UP = new OpaqueToken('RunnersUp'); +// #docregion runners-up + +// #docregion factory-synopsis +export function runnersUpFactory(take: number) { + return (winner: Hero, heroService: HeroService): string => { + /* ... */ +// #enddocregion factory-synopsis + return heroService + .getAllHeroes() + .filter((hero) => hero.name !== winner.name) + .map(hero => hero.name) + .slice(0, Math.max(0, take)) + .join(', '); +// #docregion factory-synopsis + }; +}; +// #enddocregion factory-synopsis diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/sorted-heroes.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/sorted-heroes.component.ts new file mode 100644 index 0000000000..2a45367044 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/sorted-heroes.component.ts @@ -0,0 +1,51 @@ +// #docplaster +// #docregion +import {Component, OnInit} from 'angular2/core'; +import {Hero} from './hero'; +import {HeroService} from './hero.service'; + +/////// HeroesBaseComponent ///// +// #docregion heroes-base, injection +@Component({ + selector: 'unsorted-heroes', + template: `
{{hero.name}}
`, + providers: [HeroService] +}) +export class HeroesBaseComponent implements OnInit { + constructor(private _heroService: HeroService) { } +// #enddocregion injection + + heroes: Array; + + ngOnInit() { + this.heroes = this._heroService.getAllHeroes(); + this._afterGetHeroes(); + } + + // Post-process heroes in derived class override. + protected _afterGetHeroes() {} + +// #docregion injection +} +// #enddocregion heroes-base,injection + +/////// SortedHeroesComponent ///// +// #docregion sorted-heroes +@Component({ + selector: 'sorted-heroes', + template: `
{{hero.name}}
`, + providers: [HeroService] +}) +export class SortedHeroesComponent extends HeroesBaseComponent { + constructor(heroService: HeroService) { + super(heroService); + } + + protected _afterGetHeroes() { + this.heroes = this.heroes.sort((h1, h2) => { + return h1.name < h2.name ? -1 : + (h1.name > h2.name ? 1 : 0); + }); + } +} +// #enddocregion sorted-heroes diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/user-context.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/user-context.service.ts new file mode 100644 index 0000000000..b241675d31 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/user-context.service.ts @@ -0,0 +1,32 @@ +// #docplaster +// #docregion +import {Injectable} from 'angular2/core'; +import {LoggerService} from './logger.service'; +import {UserService} from './user.service'; + +// #docregion injectables, injectable +@Injectable() +export class UserContextService { +// #enddocregion injectables, injectable + name:string; + role:string; + loggedInSince:Date; + + // #docregion ctor, injectables + constructor(private _userService:UserService, private _loggerService:LoggerService){ + // #enddocregion ctor, injectables + this.loggedInSince = new Date(); + // #docregion ctor, injectables + } + // #enddocregion ctor, injectables + + loadUser(userId:number){ + let user = this._userService.getUserById(userId); + this.name = user.name; + this.role = user.role; + + this._loggerService.logDebug('loaded User'); + } +// #docregion injectables, injectable +} +// #enddocregion injectables, injectable diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/user.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/user.service.ts new file mode 100644 index 0000000000..f2d44d7a26 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/user.service.ts @@ -0,0 +1,10 @@ +// #docregion +import {Injectable} from 'angular2/core'; + +@Injectable() +export class UserService { + + getUserById(userId:number):any{ + return {name:'Bombasto',role:'Admin'}; + } +} \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/example-config.json b/public/docs/_examples/cb-dependency-injection/ts/example-config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cb-dependency-injection/ts/index.html b/public/docs/_examples/cb-dependency-injection/ts/index.html new file mode 100644 index 0000000000..66db40eb30 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/index.html @@ -0,0 +1,44 @@ + + + + + Dependency Injection + + + + + + + + + + + + + + + + + + + + + + + + + Loading app... + + + diff --git a/public/docs/_examples/cb-dependency-injection/ts/plnkr.json b/public/docs/_examples/cb-dependency-injection/ts/plnkr.json new file mode 100644 index 0000000000..d20b01cf1d --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/plnkr.json @@ -0,0 +1,9 @@ +{ + "description": "Dependency Injection", + "files":[ + "!**/*.d.ts", + "!**/*.js", + "!**/*.[1].*" + ], + "tags":["cookbook"] +} \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/sample.css b/public/docs/_examples/cb-dependency-injection/ts/sample.css new file mode 100644 index 0000000000..a8b59efd05 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/sample.css @@ -0,0 +1,26 @@ +.di-component{ + padding: 10px; + width:300px; + margin-bottom: 10px; +} +div[myHighlight] { + padding: 2px 8px; +} + +/* Parent Finder */ +.a, .b, .c { + margin: 6px 2px 6px; + padding: 4px 6px; +} +.a { + border: solid 2px black; +} +.b { + background: lightblue; + border: solid 1px darkblue; + display: flex; +} +.c { + background: pink; + border: solid 1px red; +} \ No newline at end of file diff --git a/public/docs/_examples/cb-ts-to-js/e2e-spec.js b/public/docs/_examples/cb-ts-to-js/e2e-spec.js new file mode 100644 index 0000000000..27b332e99e --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/e2e-spec.js @@ -0,0 +1,73 @@ +describe('TypeScript to Javascript tests', function () { + + beforeAll(function () { + browser.get(''); + }); + + it('should display the basic component example', function () { + testTag('hero-view', 'Hero: Windstorm'); + }); + + it('should display the component example with lifecycle methods', function () { + testTag('hero-lifecycle', 'Hero: Windstorm'); + }); + + it('should display component with DI example', function () { + testTag('hero-di', 'Hero: Windstorm'); + }); + + it('should display component with DI using @Inject example', function () { + testTag('hero-di-inject', 'Hero: Windstorm'); + }); + + it('should support optional, attribute, and query injections', function () { + var app = element(by.css('hero-di-inject-additional')); + var h1 = app.element(by.css('h1')); + var okMsg = app.element(by.css('.ok-msg')); + + expect(h1.getText()).toBe('Tour of Heroes'); + app.element(by.buttonText('OK')).click(); + expect(okMsg.getText()).toBe('OK!'); + }); + + it('should support component with inputs and outputs', function () { + var app = element(by.css('hero-io')); + var confirmComponent = app.element(by.css('my-confirm')); + + confirmComponent.element(by.buttonText('OK')).click(); + expect(app.element(by.cssContainingText('span', 'OK clicked')).isPresent()).toBe(true); + + confirmComponent.element(by.buttonText('Cancel')).click(); + expect(app.element(by.cssContainingText('span', 'Cancel clicked')).isPresent()).toBe(true); + }); + + it('should support host bindings and host listeners', function() { + var app = element(by.css('heroes-bindings')); + var h1 = app.element(by.css('h1')); + + expect(app.getAttribute('class')).toBe('heading'); + expect(app.getAttribute('title')).toBe('Tooltip content'); + + h1.click(); + expect(h1.getAttribute('class')).toBe('active'); + + h1.click(); + browser.actions().doubleClick(h1).perform(); + expect(h1.getAttribute('class')).toBe('active'); + }); + + it('should support content and view queries', function() { + var app = element(by.css('heroes-queries')); + var windstorm = app.element(by.css('hero:first-child')); + + app.element(by.buttonText('Activate')).click(); + expect(windstorm.element(by.css('h2')).getAttribute('class')).toBe('active'); + expect(windstorm.element(by.css('active-label')).getText()).toBe('Active'); + }); + + function testTag(selector, expectedText) { + var component = element(by.css(selector)); + expect(component.getText()).toBe(expectedText); + } + +}); diff --git a/public/docs/_examples/cb-ts-to-js/js/app/data.service.js b/public/docs/_examples/cb-ts-to-js/js/app/data.service.js new file mode 100644 index 0000000000..c060e2b39d --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/data.service.js @@ -0,0 +1,13 @@ +(function(app) { + + function DataService() { + } + DataService.annotations = [ + new ng.core.Injectable() + ]; + DataService.prototype.getHeroName = function() { + return 'Windstorm'; + }; + app.DataService = DataService; + +})(window.app = window.app || {}); diff --git a/public/docs/_examples/cb-ts-to-js/js/app/hero-di-inject-additional.component.js b/public/docs/_examples/cb-ts-to-js/js/app/hero-di-inject-additional.component.js new file mode 100644 index 0000000000..413ccfc8f3 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/hero-di-inject-additional.component.js @@ -0,0 +1,47 @@ +(function(app) { + + // #docregion + var TitleComponent = ng.core.Component({ + selector: 'hero-title', + template: + '

{{titlePrefix}} {{title}}

' + + '' + + '' + }).Class({ + constructor: [ + [ + new ng.core.Optional(), + new ng.core.Inject('titlePrefix') + ], + new ng.core.Attribute('title'), + [ + new ng.core.Query('okMsg'), + ng.core.ElementRef + ], + function(titlePrefix, title, msg) { + this.titlePrefix = titlePrefix; + this.title = title; + this.msg = msg; + } + ], + ok: function() { + var msgEl = + this.msg.first.nativeElement; + msgEl.textContent = 'OK!'; + } + }); + // #enddocregion + + var AppComponent = ng.core.Component({ + selector: 'hero-di-inject-additional', + template: '' + + '' + + '', + directives: [TitleComponent] + }).Class({ + constructor: function() { } + }); + + app.HeroDIInjectAdditionalComponent = AppComponent; + +})(window.app = window.app || {}); diff --git a/public/docs/_examples/cb-ts-to-js/js/app/hero-di-inject.component.js b/public/docs/_examples/cb-ts-to-js/js/app/hero-di-inject.component.js new file mode 100644 index 0000000000..71bdbb57f9 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/hero-di-inject.component.js @@ -0,0 +1,39 @@ +(function(app) { + +// #docregion parameters + function HeroComponent(name) { + this.name = name; + } + HeroComponent.parameters = [ + 'heroName' + ]; + HeroComponent.annotations = [ + new ng.core.Component({ + selector: 'hero-di-inject', + template: '

Hero: {{name}}

' + }) + ]; +// #enddocregion parameters + + app.HeroDIInjectComponent = HeroComponent; + +})(window.app = window.app || {}); + +(function(app) { +// #docregion ctor + var HeroComponent = ng.core.Component({ + selector: 'hero-di-inline2', + template: '

Hero: {{name}}

' + }) + .Class({ + constructor: + [new ng.core.Inject('heroName'), + function(name) { + this.name = name; + }] + }); +// #enddocregion ctor + + app.HeroDIInjectComponent2 = HeroComponent; + +})(window.app = window.app || {}); diff --git a/public/docs/_examples/cb-ts-to-js/js/app/hero-di-inline.component.js b/public/docs/_examples/cb-ts-to-js/js/app/hero-di-inline.component.js new file mode 100644 index 0000000000..90c3d69cba --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/hero-di-inline.component.js @@ -0,0 +1,16 @@ +(function(app) { + // #docregion + var HeroComponent = ng.core.Component({ + selector: 'hero-di-inline', + template: '

Hero: {{name}}

' + }) + .Class({ + constructor: + [app.DataService, + function(service) { + this.name = service.getHeroName(); + }] + }); + // #enddocregion + app.HeroDIInlineComponent = HeroComponent; +})(window.app = window.app || {}); diff --git a/public/docs/_examples/cb-ts-to-js/js/app/hero-di.component.js b/public/docs/_examples/cb-ts-to-js/js/app/hero-di.component.js new file mode 100644 index 0000000000..2963258292 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/hero-di.component.js @@ -0,0 +1,20 @@ +(function(app) { + + // #docregion + app.HeroDIComponent = HeroComponent; + + function HeroComponent(dataService) { + this.name = dataService.getHeroName(); + } + HeroComponent.parameters = [ + app.DataService + ]; + HeroComponent.annotations = [ + new ng.core.Component({ + selector: 'hero-di', + template: '

Hero: {{name}}

' + }) + ]; + // #enddocregion + +})(window.app = window.app || {}); diff --git a/public/docs/_examples/cb-ts-to-js/js/app/hero-dsl.component.js b/public/docs/_examples/cb-ts-to-js/js/app/hero-dsl.component.js new file mode 100644 index 0000000000..2890e006a2 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/hero-dsl.component.js @@ -0,0 +1,23 @@ +// #docplaster +// #docregion appexport +(function(app) { + + // #docregion component + var HeroComponent = ng.core.Component({ + selector: 'hero-view-2', + template: + '

Name: {{getName()}}

', + }) + .Class({ + constructor: function() { + }, + getName: function() { + return 'Windstorm'; + } + }); + // #enddocregion component + + app.HeroComponentDsl = HeroComponent; + +})(window.app = window.app || {}); +// #enddocregion appexport diff --git a/public/docs/_examples/cb-ts-to-js/js/app/hero-io.component.js b/public/docs/_examples/cb-ts-to-js/js/app/hero-io.component.js new file mode 100644 index 0000000000..f00ce8065c --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/hero-io.component.js @@ -0,0 +1,57 @@ +(function(app) { + // #docregion + var ConfirmComponent = ng.core.Component({ + selector: 'my-confirm', + inputs: [ + 'okMsg', + 'notOkMsg: cancelMsg' + ], + outputs: [ + 'ok', + 'notOk: cancel' + ], + template: + '' + + '' + }).Class({ + constructor: function() { + this.ok = new ng.core.EventEmitter(); + this.notOk = new ng.core.EventEmitter(); + }, + onOkClick: function() { + this.ok.next(true); + }, + onNotOkClick: function() { + this.notOk.next(true); + } + }); + // #enddocregion + + function AppComponent() { + } + AppComponent.annotations = [ + new ng.core.Component({ + selector: 'hero-io', + template: '' + + '' + + 'OK clicked' + + 'Cancel clicked', + directives: [ConfirmComponent] + }) + ]; + AppComponent.prototype.onOk = function() { + this.okClicked = true; + } + AppComponent.prototype.onCancel = function() { + this.cancelClicked = true; + } + app.HeroIOComponent = AppComponent; + +})(window.app = window.app || {}); diff --git a/public/docs/_examples/cb-ts-to-js/js/app/hero-lifecycle.component.js b/public/docs/_examples/cb-ts-to-js/js/app/hero-lifecycle.component.js new file mode 100644 index 0000000000..b8a2148a64 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/hero-lifecycle.component.js @@ -0,0 +1,21 @@ +// #docplaster +(function(app) { + // #docregion + function HeroComponent() {} + // #enddocregion + HeroComponent.annotations = [ + new ng.core.Component({ + selector: 'hero-lifecycle', + template: '

Hero: {{name}}

' + }) + ]; + // #docregion + HeroComponent.prototype.ngOnInit = + function() { + this.name = 'Windstorm'; + }; + // #enddocregion + + app.HeroLifecycleComponent = HeroComponent; + +})(window.app = window.app || {}); diff --git a/public/docs/_examples/cb-ts-to-js/js/app/hero.component.js b/public/docs/_examples/cb-ts-to-js/js/app/hero.component.js new file mode 100644 index 0000000000..f741285617 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/hero.component.js @@ -0,0 +1,32 @@ +// #docplaster +// #docregion appexport +(function(app) { + // #enddocregion appexport + + // #docregion metadata + // #docregion appexport + // #docregion constructorproto + function HeroComponent() { + this.title = "Hero Detail"; + } + + // #enddocregion constructorproto + // #enddocregion appexport + HeroComponent.annotations = [ + new ng.core.Component({ + selector: 'hero-view', + template: + '

Hero: {{getName()}}

' + }) + ]; + // #docregion constructorproto + HeroComponent.prototype.getName = + function() {return 'Windstorm';}; + // #enddocregion constructorproto + // #enddocregion metadata + + // #docregion appexport + app.HeroComponent = HeroComponent; + +})(window.app = window.app || {}); +// #enddocregion appexport diff --git a/public/docs/_examples/cb-ts-to-js/js/app/heroes-bindings.component.js b/public/docs/_examples/cb-ts-to-js/js/app/heroes-bindings.component.js new file mode 100644 index 0000000000..0c4ee7d7cf --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/heroes-bindings.component.js @@ -0,0 +1,30 @@ +(function(app) { + + // #docregion + var HeroesComponent = ng.core.Component({ + selector: 'heroes-bindings', + template: '

' + + 'Tour of Heroes' + + '

', + host: { + '[title]': 'title', + '[class.heading]': 'hClass', + '(click)': 'clicked()', + '(dblclick)': 'doubleClicked($event)' + } + }).Class({ + constructor: function() { + this.title = 'Tooltip content'; + this.hClass = true; + }, + clicked: function() { + this.active = !this.active; + }, + doubleClicked: function(evt) { + this.active = true; + } + }); + // #enddocregion + app.HeroesHostBindingsComponent = HeroesComponent; + +})(window.app = window.app || {}); diff --git a/public/docs/_examples/cb-ts-to-js/js/app/heroes-queries.component.js b/public/docs/_examples/cb-ts-to-js/js/app/heroes-queries.component.js new file mode 100644 index 0000000000..a99d985b35 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/heroes-queries.component.js @@ -0,0 +1,73 @@ +(function(app) { + + var ActiveLabelComponent = ng.core.Component({ + selector: 'active-label', + template: '' + + 'Active' + + '' + }).Class({ + constructor: function() { }, + activate: function() { + this.active = true; + } + }); + + // #docregion content + var HeroComponent = ng.core.Component({ + selector: 'hero', + template: '

' + + '{{hero.name}} ' + + '' + + '

', + inputs: ['hero'], + queries: { + label: new ng.core.ContentChild( + ActiveLabelComponent) + } + }).Class({ + constructor: function() { }, + activate: function() { + this.active = true; + this.label.activate(); + } + }); + // #enddocregion content + + // #docregion view + var AppComponent = ng.core.Component({ + selector: 'heroes-queries', + template: + '' + + '' + + '' + + '', + directives: [ + HeroComponent, + ActiveLabelComponent + ], + queries: { + heroCmps: new ng.core.ViewChildren( + HeroComponent) + } + }).Class({ + constructor: function() { + this.heroData = [ + {id: 1, name: 'Windstorm'}, + {id: 2, name: 'Superman'} + ]; + }, + activate: function() { + this.heroCmps.forEach(function(cmp) { + cmp.activate(); + }); + } + }); + // #enddocregion view + + app.HeroesQueriesComponent = AppComponent; + +})(window.app = window.app || {}); diff --git a/public/docs/_examples/cb-ts-to-js/js/app/main.js b/public/docs/_examples/cb-ts-to-js/js/app/main.js new file mode 100644 index 0000000000..8603b116cc --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/app/main.js @@ -0,0 +1,41 @@ +// #docplaster +// #docregion appimport +(function(app) { + // #enddocregion appimport + + // #docregion ng2import + var provide = + ng.core.provide; + var bootstrap = + ng.platform.browser.bootstrap; + var LocationStrategy = + ng.router.LocationStrategy; + var HashLocationStrategy = + ng.router.HashLocationStrategy; + // #enddocregion ng2import + + // #docregion appimport + var HeroComponent = app.HeroComponent; + // #enddocregion appimport + + document.addEventListener('DOMContentLoaded', function() { + bootstrap(HeroComponent); + bootstrap(app.HeroComponentDsl); + bootstrap(app.HeroLifecycleComponent); + bootstrap(app.HeroDIComponent, [app.DataService]); + bootstrap(app.HeroDIInlineComponent, [app.DataService]); + bootstrap(app.HeroDIInjectComponent, [ + ng.core.provide('heroName', {useValue: 'Windstorm'}) + ]); + bootstrap(app.HeroDIInjectComponent2, [ + ng.core.provide('heroName', {useValue: 'Bombasto'}) + ]); + bootstrap(app.HeroDIInjectAdditionalComponent); + bootstrap(app.HeroIOComponent); + bootstrap(app.HeroesHostBindingsComponent); + bootstrap(app.HeroesQueriesComponent); + }); + + // #docregion appimport +})(window.app = window.app || {}); +// #enddocregion appimport diff --git a/public/docs/_examples/cb-ts-to-js/js/example-config.json b/public/docs/_examples/cb-ts-to-js/js/example-config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cb-ts-to-js/js/index.html b/public/docs/_examples/cb-ts-to-js/js/index.html new file mode 100644 index 0000000000..549d5247ee --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/index.html @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

TypeScript to JavaScript

+ Classes and Class Metadata
+ Input and Output Metadata
+ Dependency Injection
+ Host and Query Metadata
+ +
+

Classes and Class Metadata

+ Loading hero-view... + Loading hero-view2... + Loading hero-lifecycle... + +
+

Input and Output Metadata

+ Loading hero-io... + +
+

Dependency Injection

+ Loading hero-di... + Loading hero-di-inline... + Loading hero-di-inline2... + Loading hero-di-inject... + Loading hero-di-inject-additional... + +
+

Host and Query Metadata

+ Loading heroes-bindings... + Loading heroes-queries... + + + diff --git a/public/docs/_examples/cb-ts-to-js/js/plnkr.json b/public/docs/_examples/cb-ts-to-js/js/plnkr.json new file mode 100644 index 0000000000..729230c2d1 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/js/plnkr.json @@ -0,0 +1,7 @@ +{ + "description": "TypeScript to JavaScript", + "files":[ + "!**/karma*.*" + ], + "tags":["cookbook"] +} diff --git a/public/docs/_examples/cb-ts-to-js/ts/.gitignore b/public/docs/_examples/cb-ts-to-js/ts/.gitignore new file mode 100644 index 0000000000..2cb7d2a2e9 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/.gitignore @@ -0,0 +1 @@ +**/*.js diff --git a/public/docs/_examples/cb-ts-to-js/ts/app/data.service.ts b/public/docs/_examples/cb-ts-to-js/ts/app/data.service.ts new file mode 100644 index 0000000000..08911a96a2 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/app/data.service.ts @@ -0,0 +1,10 @@ +import {Injectable} from 'angular2/core'; + +@Injectable() +export class DataService { + constructor() { + } + getHeroName() { + return 'Windstorm'; + } +} diff --git a/public/docs/_examples/cb-ts-to-js/ts/app/hero-di-inject-additional.component.ts b/public/docs/_examples/cb-ts-to-js/ts/app/hero-di-inject-additional.component.ts new file mode 100644 index 0000000000..9f3e37a7d8 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/app/hero-di-inject-additional.component.ts @@ -0,0 +1,48 @@ +import { + Attribute, + Component, + ElementRef, + Inject, + Optional, + Query, + QueryList +} from 'angular2/core'; + +// #docregion +@Component({ + selector: 'hero-title', + template: ` +

{{titlePrefix}} {{title}}

+ + + ` +}) +export class TitleComponent { + constructor( + @Inject('titlePrefix') + @Optional() + private titlePrefix:string, + @Attribute('title') + private title:string, + @Query('okMsg') + private msg:QueryList) { + } + + ok() { + let msgEl = + this.msg.first.nativeElement; + msgEl.textContent = 'OK!'; + } +} +// #enddocregion + +@Component({ + selector: 'hero-di-inject-additional', + template: ` + + `, + directives: [TitleComponent] +}) +export class AppComponent { + +} diff --git a/public/docs/_examples/cb-ts-to-js/ts/app/hero-di-inject.component.ts b/public/docs/_examples/cb-ts-to-js/ts/app/hero-di-inject.component.ts new file mode 100644 index 0000000000..1633598426 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/app/hero-di-inject.component.ts @@ -0,0 +1,14 @@ +import {Component, Inject} from 'angular2/core'; + +// #docregion +@Component({ + selector: 'hero-di-inject', + template: `

Hero: {{name}}

` +}) +export class HeroComponent { + constructor( + @Inject('heroName') + private name:string) { + } +} +// #enddocregion diff --git a/public/docs/_examples/cb-ts-to-js/ts/app/hero-di.component.ts b/public/docs/_examples/cb-ts-to-js/ts/app/hero-di.component.ts new file mode 100644 index 0000000000..58f12db09c --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/app/hero-di.component.ts @@ -0,0 +1,15 @@ +import {Component} from 'angular2/core'; +import {DataService} from './data.service'; + +// #docregion +@Component({ + selector: 'hero-di', + template: `

Hero: {{name}}

` +}) +export class HeroComponent { + name:string; + constructor(dataService:DataService) { + this.name = dataService.getHeroName(); + } +} +// #enddocregion diff --git a/public/docs/_examples/cb-ts-to-js/ts/app/hero-io.component.ts b/public/docs/_examples/cb-ts-to-js/ts/app/hero-io.component.ts new file mode 100644 index 0000000000..01ce84d8b3 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/app/hero-io.component.ts @@ -0,0 +1,56 @@ +import {Component, EventEmitter, Input, Output} from 'angular2/core'; + +// #docregion +@Component({ + selector: 'my-confirm', + template: ` + + + ` +}) +export class ConfirmComponent { + @Input() okMsg:string; + @Input('cancelMsg') notOkMsg:string; + @Output() ok = + new EventEmitter(); + @Output('cancel') notOk = + new EventEmitter(); + + onOkClick() { + this.ok.next(true); + } + onNotOkClick() { + this.notOk.next(true); + } +} +// #enddocregion + + +@Component({ + selector: 'hero-io', + template: ` + + + OK clicked + Cancel clicked + `, + directives: [ConfirmComponent] +}) +export class AppComponent { + okClicked:boolean; + cancelClicked:boolean; + + onOk() { + this.okClicked = true; + } + onCancel() { + this.cancelClicked = true; + } +} diff --git a/public/docs/_examples/cb-ts-to-js/ts/app/hero-lifecycle.component.ts b/public/docs/_examples/cb-ts-to-js/ts/app/hero-lifecycle.component.ts new file mode 100644 index 0000000000..2a82e9cd20 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/app/hero-lifecycle.component.ts @@ -0,0 +1,19 @@ +// #docplaster +// #docregion +import {Component, OnInit} + from 'angular2/core'; + // #enddocregion + +@Component({ + selector: 'hero-lifecycle', + template: `

Hero: {{name}}

` +}) +// #docregion +export class HeroComponent + implements OnInit { + name:string; + ngOnInit() { + this.name = 'Windstorm'; + } +} +// #enddocregion diff --git a/public/docs/_examples/cb-ts-to-js/ts/app/hero.component.ts b/public/docs/_examples/cb-ts-to-js/ts/app/hero.component.ts new file mode 100644 index 0000000000..1ce2609636 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/app/hero.component.ts @@ -0,0 +1,18 @@ +// #docplaster +// #docregion metadata +import {Component} from 'angular2/core'; + +@Component({ + selector: 'hero-view', + template: + '

Hero: {{getName()}}

' +}) +// #docregion appexport +// #docregion class +export class HeroComponent { + title = 'Hero Detail'; + getName() {return 'Windstorm';} +} +// #enddocregion class +// #enddocregion appexport +// #enddocregion metadata diff --git a/public/docs/_examples/cb-ts-to-js/ts/app/heroes-bindings.component.ts b/public/docs/_examples/cb-ts-to-js/ts/app/heroes-bindings.component.ts new file mode 100644 index 0000000000..6512f41d68 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/app/heroes-bindings.component.ts @@ -0,0 +1,28 @@ +import {Component, HostBinding, HostListener} from 'angular2/core'; + +// #docregion +@Component({ + selector: 'heroes-bindings', + template: `

+ Tour of Heroes +

` +}) +export class HeroesComponent { + @HostBinding() title = 'Tooltip content'; + @HostBinding('class.heading') + hClass = true + active:boolean; + + constructor() {} + + @HostListener('click') + clicked() { + this.active = !this.active; + } + + @HostListener('dblclick', ['$event']) + doubleClicked(evt:Event) { + this.active = true; + } +} +// #enddocregion diff --git a/public/docs/_examples/cb-ts-to-js/ts/app/heroes-queries.component.ts b/public/docs/_examples/cb-ts-to-js/ts/app/heroes-queries.component.ts new file mode 100644 index 0000000000..a16906266c --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/app/heroes-queries.component.ts @@ -0,0 +1,79 @@ +import { + Component, + ViewChildren, + ContentChild, + QueryList, + Input +} from 'angular2/core'; + +@Component({ + selector: 'active-label', + template: ` + Active + ` +}) +class ActiveLabelComponent { + active:boolean; + + activate() { + this.active = true; + } +} + +// #docregion content +@Component({ + selector: 'hero', + template: `

+ {{hero.name}} + +

` +}) +class HeroComponent { + @Input() hero:any; + active:boolean; + + @ContentChild(ActiveLabelComponent) + label:ActiveLabelComponent + + activate() { + this.active = true; + this.label.activate(); + } +} +// #enddocregion content + + +// #docregion view +@Component({ + selector: 'heroes-queries', + template: ` + + + + + `, + directives: [ + HeroComponent, + ActiveLabelComponent + ] +}) +export class HeroesQueriesComponent { + heroData = [ + {id: 1, name: 'Windstorm'}, + {id: 2, name: 'Superman'} + ]; + + @ViewChildren(HeroComponent) + heroCmps:QueryList; + + activate() { + this.heroCmps.forEach( + (cmp) => cmp.activate() + ); + } +} +// #enddocregion view diff --git a/public/docs/_examples/cb-ts-to-js/ts/app/main.ts b/public/docs/_examples/cb-ts-to-js/ts/app/main.ts new file mode 100644 index 0000000000..02535f55f8 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/app/main.ts @@ -0,0 +1,35 @@ +// #docregion ng2import +import {provide} + from 'angular2/core'; +import {bootstrap} + from 'angular2/platform/browser'; +import { + LocationStrategy, + HashLocationStrategy +} from 'angular2/router'; +// #enddocregion ng2import + +// #docregion appimport +import {HeroComponent} + from './hero.component'; +// #enddocregion appimport +import {HeroComponent as HeroLifecycleComponent} from './hero-lifecycle.component'; +import {HeroComponent as HeroDIComponent} from './hero-di.component'; +import {HeroComponent as HeroDIInjectComponent} from './hero-di-inject.component'; +import {AppComponent as AppDIInjectAdditionalComponent} from './hero-di-inject-additional.component'; +import {AppComponent as AppIOComponent} from './hero-io.component'; +import {HeroesComponent as HeroesHostBindingsComponent} from './heroes-bindings.component'; +import {HeroesQueriesComponent} from './heroes-queries.component'; + +import {DataService} from './data.service'; + +bootstrap(HeroComponent); +bootstrap(HeroLifecycleComponent); +bootstrap(HeroDIComponent, [DataService]); +bootstrap(HeroDIInjectComponent, [ + provide('heroName', {useValue: 'Windstorm'}) +]); +bootstrap(AppDIInjectAdditionalComponent); +bootstrap(AppIOComponent); +bootstrap(HeroesHostBindingsComponent); +bootstrap(HeroesQueriesComponent); diff --git a/public/docs/_examples/cb-ts-to-js/ts/example-config.json b/public/docs/_examples/cb-ts-to-js/ts/example-config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cb-ts-to-js/ts/index.html b/public/docs/_examples/cb-ts-to-js/ts/index.html new file mode 100644 index 0000000000..49a1cf88e8 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/index.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + +

TypeScript to JavaScript

+ Classes and Class Metadata
+ Input and Output Metadata
+ Dependency Injection
+ Host and Query Metadata
+ +
+

Classes and Class Metadata

+ Loading hero-view... + Loading hero-lifecycle... + +
+

Input and Output Metadata

+ Loading hero-io... + +
+

Dependency Injection

+ Loading hero-di... + Loading hero-di-inject... + Loading hero-di-inject-additional... + +
+

Host and Query Metadata

+ Loading heroes-bindings... + Loading heroes-queries... + + + diff --git a/public/docs/_examples/cb-ts-to-js/ts/plnkr.json b/public/docs/_examples/cb-ts-to-js/ts/plnkr.json new file mode 100644 index 0000000000..5c7a5acd44 --- /dev/null +++ b/public/docs/_examples/cb-ts-to-js/ts/plnkr.json @@ -0,0 +1,8 @@ +{ + "description": "TypeScript to JavaScript", + "files":[ + "!**/*.d.ts", + "!**/*.js" + ], + "tags":["cookbook"] +} diff --git a/public/docs/_examples/component-styles/e2e-spec.js b/public/docs/_examples/component-styles/e2e-spec.js new file mode 100644 index 0000000000..e667260f99 --- /dev/null +++ b/public/docs/_examples/component-styles/e2e-spec.js @@ -0,0 +1,69 @@ +describe('Component Style Tests', function () { + + beforeAll(function () { + browser.get(''); + }); + + it('scopes component styles to component view', function() { + var componentH1 = element(by.css('hero-app > h1')); + var externalH1 = element(by.css('body > h1')); + + expect(componentH1.getCssValue('fontWeight')).toEqual('normal'); + expect(externalH1.getCssValue('fontWeight')).not.toEqual('normal'); + }); + + + it('allows styling :host element', function() { + var host = element(by.css('hero-details')); + + expect(host.getCssValue('borderWidth')).toEqual('1px'); + }); + + it('supports :host() in function form', function() { + var host = element(by.css('hero-details')); + + host.element(by.buttonText('Activate')).click(); + expect(host.getCssValue('borderWidth')).toEqual('3px'); + }); + + it('allows conditional :host-context() styling', function() { + var h2 = element(by.css('hero-details h2')); + + expect(h2.getCssValue('backgroundColor')).toEqual('rgba(238, 238, 255, 1)'); // #eeeeff + }); + + it('styles both view and content children with /deep/', function() { + var viewH3 = element(by.css('hero-team h3')); + var contentH3 = element(by.css('hero-controls h3')); + + expect(viewH3.getCssValue('fontStyle')).toEqual('italic'); + expect(contentH3.getCssValue('fontStyle')).toEqual('italic'); + }); + + it('includes styles loaded with CSS @import', function() { + var host = element(by.css('hero-details')); + + expect(host.getCssValue('padding')).toEqual('10px'); + }); + + it('processes template inline styles', function() { + var button = element(by.css('hero-controls button')); + var externalButton = element(by.css('body > button')); + expect(button.getCssValue('backgroundColor')).toEqual('rgba(255, 255, 255, 1)'); // #ffffff + expect(externalButton.getCssValue('backgroundColor')).not.toEqual('rgba(255, 255, 255, 1)'); + }); + + it('processes template s', function() { + var li = element(by.css('hero-team li:first-child')); + var externalLi = element(by.css('body > ul li')); + + expect(li.getCssValue('listStyleType')).toEqual('square'); + expect(externalLi.getCssValue('listStyleType')).not.toEqual('square'); + }); + + it('supports relative loading with moduleId', function() { + var host = element(by.css('quest-summary')); + expect(host.getCssValue('color')).toEqual('rgba(255, 255, 255, 1)'); // #ffffff + }); + +}); diff --git a/public/docs/_examples/component-styles/ts/.gitignore b/public/docs/_examples/component-styles/ts/.gitignore new file mode 100644 index 0000000000..2cb7d2a2e9 --- /dev/null +++ b/public/docs/_examples/component-styles/ts/.gitignore @@ -0,0 +1 @@ +**/*.js diff --git a/public/docs/_examples/component-styles/ts/app/hero-app-main.component.ts b/public/docs/_examples/component-styles/ts/app/hero-app-main.component.ts new file mode 100644 index 0000000000..b127a95b5e --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/hero-app-main.component.ts @@ -0,0 +1,19 @@ +import {Component, Input} from 'angular2/core'; +import {Hero} from './hero'; +import {HeroDetailsComponent} from './hero-details.component'; +import {HeroControlsComponent} from './hero-controls.component'; +import {QuestSummaryComponent} from './quest-summary.component'; + +@Component({ + selector: 'hero-app-main', + template: ` + + + + + `, + directives: [HeroDetailsComponent, HeroControlsComponent, QuestSummaryComponent] +}) +export class HeroAppMainComponent { + @Input() hero: Hero; +} diff --git a/public/docs/_examples/component-styles/ts/app/hero-app.component.ts b/public/docs/_examples/component-styles/ts/app/hero-app.component.ts new file mode 100644 index 0000000000..8eb5c9116c --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/hero-app.component.ts @@ -0,0 +1,25 @@ +import {Component, HostBinding} from 'angular2/core'; +import {Hero} from './hero'; +import {HeroAppMainComponent} from './hero-app-main.component'; + +// #docregion +@Component({ + selector: 'hero-app', + template: ` +

Tour of Heroes

+ `, + styles: ['h1 { font-weight: normal; }'], + directives: [HeroAppMainComponent] +}) +// #enddocregion +export class HeroAppComponent { + hero = new Hero( + 'Human Torch', + ['Mister Fantastic', 'Invisible Woman', 'Thing'] + ) + + @HostBinding('class') get themeClass() { + return 'theme-light'; + } + +} diff --git a/public/docs/_examples/component-styles/ts/app/hero-controls.component.ts b/public/docs/_examples/component-styles/ts/app/hero-controls.component.ts new file mode 100644 index 0000000000..fb674d0a63 --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/hero-controls.component.ts @@ -0,0 +1,26 @@ +import {Component, Input} from 'angular2/core'; +import {Hero} from './hero'; + +// #docregion inlinestyles +@Component({ + selector: 'hero-controls', + template: ` + +

Controls

+ + ` +}) +// #enddocregion inlinestyles +export class HeroControlsComponent { + + @Input() hero: Hero; + + activate() { + this.hero.active = true; + } +} diff --git a/public/docs/_examples/component-styles/ts/app/hero-details-box.css b/public/docs/_examples/component-styles/ts/app/hero-details-box.css new file mode 100644 index 0000000000..f240073005 --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/hero-details-box.css @@ -0,0 +1,3 @@ +:host { + padding: 10px; +} diff --git a/public/docs/_examples/component-styles/ts/app/hero-details.component.css b/public/docs/_examples/component-styles/ts/app/hero-details.component.css new file mode 100644 index 0000000000..fd938ca55c --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/hero-details.component.css @@ -0,0 +1,28 @@ +/* #docregion import */ +@import 'hero-details-box.css'; +/* #enddocregion import */ + +/* #docregion host */ +:host { + display: block; + border: 1px solid black; +} +/* #enddocregion host */ + +/* #docregion hostfunction */ +:host(.active) { + border-width: 3px; +} +/* #enddocregion hostfunction */ + +/* #docregion hostcontext */ +:host-context(.theme-light) h2 { + background-color: #eef; +} +/* #enddocregion hostcontext */ + +/* #docregion deep */ +:host /deep/ h3 { + font-style: italic; +} +/* #enddocregion deep */ diff --git a/public/docs/_examples/component-styles/ts/app/hero-details.component.ts b/public/docs/_examples/component-styles/ts/app/hero-details.component.ts new file mode 100644 index 0000000000..344063a543 --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/hero-details.component.ts @@ -0,0 +1,20 @@ +import {Component, Input} from 'angular2/core'; +import {Hero} from './hero'; +import {HeroTeamComponent} from './hero-team.component'; + +// #docregion styleurls +@Component({ + selector: 'hero-details', + template: ` +

{{hero.name}}

+ + + `, + styleUrls: ['app/hero-details.component.css'], + directives: [HeroTeamComponent] +}) +export class HeroDetailsComponent { +// #enddocregion styleurls + + @Input() hero:Hero; +} diff --git a/public/docs/_examples/component-styles/ts/app/hero-team.component.css b/public/docs/_examples/component-styles/ts/app/hero-team.component.css new file mode 100644 index 0000000000..b87679886b --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/hero-team.component.css @@ -0,0 +1,3 @@ +li { + list-style-type: square; +} diff --git a/public/docs/_examples/component-styles/ts/app/hero-team.component.ts b/public/docs/_examples/component-styles/ts/app/hero-team.component.ts new file mode 100644 index 0000000000..78885ff1ea --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/hero-team.component.ts @@ -0,0 +1,19 @@ +import {Component, Input} from 'angular2/core'; +import {Hero} from './hero'; + +// #docregion stylelink +@Component({ + selector: 'hero-team', + template: ` + +

Team

+
    +
  • + {{member}} +
  • +
` +}) +// #enddocregion stylelink +export class HeroTeamComponent { + @Input() hero: Hero; +} diff --git a/public/docs/_examples/component-styles/ts/app/hero.ts b/public/docs/_examples/component-styles/ts/app/hero.ts new file mode 100644 index 0000000000..8b58c8a8f8 --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/hero.ts @@ -0,0 +1,7 @@ +export class Hero { + active:boolean; + + constructor(public name:string, + public team:string[]) { + } +} diff --git a/public/docs/_examples/component-styles/ts/app/main.ts b/public/docs/_examples/component-styles/ts/app/main.ts new file mode 100644 index 0000000000..a9194f16f3 --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/main.ts @@ -0,0 +1,4 @@ +import {bootstrap} from 'angular2/platform/browser'; +import {HeroAppComponent} from './hero-app.component'; + +bootstrap(HeroAppComponent); diff --git a/public/docs/_examples/component-styles/ts/app/quest-summary.component.css b/public/docs/_examples/component-styles/ts/app/quest-summary.component.css new file mode 100644 index 0000000000..207fa981dd --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/quest-summary.component.css @@ -0,0 +1,5 @@ +:host { + display: block; + background-color: green; + color: white; +} diff --git a/public/docs/_examples/component-styles/ts/app/quest-summary.component.html b/public/docs/_examples/component-styles/ts/app/quest-summary.component.html new file mode 100644 index 0000000000..abf63c2542 --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/quest-summary.component.html @@ -0,0 +1 @@ +No quests in progress diff --git a/public/docs/_examples/component-styles/ts/app/quest-summary.component.ts b/public/docs/_examples/component-styles/ts/app/quest-summary.component.ts new file mode 100644 index 0000000000..daea1a26b9 --- /dev/null +++ b/public/docs/_examples/component-styles/ts/app/quest-summary.component.ts @@ -0,0 +1,32 @@ +// #docplaster +import {Component, ViewEncapsulation} from 'angular2/core'; + +// #docregion +// Let TypeScript know about the special SystemJS __moduleName variable +declare var __moduleName: string; +// #enddocregion +// moduleName is not set in some module loaders; set it explicitly +if (!__moduleName) { + __moduleName = `http://${location.host}/${location.pathname}/app/`; +} +console.log(`The __moduleName is ${__moduleName} `); +// #docregion + +@Component({ + moduleId: __moduleName, + selector: 'quest-summary', + // #docregion urls + templateUrl: 'quest-summary.component.html', + styleUrls: ['quest-summary.component.css'] + // #enddocregion urls +// #enddocregion +/* + // #docregion encapsulation.native + // warning: few browsers support shadow DOM encapsulation at this time + encapsulation: ViewEncapsulation.Native + // #enddocregion encapsulation.native +*/ +// #docregion +}) +export class QuestSummaryComponent { } +// #enddocregion diff --git a/public/docs/_examples/component-styles/ts/example-config.json b/public/docs/_examples/component-styles/ts/example-config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/component-styles/ts/index.html b/public/docs/_examples/component-styles/ts/index.html new file mode 100644 index 0000000000..58098522ff --- /dev/null +++ b/public/docs/_examples/component-styles/ts/index.html @@ -0,0 +1,40 @@ + + + + Component Styles + + + + + + + + + + + + + + + + +

External H1 Title for E2E test

+ + +
    +
  • External list for E2E test
  • +
+ + + diff --git a/public/docs/_examples/component-styles/ts/plnkr.json b/public/docs/_examples/component-styles/ts/plnkr.json new file mode 100644 index 0000000000..fb313556fc --- /dev/null +++ b/public/docs/_examples/component-styles/ts/plnkr.json @@ -0,0 +1,9 @@ +{ + "description": "Component Styles", + "files": [ + "!**/*.d.ts", + "!**/*.js", + "!**/*.native.*" + ], + "tags": ["CSS"] +} diff --git a/public/docs/_examples/dependency-injection/dart/.analysis_options b/public/docs/_examples/dependency-injection/dart/.analysis_options new file mode 100644 index 0000000000..d8c582e96f --- /dev/null +++ b/public/docs/_examples/dependency-injection/dart/.analysis_options @@ -0,0 +1,16 @@ +# Supported lint rules and documentation: http://dart-lang.github.io/linter/lints/ +linter: + rules: + - always_declare_return_types + - camel_case_types + - empty_constructor_bodies + - annotate_overrides + - avoid_init_to_null + - constant_identifier_names + - one_member_abstracts + - slash_for_doc_comments + - sort_constructors_first + - unnecessary_brace_in_string_interp + +analyzer: + # strong-mode: true diff --git a/public/docs/_examples/dependency-injection/dart/lib/app_component.dart b/public/docs/_examples/dependency-injection/dart/lib/app_component.dart index 4e01554a42..1a9e4f075b 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/app_component.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/app_component.dart @@ -1,15 +1,14 @@ // #docplaster - // #docregion - // #docregion imports import 'package:angular2/core.dart'; + +import 'app_config.dart'; import 'car/car_component.dart'; import 'heroes/heroes_component.dart'; -import 'app_config.dart'; import 'logger_service.dart'; import 'user_service.dart'; - +//PENDING: check whether we intend to hide injector_component.dart & providers_component.dart; if so, change docregion name? // #enddocregion imports import 'injector_component.dart'; import 'providers_component.dart'; @@ -17,33 +16,39 @@ import 'providers_component.dart'; @Component( selector: 'my-app', template: ''' -

{{title}}

- - - -

User

-

- {{userInfo}} - -

- - - ''', - directives: const [CarComponent, HeroesComponent, InjectorComponent, ProvidersComponent], +

{{title}}

+ + + +

User

+

+ {{userInfo}} + +

+ + ''', + directives: const [ + CarComponent, + HeroesComponent, + InjectorComponent, + ProvidersComponent + ], // #docregion providers - providers: const [Logger, UserService, const Provider(Config, useValue: CONFIG)] + providers: const [ + Logger, + UserService, + const Provider(AppConfig, useValue: config1)] // #enddocregion providers - ) +) class AppComponent { - UserService _userService; - String title; + final UserService _userService; + final String title; //#docregion ctor - AppComponent(Config config, this._userService) { - title = config.title; - } - + AppComponent(AppConfig config, this._userService) + : title = config.title; // #enddocregion ctor + bool get isAuthorized { return user.isAuthorized; } @@ -56,8 +61,7 @@ class AppComponent { return _userService.user; } - String get userInfo { - return 'Current user, ${user.name}, is ${isAuthorized ? "" : "not"} authorized. '; - } + String get userInfo => 'Current user, ${user.name}, is' + '${isAuthorized ? "" : " not"} authorized. '; } // #enddocregion diff --git a/public/docs/_examples/dependency-injection/dart/lib/app_component_1.dart b/public/docs/_examples/dependency-injection/dart/lib/app_component_1.dart index 7c3b7b9808..2466b4894b 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/app_component_1.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/app_component_1.dart @@ -2,19 +2,19 @@ // #docregion import 'package:angular2/core.dart'; + import 'car/car_component.dart'; import 'heroes/heroes_component_1.dart'; @Component( selector: 'my-app', template: ''' -

{{title}}

- - - ''', +

{{title}}

+ + ''', directives: const [CarComponent, HeroesComponent]) class AppComponent { - var title = 'Dependency Injection'; + final String title = 'Dependency Injection'; } // #enddocregion diff --git a/public/docs/_examples/dependency-injection/dart/lib/app_component_2.dart b/public/docs/_examples/dependency-injection/dart/lib/app_component_2.dart index 7bf4249ee2..4463b7c59c 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/app_component_2.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/app_component_2.dart @@ -2,34 +2,32 @@ // #docregion imports import 'package:angular2/core.dart'; + +import 'app_config.dart'; import 'car/car_component.dart'; import 'heroes/heroes_component_1.dart'; -import 'app_config.dart'; import 'logger_service.dart'; - // #enddocregion imports + @Component( selector: 'my-app', template: ''' -

{{title}}

- - - ''', +

{{title}}

+ + ''', directives: const [ CarComponent, HeroesComponent ], providers: const [ Logger, - // #docregion provider-config - const Provider('app.config', useValue: CONFIG) + const Provider(AppConfig, useValue: config1) ]) class AppComponent { - String title; + final String title; // #docregion ctor - AppComponent(@Inject('app.config') Config config) { - title = config.title; - } + AppComponent(AppConfig config) + : title = config.title; + // #enddocregion } -// #enddocregion diff --git a/public/docs/_examples/dependency-injection/dart/lib/app_config.dart b/public/docs/_examples/dependency-injection/dart/lib/app_config.dart index 8fc877f188..7785eff1b4 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/app_config.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/app_config.dart @@ -1,29 +1,17 @@ -//#docregion - +// #docregion // #docregion token import 'package:angular2/core.dart'; -const APP_CONFIG = const OpaqueToken('app.config'); -// #enddocregion token - -//#docregion config -abstract class Config { - final String apiEndpoint; +//#docregion const-class +@Injectable() +class AppConfig { + final apiEndpoint; final String title; - const Config({this.apiEndpoint, this.title}); + const AppConfig(this.apiEndpoint, this.title); } +//#enddocregion const-class -class ConfigImpl implements Config { - final String apiEndpoint; - final String title; - - const ConfigImpl({this.apiEndpoint, this.title}); -} - -const CONFIG = const ConfigImpl(apiEndpoint: 'api.heroes.com', title: 'Dependency Injection'); -//#enddocregion config - -//#docregion config-hash -const CONFIG_HASH = const {'apiEndpoint': 'api.heroes.com', 'title': 'Dependency Injection'}; -//#enddocregion config-hash +//#docregion const-object +const config1 = const AppConfig('api.heroes.com', 'Dependency Injection'); +//#enddocregion const-object diff --git a/public/docs/_examples/dependency-injection/dart/lib/car/car.dart b/public/docs/_examples/dependency-injection/dart/lib/car/car.dart index 4c8d1025e7..cacd0d9b69 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/car/car.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/car/car.dart @@ -1,13 +1,14 @@ // #docregion - import 'package:angular2/core.dart'; +@Injectable() // #docregion engine class Engine { - int cylinders = 4; + final int cylinders = 4; } // #enddocregion engine +@Injectable() // #docregion tires class Tires { String make = 'Flintstone'; @@ -18,8 +19,8 @@ class Tires { @Injectable() class Car { //#docregion car-ctor - Engine engine; - Tires tires; + final Engine engine; + final Tires tires; String description = 'DI'; Car(this.engine, this.tires); @@ -27,6 +28,7 @@ class Car { // #enddocregion car-ctor // Method using the engine and tires - String drive() => '$description car with ${engine.cylinders} cylinders and ${tires.make} tires.'; + String drive() => '$description car with ${engine.cylinders} cylinders' + ' and ${tires.make} tires.'; } // #enddocregion car diff --git a/public/docs/_examples/dependency-injection/dart/lib/car/car_component.dart b/public/docs/_examples/dependency-injection/dart/lib/car/car_component.dart index e8e3ccc0e0..b7e663b019 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/car/car_component.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/car/car_component.dart @@ -1,29 +1,29 @@ // #docregion - import 'package:angular2/core.dart'; + import 'car.dart'; -import 'car_no_di.dart' as carNoDi; -import 'car_factory.dart'; import 'car_creations.dart' as carCreations; +import 'car_factory.dart'; import 'car_injector.dart'; +import 'car_no_di.dart' as carNoDi; @Component( selector: 'my-car', template: ''' -

Cars

-
{{car.drive()}}
-
{{noDiCar.drive()}}
-
{{injectorCar.drive()}}
-
{{factoryCar.drive()}}
-
{{simpleCar.drive()}}
-
{{superCar.drive()}}
-
{{testCar.drive()}}
- ''', +

Cars

+
{{car.drive()}}
+
{{noDiCar.drive()}}
+
{{injectorCar.drive()}}
+
{{factoryCar.drive()}}
+
{{simpleCar.drive()}}
+
{{superCar.drive()}}
+
{{testCar.drive()}}
''', providers: const [Car, Engine, Tires]) class CarComponent { - Car car; + final Car car; + + CarComponent(this.car); - CarComponent(this.car) {} Car factoryCar = (new CarFactory()).createCar(); Car injectorCar = useInjector(); carNoDi.Car noDiCar = new carNoDi.Car(); diff --git a/public/docs/_examples/dependency-injection/dart/lib/car/car_creations.dart b/public/docs/_examples/dependency-injection/dart/lib/car/car_creations.dart index 33dfa05828..d0e6be3c1c 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/car/car_creations.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/car/car_creations.dart @@ -1,12 +1,10 @@ -// Examples with car and engine variations - // #docplaster +// Examples with car and engine variations import 'car.dart'; ///////// example 1 //////////// Car simpleCar() { //#docregion car-ctor-instantiation - // Simple car with 4 cylinders and Flintstone tires. var car = new Car(new Engine(), new Tires()); //#enddocregion car-ctor-instantiation @@ -17,19 +15,18 @@ Car simpleCar() { //#docregion car-ctor-instantiation-with-param class Engine2 implements Engine { - int cylinders; + final int cylinders; Engine2(this.cylinders); } - //#enddocregion car-ctor-instantiation-with-param -Car superCar() { - //#docregion car-ctor-instantiation-with-param - // Super car with 12 cylinders and Flintstone tires. - var bigCylinders = 12; - var car = new Car(new Engine2(bigCylinders), new Tires()); - //#enddocregion car-ctor-instantiation-with-param +Car superCar() { +//#docregion car-ctor-instantiation-with-param +// Super car with 12 cylinders and Flintstone tires. +var bigCylinders = 12; +var car = new Car(new Engine2(bigCylinders), new Tires()); +//#enddocregion car-ctor-instantiation-with-param car.description = 'Super'; return car; } @@ -37,7 +34,7 @@ Car superCar() { //#docregion car-ctor-instantiation-with-mocks class MockEngine extends Engine { - int cylinders = 8; + final int cylinders = 8; } class MockTires extends Tires { @@ -46,11 +43,10 @@ class MockTires extends Tires { //#enddocregion car-ctor-instantiation-with-mocks Car testCar() { - //#docregion car-ctor-instantiation-with-mocks - - // Test car with 8 cylinders and YokoGoodStone tires. - var car = new Car(new MockEngine(), new MockTires()); - //#enddocregion car-ctor-instantiation-with-mocks +//#docregion car-ctor-instantiation-with-mocks +// Test car with 8 cylinders and YokoGoodStone tires. +var car = new Car(new MockEngine(), new MockTires()); +//#enddocregion car-ctor-instantiation-with-mocks car.description = 'Test'; return car; } diff --git a/public/docs/_examples/dependency-injection/dart/lib/car/car_factory.dart b/public/docs/_examples/dependency-injection/dart/lib/car/car_factory.dart index 76b8a4cc63..7610e28b14 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/car/car_factory.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/car/car_factory.dart @@ -1,15 +1,13 @@ // #docregion - import 'car.dart'; +// BAD pattern! class CarFactory { Car createCar() { - var car = new Car(createEngine(), createTires()); - car.description = 'Factory'; - return car; + return new Car(createEngine(), createTires()) + ..description = 'Factory'; } Engine createEngine() => new Engine(); - Tires createTires() => new Tires(); } diff --git a/public/docs/_examples/dependency-injection/dart/lib/car/car_injector.dart b/public/docs/_examples/dependency-injection/dart/lib/car/car_injector.dart index 1dbadd9fab..d3da37a9e7 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/car/car_injector.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/car/car_injector.dart @@ -1,9 +1,9 @@ // #docplaster - //#docregion import 'package:angular2/core.dart'; -import 'car.dart'; + import '../logger_service.dart'; +import 'car.dart'; //#docregion injector Car useInjector() { @@ -24,8 +24,8 @@ Car useInjector() { //#docregion injector-call var car = injector.get(Car); //#enddocregion injector-call - //#enddocregion injector-create-and-call + car.description = 'Injector'; var logger = injector.get(Logger); logger.log('Injector car.drive() said: ' + car.drive()); diff --git a/public/docs/_examples/dependency-injection/dart/lib/car/car_no_di.dart b/public/docs/_examples/dependency-injection/dart/lib/car/car_no_di.dart index 32972c3dc1..86a4177b2d 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/car/car_no_di.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/car/car_no_di.dart @@ -13,10 +13,10 @@ class Car { engine = new Engine(); tires = new Tires(); } - //#enddocregion car-ctor // Method using the engine and tires - drive() => '$description car with ${engine.cylinders} cylinders and ${tires.make} tires.'; + String drive() => '$description car with ' + '${engine.cylinders} cylinders and ${tires.make} tires.'; } //#enddocregion car diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero.dart index ea10276b7c..2a76844f9c 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero.dart @@ -1,5 +1,4 @@ // #docregion - class Hero { num id; String name; diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component.dart index c4eeb14f1b..0c79b2f600 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component.dart @@ -1,19 +1,18 @@ // #docregion - import 'package:angular2/core.dart'; + import 'hero.dart'; import 'hero_service.dart'; @Component( selector: 'hero-list', template: ''' -
- {{hero.id}} - {{hero.name}} - ({{hero.isSecret ? \'secret\' : \'public\'}}) -
- ''') +
+ {{hero.id}} - {{hero.name}} + ({{hero.isSecret ? 'secret' : 'public'}}) +
''') class HeroListComponent { - List heroes; + final List heroes; //#docregion ctor-signature HeroListComponent(HeroService heroService) : heroes = heroService.getHeroes(); diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component_1.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component_1.dart index 3aeef5aefb..366cf570b0 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component_1.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component_1.dart @@ -1,16 +1,15 @@ // #docregion - import 'package:angular2/core.dart'; + import 'hero.dart'; import 'mock_heroes.dart'; @Component( selector: 'hero-list', template: ''' -
- {{hero.id}} - {{hero.name}} -
- ''') +
+ {{hero.id}} - {{hero.name}} +
''') class HeroListComponent { - List heroes = HEROES; + final List heroes = HEROES; } diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component_2.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component_2.dart index 2b76419505..637ca74b00 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component_2.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_list_component_2.dart @@ -1,20 +1,20 @@ // #docregion - import 'package:angular2/core.dart'; + import 'hero.dart'; import 'hero_service.dart'; @Component( selector: 'hero-list', template: ''' -
- {{hero.id}} - {{hero.name}} -
- ''') +
+ {{hero.id}} - {{hero.name}} +
''') class HeroListComponent { - List heroes; + final List heroes; //#docregion ctor - HeroListComponent(HeroService heroService) : heroes = heroService.getHeroes(); + HeroListComponent(HeroService heroService) + : heroes = heroService.getHeroes(); //#enddocregion ctor } diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service.dart index 2dda48cb70..59074e3cd4 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service.dart @@ -1,22 +1,24 @@ // #docregion - import 'package:angular2/core.dart'; + +import '../logger_service.dart'; import 'hero.dart'; import 'mock_heroes.dart'; -import '../logger_service.dart'; @Injectable() class HeroService { // #docregion internals - Logger _logger; - bool _isAuthorized; + final Logger _logger; + final bool _isAuthorized; HeroService(this._logger, this._isAuthorized); List getHeroes() { var auth = _isAuthorized ? 'authorized' : 'unauthorized'; - _logger.log('Getting heroes for ${auth} user.'); - return HEROES.where((hero) => _isAuthorized || !hero.isSecret).toList(); + _logger.log('Getting heroes for $auth user.'); + return HEROES + .where((hero) => _isAuthorized || !hero.isSecret) + .toList(); } // #enddocregion internals } diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_1.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_1.dart index 7ee6a642b4..f400d86fc4 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_1.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_1.dart @@ -1,5 +1,4 @@ // #docregion - import 'hero.dart'; import 'mock_heroes.dart'; diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_2.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_2.dart index 25146a76f9..badd8f548e 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_2.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_2.dart @@ -1,13 +1,13 @@ // #docregion - import 'package:angular2/core.dart'; + +import '../logger_service.dart'; import 'hero.dart'; import 'mock_heroes.dart'; -import '../logger_service.dart'; @Injectable() class HeroService { - Logger _logger; + final Logger _logger; //#docregion ctor HeroService(this._logger); diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_provider.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_provider.dart index b783f0edc5..7e457e2db9 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_provider.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/hero_service_provider.dart @@ -1,16 +1,18 @@ // #docregion - import 'package:angular2/core.dart'; -import 'hero_service.dart'; + import '../logger_service.dart'; import '../user_service.dart'; +import 'hero_service.dart'; // #docregion factory +@Injectable() heroServiceFactory(Logger logger, UserService userService) => new HeroService(logger, userService.user.isAuthorized); // #enddocregion factory // #docregion provider -const heroServiceProvider = - const Provider(HeroService, useFactory: heroServiceFactory, deps: const [Logger, UserService]); +const heroServiceProvider = const Provider(HeroService, + useFactory: heroServiceFactory, + deps: const [Logger, UserService]); // #enddocregion provider diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/heroes_component.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/heroes_component.dart index 45e310cd30..d90871de73 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/heroes_component.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/heroes_component.dart @@ -1,15 +1,14 @@ // #docregion - import 'package:angular2/core.dart'; + import 'hero_list_component.dart'; import 'hero_service_provider.dart'; @Component( selector: 'my-heroes', template: ''' -

Heroes

- - ''', +

Heroes

+ ''', providers: const [heroServiceProvider], directives: const [HeroListComponent]) class HeroesComponent {} diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/heroes_component_1.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/heroes_component_1.dart index 80d7ad8f2e..19cde705ce 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/heroes_component_1.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/heroes_component_1.dart @@ -1,20 +1,18 @@ // #docplaster - // #docregion // #docregion v1 import 'package:angular2/core.dart'; -import 'hero_list_component.dart'; +import 'hero_list_component.dart'; // #enddocregion v1 import 'hero_service.dart'; - // #docregion v1 + @Component( selector: 'my-heroes', template: ''' -

Heroes

- - ''', +

Heroes

+ ''', // #enddocregion v1 // #docregion providers providers: const [HeroService], diff --git a/public/docs/_examples/dependency-injection/dart/lib/heroes/mock_heroes.dart b/public/docs/_examples/dependency-injection/dart/lib/heroes/mock_heroes.dart index 9f49bf208c..2501f92081 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/heroes/mock_heroes.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/heroes/mock_heroes.dart @@ -1,5 +1,4 @@ // #docregion - import 'hero.dart'; List HEROES = [ diff --git a/public/docs/_examples/dependency-injection/dart/lib/injector_component.dart b/public/docs/_examples/dependency-injection/dart/lib/injector_component.dart index 24e1598f13..ecc85f9c39 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/injector_component.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/injector_component.dart @@ -2,21 +2,21 @@ //#docregion import 'package:angular2/core.dart'; + import 'car/car.dart'; +import 'heroes/hero.dart'; import 'heroes/hero_service.dart'; import 'heroes/hero_service_provider.dart'; import 'logger_service.dart'; -import 'package:dependency_injection/heroes/hero.dart'; //#docregion injector @Component( selector: 'my-injectors', template: ''' -

Other Injections

-
{{car.drive()}}
-
{{hero.name}}
-
{{rodent}}
- ''', +

Other Injections

+
{{car.drive()}}
+
{{hero.name}}
+
{{rodent}}
''', providers: const [ Car, Engine, @@ -25,20 +25,9 @@ import 'package:dependency_injection/heroes/hero.dart'; Logger ]) class InjectorComponent { - Injector _injector; - - InjectorComponent(this._injector) { - car = _injector.get(Car); - heroService = _injector.get(HeroService); - hero = heroService.getHeroes()[0]; - } - + final Injector _injector; Car car; - - //#docregion get-hero-service HeroService heroService; - - //#enddocregion get-hero-service Hero hero; String get rodent { @@ -48,6 +37,14 @@ class InjectorComponent { } return "R.O.U.S.'s? I don't think they exist!"; } + + InjectorComponent(this._injector) { + car = _injector.get(Car); + //#docregion get-hero-service + heroService = _injector.get(HeroService); + //#enddocregion get-hero-service + hero = heroService.getHeroes()[0]; + } } //#enddocregion injector diff --git a/public/docs/_examples/dependency-injection/dart/lib/logger_service.dart b/public/docs/_examples/dependency-injection/dart/lib/logger_service.dart index 452daefd22..38b4450f25 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/logger_service.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/logger_service.dart @@ -1,5 +1,4 @@ // #docregion - import 'package:angular2/core.dart'; @Injectable() diff --git a/public/docs/_examples/dependency-injection/dart/lib/providers_component.dart b/public/docs/_examples/dependency-injection/dart/lib/providers_component.dart index 83d461deb2..34a1c82f3e 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/providers_component.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/providers_component.dart @@ -2,22 +2,19 @@ //#docplaster import 'package:angular2/core.dart'; + import 'app_config.dart'; import 'heroes/hero_service_provider.dart'; import 'heroes/hero_service.dart'; import 'logger_service.dart'; import 'user_service.dart'; -// #docregion import-optional -import 'package:angular2/core.dart' show Optional; -// #enddocregion import-optional - -const template = '{{log}}'; - -////////////////////////////////////////// -@Component(selector: 'provider-1', template: '{{log}}', providers: +@Component( + selector: 'provider-1', + template: '{{log}}', + providers: //#docregion providers-1 -const [Logger] + const [Logger] //#enddocregion providers-1 ) class ProviderComponent1 { @@ -25,14 +22,16 @@ class ProviderComponent1 { ProviderComponent1(Logger logger) { logger.log('Hello from logger provided with Logger class'); - log = logger.logs[0]; + log = logger.logs.last; } } -////////////////////////////////////////// -@Component(selector: 'provider-2', template: '{{log}}', providers: +@Component( + selector: 'provider-2', + template: '{{log}}', + providers: //#docregion providers-2 -const [const Provider(Logger, useClass: Logger)] + const [const Provider(Logger, useClass: Logger)] //#enddocregion providers-2 ) class ProviderComponent2 { @@ -40,36 +39,32 @@ class ProviderComponent2 { ProviderComponent2(Logger logger) { logger.log('Hello from logger provided with Provider class and useClass'); - log = logger.logs[0]; + log = logger.logs.last; } } -////////////////////////////////////////// @Component( selector: 'provider-3', template: '{{log}}', - providers: const [const Provider(Logger, useClass: Logger)] -/* -//#docregion providers-3 - const [provide(Logger, useClass: Logger)] -//#enddocregion providers-3 -*/ -) + providers: const [const Provider(Logger, useClass: Logger)]) class ProviderComponent3 { String log; ProviderComponent3(Logger logger) { logger.log('Hello from logger provided with useClass'); - log = logger.logs[0]; + log = logger.logs.last; } } -////////////////////////////////////////// +@Injectable() class BetterLogger extends Logger {} -@Component(selector: 'provider-4', template: '{{log}}', providers: +@Component( + selector: 'provider-4', + template: '{{log}}', + providers: //#docregion providers-4 -const [const Provider(Logger, useClass: BetterLogger)] + const [const Provider(Logger, useClass: BetterLogger)] //#enddocregion providers-4 ) class ProviderComponent4 { @@ -77,31 +72,32 @@ class ProviderComponent4 { ProviderComponent4(Logger logger) { logger.log('Hello from logger provided with useClass:BetterLogger'); - log = logger.logs[0]; + log = logger.logs.last; } } -////////////////////////////////////////// // #docregion EvenBetterLogger @Injectable() class EvenBetterLogger implements Logger { - UserService _userService; - - List logs = []; + final UserService _userService; + @override List logs = []; EvenBetterLogger(this._userService); - log(String message) { - message = 'Message to ${ _userService.user.name}: ${ message}.'; - print(message); - logs.add(message); + @override void log(String message) { + var msg = 'Message to ${_userService.user.name}: $message.'; + print(msg); + logs.add(msg); } } // #enddocregion EvenBetterLogger -@Component(selector: 'provider-5', template: '{{log}}', providers: +@Component( + selector: 'provider-5', + template: '{{log}}', + providers: //#docregion providers-5 -const [UserService, const Provider(Logger, useClass: EvenBetterLogger)] + const [UserService, const Provider(Logger, useClass: EvenBetterLogger)] //#enddocregion providers-5 ) class ProviderComponent5 { @@ -109,29 +105,30 @@ class ProviderComponent5 { ProviderComponent5(Logger logger) { logger.log('Hello from EvenBetterlogger'); - log = logger.logs[0]; + log = logger.logs.last; } } -////////////////////////////////////////// +@Injectable() class NewLogger extends Logger implements OldLogger {} class OldLogger { List logs = []; - log(String message) { + void log(String message) { throw new Exception('Should not call the old logger!'); } } -@Component(selector: 'provider-6a', template: '{{log}}', providers: -//#docregion providers-6a -const [ - NewLogger, -// Not aliased! Creates two instances of `NewLogger` - const Provider(OldLogger, useClass: NewLogger) -] -//#enddocregion providers-6a +@Component( + selector: 'provider-6a', + template: '{{log}}', + providers: + //#docregion providers-6a + const [NewLogger, + // Not aliased! Creates two instances of `NewLogger` + const Provider(OldLogger, useClass: NewLogger)] + //#enddocregion providers-6a ) class ProviderComponent6a { String log; @@ -144,18 +141,22 @@ class ProviderComponent6a { // The newLogger wasn't called so no logs[] // display the logs of the oldLogger. - log = newLogger.logs == null || newLogger.logs.isEmpty ? oldLogger.logs[0] : newLogger.logs[0]; + log = newLogger.logs == null || newLogger.logs.isEmpty + ? oldLogger.logs[0] + : newLogger.logs[0]; } } -@Component(selector: 'provider-6b', template: '{{log}}', providers: -//#docregion providers-6b -const [ - NewLogger, -// Alias OldLogger w/ reference to NewLogger - const Provider(OldLogger, useExisting: NewLogger) -//#enddocregion providers-6b -]) +@Component( + selector: 'provider-6b', + template: '{{log}}', + providers: + //#docregion providers-6b + const [NewLogger, + // Alias OldLogger with reference to NewLogger + const Provider(OldLogger, useExisting: NewLogger)] + //#enddocregion providers-6b +) class ProviderComponent6b { String log; @@ -167,43 +168,46 @@ class ProviderComponent6b { log = newLogger.logs[0]; } } -////////////////////////////////////////// -// #docregion silent-logger +// #docregion opaque-token +const loggerPrefix = const OpaqueToken('Logger prefix'); +// #enddocregion opaque-token -// An object in the shape of the logger service -class SilentLogger /*implements Logger*/ { - const SilentLogger({this.logs}); +// #docregion configurable-logger +@Injectable() +class ConfigurableLogger extends Logger { + final String _prefix; - final List logs; +// #docregion use-opaque-token + ConfigurableLogger(@Inject(loggerPrefix) this._prefix); +// #enddocregion use-opaque-token - log(String message) {} + @override + void log(String msg) { + super.log('$_prefix: $msg'); + } } +// #enddocregion configurable-logger -const silentLogger = const SilentLogger( - logs: const ['Silent logger says "Shhhhh!". Provided via "useValue"']); -// #enddocregion silent-logger - -@Component(selector: 'provider-7', template: '{{log}}', providers: +@Component(selector: 'provider-7', template: '{{message}}', //#docregion providers-7 -const [const Provider(SilentLogger, useValue: silentLogger)] +providers: const [ + const Provider(Logger, useClass: ConfigurableLogger), +//#docregion providers-usevalue + const Provider(loggerPrefix, useValue: 'Testing') +//#enddocregion providers-usevalue +] //#enddocregion providers-7 -/* -//#docregion providers-7-unchecked -const [const Provider(Logger, useValue: silentLogger)] -//#enddocregion providers-7-unchecked - */ ) class ProviderComponent7 { - String log; + String message; - ProviderComponent7(SilentLogger logger) { - logger.log('Hello from logger provided with useValue'); - log = logger.logs[0]; + ProviderComponent7(Logger logger) { + logger.log('Hello from configurable logger.'); + message = logger.logs.last; } } -///////////////// @Component(selector: 'provider-8', template: '{{log}}', providers: const [ const Provider(HeroService, useFactory: heroServiceFactory), Logger, @@ -219,129 +223,103 @@ class ProviderComponent8 { var log = 'Hero service injected successfully'; } -///////////////// -@Component(selector: 'provider-9a', template: '{{log}}', providers: -/* - // #docregion providers-9a-interface - // WOKRKS! Can use abstract class as provider token - [provide(Config, {useValue: CONFIG})] - // #enddocregion providers-9a-interface - */ - -// #docregion providers-9a -// Use string as provider token -const [const Provider('app.config', useValue: CONFIG_HASH)] -//#enddocregion providers-9a +@Component( + selector: 'provider-9', + template: '{{log}}', + providers: +// #docregion providers-9 +const [const Provider(AppConfig, useValue: config1)] +// #enddocregion providers-9 ) -class ProviderComponent9a implements OnInit { - Config _config; - +class ProviderComponent9 implements OnInit { + AppConfig _config; String log; - /* - // #docregion provider-9a-ctor-interface - // WORKS! Can inject using the abstract class as the parameter type - Config _config; - - ProviderComponent9a(this._config); - // #enddocregion provider-9a-ctor-interface - */ - - // #docregion provider-9a-ctor + ProviderComponent9(AppConfig this._config); - // @Inject(token) to inject the dependency - ProviderComponent9a(@Inject('app.config') Map config) { - _config = new ConfigImpl(apiEndpoint: config['apiEndpoint'], title: config['title']); - } - - // #enddocregion provider-9a-ctor - ngOnInit() { - log = '\'app.config\' Application title is ' + _config.title; + @override + void ngOnInit() { + log = 'appConfigToken Application title is ${_config.title}'; } } -@Component(selector: 'provider-9b', template: '{{log}}', providers: -// #docregion providers-9b -const [const Provider(APP_CONFIG, useValue: CONFIG_HASH)]) // #enddocregion providers-9b -class ProviderComponent9b - implements OnInit { - Config _config; - - String log; - - // #docregion provider-9b-ctor - ProviderComponent9b(@Inject(APP_CONFIG) Map config) { - _config = new ConfigImpl(apiEndpoint: config['apiEndpoint'], title: config['title']); - } - - // #enddocregion provider-9b-ctor - ngOnInit() { - log = 'APP_CONFIG Application title is ' + _config.title; - } -} -////////////////////////////////////////// - // Normal required logger @Component(selector: 'provider-10a', template: '{{log}}', //#docregion providers-logger providers: const [Logger] //#enddocregion providers-logger -) + ) class ProviderComponent10a { String log; ProviderComponent10a(Logger logger) { logger.log('Hello from the required logger.'); - log = logger.logs[0]; + log = logger.logs.last; } } -// Optional logger +// Optional logger, can be null @Component(selector: 'provider-10b', template: '{{log}}') -class ProviderComponent10b implements OnInit { - Logger _logger; - +class ProviderComponent10b { // #docregion provider-10-ctor + final Logger _logger; String log; - ProviderComponent10b(@Optional() this._logger); - + ProviderComponent10b(@Optional() Logger this._logger) { + // . . . // #enddocregion provider-10-ctor - ngOnInit() { - // #docregion provider-10-logger + _logger == null ? log = 'No logger exists' : log = _logger.logs.last; + // #docregion provider-10-ctor + } + // #enddocregion provider-10-ctor +} - // No logger? Make one! - if (_logger == null) { - _logger = new Logger(); - // #enddocregion provider-10-logger - _logger.log('Optional logger was not available.'); - } else { - _logger.log('Hello from the injected logger.'); - log = _logger.logs[0]; - } - log = _logger.logs[0]; +// Optional logger, non null +@Component(selector: 'provider-10c', template: '{{log}}') +class ProviderComponent10c { + // #docregion provider-10-logger + final Logger _logger; + String log; + + ProviderComponent10c(@Optional() Logger logger) : + _logger = logger ?? new DoNothingLogger() { + // . . . + // #enddocregion provider-10-logger + logger == null + ? _logger.log('Optional logger was not available.') + : _logger.log('Hello from the injected logger.'); + log = _logger.logs.last; + // #docregion provider-10-logger } +// #enddocregion provider-10-logger +} + +// #docregion provider-10-logger +// . . . +@Injectable() +class DoNothingLogger extends Logger { + @override List logs = []; + @override void log(String msg) => logs.add(msg); } +// #enddocregion provider-10-logger -///////////////// @Component( selector: 'my-providers', template: ''' -

Provider variations

-
-
-
-
-
-
-
-
-
-
-
-
-
- ''', +

Provider variations

+
+
+
+
+
+
+
+
+
+
+
+
+
''', directives: const [ ProviderComponent1, ProviderComponent2, @@ -352,9 +330,9 @@ class ProviderComponent10b implements OnInit { ProviderComponent6b, ProviderComponent7, ProviderComponent8, - ProviderComponent9a, - ProviderComponent9b, + ProviderComponent9, ProviderComponent10a, - ProviderComponent10b + ProviderComponent10b, + ProviderComponent10c ]) class ProvidersComponent {} diff --git a/public/docs/_examples/dependency-injection/dart/lib/user_service.dart b/public/docs/_examples/dependency-injection/dart/lib/user_service.dart index 682a42b967..5b6cabf960 100644 --- a/public/docs/_examples/dependency-injection/dart/lib/user_service.dart +++ b/public/docs/_examples/dependency-injection/dart/lib/user_service.dart @@ -1,5 +1,4 @@ // #docregion - import 'package:angular2/core.dart'; @Injectable() diff --git a/public/docs/_examples/dependency-injection/dart/pubspec.yaml b/public/docs/_examples/dependency-injection/dart/pubspec.yaml index 6a42a54bd3..d4e3d9b0e8 100644 --- a/public/docs/_examples/dependency-injection/dart/pubspec.yaml +++ b/public/docs/_examples/dependency-injection/dart/pubspec.yaml @@ -5,9 +5,9 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 + dart_to_js_script_rewriter: ^1.0.1 transformers: - angular2: platform_directives: 'package:angular2/common.dart#COMMON_DIRECTIVES' diff --git a/public/docs/_examples/dependency-injection/dart/test/hero_list_component_test.dart b/public/docs/_examples/dependency-injection/dart/test/hero_list_component_test.dart index 0dd76b4f15..1c45babc68 100644 --- a/public/docs/_examples/dependency-injection/dart/test/hero_list_component_test.dart +++ b/public/docs/_examples/dependency-injection/dart/test/hero_list_component_test.dart @@ -1,6 +1,6 @@ // A simple test // More details will be in the testing chapter. -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'package:dependency_injection/heroes/hero.dart'; import 'package:dependency_injection/heroes/hero_list_component.dart'; import 'package:dependency_injection/heroes/hero_service.dart'; @@ -31,4 +31,4 @@ void main() { expect(hlc.heroes.length, expectedHeroes.length); }); } -//#enddocregion spec \ No newline at end of file +//#enddocregion spec diff --git a/public/docs/_examples/dependency-injection/dart/web/index.html b/public/docs/_examples/dependency-injection/dart/web/index.html index dd40fd6c61..cd3dfdb6cf 100644 --- a/public/docs/_examples/dependency-injection/dart/web/index.html +++ b/public/docs/_examples/dependency-injection/dart/web/index.html @@ -1,15 +1,15 @@ - + - - Dependency Injection - - - - - -Loading my-app ... -Loading my-providers ... - + + Dependency Injection + + + + + + Loading... + Loading my-providers ... + diff --git a/public/docs/_examples/dependency-injection/dart/web/main.dart b/public/docs/_examples/dependency-injection/dart/web/main.dart index 8e908cc892..abc5a9c88e 100644 --- a/public/docs/_examples/dependency-injection/dart/web/main.dart +++ b/public/docs/_examples/dependency-injection/dart/web/main.dart @@ -1,6 +1,6 @@ //#docregion - import 'package:angular2/platform/browser.dart'; + import 'package:dependency_injection/app_component.dart'; import 'package:dependency_injection/providers_component.dart'; @@ -9,4 +9,4 @@ main() { bootstrap(AppComponent); //#enddocregion bootstrap bootstrap(ProvidersComponent); -} \ No newline at end of file +} diff --git a/public/docs/_examples/dependency-injection/dart/web/main_1.dart b/public/docs/_examples/dependency-injection/dart/web/main_1.dart index ff9166ccf1..b621869c60 100644 --- a/public/docs/_examples/dependency-injection/dart/web/main_1.dart +++ b/public/docs/_examples/dependency-injection/dart/web/main_1.dart @@ -1,10 +1,10 @@ import 'package:angular2/platform/browser.dart'; import 'package:dependency_injection/app_component.dart'; import 'package:dependency_injection/heroes/hero_service.dart'; -//#docregion bootstrap main() { -// Injecting services in bootstrap works but is discouraged - bootstrap(AppComponent, [HeroService]); -//#enddocregion bootstrap -} \ No newline at end of file + //#docregion bootstrap + bootstrap(AppComponent, + [HeroService]); // DISCOURAGED (but works) + //#enddocregion bootstrap +} diff --git a/public/docs/_examples/dependency-injection/ts/app/injector.component.ts b/public/docs/_examples/dependency-injection/ts/app/injector.component.ts index 300eaee9d3..9914e7d029 100644 --- a/public/docs/_examples/dependency-injection/ts/app/injector.component.ts +++ b/public/docs/_examples/dependency-injection/ts/app/injector.component.ts @@ -12,7 +12,7 @@ import {Logger} from './logger.service'; selector: 'my-injectors', template: `

Other Injections

-
{{car.drive()}}
+
{{car.drive()}}
{{hero.name}}
{{rodent}}
`, diff --git a/public/docs/_examples/displaying-data/dart/lib/app_component.dart b/public/docs/_examples/displaying-data/dart/lib/app_component.dart index 5374ba81a8..a5c04369e7 100644 --- a/public/docs/_examples/displaying-data/dart/lib/app_component.dart +++ b/public/docs/_examples/displaying-data/dart/lib/app_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; diff --git a/public/docs/_examples/displaying-data/dart/lib/app_component_1.dart b/public/docs/_examples/displaying-data/dart/lib/app_component_1.dart index 1991a6645c..20f946fcc5 100644 --- a/public/docs/_examples/displaying-data/dart/lib/app_component_1.dart +++ b/public/docs/_examples/displaying-data/dart/lib/app_component_1.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; @Component( selector: 'my-app', diff --git a/public/docs/_examples/displaying-data/dart/lib/app_component_2.dart b/public/docs/_examples/displaying-data/dart/lib/app_component_2.dart index ff97982532..52162e38e3 100644 --- a/public/docs/_examples/displaying-data/dart/lib/app_component_2.dart +++ b/public/docs/_examples/displaying-data/dart/lib/app_component_2.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #docregion mock-heroes const List _heroes = const [ diff --git a/public/docs/_examples/displaying-data/dart/lib/app_component_3.dart b/public/docs/_examples/displaying-data/dart/lib/app_component_3.dart index 9a39808d18..69f424d797 100644 --- a/public/docs/_examples/displaying-data/dart/lib/app_component_3.dart +++ b/public/docs/_examples/displaying-data/dart/lib/app_component_3.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #docregion heroes import 'hero.dart'; diff --git a/public/docs/_examples/displaying-data/dart/pubspec.yaml b/public/docs/_examples/displaying-data/dart/pubspec.yaml index b221a9737d..2b84f672ac 100644 --- a/public/docs/_examples/displaying-data/dart/pubspec.yaml +++ b/public/docs/_examples/displaying-data/dart/pubspec.yaml @@ -5,9 +5,9 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 + dart_to_js_script_rewriter: ^1.0.1 transformers: - angular2: platform_directives: 'package:angular2/common.dart#CORE_DIRECTIVES' diff --git a/public/docs/_examples/displaying-data/dart/web/main.dart b/public/docs/_examples/displaying-data/dart/web/main.dart index 69650f0740..6a3620979c 100644 --- a/public/docs/_examples/displaying-data/dart/web/main.dart +++ b/public/docs/_examples/displaying-data/dart/web/main.dart @@ -1,7 +1,8 @@ // #docplaster // #docregion final -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/platform/browser.dart'; // #enddocregion final + //import 'package:displaying_data/app_component_1.dart' as v1; //import 'package:displaying_data/app_component_2.dart' as v2; //import 'package:displaying_data/app_component_3.dart' as v3; diff --git a/public/docs/_examples/forms/dart/lib/hero_form_component.dart b/public/docs/_examples/forms/dart/lib/hero_form_component.dart index 92f82cf0b1..e5d49a08c9 100644 --- a/public/docs/_examples/forms/dart/lib/hero_form_component.dart +++ b/public/docs/_examples/forms/dart/lib/hero_form_component.dart @@ -1,7 +1,7 @@ // #docplaster // #docregion // #docregion no-todo -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; diff --git a/public/docs/_examples/forms/dart/lib/hero_form_component_initial.dart b/public/docs/_examples/forms/dart/lib/hero_form_component_initial.dart index 3ba6afb443..53a2c20482 100644 --- a/public/docs/_examples/forms/dart/lib/hero_form_component_initial.dart +++ b/public/docs/_examples/forms/dart/lib/hero_form_component_initial.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; @Component(selector: 'hero-form', template: 'Hero form will go here') class HeroFormComponent {} diff --git a/public/docs/_examples/forms/dart/pubspec.yaml b/public/docs/_examples/forms/dart/pubspec.yaml index df6c6dc0c0..fc5c811770 100644 --- a/public/docs/_examples/forms/dart/pubspec.yaml +++ b/public/docs/_examples/forms/dart/pubspec.yaml @@ -5,9 +5,9 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 + dart_to_js_script_rewriter: ^1.0.1 transformers: - angular2: platform_directives: diff --git a/public/docs/_examples/forms/dart/web/main.dart b/public/docs/_examples/forms/dart/web/main.dart index 24a30874e3..7d21d9e9ba 100644 --- a/public/docs/_examples/forms/dart/web/main.dart +++ b/public/docs/_examples/forms/dart/web/main.dart @@ -1,5 +1,6 @@ // #docregion -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/platform/browser.dart'; + import 'package:hero_form/hero_form_component.dart'; main() { diff --git a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero.dart b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero.dart index 3a9ec96783..d62e5548da 100644 --- a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero.dart +++ b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; class Hero { String name; diff --git a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero_card_component.dart b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero_card_component.dart index bb4b2cfd1e..6fa8aeb6cd 100644 --- a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero_card_component.dart +++ b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero_card_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; diff --git a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero_editor_component.dart b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero_editor_component.dart index 3619d3ab0d..7ad3226755 100644 --- a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero_editor_component.dart +++ b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/hero_editor_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; import 'restore_service.dart'; diff --git a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/heroes_list_component.dart b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/heroes_list_component.dart index 90fbc8e2c4..c484b2091d 100644 --- a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/heroes_list_component.dart +++ b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/heroes_list_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'edit_item.dart'; import 'hero.dart'; diff --git a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/heroes_service.dart b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/heroes_service.dart index adc97586ac..c02eeb7539 100644 --- a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/heroes_service.dart +++ b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/heroes_service.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; diff --git a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/restore_service.dart b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/restore_service.dart index a6d8c59d35..8ddb820f05 100644 --- a/public/docs/_examples/hierarchical-dependency-injection/dart/lib/restore_service.dart +++ b/public/docs/_examples/hierarchical-dependency-injection/dart/lib/restore_service.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; @Injectable() class RestoreService { diff --git a/public/docs/_examples/hierarchical-dependency-injection/dart/pubspec.yaml b/public/docs/_examples/hierarchical-dependency-injection/dart/pubspec.yaml index 550b9c5b31..4f51a27692 100644 --- a/public/docs/_examples/hierarchical-dependency-injection/dart/pubspec.yaml +++ b/public/docs/_examples/hierarchical-dependency-injection/dart/pubspec.yaml @@ -5,9 +5,9 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 + dart_to_js_script_rewriter: ^1.0.1 transformers: - angular2: platform_directives: 'package:angular2/common.dart#COMMON_DIRECTIVES' diff --git a/public/docs/_examples/hierarchical-dependency-injection/dart/web/main.dart b/public/docs/_examples/hierarchical-dependency-injection/dart/web/main.dart index a265c21e69..4b181c2ab5 100644 --- a/public/docs/_examples/hierarchical-dependency-injection/dart/web/main.dart +++ b/public/docs/_examples/hierarchical-dependency-injection/dart/web/main.dart @@ -1,5 +1,6 @@ // #docregion -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/platform/browser.dart'; + import 'package:hierarchical_di/heroes_list_component.dart'; import 'package:hierarchical_di/heroes_service.dart'; diff --git a/public/docs/_examples/homepage-hello-world/ts/index.1.html b/public/docs/_examples/homepage-hello-world/ts/index.1.html index b76916e721..3b747789d7 100644 --- a/public/docs/_examples/homepage-hello-world/ts/index.1.html +++ b/public/docs/_examples/homepage-hello-world/ts/index.1.html @@ -9,14 +9,14 @@ - - + + - - - + + + - + Loading... - \ No newline at end of file + diff --git a/public/docs/_examples/homepage-tabs/ts/index.1.html b/public/docs/_examples/homepage-tabs/ts/index.1.html index a8d306a933..919120928d 100644 --- a/public/docs/_examples/homepage-tabs/ts/index.1.html +++ b/public/docs/_examples/homepage-tabs/ts/index.1.html @@ -10,14 +10,14 @@ - - - + + + - - - + + + - + Loading... - \ No newline at end of file + diff --git a/public/docs/_examples/homepage-todo/ts/app/todo_app.ts b/public/docs/_examples/homepage-todo/ts/app/todo_app.ts index 5688868b73..ca444d4ef6 100644 --- a/public/docs/_examples/homepage-todo/ts/app/todo_app.ts +++ b/public/docs/_examples/homepage-todo/ts/app/todo_app.ts @@ -1,8 +1,8 @@ // #docregion import {Component} from 'angular2/core'; -import {Todo} from './todo'; -import {TodoList} from './todo_list'; -import {TodoForm} from './todo_form'; +import {Todo} from './todo'; +import {TodoList} from './todo_list'; +import {TodoForm} from './todo_form'; @Component({ selector: 'todo-app', @@ -18,19 +18,19 @@ import {TodoForm} from './todo_form'; }) export class TodoApp { todos: Todo[] = [ - {text:'learn angular', done:true}, - {text:'build an angular app', done:false} + {text: 'learn angular', done: true}, + {text: 'build an angular app', done: false} ]; get remaining() { - return this.todos.reduce((count: number, todo: Todo) => count + +!todo.done, 0); + return this.todos.filter(todo => !todo.done).length; } archive(): void { - var oldTodos = this.todos; + let oldTodos = this.todos; this.todos = []; - oldTodos.forEach((todo: Todo) => { - if (!todo.done) this.todos.push(todo); + oldTodos.forEach(todo => { + if (!todo.done) { this.todos.push(todo); } }); } diff --git a/public/docs/_examples/homepage-todo/ts/index.1.html b/public/docs/_examples/homepage-todo/ts/index.1.html index 96ac20053a..03b39cc4f7 100644 --- a/public/docs/_examples/homepage-todo/ts/index.1.html +++ b/public/docs/_examples/homepage-todo/ts/index.1.html @@ -10,14 +10,14 @@ - - - + + + - - - + + + - - - - - Loading... - - diff --git a/public/docs/_examples/quickstart/dart/ex2/pubspec.yaml b/public/docs/_examples/quickstart/dart/pubspec.yaml similarity index 56% rename from public/docs/_examples/quickstart/dart/ex2/pubspec.yaml rename to public/docs/_examples/quickstart/dart/pubspec.yaml index 4211bf2489..f535b32158 100644 --- a/public/docs/_examples/quickstart/dart/ex2/pubspec.yaml +++ b/public/docs/_examples/quickstart/dart/pubspec.yaml @@ -1,14 +1,19 @@ +# #docplaster # #docregion +# #docregion no-rewriter name: angular2_getting_started description: QuickStart version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 +# #enddocregion no-rewriter + dart_to_js_script_rewriter: ^1.0.1 +# #docregion no-rewriter transformers: - angular2: entry_points: web/main.dart +# #enddocregion no-rewriter - dart_to_js_script_rewriter diff --git a/public/docs/_examples/quickstart/dart/ex1/web/index.html b/public/docs/_examples/quickstart/dart/web/index.html similarity index 100% rename from public/docs/_examples/quickstart/dart/ex1/web/index.html rename to public/docs/_examples/quickstart/dart/web/index.html diff --git a/public/docs/_examples/quickstart/dart/ex2/web/main.dart b/public/docs/_examples/quickstart/dart/web/main.dart similarity index 63% rename from public/docs/_examples/quickstart/dart/ex2/web/main.dart rename to public/docs/_examples/quickstart/dart/web/main.dart index e6836148a3..3d1f7a3015 100644 --- a/public/docs/_examples/quickstart/dart/ex2/web/main.dart +++ b/public/docs/_examples/quickstart/dart/web/main.dart @@ -1,6 +1,6 @@ // #docregion -import 'package:angular2/angular2.dart'; -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/core.dart'; +import 'package:angular2/platform/browser.dart'; @Component(selector: 'my-app', template: '

My First Angular 2 App

') class AppComponent {} diff --git a/public/docs/_examples/quickstart/js/package.1.json b/public/docs/_examples/quickstart/js/package.1.json index 95d0f6ddba..3c8fe530ea 100644 --- a/public/docs/_examples/quickstart/js/package.1.json +++ b/public/docs/_examples/quickstart/js/package.1.json @@ -7,7 +7,7 @@ }, "license": "ISC", "dependencies": { - "angular2": "2.0.0-beta.12", + "angular2": "2.0.0-beta.14", "es6-shim": "^0.35.0", "reflect-metadata": "0.1.2", "rxjs": "5.0.0-beta.2", @@ -15,6 +15,6 @@ }, "devDependencies": { "concurrently": "^2.0.0", - "lite-server": "^2.1.0" + "lite-server": "^2.2.0" } } diff --git a/public/docs/_examples/quickstart/ts/package.1.json b/public/docs/_examples/quickstart/ts/package.1.json index a11d8ca25f..597a80710d 100644 --- a/public/docs/_examples/quickstart/ts/package.1.json +++ b/public/docs/_examples/quickstart/ts/package.1.json @@ -2,17 +2,17 @@ "name": "angular2-quickstart", "version": "1.0.0", "scripts": { - "start": "concurrently \"npm run tsc:w\" \"npm run lite\" ", + "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ", "tsc": "tsc", "tsc:w": "tsc -w", "lite": "lite-server", "typings": "typings", - "postinstall": "typings install" + "postinstall": "typings install" }, "license": "ISC", "dependencies": { - "angular2": "2.0.0-beta.12", - "systemjs": "0.19.24", + "angular2": "2.0.0-beta.14", + "systemjs": "0.19.25", "es6-shim": "^0.35.0", "reflect-metadata": "0.1.2", "rxjs": "5.0.0-beta.2", @@ -20,8 +20,8 @@ }, "devDependencies": { "concurrently": "^2.0.0", - "lite-server": "^2.1.0", + "lite-server": "^2.2.0", "typescript": "^1.8.9", - "typings":"^0.7.9" + "typings":"^0.7.12" } } diff --git a/public/docs/_examples/server-communication/dart/lib/toh/hero_list_component.dart b/public/docs/_examples/server-communication/dart/lib/toh/hero_list_component.dart index f51a98d35b..89b8714a39 100644 --- a/public/docs/_examples/server-communication/dart/lib/toh/hero_list_component.dart +++ b/public/docs/_examples/server-communication/dart/lib/toh/hero_list_component.dart @@ -1,6 +1,8 @@ // #docregion import 'dart:async'; -import 'package:angular2/angular2.dart'; + +import 'package:angular2/core.dart'; + import 'hero.dart'; import 'hero_service.dart'; diff --git a/public/docs/_examples/server-communication/dart/lib/toh/hero_service.dart b/public/docs/_examples/server-communication/dart/lib/toh/hero_service.dart index f81d45be38..a009d03b7a 100644 --- a/public/docs/_examples/server-communication/dart/lib/toh/hero_service.dart +++ b/public/docs/_examples/server-communication/dart/lib/toh/hero_service.dart @@ -4,7 +4,7 @@ import 'dart:async'; import 'dart:convert'; -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #enddocregion v1 // #docregion import-request-options import 'package:http/browser_client.dart'; diff --git a/public/docs/_examples/server-communication/dart/lib/toh/toh_component.dart b/public/docs/_examples/server-communication/dart/lib/toh/toh_component.dart index 3b2a6b27b4..80aff10bdf 100644 --- a/public/docs/_examples/server-communication/dart/lib/toh/toh_component.dart +++ b/public/docs/_examples/server-communication/dart/lib/toh/toh_component.dart @@ -1,4 +1,4 @@ -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'package:http_in_memory_web_api/http_in_memory_web_api.dart'; import 'package:http/browser_client.dart'; import 'package:server_communication/hero_data.dart'; diff --git a/public/docs/_examples/server-communication/dart/lib/wiki/wiki_component.dart b/public/docs/_examples/server-communication/dart/lib/wiki/wiki_component.dart index 78d44f93bc..dce151e834 100644 --- a/public/docs/_examples/server-communication/dart/lib/wiki/wiki_component.dart +++ b/public/docs/_examples/server-communication/dart/lib/wiki/wiki_component.dart @@ -1,6 +1,8 @@ // #docregion import 'dart:async'; -import 'package:angular2/angular2.dart'; + +import 'package:angular2/core.dart'; + import 'wikipedia_service.dart'; @Component( diff --git a/public/docs/_examples/server-communication/dart/lib/wiki/wiki_smart_component.dart b/public/docs/_examples/server-communication/dart/lib/wiki/wiki_smart_component.dart index 3be519471b..6f8934b2f3 100644 --- a/public/docs/_examples/server-communication/dart/lib/wiki/wiki_smart_component.dart +++ b/public/docs/_examples/server-communication/dart/lib/wiki/wiki_smart_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'package:stream_transformers/stream_transformers.dart'; import 'wikipedia_service.dart'; diff --git a/public/docs/_examples/server-communication/dart/lib/wiki/wikipedia_service.dart b/public/docs/_examples/server-communication/dart/lib/wiki/wikipedia_service.dart index d4314c3f08..6942f7fa93 100644 --- a/public/docs/_examples/server-communication/dart/lib/wiki/wikipedia_service.dart +++ b/public/docs/_examples/server-communication/dart/lib/wiki/wikipedia_service.dart @@ -1,6 +1,7 @@ // #docregion import 'dart:async'; -import 'package:angular2/angular2.dart'; + +import 'package:angular2/core.dart'; import 'package:jsonpadding/jsonpadding.dart'; @Injectable() diff --git a/public/docs/_examples/server-communication/dart/pubspec.yaml b/public/docs/_examples/server-communication/dart/pubspec.yaml index 3b5c1fce16..fb8bd7e25f 100644 --- a/public/docs/_examples/server-communication/dart/pubspec.yaml +++ b/public/docs/_examples/server-communication/dart/pubspec.yaml @@ -5,9 +5,9 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 + dart_to_js_script_rewriter: ^1.0.1 http: ^0.11.3+3 jsonpadding: ^0.1.0 stream_transformers: ^0.3.0+3 diff --git a/public/docs/_examples/server-communication/dart/web/main.dart b/public/docs/_examples/server-communication/dart/web/main.dart index d0892cf49b..1b7933a87d 100644 --- a/public/docs/_examples/server-communication/dart/web/main.dart +++ b/public/docs/_examples/server-communication/dart/web/main.dart @@ -1,5 +1,6 @@ // #docregion -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/platform/browser.dart'; + import 'package:server_communication/toh/toh_component.dart'; import 'package:server_communication/wiki/wiki_component.dart'; import 'package:server_communication/wiki/wiki_smart_component.dart'; diff --git a/public/docs/_examples/structural-directives/dart/lib/heavy_loader_component.dart b/public/docs/_examples/structural-directives/dart/lib/heavy_loader_component.dart index 647542accc..a2efd3b2f1 100644 --- a/public/docs/_examples/structural-directives/dart/lib/heavy_loader_component.dart +++ b/public/docs/_examples/structural-directives/dart/lib/heavy_loader_component.dart @@ -1,7 +1,7 @@ // #docregion import 'dart:async'; -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; int nextId = 1; diff --git a/public/docs/_examples/structural-directives/dart/lib/structural_directives_component.dart b/public/docs/_examples/structural-directives/dart/lib/structural_directives_component.dart index 477b372bb0..901c8b18b1 100644 --- a/public/docs/_examples/structural-directives/dart/lib/structural_directives_component.dart +++ b/public/docs/_examples/structural-directives/dart/lib/structural_directives_component.dart @@ -1,6 +1,6 @@ // #docplaster // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'heavy_loader_component.dart'; import 'unless_directive.dart'; diff --git a/public/docs/_examples/structural-directives/dart/lib/unless_directive.dart b/public/docs/_examples/structural-directives/dart/lib/unless_directive.dart index 7760658b48..907e0edd15 100644 --- a/public/docs/_examples/structural-directives/dart/lib/unless_directive.dart +++ b/public/docs/_examples/structural-directives/dart/lib/unless_directive.dart @@ -1,7 +1,7 @@ // #docplaster // #docregion // #docregion unless-declaration -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #enddocregion unless-declaration // #docregion unless-declaration diff --git a/public/docs/_examples/structural-directives/dart/pubspec.yaml b/public/docs/_examples/structural-directives/dart/pubspec.yaml index 4969b0068e..c131a1eb7f 100644 --- a/public/docs/_examples/structural-directives/dart/pubspec.yaml +++ b/public/docs/_examples/structural-directives/dart/pubspec.yaml @@ -5,9 +5,9 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 + dart_to_js_script_rewriter: ^1.0.1 transformers: - angular2: platform_directives: 'package:angular2/common.dart#CORE_DIRECTIVES' diff --git a/public/docs/_examples/structural-directives/dart/web/main.dart b/public/docs/_examples/structural-directives/dart/web/main.dart index 2c00f66c65..f26456b187 100644 --- a/public/docs/_examples/structural-directives/dart/web/main.dart +++ b/public/docs/_examples/structural-directives/dart/web/main.dart @@ -1,5 +1,6 @@ // #docregion -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/platform/browser.dart'; + import 'package:structural_directives/structural_directives_component.dart'; main() { diff --git a/public/docs/_examples/template-syntax/dart/.docsync.json b/public/docs/_examples/template-syntax/dart/.docsync.json new file mode 100644 index 0000000000..0caee30723 --- /dev/null +++ b/public/docs/_examples/template-syntax/dart/.docsync.json @@ -0,0 +1,4 @@ +{ + "name": "Template Syntax", + "docHref": "https://angular.io/docs/ts/latest/guide/template-syntax.html" +} diff --git a/public/docs/_examples/template-syntax/dart/lib/app_component.dart b/public/docs/_examples/template-syntax/dart/lib/app_component.dart index 0963e28b58..be36d6c38d 100644 --- a/public/docs/_examples/template-syntax/dart/lib/app_component.dart +++ b/public/docs/_examples/template-syntax/dart/lib/app_component.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'dart:html'; -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; import 'hero_detail_component.dart'; diff --git a/public/docs/_examples/template-syntax/dart/lib/hero_detail_component.dart b/public/docs/_examples/template-syntax/dart/lib/hero_detail_component.dart index 80130e0b18..5fd0b1e3cf 100644 --- a/public/docs/_examples/template-syntax/dart/lib/hero_detail_component.dart +++ b/public/docs/_examples/template-syntax/dart/lib/hero_detail_component.dart @@ -1,6 +1,6 @@ // #docplaster // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; diff --git a/public/docs/_examples/template-syntax/dart/lib/my_click_directive.dart b/public/docs/_examples/template-syntax/dart/lib/my_click_directive.dart index 74299c19c1..0980478f29 100644 --- a/public/docs/_examples/template-syntax/dart/lib/my_click_directive.dart +++ b/public/docs/_examples/template-syntax/dart/lib/my_click_directive.dart @@ -1,7 +1,7 @@ // #docplaster import 'dart:html'; -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; @Directive(selector: '[myClick]') class MyClickDirective { diff --git a/public/docs/_examples/template-syntax/dart/pubspec.yaml b/public/docs/_examples/template-syntax/dart/pubspec.yaml index 2dbd8ae0e4..83a66eb90e 100644 --- a/public/docs/_examples/template-syntax/dart/pubspec.yaml +++ b/public/docs/_examples/template-syntax/dart/pubspec.yaml @@ -5,9 +5,9 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 + dart_to_js_script_rewriter: ^1.0.1 transformers: - angular2: platform_pipes: 'package:angular2/common.dart#COMMON_PIPES' @@ -16,5 +16,3 @@ transformers: - 'package:angular2/common.dart#FORM_DIRECTIVES' entry_points: web/main.dart - dart_to_js_script_rewriter -- $dart2js: - checked: true diff --git a/public/docs/_examples/template-syntax/dart/web/main.dart b/public/docs/_examples/template-syntax/dart/web/main.dart index f1659d0821..1a5f965ec1 100644 --- a/public/docs/_examples/template-syntax/dart/web/main.dart +++ b/public/docs/_examples/template-syntax/dart/web/main.dart @@ -1,5 +1,6 @@ // #docregion -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/platform/browser.dart'; + import 'package:template_syntax/app_component.dart'; void main() { diff --git a/public/docs/_examples/testing/ts/app/app.component.css b/public/docs/_examples/testing/ts/app/app.component.css new file mode 100644 index 0000000000..137e9be7be --- /dev/null +++ b/public/docs/_examples/testing/ts/app/app.component.css @@ -0,0 +1,31 @@ +/* #docplaster */ +/* #docregion css */ +h1 { + font-size: 1.2em; + color: #999; + margin-bottom: 0; +} +h2 { + font-size: 2em; + margin-top: 0; + padding-top: 0; +} +nav a { + padding: 5px 10px; + text-decoration: none; + margin-top: 10px; + display: inline-block; + background-color: #eee; + border-radius: 4px; +} +nav a:visited, a:link { + color: #607D8B; +} +nav a:hover { + color: #039be5; + background-color: #CFD8DC; +} +nav a.router-link-active { + color: #039be5; +} +/* #enddocregion css */ diff --git a/public/docs/_examples/testing/ts/app/app.component.ts b/public/docs/_examples/testing/ts/app/app.component.ts new file mode 100644 index 0000000000..df9985b5ee --- /dev/null +++ b/public/docs/_examples/testing/ts/app/app.component.ts @@ -0,0 +1,59 @@ +// #docplaster +// #docregion +import { Component } from 'angular2/core'; +import { RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from 'angular2/router'; + +import { HeroService } from './hero.service'; +import { DashboardComponent } from './dashboard.component'; +import { HeroesComponent } from './heroes.component'; +// #docregion hero-detail-import +import { HeroDetailComponent } from './hero-detail.component'; +// #enddocregion hero-detail-import + +@Component({ + selector: 'my-app', +// #docregion template + template: ` +

{{title}}

+ + + `, +// #enddocregion template +// #docregion style-urls + styleUrls: ['app/app.component.css'], +// #enddocregion style-urls + directives: [ROUTER_DIRECTIVES], + providers: [ + ROUTER_PROVIDERS, + HeroService + ] +}) +@RouteConfig([ +// #docregion dashboard-route + { + path: '/dashboard', + name: 'Dashboard', + component: DashboardComponent, + useAsDefault: true + }, +// #enddocregion dashboard-route +// #docregion hero-detail-route + { + path: '/detail/:id', + name: 'HeroDetail', + component: HeroDetailComponent + }, +// #enddocregion hero-detail-route + { + path: '/heroes', + name: 'Heroes', + component: HeroesComponent + } +]) +export class AppComponent { + title = 'Tour of Heroes'; +} +// #enddocregion diff --git a/public/docs/_examples/testing/ts/app/backend.service.ts b/public/docs/_examples/testing/ts/app/backend.service.ts deleted file mode 100644 index 9135af7f5e..0000000000 --- a/public/docs/_examples/testing/ts/app/backend.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {Hero} from './hero'; -import {HEROES} from './mock-heroes'; - -let delay = 1000; // ms delay in return of data - -export class BackendService { - - fetchAllHeroesAsync(): Promise { - return new Promise((resolve, reject) => { - // simulate latency by resolving promise after a delay - setTimeout(() => resolve(HEROES.map(h => h.clone())), delay) - }) - } -} diff --git a/public/docs/_examples/testing/ts/app/bootstrap.ts b/public/docs/_examples/testing/ts/app/bootstrap.ts deleted file mode 100644 index f9e6e3e729..0000000000 --- a/public/docs/_examples/testing/ts/app/bootstrap.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {bootstrap} from 'angular2/platform/browser'; - -// Application root component -import {HeroesComponent} from './heroes.component'; - -// Application-wide "injectables"" -import {BackendService} from './backend.service'; -import {HeroService} from './hero.service'; -import {User} from './user'; - -bootstrap(HeroesComponent, [BackendService, HeroService, User]); diff --git a/public/docs/_examples/testing/ts/app/dashboard.component.css b/public/docs/_examples/testing/ts/app/dashboard.component.css new file mode 100644 index 0000000000..ce6e963a5f --- /dev/null +++ b/public/docs/_examples/testing/ts/app/dashboard.component.css @@ -0,0 +1,63 @@ +/* #docplaster */ +/* #docregion */ +[class*='col-'] { + float: left; +} +*, *:after, *:before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +h3 { + text-align: center; margin-bottom: 0; +} +[class*='col-'] { + padding-right: 20px; + padding-bottom: 20px; +} +[class*='col-']:last-of-type { + padding-right: 0; +} +.grid { + margin: 0; +} +.col-1-4 { + width: 25%; +} +.module { + padding: 20px; + text-align: center; + color: #eee; + max-height: 120px; + min-width: 120px; + background-color: #607D8B; + border-radius: 2px; +} +h4 { + position: relative; +} +.module:hover { + background-color: #EEE; + cursor: pointer; + color: #607d8b; +} +.grid-pad { + padding: 10px 0; +} +.grid-pad > [class*='col-']:last-of-type { + padding-right: 20px; +} +@media (max-width: 600px) { + .module { + font-size: 10px; + max-height: 75px; } +} +@media (max-width: 1024px) { + .grid { + margin: 0; + } + .module { + min-width: 60px; + } +} +/* #enddocregion */ diff --git a/public/docs/_examples/testing/ts/app/dashboard.component.html b/public/docs/_examples/testing/ts/app/dashboard.component.html new file mode 100644 index 0000000000..a5bafd7702 --- /dev/null +++ b/public/docs/_examples/testing/ts/app/dashboard.component.html @@ -0,0 +1,11 @@ + +

Top Heroes

+
+ +
+ +
+

{{hero.name}}

+
+
+
diff --git a/public/docs/_examples/testing/ts/app/dashboard.component.ts b/public/docs/_examples/testing/ts/app/dashboard.component.ts new file mode 100644 index 0000000000..c4c516a864 --- /dev/null +++ b/public/docs/_examples/testing/ts/app/dashboard.component.ts @@ -0,0 +1,44 @@ +// #docplaster +// #docregion +import { Component, OnInit } from 'angular2/core'; +// #docregion import-router +import { Router } from 'angular2/router'; +// #enddocregion import-router + +import { Hero } from './hero'; +import { HeroService } from './hero.service'; + +@Component({ + selector: 'my-dashboard', + // #docregion template-url + templateUrl: 'app/dashboard.component.html', + // #enddocregion template-url + // #docregion css + styleUrls: ['app/dashboard.component.css'] + // #enddocregion css +}) +// #docregion component +export class DashboardComponent implements OnInit { + + heroes: Hero[] = []; + +// #docregion ctor + constructor( + private _router: Router, + private _heroService: HeroService) { + } +// #enddocregion ctor + + ngOnInit() { + this._heroService.getHeroes() + .then(heroes => this.heroes = heroes.slice(1,5)); + } + + // #docregion goto-detail + gotoDetail(hero: Hero) { + let link = ['HeroDetail', { id: hero.id }]; + this._router.navigate(link); + } + // #enddocregion goto-detail +} +// #enddocregion \ No newline at end of file diff --git a/public/docs/_examples/testing/ts/app/decorators.ts b/public/docs/_examples/testing/ts/app/decorators.ts deleted file mode 100644 index 09f6cd0b15..0000000000 --- a/public/docs/_examples/testing/ts/app/decorators.ts +++ /dev/null @@ -1,16 +0,0 @@ -// @Injectable is a placeholder decorator -// whose sole purpose is to trigger the TS compiler to -// generate the metadata that Angular DI needs for injection. -// -// Metadata generation happens IFF the class has a decorator ... any decorator -// See the `"emitDecoratorMetadata": true` flag in tsconfig.json -// -// For Angular-agnostic classes we can avoid importing from Angular -// and get the metadata generation side-effect -// by creating our own @Injectable decorator - -// for the hip Functional Programmer: -export const Injectable = () => (cls:any) => cls; - -// for everyone else, this is the same thing -//export function Injectable() { return (cls:any) => cls; } \ No newline at end of file diff --git a/public/docs/_examples/testing/ts/app/hero-detail.component.css b/public/docs/_examples/testing/ts/app/hero-detail.component.css index 53d6789226..ab2437efd8 100644 --- a/public/docs/_examples/testing/ts/app/hero-detail.component.css +++ b/public/docs/_examples/testing/ts/app/hero-detail.component.css @@ -1,3 +1,30 @@ -.hero-detail div {padding:0.2em;} -.hero-detail div input {position: absolute; left:9em; } -.hero-id {position: absolute; left:7.5em; } \ No newline at end of file +/* #docregion */ +label { + display: inline-block; + width: 3em; + margin: .5em 0; + color: #607D8B; + font-weight: bold; +} +input { + height: 2em; + font-size: 1em; + padding-left: .4em; +} +button { + margin-top: 20px; + font-family: Arial; + background-color: #eee; + border: none; + padding: 5px 10px; + border-radius: 4px; + cursor: pointer; cursor: hand; +} +button:hover { + background-color: #cfd8dc; +} +button:disabled { + background-color: #eee; + color: #ccc; + cursor: auto; +} diff --git a/public/docs/_examples/testing/ts/app/hero-detail.component.html b/public/docs/_examples/testing/ts/app/hero-detail.component.html index 0de3139b52..cf96fc2169 100644 --- a/public/docs/_examples/testing/ts/app/hero-detail.component.html +++ b/public/docs/_examples/testing/ts/app/hero-detail.component.html @@ -1,24 +1,14 @@ + -
- -

{{hero.name | initCaps}} is {{userName}}'s current super hero!

- -
- - -
-
- {{hero.id}}
-
- - -
-
- - -
-
- - -
-
+
+

{{hero.name}} details!

+
+ {{hero.id}}
+
+ + +
+ + + +
\ No newline at end of file diff --git a/public/docs/_examples/testing/ts/app/hero-detail.component.ts b/public/docs/_examples/testing/ts/app/hero-detail.component.ts index 620eba9a29..1c06a4ee46 100644 --- a/public/docs/_examples/testing/ts/app/hero-detail.component.ts +++ b/public/docs/_examples/testing/ts/app/hero-detail.component.ts @@ -1,35 +1,57 @@ -import {Component, Directive, EventEmitter , ElementRef} from 'angular2/core'; +// #docplaster +// #docregion +// #docregion v2 +// #docregion import-oninit +import { Component, OnInit } from 'angular2/core'; +// #enddocregion import-oninit +// #docregion import-route-params +import {RouteParams} from 'angular2/router'; +// #enddocregion import-route-params -import {Hero} from './hero'; -import {InitCapsPipe} from './init-caps-pipe'; +import { Hero } from './hero'; +// #docregion import-hero-service +import { HeroService } from './hero.service'; +// #enddocregion import-hero-service -@Directive({selector: 'button'}) -class DecoratorDirective { - constructor(el: ElementRef){ - console.log(el) - } -} +// #docregion extract-template @Component({ selector: 'my-hero-detail', + // #docregion template-url templateUrl: 'app/hero-detail.component.html', - inputs: ['hero', 'userName'], // inputs - outputs: ['delete'], // outputs - directives: [DecoratorDirective], + // #enddocregion template-url +// #enddocregion v2 styleUrls: ['app/hero-detail.component.css'], - pipes: [InitCapsPipe] + inputs: ['hero'] +// #docregion v2 }) -export class HeroDetailComponent { - +// #enddocregion extract-template +// #docregion implement +export class HeroDetailComponent implements OnInit { +// #enddocregion implement hero: Hero; - delete = new EventEmitter(); +// #docregion ctor + constructor( + private _heroService: HeroService, + private _routeParams: RouteParams) { + } +// #enddocregion ctor - onDelete() { this.delete.next(this.hero) } +// #docregion ng-oninit + ngOnInit() { + // #docregion get-id + let id = +this._routeParams.get('id'); + // #enddocregion get-id + this._heroService.getHero(id) + .then(hero => this.hero = hero); + } +// #enddocregion ng-oninit - onUpdate() { - if (this.hero) { - this.hero.name += 'x'; - } +// #docregion go-back + goBack() { + window.history.back(); } - userName: string; +// #enddocregion go-back } +// #enddocregion v2 +// #enddocregion diff --git a/public/docs/_examples/testing/ts/app/hero.service.ts b/public/docs/_examples/testing/ts/app/hero.service.ts index 9483e225e7..fb7d0829cb 100644 --- a/public/docs/_examples/testing/ts/app/hero.service.ts +++ b/public/docs/_examples/testing/ts/app/hero.service.ts @@ -1,33 +1,28 @@ -//import {Injectable} from 'angular2/angular2'; // Don't get it from Angular -import {Injectable} from './decorators'; // Use the app's version -import {Hero} from './hero'; -import {BackendService} from './backend.service'; +// #docplaster +// #docregion +import { Hero } from './hero'; +import { HEROES } from './mock-heroes'; +import { Injectable } from 'angular2/core'; @Injectable() export class HeroService { + getHeroes() { + return Promise.resolve(HEROES); + } - heroes: Hero[] = []; // cache of heroes + // See the "Take it slow" appendix + getHeroesSlowly() { + return new Promise(resolve => + setTimeout(()=>resolve(HEROES), 2000) // 2 seconds + ); + } - constructor(protected _backend: BackendService) { } - - refresh() : Promise { // refresh heroes w/ latest from the server - this.heroes.length = 0; - return > this._backend.fetchAllHeroesAsync() - .then(heroes => { - this.heroes.push(...heroes); - return this.heroes; - }) - .catch(e => this._fetchFailed(e)); - } - - protected _fetchFailed(error:any) { - console.error(error); - return Promise.reject(error); - } -} - -// FOR DOCUMENTATION ONLY. NOT USED -interface IHeroService { - heroes : Hero[]; - refresh() : Promise; + //#docregion get-hero + getHero(id: number) { + return Promise.resolve(HEROES).then( + heroes => heroes.filter(hero => hero.id === id)[0] + ); + } + //#enddocregion get-hero } +// #enddocregion \ No newline at end of file diff --git a/public/docs/_examples/testing/ts/app/hero.spec.ts b/public/docs/_examples/testing/ts/app/hero.spec.ts index 103915a9d5..78a73ad6b0 100644 --- a/public/docs/_examples/testing/ts/app/hero.spec.ts +++ b/public/docs/_examples/testing/ts/app/hero.spec.ts @@ -1,17 +1,17 @@ // #docregion // #docplaster // #docregion base-hero-spec -import {Hero} from './hero'; +import { Hero } from './hero'; describe('Hero', () => { - it('has name given in the constructor', () => { - let hero = new Hero(1, 'Super Cat'); + it('has name', () => { + let hero: Hero = {id: 1, name: 'Super Cat'}; expect(hero.name).toEqual('Super Cat'); }); - it('has id given in the constructor', () => { - let hero = new Hero(1, 'Super Cat'); + it('has id', () => { + let hero: Hero = {id: 1, name: 'Super Cat'}; expect(hero.id).toEqual(1); }); // #enddocregion base-hero-spec diff --git a/public/docs/_examples/testing/ts/app/hero.ts b/public/docs/_examples/testing/ts/app/hero.ts index a2ff8002e7..2b89781da5 100644 --- a/public/docs/_examples/testing/ts/app/hero.ts +++ b/public/docs/_examples/testing/ts/app/hero.ts @@ -1,19 +1,5 @@ // #docregion -let nextId = 30; - -export class Hero { - constructor( - public id?: number, - public name?: string, - public power?: string, - public alterEgo?: string - ) { - this.id = id || nextId++; - } - - clone() { return Hero.clone(this); } - - static clone = (h:any) => new Hero(h.id, h.name, h.alterEgo, h.power); - - static setNextId(next:number) { nextId = next; } +export interface Hero { + id: number; + name: string; } diff --git a/public/docs/_examples/testing/ts/app/hero2.ts b/public/docs/_examples/testing/ts/app/hero2.ts deleted file mode 100644 index 840564c4c9..0000000000 --- a/public/docs/_examples/testing/ts/app/hero2.ts +++ /dev/null @@ -1,19 +0,0 @@ -// #docregion -let nextId = 30; - -class Hero { - constructor( - public id?: number, - public name?: string, - public power?: string, - public alterEgo?: string - ) { - this.id = id || nextId++; - } - - clone() { return Hero.clone(this); } - - static clone = (h:any) => new Hero(h.id, h.name, h.alterEgo, h.power); - - static setNextId(next:number) { nextId = next; } -} diff --git a/public/docs/_examples/testing/ts/app/heroes.component.css b/public/docs/_examples/testing/ts/app/heroes.component.css index 38474e6763..d939ab565d 100644 --- a/public/docs/_examples/testing/ts/app/heroes.component.css +++ b/public/docs/_examples/testing/ts/app/heroes.component.css @@ -1,18 +1,59 @@ -.heroes {list-style-type: none; margin-left: 1em; padding: 0; width: 10em;} - -.heroes li { cursor: pointer; position: relative; left: 0; transition: all 0.2s ease; } - -.heroes li:hover {color: #369; background-color: #EEE; left: .2em;} - +.selected { + background-color: #CFD8DC !important; + color: white; +} +.heroes { + margin: 0 0 2em 0; + list-style-type: none; + padding: 0; + width: 10em; +} +.heroes li { + cursor: pointer; + position: relative; + left: 0; + background-color: #EEE; + margin: .5em; + padding: .3em 0; + height: 1.6em; + border-radius: 4px; +} +.heroes li:hover { + color: #607D8B; + background-color: #DDD; + left: .1em; +} +.heroes li.selected:hover { + background-color: #BBD8DC !important; + color: white; +} +.heroes .text { + position: relative; + top: -3px; +} .heroes .badge { - font-size: small; - color: white; - padding: 0.1em 0.7em; - background-color: #369; - line-height: 1em; - position: relative; - left: -1px; - top: -1px; -} -.selected { background-color: lightblue; color: #369; } -.message {padding: 0.4em 0; font-size: 20px; color: #888} \ No newline at end of file + display: inline-block; + font-size: small; + color: white; + padding: 0.8em 0.7em 0 0.7em; + background-color: #607D8B; + line-height: 1em; + position: relative; + left: -1px; + top: -4px; + height: 1.8em; + margin-right: .8em; + border-radius: 4px 0 0 4px; +} +button { + font-family: Arial; + background-color: #eee; + border: none; + padding: 5px 10px; + border-radius: 4px; + cursor: pointer; + cursor: hand; +} +button:hover { + background-color: #cfd8dc; +} diff --git a/public/docs/_examples/testing/ts/app/heroes.component.html b/public/docs/_examples/testing/ts/app/heroes.component.html index 169dc96b51..9bcd2ba4e8 100644 --- a/public/docs/_examples/testing/ts/app/heroes.component.html +++ b/public/docs/_examples/testing/ts/app/heroes.component.html @@ -1,17 +1,21 @@ -
-

{{userName}}'s Super Heroes

- -
Loading heroes...
-
Pick a hero
    -
  • - {{hero.id}} {{hero.name}} -
  • -
-
-
- - -
+ + +

My Heroes

+
    +
  • + {{hero.id}} {{hero.name}} +
  • +
+ +
+

+ + {{selectedHero.name | uppercase}} is my hero + +

+
+ + diff --git a/public/docs/_examples/testing/ts/app/heroes.component.ts b/public/docs/_examples/testing/ts/app/heroes.component.ts index 9043cbf9a1..6cdb00bc83 100644 --- a/public/docs/_examples/testing/ts/app/heroes.component.ts +++ b/public/docs/_examples/testing/ts/app/heroes.component.ts @@ -1,53 +1,50 @@ -import {Component, OnInit} from 'angular2/core'; -import {HeroDetailComponent} from './hero-detail.component'; -import {HeroService} from './hero.service'; -import {Hero} from './hero'; -import {User} from './user'; +// #docplaster +// #docregion +import { Component, OnInit } from 'angular2/core'; +import { Router } from 'angular2/router'; +import { Hero } from './hero'; +import { HeroDetailComponent } from './hero-detail.component'; +import { HeroService } from './hero.service'; + +// #docregion metadata +// #docregion heroes-component-renaming @Component({ selector: 'my-heroes', +// #enddocregion heroes-component-renaming templateUrl: 'app/heroes.component.html', - directives: [HeroDetailComponent], - styleUrls: ['app/heroes.component.css'] + styleUrls: ['app/heroes.component.css'], + directives: [HeroDetailComponent] +// #docregion heroes-component-renaming }) +// #enddocregion heroes-component-renaming +// #enddocregion metadata +// #docregion class +// #docregion heroes-component-renaming export class HeroesComponent implements OnInit { - heroes: Hero[] = []; - currentHero: Hero; - userName: string; - - constructor(private _heroService: HeroService, private _user: User) { - this.userName = this._user.name || 'someone'; - } +// #enddocregion heroes-component-renaming + heroes: Hero[]; + selectedHero: Hero; - getSelectedClass(hero: Hero) {return { selected: hero === this.currentHero }}; + constructor( + private _router: Router, + private _heroService: HeroService) { } - onDelete(hero?: Hero) { - hero = hero || this.currentHero; - let i = this.heroes.indexOf(hero); - if (i > -1) { - this.heroes.splice(i, 1); - } - this.currentHero = this.heroes[i] || this.heroes[i - 1]; + getHeroes() { + this._heroService.getHeroes().then(heroes => this.heroes = heroes); } - ngOnInit(){ - this.heroes = this.onRefresh(); + ngOnInit() { + this.getHeroes(); } - onRefresh() { - //console.log('Refreshing heroes'); - // clear the decks - this.currentHero = undefined; - this.heroes = []; - - this._heroService.refresh() - .then(heroes => this.heroes = heroes); - - return this.heroes; - } + onSelect(hero: Hero) { this.selectedHero = hero; } - onSelect(hero: Hero) { - this.currentHero = hero; - console.log(`Hero selected: ` + JSON.stringify(hero)); + gotoDetail() { + this._router.navigate(['HeroDetail', { id: this.selectedHero.id }]); } +// #docregion heroes-component-renaming } +// #enddocregion heroes-component-renaming +// #enddocregion class +// #enddocregion \ No newline at end of file diff --git a/public/docs/_examples/testing/ts/app/init-caps-pipe.spec.ts b/public/docs/_examples/testing/ts/app/init-caps-pipe.spec.ts deleted file mode 100644 index 2dd78f22ca..0000000000 --- a/public/docs/_examples/testing/ts/app/init-caps-pipe.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -// #docregion -// #docplaster -// #docregion base-pipe-spec -import {InitCapsPipe} from './init-caps-pipe'; - -describe('InitCapsPipe', () => { - let pipe:InitCapsPipe; - - beforeEach(() => { - pipe = new InitCapsPipe(); - }); - - it('transforms "abc" to "Abc"', () => { - expect(pipe.transform('abc')).toEqual('Abc'); - }); - - it('transforms "abc def" to "Abc Def"', () => { - expect(pipe.transform('abc def')).toEqual('Abc Def'); - }); - - it('leaves "Abc Def" unchanged', () => { - expect(pipe.transform('Abc Def')).toEqual('Abc Def'); - }); - // #enddocregion base-pipe-spec - - /* more tests we could run - - it('transforms "abc-def" to "Abc-def"', () => { - expect(pipe.transform('abc-def')).toEqual('Abc-def'); - }); - - it('transforms " abc def" to " Abc Def" (preserves spaces) ', () => { - expect(pipe.transform(' abc def')).toEqual(' Abc Def'); - }); - - */ - // #docregion base-pipe-spec -}); -// #enddocregion base-pipe-spec diff --git a/public/docs/_examples/testing/ts/app/init-caps-pipe.ts b/public/docs/_examples/testing/ts/app/init-caps-pipe.ts deleted file mode 100644 index cceb823c19..0000000000 --- a/public/docs/_examples/testing/ts/app/init-caps-pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -// #docregion -// #docregion depends-on-angular -import {Pipe, PipeTransform} from 'angular2/core'; - -@Pipe({ name: 'initCaps' }) -export class InitCapsPipe implements PipeTransform { - // #enddocregion depends-on-angular - transform(value: string) { - return value.toLowerCase().replace(/(?:^|\s)[a-z]/g, function(m) { - return m.toUpperCase(); - }); - } - // #docregion depends-on-angular -} -// #enddocregion depends-on-angular diff --git a/public/docs/_examples/testing/ts/app/main.ts b/public/docs/_examples/testing/ts/app/main.ts new file mode 100644 index 0000000000..c469e18fd0 --- /dev/null +++ b/public/docs/_examples/testing/ts/app/main.ts @@ -0,0 +1,4 @@ +import { bootstrap } from 'angular2/platform/browser'; +import { AppComponent } from './app.component'; + +bootstrap(AppComponent); \ No newline at end of file diff --git a/public/docs/_examples/testing/ts/app/mock-heroes.ts b/public/docs/_examples/testing/ts/app/mock-heroes.ts index 11b9e8ff73..cdcba35097 100644 --- a/public/docs/_examples/testing/ts/app/mock-heroes.ts +++ b/public/docs/_examples/testing/ts/app/mock-heroes.ts @@ -1,70 +1,16 @@ -import {Hero} from './hero'; +// #docregion +import { Hero } from './hero'; export var HEROES: Hero[] = [ - { - "id": 11, - "name": "Mr. Nice", - "alterEgo": "Walter Meek", - "power": "Empathy" - }, - { - "id": 12, - "name": "Narco", - "alterEgo": "Nancy Knight", - "power": "Drowsiness" - }, - { - "id": 13, - "name": "Bombasto", - "alterEgo": "Bob LaRue", - "power": "Hypersound" - }, - { - "id": 14, - "name": "Celeritas", - "alterEgo": "Larry Plodder", - "power": "Super speed" - }, - { - "id": 15, - "name": "Magneta", - "alterEgo": "Julie Ohm", - "power": "Master of electro-magnetic fields" - }, - { - "id": 16, - "name": "Rubber Man", - "alterEgo": "Jimmy Longfellow", - "power": "Super flexible" - }, - { - "id": 17, - "name": "Dynama", - "alterEgo": "Shirley Knots", - "power": "Incredible strength" - }, - { - "id": 18, - "name": "Dr IQ", - "alterEgo": "Chuck Overstreet", - "power": "Really smart" - }, - { - "id": 19, - "name": "Magma", - "alterEgo": "Harvey Klue", - "power": "Super hot" - }, - { - "id": 20, - "name": "Tornado", - "alterEgo": "Ted Baxter", - "power": "Weather changer" - }, - { - "id": 21, - "name": "eeny weenie", - "alterEgo": "Ima Small", - "power": "shrink to infinitesimal size" - } - ].map(h => Hero.clone(h)); \ No newline at end of file + {"id": 11, "name": "Mr. Nice"}, + {"id": 12, "name": "Narco"}, + {"id": 13, "name": "Bombasto"}, + {"id": 14, "name": "Celeritas"}, + {"id": 15, "name": "Magneta"}, + {"id": 16, "name": "RubberMan"}, + {"id": 17, "name": "Dynama"}, + {"id": 18, "name": "Dr IQ"}, + {"id": 19, "name": "Magma"}, + {"id": 20, "name": "Tornado"} +]; +// #enddocregion \ No newline at end of file diff --git a/public/docs/_examples/testing/ts/app/my-uppercase.pipe.1.ts b/public/docs/_examples/testing/ts/app/my-uppercase.pipe.1.ts new file mode 100644 index 0000000000..4914151579 --- /dev/null +++ b/public/docs/_examples/testing/ts/app/my-uppercase.pipe.1.ts @@ -0,0 +1,9 @@ +// #docregion +import {Pipe, PipeTransform} from 'angular2/core'; + +@Pipe({ name: 'my-uppercase' }) +export class MyUppercasePipe implements PipeTransform { + transform(value: string) { + return value; + } +} diff --git a/public/docs/_examples/testing/ts/app/my-uppercase.pipe.spec.ts b/public/docs/_examples/testing/ts/app/my-uppercase.pipe.spec.ts new file mode 100644 index 0000000000..fc9952f6b2 --- /dev/null +++ b/public/docs/_examples/testing/ts/app/my-uppercase.pipe.spec.ts @@ -0,0 +1,41 @@ +// #docregion +// #docplaster +// #docregion base-pipe-spec +import { MyUppercasePipe } from './my-uppercase.pipe'; + +describe('MyUppercasePipe', () => { + let pipe : MyUppercasePipe; + + beforeEach(() => { + pipe = new MyUppercasePipe(); + }); + + // #docregion expectations + it('transforms "abc" to "ABC"', () => { + expect(pipe.transform('abc')).toEqual('ABC'); + }); + + it('transforms "abc def" to "ABC DEF"', () => { + expect(pipe.transform('abc def')).toEqual('ABC DEF'); + }); + + it('leaves "ABC DEF" unchanged', () => { + expect(pipe.transform('ABC DEF')).toEqual('ABC DEF'); + }); + // #enddocregion expectations + // #enddocregion base-pipe-spec + + /* more tests we could run + + it('transforms "abc-def" to "Abc-def"', () => { + expect(pipe.transform('abc-def')).toEqual('Abc-def'); + }); + + it('transforms " abc def" to " Abc Def" (preserves spaces) ', () => { + expect(pipe.transform(' abc def')).toEqual(' Abc Def'); + }); + + */ + // #docregion base-pipe-spec +}); +// #enddocregion base-pipe-spec diff --git a/public/docs/_examples/testing/ts/app/my-uppercase.pipe.ts b/public/docs/_examples/testing/ts/app/my-uppercase.pipe.ts new file mode 100644 index 0000000000..4b51e14091 --- /dev/null +++ b/public/docs/_examples/testing/ts/app/my-uppercase.pipe.ts @@ -0,0 +1,13 @@ +// #docregion +// #docregion depends-on-angular +import {Pipe, PipeTransform} from 'angular2/core'; +// #enddocregion depends-on-angular + +@Pipe({ name: 'my-uppercase' }) +export class MyUppercasePipe implements PipeTransform { + // #docregion uppercase + transform(value: string) { + return value.toUpperCase(); + } + // #enddocregion uppercase +} diff --git a/public/docs/_examples/testing/ts/app/hero-detail.component.spec.ts.not-yet b/public/docs/_examples/testing/ts/app/old-specs/hero-detail.component.spec.ts.not-yet similarity index 100% rename from public/docs/_examples/testing/ts/app/hero-detail.component.spec.ts.not-yet rename to public/docs/_examples/testing/ts/app/old-specs/hero-detail.component.spec.ts.not-yet diff --git a/public/docs/_examples/testing/ts/app/hero-detail.component.wrapped-tests.spec.ts.not-yet b/public/docs/_examples/testing/ts/app/old-specs/hero-detail.component.wrapped-tests.spec.ts.not-yet similarity index 100% rename from public/docs/_examples/testing/ts/app/hero-detail.component.wrapped-tests.spec.ts.not-yet rename to public/docs/_examples/testing/ts/app/old-specs/hero-detail.component.wrapped-tests.spec.ts.not-yet diff --git a/public/docs/_examples/testing/ts/app/hero.service.ng.spec.ts b/public/docs/_examples/testing/ts/app/old-specs/hero.service.ng.spec.ts.not-yet similarity index 100% rename from public/docs/_examples/testing/ts/app/hero.service.ng.spec.ts rename to public/docs/_examples/testing/ts/app/old-specs/hero.service.ng.spec.ts.not-yet diff --git a/public/docs/_examples/testing/ts/app/hero.service.no-ng.1.spec.ts b/public/docs/_examples/testing/ts/app/old-specs/hero.service.no-ng.1.spec.ts.not-yet similarity index 100% rename from public/docs/_examples/testing/ts/app/hero.service.no-ng.1.spec.ts rename to public/docs/_examples/testing/ts/app/old-specs/hero.service.no-ng.1.spec.ts.not-yet diff --git a/public/docs/_examples/testing/ts/app/hero.service.no-ng.spec.ts b/public/docs/_examples/testing/ts/app/old-specs/hero.service.no-ng.spec.ts.not-yet similarity index 100% rename from public/docs/_examples/testing/ts/app/hero.service.no-ng.spec.ts rename to public/docs/_examples/testing/ts/app/old-specs/hero.service.no-ng.spec.ts.not-yet diff --git a/public/docs/_examples/testing/ts/app/heroes.component.ng.spec.ts.not-yet b/public/docs/_examples/testing/ts/app/old-specs/heroes.component.ng.spec.ts.not-yet similarity index 100% rename from public/docs/_examples/testing/ts/app/heroes.component.ng.spec.ts.not-yet rename to public/docs/_examples/testing/ts/app/old-specs/heroes.component.ng.spec.ts.not-yet diff --git a/public/docs/_examples/testing/ts/app/heroes.component.no-ng.spec.ts b/public/docs/_examples/testing/ts/app/old-specs/heroes.component.no-ng.spec.ts.not-yet similarity index 100% rename from public/docs/_examples/testing/ts/app/heroes.component.no-ng.spec.ts rename to public/docs/_examples/testing/ts/app/old-specs/heroes.component.no-ng.spec.ts.not-yet diff --git a/public/docs/_examples/testing/ts/app/user.spec.ts b/public/docs/_examples/testing/ts/app/old-specs/user.spec.ts.not-yet similarity index 100% rename from public/docs/_examples/testing/ts/app/user.spec.ts rename to public/docs/_examples/testing/ts/app/old-specs/user.spec.ts.not-yet diff --git a/public/docs/_examples/testing/ts/app/user.ts b/public/docs/_examples/testing/ts/app/user.ts deleted file mode 100644 index 247979c59a..0000000000 --- a/public/docs/_examples/testing/ts/app/user.ts +++ /dev/null @@ -1,6 +0,0 @@ -// imagine this is the result of a login -export class User { - id = 42; - name = 'Bongo'; - email = 'bongo@amazing.io' -}; diff --git a/public/docs/_examples/testing/ts/index.html b/public/docs/_examples/testing/ts/index.html index 44e37b274f..0e91f05760 100644 --- a/public/docs/_examples/testing/ts/index.html +++ b/public/docs/_examples/testing/ts/index.html @@ -1,27 +1,39 @@ + + + + + + Angular 2 Tour of Heroes + - - - - - - - - - - + + + + + + + + + - - - - + + + + + + + + + + + + Loading... + diff --git a/public/docs/_examples/testing/ts/unit-tests-0.html b/public/docs/_examples/testing/ts/unit-tests-0.html index fd73c1d2e0..af7d1b9192 100644 --- a/public/docs/_examples/testing/ts/unit-tests-0.html +++ b/public/docs/_examples/testing/ts/unit-tests-0.html @@ -6,11 +6,11 @@ Ng App Unit Tests - + - - - + + + diff --git a/public/docs/_examples/testing/ts/unit-tests-1.html b/public/docs/_examples/testing/ts/unit-tests-1.html index 90b8335bd2..b370ca053a 100644 --- a/public/docs/_examples/testing/ts/unit-tests-1.html +++ b/public/docs/_examples/testing/ts/unit-tests-1.html @@ -4,11 +4,11 @@ Ng App Unit Tests - + - - - + + + diff --git a/public/docs/_examples/testing/ts/unit-tests-2.html b/public/docs/_examples/testing/ts/unit-tests-2.html index c7e22db334..d47b4d1f60 100644 --- a/public/docs/_examples/testing/ts/unit-tests-2.html +++ b/public/docs/_examples/testing/ts/unit-tests-2.html @@ -6,11 +6,11 @@ Ng App Unit Tests - + - - - + + + diff --git a/public/docs/_examples/testing/ts/unit-tests-3.html b/public/docs/_examples/testing/ts/unit-tests-3.html index 708f8d0e94..6f6ce4a7c8 100644 --- a/public/docs/_examples/testing/ts/unit-tests-3.html +++ b/public/docs/_examples/testing/ts/unit-tests-3.html @@ -6,16 +6,16 @@ Ng App Unit Tests - - - + + + - - + + - - + + + - - - - - - - - + + + + + + + @@ -36,7 +35,7 @@ // #3. Import the spec files explicitly Promise.all([ System.import('app/hero.spec'), - System.import('app/init-caps-pipe.spec') + System.import('app/my-uppercase.pipe.spec') ]) // #4. wait for all imports to load ... diff --git a/public/docs/_examples/testing/ts/unit-tests-5.html b/public/docs/_examples/testing/ts/unit-tests-5.html new file mode 100644 index 0000000000..909716200c --- /dev/null +++ b/public/docs/_examples/testing/ts/unit-tests-5.html @@ -0,0 +1,50 @@ + + + + + + Ng App Unit Tests + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/docs/_examples/testing/ts/unit-tests-5.html.not-yet b/public/docs/_examples/testing/ts/unit-tests-5.html.not-yet deleted file mode 100644 index df8e3704ba..0000000000 --- a/public/docs/_examples/testing/ts/unit-tests-5.html.not-yet +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Ng App Unit Tests - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/docs/_examples/testing/ts/unit-tests-6.html.not-yet b/public/docs/_examples/testing/ts/unit-tests-6.html.not-yet index d5449711ee..df8e3704ba 100644 --- a/public/docs/_examples/testing/ts/unit-tests-6.html.not-yet +++ b/public/docs/_examples/testing/ts/unit-tests-6.html.not-yet @@ -9,37 +9,35 @@ + + + - - - - - diff --git a/public/docs/_examples/testing/ts/unit-tests-7.html.not-yet b/public/docs/_examples/testing/ts/unit-tests-7.html.not-yet new file mode 100644 index 0000000000..d5449711ee --- /dev/null +++ b/public/docs/_examples/testing/ts/unit-tests-7.html.not-yet @@ -0,0 +1,46 @@ + + + + + + Ng App Unit Tests + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/docs/_examples/toh-1/ts-snippets/app.component.snippets.pt1.ts b/public/docs/_examples/toh-1/ts-snippets/app.component.snippets.pt1.ts index ffcc45d2f6..a62447ad91 100644 --- a/public/docs/_examples/toh-1/ts-snippets/app.component.snippets.pt1.ts +++ b/public/docs/_examples/toh-1/ts-snippets/app.component.snippets.pt1.ts @@ -33,13 +33,13 @@ template:` // #docregion app-component-1 export class AppComponent { - public title = 'Tour of Heroes'; - public hero = 'Windstorm'; + title = 'Tour of Heroes'; + hero = 'Windstorm'; } // #enddocregion app-component-1 // #docregion hero-property-1 -public hero: Hero = { +hero: Hero = { id: 1, name: 'Windstorm' }; diff --git a/public/docs/_examples/toh-1/ts/app/app.component.ts b/public/docs/_examples/toh-1/ts/app/app.component.ts index 59074565e7..227d901e9b 100644 --- a/public/docs/_examples/toh-1/ts/app/app.component.ts +++ b/public/docs/_examples/toh-1/ts/app/app.component.ts @@ -1,12 +1,12 @@ // #docregion pt1 import {Component} from 'angular2/core'; -// #docregion hero-interface-1 -interface Hero { +// #docregion hero-class-1 +export class Hero { id: number; name: string; } -// #enddocregion hero-interface-1 +// #enddocregion hero-class-1 @Component({ selector: 'my-app', @@ -21,8 +21,8 @@ interface Hero { ` }) export class AppComponent { - public title = 'Tour of Heroes'; - public hero: Hero = { + title = 'Tour of Heroes'; + hero: Hero = { id: 1, name: 'Windstorm' }; diff --git a/public/docs/_examples/toh-2/ts/app/app.component.ts b/public/docs/_examples/toh-2/ts/app/app.component.ts index cf719e6589..cb1c1e918f 100644 --- a/public/docs/_examples/toh-2/ts/app/app.component.ts +++ b/public/docs/_examples/toh-2/ts/app/app.component.ts @@ -1,7 +1,7 @@ // #docregion pt2 import {Component} from 'angular2/core'; -interface Hero { +export class Hero { id: number; name: string; } @@ -37,7 +37,7 @@ interface Hero { margin: 0 0 2em 0; list-style-type: none; padding: 0; - width: 10em; + width: 15em; } .heroes li { cursor: pointer; diff --git a/public/docs/_examples/toh-3/ts/app/app.component.ts b/public/docs/_examples/toh-3/ts/app/app.component.ts index d0fdea50e1..7d63d295bc 100644 --- a/public/docs/_examples/toh-3/ts/app/app.component.ts +++ b/public/docs/_examples/toh-3/ts/app/app.component.ts @@ -32,7 +32,7 @@ import {HeroDetailComponent} from './hero-detail.component'; margin: 0 0 2em 0; list-style-type: none; padding: 0; - width: 10em; + width: 15em; } .heroes li { cursor: pointer; diff --git a/public/docs/_examples/toh-3/ts/app/hero-detail.component.ts b/public/docs/_examples/toh-3/ts/app/hero-detail.component.ts index 90b47c0996..12ebad0f1e 100644 --- a/public/docs/_examples/toh-3/ts/app/hero-detail.component.ts +++ b/public/docs/_examples/toh-3/ts/app/hero-detail.component.ts @@ -1,7 +1,8 @@ // #docplaster // #docregion // #docregion v1 -import {Component} from 'angular2/core'; +import {Component, Input} from 'angular2/core'; + // #enddocregion v1 // #docregion hero-import import {Hero} from './hero'; @@ -10,7 +11,7 @@ import {Hero} from './hero'; // #docregion v1 @Component({ selector: 'my-hero-detail', -// #enddocregion v1 +// #enddocregion v1 // #docregion template template: `
@@ -21,18 +22,18 @@ import {Hero} from './hero';
- `, + ` // #enddocregion template - // #docregion inputs - inputs: ['hero'] - // #enddocregion inputs -// #docregion v1 +// #docregion v1 }) export class HeroDetailComponent { // #enddocregion v1 -// #docregion hero +// #docregion hero-input + @Input() +// #docregion hero hero: Hero; -// #enddocregion hero +// #enddocregion hero +// #enddocregion hero-input // #docregion v1 } // #enddocregion v1 diff --git a/public/docs/_examples/toh-3/ts/app/hero.ts b/public/docs/_examples/toh-3/ts/app/hero.ts index ed746da042..f4b0cd6b35 100644 --- a/public/docs/_examples/toh-3/ts/app/hero.ts +++ b/public/docs/_examples/toh-3/ts/app/hero.ts @@ -1,5 +1,5 @@ // #docregion -export interface Hero { +export class Hero { id: number; name: string; } diff --git a/public/docs/_examples/toh-4/ts/app/app.component.ts b/public/docs/_examples/toh-4/ts/app/app.component.ts index bc587e2390..4505e515a1 100644 --- a/public/docs/_examples/toh-4/ts/app/app.component.ts +++ b/public/docs/_examples/toh-4/ts/app/app.component.ts @@ -32,7 +32,7 @@ import {HeroService} from './hero.service'; margin: 0 0 2em 0; list-style-type: none; padding: 0; - width: 10em; + width: 15em; } .heroes li { cursor: pointer; diff --git a/public/docs/_examples/toh-4/ts/app/hero-detail.component.ts b/public/docs/_examples/toh-4/ts/app/hero-detail.component.ts index 72024f533a..2a17aafd39 100644 --- a/public/docs/_examples/toh-4/ts/app/hero-detail.component.ts +++ b/public/docs/_examples/toh-4/ts/app/hero-detail.component.ts @@ -1,5 +1,5 @@ // #docregion -import {Component} from 'angular2/core'; +import {Component, Input} from 'angular2/core'; import {Hero} from './hero'; @Component({ @@ -15,9 +15,8 @@ import {Hero} from './hero'; - `, - inputs: ['hero'] + ` }) export class HeroDetailComponent { - hero: Hero; + @Input() hero: Hero; } diff --git a/public/docs/_examples/toh-4/ts/app/hero.ts b/public/docs/_examples/toh-4/ts/app/hero.ts index a61b497759..e3eac516da 100644 --- a/public/docs/_examples/toh-4/ts/app/hero.ts +++ b/public/docs/_examples/toh-4/ts/app/hero.ts @@ -1,4 +1,4 @@ -export interface Hero { +export class Hero { id: number; name: string; } diff --git a/public/docs/_examples/toh-5/dart/lib/app_component.dart b/public/docs/_examples/toh-5/dart/lib/app_component.dart index 9af70e7ebe..60ebd7c9bc 100644 --- a/public/docs/_examples/toh-5/dart/lib/app_component.dart +++ b/public/docs/_examples/toh-5/dart/lib/app_component.dart @@ -1,6 +1,6 @@ // #docplaster // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'package:angular2/router.dart'; import 'package:angular2_tour_of_heroes/heroes_component.dart'; diff --git a/public/docs/_examples/toh-5/dart/lib/app_component_1.dart b/public/docs/_examples/toh-5/dart/lib/app_component_1.dart index 3a109d2321..da03cbbee0 100644 --- a/public/docs/_examples/toh-5/dart/lib/app_component_1.dart +++ b/public/docs/_examples/toh-5/dart/lib/app_component_1.dart @@ -1,6 +1,6 @@ // #docplaster // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #enddocregion import 'package:angular2/router.dart'; // for testing only // #docregion diff --git a/public/docs/_examples/toh-5/dart/lib/app_component_2.dart b/public/docs/_examples/toh-5/dart/lib/app_component_2.dart index d0b6854c0f..a677520d91 100644 --- a/public/docs/_examples/toh-5/dart/lib/app_component_2.dart +++ b/public/docs/_examples/toh-5/dart/lib/app_component_2.dart @@ -1,6 +1,6 @@ // #docplaster // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #docregion import-router import 'package:angular2/router.dart'; // #enddocregion import-router diff --git a/public/docs/_examples/toh-5/dart/lib/dashboard_component.dart b/public/docs/_examples/toh-5/dart/lib/dashboard_component.dart index bd5d6f2caf..76335c54c4 100644 --- a/public/docs/_examples/toh-5/dart/lib/dashboard_component.dart +++ b/public/docs/_examples/toh-5/dart/lib/dashboard_component.dart @@ -1,6 +1,6 @@ // #docplaster // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #docregion import-router import 'package:angular2/router.dart'; // #enddocregion import-router diff --git a/public/docs/_examples/toh-5/dart/lib/dashboard_component_1.dart b/public/docs/_examples/toh-5/dart/lib/dashboard_component_1.dart index 0839105b8c..5324624d1f 100644 --- a/public/docs/_examples/toh-5/dart/lib/dashboard_component_1.dart +++ b/public/docs/_examples/toh-5/dart/lib/dashboard_component_1.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; @Component( selector: 'my-dashboard', diff --git a/public/docs/_examples/toh-5/dart/lib/dashboard_component_2.dart b/public/docs/_examples/toh-5/dart/lib/dashboard_component_2.dart index a91eddf22c..fa1dd9a41e 100644 --- a/public/docs/_examples/toh-5/dart/lib/dashboard_component_2.dart +++ b/public/docs/_examples/toh-5/dart/lib/dashboard_component_2.dart @@ -1,6 +1,6 @@ // #docplaster // #docregion imports -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; import 'hero_service.dart'; diff --git a/public/docs/_examples/toh-5/dart/lib/hero_detail_component.dart b/public/docs/_examples/toh-5/dart/lib/hero_detail_component.dart index c92b9981d6..ec143efb62 100644 --- a/public/docs/_examples/toh-5/dart/lib/hero_detail_component.dart +++ b/public/docs/_examples/toh-5/dart/lib/hero_detail_component.dart @@ -4,7 +4,7 @@ import 'dart:html'; // #docregion import-oninit -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #enddocregion import-oninit // #docregion import-route-params import 'package:angular2/router.dart'; diff --git a/public/docs/_examples/toh-5/dart/lib/hero_service.dart b/public/docs/_examples/toh-5/dart/lib/hero_service.dart index eb6cc9f7f0..97490fd5fa 100644 --- a/public/docs/_examples/toh-5/dart/lib/hero_service.dart +++ b/public/docs/_examples/toh-5/dart/lib/hero_service.dart @@ -3,7 +3,7 @@ // #docregion import 'dart:async'; -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'hero.dart'; import 'mock_heroes.dart'; diff --git a/public/docs/_examples/toh-5/dart/lib/heroes_component.dart b/public/docs/_examples/toh-5/dart/lib/heroes_component.dart index 2cfc0fcbab..d615756952 100644 --- a/public/docs/_examples/toh-5/dart/lib/heroes_component.dart +++ b/public/docs/_examples/toh-5/dart/lib/heroes_component.dart @@ -2,7 +2,7 @@ // #docregion import 'dart:async'; -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'package:angular2/router.dart'; import 'hero.dart'; diff --git a/public/docs/_examples/toh-5/dart/pubspec.yaml b/public/docs/_examples/toh-5/dart/pubspec.yaml index 274d8224fd..58420a4d1f 100644 --- a/public/docs/_examples/toh-5/dart/pubspec.yaml +++ b/public/docs/_examples/toh-5/dart/pubspec.yaml @@ -5,14 +5,12 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0+4 + dart_to_js_script_rewriter: ^1.0.1 transformers: - angular2: platform_directives: package:angular2/common.dart#COMMON_DIRECTIVES platform_pipes: package:angular2/common.dart#COMMON_PIPES entry_points: web/main.dart - dart_to_js_script_rewriter -- $dart2js: - checked: true diff --git a/public/docs/_examples/toh-5/dart/web/main.dart b/public/docs/_examples/toh-5/dart/web/main.dart index 5983c199f7..314d6f0b65 100644 --- a/public/docs/_examples/toh-5/dart/web/main.dart +++ b/public/docs/_examples/toh-5/dart/web/main.dart @@ -1,4 +1,4 @@ -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/platform/browser.dart'; import 'package:angular2_tour_of_heroes/app_component.dart'; diff --git a/public/docs/_examples/toh-5/ts/app/hero-detail.component.ts b/public/docs/_examples/toh-5/ts/app/hero-detail.component.ts index 1c06a4ee46..31cb07858c 100644 --- a/public/docs/_examples/toh-5/ts/app/hero-detail.component.ts +++ b/public/docs/_examples/toh-5/ts/app/hero-detail.component.ts @@ -2,10 +2,10 @@ // #docregion // #docregion v2 // #docregion import-oninit -import { Component, OnInit } from 'angular2/core'; +import { Component, Input, OnInit } from 'angular2/core'; // #enddocregion import-oninit // #docregion import-route-params -import {RouteParams} from 'angular2/router'; +import { RouteParams } from 'angular2/router'; // #enddocregion import-route-params import { Hero } from './hero'; @@ -20,15 +20,14 @@ import { HeroService } from './hero.service'; templateUrl: 'app/hero-detail.component.html', // #enddocregion template-url // #enddocregion v2 - styleUrls: ['app/hero-detail.component.css'], - inputs: ['hero'] + styleUrls: ['app/hero-detail.component.css'] // #docregion v2 }) // #enddocregion extract-template // #docregion implement export class HeroDetailComponent implements OnInit { // #enddocregion implement - hero: Hero; + @Input() hero: Hero; // #docregion ctor constructor( diff --git a/public/docs/_examples/toh-5/ts/app/hero.ts b/public/docs/_examples/toh-5/ts/app/hero.ts index a61b497759..e3eac516da 100644 --- a/public/docs/_examples/toh-5/ts/app/hero.ts +++ b/public/docs/_examples/toh-5/ts/app/hero.ts @@ -1,4 +1,4 @@ -export interface Hero { +export class Hero { id: number; name: string; } diff --git a/public/docs/_examples/toh-5/ts/app/heroes.component.css b/public/docs/_examples/toh-5/ts/app/heroes.component.css index d939ab565d..35e45af98d 100644 --- a/public/docs/_examples/toh-5/ts/app/heroes.component.css +++ b/public/docs/_examples/toh-5/ts/app/heroes.component.css @@ -6,7 +6,7 @@ margin: 0 0 2em 0; list-style-type: none; padding: 0; - width: 10em; + width: 15em; } .heroes li { cursor: pointer; diff --git a/public/docs/_examples/toh-6/e2e-spec.js b/public/docs/_examples/toh-6/e2e-spec.js new file mode 100644 index 0000000000..02d5b2a698 --- /dev/null +++ b/public/docs/_examples/toh-6/e2e-spec.js @@ -0,0 +1,133 @@ +describe('TOH Http Chapter', function () { + + beforeEach(function () { + browser.get(''); + }); + + function getPageStruct() { + hrefEles = element.all(by.css('my-app a')); + + return { + hrefs: hrefEles, + myDashboardHref: hrefEles.get(0), + myDashboardParent: element(by.css('my-app my-dashboard')), + topHeroes: element.all(by.css('my-app my-dashboard .module.hero')), + + myHeroesHref: hrefEles.get(1), + myHeroesParent: element(by.css('my-app my-heroes')), + allHeroes: element.all(by.css('my-app my-heroes li .hero-element')), + + firstDeleteButton: element.all(by.buttonText('Delete')).get(0), + + addButton: element.all(by.buttonText('Add New Hero')).get(0), + + heroDetail: element(by.css('my-app my-hero-detail')) + } + } + + it('should be able to add a hero from the "Heroes" view', function(){ + var page = getPageStruct(); + var heroCount; + + page.myHeroesHref.click().then(function() { + browser.waitForAngular(); + heroCount = page.allHeroes.count(); + expect(heroCount).toBe(4, 'should show 4'); + }).then(function() { + return page.addButton.click(); + }).then(function(){ + return save(page,'','The New Hero'); + }).then(function(){ + browser.waitForAngular(); + + heroCount = page.allHeroes.count(); + expect(heroCount).toBe(5, 'should show 5'); + + var newHero = element(by.xpath('//span[@class="hero-element" and contains(text(),"The New Hero")]')); + expect(newHero).toBeDefined(); + }); + }); + + it('should be able to delete hero from "Heroes" view', function(){ + var page = getPageStruct(); + var heroCount; + + page.myHeroesHref.click().then(function() { + browser.waitForAngular(); + heroCount = page.allHeroes.count(); + expect(heroCount).toBe(4, 'should show 4'); + }).then(function() { + return page.firstDeleteButton.click(); + }).then(function(){ + browser.waitForAngular(); + heroCount = page.allHeroes.count(); + expect(heroCount).toBe(3, 'should show 3'); + }); + }); + + it('should be able to save details from "Dashboard" view', function () { + var page = getPageStruct(); + expect(page.myDashboardParent.isPresent()).toBe(true, 'dashboard element should be available'); + var heroEle = page.topHeroes.get(2); + var heroDescrEle = heroEle.element(by.css('h4')); + var heroDescr; + + return heroDescrEle.getText().then(function(text) { + heroDescr = text; + return heroEle.click(); + }).then(function() { + return save(page, heroDescr, '-foo'); + }) + .then(function(){ + return page.myDashboardHref.click(); + }) + .then(function() { + expect(page.myDashboardParent.isPresent()).toBe(true, 'dashboard element should be back'); + expect(heroDescrEle.getText()).toEqual(heroDescr + '-foo'); + }); + }); + + it('should be able to save details from "Heroes" view', function () { + var page = getPageStruct(); + + var viewDetailsButtonEle = page.myHeroesParent.element(by.cssContainingText('button', 'View Details')); + var heroEle, heroDescr; + + page.myHeroesHref.click().then(function() { + expect(page.myDashboardParent.isPresent()).toBe(false, 'dashboard element should NOT be present'); + expect(page.myHeroesParent.isPresent()).toBe(true, 'myHeroes element should be present'); + expect(viewDetailsButtonEle.isPresent()).toBe(false, 'viewDetails button should not yet be present'); + heroEle = page.allHeroes.get(0); + return heroEle.getText(); + }).then(function(text) { + // remove leading 'id' from the element + heroDescr = text.substr(text.indexOf(' ')+1); + return heroEle.click(); + }).then(function() { + expect(viewDetailsButtonEle.isDisplayed()).toBe(true, 'viewDetails button should now be visible'); + return viewDetailsButtonEle.click(); + }).then(function() { + return save(page, heroDescr, '-bar'); + }) + .then(function(){ + return page.myHeroesHref.click(); + }) + .then(function() { + expect(heroEle.getText()).toContain(heroDescr + '-bar'); + }); + }); + + function save(page, origValue, textToAdd) { + var inputEle = page.heroDetail.element(by.css('input')); + expect(inputEle.isDisplayed()).toBe(true, 'should be able to see the input box'); + var saveButtonEle = page.heroDetail.element(by.buttonText('Save')); + var backButtonEle = page.heroDetail.element(by.buttonText('Back')); + expect(backButtonEle.isDisplayed()).toBe(true, 'should be able to see the back button'); + var detailTextEle = page.heroDetail.element(by.css('div h2')); + expect(detailTextEle.getText()).toContain(origValue); + return sendKeys(inputEle, textToAdd).then(function () { + expect(detailTextEle.getText()).toContain(origValue + textToAdd); + return saveButtonEle.click(); + }); + } +}); diff --git a/public/docs/_examples/toh-6/ts/.gitignore b/public/docs/_examples/toh-6/ts/.gitignore new file mode 100644 index 0000000000..2cb7d2a2e9 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/.gitignore @@ -0,0 +1 @@ +**/*.js diff --git a/public/docs/_examples/toh-6/ts/app/app.component.css b/public/docs/_examples/toh-6/ts/app/app.component.css new file mode 100644 index 0000000000..137e9be7be --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/app.component.css @@ -0,0 +1,31 @@ +/* #docplaster */ +/* #docregion css */ +h1 { + font-size: 1.2em; + color: #999; + margin-bottom: 0; +} +h2 { + font-size: 2em; + margin-top: 0; + padding-top: 0; +} +nav a { + padding: 5px 10px; + text-decoration: none; + margin-top: 10px; + display: inline-block; + background-color: #eee; + border-radius: 4px; +} +nav a:visited, a:link { + color: #607D8B; +} +nav a:hover { + color: #039be5; + background-color: #CFD8DC; +} +nav a.router-link-active { + color: #039be5; +} +/* #enddocregion css */ diff --git a/public/docs/_examples/toh-6/ts/app/app.component.ts b/public/docs/_examples/toh-6/ts/app/app.component.ts new file mode 100644 index 0000000000..5fffc240ee --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/app.component.ts @@ -0,0 +1,62 @@ +// #docplaster +// #docregion +import { Component } from 'angular2/core'; +import { RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from 'angular2/router'; + +import { HeroService } from './hero.service'; +import { DashboardComponent } from './dashboard.component'; +import { HeroesComponent } from './heroes.component'; +import { HeroDetailComponent } from './hero-detail.component'; + +import { provide } from 'angular2/core'; +import { XHRBackend } from 'angular2/http'; +import { HTTP_PROVIDERS } from 'angular2/http'; + +import { InMemoryBackendService, SEED_DATA } from 'a2-in-memory-web-api/core'; +import { HeroData } from './hero-data'; + +@Component({ + selector: 'my-app', + + template: ` +

{{title}}

+ + + `, + styleUrls: ['app/app.component.css'], + directives: [ROUTER_DIRECTIVES], + providers: [ + ROUTER_PROVIDERS, + HeroService, + + HTTP_PROVIDERS, + HeroService, + // in-memory web api providers + provide(XHRBackend, { useClass: InMemoryBackendService }), // in-mem server + provide(SEED_DATA, { useClass: HeroData }) // in-mem server data + ] +}) +@RouteConfig([ + { + path: '/dashboard', + name: 'Dashboard', + component: DashboardComponent, + useAsDefault: true + }, + { + path: '/detail/:id', + name: 'HeroDetail', + component: HeroDetailComponent + }, + { + path: '/heroes', + name: 'Heroes', + component: HeroesComponent + } +]) +export class AppComponent { + title = 'Tour of Heroes'; +} diff --git a/public/docs/_examples/toh-6/ts/app/dashboard.component.css b/public/docs/_examples/toh-6/ts/app/dashboard.component.css new file mode 100644 index 0000000000..ce6e963a5f --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/dashboard.component.css @@ -0,0 +1,63 @@ +/* #docplaster */ +/* #docregion */ +[class*='col-'] { + float: left; +} +*, *:after, *:before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +h3 { + text-align: center; margin-bottom: 0; +} +[class*='col-'] { + padding-right: 20px; + padding-bottom: 20px; +} +[class*='col-']:last-of-type { + padding-right: 0; +} +.grid { + margin: 0; +} +.col-1-4 { + width: 25%; +} +.module { + padding: 20px; + text-align: center; + color: #eee; + max-height: 120px; + min-width: 120px; + background-color: #607D8B; + border-radius: 2px; +} +h4 { + position: relative; +} +.module:hover { + background-color: #EEE; + cursor: pointer; + color: #607d8b; +} +.grid-pad { + padding: 10px 0; +} +.grid-pad > [class*='col-']:last-of-type { + padding-right: 20px; +} +@media (max-width: 600px) { + .module { + font-size: 10px; + max-height: 75px; } +} +@media (max-width: 1024px) { + .grid { + margin: 0; + } + .module { + min-width: 60px; + } +} +/* #enddocregion */ diff --git a/public/docs/_examples/toh-6/ts/app/dashboard.component.html b/public/docs/_examples/toh-6/ts/app/dashboard.component.html new file mode 100644 index 0000000000..a5bafd7702 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/dashboard.component.html @@ -0,0 +1,11 @@ + +

Top Heroes

+
+ +
+ +
+

{{hero.name}}

+
+
+
diff --git a/public/docs/_examples/toh-6/ts/app/dashboard.component.ts b/public/docs/_examples/toh-6/ts/app/dashboard.component.ts new file mode 100644 index 0000000000..541817c3fd --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/dashboard.component.ts @@ -0,0 +1,32 @@ +// #docplaster +// #docregion +import { Component, OnInit } from 'angular2/core'; +import { Router } from 'angular2/router'; + +import { Hero } from './hero'; +import { HeroService } from './hero.service'; + +@Component({ + selector: 'my-dashboard', + templateUrl: 'app/dashboard.component.html', + styleUrls: ['app/dashboard.component.css'] +}) +export class DashboardComponent implements OnInit { + + heroes: Hero[] = []; + + constructor( + private _router: Router, + private _heroService: HeroService) { + } + + ngOnInit() { + this._heroService.getHeroes() + .then(heroes => this.heroes = heroes.slice(1,5)); + } + + gotoDetail(hero: Hero) { + let link = ['HeroDetail', { id: hero.id }]; + this._router.navigate(link); + } +} diff --git a/public/docs/_examples/toh-6/ts/app/hero-data.ts b/public/docs/_examples/toh-6/ts/app/hero-data.ts new file mode 100644 index 0000000000..18c4617149 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/hero-data.ts @@ -0,0 +1,12 @@ +// #docregion +export class HeroData { + createDb() { + let heroes = [ + { "id": 1, "name": "Windstorm" }, + { "id": 2, "name": "Bombasto" }, + { "id": 3, "name": "Magneta" }, + { "id": 4, "name": "Tornado" } + ]; + return {heroes}; + } +} \ No newline at end of file diff --git a/public/docs/_examples/toh-6/ts/app/hero-detail.component.css b/public/docs/_examples/toh-6/ts/app/hero-detail.component.css new file mode 100644 index 0000000000..ab2437efd8 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/hero-detail.component.css @@ -0,0 +1,30 @@ +/* #docregion */ +label { + display: inline-block; + width: 3em; + margin: .5em 0; + color: #607D8B; + font-weight: bold; +} +input { + height: 2em; + font-size: 1em; + padding-left: .4em; +} +button { + margin-top: 20px; + font-family: Arial; + background-color: #eee; + border: none; + padding: 5px 10px; + border-radius: 4px; + cursor: pointer; cursor: hand; +} +button:hover { + background-color: #cfd8dc; +} +button:disabled { + background-color: #eee; + color: #ccc; + cursor: auto; +} diff --git a/public/docs/_examples/toh-6/ts/app/hero-detail.component.html b/public/docs/_examples/toh-6/ts/app/hero-detail.component.html new file mode 100644 index 0000000000..f532eb0109 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/hero-detail.component.html @@ -0,0 +1,13 @@ + + +
+

{{hero.name}} details!

+
+ {{hero.id}}
+
+ + +
+ + +
\ No newline at end of file diff --git a/public/docs/_examples/toh-6/ts/app/hero-detail.component.ts b/public/docs/_examples/toh-6/ts/app/hero-detail.component.ts new file mode 100644 index 0000000000..98038fc19d --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/hero-detail.component.ts @@ -0,0 +1,46 @@ +// #docplaster +// #docregion +import { Component, Input, Output, OnInit, EventEmitter } from 'angular2/core'; +import { RouteParams } from 'angular2/router'; + +import { Hero } from './hero'; +import { HeroService } from './hero.service'; +@Component({ + selector: 'my-hero-detail', + templateUrl: 'app/hero-detail.component.html', + styleUrls: ['app/hero-detail.component.css'] +}) +export class HeroDetailComponent implements OnInit { + @Input() hero: Hero; + @Output() updateHeroes = new EventEmitter(); + + constructor( + private _heroService: HeroService, + private _routeParams: RouteParams) { + } + + // #docregion ngOnInit + ngOnInit() { + if(this._routeParams.get('id') !== null){ + let id = +this._routeParams.get('id'); + this._heroService.getHero(id) + .then(hero => this.hero = hero); + } + else{ + this.hero = new Hero(); + } + } + // #enddocregion ngOnInit + // #docregion save + save(){ + this._heroService.save(this.hero) + .then(r => { + this.updateHeroes.emit(r); + }); + } + // #enddocregion save + goBack() { + window.history.back(); + } +} + diff --git a/public/docs/_examples/toh-6/ts/app/hero.service.ts b/public/docs/_examples/toh-6/ts/app/hero.service.ts new file mode 100644 index 0000000000..767ff4e189 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/hero.service.ts @@ -0,0 +1,79 @@ +// #docplaster +// #docregion +import { Hero } from './hero'; +import { Injectable } from 'angular2/core'; +import { Http, Response, Headers } from 'angular2/http'; + +@Injectable() +export class HeroService { + + private _heroesUrl = 'app/heroes'; // URL to web api + + constructor(private _http:Http){ + } + + //#docregion get-heroes + getHeroes() { + return this._http.get(this._heroesUrl).toPromise() + .then((res:Response) => res.json()) + .then(res => res.data) + .catch(this.handleError); + } + //#enddocregion get-heroes + + getHero(id: number) { + return this.getHeroes().then( + heroes => heroes.filter((hero:Hero) => hero.id === id)[0] + ); + } + + save(hero:Hero){ + if(hero.id){ + return this.put(hero); + } + else{ + return this.post(hero); + } + } + + delete(hero:Hero){ + //#docregion delete-hero + let headers = new Headers(); + headers.append('Content-Type', 'application/json'); + + let url = `${this._heroesUrl}/${hero.id}`; + + return this._http.delete(url,headers).toPromise() + .catch(this.handleError); + //#enddocregion delete-hero + } + + private post(hero:Hero){ + //#docregion post-hero + let headers = new Headers(); + headers.append('Content-Type', 'application/json'); + + return this._http.post(this._heroesUrl, JSON.stringify(hero), {headers:headers}).toPromise() + .catch(this.handleError); + //#enddocregion post-hero + } + + private put(hero:Hero){ + //#docregion put-hero + let headers = new Headers(); + headers.append('Content-Type', 'application/json'); + + let url = `${this._heroesUrl}/${hero.id}`; + + return this._http.put(url, JSON.stringify(hero), {headers:headers}).toPromise() + .catch(this.handleError); + //#enddocregion put-hero + } + + //#docregion error-handler + private handleError(error:any){ + console.log('An error occurred:' + error); + } + //#enddocregion error-handler +} +// #enddocregion \ No newline at end of file diff --git a/public/docs/_examples/toh-6/ts/app/hero.ts b/public/docs/_examples/toh-6/ts/app/hero.ts new file mode 100644 index 0000000000..e3eac516da --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/hero.ts @@ -0,0 +1,4 @@ +export class Hero { + id: number; + name: string; +} diff --git a/public/docs/_examples/toh-6/ts/app/heroes.component.css b/public/docs/_examples/toh-6/ts/app/heroes.component.css new file mode 100644 index 0000000000..35e45af98d --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/heroes.component.css @@ -0,0 +1,59 @@ +.selected { + background-color: #CFD8DC !important; + color: white; +} +.heroes { + margin: 0 0 2em 0; + list-style-type: none; + padding: 0; + width: 15em; +} +.heroes li { + cursor: pointer; + position: relative; + left: 0; + background-color: #EEE; + margin: .5em; + padding: .3em 0; + height: 1.6em; + border-radius: 4px; +} +.heroes li:hover { + color: #607D8B; + background-color: #DDD; + left: .1em; +} +.heroes li.selected:hover { + background-color: #BBD8DC !important; + color: white; +} +.heroes .text { + position: relative; + top: -3px; +} +.heroes .badge { + display: inline-block; + font-size: small; + color: white; + padding: 0.8em 0.7em 0 0.7em; + background-color: #607D8B; + line-height: 1em; + position: relative; + left: -1px; + top: -4px; + height: 1.8em; + margin-right: .8em; + border-radius: 4px 0 0 4px; +} +button { + font-family: Arial; + background-color: #eee; + border: none; + padding: 5px 10px; + border-radius: 4px; + cursor: pointer; + cursor: hand; +} +button:hover { + background-color: #cfd8dc; +} diff --git a/public/docs/_examples/toh-6/ts/app/heroes.component.html b/public/docs/_examples/toh-6/ts/app/heroes.component.html new file mode 100644 index 0000000000..060def3d39 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/heroes.component.html @@ -0,0 +1,22 @@ + + +

My Heroes

+
    +
  • + + {{hero.id}} {{hero.name}} + + +
  • +
+ + +
+ +
+
+

+ {{selectedHero.name | uppercase}} is my hero +

+ +
diff --git a/public/docs/_examples/toh-6/ts/app/heroes.component.ts b/public/docs/_examples/toh-6/ts/app/heroes.component.ts new file mode 100644 index 0000000000..125140be0f --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/heroes.component.ts @@ -0,0 +1,58 @@ +// #docplaster +// #docregion +import { Component, OnInit } from 'angular2/core'; +import { Router } from 'angular2/router'; + +import { Hero } from './hero'; +import { HeroDetailComponent } from './hero-detail.component'; +import { HeroService } from './hero.service'; + +@Component({ + selector: 'my-heroes', + templateUrl: 'app/heroes.component.html', + styleUrls: ['app/heroes.component.css'], + directives: [HeroDetailComponent] +}) +export class HeroesComponent implements OnInit { + heroes: Hero[]; + selectedHero: Hero; + addingHero = false; + + constructor( + private _router: Router, + private _heroService: HeroService) { } + + getHeroes() { + this._heroService.getHeroes() + .then(heroes => this.heroes = heroes); + } + + addHero(){ + this.addingHero = true; + this.selectedHero = null; + } + + // #docregion delete + delete(hero:Hero, event:any){ + event.stopPropagation(); + this._heroService.delete(hero) + .then(r => { + this.heroes = this.heroes.filter(h => h.id !== hero.id); + } + ); + } + // #enddocregion delete + + ngOnInit() { + this.getHeroes(); + } + + onSelect(hero: Hero) { + this.selectedHero = hero; + this.addingHero = false; + } + + gotoDetail() { + this._router.navigate(['HeroDetail', { id: this.selectedHero.id }]); + } +} diff --git a/public/docs/_examples/toh-6/ts/app/main.ts b/public/docs/_examples/toh-6/ts/app/main.ts new file mode 100644 index 0000000000..cc1b80d9a9 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/app/main.ts @@ -0,0 +1,6 @@ +import { bootstrap } from 'angular2/platform/browser'; +import { AppComponent } from './app.component'; + +import 'rxjs/Rx'; + +bootstrap(AppComponent); \ No newline at end of file diff --git a/public/docs/_examples/toh-6/ts/example-config.json b/public/docs/_examples/toh-6/ts/example-config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/toh-6/ts/index.html b/public/docs/_examples/toh-6/ts/index.html new file mode 100644 index 0000000000..90c5acaa27 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/index.html @@ -0,0 +1,36 @@ + + + + + Angular 2 Tour of Heroes + + + + + + + + + + + + + + + + + + + + + + + + + Loading... + + diff --git a/public/docs/_examples/toh-6/ts/plnkr.json b/public/docs/_examples/toh-6/ts/plnkr.json new file mode 100644 index 0000000000..777d9ad1f1 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/plnkr.json @@ -0,0 +1,9 @@ +{ + "description": "Tour of Heroes: Part 6", + "files":[ + "!**/*.d.ts", + "!**/*.js", + "!**/*.[1,2].*" + ], + "tags": ["tutorial", "tour", "heroes", "http"] +} diff --git a/public/docs/_examples/toh-6/ts/sample.css b/public/docs/_examples/toh-6/ts/sample.css new file mode 100644 index 0000000000..042f0494f6 --- /dev/null +++ b/public/docs/_examples/toh-6/ts/sample.css @@ -0,0 +1,8 @@ +button.delete-button{ + float:right; + background-color: gray !important; + color:white; +} + + + diff --git a/public/docs/_examples/tslint.json b/public/docs/_examples/tslint.json new file mode 100644 index 0000000000..276453f4f5 --- /dev/null +++ b/public/docs/_examples/tslint.json @@ -0,0 +1,93 @@ +{ + "rules": { + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "indent": [ + true, + "spaces" + ], + "label-position": true, + "label-undefined": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + "static-before-instance", + "variables-before-functions" + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-key": true, + "no-duplicate-variable": true, + "no-empty": false, + "no-eval": true, + "no-inferrable-types": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unused-expression": true, + "no-unused-variable": true, + "no-unreachable": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ] + } +} diff --git a/public/docs/_examples/tutorial/ts/app/app.component.ts b/public/docs/_examples/tutorial/ts/app/app.component.ts index 1cea6e8f9c..8e0bf4403d 100644 --- a/public/docs/_examples/tutorial/ts/app/app.component.ts +++ b/public/docs/_examples/tutorial/ts/app/app.component.ts @@ -26,5 +26,5 @@ import {HeroService} from './hero.service'; {path: '/detail/:id', name: 'HeroDetail', component: HeroDetailComponent} ]) export class AppComponent { - public title = 'Tour of Heroes'; + title = 'Tour of Heroes'; } diff --git a/public/docs/_examples/tutorial/ts/app/dashboard.component.ts b/public/docs/_examples/tutorial/ts/app/dashboard.component.ts index ae5f048a57..f5a3719563 100644 --- a/public/docs/_examples/tutorial/ts/app/dashboard.component.ts +++ b/public/docs/_examples/tutorial/ts/app/dashboard.component.ts @@ -9,7 +9,7 @@ import {HeroService} from './hero.service'; styleUrls: ['app/dashboard.component.css'] }) export class DashboardComponent implements OnInit { - public heroes: Hero[] = []; + heroes: Hero[] = []; constructor(private _heroService: HeroService, private _router: Router) { } diff --git a/public/docs/_examples/tutorial/ts/app/hero-detail.component.ts b/public/docs/_examples/tutorial/ts/app/hero-detail.component.ts index 0014918b8b..22f2e5222e 100644 --- a/public/docs/_examples/tutorial/ts/app/hero-detail.component.ts +++ b/public/docs/_examples/tutorial/ts/app/hero-detail.component.ts @@ -1,4 +1,4 @@ -import {Component, OnInit} from 'angular2/core'; +import {Component, Input, OnInit} from 'angular2/core'; import {RouteParams} from 'angular2/router'; import {Hero} from './hero'; @@ -7,11 +7,10 @@ import {HeroService} from './hero.service'; @Component({ selector: 'my-hero-detail', templateUrl: 'app/hero-detail.component.html', - styleUrls: ['app/hero-detail.component.css'], - inputs: ['hero'] + styleUrls: ['app/hero-detail.component.css'] }) export class HeroDetailComponent implements OnInit { - public hero: Hero; + @Input() hero: Hero; constructor(private _heroService: HeroService, private _routeParams: RouteParams) { diff --git a/public/docs/_examples/tutorial/ts/app/hero.ts b/public/docs/_examples/tutorial/ts/app/hero.ts index 34f6058c2f..e94ec6124a 100644 --- a/public/docs/_examples/tutorial/ts/app/hero.ts +++ b/public/docs/_examples/tutorial/ts/app/hero.ts @@ -1,4 +1,4 @@ -export interface Hero { +export class Hero { id: number; name: string; } diff --git a/public/docs/_examples/tutorial/ts/app/heroes.component.css b/public/docs/_examples/tutorial/ts/app/heroes.component.css index d939ab565d..35e45af98d 100644 --- a/public/docs/_examples/tutorial/ts/app/heroes.component.css +++ b/public/docs/_examples/tutorial/ts/app/heroes.component.css @@ -6,7 +6,7 @@ margin: 0 0 2em 0; list-style-type: none; padding: 0; - width: 10em; + width: 15em; } .heroes li { cursor: pointer; diff --git a/public/docs/_examples/tutorial/ts/app/heroes.component.ts b/public/docs/_examples/tutorial/ts/app/heroes.component.ts index 2783981337..86996127a9 100644 --- a/public/docs/_examples/tutorial/ts/app/heroes.component.ts +++ b/public/docs/_examples/tutorial/ts/app/heroes.component.ts @@ -11,8 +11,8 @@ import {Hero} from './hero'; directives: [HeroDetailComponent] }) export class HeroesComponent implements OnInit { - public heroes: Hero[]; - public selectedHero: Hero; + heroes: Hero[]; + selectedHero: Hero; constructor(private _heroService: HeroService, private _router: Router) { } diff --git a/public/docs/_examples/user-input/dart/lib/app_component.dart b/public/docs/_examples/user-input/dart/lib/app_component.dart index 4a2f3fe6ff..d86db43cb0 100644 --- a/public/docs/_examples/user-input/dart/lib/app_component.dart +++ b/public/docs/_examples/user-input/dart/lib/app_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; import 'click_me_component.dart'; import 'click_me_component_2.dart'; diff --git a/public/docs/_examples/user-input/dart/lib/click_me_component.dart b/public/docs/_examples/user-input/dart/lib/click_me_component.dart index eaad88dd0c..c1c7e19f93 100644 --- a/public/docs/_examples/user-input/dart/lib/click_me_component.dart +++ b/public/docs/_examples/user-input/dart/lib/click_me_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #docregion click-me-component @Component( diff --git a/public/docs/_examples/user-input/dart/lib/click_me_component_2.dart b/public/docs/_examples/user-input/dart/lib/click_me_component_2.dart index e96399d943..8047b2280a 100644 --- a/public/docs/_examples/user-input/dart/lib/click_me_component_2.dart +++ b/public/docs/_examples/user-input/dart/lib/click_me_component_2.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; @Component( selector: 'click-me2', diff --git a/public/docs/_examples/user-input/dart/lib/keyup_components.dart b/public/docs/_examples/user-input/dart/lib/keyup_components.dart index e48056a1aa..c38a51e9a3 100644 --- a/public/docs/_examples/user-input/dart/lib/keyup_components.dart +++ b/public/docs/_examples/user-input/dart/lib/keyup_components.dart @@ -2,7 +2,7 @@ // #docregion import 'dart:html'; -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #docregion key-up-component-1 @Component( diff --git a/public/docs/_examples/user-input/dart/lib/little_tour_component.dart b/public/docs/_examples/user-input/dart/lib/little_tour_component.dart index ba98f37d68..581689a85e 100644 --- a/public/docs/_examples/user-input/dart/lib/little_tour_component.dart +++ b/public/docs/_examples/user-input/dart/lib/little_tour_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #docregion little-tour @Component( diff --git a/public/docs/_examples/user-input/dart/lib/loop_back_component.dart b/public/docs/_examples/user-input/dart/lib/loop_back_component.dart index b79f3f5ac4..f2ceb75d11 100644 --- a/public/docs/_examples/user-input/dart/lib/loop_back_component.dart +++ b/public/docs/_examples/user-input/dart/lib/loop_back_component.dart @@ -1,5 +1,5 @@ // #docregion -import 'package:angular2/angular2.dart'; +import 'package:angular2/core.dart'; // #docregion loop-back-component @Component( diff --git a/public/docs/_examples/user-input/dart/pubspec.yaml b/public/docs/_examples/user-input/dart/pubspec.yaml index 4563ea5f93..b800042a03 100644 --- a/public/docs/_examples/user-input/dart/pubspec.yaml +++ b/public/docs/_examples/user-input/dart/pubspec.yaml @@ -5,9 +5,9 @@ version: 0.0.1 environment: sdk: '>=1.13.0 <2.0.0' dependencies: - angular2: 2.0.0-beta.11 + angular2: 2.0.0-beta.13.1 browser: ^0.10.0 - dart_to_js_script_rewriter: ^0.1.0 + dart_to_js_script_rewriter: ^1.0.1 transformers: - angular2: platform_directives: 'package:angular2/common.dart#CORE_DIRECTIVES' diff --git a/public/docs/_examples/user-input/dart/web/main.dart b/public/docs/_examples/user-input/dart/web/main.dart index f74bf40a09..fc77aef43b 100644 --- a/public/docs/_examples/user-input/dart/web/main.dart +++ b/public/docs/_examples/user-input/dart/web/main.dart @@ -1,5 +1,6 @@ // #docregion -import 'package:angular2/bootstrap.dart'; +import 'package:angular2/platform/browser.dart'; + import 'package:user_input/app_component.dart'; main() { diff --git a/public/docs/dart/latest/_data.json b/public/docs/dart/latest/_data.json index 8c221c6385..20395954fe 100644 --- a/public/docs/dart/latest/_data.json +++ b/public/docs/dart/latest/_data.json @@ -3,7 +3,7 @@ "icon": "home", "title": "Angular Docs", "menuTitle": "Docs Home", - "banner": "Angular 2 is currently in Beta." + "banner": "Welcome to angular.io/dart! The current Angular 2 release is beta.14. Consult the Change Log about recent enhancements, fixes, and breaking changes." }, "quickstart": { @@ -35,10 +35,10 @@ "title": "API Preview", "reference": true }, - + "cheatsheet": { "title": "Angular Cheat Sheet", - "intro": "A quick quide to Angular syntax.", + "intro": "A quick guide to Angular syntax.", "reference": true }, @@ -47,7 +47,7 @@ "intro": "Brief definitions of the most important words in the Angular 2 vocabulary", "reference": true }, - + "resources": { "icon": "play-circle-fill", "title": "Angular Resources", @@ -60,7 +60,7 @@ "title": "Help & Support", "resources": true }, - + "styleguide": { "title": "Docs Style Guide", "intro": "Design & Layout Patterns For Documentation" diff --git a/public/docs/dart/latest/cookbook/_data.json b/public/docs/dart/latest/cookbook/_data.json index 71d17069b1..ce8315d497 100644 --- a/public/docs/dart/latest/cookbook/_data.json +++ b/public/docs/dart/latest/cookbook/_data.json @@ -2,18 +2,36 @@ "index": { "title": "Cookbook", "navTitle": "Overview", - "description": "A collection of recipes for common Angular application scenarios" + "intro": "A collection of recipes for common Angular application scenarios" }, "a1-a2-quick-reference": { "title": "Angular 1 to 2 Quick Reference", "navTitle": "Angular 1 to 2 Quick Ref", - "description": "Learn how Angular 1 concepts and techniques map to Angular 2", + "intro": "Learn how Angular 1 concepts and techniques map to Angular 2", "hide": true }, "component-communication": { "title": "Component Interaction", - "description": "Share information between different directives and components" + "intro": "Share information between different directives and components" + }, + + "dependency-injection": { + "title": "Dependency Injection", + "intro": "Techniques for Dependency Injection", + "hide": true + }, + + "dynamic-forms": { + "title": "Dynamic Form", + "intro": "Render dynamic forms with NgFormModel", + "hide": true + }, + + "ts-to-js": { + "title": "TypeScript to JavaScript", + "intro": "Convert Angular 2 TypeScript examples into ES5 JavaScript", + "hide": true } } \ No newline at end of file diff --git a/public/docs/dart/latest/cookbook/dependency-injection.jade b/public/docs/dart/latest/cookbook/dependency-injection.jade new file mode 100644 index 0000000000..f8df2a84a6 --- /dev/null +++ b/public/docs/dart/latest/cookbook/dependency-injection.jade @@ -0,0 +1 @@ +!= partial("../../../_includes/_ts-temp") \ No newline at end of file diff --git a/public/docs/dart/latest/cookbook/dynamic-forms.jade b/public/docs/dart/latest/cookbook/dynamic-forms.jade new file mode 100644 index 0000000000..f8df2a84a6 --- /dev/null +++ b/public/docs/dart/latest/cookbook/dynamic-forms.jade @@ -0,0 +1 @@ +!= partial("../../../_includes/_ts-temp") \ No newline at end of file diff --git a/public/docs/dart/latest/cookbook/ts-to-js.jade b/public/docs/dart/latest/cookbook/ts-to-js.jade new file mode 100644 index 0000000000..f8df2a84a6 --- /dev/null +++ b/public/docs/dart/latest/cookbook/ts-to-js.jade @@ -0,0 +1 @@ +!= partial("../../../_includes/_ts-temp") \ No newline at end of file diff --git a/public/docs/dart/latest/guide/_data.json b/public/docs/dart/latest/guide/_data.json index ad902928f1..fca35dcc06 100644 --- a/public/docs/dart/latest/guide/_data.json +++ b/public/docs/dart/latest/guide/_data.json @@ -52,7 +52,7 @@ "cheatsheet": { "title": "Angular Cheat Sheet", - "intro": "A quick quide to Angular syntax.", + "intro": "A quick guide to Angular syntax.", "nextable": true, "basics": true }, @@ -62,6 +62,11 @@ "intro": "Attribute directives attach behavior to elements." }, + "component-styles": { + "title": "Component Styles", + "intro": "Learn how to apply CSS styles to components." + }, + "hierarchical-dependency-injection": { "title": "Hierarchical Dependency Injectors", "navTitle": "Hierarchical Injectors", diff --git a/public/docs/dart/latest/guide/component-styles.jade b/public/docs/dart/latest/guide/component-styles.jade new file mode 100644 index 0000000000..f8df2a84a6 --- /dev/null +++ b/public/docs/dart/latest/guide/component-styles.jade @@ -0,0 +1 @@ +!= partial("../../../_includes/_ts-temp") \ No newline at end of file diff --git a/public/docs/dart/latest/guide/dependency-injection.jade b/public/docs/dart/latest/guide/dependency-injection.jade index 72fdaa1a49..ee0d41deef 100644 --- a/public/docs/dart/latest/guide/dependency-injection.jade +++ b/public/docs/dart/latest/guide/dependency-injection.jade @@ -1,11 +1,279 @@ include ../_util-fns ++includeShared('{ts}', 'intro') + +:marked + The complete source code for the example app in this chapter is + [in GitHub](https://github.com/angular/angular.io/tree/master/public/docs/_examples/dependency-injection/dart). + ++includeShared('{ts}', 'why-1') ++makeExample('dependency-injection/dart/lib/car/car_no_di.dart', 'car', 'lib/car/car.dart (without DI)') ++includeShared('{ts}', 'why-2') ++makeTabs( + 'dependency-injection/dart/lib/car/car.dart, dependency-injection/dart/lib/car/car_no_di.dart', + 'car-ctor, car-ctor', + 'lib/car/car.dart (excerpt with DI), lib/car/car.dart (excerpt without DI)')(format=".") ++includeShared('{ts}', 'why-3-1') ++includeShared('{ts}', 'why-3-2') +- var stylePattern = { otl: /(new Car.*$)/gm }; ++makeExample('dependency-injection/dart/lib/car/car_creations.dart', 'car-ctor-instantiation', '', stylePattern)(format=".") ++includeShared('{ts}', 'why-4') +.l-sub-section + :marked + The _consumer_ of `Car` has the problem. The consumer must update the car creation code to + something like this: + - var stylePattern = { otl: /(new Car.*$)/gm }; + +makeExample('dependency-injection/dart/lib/car/car_creations.dart', 'car-ctor-instantiation-with-param', '', stylePattern)(format=".") + :marked + The critical point is this: `Car` itself did not have to change. + We'll take care of the consumer's problem soon enough. ++includeShared('{ts}', 'why-6') +- var stylePattern = { otl: /(new Car.*$)/gm }; ++makeExample('dependency-injection/dart/lib/car/car_creations.dart', 'car-ctor-instantiation-with-mocks', '', stylePattern)(format=".") ++includeShared('{ts}', 'why-7') ++makeExample('dependency-injection/dart/lib/car/car_factory.dart', null, 'lib/car/car_factory.dart') ++includeShared('{ts}', 'why-8') ++makeExample('dependency-injection/dart/lib/car/car_injector.dart','injector-call')(format=".") ++includeShared('{ts}', 'why-9') + ++includeShared('{ts}', 'di-1') ++makeTabs( + `dependency-injection/dart/lib/heroes/heroes_component_1.dart, + dependency-injection/dart/lib/heroes/hero_list_component_1.dart, + dependency-injection/dart/lib/heroes/hero.dart, + dependency-injection/dart/lib/heroes/mock_heroes.dart`, + 'v1,,,', + `lib/heroes/heroes_component.dart, + lib/heroes/hero_list_component.dart, + lib/heroes/hero.dart, + lib/heroes/mock_heroes.dart`) ++includeShared('{ts}', 'di-2') ++includeShared('{ts}', 'di-3') ++makeExample('dependency-injection/dart/lib/heroes/hero_service_1.dart',null, 'lib/heroes/hero_service.dart' ) ++includeShared('{ts}', 'di-4') +.l-sub-section + :marked + We aren't even pretending this is a real service. + If we were actually getting data from a remote server, the API would have to be asynchronous, + returning a `Future`. + We'd also have to rewrite the way components consume our service. + This is important in general, but not to our current story. ++includeShared('{ts}', 'di-6') ++includeShared('{ts}', 'di-configure-injector-1') ++makeExample('dependency-injection/dart/web/main.dart', 'bootstrap', 'web/main.dart (excerpt)')(format='.') ++includeShared('{ts}', 'di-configure-injector-2') ++makeExample('dependency-injection/dart/web/main_1.dart', 'bootstrap')(format='.') ++includeShared('{ts}', 'di-configure-injector-3') ++includeShared('{ts}', 'di-register-providers-1') ++makeExample('dependency-injection/dart/lib/heroes/heroes_component_1.dart',null,'lib/heroes/heroes_component.dart') ++includeShared('{ts}', 'di-register-providers-2') ++makeExample('dependency-injection/dart/lib/heroes/heroes_component_1.dart','providers')(format='.') ++includeShared('{ts}', 'di-register-providers-3') ++includeShared('{ts}', 'di-prepare-for-injection-1') ++makeTabs( + `dependency-injection/dart/lib/heroes/hero_list_component_2.dart, + dependency-injection/dart/lib/heroes/hero_list_component_1.dart`, + null, + `lib/heroes/hero_list_component (with DI), + lib/heroes/hero_list_component (without DI)`) +.l-sub-section + :marked + ### Focus on the constructor + + Adding a parameter to the constructor isn't all that's happening here. + +makeExample('dependency-injection/dart/lib/heroes/hero_list_component_2.dart', 'ctor')(format=".") + :marked + The constructor parameter has a type: `HeroService`. + The `HeroListComponent` class is also annotated with `@Component` + (scroll up to confirm that fact). + Also recall that the parent component (`HeroesComponent`) + has `providers` information for `HeroService`. + + The constructor parameter type, the `@Component` annotation, + and the parent's `providers` information combine to tell the + Angular injector to inject an instance of + `HeroService` whenever it creates a new `HeroListComponent`. ++includeShared('{ts}', 'di-create-injector-implicitly-1') ++makeExample('dependency-injection/dart/lib/car/car_injector.dart','injector-create-and-call')(format=".") ++includeShared('{ts}', 'di-create-injector-implicitly-2') ++includeShared('{ts}', 'di-singleton-services') + +// Skip the testing section, for now. +// includeShared('{ts}', 'di-testing-component-1') +// includeShared('{ts}', 'di-testing-component-2') + ++includeShared('{ts}', 'di-service-service-1') ++makeTabs( + `dependency-injection/dart/lib/heroes/hero_service_2.dart, + dependency-injection/dart/lib/heroes/hero_service_1.dart`, + null, + `lib/heroes/hero_service (v.2), + lib/heroes/hero_service (v.1)`) ++includeShared('{ts}', 'di-service-service-2') ++includeShared('{ts}', 'di-injectable-1') +:marked + Forgetting the `@Injectable()` can cause a runtime error: +code-example(format, language="html"). + Cannot find reflection information on <Type> ++includeShared('{ts}', 'di-injectable-2') +.callout.is-critical + header Always include the parentheses + :marked + Always use `@Injectable()`, not just `@Injectable`. + A metadata annotation must be either a reference to a + compile-time constant variable or a call to a constant + constructor such as `Injectable()`. + If we forget the parentheses, the analyzer will complain: + "Annotation creation must have arguments". If we try to run the + app anyway, it won't work, and the console will say + "expression must be a compile-time constant". ++includeShared('{ts}', 'logger-service-1') ++makeExample( + 'dependency-injection/dart/lib/logger_service.dart',null, 'lib/logger_service') +.l-sub-section + :marked + ### Implementing a logger + + Our examples use a simple logger. + A real implementation would probably use the + [logging package](https://pub.dartlang.org/packages/logging). +:marked + We're likely to need the same logger service everywhere in our application, + so we put it in the `lib/` folder, and + we register it in the `providers` array of the metadata for our application root component, `AppComponent`. ++makeExample('dependency-injection/dart/lib/providers_component.dart','providers-logger', 'lib/app_component.dart (excerpt)') ++includeShared('{ts}', 'logger-service-3') ++includeShared('{ts}', 'logger-service-4') ++includeShared('{ts}', 'logger-service-5') ++makeExample('dependency-injection/dart/lib/providers_component.dart','provider-10-ctor')(format='.') ++includeShared('{ts}', 'logger-service-6') ++makeExample('dependency-injection/dart/lib/providers_component.dart','provider-10-logger')(format='.') ++includeShared('{ts}', 'logger-service-7') + ++includeShared('{ts}', 'providers-1') ++makeExample('dependency-injection/dart/lib/providers_component.dart','providers-logger') ++includeShared('{ts}', 'providers-2') ++includeShared('{ts}', 'providers-provide-1') +:marked + ### The *Provider* class ++includeShared('{ts}', 'providers-provide-1-1') ++makeExample('dependency-injection/dart/lib/providers_component.dart','providers-1') ++includeShared('{ts}', 'providers-provide-2') ++makeExample('dependency-injection/dart/lib/providers_component.dart','providers-2') +// includeShared('{ts}', 'providers-provide-3') +// includeShared('{ts}', 'providers-provide-4-1') +// Don't discuss provide function. +:marked + We supply two arguments (or more) to the `Provider` constructor. ++includeShared('{ts}', 'providers-provide-4-2') +:marked + The second is a named parameter, such as `useClass`, + that we can think of as a *recipe* for creating the dependency value. + There are many ways to create dependency values... and many ways to write a recipe. ++includeShared('{ts}', 'providers-alternative-1') ++makeExample('dependency-injection/dart/lib/providers_component.dart','providers-4') +.callout.is-helpful + header Dart difference: Constants in metadata + :marked + In Dart, the value of a metadata annotation must be a compile-time constant. + For that reason, we can't call functions to get values + to use within an annotation. + Instead, we use constant literals or constant constructors. + For example, a TypeScript program might use the + function call `provide(Logger, {useClass: BetterLogger})`, + which is equivalent to the TypeScript code + `new Provider(Logger, {useClass: BetterLogger})`. + A Dart annotation would instead use the constant value `const Provider(Logger, useClass: BetterLogger)`. ++includeShared('{ts}', 'providers-alternative-2') ++makeExample('dependency-injection/dart/lib/providers_component.dart','EvenBetterLogger') ++includeShared('{ts}', 'providers-alternative-3') ++makeExample('dependency-injection/dart/lib/providers_component.dart','providers-5')(format=".") ++includeShared('{ts}', 'providers-aliased-1') ++makeExample('dependency-injection/dart/lib/providers_component.dart','providers-6a')(format=".") ++includeShared('{ts}', 'providers-aliased-2') +- var stylePattern = { otl: /(useExisting.*\))/gm }; ++makeExample('dependency-injection/dart/lib/providers_component.dart','providers-6b','', stylePattern)(format=".") + ++includeShared('{ts}', 'providers-value-1') :marked - We're working on the Dart version of this chapter. - In the meantime, please see these resources: + We can provide objects directly, + instead of asking the injector to create an instance of a class, + by specifying a `useValue` parameter to `Provider`. + + Because Dart annotations must be compile-time constants, + `useValue` is often used with string or list literals. + However, `useValue` works with any constant object. + + To create a class that can provide constant objects, + make sure all its instance variables are `final`, + and give it a `const` constructor: + ++makeExample('dependency-injection/dart/lib/app_config.dart','const-class','lib/app_config.dart (excerpt)')(format='.') + +:marked + Create a constant instance of the class by using `const` instead of `new`: + ++makeExample('dependency-injection/dart/lib/app_config.dart','const-object','lib/app_config.dart (excerpt)')(format='.') + +:marked + Then specify the object using the `useValue` argument to `Provider`: + +- var stylePattern = { otl: /(useValue.*\))/gm }; ++makeExample('dependency-injection/dart/lib/providers_component.dart','providers-9','', stylePattern)(format='.') + +:marked + See more `useValue` examples in the + [Non-class dependencies](#non-class-dependencies) and + [OpaqueToken](#opaquetoken) sections. + ++includeShared('{ts}', 'providers-factory-1') ++makeExample('dependency-injection/dart/lib/heroes/hero_service.dart','internals', 'lib/heroes/hero_service.dart (excerpt)')(format='.') ++includeShared('{ts}', 'providers-factory-2') ++makeExample('dependency-injection/dart/lib/heroes/hero_service_provider.dart','factory', 'lib/heroes/hero_service_provider.dart (excerpt)')(format='.') ++includeShared('{ts}', 'providers-factory-3') ++makeExample('dependency-injection/dart/lib/heroes/hero_service_provider.dart','provider', 'lib/heroes/hero_service_provider.dart (excerpt)')(format='.') ++includeShared('{ts}', 'providers-factory-4') ++includeShared('{ts}', 'providers-factory-5') +- var stylePattern = { otl: /(providers.*),$/gm }; ++makeTabs( + `dependency-injection/dart/lib/heroes/heroes_component.dart, + dependency-injection/dart/lib/heroes/heroes_component_1.dart`, + null, + `lib/heroes/heroes_component (v.3), + lib/heroes/heroes_component (v.2)`, + stylePattern) ++includeShared('{ts}', 'tokens-1') ++makeExample('dependency-injection/dart/lib/injector_component.dart','get-hero-service')(format='.') ++includeShared('{ts}', 'tokens-2') +// [PENDING: How about a better name than ProviderComponent8?] ++makeExample('dependency-injection/dart/lib/providers_component.dart','provider-8-ctor')(format=".") ++includeShared('{ts}', 'tokens-3') +.callout.is-helpful + header Dart difference: Interfaces are valid tokens + :marked + In TypeScript, interfaces don't work as provider tokens. + Dart doesn't have this problem; + every class implicitly defines an interface, + so interface names are just class names. ++includeShared('{ts}', 'tokens-non-class-deps-1') +:marked + We know we can register an object with a [value provider](#value-provider). + But what do we use for the token? ++includeShared('{ts}', 'tokens-opaque-1') ++makeExample('dependency-injection/dart/lib/providers_component.dart','opaque-token')(format='.') ++includeShared('{ts}', 'tokens-opaque-2') ++makeExample('dependency-injection/dart/lib/providers_component.dart','use-opaque-token')(format=".") +:marked + Here's an example of providing configuration information + for an injected class. First define the class: ++makeExample('dependency-injection/dart/lib/providers_component.dart','configurable-logger')(format=".") +:marked + Then inject that class and its configuration information: ++makeExample('dependency-injection/dart/lib/providers_component.dart','providers-7')(format=".") + - * [Dependency Injection](/docs/ts/latest/guide/dependency-injection.html): - The TypeScript version of this chapter ++includeShared('{ts}', 'summary') - * [Dart source code](https://github.com/angular/angular.io/tree/master/public/docs/_examples/dependency-injection/dart): - A preliminary version of the example code that will appear in this chapter ++includeShared('{ts}', 'appendix-explicit-injector-1') ++makeExample('dependency-injection/dart/lib/injector_component.dart', 'injector', 'lib/injector_component.dart') ++includeShared('{ts}', 'appendix-explicit-injector-2') diff --git a/public/docs/dart/latest/guide/displaying-data.jade b/public/docs/dart/latest/guide/displaying-data.jade index b69eb829ef..784cc2ef70 100644 --- a/public/docs/dart/latest/guide/displaying-data.jade +++ b/public/docs/dart/latest/guide/displaying-data.jade @@ -43,7 +43,7 @@ figure.image-display In `main.dart`, importing `app_component.dart` lets us implement part of the app in a different Dart file. The QuickStart version of `main.dart` - imported `angular2.dart`, but we don't need that import here because + imported `core.dart`, but we don't need that import here because this version of `main.dart` is so basic: it only bootstraps the app, and doesn't implement any components or other injectable types. diff --git a/public/docs/dart/latest/quickstart.jade b/public/docs/dart/latest/quickstart.jade index 722ae8cfe3..63511ad106 100644 --- a/public/docs/dart/latest/quickstart.jade +++ b/public/docs/dart/latest/quickstart.jade @@ -41,9 +41,9 @@ p. specify the angular2 and browser packages as dependencies, as well as the angular2 transformer. Angular 2 is still changing, so provide an exact version: - 2.0.0-beta.11. + 2.0.0-beta.13.1. - +makeExample('quickstart/dart/ex1/pubspec.yaml', null, 'pubspec.yaml') + +makeExample('quickstart/dart/pubspec.yaml', 'no-rewriter', 'pubspec.yaml') p. In the same directory, create a web directory, and then @@ -71,7 +71,7 @@ p. p. Paste the following code into web/main.dart: - +makeExample('quickstart/dart/ex1/web/main.dart', null, 'web/main.dart') + +makeExample('quickstart/dart/web/main.dart', null, 'web/main.dart') :marked You've just defined an Angular 2 **component**, @@ -106,8 +106,8 @@ p. consist of more components arising in tree-like fashion from this root. The top lines import two libraries. - *All* Dart files that use Angular APIs import `angular2.dart`. - Only files that call `bootstrap()` import `bootstrap.dart`. + *All* Dart files that use Angular APIs import `core.dart`. + Only files that call `bootstrap()` import `platform/browser.dart`. //- ########################## .l-main-section @@ -119,7 +119,7 @@ p. Create a file named web/index.html that contains the following code: - +makeExample('quickstart/dart/ex1/web/index.html', null, 'web/index.html') + +makeExample('quickstart/dart/web/index.html', null, 'web/index.html') :marked The `` tag in the `` is @@ -170,7 +170,7 @@ p. in both the `dependencies` and `transformers` sections. - var stylePattern = { pnk: /(dart_to_js_script_rewriter.*$)|(- dart_to_js_script_rewriter.*$)/gm, otl: /(dependencies:)|(transformers:)/g }; - +makeExample('quickstart/dart/ex2/pubspec.yaml', null, 'pubspec.yaml', stylePattern) + +makeExample('quickstart/dart/pubspec.yaml', null, 'pubspec.yaml', stylePattern) p. Then compile your Dart code to JavaScript, @@ -194,7 +194,7 @@ p. configure the Angular transformer: - var stylePattern = { otl: /(transformers:)|(- angular2:)|(entry_points.*$)/gm }; - +makeExample('quickstart/dart/ex2/pubspec.yaml', null, 'pubspec.yaml', stylePattern) + +makeExample('quickstart/dart/pubspec.yaml', null, 'pubspec.yaml', stylePattern) p. The entry_points item diff --git a/public/docs/js/latest/_data.json b/public/docs/js/latest/_data.json index 8c221c6385..90342c89f3 100644 --- a/public/docs/js/latest/_data.json +++ b/public/docs/js/latest/_data.json @@ -3,7 +3,7 @@ "icon": "home", "title": "Angular Docs", "menuTitle": "Docs Home", - "banner": "Angular 2 is currently in Beta." + "banner": "Welcome to Angular in JavaScript! The current Angular 2 release is beta.14. Please consult the Change Log about recent enhancements, fixes, and breaking changes." }, "quickstart": { @@ -35,10 +35,10 @@ "title": "API Preview", "reference": true }, - + "cheatsheet": { "title": "Angular Cheat Sheet", - "intro": "A quick quide to Angular syntax.", + "intro": "A quick guide to Angular syntax.", "reference": true }, @@ -47,7 +47,7 @@ "intro": "Brief definitions of the most important words in the Angular 2 vocabulary", "reference": true }, - + "resources": { "icon": "play-circle-fill", "title": "Angular Resources", @@ -60,7 +60,7 @@ "title": "Help & Support", "resources": true }, - + "styleguide": { "title": "Docs Style Guide", "intro": "Design & Layout Patterns For Documentation" diff --git a/public/docs/js/latest/cookbook/_data.json b/public/docs/js/latest/cookbook/_data.json index f4bc414f46..a2040caccf 100644 --- a/public/docs/js/latest/cookbook/_data.json +++ b/public/docs/js/latest/cookbook/_data.json @@ -2,17 +2,33 @@ "index": { "title": "Cookbook", "navTitle": "Overview", - "description": "A collection of recipes for common Angular application scenarios" + "intro": "A collection of recipes for common Angular application scenarios" }, - + "a1-a2-quick-reference": { "title": "Angular 1 to 2 Quick Reference", "navTitle": "Angular 1 to 2 Quick Ref", - "description": "Learn how Angular 1 concepts and techniques map to Angular 2" + "intro": "Learn how Angular 1 concepts and techniques map to Angular 2" }, - + "component-communication": { "title": "Component Interaction", - "description": "Share information between different directives and components" + "intro": "Share information between different directives and components" + }, + + "dependency-injection": { + "title": "Dependency Injection", + "intro": "Techniques for Dependency Injection" + }, + + "dynamic-forms": { + "title": "Dynamic Form", + "intro": "Render dynamic forms with NgFormModel" + }, + + "ts-to-js": { + "title": "TypeScript to JavaScript", + "intro": "Convert Angular 2 TypeScript examples into ES5 JavaScript" } -} \ No newline at end of file + +} diff --git a/public/docs/js/latest/cookbook/dependency-injection.jade b/public/docs/js/latest/cookbook/dependency-injection.jade new file mode 100644 index 0000000000..f8df2a84a6 --- /dev/null +++ b/public/docs/js/latest/cookbook/dependency-injection.jade @@ -0,0 +1 @@ +!= partial("../../../_includes/_ts-temp") \ No newline at end of file diff --git a/public/docs/js/latest/cookbook/dynamic-forms.jade b/public/docs/js/latest/cookbook/dynamic-forms.jade new file mode 100644 index 0000000000..f8df2a84a6 --- /dev/null +++ b/public/docs/js/latest/cookbook/dynamic-forms.jade @@ -0,0 +1 @@ +!= partial("../../../_includes/_ts-temp") \ No newline at end of file diff --git a/public/docs/js/latest/cookbook/index.jade b/public/docs/js/latest/cookbook/index.jade index 6778b6af28..a3a1b000b7 100644 --- a/public/docs/js/latest/cookbook/index.jade +++ b/public/docs/js/latest/cookbook/index.jade @@ -1 +1,3 @@ -!= partial("../../../_includes/_ts-temp") +include ../../../../_includes/_util-fns + ++includeShared('../../../ts/latest/cookbook/index.jade', 'cookbook') diff --git a/public/docs/js/latest/cookbook/ts-to-js.jade b/public/docs/js/latest/cookbook/ts-to-js.jade new file mode 100644 index 0000000000..b6cd2843ef --- /dev/null +++ b/public/docs/js/latest/cookbook/ts-to-js.jade @@ -0,0 +1,471 @@ +include ../../../../_includes/_util-fns + +:marked + Everything that we can do in Angular 2 in TypeScript, we can also do + in JavaScript. Translating from one language to the other is mostly a + matter of changing the way we organize our code and the way we access + Angular 2 APIs. + + Since TypeScript is a popular language option in Angular 2, many of the + code examples you see on the Internet as well as on this site are written + in TypeScript. This cookbook contains recipes for translating these kinds of + code examples to ES5, so that they can be applied to Angular 2 JavaScript + applications. + + +:marked + ## Table of contents + + [Modularity: imports and exports](#modularity) + + [Classes and Class Metadata](#class-metadata) + + [Input and Output Metadata](#property-metadata) + + [Dependency Injection](#dependency-injection) + + [Host and Query Metadata](#other-property-metadata) + + **Run and compare the live [TypeScript](/resources/live-examples/cb-ts-to-js/ts/plnkr.html) and + [JavaScript](/resources/live-examples/cb-ts-to-js/js/plnkr.html) code shown in this cookbook.** + +a(id="modularity") +.l-main-section +:marked + ## Importing and Exporting + +- var top="vertical-align:top" +table(width="100%") + col(width="50%") + col(width="50%") + tr + th TypeScript + th ES5 JavaScript + tr(style=top) + td + :marked + ### Importing Angular 2 Code + + In TypeScript code, Angular 2 classes, functions, and other members + are imported with TypeScript `import` statements: + + +makeExample('cb-ts-to-js/ts/app/main.ts', 'ng2import')(format="." ) + + td + :marked + ### Accessing Angular 2 Code through the ng global + + In JavaScript code, when using + [the Angular 2 UMD bundles](https://github.com/angular/angular/blob/master/modules/angular2/docs/bundles/overview.md), + we can access Angular code through the global `ng` object. In the + nested members of this object we'll find everything we would import + from `angular2` in TypeScript: + + +makeExample('cb-ts-to-js/js/app/main.js', 'ng2import')(format="." ) + + tr(style=top) + td + :marked + ### Importing and Exporting Application Code + + Each file in an Angular 2 TypeScript application constitutes a + TypeScript module. When we want to make something from a module available + to other modules, we `export` it. + + +makeExample('cb-ts-to-js/ts/app/hero.component.ts', 'appexport')(format="." ) + + :marked + In other modules we can then `import` things that have been exported + elsewhere. + + +makeExample('cb-ts-to-js/ts/app/main.ts', 'appimport')(format="." ) + + td + :marked + ### Sharing Application Code + + In an Angular 2 JavaScript application, we load each file to the page + using a `` - - **Replace** Step #1 with these two scripts: - -+makeExample('testing/ts/unit-tests-4.html', 'import-angular')(format=".") - :marked ## Add another spec file - **Create** an `init-caps-pipe.spec.ts` next to `init-caps-pipes.ts` in `src/app` + **Create** a `my-uppercase.pipe.spec.ts` in `app/`. **Stop and restart the TypeScript compiler** to ensure we compile the new file. - **Add** the following lines of rather obvious Jasmine test code + **Add** the following lines of rather obvious Jasmine test code. -+makeExample('testing/ts/app/init-caps-pipe.spec.ts', 'base-pipe-spec') ++makeExample('testing/ts/app/my-uppercase.pipe.spec.ts', 'base-pipe-spec', 'app/my-uppercase.pipe.spec.ts') :marked Note that each test is short (one line in our case). @@ -95,7 +77,7 @@ code-example(format="" language="html" escape="html"). Open `unit-tests.html`. Find `System.import('app/hero.spec')`. - Hmm. We can’t just add `System.import('app/init-caps-pipe.spec')`. + Hmm. We can’t just add `System.import('app/my-uppercase.pipe.spec')`. The first `System.import` returns a promise as does this second import. We can’t run any of the Jasmine tests until **both imports are finished**. @@ -106,18 +88,108 @@ code-example(format="" language="html" escape="html"). +makeExample('testing/ts/unit-tests-4.html', 'promise-all')(format=".") :marked - Try it. The browser should refresh and show + We have a pattern for adding new tests. + + In future, when we add a new spec, we add another `System.import('app/some.spec')` to + the array argument passed to `Promise.all`. + + Try it. The browser should refresh and show the following in the console: + +code-example(format="" language="html" escape="html"). + GET http://localhost:8080/app/my-uppercase.pipe.js 404 (Not Found) + +:marked + Our test failed, as expected. We're importing something that doesn't exist and our test fails saying that. All is going according to plan. + +:marked + ## The pipe, if you please + + The test is asking for a pipe, and we shall deliver. + + **Create** a `my-uppercase.pipe.ts` in `app/`. + + **Stop and restart the TypeScript compiler** to ensure we compile the new file. + + **Add** a basic pipe that doesn't do anything. We know how to make strings uppercase, but we since we're letting the test take the lead let's wait for it to tell us what's next. Maybe it'll surprise us. + ++makeExample('testing/ts/app/my-uppercase.pipe.1.ts', null, 'app/my-uppercase.pipe.ts') + +:marked + Reload our test page and... + +code-example(format="" language="html" escape="html"). + GET http://localhost:8080/angular2/core 404 (Not Found) + +:marked + ## The Angular library, if you please + Looking back at `unit-tests.html` we realize that we have not loaded the Angular library. + Yet we were able to load and test the application’s `Hero` interface. + + **We were lucky!** The `Hero` interface has no dependence on Angular. + If it had depended on Angular, we’d still be staring at the Jasmine “big-time fail” screen: figure.image-display - img(src='/resources/images/devguide/testing-an-angular-pipe/5-specs-0-failures.png' - style="width:400px;" alt="import promises 5 specs, 0 failures") + img(src='/resources/images/devguide/testing-an-angular-pipe/big-time-fail-screen.png' + alt="Jasmine's' big time fail screen") :marked - We have a pattern for adding new tests. + We are writing an Angular application after all and + we were going to need Angular sooner or later. That time has come. - In future, when we add a new spec, we add another `System.import('app/some.spec')` to - the array argument passed to `Promise.all`. + `MyUppercasePipe` depends on Angular as is clear in the first few lines: + ++makeExample('testing/ts/app/my-uppercase.pipe.ts', 'depends-on-angular')(format=".") + +:marked + **Open** `unit-tests.html` + **Find** the `` comment. + + **Replace** the scripts tags beneath it with the all the needed angular scripts: + ++makeExample('testing/ts/unit-tests-5.html', 'import-angular')(format=".") + +:marked + We should now be ready to see our 3 expectations fail when reloading our test page. + +figure.image-display + img(src='/resources/images/devguide/testing-an-angular-pipe/two-failures.png' alt="2 failed tests") + +:marked + ## Uppercase, if you please + + The first two tests that passed were our old `hero` interface tests, so it makes sense that those passed. Of our three new expectations, one still passed though. + + ``` + MyUppercasePipe + transforms "abc" to "ABC" + transforms "abc def" to "ABC DEF" + leaves "ABC DEF" unchanged + ``` + + Ah but of course! Our simple pipe doesn't transform the input at all, and the third test expected + input to not be changed. + + All we have to do now is actually transform text to uppercase in our pipe. + ++makeExample('testing/ts/app/my-uppercase.pipe.ts', 'uppercase')(format=".") + +:marked + Are we done now? + +figure.image-display + img(src='/resources/images/devguide/testing-an-angular-pipe/zero-failures.png' alt="0 failed tests") + +:marked + The glorious green is back with us again! + + We tried a bit of test driven development and it seems to have guided us to success. + + But it's not always feasible. For instance, sometimes we need to write tests for existing functionality, like what we're about to do with the rest of Tour of Heroes. + + If we are writing new code though, writing tests might just be what we need to help us track our progress and keep the end result in sight at all times. + +:marked ## What’s Next? Now we can test parts of our application that we *load* asynchronously with system.js. diff --git a/public/docs/ts/latest/tutorial/_data.json b/public/docs/ts/latest/tutorial/_data.json index 28d02b2ccb..7af60e1992 100644 --- a/public/docs/ts/latest/tutorial/_data.json +++ b/public/docs/ts/latest/tutorial/_data.json @@ -29,5 +29,10 @@ "title": "Routing", "intro": "We add the Angular Component Router and learn to navigate among the views", "nextable": true + }, + "toh-pt6": { + "title": "Http", + "intro": "We load heroes using http", + "nextable": false } } \ No newline at end of file diff --git a/public/docs/ts/latest/tutorial/toh-pt1.jade b/public/docs/ts/latest/tutorial/toh-pt1.jade index 0cc7b6271c..8c7f75d9d9 100644 --- a/public/docs/ts/latest/tutorial/toh-pt1.jade +++ b/public/docs/ts/latest/tutorial/toh-pt1.jade @@ -66,31 +66,15 @@ code-example(format="" language="bash"). ### Hero object At the moment, our hero is just a name. Our hero needs more properties. - Let's convert the `hero` from a literal string to an interface. + Let's convert the `hero` from a literal string to a class. - Create a `Hero` interface with `id` and `name` properties. + Create a `Hero` class with `id` and `name` properties. For now put this near the top of the `app.component.ts` file, just below the import statement. -+makeExample('toh-1/ts/app/app.component.ts', 'hero-interface-1', 'app.component.ts (Hero interface)')(format=".") - -.l-sub-section - :marked - #### Interface or Class? - Why a `Hero` interface and not a `Hero` class? - We want a strongly typed `Hero`. We get strong typing with either option. - Our choice depends on how we intend to use the `Hero`. - - If we need a `Hero` that goes beyond simple properties, a `Hero` with logic and behavior, - we must define a class. - If we only need type checking, the interface is sufficient and lighter weight. - - Lighter weight? Transpiling a class to JavaScript produces code. - Transpiling an interface produces — nothing. - If the class does nothing (and there is nothing for a `Hero` class to do right now), - we prefer an interface. ++makeExample('toh-1/ts/app/app.component.ts', 'hero-class-1', 'app.component.ts (Hero class)')(format=".") :marked - Now that we have a `Hero` interface, let’s refactor our component’s `hero` property to be of type `Hero`. + Now that we have a `Hero` class, let’s refactor our component’s `hero` property to be of type `Hero`. Then initialize it with an id of `1` and the name, "Windstorm". +makeExample('toh-1/ts-snippets/app.component.snippets.pt1.ts', 'hero-property-1', 'app.component.ts (Hero property)')(format=".") diff --git a/public/docs/ts/latest/tutorial/toh-pt2.jade b/public/docs/ts/latest/tutorial/toh-pt2.jade index c39fe9fed4..b9fd02530a 100644 --- a/public/docs/ts/latest/tutorial/toh-pt2.jade +++ b/public/docs/ts/latest/tutorial/toh-pt2.jade @@ -51,13 +51,13 @@ code-example(format="." language="bash"). +makeExample('toh-2/ts/app/app.component.ts', 'hero-array', 'app.component.ts (Hero array)') :marked - The `HEROES` array is of type `Hero`, the interface defined in part one, + The `HEROES` array is of type `Hero`, the class defined in part one, to create an array of heroes. We aspire to fetch this list of heroes from a web service, but let’s take small steps first and display mock heroes. ### Exposing heroes - Let’s create a public property in `AppComponent` that exposes the heroes for binding. + Let’s create a property in `AppComponent` that exposes the heroes for binding. +makeExample('toh-2/ts-snippets/app.component.snippets.pt2.ts', 'hero-array-1', 'app.component.ts (Hero array property)') diff --git a/public/docs/ts/latest/tutorial/toh-pt3.jade b/public/docs/ts/latest/tutorial/toh-pt3.jade index 7f63a49c6c..fd105d8ddc 100644 --- a/public/docs/ts/latest/tutorial/toh-pt3.jade +++ b/public/docs/ts/latest/tutorial/toh-pt3.jade @@ -73,14 +73,13 @@ code-example(format="." language="bash"). :marked --> :marked - We begin by importing the `Component` function from Angular so that we have it handy when we create - the metadata for our component. - + We begin by importing the `Component` and `Input` decorators from Angular because we're going to need them soon. + We create metadata with the `@Component` decorator where we specify the selector name that identifies this component's element. Then we export the class to make it available to other components. - When we finish here, we'll import it into `AppComponent` and refer to its `` element. + When we finish here, we'll import it into `AppComponent` and create a corresponding `` element. :marked #### Hero Detail Template At the moment, the *Heroes* and *Hero Detail* views are combined in one template in `AppComponent`. @@ -100,18 +99,18 @@ code-example(format="." language="bash"). Let’s add that `hero` property we were talking about to the component class. +makeExample('toh-3/ts/app/hero-detail.component.ts', 'hero') :marked - Uh oh. We declared the `hero` property as type `Hero` but our `Hero` interface is over in the `app.component.ts` file. - We have two components, each in their own file, that need to reference the `Hero` interface. + Uh oh. We declared the `hero` property as type `Hero` but our `Hero` class is over in the `app.component.ts` file. + We have two components, each in their own file, that need to reference the `Hero` class. - We solve the problem by relocating the `Hero` interface from `app.component.ts` to its own `hero.ts` file. + We solve the problem by relocating the `Hero` class from `app.component.ts` to its own `hero.ts` file. -+makeExample('toh-3/ts/app/hero.ts', null, 'hero.ts (Exported Hero interface)')(format=".") ++makeExample('toh-3/ts/app/hero.ts', null, 'hero.ts (Exported Hero class)')(format=".") :marked - We export the `Hero` interface from `hero.ts` because we'll need to reference it in both component files. + We export the `Hero` class from `hero.ts` because we'll need to reference it in both component files. Add the following import statement near the top of both `app.component.ts` and `hero-detail.component.ts`. -+makeExample('toh-3/ts/app/hero-detail.component.ts', 'hero-import', 'hero-detail.component.ts and app.component.ts (Import the Hero interface)') ++makeExample('toh-3/ts/app/hero-detail.component.ts', 'hero-import', 'hero-detail.component.ts and app.component.ts (Import the Hero class)') :marked #### The *hero* property is an ***input*** @@ -137,14 +136,13 @@ code-example(format="."). *source* properties do not. :marked There are a couple of ways we can declare that `hero` is an *input*. - We'll do it by adding an `inputs` array to the `@Component` metadata. -+makeExample('toh-3/ts/app/hero-detail.component.ts', 'inputs') + We'll do it the way we *prefer*, by annotating the `hero` property with the `@Input` decorator that we imported earlier. ++makeExample('toh-3/ts/app/hero-detail.component.ts', 'hero-input')(format='.') .l-sub-section :marked - Learn about the `@Input()` decorator way in the + Learn more about the `@Input()` decorator in the [Attribute Directives](../guide/attribute-directives.html#input) chapter. -:marked .l-main-section :marked diff --git a/public/docs/ts/latest/tutorial/toh-pt4.jade b/public/docs/ts/latest/tutorial/toh-pt4.jade index 8400519f85..69d16d7adf 100644 --- a/public/docs/ts/latest/tutorial/toh-pt4.jade +++ b/public/docs/ts/latest/tutorial/toh-pt4.jade @@ -113,7 +113,7 @@ code-example(format="." language="bash"). We'll move the mock data to its own file. Cut the `HEROES` array from `app.component.ts` and paste it to a new file in the `app` folder named `mock-heroes.ts`. - We copy the `import {Hero} ...` statement as well because the heroes array uses the `Hero` interface. + We copy the `import {Hero} ...` statement as well because the heroes array uses the `Hero` class. +makeExample('toh-4/ts/app/mock-heroes.ts', null, 'mock-heroes.ts (Heroes array)') :marked @@ -384,7 +384,7 @@ code-example(format="." language="html"). Like `getHeroes`, it also returns a promise. But this promise waits 2 seconds before resolving the promise with mock heroes. - Back in the `AppComponent`, swap `_heroService.getHeroesSlowly` for `_heroService.getHeroes` + Back in the `AppComponent`, replace `_heroService.getHeroes` with `_heroService.getHeroesSlowly` and see how the app behaves. .l-main-section diff --git a/public/docs/ts/latest/tutorial/toh-pt6.jade b/public/docs/ts/latest/tutorial/toh-pt6.jade new file mode 100644 index 0000000000..eb16023ee7 --- /dev/null +++ b/public/docs/ts/latest/tutorial/toh-pt6.jade @@ -0,0 +1,233 @@ +include ../_util-fns + +:marked + # Http + + Our application has become a huge success and our stakeholders have already expanded the vision to include integration with a hero api. + + The current solution limits us to a fixed set of heroes, but integration with the api will allow us to load heroes dynamically from a database. We will also be able to add, edit and delete heroes. + + In this chapter we will show how to integrate the http based api with our existing application. +:marked + [Run the live example](/resources/live-examples/toh-6/ts/plnkr.html). + +.l-main-section +:marked + ## Where We Left Off + Before we continue with our Tour of Heroes, let’s verify that we have the following structure after adding our hero service + and hero detail component. If not, we’ll need to go back and follow the previous chapters. + +.filetree + .file angular2-tour-of-heroes + .children + .file app + .children + .file app.component.ts + .file app.component.css + .file dashboard.component.css + .file dashboard.component.html + .file dashboard.component.ts + .file hero.ts + .file hero-detail.component.css + .file hero-detail.component.html + .file hero-detail.component.ts + .file hero.service.ts + .file heroes.component.css + .file heroes.component.html + .file heroes.component.ts + .file main.ts + .file mock-heroes.ts + .file node_modules ... + .file typings ... + .file index.html + .file package.json + .file styles.css + .file tsconfig.json + .file typings.json +:marked + ### Keep the app transpiling and running + Open a terminal/console window and enter the following command to + start the TypeScript compiler, start the server, and watch for changes: + +code-example(format="." language="bash"). + npm start + +:marked + The application runs and updates automatically as we continue to build the Tour of Heroes. + +:marked + ## Heroes and Http + + Let's look back at our `HeroService` implementation in the services chapter. Specifically let's revisit the point we made about using promises when loading heroes. + + Wrapping a simple constant in a promise might have seemed like overkill at the time, but we will show why this was an important first step towards moving to `Http`. + + Let's get started by converting `getHeroes()` to use `Http`. + ++makeExample('toh-6/ts/app/hero.service.ts', 'get-heroes', 'hero.service.ts (getHeroes using Http)')(format=".") + +:marked + ### Http Promise + + In our previous implementation we created a promise ourselves and resolved it immediately. When using `Http` we no longer have to create the promise manually. Instead `Http` will create it for us, but we have to call `toPromise()` to get it. + + In the first `then` we convert the response to a json object by calling `res.json()`. + + Our api follows the convention of returning the result wrapped in a `data` property, but we don't want to expose this to the caller, so we flatten the response in the second `then` by returning `res.data`. + +:marked + ### Error Handling + + At the end we are calling `catch` and passing in an error handler. This is an important step since it allows us to catch any error returned by the api. ++makeExample('toh-6/ts/app/hero.service.ts', 'error-handler', 'hero.service.ts (Error handler)')(format=".") + +:marked + ### Promises are Promises + Even though we made significant internal changes to `getHeroes()`, the public signature did not change. Like before we are returning a promise, so the callers of `getHeroes()` will not need to be updated. + +.l-sub-section + :marked + We want to point out that a promise is not the only way to process http calls. We will encounter other approaches such as Observables in subsequent chapters, but for the purposes of this article we are sticking to promises. + +:marked + ## Add, Edit, Delete + + Our stakeholders are incredibly pleased with the added flexibility from the api integration, but it doesn't stop there. Next we want to add the capability to add, edit and delete heroes. + + In this section we will show how to implement http `post`, `put` and `delete` calls in `HeroService` to meet our new requirements. + +:marked + ### Post + + We are using `post` to add new `Hero` objects to our database. Post requests require a little bit more setup than Get requests, but the format is as follows: + ++makeExample('toh-6/ts/app/hero.service.ts', 'post-hero', 'hero.service.ts (post hero)')(format=".") + +:marked + First we create a header and set the content type to `application/json`. Before posting we have to call `JSON.stringify` to convert the hero object to a string. + + ### Put + + `Put` is used to edit a specific hero, but the structure is very similar to a `post` request. The only difference is that we have to change the url slightly by appending the id of the hero we want to edit. + ++makeExample('toh-6/ts/app/hero.service.ts', 'put-hero', 'hero.service.ts (put hero)')(format=".") + +:marked + ### Delete + `delete` is used to delete heroes and the format is identical to `put` except for the function name. + ++makeExample('toh-6/ts/app/hero.service.ts', 'delete-hero', 'hero.service.ts (delete hero)')(format=".") + +:marked + In all three cases we add a `catch` for error handling. + + After these additions our `HeroService` looks like this: + ++makeExample('toh-6/ts/app/hero.service.ts', null, 'hero.service.ts')(format=".") + +:marked + ## Updating Components + + Loading heroes using `Http` required no changes outside of `HeroService`, but we added a few new features as well. In the following section we will update our components to use our new methods to add, edit and delete heroes. + + ### Add/Edit + We already have `HeroDetailComponent` for viewing details about a specific hero. Add and Edit are natural extensions of the detail view, so we are able to reuse `DetailHeroComponent` with a few tweaks. The original component was created to render existing data, but to add new data we have to initialize the `hero` property to an empty `Hero` object. + ++makeExample('toh-6/ts/app/hero-detail.component.ts', 'ngOnInit', 'hero-detail.component.ts (ngOnInit)')(format=".") + +:marked + In order to differentiate between add and edit we are adding a check to see if an id is passed in the url. If the id is absent we bind `HeroDetailComponent` to an empty `Hero` object. In either case, any edits made through the UI will be bound back to the same `hero` property. + + The next step is to add a save method to `HeroDetailComponent` and call the corresponding save method in `HeroesService`. + ++makeExample('toh-6/ts/app/hero-detail.component.ts', 'save', 'hero-detail.component.ts (save)')(format=".") + +:marked + The same save method is used for both add end edit since `HeroService` will know when to call `post` vs `put` based on the state of the `Hero` object. + + We mentioned earlier that `save()` returns a promise, so when the promise resolves, we call `emit` to notify `HeroesComponent` that we just added or modified a hero. `HeroesComponent` is listening for this notification and will refresh the list of heroes to include our recent updates. + +.l-sub-section + :marked + The `emit` "handshake" between `HeroDetailComponent` and `HeroesComponent` is an example of component to component communication. This is a topic for another day, but we have detailed information in our Component Interaction Cookbook + +:marked + Here is `HeroDetailComponent` with the added save button. + +figure.image-display + img(src='/resources/images/devguide/toh/hero-details-save-button.png' alt="Hero Details With Save Button") + +:marked + ### Delete + + We have added the option to delete hereos from `HeroesComponent`. `HeroService` will delete the hero, but we have to filter out the deleted hero from the list to update the view. + ++makeExample('toh-6/ts/app/heroes.component.ts', 'delete', 'heroes.component.ts (delete)')(format=".") + +:marked + Here is `HeroesComponent` with the delete button. + +figure.image-display + img(src='/resources/images/devguide/toh/heroes-list-delete-button.png' alt="Heroes List With Delete Button") + +:marked + ## Integration with Http + + `Http` is not part of Angular core, but exists as a separate add-on module called `angular2/http`. It ships as a separate bundle, so we have to include the bundle in `index.html`. + ++makeExample('toh-6/ts/index.html', 'http', 'index.html (http)')(format=".") + +:marked + The only other thing we have to do is import `HTTP_PROVIDERS` from `angular2/http` and register it in our root component's provider array. + ### Simulating the api + + Our hero api is not deployed to production yet, but for the purposes of this chapter we have decided to integrate with an in-memory web api simulator. Configuring the simulator requires a few extra steps, but we offer detailed documentation here. Keep in mind, the steps to configure the simulator are not required when integrating with a real http api. + + Since we are integrating with the simulator we no longer need `mock-heroes.ts` to load heroes, so it's safe to delete it. + +:marked + ### Review the App Structure + Let’s verify that we have the following structure after all of our good refactoring in this chapter: + +.filetree + .file angular2-tour-of-heroes + .children + .file app + .children + .file app.component.ts + .file app.component.css + .file dashboard.component.css + .file dashboard.component.html + .file dashboard.component.ts + .file hero.ts + .file hero-detail.component.css + .file hero-detail.component.html + .file hero-detail.component.ts + .file hero.service.ts + .file heroes.component.css + .file heroes.component.html + .file heroes.component.ts + .file main.ts + .file hero-data.ts + .file node_modules ... + .file typings ... + .file index.html + .file package.json + .file styles.css + .file sample.css + .file tsconfig.json + .file typings.json + +:marked + +.l-main-section +:marked + ## Recap + + ### The Road Behind + We travelled a great distance in this chapter. + - We add the necessary dependencies to use Http in our application. + - We refactored HeroService to load heroes from a database. + - We extended HeroService to support post, put and delete calls. + - We updated our components to allow adding, editing and deleting of heroes. + - We configured an in-memory api simulator. diff --git a/public/resources/images/bios/deborah.jpg b/public/resources/images/bios/deborah.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b5a7b3cf2d6f1dd696b28de6b092cc9e845ebfe GIT binary patch literal 16116 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 AZU6uP literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/alice.png b/public/resources/images/cookbooks/dependency-injection/alice.png new file mode 100644 index 0000000000000000000000000000000000000000..48d311b37fe5fc38a7a6d9fb3234d351d78b5cfb GIT binary patch literal 46898 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ð_ZfzQ%O;8WOjZZ9d#E#0 zvn8n4`*=O64JY{y9{Y#%Sa zJR8RH(_q}V9>$8~9@U!s#hO+-Oj3S6rAja#f1<~YT0Zvk+mdODo0@v&Nh_i~KNHwU zyqym*NdMca%ARbg=*~66V(r$>z}Sj87ZfzbsbCQQwb**|Ncba3;zz7}YgbpR&jA}l zhh2)YZ5*(LPatsT+vhS(9`QLvV1FR!PWz-I@(KFw-=ZD#qi=+gbT!e$q$(U2s7bRm z%^{z_?X3-G)VHbk0;&ls$$r2j=y}Sb!sIM{*jh1D9P84zfs-_+u&g{0^6m|fBlG=- zL?)ZdcfOdl<+{<~F>IWMAy>p5>6(n}w=bif@M!|Tw8a0m!4h*{69~HPhgCl3JVCpu zqE>Bth>j+lQJB1y+$E6$MD`z^ygMv52a~x%^QRKuHjW| z1W22a*X(pVw-4JnQ=&U5%;t7pkdNdW(bxD*(A^pAHXb>czSLJH`BNjV!spJC649Nmi7GsCN*`Bv6Jot!P-iEG6?pn2Y8-81!q~h2@^O_CxnY*C-`{=Dcvi#6Ln) zMUM@^!EP0d3JsJl2$1FESiOD-x^{M>tSc29Z_O}Wod`(vL6+IgT_ItpJ#U4DzJp{2 zp;`!K%F70_h-||LAaJg|gw7-OZu^QNGnW_U3&R&?R}1W$rw5%$86Ub9ua|`by{`Gk z+ej!{m}b)^M+_ky#4_GlI=qs$iof5>QRjoz`KnteFW2>~XhsqI14d1e*`2)zRZGZ2 zjw{|5lyQT2`zgyQLU-2-rXmxpPNoCA`_{hf7X7FkT(89H^NOw0iD=^<1)Q_p3ZyO!_wroiUqK5o}WLt?%XH| z#4z6!0~^d-<}?}9ECaYf!C9EOwl3nrs8yuuE8zYDZ{iEij~D~P zW$%*r4|ZZ3r~eEG=W`OMsUM75hS%{+^;XCnivg~(#En2icP+D)@ESR3iVkYI&}Nvg zrbx>l5gs0@RH5>D*O4!IsA9p)QaJIY|K*pUyY`Lqg^w`tIrq#gdf8}eh!Xs@d|fb~ z%%#wfV{7A-f%YqUM)W4 zCWqwIAX52)mLD=KRC|the+GdqG!!}VM!=@Bu3wSrj5r`EA{^ps=jCKZZ){IOK8uzo zz~H~RWn~3jbylgepOHi;j1WFh(=9y4*%)B5k8HQy^Z6i6pYeKGiyV^whY_@SN}^FP zJw2y9wXJY}&v{V^a49isNBWmY9X$-A>ABQ{gcXn=%}(kYr)Sab-7`XI#fL^3vT@cB z*zbpZq{BL3`_;o*XL}>LhElXG7uRFz5GMorY||?+F1& z=}S*z>6SehUU-00cravIx9KS{Ew+LHwW69=b?Wnrg$C*$&dlBXHraD2_`>GX<}Q}Z z$yGi1n~zoKY)(l@2S*p&U#0$E zT$?DGpNR{KhZSwx@ruse7p~?RWfBx8N{W!y3@crzpL}hUACWSYGu1`!{1B~IW)Rgs z=J_UW*LLY9OVIb4Y5l$^vraL+HVp7e4dSK z;Us}P(b40+bYl9=0~Cv}1g^o{R?Q}l35T#qur)REN)sC$`*S&fuaWPiOa_R8rhOgb zDx4VYAA3B7>lIWul`7x{ajSgp*n-s`&Elxfh`jpLJF`QJ^X)=vdaCo-i}c$CH=@}5 z=wbXiIVq}ubh8MQWX)W{>19S@-@uZa369t39+{Il?4yR4zB>cb+=qf$tWD{WC9| zJ~Y?)Q=|9-XH^JwYyV1-eG{e5G(kuBV%K6*=J4g9MPb*K-?s+uq?vh*-}uFjj&QX6 z{!(!vo3KbUcIfVe2C56ThEOD3QTFgpg zsd{9!_vV9Rh|E{rbmmW%N|`9J(cPuqnqWk5V{t5|iZQnUKGhWXlN-+ZK1oLhiB&NM^**hMN@8~B4!^}d$GuD<8maVv1di% z8E9>muOHv%p*|9io0o7)7iJJR)5py7axy;thW) zO3mwiaOJ4tw@nEx|IC!31eNZ>DPLj{WZY^mMfae;lEo(8ZN3O+?R?L0TXS8>U))+J zN@g}(q@C_1>!8a+ICnxM0fix5J$DL5%a}sAs^KL(cd5*YJxlpZl*YX;QR?wgYRl!t ziiVE-D)0kj^-6iMyt~hVX!SC83Fw74jmnTE&7;h}kFM2r?Vx;-HuCO`@gN%Mw3JF3 z8V$7vA{C5jlN!E`A;waX73L-{GDY51b(auMN#o7MfZ!uM+@Z+hSt3GiQXS^_NL{8w&NB+K% zd*lVQw%)gDkILaX6n;$pyNifuX%b%EI2Zj1mgjh68?gx*-7nlA(Te=F zK|?0M>s}5r5Uae{tF=P>xg>Dqv}>Y%0v*k-#j!WY8S5qKJ>-G_=fhE$*hzUgij|7TJSdOevPO;z%d7n?UfnTf*9e2;3r`oxVi#G9=l< zW7Kl$rIaFHSsVxyqvXfSakLym%k_O7vE7T-?!!X{R?;$=$6S(38dsEMXnJ~WD5U~{ zk1ZBIOtgS4;U+z49E-82;+sx%$9`3)PBo&k;fjsQH+mUWrJB&Ur~S-}0}wWg!mP1P zCUmS*Z*gSld+KShKmyrRK%iR$b;5kXixa8*Of!!s`BkN)<6Ab@b1y&&ZR?o$D8+)i zGOgzAoV8}3qTvOU?c2>1q2i7{`c`jM61@>%03fcq5?UpK)0HCVOUUxXD54l$1bvsg z{o0)5MgkU;2zuPL_inW#AauC0w4K0Ao(o<|VlXMk%V2$eAQ?&{3I-Sw9GmUQ<)4h*mA%Y~Fk&=;4UTI->OzQ{;cV>yc@feWkjzb1Zo=AQVu(*z@q zPa*Ka({oKqyZM+O3EvOJue~^KCH+ZclTb?|J0)Jp%NP&1l}tE0mri{%zWNRU$I2=} zhCl&ra_zZhm!YkBeDB)9)Q-xryWV8v!^F~OI*yIRV67-YzrB8m_b}Oy>mF1=Bfz~- z9I?~-fFRrBF7#`6KbJ&(vmjfz&bN`HbAERSc_V#VkC|hQSg`fj!X0(}YxCwL3)nk% zzdkk#gRqYv6h0$PD6hjnbKI9GMf{-*D8$5M$odSYsQ&DUiF*f@?Ozqmw4@YEqJG+e^)b!4O#O{uH`&VTqh!QMp?&k7|^flM0Nf}Hc&P%tR z!l3>kWbw>0_0W}K>=1hh-P6A-=bKEXX&HQu4fu=cOK}^Brau9Zb|M3#JoFyC8}5yd zQj)q_KAMu&b8848`OY6+Xc^Q~CW6qoNdvx0dgDGOGF^MW#8;9tRXX_*_RIRd_~^=C zAFeE}s`y+t47&C@?X%`1D}8RF7i+j_F5`deSVGl%c`QvHAxo zNeV%Zcm>7t6DxIPYxn^Cdw2~d{S+|ufcaX@$%5PVF#yKx9S;i%50?LZv@=?A%d_;> z<9@}!NA9)AI6}5uF`by~4&7^a#7}DFP8WNT`==N4Bk@*r;l(*hqzNfPN+e!&uJ%>3 zg+8P2q%uIZ)JjU{yRjA}9o5{A$h3lqs4&K1O;mE63jcK$!2a#J$BK?H07Syo;Uh=S z;IF5)+Fs;Ez5yk^jJGx}j=^}4b_if*=&A6eybtL)f^bz5w+5FXvCMRHet5L@y4%o|B@)<&w2J;P z4;~cyY%TZ(bH?_r?Ihyl2x-`d93%As;f>F)X*UmyHfu34KVIis>W`oquH~S%HZ_610weyn;^AYk_`?Ptj+vBKYiam8j03w zb0bU#4Vdks?IJ-+XYp0G|LMhqT0(QcJTTsgVel$qmEhBdj=sDYr!lpxBPGr@$r~yf z_3ja?lB^P+F^@v(RIIW@mVYp9Fc6d2PO9#U2{1liOL$R4+ z2Hyw!lqT6>l{Z7I%r6qb34$Iv3h1^5N{RNw^fYR8yH!ZK`GMZzLx%STihg$1M&~SkW-EugS{PBY(_>F_1bO=zQ0XJ zt&d#d#L@NYGNj)G+CBQ*Elh5rS9=9>WH9RcYE;FFS2eaWXo(bKOsSBhv~l#ceoks( zOg(WH_0m5w%T!7QxO>eW!`)Ue>D-p{zG*ZlKC{Tx5%FqJ=o!q%`+H8JG7>g%TOeRB z5T-7X#j)vfXm#|cU0sxs;N(T7I*SUa^O?zN{X|SiI#lL8GN8r8-On|QD@l6Fzh?Wy zwVC_J%t}Ym`(xD@3XX?wv|TNx31S3oRD>b{Irl-!r{2&OCiv$FJQ)_fcOwxs>z5GsF0F1c5^(~Rxu&}Nfys~VWe{+v@tDA&DvyE$5JjeX)@|DlN#Rfvd~dP9bJZ%kpdwwzCn&jCkugu^)eJy zZ`vb_aT4s3Z@FsrLiI||bZ@H7y)5nX1|prB{#W`f!K&&5g(RP%0DQh0XEuPpw}}jZ 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 a$wuJL@m`6|$O{krs472KDuKNI@V@}2{HKcm literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/date-logger-entry.png b/public/resources/images/cookbooks/dependency-injection/date-logger-entry.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7c9953c3458545d1426921c636e6ab6d2e91f2 GIT binary patch literal 10087 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 literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/hero-bios-and-contacts.png b/public/resources/images/cookbooks/dependency-injection/hero-bios-and-contacts.png new file mode 100644 index 0000000000000000000000000000000000000000..9b196cbd0bfe0abb835b1fd094e9538e5a1f9368 GIT binary patch literal 29600 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 SPA;NUvYuvZb#}_i?f(Y(pnuo^ literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/hero-bios.png b/public/resources/images/cookbooks/dependency-injection/hero-bios.png new file mode 100644 index 0000000000000000000000000000000000000000..df3fd2140db87f77c84b5e79d5cc136f8ea37eb6 GIT binary patch literal 16720 zcmch9c{rA9+pi``l29mPnM$cBnPm!@Ql@0c9GQ}NtdLNdD#?@~^avrzoFtjckYoy( zr-aPx-@V@V`;O!NXYc*T{`NYKb*#0Xp5eZ)`@GKcH(e{}f||lE%KemNWMsRP6y+}B zpVee!n>bHoX4Na=B`PPpBxiop)X~bp$;#f2jBW?VA-qmWye@0+;O=N;dCiIJ z)$V#xyh{DgtB&Tz#9P^&tZdE6PA}}32)#@$~G>=K*OKOUp9B=!NT9V@bNJTm{BMxDa9&M zR5ZqkY0w97$lkpw6jQ7+t2J&DSv@fN$I#15eA~8dAFHbsN(~JRRJFABR^Huph?{#T z!Ny~!$u(%aktlXoP)EbqrNb;+CR=`eujK0_w}7B8t0#I5hDv%^sfxu zo#!@V67N35#Ogh#k(-yd>2pJa`Rd|~0AsV|vbKMvb$&!bLU!PmpRqR^IcS4^*9$hi zw(ph9&CR_)A22geE$Fkln4Oc~e5PucI*>%N`SB(wRC4*=vuFDwA|sike8exMsd4f1 zQwx7vbMFu0VH9>?m!bHUWuUCBz3=8wJ;$+Q4^mUPwO{F0e9OGDW9#N$gM%mC|CkYX z&}J=>>~c6*#>C`caMFmB3`LLUv;^K&?Y+>g;Nc-kcKhtD)7QWKuHi}e(%LF#ZGB|m z(*x7mM~9b1$y&dC`-A0reREjtL*I!~&jpL-6s7x&CpU)-Ubzt){?K$;oK0Knag>oy zw0y|EuRngA-&kL}AsSaQ*Q~tSx7+u5X67zoq12ZzU-mVe={1`lYnvNu3wifW_?0$a zTU(p>;!nSlrJmLY};uaH& zk@Q}^U|`UY94cA+?DX};^6~x61&XbG{PdJFE4>?Ko$K#t?)>&?dR{j<@`sCP^ zPv%hupLYBF-a<=DdqL|lu{y(28`1gK+XcLr=hByYeO4x8eb<++J-bVDr+i~=npwor z-+gxIq(wbry@lZ952R`JCYJ`Fv++Bnx9rZ(;JUUg2|K1-<;rpuQv z-%VH>Ne*576{-HN@9u%8Cr!zz1N|=Wer$fB>^}HdXAyr$ytwjrGC4Ol!f3Uh;Xacf zIaxtx!Ts+4Ph!g;afb zW7VRls7UtSMo7@EOW4uTQMcSjBJqOahKiaRHEv4e?bXN~_|}IkVvG_Vr;^V-XwJUH z#mVW=?c8oG5dHn#jYA|-yb~8Q_4baA4voo%#zt;Ns$8260qg76i`Vpd=}pGJWty3r z-xz%n)$bsD%T%X`zj#6bzx4gJ@s^6KG%*cWtnOmhO9loHQmy7jzWQxvb-UGRU%qy~ z*tgj?J6$la!D8Uk0sCL8vrW?iiPZzfJtgkT)7W3w2BlXVS6_5D+Nr9jP~ARzb~==Y zi%Wh|&eqn}$;l}!DyscOQ~a}M=PzEQ&Ck!j_ROVOxw_P2zCWsb)x7nVI3v|XP0f!j z>QW7L$II(W7kWAeKeJMiTV1=xE+$r7w?-3KDQ#!R&&9>H)lZsy*M2!;V-8%HP=-!6 zHy>X}_#p)Wv(Gf-RE)Qhc<)X|mPI$Z(I56_XQnpI*HcnanaG{x=Hd!}_AI!~x@~2E zXXJy|AGOrZmn%C{4W)=U;mtAtF&3aI*cZvE;w^O9gPPJ<3y3wuV&QsqA|{z2GVq>hHhRM(Du&{JcRUH46*NoBaHfSKr^V zbM3igEEIzsDtB;?H<^!kOv5=WnO#AQA}8(MW<^e!n>Pi6f`U8_jE{{mqU}U-t0v)c zNu(o&-t$_Li$Axds>P99nO@ij3YO`a=jietJ(`lA|M=LIx6iGft@k9#2D<$US8yB8 zEKn0Q#D#H7NhR2JzSYptNh|Mh=PAaQZQ4Q}JJY?0hx(9NL`GX%JIaoZd1v)=X}|QW zEQ{%$QVq+O{rx7jb#W(DO!-DT z`|dX}$DL`_&Ngf?+E~_k787%rm-jg?YOpS9U}2^3_lKQ19X5Bx)KEI@2Cgh%uzvH@4llabu#pIBGAS_6eKsC)R4e)S#SR-xxUO-F49a{iI8t$Gmly-I;bHUkSCe zyt-lRZZtcQD+P9gFVo`te_YSz;^W&HRafOXU8;b|){?4j&m?hq4*~+5+ zsWg`O^y$+_jml!tjKU%#Z>GjvTs}TuIHk|U!*jFOdtnA&G&5B^-Q3gju)`)*JwdWQ zPAsagGB9CoHaLm6w5ies!yca%+x5k2sU*@73`2dVuk!lNZCae%+&&g!)NGRVmAj>w z=k;)xs0n`8Uhgv)8g2HQ<9SiSOS8kX#E)eAuI()E4Xy0Ey7;?K-+R8zL+7PVwqciZ zyFtm!rvu_^b1f(h?D9kB?q40Mk4|e<8;y}4^*Yi%F!R%;xaRX`;ZbjD4*&Joi#)0= z4#nMzUXm)@bTu_K8r@GDn~ns_G{s94+bXitJkQD5qosvX!&V;N28I^n3*nH3T8h9Qo=u}l!-icZ=v#{8&E#+9Kzqsbp+}x~q z{=8^|)}jrGFFF2IJ;DJU8DaClgYz`8Zml+UcBzGh(dtrb zkGi__8%2g=v)|k{A}{EC&_2#}`0x%q*+PAdDp$@OY7~JK!`5Yf(DEn39$C zFeQcaP6a!f`u9nfgW-x%VOUzM6GeawZ}6R#(ffK9wzkJuLj&KuIdyd3&Rx59U3-?w zu=>a{!9FW;U-llEpR-GIWgeCiA;H0v-(Fpo)zjO5rpsXq8t9WJ`!MUzanc&&b&b>F zXdLb^ib31o1AC7Z<-8l&;dPzq|0lybz;KFpvkS&Eo3O=Op@C%R*S_&qY znWZK14tAO^ofwJ@KquF(UHejSyW7t4{jE(Z(E{7@I_hzW!VW*l+}+)=Y*=j?85%aW zrq-92Mmr0#sXm|4)D-rovFXSSK+9ZnO=t?N9^eoWS-M}WiLU4&t+0i@5+^V(cw5-XVEy7 zSYZvLc+>^DNCec=FdKK>?pS9(a zXprd4n4ZgxqmG5Ym%L7$ITINfS@}8q5L*9J6>fcg26J=s`^+MLHgsxDj6a8QEO%s- zma+)D4BZO}IduB;V?e1=F>9pu$W5 zEvZQJGXRhUHlA*#ww|8e-2O=(KE@+!uHynjjHj*Xi7LUQHwGG}-~bhP@FPfF=i_uYYZH#!2xsg52cQ;`(FpE0fLxqcqijItourpG*c(xtm z;E?w19(5WsIDA=nJSL+q`jC*&6YTfqmX;YeaRReqvW7o>s+et9swOI!%p$GTmQLfe zFI#-3tR~2>uaRY9QL?zf;*g}Iq3Wg#*)R>jbe70}s?Og*t_cN5N1;^F-GdoEY#cSc+`GLZ7l7U zObAt%T=ECRH!(3e5v{@-EW=4Ft)+!2keQh&cQD+}_5P<%=fqieW8(SCaA4UUoyo-p9eXqy$D_`IDah+ywhqid1=EO}uU{X)H#}{y;8uMm*IVXoWn+_)o<1`7_VwHY=jIHp=;&yw z148#795{2)$f#+myO;^!cyx3WMe^gvkMFtWJ8@kTU4?X7TE*RmC0KX!>13IGc`mJ~ zrPb$HcrP?G?fG+d>p-VM{Z|IXPq6cXLqf3jXwbM=Szh{shYttcy-N-{rr_fvsimcb zO-@NkiHdt~ne{4(7v&YJ#)IjKjqyr5gZ1G+lVscgRe5jI?Je8!*dIN5L_@LlL`;K! zWnW82WAm9WN(tLfMyn7PJuzW(O4W3@F%F#NHJlb zrG`Ix*Q=U3SWdZ}98^tF(RV=Jl!<$){H(9)Wo0!X}C(3$*$mNMYl_3N@N zr|^?#9>Q^IKfennzI?eOvWEWjyXjYv{Qm4GPwoklNMse>_qI;%@fzE7$| zrP7+(GB0X9_Fnlr(-+8gQCmB8S`bJp(jvqq^GA}#noe&bCKSqn@yycH>rIZnEBn=yZ!_hWs;+d z9j^~rVD%S|R3hX6k()y&+Lj^5atOqYl&t^^3Avzh(2-z18oIilEBv-!e&@jPEEUr= zJv-a7F;=9@V?0x%69w`IA_(|9HvS=cN2Z@yCmmV!DPJ5__dP-=gI~M4j%sS{&Ct%I1?Ic2_m)QH+B5EWuRlsRCiB~aA!{aD zJ^P+#8OkW;@=CYZB@=YVB$h1nc$(BdJ(-l4D2?eHa{oS6j#&*Y z?j)ddavvz+-i`Hz@_^oHhJqfC47cUcv;Y$6AR|?9N1kN}?j%_`21Baq-Hib`Q`2N% zdXuTHLX)pa^2B=-IS;PSXZr^2JYI4ELpMk@Mkwf{>8E>`(KCNL?L(|uQiGbCFXG;? z@m|0C6`}lbtSy81G0^71cjH;ba@VhCpo~rWJ_Pg+#n|twxOxFM%QUkP( zVB$-(GPJ=$Q+W;}T?J!H?F7T#AiEJTs;1B*gfEO^E2weiKIHuv#+-QqCgtB*oPp*JO zq`Y_$fUowp=$tBBvFjfg07}F{Bw0Nxn@}T>azPFI`}@%ze*UcR!`#G-LiL$q>U_5m zf*^AqypjxZw`ui57K1T*y-aNY!wRUQ%CfRsAWmCCNW0tS@?xWXa-Tr7N~~*-yUMdu zO2q1+MW(-e3B(0tg?*Ry_U+#dON*S5)4z!(vYle17CbEyvYOQKEeIQSq*xOSvRaVkOK!dH+gn@=ipcZi39+HUF!C? z!!p^LGBq`ItV+Vv#3bphr7K`UsKj4J-?ecgcL>0MZ)PK362<4f$O2*|yeYLT78LaY z{s%XCDrCDKH*Ogfmkmxiw($MCE>`+Rarg3daF!XjIjOfj>>&X_)zG17WI)4ZD8SR8 z(WYsg{%eLNyK~=B_T$Gx1KE6@0BbA5V*0FurVsodzRgycD&>A!dltNlqt5` zqsNbDq&8-yN|whmx}fAFbPVNnFil!%XFNtXdQ{Ns6O)@O;7{{TpWkP>B_S6ah+l!Y zqjRCG4MfXDgVxY`j83o{+Jv#OaqAoCXd%bTp6VERKSo7hJfhM~uv=7~p6J`TQvvfG zYz+h{0-O=DH&9<;&kNDVwhl{!QM1#&8!=Z;FrKE7x*@9Cf=3IO3f-4U%;l);U8;&c z2cUpI{88?x5h!4$Z6vLUp3(!VE#R|PQG2g+bNU6F;)P;%f#N_J!tO9y{}Y8-NDJXr zT6z-@H7fb?;9tSmuhFs^^jYuvDT#qI`L>gS+z+sga_3GacphM_8ZB2cwWkV)S*OZ3 ze6q@xtu?i{L`0&YzJE5E^dg9Xtk@D60%ETLb_@(S;sX zvwGg=N$`q@m+%z82t|cov$d6YA-S|PoS@E51FdwENAHFl=*!$hN95%^iJAW9 zW{t^-Nn15@W)%+YCx+8nZP%?$TNoi4TTZp2f`pl=F+nQu z06u3H^wiR+i&vP2O5Ck7NhGAcSdrPCVqd(j$GPR7*V4-I-SGJe@yMLsNJoc5unJ;`S`oip!4;d{GJ`j7-Vmb*m&pFszL#I0KMK== zn2Bf^ee)j4PhOHpVCuA;Z*A!SeK5rs?ff1-r1mbw7{yroXM`pv%VIF1n5xnee2)B` z>gFpkoL1`ed^=w65BN^px0l)4DGCk@$zxzwoPasN111HX_)Ml?&GmxqCJJMynH zKxSL$cCEYWrCcKz$QgGwUW9X0@c%{tTvvyN1mwBw%NPmu5VFKfEnoIe=oo47=E5m? zhQkb3iDB^aQd+HpBCXtZ(;siFKsP!vBRHY`MsO+5U2Sb^gGIRNS5zbl;ZaoCnc+T{ z@)I}{gaY(iq^wmnqU@!nmifX|Hx;vRm@ILTiD$19V+^@C0ecY%4tWU`FfjB*28|gCC|2;qL(+u9TUTScPOX#0q4$4Ya5%7!?T+VnvO&` zy&bt&!VS!K^@O5<0Sl-Zo&p*%ltNI*Jytrk^v2;OlpFe-T z_v7m+Rl-38P=mhk6yO~a3@6y5WfLpDX^+fnGz;LqpwQ6aV7{!Y{U3wy;qezQ9uCiY zSlQbT=hpEjzkVHdA!Q+P`oFROydU4%c7k9J{HZ%``Sbm4Oa+4Ju+y;9Q)*~vNMi)z zR?H!<((l{XKfCn3%v+2#bhxhDqq#sYN>Bk84`~Bs($d=MUpM%{BquC7TIt4(9LdZY zGZVm@x$*W;2o6wKpQVnTZo>=)Q^Z$7Y-T)Zvel1#mkh=2reRZHAA|j-LNQE|Uc%5~ zD@UEcyCmu5zZ%^XW@Z+4fMFciG)%~R0Ip$>LnEOh(A;_ZR)}66c08&E=IG*|f~2|3 z*2$-bpmYM=T-4J$5BxMUGlSu6oFk`>Hk_W3k(`ut2Rj$4AHWfmBQji-VKzf#ja(?J z#I23#BIovQ4SM-1h){OIhovbB}h(pozo!x{II z-!mPRXl|a!OIcM_h2{ygf{NDIqOYZe$+N32>UdgNS^TeGX6GI<2UYgnd#2;6mPVBb zFLHKf$;%7)|CL^TFzyC250j|VwI~|p=I9YxYFrbV55{hJ@9wh}78b1<2Oya|fKG@e z6Un1)u{<|AH`#f{TERs$?&HUg?EcSRzEs*Rud4dM=hucfa1b21Pkjyq2DsT_9u*!F zvr;(Br}U-aX{AM8pOdJPn%bw~+0lVrc^%Boa&PrAu^yUQgI^M5m!m&TFW`xQTmt?r z|DCJ@Tke2f2E2?~C+5ibgfYA;^1KceVdhlSG>EIq#CK^xlVZxk6Jx?&uE1i*(LfoY`X;o%V__%#}` zktq-%bTlEmuFvp7?ga&LoIVX*1IRDIlc~8w88H(rt(O@YvJ}z)*6?23#98rlA@`s= z9Q1#Vr3Wtt#D>01!2vIzVtn32Cu$ zR?3{TiGT$@OSzmZJRBUG5Zb`5Mp3Ld7brxm^PzVmy_47rJoj9qN2!od=dGP^?-?b8HyuE zj=(TW@HA}J8NX>zKKW{_^~;yDNLJvB!9HMb0gsxQnK{4)gxjHtPJ!m(ar!&Pd1QRN zo$mB;+8~%p(okRUkzc=lfqrxr*r&lVg3vpbFRs@5^{ceIy9m|9` z!gLzcFcvYF6HX%+h~a|i7D&x<5JnFK;17MTd&(e}W1}Y*$Wv6H^+B?Fj=$;zARY9S z-MO>5^y#(XKXr9=kapnXeTBzRY0K$dh?D_-46z;!O-(sWER&oQ*S{Sla#7SQq90Yy zbQ2*7_;Ou0s#%Db%j%SC`2cqQ`<&X>AShzJYg4YpnP(P%SMJX9UU504O5l2MBa4P- zRoAmiKOt!X)fep}=W4~Bbk9@7o(@-F#W;nb@Y|!b3-!JFJ5Wme#XMMIKj9VtGnT;3 zKdSrsR^iRzh`2aaRn=XDO4+;8v!Dz42&;?x32LI*Pgwtf^M7#F{tSP}))(9qWA z7R@gx2vLgU4gyg+={%;nW(mBK^!)i*La{+56VUMo~`K0TV{z=cjHhnI|^1{sfrb`#%(aIhXD8IVplqzAz_v8EMp|Z(< z8em2f86#qb^ewDZAqw;nE$w3v9`hn(5dMAq`n;QO-vSKp2W2aMH!(kIW4{WSCPzLc!p%!GWwEinv!GkgEQwkgEB1 zqvJpb0jX9d0P-fV&XQ763&<{1w1bh=(Mi2-&X2Sz$JSZqE6IMbI-JA^mcwZHR zkr`}|SkI|Kk9H1vN@Dp4riNX#?JSDe^wa&mNOj2|>y{ueb3#hRfXHY&4>Jx z;uj{ivp^vO)uGka`3L<8P=23HDjx0~6loa>j8mXJW^uQ$*jQ#%b_n1LTp+?>#rDS{ zd@peqY}dcJ%X49B+ru^^8(Z5KfDyRpztg=<;KB^tDo@{|N}fW9Vk)?@>_t_15)ug^ zysn*AZTVj6SzyRr2s<3cA&Mwja@a}qwrQJ%SV#-1NSsw&v-bzkQ&`xS7wP60r^(5O zte@KoL@NRe4m!p;g>`kzyN$g}`(EsN94Wx=j3(^H376t^dx%j0o>gdPpnfRdQd=01 zK=I?Y@HISUG>}#UIU;hCV6M%>2~VHiOX4N&y?1r!Ov#^GJ|gP}kmJy4TR=#gwbhv=rx`V-TC6D1(M?j3~YB;$`<*A4hWk;dQrEf~BGT{IvhX>|Q14EzY z&d`trP>lMI1v`6t%k|YI;FBnj`|!t)s|bzw_0@{#R~7}L#~YqRMG0c({F$AFm8b8! zHc!UM#f5zY!~wOZ4mXGQ6d3ekqcy5s$=Gf5`D6-gA2}pouQ1(eeY5oJ#Zuf)pmtpve)S7j+|LC5(2h@Q~RU+!2@Z1o+e{%g$g2SE|LCsV_k!LVZUIm{Yx%I0k=1Oz zu?xMv2~gvZm?gAP$e_3#$7&W=Jm$>^*Q%w_fdqHhe6lN;%}ZFjZ?rb1qwhJH@A2h$ z$!{5ast`>@x6tv$dOR+4c|4nkk8k`DZZ+o-lzm`|`83Bv;S?Axi3mBNN=N7@IUq@V z7?>I1iWHlcM;{4`k5_|@3H$~6;xhT83Z6mIlq|LtEE`-tJw5#wVkX`Vs5HiWz12BM zWZIzl(#uP?occT2si3B&rnw>-Aj5$V0M~PY!C~}5J5h!IzenZ*fC+*KRv31Jj?QB5 z+fP0C^T!d=Vn9Fu+9+YOLWrDS;N#@~IUlat8Xs`fV zIdg_V*oCR&&6`J1QXFsIOrEL)WAHw}Qr^?7lQ#RZiywF{FV4%%AVSjbKUn(zArFN(=tME$~}qN<@| zV$bDX;ZmyJK7e8M5wSU>q45c%vqq0Pd+Cq_8I_+LMJy#6DV?(qMN;y@NF*;HEFukz zQMnn>rSa_YtORLMgt{zQ5WA3PFz|1)Mk2^GN0$hsg5x*2Z8MWRs*RnJMbnkag%Bb84)Q#_#%N9{Ghcpg<&2+ zun(h7@iQ`^2}Up}r~_qvo2C~a8wA&w9Yihxd;rL=;_7SVV$RVzvrWI<#ED!q9xNH) zV#7k&g2d4$rbZtOkvm$ME)Pw$;tl@r=d^G|8J#!pG~7 zLL;ns=-GDf`pB`F#@n;g5Sp27l1hO3v^7#G{&&i8qXI4pOn1;o&=sgSh^0woc!m4Z zK!W~?lskUDd-4?0QZPb@3@j?u{6tE&N|XaMP2gHUGJKGRG5{_Dq3^dTZ-F3CIXsJS zoI3Iij8y%giHeHCgL&r>=t@t&S6^RmSI3TCkIoPJSKQ4yAOA1+U9|&_#X&`eF&kNex=b*(w zAtPjxe7)j0C4GJUsG0XK&nqfk#R_^Y_64GvnD~<;Q>~WGe$yOx%^sQ0k^rsQB-8HzO?W@%2`St+{^Acj}APTie8WAZTW?`CJpudDA zK#(p31&C}0pk`VZ|L8>9WKR#%J-`B(g8+K+8jmiCih=(S$%ZNuV=R4I7foah0nA05 zMriB`R#IA0)6xV%T7+zW$f4GrrJ`@mmN=kOGi6B%D{2}z8iHQlj>O<#RC^(QGep66@5PeNU!?uSKcCg`)nc|UsfeJaQ5C_0P=3QA(P!I{`eg1qf;s(5O zIFaL1US8)}4Pbqco)V%U0b(H0mz0#G-$CByO0O{vf#4_r`A+~_42z!&E9jA2hYtB+ zJEPoy#|XR#$W+Q*1hZG4pGcotJ>WMg$j|>5{DqPg5f=8m99lFyB@C4afHrI-ByrK0 zfO6H+F7-+xnE}_Aj*d>&+gk#?6^dq9OiV~+-$-s3co~*k9orTm9;lo_m?S6cy58BP z*+bA9bmZ`7=i^hBN>?(vFL>leiq-z(rE|nl5&|HGg}o!vx$y`LrRZz3~TU;GMXjv^n91uIrMA78{fNkFMur?nAA!~(>oA0cj(2@h%!s9&xFoz zjz>sh0M_*|hz@aT2`T_)fe8NXGR|T#F)?Y>NxJ=J2P+<8+gRLAEX#IkW=J;Mh<6(V z`(z>EE44PNj^~CmVlKsTgg*|mBDN+$bLwS}(pknnQRc$O)&d~w7U2^<6Bi?aAP+?0 zxX}hCo|5JjOz6?(7wC97@M&OLRPNQ$ufVp(gaOstVCUfpL@Xu8eb&ORbY9!gW0VV8 zH_VcsICueDlI*qfxHhDFVh$fKUlovAtk_MU3)o#;IEMz?g2}EIGn>`xw=`uIbop2n0ogn-j104omfU8`GAvkX(meJ+HKk$)1f<(d; zgK-F<%@PoC*%M<4?yk$_Y_z(*88;$p;y#iXID!*MH-{U|F-w8aX5e$>Auf;NMdW=s znh;ruz?oGGH_!uOa~|fMge*eHcHp^en7xRP>%P9a3Gw~3@|g{LgGm=LoJ}Oc>kh)N zLfuo2H!|pHw^`(UO;*@V%mc0{{Xd06&OhI8A~FtTvvJc7KnoEuF?GJ{vuyB3Zs^V8 z{OiBjwz|(BI`3O{DTwYN3+RB;3zxLDKM`l#V5WWsjn~1UB1sqkg`=r4L`WMNH`G%y z;kQ%7=_in~3LBwFz?pOB$l-I6j^MoI3Fx0!f%?TEP7s@q&~?R_Euq-AZFax4vyY5c#(d;H0#!9o-ME zDRGXA!N7^=PsCfVo}ggf*$3iI1Wo{5^u1=PK$ig(AR9NiW7fgfB%(OPv6>6KPR)T5 z$MzvkJUT07h*^OuBQ6Y4nA`9r5Q+NbHn8(=K)eV}loWKk96*j|7+Sw1b>J2xuMu#C z3MrE5z6+56j4-0)F$#zyAD=!o|M=mdw+YydIGQ!_BR_;NDNs6lC<8D8hmd%C_(M8V zn~x9!(E!*4EgM^1r=Y++hN8e<_=}d9QkZNw1q$W{k_({vK4+#Dr{j3}`M(wW!j2@w zF5>Bwtp2IP5mXY1$UEV7D_zo3QlLQA+ZJ?xlHD!wF^ofYZUN|xnVg#W^Ra?18JJEu z$bj?;P7u;l#(i^na{n;WB)|hME1FY;IRNVlUh?vFU>FP_M*vqG5TIZdt7Vh$&`fBA zxC+A<+6D5csSt&_rzm)QrarnCfS_PwAm8x&X9X}fp`&bL&_8Q#&V?9vwo$p=aNGCq ziWo^mZw^iZVZ`mE78O0i*eCL#6E2>}PyhCh~$s@t~a!&a14c}f-dWX?mP@XqfTzk__Np~-rgwF9w# zS0pF{HrEac(94H!*D7&~XQ1Ht#gr|lF}xy48?@DM(^BrOi%;=?3fMyYe*wDN*GGoU RHse3Zl;qXqvShB_`Cltoqz3>1 literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/hero-of-month.png b/public/resources/images/cookbooks/dependency-injection/hero-of-month.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d485df3edb36fad43dccd46f33e1e89d67db72 GIT binary patch literal 26538 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 literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/logged-in-user.png b/public/resources/images/cookbooks/dependency-injection/logged-in-user.png new file mode 100644 index 0000000000000000000000000000000000000000..4a43da33c9d70ba785b998a2c6076520ed2fc656 GIT binary patch literal 8274 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 c0O1A2J;Dje0Y6~z>% literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/minimal-logger-intellisense.png b/public/resources/images/cookbooks/dependency-injection/minimal-logger-intellisense.png new file mode 100644 index 0000000000000000000000000000000000000000..1f02db8d7673310839c7bc80037d8a466749fbab GIT binary patch literal 15037 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

MP}+6ILoFT9Pp* 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 P2_qw^AWR69NPX5;QnTqrn{#JZNyY;2P}a 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 JtX6QNNF_8a++?Glp#^H(vi!L z#?oo7n{r}9CX>a=<-=&4`Tbt!kLP(_@6YRbKCjpF&+~dN1^9bIl(s1W z008mz@eJIot(y_DMSe32p7BAO1(X!%y$7i7(VN}`a3l(g0)V<)<*z5@Hd!&jCpZZJ zRNH?9h#UVX8~_wrd_7SINui&LdgHgF^*UDt4oQ`t5yl*Ty-?Z_XSY#ASc^y7<)HAWul* z-YIC>%@!OxRZDgBxyJfv+Kh)6^!x*R4UZw)meR1?+#8tJI7WsL&2uQo3h0HPC)9)tmgJ7i#;g03c{6i;1tlTIS6?V5`E*EiNnb#Fj;bpd`IoI718|mbR@Q_`%Xo)7=Sc?}N!1Wzn%@C%gBO7_9t`F$0~+F;h`T(3VA7uK}8;aJI?I zc_K4Ls8(uLUXli-;Rb{I$BM*B)s_UyhRN|*m*IIblwf}$-BGQ)b-#ntW1XvQDNK<( zr`)zT%b?S9ZIUxC8^A;~gaB?@I-!Tyu7It3i{kz$U}L_D@%=W0)VTyT%~ zNhoAsKkv}@)+o)323P=zM;Te>i>;1k7v0ByQ;U*$?$U0lnYMEwzd^rJqZ{fhd07xk zaeRQ3cIfd1%UqWL<~VMK{&+0Z))CvnHY{@=C&hE>)WTTn<*L2+%ptS63kP*_lHwdW zx2~@i&h&Rgge~Ld;4q)GP}j7r>1)ep-ZYwhC%fdZ^@J}f@dsj^=OSOrk&Hq4(GIgr zA6J;au=HUj);B6dn9Gi-{gZ_^sM=d-dhZEA@7jgPungD9Bd?}M*20Ac@GceE5!9Xl z@(90ndl=uS&5%t}7be)?1>D_Q27*WBQ;ohf2UWtZ%4|N(SRU$z#%a{X3!HjPc7xXH zRATjNifai=T&Af9imZm1Qx{fvZhZ&`G!0K^fs*YfgoEIgiB~Mri`c;0p(TC}5@A(+ zfNykLEKH?1Fx+i%J0;a;3y>fzv9!0kRgo79WIu&U6YfOsa6~nBI@*D>bxW%VqpF{c zAQaM&+C&+QK00)UO6{!7jL(aLGa#{CKl?tVtGFGYf&EpQuHAH5&e&I;_NU{2AtD(F z=_w^R+V#~GclAM{nb0j;%r2;yn5ONkx|q6epkDE|b>D52PD!zwJv|gdK}QUuj67l= z?bT(gd1Or~fCyuW5VO$c`te}~5-`^iBH`CO5IIlUHyq^8MfA`jsL194zE74sd`e`i z<ZzF$J;aM$vTf>26biUVnB2Ht-$g z@D%1pnTAtGX{2Ku*ErpcVvbBUH>oY8FF#;5cN7CicWq(ch#vlUeS99wBbqH^Yv90F zVhL<_OHBnruDVbpOZSq8t~1VQ0D9|CQjx3%SxD#y8!f-|$KdN&NM4UMahtP!Ce&X4 zUmvLdf6WFl31qTmmc{?-8glGM)VPY#bnNMkWUOQEs;yvRdm)~Sne0p|!PUnJu3&f_ zCfEQsUT19J?_BDP(J^A)d^ir;48I3n#hSqHN|-KQ&IMW z_@}_l;2?TXty4-<+0yx{Ywjh2ap7=Gn%yWHLR8n)sz+Q(vvV!IiWi5lrmKbt&pMHL z4c*LLr|OrG=nqP8Gp(PMB9`tq+Mu4cbjw*k0t@1{+8B2=2tsYd(s$iA--fl5hb5w0 zjKtx)IJgy4fTeu%BOGQ#V4^8+eE(RTTYCKl6A;3s9p5$42YyM-Kd3C4Ho4LK;n%G* zA36>V-nwrlo^f7DJ^v--hs}tK^3l>w9|CnmbcECJRJr>W7H=r&15aCpoP-c&ip{w> zNxye~)M}`*&>rnD8CrhkbK3SD+k%y%)!>xs$Pg7KSELXIWtX^@j z&d-RMUG|sAav^RqZ0EA4PgADkL3+pS#HoN%1z`hUA|}enUJiP4J1+R*~+MH zxu;_8@qs@pHD9k0{p=>Xo~+F6yE(tPr*5Nd;+w&D;A!chlwDqwyO@AlX7dvRm+9xg zn;<*p3*{rqZuJ{^tCR<%!vp>_#`56$ITO>veGBB-5&VlF$*1!#lS|A{ID?3j4p7S>)*l-jV&vGV{egS*8IiIrhjNZX8wUaXsO|UlHuPh SRn>mH1%NNw-?MrTp88+3r`7BL literal 9275 zcmeHt_g7O-^sORN1S<#uq=^)%L8N!2h;)$_2rZ}}O?oe(N>}Mp1qsrEAT{(Bq$o{# ziGZ{Oh}008FYpn*?>~5Nz4d;Xb?>aZ&YU^>%*;OfPK36m%GE3MS1w$*a8>oO;?oNk zh#-XLQZf=kTjn>OcHsic1yx1)XPy_=rX5!q^)fm)g2!YBlawbE?hn%ZF3sa23bMMb z?UehA12H}v(?#zlIMT8JZ-vNajIBK&iBjRH}to!P+Rll z9okS#Z00MiFn@YxzQu%(UDABHo?(W~@WEnnK3bde$C9|-UR(ZDtv+#=#Sk~_!5mMQ z(#6Zv+Hxn2`CX#Y)Ndeg0nrt%?7)*oj@2Bn75?8dp+jB!S0x@H8h{bPt7Y+=ce}E@ z?ow$2jlAkHRGpU>T9ep)fkgsk^{|mYt zbmd0M1W=i5(!J-BP0#nVp{TwlF*d$#s$YAOer10`N!)~yH9#f-#O(J7{vUjzsN|{{=KzTh zZcgi{%2G0`(ExlfNjZ0U>DfH)66sPQ(LrPPF$S{ON z4`tJym>}Z^6kf3KsQTudW@I1{6?IA^uxiH#$2@db*>=n=D;W0yq>WoC%wSz+y zvpV5C15;J(Q71#BGjWiuj30Qv#lYcylZv(H-tL-`ArI=#AFEFL>#+LCukbz8AvPa9 zlPQWFxO#`8#T5n>ZN%jMw@SC<&2y?B-6a$JER%GZlTTgr8K}^D9I-i%eeB`8M%vMQ z$Tf+5=b#ldGAWDyk!cwsj_yu|@rZ6ckTE#R4aBV!>mEa4GC{+vKYHLA1!o*Mt`e>P zNo{L}0n1BrEVQQN_7Pr!sw-W6^{LJoRstE8@GFr^CQ1{rf6^z7GwI__5-`i;Z#vw} z#D)1e{rT16ifzEba#iAXpSkU?y5ZSI5?WV1BUwaZKwfR_Lqn&Cfl-4vwztmK^ z8(pGC042p68c`W7sLz}AGf})9FgaWSOv&}ss!`eWkHI=scUJxP3>#DeIVIuFM(#ss>Z)?MsOgU`=lP!=Jsz#?Lfkq1>)&+AMzg~jz$clXp+sKgzpx)zc3Q=kUrCV>%NiRLtv{bG!s~S9?j;E}7*=n$E zPX|d}hTl6>0(>e;aCYOfal?qu;0lBP#=Xpzg$g0u$HV8R7pr!DFHBrRI!egcPdVq# zk2mefSY&xE#pcI~Op5<_Fq~AtndSRHdhb`T((8#vzk_d}Z`P@Z<(w#Q5Uk36Qa_}O zO(pgd>Ug(WIxD6%aILheJtoH#bFxdkh;MFh9b4Cs^hw`r!4nI=7+9Kl&pXxq#vHkN zpsv!=x>xS2Fsh_ROUsFh^PPu8z`Gf%9R&~~Y_B&M9llayKEmx$0ok9U{=VLnnK9SZ zAN&)tGw4Ro${l&rfv`H?yLOqGn)do7nS}zL=j6p`Z*Msse|i|vN6tVy{U>QN@@L9i zu>AJ${+tkc+`Z>WM`^>b0sO3K$B9)@y&}!vX@)~c-{!?bfQxM*y45`c2d9YA|Be>f zIugOrz@6wrU=k0yJwWI8mp37Ur4cs6)$%()Kh88Cjm?>fJRYHA`=C8h%vb4m8L z;!11g#sYrVZ^StAf@U)Vj`5b#ZN<6!U<9YltZ|v8lEmv@a^Cob9;`}W=Jl^KP+?5;f2A>GOlbXafJZJ3A7ZF#n1V152|yJ0IK-_bu=HX0C} zh_}k(zD-9Se-mZ)UXA6MFj?jD&#-BOj|yby{2YdmE!2 z@8j5Vi(JRcpR*ZXosO>v$?)49x0!7XWh)wuB%FlMaW3FH;K=pJE~C`#oi4N8Yk&Hh zbfsCh=sspoxTOY!k5u~ycae+an$+}X)3=Y6euYcr*K~Y)hhFVO)kyd zU$r!d6Va`W4`yPsX0s|Dva zV4R$Kc%4DiJ)e@#V)z2GtZsQyQotOl&Z+wr@&^hcvv^bumMrG2lQj5;AVs?6bI zD4%Q>6$hEDtA?_u^|7>qDlrUErtCGID#bab*J(BEh8Y-aYy9m&@@8k7f&$;zFOd?i zOLSeWf?od-ABW&g{)I6TB5gNb+K=~9VF>5G^%>?gV<}}k42X1p8Wxzq%ozmO>RBkU zD~`)ft#;QRP1XXakHKQ6ICkT3g0XVQvf0MG;c{t7p$-Ade#s%@VzZ{kA-=q{_bdD} z`y~d~Ly7k|snf;8=+zl;KEVAGdFtFb^XbNa#Z#bgDay z_<<5Po7D^p_}vx?pT{lb@Eo|8PaY=mtlK3X}d%%I@_bpSm52$bzvMPWamQV%i=gPQs(pfoxf$HWc#KxP&FRl;j$)3P~W z#yKJ2KB&VpE-6um&sBC&tpc!sUFahXP2YmoW-nP@Lfpc$$qgVn6JaJ}{V#0Fe;r9p zJ*=eH>!~za%6_0R*^c`#q5|xrjeYJfwbeK0#UzH4-rX*yfPhKMUPr1RI977*y>Sv= zn2(b+C8^{RidR8!X8G^0l>0bypel<`j;!R%9Ji4B(8Y_qM5K_cBsd7vo4`DuD@Hdo zA#ZJN`T$XEz2UiBWkxe(#w%&><-J@*8g+4n2OzKur#K)HLTbglDlnz&7qDxWNK+uq zqFUTNcGepIPJ?2Vx~YkWe26ZR^_woH0F()|$>?JjfuChs59~m9-{>vf!FV%UH{{%o z1tK3(x2fk6&UUR&$)?@~Der?LtS~h2!r$0*mme$j6jcsKjrk{qgo629p+B89u(4U+ zez9p4$}gr>uZ;G8HTjAOIvP%iNinl2@{k!I1&`kZ(o6>tQ^UzVMMXi^nUAZRG?z?$ zEN=F0G8hhhPZUs(6D*;C#`{@J8R=3m9rS7Rlf(F3)B@#qh*=eMTv>mVNV__oY%q8} z;JYM25OkBDjiisj9GA_D4SFvpG1EJ^P(yiUWS>t*T6%|~Q@BBqBPQEnmgzK@yD1x; z5|*=1ntd&@0~(*z)h}POtK&7ohs$s4Wd1S`<=~ciSywm)8Mas|1*a{tdJmg$zzjY&z8&cSrti1z#tZi zNno#7Da^+PIrb2S_%o9bf80^)PvAr$Cp&~BDC1(5JXRxkitevo!^At996+?G=!Hz} zR>R`@C?GSbUc;pe&$rkemFE4{l~R*uWl}XLAak2Vm$9`Q@a-7^6Vx*)`&xV>BdM2{*Q8lrFA|)$#wZ-x%{&k4&y@Cw1RK^mFGQEV zh=yx$1AaEBvdnRRk6{qqCFWl@P^D$>Dbx!{M}G30AO73Embx5t?@J82yT_ODlv*y9 z6G#YvPX|xA7mY8VfP_@k-ysc70wSZ<#y5*xu^#JBL=T6;2g7h?Q@XL*&KQG6vmabp z%!-K3%@#Cqom7R6h-2;i&LvSt{!7<5kHgI}j%3k!iTpGQ@-rY6QQr7?)1wuf;=9dv z_FV!mxMaU&{%(1@qezxV#^->iW*i?~+}4dXXhelLE`Bbuh5q(*@_ zs>6JHvKmMHKr`orTzB5N1{3^c<@={V_F5}P_A}Djp%2PMASTn##S&va^H+t3#OiG{ zv@kT#NaI_4MwP{Y$64Xx=-xVU8|b`$q*u>XaK5V_+-Gup<@b=LrT~+_;2L6U00KI+ ze90E*e^QtY(TG%OvTXgGqn3_q&`TY{?zHxVa-Ry8l z%Lfs4Kltj_M?oEX;!VU_Bx3Ixzk&auR=2)<5Dj056SGt=!2wfJy6M#ozRu( z{?*EC@E!TI8tes5n6GY8x{7!FOka`P==sTa$FSq&(C)XZEqKY9Jez2JT|Xf{<{iqq z4C0oe(ng8GEuE8s!h?va_QQh&a`}*O!@Jh)wxAU2ixHEnH`2*eH7Ho`fuxrsEf?Js zba-987EAQ%wOERc4MkC$_jZiOj%y~qf?{ziGK>`__ze$g+|xVHVvk<>yuSPMrj#cW z#eq6Yh89H=D+%_xgr={l2W<%6YN7EYgjdw_n-z_bEUc6ZU;BnOpD~(sNEu^F#p-VK zlFp94Q|2*{Ql>-H6oNB}3trW7^|A2@1nk7b-M+NC@}$T3Cz*_^4!subR>9+f8k#>G{WN{rD1^I~f?em)Zfb}PMA=9FGzXeEL={*3-@d!o=l zYuR77B5-~iiDP-+QTysrj2O1yu`M`<{*MT04mbOW6yFO0x^y%7{s_4({d+{}{%vdi zD4fulx?`R|lx(a544e2^t zv;CbUv)iHr@LK%4uv{s z!`tt;UTjv!RMwyS8QuIdRM0)FXkHWb1y&R3gyF;COrT;z85uUTOX`^F|NYBnVS?^& zXn0{2=1+)VykmZ&kmnx1vl(Fr@5vPfJaJ)0LM=<#ew!};!kCgqq|1N|O4C*zWe@0B zvtOS`y;d*5Nn71-VN~vHGf>&(vdHH0+J71UnUHBGRBMPIxMRUfdN1Yb2PP*&O!^g?fg?m+ch5B}1A=4+w<<9>lSr%y`kyV- z>gE~9**pY^&Y*ncq~ti|c@;N+(Uo%LZ_X_y23i#J7-7z3ClDC`31Tr)JhQm`gfL`c z@y_W=IWfUU@QLp&@0q%D#g*M0fO#_F{ZA#5gVGRuqIpbnE*m0l0i)g6Z5z&=rXcu4 zaWCrBpOXem4nQK_SDKzX9ZK-&@_VKKABO)6!cboYT3oNg!W$P(cb(I;fW{Kr(P79& zUY%nuLcm<)Nzysy5+|4w+g6@q&OpGNfxYJ(b4CK@5`t?14zvJr+<`J(?nsehA@`a0#&=N8`) zhGa7=I#2xxvid3w)*de4B=Jazak731NUv^Opke!|_u)q8(DBiMt!x&?(P8WhYs0!* zsak3M=93A68a46tWuFP^IZlhZDY@vnM566LjzHwb5ST zx-#g+fTXuLJQeZ?yI5FR#Fx53I59z01Cx}Yj@CVFCadf_izD@gX#blCOsN?t!l%-@ z1^@->mvuzZ((csn%|)$5aAtlkalx%mS7Hxf|4k|W#`44H62r2)CEz-d0lxMwr%^a~ zr5Spu@_-KFOOjZ0RPM!rMxtrdvdD z(AK=qPt)qa37N@uc+&r+d+_G1$U%8zl<4cl7xhbP;e$K^d!?NkyEDo7L~lJIM$Y>;4FaiQ=8{# zE8Lpg_^GQk9HvUN=!csgrMiXQr3yX~ZtZ94Yx9{9qFa8mA;#dl#7^bxo{P|s9icj@ ztTJ<2&ZT-LbaP~=!$3H*e@%WSm)f))r16@}{9XrcdWTpqZYdrn|33(=suhsX$uc-;Y*D^Kou4 zF7A%_dsBb>f~8qeXCmrKXHecsb<1Db!+_tXXCqLW2yz|LCv#v|h8wslx_mG5FD8q> z4i?%M%Onl*?Nu$LxBSp38jlmdiEQ<|PFF2teUR(B^G%Y#im^Pq!$3yT*0!_1?qe)9k*TVS2l6Nqs3Fqr%Stq z2;xWwi5H6)lA!tf;Uy5yRi{T%=}h@z#VlxTDK3&*{l`W zHqgU%Y<`w-ctx3;T&4F>c)TWh^-)5aMjZHW zQ6sBEFA@Kc${vxMhQ{n4Rb|HS`?)pz9VtB>!V4PVs#`uuoZ<@%pp=2X|6L-c@qF)E zR>vN*=9gSMn<59@AzOIts>f}}5UvpWRe+eCW|!S;!uvO>Kqf!7=58E|`fK_fg&tN& zw`8gdHCE*o|+w3seSfs3+7|hObx;3P| z;u+%fs8^3`R%`=M;?0jGXcUGC;2QY0tA^>Pzq-&>M@sIXC4;vD>pf~vc|528fbvNx zJS(yY(n)f;b&M8i*wLyg^}=+i0a2Ut=Nsqos%Qs^zKOPWbpt@@TTGDxrn^id8sA+V zZ$B?gqcP<38`4RZc$3=FEPug?x=Enb-XWEg^^TZw)88X(R1-f=@_G{S&S6RiHo3WL zJ7Hy1mj;obbSu{JW(kEb1@jE+{E*^B=ZV%5W&+X)e? z7<_#7zJ+tR8=-nHOAB#a+VBkGF=W;Br0WGaqw4*tMu?R354!mS5 zEoMqStQM!uXP^r&IsFxdxFu#Web8t)^VwmmS|)zI@n9W3B8dt2~2|Gygt&D(^U0=8sW!~X9R;PuOt zkgY%2bvjYaP3j(u-=_GWUNpE=7Z=D*8JtccJQE0n(gKMX+A`2z~8e zLD_6a;F|yMeBo*D1`()REk_$S>YuX2lLk=GtkpeXN5^yj{IB|zXfpya^miFOt1GW0 z5ZL7V*8hQFj}YW}QID82T;%SX1OC5(f11f=qSjfdLAcn$ZQe6xSPM@5k4InO>gOTU kv^#$i&)$Lh(7&YJ2Tp6P5uaoUmx3;+DrqXh70iSF7lAV=Q~&?~ diff --git a/public/resources/images/devguide/testing-an-angular-pipe/two-failures.png b/public/resources/images/devguide/testing-an-angular-pipe/two-failures.png new file mode 100644 index 0000000000000000000000000000000000000000..e21b8e7e78ee4999e031efb3042b52c6f765e448 GIT binary patch literal 3056 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 QQ##1h(9)m?^Lxy{0O5PH(*OVf literal 0 HcmV?d00001 diff --git a/public/resources/images/devguide/testing-an-angular-pipe/zero-failures.png b/public/resources/images/devguide/testing-an-angular-pipe/zero-failures.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bb6a475c521a4a05abb4af5389c170f164df19 GIT binary patch literal 5713 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 literal 0 HcmV?d00001 diff --git a/public/resources/images/devguide/toh/heroes-list-delete-button.png b/public/resources/images/devguide/toh/heroes-list-delete-button.png new file mode 100644 index 0000000000000000000000000000000000000000..da87a20e4a2016a5786bf2da4901b79d769ace8a GIT binary patch literal 17009 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 literal 0 HcmV?d00001 diff --git a/public/resources/images/devguide/toh/nav-diagram.png b/public/resources/images/devguide/toh/nav-diagram.png index ed202b20ef72247c3e88d6a1b98072ab4a31d89d..f9d634eafacac892f7174231bb3e6d988c10133d 100644 GIT binary patch literal 57103 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 literal 61962 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

E5zLbgEzv~dZ z^CPEjbMFZaBF;v@8HM8BClmRr932oRB3f!y`P`2jf#*2p)V?nffjgxNBDVxrb&K@un1 zMO@b$TcTDE7DKc*`K&*D48z({&==xK2=i)>s=9FSR_kjJ`tq#WZiHR=j!6YJV$%Z& zElNKxG)!D~{p}D@a{)T9w|Lq|+@**ZrnbJ;7c~mqEJw1}Dc+4VHS~8xJheSM0xMR? zz^Cg}I{F50Nl^M8;R>dU?K^lJU$NAR?T9Eu%fo!C2mj?rpU2;YG+j?4Csr8{+q#i{DTg_ycvG~PiXO}<_gVyCgh%1ReR`a=Yp!R69}nfvWwWxFiF5FE}I zTl|C{<;!-T?gY#U)OXthtd?=uy3r~x*@^(qy82- z7J|0PNe+9a3V<*X3wajHKKpqjI@4?i7@$w_7)6GZzIW<>Ev9r{O!wb8wFU{b5{F23 z8du2t|I{DZAOQj)jckU0a#BxY!;nA&3>;)kv1+4Fap<;?HymbIXNP22;~!@r*t8N7 zb9KGpcuvlw+dz@FNBhm1G{~K1t%s{dx}-kM+bw*u!OiGtjju&#RcmO$s|xgi!#R8u7!P7nKoa zS4fYZqWc!_QuHO@1Dv!z$Gqy$odeVaT~2zbH_oT@oG1{Kg(RDR9mEA_bEgDgXr+D+ zzqwkT2z>+})&vufai|<}n3`4$bemE=%zkwM?Of|+1bq>j|hTO0dl8a6-9nZ zubVtCI-n%_Ln+|S4G7%$ZucwU-`@TW6r5+IB{`8nxAT#(dO@JyzxebmXo`FM{} z;nw(gwTo#do!^aEy3YAHlboCeb89%`k-LaH6V&G8Z-2y>7sQonkvT2La z9KjrnGR#;zPxe^W1R~67C_sS{_lN{IBra41gd>X(cQG6vaUv?|G#Q)@cuBvXuL2mF zVhh!b!&Qt4RwN?lH=LYbij>jS_ya14$+<*>YvPTc^6N;F-Vt^{Uds-E_V{ee0XeB^ zBs)0ap8kF}SyWP>Xi8!ywzee*t0zaMVH0RN>7%c(THv`J&l8|@T6D=H$BXhuK*g0Z zG0DB#mK3zx9R!e5y4VB!K#OQ1rEEeE|Ki81kMw(3(v{yS4uHaQQFoFZ6w7Pkpw+~=9} zT8i*08ylO^&DoCcPNWb(6F-GqAx#7T80X)f^=c?H564=x;YFt8G<1=M{vhKZ{OF9;JpC!8_wi7d5r@5pfD>-egq()xy+|NA%req5U|!JI_$I zJ2W{sqK;Y+N9q}z$m*cRKH{2+;7e-NR805f=Mgj>r>RR0>lhQ%Z-n9=F_CfxUe}3U zJ3YT2-9<^8d;s=hF;(hl!mpU#^IWG5z-Zj2bfBnU+oGbN7y+81Oo}}iE47|`wZwl! z4%*)Y%_1;?V;`X}3QCOtyhB&#!5d*qDdS;7??D`Z4wL+WZ|r{UHjq3-LsYr)2u++- zTwGSX{lvbD2?;{qEGf~hMcI_Fp@3y(l0BUkQlB(dI;sFNge31;gQt`{elXI=%-Bk1 zO4G%x1^h=J{4znHR)6Vpb>&Uy4M7hi~K=XH#C0-y}$u4_ho5T7q8vHmS0)yu&9#$vqSx>wS+t$QnwF6ccA7re%8 z!f-?rHakvIPfC&vvJ=tiA%5WTI@j>p2%79?{A{H=;?NN0*+%D`?kRd3{*9ysA*77fINru!nmLu9wOB&rpX%zq8~CW3ZM0ieLbB z6p)$hj%FQ#&1Bpst9-080Xnd~HGyQz0=3|^bY9R83SpVv$dmd2!Rubdbwt4{pS$Y} zSbaaaX5f!Sh$q+K53BO{r}7ry1!BQFB;;c*z7fw0k~SYq;V6BMi4EdWdP%}#$m1d> z-^!oTXAJH6f^Yw`l zYO=4`8AlWb&U6?7ds@3_`u^IRu#i70e~m(;wP9XvPDBD=01Kgi(m?iz z0h|jF3dTDLRyl910Bti_Z=EulKcrV*cpWrO!T5$N zCpY_qUuuej;bH}Sr*RwVlfc4LfqdUQE@n8s6f?~G%u3+L0}A%q2iU77tDGWqSg9u8 zt2wugqm>iIO$)cI*f4aYbWDQqD}2+i6G+6yIgnm!EL{P9OZ9AvhucAgNK+@p0#NRD zbVI^fkct|Xk!9eb=ZF6!hy?P1j*x=n9Eu63v~l(;hXu5?)#XYV$co`QJM)WM4L3^c zM1&~YP~y89qv;HXb^ss zLSYvVHTtL$nZ)h#uw>1+GhY*q3Z0;A|86HQqf}SK&tW@jk7LDt5BhQ5_J-m^cXcf? z!9ZPS)Qcr7YzReX^w;9L;c;VITgzgupwKU1a^pF&@UH%(KP8^DfoG)YXVBuC2pgV+ zI?|2v=Z7rsB;|0vfpTw3ypYyqWP1i>B86r#;f0|{4rp+ou5734jl?M?Y9{2i8Y(Ls z2&=6O*T?sLgW<*%Z^~1Ij(})2B?)QQctY4$^LehTIsy(Ys?Uj(KXg5_7CAonyk^d- zsIw;M7c1$QBC&jxlr(aR<>a?vryF3yQ9?Xh^t?Uj?guOBz&1H9-*qe1!*wHylA%_lRIz#=V=O#14OB2lS*2nV2EH>1| z+75&&Yr4M`(k<9p`g+JqtJCmCRZWXWGU{^Fk*?klfqaF)+dS|LU>(v({tHdZA7%>e zRC1l(N%LBcbxOp*sk=G50A!&e$76HrNO0lY)}f-s98~f}Hm{wReP#z)du9z{Ud@{y z5#NLJRBrUya827O)!{$(E2T8mcdj#;Z0;8QET#6izqDm~kN{ipIyV&HymkHChFH{i z*ib~JsiEtrW~uduYpPCDm_=(ON=iL@)jZ|rqKM6Ym*2DYD9WJz{gT?nLS*tAG|{ubG$ zW;A3k{1*93PR6|7tZG8*@HwhJka%p|Lx+#%*x1K;gF%FsKGN8_R#VV0R|&gbRk5v&nN0Hx8I8pp2_IdM)HM{^wM5L#fX?`{O)R6PXZxd${!Kk=1bi@Keh)beQ zkS&&SL*+6x88L^YkqKjQC_#`tA7Ak`$RS((qLa96qKe8;Ea2v zkA~y1iaX}zY!ND}kP@$O;Asxo@eaJ1RUd|Zx40=(1Ap( zB);zNyC(Y1Ck63U_8D2VpSg?UOO?M!%8qj+J_}RnrYQWtuJU<}# zBE3>xNrA9=kZ;2y1()!AkZ70@=B3fhj&t5~-!TTJpIVPSB`lsOWKbSwQP|?P^@{+J`9L)SB(lNVbGCLLA8r8NoQUUo)5uG7SQwKNS8@dbMOeD95HM zE|HubNC);2@c9|*qjlB=r?!QEu&T4&)4RcWd_~R3^xG|DZfA_`=y7zC=TkTOonm*t za}(aoS;p~199+nJ(AKMjzxC>xzsU*zD`cG&p0Xx z)q=RNwhjV8DNMYu+G_%|i93~!?^}^-GQj7S*?_)04F53i&pOgrdRX~`N5`b2V*bLX zS44jzmIxQ8|A4`f9>SFQ6+137QkDVx@wV|f;033>vK!8OJtpLN1@bTCAi7xWyPR2q zNMXG2I0p$SsP3Q_<>j7`a?(+dxr=rQ$9+fA-MDzzcBP~@rk)v|j-ma>_&Z<`eiQi| zJ#4?LKG5^hxj(+nQ}eo}wF`z?$Jm#peCtaDWCaYP0UE{=LO!+2?KL1yQrCdR$>c|4v#;loOJhU!w?XWerm!P*$zZrR#Qbe51o7uE4#rocY>8#X_<0_3e2E?d~Su zO;`SX?UH9>O)HcV30+p!mc4w@8TP{04@AoPVLM>n`RKPeo~|m+Yi2R}1ZZ}kF=Bag zN(y1!-dftXy;oO1mmc=rLvrN6+b`i=?%PMvrkob}HSZ_a#@Oi^5AE~D6H;Y|2yc`G zvxba7K1@)SGZNVOU~{6&`CZ+fqLy>r(Af`i*mx1_76Dq$xRE$-;IwOLlbh)|M4pI! zLiTLh$sggZut5{r0PaLjB%gm*{WBvX5ScI#$o&-j60{y-$Jm28n%$D~Fi^=ZYMOxL_WPjH+#x)Ukp2=!)F;|*&aS>H??B5sg@@NKD6A6Qd)I$w1f;=mf% z6$s70Dys~OwBWU`lvJ)-fnJfbEq>p%+z@!=R&KUKaj_k0P%!|3iI+&4zg5@O6xUQ> zhiaqPiX@Q%jt<2{P1Cv@Fs?eDKZ5N{*+d9|L zb`;0GlwoqZnDBJp7l>!8L_>IMAr+UE3CO=XN1CtiCpN6JnBzptDMh(2sAHvqj;uMY z$olPDG71l62+GE+JsNzL$g-cGWZ})cX1D4Q{jiSr;Iw zqviVeAfQFIMlZsK1s|64CZ;a-e=hQJcjq#76e)&N3bnFFH1=V3kx9LCIpi3VebABQ z(NZG5Z)M;~tIdh}{w3Z1URlpebBeqO(I*&kV7C@|8ntVPck^}#Ki4`our&fgQv6U{ z+kbeOd%C8dCW#k3U2kt%4Rq4a_6_Eo-klCl8MQMVCF*|BI>=2dEsoqGX;(^j8(o*R ze+j!9U>_b&uy!e4IkUONi!N=NS|}^c08&VGUlv5u~BP(MWn-H4B$2g@-5yS!%S zbid$u9mWqY7FgH~Au_!1_gdSHhmHxz-JHXDDsQgnXC52Tvce$6D!Mqw&Q&y`wD+1y z>d7IpRb!3e3R)_kf3DP<9#|->6f2S)=6~6@{&G?EoaB9Y^yIFrf6)EONz zYqWbq!_>`+4N~WY2M)IG3CqSyHOMelaG6NAsTU0 ze%I3X+-ZWELToT--nrhlSj-+b3VH-;&rsIRg%dC7`>Ye7Okvo{>*c2+CqTH{tFa@XHFLg#SQ{A%fthoR7yiEr>$4r!7=V`Qd zuSo$Cma<_#`XppS)2^;EiqMMnU^*j=sHi{^61PxcEZcmEPmfulre2Y7VV6b>QV;() zB?w5jQEjRB#e;luM3<`;v4OPUM)d?L*XMjIey71v+KAj}s5hUSy!^z`xF}Pfg!5>9 z7N47**ZsLUpe)XTCE@^n1$wR}>`EL@-Gd!EoE0hX-m9}`I`T6h<9gm7x`XBBmj*UM zXroOnub72u%!=C)1KV2@dVlys{433B-@9aPkizzY+&yROAH7ZfW~vs|6k0grp>hi@ zgU4;HS6qL(*7wNs=-qkzVqbw5?D&r*40b&=X^Qg;Vg9v_P!}U*g0W_QxUDGJ3uNq- zuWiO_D(k+yD4&FBnu0Xb`8#B^m`O~Mk7?H>UdLpX?npzlEWuC@ucPKmbG*0{fg3Tw z%q$Pd&aYkRA1ujuOB3TIe}M>jtrfjyaVyywnEd`q&E8=NIfRq0_%dWWJ`mo>2F#xs z#>4?GnnYM@*}8<2oY<1<>Dunk53@_5{cqXVP2ddQ$k=7^_Q26*x78mVI2don<`L7L zN2Z^{ENfZw-76K}#GU4Ho{Lze1ThR>Dn+FRN7iel|B$8!cEK=0IGkaK6<*-837H_Q~M1tpP&qh`zpERUe<@_|oyEBDj$G$_JwucH23}V27 zr+Uaiy3oly6q5%hVfiq~reLK2uF5|b9tmDo47#2hnw21c`2Qw$GO!&x`I}zAAAdag zfsqYCLOt?$l8hc0|8Fu8)8B^=IiMf_cFzBd@@*Bt!soSP50*v4d#7S`QN-efVDppj`9ER)P=wI0~QCDv(d}{nJ|5#QU#=9o&ubwyKo=?EKHFfZeBmm z=gD+N3bq?Vl*az=?||b+4p=t+$S(Q)X9&ng00=N|pwc4$E&&0FFk`^dz~{Q-_CHe~ zu&xja>HkdkaizlmOQIyR$5Va@xC#uq0VCD#_)#GL|1t|DVgZ(u?VO|knIQ0_Tpm#r zq)1Pf05`VH23T}oH=ptU&m;pXKcyKXxu&1L(hO8X>kRyQW1UM F{{w?yGsge` diff --git a/tools/api-builder/angular.io-package/index.js b/tools/api-builder/angular.io-package/index.js index c060562743..827d31a22c 100644 --- a/tools/api-builder/angular.io-package/index.js +++ b/tools/api-builder/angular.io-package/index.js @@ -34,8 +34,8 @@ module.exports = new Package('angular.io', [basePackage, targetPackage, cheatshe }; }) -.config(function(parseTagsProcessor) { - parseTagsProcessor.tagDefinitions.push({ name: 'internal', transforms: function() { return true; } }); +.config(function(parseTagsProcessor, getInjectables) { + parseTagsProcessor.tagDefinitions = parseTagsProcessor.tagDefinitions.concat(getInjectables(require('./tag-defs'))); }) .config(function(readTypeScriptModules, writeFilesProcessor, readFilesProcessor) { @@ -139,5 +139,4 @@ module.exports = new Package('angular.io', [basePackage, targetPackage, cheatshe 'IMPLEMENTS', 'ABSTRACT' ]; -}) - +}); diff --git a/tools/api-builder/angular.io-package/tag-defs/deprecated.js b/tools/api-builder/angular.io-package/tag-defs/deprecated.js new file mode 100644 index 0000000000..ba45af3e97 --- /dev/null +++ b/tools/api-builder/angular.io-package/tag-defs/deprecated.js @@ -0,0 +1,5 @@ +module.exports = function() { + return { + name: 'deprecated' + }; +}; diff --git a/tools/api-builder/angular.io-package/tag-defs/howToUse.js b/tools/api-builder/angular.io-package/tag-defs/howToUse.js new file mode 100644 index 0000000000..21d4378a14 --- /dev/null +++ b/tools/api-builder/angular.io-package/tag-defs/howToUse.js @@ -0,0 +1,5 @@ +module.exports = function() { + return { + name: 'howToUse' + }; +}; diff --git a/tools/api-builder/angular.io-package/tag-defs/index.js b/tools/api-builder/angular.io-package/tag-defs/index.js new file mode 100644 index 0000000000..3b1891e8d3 --- /dev/null +++ b/tools/api-builder/angular.io-package/tag-defs/index.js @@ -0,0 +1,6 @@ +module.exports = [ + require('./deprecated'), + require('./howToUse'), + require('./whatItIs'), + require('./internal') +]; diff --git a/tools/api-builder/angular.io-package/tag-defs/internal.js b/tools/api-builder/angular.io-package/tag-defs/internal.js new file mode 100644 index 0000000000..aac449ccf7 --- /dev/null +++ b/tools/api-builder/angular.io-package/tag-defs/internal.js @@ -0,0 +1,8 @@ +module.exports = function() { + return { + name: 'internal', + transforms: function() { + return true; + } + } +}; diff --git a/tools/api-builder/angular.io-package/tag-defs/whatItIs.js b/tools/api-builder/angular.io-package/tag-defs/whatItIs.js new file mode 100644 index 0000000000..e0308b310d --- /dev/null +++ b/tools/api-builder/angular.io-package/tag-defs/whatItIs.js @@ -0,0 +1,5 @@ +module.exports = function() { + return { + name: 'whatItIs' + }; +}; diff --git a/tools/api-builder/angular.io-package/templates/class.template.html b/tools/api-builder/angular.io-package/templates/class.template.html index 1ae71026de..fe03e03449 100644 --- a/tools/api-builder/angular.io-package/templates/class.template.html +++ b/tools/api-builder/angular.io-package/templates/class.template.html @@ -1,3 +1,6 @@ + + + {% include "lib/githubLinks.html" -%} {% include "lib/paramList.html" -%} {% extends 'layout/base.template.html' -%} diff --git a/tools/api-builder/cheatsheet-package/index.js b/tools/api-builder/cheatsheet-package/index.js index 5b30c5e1f7..2fe5844e85 100644 --- a/tools/api-builder/cheatsheet-package/index.js +++ b/tools/api-builder/cheatsheet-package/index.js @@ -1,6 +1,6 @@ var Package = require('dgeni').Package; -module.exports = new Package('cheatsheet', [require('../content-package'), require('../target-package')]) +module.exports = new Package('cheatsheet', [require('../content-package'), require('../target-package'), require('dgeni-packages/git')]) .factory(require('./services/cheatsheetItemParser')) .processor(require('./processors/createCheatsheetDoc')) diff --git a/tools/plunker-builder/indexHtmlTranslator.js b/tools/plunker-builder/indexHtmlTranslator.js index 65789c4ad4..3591c8e47c 100644 --- a/tools/plunker-builder/indexHtmlTranslator.js +++ b/tools/plunker-builder/indexHtmlTranslator.js @@ -40,47 +40,52 @@ var _rxData = [ { pattern: 'script', from: 'node_modules/angular2/bundles/angular2.dev.js', - to: 'https://code.angularjs.org/2.0.0-beta.12/angular2.dev.js' + to: 'https://code.angularjs.org/2.0.0-beta.14/angular2.dev.js' + }, + { + pattern: 'script', + from: 'node_modules/angular2/bundles/angular2-all.umd.dev.js', + to: 'https://code.angularjs.org/2.0.0-beta.14/angular2-all.umd.dev.js' }, { pattern: 'script', from: 'node_modules/angular2/bundles/angular2-all.umd.js', - to: 'https://code.angularjs.org/2.0.0-beta.12/angular2-all.umd.dev.js' - }, + to: 'https://code.angularjs.org/2.0.0-beta.14/angular2-all.umd.dev.js' + }, { pattern: 'script', from: 'node_modules/angular2/bundles/angular2-polyfills.js', - to: 'https://code.angularjs.org/2.0.0-beta.12/angular2-polyfills.js' + to: 'https://code.angularjs.org/2.0.0-beta.14/angular2-polyfills.js' }, { pattern: 'script', from: 'node_modules/rxjs/bundles/Rx.js', - to: 'https://code.angularjs.org/2.0.0-beta.12/Rx.js' - }, + to: 'https://code.angularjs.org/2.0.0-beta.14/Rx.js' + }, { pattern: 'script', from: 'node_modules/rxjs/bundles/Rx.umd.js', - to: 'https://code.angularjs.org/2.0.0-beta.12/Rx.umd.js' - }, + to: 'https://code.angularjs.org/2.0.0-beta.14/Rx.umd.js' + }, { pattern: 'script', from: 'node_modules/angular2/bundles/router.dev.js', - to: 'https://code.angularjs.org/2.0.0-beta.12/router.dev.js' + to: 'https://code.angularjs.org/2.0.0-beta.14/router.dev.js' }, { pattern: 'script', from: 'node_modules/angular2/bundles/http.dev.js', - to: 'https://code.angularjs.org/2.0.0-beta.12/http.dev.js' + to: 'https://code.angularjs.org/2.0.0-beta.14/http.dev.js' }, { pattern: 'script', from: 'node_modules/angular2/bundles/testing.dev.js', - to: 'https://code.angularjs.org/2.0.0-beta.12/testing.dev.js' + to: 'https://code.angularjs.org/2.0.0-beta.14/testing.dev.js' }, { pattern: 'script', from: 'node_modules/angular2/es6/dev/src/testing/shims_for_IE.js', - to: 'https://npmcdn.com/angular2@2.0.0-beta.12/es6/dev/src/testing/shims_for_IE.js' + to: 'https://npmcdn.com/angular2@2.0.0-beta.14/es6/dev/src/testing/shims_for_IE.js' }, { pattern: 'script', diff --git a/tools/plunker-builder/plunkerBuilder.js b/tools/plunker-builder/plunkerBuilder.js index cb1c405de9..bf784f1e32 100644 --- a/tools/plunker-builder/plunkerBuilder.js +++ b/tools/plunker-builder/plunkerBuilder.js @@ -107,14 +107,16 @@ function initConfigAndCollectFileNames(configFileName) { } }); // var defaultExcludes = [ '!**/node_modules/**','!**/typings/**','!**/tsconfig.json', '!**/*plnkr.json', '!**/*plnkr.html', '!**/*plnkr.no-link.html' ]; - var defaultExcludes = [ + var defaultExcludes = [ '!**/typings/**', '!**/typings.json', - '!**/tsconfig.json', - '!**/*plnkr.*', - '!**/package.json', + '!**/tsconfig.json', + '!**/*plnkr.*', + '!**/package.json', '!**/example-config.json', - '!**/*.spec.*' + '!**/*.spec.*', + '!**/tslint.json', + '!**/.editorconfig' ]; Array.prototype.push.apply(gpaths, defaultExcludes); @@ -263,4 +265,4 @@ function escapeHtml(unsafe) { // fs.writeFileSync(outputFn, html, 'utf-8' ); // } // }); -//} \ No newline at end of file +//}