From af2f5c3d7daf33df3929837d96866d01ba5c56d4 Mon Sep 17 00:00:00 2001 From: vsavkin Date: Mon, 20 Jun 2016 08:09:16 -0700 Subject: [PATCH] cleanup(router): removes router --- build.sh | 1 - .../compiler-cli/test/reflector_host_spec.ts | 13 +- modules/@angular/core/test/dev_mode_spec.ts | 1 - modules/@angular/core/test/fake_async_spec.ts | 4 +- .../core/test/testing_internal_spec.ts | 2 +- .../test/testing_public_browser_spec.ts | 18 +- modules/@angular/router/index.ts | 16 - modules/@angular/router/package.json | 19 - .../router/platform_browser_private.dart | 1 - .../router/platform_browser_private.ts | 4 - modules/@angular/router/rollup.config.js | 19 - modules/@angular/router/src/constants.ts | 5 - modules/@angular/router/src/core_private.ts | 4 - .../src/directives/router_directives.ts | 25 - .../router/src/directives/router_link.ts | 95 - .../router/src/directives/router_outlet.ts | 60 - modules/@angular/router/src/facade | 1 - modules/@angular/router/src/interfaces.ts | 27 - .../router/src/lifecycle_reflector.dart | 6 - .../router/src/lifecycle_reflector.ts | 8 - modules/@angular/router/src/link.ts | 213 -- .../router/src/metadata/decorators.dart | 13 - .../router/src/metadata/decorators.ts | 22 - .../@angular/router/src/metadata/metadata.ts | 51 - modules/@angular/router/src/recognize.ts | 210 -- modules/@angular/router/src/router.ts | 282 --- .../@angular/router/src/router_providers.ts | 26 - .../router/src/router_providers_common.ts | 40 - .../router/src/router_url_serializer.ts | 201 -- modules/@angular/router/src/segments.ts | 157 -- .../@angular/router/test/integration_spec.ts | 381 --- modules/@angular/router/test/link_spec.ts | 190 -- .../@angular/router/test/recognize_spec.ts | 261 -- .../@angular/router/test/router_link_spec.ts | 49 - .../router/test/router_url_serializer_spec.ts | 92 - modules/@angular/router/test/tree_spec.ts | 54 - modules/@angular/router/testing.ts | 1 - .../testing/router_testing_providers.ts | 35 - modules/@angular/router/tsconfig-es2015.json | 26 - modules/@angular/router/tsconfig-es5.json | 27 - .../e2e_test/alt_routing/routing_spec.dart | 3 - .../e2e_test/alt_routing/routing_spec.ts | 86 - modules/playground/pubspec.yaml | 1 - .../playground/src/alt_routing/app/data.ts | 2116 ----------------- .../src/alt_routing/app/drafts.html | 11 - .../src/alt_routing/app/inbox-app.html | 5 - .../src/alt_routing/app/inbox-app.ts | 167 -- .../src/alt_routing/app/inbox-detail.html | 24 - .../playground/src/alt_routing/app/inbox.html | 10 - .../playground/src/alt_routing/css/app.css | 57 - modules/playground/src/alt_routing/index.html | 14 - modules/playground/src/alt_routing/index.ts | 9 - modules/playground/src/bootstrap.ts | 4 +- .../src/web_workers/images/loader.js | 2 +- .../src/web_workers/input/loader.js | 2 +- .../src/web_workers/kitchen_sink/loader.js | 2 +- .../src/web_workers/message_broker/loader.js | 2 +- .../src/web_workers/router/loader.js | 1 - .../playground/src/web_workers/todo/loader.js | 2 +- publish-packages.sh | 1 - scripts/ci/build_dart_ddc.sh | 1 - test-main.js | 4 - tools/broccoli/trees/browser_tree.ts | 1 - tools/typings-test/include-all.ts | 4 - tools/typings-test/test.sh | 2 +- 65 files changed, 19 insertions(+), 5172 deletions(-) delete mode 100644 modules/@angular/router/index.ts delete mode 100644 modules/@angular/router/package.json delete mode 100644 modules/@angular/router/platform_browser_private.dart delete mode 100644 modules/@angular/router/platform_browser_private.ts delete mode 100644 modules/@angular/router/rollup.config.js delete mode 100644 modules/@angular/router/src/constants.ts delete mode 100644 modules/@angular/router/src/core_private.ts delete mode 100644 modules/@angular/router/src/directives/router_directives.ts delete mode 100644 modules/@angular/router/src/directives/router_link.ts delete mode 100644 modules/@angular/router/src/directives/router_outlet.ts delete mode 120000 modules/@angular/router/src/facade delete mode 100644 modules/@angular/router/src/interfaces.ts delete mode 100644 modules/@angular/router/src/lifecycle_reflector.dart delete mode 100644 modules/@angular/router/src/lifecycle_reflector.ts delete mode 100644 modules/@angular/router/src/link.ts delete mode 100644 modules/@angular/router/src/metadata/decorators.dart delete mode 100644 modules/@angular/router/src/metadata/decorators.ts delete mode 100644 modules/@angular/router/src/metadata/metadata.ts delete mode 100644 modules/@angular/router/src/recognize.ts delete mode 100644 modules/@angular/router/src/router.ts delete mode 100644 modules/@angular/router/src/router_providers.ts delete mode 100644 modules/@angular/router/src/router_providers_common.ts delete mode 100644 modules/@angular/router/src/router_url_serializer.ts delete mode 100644 modules/@angular/router/src/segments.ts delete mode 100644 modules/@angular/router/test/integration_spec.ts delete mode 100644 modules/@angular/router/test/link_spec.ts delete mode 100644 modules/@angular/router/test/recognize_spec.ts delete mode 100644 modules/@angular/router/test/router_link_spec.ts delete mode 100644 modules/@angular/router/test/router_url_serializer_spec.ts delete mode 100644 modules/@angular/router/test/tree_spec.ts delete mode 100644 modules/@angular/router/testing.ts delete mode 100644 modules/@angular/router/testing/router_testing_providers.ts delete mode 100644 modules/@angular/router/tsconfig-es2015.json delete mode 100644 modules/@angular/router/tsconfig-es5.json delete mode 100644 modules/playground/e2e_test/alt_routing/routing_spec.dart delete mode 100644 modules/playground/e2e_test/alt_routing/routing_spec.ts delete mode 100644 modules/playground/src/alt_routing/app/data.ts delete mode 100644 modules/playground/src/alt_routing/app/drafts.html delete mode 100644 modules/playground/src/alt_routing/app/inbox-app.html delete mode 100644 modules/playground/src/alt_routing/app/inbox-app.ts delete mode 100644 modules/playground/src/alt_routing/app/inbox-detail.html delete mode 100644 modules/playground/src/alt_routing/app/inbox.html delete mode 100644 modules/playground/src/alt_routing/css/app.css delete mode 100644 modules/playground/src/alt_routing/index.html delete mode 100644 modules/playground/src/alt_routing/index.ts diff --git a/build.sh b/build.sh index 5f3a6e7f90..2d700e7a9d 100755 --- a/build.sh +++ b/build.sh @@ -49,7 +49,6 @@ for PACKAGE in \ platform-browser-dynamic \ platform-server \ http \ - router \ router-deprecated \ upgrade \ compiler-cli diff --git a/modules/@angular/compiler-cli/test/reflector_host_spec.ts b/modules/@angular/compiler-cli/test/reflector_host_spec.ts index 47077bcbb2..2a667b9f70 100644 --- a/modules/@angular/compiler-cli/test/reflector_host_spec.ts +++ b/modules/@angular/compiler-cli/test/reflector_host_spec.ts @@ -1,7 +1,7 @@ import {beforeEach, ddescribe, describe, expect, iit, it} from '@angular/core/testing/testing_internal'; import * as ts from 'typescript'; -import {ReflectorHost, ReflectorHostContext} from '../src/reflector_host'; +import {ReflectorHost} from '../src/reflector_host'; import {Directory, Entry, MockCompilerHost, MockContext} from './mocks'; @@ -64,11 +64,13 @@ describe('reflector_host', () => { }); it('should be able to produce a symbol for an exported symbol', () => { - expect(reflectorHost.findDeclaration('@angular/router', 'foo', 'main.ts')).toBeDefined(); + expect(reflectorHost.findDeclaration('@angular/router-deprecated', 'foo', 'main.ts')) + .toBeDefined(); }); it('should be able to produce a symbol for values space only reference', () => { - expect(reflectorHost.findDeclaration('@angular/router/src/providers', 'foo', 'main.ts')) + expect( + reflectorHost.findDeclaration('@angular/router-deprecated/src/providers', 'foo', 'main.ts')) .toBeDefined(); }); @@ -90,7 +92,7 @@ const FILES: Entry = { 'src': { 'main.ts': ` import * as c from '@angular/core'; - import * as r from '@angular/router'; + import * as r from '@angular/router-deprecated'; import * as u from './lib/utils'; import * as cs from './lib/collections'; import * as u2 from './lib2/utils2'; @@ -105,7 +107,8 @@ const FILES: Entry = { 'core.d.ts': dummyModule, 'core.metadata.json': `{"__symbolic":"module", "version": 1, "metadata": {"foo": {"__symbolic": "class"}}}`, - 'router': {'index.d.ts': dummyModule, 'src': {'providers.d.ts': dummyModule}} + 'router-deprecated': + {'index.d.ts': dummyModule, 'src': {'providers.d.ts': dummyModule}} } } } diff --git a/modules/@angular/core/test/dev_mode_spec.ts b/modules/@angular/core/test/dev_mode_spec.ts index 98da58a32b..d7765815b6 100644 --- a/modules/@angular/core/test/dev_mode_spec.ts +++ b/modules/@angular/core/test/dev_mode_spec.ts @@ -1,5 +1,4 @@ import {isDevMode} from '@angular/core'; - import {beforeEach, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '../testing'; export function main() { diff --git a/modules/@angular/core/test/fake_async_spec.ts b/modules/@angular/core/test/fake_async_spec.ts index d8e5a21ae7..cca3b7247a 100644 --- a/modules/@angular/core/test/fake_async_spec.ts +++ b/modules/@angular/core/test/fake_async_spec.ts @@ -1,7 +1,7 @@ import {beforeEach, ddescribe, describe, expect, iit, inject, it, xit} from '@angular/core/testing/testing_internal'; import {fakeAsync, flushMicrotasks, Log, tick, discardPeriodicTasks,} from '@angular/core/testing'; -import {TimerWrapper, PromiseWrapper} from '../../router/src/facade/async'; -import {BaseException} from '../../router/src/facade/exceptions'; +import {TimerWrapper, PromiseWrapper} from '../../router-deprecated/src/facade/async'; +import {BaseException} from '../../router-deprecated/src/facade/exceptions'; import {Parser} from '../../compiler/src/expression_parser/parser'; export function main() { diff --git a/modules/@angular/core/test/testing_internal_spec.ts b/modules/@angular/core/test/testing_internal_spec.ts index 925dd3cd29..da7fc51703 100644 --- a/modules/@angular/core/test/testing_internal_spec.ts +++ b/modules/@angular/core/test/testing_internal_spec.ts @@ -1,7 +1,7 @@ import {SpyObject} from '@angular/core/testing/testing_internal'; import {MapWrapper} from '../../platform-browser/src/facade/collection'; -import {RegExpWrapper} from '../../router/src/facade/lang'; +import {RegExpWrapper} from '../../router-deprecated/src/facade/lang'; import {beforeEach, containsRegexp, ddescribe, describe, expect, iit, it, tick} from '../testing'; class TestObj { diff --git a/modules/@angular/platform-browser-dynamic/test/testing_public_browser_spec.ts b/modules/@angular/platform-browser-dynamic/test/testing_public_browser_spec.ts index 31c39ce3a1..2f11a57ab8 100644 --- a/modules/@angular/platform-browser-dynamic/test/testing_public_browser_spec.ts +++ b/modules/@angular/platform-browser-dynamic/test/testing_public_browser_spec.ts @@ -1,8 +1,7 @@ import {it, iit, xit, describe, ddescribe, xdescribe, expect, beforeEach, beforeEachProviders, inject,} from '@angular/core/testing'; import {async, fakeAsync, flushMicrotasks, Log, tick,} from '@angular/core/testing'; -import {ROUTER_FAKE_PROVIDERS} from '@angular/router/testing'; -import {ROUTER_DIRECTIVES, Routes, Route} from '@angular/router'; +import {ROUTER_DIRECTIVES, Route} from '@angular/router-deprecated'; import {Component, bind} from '@angular/core'; @@ -37,10 +36,6 @@ class BadTemplateUrl { `one two`, directives: [ROUTER_DIRECTIVES] }) -@Routes([ - new Route({path: '/One', component: BadTemplateUrl}), - new Route({path: '/Two', component: ExternalTemplateComp}), -]) class TestRouterComponent { } @@ -169,15 +164,4 @@ export function main() { 10000); // Long timeout here because this test makes an actual XHR, and is slow on Edge. }); }); - - describe('apps with router components', () => { - beforeEachProviders(() => [ROUTER_FAKE_PROVIDERS]); - - it('should build without a problem', - async(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { - tcb.createAsync(TestRouterComponent).then((fixture) => { - expect(fixture.nativeElement).toHaveText('one two'); - }); - }))); - }); } diff --git a/modules/@angular/router/index.ts b/modules/@angular/router/index.ts deleted file mode 100644 index 0e345abe68..0000000000 --- a/modules/@angular/router/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @module - * @description - * Maps application URLs into application states, to support deep-linking and navigation. - */ - -export {ROUTER_DIRECTIVES} from './src/directives/router_directives'; -export {RouterLink} from './src/directives/router_link'; -export {RouterOutlet} from './src/directives/router_outlet'; -export {CanDeactivate, OnActivate} from './src/interfaces'; -export {Routes} from './src/metadata/decorators'; -export {Route} from './src/metadata/metadata'; -export {Router, RouterOutletMap} from './src/router'; -export {ROUTER_PROVIDERS} from './src/router_providers'; -export {DefaultRouterUrlSerializer, RouterUrlSerializer} from './src/router_url_serializer'; -export {RouteSegment, RouteTree, Tree, UrlSegment, UrlTree} from './src/segments'; diff --git a/modules/@angular/router/package.json b/modules/@angular/router/package.json deleted file mode 100644 index 1c43c001d5..0000000000 --- a/modules/@angular/router/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@angular/router", - "version": "0.0.0-PLACEHOLDER", - "description": "", - "main": "index.js", - "jsnext:main": "esm/index.js", - "typins": "index.d.ts", - "author": "angular", - "license": "MIT", - "peerDependencies": { - "@angular/core": "0.0.0-PLACEHOLDER", - "@angular/common": "0.0.0-PLACEHOLDER", - "@angular/platform-browser": "0.0.0-PLACEHOLDER" - }, - "repository": { - "type": "git", - "url": "https://github.com/angular/angular.git" - } -} diff --git a/modules/@angular/router/platform_browser_private.dart b/modules/@angular/router/platform_browser_private.dart deleted file mode 100644 index 6bdd163a76..0000000000 --- a/modules/@angular/router/platform_browser_private.dart +++ /dev/null @@ -1 +0,0 @@ -export './platform-browser.dart' show DomAdapter, setRootDomAdapter; diff --git a/modules/@angular/router/platform_browser_private.ts b/modules/@angular/router/platform_browser_private.ts deleted file mode 100644 index 63b9199466..0000000000 --- a/modules/@angular/router/platform_browser_private.ts +++ /dev/null @@ -1,4 +0,0 @@ -import {__platform_browser_private__ as _} from '@angular/platform-browser'; - -export type DomAdapter = typeof _.DomAdapter; -export var getDOM: typeof _.getDOM = _.getDOM; diff --git a/modules/@angular/router/rollup.config.js b/modules/@angular/router/rollup.config.js deleted file mode 100644 index 8bc3b06149..0000000000 --- a/modules/@angular/router/rollup.config.js +++ /dev/null @@ -1,19 +0,0 @@ - -export default { - entry: '../../../dist/packages-dist/router/esm/index.js', - dest: '../../../dist/packages-dist/router/esm/router.umd.js', - format: 'umd', - moduleName: 'ng.router', - globals: { - '@angular/core': 'ng.core', - '@angular/common': 'ng.common', - '@angular/platform-browser': 'ng.platformBrowser', - 'rxjs/Subject': 'Rx', - 'rxjs/observable/PromiseObservable': 'Rx', // this is wrong, but this stuff has changed in rxjs b.6 so we need to fix it when we update. - 'rxjs/operator/toPromise': 'Rx.Observable.prototype', - 'rxjs/Observable': 'Rx' - }, - plugins: [ -// nodeResolve({ jsnext: true, main: true }), - ] -} diff --git a/modules/@angular/router/src/constants.ts b/modules/@angular/router/src/constants.ts deleted file mode 100644 index 87231d2f15..0000000000 --- a/modules/@angular/router/src/constants.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Name of the default outlet outlet. - * @type {string} - */ -export const DEFAULT_OUTLET_NAME = '__DEFAULT'; \ No newline at end of file diff --git a/modules/@angular/router/src/core_private.ts b/modules/@angular/router/src/core_private.ts deleted file mode 100644 index f05714f384..0000000000 --- a/modules/@angular/router/src/core_private.ts +++ /dev/null @@ -1,4 +0,0 @@ -import {__core_private__ as _} from '@angular/core'; - -export var makeDecorator: typeof _.makeDecorator = _.makeDecorator; -export var reflector: typeof _.reflector = _.reflector; diff --git a/modules/@angular/router/src/directives/router_directives.ts b/modules/@angular/router/src/directives/router_directives.ts deleted file mode 100644 index 63e0c83121..0000000000 --- a/modules/@angular/router/src/directives/router_directives.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {RouterLink} from './router_link'; -import {RouterOutlet} from './router_outlet'; - -/** - * A list of directives. To use the router directives like {@link RouterOutlet} and - * {@link RouterLink}, add this to your `directives` array in the {@link View} decorator of your - * component. - * - * ``` - * import {Component} from '@angular/core'; - * import {ROUTER_DIRECTIVES, Routes} from '@angular/router'; - * - * @Component({directives: [ROUTER_DIRECTIVES]}) - * @Routes([ - * {...}, - * ]) - * class AppCmp { - * // ... - * } - * - * bootstrap(AppCmp); - * ``` - */ - -export const ROUTER_DIRECTIVES: any[] = /*@ts2dart_const*/[RouterOutlet, RouterLink]; diff --git a/modules/@angular/router/src/directives/router_link.ts b/modules/@angular/router/src/directives/router_link.ts deleted file mode 100644 index 04cb72a6f8..0000000000 --- a/modules/@angular/router/src/directives/router_link.ts +++ /dev/null @@ -1,95 +0,0 @@ -import {LocationStrategy} from '@angular/common'; -import {Directive, HostBinding, HostListener, Input, OnDestroy} from '@angular/core'; - -import {ObservableWrapper} from '../facade/async'; -import {isArray, isPresent, isString} from '../facade/lang'; -import {Router} from '../router'; -import {RouteSegment} from '../segments'; - - -/** - * The RouterLink directive lets you link to specific parts of your app. - * - * Consider the following route configuration: - - * ``` - * @Routes([ - * { path: '/user', component: UserCmp } - * ]); - * class MyComp {} - * ``` - * - * When linking to this `User` route, you can write: - * - * ``` - * link to user component - * ``` - * - * RouterLink expects the value to be an array of path segments, followed by the params - * for that level of routing. For instance `['/team', {teamId: 1}, 'user', {userId: 2}]` - * means that we want to generate a link to `/team;teamId=1/user;userId=2`. - * - * The first segment name can be prepended with `/`, `./`, or `../`. - * If the segment begins with `/`, the router will look up the route from the root of the app. - * If the segment begins with `./`, or doesn't begin with a slash, the router will - * instead look in the current component's children for the route. - * And if the segment begins with `../`, the router will go up one segment in the url. - * - * See {@link Router.createUrlTree} for more information. - */ -@Directive({selector: '[routerLink]'}) -export class RouterLink implements OnDestroy { - @Input() target: string; - private _commands: any[] = []; - private _subscription: any; - - // the url displayed on the anchor element. - @HostBinding() href: string; - @HostBinding('class.router-link-active') isActive: boolean = false; - - constructor( - private _routeSegment: RouteSegment, private _router: Router, - private _locationStrategy: LocationStrategy) { - // because auxiliary links take existing primary and auxiliary routes into account, - // we need to update the link whenever params or other routes change. - this._subscription = - ObservableWrapper.subscribe(_router.changes, (_) => { this._updateTargetUrlAndHref(); }); - } - - ngOnDestroy() { ObservableWrapper.dispose(this._subscription); } - - @Input() - set routerLink(data: any[]|any) { - if (isArray(data)) { - this._commands = data; - } else { - this._commands = [data]; - } - this._updateTargetUrlAndHref(); - } - - - @HostListener('click', ['$event.button', '$event.ctrlKey', '$event.metaKey']) - onClick(button: number, ctrlKey: boolean, metaKey: boolean): boolean { - if (button != 0 || ctrlKey || metaKey) { - return true; - } - - if (isString(this.target) && this.target != '_self') { - return true; - } - - this._router.navigate(this._commands, this._routeSegment); - return false; - } - - private _updateTargetUrlAndHref(): void { - let tree = this._router.createUrlTree(this._commands, this._routeSegment); - if (isPresent(tree)) { - this.href = this._locationStrategy.prepareExternalUrl(this._router.serializeUrl(tree)); - this.isActive = this._router.urlTree.contains(tree); - } else { - this.isActive = false; - } - } -} diff --git a/modules/@angular/router/src/directives/router_outlet.ts b/modules/@angular/router/src/directives/router_outlet.ts deleted file mode 100644 index 05aa61c6d9..0000000000 --- a/modules/@angular/router/src/directives/router_outlet.ts +++ /dev/null @@ -1,60 +0,0 @@ -import {Attribute, ComponentFactory, ComponentRef, Directive, ReflectiveInjector, ResolvedReflectiveProvider, ViewContainerRef} from '@angular/core'; - -import {DEFAULT_OUTLET_NAME} from '../constants'; -import {isBlank, isPresent} from '../facade/lang'; -import {RouterOutletMap} from '../router'; - - -/** - * A router outlet is a placeholder that Angular dynamically fills based on the application's route. - * - * ## Use - * - * ``` - * - * ``` - * - * Outlets can be named. - * - * ``` - * - * ``` - */ -@Directive({selector: 'router-outlet'}) -export class RouterOutlet { - private _activated: ComponentRef; - public outletMap: RouterOutletMap; - - constructor( - parentOutletMap: RouterOutletMap, private _location: ViewContainerRef, - @Attribute('name') name: string) { - parentOutletMap.registerOutlet(isBlank(name) ? DEFAULT_OUTLET_NAME : name, this); - } - - deactivate(): void { - this._activated.destroy(); - this._activated = null; - } - - /** - * Returns the loaded component. - */ - get component(): Object { return isPresent(this._activated) ? this._activated.instance : null; } - - /** - * Returns true is the outlet is not empty. - */ - get isActivated(): boolean { return isPresent(this._activated); } - - /** - * Called by the Router to instantiate a new component. - */ - activate( - factory: ComponentFactory, providers: ResolvedReflectiveProvider[], - outletMap: RouterOutletMap): ComponentRef { - this.outletMap = outletMap; - let inj = ReflectiveInjector.fromResolvedProviders(providers, this._location.parentInjector); - this._activated = this._location.createComponent(factory, this._location.length, inj, []); - return this._activated; - } -} diff --git a/modules/@angular/router/src/facade b/modules/@angular/router/src/facade deleted file mode 120000 index e084c803c6..0000000000 --- a/modules/@angular/router/src/facade +++ /dev/null @@ -1 +0,0 @@ -../../facade/src \ No newline at end of file diff --git a/modules/@angular/router/src/interfaces.ts b/modules/@angular/router/src/interfaces.ts deleted file mode 100644 index 1c307b370c..0000000000 --- a/modules/@angular/router/src/interfaces.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {RouteSegment, RouteTree, Tree} from './segments'; - - -/** - * Defines route lifecycle method `routerOnActivate`, which is called by the router at the end of a - * successful route navigation. - * - * The `routerOnActivate` hook is called with the current and previous {@link RouteSegment}s of the - * component and with the corresponding route trees. - */ -export interface OnActivate { - routerOnActivate( - curr: RouteSegment, prev?: RouteSegment, currTree?: RouteTree, prevTree?: RouteTree): void; -} - -/** - * Defines route lifecycle method `routerOnDeactivate`, which is called by the router before - * destroying a component as part of a route change. - * - * The `routerOnDeactivate` hook is called with two {@link RouteTree}s, representing the current - * and the future state of the application. - * - * `routerOnDeactivate` must return a promise. The route change will wait until the promise settles. - */ -export interface CanDeactivate { - routerCanDeactivate(currTree?: RouteTree, futureTree?: RouteTree): Promise; -} \ No newline at end of file diff --git a/modules/@angular/router/src/lifecycle_reflector.dart b/modules/@angular/router/src/lifecycle_reflector.dart deleted file mode 100644 index 197df5fd48..0000000000 --- a/modules/@angular/router/src/lifecycle_reflector.dart +++ /dev/null @@ -1,6 +0,0 @@ -import './interfaces.dart'; -bool hasLifecycleHook(String name, Object obj) { - if (name == "routerOnActivate") return obj is OnActivate; - if (name == "routerCanDeactivate") return obj is CanDeactivate; - return false; -} diff --git a/modules/@angular/router/src/lifecycle_reflector.ts b/modules/@angular/router/src/lifecycle_reflector.ts deleted file mode 100644 index 020e18421b..0000000000 --- a/modules/@angular/router/src/lifecycle_reflector.ts +++ /dev/null @@ -1,8 +0,0 @@ -import {Type, isBlank} from './facade/lang'; - -export function hasLifecycleHook(name: string, obj: Object): boolean { - if (isBlank(obj)) return false; - let type = obj.constructor; - if (!(type instanceof Type)) return false; - return name in (type).prototype; -} diff --git a/modules/@angular/router/src/link.ts b/modules/@angular/router/src/link.ts deleted file mode 100644 index 1545bb787a..0000000000 --- a/modules/@angular/router/src/link.ts +++ /dev/null @@ -1,213 +0,0 @@ -import {ListWrapper, StringMapWrapper} from './facade/collection'; -import {BaseException} from './facade/exceptions'; -import {isBlank, isPresent, isString, isStringMap} from './facade/lang'; -import {RouteSegment, RouteTree, Tree, TreeNode, UrlSegment, UrlTree, rootNode} from './segments'; - -export function link( - segment: RouteSegment, routeTree: RouteTree, urlTree: UrlTree, commands: any[]): UrlTree { - if (commands.length === 0) return urlTree; - - let normalizedCommands = _normalizeCommands(commands); - if (_navigateToRoot(normalizedCommands)) { - return new UrlTree(new TreeNode(urlTree.root, [])); - } - - let startingNode = _findStartingNode(normalizedCommands, urlTree, segment, routeTree); - let updated = normalizedCommands.commands.length > 0 ? - _updateMany(ListWrapper.clone(startingNode.children), normalizedCommands.commands) : - []; - let newRoot = _constructNewTree(rootNode(urlTree), startingNode, updated); - - return new UrlTree(newRoot); -} - -function _navigateToRoot(normalizedChange: _NormalizedNavigationCommands): boolean { - return normalizedChange.isAbsolute && normalizedChange.commands.length === 1 && - normalizedChange.commands[0] == '/'; -} - -class _NormalizedNavigationCommands { - constructor( - public isAbsolute: boolean, public numberOfDoubleDots: number, public commands: any[]) {} -} - -function _normalizeCommands(commands: any[]): _NormalizedNavigationCommands { - if (isString(commands[0]) && commands.length === 1 && commands[0] == '/') { - return new _NormalizedNavigationCommands(true, 0, commands); - } - - let numberOfDoubleDots = 0; - let isAbsolute = false; - let res: any[] /** TODO #9100 */ = []; - - for (let i = 0; i < commands.length; ++i) { - let c = commands[i]; - - if (!isString(c)) { - res.push(c); - continue; - } - - let parts = c.split('/'); - for (let j = 0; j < parts.length; ++j) { - let cc = parts[j]; - - // first exp is treated in a special way - if (i == 0) { - if (j == 0 && cc == '.') { // './a' - // skip it - } else if (j == 0 && cc == '') { // '/a' - isAbsolute = true; - } else if (cc == '..') { // '../a' - numberOfDoubleDots++; - } else if (cc != '') { - res.push(cc); - } - - } else { - if (cc != '') { - res.push(cc); - } - } - } - } - - return new _NormalizedNavigationCommands(isAbsolute, numberOfDoubleDots, res); -} - -function _findUrlSegment( - segment: RouteSegment, routeTree: RouteTree, urlTree: UrlTree, - numberOfDoubleDots: number): UrlSegment { - let s = segment; - while (s.urlSegments.length === 0) { - s = routeTree.parent(s); - } - let urlSegment = ListWrapper.last(s.urlSegments); - let path = urlTree.pathFromRoot(urlSegment); - if (path.length <= numberOfDoubleDots) { - throw new BaseException('Invalid number of \'../\''); - } - return path[path.length - 1 - numberOfDoubleDots]; -} - -function _findStartingNode( - normalizedChange: _NormalizedNavigationCommands, urlTree: UrlTree, segment: RouteSegment, - routeTree: RouteTree): TreeNode { - if (normalizedChange.isAbsolute) { - return rootNode(urlTree); - } else { - let urlSegment = - _findUrlSegment(segment, routeTree, urlTree, normalizedChange.numberOfDoubleDots); - return _findMatchingNode(urlSegment, rootNode(urlTree)); - } -} - -function _findMatchingNode(segment: UrlSegment, node: TreeNode): TreeNode { - if (node.value === segment) return node; - for (var c of node.children) { - let r = _findMatchingNode(segment, c); - if (isPresent(r)) return r; - } - return null; -} - -function _constructNewTree( - node: TreeNode, original: TreeNode, - updated: TreeNode[]): TreeNode { - if (node === original) { - return new TreeNode(node.value, updated); - } else { - return new TreeNode( - node.value, node.children.map(c => _constructNewTree(c, original, updated))); - } -} - -function _update(node: TreeNode, commands: any[]): TreeNode { - let rest = commands.slice(1); - let next = rest.length === 0 ? null : rest[0]; - let outlet = _outlet(commands); - let segment = _segment(commands); - - // reach the end of the tree => create new tree nodes. - if (isBlank(node) && !isStringMap(next)) { - let urlSegment = new UrlSegment(segment, {}, outlet); - let children = rest.length === 0 ? [] : [_update(null, rest)]; - return new TreeNode(urlSegment, children); - - } else if (isBlank(node) && isStringMap(next)) { - let urlSegment = new UrlSegment(segment, _stringify(next), outlet); - return _recurse(urlSegment, node, rest.slice(1)); - - // different outlet => preserve the subtree - } else if (outlet != node.value.outlet) { - return node; - - // params command - } else if (isStringMap(segment)) { - let newSegment = new UrlSegment(node.value.segment, _stringify(segment), node.value.outlet); - return _recurse(newSegment, node, rest); - - // next one is a params command && can reuse the node - } else if (isStringMap(next) && _compare(segment, _stringify(next), node.value)) { - return _recurse(node.value, node, rest.slice(1)); - - // next one is a params command && cannot reuse the node - } else if (isStringMap(next)) { - let urlSegment = new UrlSegment(segment, _stringify(next), outlet); - return _recurse(urlSegment, node, rest.slice(1)); - - // next one is not a params command && can reuse the node - } else if (_compare(segment, {}, node.value)) { - return _recurse(node.value, node, rest); - - // next one is not a params command && cannot reuse the node - } else { - let urlSegment = new UrlSegment(segment, {}, outlet); - return _recurse(urlSegment, node, rest); - } -} - -function _stringify(params: {[key: string]: any}): {[key: string]: string} { - let res = {}; - StringMapWrapper.forEach( - params, (v: any /** TODO #9100 */, k: any /** TODO #9100 */) => - (res as any /** TODO #9100 */)[k] = v.toString()); - return res; -} - -function _compare(path: string, params: {[key: string]: any}, segment: UrlSegment): boolean { - return path == segment.segment && StringMapWrapper.equals(params, segment.parameters); -} - -function _recurse( - urlSegment: UrlSegment, node: TreeNode, rest: any[]): TreeNode { - if (rest.length === 0) { - return new TreeNode(urlSegment, []); - } - return new TreeNode(urlSegment, _updateMany(ListWrapper.clone(node.children), rest)); -} - -function _updateMany(nodes: TreeNode[], commands: any[]): TreeNode[] { - let outlet = _outlet(commands); - let nodesInRightOutlet = nodes.filter(c => c.value.outlet == outlet); - if (nodesInRightOutlet.length > 0) { - let nodeRightOutlet = nodesInRightOutlet[0]; // there can be only one - nodes[nodes.indexOf(nodeRightOutlet)] = _update(nodeRightOutlet, commands); - } else { - nodes.push(_update(null, commands)); - } - - return nodes; -} - -function _segment(commands: any[]): any { - if (!isString(commands[0])) return commands[0]; - let parts = commands[0].toString().split(':'); - return parts.length > 1 ? parts[1] : commands[0]; -} - -function _outlet(commands: any[]): string { - if (!isString(commands[0])) return null; - let parts = commands[0].toString().split(':'); - return parts.length > 1 ? parts[0] : null; -} diff --git a/modules/@angular/router/src/metadata/decorators.dart b/modules/@angular/router/src/metadata/decorators.dart deleted file mode 100644 index 5f4dce731d..0000000000 --- a/modules/@angular/router/src/metadata/decorators.dart +++ /dev/null @@ -1,13 +0,0 @@ -library angular.alt_router.decorators; - -import 'metadata.dart'; -export 'metadata.dart'; - -/** - * Defines routes for a given component. - * - * It takes an array of {@link RouteMetadata}s. - */ -class Routes extends RoutesMetadata { - const Routes(List routes): super(routes); -} \ No newline at end of file diff --git a/modules/@angular/router/src/metadata/decorators.ts b/modules/@angular/router/src/metadata/decorators.ts deleted file mode 100644 index 73dfbf5eb7..0000000000 --- a/modules/@angular/router/src/metadata/decorators.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {makeDecorator} from '../core_private'; - -import {RouteMetadata, RoutesMetadata} from './metadata'; - - -/** - * Defines routes for a given component. - * - * It takes an array of {@link RouteMetadata}s. - */ -export interface RoutesFactory { - (routes: RouteMetadata[]): any; - new (routes: RouteMetadata[]): RoutesMetadata; -} - -/** - * Defines routes for a given component. - * - * It takes an array of {@link RouteMetadata}s. - * @Annotation - */ -export var Routes: RoutesFactory = makeDecorator(RoutesMetadata); diff --git a/modules/@angular/router/src/metadata/metadata.ts b/modules/@angular/router/src/metadata/metadata.ts deleted file mode 100644 index eacc6515bc..0000000000 --- a/modules/@angular/router/src/metadata/metadata.ts +++ /dev/null @@ -1,51 +0,0 @@ -import {Type} from '@angular/core'; -import {stringify} from '../facade/lang'; - -/** - * Information about a route. - * - * It has the following properties: - * - `path` is a string that uses the route matcher DSL. - * - `component` a component type. - * - * ### Example - * ``` - * import {Routes} from '@angular/router'; - * - * @Routes([ - * {path: '/home', component: HomeCmp} - * ]) - * class MyApp {} - * ``` - * - * @ts2dart_const - */ -export abstract class RouteMetadata { - abstract get path(): string; - abstract get component(): Type|string; -} - -/** - * See {@link RouteMetadata} for more information. - * @ts2dart_const - */ -export class Route implements RouteMetadata { - path: string; - component: Type|string; - constructor({path, component}: {path?: string, component?: Type|string} = {}) { - this.path = path; - this.component = component; - } - toString(): string { return `@Route(${this.path}, ${stringify(this.component)})`; } -} - -/** - * Defines routes for a given component. - * - * It takes an array of {@link RouteMetadata}s. - * @ts2dart_const - */ -export class RoutesMetadata { - constructor(public routes: RouteMetadata[]) {} - toString(): string { return `@Routes(${this.routes})`; } -} diff --git a/modules/@angular/router/src/recognize.ts b/modules/@angular/router/src/recognize.ts deleted file mode 100644 index b278379777..0000000000 --- a/modules/@angular/router/src/recognize.ts +++ /dev/null @@ -1,210 +0,0 @@ -import {BaseException, ComponentFactory, ComponentResolver} from '@angular/core'; - -import {DEFAULT_OUTLET_NAME} from './constants'; -import {reflector} from './core_private'; -import {ListWrapper, StringMapWrapper} from './facade/collection'; -import {Type, isBlank, isPresent, stringify} from './facade/lang'; -import {PromiseWrapper} from './facade/promise'; -import {RouteMetadata, RoutesMetadata} from './metadata/metadata'; -import {RouteSegment, RouteTree, Tree, TreeNode, UrlSegment, UrlTree, equalUrlSegments, rootNode} from './segments'; - -export function recognize( - componentResolver: ComponentResolver, rootComponent: Type, url: UrlTree, - existingTree: RouteTree): Promise { - let matched = new _MatchResult(rootComponent, [url.root], {}, rootNode(url).children, []); - return _constructSegment(componentResolver, matched, rootNode(existingTree)) - .then(roots => new RouteTree(roots[0])); -} - -function _recognize( - componentResolver: ComponentResolver, parentComponent: Type, url: TreeNode, - existingSegments: TreeNode[]): Promise[]> { - let metadata = _readMetadata(parentComponent); // should read from the factory instead - if (isBlank(metadata)) { - throw new BaseException( - `Component '${stringify(parentComponent)}' does not have route configuration`); - } - - let match: any /** TODO #9100 */; - try { - match = _match(metadata, url); - } catch (e) { - return PromiseWrapper.reject(e, null); - } - - let segmentsWithRightOutlet = existingSegments.filter(r => r.value.outlet == match.outlet); - let segmentWithRightOutlet = - segmentsWithRightOutlet.length > 0 ? segmentsWithRightOutlet[0] : null; - - let main = _constructSegment(componentResolver, match, segmentWithRightOutlet); - let aux = _recognizeMany(componentResolver, parentComponent, match.aux, existingSegments) - .then(_checkOutletNameUniqueness); - return PromiseWrapper.all([main, aux]).then(ListWrapper.flatten); -} - -function _recognizeMany( - componentResolver: ComponentResolver, parentComponent: Type, urls: TreeNode[], - existingSegments: TreeNode[]): Promise[]> { - let recognized = - urls.map(u => _recognize(componentResolver, parentComponent, u, existingSegments)); - return PromiseWrapper.all(recognized).then(ListWrapper.flatten); -} - -function _constructSegment( - componentResolver: ComponentResolver, matched: _MatchResult, - existingSegment: TreeNode): Promise[]> { - return componentResolver.resolveComponent(matched.component).then(factory => { - let segment = _createOrReuseSegment(matched, factory, existingSegment); - let existingChildren = isPresent(existingSegment) ? existingSegment.children : []; - - if (matched.leftOverUrl.length > 0) { - return _recognizeMany( - componentResolver, factory.componentType, matched.leftOverUrl, existingChildren) - .then(children => [new TreeNode(segment, children)]); - } else { - return _recognizeLeftOvers(componentResolver, factory.componentType, existingChildren) - .then(children => [new TreeNode(segment, children)]); - } - }); -} - -function _createOrReuseSegment( - matched: _MatchResult, factory: ComponentFactory, - segmentNode: TreeNode): RouteSegment { - let segment = isPresent(segmentNode) ? segmentNode.value : null; - - if (isPresent(segment) && equalUrlSegments(segment.urlSegments, matched.consumedUrlSegments) && - StringMapWrapper.equals(segment.parameters, matched.parameters) && - segment.outlet == matched.outlet && factory.componentType == segment.type) { - return segment; - } else { - return new RouteSegment( - matched.consumedUrlSegments, matched.parameters, matched.outlet, factory.componentType, - factory); - } -} - -function _recognizeLeftOvers( - componentResolver: ComponentResolver, parentComponent: Type, - existingSegments: TreeNode[]): Promise[]> { - return componentResolver.resolveComponent(parentComponent).then(factory => { - let metadata = _readMetadata(factory.componentType); - if (isBlank(metadata)) { - return []; - } - - let r = (metadata.routes).filter(r => r.path == '' || r.path == '/'); - if (r.length === 0) { - return PromiseWrapper.resolve([]); - } else { - let segmentsWithMatchingOutlet = - existingSegments.filter(r => r.value.outlet == DEFAULT_OUTLET_NAME); - let segmentWithMatchingOutlet = - segmentsWithMatchingOutlet.length > 0 ? segmentsWithMatchingOutlet[0] : null; - let existingChildren = - isPresent(segmentWithMatchingOutlet) ? segmentWithMatchingOutlet.children : []; - - return _recognizeLeftOvers(componentResolver, r[0].component, existingChildren) - .then(children => { - return componentResolver.resolveComponent(r[0].component).then(factory => { - let segment = _createOrReuseSegment( - new _MatchResult(r[0].component, [], {}, [], []), factory, - segmentWithMatchingOutlet); - return [new TreeNode(segment, children)]; - }); - }); - } - }); -} - -function _match(metadata: RoutesMetadata, url: TreeNode): _MatchResult { - for (let r of metadata.routes) { - let matchingResult = _matchWithParts(r, url); - if (isPresent(matchingResult)) { - return matchingResult; - } - } - let availableRoutes = metadata.routes.map(r => `'${r.path}'`).join(', '); - throw new BaseException( - `Cannot match any routes. Current segment: '${url.value}'. Available routes: [${availableRoutes}].`); -} - -function _matchWithParts(route: RouteMetadata, url: TreeNode): _MatchResult { - let path = route.path.startsWith('/') ? route.path.substring(1) : route.path; - - if (path == '*') { - return new _MatchResult(route.component, [], null, [], []); - } - - let parts = path.split('/'); - let positionalParams = {}; - let consumedUrlSegments: any[] /** TODO #9100 */ = []; - - let lastParent: TreeNode = null; - let lastSegment: TreeNode = null; - - let current = url; - for (let i = 0; i < parts.length; ++i) { - if (isBlank(current)) return null; - - let p = parts[i]; - let isLastSegment = i === parts.length - 1; - let isLastParent = i === parts.length - 2; - let isPosParam = p.startsWith(':'); - - if (!isPosParam && p != current.value.segment) return null; - if (isLastSegment) { - lastSegment = current; - } - if (isLastParent) { - lastParent = current; - } - - if (isPosParam) { - (positionalParams as any /** TODO #9100 */)[p.substring(1)] = current.value.segment; - } - - consumedUrlSegments.push(current.value); - - current = ListWrapper.first(current.children); - } - - let p = lastSegment.value.parameters; - let parameters = <{[key: string]: string}>StringMapWrapper.merge(p, positionalParams); - let axuUrlSubtrees = isPresent(lastParent) ? lastParent.children.slice(1) : []; - - return new _MatchResult( - route.component, consumedUrlSegments, parameters, lastSegment.children, axuUrlSubtrees); -} - -function _checkOutletNameUniqueness(nodes: TreeNode[]): TreeNode[] { - let names = {}; - nodes.forEach(n => { - let segmentWithSameOutletName = (names as any /** TODO #9100 */)[n.value.outlet]; - if (isPresent(segmentWithSameOutletName)) { - let p = segmentWithSameOutletName.stringifiedUrlSegments; - let c = n.value.stringifiedUrlSegments; - throw new BaseException(`Two segments cannot have the same outlet name: '${p}' and '${c}'.`); - } - (names as any /** TODO #9100 */)[n.value.outlet] = n.value; - }); - return nodes; -} - -class _MatchResult { - constructor( - public component: Type|string, public consumedUrlSegments: UrlSegment[], - public parameters: {[key: string]: string}, public leftOverUrl: TreeNode[], - public aux: TreeNode[]) {} - - get outlet(): string { - return this.consumedUrlSegments.length === 0 || isBlank(this.consumedUrlSegments[0].outlet) ? - DEFAULT_OUTLET_NAME : - this.consumedUrlSegments[0].outlet; - } -} - -function _readMetadata(componentType: Type) { - let metadata = reflector.annotations(componentType).filter(f => f instanceof RoutesMetadata); - return ListWrapper.first(metadata); -} diff --git a/modules/@angular/router/src/router.ts b/modules/@angular/router/src/router.ts deleted file mode 100644 index 0e124c0600..0000000000 --- a/modules/@angular/router/src/router.ts +++ /dev/null @@ -1,282 +0,0 @@ -import {Location} from '@angular/common'; -import {BaseException, ComponentResolver, ReflectiveInjector, provide} from '@angular/core'; - -import {DEFAULT_OUTLET_NAME} from './constants'; -import {RouterOutlet} from './directives/router_outlet'; -import {EventEmitter, Observable, ObservableWrapper, PromiseWrapper} from './facade/async'; -import {ListWrapper, StringMapWrapper} from './facade/collection'; -import {Type, isBlank, isPresent} from './facade/lang'; -import {CanDeactivate} from './interfaces'; -import {hasLifecycleHook} from './lifecycle_reflector'; -import {link} from './link'; -import {recognize} from './recognize'; -import {RouterUrlSerializer} from './router_url_serializer'; -import {RouteSegment, RouteTree, TreeNode, UrlSegment, UrlTree, createEmptyRouteTree, rootNode, routeSegmentComponentFactory, serializeRouteSegmentTree} from './segments'; - -export class RouterOutletMap { - /** @internal */ - _outlets: {[name: string]: RouterOutlet} = {}; - registerOutlet(name: string, outlet: RouterOutlet): void { this._outlets[name] = outlet; } -} - -/** - * The `Router` is responsible for mapping URLs to components. - * - * You can see the state of the router by inspecting the read-only fields `router.urlTree` - * and `router.routeTree`. - */ -export class Router { - private _routeTree: RouteTree; - private _urlTree: UrlTree; - private _locationSubscription: any; - private _changes: EventEmitter = new EventEmitter(); - - /** - * @internal - */ - constructor( - private _rootComponent: Object, private _rootComponentType: Type, - private _componentResolver: ComponentResolver, private _urlSerializer: RouterUrlSerializer, - private _routerOutletMap: RouterOutletMap, private _location: Location) { - this._routeTree = createEmptyRouteTree(this._rootComponentType); - this._setUpLocationChangeListener(); - this.navigateByUrl(this._location.path()); - } - - /** - * Returns the current url tree. - */ - get urlTree(): UrlTree { return this._urlTree; } - - /** - * Returns the current route tree. - */ - get routeTree(): RouteTree { return this._routeTree; } - - /** - * An observable or url changes from the router. - */ - get changes(): Observable { return this._changes; } - - /** - * Navigate based on the provided url. This navigation is always absolute. - * - * ### Usage - * - * ``` - * router.navigateByUrl("/team/33/user/11"); - * ``` - */ - navigateByUrl(url: string): Promise { - return this._navigate(this._urlSerializer.parse(url)); - } - - /** - * Navigate based on the provided array of commands and a starting point. - * If no segment is provided, the navigation is absolute. - * - * ### Usage - * - * ``` - * router.navigate(['team', 33, 'team', '11], segment); - * ``` - */ - navigate(commands: any[], segment?: RouteSegment): Promise { - return this._navigate(this.createUrlTree(commands, segment)); - } - - /** - * @internal - */ - dispose(): void { ObservableWrapper.dispose(this._locationSubscription); } - - /** - * Applies an array of commands to the current url tree and creates - * a new url tree. - * - * When given a segment, applies the given commands starting from the segment. - * When not given a segment, applies the given command starting from the root. - * - * ### Usage - * - * ``` - * // create /team/33/user/11 - * router.createUrlTree(['/team', 33, 'user', 11]); - * - * // create /team/33;expand=true/user/11 - * router.createUrlTree(['/team', 33, {expand: true}, 'user', 11]); - * - * // you can collapse static fragments like this - * router.createUrlTree(['/team/33/user', userId]); - * - * // assuming the current url is `/team/33/user/11` and the segment points to `user/11` - * - * // navigate to /team/33/user/11/details - * router.createUrlTree(['details'], segment); - * - * // navigate to /team/33/user/22 - * router.createUrlTree(['../22'], segment); - * - * // navigate to /team/44/user/22 - * router.createUrlTree(['../../team/44/user/22'], segment); - * ``` - */ - createUrlTree(commands: any[], segment?: RouteSegment): UrlTree { - let s = isPresent(segment) ? segment : this._routeTree.root; - return link(s, this._routeTree, this.urlTree, commands); - } - - /** - * Serializes a {@link UrlTree} into a string. - */ - serializeUrl(url: UrlTree): string { return this._urlSerializer.serialize(url); } - - private _setUpLocationChangeListener(): void { - this._locationSubscription = this._location.subscribe( - (change) => { this._navigate(this._urlSerializer.parse(change['url']), change['pop']); }); - } - - private _navigate(url: UrlTree, preventPushState?: boolean): Promise { - this._urlTree = url; - return recognize(this._componentResolver, this._rootComponentType, url, this._routeTree) - .then(currTree => { - return new _ActivateSegments(currTree, this._routeTree) - .activate(this._routerOutletMap, this._rootComponent) - .then(updated => { - if (updated) { - this._routeTree = currTree; - if (isBlank(preventPushState) || !preventPushState) { - let path = this._urlSerializer.serialize(this._urlTree); - if (this._location.isCurrentPathEqualTo(path)) { - this._location.replaceState(path); - } else { - this._location.go(path); - } - } - this._changes.emit(null); - } - }); - }); - } -} - - -class _ActivateSegments { - private deactivations: Object[][] = []; - private performMutation: boolean = true; - - constructor(private currTree: RouteTree, private prevTree: RouteTree) {} - - activate(parentOutletMap: RouterOutletMap, rootComponent: Object): Promise { - let prevRoot = isPresent(this.prevTree) ? rootNode(this.prevTree) : null; - let currRoot = rootNode(this.currTree); - - return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent).then(res => { - this.performMutation = true; - if (res) { - this.activateChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]); - } - return res; - }); - } - - private canDeactivate( - currRoot: TreeNode, prevRoot: TreeNode, - outletMap: RouterOutletMap, rootComponent: Object): Promise { - this.performMutation = false; - this.activateChildSegments(currRoot, prevRoot, outletMap, [rootComponent]); - - let allPaths = PromiseWrapper.all(this.deactivations.map(r => this.checkCanDeactivatePath(r))); - return allPaths.then((values: boolean[]) => values.filter(v => v).length === values.length); - } - - private checkCanDeactivatePath(path: Object[]): Promise { - let curr = PromiseWrapper.resolve(true); - for (let p of ListWrapper.reversed(path)) { - curr = curr.then(_ => { - if (hasLifecycleHook('routerCanDeactivate', p)) { - return (p).routerCanDeactivate(this.prevTree, this.currTree); - } else { - return _; - } - }); - } - return curr; - } - - private activateChildSegments( - currNode: TreeNode, prevNode: TreeNode, - outletMap: RouterOutletMap, components: Object[]): void { - let prevChildren = isPresent(prevNode) ? prevNode.children.reduce((m, c) => { - (m as any /** TODO #9100 */)[c.value.outlet] = c; - return m; - }, {}) : {}; - - currNode.children.forEach(c => { - this.activateSegments( - c, (prevChildren as any /** TODO #9100 */)[c.value.outlet], outletMap, components); - StringMapWrapper.delete(prevChildren, c.value.outlet); - }); - - StringMapWrapper.forEach( - prevChildren, (v: any /** TODO #9100 */, k: any /** TODO #9100 */) => - this.deactivateOutlet(outletMap._outlets[k], components)); - } - - activateSegments( - currNode: TreeNode, prevNode: TreeNode, - parentOutletMap: RouterOutletMap, components: Object[]): void { - let curr = currNode.value; - let prev = isPresent(prevNode) ? prevNode.value : null; - let outlet = this.getOutlet(parentOutletMap, currNode.value); - - if (curr === prev) { - this.activateChildSegments( - currNode, prevNode, outlet.outletMap, components.concat([outlet.component])); - } else { - this.deactivateOutlet(outlet, components); - if (this.performMutation) { - let outletMap = new RouterOutletMap(); - let component = this.activateNewSegments(outletMap, curr, prev, outlet); - this.activateChildSegments(currNode, prevNode, outletMap, components.concat([component])); - } - } - } - - private activateNewSegments( - outletMap: RouterOutletMap, curr: RouteSegment, prev: RouteSegment, - outlet: RouterOutlet): Object { - let resolved = ReflectiveInjector.resolve( - [{provide: RouterOutletMap, useValue: outletMap}, {provide: RouteSegment, useValue: curr}]); - let ref = outlet.activate(routeSegmentComponentFactory(curr), resolved, outletMap); - if (hasLifecycleHook('routerOnActivate', ref.instance)) { - ref.instance.routerOnActivate(curr, prev, this.currTree, this.prevTree); - } - return ref.instance; - } - - private getOutlet(outletMap: RouterOutletMap, segment: RouteSegment): RouterOutlet { - let outlet = outletMap._outlets[segment.outlet]; - if (isBlank(outlet)) { - if (segment.outlet == DEFAULT_OUTLET_NAME) { - throw new BaseException(`Cannot find default outlet`); - } else { - throw new BaseException(`Cannot find the outlet ${segment.outlet}`); - } - } - return outlet; - } - - private deactivateOutlet(outlet: RouterOutlet, components: Object[]): void { - if (isPresent(outlet) && outlet.isActivated) { - StringMapWrapper.forEach( - outlet.outletMap._outlets, (v: any /** TODO #9100 */, k: any /** TODO #9100 */) => - this.deactivateOutlet(v, components)); - if (this.performMutation) { - outlet.deactivate(); - } else { - this.deactivations.push(components.concat([outlet.component])); - } - } - } -} diff --git a/modules/@angular/router/src/router_providers.ts b/modules/@angular/router/src/router_providers.ts deleted file mode 100644 index 7a7a36bd22..0000000000 --- a/modules/@angular/router/src/router_providers.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {ROUTER_PROVIDERS_COMMON} from './router_providers_common'; - -/** - * A list of providers. To use the router, you must add this to your application. - * - * ``` - * import {Component} from '@angular/core'; - * import { - * ROUTER_DIRECTIVES, - * ROUTER_PROVIDERS, - * Routes - * } from '@angular/router'; - * - * @Component({directives: [ROUTER_DIRECTIVES]}) - * @Routes([ - * {...}, - * ]) - * class AppCmp { - * // ... - * } - * - * bootstrap(AppCmp, [ROUTER_PROVIDERS]); - * ``` - */ -// TODO: merge with router_providers_common.ts -export const ROUTER_PROVIDERS: any[] = /*@ts2dart_const*/[ROUTER_PROVIDERS_COMMON]; diff --git a/modules/@angular/router/src/router_providers_common.ts b/modules/@angular/router/src/router_providers_common.ts deleted file mode 100644 index 814fc972cc..0000000000 --- a/modules/@angular/router/src/router_providers_common.ts +++ /dev/null @@ -1,40 +0,0 @@ -import {Location, LocationStrategy, PathLocationStrategy} from '@angular/common'; -import {ApplicationRef, BaseException, ComponentResolver} from '@angular/core'; - -import {Router, RouterOutletMap} from './router'; -import {DefaultRouterUrlSerializer, RouterUrlSerializer} from './router_url_serializer'; -import {RouteSegment} from './segments'; - - -/** - * The Platform agnostic ROUTER PROVIDERS - */ -export const ROUTER_PROVIDERS_COMMON: any[] = /*@ts2dart_const*/[ - RouterOutletMap, - /*@ts2dart_Provider*/ {provide: RouterUrlSerializer, useClass: DefaultRouterUrlSerializer}, - /*@ts2dart_Provider*/ {provide: LocationStrategy, useClass: PathLocationStrategy}, Location, - /*@ts2dart_Provider*/ { - provide: Router, - useFactory: routerFactory, - deps: /*@ts2dart_const*/ - [ApplicationRef, ComponentResolver, RouterUrlSerializer, RouterOutletMap, Location], - }, - /*@ts2dart_Provider*/ {provide: RouteSegment, useFactory: routeSegmentFactory, deps: [Router]} -]; - -export function routerFactory( - app: ApplicationRef, componentResolver: ComponentResolver, urlSerializer: RouterUrlSerializer, - routerOutletMap: RouterOutletMap, location: Location): Router { - if (app.componentTypes.length == 0) { - throw new BaseException('Bootstrap at least one component before injecting Router.'); - } - // TODO: vsavkin this should not be null - let router = new Router( - null, app.componentTypes[0], componentResolver, urlSerializer, routerOutletMap, location); - app.registerDisposeListener(() => router.dispose()); - return router; -} - -export function routeSegmentFactory(router: Router): RouteSegment { - return router.routeTree.root; -} diff --git a/modules/@angular/router/src/router_url_serializer.ts b/modules/@angular/router/src/router_url_serializer.ts deleted file mode 100644 index 710231e167..0000000000 --- a/modules/@angular/router/src/router_url_serializer.ts +++ /dev/null @@ -1,201 +0,0 @@ -import {BaseException} from '@angular/core'; - -import {RegExpWrapper, isBlank, isPresent} from './facade/lang'; -import {Tree, TreeNode, UrlSegment, UrlTree, rootNode} from './segments'; - - -/** - * Defines a way to serialize/deserialize a url tree. - */ -export abstract class RouterUrlSerializer { - /** - * Parse a url into a {@Link UrlTree} - */ - abstract parse(url: string): UrlTree; - - /** - * Converts a {@Link UrlTree} into a url - */ - abstract serialize(tree: UrlTree): string; -} - -/** - * A default implementation of the serialization. - */ -export class DefaultRouterUrlSerializer extends RouterUrlSerializer { - parse(url: string): UrlTree { - let root = new _UrlParser().parse(url); - return new UrlTree(root); - } - - serialize(tree: UrlTree): string { return _serializeUrlTreeNode(rootNode(tree)); } -} - -function _serializeUrlTreeNode(node: TreeNode): string { - return `${node.value}${_serializeChildren(node)}`; -} - -function _serializeUrlTreeNodes(nodes: TreeNode[]): string { - let main = nodes[0].value.toString(); - let auxNodes = nodes.slice(1); - let aux = auxNodes.length > 0 ? `(${auxNodes.map(_serializeUrlTreeNode).join("//")})` : ''; - let children = _serializeChildren(nodes[0]); - return `${main}${aux}${children}`; -} - -function _serializeChildren(node: TreeNode): string { - if (node.children.length > 0) { - return `/${_serializeUrlTreeNodes(node.children)}`; - } else { - return ''; - } -} - -var SEGMENT_RE = RegExpWrapper.create('^[^\\/\\(\\)\\?;=&#]+'); -function matchUrlSegment(str: string): string { - var match = RegExpWrapper.firstMatch(SEGMENT_RE, str); - return isPresent(match) ? match[0] : ''; -} -var QUERY_PARAM_VALUE_RE = RegExpWrapper.create('^[^\\(\\)\\?;&#]+'); -function matchUrlQueryParamValue(str: string): string { - var match = RegExpWrapper.firstMatch(QUERY_PARAM_VALUE_RE, str); - return isPresent(match) ? match[0] : ''; -} - -class _UrlParser { - private _remaining: string; - - peekStartsWith(str: string): boolean { return this._remaining.startsWith(str); } - - capture(str: string): void { - if (!this._remaining.startsWith(str)) { - throw new BaseException(`Expected "${str}".`); - } - this._remaining = this._remaining.substring(str.length); - } - - parse(url: string): TreeNode { - this._remaining = url; - if (url == '' || url == '/') { - return new TreeNode(new UrlSegment('', {}, null), []); - } else { - return this.parseRoot(); - } - } - - parseRoot(): TreeNode { - let segments = this.parseSegments(); - return new TreeNode(new UrlSegment('', {}, null), segments); - } - - parseSegments(outletName: string = null): TreeNode[] { - if (this._remaining.length == 0) { - return []; - } - if (this.peekStartsWith('/')) { - this.capture('/'); - } - var path = matchUrlSegment(this._remaining); - this.capture(path); - - - if (path.indexOf(':') > -1) { - let parts = path.split(':'); - outletName = parts[0]; - path = parts[1]; - } - - var matrixParams: {[key: string]: any} = {}; - if (this.peekStartsWith(';')) { - matrixParams = this.parseMatrixParams(); - } - - var aux: any[] /** TODO #9100 */ = []; - if (this.peekStartsWith('(')) { - aux = this.parseAuxiliaryRoutes(); - } - - var children: TreeNode[] = []; - if (this.peekStartsWith('/') && !this.peekStartsWith('//')) { - this.capture('/'); - children = this.parseSegments(); - } - - let segment = new UrlSegment(path, matrixParams, outletName); - let node = new TreeNode(segment, children); - return [node].concat(aux); - } - - parseQueryParams(): {[key: string]: any} { - var params: {[key: string]: any} = {}; - this.capture('?'); - this.parseQueryParam(params); - while (this._remaining.length > 0 && this.peekStartsWith('&')) { - this.capture('&'); - this.parseQueryParam(params); - } - return params; - } - - parseMatrixParams(): {[key: string]: any} { - var params: {[key: string]: any} = {}; - while (this._remaining.length > 0 && this.peekStartsWith(';')) { - this.capture(';'); - this.parseParam(params); - } - return params; - } - - parseParam(params: {[key: string]: any}): void { - var key = matchUrlSegment(this._remaining); - if (isBlank(key)) { - return; - } - this.capture(key); - var value: any = 'true'; - if (this.peekStartsWith('=')) { - this.capture('='); - var valueMatch = matchUrlSegment(this._remaining); - if (isPresent(valueMatch)) { - value = valueMatch; - this.capture(value); - } - } - - params[key] = value; - } - - parseQueryParam(params: {[key: string]: any}): void { - var key = matchUrlSegment(this._remaining); - if (isBlank(key)) { - return; - } - this.capture(key); - var value: any = 'true'; - if (this.peekStartsWith('=')) { - this.capture('='); - var valueMatch = matchUrlQueryParamValue(this._remaining); - if (isPresent(valueMatch)) { - value = valueMatch; - this.capture(value); - } - } - - params[key] = value; - } - - parseAuxiliaryRoutes(): TreeNode[] { - var segments: any[] /** TODO #9100 */ = []; - this.capture('('); - - while (!this.peekStartsWith(')') && this._remaining.length > 0) { - segments = segments.concat(this.parseSegments('aux')); - if (this.peekStartsWith('//')) { - this.capture('//'); - } - } - this.capture(')'); - - return segments; - } -} diff --git a/modules/@angular/router/src/segments.ts b/modules/@angular/router/src/segments.ts deleted file mode 100644 index ab4e5b80f1..0000000000 --- a/modules/@angular/router/src/segments.ts +++ /dev/null @@ -1,157 +0,0 @@ -import {ComponentFactory, Type} from '@angular/core'; - -import {DEFAULT_OUTLET_NAME} from './constants'; -import {ListWrapper, StringMapWrapper} from './facade/collection'; -import {NumberWrapper, isBlank, isPresent, stringify} from './facade/lang'; - -export class Tree { - /** @internal */ - _root: TreeNode; - - constructor(root: TreeNode) { this._root = root; } - - get root(): T { return this._root.value; } - - parent(t: T): T { - let p = this.pathFromRoot(t); - return p.length > 1 ? p[p.length - 2] : null; - } - - children(t: T): T[] { - let n = _findNode(t, this._root); - return isPresent(n) ? n.children.map(t => t.value) : null; - } - - firstChild(t: T): T { - let n = _findNode(t, this._root); - return isPresent(n) && n.children.length > 0 ? n.children[0].value : null; - } - - pathFromRoot(t: T): T[] { return _findPath(t, this._root, []).map(s => s.value); } - - contains(tree: Tree): boolean { return _contains(this._root, tree._root); } -} - -export class UrlTree extends Tree { - constructor(root: TreeNode) { super(root); } -} - -export class RouteTree extends Tree { - constructor(root: TreeNode) { super(root); } -} - -export function rootNode(tree: Tree): TreeNode { - return tree._root; -} - -function _findNode(expected: T, c: TreeNode): TreeNode { - if (expected === c.value) return c; - for (let cc of c.children) { - let r = _findNode(expected, cc); - if (isPresent(r)) return r; - } - return null; -} - -function _findPath(expected: T, c: TreeNode, collected: TreeNode[]): TreeNode[] { - collected.push(c); - if (expected === c.value) return collected; - - for (let cc of c.children) { - let r = _findPath(expected, cc, ListWrapper.clone(collected)); - if (isPresent(r)) return r; - } - - return null; -} - -function _contains(tree: TreeNode, subtree: TreeNode): boolean { - if (tree.value !== subtree.value) return false; - - for (let subtreeNode of subtree.children) { - let s = tree.children.filter(child => child.value === subtreeNode.value); - if (s.length === 0) return false; - if (!_contains(s[0], subtreeNode)) return false; - } - - return true; -} - -export class TreeNode { - constructor(public value: T, public children: TreeNode[]) {} -} - -export class UrlSegment { - constructor( - public segment: any, public parameters: {[key: string]: string}, public outlet: string) {} - - toString(): string { - let outletPrefix = isBlank(this.outlet) ? '' : `${this.outlet}:`; - return `${outletPrefix}${this.segment}${_serializeParams(this.parameters)}`; - } -} - -function _serializeParams(params: {[key: string]: string}): string { - let res = ''; - StringMapWrapper.forEach( - params, (v: any /** TODO #9100 */, k: any /** TODO #9100 */) => res += `;${k}=${v}`); - return res; -} - -export class RouteSegment { - /** @internal */ - _type: Type; - - /** @internal */ - _componentFactory: ComponentFactory; - - constructor( - public urlSegments: UrlSegment[], public parameters: {[key: string]: string}, - public outlet: string, type: Type, componentFactory: ComponentFactory) { - this._type = type; - this._componentFactory = componentFactory; - } - - getParam(param: string): string { - return isPresent(this.parameters) ? this.parameters[param] : null; - } - - getParamAsNumber(param: string): number { - return isPresent(this.parameters) ? NumberWrapper.parseFloat(this.parameters[param]) : null; - } - - get type(): Type { return this._type; } - - get stringifiedUrlSegments(): string { return this.urlSegments.map(s => s.toString()).join('/'); } -} - -export function createEmptyRouteTree(type: Type): RouteTree { - let root = new RouteSegment([new UrlSegment('', {}, null)], {}, DEFAULT_OUTLET_NAME, type, null); - return new RouteTree(new TreeNode(root, [])); -} - -export function serializeRouteSegmentTree(tree: RouteTree): string { - return _serializeRouteSegmentTree(tree._root); -} - -function _serializeRouteSegmentTree(node: TreeNode): string { - let v = node.value; - let children = node.children.map(c => _serializeRouteSegmentTree(c)).join(', '); - return `${v.outlet}:${v.stringifiedUrlSegments}(${stringify(v.type)}) [${children}]`; -} - -export function equalUrlSegments(a: UrlSegment[], b: UrlSegment[]): boolean { - if (a.length !== b.length) return false; - - for (let i = 0; i < a.length; ++i) { - if (a[i].segment != b[i].segment) return false; - if (a[i].outlet != b[i].outlet) return false; - if (!StringMapWrapper.equals(a[i].parameters, b[i].parameters)) return false; - } - - return true; -} - -export function routeSegmentComponentFactory(a: RouteSegment): ComponentFactory { - return a._componentFactory; -} diff --git a/modules/@angular/router/test/integration_spec.ts b/modules/@angular/router/test/integration_spec.ts deleted file mode 100644 index 25e852b232..0000000000 --- a/modules/@angular/router/test/integration_spec.ts +++ /dev/null @@ -1,381 +0,0 @@ -import {Location} from '@angular/common'; -import {SpyLocation} from '@angular/common/testing'; -import {ComponentFixture, TestComponentBuilder} from '@angular/compiler/testing'; -import {Component, ComponentResolver, provide} from '@angular/core'; -import {fakeAsync, tick} from '@angular/core/testing'; -import {AsyncTestCompleter, beforeEach, beforeEachProviders, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '@angular/core/testing/testing_internal'; -import {CanDeactivate, DefaultRouterUrlSerializer, OnActivate, ROUTER_DIRECTIVES, Route, RouteSegment, Router, RouterOutletMap, RouterUrlSerializer, Routes} from '@angular/router'; - -import {getDOM} from '../platform_browser_private'; -import {PromiseWrapper} from '../src/facade/async'; - -export function main() { - describe('navigation', () => { - beforeEachProviders( - () => - [{provide: RouterUrlSerializer, useClass: DefaultRouterUrlSerializer}, RouterOutletMap, - {provide: Location, useClass: SpyLocation}, { - provide: RouteSegment, - useFactory: (r: any /** TODO #9100 */) => r.routeTree.root, - deps: [Router] - }, - { - provide: Router, - useFactory: - (resolver: any /** TODO #9100 */, urlParser: any /** TODO #9100 */, - outletMap: any /** TODO #9100 */, location: any /** TODO #9100 */) => - new Router( - 'RootComponent', RootCmp, resolver, urlParser, outletMap, location), - deps: [ComponentResolver, RouterUrlSerializer, RouterOutletMap, Location] - }]); - - it('should update location when navigating', - fakeAsync(inject( - [Router, TestComponentBuilder, Location], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */, - location: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - - router.navigateByUrl('/team/22/user/victor'); - advance(fixture); - expect(location.path()).toEqual('/team/22/user/victor'); - - router.navigateByUrl('/team/33/simple'); - advance(fixture); - - expect(location.path()).toEqual('/team/33/simple'); - }))); - - it('should navigate back and forward', - fakeAsync(inject( - [Router, TestComponentBuilder, Location], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */, - location: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - - router.navigateByUrl('/team/33/simple'); - advance(fixture); - - router.navigateByUrl('/team/22/user/victor'); - advance(fixture); - - location.back(); - advance(fixture); - expect(location.path()).toEqual('/team/33/simple'); - - location.forward(); - advance(fixture); - expect(location.path()).toEqual('/team/22/user/victor'); - }))); - - it('should navigate when locations changes', - fakeAsync(inject( - [Router, TestComponentBuilder, Location], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */, - location: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - - router.navigateByUrl('/team/22/user/victor'); - advance(fixture); - - location.simulateHashChange('/team/22/user/fedor'); - advance(fixture); - - expect(fixture.debugElement.nativeElement) - .toHaveText('team 22 { hello fedor, aux: }'); - }))); - - it('should support nested routes', - fakeAsync(inject( - [Router, TestComponentBuilder], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - - router.navigateByUrl('/team/22/user/victor'); - advance(fixture); - - expect(fixture.debugElement.nativeElement) - .toHaveText('team 22 { hello victor, aux: }'); - }))); - - it('should support aux routes', - fakeAsync(inject( - [Router, TestComponentBuilder], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - - router.navigateByUrl('/team/22/user/victor(/simple)'); - advance(fixture); - - expect(fixture.debugElement.nativeElement) - .toHaveText('team 22 { hello victor, aux: simple }'); - }))); - - it('should deactivate outlets', - fakeAsync(inject( - [Router, TestComponentBuilder], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - - router.navigateByUrl('/team/22/user/victor(/simple)'); - advance(fixture); - - router.navigateByUrl('/team/22/user/victor'); - advance(fixture); - - expect(fixture.debugElement.nativeElement) - .toHaveText('team 22 { hello victor, aux: }'); - }))); - - it('should deactivate nested outlets', - fakeAsync(inject( - [Router, TestComponentBuilder], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - - router.navigateByUrl('/team/22/user/victor(/simple)'); - advance(fixture); - - router.navigateByUrl('/'); - advance(fixture); - - expect(fixture.debugElement.nativeElement).toHaveText(''); - }))); - - it('should update nested routes when url changes', - fakeAsync(inject( - [Router, TestComponentBuilder], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - - router.navigateByUrl('/team/22/user/victor'); - advance(fixture); - let team1 = fixture.debugElement.children[1].componentInstance; - - router.navigateByUrl('/team/22/user/fedor'); - advance(fixture); - let team2 = fixture.debugElement.children[1].componentInstance; - - expect(team1).toBe(team2); - expect(fixture.debugElement.nativeElement) - .toHaveText('team 22 { hello fedor, aux: }'); - }))); - - it('should not deactivate the route if can deactivate returns false', - fakeAsync(inject( - [Router, TestComponentBuilder, Location], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */, - location: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - - router.navigateByUrl('/team/22/cannotDeactivate'); - advance(fixture); - - router.navigateByUrl('/team/22/user/fedor'); - advance(fixture); - - expect(fixture.debugElement.nativeElement) - .toHaveText('team 22 { cannotDeactivate, aux: }'); - - expect(location.path()).toEqual('/team/22/cannotDeactivate'); - }))); - - if (getDOM().supportsDOMEvents()) { - it('should support absolute router links', - fakeAsync(inject( - [Router, TestComponentBuilder], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - advance(fixture); - - router.navigateByUrl('/team/22/link'); - advance(fixture); - expect(fixture.debugElement.nativeElement).toHaveText('team 22 { link, aux: }'); - - let native = getDOM().querySelector(fixture.debugElement.nativeElement, 'a'); - expect(getDOM().getAttribute(native, 'href')).toEqual('/team/33/simple'); - getDOM().dispatchEvent(native, getDOM().createMouseEvent('click')); - advance(fixture); - - expect(fixture.debugElement.nativeElement).toHaveText('team 33 { simple, aux: }'); - }))); - - it('should support relative router links', - fakeAsync(inject( - [Router, TestComponentBuilder], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - advance(fixture); - - router.navigateByUrl('/team/22/relativelink'); - advance(fixture); - expect(fixture.debugElement.nativeElement) - .toHaveText('team 22 { relativelink { }, aux: }'); - - let native = getDOM().querySelector(fixture.debugElement.nativeElement, 'a'); - expect(getDOM().getAttribute(native, 'href')) - .toEqual('/team/22/relativelink/simple'); - getDOM().dispatchEvent(native, getDOM().createMouseEvent('click')); - advance(fixture); - - expect(fixture.debugElement.nativeElement) - .toHaveText('team 22 { relativelink { simple }, aux: }'); - }))); - - it('should set the router-link-active class', - fakeAsync(inject( - [Router, TestComponentBuilder], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - advance(fixture); - - router.navigateByUrl('/team/22/relativelink'); - advance(fixture); - expect(fixture.debugElement.nativeElement) - .toHaveText('team 22 { relativelink { }, aux: }'); - let link = getDOM().querySelector(fixture.debugElement.nativeElement, 'a'); - expect(getDOM().hasClass(link, 'router-link-active')).toEqual(false); - - getDOM().dispatchEvent(link, getDOM().createMouseEvent('click')); - advance(fixture); - - expect(getDOM().hasClass(link, 'router-link-active')).toEqual(true); - }))); - - it('should update router links when router changes', - fakeAsync(inject( - [Router, TestComponentBuilder], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - advance(fixture); - - router.navigateByUrl('/team/22/link(simple)'); - advance(fixture); - expect(fixture.debugElement.nativeElement) - .toHaveText('team 22 { link, aux: simple }'); - - let native = getDOM().querySelector(fixture.debugElement.nativeElement, 'a'); - expect(getDOM().getAttribute(native, 'href')).toEqual('/team/33/simple(aux:simple)'); - - router.navigateByUrl('/team/22/link(simple2)'); - advance(fixture); - - expect(getDOM().getAttribute(native, 'href')) - .toEqual('/team/33/simple(aux:simple2)'); - }))); - - it('should support top-level link', - fakeAsync(inject( - [Router, TestComponentBuilder], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(LinkCmp); - advance(fixture); - expect(fixture.debugElement.nativeElement).toHaveText('link'); - }))); - - it('should replace state when path is equal to current path', - fakeAsync(inject( - [Router, TestComponentBuilder, Location], - (router: any /** TODO #9100 */, tcb: any /** TODO #9100 */, - location: any /** TODO #9100 */) => { - let fixture = tcb.createFakeAsync(RootCmp); - - router.navigateByUrl('/team/33/simple'); - advance(fixture); - - router.navigateByUrl('/team/22/user/victor'); - advance(fixture); - - router.navigateByUrl('/team/22/user/victor'); - advance(fixture); - - location.back(); - advance(fixture); - expect(location.path()).toEqual('/team/33/simple'); - }))); - } - }); -} - -function advance(fixture: ComponentFixture): void { - tick(); - fixture.detectChanges(); -} - -function compileRoot(tcb: TestComponentBuilder): Promise> { - return tcb.createAsync(RootCmp); -} - -@Component({selector: 'user-cmp', template: `hello {{user}}`}) -class UserCmp implements OnActivate { - user: string; - routerOnActivate( - s: RouteSegment, a?: any /** TODO #9100 */, b?: any /** TODO #9100 */, - c?: any /** TODO #9100 */) { - this.user = s.getParam('name'); - } -} - -@Component({selector: 'cannot-deactivate', template: `cannotDeactivate`}) -class CanDeactivateCmp implements CanDeactivate { - routerCanDeactivate(a?: any /** TODO #9100 */, b?: any /** TODO #9100 */): Promise { - return PromiseWrapper.resolve(false); - } -} - -@Component({selector: 'simple-cmp', template: `simple`}) -class SimpleCmp { -} - -@Component({selector: 'simple2-cmp', template: `simple2`}) -class Simple2Cmp { -} - -@Component({ - selector: 'link-cmp', - template: `link`, - directives: ROUTER_DIRECTIVES -}) -class LinkCmp { -} - -@Component({ - selector: 'link-cmp', - template: `relativelink { }`, - directives: ROUTER_DIRECTIVES -}) -@Routes([new Route({path: 'simple', component: SimpleCmp})]) -class RelativeLinkCmp { -} - -@Component({ - selector: 'team-cmp', - template: - `team {{id}} { , aux: }`, - directives: [ROUTER_DIRECTIVES] -}) -@Routes([ - new Route({path: 'user/:name', component: UserCmp}), - new Route({path: 'simple', component: SimpleCmp}), - new Route({path: 'simple2', component: Simple2Cmp}), - new Route({path: 'link', component: LinkCmp}), - new Route({path: 'relativelink', component: RelativeLinkCmp}), - new Route({path: 'cannotDeactivate', component: CanDeactivateCmp}) -]) -class TeamCmp implements OnActivate { - id: string; - routerOnActivate( - s: RouteSegment, a?: any /** TODO #9100 */, b?: any /** TODO #9100 */, - c?: any /** TODO #9100 */) { - this.id = s.getParam('id'); - } -} - -@Component({ - selector: 'root-cmp', - template: ``, - directives: [ROUTER_DIRECTIVES] -}) -@Routes([new Route({path: 'team/:id', component: TeamCmp})]) -class RootCmp { -} diff --git a/modules/@angular/router/test/link_spec.ts b/modules/@angular/router/test/link_spec.ts deleted file mode 100644 index bcfe24a13e..0000000000 --- a/modules/@angular/router/test/link_spec.ts +++ /dev/null @@ -1,190 +0,0 @@ -import {AsyncTestCompleter, beforeEach, beforeEachProviders, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '@angular/core/testing/testing_internal'; - -import {link} from '../src/link'; -import {DefaultRouterUrlSerializer} from '../src/router_url_serializer'; -import {RouteSegment, RouteTree, TreeNode, UrlSegment, UrlTree} from '../src/segments'; - -export function main() { - describe('link', () => { - let parser = new DefaultRouterUrlSerializer(); - - it('should return the original tree when given an empty array', () => { - let p = parser.parse('/'); - let tree = s(p.root); - let t = link(tree.root, tree, p, []); - expect(t).toBe(p); - }); - - it('should navigate to the root', () => { - let p = parser.parse('/'); - let tree = s(p.root); - let t = link(tree.root, tree, p, ['/']); - expect(parser.serialize(t)).toEqual(''); - }); - - it('should support nested segments', () => { - let p = parser.parse('/a/b'); - let tree = s(p.firstChild(p.root)); - let t = link(tree.root, tree, p, ['/one', 11, 'two', 22]); - expect(parser.serialize(t)).toEqual('/one/11/two/22'); - }); - - it('should preserve siblings', () => { - let p = parser.parse('/a/11/b(c)'); - let tree = s(p.root); - let t = link(tree.root, tree, p, ['/a', 11, 'd']); - expect(parser.serialize(t)).toEqual('/a/11/d(aux:c)'); - }); - - it('should update matrix parameters', () => { - let p = parser.parse('/a;aa=11'); - let tree = s(p.root); - let t = link(tree.root, tree, p, ['/a', {aa: 22, bb: 33}]); - expect(parser.serialize(t)).toEqual('/a;aa=22;bb=33'); - }); - - it('should create matrix parameters', () => { - let p = parser.parse('/a'); - let tree = s(p.root); - let t = link(tree.root, tree, p, ['/a', {aa: 22, bb: 33}]); - expect(parser.serialize(t)).toEqual('/a;aa=22;bb=33'); - }); - - it('should create matrix parameters together with other segments', () => { - let p = parser.parse('/a'); - let tree = s(p.root); - let t = link(tree.root, tree, p, ['/a', '/b', {aa: 22, bb: 33}]); - expect(parser.serialize(t)).toEqual('/a/b;aa=22;bb=33'); - }); - - describe('node reuse', () => { - it('should reuse nodes when path is the same', () => { - let p = parser.parse('/a/b'); - let tree = s(p.root); - let t = link(tree.root, tree, p, ['/a/c']); - - expect(t.root).toBe(p.root); - expect(t.firstChild(t.root)).toBe(p.firstChild(p.root)); - expect(t.firstChild(t.firstChild(t.root))).not.toBe(p.firstChild(p.firstChild(p.root))); - }); - - it('should create new node when params are the same', () => { - let p = parser.parse('/a;x=1'); - let tree = s(p.root); - let t = link(tree.root, tree, p, ['/a', {'x': 1}]); - - expect(t.firstChild(t.root)).toBe(p.firstChild(p.root)); - }); - - it('should create new node when params are different', () => { - let p = parser.parse('/a;x=1'); - let tree = s(p.root); - let t = link(tree.root, tree, p, ['/a', {'x': 2}]); - - expect(t.firstChild(t.root)).not.toBe(p.firstChild(p.root)); - }); - }); - - describe('relative navigation', () => { - it('should work', () => { - let p = parser.parse('/a(ap)/c(cp)'); - let c = p.firstChild(p.root); - let tree = s(c); - let t = link(tree.root, tree, p, ['c2']); - expect(parser.serialize(t)).toEqual('/a(aux:ap)/c2(aux:cp)'); - }); - - it('should work when the first command starts with a ./', () => { - let p = parser.parse('/a(ap)/c(cp)'); - let c = p.firstChild(p.root); - let tree = s(c); - let t = link(tree.root, tree, p, ['./c2']); - expect(parser.serialize(t)).toEqual('/a(aux:ap)/c2(aux:cp)'); - }); - - it('should work when the first command is ./)', () => { - let p = parser.parse('/a(ap)/c(cp)'); - let c = p.firstChild(p.root); - let tree = s(c); - let t = link(tree.root, tree, p, ['./', 'c2']); - expect(parser.serialize(t)).toEqual('/a(aux:ap)/c2(aux:cp)'); - }); - - it('should work when given params', () => { - let p = parser.parse('/a(ap)/c(cp)'); - let c = p.firstChild(p.root); - let tree = s(c); - let t = link(tree.root, tree, p, [{'x': 99}]); - - expect(parser.serialize(t)).toEqual('/a(aux:ap)/c;x=99(aux:cp)'); - }); - - it('should support going to a parent', () => { - let p = parser.parse('/a(ap)/c(cp)'); - let a = p.firstChild(p.root); - let tree = s(a); - let t = link(tree.root, tree, p, ['../a2']); - expect(parser.serialize(t)).toEqual('/a2(aux:ap)'); - }); - - it('should support going to a parent (nested case)', () => { - let p = parser.parse('/a/c'); - let c = p.firstChild(p.firstChild(p.root)); - let tree = s(c); - let t = link(tree.root, tree, p, ['../c2']); - expect(parser.serialize(t)).toEqual('/a/c2'); - }); - - it('should work when given ../', () => { - let p = parser.parse('/a/c'); - let c = p.firstChild(p.firstChild(p.root)); - let tree = s(c); - let t = link(tree.root, tree, p, ['../']); - expect(parser.serialize(t)).toEqual('/a'); - }); - - it('should navigate to the root', () => { - let p = parser.parse('/a/c'); - let c = p.firstChild(p.root); - let tree = s(c); - let t = link(tree.root, tree, p, ['../']); - expect(parser.serialize(t)).toEqual(''); - }); - - it('should support setting matrix params', () => { - let p = parser.parse('/a(ap)/c(cp)'); - let c = p.firstChild(p.root); - let tree = s(c); - let t = link(tree.root, tree, p, ['../', {'x': 5}]); - expect(parser.serialize(t)).toEqual('/a;x=5(aux:ap)'); - }); - - it('should throw when too many ..', () => { - let p = parser.parse('/a(ap)/c(cp)'); - let c = p.firstChild(p.root); - let tree = s(c); - - expect(() => link(tree.root, tree, p, ['../../'])) - .toThrowError('Invalid number of \'../\''); - }); - - it('should work when the provided segment doesn\'t have url segments', () => { - let p = parser.parse('/a(ap)/c(cp)'); - let c = p.firstChild(p.root); - - let child = new RouteSegment([], {'one': '1'}, null, null, null); - let root = new TreeNode( - new RouteSegment([c], {}, null, null, null), [new TreeNode(child, [])]); - let tree = new RouteTree(root); - - let t = link(child, tree, p, ['./c2']); - expect(parser.serialize(t)).toEqual('/a(aux:ap)/c2(aux:cp)'); - }); - }); - }); -} - -function s(u: UrlSegment): RouteTree { - let root = new TreeNode(new RouteSegment([u], {}, null, null, null), []); - return new RouteTree(root); -} diff --git a/modules/@angular/router/test/recognize_spec.ts b/modules/@angular/router/test/recognize_spec.ts deleted file mode 100644 index 8678307992..0000000000 --- a/modules/@angular/router/test/recognize_spec.ts +++ /dev/null @@ -1,261 +0,0 @@ -import {Component, ComponentResolver, provide} from '@angular/core'; -import {AsyncTestCompleter, beforeEach, beforeEachProviders, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '@angular/core/testing/testing_internal'; -import {Route, Routes} from '@angular/router'; - -import {DEFAULT_OUTLET_NAME} from '../src/constants'; -import {recognize} from '../src/recognize'; -import {DefaultRouterUrlSerializer} from '../src/router_url_serializer'; -import {RouteTree, UrlSegment, UrlTree, createEmptyRouteTree} from '../src/segments'; - -export function main() { - describe('recognize', () => { - let emptyRouteTree = createEmptyRouteTree(ComponentA); - - it('should handle position args', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentA, tree('b/paramB/c/paramC/d'), emptyRouteTree) - .then(r => { - let a = r.root; - expect(stringifyUrl(a.urlSegments)).toEqual(['']); - expect(a.type).toBe(ComponentA); - - let b = r.firstChild(r.root); - expect(stringifyUrl(b.urlSegments)).toEqual(['b', 'paramB']); - expect(b.type).toBe(ComponentB); - - let c = r.firstChild(r.firstChild(r.root)); - expect(stringifyUrl(c.urlSegments)).toEqual(['c', 'paramC']); - expect(c.type).toBe(ComponentC); - - let d = r.firstChild(r.firstChild(r.firstChild(r.root))); - expect(stringifyUrl(d.urlSegments)).toEqual(['d']); - expect(d.type).toBe(ComponentD); - - async.done(); - }); - })); - - it('should support empty routes', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentA, tree('f'), emptyRouteTree).then(r => { - let a = r.root; - expect(stringifyUrl(a.urlSegments)).toEqual(['']); - expect(a.type).toBe(ComponentA); - - let f = r.firstChild(r.root); - expect(stringifyUrl(f.urlSegments)).toEqual(['f']); - expect(f.type).toBe(ComponentF); - - let d = r.firstChild(r.firstChild(r.root)); - expect(stringifyUrl(d.urlSegments)).toEqual([]); - expect(d.type).toBe(ComponentD); - - async.done(); - }); - })); - - it('should handle aux routes', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentA, tree('b/paramB(/d//right:d)'), emptyRouteTree) - .then(r => { - let c = r.children(r.root); - expect(stringifyUrl(c[0].urlSegments)).toEqual(['b', 'paramB']); - expect(c[0].outlet).toEqual(DEFAULT_OUTLET_NAME); - expect(c[0].type).toBe(ComponentB); - - expect(stringifyUrl(c[1].urlSegments)).toEqual(['d']); - expect(c[1].outlet).toEqual('aux'); - expect(c[1].type).toBe(ComponentD); - - expect(stringifyUrl(c[2].urlSegments)).toEqual(['d']); - expect(c[2].outlet).toEqual('right'); - expect(c[2].type).toBe(ComponentD); - - async.done(); - }); - })); - - it('should error when two segments with the same outlet name', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentA, tree('b/paramB(right:d//right:e)'), emptyRouteTree) - .catch(e => { - expect(e.message).toEqual( - 'Two segments cannot have the same outlet name: \'right:d\' and \'right:e\'.'); - async.done(); - }); - })); - - it('should handle nested aux routes', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentA, tree('b/paramB(/d(right:e))'), emptyRouteTree) - .then(r => { - let c = r.children(r.root); - expect(stringifyUrl(c[0].urlSegments)).toEqual(['b', 'paramB']); - expect(c[0].outlet).toEqual(DEFAULT_OUTLET_NAME); - expect(c[0].type).toBe(ComponentB); - - expect(stringifyUrl(c[1].urlSegments)).toEqual(['d']); - expect(c[1].outlet).toEqual('aux'); - expect(c[1].type).toBe(ComponentD); - - expect(stringifyUrl(c[2].urlSegments)).toEqual(['e']); - expect(c[2].outlet).toEqual('right'); - expect(c[2].type).toBe(ComponentE); - - async.done(); - }); - })); - - it('should handle non top-level aux routes', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentA, tree('b/paramB/d(e)'), emptyRouteTree).then(r => { - let c = r.children(r.firstChild(r.root)); - expect(stringifyUrl(c[0].urlSegments)).toEqual(['d']); - expect(c[0].outlet).toEqual(DEFAULT_OUTLET_NAME); - expect(c[0].type).toBe(ComponentD); - - expect(stringifyUrl(c[1].urlSegments)).toEqual(['e']); - expect(c[1].outlet).toEqual('aux'); - expect(c[1].type).toBe(ComponentE); - - async.done(); - }); - })); - - it('should handle matrix parameters', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize( - resolver, ComponentA, tree('b/paramB;b1=1;b2=2(/d;d1=1;d2=2)'), emptyRouteTree) - .then(r => { - let c = r.children(r.root); - expect(c[0].parameters).toEqual({'b': 'paramB', 'b1': '1', 'b2': '2'}); - expect(c[1].parameters).toEqual({'d1': '1', 'd2': '2'}); - - async.done(); - }); - })); - - it('should match a wildcard', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentG, tree('a;aa=1/b;bb=2'), emptyRouteTree).then(r => { - let c = r.children(r.root); - expect(c.length).toEqual(1); - expect(stringifyUrl(c[0].urlSegments)).toEqual([]); - expect(c[0].parameters).toEqual(null); - - async.done(); - }); - })); - - it('should error when no matching routes', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentA, tree('invalid'), emptyRouteTree).catch(e => { - expect(e.message).toContain('Cannot match any routes'); - async.done(); - }); - })); - - it('should handle no matching routes (too short)', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentA, tree('b'), emptyRouteTree).catch(e => { - expect(e.message).toContain('Cannot match any routes'); - async.done(); - }); - })); - - it('should error when a component doesn\'t have @Routes', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentA, tree('d/invalid'), emptyRouteTree).catch(e => { - expect(e.message).toEqual( - 'Component \'ComponentD\' does not have route configuration'); - async.done(); - }); - })); - - it('should reuse existing segments', - inject( - [AsyncTestCompleter, ComponentResolver], - (async: AsyncTestCompleter, resolver: any /** TODO #9100 */) => { - recognize(resolver, ComponentA, tree('/b/1/d'), emptyRouteTree).then(t1 => { - recognize(resolver, ComponentA, tree('/b/1/e'), t1).then(t2 => { - expect(t1.root).toBe(t2.root); - expect(t1.firstChild(t1.root)).toBe(t2.firstChild(t2.root)); - expect(t1.firstChild(t1.firstChild(t1.root))) - .not.toBe(t2.firstChild(t2.firstChild(t2.root))); - - async.done(); - }); - }); - })); - }); -} - -function tree(url: string): UrlTree { - return new DefaultRouterUrlSerializer().parse(url); -} - -function stringifyUrl(segments: UrlSegment[]): string[] { - return segments.map(s => s.segment); -} - -@Component({selector: 'd', template: 't'}) -class ComponentD { -} - -@Component({selector: 'e', template: 't'}) -class ComponentE { -} - -@Component({selector: 'f', template: 't'}) -@Routes([new Route({path: '/', component: ComponentD})]) -class ComponentF { -} - -@Component({selector: 'c', template: 't'}) -@Routes([new Route({path: 'd', component: ComponentD})]) -class ComponentC { -} - -@Component({selector: 'b', template: 't'}) -@Routes([ - new Route({path: 'd', component: ComponentD}), new Route({path: 'e', component: ComponentE}), - new Route({path: 'c/:c', component: ComponentC}) -]) -class ComponentB { -} - -@Component({selector: 'g', template: 't'}) -@Routes( - [new Route({path: 'd', component: ComponentD}), new Route({path: '*', component: ComponentE})]) -class ComponentG { -} - -@Component({selector: 'a', template: 't'}) -@Routes([ - new Route({path: 'b/:b', component: ComponentB}), new Route({path: 'd', component: ComponentD}), - new Route({path: 'e', component: ComponentE}), new Route({path: 'f', component: ComponentF}) -]) -class ComponentA { -} diff --git a/modules/@angular/router/test/router_link_spec.ts b/modules/@angular/router/test/router_link_spec.ts deleted file mode 100644 index 58c5cf2886..0000000000 --- a/modules/@angular/router/test/router_link_spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import {Location, LocationStrategy} from '@angular/common'; -import {MockLocationStrategy, SpyLocation} from '@angular/common/testing'; -import {Component, ComponentResolver, provide} from '@angular/core'; -import {AsyncTestCompleter, beforeEach, beforeEachProviders, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '@angular/core/testing/testing_internal'; -import {CanDeactivate, DefaultRouterUrlSerializer, OnActivate, ROUTER_DIRECTIVES, Route, RouteSegment, Router, RouterOutletMap, RouterUrlSerializer, Routes} from '@angular/router'; - -import {RouterLink} from '../src/directives/router_link'; - -export function main() { - describe('RouterLink', () => { - beforeEachProviders( - () => - [{provide: RouterUrlSerializer, useClass: DefaultRouterUrlSerializer}, RouterOutletMap, - {provide: Location, useClass: SpyLocation}, - {provide: LocationStrategy, useClass: MockLocationStrategy}, { - provide: Router, - useFactory: - (resolver: any /** TODO #9100 */, urlParser: any /** TODO #9100 */, - outletMap: any /** TODO #9100 */, location: any /** TODO #9100 */) => - new Router( - 'RootComponent', RootCmp, resolver, urlParser, outletMap, location), - deps: [ComponentResolver, RouterUrlSerializer, RouterOutletMap, Location] - }]); - - describe('routerLink=', () => { - it('should accept an array of commands', - inject( - [Router, LocationStrategy], - (router: any /** TODO #9100 */, locationStrategy: any /** TODO #9100 */) => { - let link = new RouterLink(null, router, locationStrategy); - link.routerLink = ['/one', 11]; - expect(link.href).toEqual('/one/11'); - })); - - it('should accept a single command', - inject( - [Router, LocationStrategy], - (router: any /** TODO #9100 */, locationStrategy: any /** TODO #9100 */) => { - let link = new RouterLink(null, router, locationStrategy); - link.routerLink = '/one/11'; - expect(link.href).toEqual('/one/11'); - })); - }); - }); -} - -@Component({template: ''}) -class RootCmp { -} diff --git a/modules/@angular/router/test/router_url_serializer_spec.ts b/modules/@angular/router/test/router_url_serializer_spec.ts deleted file mode 100644 index fe1cf36278..0000000000 --- a/modules/@angular/router/test/router_url_serializer_spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -import {AsyncTestCompleter, beforeEach, beforeEachProviders, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '@angular/core/testing/testing_internal'; - -import {DefaultRouterUrlSerializer} from '../src/router_url_serializer'; -import {UrlSegment} from '../src/segments'; - -export function main() { - describe('url serializer', () => { - let url = new DefaultRouterUrlSerializer(); - - it('should parse the root url', () => { - let tree = url.parse('/'); - expectSegment(tree.root, ''); - expect(url.serialize(tree)).toEqual(''); - }); - - it('should parse non-empty urls', () => { - let tree = url.parse('one/two'); - expectSegment(tree.firstChild(tree.root), 'one'); - expectSegment(tree.firstChild(tree.firstChild(tree.root)), 'two'); - expect(url.serialize(tree)).toEqual('/one/two'); - }); - - it('should parse multiple aux routes', () => { - let tree = url.parse('/one/two(/three//right:four)/five'); - let c = tree.children(tree.firstChild(tree.root)); - - expectSegment(c[0], 'two'); - expectSegment(c[1], 'aux:three'); - expectSegment(c[2], 'right:four'); - - expectSegment(tree.firstChild(c[0]), 'five'); - - expect(url.serialize(tree)).toEqual('/one/two(aux:three//right:four)/five'); - }); - - it('should parse aux routes that have aux routes', () => { - let tree = url.parse('/one(/two(/three))'); - let c = tree.children(tree.root); - - expectSegment(c[0], 'one'); - expectSegment(c[1], 'aux:two'); - expectSegment(c[2], 'aux:three'); - - expect(url.serialize(tree)).toEqual('/one(aux:two//aux:three)'); - }); - - it('should parse aux routes that have children', () => { - let tree = url.parse('/one(/two/three)'); - let c = tree.children(tree.root); - - expectSegment(c[0], 'one'); - expectSegment(c[1], 'aux:two'); - expectSegment(tree.firstChild(c[1]), 'three'); - - expect(url.serialize(tree)).toEqual('/one(aux:two/three)'); - }); - - it('should parse an empty aux route definition', () => { - let tree = url.parse('/one()'); - let c = tree.children(tree.root); - - expectSegment(c[0], 'one'); - expect(tree.children(c[0]).length).toEqual(0); - - expect(url.serialize(tree)).toEqual('/one'); - }); - - it('should parse key-value matrix params', () => { - let tree = url.parse('/one;a=11a;b=11b(/two;c=22//right:three;d=33)'); - let c = tree.children(tree.root); - - expectSegment(c[0], 'one;a=11a;b=11b'); - expectSegment(c[1], 'aux:two;c=22'); - expectSegment(c[2], 'right:three;d=33'); - - expect(url.serialize(tree)).toEqual('/one;a=11a;b=11b(aux:two;c=22//right:three;d=33)'); - }); - - it('should parse key only matrix params', () => { - let tree = url.parse('/one;a'); - - let c = tree.firstChild(tree.root); - expectSegment(c, 'one;a=true'); - - expect(url.serialize(tree)).toEqual('/one;a=true'); - }); - }); -} - -function expectSegment(segment: UrlSegment, expected: string): void { - expect(segment.toString()).toEqual(expected); -} diff --git a/modules/@angular/router/test/tree_spec.ts b/modules/@angular/router/test/tree_spec.ts deleted file mode 100644 index d70dbf7486..0000000000 --- a/modules/@angular/router/test/tree_spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import {AsyncTestCompleter, beforeEach, beforeEachProviders, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '@angular/core/testing/testing_internal'; - -import {Tree, TreeNode} from '../src/segments'; - -export function main() { - describe('tree', () => { - it('should return the root of the tree', () => { - let t = new Tree(new TreeNode(1, [])); - expect(t.root).toEqual(1); - }); - - it('should return the parent of a node', () => { - let t = new Tree(new TreeNode(1, [new TreeNode(2, [])])); - expect(t.parent(1)).toEqual(null); - expect(t.parent(2)).toEqual(1); - }); - - it('should return the children of a node', () => { - let t = new Tree(new TreeNode(1, [new TreeNode(2, [])])); - expect(t.children(1)).toEqual([2]); - expect(t.children(2)).toEqual([]); - }); - - it('should return the first child of a node', () => { - let t = new Tree(new TreeNode(1, [new TreeNode(2, [])])); - expect(t.firstChild(1)).toEqual(2); - expect(t.firstChild(2)).toEqual(null); - }); - - it('should return the path to the root', () => { - let t = new Tree(new TreeNode(1, [new TreeNode(2, [])])); - expect(t.pathFromRoot(2)).toEqual([1, 2]); - }); - - describe('contains', () => { - it('should work', () => { - let tree = new Tree( - new TreeNode(1, [new TreeNode(2, []), new TreeNode(3, [])])); - let subtree1 = new Tree(new TreeNode(1, [])); - let subtree2 = new Tree(new TreeNode(1, [new TreeNode(2, [])])); - let subtree3 = new Tree(new TreeNode(1, [new TreeNode(3, [])])); - let notSubtree1 = new Tree(new TreeNode(1, [new TreeNode(4, [])])); - let notSubtree2 = new Tree( - new TreeNode(1, [new TreeNode(2, [new TreeNode(4, [])])])); - - expect(tree.contains(subtree1)).toEqual(true); - expect(tree.contains(subtree2)).toEqual(true); - expect(tree.contains(subtree3)).toEqual(true); - expect(tree.contains(notSubtree1)).toEqual(false); - expect(tree.contains(notSubtree2)).toEqual(false); - }); - }); - }); -} diff --git a/modules/@angular/router/testing.ts b/modules/@angular/router/testing.ts deleted file mode 100644 index b3d36aad79..0000000000 --- a/modules/@angular/router/testing.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './testing/router_testing_providers'; diff --git a/modules/@angular/router/testing/router_testing_providers.ts b/modules/@angular/router/testing/router_testing_providers.ts deleted file mode 100644 index 8221fc2160..0000000000 --- a/modules/@angular/router/testing/router_testing_providers.ts +++ /dev/null @@ -1,35 +0,0 @@ -import {Location} from '@angular/common'; -import {SpyLocation} from '@angular/common/testing'; -import {Component, ComponentResolver} from '@angular/core'; - -import {Router, RouterOutletMap} from '../src/router'; -import {DefaultRouterUrlSerializer, RouterUrlSerializer} from '../src/router_url_serializer'; -import {RouteSegment} from '../src/segments'; - -@Component({selector: 'fake-app-root-comp', template: ``}) -class FakeAppRootCmp { -} - -function routerFactory( - componentResolver: ComponentResolver, urlSerializer: RouterUrlSerializer, - routerOutletMap: RouterOutletMap, location: Location): Router { - return new Router( - null, FakeAppRootCmp, componentResolver, urlSerializer, routerOutletMap, location); -} - -export const ROUTER_FAKE_PROVIDERS: any[] = /*@ts2dart_const*/[ - RouterOutletMap, - /* @ts2dart_Provider */ {provide: Location, useClass: SpyLocation}, - /* @ts2dart_Provider */ {provide: RouterUrlSerializer, useClass: DefaultRouterUrlSerializer}, - /* @ts2dart_Provider */ { - provide: Router, - useFactory: routerFactory, - deps: /*@ts2dart_const*/ - [ComponentResolver, RouterUrlSerializer, RouterOutletMap, Location] - }, - /*@ts2dart_Provider*/ { - provide: RouteSegment, - useFactory: (r: any /** TODO #9100 */) => r.routeTree.root, - deps: [Router] - } -]; diff --git a/modules/@angular/router/tsconfig-es2015.json b/modules/@angular/router/tsconfig-es2015.json deleted file mode 100644 index de33e1360a..0000000000 --- a/modules/@angular/router/tsconfig-es2015.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "declaration": true, - "stripInternal": true, - "experimentalDecorators": true, - "module": "es2015", - "moduleResolution": "node", - "outDir": "../../../dist/packages-dist/router/esm", - "paths": { - "@angular/core": ["../../../dist/packages-dist/core/"], - "@angular/common": ["../../../dist/packages-dist/common/"], - "@angular/common/testing": ["../../../dist/packages-dist/common/testing/"], - "@angular/platform-browser": ["../../../dist/packages-dist/platform-browser/"] - }, - "rootDir": ".", - "sourceMap": true, - "inlineSources": true, - "target": "es2015" - }, - "files": [ - "index.ts", - "testing.ts", - "../../../node_modules/zone.js/dist/zone.js.d.ts" - ] -} diff --git a/modules/@angular/router/tsconfig-es5.json b/modules/@angular/router/tsconfig-es5.json deleted file mode 100644 index 9c201f6c16..0000000000 --- a/modules/@angular/router/tsconfig-es5.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "declaration": true, - "stripInternal": true, - "experimentalDecorators": true, - "module": "commonjs", - "moduleResolution": "node", - "outDir": "../../../dist/packages-dist/router/", - "paths": { - "@angular/core": ["../../../dist/packages-dist/core/"], - "@angular/common": ["../../../dist/packages-dist/common/"], - "@angular/common/testing": ["../../../dist/packages-dist/common/testing/"], - "@angular/platform-browser": ["../../../dist/packages-dist/platform-browser/"] - }, - "rootDir": ".", - "sourceMap": true, - "inlineSources": true, - "lib": ["es6", "dom"], - "target": "es5" - }, - "files": [ - "index.ts", - "testing.ts", - "../../../node_modules/zone.js/dist/zone.js.d.ts" - ] -} diff --git a/modules/playground/e2e_test/alt_routing/routing_spec.dart b/modules/playground/e2e_test/alt_routing/routing_spec.dart deleted file mode 100644 index 8c1c7fd661..0000000000 --- a/modules/playground/e2e_test/alt_routing/routing_spec.dart +++ /dev/null @@ -1,3 +0,0 @@ -library playground.e2e_test.routing.routing_spec; - -main() {} diff --git a/modules/playground/e2e_test/alt_routing/routing_spec.ts b/modules/playground/e2e_test/alt_routing/routing_spec.ts deleted file mode 100644 index a0f4234484..0000000000 --- a/modules/playground/e2e_test/alt_routing/routing_spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import {verifyNoBrowserErrors} from '@angular/platform-browser/testing_e2e'; - -function waitForElement(selector: any /** TODO #9100 */) { - var EC = (protractor).ExpectedConditions; - // Waits for the element with id 'abc' to be present on the dom. - browser.wait(EC.presenceOf($(selector)), 20000); -} - -describe('alt-routing inbox-app', () => { - var URL = 'all/playground/src/alt_routing/'; - - afterEach(verifyNoBrowserErrors); - - describe('index view', () => { - it('should list out the current collection of items', () => { - browser.get(URL); - waitForElement('.inbox-item-record'); - expect(element.all(by.css('.inbox-item-record')).count()).toEqual(200); - }); - - it('should build a link which points to the detail page', () => { - browser.get(URL); - waitForElement('#item-15'); - expect(element(by.css('#item-15')).getAttribute('href')).toMatch(/\/detail\/15$/); - element(by.css('#item-15')).click(); - waitForElement('#record-id'); - expect(browser.getCurrentUrl()).toMatch(/\/detail\/15$/); - }); - }); - - - describe('drafts view', () => { - it('should navigate to the drafts view when the drafts link is clicked', () => { - browser.get(URL); - waitForElement('.inbox-item-record'); - element(by.linkText('Drafts')).click(); - waitForElement('.page-title'); - expect(element(by.css('.page-title')).getText()).toEqual('Drafts'); - }); - - it('should navigate to email details', () => { - browser.get(URL); - element(by.linkText('Drafts')).click(); - waitForElement('.inbox-item-record'); - expect(element.all(by.css('.inbox-item-record')).count()).toEqual(2); - expect(element(by.css('#item-201')).getAttribute('href')).toMatch(/\/detail\/201$/); - element(by.css('#item-201')).click(); - waitForElement('#record-id'); - expect(browser.getCurrentUrl()).toMatch(/\/detail\/201$/); - }); - }); - - - describe('detail view', () => { - it('should navigate to the detail view when an email is clicked', () => { - browser.get(URL); - waitForElement('#item-10'); - element(by.css('#item-10')).click(); - waitForElement('#record-id'); - var recordId = element(by.css("#record-id")); - browser.wait(protractor.until.elementTextIs(recordId, "ID: 10"), 5000); - expect(recordId.getText()).toEqual('ID: 10'); - }); - - it('should navigate back to the email inbox page when the back button is clicked', () => { - browser.get(URL); - waitForElement('#item-10'); - element(by.css('#item-10')).click(); - waitForElement('.back-button'); - element(by.css('.back-button')).click(); - expect(browser.getCurrentUrl()).toMatch(/\/$/); - }); - - it('should navigate back to index and sort the page items based on the provided querystring param', - () => { - browser.get(URL); - waitForElement('#item-10'); - element(by.css('#item-10')).click(); - waitForElement('.sort-button'); - element(by.css('.sort-button')).click(); - expect(browser.getCurrentUrl()).toContain(';sort=date'); - waitForElement('.inbox-item-record'); - expect(element(by.css(".inbox-item-record > a")).getAttribute("id")).toEqual("item-137"); - }); - }) -}); diff --git a/modules/playground/pubspec.yaml b/modules/playground/pubspec.yaml index c4ab4ee202..deb98d894f 100644 --- a/modules/playground/pubspec.yaml +++ b/modules/playground/pubspec.yaml @@ -30,7 +30,6 @@ transformers: - web/src/person_management/index.dart - web/src/relative_assets/index.dart - web/src/routing/index.dart - - web/src/alt_routing/index.dart - web/src/sourcemap/index.dart - web/src/svg/index.dart - web/src/template_driven_forms/index.dart diff --git a/modules/playground/src/alt_routing/app/data.ts b/modules/playground/src/alt_routing/app/data.ts deleted file mode 100644 index a984dd6ea3..0000000000 --- a/modules/playground/src/alt_routing/app/data.ts +++ /dev/null @@ -1,2116 +0,0 @@ -export var data = [ - { - "id": "1", - "first-name": "Montana", - "last-name": "Prosacco", - "email": "jairo.bergnaum@bergnaum.org", - "date": "1991-10-12 15:12:46 -0700", - "content": - "Et quisquam veniam voluptatem enim temporibus itaque. Ipsam voluptatem et. Occaecati rerum animi.", - "subject": "Quidem quo ipsam architecto soluta numquam et" - }, - - { - "id": "2", - "first-name": "Frances", - "last-name": "Schaden", - "email": "pierre_tromp@adams.com", - "date": "2001-05-06 08:22:33 -0700", - "content": "Porro ea tempore numquam deserunt voluptas qui. Est quis suscipit.", - "subject": "Voluptatibus dolore porro animi" - }, - - { - "id": "3", - "first-name": "Jayne", - "last-name": "Kreiger", - "email": "breanne@howell.net", - "date": "2001-05-22 14:28:41 -0700", - "content": "Voluptas et est laborum non ullam.", - "subject": "Ratione ut illum fuga non" - }, - - { - "id": "4", - "first-name": "Hester", - "last-name": "Wyman", - "email": "fausto@steuber.com", - "date": "1996-07-20 02:13:12 -0700", - "content": - "Iusto enim laborum. Autem sed quas laborum deserunt quibusdam dolorem. Laboriosam nesciunt debitis possimus ut aut quae.", - "subject": "Ea quas et quia beatae dolores" - }, - - { - "id": "5", - "first-name": "Alexandre", - "last-name": "Dietrich", - "email": "carmella_mante@moendibbert.biz", - "date": "2006-03-20 23:44:38 -0800", - "content": "Voluptates voluptatem dolorem non quod dolores.", - "subject": "Nostrum ad modi non consequatur repellendus et harum" - }, - - { - "id": "6", - "first-name": "Ena", - "last-name": "Green", - "email": "jan_koepp@glover.name", - "date": "1988-03-21 02:00:36 -0800", - "content": - "Nam inventore voluptatum eaque ratione nisi nesciunt. Qui ex qui omnis aliquid. Dolorem ipsum expedita.", - "subject": "Qui sint vero accusamus quam id vitae quis quia" - }, - - { - "id": "7", - "first-name": "Rebecca", - "last-name": "Walsh", - "email": "marta@mueller.biz", - "date": "1974-05-09 02:40:20 -0700", - "content": - "Voluptas vel ut. Rerum vero repellat accusantium earum. Ea atque exercitationem expedita id dolores dolorem.", - "subject": "Suscipit et inventore exercitationem ut voluptatum esse vero" - }, - - { - "id": "8", - "first-name": "Jed", - "last-name": "Rogahn", - "email": "talia_crist@mertzfadel.info", - "date": "2006-10-17 01:28:46 -0700", - "content": "Cupiditate nam blanditiis.", - "subject": "Dolore nulla qui sequi ut enim sed" - }, - - { - "id": "9", - "first-name": "Fabiola", - "last-name": "Olson", - "email": "henderson@casper.org", - "date": "2008-02-29 11:46:44 -0800", - "content": - "Similique nesciunt omnis beatae omnis pariatur quas. Voluptatem eum consequatur id impedit fugit dignissimos ut.", - "subject": "Sit quasi accusamus aut et eum" - }, - - { - "id": "10", - "first-name": "Alex", - "last-name": "Turcotte", - "email": "mya@stokes.org", - "date": "1974-03-29 12:02:53 -0700", - "content": - "Ut pariatur porro maiores. Saepe soluta aspernatur est sed suscipit. Excepturi incidunt aut atque nostrum cum non.", - "subject": "Rerum dolore sunt veniam provident" - }, - - { - "id": "11", - "first-name": "Jerome", - "last-name": "Greenholt", - "email": "jazmyne.dibbert@abshire.org", - "date": "1997-01-12 02:48:08 -0800", - "content": "Natus error id.", - "subject": "Rerum nemo aperiam veritatis veniam" - }, - - { - "id": "12", - "first-name": "Antwan", - "last-name": "Kreiger", - "email": "delilah@dibbert.name", - "date": "1971-05-08 10:45:01 -0700", - "content": - "Perspiciatis sed quo. Eum dignissimos quia expedita dolorem illum minima enim. Fugiat ducimus nostrum quia reiciendis autem nisi placeat.", - "subject": "Esse ipsum pariatur voluptatum rerum labore id odit" - }, - - { - "id": "13", - "first-name": "Kyleigh", - "last-name": "Rogahn", - "email": "ralph_ledner@bartolettifay.info", - "date": "2013-11-28 16:10:15 -0800", - "content": "Molestias repudiandae dicta vel.", - "subject": "Facilis occaecati pariatur qui incidunt reprehenderit sunt" - }, - - { - "id": "14", - "first-name": "Henriette", - "last-name": "Gottlieb", - "email": "adeline.rowe@lubowitz.net", - "date": "1983-02-11 06:45:49 -0800", - "content": "Eveniet ut voluptas eos ut rerum voluptatum.", - "subject": "Natus voluptas voluptatem alias" - }, - - { - "id": "15", - "first-name": "Jacklyn", - "last-name": "White", - "email": "milton_keebler@braun.biz", - "date": "1992-01-07 12:27:59 -0800", - "content": "Reiciendis et aperiam. Doloremque totam repudiandae velit fuga fugiat.", - "subject": "Nulla est magnam ducimus porro commodi" - }, - - { - "id": "16", - "first-name": "Charlotte", - "last-name": "Ziemann", - "email": "brett@purdymills.com", - "date": "1972-06-06 02:42:50 -0700", - "content": - "Voluptatem corporis tempore. Consectetur fugit perspiciatis libero dolore consequatur asperiores. Voluptates ea accusamus.", - "subject": "Ea adipisci reiciendis excepturi suscipit necessitatibus ut sed" - }, - - { - "id": "17", - "first-name": "Giovanny", - "last-name": "Runolfsdottir", - "email": "dustin.sanford@rippin.com", - "date": "1987-04-14 19:29:11 -0700", - "content": - "Dolor consequuntur sed aspernatur qui. Sit cumque id animi ut sed id. Asperiores voluptatem similique voluptas.", - "subject": "Id ut voluptatum culpa molestiae quo" - }, - - { - "id": "18", - "first-name": "Savion", - "last-name": "McCullough", - "email": "don@gorczanysimonis.name", - "date": "1974-01-18 14:40:40 -0700", - "content": - "Autem voluptatem dignissimos vel debitis ipsum voluptatem consequuntur. Voluptatum et saepe.", - "subject": "Ipsa similique quo nostrum" - }, - - { - "id": "19", - "first-name": "Robbie", - "last-name": "Kohler", - "email": "haley@waters.biz", - "date": "2002-09-28 08:35:10 -0700", - "content": - "Quo ut accusantium similique necessitatibus. Sunt impedit commodi ut et odit voluptatibus error.", - "subject": "Voluptate eum quo error" - }, - - { - "id": "20", - "first-name": "Eulalia", - "last-name": "Effertz", - "email": "rodrigo_parisian@bergecartwright.net", - "date": "2006-07-29 21:47:56 -0700", - "content": - "Eum repudiandae rem aliquid dolorum suscipit vel. Autem vel voluptas et iure magni.", - "subject": "Est dolorum modi et error consequuntur qui" - }, - - { - "id": "21", - "first-name": "Gregoria", - "last-name": "Boehm", - "email": "miles@jerde.org", - "date": "1997-04-11 19:49:38 -0700", - "content": - "Qui necessitatibus veniam. Maiores impedit in natus aspernatur adipisci. Ad sapiente iste.", - "subject": "Doloribus ipsum a eius voluptatem nulla" - }, - - { - "id": "22", - "first-name": "Berry", - "last-name": "Collier", - "email": "larry_rath@rathbernier.info", - "date": "1981-06-26 05:26:47 -0700", - "content": - "Numquam rerum quia similique enim sequi eos inventore. Numquam inventore aliquam commodi neque maiores. Hic et vel aut velit corrupti.", - "subject": "Optio ab delectus pariatur vel tempore" - }, - - { - "id": "23", - "first-name": "Crawford", - "last-name": "Ryan", - "email": "cindy_ziemann@harvey.org", - "date": "1997-06-12 07:56:32 -0700", - "content": "Odio ea nostrum molestiae. Doloribus ducimus occaecati facilis pariatur ut est.", - "subject": "Quo fugit at totam voluptate est" - }, - - { - "id": "24", - "first-name": "Kelsie", - "last-name": "Stokes", - "email": "jackson_ferry@connelly.name", - "date": "1986-07-30 21:39:50 -0700", - "content": - "Amet voluptatem ea nesciunt sunt. Quidem pariatur sit. Minus aliquam itaque laudantium in quibusdam laboriosam.", - "subject": "Labore voluptas dolor repellendus accusantium tempora" - }, - - { - "id": "25", - "first-name": "Josefa", - "last-name": "Predovic", - "email": "moises@sauer.info", - "date": "1976-04-09 22:38:31 -0800", - "content": - "Aliquam consectetur et non soluta. Quia dolore molestiae facilis eos nihil vel. Quidem eos et.", - "subject": "Qui architecto inventore alias non aut dolorum porro" - }, - - { - "id": "26", - "first-name": "Toby", - "last-name": "Wehner", - "email": "janet@mohr.org", - "date": "2003-05-08 07:44:26 -0700", - "content": "Suscipit cumque alias debitis necessitatibus et qui.", - "subject": "Possimus laudantium exercitationem ut deleniti similique" - }, - - { - "id": "27", - "first-name": "Keira", - "last-name": "Stamm", - "email": "karlie@witting.info", - "date": "2010-11-11 16:17:29 -0800", - "content": - "Rerum cum at autem repellat quod nihil. Quasi voluptates minus autem accusantium debitis cumque qui.", - "subject": "Nostrum repudiandae voluptatum adipisci ut error sunt et sint" - }, - - { - "id": "28", - "first-name": "Clark", - "last-name": "Predovic", - "email": "palma@ankundingbednar.biz", - "date": "1978-02-10 16:55:54 -0800", - "content": - "Non ex aperiam porro. At harum vitae ut exercitationem qui qui. Quae sed sapiente sed debitis officiis quis unde.", - "subject": "Eos eligendi voluptatum consequatur reprehenderit" - }, - - { - "id": "29", - "first-name": "Colby", - "last-name": "Jacobson", - "email": "rozella@spencer.com", - "date": "1978-01-04 00:18:51 -0800", - "content": - "Molestiae laudantium voluptas ipsa est laborum vel. Dolorem et est nihil distinctio numquam.", - "subject": "Aut et sint deleniti mollitia debitis" - }, - - { - "id": "30", - "first-name": "Kayley", - "last-name": "Connelly", - "email": "rowland.thiel@gutmannorn.info", - "date": "2012-12-10 09:59:08 -0800", - "content": - "Eligendi quia repellat distinctio eum voluptas debitis. Totam a alias qui voluptates dolor.", - "subject": "Ipsum consequatur culpa repellat quae mollitia quia unde" - }, - - { - "id": "31", - "first-name": "Kay", - "last-name": "Reynolds", - "email": "lexie.frami@beattyschoen.info", - "date": "1991-05-27 22:37:41 -0700", - "content": - "Laborum quod iusto in voluptas et adipisci dolor. Totam et voluptatibus id tempora. Asperiores magnam dolorem quo iste sapiente.", - "subject": "Tempora et eligendi quia dolorem alias ullam maiores doloremque" - }, - - { - "id": "32", - "first-name": "Ellsworth", - "last-name": "Veum", - "email": "estefania_hermann@murray.biz", - "date": "1974-12-07 03:43:52 -0800", - "content": - "Et commodi molestiae hic distinctio et iusto. Quod illo natus unde est aut. Laborum rem rerum totam.", - "subject": "Expedita nostrum consectetur sint velit modi maxime quisquam" - }, - - { - "id": "33", - "first-name": "Adeline", - "last-name": "Altenwerth", - "email": "francesco@weberstroman.com", - "date": "1988-03-25 22:52:39 -0800", - "content": - "Quod deserunt eum dignissimos eius et veniam. Non exercitationem omnis molestiae corrupti aliquid commodi repudiandae.", - "subject": "Dolor incidunt debitis possimus temporibus rerum quibusdam eaque" - }, - - { - "id": "34", - "first-name": "River", - "last-name": "Roob", - "email": "lester.hodkiewicz@hoppemcglynn.name", - "date": "1981-01-03 06:04:53 -0800", - "content": - "Sed dolorem et laborum voluptate perspiciatis doloremque aliquam. Recusandae et odit. Sit esse consequatur occaecati fuga sed.", - "subject": "Dolorem ut quia repudiandae accusamus reprehenderit dignissimos iste cupiditate" - }, - - { - "id": "35", - "first-name": "Chaya", - "last-name": "Stokes", - "email": "rebekah.baumbach@toy.org", - "date": "1979-09-03 07:52:52 -0700", - "content": "Ea voluptas minus hic omnis.", - "subject": "Ab repellendus quia eos eius" - }, - - { - "id": "36", - "first-name": "Cara", - "last-name": "Brown", - "email": "natasha_gibson@bins.name", - "date": "1985-12-19 03:29:37 -0800", - "content": - "Numquam nobis consectetur modi eligendi. Facere adipisci aut velit quis dolor quidem totam. Consequatur qui placeat aut molestiae dignissimos.", - "subject": "Est quia reiciendis enim et totam temporibus" - }, - - { - "id": "37", - "first-name": "Laron", - "last-name": "Wunsch", - "email": "erna@heathcote.com", - "date": "2004-06-28 16:53:07 -0700", - "content": - "Quisquam maxime nostrum explicabo corrupti ut. Et accusantium culpa occaecati officiis quo.", - "subject": "Et et nulla aspernatur quas distinctio" - }, - - { - "id": "38", - "first-name": "Lessie", - "last-name": "Roob", - "email": "ona_olson@dicki.biz", - "date": "1980-02-10 00:18:48 -0800", - "content": - "Facere veritatis aut quam praesentium ut. Consectetur praesentium explicabo consequuntur quia vel rem.", - "subject": "Tenetur ducimus mollitia consequatur dicta" - }, - - { - "id": "39", - "first-name": "Felton", - "last-name": "Labadie", - "email": "stone.kihn@vonruedenbartoletti.biz", - "date": "2002-04-04 17:29:31 -0800", - "content": - "Iure ad nesciunt. Excepturi impedit eum suscipit dignissimos est. Corrupti accusamus sapiente ratione eaque iure aut mollitia.", - "subject": "Sunt et eius et iusto accusamus voluptas eum" - }, - - { - "id": "40", - "first-name": "Verna", - "last-name": "Hoppe", - "email": "arthur_schiller@daniel.org", - "date": "2013-05-15 16:04:25 -0700", - "content": - "Veniam quia omnis at sapiente. Est est fugit eum. Impedit suscipit hic similique eum quibusdam.", - "subject": "Voluptatum ipsum libero et vitae odio dolore tenetur perspiciatis" - }, - - { - "id": "41", - "first-name": "Velda", - "last-name": "Veum", - "email": "christy@feil.org", - "date": "1988-10-24 12:42:25 -0700", - "content": "Rem inventore necessitatibus iste et quia vero laudantium.", - "subject": "Suscipit similique provident officia est explicabo sed" - }, - - { - "id": "42", - "first-name": "Mackenzie", - "last-name": "Schroeder", - "email": "miles.dietrich@stehrkuhic.org", - "date": "1990-01-07 22:38:09 -0800", - "content": "Non autem delectus. Architecto recusandae unde quia rerum inventore repudiandae.", - "subject": "Molestiae odio et repudiandae ut" - }, - - { - "id": "43", - "first-name": "Natalie", - "last-name": "Hoeger", - "email": "gregorio_mosciski@schneiderframi.net", - "date": "1976-04-06 06:23:07 -0800", - "content": - "Iste id illo cupiditate enim aut quo. Vel ut eos qui. Aut at in eum maiores voluptatem quidem.", - "subject": "Quia officiis sit sint aliquid ad quibusdam et" - }, - - { - "id": "44", - "first-name": "Joan", - "last-name": "Mosciski", - "email": "thad@dickivolkman.info", - "date": "1990-12-26 15:04:40 -0800", - "content": "Culpa est officia veritatis esse.", - "subject": "Est eum ullam quo" - }, - - { - "id": "45", - "first-name": "Emmitt", - "last-name": "Keeling", - "email": "cali@ferry.info", - "date": "2009-04-10 10:14:57 -0700", - "content": - "Numquam velit sunt sed et ut. Laudantium qui laboriosam quibusdam qui. Odio non maxime soluta vero qui.", - "subject": "Accusantium saepe id totam aut reiciendis at esse magnam" - }, - - { - "id": "46", - "first-name": "Guy", - "last-name": "Renner", - "email": "naomie_klein@streich.name", - "date": "1970-12-18 13:09:51 -0800", - "content": "Iure quia at excepturi sit consequatur.", - "subject": "Commodi aut ipsa accusantium dolor repudiandae in" - }, - - { - "id": "47", - "first-name": "Eric", - "last-name": "Kihn", - "email": "dock.schmeler@langworth.biz", - "date": "1993-12-17 11:17:07 -0800", - "content": "Facere voluptate omnis qui officia dicta.", - "subject": "Incidunt a libero ab asperiores fuga ut quo illum" - }, - - { - "id": "48", - "first-name": "Kraig", - "last-name": "Keeling", - "email": "alejandrin@streichwiegand.org", - "date": "1977-12-09 14:54:22 -0800", - "content": "Asperiores expedita incidunt in cum ex vel hic.", - "subject": "In illum quisquam ut est eligendi aut" - }, - - { - "id": "49", - "first-name": "Justice", - "last-name": "Leuschke", - "email": "florencio@conn.info", - "date": "1991-12-14 09:38:08 -0800", - "content": - "Aspernatur nesciunt voluptas sit. Cum architecto enim et blanditiis soluta dolor. Recusandae numquam occaecati esse animi et aut.", - "subject": "Quaerat voluptatibus eum sapiente iure deserunt" - }, - - { - "id": "50", - "first-name": "Jodie", - "last-name": "O'Hara", - "email": "rick@stehrboehm.info", - "date": "2000-07-21 05:34:03 -0700", - "content": - "Labore repudiandae dolor nostrum quo tempora eos. Natus ea fugit voluptas doloremque distinctio quaerat unde. Ut aut nostrum.", - "subject": "Tempore in quam id aliquam fuga eos dolor" - }, - - { - "id": "51", - "first-name": "Dannie", - "last-name": "Vandervort", - "email": "mariana@abbottruecker.biz", - "date": "2001-09-15 19:00:54 -0700", - "content": "Consectetur dolore voluptas.", - "subject": "Tenetur possimus et fuga mollitia perferendis omnis corporis" - }, - - { - "id": "52", - "first-name": "Delaney", - "last-name": "Champlin", - "email": "kyler_welch@krisrowe.biz", - "date": "2014-07-22 07:09:07 -0700", - "content": "Voluptates qui aut.", - "subject": "Quam eos laborum nisi delectus" - }, - - { - "id": "53", - "first-name": "Barbara", - "last-name": "Kihn", - "email": "tyrese.casper@keebler.net", - "date": "1996-02-29 20:04:40 -0800", - "content": "Totam labore voluptatem eos qui temporibus velit.", - "subject": "Eum neque sed aut sunt" - }, - - { - "id": "54", - "first-name": "Jarred", - "last-name": "Shanahan", - "email": "coralie@weinat.net", - "date": "1977-06-08 01:46:22 -0700", - "content": "Sed et voluptatum ut est quo et aut.", - "subject": "Aut eligendi voluptas mollitia et accusamus sint nemo" - }, - - { - "id": "55", - "first-name": "Llewellyn", - "last-name": "Bechtelar", - "email": "kaci@jast.com", - "date": "1998-12-01 21:14:32 -0800", - "content": "Architecto eligendi et ut occaecati temporibus voluptas quia.", - "subject": "Sint quis vitae voluptatem dolor aut quo maiores quas" - }, - - { - "id": "56", - "first-name": "Albertha", - "last-name": "Upton", - "email": "august@bradtkemiller.net", - "date": "2006-11-16 14:38:45 -0800", - "content": - "Voluptas perspiciatis recusandae et. Sequi eum eius dicta dolorem. Alias reprehenderit explicabo doloribus exercitationem sint.", - "subject": "Quo nihil fuga dolores cumque rerum eos asperiores" - }, - - { - "id": "57", - "first-name": "Christy", - "last-name": "Considine", - "email": "eliseo@veum.com", - "date": "1997-05-17 13:54:41 -0700", - "content": - "Consequatur rerum laudantium distinctio magni. Iusto ullam et suscipit nemo ex velit voluptatem.", - "subject": "Ut ea quisquam libero qui repudiandae aut officia" - }, - - { - "id": "58", - "first-name": "Jessica", - "last-name": "Simonis", - "email": "rickey@mertz.info", - "date": "2012-10-04 00:32:34 -0700", - "content": - "Neque tenetur sunt sunt ratione. Rerum dolorem illo ab blanditiis quisquam architecto. Quidem ea exercitationem enim eos.", - "subject": "Atque quo nemo explicabo voluptas blanditiis accusantium et" - }, - - { - "id": "59", - "first-name": "Justen", - "last-name": "Davis", - "email": "karen@jaskolskigleason.org", - "date": "1994-08-10 02:33:43 -0700", - "content": "Eius tenetur mollitia ad alias ab.", - "subject": "Ut accusantium sunt qui nostrum eligendi" - }, - - { - "id": "60", - "first-name": "Elwin", - "last-name": "Daugherty", - "email": "milo@ko.net", - "date": "1976-06-30 05:16:38 -0700", - "content": "Sit necessitatibus minus.", - "subject": "A molestiae voluptates ducimus id est recusandae" - }, - - { - "id": "61", - "first-name": "Clair", - "last-name": "Raynor", - "email": "zella.hermiston@batz.org", - "date": "1985-12-18 14:30:18 -0800", - "content": "Aut aliquid est sit pariatur voluptatem dolorum.", - "subject": "Consectetur reprehenderit temporibus vel voluptatem voluptatem et rem fuga" - }, - - { - "id": "62", - "first-name": "Hilario", - "last-name": "Klein", - "email": "adrain@stark.biz", - "date": "1980-09-08 18:06:43 -0700", - "content": "Eum dolore optio quos animi.", - "subject": "Illum nihil vitae molestiae laboriosam beatae modi" - }, - - { - "id": "63", - "first-name": "Greta", - "last-name": "Murray", - "email": "ethelyn@fritsch.org", - "date": "1970-05-23 02:27:54 -0700", - "content": - "Quisquam animi et recusandae rem modi eos ipsa. Eaque et expedita qui animi veritatis temporibus.", - "subject": "Repellendus fuga sint nemo" - }, - - { - "id": "64", - "first-name": "Anissa", - "last-name": "Adams", - "email": "edward@armstrong.com", - "date": "1997-01-26 22:21:57 -0800", - "content": "Laudantium culpa rem voluptas tempore. Sit modi dolor est sunt rem.", - "subject": "Autem unde minima quia beatae totam" - }, - - { - "id": "65", - "first-name": "Kaylah", - "last-name": "Conroy", - "email": "brian.cormier@hyatt.org", - "date": "2015-02-02 07:44:37 -0800", - "content": "Voluptates vitae nulla expedita. Possimus et quo aut eum.", - "subject": "Molestiae minus enim adipisci et" - }, - - { - "id": "66", - "first-name": "Jamey", - "last-name": "Ebert", - "email": "seth@pfannerstillrodriguez.name", - "date": "1987-09-29 09:40:59 -0700", - "content": "Voluptatem est quae.", - "subject": "Similique nemo placeat id tempore dolorum" - }, - - { - "id": "67", - "first-name": "Johnson", - "last-name": "Mosciski", - "email": "morton@littel.net", - "date": "1989-02-14 11:15:10 -0800", - "content": - "Molestias expedita exercitationem et praesentium et vel delectus. Qui fuga molestias porro.", - "subject": "Aut rerum quidem est iste in blanditiis sit" - }, - - { - "id": "68", - "first-name": "Ellis", - "last-name": "O'Keefe", - "email": "taurean@ullrich.biz", - "date": "1987-03-09 11:29:05 -0800", - "content": - "Facere sint doloribus qui illo autem consequatur culpa. Est quisquam enim accusantium praesentium.", - "subject": "Quis beatae quia velit deserunt est sit odit quisquam" - }, - - { - "id": "69", - "first-name": "Marlen", - "last-name": "Ritchie", - "email": "rodger_schamberger@thiel.net", - "date": "1989-07-23 03:03:52 -0700", - "content": "Doloribus porro hic quis explicabo fuga veritatis vero.", - "subject": "Et doloribus est consequatur unde" - }, - - { - "id": "70", - "first-name": "Maddison", - "last-name": "Kuhic", - "email": "rosetta@von.biz", - "date": "1975-06-22 10:34:58 -0700", - "content": - "Sit ut eos libero error sapiente veritatis. Est dolore qui impedit recusandae quas animi rerum.", - "subject": "Quos culpa assumenda enim eius aliquid dolorum" - }, - - { - "id": "71", - "first-name": "Whitney", - "last-name": "Parisian", - "email": "everardo@langworth.name", - "date": "1970-11-04 01:17:28 -0800", - "content": - "Quam dolores pariatur ut possimus. Alias tenetur ex accusantium quasi. Nihil dolorem mollitia quidem.", - "subject": "Officia totam excepturi sed illum et tempore commodi sit" - }, - - { - "id": "72", - "first-name": "Madyson", - "last-name": "Streich", - "email": "imani@murray.biz", - "date": "1983-07-16 11:27:34 -0700", - "content": - "Veritatis molestiae id placeat dolorem consectetur a est. Est enim aut. Magnam aut distinctio quo sapiente ea est accusantium.", - "subject": "Aut sunt esse eligendi et qui ut sed" - }, - - { - "id": "73", - "first-name": "Laurie", - "last-name": "Purdy", - "email": "jarrell@paucek.biz", - "date": "1992-10-18 12:48:31 -0700", - "content": - "Saepe facilis est repellendus praesentium autem. Qui soluta voluptas ullam sequi. Molestias aut quibusdam.", - "subject": "Quo ullam totam sit dolores" - }, - - { - "id": "74", - "first-name": "Ollie", - "last-name": "Lowe", - "email": "corene@kris.info", - "date": "1976-08-24 16:28:46 -0700", - "content": "Nostrum qui eaque aperiam possimus libero non. Quae aut enim non.", - "subject": "Optio minus aut officiis voluptates reiciendis sit dicta" - }, - - { - "id": "75", - "first-name": "Ian", - "last-name": "Murray", - "email": "adelia_bernhard@maggio.com", - "date": "1982-04-08 00:25:22 -0800", - "content": "Quod dolores quibusdam nihil aut vel. Sit ab vitae necessitatibus eum.", - "subject": "Quia praesentium nam debitis nulla repellendus quos" - }, - - { - "id": "76", - "first-name": "Bernard", - "last-name": "Zieme", - "email": "kaelyn.johnson@markswalsh.net", - "date": "2014-01-17 03:47:35 -0800", - "content": "Repellendus qui reiciendis quibusdam voluptatum voluptate omnis.", - "subject": "Mollitia ut omnis tempore aut debitis ratione alias illum" - }, - - { - "id": "77", - "first-name": "Megane", - "last-name": "Kuvalis", - "email": "otis@donnellypouros.name", - "date": "1987-09-29 22:10:00 -0700", - "content": - "Explicabo repellat qui placeat inventore velit. Tempora accusamus minima facilis dicta architecto unde. Excepturi enim eos.", - "subject": "Quam molestias amet officiis" - }, - - { - "id": "78", - "first-name": "Freeman", - "last-name": "Nader", - "email": "samara_hoppe@dachcorkery.info", - "date": "2009-02-02 12:08:30 -0800", - "content": "Perferendis aut minus in.", - "subject": "Voluptates odio neque laudantium accusamus ipsa accusantium" - }, - - { - "id": "79", - "first-name": "Margarita", - "last-name": "Heller", - "email": "heloise@rogahn.name", - "date": "1984-01-04 10:41:32 -0800", - "content": "Officiis voluptas omnis. Nihil consectetur id reiciendis qui nemo est.", - "subject": "Velit in molestias quo repudiandae accusamus et excepturi et" - }, - - { - "id": "80", - "first-name": "Lonny", - "last-name": "Goodwin", - "email": "darian@kundebernier.info", - "date": "1999-02-08 07:00:38 -0800", - "content": - "Earum provident et minima aliquam iusto sint. Sed numquam ducimus voluptatem quos enim.", - "subject": "Commodi beatae vitae aut quos dolor consequatur" - }, - - { - "id": "81", - "first-name": "Jazlyn", - "last-name": "Bayer", - "email": "harvey@rempel.org", - "date": "2009-09-28 16:50:32 -0700", - "content": "Ipsum voluptas perferendis aperiam dolor.", - "subject": "Omnis inventore nobis cupiditate quas quis tenetur" - }, - - { - "id": "82", - "first-name": "Jakob", - "last-name": "Conn", - "email": "rylee@vandervort.net", - "date": "2008-11-12 17:22:34 -0800", - "content": - "Aut temporibus perferendis neque nulla et. Totam ab neque inventore et facere eligendi.", - "subject": "A optio ut molestiae iste et nam" - }, - - { - "id": "83", - "first-name": "Mikayla", - "last-name": "Romaguera", - "email": "rebecca_moriette@stracke.net", - "date": "1986-08-09 12:39:31 -0700", - "content": "Dicta et reiciendis corrupti.", - "subject": "Neque odio voluptates aut quam" - }, - - { - "id": "84", - "first-name": "Brianne", - "last-name": "West", - "email": "sheila@terry.com", - "date": "1972-04-25 22:32:20 -0800", - "content": - "Nulla sit mollitia qui odit sit corrupti repudiandae. Voluptas consequuntur voluptatibus molestiae. Illo quidem nostrum odio et.", - "subject": "Deserunt voluptas et accusamus" - }, - - { - "id": "85", - "first-name": "Destiny", - "last-name": "Mohr", - "email": "ernestine.waters@connellypfannerstill.com", - "date": "2012-10-30 15:02:35 -0700", - "content": - "Eveniet voluptatem molestias dolores aut voluptates. Quisquam nemo ipsam dicta numquam aut temporibus.", - "subject": "Pariatur nisi facilis tempora" - }, - - { - "id": "86", - "first-name": "Brooks", - "last-name": "Herman", - "email": "brendan_smith@treutel.info", - "date": "1972-04-01 17:10:07 -0800", - "content": "Qui sunt dolore molestiae minima. Suscipit ea quia a aut sunt et.", - "subject": "Magni quia perferendis possimus ipsam" - }, - - { - "id": "87", - "first-name": "Celestino", - "last-name": "Dickens", - "email": "cruz.mcdermott@ziemann.org", - "date": "2007-08-14 14:55:17 -0700", - "content": "Saepe libero tenetur.", - "subject": "Molestiae nulla aut laborum placeat perferendis aliquam" - }, - - { - "id": "88", - "first-name": "Angel", - "last-name": "Tillman", - "email": "shayna_baumbach@durgan.biz", - "date": "1978-08-31 01:02:14 -0700", - "content": - "Libero sequi ea dolore. Numquam quia temporibus voluptatum rerum. Deserunt tenetur nesciunt veritatis debitis.", - "subject": "Occaecati quo omnis adipisci sit perspiciatis aut modi cum" - }, - - { - "id": "89", - "first-name": "Verlie", - "last-name": "Tillman", - "email": "aurelia@gorczany.name", - "date": "1995-07-27 01:25:55 -0700", - "content": "Iure est veritatis qui et. Sit tempore ducimus repellat cupiditate.", - "subject": "Dolorum similique expedita praesentium quisquam quasi dolorem eligendi" - }, - - { - "id": "90", - "first-name": "Cornell", - "last-name": "Padberg", - "email": "rhianna@thiel.name", - "date": "2009-12-14 14:21:13 -0800", - "content": - "Ea modi consequatur. Necessitatibus sit qui voluptatem et accusantium. Cumque rerum omnis.", - "subject": "Molestiae nostrum aut officiis porro tempore" - }, - - { - "id": "91", - "first-name": "Carmelo", - "last-name": "Kunde", - "email": "beulah@rolfsonschaefer.info", - "date": "2010-08-14 23:10:58 -0700", - "content": "Ut molestiae dolorem fuga in aliquam est provident.", - "subject": "Atque occaecati temporibus et autem est" - }, - - { - "id": "92", - "first-name": "Jess", - "last-name": "Corwin", - "email": "korey.barrows@reillyankunding.com", - "date": "1976-11-13 05:09:16 -0800", - "content": - "Commodi eveniet aspernatur earum nisi aut sit dolor. Odio vero facilis reprehenderit dolore. Provident voluptatibus atque qui assumenda quaerat.", - "subject": "Commodi laboriosam accusamus quis dolores tempora eos" - }, - - { - "id": "93", - "first-name": "Hugh", - "last-name": "Hirthe", - "email": "verla.dickens@keeling.name", - "date": "1971-03-17 23:51:15 -0800", - "content": - "Voluptatibus saepe dolor voluptas sed cupiditate incidunt. Magni velit ut beatae minus. Consequatur recusandae voluptas ad ex dolores modi quos.", - "subject": "Ut pariatur odit mollitia soluta eaque magnam" - }, - - { - "id": "94", - "first-name": "Elsa", - "last-name": "Morissette", - "email": "otto@ohara.org", - "date": "2006-11-27 01:10:16 -0800", - "content": - "Et architecto ipsam asperiores vitae quo. Fugiat error quidem facilis. Eaque officiis est veniam.", - "subject": "Autem rerum consequatur suscipit veritatis" - }, - - { - "id": "95", - "first-name": "Gianni", - "last-name": "Nitzsche", - "email": "maxine.carter@schimmelfritsch.com", - "date": "2006-02-22 21:52:15 -0800", - "content": - "Nam aut at esse. Adipisci tenetur in voluptas. Dolore quia nobis voluptatibus iure sit eaque fugit.", - "subject": "Et est rerum non aut eum" - }, - - { - "id": "96", - "first-name": "Reed", - "last-name": "Kirlin", - "email": "keaton@gutmann.net", - "date": "2001-08-15 19:41:38 -0700", - "content": "Mollitia hic numquam dicta.", - "subject": "Est accusantium et nam dolores aliquam" - }, - - { - "id": "97", - "first-name": "Thelma", - "last-name": "Labadie", - "email": "leonor@bahringer.biz", - "date": "1993-01-04 20:38:12 -0800", - "content": - "Porro rerum ea similique. Vel qui est. Temporibus a distinctio dolor doloremque eos beatae.", - "subject": "Aut et quasi aut" - }, - - { - "id": "98", - "first-name": "Neva", - "last-name": "Stehr", - "email": "clifton.turner@beeroconnell.name", - "date": "1983-03-21 03:23:41 -0800", - "content": "Voluptatem impedit sed minus. Incidunt ad est consequatur rerum mollitia.", - "subject": "Eum sapiente quis placeat" - }, - - { - "id": "99", - "first-name": "Jovan", - "last-name": "Kunze", - "email": "grady_keler@casper.net", - "date": "1985-11-17 01:24:57 -0800", - "content": - "Molestiae laboriosam quia adipisci delectus praesentium nam. Dolorum repudiandae delectus esse quis voluptatem similique. Illum tempore vitae quia minus.", - "subject": "Nihil qui repellendus animi nostrum voluptas quisquam aut minima" - }, - - { - "id": "100", - "first-name": "Agustin", - "last-name": "Rowe", - "email": "roderick@cartermckenzie.name", - "date": "2013-08-15 06:42:43 -0700", - "content": "Quo eaque non laboriosam sunt. Ad aliquid laudantium quia. Aut nisi magnam.", - "subject": "Aut hic iste maiores sit" - }, - - { - "id": "101", - "first-name": "Lennie", - "last-name": "Pacocha", - "email": "valentine@goldnerryan.com", - "date": "1995-11-23 15:07:48 -0800", - "content": - "Provident sit voluptate odio qui. Est consequatur nobis. Quibusdam exercitationem ducimus aspernatur.", - "subject": "Perferendis adipisci necessitatibus qui similique" - }, - - { - "id": "102", - "first-name": "Brionna", - "last-name": "Brown", - "email": "jesus@gusikowski.info", - "date": "2007-12-21 20:22:44 -0800", - "content": - "Qui deleniti quaerat ratione doloremque ea quod consequatur. Illo consequatur nisi eos molestiae quos ullam. Enim neque rerum perspiciatis inventore consectetur.", - "subject": "Perferendis ratione voluptatem quae non magnam" - }, - - { - "id": "103", - "first-name": "Ceasar", - "last-name": "Becker", - "email": "barney@conn.biz", - "date": "1991-03-31 18:06:07 -0800", - "content": "Cupiditate ipsa minus. Recusandae consequatur aperiam ab ut sint expedita.", - "subject": "Dolore voluptatum maiores repudiandae ipsam qui consectetur veniam et" - }, - - { - "id": "104", - "first-name": "Jadon", - "last-name": "Walker", - "email": "alexie@brownspencer.biz", - "date": "2014-05-05 03:04:04 -0700", - "content": - "Ipsam ut molestias necessitatibus consequatur eligendi adipisci nihil. Nemo voluptatem dolores iure enim fuga.", - "subject": "Sunt officia voluptas porro et voluptatum exercitationem aut id" - }, - - { - "id": "105", - "first-name": "Harvey", - "last-name": "Little", - "email": "dell_reichel@mayert.name", - "date": "1997-05-17 16:09:39 -0700", - "content": - "Saepe et voluptate enim facere. Nihil est et sint odit aut quae. Deserunt molestiae explicabo impedit iure quod ratione.", - "subject": "Veniam ipsum est eum dolorem neque aut" - }, - - { - "id": "106", - "first-name": "Kailey", - "last-name": "Doyle", - "email": "golda@hayesdavis.name", - "date": "1992-07-01 10:53:52 -0700", - "content": - "Necessitatibus aspernatur nesciunt rerum nam. Qui quaerat modi. Et voluptatem ut quod perspiciatis quo eligendi.", - "subject": "Exercitationem voluptatem sunt hic debitis" - }, - - { - "id": "107", - "first-name": "Emily", - "last-name": "Gutmann", - "email": "mazie@bashirian.biz", - "date": "1999-12-26 09:22:07 -0800", - "content": - "Rem debitis qui quia. Nihil quis quia omnis et ea aliquid. Quam praesentium commodi itaque.", - "subject": "Maiores ea alias fuga" - }, - - { - "id": "108", - "first-name": "Jack", - "last-name": "O'Keefe", - "email": "carlos@wilkinson.biz", - "date": "1988-04-28 18:31:09 -0700", - "content": "Ab aspernatur vel et. Architecto occaecati qui. Adipisci ut sequi culpa.", - "subject": "Qui fuga rerum quo" - }, - - { - "id": "109", - "first-name": "Mylene", - "last-name": "Barton", - "email": "sherman.kunde@block.info", - "date": "1996-04-16 20:06:02 -0700", - "content": "Nostrum iste laboriosam corporis omnis.", - "subject": "Nihil et minima odit iste et beatae" - }, - - { - "id": "110", - "first-name": "Cristopher", - "last-name": "Krajcik", - "email": "levi@oconnell.com", - "date": "1989-11-08 03:06:37 -0800", - "content": "Assumenda qui et accusamus magnam deserunt ut nobis.", - "subject": "Aut numquam saepe placeat facilis at" - }, - - { - "id": "111", - "first-name": "Amya", - "last-name": "Anderson", - "email": "travis@waelchigottlieb.biz", - "date": "1986-12-25 15:27:02 -0800", - "content": "Iure numquam ea omnis nemo illo.", - "subject": "Labore sit aut ea in nemo et deleniti" - }, - - { - "id": "112", - "first-name": "Alphonso", - "last-name": "Buckridge", - "email": "duncan@barton.name", - "date": "1991-02-27 01:09:28 -0800", - "content": "Sint ducimus sed temporibus quo. Voluptas possimus eaque earum aut.", - "subject": "Quidem aliquid blanditiis quasi" - }, - - { - "id": "113", - "first-name": "Jovani", - "last-name": "Thompson", - "email": "lewis.greenfelder@stark.biz", - "date": "1970-10-29 18:08:36 -0800", - "content": "Modi aut ut amet ut qui.", - "subject": "Deserunt est autem sed dicta qui" - }, - - { - "id": "114", - "first-name": "Roosevelt", - "last-name": "Blick", - "email": "sophie_kaulke@kunze.biz", - "date": "2001-11-11 17:45:44 -0800", - "content": "Debitis non exercitationem vero nostrum dignissimos. Et voluptates ad nulla.", - "subject": "Quasi est ipsam accusantium sint" - }, - - { - "id": "115", - "first-name": "Darren", - "last-name": "Brown", - "email": "jammie@hickle.net", - "date": "2007-10-05 11:14:49 -0700", - "content": - "Quas ut odio blanditiis corrupti quia dolor. Id enim in veniam voluptatem. Laborum delectus quidem voluptatem beatae facilis ut.", - "subject": "Fugiat totam dolores harum soluta iusto et" - }, - - { - "id": "116", - "first-name": "Dexter", - "last-name": "Schroeder", - "email": "efrain.corwin@hane.name", - "date": "1973-09-30 19:52:23 -0700", - "content": "Debitis assumenda fugit. Sunt omnis in quod aut quibusdam qui.", - "subject": "Aut iure molestias suscipit laboriosam dolores" - }, - - { - "id": "117", - "first-name": "Mellie", - "last-name": "Hilpert", - "email": "amiya_haley@douglasbins.org", - "date": "1992-05-14 20:52:23 -0700", - "content": - "Vero aut perferendis commodi. Quod dolorem distinctio sint. Error nostrum reprehenderit aut quaerat officiis eaque.", - "subject": "Omnis aliquid rerum fuga vero molestiae quidem eveniet" - }, - - { - "id": "118", - "first-name": "Laura", - "last-name": "Koepp", - "email": "gus@hagenes.biz", - "date": "2007-08-04 22:19:10 -0700", - "content": - "Quibusdam fugiat quasi consequatur. Ipsam corporis nesciunt quae ipsa aliquid hic eius.", - "subject": "Asperiores quisquam voluptatem aut quam dolores" - }, - - { - "id": "119", - "first-name": "Amara", - "last-name": "Jerde", - "email": "estelle@marksdonnelly.info", - "date": "1989-08-19 01:24:43 -0700", - "content": - "Architecto voluptatum quas pariatur expedita exercitationem quo. Sint eum perferendis a. Et similique est amet dolores.", - "subject": "Id consequuntur nesciunt tenetur impedit sit voluptas" - }, - - { - "id": "120", - "first-name": "Jacquelyn", - "last-name": "Barton", - "email": "antwon_mayer@kshleringibson.info", - "date": "1989-08-19 13:07:02 -0700", - "content": "Quos enim repellendus praesentium sit rerum deserunt.", - "subject": "Et omnis hic autem ipsa tempora impedit perspiciatis" - }, - - { - "id": "121", - "first-name": "Micaela", - "last-name": "Runte", - "email": "vivianne.graham@vonrueden.org", - "date": "1986-09-27 01:16:29 -0700", - "content": "Et neque rem.", - "subject": "Enim facere corrupti accusamus quam consequatur beatae aspernatur vero" - }, - - { - "id": "122", - "first-name": "Millie", - "last-name": "Flatley", - "email": "gino@kihn.biz", - "date": "1980-02-09 01:35:05 -0800", - "content": "Rerum sint quis esse minus. Aut at asperiores. Amet magni beatae atque.", - "subject": "Illo vitae blanditiis et impedit in dolor" - }, - - { - "id": "123", - "first-name": "Sincere", - "last-name": "Rohan", - "email": "zora@beattyerdman.org", - "date": "2002-11-11 22:02:22 -0800", - "content": "Ut error voluptatem aut ratione molestiae. Omnis qui rem delectus.", - "subject": "Unde sed voluptas assumenda non animi quo" - }, - - { - "id": "124", - "first-name": "Vicky", - "last-name": "Kautzer", - "email": "mustafa.lueilwitz@tremblay.name", - "date": "2014-08-15 11:18:05 -0700", - "content": - "Nostrum quis et et molestiae molestiae. Corporis corrupti deleniti qui fugiat eos. Porro qui quis mollitia.", - "subject": "Quisquam ex esse dolore" - }, - - { - "id": "125", - "first-name": "Lavon", - "last-name": "Padberg", - "email": "destin_sanford@reynolds.net", - "date": "2005-07-11 21:24:34 -0700", - "content": "Officia dolorem autem beatae soluta numquam aperiam et.", - "subject": "Ad labore aut corporis" - }, - - { - "id": "126", - "first-name": "Shaina", - "last-name": "Dare", - "email": "carrie_sawayn@buckridge.net", - "date": "2001-10-12 08:02:09 -0700", - "content": "Ex doloremque dolor deleniti.", - "subject": "Asperiores recusandae reprehenderit quia tempore qui ipsam sit" - }, - - { - "id": "127", - "first-name": "Sigrid", - "last-name": "Farrell", - "email": "soledad_abshire@miller.net", - "date": "2003-03-24 17:55:50 -0800", - "content": "Debitis ea soluta eos ut omnis. Ut et laboriosam. Quaerat sit velit impedit.", - "subject": "Eum et nesciunt quidem quo repudiandae rerum doloremque beatae" - }, - - { - "id": "128", - "first-name": "Viola", - "last-name": "Dooley", - "email": "myrtice_grant@zemlakbashirian.com", - "date": "2006-06-01 21:17:02 -0700", - "content": "Sit doloremque est aut voluptatem.", - "subject": "Aut accusamus consectetur nihil iusto" - }, - - { - "id": "129", - "first-name": "Davion", - "last-name": "Conn", - "email": "travis@bins.biz", - "date": "1993-11-26 09:03:37 -0800", - "content": - "Voluptatibus ipsum mollitia fugit aspernatur enim sint. Laudantium exercitationem sed voluptas consequatur quis.", - "subject": "Illum aspernatur tempora amet itaque ipsam distinctio aliquid" - }, - - { - "id": "130", - "first-name": "Hobart", - "last-name": "Oberbrunner", - "email": "eric@wisozk.net", - "date": "2000-02-11 07:40:02 -0800", - "content": "Quis aut sint officia sunt.", - "subject": "Ut pariatur explicabo consequatur libero distinctio nulla consequatur placeat" - }, - - { - "id": "131", - "first-name": "Raleigh", - "last-name": "Hegmann", - "email": "jasen.koepp@hickle.name", - "date": "1993-03-01 22:48:23 -0800", - "content": - "Delectus aut quod maxime incidunt et consequatur. Nihil eos et eveniet quo iure. Alias facilis earum dicta nulla quo sed.", - "subject": "Aliquam eos aliquid dolor" - }, - - { - "id": "132", - "first-name": "Hector", - "last-name": "Denesik", - "email": "bernice@leuschke.biz", - "date": "2013-08-03 14:45:55 -0700", - "content": "Et ut dicta. Qui sunt vel et voluptas hic suscipit.", - "subject": "Ipsum quo est consequatur" - }, - - { - "id": "133", - "first-name": "Nikko", - "last-name": "Rolfson", - "email": "crystel@upton.net", - "date": "1977-02-19 16:22:15 -0800", - "content": "Velit quo repellendus consequatur.", - "subject": "Exercitationem omnis aut id deserunt nihil et inventore" - }, - - { - "id": "134", - "first-name": "Jovany", - "last-name": "Nienow", - "email": "neil.muller@lakin.info", - "date": "2004-09-28 21:55:43 -0700", - "content": - "Voluptatibus numquam blanditiis quibusdam. Illum suscipit dolorum. Sunt amet est sint.", - "subject": "Esse nihil est voluptas rerum ea" - }, - - { - "id": "135", - "first-name": "Ellis", - "last-name": "Kohler", - "email": "cordie_bartoletti@barrows.net", - "date": "1989-09-19 13:57:30 -0700", - "content": - "Eum corporis nobis laborum fugiat amet alias. Voluptatum quasi ducimus fuga corrupti. Mollitia modi laborum.", - "subject": "Ipsum modi nulla et" - }, - - { - "id": "136", - "first-name": "Marley", - "last-name": "Runolfsson", - "email": "kian_vonrueden@collier.info", - "date": "2003-01-17 06:33:04 -0800", - "content": "Et rerum explicabo iusto ipsa ipsum. Quia ipsa ab sed perspiciatis.", - "subject": "Voluptas esse iure quia hic dolor eligendi velit maiores" - }, - - { - "id": "137", - "first-name": "Grant", - "last-name": "Jenkins", - "email": "hayden.altenwerth@corkeryankunding.net", - "date": "1970-03-24 13:04:46 -0800", - "content": "Tenetur odit ratione voluptatum dolore qui.", - "subject": "Tempore est molestiae id" - }, - - { - "id": "138", - "first-name": "Deangelo", - "last-name": "Koss", - "email": "reba.skiles@bruen.com", - "date": "1999-10-16 20:28:42 -0700", - "content": "Sit vero sint ut beatae iure. Minima harum tempora sit rerum aut.", - "subject": "Aspernatur cumque non consequatur blanditiis enim quas quam" - }, - - { - "id": "139", - "first-name": "Mariana", - "last-name": "Jakubowski", - "email": "brett@swift.biz", - "date": "1970-07-04 08:54:29 -0700", - "content": "Beatae expedita praesentium ea corrupti. Aut sint ad et sunt.", - "subject": "Dolore distinctio consequatur aut laudantium officiis aliquid soluta" - }, - - { - "id": "140", - "first-name": "Leonard", - "last-name": "Kovacek", - "email": "jermain@dachbruen.biz", - "date": "1981-10-15 00:39:10 -0700", - "content": - "Deserunt cupiditate modi. Eius consequatur aut dolor nostrum porro dignissimos. Labore consequatur quod est et distinctio possimus ducimus.", - "subject": "Et rerum id voluptates et iure eligendi rerum" - }, - - { - "id": "141", - "first-name": "Etha", - "last-name": "Ondricka", - "email": "noemy@okuneva.org", - "date": "1994-04-29 12:19:51 -0700", - "content": - "Velit fuga quasi pariatur consectetur est nihil. Dolore nisi dolores quia qui voluptatem inventore provident.", - "subject": "Enim est commodi nisi autem asperiores molestiae minima" - }, - - { - "id": "142", - "first-name": "Nannie", - "last-name": "Fadel", - "email": "frida.streich@prosacco.org", - "date": "2012-12-15 16:56:24 -0800", - "content": "Rerum id quo. Recusandae aut optio voluptate perspiciatis tempore sed nemo.", - "subject": "Pariatur soluta praesentium enim quo quam alias consequuntur in" - }, - - { - "id": "143", - "first-name": "Shyanne", - "last-name": "Kunze", - "email": "annabel@littel.net", - "date": "1992-12-09 23:41:23 -0800", - "content": "Dolores iure iste unde. Illo esse autem harum perspiciatis.", - "subject": "Atque illum et qui" - }, - - { - "id": "144", - "first-name": "Eloy", - "last-name": "Barton", - "email": "leonie_gulgowski@skiles.com", - "date": "2013-01-12 20:05:57 -0800", - "content": "Cumque id sapiente explicabo. Voluptas pariatur quibusdam dolores et.", - "subject": "Ut dolore velit qui omnis" - }, - - { - "id": "145", - "first-name": "Rosalinda", - "last-name": "Pfeffer", - "email": "anabelle@langworth.com", - "date": "2001-05-17 05:43:52 -0700", - "content": "Et voluptatem quasi voluptatum.", - "subject": "Voluptatum quia incidunt ut repudiandae blanditiis" - }, - - { - "id": "146", - "first-name": "William", - "last-name": "Bogisich", - "email": "bertha@gibsonrohan.info", - "date": "2009-11-01 04:28:13 -0800", - "content": - "Quaerat dolorem odio et dolor saepe quia odit. Corporis molestiae ab ipsa occaecati autem fuga dicta. Voluptate ratione sunt.", - "subject": "Ipsam quidem mollitia blanditiis magnam ut et" - }, - - { - "id": "147", - "first-name": "Laurianne", - "last-name": "Bergstrom", - "email": "brisa_howe@dare.net", - "date": "2003-03-23 21:58:11 -0800", - "content": "Et porro recusandae aut. Tenetur voluptas aperiam ut vitae.", - "subject": "Molestias autem qui nisi mollitia nulla dolorum repudiandae hic" - }, - - { - "id": "148", - "first-name": "Carroll", - "last-name": "Hickle", - "email": "noemi.grady@grimesritchie.com", - "date": "1996-07-15 02:55:52 -0700", - "content": "Quia voluptas assumenda. Numquam inventore facilis dicta qui ipsa reiciendis.", - "subject": "Perferendis rerum vel incidunt molestias recusandae" - }, - - { - "id": "149", - "first-name": "Jasen", - "last-name": "Romaguera", - "email": "jayce@berge.name", - "date": "1984-04-12 11:56:39 -0800", - "content": "Consectetur molestias perspiciatis ut omnis aliquid.", - "subject": "Hic optio accusamus qui adipisci repellendus ipsa in" - }, - - { - "id": "150", - "first-name": "Heaven", - "last-name": "Fay", - "email": "enola@sanfordsteuber.net", - "date": "2000-11-23 00:18:07 -0800", - "content": - "Quia itaque temporibus. Provident ducimus quidem consectetur qui voluptatum. Sunt cum quis dolorum hic.", - "subject": "Ad excepturi illum doloremque ducimus corporis ut qui omnis" - }, - - { - "id": "151", - "first-name": "Wilburn", - "last-name": "Cartwright", - "email": "jaida_erdman@nitzsche.com", - "date": "2011-09-19 01:58:53 -0700", - "content": "Autem iure magni ut odio amet et.", - "subject": "Fuga quis quidem sint laborum et delectus iste" - }, - - { - "id": "152", - "first-name": "Concepcion", - "last-name": "McLaughlin", - "email": "bernardo_langworth@jakubowski.org", - "date": "1992-08-20 13:35:09 -0700", - "content": "Rerum laboriosam omnis nobis eaque odit sequi dicta.", - "subject": "Sint accusantium ab quis sed ipsa" - }, - - { - "id": "153", - "first-name": "Vita", - "last-name": "Fisher", - "email": "chanelle_gulgowski@roob.info", - "date": "2005-09-21 12:09:45 -0700", - "content": - "Sunt quibusdam adipisci accusantium laborum distinctio voluptate autem. Quis pariatur culpa ut et. Fuga similique dignissimos culpa dolorum neque reiciendis.", - "subject": "Nulla enim et fugiat eveniet ducimus delectus" - }, - - { - "id": "154", - "first-name": "Elliott", - "last-name": "Champlin", - "email": "kamille@kulascain.biz", - "date": "2003-05-20 15:42:54 -0700", - "content": - "Eos quisquam et voluptates rerum vel. Consectetur veniam voluptatem minus totam numquam in.", - "subject": "Deleniti ipsum et odio" - }, - - { - "id": "155", - "first-name": "Heidi", - "last-name": "Macejkovic", - "email": "stefanie@barrowshagenes.info", - "date": "1983-06-02 17:59:14 -0700", - "content": "Ut officiis animi exercitationem delectus suscipit qui voluptatibus.", - "subject": "Eveniet ipsam asperiores qui aut consectetur vel provident" - }, - - { - "id": "156", - "first-name": "Janae", - "last-name": "Pollich", - "email": "brianne.sauer@marquardtsteuber.com", - "date": "2000-05-14 07:13:30 -0700", - "content": "Facilis sit ut odit.", - "subject": "Sapiente explicabo sequi molestias illo saepe" - }, - - { - "id": "157", - "first-name": "Kaylin", - "last-name": "Lindgren", - "email": "urban.franecki@wilkinsonwilderman.org", - "date": "2014-09-09 00:48:38 -0700", - "content": "Eaque ad repellendus est nihil iste vero.", - "subject": "Deserunt qui dolor rerum ut beatae aut" - }, - - { - "id": "158", - "first-name": "Garland", - "last-name": "Nienow", - "email": "ellen.schultz@kihn.org", - "date": "2013-10-27 00:18:14 -0700", - "content": "Quam voluptatem nam est.", - "subject": "Et occaecati quisquam impedit dolore quod" - }, - - { - "id": "159", - "first-name": "Lilly", - "last-name": "Hills", - "email": "macey@labadie.biz", - "date": "1981-02-23 03:46:55 -0800", - "content": - "Quia perferendis est consequuntur voluptates cumque commodi. Laboriosam expedita sit excepturi.", - "subject": "Eos doloribus repellendus provident" - }, - - { - "id": "160", - "first-name": "Lilla", - "last-name": "Abshire", - "email": "roselyn@rippin.org", - "date": "1998-05-16 00:55:49 -0700", - "content": "Ratione deserunt ut ut beatae praesentium qui. Nulla ut ipsam tempore.", - "subject": "Autem nostrum tempora iure laborum" - }, - - { - "id": "161", - "first-name": "Alessandro", - "last-name": "Hayes", - "email": "gia_bradtke@schimmelwalsh.biz", - "date": "2001-11-28 23:52:57 -0800", - "content": - "Quasi perspiciatis tenetur dolorum. Quae cupiditate fuga molestiae et tempore soluta.", - "subject": "Non ipsam quis soluta" - }, - - { - "id": "162", - "first-name": "Sharon", - "last-name": "Goodwin", - "email": "ulices.schimmel@oreillyabshire.name", - "date": "2010-03-12 00:46:00 -0800", - "content": "Neque omnis in. Qui ad sint. Velit voluptatibus repellat esse at.", - "subject": "Magni exercitationem quas consectetur qui quia id" - }, - - { - "id": "163", - "first-name": "Claude", - "last-name": "Gleason", - "email": "ken.gulgowski@labadie.net", - "date": "2003-05-30 14:58:54 -0700", - "content": "Et sit non harum quo sunt. Odio beatae voluptatem ad. Nemo in hic nulla.", - "subject": "Nobis consequatur non sunt sequi ex nihil" - }, - - { - "id": "164", - "first-name": "Maximilian", - "last-name": "Mann", - "email": "samir@stehr.biz", - "date": "1993-08-21 15:54:18 -0700", - "content": - "Minus quae voluptatem sequi. Distinctio voluptatem amet iusto velit et praesentium. Distinctio ipsum voluptas voluptas.", - "subject": "Facere voluptatem laudantium laboriosam omnis" - }, - - { - "id": "165", - "first-name": "Jennyfer", - "last-name": "Satterfield", - "email": "janiya_senger@olson.info", - "date": "2006-09-21 00:36:50 -0700", - "content": "Doloribus praesentium excepturi omnis.", - "subject": "Non fuga unde incidunt ad exercitationem maxime laboriosam qui" - }, - - { - "id": "166", - "first-name": "Robin", - "last-name": "Murray", - "email": "alycia@cruickshank.name", - "date": "1985-10-04 03:44:39 -0700", - "content": "Repudiandae dolorem ut. Possimus earum dignissimos temporibus amet vel eum.", - "subject": "Vel culpa debitis quam" - }, - - { - "id": "167", - "first-name": "Albina", - "last-name": "Reinger", - "email": "guie.gleason@gorczany.info", - "date": "1985-10-02 08:07:53 -0700", - "content": "Natus rerum repellat voluptas. Distinctio dolor est in dolores.", - "subject": "Modi perspiciatis iure odio hic et dignissimos rem qui" - }, - - { - "id": "168", - "first-name": "Eloisa", - "last-name": "Wolf", - "email": "leopold@jenkins.info", - "date": "2007-02-19 09:25:29 -0800", - "content": "Corporis ut dolorem ullam quidem ratione. Nam eveniet dicta autem eum.", - "subject": "Facilis voluptas vel repellat et aut amet est" - }, - - { - "id": "169", - "first-name": "Caden", - "last-name": "Cartwright", - "email": "mohammad_lockman@okoncrooks.net", - "date": "1974-11-14 03:12:44 -0800", - "content": - "Sunt nobis voluptate quasi sapiente magni a officia. Laudantium perspiciatis quod quis quidem voluptatum pariatur. Sit ut optio tempora.", - "subject": "Nihil maxime officia et repellat" - }, - - { - "id": "170", - "first-name": "Raul", - "last-name": "Sipes", - "email": "danial.miller@kulas.info", - "date": "1996-12-11 14:14:16 -0800", - "content": - "Ea rerum quo id omnis. Hic est voluptate voluptatem ut. Rerum eos ipsa laboriosam et ut expedita.", - "subject": "Aliquam reiciendis quam expedita sed ad neque voluptas" - }, - - { - "id": "171", - "first-name": "Allie", - "last-name": "Runolfsson", - "email": "skye@marvin.com", - "date": "2011-07-31 19:37:22 -0700", - "content": "Perspiciatis mollitia fugit sunt et.", - "subject": "Nihil expedita neque reprehenderit" - }, - - { - "id": "172", - "first-name": "Belle", - "last-name": "Nader", - "email": "eugenia@mante.info", - "date": "1995-09-06 05:30:08 -0700", - "content": "Expedita delectus quis ipsa dolore voluptatum.", - "subject": "Recusandae quasi ullam consequatur assumenda aliquid unde" - }, - - { - "id": "173", - "first-name": "Clemens", - "last-name": "Tromp", - "email": "geovanny@kilback.org", - "date": "1980-11-28 08:48:35 -0800", - "content": "Sint eos ea quidem tempora.", - "subject": "Velit aperiam consequatur ut et aliquam at" - }, - - { - "id": "174", - "first-name": "Bettie", - "last-name": "Mueller", - "email": "edgardo@little.net", - "date": "1983-06-26 14:10:56 -0700", - "content": "Dolore tempore accusamus.", - "subject": "Autem tempore et ut" - }, - - { - "id": "175", - "first-name": "Guy", - "last-name": "King", - "email": "macie@schmeler.info", - "date": "1999-03-28 22:34:59 -0800", - "content": "Recusandae laborum ut et eaque eum.", - "subject": "Dolor ullam totam consequatur eos fuga" - }, - - { - "id": "176", - "first-name": "Cydney", - "last-name": "Cronin", - "email": "camren@thompson.org", - "date": "1993-10-23 02:50:41 -0700", - "content": "Exercitationem modi eos sint vero. Iste possimus quis. Non est voluptas.", - "subject": "Tempora ipsum soluta ut corrupti omnis in" - }, - - { - "id": "177", - "first-name": "Ludwig", - "last-name": "Hoeger", - "email": "javon@torpolson.info", - "date": "2007-12-20 19:09:13 -0800", - "content": "Architecto ut optio tempore pariatur itaque saepe.", - "subject": "Earum unde quis officiis doloremque et animi qui" - }, - - { - "id": "178", - "first-name": "Travon", - "last-name": "Jacobi", - "email": "jameson_streich@hansen.org", - "date": "2013-02-03 09:53:51 -0800", - "content": "Autem dolorem totam atque id sit. Consectetur dolor maiores.", - "subject": "Quia autem deleniti ullam neque odio" - }, - - { - "id": "179", - "first-name": "Brennan", - "last-name": "Jaskolski", - "email": "harold_thompson@schaefer.info", - "date": "2004-01-13 10:53:47 -0800", - "content": "Libero et dolorem nihil. Omnis consequuntur possimus ut.", - "subject": "Eum labore omnis ipsa doloremque consequuntur soluta esse fuga" - }, - - { - "id": "180", - "first-name": "Clifton", - "last-name": "Boyer", - "email": "justine@skiles.biz", - "date": "2000-01-28 22:33:14 -0800", - "content": - "Nobis recusandae fugiat quibusdam doloribus. Aut praesentium corrupti tenetur ullam quia.", - "subject": "Ea dolorem voluptas aut cumque inventore delectus non molestiae" - }, - - { - "id": "181", - "first-name": "Walker", - "last-name": "Rogahn", - "email": "stanton@rempel.net", - "date": "2012-04-02 20:05:38 -0700", - "content": "Consectetur et soluta. Minus voluptatem quod aut vitae praesentium.", - "subject": "Tenetur architecto reprehenderit corporis fuga et rerum vel" - }, - - { - "id": "182", - "first-name": "Jennings", - "last-name": "Hills", - "email": "kenton@murrayharvey.biz", - "date": "2007-09-24 22:09:51 -0700", - "content": - "Velit porro quidem nostrum. Perspiciatis consequatur consectetur reiciendis sunt cupiditate quae. Vitae et ut autem iure.", - "subject": "Cupiditate quis maiores omnis" - }, - - { - "id": "183", - "first-name": "Julianne", - "last-name": "O'Kon", - "email": "helene@abshire.com", - "date": "1987-02-09 22:56:12 -0800", - "content": - "Voluptas voluptatem veniam porro dolorem maxime. Itaque eveniet laborum optio sed aspernatur omnis. Veritatis enim itaque sint illo ipsam eius.", - "subject": "Corporis et laboriosam aspernatur aut" - }, - - { - "id": "184", - "first-name": "Raymond", - "last-name": "Orn", - "email": "cloyd@rempel.biz", - "date": "2014-02-04 04:33:02 -0800", - "content": - "Eum voluptatibus accusantium rem. Deleniti harum eum. Illo est facere illum saepe voluptas.", - "subject": "Eveniet est architecto id ut rerum nam quidem" - }, - - { - "id": "185", - "first-name": "Johan", - "last-name": "Legros", - "email": "rosie_ernser@wolf.com", - "date": "1989-03-02 11:17:10 -0800", - "content": "Architecto explicabo praesentium amet eaque quibusdam.", - "subject": "Consectetur fugiat iusto omnis aspernatur ut" - }, - - { - "id": "186", - "first-name": "Daryl", - "last-name": "Labadie", - "email": "ashly_thompson@casper.net", - "date": "2003-01-28 00:02:56 -0800", - "content": "Et est doloribus. Fuga hic sed voluptatibus ullam officia aspernatur.", - "subject": "A sunt eum quas accusamus" - }, - - { - "id": "187", - "first-name": "Gavin", - "last-name": "Moore", - "email": "dahlia@leffleroberbrunner.biz", - "date": "1970-10-15 07:36:57 -0700", - "content": "Sapiente ipsum magni dolore est dolor.", - "subject": "Est maxime consequatur esse qui dicta aut quaerat" - }, - - { - "id": "188", - "first-name": "Coby", - "last-name": "Swaniawski", - "email": "millie.labadie@wuckert.name", - "date": "2012-09-14 00:25:46 -0700", - "content": - "Magni qui molestias debitis reprehenderit vel quo est. Blanditiis debitis autem neque non illo.", - "subject": "Rerum accusantium magni dolorem in reprehenderit et voluptas" - }, - - { - "id": "189", - "first-name": "Luis", - "last-name": "Stracke", - "email": "merle@mrazswaniawski.biz", - "date": "2007-11-11 05:28:46 -0800", - "content": "Neque magnam sint porro reprehenderit quo. In et reiciendis non velit et eum quos.", - "subject": "Sit voluptates nulla perspiciatis debitis dolor eaque a" - }, - - { - "id": "190", - "first-name": "Leone", - "last-name": "Huel", - "email": "emil@botsford.biz", - "date": "2004-03-16 23:46:45 -0800", - "content": "Vitae amet et quae ullam.", - "subject": "Rerum enim voluptate qui" - }, - - { - "id": "191", - "first-name": "Aylin", - "last-name": "Kling", - "email": "anderson_jast@kozeyparisian.com", - "date": "1979-06-17 04:05:50 -0700", - "content": "Quam eligendi numquam sint. Non ipsa et qui error dolor velit.", - "subject": "Culpa iste rerum facere praesentium deleniti sequi" - }, - - { - "id": "192", - "first-name": "Junior", - "last-name": "Bartoletti", - "email": "te@kuvalis.net", - "date": "1994-12-09 11:00:34 -0800", - "content": "Velit eos et nemo dolore eum necessitatibus. Ea inventore adipisci.", - "subject": "Velit dolorem cumque ipsa" - }, - - { - "id": "193", - "first-name": "Nathanael", - "last-name": "Hermiston", - "email": "macy.cole@wittingcasper.info", - "date": "2002-01-06 17:45:52 -0800", - "content": - "Corporis occaecati quidem quia repudiandae repellendus beatae similique. Inventore quo ullam.", - "subject": "Quidem expedita quia inventore dolores ratione totam et dignissimos" - }, - - { - "id": "194", - "first-name": "Hal", - "last-name": "Bruen", - "email": "nathen.ziemann@gerlachko.name", - "date": "1996-03-01 01:35:30 -0800", - "content": - "Qui eius aspernatur et aut et vel in. Adipisci aliquid consequatur dolores et ut. Est aut temporibus.", - "subject": "Voluptas placeat eveniet non quas assumenda quam minus" - }, - - { - "id": "195", - "first-name": "Freddie", - "last-name": "Thompson", - "email": "elia@aufderharbrown.org", - "date": "2005-03-20 05:07:30 -0800", - "content": "Dolor nemo sed molestiae quae quia.", - "subject": "Quam sint et voluptatem et fuga sint ut saepe" - }, - - { - "id": "196", - "first-name": "Aida", - "last-name": "Gorczany", - "email": "olga.labadie@abshire.name", - "date": "1989-07-26 04:26:19 -0700", - "content": - "Sit qui voluptatem facere. Similique alias quia sit ipsum. Ut corrupti tempore molestiae.", - "subject": "Qui veniam blanditiis nesciunt beatae tempore aut fugiat maiores" - }, - - { - "id": "197", - "first-name": "Isabelle", - "last-name": "Collier", - "email": "christiana_gottlieb@borer.biz", - "date": "1978-05-15 13:13:34 -0700", - "content": "Aliquam earum velit ut.", - "subject": "Neque et voluptate ratione totam voluptas est nulla ipsum" - }, - - { - "id": "198", - "first-name": "Ida", - "last-name": "Reichert", - "email": "mervin@keeling.com", - "date": "1991-02-06 05:02:15 -0800", - "content": - "Velit in at et dicta tenetur. Doloremque cupiditate est. Excepturi non minus aspernatur dolores qui quaerat architecto.", - "subject": "Ut voluptas qui ad minus" - }, - - { - "id": "199", - "first-name": "Angelina", - "last-name": "Mueller", - "email": "leonel@purdyschroeder.org", - "date": "2008-06-17 01:01:57 -0700", - "content": - "Recusandae eius non necessitatibus. Quisquam qui quo. Voluptas dolorem dolorem sit repellat laudantium ducimus qui.", - "subject": "Dolorem atque impedit qui soluta" - }, - - { - "id": "200", - "first-name": "Marcelle", - "last-name": "Connelly", - "email": "heath@leuschke.net", - "date": "1983-10-02 18:32:18 -0700", - "content": - "Debitis quasi voluptates et voluptatibus rerum. Et explicabo quia qui qui voluptate dolor.", - "subject": "Rem molestiae nobis consequatur eligendi ut" - }, - { - "id": "201", - "first-name": "Bob", - "last-name": "Brown", - "email": "bob@brown.net", - "date": "1983-10-02 18:32:18 -0700", - "content": - "Debitis quasi voluptates et voluptatibus rerum. Et explicabo quia qui qui voluptate dolor.", - "subject": "Urgent question about whipped cream", - "draft": true - }, - { - "id": "202", - "first-name": "Mary", - "last-name": "Jones", - "email": "mary@jones.net", - "date": "1983-10-02 18:32:18 -0700", - "content": - "Debitis quasi voluptates et voluptatibus rerum. Et explicabo quia qui qui voluptate dolor.", - "subject": "Fwd: wedding photos", - "draft": true - } -] diff --git a/modules/playground/src/alt_routing/app/drafts.html b/modules/playground/src/alt_routing/app/drafts.html deleted file mode 100644 index 62d968bc1c..0000000000 --- a/modules/playground/src/alt_routing/app/drafts.html +++ /dev/null @@ -1,11 +0,0 @@ -
-

Drafts

- -
    -
  1. - - {{ item.subject }} -
  2. -
-
diff --git a/modules/playground/src/alt_routing/app/inbox-app.html b/modules/playground/src/alt_routing/app/inbox-app.html deleted file mode 100644 index 34880f6b11..0000000000 --- a/modules/playground/src/alt_routing/app/inbox-app.html +++ /dev/null @@ -1,5 +0,0 @@ - - Inbox - Drafts - - diff --git a/modules/playground/src/alt_routing/app/inbox-app.ts b/modules/playground/src/alt_routing/app/inbox-app.ts deleted file mode 100644 index b7bc191c64..0000000000 --- a/modules/playground/src/alt_routing/app/inbox-app.ts +++ /dev/null @@ -1,167 +0,0 @@ -import {Component, Injectable} from '@angular/core'; -import { - Routes, - Route, - Router, - ROUTER_DIRECTIVES, - ROUTER_PROVIDERS, - OnActivate, - RouteSegment, - RouteTree, - UrlTree -} from '@angular/router'; -import * as db from './data'; -import {Location} from '@angular/common'; -import {PromiseWrapper} from '@angular/core/src/facade/async'; -import {isPresent, DateWrapper} from '@angular/core/src/facade/lang'; -import {PromiseCompleter} from '@angular/core/src/facade/promise'; - -class InboxRecord { - id: string = ''; - subject: string = ''; - content: string = ''; - email: string = ''; - firstName: string = ''; - lastName: string = ''; - date: string; - draft: boolean = false; - - constructor(data: { - id: string, - subject: string, - content: string, - email: string, - firstName: string, - lastName: string, - date: string, draft?: boolean - } = null) { - if (isPresent(data)) { - this.setData(data); - } - } - - setData(record: { - id: string, - subject: string, - content: string, - email: string, - firstName: string, - lastName: string, - date: string, draft?: boolean - }) { - this.id = record['id']; - this.subject = record['subject']; - this.content = record['content']; - this.email = record['email']; - this.firstName = (record as any /** TODO #9100 */)['first-name']; - this.lastName = (record as any /** TODO #9100 */)['last-name']; - this.date = record['date']; - this.draft = record['draft'] == true; - } -} - -@Injectable() -class DbService { - getData(): Promise { - var p = new PromiseCompleter(); - p.resolve(db.data); - return p.promise; - } - - drafts(): Promise { - return this.getData().then( - (data: any[]): any[] => - data.filter(record => isPresent(record['draft']) && record['draft'] == true)); - } - - emails(): Promise { - return this.getData().then((data: any[]): any[] => - data.filter(record => !isPresent(record['draft']))); - } - - email(id: any /** TODO #9100 */): Promise { - return PromiseWrapper.then(this.getData(), (data: any[]) => { - for (var i = 0; i < data.length; i++) { - var entry = data[i]; - if (entry['id'] == id) { - return entry; - } - } - return null; - }); - } -} - -@Component( - {selector: 'inbox-detail', directives: ROUTER_DIRECTIVES, templateUrl: 'app/inbox-detail.html'}) -class InboxDetailCmp implements OnActivate { - record: InboxRecord = new InboxRecord(); - ready: boolean = false; - - constructor(private _db: DbService) {} - - routerOnActivate(curr: RouteSegment, prev?: RouteSegment, currTree?: RouteTree, - prevTree?: RouteTree): void { - let id = curr.getParam("id"); - this._db.email(id).then(data => this.record.setData(data)); - } -} - -@Component({selector: 'inbox', templateUrl: 'app/inbox.html', directives: ROUTER_DIRECTIVES}) -class InboxCmp implements OnActivate { - items: InboxRecord[] = []; - ready: boolean = false; - - constructor(private _db: DbService) {} - - routerOnActivate(curr: RouteSegment, prev?: RouteSegment, currTree?: RouteTree, - prevTree?: RouteTree): void { - var sortType = curr.getParam('sort'); - var sortEmailsByDate = isPresent(sortType) && sortType == "date"; - - PromiseWrapper.then(this._db.emails(), (emails: any[]) => { - this.ready = true; - this.items = emails.map(data => new InboxRecord(data)); - - if (sortEmailsByDate) { - this.items.sort((a: InboxRecord, b: InboxRecord) => - DateWrapper.toMillis(DateWrapper.fromISOString(a.date)) < - DateWrapper.toMillis(DateWrapper.fromISOString(b.date)) ? - -1 : - 1); - } - }); - } -} - - -@Component({selector: 'drafts', templateUrl: 'app/drafts.html', directives: ROUTER_DIRECTIVES}) -class DraftsCmp { - items: InboxRecord[] = []; - ready: boolean = false; - - constructor(db: DbService) { - PromiseWrapper.then(db.drafts(), (drafts: any[]) => { - this.ready = true; - this.items = drafts.map(data => new InboxRecord(data)); - }); - } -} - -@Component({ - selector: 'inbox-app', - providers: [DbService, ROUTER_PROVIDERS], - templateUrl: 'app/inbox-app.html', - directives: ROUTER_DIRECTIVES, -}) -@Routes([ - new Route({path: '/', component: InboxCmp}), - new Route({path: '/inbox', component: InboxCmp}), - new Route({path: '/drafts', component: DraftsCmp}), - new Route({path: '/detail/:id', component: InboxDetailCmp}) -]) -export class InboxApp { - constructor(private _location: Location) {} - inboxPageActive() { return this._location.path() == ''; } - draftsPageActive() { return this._location.path() == '/drafts'; } -} diff --git a/modules/playground/src/alt_routing/app/inbox-detail.html b/modules/playground/src/alt_routing/app/inbox-detail.html deleted file mode 100644 index 38efc5e60b..0000000000 --- a/modules/playground/src/alt_routing/app/inbox-detail.html +++ /dev/null @@ -1,24 +0,0 @@ -
-

{{ record.subject }}

- -
    -
  • ID: {{ record.id }}
  • -
  • Name: {{ record.firstName }} {{ record.lastName }}
  • -
  • Email: {{ record.email }}
  • -
  • Date: {{ record.date }}
  • -
- -

- {{ record.content }} -

- - - Back - - -
- - - View Latest Messages - -
diff --git a/modules/playground/src/alt_routing/app/inbox.html b/modules/playground/src/alt_routing/app/inbox.html deleted file mode 100644 index c33bdbdad6..0000000000 --- a/modules/playground/src/alt_routing/app/inbox.html +++ /dev/null @@ -1,10 +0,0 @@ -
-

Inbox

- -
    -
  1. - {{ item.subject }} -
  2. -
-
\ No newline at end of file diff --git a/modules/playground/src/alt_routing/css/app.css b/modules/playground/src/alt_routing/css/app.css deleted file mode 100644 index 42945f32a4..0000000000 --- a/modules/playground/src/alt_routing/css/app.css +++ /dev/null @@ -1,57 +0,0 @@ -body { - background:#eee; - color:black; -} - -.inbox-list, -.inbox-list li { - list-style:none; - padding:0; - margin:0; -} - -.inbox-list a { - padding:5px; - display:block; -} - -inbox, drafts, inbox-side-menu { - display:block; -} - -inbox-side-menu .link { - display:block; - text-align:center; - padding:1em; -} - -inbox-side-menu .link.active { - background:white; -} - -inbox-side-menu .link:hover { - background:#eee; -} - -inbox-side-menu { - position:fixed; - left:0; - top:0; - bottom:0; - width:200px; - background:#ddd; -} - -inbox-side-menu a { - display: block; -} - -inbox, drafts, inbox-detail { - padding:1em; - margin-left:200px; -} - -inbox-detail { - display:block; - margin-left:200px; -} diff --git a/modules/playground/src/alt_routing/index.html b/modules/playground/src/alt_routing/index.html deleted file mode 100644 index f9d15c8609..0000000000 --- a/modules/playground/src/alt_routing/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - Routing Example - - - - - - Loading... - - - - - diff --git a/modules/playground/src/alt_routing/index.ts b/modules/playground/src/alt_routing/index.ts deleted file mode 100644 index e829e12149..0000000000 --- a/modules/playground/src/alt_routing/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {InboxApp} from './app/inbox-app'; -import {bootstrap} from '@angular/platform-browser-dynamic'; -import {HashLocationStrategy, LocationStrategy} from '@angular/common'; -import {ROUTER_PROVIDERS} from '@angular/router-deprecated'; - -export function main() { - bootstrap(InboxApp, - [ROUTER_PROVIDERS, {provide: LocationStrategy, useClass: HashLocationStrategy}]); -} diff --git a/modules/playground/src/bootstrap.ts b/modules/playground/src/bootstrap.ts index 0ae0731808..b7f2f7babd 100644 --- a/modules/playground/src/bootstrap.ts +++ b/modules/playground/src/bootstrap.ts @@ -25,7 +25,6 @@ declare var System: any; '@angular/platform-browser-dynamic': '/packages-dist/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', '@angular/http': '/packages-dist/http/bundles/http.umd.js', '@angular/upgrade': '/packages-dist/upgrade/bundles/upgrade.umd.js', - '@angular/router': '/packages-dist/router/bundles/router.umd.js', '@angular/router-deprecated': '/packages-dist/router-deprecated/bundles/router-deprecated.umd.js', '@angular/core/src/facade': '/all/@angular/core/src/facade', 'rxjs': location.pathname.replace(/\w+\.html$/i, '') + 'rxjs' @@ -50,8 +49,7 @@ declare var System: any; '@angular/compiler': {main: 'index.js', defaultExtension: 'js'}, '@angular/common': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser': {main: 'index.js', defaultExtension: 'js'}, - '@angular/platform-browser-dynamic': {main: 'index.js', defaultExtension: 'js'}, - '@angular/router': {main: 'index.js', defaultExtension: 'js'}, + '@angular/platform-browser-dynamic': {main: 'index.js', defaultExtension: 'js'} // 'rxjs': { // defaultExtension: 'js' // } diff --git a/modules/playground/src/web_workers/images/loader.js b/modules/playground/src/web_workers/images/loader.js index 8e7648ffe0..a83602dd2e 100644 --- a/modules/playground/src/web_workers/images/loader.js +++ b/modules/playground/src/web_workers/images/loader.js @@ -16,7 +16,7 @@ System.config({ '@angular/compiler': {main: 'index.js', defaultExtension: 'js'}, '@angular/common': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser': {main: 'index.js', defaultExtension: 'js'}, - '@angular/router': {main: 'index.js', defaultExtension: 'js'}, + '@angular/router-deprecated': {main: 'index.js', defaultExtension: 'js'}, 'rxjs': { defaultExtension: 'js' } diff --git a/modules/playground/src/web_workers/input/loader.js b/modules/playground/src/web_workers/input/loader.js index c1dbcadac2..8fbfba90bd 100644 --- a/modules/playground/src/web_workers/input/loader.js +++ b/modules/playground/src/web_workers/input/loader.js @@ -16,7 +16,7 @@ System.config({ '@angular/common': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser-dynamic': {main: 'index.js', defaultExtension: 'js'}, - '@angular/router': {main: 'index.js', defaultExtension: 'js'}, + '@angular/router-deprecated': {main: 'index.js', defaultExtension: 'js'}, 'rxjs': { defaultExtension: 'js' } diff --git a/modules/playground/src/web_workers/kitchen_sink/loader.js b/modules/playground/src/web_workers/kitchen_sink/loader.js index 53436e7535..6e7d397d45 100644 --- a/modules/playground/src/web_workers/kitchen_sink/loader.js +++ b/modules/playground/src/web_workers/kitchen_sink/loader.js @@ -16,7 +16,7 @@ System.config({ '@angular/common': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser-dynamic': {main: 'index.js', defaultExtension: 'js'}, - '@angular/router': {main: 'index.js', defaultExtension: 'js'}, + '@angular/router-deprecated': {main: 'index.js', defaultExtension: 'js'}, 'rxjs': { defaultExtension: 'js' }, diff --git a/modules/playground/src/web_workers/message_broker/loader.js b/modules/playground/src/web_workers/message_broker/loader.js index 8701b0620e..080ba9755f 100644 --- a/modules/playground/src/web_workers/message_broker/loader.js +++ b/modules/playground/src/web_workers/message_broker/loader.js @@ -16,7 +16,7 @@ System.config({ '@angular/common': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser-dynamic': {main: 'index.js', defaultExtension: 'js'}, - '@angular/router': {main: 'index.js', defaultExtension: 'js'}, + '@angular/router-deprecated': {main: 'index.js', defaultExtension: 'js'}, 'rxjs': { defaultExtension: 'js' }, diff --git a/modules/playground/src/web_workers/router/loader.js b/modules/playground/src/web_workers/router/loader.js index ac7ab9469f..7cb0f7ecff 100644 --- a/modules/playground/src/web_workers/router/loader.js +++ b/modules/playground/src/web_workers/router/loader.js @@ -16,7 +16,6 @@ System.config({ '@angular/common': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser-dynamic': {main: 'index.js', defaultExtension: 'js'}, - '@angular/router': {main: 'index.js', defaultExtension: 'js'}, '@angular/router-deprecated': {main: 'index.js', defaultExtension: 'js'}, 'rxjs': { defaultExtension: 'js' diff --git a/modules/playground/src/web_workers/todo/loader.js b/modules/playground/src/web_workers/todo/loader.js index e5ea058175..f5f1488c27 100644 --- a/modules/playground/src/web_workers/todo/loader.js +++ b/modules/playground/src/web_workers/todo/loader.js @@ -16,7 +16,7 @@ System.config({ '@angular/common': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser': {main: 'index.js', defaultExtension: 'js'}, '@angular/platform-browser-dynamic': {main: 'index.js', defaultExtension: 'js'}, - '@angular/router': {main: 'index.js', defaultExtension: 'js'}, + '@angular/router-deprecated': {main: 'index.js', defaultExtension: 'js'}, 'rxjs': { defaultExtension: 'js' } diff --git a/publish-packages.sh b/publish-packages.sh index 9dbe891046..d39bcdc7f2 100755 --- a/publish-packages.sh +++ b/publish-packages.sh @@ -26,7 +26,6 @@ for PACKAGE in \ http \ platform-browser \ platform-server \ - router \ router-deprecated \ upgrade do diff --git a/scripts/ci/build_dart_ddc.sh b/scripts/ci/build_dart_ddc.sh index 700870874c..fc2194ea2f 100755 --- a/scripts/ci/build_dart_ddc.sh +++ b/scripts/ci/build_dart_ddc.sh @@ -64,7 +64,6 @@ $DART_SDK/bin/dart $DDC_DIR/bin/dartdevc.dart \ src/person_management/index.dart \ src/relative_assets/index.dart \ src/routing/index.dart \ - src/alt_routing/index.dart \ src/sourcemap/index.dart \ src/svg/index.dart \ src/template_driven_forms/index.dart \ diff --git a/test-main.js b/test-main.js index 644375ef08..a0118f8aff 100644 --- a/test-main.js +++ b/test-main.js @@ -41,10 +41,6 @@ System.config({ main: 'index.js', defaultExtension: 'js' }, - '@angular/router': { - main: 'index.js', - defaultExtension: 'js' - }, '@angular/router-deprecated': { main: 'index.js', defaultExtension: 'js' diff --git a/tools/broccoli/trees/browser_tree.ts b/tools/broccoli/trees/browser_tree.ts index e63e65c382..add4c1d8f1 100644 --- a/tools/broccoli/trees/browser_tree.ts +++ b/tools/broccoli/trees/browser_tree.ts @@ -52,7 +52,6 @@ const kServedPaths = [ 'playground/src/key_events', 'playground/src/relative_assets', 'playground/src/routing', - 'playground/src/alt_routing', 'playground/src/sourcemap', 'playground/src/svg', 'playground/src/todo', diff --git a/tools/typings-test/include-all.ts b/tools/typings-test/include-all.ts index dd205706eb..60adc358b3 100644 --- a/tools/typings-test/include-all.ts +++ b/tools/typings-test/include-all.ts @@ -10,10 +10,8 @@ import * as platformBrowserDynmic from '@angular/platform-browser-dynamic'; import * as platformBrowser from '@angular/platform-browser/testing'; import * as platfomrServerTesting from '@angular/platform-server'; import * as platfomrServer from '@angular/platform-server/testing'; -import * as router from '@angular/router'; import * as routerDeprecatedTesting from '@angular/router-deprecated'; import * as routerDeprecated from '@angular/router-deprecated/testing'; -import * as routerTesting from '@angular/router/testing'; import * as upgrade from '@angular/upgrade'; export default { @@ -29,8 +27,6 @@ export default { platformBrowserDynmic, platfomrServer, platfomrServerTesting, - router, - routerTesting, routerDeprecated, routerDeprecatedTesting, upgrade diff --git a/tools/typings-test/test.sh b/tools/typings-test/test.sh index ef20426d38..6532d52b91 100755 --- a/tools/typings-test/test.sh +++ b/tools/typings-test/test.sh @@ -3,7 +3,7 @@ set -ex -o pipefail # These ones can be `npm link`ed for fast development LINKABLE_PKGS=( - $(pwd)/dist/packages-dist/{common,core,compiler,compiler-cli,http,router,router-deprecated,upgrade,platform-{browser,browser-dynamic,server}} + $(pwd)/dist/packages-dist/{common,core,compiler,compiler-cli,http,router-deprecated,upgrade,platform-{browser,browser-dynamic,server}} ) TMPDIR=${TMPDIR:-/tmp/angular-build/}