apideck-libraries / better-ajv-errors

Human-friendly JSON Schema validation for APIs 👮‍♀️
MIT License
41 stars 6 forks source link

crush - wrong params to leven #3

Closed stavalfi closed 2 years ago

stavalfi commented 2 years ago

leven already responded on this issue: https://github.com/sindresorhus/leven/issues/19

maybe in some cases the wrong params are sent to level from this library.

TypeError: right.charCodeAt is not a function
    at leven (/Users/stavalfi/projects/singer/.yarn/cache/leven-npm-3.1.0-b7697736a3-638401d534.zip/node_modules/leven/index.js:26:68)
    at reduce (/Users/stavalfi/projects/singer/.yarn/__virtual__/@apideck-better-ajv-errors-virtual-a071b679df/0/cache/@apideck-better-ajv-errors-npm-0.2.5-be7d452d6a-d20cd7ec6d.zip/node_modules/@apideck/better-ajv-errors/src/lib/suggestions.ts:14:24)
    at Array.reduce (<anonymous>)
    at getSuggestion (/Users/stavalfi/projects/singer/.yarn/__virtual__/@apideck-better-ajv-errors-virtual-a071b679df/0/cache/@apideck-better-ajv-errors-npm-0.2.5-be7d452d6a-d20cd7ec6d.zip/node_modules/@apideck/better-ajv-errors/src/lib/suggestions.ts:12:38)
    at map (/Users/stavalfi/projects/singer/.yarn/__virtual__/@apideck-better-ajv-errors-virtual-a071b679df/0/cache/@apideck-better-ajv-errors-npm-0.2.5-be7d452d6a-d20cd7ec6d.zip/node_modules/@apideck/better-ajv-errors/src/index.ts:64:23)
    at Array.map (<anonymous>)
    at Object.betterAjvErrors (/Users/stavalfi/projects/singer/.yarn/__virtual__/@apideck-better-ajv-errors-virtual-a071b679df/0/cache/@apideck-better-ajv-errors-npm-0.2.5-be7d452d6a-d20cd7ec6d.zip/node_modules/@apideck/better-ajv-errors/src/index.ts:27:24)
    at FetchDbImService.getWotsyRequest (/Users/stavalfi/projects/singer/packages/csm-im/src/persist-im/fetch-db-im.service.ts:212:41)
    at /Users/stavalfi/projects/singer/packages/csm-im/src/research-models/wotsy-live/wotsy-live.service.ts:68:57
    at Array.map (<anonymous>)

Reproduce:

