Schemas/plugin-registration.schema.json

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "plugin-registration.schema.json",
  "title": "Plugin Registration Configuration",
  "description": "Schema for Dataverse plugin registration configuration files",
  "type": "object",
  "required": ["version", "assemblies"],
  "properties": {
    "$schema": {
      "type": "string",
      "description": "Reference to the JSON schema file"
    },
    "version": {
      "type": "string",
      "description": "Schema version",
      "enum": ["1.0"]
    },
    "generatedAt": {
      "type": "string",
      "format": "date-time",
      "description": "Timestamp when this file was generated"
    },
    "assemblies": {
      "type": "array",
      "description": "List of plugin assemblies to register",
      "items": {
        "$ref": "#/definitions/assembly"
      },
      "minItems": 1
    }
  },
  "definitions": {
    "assembly": {
      "type": "object",
      "required": ["name", "type", "path", "plugins"],
      "properties": {
        "name": {
          "type": "string",
          "description": "Assembly name (without .dll extension)"
        },
        "type": {
          "type": "string",
          "description": "Assembly type",
          "enum": ["Assembly", "Nuget"]
        },
        "solution": {
          "type": "string",
          "description": "Solution unique name to add components to. Required for Nuget type, optional for Assembly type."
        },
        "path": {
          "type": "string",
          "description": "Relative path to the compiled assembly DLL"
        },
        "packagePath": {
          "type": "string",
          "description": "Relative path to the NuGet package (for Nuget type only)"
        },
        "plugins": {
          "type": "array",
          "description": "List of plugin classes in this assembly",
          "items": {
            "$ref": "#/definitions/plugin"
          }
        }
      },
      "if": {
        "properties": {
          "type": { "const": "Nuget" }
        }
      },
      "then": {
        "required": ["name", "type", "path", "plugins", "solution"]
      }
    },
    "plugin": {
      "type": "object",
      "required": ["typeName", "steps"],
      "properties": {
        "typeName": {
          "type": "string",
          "description": "Fully qualified type name of the plugin class"
        },
        "steps": {
          "type": "array",
          "description": "List of SDK message processing steps for this plugin",
          "items": {
            "$ref": "#/definitions/step"
          }
        }
      }
    },
    "step": {
      "type": "object",
      "required": ["name", "message", "entity", "stage", "mode", "executionOrder"],
      "properties": {
        "name": {
          "type": "string",
          "description": "Step name (used for matching existing steps)"
        },
        "message": {
          "type": "string",
          "description": "SDK message name (e.g., Create, Update, Delete, Retrieve)"
        },
        "entity": {
          "type": "string",
          "description": "Logical name of the primary entity this step applies to"
        },
        "secondaryEntity": {
          "type": ["string", "null"],
          "description": "Logical name of the secondary entity for relationship messages (Associate, Disassociate)"
        },
        "stage": {
          "type": "string",
          "description": "Pipeline execution stage",
          "enum": ["PreValidation", "PreOperation", "PostOperation"]
        },
        "mode": {
          "type": "string",
          "description": "Execution mode",
          "enum": ["Synchronous", "Asynchronous"]
        },
        "executionOrder": {
          "type": "integer",
          "description": "Order of execution relative to other plugins on the same step",
          "minimum": 1
        },
        "filteringAttributes": {
          "type": ["string", "null"],
          "description": "Comma-separated list of attributes that trigger this step (for Update message)"
        },
        "configuration": {
          "type": ["string", "null"],
          "description": "Unsecure configuration string passed to the plugin"
        },
        "stepId": {
          "type": ["string", "null"],
          "description": "Optional identifier to link images to specific steps when a plugin has multiple steps"
        },
        "images": {
          "type": "array",
          "description": "List of entity images for this step",
          "items": {
            "$ref": "#/definitions/image"
          }
        }
      }
    },
    "image": {
      "type": "object",
      "required": ["name", "imageType", "entityAlias"],
      "properties": {
        "name": {
          "type": "string",
          "description": "Image name"
        },
        "imageType": {
          "type": "string",
          "description": "Type of entity image",
          "enum": ["PreImage", "PostImage", "Both"]
        },
        "attributes": {
          "type": ["string", "null"],
          "description": "Comma-separated list of attributes to include in the image (null = all attributes)"
        },
        "entityAlias": {
          "type": "string",
          "description": "Alias used to access this image in the plugin execution context"
        }
      }
    }
  }
}