compeller icon indicating copy to clipboard operation
compeller copied to clipboard

feat: plugs and adapters

Open simonireilly opened this issue 3 years ago • 1 comments

When need to allow for different request/response formats.

In general, we could have two scenario's:

  • [ ] #34
  • [x] #35

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 avatar Jan 26 '22 06:01 simonireilly

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'
  }
}

simonireilly avatar Jan 28 '22 18:01 simonireilly