{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "backstage.io/v1alpha1",
  "type": "object",
  "title": "A JSON Schema for Backstage catalog entities.",
  "description": "Each descriptor file has a number of entities. This schema matches each of those.",
  "examples": [
    {
      "apiVersion": "backstage.io/v1alpha1",
      "kind": "Component",
      "metadata": {
        "name": "LoremService",
        "description": "Creates Lorems like a pro.",
        "labels": {
          "product_name": "Random value Generator"
        },
        "annnotations": {
          "docs": "https://github.com/..../tree/develop/doc"
        },
        "teams": [
          {
            "name": "Team super great",
            "email": "greatTeam@geemel.com"
          }
        ]
      },
      "spec": {
        "type": "service",
        "lifecycle": "production",
        "owner": "tools@example.com"
      }
    }
  ],
  "required": ["apiVersion", "kind", "metadata"],
  "additionalProperties": false,
  "properties": {
    "apiVersion": {
      "type": "string",
      "description": "Version of the specification format for a particular file is written against.",
      "enum": ["backstage.io/v1alpha1", "backstage.io/v1beta1"]
    },
    "kind": {
      "type": "string",
      "description": "High level entity type being described, from the Backstage system model.",
      "enum": ["Component"]
    },
    "metadata": {
      "$ref": "#/definitions/metadata"
    },
    "spec": {
      "$ref": "#/definitions/spec"
    }
  },
  "definitions": {
    "metadata": {
      "type": "object",
      "description": "Metadata about the entity, i.e. things that aren't directly part of the entity specification itself.",
      "required": ["name"],
      "additionalProperties": true,
      "properties": {
        "name": {
          "type": "string",
          "pattern": "^[a-z0-9A-Z_.-]{1,63}$",
          "description": "The name of the entity. This name is both meant for human eyes to recognize the entity, and for machines and other components to reference the entity"
        },
        "description": {
          "type": "string",
          "description": "A human readable description of the entity, to be shown in Backstage. Should be kept short and informative."
        },
        "namespace": {
          "type": "string",
          "description": "The name of a namespace that the entity belongs to."
        },
        "labels": {
          "type": "object",
          "description": "Labels are optional key/value pairs of that are attached to the entity, and their use is identical to kubernetes object labels.",
          "additionalProperties": true,
          "patternProperties": {
            "^([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\\.[a-zA-Z]{2,}/)?[a-z0-9A-Z_\\-\\.]{1,63}$": {
              "type": "string",
              "pattern": "^[a-z0-9A-Z_.-]{1,63}$"
            }
          }
        },
        "annnotations": {
          "type": "object",
          "description": "Arbitrary non-identifying metadata attached to the entity, identical in use to kubernetes object annotations.",
          "additionalProperties": true,
          "patternProperties": {
            "^([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\\.[a-zA-Z]{2,}/)?[a-z0-9A-Z_\\-\\.]{1,63}$": {
              "type": "string",
              "pattern": "^[a-z0-9A-Z_.-]{1,63}$"
            }
          }
        }
      }
    },
    "spec": {
      "type": "object",
      "description": "Actual specification data that describes the entity. TODO: shape depend on `kind`",
      "required": ["type", "lifecycle", "owner"],
      "additionalProperties": true,
      "properties": {
        "type": {
          "type": "string",
          "description": "The type of component.",
          "examples": ["service"]
        },
        "lifecycle": {
          "type": "string",
          "description": "The lifecycle step that this component is in.",
          "examples": ["production"]
        },
        "owner": {
          "type": "string",
          "description": "The owner of the component.",
          "examples": ["tools@example.com"]
        }
      }
    }
  }
}
