{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "additionalProperties": false,
  "definitions": {
    "BuildConfiguration": {
      "description": "Available build configurations. Mirrored from `UnrealTargetConfiguration`.",
      "type": "string",
      "enum": [
        "Unknown",
        "Debug",
        "DebugGame",
        "Development",
        "Shipping",
        "Test"
      ]
    },
    "BuildTargetType": {
      "description": "Enumerates build target types.",
      "type": "string",
      "enum": ["Unknown", "Game", "Server", "Client", "Editor", "Program"]
    },
    "ModuleDescriptor": {
      "description": "Description of a loadable module.",
      "type": "object",
      "properties": {
        "AdditionalDependencies": {
          "description": "List of additional dependencies for building this module.",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "type": "string"
          }
        },
        "HasExplicitPlatforms": {
          "description": "When true, an empty PlatformAllowList is interpreted as 'no platforms' with the expectation that explicit platforms will be added in plugin extensions",
          "type": "boolean",
          "default": false
        },
        "LoadingPhase": {
          "description": "When should the module be loaded during the startup sequence? This is sort of an advanced setting.",
          "type": "string",
          "enum": [
            "EarliestPossible",
            "PostConfigInit",
            "PostSplashScreen",
            "PreEarlyLoadingScreen",
            "PreLoadingScreen",
            "PreDefault",
            "Default",
            "PostDefault",
            "PostEngineInit",
            "None",
            "Max"
          ]
        },
        "Name": {
          "description": "Name of this module",
          "type": "string"
        },
        "PlatformAllowList": {
          "description": "List of allowed platforms",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "type": "string"
          }
        },
        "PlatformDenyList": {
          "description": "List of disallowed platforms",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "type": "string"
          }
        },
        "ProgramAllowList": {
          "description": "List of allowed programs",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "type": "string"
          }
        },
        "ProgramDenyList": {
          "description": "List of disallowed programs",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "type": "string"
          }
        },
        "TargetAllowList": {
          "description": "List of allowed targets",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/BuildTargetType"
          }
        },
        "TargetConfigurationAllowList": {
          "description": "List of allowed target configurations",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/BuildConfiguration"
          }
        },
        "TargetConfigurationDenyList": {
          "description": "List of disallowed target configurations",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/BuildConfiguration"
          }
        },
        "TargetDenyList": {
          "description": "List of disallowed targets",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/BuildTargetType"
          }
        },
        "Type": {
          "description": "Usage type of module",
          "type": "string",
          "enum": [
            "Runtime",
            "RuntimeNoCommandlet",
            "RuntimeAndProgram",
            "CookedOnly",
            "UncookedOnly",
            "Developer",
            "DeveloperTool",
            "Editor",
            "EditorNoCommandlet",
            "EditorAndProgram",
            "Program",
            "ServerOnly",
            "ClientOnly",
            "ClientOnlyNoCommandlet",
            "Max"
          ]
        }
      }
    },
    "PluginReferenceDescriptor": {
      "description": "Descriptor for a plugin reference.",
      "type": "object",
      "properties": {
        "Enabled": {
          "description": "Whether it should be enabled by default",
          "type": "boolean",
          "default": true
        },
        "HasExplicitPlatforms": {
          "description": "When true, empty `SupportedTargetPlatforms` and `PlatformAllowList` are interpreted as *no platforms* with the expectation that explicit platforms will be added in plugin platform extensions",
          "type": "boolean",
          "default": false
        },
        "Optional": {
          "description": "Whether this plugin is optional, and the game should silently ignore it not being present",
          "type": "boolean",
          "default": false
        },
        "Description": {
          "description": "Description of the plugin for users that do not have it installed.",
          "type": "string"
        },
        "MarketplaceURL": {
          "description": "URL for this plugin on the marketplace, if the user doesn't have it installed.",
          "type": "string"
        },
        "Name": {
          "description": "Name of the plugin",
          "type": "string"
        },
        "PlatformAllowList": {
          "description": "List of allowed platforms",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "type": "string"
          }
        },
        "PlatformDenyList": {
          "description": "List of disallowed platforms",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "type": "string"
          }
        },
        "TargetAllowList": {
          "description": "List of allowed targets",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/BuildTargetType"
          }
        },
        "TargetConfigurationAllowList": {
          "description": "List of allowed target configurations",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/BuildConfiguration"
          }
        },
        "TargetConfigurationDenyList": {
          "description": "List of disallowed target configurations",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/BuildConfiguration"
          }
        },
        "TargetDenyList": {
          "description": "List of disallowed targets",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/BuildTargetType"
          }
        }
      },
      "required": ["Enabled", "Name"]
    }
  },
  "description": "Descriptor for plugins. Contains all the information contained within a `.uplugin` file.",
  "id": "https://json.schemastore.org/uplugin.json",
  "properties": {
    "CanContainContent": {
      "description": "Can this plugin contain content?",
      "type": "boolean",
      "default": false
    },
    "CanContainVerse": {
      "description": "Can this plugin contain Verse code?",
      "type": "boolean",
      "default": false
    },
    "ExplicitlyLoaded": {
      "description": "When true, this plugin's modules will not be loaded automatically nor will it's content be mounted automatically.",
      "type": "boolean",
      "default": false
    },
    "HasExplicitPlatforms": {
      "description": "When true, an empty SupportedTargetPlatforms is interpreted as 'no platforms' with the expectation that explicit platforms will be added in plugin platform extensions",
      "type": "boolean",
      "default": false
    },
    "Installed": {
      "description": "Signifies that the plugin was installed on top of the engine",
      "type": "boolean",
      "default": false
    },
    "IsBetaVersion": {
      "description": "Marks the plugin as beta in the UI",
      "type": "boolean",
      "default": false
    },
    "IsExperimentalVersion": {
      "description": "Marks the plugin as experimental in the UI",
      "type": "boolean",
      "default": false
    },
    "IsHidden": {
      "description": "For auto-generated plugins that should not be listed in the plugin browser for users to disable freely.",
      "type": "boolean",
      "default": false
    },
    "IsPluginExtension": {
      "description": "If true, this plugin from a platform extension extending another plugin",
      "type": "boolean",
      "default": false
    },
    "RequiresBuildPlatform": {
      "description": "For plugins that are under a platform folder (eg. /PS4/), determines whether compiling the plugin requires the build platform and/or SDK to be available",
      "type": "boolean",
      "default": false
    },
    "Category": {
      "description": "The name of the category this plugin",
      "type": "string",
      "default": "Other"
    },
    "CreatedBy": {
      "description": "The company or individual who created this plugin.",
      "type": "string"
    },
    "CreatedByURL": {
      "description": "Hyperlink URL string for the company or individual who created this plugin. This is optional.",
      "type": "string"
    },
    "Description": {
      "description": "Description of the plugin",
      "type": "string"
    },
    "DocsURL": {
      "description": "Documentation URL string.",
      "type": "string"
    },
    "EditorCustomVirtualPath": {
      "description": "Optional custom virtual path to display in editor to better organize.",
      "type": "string"
    },
    "EnabledByDefault": {
      "description": "Whether this plugin should be enabled by default for all projects",
      "type": "string",
      "enum": ["Unspecified", "Enabled", "Disabled"]
    },
    "EngineVersion": {
      "description": "Version of the engine that this plugin is compatible with",
      "type": "string"
    },
    "FileVersion": {
      "description": "Descriptor version number.",
      "type": "number",
      "default": 3
    },
    "FriendlyName": {
      "description": "Friendly name of the plugin",
      "type": "string"
    },
    "LocalizationTargets": {
      "description": "List of all localization targets associated with this plugin",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "type": "object",
        "required": ["LoadingPolicy", "Name"],
        "properties": {
          "LoadingPolicy": {
            "description": "When should the localization data associated with a target should be loaded?",
            "type": "string",
            "enum": [
              "Never",
              "Always",
              "Editor",
              "Game",
              "PropertyNames",
              "ToolTips",
              "Max"
            ]
          },
          "Name": {
            "description": "Name of this target",
            "type": "string"
          }
        }
      }
    },
    "MarketplaceURL": {
      "description": "Marketplace URL for this plugin.",
      "type": "string"
    },
    "Modules": {
      "description": "List of all modules associated with this plugin",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/ModuleDescriptor"
      }
    },
    "ParentPluginName": {
      "description": "If specified, this is the real plugin that this one is just extending",
      "type": "string"
    },
    "Plugins": {
      "description": "Plugins used by this plugin",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/definitions/PluginReferenceDescriptor"
      }
    },
    "PostBuildSteps": {
      "description": "Post-build steps for each host platform",
      "type": "object",
      "$comment": "Define platform as key, command as value."
    },
    "PreBuildSteps": {
      "description": "Pre-build steps for each host platform",
      "type": "object",
      "$comment": "Define platform as key, command as value."
    },
    "SupportedPrograms": {
      "description": "List of programs that are supported by this plugin.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "type": "string"
      }
    },
    "SupportedTargetPlatforms": {
      "description": "Controls a subset of platforms that can use this plugin, and which ones will stage the `.uplugin` file and content files.",
      "type": "array",
      "uniqueItems": true,
      "items": {
        "type": "string"
      }
    },
    "SupportURL": {
      "description": "Support URL/email for this plugin.",
      "type": "string"
    },
    "Version": {
      "description": "Version number for the plugin.",
      "type": "number",
      "default": 1
    },
    "VersionName": {
      "description": "Name of the version for this plugin.",
      "type": "string",
      "default": "1.0"
    }
  },
  "required": ["FileVersion"],
  "title": "JSON schema for Unreal Engine uplugin",
  "type": "object"
}
