@apideck/better-ajv-errors
Advanced tools
@@ -208,2 +208,13 @@ 'use strict'; | ||
| case 'const': | ||
| { | ||
| return { | ||
| message: "'" + prop + "' property must be equal to the allowed value", | ||
| path: path, | ||
| context: _extends({}, defaultContext, { | ||
| allowedValue: error.params.allowedValue | ||
| }) | ||
| }; | ||
| } | ||
| default: | ||
@@ -210,0 +221,0 @@ return { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"better-ajv-errors.cjs.development.js","sources":["../src/constants.ts","../src/lib/filter.ts","../src/lib/suggestions.ts","../src/lib/utils.ts","../src/index.ts"],"sourcesContent":["import { DefinedError } from 'ajv';\n\nexport const AJV_ERROR_KEYWORD_WEIGHT_MAP: Partial<Record<DefinedError['keyword'], number>> = {\n enum: 1,\n type: 0,\n};\n\nexport const QUOTES_REGEX = /\"/g;\nexport const NOT_REGEX = /NOT/g;\nexport const SLASH_REGEX = /\\//g;\n","import { DefinedError } from 'ajv';\nimport { AJV_ERROR_KEYWORD_WEIGHT_MAP } from '../constants';\n\nexport const filterSingleErrorPerProperty = (errors: DefinedError[]): DefinedError[] => {\n const errorsPerProperty = errors.reduce<Record<string, DefinedError>>((acc, error) => {\n const prop =\n error.instancePath + ((error.params as any)?.additionalProperty ?? (error.params as any)?.missingProperty ?? '');\n const existingError = acc[prop];\n if (!existingError) {\n acc[prop] = error;\n return acc;\n }\n const weight = AJV_ERROR_KEYWORD_WEIGHT_MAP[error.keyword] ?? 0;\n const existingWeight = AJV_ERROR_KEYWORD_WEIGHT_MAP[existingError.keyword] ?? 0;\n\n if (weight > existingWeight) {\n acc[prop] = error;\n }\n return acc;\n }, {});\n\n return Object.values(errorsPerProperty);\n};\n","import leven from 'leven';\n\nexport const getSuggestion = ({\n value,\n suggestions,\n format = (suggestion) => `Did you mean '${suggestion}'?`,\n}: {\n value: string;\n suggestions: string[];\n format?: (suggestion: string) => string;\n}): string => {\n const bestSuggestion = suggestions.reduce(\n (best, current) => {\n const distance = leven(value, current);\n if (best.distance > distance) {\n return { value: current, distance };\n }\n\n return best;\n },\n {\n distance: Infinity,\n value: '',\n }\n );\n\n return bestSuggestion.distance < value.length ? format(bestSuggestion.value) : '';\n};\n","import { NOT_REGEX, QUOTES_REGEX, SLASH_REGEX } from '../constants';\nimport pointer from 'jsonpointer';\n\nexport const pointerToDotNotation = (pointer: string): string => {\n return pointer.replace(SLASH_REGEX, '.');\n};\n\nexport const cleanAjvMessage = (message: string): string => {\n return message.replace(QUOTES_REGEX, \"'\").replace(NOT_REGEX, 'not');\n};\n\nexport const getLastSegment = (path: string): string => {\n const segments = path.split('/');\n return segments.pop() as string;\n};\n\nexport const safeJsonPointer = <T>({ object, pnter, fallback }: { object: any; pnter: string; fallback: T }): T => {\n try {\n return pointer.get(object, pnter);\n } catch (err) {\n return fallback;\n }\n};\n","import { DefinedError, ErrorObject } from 'ajv';\nimport type { JSONSchema6 } from 'json-schema';\nimport { ValidationError } from './types/ValidationError';\nimport { filterSingleErrorPerProperty } from './lib/filter';\nimport { getSuggestion } from './lib/suggestions';\nimport { cleanAjvMessage, getLastSegment, pointerToDotNotation, safeJsonPointer } from './lib/utils';\n\nexport interface BetterAjvErrorsOptions {\n errors: ErrorObject[] | null | undefined;\n data: any;\n schema: JSONSchema6;\n basePath?: string;\n}\n\nexport const betterAjvErrors = ({\n errors,\n data,\n schema,\n basePath = '{base}',\n}: BetterAjvErrorsOptions): ValidationError[] => {\n if (!Array.isArray(errors) || errors.length === 0) {\n return [];\n }\n\n const definedErrors = filterSingleErrorPerProperty(errors as DefinedError[]);\n\n return definedErrors.map((error) => {\n const path = pointerToDotNotation(basePath + error.instancePath);\n const prop = getLastSegment(error.instancePath);\n const defaultContext = {\n errorType: error.keyword,\n };\n const defaultMessage = `${prop ? `property '${prop}'` : path} ${cleanAjvMessage(error.message as string)}`;\n\n let validationError: ValidationError;\n\n switch (error.keyword) {\n case 'additionalProperties': {\n const additionalProp = error.params.additionalProperty;\n const suggestionPointer = error.schemaPath.replace('#', '').replace('/additionalProperties', '');\n const { properties } = safeJsonPointer({\n object: schema,\n pnter: suggestionPointer,\n fallback: { properties: {} },\n });\n validationError = {\n message: `'${additionalProp}' property is not expected to be here`,\n suggestion: getSuggestion({\n value: additionalProp,\n suggestions: Object.keys(properties ?? {}),\n format: (suggestion) => `Did you mean property '${suggestion}'?`,\n }),\n path,\n context: defaultContext,\n };\n break;\n }\n case 'enum': {\n const suggestions = error.params.allowedValues.map((value) => value.toString());\n const prop = getLastSegment(error.instancePath);\n const value = safeJsonPointer({ object: data, pnter: error.instancePath, fallback: '' });\n validationError = {\n message: `'${prop}' property must be equal to one of the allowed values`,\n suggestion: getSuggestion({\n value,\n suggestions,\n }),\n path,\n context: {\n ...defaultContext,\n allowedValues: error.params.allowedValues,\n },\n };\n break;\n }\n case 'type': {\n const prop = getLastSegment(error.instancePath);\n const type = error.params.type;\n validationError = {\n message: `'${prop}' property type must be ${type}`,\n path,\n context: defaultContext,\n };\n break;\n }\n case 'required': {\n validationError = {\n message: `${path} must have required property '${error.params.missingProperty}'`,\n path,\n context: defaultContext,\n };\n break;\n }\n\n default:\n return { message: defaultMessage, path, context: defaultContext };\n }\n\n // Remove empty properties\n const errorEntries = Object.entries(validationError);\n for (const [key, value] of errorEntries as [keyof ValidationError, unknown][]) {\n if (value === null || value === undefined || value === '') {\n delete validationError[key];\n }\n }\n\n return validationError;\n });\n};\n\nexport { ValidationError };\n"],"names":["AJV_ERROR_KEYWORD_WEIGHT_MAP","type","QUOTES_REGEX","NOT_REGEX","SLASH_REGEX","filterSingleErrorPerProperty","errors","errorsPerProperty","reduce","acc","error","prop","instancePath","params","additionalProperty","missingProperty","existingError","weight","keyword","existingWeight","Object","values","getSuggestion","value","suggestions","format","suggestion","bestSuggestion","best","current","distance","leven","Infinity","length","pointerToDotNotation","pointer","replace","cleanAjvMessage","message","getLastSegment","path","segments","split","pop","safeJsonPointer","object","pnter","fallback","get","err","betterAjvErrors","data","schema","basePath","Array","isArray","definedErrors","map","defaultContext","errorType","defaultMessage","validationError","additionalProp","suggestionPointer","schemaPath","properties","keys","context","allowedValues","toString","errorEntries","entries","key","undefined"],"mappings":"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"} | ||
| {"version":3,"file":"better-ajv-errors.cjs.development.js","sources":["../src/constants.ts","../src/lib/filter.ts","../src/lib/suggestions.ts","../src/lib/utils.ts","../src/index.ts"],"sourcesContent":["import { DefinedError } from 'ajv';\n\nexport const AJV_ERROR_KEYWORD_WEIGHT_MAP: Partial<Record<DefinedError['keyword'], number>> = {\n enum: 1,\n type: 0,\n};\n\nexport const QUOTES_REGEX = /\"/g;\nexport const NOT_REGEX = /NOT/g;\nexport const SLASH_REGEX = /\\//g;\n","import { DefinedError } from 'ajv';\nimport { AJV_ERROR_KEYWORD_WEIGHT_MAP } from '../constants';\n\nexport const filterSingleErrorPerProperty = (errors: DefinedError[]): DefinedError[] => {\n const errorsPerProperty = errors.reduce<Record<string, DefinedError>>((acc, error) => {\n const prop =\n error.instancePath + ((error.params as any)?.additionalProperty ?? (error.params as any)?.missingProperty ?? '');\n const existingError = acc[prop];\n if (!existingError) {\n acc[prop] = error;\n return acc;\n }\n const weight = AJV_ERROR_KEYWORD_WEIGHT_MAP[error.keyword] ?? 0;\n const existingWeight = AJV_ERROR_KEYWORD_WEIGHT_MAP[existingError.keyword] ?? 0;\n\n if (weight > existingWeight) {\n acc[prop] = error;\n }\n return acc;\n }, {});\n\n return Object.values(errorsPerProperty);\n};\n","import leven from 'leven';\n\nexport const getSuggestion = ({\n value,\n suggestions,\n format = (suggestion) => `Did you mean '${suggestion}'?`,\n}: {\n value: string;\n suggestions: string[];\n format?: (suggestion: string) => string;\n}): string => {\n const bestSuggestion = suggestions.reduce(\n (best, current) => {\n const distance = leven(value, current);\n if (best.distance > distance) {\n return { value: current, distance };\n }\n\n return best;\n },\n {\n distance: Infinity,\n value: '',\n }\n );\n\n return bestSuggestion.distance < value.length ? format(bestSuggestion.value) : '';\n};\n","import { NOT_REGEX, QUOTES_REGEX, SLASH_REGEX } from '../constants';\nimport pointer from 'jsonpointer';\n\nexport const pointerToDotNotation = (pointer: string): string => {\n return pointer.replace(SLASH_REGEX, '.');\n};\n\nexport const cleanAjvMessage = (message: string): string => {\n return message.replace(QUOTES_REGEX, \"'\").replace(NOT_REGEX, 'not');\n};\n\nexport const getLastSegment = (path: string): string => {\n const segments = path.split('/');\n return segments.pop() as string;\n};\n\nexport const safeJsonPointer = <T>({ object, pnter, fallback }: { object: any; pnter: string; fallback: T }): T => {\n try {\n return pointer.get(object, pnter);\n } catch (err) {\n return fallback;\n }\n};\n","import { DefinedError, ErrorObject } from 'ajv';\nimport type { JSONSchema6 } from 'json-schema';\nimport { ValidationError } from './types/ValidationError';\nimport { filterSingleErrorPerProperty } from './lib/filter';\nimport { getSuggestion } from './lib/suggestions';\nimport { cleanAjvMessage, getLastSegment, pointerToDotNotation, safeJsonPointer } from './lib/utils';\n\nexport interface BetterAjvErrorsOptions {\n errors: ErrorObject[] | null | undefined;\n data: any;\n schema: JSONSchema6;\n basePath?: string;\n}\n\nexport const betterAjvErrors = ({\n errors,\n data,\n schema,\n basePath = '{base}',\n}: BetterAjvErrorsOptions): ValidationError[] => {\n if (!Array.isArray(errors) || errors.length === 0) {\n return [];\n }\n\n const definedErrors = filterSingleErrorPerProperty(errors as DefinedError[]);\n\n return definedErrors.map((error) => {\n const path = pointerToDotNotation(basePath + error.instancePath);\n const prop = getLastSegment(error.instancePath);\n const defaultContext = {\n errorType: error.keyword,\n };\n const defaultMessage = `${prop ? `property '${prop}'` : path} ${cleanAjvMessage(error.message as string)}`;\n\n let validationError: ValidationError;\n\n switch (error.keyword) {\n case 'additionalProperties': {\n const additionalProp = error.params.additionalProperty;\n const suggestionPointer = error.schemaPath.replace('#', '').replace('/additionalProperties', '');\n const { properties } = safeJsonPointer({\n object: schema,\n pnter: suggestionPointer,\n fallback: { properties: {} },\n });\n validationError = {\n message: `'${additionalProp}' property is not expected to be here`,\n suggestion: getSuggestion({\n value: additionalProp,\n suggestions: Object.keys(properties ?? {}),\n format: (suggestion) => `Did you mean property '${suggestion}'?`,\n }),\n path,\n context: defaultContext,\n };\n break;\n }\n case 'enum': {\n const suggestions = error.params.allowedValues.map((value) => value.toString());\n const prop = getLastSegment(error.instancePath);\n const value = safeJsonPointer({ object: data, pnter: error.instancePath, fallback: '' });\n validationError = {\n message: `'${prop}' property must be equal to one of the allowed values`,\n suggestion: getSuggestion({\n value,\n suggestions,\n }),\n path,\n context: {\n ...defaultContext,\n allowedValues: error.params.allowedValues,\n },\n };\n break;\n }\n case 'type': {\n const prop = getLastSegment(error.instancePath);\n const type = error.params.type;\n validationError = {\n message: `'${prop}' property type must be ${type}`,\n path,\n context: defaultContext,\n };\n break;\n }\n case 'required': {\n validationError = {\n message: `${path} must have required property '${error.params.missingProperty}'`,\n path,\n context: defaultContext,\n };\n break;\n }\n case 'const': {\n return {\n message: `'${prop}' property must be equal to the allowed value`,\n path,\n context: {\n ...defaultContext,\n allowedValue: error.params.allowedValue,\n },\n };\n }\n\n default:\n return { message: defaultMessage, path, context: defaultContext };\n }\n\n // Remove empty properties\n const errorEntries = Object.entries(validationError);\n for (const [key, value] of errorEntries as [keyof ValidationError, unknown][]) {\n if (value === null || value === undefined || value === '') {\n delete validationError[key];\n }\n }\n\n return validationError;\n });\n};\n\nexport { ValidationError };\n"],"names":["AJV_ERROR_KEYWORD_WEIGHT_MAP","type","QUOTES_REGEX","NOT_REGEX","SLASH_REGEX","filterSingleErrorPerProperty","errors","errorsPerProperty","reduce","acc","error","prop","instancePath","params","additionalProperty","missingProperty","existingError","weight","keyword","existingWeight","Object","values","getSuggestion","value","suggestions","format","suggestion","bestSuggestion","best","current","distance","leven","Infinity","length","pointerToDotNotation","pointer","replace","cleanAjvMessage","message","getLastSegment","path","segments","split","pop","safeJsonPointer","object","pnter","fallback","get","err","betterAjvErrors","data","schema","basePath","Array","isArray","definedErrors","map","defaultContext","errorType","defaultMessage","validationError","additionalProp","suggestionPointer","schemaPath","properties","keys","context","allowedValues","toString","allowedValue","errorEntries","entries","key","undefined"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("leven")),r=e(require("jsonpointer"));function a(){return(a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e}).apply(this,arguments)}var n={enum:1,type:0},o=/"/g,s=/NOT/g,u=/\//g,i=function(e){var r=e.value,a=e.format,n=void 0===a?function(e){return"Did you mean '"+e+"'?"}:a,o=e.suggestions.reduce((function(e,a){var n=t(r,a);return e.distance>n?{value:a,distance:n}:e}),{distance:Infinity,value:""});return o.distance<r.length?n(o.value):""},l=function(e){return e.split("/").pop()},p=function(e){var t=e.object,a=e.pnter,n=e.fallback;try{return r.get(t,a)}catch(e){return n}};exports.betterAjvErrors=function(e){var t=e.errors,r=e.data,c=e.schema,d=e.basePath,v=void 0===d?"{base}":d;return Array.isArray(t)&&0!==t.length?function(e){var t=e.reduce((function(e,t){var r,a,o,s,u,i,l=t.instancePath+(null!=(r=null!=(a=null==(o=t.params)?void 0:o.additionalProperty)?a:null==(s=t.params)?void 0:s.missingProperty)?r:""),p=e[l];return p?((null!=(u=n[t.keyword])?u:0)>(null!=(i=n[p.keyword])?i:0)&&(e[l]=t),e):(e[l]=t,e)}),{});return Object.values(t)}(t).map((function(e){var t,n=function(e){return e.replace(u,".")}(v+e.instancePath),d=l(e.instancePath),y={errorType:e.keyword},f=(d?"property '"+d+"'":n)+" "+e.message.replace(o,"'").replace(s,"not");switch(e.keyword){case"additionalProperties":var g=e.params.additionalProperty,m=e.schemaPath.replace("#","").replace("/additionalProperties",""),h=p({object:c,pnter:m,fallback:{properties:{}}}).properties;t={message:"'"+g+"' property is not expected to be here",suggestion:i({value:g,suggestions:Object.keys(null!=h?h:{}),format:function(e){return"Did you mean property '"+e+"'?"}}),path:n,context:y};break;case"enum":var b=e.params.allowedValues.map((function(e){return e.toString()})),P=l(e.instancePath),j=p({object:r,pnter:e.instancePath,fallback:""});t={message:"'"+P+"' property must be equal to one of the allowed values",suggestion:i({value:j,suggestions:b}),path:n,context:a({},y,{allowedValues:e.params.allowedValues})};break;case"type":t={message:"'"+l(e.instancePath)+"' property type must be "+e.params.type,path:n,context:y};break;case"required":t={message:n+" must have required property '"+e.params.missingProperty+"'",path:n,context:y};break;default:return{message:f,path:n,context:y}}for(var k=0,w=Object.entries(t);k<w.length;k++){var x=w[k],O=x[1];null!=O&&""!==O||delete t[x[0]]}return t})):[]}; | ||
| "use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("leven")),r=e(require("jsonpointer"));function a(){return(a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e}).apply(this,arguments)}var n={enum:1,type:0},o=/"/g,s=/NOT/g,u=/\//g,l=function(e){var r=e.value,a=e.format,n=void 0===a?function(e){return"Did you mean '"+e+"'?"}:a,o=e.suggestions.reduce((function(e,a){var n=t(r,a);return e.distance>n?{value:a,distance:n}:e}),{distance:Infinity,value:""});return o.distance<r.length?n(o.value):""},i=function(e){return e.split("/").pop()},p=function(e){var t=e.object,a=e.pnter,n=e.fallback;try{return r.get(t,a)}catch(e){return n}};exports.betterAjvErrors=function(e){var t=e.errors,r=e.data,c=e.schema,d=e.basePath,v=void 0===d?"{base}":d;return Array.isArray(t)&&0!==t.length?function(e){var t=e.reduce((function(e,t){var r,a,o,s,u,l,i=t.instancePath+(null!=(r=null!=(a=null==(o=t.params)?void 0:o.additionalProperty)?a:null==(s=t.params)?void 0:s.missingProperty)?r:""),p=e[i];return p?((null!=(u=n[t.keyword])?u:0)>(null!=(l=n[p.keyword])?l:0)&&(e[i]=t),e):(e[i]=t,e)}),{});return Object.values(t)}(t).map((function(e){var t,n=function(e){return e.replace(u,".")}(v+e.instancePath),d=i(e.instancePath),y={errorType:e.keyword},m=(d?"property '"+d+"'":n)+" "+e.message.replace(o,"'").replace(s,"not");switch(e.keyword){case"additionalProperties":var f=e.params.additionalProperty,g=e.schemaPath.replace("#","").replace("/additionalProperties",""),h=p({object:c,pnter:g,fallback:{properties:{}}}).properties;t={message:"'"+f+"' property is not expected to be here",suggestion:l({value:f,suggestions:Object.keys(null!=h?h:{}),format:function(e){return"Did you mean property '"+e+"'?"}}),path:n,context:y};break;case"enum":var b=e.params.allowedValues.map((function(e){return e.toString()})),P=i(e.instancePath),w=p({object:r,pnter:e.instancePath,fallback:""});t={message:"'"+P+"' property must be equal to one of the allowed values",suggestion:l({value:w,suggestions:b}),path:n,context:a({},y,{allowedValues:e.params.allowedValues})};break;case"type":t={message:"'"+i(e.instancePath)+"' property type must be "+e.params.type,path:n,context:y};break;case"required":t={message:n+" must have required property '"+e.params.missingProperty+"'",path:n,context:y};break;case"const":return{message:"'"+d+"' property must be equal to the allowed value",path:n,context:a({},y,{allowedValue:e.params.allowedValue})};default:return{message:m,path:n,context:y}}for(var j=0,k=Object.entries(t);j<k.length;j++){var x=k[j],O=x[1];null!=O&&""!==O||delete t[x[0]]}return t})):[]}; | ||
| //# sourceMappingURL=better-ajv-errors.cjs.production.min.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"better-ajv-errors.cjs.production.min.js","sources":["../src/constants.ts","../src/lib/suggestions.ts","../src/lib/utils.ts","../src/index.ts","../src/lib/filter.ts"],"sourcesContent":["import { DefinedError } from 'ajv';\n\nexport const AJV_ERROR_KEYWORD_WEIGHT_MAP: Partial<Record<DefinedError['keyword'], number>> = {\n enum: 1,\n type: 0,\n};\n\nexport const QUOTES_REGEX = /\"/g;\nexport const NOT_REGEX = /NOT/g;\nexport const SLASH_REGEX = /\\//g;\n","import leven from 'leven';\n\nexport const getSuggestion = ({\n value,\n suggestions,\n format = (suggestion) => `Did you mean '${suggestion}'?`,\n}: {\n value: string;\n suggestions: string[];\n format?: (suggestion: string) => string;\n}): string => {\n const bestSuggestion = suggestions.reduce(\n (best, current) => {\n const distance = leven(value, current);\n if (best.distance > distance) {\n return { value: current, distance };\n }\n\n return best;\n },\n {\n distance: Infinity,\n value: '',\n }\n );\n\n return bestSuggestion.distance < value.length ? format(bestSuggestion.value) : '';\n};\n","import { NOT_REGEX, QUOTES_REGEX, SLASH_REGEX } from '../constants';\nimport pointer from 'jsonpointer';\n\nexport const pointerToDotNotation = (pointer: string): string => {\n return pointer.replace(SLASH_REGEX, '.');\n};\n\nexport const cleanAjvMessage = (message: string): string => {\n return message.replace(QUOTES_REGEX, \"'\").replace(NOT_REGEX, 'not');\n};\n\nexport const getLastSegment = (path: string): string => {\n const segments = path.split('/');\n return segments.pop() as string;\n};\n\nexport const safeJsonPointer = <T>({ object, pnter, fallback }: { object: any; pnter: string; fallback: T }): T => {\n try {\n return pointer.get(object, pnter);\n } catch (err) {\n return fallback;\n }\n};\n","import { DefinedError, ErrorObject } from 'ajv';\nimport type { JSONSchema6 } from 'json-schema';\nimport { ValidationError } from './types/ValidationError';\nimport { filterSingleErrorPerProperty } from './lib/filter';\nimport { getSuggestion } from './lib/suggestions';\nimport { cleanAjvMessage, getLastSegment, pointerToDotNotation, safeJsonPointer } from './lib/utils';\n\nexport interface BetterAjvErrorsOptions {\n errors: ErrorObject[] | null | undefined;\n data: any;\n schema: JSONSchema6;\n basePath?: string;\n}\n\nexport const betterAjvErrors = ({\n errors,\n data,\n schema,\n basePath = '{base}',\n}: BetterAjvErrorsOptions): ValidationError[] => {\n if (!Array.isArray(errors) || errors.length === 0) {\n return [];\n }\n\n const definedErrors = filterSingleErrorPerProperty(errors as DefinedError[]);\n\n return definedErrors.map((error) => {\n const path = pointerToDotNotation(basePath + error.instancePath);\n const prop = getLastSegment(error.instancePath);\n const defaultContext = {\n errorType: error.keyword,\n };\n const defaultMessage = `${prop ? `property '${prop}'` : path} ${cleanAjvMessage(error.message as string)}`;\n\n let validationError: ValidationError;\n\n switch (error.keyword) {\n case 'additionalProperties': {\n const additionalProp = error.params.additionalProperty;\n const suggestionPointer = error.schemaPath.replace('#', '').replace('/additionalProperties', '');\n const { properties } = safeJsonPointer({\n object: schema,\n pnter: suggestionPointer,\n fallback: { properties: {} },\n });\n validationError = {\n message: `'${additionalProp}' property is not expected to be here`,\n suggestion: getSuggestion({\n value: additionalProp,\n suggestions: Object.keys(properties ?? {}),\n format: (suggestion) => `Did you mean property '${suggestion}'?`,\n }),\n path,\n context: defaultContext,\n };\n break;\n }\n case 'enum': {\n const suggestions = error.params.allowedValues.map((value) => value.toString());\n const prop = getLastSegment(error.instancePath);\n const value = safeJsonPointer({ object: data, pnter: error.instancePath, fallback: '' });\n validationError = {\n message: `'${prop}' property must be equal to one of the allowed values`,\n suggestion: getSuggestion({\n value,\n suggestions,\n }),\n path,\n context: {\n ...defaultContext,\n allowedValues: error.params.allowedValues,\n },\n };\n break;\n }\n case 'type': {\n const prop = getLastSegment(error.instancePath);\n const type = error.params.type;\n validationError = {\n message: `'${prop}' property type must be ${type}`,\n path,\n context: defaultContext,\n };\n break;\n }\n case 'required': {\n validationError = {\n message: `${path} must have required property '${error.params.missingProperty}'`,\n path,\n context: defaultContext,\n };\n break;\n }\n\n default:\n return { message: defaultMessage, path, context: defaultContext };\n }\n\n // Remove empty properties\n const errorEntries = Object.entries(validationError);\n for (const [key, value] of errorEntries as [keyof ValidationError, unknown][]) {\n if (value === null || value === undefined || value === '') {\n delete validationError[key];\n }\n }\n\n return validationError;\n });\n};\n\nexport { ValidationError };\n","import { DefinedError } from 'ajv';\nimport { AJV_ERROR_KEYWORD_WEIGHT_MAP } from '../constants';\n\nexport const filterSingleErrorPerProperty = (errors: DefinedError[]): DefinedError[] => {\n const errorsPerProperty = errors.reduce<Record<string, DefinedError>>((acc, error) => {\n const prop =\n error.instancePath + ((error.params as any)?.additionalProperty ?? (error.params as any)?.missingProperty ?? '');\n const existingError = acc[prop];\n if (!existingError) {\n acc[prop] = error;\n return acc;\n }\n const weight = AJV_ERROR_KEYWORD_WEIGHT_MAP[error.keyword] ?? 0;\n const existingWeight = AJV_ERROR_KEYWORD_WEIGHT_MAP[existingError.keyword] ?? 0;\n\n if (weight > existingWeight) {\n acc[prop] = error;\n }\n return acc;\n }, {});\n\n return Object.values(errorsPerProperty);\n};\n"],"names":["AJV_ERROR_KEYWORD_WEIGHT_MAP","type","QUOTES_REGEX","NOT_REGEX","SLASH_REGEX","getSuggestion","value","format","suggestion","bestSuggestion","suggestions","reduce","best","current","distance","leven","Infinity","length","getLastSegment","path","split","pop","safeJsonPointer","object","pnter","fallback","pointer","get","err","errors","data","schema","basePath","Array","isArray","errorsPerProperty","acc","error","prop","instancePath","params","_error$params","additionalProperty","_error$params2","missingProperty","existingError","keyword","Object","values","filterSingleErrorPerProperty","map","validationError","replace","pointerToDotNotation","defaultContext","errorType","defaultMessage","message","additionalProp","suggestionPointer","schemaPath","properties","keys","context","allowedValues","toString","entries"],"mappings":"+YAEO,IAAMA,EAAiF,MACtF,EACNC,KAAM,GAGKC,EAAe,KACfC,EAAY,OACZC,EAAc,MCPdC,EAAgB,gBAC3BC,IAAAA,UAEAC,OAAAA,aAAS,SAACC,0BAAgCA,UAMpCC,IAPNC,YAOmCC,QACjC,SAACC,EAAMC,OACCC,EAAWC,EAAMT,EAAOO,UAC1BD,EAAKE,SAAWA,EACX,CAAER,MAAOO,EAASC,SAAAA,GAGpBF,IAET,CACEE,SAAUE,SACVV,MAAO,YAIJG,EAAeK,SAAWR,EAAMW,OAASV,EAAOE,EAAeH,OAAS,ICfpEY,EAAiB,SAACC,UACZA,EAAKC,MAAM,KACZC,OAGLC,EAAkB,gBAAMC,IAAAA,OAAQC,IAAAA,MAAOC,IAAAA,oBAEzCC,EAAQC,IAAIJ,EAAQC,GAC3B,MAAOI,UACAH,4BCNoB,gBAC7BI,IAAAA,OACAC,IAAAA,KACAC,IAAAA,WACAC,SAAAA,aAAW,kBAENC,MAAMC,QAAQL,IAA6B,IAAlBA,EAAOZ,OCjBK,SAACY,OACrCM,EAAoBN,EAAOlB,QAAqC,SAACyB,EAAKC,mBACpEC,EACJD,EAAME,yCAAiBF,EAAMG,eAANC,EAAsBC,+BAAuBL,EAAMG,eAANG,EAAsBC,mBAAmB,IACzGC,EAAgBT,EAAIE,UACrBO,aAIU7C,EAA6BqC,EAAMS,YAAY,aACvC9C,EAA6B6C,EAAcC,YAAY,KAG5EV,EAAIE,GAAQD,GAEPD,IATLA,EAAIE,GAAQD,EACLD,KASR,WAEIW,OAAOC,OAAOb,GDGCc,CAA6BpB,GAE9BqB,KAAI,SAACb,OAQpBc,EAPEhC,EDxB0B,SAACO,UAC5BA,EAAQ0B,QAAQhD,EAAa,KCuBrBiD,CAAqBrB,EAAWK,EAAME,cAC7CD,EAAOpB,EAAemB,EAAME,cAC5Be,EAAiB,CACrBC,UAAWlB,EAAMS,SAEbU,GAAoBlB,eAAoBA,MAAUnB,OAAwBkB,EAAMoB,QDxBzEL,QAAQlD,EAAc,KAAKkD,QAAQjD,EAAW,cC4BnDkC,EAAMS,aACP,2BACGY,EAAiBrB,EAAMG,OAAOE,mBAC9BiB,EAAoBtB,EAAMuB,WAAWR,QAAQ,IAAK,IAAIA,QAAQ,wBAAyB,IACrFS,EAAevC,EAAgB,CACrCC,OAAQQ,EACRP,MAAOmC,EACPlC,SAAU,CAAEoC,WAAY,MAHlBA,WAKRV,EAAkB,CAChBM,YAAaC,0CACblD,WAAYH,EAAc,CACxBC,MAAOoD,EACPhD,YAAaqC,OAAOe,WAAKD,EAAAA,EAAc,IACvCtD,OAAQ,SAACC,mCAAyCA,UAEpDW,KAAAA,EACA4C,QAAST,aAIR,WACG5C,EAAc2B,EAAMG,OAAOwB,cAAcd,KAAI,SAAC5C,UAAUA,EAAM2D,cAC9D3B,EAAOpB,EAAemB,EAAME,cAC5BjC,EAAQgB,EAAgB,CAAEC,OAAQO,EAAMN,MAAOa,EAAME,aAAcd,SAAU,KACnF0B,EAAkB,CAChBM,YAAanB,0DACb9B,WAAYH,EAAc,CACxBC,MAAAA,EACAI,YAAAA,IAEFS,KAAAA,EACA4C,aACKT,GACHU,cAAe3B,EAAMG,OAAOwB,2BAK7B,OAGHb,EAAkB,CAChBM,YAHWvC,EAAemB,EAAME,yCACrBF,EAAMG,OAAOvC,KAGxBkB,KAAAA,EACA4C,QAAST,aAIR,WACHH,EAAkB,CAChBM,QAAYtC,mCAAqCkB,EAAMG,OAAOI,oBAC9DzB,KAAAA,EACA4C,QAAST,uBAMJ,CAAEG,QAASD,EAAgBrC,KAAAA,EAAM4C,QAAST,iBAIhCP,OAAOmB,QAAQf,kBAC2C,YAA9D7C,OACXA,MAAAA,GAAmD,KAAVA,UACpC6C,eAIJA,KArFA"} | ||
| {"version":3,"file":"better-ajv-errors.cjs.production.min.js","sources":["../src/constants.ts","../src/lib/suggestions.ts","../src/lib/utils.ts","../src/index.ts","../src/lib/filter.ts"],"sourcesContent":["import { DefinedError } from 'ajv';\n\nexport const AJV_ERROR_KEYWORD_WEIGHT_MAP: Partial<Record<DefinedError['keyword'], number>> = {\n enum: 1,\n type: 0,\n};\n\nexport const QUOTES_REGEX = /\"/g;\nexport const NOT_REGEX = /NOT/g;\nexport const SLASH_REGEX = /\\//g;\n","import leven from 'leven';\n\nexport const getSuggestion = ({\n value,\n suggestions,\n format = (suggestion) => `Did you mean '${suggestion}'?`,\n}: {\n value: string;\n suggestions: string[];\n format?: (suggestion: string) => string;\n}): string => {\n const bestSuggestion = suggestions.reduce(\n (best, current) => {\n const distance = leven(value, current);\n if (best.distance > distance) {\n return { value: current, distance };\n }\n\n return best;\n },\n {\n distance: Infinity,\n value: '',\n }\n );\n\n return bestSuggestion.distance < value.length ? format(bestSuggestion.value) : '';\n};\n","import { NOT_REGEX, QUOTES_REGEX, SLASH_REGEX } from '../constants';\nimport pointer from 'jsonpointer';\n\nexport const pointerToDotNotation = (pointer: string): string => {\n return pointer.replace(SLASH_REGEX, '.');\n};\n\nexport const cleanAjvMessage = (message: string): string => {\n return message.replace(QUOTES_REGEX, \"'\").replace(NOT_REGEX, 'not');\n};\n\nexport const getLastSegment = (path: string): string => {\n const segments = path.split('/');\n return segments.pop() as string;\n};\n\nexport const safeJsonPointer = <T>({ object, pnter, fallback }: { object: any; pnter: string; fallback: T }): T => {\n try {\n return pointer.get(object, pnter);\n } catch (err) {\n return fallback;\n }\n};\n","import { DefinedError, ErrorObject } from 'ajv';\nimport type { JSONSchema6 } from 'json-schema';\nimport { ValidationError } from './types/ValidationError';\nimport { filterSingleErrorPerProperty } from './lib/filter';\nimport { getSuggestion } from './lib/suggestions';\nimport { cleanAjvMessage, getLastSegment, pointerToDotNotation, safeJsonPointer } from './lib/utils';\n\nexport interface BetterAjvErrorsOptions {\n errors: ErrorObject[] | null | undefined;\n data: any;\n schema: JSONSchema6;\n basePath?: string;\n}\n\nexport const betterAjvErrors = ({\n errors,\n data,\n schema,\n basePath = '{base}',\n}: BetterAjvErrorsOptions): ValidationError[] => {\n if (!Array.isArray(errors) || errors.length === 0) {\n return [];\n }\n\n const definedErrors = filterSingleErrorPerProperty(errors as DefinedError[]);\n\n return definedErrors.map((error) => {\n const path = pointerToDotNotation(basePath + error.instancePath);\n const prop = getLastSegment(error.instancePath);\n const defaultContext = {\n errorType: error.keyword,\n };\n const defaultMessage = `${prop ? `property '${prop}'` : path} ${cleanAjvMessage(error.message as string)}`;\n\n let validationError: ValidationError;\n\n switch (error.keyword) {\n case 'additionalProperties': {\n const additionalProp = error.params.additionalProperty;\n const suggestionPointer = error.schemaPath.replace('#', '').replace('/additionalProperties', '');\n const { properties } = safeJsonPointer({\n object: schema,\n pnter: suggestionPointer,\n fallback: { properties: {} },\n });\n validationError = {\n message: `'${additionalProp}' property is not expected to be here`,\n suggestion: getSuggestion({\n value: additionalProp,\n suggestions: Object.keys(properties ?? {}),\n format: (suggestion) => `Did you mean property '${suggestion}'?`,\n }),\n path,\n context: defaultContext,\n };\n break;\n }\n case 'enum': {\n const suggestions = error.params.allowedValues.map((value) => value.toString());\n const prop = getLastSegment(error.instancePath);\n const value = safeJsonPointer({ object: data, pnter: error.instancePath, fallback: '' });\n validationError = {\n message: `'${prop}' property must be equal to one of the allowed values`,\n suggestion: getSuggestion({\n value,\n suggestions,\n }),\n path,\n context: {\n ...defaultContext,\n allowedValues: error.params.allowedValues,\n },\n };\n break;\n }\n case 'type': {\n const prop = getLastSegment(error.instancePath);\n const type = error.params.type;\n validationError = {\n message: `'${prop}' property type must be ${type}`,\n path,\n context: defaultContext,\n };\n break;\n }\n case 'required': {\n validationError = {\n message: `${path} must have required property '${error.params.missingProperty}'`,\n path,\n context: defaultContext,\n };\n break;\n }\n case 'const': {\n return {\n message: `'${prop}' property must be equal to the allowed value`,\n path,\n context: {\n ...defaultContext,\n allowedValue: error.params.allowedValue,\n },\n };\n }\n\n default:\n return { message: defaultMessage, path, context: defaultContext };\n }\n\n // Remove empty properties\n const errorEntries = Object.entries(validationError);\n for (const [key, value] of errorEntries as [keyof ValidationError, unknown][]) {\n if (value === null || value === undefined || value === '') {\n delete validationError[key];\n }\n }\n\n return validationError;\n });\n};\n\nexport { ValidationError };\n","import { DefinedError } from 'ajv';\nimport { AJV_ERROR_KEYWORD_WEIGHT_MAP } from '../constants';\n\nexport const filterSingleErrorPerProperty = (errors: DefinedError[]): DefinedError[] => {\n const errorsPerProperty = errors.reduce<Record<string, DefinedError>>((acc, error) => {\n const prop =\n error.instancePath + ((error.params as any)?.additionalProperty ?? (error.params as any)?.missingProperty ?? '');\n const existingError = acc[prop];\n if (!existingError) {\n acc[prop] = error;\n return acc;\n }\n const weight = AJV_ERROR_KEYWORD_WEIGHT_MAP[error.keyword] ?? 0;\n const existingWeight = AJV_ERROR_KEYWORD_WEIGHT_MAP[existingError.keyword] ?? 0;\n\n if (weight > existingWeight) {\n acc[prop] = error;\n }\n return acc;\n }, {});\n\n return Object.values(errorsPerProperty);\n};\n"],"names":["AJV_ERROR_KEYWORD_WEIGHT_MAP","type","QUOTES_REGEX","NOT_REGEX","SLASH_REGEX","getSuggestion","value","format","suggestion","bestSuggestion","suggestions","reduce","best","current","distance","leven","Infinity","length","getLastSegment","path","split","pop","safeJsonPointer","object","pnter","fallback","pointer","get","err","errors","data","schema","basePath","Array","isArray","errorsPerProperty","acc","error","prop","instancePath","params","_error$params","additionalProperty","_error$params2","missingProperty","existingError","keyword","Object","values","filterSingleErrorPerProperty","map","validationError","replace","pointerToDotNotation","defaultContext","errorType","defaultMessage","message","additionalProp","suggestionPointer","schemaPath","properties","keys","context","allowedValues","toString","allowedValue","entries"],"mappings":"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"} |
@@ -202,2 +202,13 @@ import leven from 'leven'; | ||
| case 'const': | ||
| { | ||
| return { | ||
| message: "'" + prop + "' property must be equal to the allowed value", | ||
| path: path, | ||
| context: _extends({}, defaultContext, { | ||
| allowedValue: error.params.allowedValue | ||
| }) | ||
| }; | ||
| } | ||
| default: | ||
@@ -204,0 +215,0 @@ return { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"better-ajv-errors.esm.js","sources":["../src/constants.ts","../src/lib/filter.ts","../src/lib/suggestions.ts","../src/lib/utils.ts","../src/index.ts"],"sourcesContent":["import { DefinedError } from 'ajv';\n\nexport const AJV_ERROR_KEYWORD_WEIGHT_MAP: Partial<Record<DefinedError['keyword'], number>> = {\n enum: 1,\n type: 0,\n};\n\nexport const QUOTES_REGEX = /\"/g;\nexport const NOT_REGEX = /NOT/g;\nexport const SLASH_REGEX = /\\//g;\n","import { DefinedError } from 'ajv';\nimport { AJV_ERROR_KEYWORD_WEIGHT_MAP } from '../constants';\n\nexport const filterSingleErrorPerProperty = (errors: DefinedError[]): DefinedError[] => {\n const errorsPerProperty = errors.reduce<Record<string, DefinedError>>((acc, error) => {\n const prop =\n error.instancePath + ((error.params as any)?.additionalProperty ?? (error.params as any)?.missingProperty ?? '');\n const existingError = acc[prop];\n if (!existingError) {\n acc[prop] = error;\n return acc;\n }\n const weight = AJV_ERROR_KEYWORD_WEIGHT_MAP[error.keyword] ?? 0;\n const existingWeight = AJV_ERROR_KEYWORD_WEIGHT_MAP[existingError.keyword] ?? 0;\n\n if (weight > existingWeight) {\n acc[prop] = error;\n }\n return acc;\n }, {});\n\n return Object.values(errorsPerProperty);\n};\n","import leven from 'leven';\n\nexport const getSuggestion = ({\n value,\n suggestions,\n format = (suggestion) => `Did you mean '${suggestion}'?`,\n}: {\n value: string;\n suggestions: string[];\n format?: (suggestion: string) => string;\n}): string => {\n const bestSuggestion = suggestions.reduce(\n (best, current) => {\n const distance = leven(value, current);\n if (best.distance > distance) {\n return { value: current, distance };\n }\n\n return best;\n },\n {\n distance: Infinity,\n value: '',\n }\n );\n\n return bestSuggestion.distance < value.length ? format(bestSuggestion.value) : '';\n};\n","import { NOT_REGEX, QUOTES_REGEX, SLASH_REGEX } from '../constants';\nimport pointer from 'jsonpointer';\n\nexport const pointerToDotNotation = (pointer: string): string => {\n return pointer.replace(SLASH_REGEX, '.');\n};\n\nexport const cleanAjvMessage = (message: string): string => {\n return message.replace(QUOTES_REGEX, \"'\").replace(NOT_REGEX, 'not');\n};\n\nexport const getLastSegment = (path: string): string => {\n const segments = path.split('/');\n return segments.pop() as string;\n};\n\nexport const safeJsonPointer = <T>({ object, pnter, fallback }: { object: any; pnter: string; fallback: T }): T => {\n try {\n return pointer.get(object, pnter);\n } catch (err) {\n return fallback;\n }\n};\n","import { DefinedError, ErrorObject } from 'ajv';\nimport type { JSONSchema6 } from 'json-schema';\nimport { ValidationError } from './types/ValidationError';\nimport { filterSingleErrorPerProperty } from './lib/filter';\nimport { getSuggestion } from './lib/suggestions';\nimport { cleanAjvMessage, getLastSegment, pointerToDotNotation, safeJsonPointer } from './lib/utils';\n\nexport interface BetterAjvErrorsOptions {\n errors: ErrorObject[] | null | undefined;\n data: any;\n schema: JSONSchema6;\n basePath?: string;\n}\n\nexport const betterAjvErrors = ({\n errors,\n data,\n schema,\n basePath = '{base}',\n}: BetterAjvErrorsOptions): ValidationError[] => {\n if (!Array.isArray(errors) || errors.length === 0) {\n return [];\n }\n\n const definedErrors = filterSingleErrorPerProperty(errors as DefinedError[]);\n\n return definedErrors.map((error) => {\n const path = pointerToDotNotation(basePath + error.instancePath);\n const prop = getLastSegment(error.instancePath);\n const defaultContext = {\n errorType: error.keyword,\n };\n const defaultMessage = `${prop ? `property '${prop}'` : path} ${cleanAjvMessage(error.message as string)}`;\n\n let validationError: ValidationError;\n\n switch (error.keyword) {\n case 'additionalProperties': {\n const additionalProp = error.params.additionalProperty;\n const suggestionPointer = error.schemaPath.replace('#', '').replace('/additionalProperties', '');\n const { properties } = safeJsonPointer({\n object: schema,\n pnter: suggestionPointer,\n fallback: { properties: {} },\n });\n validationError = {\n message: `'${additionalProp}' property is not expected to be here`,\n suggestion: getSuggestion({\n value: additionalProp,\n suggestions: Object.keys(properties ?? {}),\n format: (suggestion) => `Did you mean property '${suggestion}'?`,\n }),\n path,\n context: defaultContext,\n };\n break;\n }\n case 'enum': {\n const suggestions = error.params.allowedValues.map((value) => value.toString());\n const prop = getLastSegment(error.instancePath);\n const value = safeJsonPointer({ object: data, pnter: error.instancePath, fallback: '' });\n validationError = {\n message: `'${prop}' property must be equal to one of the allowed values`,\n suggestion: getSuggestion({\n value,\n suggestions,\n }),\n path,\n context: {\n ...defaultContext,\n allowedValues: error.params.allowedValues,\n },\n };\n break;\n }\n case 'type': {\n const prop = getLastSegment(error.instancePath);\n const type = error.params.type;\n validationError = {\n message: `'${prop}' property type must be ${type}`,\n path,\n context: defaultContext,\n };\n break;\n }\n case 'required': {\n validationError = {\n message: `${path} must have required property '${error.params.missingProperty}'`,\n path,\n context: defaultContext,\n };\n break;\n }\n\n default:\n return { message: defaultMessage, path, context: defaultContext };\n }\n\n // Remove empty properties\n const errorEntries = Object.entries(validationError);\n for (const [key, value] of errorEntries as [keyof ValidationError, unknown][]) {\n if (value === null || value === undefined || value === '') {\n delete validationError[key];\n }\n }\n\n return validationError;\n });\n};\n\nexport { ValidationError };\n"],"names":["AJV_ERROR_KEYWORD_WEIGHT_MAP","type","QUOTES_REGEX","NOT_REGEX","SLASH_REGEX","filterSingleErrorPerProperty","errors","errorsPerProperty","reduce","acc","error","prop","instancePath","params","additionalProperty","missingProperty","existingError","weight","keyword","existingWeight","Object","values","getSuggestion","value","suggestions","format","suggestion","bestSuggestion","best","current","distance","leven","Infinity","length","pointerToDotNotation","pointer","replace","cleanAjvMessage","message","getLastSegment","path","segments","split","pop","safeJsonPointer","object","pnter","fallback","get","err","betterAjvErrors","data","schema","basePath","Array","isArray","definedErrors","map","defaultContext","errorType","defaultMessage","validationError","additionalProp","suggestionPointer","schemaPath","properties","keys","context","allowedValues","toString","errorEntries","entries","key","undefined"],"mappings":"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"} | ||
| {"version":3,"file":"better-ajv-errors.esm.js","sources":["../src/constants.ts","../src/lib/filter.ts","../src/lib/suggestions.ts","../src/lib/utils.ts","../src/index.ts"],"sourcesContent":["import { DefinedError } from 'ajv';\n\nexport const AJV_ERROR_KEYWORD_WEIGHT_MAP: Partial<Record<DefinedError['keyword'], number>> = {\n enum: 1,\n type: 0,\n};\n\nexport const QUOTES_REGEX = /\"/g;\nexport const NOT_REGEX = /NOT/g;\nexport const SLASH_REGEX = /\\//g;\n","import { DefinedError } from 'ajv';\nimport { AJV_ERROR_KEYWORD_WEIGHT_MAP } from '../constants';\n\nexport const filterSingleErrorPerProperty = (errors: DefinedError[]): DefinedError[] => {\n const errorsPerProperty = errors.reduce<Record<string, DefinedError>>((acc, error) => {\n const prop =\n error.instancePath + ((error.params as any)?.additionalProperty ?? (error.params as any)?.missingProperty ?? '');\n const existingError = acc[prop];\n if (!existingError) {\n acc[prop] = error;\n return acc;\n }\n const weight = AJV_ERROR_KEYWORD_WEIGHT_MAP[error.keyword] ?? 0;\n const existingWeight = AJV_ERROR_KEYWORD_WEIGHT_MAP[existingError.keyword] ?? 0;\n\n if (weight > existingWeight) {\n acc[prop] = error;\n }\n return acc;\n }, {});\n\n return Object.values(errorsPerProperty);\n};\n","import leven from 'leven';\n\nexport const getSuggestion = ({\n value,\n suggestions,\n format = (suggestion) => `Did you mean '${suggestion}'?`,\n}: {\n value: string;\n suggestions: string[];\n format?: (suggestion: string) => string;\n}): string => {\n const bestSuggestion = suggestions.reduce(\n (best, current) => {\n const distance = leven(value, current);\n if (best.distance > distance) {\n return { value: current, distance };\n }\n\n return best;\n },\n {\n distance: Infinity,\n value: '',\n }\n );\n\n return bestSuggestion.distance < value.length ? format(bestSuggestion.value) : '';\n};\n","import { NOT_REGEX, QUOTES_REGEX, SLASH_REGEX } from '../constants';\nimport pointer from 'jsonpointer';\n\nexport const pointerToDotNotation = (pointer: string): string => {\n return pointer.replace(SLASH_REGEX, '.');\n};\n\nexport const cleanAjvMessage = (message: string): string => {\n return message.replace(QUOTES_REGEX, \"'\").replace(NOT_REGEX, 'not');\n};\n\nexport const getLastSegment = (path: string): string => {\n const segments = path.split('/');\n return segments.pop() as string;\n};\n\nexport const safeJsonPointer = <T>({ object, pnter, fallback }: { object: any; pnter: string; fallback: T }): T => {\n try {\n return pointer.get(object, pnter);\n } catch (err) {\n return fallback;\n }\n};\n","import { DefinedError, ErrorObject } from 'ajv';\nimport type { JSONSchema6 } from 'json-schema';\nimport { ValidationError } from './types/ValidationError';\nimport { filterSingleErrorPerProperty } from './lib/filter';\nimport { getSuggestion } from './lib/suggestions';\nimport { cleanAjvMessage, getLastSegment, pointerToDotNotation, safeJsonPointer } from './lib/utils';\n\nexport interface BetterAjvErrorsOptions {\n errors: ErrorObject[] | null | undefined;\n data: any;\n schema: JSONSchema6;\n basePath?: string;\n}\n\nexport const betterAjvErrors = ({\n errors,\n data,\n schema,\n basePath = '{base}',\n}: BetterAjvErrorsOptions): ValidationError[] => {\n if (!Array.isArray(errors) || errors.length === 0) {\n return [];\n }\n\n const definedErrors = filterSingleErrorPerProperty(errors as DefinedError[]);\n\n return definedErrors.map((error) => {\n const path = pointerToDotNotation(basePath + error.instancePath);\n const prop = getLastSegment(error.instancePath);\n const defaultContext = {\n errorType: error.keyword,\n };\n const defaultMessage = `${prop ? `property '${prop}'` : path} ${cleanAjvMessage(error.message as string)}`;\n\n let validationError: ValidationError;\n\n switch (error.keyword) {\n case 'additionalProperties': {\n const additionalProp = error.params.additionalProperty;\n const suggestionPointer = error.schemaPath.replace('#', '').replace('/additionalProperties', '');\n const { properties } = safeJsonPointer({\n object: schema,\n pnter: suggestionPointer,\n fallback: { properties: {} },\n });\n validationError = {\n message: `'${additionalProp}' property is not expected to be here`,\n suggestion: getSuggestion({\n value: additionalProp,\n suggestions: Object.keys(properties ?? {}),\n format: (suggestion) => `Did you mean property '${suggestion}'?`,\n }),\n path,\n context: defaultContext,\n };\n break;\n }\n case 'enum': {\n const suggestions = error.params.allowedValues.map((value) => value.toString());\n const prop = getLastSegment(error.instancePath);\n const value = safeJsonPointer({ object: data, pnter: error.instancePath, fallback: '' });\n validationError = {\n message: `'${prop}' property must be equal to one of the allowed values`,\n suggestion: getSuggestion({\n value,\n suggestions,\n }),\n path,\n context: {\n ...defaultContext,\n allowedValues: error.params.allowedValues,\n },\n };\n break;\n }\n case 'type': {\n const prop = getLastSegment(error.instancePath);\n const type = error.params.type;\n validationError = {\n message: `'${prop}' property type must be ${type}`,\n path,\n context: defaultContext,\n };\n break;\n }\n case 'required': {\n validationError = {\n message: `${path} must have required property '${error.params.missingProperty}'`,\n path,\n context: defaultContext,\n };\n break;\n }\n case 'const': {\n return {\n message: `'${prop}' property must be equal to the allowed value`,\n path,\n context: {\n ...defaultContext,\n allowedValue: error.params.allowedValue,\n },\n };\n }\n\n default:\n return { message: defaultMessage, path, context: defaultContext };\n }\n\n // Remove empty properties\n const errorEntries = Object.entries(validationError);\n for (const [key, value] of errorEntries as [keyof ValidationError, unknown][]) {\n if (value === null || value === undefined || value === '') {\n delete validationError[key];\n }\n }\n\n return validationError;\n });\n};\n\nexport { ValidationError };\n"],"names":["AJV_ERROR_KEYWORD_WEIGHT_MAP","type","QUOTES_REGEX","NOT_REGEX","SLASH_REGEX","filterSingleErrorPerProperty","errors","errorsPerProperty","reduce","acc","error","prop","instancePath","params","additionalProperty","missingProperty","existingError","weight","keyword","existingWeight","Object","values","getSuggestion","value","suggestions","format","suggestion","bestSuggestion","best","current","distance","leven","Infinity","length","pointerToDotNotation","pointer","replace","cleanAjvMessage","message","getLastSegment","path","segments","split","pop","safeJsonPointer","object","pnter","fallback","get","err","betterAjvErrors","data","schema","basePath","Array","isArray","definedErrors","map","defaultContext","errorType","defaultMessage","validationError","additionalProp","suggestionPointer","schemaPath","properties","keys","context","allowedValues","toString","allowedValue","errorEntries","entries","key","undefined"],"mappings":"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"} |
+2
-1
| { | ||
| "name": "@apideck/better-ajv-errors", | ||
| "description": "Human-friendly JSON Schema validation for APIs", | ||
| "version": "0.2.7", | ||
| "version": "0.3.0", | ||
| "author": "Apideck <support@apideck.com> (https://apideck.com/)", | ||
@@ -60,2 +60,3 @@ "license": "MIT", | ||
| "ajv": "^8.5.0", | ||
| "eslint-plugin-prettier": "^3.4.0", | ||
| "husky": "^6.0.0", | ||
@@ -62,0 +63,0 @@ "np": "^7.5.0", |
+29
-0
@@ -378,2 +378,31 @@ import Ajv from 'ajv'; | ||
| }); | ||
| describe('const', () => { | ||
| it('should handle const errors', () => { | ||
| data = { | ||
| const: 2, | ||
| }; | ||
| schema = { | ||
| type: 'object', | ||
| properties: { | ||
| const: { | ||
| type: 'integer', | ||
| const: 42, | ||
| }, | ||
| }, | ||
| }; | ||
| ajv.validate(schema, data); | ||
| const errors = betterAjvErrors({ data, schema, errors: ajv.errors }); | ||
| expect(errors).toEqual([ | ||
| { | ||
| context: { | ||
| allowedValue: 42, | ||
| errorType: 'const', | ||
| }, | ||
| message: "'const' property must be equal to the allowed value", | ||
| path: '{base}.const', | ||
| }, | ||
| ]); | ||
| }); | ||
| }); | ||
| }); |
+10
-0
@@ -94,2 +94,12 @@ import { DefinedError, ErrorObject } from 'ajv'; | ||
| } | ||
| case 'const': { | ||
| return { | ||
| message: `'${prop}' property must be equal to the allowed value`, | ||
| path, | ||
| context: { | ||
| ...defaultContext, | ||
| allowedValue: error.params.allowedValue, | ||
| }, | ||
| }; | ||
| } | ||
@@ -96,0 +106,0 @@ default: |
77292
4.13%1052
5.94%9
12.5%