diff --git a/types/react-resolver/index.d.ts b/types/react-resolver/index.d.ts new file mode 100644 index 0000000000..9afa5d4b61 --- /dev/null +++ b/types/react-resolver/index.d.ts @@ -0,0 +1,71 @@ +// Type definitions for react-resolver 3.1 +// Project: https://github.com/ericclemmons/react-resolver +// Definitions by: forabi +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 + +import { ComponentType, StatelessComponent, Factory } from 'react'; + +export type AnyComponent

= ComponentType

; + +export interface Resolver { + resolve( + factory: Factory

, + ): Promise<{ + data: D; + Resolved: StatelessComponent

; + }>; + + render

(factory: Factory

, root: Node | null): void; +} + +export const Resolver: Resolver; + +export type ResolveFn = (props: Props) => Promise; + +/** Use this for gaining access to a context as a prop without the boilerplate of setting `contextTypes`. */ +export function context( + prop: K, +): ( + component: AnyComponent, +) => StatelessComponent>; + +/** + * Use `@client(LoaderComponent)` (or `client(LoaderComponent)(YourComponent)`) + * for when you want to skip server-side rendering of part of your view and + * perform it only on the client. + */ +export function client( + loadingComponent: AnyComponent, +): ( + component: AnyComponent, +) => StatelessComponent; + +export function resolve< + OwnProps, + K extends string, + V, + MoreProps = { [x: string]: any } +>( + prop: K, + resolveFn: ResolveFn, +): ( + component: AnyComponent, +) => StatelessComponent; + +export function resolve< + OwnProps, + ResolvableProps = { [x: string]: any }, + MoreProps = { [x: string]: any } +>( + resolversMap: { + [K in keyof ResolvableProps]: ResolveFn< + OwnProps & MoreProps, + ResolvableProps[K] + > + }, +): ( + component: AnyComponent< + OwnProps & { [K in keyof ResolvableProps]?: ResolvableProps[K] } + >, +) => StatelessComponent; diff --git a/types/react-resolver/test.tsx b/types/react-resolver/test.tsx new file mode 100644 index 0000000000..4c4314c063 --- /dev/null +++ b/types/react-resolver/test.tsx @@ -0,0 +1,44 @@ +import * as React from 'react'; +import { Resolver, resolve } from 'react-resolver'; +import * as expect from 'expect'; + +interface OwnProps { + thing: number; +} + +interface ResolvedProps { + data: string; +} + +class Page extends React.Component { + render() { + return

Hello, {this.props.data}!
; + } +} + +const ResolvedPageWithSingleProp = resolve('data', async () => { + return new Promise(resolve => { + setTimeout(() => resolve('World'), 500); + }); +})(Page); + +const ResolvedPageWithPropMap = resolve({ + data: async () => { + return new Promise(resolve => { + setTimeout(() => resolve('World'), 500); + }); + }, +})(Page); + +expect().toExist(); +expect().toExist(); + +// Resolver.render(() => , document.getElementById('app')); + +Resolver.resolve(() => { + return ( + + ); +}).then(({ data, Resolved }) => { + expect(data).toBe('World'); +}); diff --git a/types/react-resolver/tsconfig.json b/types/react-resolver/tsconfig.json new file mode 100644 index 0000000000..f16bd3453a --- /dev/null +++ b/types/react-resolver/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6", + "dom" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react" + }, + "files": [ + "index.d.ts", + "test.tsx" + ] +} diff --git a/types/react-resolver/tslint.json b/types/react-resolver/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/react-resolver/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }