Skip to content

Commit fa25c41

Browse files
authored
fix: BuildCompilerFromPool function overloading type errors (#159)
1 parent 05e59bb commit fa25c41

File tree

2 files changed

+73
-18
lines changed

2 files changed

+73
-18
lines changed

types/index.d.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,19 @@ type SharedCompilerOptions = {
1313
onCreate?: (ajvInstance: Ajv) => void;
1414
plugins?: (Plugin<unknown> | [Plugin<unknown>, unknown])[];
1515
}
16+
type JdtCompilerOptions = SharedCompilerOptions & {
17+
mode: 'JTD';
18+
customOptions?: JTDOptions
19+
}
20+
type AjvCompilerOptions = SharedCompilerOptions & {
21+
mode?: never;
22+
customOptions?: AjvOptions
23+
}
1624

17-
type BuildAjvJtdCompilerFromPool = (externalSchemas: { [key: string]: AnySchema | AnySchema[] }, options?: SharedCompilerOptions & { mode: 'JTD'; customOptions?: JTDOptions }) => AjvCompile
18-
type BuildAjvCompilerFromPool = (externalSchemas: { [key: string]: AnySchema | AnySchema[] }, options?: SharedCompilerOptions & { mode?: never; customOptions?: AjvOptions }) => AjvCompile
25+
type BuildAjvOrJdtCompilerFromPool = (
26+
externalSchemas: { [key: string]: AnySchema | AnySchema[] },
27+
options?: JdtCompilerOptions | AjvCompilerOptions
28+
) => AjvCompile
1929

2030
type BuildJtdSerializerFromPool = (externalSchemas: any, serializerOpts?: { mode?: never; } & JTDOptions) => AjvJTDCompile
2131

@@ -30,7 +40,7 @@ declare namespace AjvCompiler {
3040

3141
export type BuildSerializerFromPool = BuildJtdSerializerFromPool
3242

33-
export type BuildCompilerFromPool = BuildAjvCompilerFromPool & BuildAjvJtdCompilerFromPool
43+
export type BuildCompilerFromPool = BuildAjvOrJdtCompilerFromPool
3444

3545
export const AjvReference: Symbol
3646

types/index.test-d.ts

Lines changed: 60 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { AnySchemaObject, ValidateFunction } from 'ajv'
22
import { AnyValidateFunction } from 'ajv/dist/core'
33
import { expectAssignable, expectType } from 'tsd'
44
import AjvCompiler, { AjvReference, ValidatorFactory, StandaloneValidator, RouteDefinition, ErrorObject, BuildCompilerFromPool, BuildSerializerFromPool, ValidatorCompiler } from '..'
5+
import type Ajv from 'ajv'
56

67
{
78
const compiler = AjvCompiler({})
@@ -228,30 +229,74 @@ expectType<Symbol>(AjvReference)
228229
// Plugins
229230
{
230231
const factory = AjvCompiler()
232+
const compilerFactoryParams = {
233+
customOptions: {},
234+
plugins: [
235+
(ajv: Ajv) => {
236+
expectType<Ajv>(ajv)
237+
return ajv
238+
},
239+
(ajv: Ajv, options: unknown) => {
240+
expectType<Ajv>(ajv)
241+
expectType<unknown>(options)
242+
return ajv
243+
}
244+
]
245+
}
246+
expectAssignable<Parameters<BuildCompilerFromPool>>([{}, compilerFactoryParams])
247+
231248
const compiler = factory({}, {
249+
customOptions: {},
232250
plugins: [
233251
(ajv) => {
234-
expectType<import('ajv').default>(ajv)
252+
expectType<Ajv>(ajv)
235253
return ajv
236254
},
237255
(ajv, options) => {
238-
expectType<import('ajv').default>(ajv)
256+
expectType<Ajv>(ajv)
239257
expectType<unknown>(options)
240258
return ajv
241-
},
242-
[
243-
(ajv) => {
244-
expectType<import('ajv').default>(ajv)
245-
return ajv
246-
}, ['keyword1', 'keyword2']
247-
],
248-
[
249-
(ajv) => {
250-
expectType<import('ajv').default>(ajv)
251-
return ajv
252-
}, [{ key: 'value' }]
253-
],
259+
}
254260
]
255261
})
256262
expectAssignable<ValidatorCompiler>(compiler)
257263
}
264+
// Compiler factory should allow both signatures (mode: JTD and mode omitted)
265+
{
266+
expectAssignable<Parameters<BuildCompilerFromPool>>([{}, {}])
267+
268+
const ajvPlugin = (ajv: Ajv): Ajv => {
269+
expectType<Ajv>(ajv)
270+
return ajv
271+
}
272+
expectAssignable<Parameters<BuildCompilerFromPool>>([{}, { plugins: [ajvPlugin] }])
273+
274+
expectAssignable<Parameters<BuildCompilerFromPool>>([{}, {
275+
mode: 'JTD',
276+
customOptions: {
277+
removeAdditional: 'all'
278+
},
279+
plugins: [ajvPlugin]
280+
}])
281+
282+
expectAssignable<Parameters<BuildCompilerFromPool>>([{}, {
283+
mode: 'JTD',
284+
customOptions: {
285+
removeAdditional: 'all'
286+
},
287+
plugins: [[ajvPlugin, ['string1', 'string2']]]
288+
}])
289+
290+
expectAssignable<Parameters<BuildCompilerFromPool>>([{}, {
291+
plugins: [
292+
ajvPlugin,
293+
(ajv: Ajv, options: unknown): Ajv => {
294+
expectType<Ajv>(ajv)
295+
expectType<unknown>(options)
296+
return ajv
297+
},
298+
[ajvPlugin, ['keyword1', 'keyword2']],
299+
[ajvPlugin, [{ key: 'value' }]],
300+
]
301+
}])
302+
}

0 commit comments

Comments
 (0)