From 403894c47328ead23d90b576d564558fda447dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Va=CC=81clav=20Ostroz=CC=8Cli=CC=81k?= Date: Wed, 20 May 2015 21:54:16 +0200 Subject: [PATCH 1/5] React-router 0.13 support --- react-router/react-router-test.ts | 86 ++--- react-router/react-router.d.ts | 559 +++++++++++++++--------------- 2 files changed, 324 insertions(+), 321 deletions(-) diff --git a/react-router/react-router-test.ts b/react-router/react-router-test.ts index 41b352af3..fa335e934 100644 --- a/react-router/react-router-test.ts +++ b/react-router/react-router-test.ts @@ -7,7 +7,7 @@ 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}); @@ -35,27 +35,27 @@ class NavigationTest { 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}); @@ -63,35 +63,23 @@ class StateTest { } } -class RouteHandlerMixinTest { - v: T; - - getRouteDepth() { - var v1: number = this.v.getRouteDepth(); - } - - createChildRouteHandler() { - var v1: Router.RouteHandler = this.v.createChildRouteHandler({ref: 'hoge'}); - } -} - // Location -class LocationTest { +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(); } @@ -102,11 +90,11 @@ 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)); } @@ -118,7 +106,7 @@ new LocationListenerTest(); // Behavior class ScrollBehaviorTest { v: T; - + updateScrollPosition() { var v1: void = this.v.updateScrollPosition({x: 33, y: 102}, 'scrollTop'); } @@ -130,12 +118,12 @@ 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); @@ -145,12 +133,12 @@ class DefaultRouteTest { 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; @@ -158,15 +146,15 @@ class LinkTest { 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'}); @@ -182,12 +170,12 @@ class LinkTest { 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); @@ -198,13 +186,13 @@ class NotFoundRouteTest { 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, {}); @@ -214,14 +202,14 @@ class RedirectTest { 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); @@ -232,11 +220,7 @@ class RouteTest { class RouteHandlerTest { v: Router.RouteHandler; - - constructor() { - new RouteHandlerMixinTest(); - } - + createElement() { React.createElement(Router.RouteHandler, null); React.createElement(Router.RouteHandler, {}); @@ -247,11 +231,11 @@ class RouteHandlerTest { // History class HistoryTest { v: Router.History; - + length() { var v1: number = this.v.length; } - + back() { var v1: void = this.v.back(); } @@ -261,7 +245,7 @@ class HistoryTest { // Router class CreateTest { v: Router.Router; - + constructor() { // React.createElement() version this.v = Router.create({ @@ -272,7 +256,7 @@ class CreateTest { location: Router.HistoryLocation, scrollBehavior: Router.ImitateBrowserBehavior }); - + // React.createFactory() version this.v = Router.create({ routes: React.createFactory(Router.Route)() @@ -283,7 +267,7 @@ class CreateTest { scrollBehavior: Router.ImitateBrowserBehavior }); } - + run() { this.v.run((Handler) => console.log(Handler)); this.v.run((Handler, state) => console.log(Handler, state)); @@ -299,7 +283,7 @@ class RunTest { 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); diff --git a/react-router/react-router.d.ts b/react-router/react-router.d.ts index 58ec9069a..c02892ffe 100644 --- a/react-router/react-router.d.ts +++ b/react-router/react-router.d.ts @@ -1,278 +1,297 @@ -// Type definitions for React Router 0.12.0 +// Type definitions for React Router 0.13.3 // Project: https://github.com/rackt/react-router -// Definitions by: Yuichi Murata +// Definitions by: Yuichi Murata , Václav Ostrožlík // 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 React = require("react"); + + // + // Transition + // ---------------------------------------------------------------------- + interface Transition { + path: string; + abortReason: any; + retry(): void; + abort(reason?: any): void; + redirect(to: string, params?: {}, query?: {}): void; + cancel(): void; + from: (transition: Transition, routes: Route[], components?: React.ReactElement[], callback?: (error?: any) => void) => void; + to: (transition: Transition, routes: Route[], params?: {}, query?: {}, callback?: (error?: any) => void) => void; + } + + interface TransitionStaticLifecycle { + willTransitionTo?( + transition: Transition, + params: {}, + query: {}, + callback: Function + ): void; + + willTransitionFrom?( + transition: Transition, + component: React.ReactElement, + callback: Function + ): void; + } + + // + // Route Configuration + // ---------------------------------------------------------------------- + // DefaultRoute + interface DefaultRouteProp { + name?: string; + handler: React.ComponentClass; + } + interface DefaultRoute extends React.ReactElement {} + interface DefaultRouteClass extends React.ComponentClass {} + + // NotFoundRoute + interface NotFoundRouteProp { + name?: string; + handler: React.ComponentClass; + } + interface NotFoundRoute extends React.ReactElement {} + interface NotFoundRouteClass extends React.ComponentClass {} + + // Redirect + interface RedirectProp { + path?: string; + from?: string; + to?: string; + } + interface Redirect extends React.ReactElement {} + interface RedirectClass extends React.ComponentClass {} + + // Route + interface RouteProp { + name?: string; + path?: string; + handler?: React.ComponentClass; + ignoreScrollBehavior?: boolean; + } + interface Route extends React.ReactElement {} + interface RouteClass extends React.ComponentClass {} + + var DefaultRoute: DefaultRouteClass; + var NotFoundRoute: NotFoundRouteClass; + var Redirect: RedirectClass; + var Route: RouteClass; + + interface CreateRouteOptions { + name?: string; + path?: string; + ignoreScrollBehavior?: boolean; + isDefault?: boolean; + isNotFound?: boolean; + onEnter?: (transition: Transition, params: {}, query: {}, callback: Function) => void; + onLeave?: (transition: Transition, wtf: any, callback: Function) => void; + handler?: Function; + parentRoute?: Route; + } + + type CreateRouteCallback = (route: Route) => void; + + function createRoute(callback: CreateRouteCallback): Route; + function createRoute(options: CreateRouteOptions | string, callback: CreateRouteCallback): Route; + function createDefaultRoute(options?: CreateRouteOptions | string): Route; + function createNotFoundRoute(options?: CreateRouteOptions | string): Route; + + interface CreateRedirectOptions extends CreateRouteOptions { + path?: string; + from?: string; + to: string; + params?: {}; + query?: {}; + } + function createRedirect(options: CreateRedirectOptions): Redirect; + function createRoutesFromReactChildren(children: Route): Route[]; + + // + // Components + // ---------------------------------------------------------------------- + // Link + interface LinkProp { + activeClassName?: string; + activeStyle?: {}; + to: string; + params?: {}; + query?: {}; + onClick?: Function; + } + interface Link extends React.ReactElement, Navigation, State { + handleClick(event: any): void; + getHref(): string; + getClassName(): string; + getActiveState(): boolean; + } + interface LinkClass extends React.ComponentClass {} + + // RouteHandler + interface RouteHandlerProp { } + interface RouteHandlerChildContext { + routeDepth: number; + } + interface RouteHandler extends React.ReactElement { + getChildContext(): RouteHandlerChildContext; + getRouteDepth(): number; + createChildRouteHandler(props: {}): RouteHandler; + } + interface RouteHandlerClass extends React.ReactElement {} + + var Link: LinkClass; + var RouteHandler: RouteHandlerClass; + + + // + // Top-Level + // ---------------------------------------------------------------------- + interface Router extends React.ReactElement { + run(callback: RouterRunCallback): void; + } + + interface RouterState { + path: string; + action: string; + pathname: string; + params: {}; + query: {}; + routes: Route[]; + } + + interface RouterCreateOption { + routes: Route; + location?: LocationBase; + scrollBehavior?: ScrollBehaviorBase; + onError?: (error: any) => void; + onAbort?: (error: any) => void; + } + + type RouterRunCallback = (Handler: RouteClass, state: RouterState) => void; + + function create(options: RouterCreateOption): Router; + function run(routes: Route, callback: RouterRunCallback): Router; + function run(routes: Route, location: LocationBase, callback: RouterRunCallback): Router; + + + // + // Location + // ---------------------------------------------------------------------- + interface LocationBase { + getCurrentPath(): void; + toString(): string; + } + interface Location extends LocationBase { + push(path: string): void; + replace(path: string): void; + pop(): void; + } + + interface LocationListener { + addChangeListener(listener: Function): void; + removeChangeListener(listener: Function): void; + } + + interface HashLocation extends Location, LocationListener { } + interface HistoryLocation extends Location, LocationListener { } + interface RefreshLocation extends Location { } + interface StaticLocation extends LocationBase { } + interface TestLocation extends Location, LocationListener { } + + var HashLocation: HashLocation; + var HistoryLocation: HistoryLocation; + var RefreshLocation: RefreshLocation; + var StaticLocation: StaticLocation; + var TestLocation: TestLocation; + + + // + // 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; + + + // + // 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 State { + getPath(): string; + getRoutes(): Route[]; + getPathname(): string; + getParams(): {}; + getQuery(): {}; + isActive(to: string, params?: {}, query?: {}): boolean; + } + + var Navigation: Navigation; + var State: State; + + + // + // History + // ---------------------------------------------------------------------- + interface History { + back(): void; + length: number; + } + var History: History; } -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; - } +declare module "react" { + import ReactRouter = require("react-router"); + + // for DefaultRoute + function createElement( + type: ReactRouter.DefaultRouteClass, + props: ReactRouter.DefaultRouteProp, + ...children: ReactNode[]): ReactRouter.DefaultRoute; + + // for Link + function createElement( + type: ReactRouter.LinkClass, + props: ReactRouter.LinkProp, + ...children: ReactNode[]): ReactRouter.Link; + + // for NotFoundRoute + function createElement( + type: ReactRouter.NotFoundRouteClass, + props: ReactRouter.NotFoundRouteProp, + ...children: ReactNode[]): ReactRouter.NotFoundRoute; + + // for Redirect + function createElement( + type: ReactRouter.RedirectClass, + props: ReactRouter.RedirectProp, + ...children: ReactNode[]): ReactRouter.Redirect; + + // for Route + function createElement( + type: ReactRouter.RouteClass, + props: ReactRouter.RouteProp, + ...children: ReactNode[]): ReactRouter.Route; + + // for RouteHandler + function createElement( + type: ReactRouter.RouteHandlerClass, + props: ReactRouter.RouteHandlerProp, + ...children: ReactNode[]): ReactRouter.RouteHandler; } From 4ca5b84c2342d04a36f54a3be4870499809ab54f Mon Sep 17 00:00:00 2001 From: Yuichi Murata Date: Sun, 12 Jul 2015 21:27:57 +0900 Subject: [PATCH 2/5] Fix some issues of #4410/issuecomment-110341203 --- react-router/react-router-test.ts | 60 +++++++++++++++++++++++++++++++ react-router/react-router.d.ts | 58 ++++++++++-------------------- 2 files changed, 78 insertions(+), 40 deletions(-) diff --git a/react-router/react-router-test.ts b/react-router/react-router-test.ts index fa335e934..85180cf9e 100644 --- a/react-router/react-router-test.ts +++ b/react-router/react-router-test.ts @@ -328,3 +328,63 @@ class TransitionTest { }; } } + + +// Context +class ContextTest { + v: Router.Context + + makePath() { + var v1: string = this.v.makePath('home'); + var v2: string = this.v.makePath('home', {p1: 1}); + var v3: string = this.v.makePath('home', {p1: 1}, {q1: 1}); + } + + makeHref() { + var v1: string = this.v.makeHref('home'); + var v2: string = this.v.makeHref('home', {p1: 1}); + var v3: string = this.v.makeHref('home', {p1: 1}, {q1: 1}); + } + + transitionTo() { + var v1: void = this.v.transitionTo('home'); + var v2: void = this.v.transitionTo('home', {p1: 1}); + var v3: void = this.v.transitionTo('home', {p1: 1}, {q1: 1}); + } + + replaceWith() { + var v1: void = this.v.replaceWith('home'); + var v2: void = this.v.replaceWith('home', {p1: 1}); + var v3: void = this.v.replaceWith('home', {p1: 1}, {q1: 1}); + } + + goBack() { + var v: void = this.v.goBack(); + } + + getCurrentPath() { + var v: string = this.v.getCurrentPath(); + } + + getCurrentRoutes() { + var v: Router.Route[] = this.v.getCurrentRoutes(); + } + + getCurrentPathname() { + var v: string = this.v.getCurrentPathname(); + } + + getCurrentParams() { + var v: {} = this.v.getCurrentParams(); + } + + getCurrentQuery() { + var v: {} = this.v.getCurrentQuery(); + } + + isActive() { + var v1: boolean = this.v.isActive('home'); + var v2: boolean = this.v.isActive('home', {p1: 1}); + var v3: boolean = this.v.isActive('home', {p1: 1}, {q1: 1}); + } +} diff --git a/react-router/react-router.d.ts b/react-router/react-router.d.ts index c02892ffe..6a005d967 100644 --- a/react-router/react-router.d.ts +++ b/react-router/react-router.d.ts @@ -140,7 +140,7 @@ declare module "react-router" { getRouteDepth(): number; createChildRouteHandler(props: {}): RouteHandler; } - interface RouteHandlerClass extends React.ReactElement {} + interface RouteHandlerClass extends React.ComponentClass {} var Link: LinkClass; var RouteHandler: RouteHandlerClass; @@ -253,45 +253,23 @@ declare module "react-router" { length: number; } var History: History; -} -declare module "react" { - import ReactRouter = require("react-router"); - - // for DefaultRoute - function createElement( - type: ReactRouter.DefaultRouteClass, - props: ReactRouter.DefaultRouteProp, - ...children: ReactNode[]): ReactRouter.DefaultRoute; - - // for Link - function createElement( - type: ReactRouter.LinkClass, - props: ReactRouter.LinkProp, - ...children: ReactNode[]): ReactRouter.Link; - - // for NotFoundRoute - function createElement( - type: ReactRouter.NotFoundRouteClass, - props: ReactRouter.NotFoundRouteProp, - ...children: ReactNode[]): ReactRouter.NotFoundRoute; - - // for Redirect - function createElement( - type: ReactRouter.RedirectClass, - props: ReactRouter.RedirectProp, - ...children: ReactNode[]): ReactRouter.Redirect; - - // for Route - function createElement( - type: ReactRouter.RouteClass, - props: ReactRouter.RouteProp, - ...children: ReactNode[]): ReactRouter.Route; - - // for RouteHandler - function createElement( - type: ReactRouter.RouteHandlerClass, - props: ReactRouter.RouteHandlerProp, - ...children: ReactNode[]): ReactRouter.RouteHandler; + // + // Context + // ---------------------------------------------------------------------- + interface Context { + 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; + + getCurrentPath(): string; + getCurrentRoutes(): Route[]; + getCurrentPathname(): string; + getCurrentParams(): {}; + getCurrentQuery(): {}; + isActive(to: string, params?: {}, query?: {}): boolean; + } } From c09238ca0892e167aa4f85a6826788969662636e Mon Sep 17 00:00:00 2001 From: Yuichi Murata Date: Sun, 12 Jul 2015 21:36:30 +0900 Subject: [PATCH 3/5] Change an indent width of react-router/react-router.d.ts to 4 spaces that is general style in TypeScript --- react-router/react-router.d.ts | 454 ++++++++++++++++----------------- 1 file changed, 227 insertions(+), 227 deletions(-) diff --git a/react-router/react-router.d.ts b/react-router/react-router.d.ts index 6a005d967..a54805815 100644 --- a/react-router/react-router.d.ts +++ b/react-router/react-router.d.ts @@ -7,269 +7,269 @@ declare module "react-router" { - import React = require("react"); + import React = require("react"); - // - // Transition - // ---------------------------------------------------------------------- - interface Transition { - path: string; - abortReason: any; - retry(): void; - abort(reason?: any): void; - redirect(to: string, params?: {}, query?: {}): void; - cancel(): void; - from: (transition: Transition, routes: Route[], components?: React.ReactElement[], callback?: (error?: any) => void) => void; - to: (transition: Transition, routes: Route[], params?: {}, query?: {}, callback?: (error?: any) => void) => void; - } + // + // Transition + // ---------------------------------------------------------------------- + interface Transition { + path: string; + abortReason: any; + retry(): void; + abort(reason?: any): void; + redirect(to: string, params?: {}, query?: {}): void; + cancel(): void; + from: (transition: Transition, routes: Route[], components?: React.ReactElement[], callback?: (error?: any) => void) => void; + to: (transition: Transition, routes: Route[], params?: {}, query?: {}, callback?: (error?: any) => void) => void; + } - interface TransitionStaticLifecycle { - willTransitionTo?( - transition: Transition, - params: {}, - query: {}, - callback: Function - ): void; + interface TransitionStaticLifecycle { + willTransitionTo?( + transition: Transition, + params: {}, + query: {}, + callback: Function + ): void; - willTransitionFrom?( - transition: Transition, - component: React.ReactElement, - callback: Function - ): void; - } + willTransitionFrom?( + transition: Transition, + component: React.ReactElement, + callback: Function + ): void; + } - // - // Route Configuration - // ---------------------------------------------------------------------- - // DefaultRoute - interface DefaultRouteProp { - name?: string; - handler: React.ComponentClass; - } - interface DefaultRoute extends React.ReactElement {} - interface DefaultRouteClass extends React.ComponentClass {} + // + // Route Configuration + // ---------------------------------------------------------------------- + // DefaultRoute + interface DefaultRouteProp { + name?: string; + handler: React.ComponentClass; + } + interface DefaultRoute extends React.ReactElement {} + interface DefaultRouteClass extends React.ComponentClass {} - // NotFoundRoute - interface NotFoundRouteProp { - name?: string; - handler: React.ComponentClass; - } - interface NotFoundRoute extends React.ReactElement {} - interface NotFoundRouteClass extends React.ComponentClass {} + // NotFoundRoute + interface NotFoundRouteProp { + name?: string; + handler: React.ComponentClass; + } + interface NotFoundRoute extends React.ReactElement {} + interface NotFoundRouteClass extends React.ComponentClass {} - // Redirect - interface RedirectProp { - path?: string; - from?: string; - to?: string; - } - interface Redirect extends React.ReactElement {} - interface RedirectClass extends React.ComponentClass {} + // Redirect + interface RedirectProp { + path?: string; + from?: string; + to?: string; + } + interface Redirect extends React.ReactElement {} + interface RedirectClass extends React.ComponentClass {} - // Route - interface RouteProp { - name?: string; - path?: string; - handler?: React.ComponentClass; - ignoreScrollBehavior?: boolean; - } - interface Route extends React.ReactElement {} - interface RouteClass extends React.ComponentClass {} + // Route + interface RouteProp { + name?: string; + path?: string; + handler?: React.ComponentClass; + ignoreScrollBehavior?: boolean; + } + interface Route extends React.ReactElement {} + interface RouteClass extends React.ComponentClass {} - var DefaultRoute: DefaultRouteClass; - var NotFoundRoute: NotFoundRouteClass; - var Redirect: RedirectClass; - var Route: RouteClass; + var DefaultRoute: DefaultRouteClass; + var NotFoundRoute: NotFoundRouteClass; + var Redirect: RedirectClass; + var Route: RouteClass; - interface CreateRouteOptions { - name?: string; - path?: string; - ignoreScrollBehavior?: boolean; - isDefault?: boolean; - isNotFound?: boolean; - onEnter?: (transition: Transition, params: {}, query: {}, callback: Function) => void; - onLeave?: (transition: Transition, wtf: any, callback: Function) => void; - handler?: Function; - parentRoute?: Route; - } + interface CreateRouteOptions { + name?: string; + path?: string; + ignoreScrollBehavior?: boolean; + isDefault?: boolean; + isNotFound?: boolean; + onEnter?: (transition: Transition, params: {}, query: {}, callback: Function) => void; + onLeave?: (transition: Transition, wtf: any, callback: Function) => void; + handler?: Function; + parentRoute?: Route; + } - type CreateRouteCallback = (route: Route) => void; + type CreateRouteCallback = (route: Route) => void; - function createRoute(callback: CreateRouteCallback): Route; - function createRoute(options: CreateRouteOptions | string, callback: CreateRouteCallback): Route; - function createDefaultRoute(options?: CreateRouteOptions | string): Route; - function createNotFoundRoute(options?: CreateRouteOptions | string): Route; + function createRoute(callback: CreateRouteCallback): Route; + function createRoute(options: CreateRouteOptions | string, callback: CreateRouteCallback): Route; + function createDefaultRoute(options?: CreateRouteOptions | string): Route; + function createNotFoundRoute(options?: CreateRouteOptions | string): Route; - interface CreateRedirectOptions extends CreateRouteOptions { - path?: string; - from?: string; - to: string; - params?: {}; - query?: {}; - } - function createRedirect(options: CreateRedirectOptions): Redirect; - function createRoutesFromReactChildren(children: Route): Route[]; + interface CreateRedirectOptions extends CreateRouteOptions { + path?: string; + from?: string; + to: string; + params?: {}; + query?: {}; + } + function createRedirect(options: CreateRedirectOptions): Redirect; + function createRoutesFromReactChildren(children: Route): Route[]; - // - // Components - // ---------------------------------------------------------------------- - // Link - interface LinkProp { - activeClassName?: string; - activeStyle?: {}; - to: string; - params?: {}; - query?: {}; - onClick?: Function; - } - interface Link extends React.ReactElement, Navigation, State { - handleClick(event: any): void; - getHref(): string; - getClassName(): string; - getActiveState(): boolean; - } - interface LinkClass extends React.ComponentClass {} + // + // Components + // ---------------------------------------------------------------------- + // Link + interface LinkProp { + activeClassName?: string; + activeStyle?: {}; + to: string; + params?: {}; + query?: {}; + onClick?: Function; + } + interface Link extends React.ReactElement, Navigation, State { + handleClick(event: any): void; + getHref(): string; + getClassName(): string; + getActiveState(): boolean; + } + interface LinkClass extends React.ComponentClass {} - // RouteHandler - interface RouteHandlerProp { } - interface RouteHandlerChildContext { - routeDepth: number; - } - interface RouteHandler extends React.ReactElement { - getChildContext(): RouteHandlerChildContext; - getRouteDepth(): number; - createChildRouteHandler(props: {}): RouteHandler; - } - interface RouteHandlerClass extends React.ComponentClass {} + // RouteHandler + interface RouteHandlerProp { } + interface RouteHandlerChildContext { + routeDepth: number; + } + interface RouteHandler extends React.ReactElement { + getChildContext(): RouteHandlerChildContext; + getRouteDepth(): number; + createChildRouteHandler(props: {}): RouteHandler; + } + interface RouteHandlerClass extends React.ComponentClass {} - var Link: LinkClass; - var RouteHandler: RouteHandlerClass; + var Link: LinkClass; + var RouteHandler: RouteHandlerClass; - // - // Top-Level - // ---------------------------------------------------------------------- - interface Router extends React.ReactElement { - run(callback: RouterRunCallback): void; - } + // + // Top-Level + // ---------------------------------------------------------------------- + interface Router extends React.ReactElement { + run(callback: RouterRunCallback): void; + } - interface RouterState { - path: string; - action: string; - pathname: string; - params: {}; - query: {}; - routes: Route[]; - } + interface RouterState { + path: string; + action: string; + pathname: string; + params: {}; + query: {}; + routes: Route[]; + } - interface RouterCreateOption { - routes: Route; - location?: LocationBase; - scrollBehavior?: ScrollBehaviorBase; - onError?: (error: any) => void; - onAbort?: (error: any) => void; - } + interface RouterCreateOption { + routes: Route; + location?: LocationBase; + scrollBehavior?: ScrollBehaviorBase; + onError?: (error: any) => void; + onAbort?: (error: any) => void; + } - type RouterRunCallback = (Handler: RouteClass, state: RouterState) => void; + type RouterRunCallback = (Handler: RouteClass, state: RouterState) => void; - function create(options: RouterCreateOption): Router; - function run(routes: Route, callback: RouterRunCallback): Router; - function run(routes: Route, location: LocationBase, callback: RouterRunCallback): Router; + function create(options: RouterCreateOption): Router; + function run(routes: Route, callback: RouterRunCallback): Router; + function run(routes: Route, location: LocationBase, callback: RouterRunCallback): Router; - // - // Location - // ---------------------------------------------------------------------- - interface LocationBase { - getCurrentPath(): void; - toString(): string; - } - interface Location extends LocationBase { - push(path: string): void; - replace(path: string): void; - pop(): void; - } + // + // Location + // ---------------------------------------------------------------------- + interface LocationBase { + getCurrentPath(): void; + toString(): string; + } + interface Location extends LocationBase { + push(path: string): void; + replace(path: string): void; + pop(): void; + } - interface LocationListener { - addChangeListener(listener: Function): void; - removeChangeListener(listener: Function): void; - } + interface LocationListener { + addChangeListener(listener: Function): void; + removeChangeListener(listener: Function): void; + } - interface HashLocation extends Location, LocationListener { } - interface HistoryLocation extends Location, LocationListener { } - interface RefreshLocation extends Location { } - interface StaticLocation extends LocationBase { } - interface TestLocation extends Location, LocationListener { } + interface HashLocation extends Location, LocationListener { } + interface HistoryLocation extends Location, LocationListener { } + interface RefreshLocation extends Location { } + interface StaticLocation extends LocationBase { } + interface TestLocation extends Location, LocationListener { } - var HashLocation: HashLocation; - var HistoryLocation: HistoryLocation; - var RefreshLocation: RefreshLocation; - var StaticLocation: StaticLocation; - var TestLocation: TestLocation; + var HashLocation: HashLocation; + var HistoryLocation: HistoryLocation; + var RefreshLocation: RefreshLocation; + var StaticLocation: StaticLocation; + var TestLocation: TestLocation; - // - // Behavior - // ---------------------------------------------------------------------- - interface ScrollBehaviorBase { - updateScrollPosition(position: { x: number; y: number; }, actionType: string): void; - } - interface ImitateBrowserBehavior extends ScrollBehaviorBase { } - interface ScrollToTopBehavior extends ScrollBehaviorBase { } + // + // 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; + var ImitateBrowserBehavior: ImitateBrowserBehavior; + var ScrollToTopBehavior: ScrollToTopBehavior; - // - // 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; - } + // + // 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 State { - getPath(): string; - getRoutes(): Route[]; - getPathname(): string; - getParams(): {}; - getQuery(): {}; - isActive(to: string, params?: {}, query?: {}): boolean; - } + interface State { + getPath(): string; + getRoutes(): Route[]; + getPathname(): string; + getParams(): {}; + getQuery(): {}; + isActive(to: string, params?: {}, query?: {}): boolean; + } - var Navigation: Navigation; - var State: State; + var Navigation: Navigation; + var State: State; - // - // History - // ---------------------------------------------------------------------- - interface History { - back(): void; - length: number; - } - var History: History; + // + // History + // ---------------------------------------------------------------------- + interface History { + back(): void; + length: number; + } + var History: History; - // - // Context - // ---------------------------------------------------------------------- - interface Context { - 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; + // + // Context + // ---------------------------------------------------------------------- + interface Context { + 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; - getCurrentPath(): string; - getCurrentRoutes(): Route[]; - getCurrentPathname(): string; - getCurrentParams(): {}; - getCurrentQuery(): {}; - isActive(to: string, params?: {}, query?: {}): boolean; - } + getCurrentPath(): string; + getCurrentRoutes(): Route[]; + getCurrentPathname(): string; + getCurrentParams(): {}; + getCurrentQuery(): {}; + isActive(to: string, params?: {}, query?: {}): boolean; + } } From 2d6ddd55ba09893b9aef85bb07086384b511eba1 Mon Sep 17 00:00:00 2001 From: Yuichi Murata Date: Sun, 12 Jul 2015 21:58:24 +0900 Subject: [PATCH 4/5] Move the type definitions for ReactRouter 0.12.x to the legacy directory --- react-router/legacy/react-router-0.12-test.ts | 346 ++++++++++++++++++ react-router/legacy/react-router-0.12.d.ts | 278 ++++++++++++++ 2 files changed, 624 insertions(+) create mode 100644 react-router/legacy/react-router-0.12-test.ts create mode 100644 react-router/legacy/react-router-0.12.d.ts 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 000000000..d0d122bd4 --- /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 000000000..a38e55822 --- /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; + } +} From 896b1b56d2ab78fc617601b5e662e3b62e6b638b Mon Sep 17 00:00:00 2001 From: Yuichi Murata Date: Sun, 12 Jul 2015 22:41:49 +0900 Subject: [PATCH 5/5] Fix issues of react-router occurring on tsc 1.4.1 --- .../legacy/react-router-0.12-test.d.ts | 6 ++ react-router/legacy/react-router-0.12-test.ts | 5 +- react-router/legacy/react-router-0.12.d.ts | 3 +- react-router/react-router-test.ts | 29 +++++++ react-router/react-router.d.ts | 86 ++++++++++++++++++- 5 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 react-router/legacy/react-router-0.12-test.d.ts diff --git a/react-router/legacy/react-router-0.12-test.d.ts b/react-router/legacy/react-router-0.12-test.d.ts new file mode 100644 index 000000000..bf6e2e272 --- /dev/null +++ b/react-router/legacy/react-router-0.12-test.d.ts @@ -0,0 +1,6 @@ +/// + +declare module 'react-0.12' { + var exports: React.Exports; + export = exports; +} diff --git a/react-router/legacy/react-router-0.12-test.ts b/react-router/legacy/react-router-0.12-test.ts index d0d122bd4..e896c80f7 100644 --- a/react-router/legacy/react-router-0.12-test.ts +++ b/react-router/legacy/react-router-0.12-test.ts @@ -1,8 +1,9 @@ +/// /// "use strict"; -import React = require('react'); -import Router = require('react-router'); +import React = require('react-0.12'); +import Router = ReactRouter; // Mixin class NavigationTest { diff --git a/react-router/legacy/react-router-0.12.d.ts b/react-router/legacy/react-router-0.12.d.ts index a38e55822..79763db11 100644 --- a/react-router/legacy/react-router-0.12.d.ts +++ b/react-router/legacy/react-router-0.12.d.ts @@ -227,8 +227,7 @@ declare module ReactRouter { } declare module 'react-router' { - import Export = ReactRouter; - export = Export; + export = ReactRouter; } declare module React { diff --git a/react-router/react-router-test.ts b/react-router/react-router-test.ts index 85180cf9e..62180a258 100644 --- a/react-router/react-router-test.ts +++ b/react-router/react-router-test.ts @@ -2,6 +2,7 @@ "use strict"; import React = require('react'); +import ReactAddons = require('react/addons'); import Router = require('react-router'); // Mixin @@ -128,6 +129,9 @@ class DefaultRouteTest { var Handler: React.ComponentClass; React.createElement(Router.DefaultRoute, null); React.createElement(Router.DefaultRoute, {name: 'name', handler: Handler}); + + ReactAddons.createElement(Router.DefaultRoute, null); + ReactAddons.createElement(Router.DefaultRoute, {name: 'name', handler: Handler}); } } @@ -165,6 +169,16 @@ class LinkTest { query: {}, onClick: () => console.log(1) }); + + ReactAddons.createElement(Router.Link, null); + ReactAddons.createElement(Router.Link, {to: 'home'}); + ReactAddons.createElement(Router.Link, { + activeClassName: 'name', + to: 'home', + params: {}, + query: {}, + onClick: () => console.log(1) + }); } } @@ -181,6 +195,10 @@ class NotFoundRouteTest { React.createElement(Router.NotFoundRoute, null); React.createElement(Router.NotFoundRoute, {handler: Handler}); React.createElement(Router.NotFoundRoute, {handler: Handler, name: "home"}); + + ReactAddons.createElement(Router.NotFoundRoute, null); + ReactAddons.createElement(Router.NotFoundRoute, {handler: Handler}); + ReactAddons.createElement(Router.NotFoundRoute, {handler: Handler, name: "home"}); } } @@ -197,6 +215,10 @@ class RedirectTest { React.createElement(Router.Redirect, null); React.createElement(Router.Redirect, {}); React.createElement(Router.Redirect, {path: 'a', from: 'a', to: 'b'}); + + ReactAddons.createElement(Router.Redirect, null); + ReactAddons.createElement(Router.Redirect, {}); + ReactAddons.createElement(Router.Redirect, {path: 'a', from: 'a', to: 'b'}); } } @@ -215,6 +237,10 @@ class RouteTest { React.createElement(Router.Route, null); React.createElement(Router.Route, {}); React.createElement(Router.Route, {name: "home", path: "/", handler: Handler, ignoreScrollBehavior: true}); + + ReactAddons.createElement(Router.Route, null); + ReactAddons.createElement(Router.Route, {}); + ReactAddons.createElement(Router.Route, {name: "home", path: "/", handler: Handler, ignoreScrollBehavior: true}); } } @@ -224,6 +250,9 @@ class RouteHandlerTest { createElement() { React.createElement(Router.RouteHandler, null); React.createElement(Router.RouteHandler, {}); + + ReactAddons.createElement(Router.RouteHandler, null); + ReactAddons.createElement(Router.RouteHandler, {}); } } diff --git a/react-router/react-router.d.ts b/react-router/react-router.d.ts index a54805815..9d0f63b96 100644 --- a/react-router/react-router.d.ts +++ b/react-router/react-router.d.ts @@ -4,11 +4,9 @@ // Definitions: https://github.com/borisyankov/DefinitelyTyped /// +/// -declare module "react-router" { - - import React = require("react"); - +declare module ReactRouter { // // Transition // ---------------------------------------------------------------------- @@ -273,3 +271,83 @@ declare module "react-router" { isActive(to: string, params?: {}, query?: {}): boolean; } } + +declare module "react-router" { + export = ReactRouter; +} + +declare module React { + // for DefaultRoute + function createElement( + type: ReactRouter.DefaultRouteClass, + props: ReactRouter.DefaultRouteProp, + ...children: React.ReactNode[]): ReactRouter.DefaultRoute; + + // for Link + function createElement( + type: ReactRouter.LinkClass, + props: ReactRouter.LinkProp, + ...children: React.ReactNode[]): ReactRouter.Link; + + // for NotFoundRoute + function createElement( + type: ReactRouter.NotFoundRouteClass, + props: ReactRouter.NotFoundRouteProp, + ...children: React.ReactNode[]): ReactRouter.NotFoundRoute; + + // for Redirect + function createElement( + type: ReactRouter.RedirectClass, + props: ReactRouter.RedirectProp, + ...children: React.ReactNode[]): ReactRouter.Redirect; + + // for Route + function createElement( + type: ReactRouter.RouteClass, + props: ReactRouter.RouteProp, + ...children: React.ReactNode[]): ReactRouter.Route; + + // for RouteHandler + function createElement( + type: ReactRouter.RouteHandlerClass, + props: ReactRouter.RouteHandlerProp, + ...children: React.ReactNode[]): ReactRouter.RouteHandler; +} + +declare module "react/addons" { + // for DefaultRoute + function createElement( + type: ReactRouter.DefaultRouteClass, + props: ReactRouter.DefaultRouteProp, + ...children: React.ReactNode[]): ReactRouter.DefaultRoute; + + // for Link + function createElement( + type: ReactRouter.LinkClass, + props: ReactRouter.LinkProp, + ...children: React.ReactNode[]): ReactRouter.Link; + + // for NotFoundRoute + function createElement( + type: ReactRouter.NotFoundRouteClass, + props: ReactRouter.NotFoundRouteProp, + ...children: React.ReactNode[]): ReactRouter.NotFoundRoute; + + // for Redirect + function createElement( + type: ReactRouter.RedirectClass, + props: ReactRouter.RedirectProp, + ...children: React.ReactNode[]): ReactRouter.Redirect; + + // for Route + function createElement( + type: ReactRouter.RouteClass, + props: ReactRouter.RouteProp, + ...children: React.ReactNode[]): ReactRouter.Route; + + // for RouteHandler + function createElement( + type: ReactRouter.RouteHandlerClass, + props: ReactRouter.RouteHandlerProp, + ...children: React.ReactNode[]): ReactRouter.RouteHandler; +}