{
	"$schema": "http://json-schema.org/schema#",
	"description": "MediaWiki extension.json schema",
	"type": "object",
	"properties": {
		"name": {
			"type": "string",
			"description": "The extension's canonical name.",
			"required": true
		},
		"namemsg": {
			"type": "string",
			"description": "i18n message key of the extension's name."
		},
		"type": {
			"type": "string",
			"description": "The extension's type, as an index to $wgExtensionCredits.",
			"default": "other",
			"enum": [
				"api",
				"antispam",
				"datavalues",
				"media",
				"parserhook",
				"semantic",
				"skin",
				"specialpage",
				"variable",
				"other"
			]
		},
		"author": {
			"type": [
				"string",
				"array"
			],
			"description": "Extension's authors.",
			"items": {
				"type": "string"
			},
			"additionalItems": false
		},
		"version": {
			"type": "string",
			"description": "The version of this release of the extension."
		},
		"url": {
			"type": "string",
			"description": "URL to the homepage for the extension.",
			"format": "uri"
		},
		"description": {
			"type": "string",
			"description": "Raw description of the extension."
		},
		"descriptionmsg": {
			"type": "string",
			"description": "Message key for a i18n message describing the extension."
		},
		"license-name": {
			"type": "string",
			"description": "Short identifier for the license under which the extension is released.",
			"enum": [
				"AFL-1.1",
				"AFL-1.2",
				"AFL-2.0",
				"AFL-2.1",
				"AFL-3.0",
				"APL-1.0",
				"Aladdin",
				"ANTLR-PD",
				"Apache-1.0",
				"Apache-1.1",
				"Apache-2.0",
				"APSL-1.0",
				"APSL-1.1",
				"APSL-1.2",
				"APSL-2.0",
				"Artistic-1.0",
				"Artistic-1.0-cl8",
				"Artistic-1.0-Perl",
				"Artistic-2.0",
				"AAL",
				"BitTorrent-1.0",
				"BitTorrent-1.1",
				"BSL-1.0",
				"BSD-2-Clause",
				"BSD-2-Clause-FreeBSD",
				"BSD-2-Clause-NetBSD",
				"BSD-3-Clause",
				"BSD-3-Clause-Clear",
				"BSD-4-Clause",
				"BSD-4-Clause-UC",
				"CECILL-1.0",
				"CECILL-1.1",
				"CECILL-2.0",
				"CECILL-B",
				"CECILL-C",
				"ClArtistic",
				"CNRI-Python",
				"CNRI-Python-GPL-Compatible",
				"CPOL-1.02",
				"CDDL-1.0",
				"CDDL-1.1",
				"CPAL-1.0",
				"CPL-1.0",
				"CATOSL-1.1",
				"Condor-1.1",
				"CC-BY-1.0",
				"CC-BY-2.0",
				"CC-BY-2.5",
				"CC-BY-3.0",
				"CC-BY-ND-1.0",
				"CC-BY-ND-2.0",
				"CC-BY-ND-2.5",
				"CC-BY-ND-3.0",
				"CC-BY-NC-1.0",
				"CC-BY-NC-2.0",
				"CC-BY-NC-2.5",
				"CC-BY-NC-3.0",
				"CC-BY-NC-ND-1.0",
				"CC-BY-NC-ND-2.0",
				"CC-BY-NC-ND-2.5",
				"CC-BY-NC-ND-3.0",
				"CC-BY-NC-SA-1.0",
				"CC-BY-NC-SA-2.0",
				"CC-BY-NC-SA-2.5",
				"CC-BY-NC-SA-3.0",
				"CC-BY-SA-1.0",
				"CC-BY-SA-2.0",
				"CC-BY-SA-2.5",
				"CC-BY-SA-3.0",
				"CC0-1.0",
				"CUA-OPL-1.0",
				"D-FSL-1.0",
				"WTFPL",
				"EPL-1.0",
				"eCos-2.0",
				"ECL-1.0",
				"ECL-2.0",
				"EFL-1.0",
				"EFL-2.0",
				"Entessa",
				"ErlPL-1.1",
				"EUDatagrid",
				"EUPL-1.0",
				"EUPL-1.1",
				"Fair",
				"Frameworx-1.0",
				"FTL",
				"AGPL-1.0",
				"AGPL-3.0",
				"GFDL-1.1",
				"GFDL-1.2",
				"GFDL-1.3",
				"GPL-1.0",
				"GPL-1.0+",
				"GPL-2.0",
				"GPL-2.0+",
				"GPL-2.0-with-autoconf-exception",
				"GPL-2.0-with-bison-exception",
				"GPL-2.0-with-classpath-exception",
				"GPL-2.0-with-font-exception",
				"GPL-2.0-with-GCC-exception",
				"GPL-3.0",
				"GPL-3.0+",
				"GPL-3.0-with-autoconf-exception",
				"GPL-3.0-with-GCC-exception",
				"LGPL-2.1",
				"LGPL-2.1+",
				"LGPL-3.0",
				"LGPL-3.0+",
				"LGPL-2.0",
				"LGPL-2.0+",
				"gSOAP-1.3b",
				"HPND",
				"IBM-pibs",
				"IPL-1.0",
				"Imlib2",
				"IJG",
				"Intel",
				"IPA",
				"ISC",
				"JSON",
				"LPPL-1.3a",
				"LPPL-1.0",
				"LPPL-1.1",
				"LPPL-1.2",
				"LPPL-1.3c",
				"Libpng",
				"LPL-1.02",
				"LPL-1.0",
				"MS-PL",
				"MS-RL",
				"MirOS",
				"MIT",
				"Motosoto",
				"MPL-1.0",
				"MPL-1.1",
				"MPL-2.0",
				"MPL-2.0-no-copyleft-exception",
				"Multics",
				"NASA-1.3",
				"Naumen",
				"NBPL-1.0",
				"NGPL",
				"NOSL",
				"NPL-1.0",
				"NPL-1.1",
				"Nokia",
				"NPOSL-3.0",
				"NTP",
				"OCLC-2.0",
				"ODbL-1.0",
				"PDDL-1.0",
				"OGTSL",
				"OLDAP-2.2.2",
				"OLDAP-1.1",
				"OLDAP-1.2",
				"OLDAP-1.3",
				"OLDAP-1.4",
				"OLDAP-2.0",
				"OLDAP-2.0.1",
				"OLDAP-2.1",
				"OLDAP-2.2",
				"OLDAP-2.2.1",
				"OLDAP-2.3",
				"OLDAP-2.4",
				"OLDAP-2.5",
				"OLDAP-2.6",
				"OLDAP-2.7",
				"OPL-1.0",
				"OSL-1.0",
				"OSL-2.0",
				"OSL-2.1",
				"OSL-3.0",
				"OLDAP-2.8",
				"OpenSSL",
				"PHP-3.0",
				"PHP-3.01",
				"PostgreSQL",
				"Python-2.0",
				"QPL-1.0",
				"RPSL-1.0",
				"RPL-1.1",
				"RPL-1.5",
				"RHeCos-1.1",
				"RSCPL",
				"Ruby",
				"SAX-PD",
				"SGI-B-1.0",
				"SGI-B-1.1",
				"SGI-B-2.0",
				"OFL-1.0",
				"OFL-1.1",
				"SimPL-2.0",
				"Sleepycat",
				"SMLNJ",
				"SugarCRM-1.1.3",
				"SISSL",
				"SISSL-1.2",
				"SPL-1.0",
				"Watcom-1.0",
				"NCSA",
				"VSL-1.0",
				"W3C",
				"WXwindows",
				"Xnet",
				"X11",
				"XFree86-1.1",
				"YPL-1.0",
				"YPL-1.1",
				"Zimbra-1.3",
				"Zlib",
				"ZPL-1.1",
				"ZPL-2.0",
				"ZPL-2.1",
				"Unlicense"
			]
		},
		"ResourceFileModulePaths": {
			"type": "object",
			"description": "Default paths to use for all ResourceLoader file modules",
			"additionalProperties": false,
			"properties": {
				"localBasePath": {
					"type": "string",
					"description": "Base path to prepend to all local paths, relative to current directory"
				},
				"remoteExtPath": {
					"type": "string",
					"description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
				},
				"remoteSkinPath": {
					"type": "string",
					"description": "Base path to prepend to all remote paths, relative to $wgStylePath"
				}
			}
		},
		"ResourceModules": {
			"type": "object",
			"description": "ResourceLoader modules to register",
			"additionalProperties": false,
			"patternProperties": {
				"^[a-zA-Z0-9\\.]+$": {
					"type": "object",
					"description": "A single ResourceLoader module descriptor",
					"properties": {
						"localBasePath": {
							"type": "string",
							"description": "Base path to prepend to all local paths in $options. Defaults to $IP"
						},
						"remoteBasePath": {
							"type": "string",
							"description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
						},
						"remoteExtPath": {
							"type": "string",
							"description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
						},
						"scripts": {
							"type": "array",
							"description": "Scripts to always include (array of file paths)",
							"items": {
								"type": "string"
							}
						},
						"languageScripts": {
							"type": "object",
							"description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
							"patternProperties": {
								"^[a-zA-Z0-9-]{2,}$": {
									"type": [
										"string",
										"array"
									],
									"items": {
										"type": "string"
									}
								}
							}
						},
						"skinScripts": {
							"type": "object",
							"description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
							"patternProperties": {
								".+": {
									"type": [
										"string",
										"array"
									],
									"items": {
										"type": "string"
									}
								}
							}
						},
						"debugScripts": {
							"type": "array",
							"description": "Scripts to include in debug contexts",
							"items": {
								"type": "string"
							}
						},
						"loaderScripts": {
							"type": "array",
							"description": "Scripts to include in the startup module",
							"items": {
								"type": "string"
							}
						},
						"dependencies": {
							"type": "array",
							"description": "Modules which must be loaded before this module",
							"items": {
								"type": "string"
							}
						},
						"styles": {
							"type": "array",
							"description": "Styles to always load",
							"items": {
								"type": "string"
							}
						},
						"skinStyles": {
							"type": "object",
							"description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
							"patternProperties": {
								".+": {
									"type": [
										"string",
										"array"
									],
									"items": {
										"type": "string"
									}
								}
							}
						},
						"messages": {
							"type": "array",
							"description": "Messages to always load",
							"items": {
								"type": "string"
							}
						},
						"group": {
							"type": "string",
							"description": "Group which this module should be loaded together with"
						},
						"position": {
							"type": "string",
							"description": "Position on the page to load this module at",
							"enum": [
								"bottom",
								"top"
							]
						}
					}
				}
			}
		},
		"ResourceModuleSkinStyles": {
			"type": "object",
			"description": "ResourceLoader modules for custom skin styles"
		},
		"ResourceLoaderSources": {
			"type": "object",
			"description": "ResourceLoader sources to register"
		},
		"ResourceLoaderLESSVars": {
			"type": "object",
			"description": "ResourceLoader LESS variables"
		},
		"ResourceLoaderLESSFunctions": {
			"type": "object",
			"description": "ResourceLoader LESS functions"
		},
		"ResourceLoaderLESSImportPaths": {
			"type": "object",
			"description": "ResourceLoader import paths"
		},
		"ConfigRegistry": {
			"type": "object",
			"description": "Registry of factory functions to create Config objects"
		},
		"namespaces": {
			"type": "object",
			"description": "Method to add extra namespaces",
			"properties": {
				"id": {
					"type": "integer"
				},
				"constant": {
					"type": "string"
				},
				"name": {
					"type": "string"
				},
				"gender": {
					"type": "object",
					"properties": {
						"male": {
							"type": "string"
						},
						"female": {
							"type": "string"
						}
					}
				},
				"subpages": {
					"type": "boolean",
					"default": false
				},
				"content": {
					"type": "boolean",
					"default": false
				},
				"defaultcontentmodel": {
					"type": "string"
				}
			}
		},
		"TrackingCategories": {
			"type": "array",
			"description": "Tracking category message keys"
		},
		"DefaultUserOptions": {
			"type": "object",
			"description": "Default values of user options"
		},
		"HiddenPrefs": {
			"type": "array",
			"description": "Preferences users cannot set"
		},
		"GroupPermissions": {
			"type": "object",
			"description": "Default permissions to give to user groups"
		},
		"RevokePermissions": {
			"type": "object",
			"description": "Default permissions to revoke from user groups"
		},
		"ImplicitGroups": {
			"type": "array",
			"description": "Implicit groups"
		},
		"GroupsAddToSelf": {
			"type": "object",
			"description": "Groups a user can add to themselves"
		},
		"GroupsRemoveFromSelf": {
			"type": "object",
			"description": "Groups a user can remove from themselves"
		},
		"AddGroups": {
			"type": "object",
			"description": "Groups a user can add to users"
		},
		"RemoveGroups": {
			"type": "object",
			"description": "Groups a user can remove from users"
		},
		"AvailableRights": {
			"type": "array",
			"description": "User rights added by the extension"
		},
		"ContentHandlers": {
			"type": "object",
			"description": "Mapping of model ID to class name"
		},
		"RateLimits": {
			"type": "object",
			"description": "Rate limits"
		},
		"RecentChangesFlags": {
			"type": "object",
			"description": "Flags (letter symbols) shown on RecentChanges pages"
		},
		"MediaHandlers": {
			"type": "object",
			"description": "Plugins for media file type handling. Each entry in the array maps a MIME type to a PHP class name."
		},
		"ExtensionFunctions": {
			"type": [
				"array",
				"string"
			],
			"description": "Function to call after setup has finished"
		},
		"ExtensionMessagesFiles": {
			"type": "object",
			"description": "File paths containing PHP internationalization data"
		},
		"MessagesDirs": {
			"type": "object",
			"description": "Directory paths containing JSON internationalization data"
		},
		"ExtensionEntryPointListFiles": {
			"type": "object"
		},
		"SpecialPages": {
			"type": "object",
			"description": "SpecialPages implemented in this extension (mapping of page name to class name)"
		},
		"AutoloadClasses": {
			"type": "object"
		},
		"Hooks": {
			"type": "object",
			"description": "Hooks this extension uses (mapping of hook name to callback)"
		},
		"JobClasses": {
			"type": "object",
			"description": "Job types this extension implements (mapping of job type to class name)"
		},
		"LogTypes": {
			"type": "array",
			"description": "List of new log types this extension uses"
		},
		"LogRestrictions": {
			"type": "object"
		},
		"FilterLogTypes": {
			"type": "array"
		},
		"LogNames": {
			"type": "object"
		},
		"LogHeaders": {
			"type": "object"
		},
		"LogActions": {
			"type": "object"
		},
		"LogActionsHandlers": {
			"type": "object"
		},
		"Actions": {
			"type": "object"
		},
		"APIModules": {
			"type": "object"
		},
		"APIFormatModules": {
			"type": "object"
		},
		"APIMetaModules": {
			"type": "object"
		},
		"APIPropModules": {
			"type": "object"
		},
		"APIListModules": {
			"type": "object"
		},
		"ValidSkinNames": {
			"type": "object"
		},
		"callback": {
			"type": [
				"array",
				"string"
			],
			"description": "A function to be called right after MediaWiki processes this file"
		},
		"config": {
			"type": "object",
			"description": "Configuration options for this extension"
		},
		"ParserTestFiles": {
			"type": "array",
			"description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
		}
	}
}
