{
	"$schema": "http://json-schema.org/schema#",
	"description": "MediaWiki extension.json schema",
	"type": "object",
	"properties": {
		"manifest_version": {
			"type": "integer",
			"description": "Version of the extension.json schema the extension.json file is in.",
			"required": true
		},
		"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"
		},
		"author": {
			"type": [
				"string",
				"array"
			],
			"description": "Extension's authors.",
			"items": {
				"type": "string"
			}
		},
		"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": [
				"0BSD",
				"AAL",
				"Abstyles",
				"Adobe-2006",
				"Adobe-Glyph",
				"ADSL",
				"AFL-1.1",
				"AFL-1.2",
				"AFL-2.0",
				"AFL-2.1",
				"AFL-3.0",
				"Afmparse",
				"AGPL-1.0",
				"AGPL-3.0",
				"AGPL-3.0-only",
				"AGPL-3.0-or-later",
				"Aladdin",
				"AMDPLPA",
				"AML",
				"AMPAS",
				"ANTLR-PD",
				"Apache-1.0",
				"Apache-1.1",
				"Apache-2.0",
				"APAFML",
				"APL-1.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",
				"Bahyph",
				"Barr",
				"Beerware",
				"BitTorrent-1.0",
				"BitTorrent-1.1",
				"Borceux",
				"BSD-1-Clause",
				"BSD-2-Clause",
				"BSD-2-Clause-FreeBSD",
				"BSD-2-Clause-NetBSD",
				"BSD-2-Clause-Patent",
				"BSD-3-Clause",
				"BSD-3-Clause-Attribution",
				"BSD-3-Clause-Clear",
				"BSD-3-Clause-LBNL",
				"BSD-3-Clause-No-Nuclear-License",
				"BSD-3-Clause-No-Nuclear-License-2014",
				"BSD-3-Clause-No-Nuclear-Warranty",
				"BSD-4-Clause",
				"BSD-4-Clause-UC",
				"BSD-Protection",
				"BSD-Source-Code",
				"BSL-1.0",
				"bzip2-1.0.5",
				"bzip2-1.0.6",
				"Caldera",
				"CATOSL-1.1",
				"CC-BY-1.0",
				"CC-BY-2.0",
				"CC-BY-2.5",
				"CC-BY-3.0",
				"CC-BY-4.0",
				"CC-BY-NC-1.0",
				"CC-BY-NC-2.0",
				"CC-BY-NC-2.5",
				"CC-BY-NC-3.0",
				"CC-BY-NC-4.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-ND-4.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-NC-SA-4.0",
				"CC-BY-ND-1.0",
				"CC-BY-ND-2.0",
				"CC-BY-ND-2.5",
				"CC-BY-ND-3.0",
				"CC-BY-ND-4.0",
				"CC-BY-SA-1.0",
				"CC-BY-SA-2.0",
				"CC-BY-SA-2.5",
				"CC-BY-SA-3.0",
				"CC-BY-SA-4.0",
				"CC0-1.0",
				"CDDL-1.0",
				"CDDL-1.1",
				"CDLA-Permissive-1.0",
				"CDLA-Sharing-1.0",
				"CECILL-1.0",
				"CECILL-1.1",
				"CECILL-2.0",
				"CECILL-2.1",
				"CECILL-B",
				"CECILL-C",
				"ClArtistic",
				"CNRI-Jython",
				"CNRI-Python",
				"CNRI-Python-GPL-Compatible",
				"Condor-1.1",
				"CPAL-1.0",
				"CPL-1.0",
				"CPOL-1.02",
				"Crossword",
				"CrystalStacker",
				"CUA-OPL-1.0",
				"Cube",
				"curl",
				"D-FSL-1.0",
				"diffmark",
				"DOC",
				"Dotseqn",
				"DSDP",
				"dvipdfm",
				"ECL-1.0",
				"ECL-2.0",
				"eCos-2.0",
				"EFL-1.0",
				"EFL-2.0",
				"eGenix",
				"Entessa",
				"EPL-1.0",
				"EPL-2.0",
				"ErlPL-1.1",
				"EUDatagrid",
				"EUPL-1.0",
				"EUPL-1.1",
				"EUPL-1.2",
				"Eurosym",
				"Fair",
				"Frameworx-1.0",
				"FreeImage",
				"FSFAP",
				"FSFUL",
				"FSFULLR",
				"FTL",
				"GFDL-1.1",
				"GFDL-1.1-only",
				"GFDL-1.1-or-later",
				"GFDL-1.2",
				"GFDL-1.2-only",
				"GFDL-1.2-or-later",
				"GFDL-1.3",
				"GFDL-1.3-only",
				"GFDL-1.3-or-later",
				"Giftware",
				"GL2PS",
				"Glide",
				"Glulxe",
				"gnuplot",
				"GPL-1.0",
				"GPL-1.0+",
				"GPL-1.0-only",
				"GPL-1.0-or-later",
				"GPL-2.0",
				"GPL-2.0+",
				"GPL-2.0-only",
				"GPL-2.0-or-later",
				"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-only",
				"GPL-3.0-or-later",
				"GPL-3.0-with-autoconf-exception",
				"GPL-3.0-with-GCC-exception",
				"gSOAP-1.3b",
				"HaskellReport",
				"HPND",
				"IBM-pibs",
				"ICU",
				"IJG",
				"ImageMagick",
				"iMatix",
				"Imlib2",
				"Info-ZIP",
				"Intel",
				"Intel-ACPI",
				"Interbase-1.0",
				"IPA",
				"IPL-1.0",
				"ISC",
				"JasPer-2.0",
				"JSON",
				"LAL-1.2",
				"LAL-1.3",
				"Latex2e",
				"Leptonica",
				"LGPL-2.0",
				"LGPL-2.0+",
				"LGPL-2.0-only",
				"LGPL-2.0-or-later",
				"LGPL-2.1",
				"LGPL-2.1+",
				"LGPL-2.1-only",
				"LGPL-2.1-or-later",
				"LGPL-3.0",
				"LGPL-3.0+",
				"LGPL-3.0-only",
				"LGPL-3.0-or-later",
				"LGPLLR",
				"Libpng",
				"libtiff",
				"LiLiQ-P-1.1",
				"LiLiQ-R-1.1",
				"LiLiQ-Rplus-1.1",
				"LPL-1.0",
				"LPL-1.02",
				"LPPL-1.0",
				"LPPL-1.1",
				"LPPL-1.2",
				"LPPL-1.3a",
				"LPPL-1.3c",
				"MakeIndex",
				"MirOS",
				"MIT",
				"MIT-advertising",
				"MIT-CMU",
				"MIT-enna",
				"MIT-feh",
				"MITNFA",
				"Motosoto",
				"mpich2",
				"MPL-1.0",
				"MPL-1.1",
				"MPL-2.0",
				"MPL-2.0-no-copyleft-exception",
				"MS-PL",
				"MS-RL",
				"MTLL",
				"Multics",
				"Mup",
				"NASA-1.3",
				"Naumen",
				"NBPL-1.0",
				"NCSA",
				"Net-SNMP",
				"NetCDF",
				"Newsletr",
				"NGPL",
				"NLOD-1.0",
				"NLPL",
				"Nokia",
				"NOSL",
				"Noweb",
				"NPL-1.0",
				"NPL-1.1",
				"NPOSL-3.0",
				"NRL",
				"NTP",
				"Nunit",
				"OCCT-PL",
				"OCLC-2.0",
				"ODbL-1.0",
				"OFL-1.0",
				"OFL-1.1",
				"OGTSL",
				"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.2.2",
				"OLDAP-2.3",
				"OLDAP-2.4",
				"OLDAP-2.5",
				"OLDAP-2.6",
				"OLDAP-2.7",
				"OLDAP-2.8",
				"OML",
				"OpenSSL",
				"OPL-1.0",
				"OSET-PL-2.1",
				"OSL-1.0",
				"OSL-1.1",
				"OSL-2.0",
				"OSL-2.1",
				"OSL-3.0",
				"PDDL-1.0",
				"PHP-3.0",
				"PHP-3.01",
				"Plexus",
				"PostgreSQL",
				"psfrag",
				"psutils",
				"Python-2.0",
				"Qhull",
				"QPL-1.0",
				"Rdisc",
				"RHeCos-1.1",
				"RPL-1.1",
				"RPL-1.5",
				"RPSL-1.0",
				"RSA-MD",
				"RSCPL",
				"Ruby",
				"SAX-PD",
				"Saxpath",
				"SCEA",
				"Sendmail",
				"SGI-B-1.0",
				"SGI-B-1.1",
				"SGI-B-2.0",
				"SimPL-2.0",
				"SISSL",
				"SISSL-1.2",
				"Sleepycat",
				"SMLNJ",
				"SMPPL",
				"SNIA",
				"Spencer-86",
				"Spencer-94",
				"Spencer-99",
				"SPL-1.0",
				"StandardML-NJ",
				"SugarCRM-1.1.3",
				"SWL",
				"TCL",
				"TCP-wrappers",
				"TMate",
				"TORQUE-1.1",
				"TOSL",
				"Unicode-DFS-2015",
				"Unicode-DFS-2016",
				"Unicode-TOU",
				"Unlicense",
				"UPL-1.0",
				"Vim",
				"VOSTROM",
				"VSL-1.0",
				"W3C",
				"W3C-19980720",
				"W3C-20150513",
				"Watcom-1.0",
				"Wsuipa",
				"WTFPL",
				"wxWindows",
				"X11",
				"Xerox",
				"XFree86-1.1",
				"xinetd",
				"Xnet",
				"xpp",
				"XSkat",
				"YPL-1.0",
				"YPL-1.1",
				"Zed",
				"Zend-2.0",
				"Zimbra-1.3",
				"Zimbra-1.4",
				"Zlib",
				"zlib-acknowledgement",
				"ZPL-1.1",
				"ZPL-2.0",
				"ZPL-2.1"
			]
		},
		"requires": {
			"type": "object",
			"description": "Indicates what versions of MediaWiki core are required. This syntax may be extended in the future, for example to check dependencies between other extensions.",
			"properties": {
				"MediaWiki": {
					"type": "string",
					"description": "Version constraint string against MediaWiki core."
				}
			}
		},
		"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",
			"patternProperties": {
				"^[a-zA-Z0-9-\\.]+$": {
					"type": "object",
					"anyOf": [
						{
							"description": "A ResourceLoaderFileModule definition",
							"additionalProperties": false,
							"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"
								},
								"skipFunction": {
									"type": "string",
									"description": "Path to a file containing a JavaScript \"skip function\", if desired."
								},
								"scripts": {
									"type": ["string", "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": ["string", "array"],
									"description": "Scripts to include in debug contexts",
									"items": {
										"type": "string"
									}
								},
								"loaderScripts": {
									"type": ["string", "array"],
									"description": "Scripts to include in the startup module",
									"items": {
										"type": "string"
									}
								},
								"dependencies": {
									"type": ["string", "array"],
									"description": "Modules which must be loaded before this module",
									"items": {
										"type": "string"
									}
								},
								"styles": {
									"type": ["string", "array", "object"],
									"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": ["string", "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"
									]
								},
								"templates": {
									"type": ["object", "array"],
									"description": "Templates to be loaded for client-side usage"
								},
								"targets": {
									"type": ["string", "array"],
									"description": "ResourceLoader target the module can run on",
									"items": {
										"type": "string"
									}
								}
							}
						},
						{
							"description": "A ResourceLoaderImageModule definition",
							"additionalProperties": false,
							"properties": {
								"class": {
									"enum": ["ResourceLoaderImageModule"]
								},
								"data": {
									"type": "string"
								},
								"prefix": {
									"type": "string"
								},
								"selector": {
									"type": "string"
								},
								"selectorWithoutVariant": {
									"type": "string"
								},
								"selectorWithVariant": {
									"type": "string"
								},
								"variants": {
									"type": "object"
								},
								"images": {
									"type": "object"
								},
								"position": {
									"enum": [
										"top",
										"bottom"
									]
								}
							}
						},
						{
							"description": "An arbitrary ResourceLoaderModule definition",
							"properties": {
								"class": {
									"type": "string",
									"pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
								}
							},
							"required": ["class"]
						}
					]
				}
			}
		},
		"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"
		},
		"ResourceLoaderLESSImportPaths": {
			"type": "object",
			"description": "ResourceLoader import paths"
		},
		"ConfigRegistry": {
			"type": "object",
			"description": "Registry of factory functions to create Config objects"
		},
		"SessionProviders": {
			"type": "object",
			"description": "Session providers"
		},
		"AuthManagerAutoConfig": {
			"type": "object",
			"description": "AuthManager auto-configuration",
			"additionalProperties": false,
			"properties": {
				"preauth": {
					"type": "object",
					"description": "Pre-authentication providers"
				},
				"primaryauth": {
					"type": "object",
					"description": "Primary authentication providers"
				},
				"secondaryauth": {
					"type": "object",
					"description": "Secondary authentication providers"
				}
			}
		},
		"CentralIdLookupProviders": {
			"type": "object",
			"description": "Central ID lookup providers"
		},
		"namespaces": {
			"type": "array",
			"description": "Method to add extra namespaces",
			"items": {
				"type": "object",
				"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"
					},
					"protection": {
						"type": ["string", "array"],
						"description": "Userright(s) required to edit in this namespace"
					},
					"capitallinkoverride": {
						"type": "boolean",
						"description": "Set $wgCapitalLinks on a per-namespace basis"
					},
					"conditional": {
						"type": "boolean",
						"description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)",
						"default": false
					}
				},
				"required": ["id", "constant", "name"]
			}
		},
		"TrackingCategories": {
			"type": "array",
			"description": "Tracking category message keys",
			"items": {
				"type": "string"
			}
		},
		"DefaultUserOptions": {
			"type": "object",
			"description": "Default values of user options"
		},
		"HiddenPrefs": {
			"type": "array",
			"description": "Preferences users cannot set",
			"items": {
				"type": "string"
			}
		},
		"GroupPermissions": {
			"type": "object",
			"description": "Default permissions to give to user groups",
			"patternProperties": {
				"^[a-z]+$": {
					"type": "object",
					"patternProperties": {
						"^[a-z]+$": {
							"type": "boolean"
						}
					}
				}
			}
		},
		"RevokePermissions": {
			"type": "object",
			"description": "Default permissions to revoke from user groups",
			"patternProperties": {
				"^[a-z]+$": {
					"type": "object",
					"patternProperties": {
						"^[a-z]+$": {
							"type": "boolean"
						}
					}
				}
			}
		},
		"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",
			"items": {
				"type": "string"
			}
		},
		"ContentHandlers": {
			"type": "object",
			"description": "Mapping of model ID to class name",
			"patternProperties": {
				"^[A-Za-z]+$": {
					"type": "string"
				}
			}
		},
		"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",
			"items": {
				"type": "string"
			}
		},
		"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": [ "string", "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": "object"
		},
		"ActionFilteredLogs": {
			"type": "object",
			"description": "List of log types which can be filtered by log actions",
			"patternProperties": {
				"^[a-z-]+$": {
					"type": "object",
					"patternProperties": {
						"^[a-z-]+$": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					}
				}
			}
		},
		"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"
		},
		"FeedClasses": {
			"type": "object",
			"description": "Available feeds objects"
		},
		"SkinOOUIThemes": {
			"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",
			"properties": {
				"_prefix": {
					"type": "string",
					"default": "wg",
					"description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
				}
			},
			"patternProperties": {
				"^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
					"properties": {
						"_merge_strategy": {
							"type": "string",
							"enum": [
								"array_merge_recursive",
								"array_plus_2d",
								"array_plus",
								"array_merge"
							],
							"default": "array_merge"
						}
					}
				}
			}
		},
		"ParserTestFiles": {
			"type": "array",
			"description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
		},
		"load_composer_autoloader": {
			"type": "boolean",
			"description": "Load the composer autoloader for this extension, if one is present"
		}
	}
}
