typescript
typescript copied to clipboard
CORS config TS types (both here and in @types) don't match the schema
I ran into https://github.com/serverless/serverless/issues/9858 because the TS types don't have an accurate type for HttpCors.
Here's the schema: https://github.com/serverless/serverless/blob/ef5a8faf13a8fbf8564e7c0621e88d1ea5357ea5/lib/plugins/aws/package/compile/events/apiGateway/index.js#L77-L98
The current type in this repo is essentially a no-op. https://github.com/serverless/typescript/blob/b700b729a0ad15aac0a6ed9dc146047a2a7aa583/index.d.ts#L190-L199
The current type in @types/serverless is incomplete (missing origin and methods properties) and inaccurate (one of origin or origins is required, not optional, making it easy to run into https://github.com/serverless/serverless/issues/9858). Also, all the optional properties have | undefined appended which AFAIK is redundant and unnecessary.
The actual types should be something like this:
type HttpCors =
(
| { origins: string | string[]; origin?: undefined }
| { origin: string; origins?: undefined }
) & {
headers?: string | string[];
allowCredentials?: boolean;
maxAge?: number;
cacheControl?: string;
methods?: string[];
};
or this
interface HttpCorsBase {
headers?: string | string[];
allowCredentials?: boolean;
maxAge?: number;
cacheControl?: string;
methods?: string[];
};
interface HttpCorsOrigin extends HttpCorsBase {
origin: string;
origins?: undefined;
}
interface HttpCorsOrigins extends HttpCorsBase {
origins: string | string[];
origin?: undefined;
}
interface Http {
path: string;
method: string;
cors?: boolean | HttpCorsOrigin | HttpCorsOrigins | undefined;
...
Thanks for pointing out this issue @justingrant .
Types from this repository are auto-generated from schema located in https://github.com/serverless/serverless. The library handling the type generation is struggling with the oneOf keyword located in the required section of the CORS schema. Once it is removed, chances are next type generation will be much more accurate.
I tried removing this oneOf property to give it a try and actually got correctly generated types

I tried removing this
oneOfproperty to give it a try and actually got correctly generated types
Those types don't actually look correct:
- One of
originororiginsis required or validation will fail (serverless/serverless#9858) - If I remember correctly,
headers(and maybemethodstoo?) accepts a comma-delimitedstringas well as astring[] integration?: string | string | string | string ...is that missing the string enum values?
I've also just come across this. In my case, I'm interested in the exposedResponseHeaders property that is available in the YAML configuration but not in the TypeScript equivalent:
provider:
httpApi:
cors:
allowedOrigins:
- https://url1.com
- https://url2.com
allowedHeaders:
- Content-Type
- Authorization
allowedMethods:
- GET
allowCredentials: true
exposedResponseHeaders:
- Special-Response-Header
maxAge: 6000 # In seconds
(from https://www.serverless.com/blog/aws-http-api-support#configuring-cors).
I notice that exposedResponseHeaders is not listed as a valid property in the CORS schema. Is there a reason for that?
Hi @ed-graham, the exposedResponseHeaders property is available in the typescript definition from this repository in https://github.com/serverless/typescript/blob/bc84be8ef13ab8cf5292c82b4d27303adceda58b/index.d.ts#L821
The documentation you're referring to is for httpApi event types, that are provisioned with API Gateway HTTP API.
However the code base containing CORS schema you're referring to is for http event types, that are provisioned with API Gateway Rest API. Those are not the same and does not share the same capabilities.
Thanks @fredericbarthelet - that's really helpful! I didn't realise I had the two things mixed up. It turns out that I was still using the old community-maintained Definitely Typed package rather than your new one: so now I've upgraded and everything is working as expected.