diff --git a/packages/schema/package.json b/packages/schema/package.json index 0bcafffb..670e36c9 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -1,7 +1,7 @@ { "name": "@apimatic/schema", "author": "APIMatic Ltd.", - "version": "0.7.6", + "version": "0.7.7", "license": "MIT", "sideEffects": false, "main": "lib/index.js", diff --git a/packages/schema/src/types/numberEnum.ts b/packages/schema/src/types/numberEnum.ts index bb9352a3..83e55653 100644 --- a/packages/schema/src/types/numberEnum.ts +++ b/packages/schema/src/types/numberEnum.ts @@ -1,27 +1,36 @@ import { Schema } from '../schema'; import { + isNumericString, coerceNumericStringToNumber, createSymmetricSchema, - isNumericString, toValidator, } from '../utils'; function createEnumChecker( - enumVariable: { [key in T]: TEnumValue } + enumVariable: { [key in T]: TEnumValue }, + allowForUnknownProps: boolean = false ) { const enumValues = Object.values(enumVariable); - return (value: unknown): value is TEnumValue => - isNumericString(value) && - enumValues.includes(coerceNumericStringToNumber(value)); + + if (allowForUnknownProps) { + return (value: unknown): value is TEnumValue => isNumericString(value); + } else { + return (value: unknown): value is TEnumValue => + isNumericString(value) && + enumValues.includes(coerceNumericStringToNumber(value)); + } } /** * Create a schema for a number enumeration. */ export function numberEnum( - enumVariable: { [key in T]: TEnumValue } + enumVariable: { [key in T]: TEnumValue }, + allowForUnknownProps: boolean = false ): Schema { - const validate = toValidator(createEnumChecker(enumVariable)); + const validate = toValidator( + createEnumChecker(enumVariable, allowForUnknownProps) + ); return createSymmetricSchema({ type: `Enum<${Object.values(enumVariable) diff --git a/packages/schema/src/types/stringEnum.ts b/packages/schema/src/types/stringEnum.ts index 430bddf7..0b935cc3 100644 --- a/packages/schema/src/types/stringEnum.ts +++ b/packages/schema/src/types/stringEnum.ts @@ -7,20 +7,29 @@ import { } from '../utils'; function createEnumChecker( - enumVariable: { [key in T]: TEnumValue } + enumVariable: { [key in T]: TEnumValue }, + allowForUnknownProps: boolean = false ) { const enumValues = Object.values(enumVariable); - return (value: unknown): value is TEnumValue => - typeof value === 'string' && enumValues.includes(value); + + if (allowForUnknownProps) { + return (value: unknown): value is TEnumValue => typeof value === 'string'; + } else { + return (value: unknown): value is TEnumValue => + typeof value === 'string' && enumValues.includes(value as TEnumValue); + } } /** * Create a schema for a string enumeration. */ export function stringEnum( - enumVariable: { [key in T]: TEnumValue } + enumVariable: { [key in T]: TEnumValue }, + allowForUnknownProps: boolean = false ): Schema { - const validate = toValidator(createEnumChecker(enumVariable)); + const validate = toValidator( + createEnumChecker(enumVariable, allowForUnknownProps) + ); return createSymmetricSchema({ type: `Enum<${Object.values(enumVariable).map(literalToString).join(',')}>`, diff --git a/packages/schema/test/types/numberSchema.test.ts b/packages/schema/test/types/numberSchema.test.ts index f99f86a8..99afc40f 100644 --- a/packages/schema/test/types/numberSchema.test.ts +++ b/packages/schema/test/types/numberSchema.test.ts @@ -8,6 +8,26 @@ describe('Number Enum', () => { Diamonds, } describe('Mapping', () => { + it('should map unknown numeric value in enum', () => { + const input = 5; + const output = validateAndMap( + input as any, + numberEnum(SampleNumberEnum, true) + ); + expect(output.errors).toBeFalsy(); + expect((output as any).result).toBe(5); + }); + + it('should map unknown numeric string value in enum', () => { + const input = '5'; + const output = validateAndMap( + input as any, + numberEnum(SampleNumberEnum, true) + ); + expect(output.errors).toBeFalsy(); + expect((output as any).result).toBe(5); + }); + it('should map enum', () => { const input = 0; const output = validateAndMap(input as any, numberEnum(SampleNumberEnum)); diff --git a/packages/schema/test/types/stringEnum.test.ts b/packages/schema/test/types/stringEnum.test.ts index 2f8484a2..258096f5 100644 --- a/packages/schema/test/types/stringEnum.test.ts +++ b/packages/schema/test/types/stringEnum.test.ts @@ -8,6 +8,16 @@ describe('String Enum', () => { Diamonds = '_diamonds', } describe('Mapping', () => { + it('should map unknown string value in enum', () => { + const input = 'unknown'; + const output = validateAndMap( + input as any, + stringEnum(SampleStringEnum, true) + ); + expect(output.errors).toBeFalsy(); + expect((output as any).result).toBe('unknown'); + }); + it('should map enum', () => { const input = '_hearts'; const output = validateAndMap(input as any, stringEnum(SampleStringEnum));