{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://www.michaeldariuseastwood.com/schemas/route-policy.schema.json",
  "title": "Public route policy",
  "type": "object",
  "additionalProperties": false,
  "required": ["schemaVersion","policyId","policyDate","canonicalOrigin","sourceSitemap","description","classPolicies","rules","migrationRules"],
  "properties": {
    "schemaVersion": {"const": 1},
    "policyId": {"type":"string","minLength":1},
    "policyDate": {"type":"string","format":"date"},
    "canonicalOrigin": {"type":"string","format":"uri","pattern":"^https://"},
    "sourceSitemap": {"type":"string","minLength":1},
    "description": {"type":"string","minLength":1},
    "classPolicies": {"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/classPolicy"}},
    "rules": {"type":"array","minItems":1,"items":{"$ref":"#/$defs/rule"}},
    "migrationRules": {
      "type":"object","additionalProperties":false,
      "required":["failOnUnclassified","failOnMalformedOrNonCanonical","strictModeAlsoFailsOn"],
      "properties": {
        "failOnUnclassified":{"type":"boolean"},
        "failOnMalformedOrNonCanonical":{"type":"boolean"},
        "strictModeAlsoFailsOn":{"type":"array","uniqueItems":true,"items":{"type":"string","minLength":1}}
      }
    }
  },
  "$defs": {
    "classPolicy": {
      "type":"object","additionalProperties":false,
      "required":["robots","canonical","includeInSitemap","includeInAiCorpus","includeInAuthorityGraph","review"],
      "properties": {
        "robots":{"type":"string","minLength":1},
        "canonical":{"type":"string","minLength":1},
        "includeInSitemap":{"type":"boolean"},
        "includeInAiCorpus":{"type":"boolean"},
        "includeInAuthorityGraph":{"type":"boolean"},
        "review":{"type":"string","minLength":1}
      }
    },
    "rule": {
      "type":"object","additionalProperties":false,
      "required":["id","class","match","reason"],
      "properties": {
        "id":{"type":"string","minLength":1},
        "class":{"type":"string","minLength":1},
        "reason":{"type":"string","minLength":1},
        "match": {
          "type":"object","additionalProperties":false,"minProperties":1,
          "properties": {
            "exact":{"$ref":"#/$defs/stringArray"},
            "prefixes":{"$ref":"#/$defs/stringArray"},
            "suffixes":{"$ref":"#/$defs/stringArray"},
            "regex":{"$ref":"#/$defs/stringArray"}
          }
        }
      }
    },
    "stringArray": {"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","minLength":1}}
  }
}
