A wrapper to provide CORS support to a Whook server
npm install @whook/cors[//]: # ( )
[//]: # (This file is automatically generated by a metapak)
[//]: # (module. Do not change it except between the)
[//]: # (content:start/end flags, your changes would)
[//]: # (be overridden.)
[//]: # ( )

[//]: # (::contents:start)
This Whook wrapper provides CORS support
by adding it to your OpenAPI file and creating the routes that runs the OPTIONS
method when you cannot do it at the proxy/gateway level.
To use this plugin, simply install it:
``sh`
npm i @whook/cors;
Declare it in the src/index.ts file of your project:
`diff
// ...
$.register(
constant('ROUTES_WRAPPERS_NAMES', [
+ 'wrapRouteHandlerWithCORS',
'wrapRouteHandlerWithAuthorization',
]),
);
// ...
$.register(
constant('WHOOK_PLUGINS', [
...WHOOK_DEFAULT_PLUGINS,
+ '@whook/cors',
'@whook/authorization',
]),
);
// ...
`
Declare types in your src/whook.d.ts definition:
`diff
+ import {
+ type WhookCORSConfig,
+ type WhookCORSRouteConfig,
+ } from '@whook/cors';
declare module 'application-services' {
// ...
export interface AppConfig
- extends WhookBaseConfigs {}
+ extends WhookBaseConfigs, WhookCORSConfig {}
// ...
}
// ...
declare module '@whook/whook' {
export interface WhookRouteConfig
- extends WhookBaseRouteConfig {}
+ extends WhookBaseRouteConfig,
+ WhookCORSRouteConfig {}
}
`
And add the CORS config (usually in src/config/common/config.js):
`diff
// ...
import { type AppConfig } from 'application-services';
const CONFIG: AppConfig = {
// ...
+ CORS: {
+ 'Access-Control-Allow-Origin': '*',
+ 'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIONS',
+ 'Access-Control-Allow-Headers': [
+ 'Accept',
+ 'Accept-Encoding',
+ 'Accept-Language',
+ 'Referrer',
+ 'Content-Type',
+ 'Content-Encoding',
+ 'Authorization',
+ 'Keep-Alive',
+ 'User-Agent',
+ ].join(','),
+ },
};
export default CONFIG;
`
You should also use the wrapped error handler:
`diff
+ import {
+ initErrorHandlerWithCORS,
+ wrapDefinitionsWithCORS,
+} from '@whook/cors';
// ...
export async function prepareEnvironment
$: T = new Knifecycle() as T,
): Promise
//...
+ // Wrap the definitions for CORS
+ $.register(wrapDefinitionsWithCORS(initDefinitions));
+ // Add the CORS wrapped error handler
+ $.register(initErrorHandlerWithCORS);
return $;
}
`
According to the kind of build you use, you may also declare it in your
src/build.ts file:
`diff`
$.register(
constant('INITIALIZER_PATH_MAP', {
...DEFAULT_BUILD_INITIALIZER_PATH_MAP,
// MY_SERVICE: '@my/service_module_name',
jwtToken: 'jwt-service/dist/index.js',
+ errorHandler: '@whook/cors/dist/services/errorHandler.js',
}),
);
To see a real example have a look at the
@whook/example.
Note that you can define individual CORS values on the handler definitions usins
the x-whook` property.
[//]: # (::contents:end)
Promise.<Object>Augment an OpenAPI to also serve OPTIONS methods with
the CORS added.
Promise.<Object>A simple Whook handler that just returns a 200 OK
HTTP response
Promise.<Object>Wrap the error handler service as a last chance to add CORS
Promise.<Object>Wrap a route handler to append CORS to response.
Promise.<Object>Kind: global function
Returns: Promise.<Object> - The augmented OpenAPI object
| Param | Type | Description |
| --- | --- | --- |
| API | Object | The OpenAPI object |
Promise.<Object>Kind: global function
Returns: Promise.<Object> - The HTTP response object
Promise.<Object>Kind: global function
Returns: Promise.<Object> - A promise of an object containing the reshaped env vars.
| Param | Type | Default | Description |
| --- | --- | --- | --- |
| services | Object | | The services depended on |
| services.CORS | Object | | A CORS object to be added to errors responses |
| [services.log] | Object | noop | An optional logging service |
Promise.<Object>Kind: global function
Returns: Promise.<Object> - A promise of an object containing the reshaped env vars.
| Param | Type | Default | Description |
| --- | --- | --- | --- |
| services | Object | | The services ENV depends on |
| services.CORS | Object | | A CORS object to be added to errors responses |
| [services.log] | Object | noop | An optional logging service |