diff --git a/rest/rest-tests.ts b/rest/rest-tests.ts index b19416c11..be3887246 100644 --- a/rest/rest-tests.ts +++ b/rest/rest-tests.ts @@ -1,8 +1,24 @@ /// +import when = require('when'); import rest = require('rest'); + +import defaultRequest = require('rest/interceptor/defaultRequest'); +import hateoas = require('rest/interceptor/hateoas'); +import location = require('rest/interceptor/location'); import mime = require('rest/interceptor/mime'); +import pathPrefix = require('rest/interceptor/pathPrefix'); +import basicAuth = require('rest/interceptor/basicAuth'); +import oAuth = require('rest/interceptor/oAuth'); +import csrf = require('rest/interceptor/csrf'); import errorCode = require('rest/interceptor/errorCode'); +import retry = require('rest/interceptor/retry'); +import timeout = require('rest/interceptor/timeout'); +import jsonp = require('rest/interceptor/jsonp'); +import xdomain = require('rest/interceptor/ie/xdomain'); +import xhr = require('rest/interceptor/ie/xhr'); + +import interceptor = require('rest/interceptor'); import registry = require('rest/mime/registry'); rest('/').then(function(response) { @@ -38,3 +54,53 @@ registry.register('application/vnd.com.example', { } }); +var noop = interceptor({ + init: (config: any) => { + return config; + }, + request: (request: rest.Request, config: any, meta: rest.Meta) => { + return request; + }, + response: (response: rest.Response, config: any, meta: rest.Meta) => { + return response; + }, + success: (response: rest.Response, config: any, meta: rest.Meta) => { + return response; + }, + error: (response: rest.Response, config: any, meta: rest.Meta) => { + return response; + } +}); + +var fail = interceptor({ + success: (response: rest.Response) => when.reject(response), +}); + +var succeed = interceptor({ + error: (response: rest.Response) => when(response), +}); + +var defaulted = interceptor({ + init: (config: any) => { + config.prop = config.prop || 'default-value'; + return config; + }, +}); + +client = rest + .wrap(defaultRequest) + .wrap(hateoas) + .wrap(location) + .wrap(mime) + .wrap(pathPrefix) + .wrap(basicAuth) + .wrap(oAuth) + .wrap(csrf) + .wrap(errorCode) + .wrap(retry) + .wrap(timeout) + .wrap(jsonp) + .wrap(xdomain) + .wrap(xhr) + .wrap(noop) + .wrap(fail); diff --git a/rest/rest.d.ts b/rest/rest.d.ts index 3bec656c3..d8126b72d 100644 --- a/rest/rest.d.ts +++ b/rest/rest.d.ts @@ -59,9 +59,108 @@ declare module "rest" { skip(): Client; wrap(interceptor: Interceptor, config?: any): Client; } + + export interface Meta { + client: Client; + arguments: any; + } } } +declare module "rest/interceptor" { + import when = require("when"); + import rest = require("rest"); + + function interceptor(config: interceptor.Config): rest.Interceptor; + function interceptor(config: interceptor.PromiseConfig): rest.Interceptor; + + module interceptor { + // TODO: These two configs should be merged to use union output types. + + interface Config { + init?: (config: any) => any; + request?: (request: rest.Request, config: any, meta: rest.Meta) => rest.Request; + response?: (response: rest.Response, config: any, meta: rest.Meta) => rest.Response; + success?: (response: rest.Response, config: any, meta: rest.Meta) => rest.Response; + error?: (response: rest.Response, config: any, meta: rest.Meta) => rest.Response; + } + + interface PromiseConfig { + init?: (config: any) => any; + request?: (request: rest.Request, config: any, meta: rest.Meta) => when.Promise; + response?: (response: rest.Response, config: any, meta: rest.Meta) => when.Promise; + success?: (response: rest.Response, config: any, meta: rest.Meta) => when.Promise; + error?: (response: rest.Response, config: any, meta: rest.Meta) => when.Promise; + } + } + + export = interceptor; +} + +declare module "rest/interceptor/defaultRequest" { + import rest = require("rest"); + + var defaultRequest: rest.Interceptor; + + export = defaultRequest; +} + +declare module "rest/interceptor/hateoas" { + import rest = require("rest"); + + var hateoas: rest.Interceptor; + + export = hateoas; +} + +declare module "rest/interceptor/location" { + import rest = require("rest"); + + var location: rest.Interceptor; + + export = location; +} + +declare module "rest/interceptor/mime" { + import rest = require("rest"); + + var mime: rest.Interceptor; + + export = mime; +} + +declare module "rest/interceptor/pathPrefix" { + import rest = require("rest"); + + var pathPrefix: rest.Interceptor; + + export = pathPrefix; +} + +declare module "rest/interceptor/basicAuth" { + import rest = require("rest"); + + var basicAuth: rest.Interceptor; + + export = basicAuth; +} + +declare module "rest/interceptor/oAuth" { + import rest = require("rest"); + + var oAuth: rest.Interceptor; + + export = oAuth; +} + +declare module "rest/interceptor/csrf" { + import rest = require("rest"); + + var csrf: rest.Interceptor; + + export = csrf; +} + declare module "rest/interceptor/errorCode" { import rest = require("rest"); @@ -70,12 +169,44 @@ declare module "rest/interceptor/errorCode" { export = errorCode; } -declare module "rest/interceptor/mime" { +declare module "rest/interceptor/retry" { import rest = require("rest"); - var mime: rest.Interceptor; + var retry: rest.Interceptor; - export = mime; + export = retry; +} + +declare module "rest/interceptor/timeout" { + import rest = require("rest"); + + var timeout: rest.Interceptor; + + export = timeout; +} + +declare module "rest/interceptor/jsonp" { + import rest = require("rest"); + + var jsonp: rest.Interceptor; + + export = jsonp; +} + +declare module "rest/interceptor/ie/xdomain" { + import rest = require("rest"); + + var xdomain: rest.Interceptor; + + export = xdomain; +} + +declare module "rest/interceptor/ie/xhr" { + import rest = require("rest"); + + var xhr: rest.Interceptor; + + export = xhr; } declare module "rest/mime/registry" {