{
  "schema": {
    "type": "object",
    "properties": {
      "offers": {
        "type": "object",
        "properties": {
          "Offer": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "Bet": {
                    "type": "string",
                    "oneOf": [
                      {
                        "const": "Hcap"
                      },
                      {
                        "const": "Total"
                      }
                    ]
                  },
                  "BookieId": {
                    "type": "string"
                  },
                  "LastChangedTimeUTC": {
                    "type": "string"
                  },
                  "Line": {
                    "type": "string"
                  },
                  "Odds1": {
                    "type": "string"
                  },
                  "Odds2": {
                    "type": "string"
                  },
                  "HomeScore": {
                    "type": "integer",
                    "nullable": true
                  },
                  "AwayScore": {
                    "type": "integer",
                    "nullable": true
                  },
                  "IsLive": {
                    "type": "integer",
                    "enum": [
                      0,
                      1
                    ]
                  }
                },
                "required": [
                  "Bet",
                  "BookieId",
                  "LastChangedTimeUTC",
                  "Line",
                  "Odds1",
                  "Odds2",
                  "HomeScore",
                  "AwayScore",
                  "IsLive"
                ],
                "additionalProperties": false
              },
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "Bet": {
                      "type": "string",
                      "oneOf": [
                        {
                          "const": "Hcap"
                        },
                        {
                          "const": "Total"
                        }
                      ]
                    },
                    "BookieId": {
                      "type": "string"
                    },
                    "LastChangedTimeUTC": {
                      "type": "string"
                    },
                    "Line": {
                      "type": "string"
                    },
                    "Odds1": {
                      "type": "string"
                    },
                    "Odds2": {
                      "type": "string"
                    },
                    "HomeScore": {
                      "type": "integer",
                      "nullable": true
                    },
                    "AwayScore": {
                      "type": "integer",
                      "nullable": true
                    },
                    "IsLive": {
                      "type": "integer",
                      "enum": [
                        0,
                        1
                      ]
                    }
                  },
                  "required": [
                    "Bet",
                    "BookieId",
                    "LastChangedTimeUTC",
                    "Line",
                    "Odds1",
                    "Odds2",
                    "HomeScore",
                    "AwayScore",
                    "IsLive"
                  ],
                  "additionalProperties": false
                }
              }
            ]
          }
        },
        "required": []
      }
    },
    "required": [
      "offers"
    ]
  },
  "dataToValidate": {
    "offers": {
      "Offer": [
        {
          "Bet": "Hcap",
          "Line": "-2.500000000000000e-001",
          "Odds1": "1.39",
          "Odds2": "2.66",
          "BookieId": "25",
          "LastChangedTimeUTC": "2021-09-26T10:31:00.747Z",
          "IsLive": "0",
          "HomeScore": null,
          "AwayScore": null
        },
        {
          "Bet": "Hcap",
          "Line": "-5.000000000000000e-001",
          "Odds1": "1.58",
          "Odds2": "2.23",
          "BookieId": "25",
          "LastChangedTimeUTC": "2021-09-26T10:31:00.747Z",
          "IsLive": "0",
          "HomeScore": null,
          "AwayScore": null
        },
        {
          "Bet": "Hcap",
          "Line": "-7.500000000000000e-001",
          "Odds1": "1.76",
          "Odds2": "1.99",
          "BookieId": "25",
          "LastChangedTimeUTC": "2021-09-26T10:31:00.747Z",
          "IsLive": "0",
          "HomeScore": null,
          "AwayScore": null
        },
        {
          "Bet": "Hcap",
          "Line": "-1.000000000000000e+000",
          "Odds1": "2.03",
          "Odds2": "1.69",
          "BookieId": "25",
          "LastChangedTimeUTC": "2021-09-26T10:31:00.747Z",
          "IsLive": "0",
          "HomeScore": null,
          "AwayScore": null
        },
        {
          "Bet": "Hcap",
          "Line": "-1.250000000000000e+000",
          "Odds1": "2.33",
          "Odds2": "1.51",
          "BookieId": "25",
          "LastChangedTimeUTC": "2021-09-26T10:31:00.747Z",
          "IsLive": "0",
          "HomeScore": null,
          "AwayScore": null
        },
        {
          "Bet": "Total",
          "Line": "2.250000000000000e+000",
          "Odds1": "1.52",
          "Odds2": "2.31",
          "BookieId": "25",
          "LastChangedTimeUTC": "2021-09-26T10:31:01.267Z",
          "IsLive": "0",
          "HomeScore": null,
          "AwayScore": null
        },
        {
          "Bet": "Total",
          "Line": "2.500000000000000e+000",
          "Odds1": "1.71",
          "Odds2": "2.00",
          "BookieId": "25",
          "LastChangedTimeUTC": "2021-09-26T10:31:01.267Z",
          "IsLive": "0",
          "HomeScore": null,
          "AwayScore": null
        },
        {
          "Bet": "Total",
          "Line": "2.750000000000000e+000",
          "Odds1": "1.93",
          "Odds2": "1.80",
          "BookieId": "25",
          "LastChangedTimeUTC": "2021-09-26T10:31:01.267Z",
          "IsLive": "0",
          "HomeScore": null,
          "AwayScore": null
        },
        {
          "Bet": "Total",
          "Line": "3.000000000000000e+000",
          "Odds1": "2.24",
          "Odds2": "1.57",
          "BookieId": "25",
          "LastChangedTimeUTC": "2021-09-26T10:31:01.267Z",
          "IsLive": "0",
          "HomeScore": null,
          "AwayScore": null
        },
        {
          "Bet": "Total",
          "Line": "3.250000000000000e+000",
          "Odds1": "2.50",
          "Odds2": "1.44",
          "BookieId": "25",
          "LastChangedTimeUTC": "2021-09-26T10:31:01.267Z",
          "IsLive": "0",
          "HomeScore": null,
          "AwayScore": null
        }
      ]
    }
  },
  "errors": [
    {
      "instancePath": "/offers/Offer",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/0/type",
      "keyword": "type",
      "params": {
        "type": "object"
      },
      "message": "must be object"
    },
    {
      "instancePath": "/offers/Offer/0/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/type",
      "keyword": "type",
      "params": {
        "type": "integer"
      },
      "message": "must be integer"
    },
    {
      "instancePath": "/offers/Offer/0/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/enum",
      "keyword": "enum",
      "params": {
        "allowedValues": [
          0,
          1
        ]
      },
      "message": "must be equal to one of the allowed values"
    },
    {
      "instancePath": "/offers/Offer/1/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/type",
      "keyword": "type",
      "params": {
        "type": "integer"
      },
      "message": "must be integer"
    },
    {
      "instancePath": "/offers/Offer/1/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/enum",
      "keyword": "enum",
      "params": {
        "allowedValues": [
          0,
          1
        ]
      },
      "message": "must be equal to one of the allowed values"
    },
    {
      "instancePath": "/offers/Offer/2/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/type",
      "keyword": "type",
      "params": {
        "type": "integer"
      },
      "message": "must be integer"
    },
    {
      "instancePath": "/offers/Offer/2/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/enum",
      "keyword": "enum",
      "params": {
        "allowedValues": [
          0,
          1
        ]
      },
      "message": "must be equal to one of the allowed values"
    },
    {
      "instancePath": "/offers/Offer/3/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/type",
      "keyword": "type",
      "params": {
        "type": "integer"
      },
      "message": "must be integer"
    },
    {
      "instancePath": "/offers/Offer/3/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/enum",
      "keyword": "enum",
      "params": {
        "allowedValues": [
          0,
          1
        ]
      },
      "message": "must be equal to one of the allowed values"
    },
    {
      "instancePath": "/offers/Offer/4/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/type",
      "keyword": "type",
      "params": {
        "type": "integer"
      },
      "message": "must be integer"
    },
    {
      "instancePath": "/offers/Offer/4/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/enum",
      "keyword": "enum",
      "params": {
        "allowedValues": [
          0,
          1
        ]
      },
      "message": "must be equal to one of the allowed values"
    },
    {
      "instancePath": "/offers/Offer/5/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/type",
      "keyword": "type",
      "params": {
        "type": "integer"
      },
      "message": "must be integer"
    },
    {
      "instancePath": "/offers/Offer/5/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/enum",
      "keyword": "enum",
      "params": {
        "allowedValues": [
          0,
          1
        ]
      },
      "message": "must be equal to one of the allowed values"
    },
    {
      "instancePath": "/offers/Offer/6/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/type",
      "keyword": "type",
      "params": {
        "type": "integer"
      },
      "message": "must be integer"
    },
    {
      "instancePath": "/offers/Offer/6/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/enum",
      "keyword": "enum",
      "params": {
        "allowedValues": [
          0,
          1
        ]
      },
      "message": "must be equal to one of the allowed values"
    },
    {
      "instancePath": "/offers/Offer/7/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/type",
      "keyword": "type",
      "params": {
        "type": "integer"
      },
      "message": "must be integer"
    },
    {
      "instancePath": "/offers/Offer/7/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/enum",
      "keyword": "enum",
      "params": {
        "allowedValues": [
          0,
          1
        ]
      },
      "message": "must be equal to one of the allowed values"
    },
    {
      "instancePath": "/offers/Offer/8/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/type",
      "keyword": "type",
      "params": {
        "type": "integer"
      },
      "message": "must be integer"
    },
    {
      "instancePath": "/offers/Offer/8/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/enum",
      "keyword": "enum",
      "params": {
        "allowedValues": [
          0,
          1
        ]
      },
      "message": "must be equal to one of the allowed values"
    },
    {
      "instancePath": "/offers/Offer/9/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/type",
      "keyword": "type",
      "params": {
        "type": "integer"
      },
      "message": "must be integer"
    },
    {
      "instancePath": "/offers/Offer/9/IsLive",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf/1/items/properties/IsLive/enum",
      "keyword": "enum",
      "params": {
        "allowedValues": [
          0,
          1
        ]
      },
      "message": "must be equal to one of the allowed values"
    },
    {
      "instancePath": "/offers/Offer",
      "schemaPath": "#/properties/offers/properties/Offer/oneOf",
      "keyword": "oneOf",
      "params": {
        "passingSchemas": null
      },
      "message": "must match exactly one schema in oneOf"
    }
  ]
}
elsmr commented 2 years ago

Hi, thanks for reporting and providing a reproduction 🙏 The issue is caused by enums of type integer. I'm working on a fix 😄

elsmr commented 2 years ago

Released in https://github.com/apideck-libraries/better-ajv-errors/releases/tag/v0.2.6