longshotlabs / simpl-schema

A JavaScript schema validation package that supports direct validation of MongoDB update modifier objects
https://www.npmjs.com/package/simpl-schema
MIT License
560 stars 115 forks source link

toJsonSchema array fields conversion. Should `items` be an object? #493

Open kolyasya opened 8 months ago

kolyasya commented 8 months ago

I'm trying to build up a client-side form with https://github.com/rjsf-team/react-jsonschema-form To do so I'm using SimplSchema → JSON Schema conversion.

And for array fields I noticed that I don't get a proper result. This issue mostly refers to this line — https://github.com/longshotlabs/simpl-schema/blob/555f790ad17ed15d600d5e1b9bbb1132476f4cd1/src/toJsonSchema.ts#L14

If I start with such schema:

const animals = new SimpleSchema({
  animals: { type: Array },
  'animals.$': { type: Object },
  'animals.$.label': { type: String },
});

I get a JSONSchema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "animals": {
      "type": "array",
      "items": [
        {
          "type": "object",
          "properties": {
            "label": {
              "type": "string"
            }
          },
          "required": ["label"],
          "additionalProperties": false
        }
      ],
      "additionalItems": false
    }
  },
  "required": ["animals"],
  "additionalProperties": false
}

And if I use this JSON schema directly with formData:

{
  "animals": [
    {
      "label": "Cat"
    },
    {
      "label": "Dog"
    },
    {
      "label": "Whale"
    }
  ]
}

I get only a single item:

image

This is because items of the same shape should be defined as an object, not array: https://json-schema.org/learn/getting-started-step-by-step#optional

Am I thinking about that wrong or is this a bug?

github-actions[bot] commented 8 months ago

Thank you for submitting an issue!

If this is a bug report, please be sure to include, at minimum, example code showing a small schema and any necessary calls with all their arguments, which will reproduce the issue. Even better, you can link to a saved online code editor example, where anyone can immediately run the code and see the issue.

If you are requesting a feature, include a code example of how you imagine it working if it were implemented.

If you need to edit your issue description, click the [...] and choose Edit.

Be patient. This is a free and freely licensed package that I maintain in my spare time. You may get a response in a day, but it could also take a month. If you benefit from this package and would like to see more of my time devoted to it, you can help by sponsoring.