Skip to content

JSON schema unnecessarily large because of duplicated type definitions #129

@cknitt

Description

@cknitt

JSON schemas generated from Sury schemas are unnecessarily large because type definitions are duplicated to every place the type is used.

Simple example:

@schema
type url = @s.matches(S.string->S.url) string

@schema
type icon = {
  url: url,
  width: int,
  height: int,
}

@schema
type icons = {
  iconA: icon,
  iconB: icon,
  iconC: icon,
}

results into

{
  "type": "object",
  "properties": {
    "iconA": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "format": "uri"
        },
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      },
      "additionalProperties": false,
      "required": [
        "url",
        "width",
        "height"
      ]
    },
    "iconB": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "format": "uri"
        },
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      },
      "additionalProperties": false,
      "required": [
        "url",
        "width",
        "height"
      ]
    },
    "iconC": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "format": "uri"
        },
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      },
      "additionalProperties": false,
      "required": [
        "url",
        "width",
        "height"
      ]
    }
  },
  "additionalProperties": false,
  "required": [
    "iconA",
    "iconB",
    "iconC"
  ]
}

which could instead be

{
  "type": "object",
  "properties": {
    "iconA": {
      "$ref": "#/$defs/icon"
    },
    "iconB": {
      "$ref": "#/$defs/icon"
    },
    "iconC": {
      "$ref": "#/$defs/icon"
    }
  },
  "required": [
    "iconA",
    "iconB",
    "iconC"
  ],
  "additionalProperties": false,
  "$defs": {
    "icon": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "format": "uri"
        },
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        }
      },
      "required": [
        "url",
        "width",
        "height"
      ],
      "additionalProperties": false
    }
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions