{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://bpmn.io/20241206/moddle-package.schema.json",
  "title": "Moddle Package Schema",
  "type": "object",
  "required": [
    "name",
    "prefix",
    "uri",
    "types"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "Name of the package."
    },
    "$schema": {
      "type": "string",
      "description": "Reference to this schema"
    },
    "prefix": {
      "type": "string",
      "description": "The prefix uniquely identifies elements in a package if more multiple packages are in place."
    },
    "uri": {
      "type": "string",
      "description": "The uri field in a package definition defines the associated XML namespace URI."
    },
    "types": {
      "type": "array",
      "description": "List of types belonging to this package.",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the defined type."
          },
          "superClass": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Name of the super type."
            }
          },
          "isAbstract": {
            "type": "boolean",
            "description": "Can this type be instantiated."
          },
          "properties": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Name of the property."
                },
                "type": {
                  "type": "string",
                  "description": "Type of the property."
                },
                "isAttr": {
                  "type": "boolean",
                  "description": "Should the property be serialized as XML attribute."
                },
                "isBody": {
                  "type": "boolean",
                  "description": "Should the property be serialized as body element."
                },
                "isId": {
                  "type": "boolean",
                  "description": "Is current property map to XML node id."
                },
                "isMany": {
                  "type": "boolean",
                  "description": "Is the property an array or a single."
                },
                "isReference": {
                  "type": "boolean",
                  "description": "Is the property referencing to another element"
                },
                "default": {
                  "description": "Provides default for the property.",
                  "oneOf": [
                    {
                      "type": "boolean"
                    },
                    {
                      "type": "number"
                    },
                    {
                      "type": "string"
                    }
                  ]
                },
                "redefines": {
                  "type": "string",
                  "description": "Property name for the redefinition of existing property"
                },
                "replaces": {
                  "type": "string",
                  "description": "Property name for the replacement of existing property"
                },
                "xml": {
                  "type": "object",
                  "description": "Defines XML serialization details",
                  "properties": {
                    "serialize": {
                      "type": "string",
                      "description": "Provides XML serialization type, e.g. xsi:type"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "xml": {
      "type": "object",
      "description": "Defines XML serialization details.",
      "properties": {
        "tagAlias": {
          "const": "lowerCase"
        },
        "typePrefix": {
          "type": "string"
        }
      }
    },
    "associations": {
      "type": "array",
      "description": "The associations property is reserved for future use."
    },
    "enumerations": {
      "description": "The enumerations property is reserved for future use.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "literalValues": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
}