diff --git a/react-router/legacy/react-router-0.12-test.ts b/react-router/legacy/react-router-0.12-test.ts
new file mode 100644
index 0000000000..d0d122bd47
--- /dev/null
+++ b/react-router/legacy/react-router-0.12-test.ts
@@ -0,0 +1,346 @@
+///
+"use strict";
+
+import React = require('react');
+import Router = require('react-router');
+
+// Mixin
+class NavigationTest {
+ v: T;
+
+ makePath() {
+ var v1: string = this.v.makePath('to');
+ var v2: string = this.v.makePath('to', {id: 1});
+ var v3: string = this.v.makePath('to', {id: 1}, {type: 'json'});
+ }
+ makeHref() {
+ var v1: string = this.v.makeHref('to');
+ var v2: string = this.v.makeHref('to', {id: 1});
+ var v3: string = this.v.makeHref('to', {id: 1}, {type: 'json'});
+ }
+ transitionTo() {
+ var v1: void = this.v.transitionTo('to');
+ var v2: void = this.v.transitionTo('to', {id: 1});
+ var v3: void = this.v.transitionTo('to', {id: 1}, {type: 'json'});
+ }
+ replaceWith() {
+ var v1: void = this.v.replaceWith('to');
+ var v2: void = this.v.replaceWith('to', {id: 1});
+ var v3: void = this.v.replaceWith('to', {id: 1}, {type: 'json'});
+ }
+ goBack() {
+ var v1: void = this.v.goBack();
+ }
+}
+
+class StateTest {
+ v: T;
+
+ getPath() {
+ var v1: string = this.v.getPath();
+ }
+
+ getRoutes() {
+ var v1: Router.Route[] = this.v.getRoutes();
+ }
+
+ getPathname() {
+ var v1: string = this.v.getPathname();
+ }
+
+ getParams() {
+ var v1: {} = this.v.getParams();
+ }
+
+ getQuery() {
+ var v1: {} = this.v.getQuery();
+ }
+
+ isActive() {
+ var v1: boolean = this.v.isActive('to');
+ var v2: boolean = this.v.isActive('to', {id: 1});
+ var v3: boolean = this.v.isActive('to', {id: 1}, {type: 'json'});
+ }
+}
+
+class RouteHandlerMixinTest {
+ v: T;
+
+ getRouteDepth() {
+ var v1: number = this.v.getRouteDepth();
+ }
+
+ createChildRouteHandler() {
+ var v1: Router.RouteHandler = this.v.createChildRouteHandler({ref: 'hoge'});
+ }
+}
+
+
+// Location
+class LocationTest {
+ v: T;
+
+ push() {
+ var v1: void = this.v.push('path/to/hoge');
+ }
+
+ replace() {
+ var v1: void = this.v.replace('path/to/hoge');
+ }
+
+ pop() {
+ var v1: void = this.v.pop();
+ }
+
+ getCurrentPath() {
+ var v1: void = this.v.getCurrentPath();
+ }
+}
+new LocationTest();
+new LocationTest();
+new LocationTest();
+
+class LocationListenerTest {
+ v: T;
+
+ addChangeListener() {
+ var v1: void = this.v.addChangeListener(() => console.log(1));
+ }
+
+ removeChangeListener() {
+ var v1: void = this.v.removeChangeListener(() => console.log(1));
+ }
+}
+new LocationListenerTest();
+new LocationListenerTest();
+
+
+// Behavior
+class ScrollBehaviorTest {
+ v: T;
+
+ updateScrollPosition() {
+ var v1: void = this.v.updateScrollPosition({x: 33, y: 102}, 'scrollTop');
+ }
+}
+new ScrollBehaviorTest();
+new ScrollBehaviorTest();
+
+
+// Component
+class DefaultRouteTest {
+ v: Router.DefaultRoute;
+
+ props() {
+ var name: string = this.v.props.name;
+ var handler: React.ComponentClass = this.v.props.handler;
+ }
+
+ createElement() {
+ var Handler: React.ComponentClass;
+ React.createElement(Router.DefaultRoute, null);
+ React.createElement(Router.DefaultRoute, {name: 'name', handler: Handler});
+ }
+}
+
+class LinkTest {
+ v: Router.Link;
+
+ constructor() {
+ new NavigationTest();
+ new StateTest();
+ }
+
+ props() {
+ var activeClassName: string = this.v.props.activeClassName;
+ var to: string = this.v.props.to;
+ var params: {} = this.v.props.params;
+ var query: {} = this.v.props.query;
+ var onClick: Function = this.v.props.onClick;
+ }
+
+ getHref() {
+ var v1: string = this.v.getHref();
+ }
+
+ getClassName() {
+ var v1: string = this.v.getClassName();
+ }
+
+ createElement() {
+ React.createElement(Router.Link, null);
+ React.createElement(Router.Link, {to: 'home'});
+ React.createElement(Router.Link, {
+ activeClassName: 'name',
+ to: 'home',
+ params: {},
+ query: {},
+ onClick: () => console.log(1)
+ });
+ }
+}
+
+class NotFoundRouteTest {
+ v: Router.NotFoundRoute;
+
+ props() {
+ var name: string = this.v.props.name;
+ var handler: React.ComponentClass = this.v.props.handler;
+ }
+
+ createElement() {
+ var Handler: React.ComponentClass;
+ React.createElement(Router.NotFoundRoute, null);
+ React.createElement(Router.NotFoundRoute, {handler: Handler});
+ React.createElement(Router.NotFoundRoute, {handler: Handler, name: "home"});
+ }
+}
+
+class RedirectTest {
+ v: Router.Redirect;
+
+ props() {
+ var path: string = this.v.props.path;
+ var from: string = this.v.props.from;
+ var to: string = this.v.props.to;
+ }
+
+ createElement() {
+ React.createElement(Router.Redirect, null);
+ React.createElement(Router.Redirect, {});
+ React.createElement(Router.Redirect, {path: 'a', from: 'a', to: 'b'});
+ }
+}
+
+class RouteTest {
+ v: Router.Route;
+
+ props() {
+ var name: string = this.v.props.name;
+ var path: string = this.v.props.path;
+ var handler: React.ComponentClass = this.v.props.handler;
+ var ignoreScrollBehavior: boolean = this.v.props.ignoreScrollBehavior;
+ }
+
+ createElement() {
+ var Handler: React.ComponentClass;
+ React.createElement(Router.Route, null);
+ React.createElement(Router.Route, {});
+ React.createElement(Router.Route, {name: "home", path: "/", handler: Handler, ignoreScrollBehavior: true});
+ }
+}
+
+class RouteHandlerTest {
+ v: Router.RouteHandler;
+
+ constructor() {
+ new RouteHandlerMixinTest();
+ }
+
+ createElement() {
+ React.createElement(Router.RouteHandler, null);
+ React.createElement(Router.RouteHandler, {});
+ }
+}
+
+
+// History
+class HistoryTest {
+ v: Router.History;
+
+ length() {
+ var v1: number = this.v.length;
+ }
+
+ back() {
+ var v1: void = this.v.back();
+ }
+}
+
+
+// Router
+class CreateTest {
+ v: Router.Router;
+
+ constructor() {
+ // React.createElement() version
+ this.v = Router.create({
+ routes: React.createElement(Router.Route, null)
+ });
+ this.v = Router.create({
+ routes: React.createElement(Router.Route, null),
+ location: Router.HistoryLocation,
+ scrollBehavior: Router.ImitateBrowserBehavior
+ });
+
+ // React.createFactory() version
+ this.v = Router.create({
+ routes: React.createFactory(Router.Route)()
+ });
+ this.v = Router.create({
+ routes: React.createFactory(Router.Route)(),
+ location: Router.HistoryLocation,
+ scrollBehavior: Router.ImitateBrowserBehavior
+ });
+ }
+
+ run() {
+ this.v.run((Handler) => console.log(Handler));
+ this.v.run((Handler, state) => console.log(Handler, state));
+ }
+}
+
+class RunTest {
+ constructor() {
+ // React.createElement() version
+ var v1: Router.Router = Router.run(React.createElement(Router.Route, null), (Handler) => {
+ React.render(React.createElement(Handler, null), document.body);
+ });
+ var v2: Router.Router = Router.run(React.createElement(Router.Route, null), Router.HistoryLocation, (Handler, state) => {
+ React.render(React.createElement(Handler, null), document.body);
+ });
+
+ // React.createFactory() version
+ var v3: Router.Router = Router.run(React.createFactory(Router.Route)(), (Handler) => {
+ React.render(React.createElement(Handler, null), document.body);
+ });
+ var v4: Router.Router = Router.run(React.createFactory(Router.Route)(), Router.HistoryLocation, (Handler, state) => {
+ React.render(React.createElement(Handler, null), document.body);
+ });
+ }
+}
+
+
+// Transition
+class TransitionTest {
+ constructor() {
+ var v1: Router.TransitionStaticLifecycle = {
+ willTransitionTo: (transition, params, query, callback) => {
+ transition.abort();
+ transition.redirect('to');
+ transition.redirect('to', {id: 1});
+ transition.redirect('to', {id: 1}, {type: 'json'});
+ transition.retry();
+ },
+ willTransitionFrom: (transition, component, callback) => {}
+ };
+ var v2: Router.TransitionStaticLifecycle = {
+ willTransitionTo: (transition, params, query) => {},
+ willTransitionFrom: (transition, component) => {}
+ };
+ var v3: Router.TransitionStaticLifecycle = {
+ willTransitionTo: (transition, params) => {},
+ willTransitionFrom: (transition) => {}
+ };
+ var v4: Router.TransitionStaticLifecycle = {
+ willTransitionTo: (transition) => {},
+ willTransitionFrom: () => {}
+ };
+ var v5: Router.TransitionStaticLifecycle = {
+ willTransitionTo: () => {}
+ };
+ var v6: Router.TransitionStaticLifecycle = {
+ willTransitionFrom: () => {}
+ };
+ }
+}
diff --git a/react-router/legacy/react-router-0.12.d.ts b/react-router/legacy/react-router-0.12.d.ts
new file mode 100644
index 0000000000..a38e558228
--- /dev/null
+++ b/react-router/legacy/react-router-0.12.d.ts
@@ -0,0 +1,278 @@
+// Type definitions for React Router 0.12.0
+// Project: https://github.com/rackt/react-router
+// Definitions by: Yuichi Murata
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare module ReactRouter {
+ //
+ // Mixin
+ // ----------------------------------------------------------------------
+ interface Navigation {
+ makePath(to: string, params?: {}, query?: {}): string;
+ makeHref(to: string, params?: {}, query?: {}): string;
+ transitionTo(to: string, params?: {}, query?: {}): void;
+ replaceWith(to: string, params?: {}, query?: {}): void;
+ goBack(): void;
+ }
+
+ interface RouteHandlerMixin {
+ getRouteDepth(): number;
+ createChildRouteHandler(props: {}): RouteHandler;
+ }
+
+ interface State {
+ getPath(): string;
+ getRoutes(): Route[];
+ getPathname(): string;
+ getParams(): {};
+ getQuery(): {};
+ isActive(to: string, params?: {}, query?: {}): boolean;
+ }
+
+ var Navigation: Navigation;
+ var State: State;
+ var RouteHandlerMixin: RouteHandlerMixin;
+
+
+ //
+ // Component
+ // ----------------------------------------------------------------------
+ // DefaultRoute
+ interface DefaultRouteProp {
+ name?: string;
+ handler: React.ComponentClass;
+ }
+ interface DefaultRoute extends React.ReactElement {
+ __react_router_default_route__: any; // dummy
+ }
+ interface DefaultRouteClass extends React.ComponentClass {
+ __react_router_default_route__: any; // dummy
+ }
+
+ // Link
+ interface LinkProp {
+ activeClassName?: string;
+ to: string;
+ params?: {};
+ query?: {};
+ onClick?: Function;
+ }
+ interface Link extends React.ReactElement, Navigation, State {
+ __react_router_link__: any; // dummy
+
+ getHref(): string;
+ getClassName(): string;
+ }
+ interface LinkClass extends React.ComponentClass {
+ __react_router_link__: any; // dummy
+ }
+
+ // NotFoundRoute
+ interface NotFoundRouteProp {
+ name?: string;
+ handler: React.ComponentClass;
+ }
+ interface NotFoundRoute extends React.ReactElement {
+ __react_router_not_found_route__: any; // dummy
+ }
+ interface NotFoundRouteClass extends React.ComponentClass {
+ __react_router_not_found_route__: any; // dummy
+ }
+
+ // Redirect
+ interface RedirectProp {
+ path?: string;
+ from?: string;
+ to?: string;
+ }
+ interface Redirect extends React.ReactElement {
+ __react_router_redirect__: any; // dummy
+ }
+ interface RedirectClass extends React.ComponentClass {
+ __react_router_redirect__: any; // dummy
+ }
+
+ // Route
+ interface RouteProp {
+ name?: string;
+ path?: string;
+ handler?: React.ComponentClass;
+ ignoreScrollBehavior?: boolean;
+ }
+ interface Route extends React.ReactElement {
+ __react_router_route__: any; // dummy
+ }
+ interface RouteClass extends React.ComponentClass {
+ __react_router_route__: any; // dummy
+ }
+
+ // RouteHandler
+ interface RouteHandlerProp {}
+ interface RouteHandler extends React.ReactElement, RouteHandlerMixin {
+ __react_router_route_handler__: any; // dummy
+ }
+ interface RouteHandlerClass extends React.ReactElement {
+ __react_router_route_handler__: any; // dummy
+ }
+
+ var DefaultRoute: DefaultRouteClass;
+ var Link: LinkClass;
+ var NotFoundRoute: NotFoundRouteClass;
+ var Redirect: RedirectClass;
+ var Route: RouteClass;
+ var RouteHandler: RouteHandlerClass;
+
+
+ //
+ // Location
+ // ----------------------------------------------------------------------
+ interface LocationBase {
+ push(path: string): void;
+ replace(path: string): void;
+ pop(): void;
+ getCurrentPath(): void;
+ }
+
+ interface LocationListener {
+ addChangeListener(listener: Function): void;
+ removeChangeListener(listener: Function): void;
+ }
+
+ interface HashLocation extends LocationBase, LocationListener {}
+ interface HistoryLocation extends LocationBase, LocationListener {}
+ interface RefreshLocation extends LocationBase {}
+
+ var HashLocation: HashLocation;
+ var HistoryLocation: HistoryLocation;
+ var RefreshLocation: RefreshLocation;
+
+
+ //
+ // Behavior
+ // ----------------------------------------------------------------------
+ interface ScrollBehaviorBase {
+ updateScrollPosition(position: {x: number; y: number;}, actionType: string): void;
+ }
+ interface ImitateBrowserBehavior extends ScrollBehaviorBase {}
+ interface ScrollToTopBehavior extends ScrollBehaviorBase {}
+
+ var ImitateBrowserBehavior: ImitateBrowserBehavior;
+ var ScrollToTopBehavior: ScrollToTopBehavior;
+
+
+ //
+ // Router
+ // ----------------------------------------------------------------------
+ interface Router extends React.ReactElement {
+ run(callback: RouterRunCallback): void;
+ }
+
+ interface RouterState {
+ path: string;
+ action: string;
+ pathname: string;
+ params: {};
+ query: {};
+ routes : Route[];
+ }
+
+ interface RouterCreateOption {
+ routes: React.ReactElement;
+ location?: LocationBase;
+ scrollBehavior?: ScrollBehaviorBase;
+ }
+
+ type RouterRunCallback = (Handler: Router, state: RouterState) => void;
+
+ function create(options: RouterCreateOption): Router;
+ function run(routes: React.ReactElement, callback: RouterRunCallback): Router;
+ function run(routes: React.ReactElement, location: LocationBase, callback: RouterRunCallback): Router;
+
+
+ //
+ // History
+ // ----------------------------------------------------------------------
+ interface History {
+ back(): void;
+ length: number;
+ }
+ var History: History;
+
+
+ //
+ // Transition
+ // ----------------------------------------------------------------------
+ interface Transition {
+ abort(): void;
+ redirect(to: string, params?: {}, query?: {}): void;
+ retry(): void;
+ }
+
+ interface TransitionStaticLifecycle {
+ willTransitionTo?(
+ transition: Transition,
+ params: {},
+ query: {},
+ callback: Function
+ ): void;
+
+ willTransitionFrom?(
+ transition: Transition,
+ component: React.ReactElement,
+ callback: Function
+ ): void;
+ }
+}
+
+declare module 'react-router' {
+ import Export = ReactRouter;
+ export = Export;
+}
+
+declare module React {
+ interface TopLevelAPI {
+ // for DefaultRoute
+ createElement(
+ type: ReactRouter.DefaultRouteClass,
+ props: ReactRouter.DefaultRouteProp,
+ ...children: ReactNode[]
+ ): ReactRouter.DefaultRoute;
+
+ // for Link
+ createElement(
+ type: ReactRouter.LinkClass,
+ props: ReactRouter.LinkProp,
+ ...children: ReactNode[]
+ ): ReactRouter.Link;
+
+ // for NotFoundRoute
+ createElement(
+ type: ReactRouter.NotFoundRouteClass,
+ props: ReactRouter.NotFoundRouteProp,
+ ...children: ReactNode[]
+ ): ReactRouter.NotFoundRoute;
+
+ // for Redirect
+ createElement(
+ type: ReactRouter.RedirectClass,
+ props: ReactRouter.RedirectProp,
+ ...children: ReactNode[]
+ ): ReactRouter.Redirect;
+
+ // for Route
+ createElement(
+ type: ReactRouter.RouteClass,
+ props: ReactRouter.RouteProp,
+ ...children: ReactNode[]
+ ): ReactRouter.Route;
+
+ // for RouteHandler
+ createElement(
+ type: ReactRouter.RouteHandlerClass,
+ props: ReactRouter.RouteHandlerProp,
+ ...children: ReactNode[]
+ ): ReactRouter.RouteHandler;
+ }
+}