simonireilly / compeller

A strong typescript binding for your OpenAPI Schema that doesn't need generation and is not prescriptive in coding style
MIT License
22 stars 1 forks source link

feat: plugs and adapters #8

Open simonireilly opened 2 years ago

simonireilly commented 2 years ago

When need to allow for different request/response formats.

In general, we could have two scenario's:

Adapters

Option 1

We could configure the response adapter like:

const api = compeller(spec, {
  adapter: 'apigateway'
});

const { request, response } = api('/api/v1/line-items/{id}', 'get')

Option 2

Design an interface.

If we will hand off the interfaces of statusCode, body?, headers? then we can allow for an adapter to be written like:

const responder = (
  statusCode: number, 
  body: Record<string, unknown> = {}, 
  headers: Record<string, unknown> = {}
) => ({
  statusCode,
  body: JSON.stringify(body),
  headers
})

const api = compeller(spec, {
  responder,
});

const { request, response } = api('/api/v1/line-items/{id}', 'get')
simonireilly commented 2 years ago

The interface option was added in #27

Its stable enough for now, but types are not propagated out of the responder, and this needs to be improved so that schema types from responder can then we passed on e.g.

const response = responder('200', { name: 'simon'})

return {
  // Currently response is not typed :cry: 
  ...response,
  headers: {
    'x-additional-header': 'not-worth-injection'
  }
}