From 279eaeecac9bce0476012b6510dc374f30e3663b Mon Sep 17 00:00:00 2001 From: George Pickering <29524044+geopic@users.noreply.github.com> Date: Tue, 11 Aug 2020 17:39:53 +0100 Subject: [PATCH] Add types declaration file with unit tests --- lib/cors-anywhere.d.ts | 82 ++++++++++++++++++++++++++++++++++++++++++ package.json | 3 +- test/test-types.js | 25 +++++++++++++ 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 lib/cors-anywhere.d.ts create mode 100644 test/test-types.js diff --git a/lib/cors-anywhere.d.ts b/lib/cors-anywhere.d.ts new file mode 100644 index 00000000..a0737524 --- /dev/null +++ b/lib/cors-anywhere.d.ts @@ -0,0 +1,82 @@ +declare module 'cors-anywhere' { + import { Server } from 'http'; + + export function createServer(options?: Partial<{ + /** + * If set, specifies which intermediate proxy to use for a given URL. If the return + * value is void, a direct request is sent. The default implementation is + * `proxy-from-env`, which respects the standard proxy environment variables (e.g. + * `https_proxy`, `no_proxy`, etc.). + */ + getProxyForUrl: (url: string | object) => string; + + /** + * Maximum number of redirects to be followed. + */ + maxRedirects: number; + + /** + * If set, requests whose origin is listed are blocked. + */ + originBlacklist: string[]; + + /** + * If set, requests whose origin is not listed are blocked. If this list is empty, + * all origins are allowed. + */ + originWhitelist: string[]; + + /** + * If set, it is called with the origin (string) of the request. + * If this function returns a non-empty string, the request is rejected and the + * string is send to the client. + */ + checkRateLimit: (origin: string) => string; + + /** + * If true, requests to URLs from the same origin will not be proxied but redirected. + * The primary purpose for this option is to save server resources by delegating the + * request to the client (since same-origin requests should always succeed, even + * without proxying). + */ + redirectSameOrigin: boolean; + + /** + * If set, the request must include this header or the API will refuse to proxy. + * Recommended if you want to prevent users from using the proxy for normal browsing. + */ + requireHeader: string[]; + + /** + * Exclude certain headers from being included in the request. + */ + removeHeaders: string[]; + + /** + * Set headers for the request (overwrites existing ones). + */ + setHeaders: {[key: string]: string}; + + /** + * If set, an Access-Control-Max-Age header with this value (in seconds) will be added. + */ + corsMaxAge: number; + + /** + * Set the help file (shown at the homepage). + */ + helpFile: string; + + /** + * Under the hood, `http-proxy` is used to proxy requests. Use this option if you really + * need to pass options to `http-proxy`. + */ + httpProxyOptions: object; + + /** + * If set, a `https.Server` will be created. The given options are passed to the + * `https.createServer` method. + */ + httpsOptions: object; + }>): Server; +} diff --git a/package.json b/package.json index ec8ac613..a6c4bb7b 100644 --- a/package.json +++ b/package.json @@ -47,5 +47,6 @@ }, "engines": { "node": ">=0.10.0" - } + }, + "types": "./lib/cors-anywhere.d.ts" } diff --git a/test/test-types.js b/test/test-types.js new file mode 100644 index 00000000..12daf20e --- /dev/null +++ b/test/test-types.js @@ -0,0 +1,25 @@ +/* eslint-env mocha */ + +var createServer = require('../').createServer; +var assert = require('chai').assert; + +describe('Conformity between library and types file', function() { + it('aligns with types file', function() { + assert.doesNotThrow(function() { + createServer(); + createServer({getProxyForUrl: function(str) { return str.toLowerCase(); }}); + createServer({maxRedirects: 5}); + createServer({originBlacklist: ['hello', 'world']}); + createServer({originWhitelist: ['hello', 'world']}); + createServer({checkRateLimit: function(str) { return str.toLowerCase(); }}); + createServer({redirectSameOrigin: false}); + createServer({requireHeader: ['hello', 'world']}); + createServer({removeHeaders: ['hello', 'world']}); + createServer({setHeaders: {'hello': 'world'}}); + createServer({corsMaxAge: 5}); + createServer({helpFile: 'hello'}); + createServer({httpProxyOptions: {}}); + createServer({httpsOptions: {}}); + }); + }); +});