mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Gadgets
synced 2024-11-28 09:10:07 +00:00
7793a9475f
Gadgets can mark themselves as ES6-only by specifying the requiresES6 boolean attribute. Syntax validation is disabled for them (as the validator doesn't support ES6 yet), and they are loaded together in a separate request. The minifier doesn't reject syntax errors, and thus these would be passed through to web clients. Hence, communities using this feature are encouraged to use ESLint or another linter to make sure only valid ES <= 6 code is being used. Because of the above, this feature is only made available for non-default gadgets. Bug: T75714 Change-Id: Ib98ac0700471554d5721d7ab858d4660e1e0e980
143 lines
3.3 KiB
PHP
143 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Extension\Gadgets;
|
|
|
|
use InvalidArgumentException;
|
|
use MediaWiki\ResourceLoader as RL;
|
|
|
|
/**
|
|
* Class representing a list of resources for one gadget, basically a wrapper
|
|
* around the Gadget class.
|
|
*/
|
|
class GadgetResourceLoaderModule extends RL\WikiModule {
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $id;
|
|
|
|
/**
|
|
* @var Gadget
|
|
*/
|
|
private $gadget;
|
|
|
|
/**
|
|
* @param array $options
|
|
*/
|
|
public function __construct( array $options ) {
|
|
$this->id = $options['id'];
|
|
}
|
|
|
|
/**
|
|
* @return Gadget instance this module is about
|
|
*/
|
|
private function getGadget() {
|
|
if ( !$this->gadget ) {
|
|
try {
|
|
$this->gadget = GadgetRepo::singleton()->getGadget( $this->id );
|
|
} catch ( InvalidArgumentException $e ) {
|
|
// Fallback to a placeholder object...
|
|
$this->gadget = Gadget::newEmptyGadget( $this->id );
|
|
}
|
|
}
|
|
|
|
return $this->gadget;
|
|
}
|
|
|
|
/**
|
|
* Overrides the function from RL\WikiModule class
|
|
* @param RL\Context $context
|
|
* @return array
|
|
*/
|
|
protected function getPages( RL\Context $context ) {
|
|
$gadget = $this->getGadget();
|
|
$pages = [];
|
|
|
|
foreach ( $gadget->getStyles() as $style ) {
|
|
$pages[$style] = [ 'type' => 'style' ];
|
|
}
|
|
|
|
if ( $gadget->supportsResourceLoader() ) {
|
|
foreach ( $gadget->getScripts() as $script ) {
|
|
$pages[$script] = [ 'type' => 'script' ];
|
|
}
|
|
foreach ( $gadget->getJSONs() as $json ) {
|
|
$pages[$json] = [ 'type' => 'data' ];
|
|
}
|
|
}
|
|
|
|
return $pages;
|
|
}
|
|
|
|
/**
|
|
* Overrides RL\WikiModule::getRequireKey()
|
|
* @param string $titleText
|
|
* @return string
|
|
*/
|
|
public function getRequireKey( $titleText ): string {
|
|
return GadgetRepo::singleton()->titleWithoutPrefix( $titleText );
|
|
}
|
|
|
|
/**
|
|
* @param string $fileName
|
|
* @param string $contents
|
|
* @return string
|
|
*/
|
|
protected function validateScriptFile( $fileName, $contents ) {
|
|
// Temporary solution to support gadgets in ES6 by disabling validation
|
|
// for them and putting them in a separate resource group to avoid a syntax error in them
|
|
// from corrupting core/extension-loaded scripts or other non-ES6 gadgets.
|
|
if ( $this->requiresES6() ) {
|
|
return $contents;
|
|
}
|
|
return parent::validateScriptFile( $fileName, $contents );
|
|
}
|
|
|
|
/**
|
|
* Overrides RL\WikiModule::isPackaged()
|
|
* Returns whether this gadget is packaged.
|
|
* @return bool
|
|
*/
|
|
public function isPackaged(): bool {
|
|
return $this->gadget->isPackaged();
|
|
}
|
|
|
|
/**
|
|
* Overrides RL\Module::getDependencies()
|
|
* @param RL\Context|null $context
|
|
* @return string[] Names of resources this module depends on
|
|
*/
|
|
public function getDependencies( RL\Context $context = null ) {
|
|
return $this->getGadget()->getDependencies();
|
|
}
|
|
|
|
/**
|
|
* Overrides RL\WikiModule::getType()
|
|
* @return string RL\Module::LOAD_STYLES or RL\Module::LOAD_GENERAL
|
|
*/
|
|
public function getType() {
|
|
return $this->getGadget()->getType() === 'styles'
|
|
? RL\Module::LOAD_STYLES
|
|
: RL\Module::LOAD_GENERAL;
|
|
}
|
|
|
|
public function getMessages() {
|
|
return $this->getGadget()->getMessages();
|
|
}
|
|
|
|
public function getTargets() {
|
|
return $this->getGadget()->getTargets();
|
|
}
|
|
|
|
public function getSkins(): ?array {
|
|
return $this->getGadget()->getRequiredSkins() ?: null;
|
|
}
|
|
|
|
public function requiresES6(): bool {
|
|
return $this->getGadget()->requiresES6();
|
|
}
|
|
|
|
public function getGroup() {
|
|
return $this->requiresES6() ? 'es6-gadget' : self::GROUP_SITE;
|
|
}
|
|
}
|