Data/deprecations.schema.json

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://github.com/matejpaunovski/M365DeprecationScanner/blob/main/src/M365DeprecationScanner/Data/deprecations.schema.json",
  "title": "M365DeprecationScanner rule database",
  "description": "List of deprecated or retired Microsoft 365 / Entra / Azure PowerShell commands, parameters, modules and endpoints.",
  "type": "object",
  "required": ["schemaVersion", "lastUpdated", "rules"],
  "additionalProperties": false,
  "properties": {
    "$schema": { "type": "string" },
    "schemaVersion": { "type": "integer", "const": 1 },
    "lastUpdated": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
    "rules": {
      "type": "array",
      "minItems": 1,
      "items": { "$ref": "#/definitions/rule" }
    }
  },
  "definitions": {
    "rule": {
      "type": "object",
      "required": ["id", "kind", "pattern", "area", "status", "title", "replacement", "sources"],
      "additionalProperties": false,
      "properties": {
        "id": {
          "description": "Stable, unique rule id. Prefix by area, e.g. MSOL0001. Never reuse or renumber an id.",
          "type": "string",
          "pattern": "^[A-Z]{2,8}\\d{4}$"
        },
        "kind": {
          "description": "Command = a cmdlet/function name. Parameter = a parameter on a specific command. Module = Import-Module / Install-Module / #Requires -Modules. StringLiteral = a regex matched against string literals (URLs, endpoints).",
          "type": "string",
          "enum": ["Command", "Parameter", "Module", "StringLiteral"]
        },
        "pattern": {
          "description": "Command/Parameter/Module: name, may contain * and ? wildcards (case-insensitive). StringLiteral: a .NET regular expression (case-insensitive).",
          "type": "string",
          "minLength": 1
        },
        "exclude": {
          "description": "Command/Module rules only: names (wildcards allowed) the pattern must NOT match, e.g. valid cmdlets caught by a broad catch-all.",
          "type": "array",
          "items": { "type": "string", "minLength": 1 }
        },
        "command": {
          "description": "Required when kind = Parameter: the command (wildcards allowed) the parameter belongs to.",
          "type": "string"
        },
        "area": {
          "description": "Product area, used for grouping in reports.",
          "type": "string",
          "enum": ["MSOnline", "AzureAD", "ExchangeOnline", "MicrosoftGraph", "AzureADGraph", "Azure", "Teams", "SharePoint", "Intune", "Other"]
        },
        "module": {
          "description": "The legacy module the matched item comes from.",
          "type": "string"
        },
        "status": {
          "description": "Retired = no longer works. Deprecated = still works but end of support/retirement announced or passed. Announced = retirement announced for the future.",
          "type": "string",
          "enum": ["Retired", "Deprecated", "Announced"]
        },
        "retirementDate": {
          "description": "Date the item stops/stopped working (YYYY-MM-DD or YYYY-MM). Omit if unknown.",
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}(-\\d{2})?$"
        },
        "title": {
          "description": "One short sentence describing the problem.",
          "type": "string",
          "minLength": 5
        },
        "replacement": {
          "description": "What to use instead (command, module or approach).",
          "type": "string",
          "minLength": 1
        },
        "replacementModule": {
          "type": "string"
        },
        "notes": {
          "description": "Migration hints: parameter differences, permission scopes, output object changes.",
          "type": "string"
        },
        "sources": {
          "description": "Official URLs backing this rule. Prefer learn.microsoft.com / techcommunity.microsoft.com.",
          "type": "array",
          "minItems": 1,
          "items": { "type": "string", "pattern": "^https://" }
        }
      },
      "if": { "properties": { "kind": { "const": "Parameter" } } },
      "then": { "required": ["command"] }
    }
  }
}