{
  "$schema": "http://json-schema.org/draft/2020-12/schema",
  "$id": "https://github.com/webarchitect/schemas/main/schema.json",
  "description": "Schema for webarchitect",
  "type": "object",
  "properties": {
    "$schema": {
      "type": "string",
      "description": "Reference to the meta-schema this schema conforms to"
    },
    "name": {
      "type": "string",
      "description": "Identifier for this ruleset"
    },
    "extends": {
      "type": "array",
      "items": { "type": "string" },
      "description": "List of other rulesets this one extends from"
    },
    "variables": {
      "type": "object",
      "description": "Template variables substituted as ${name} within rules and overridable via the CLI --var/--prefix flags",
      "additionalProperties": {
        "type": "object",
        "properties": {
          "default": {
            "type": "string",
            "description": "Value used when no override is provided"
          },
          "schema": {
            "$ref": "http://json-schema.org/draft/2020-12/schema#",
            "description": "Optional JSON Schema constraining override values"
          }
        },
        "required": ["default"],
        "additionalProperties": false
      }
    }
  },
  "required": ["name"],
  "$defs": {
    "fileRule": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "contains": { "$ref": "http://json-schema.org/draft/2020-12/schema#" }
      },
      "required": ["name", "contains"]
    },
    "directoryRule": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "contains": {
          "type": "object",
          "properties": {
            "files": {
              "type": "array",
              "items": { "$ref": "#/$defs/fileRule" }
            },
            "directories": {
              "type": "array",
              "items": { "$ref": "#/$defs/directoryRule" }
            }
          }
        },
        "strict": { "type": "boolean" }
      },
      "required": ["name"]
    }
  },
  "additionalProperties": {
    "type": "object",
    "properties": {
      "file": { "$ref": "#/$defs/fileRule" },
      "directory": { "$ref": "#/$defs/directoryRule" }
    },
    "oneOf": [{ "required": ["file"] }, { "required": ["directory"] }]
  }
}
