{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://json-structure.org/meta/extended/v0/#",
  "$import": "https://json-structure.org/meta/core/v0/#",
  "$uses": [
    "JSONStructureImport"
  ],
  "$offers": {
    "JSONStructureAlternateNames": [
      "#/definitions/features/JSONStructureAlternateNamesAddIn",
      "#/definitions/features/JSONStructureAlternateSymbolsAddIn"
    ],
    "JSONStructureUnits": [
      "#/definitions/features/UnitsPropertyAddIn",
      "#/definitions/features/UnitsArrayAddIn",
      "#/definitions/features/UnitsMapAddIn"
    ],
    "JSONStructureImport": "#/definitions/features/ImportAddIn",
    "JSONStructureConditionalComposition": "#/definitions/features/CompositionObjectAddIn",
    "JSONStructureValidation": [
      "#/definitions/features/NumberValidationAddIn",
      "#/definitions/features/StringValidationAddIn",
      "#/definitions/features/StringFormatAddIn",
      "#/definitions/features/ArrayValidationAddIn",
      "#/definitions/features/ObjectValidationAddIn"
    ]
  },
  "$root": "#/definitions/SchemaDocument",
  "name": "JSONStructureExtended",
  "definitions": {
    "features": {
      "JSONStructureAlternateNamesAddIn": {
        "type": "object",
        "abstract": true,
        "description": "Feature for alternate names annotation.",
        "$extends": "#/definitions/Property",
        "properties": {
          "altnames": {
            "type": "map",
            "values": {
              "type": "string"
            }
          }
        }
      },
      "JSONStructureAlternateSymbolsAddIn": {
        "type": "object",
        "abstract": true,
        "description": "Feature for alternate symbols annotation.",
        "$extends": "#/definitions/Property",
        "properties": {
          "altsymbols": {
            "type": "map",
            "values": {
              "type": { "$ref": "#/definitions/features/AltsymbolSymbols" }
            }
          }
        }
      },
      "AltsymbolSymbols": {
        "type": "map",
        "description": "Mapping for alternate symbol values.",
        "values": {
          "type": "string"
        }
      },
      "UnitsPropertyAddIn": {
        "name": "UnitsAddIn",
        "abstract": true,
        "description": "Feature for unit annotations on property types.",
        "$extends": "#/definitions/Property",
        "type": "object",
        "properties": {
          "unit": {
            "type": "string",
            "description": "Unit of measurement (e.g., 'kg', 'm', 's')."
          }
        },
        "additionalProperties": false
      },
      "UnitsArrayAddIn": {
        "name": "UnitsAddIn",
        "abstract": true,
        "description": "Feature for unit annotations on array types.",
        "$extends": "#/definitions/ArrayType",
        "type": "object",
        "properties": {
          "unit": {
            "type": "string",
            "description": "Unit of measurement (e.g., 'kg', 'm', 's')."
          }
        },
        "additionalProperties": false
      },
      "UnitsMapAddIn": {
        "name": "UnitsAddIn",
        "abstract": true,
        "description": "Feature for unit annotations on map types.",
        "$extends": "#/definitions/MapType",
        "type": "object",
        "properties": {
          "unit": {
            "type": "string",
            "description": "Unit of measurement (e.g., 'kg', 'm', 's')."
          }
        },
        "additionalProperties": false
      },
      "ImportAddIn": {
        "description": "Feature that enables importing definitions from another namespace.",
        "name": "ImportAddIn",
        "abstract": true,
        "$extends": "#/definitions/Namespace",
        "type": "map",
        "values": {
          "type": [
            {
              "$ref": "#/definitions/ObjectType"
            },
            {
              "$ref": "#/definitions/ArrayType"
            },
            {
              "$ref": "#/definitions/MapType"
            },
            {
              "$ref": "#/definitions/Namespace"
            },
            {
              "$ref": "#/definitions/features/ImportAddInReference"
            }
          ]
        }
      },
      "ImportAddInReference": {
        "name": "ImportAddIn",
        "description": "Feature reference for imported definitions.",
        "type": "object",
        "properties": {
          "$import": {
            "type": "uri",
            "description": "A reference to an existing namespace definition"
          },
          "$importdefs": {
            "type": "uri",
            "description": "A reference to an existing namespace definition"
          }
        }
      },
      "CompositionObjectAddIn": {
        "name": "CompositionObjectAddIn",
        "abstract": true,
        "description": "Feature for composition constraints such as anyOf, oneOf, allOf, not, if, then, and else.",
        "$extends": "#/definitions/NoType",
        "type": "object",
        "properties": {
          "anyOf": {
            "type": [
              {
                "$ref": "#/definitions/TypeReference"
              },
              {
                "$ref": "#/definitions/PrimitiveType"
              },
              {
                "$ref": "#/definitions/TypeUnion"
              }
            ]
          },
          "oneOf": {
            "type": [
              {
                "$ref": "#/definitions/TypeReference"
              },
              {
                "$ref": "#/definitions/PrimitiveType"
              },
              {
                "$ref": "#/definitions/TypeUnion"
              }
            ]
          },
          "allOf": {
            "type": [
              {
                "$ref": "#/definitions/TypeReference"
              },
              {
                "$ref": "#/definitions/PrimitiveType"
              },
              {
                "$ref": "#/definitions/TypeUnion"
              }
            ]
          },
          "not": {
            "type": [
              {
                "$ref": "#/definitions/TypeReference"
              },
              {
                "$ref": "#/definitions/PrimitiveType"
              },
              {
                "$ref": "#/definitions/TypeUnion"
              }
            ]
          },
          "if": {
            "type": [
              {
                "$ref": "#/definitions/TypeReference"
              },
              {
                "$ref": "#/definitions/PrimitiveType"
              },
              {
                "$ref": "#/definitions/TypeUnion"
              }
            ]
          },
          "then": {
            "type": [
              {
                "$ref": "#/definitions/TypeReference"
              },
              {
                "$ref": "#/definitions/PrimitiveType"
              },
              {
                "$ref": "#/definitions/TypeUnion"
              }
            ]
          },
          "else": {
            "type": [
              {
                "$ref": "#/definitions/TypeReference"
              },
              {
                "$ref": "#/definitions/PrimitiveType"
              },
              {
                "$ref": "#/definitions/TypeUnion"
              }
            ]
          }
        }
      },
      "NumberValidationAddIn": {
        "name": "NumberValidationAddIn",
        "abstract": true,
        "description": "Feature for numeric validations (e.g., minimum, maximum, multipleOf).",
        "$extends": "#/definitions/OptionalPrimitiveType",
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "number",
              "integer",
              "float",
              "double",
              "decimal",
              "int32",
              "uint32",
              "int64",
              "uint64",
              "int128",
              "uint128"
            ]
          },
          "minimum": {
            "type": "number"
          },
          "maximum": {
            "type": "number"
          },
          "exclusiveMinimum": {
            "type": "boolean"
          },
          "exclusiveMaximum": {
            "type": "boolean"
          },
          "multipleOf": {
            "type": "number"
          }
        }
      },
      "StringValidationAddIn": {
        "name": "StringValidationAddIn",
        "abstract": true,
        "description": "Feature for string validations (e.g., minLength, maxLength, pattern).",
        "$extends": "#/definitions/OptionalPrimitiveType",
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "string"
            ]
          },
          "minLength": {
            "type": "integer"
          },
          "maxLength": {
            "type": "integer"
          },
          "pattern": {
            "type": "string"
          }
        }
      },
      "StringFormatAddIn": {
        "name": "StringFormatAddIn",
        "abstract": true,
        "description": "Feature for specifying string formats (e.g., email, uri).",
        "$extends": "#/definitions/OptionalPrimitiveType",
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "string"
            ]
          },
          "format": {
            "type": "string",
            "enum": [
              "email",
              "hostname",
              "ipv4",
              "ipv6",
              "uri",
              "uri-reference",
              "uri-template",
              "json-pointer",
              "relative-json-pointer",
              "regex"
            ]
          }
        }
      },
      "ArrayValidationAddIn": {
        "name": "ArrayValidationAddIn",
        "abstract": true,
        "description": "Feature for validating array constraints (e.g., minItems, maxItems, uniqueItems).",
        "$extends": "#/definitions/ArrayType",
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "array"
            ]
          },
          "minItems": {
            "type": "integer"
          },
          "maxItems": {
            "type": "integer"
          },
          "uniqueItems": {
            "type": "boolean"
          }
        }
      },
      "ObjectValidationAddIn": {
        "name": "ObjectValidationAddIn",
        "abstract": true,
        "description": "Feature for validating object constraints (e.g., minProperties, maxProperties).",
        "$extends": "#/definitions/ObjectType",
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "object"
            ]
          },
          "minProperties": {
            "type": "integer"
          },
          "maxProperties": {
            "type": "integer"
          }
        }
      }
    }
  }
}