Skip to content

Commit

Permalink
fix: lowercase type-providers headers types (#4928)
Browse files Browse the repository at this point in the history
* fix: lowercase type-providers headers types

* test: lowercase type-providers headers types
  • Loading branch information
toomuchdesign committed Jul 24, 2023
1 parent 5473ce3 commit 7b0f8ed
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 1 deletion.
56 changes: 56 additions & 0 deletions test/types/type-provider.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,62 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().get(
}
))

// -------------------------------------------------------------------
// Request headers
// -------------------------------------------------------------------

// JsonSchemaToTsProvider
expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get(
'/',
{
schema: {
headers: {
type: 'object',
properties: {
lowercase: { type: 'string' },
UPPERCASE: { type: 'number' },
camelCase: { type: 'boolean' },
'KEBAB-case': { type: 'boolean' },
PRESERVE_OPTIONAL: { type: 'number' }
},
required: ['lowercase', 'UPPERCASE', 'camelCase', 'KEBAB-case']
} as const
}
},
(req) => {
expectType<string>(req.headers.lowercase)
expectType<string | string[] | undefined>(req.headers.UPPERCASE)
expectType<number>(req.headers.uppercase)
expectType<boolean>(req.headers.camelcase)
expectType<boolean>(req.headers['kebab-case'])
expectType<number | undefined>(req.headers.preserve_optional)
}
))

// TypeBoxProvider
expectAssignable(server.withTypeProvider<TypeBoxProvider>().get(
'/',
{
schema: {
headers: Type.Object({
lowercase: Type.String(),
UPPERCASE: Type.Number(),
camelCase: Type.Boolean(),
'KEBAB-case': Type.Boolean(),
PRESERVE_OPTIONAL: Type.Optional(Type.Number())
})
}
},
(req) => {
expectType<string>(req.headers.lowercase)
expectType<string | string[] | undefined>(req.headers.UPPERCASE)
expectType<number>(req.headers.uppercase)
expectType<boolean>(req.headers.camelcase)
expectType<boolean>(req.headers['kebab-case'])
expectType<number | undefined>(req.headers.preserve_optional)
}
))

// -------------------------------------------------------------------
// TypeBox Reply Type
// -------------------------------------------------------------------
Expand Down
3 changes: 2 additions & 1 deletion types/type-provider.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { RouteGenericInterface } from './route'
import { FastifySchema } from './schema'
import { RecordKeysToLowercase } from './utils'

// -----------------------------------------------------------------------------------------------
// TypeProvider
Expand Down Expand Up @@ -51,7 +52,7 @@ export interface FastifyRequestType<Params = unknown, Querystring = unknown, Hea
export interface ResolveFastifyRequestType<TypeProvider extends FastifyTypeProvider, SchemaCompiler extends FastifySchema, RouteGeneric extends RouteGenericInterface> extends FastifyRequestType {
params: ResolveRequestParams<TypeProvider, SchemaCompiler, RouteGeneric>,
query: ResolveRequestQuerystring<TypeProvider, SchemaCompiler, RouteGeneric>,
headers: ResolveRequestHeaders<TypeProvider, SchemaCompiler, RouteGeneric>,
headers: RecordKeysToLowercase<ResolveRequestHeaders<TypeProvider, SchemaCompiler, RouteGeneric>>,
body: ResolveRequestBody<TypeProvider, SchemaCompiler, RouteGeneric>
}

Expand Down
9 changes: 9 additions & 0 deletions types/utils.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,12 @@ export type ReplyKeysToCodes<Key> = [Key] extends [never] ? number :
export type CodeToReplyKey<Code extends number> = `${Code}` extends `${infer FirstDigit extends CodeClasses}${number}`
? `${FirstDigit}xx`
: never;

export type RecordKeysToLowercase<Input> = Input extends Record<string, unknown>
? {
[Key in keyof Input as Key extends string
? Lowercase<Key>
: Key
]: Input[Key];
}
: Input;

0 comments on commit 7b0f8ed

Please sign in to comment.