{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://raw.githubusercontent.com/themixednuts/drizzle-rs/main/cli/schema.json",
  "title": "Drizzle Configuration",
  "description": "Configuration schema for drizzle-rs CLI tool (compatible with drizzle-kit)",
  "definitions": {
    "envOr": {
      "description": "A value that can be a direct string or an environment variable reference",
      "oneOf": [
        { "type": "string" },
        {
          "type": "object",
          "required": ["env"],
          "properties": {
            "env": {
              "type": "string",
              "description": "Environment variable name"
            }
          },
          "additionalProperties": false
        }
      ]
    },
    "schemaPath": {
      "description": "Path or array of paths to schema files (glob patterns supported)",
      "oneOf": [
        { "type": "string" },
        {
          "type": "array",
          "items": { "type": "string" },
          "minItems": 1
        }
      ],
      "default": "src/schema.rs"
    },
    "filter": {
      "oneOf": [
        { "type": "string" },
        {
          "type": "array",
          "items": { "type": "string" }
        }
      ]
    },
    "casing": {
      "description": "Casing mode for generated code and SQL identifiers",
      "type": "string",
      "enum": ["camelCase", "snake_case"],
      "default": "camelCase"
    },
    "introspectCasing": {
      "description": "Casing mode for introspected identifiers",
      "type": "string",
      "enum": ["camel", "preserve"],
      "default": "camel"
    },
    "introspect": {
      "description": "Introspection configuration",
      "type": "object",
      "properties": {
        "casing": {
          "$ref": "#/definitions/introspectCasing"
        }
      },
      "additionalProperties": false
    },
    "rolesFilter": {
      "description": "Roles filter configuration (PostgreSQL only)",
      "oneOf": [
        {
          "type": "boolean",
          "description": "true = include all user roles, false = exclude all"
        },
        {
          "type": "object",
          "properties": {
            "provider": {
              "type": "string",
              "description": "Provider preset (e.g., 'supabase', 'neon') - excludes provider-specific roles",
              "enum": ["supabase", "neon"]
            },
            "include": {
              "type": "array",
              "items": { "type": "string" },
              "description": "Explicit list of role names to include"
            },
            "exclude": {
              "type": "array",
              "items": { "type": "string" },
              "description": "Explicit list of role names to exclude"
            }
          },
          "additionalProperties": false
        }
      ]
    },
    "entities": {
      "description": "Entities filter configuration",
      "type": "object",
      "properties": {
        "roles": {
          "$ref": "#/definitions/rolesFilter"
        }
      },
      "additionalProperties": false
    },
    "extensionsFilters": {
      "description": "Extensions filter (PostgreSQL only)",
      "type": "array",
      "items": {
        "type": "string",
        "enum": ["postgis"]
      }
    },
    "migrations": {
      "description": "Migration table configuration",
      "type": "object",
      "properties": {
        "table": {
          "description": "Custom table name for migrations (default: __drizzle_migrations)",
          "type": "string",
          "default": "__drizzle_migrations"
        },
        "schema": {
          "description": "Schema for migrations table (PostgreSQL only, default: drizzle)",
          "type": "string",
          "default": "drizzle"
        },
        "prefix": {
          "description": "Migration file naming prefix",
          "type": "string",
          "enum": ["index", "timestamp", "supabase", "unix", "none"]
        }
      },
      "additionalProperties": false
    },
    "urlCredentials": {
      "type": "object",
      "description": "URL-based credentials (SQLite file path, Turso/LibSQL URL, PostgreSQL connection string)",
      "required": ["url"],
      "properties": {
        "url": { "$ref": "#/definitions/envOr" },
        "authToken": {
          "$ref": "#/definitions/envOr",
          "description": "Auth token for Turso/LibSQL connections"
        }
      },
      "additionalProperties": false
    },
    "hostCredentials": {
      "type": "object",
      "description": "Host-based credentials for PostgreSQL",
      "required": ["host", "database"],
      "properties": {
        "host": { "$ref": "#/definitions/envOr" },
        "port": { "type": "integer", "minimum": 1, "maximum": 65535, "default": 5432 },
        "user": { "$ref": "#/definitions/envOr" },
        "password": { "$ref": "#/definitions/envOr" },
        "database": { "$ref": "#/definitions/envOr" },
        "ssl": {
          "oneOf": [
            { "type": "boolean" },
            { "type": "string", "enum": ["require", "allow", "prefer", "verify-full", "verify-ca", "disable"] }
          ]
        }
      },
      "additionalProperties": false
    },
    "dbCredentials": {
      "description": "Database credentials",
      "oneOf": [
        { "$ref": "#/definitions/urlCredentials" },
        { "$ref": "#/definitions/hostCredentials" }
      ]
    },
    "sqliteConfig": {
      "type": "object",
      "required": ["dialect"],
      "properties": {
        "dialect": {
          "description": "Database dialect",
          "type": "string",
          "const": "sqlite"
        },
        "driver": {
          "description": "Database driver",
          "type": "string",
          "enum": ["rusqlite"]
        },
        "schema": { "$ref": "#/definitions/schemaPath" },
        "out": {
          "description": "Output directory for migrations",
          "type": "string",
          "default": "./drizzle"
        },
        "breakpoints": {
          "description": "Whether to use SQL breakpoints in generated migrations",
          "type": "boolean",
          "default": true
        },
        "tablesFilter": {
          "description": "Table filter for push/introspect commands (glob patterns)",
          "$ref": "#/definitions/filter"
        },
        "verbose": {
          "description": "Verbose output",
          "type": "boolean",
          "default": false
        },
        "casing": { "$ref": "#/definitions/casing" },
        "migrations": { "$ref": "#/definitions/migrations" },
        "introspect": { "$ref": "#/definitions/introspect" },
        "dbCredentials": { "$ref": "#/definitions/urlCredentials" }
      },
      "additionalProperties": false
    },
    "tursoConfig": {
      "type": "object",
      "required": ["dialect"],
      "properties": {
        "dialect": {
          "description": "Database dialect",
          "type": "string",
          "const": "turso"
        },
        "driver": {
          "description": "Database driver",
          "type": "string",
          "enum": ["libsql", "turso"]
        },
        "schema": { "$ref": "#/definitions/schemaPath" },
        "out": {
          "description": "Output directory for migrations",
          "type": "string",
          "default": "./drizzle"
        },
        "breakpoints": {
          "description": "Whether to use SQL breakpoints in generated migrations",
          "type": "boolean",
          "default": true
        },
        "tablesFilter": {
          "description": "Table filter for push/introspect commands (glob patterns)",
          "$ref": "#/definitions/filter"
        },
        "verbose": {
          "description": "Verbose output",
          "type": "boolean",
          "default": false
        },
        "casing": { "$ref": "#/definitions/casing" },
        "migrations": { "$ref": "#/definitions/migrations" },
        "introspect": { "$ref": "#/definitions/introspect" },
        "dbCredentials": { "$ref": "#/definitions/urlCredentials" }
      },
      "additionalProperties": false
    },
    "postgresConfig": {
      "type": "object",
      "required": ["dialect"],
      "properties": {
        "dialect": {
          "description": "Database dialect",
          "type": "string",
          "enum": ["postgresql", "postgres"]
        },
        "driver": {
          "description": "Database driver",
          "type": "string",
          "enum": ["postgres-sync", "tokio-postgres"]
        },
        "schema": { "$ref": "#/definitions/schemaPath" },
        "out": {
          "description": "Output directory for migrations",
          "type": "string",
          "default": "./drizzle"
        },
        "breakpoints": {
          "description": "Whether to use SQL breakpoints in generated migrations",
          "type": "boolean",
          "default": true
        },
        "tablesFilter": {
          "description": "Table filter for push/introspect commands (glob patterns)",
          "$ref": "#/definitions/filter"
        },
        "verbose": {
          "description": "Verbose output",
          "type": "boolean",
          "default": false
        },
        "casing": { "$ref": "#/definitions/casing" },
        "migrations": { "$ref": "#/definitions/migrations" },
        "introspect": { "$ref": "#/definitions/introspect" },
        "dbCredentials": { "$ref": "#/definitions/dbCredentials" },
        "schemaFilter": {
          "description": "Schema filter for PostgreSQL (default: ['public'])",
          "default": ["public"],
          "$ref": "#/definitions/filter"
        },
        "extensionsFilters": {
          "$ref": "#/definitions/extensionsFilters"
        },
        "entities": {
          "$ref": "#/definitions/entities"
        }
      },
      "additionalProperties": false
    },
    "multiDbConfig": {
      "type": "object",
      "required": ["databases"],
      "properties": {
        "databases": {
          "description": "Named database configurations for multi-database setup",
          "type": "object",
          "additionalProperties": {
            "oneOf": [
              { "$ref": "#/definitions/sqliteConfig" },
              { "$ref": "#/definitions/tursoConfig" },
              { "$ref": "#/definitions/postgresConfig" }
            ]
          },
          "minProperties": 1
        }
      },
      "additionalProperties": false
    }
  },
  "oneOf": [
    { "$ref": "#/definitions/sqliteConfig" },
    { "$ref": "#/definitions/tursoConfig" },
    { "$ref": "#/definitions/postgresConfig" },
    { "$ref": "#/definitions/multiDbConfig" }
  ]
}
