JSON schema validation

When you upload a spec.json file, it is validated against the following schema.

{
  "type": "object",
  "definitions": {
    "extType": {
      "type": "string",
      "minLength": 1,
      "pattern": "^v1/ext/.+$"
    },
    "noEmptyString": {
      "type": "string",
      "minLength": 1
    },
    "toolItem": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/noEmptyString"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "$ref": "#/definitions/noEmptyString"
        },
        "actionController": {
          "$ref": "#/definitions/noEmptyString"
        },
        "label": {
          "$ref": "#/definitions/noEmptyString"
        },
        "containerId": {
          "$ref": "#/definitions/noEmptyString"
        },
        "icon": {
          "type": "string"
        },
        "weight": {
          "type": "number"
        },
        "class": {
          "type": "string"
        },
        "comment": {
          "type": "string"
        },
        "options": {
          "type": "object"
        },
        "push": {
          "type": "string",
          "enum": [
            "true",
            "false"
          ]
        },
        "coachMark": {
          "type": "object",
          "properties": {
            "title": {
              "type": "string"
            },
            "contents": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "required": [
            "title"
          ]
        },
        "lensable": {
          "type": "boolean"
        }
      },
      "required": [
        "id"
      ]
    },
    "collectionItem": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/noEmptyString"
        },
        "containerId": {
          "$ref": "#/definitions/noEmptyString"
        },
        "label": {
          "$ref": "#/definitions/noEmptyString"
        },
        "lensable": {
          "type": "boolean"
        }
      },
      "required": [
        "id",
        "containerId"
      ]
    },
    "collectionContainerItem": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/noEmptyString"
        },
        "label": {
          "$ref": "#/definitions/noEmptyString"
        },
        "lensable": {
          "type": "boolean"
        }
      },
      "required": [
        "id"
      ]
    },
    "collectionContainer": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/noEmptyString"
        },
        "items": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/collectionContainerItem"
          }
        },
        "lensable": {
          "type": "boolean"
        }
      },
      "additionalProperties": false,
      "required": [
        "id"
      ]
    },
    "feature": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/definitions/noEmptyString"
        },
        "excludeItems": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/noEmptyString"
          }
        },
        "excludeFeatures": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/noEmptyString"
          }
        },
        "toolItems": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/toolItem"
          }
        },
        "content": {
          "type": "object",
          "properties": {
            "type": {
              "$ref": "#/definitions/extType"
            },
            "options": {
              "type": "object"
            }
          },
          "additionalProperties": false,
          "required": [
            "type"
          ]
        },
        "cssStyles": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/extType"
          }
        },
        "collectionItems": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/collectionItem"
          }
        },
        "collectionContainers": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/collectionContainer"
          }
        },
        "comment": {
          "type": "string"
        },
        "lensable": {
          "type": "boolean"
        }
      },
      "additionalProperties": false,
      "required": [
        "id"
      ]
    },
    "extension": {
      "type": "object",
      "properties": {
        "perspective": {
          "$ref": "#/definitions/noEmptyString"
        },
        "features": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/definitions/feature"
          }
        },
        "type": {
          "type": "string",
          "enum": [
            "home",
            "login"
          ]
        },
        "lensable": {
          "type": "boolean",
          "default": true
        },
        "comment": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
  },
  "properties": {
    "schemaVersion": {
      "type": "string",
      "enum": [
        "1.0",
        "2.0"
      ]
    },
    "name": {
      "type": "string",
      "pattern": "[a-zA-Z0-9_ ]+$"
    },
    "extensions": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/definitions/extension"
      }
    },
    "comment": {
      "type": "string"
    }
  },
  "additionalProperties": false,
  "required": [
    "name",
    "extensions"
  ]
}