From 72df451bd30304d03cc9fc9c77185542c3490e7e Mon Sep 17 00:00:00 2001 From: jdlrobson Date: Tue, 2 Jul 2019 14:10:10 -0700 Subject: [PATCH] Embrace packageFiles Help with readability by using module.exports and require rather than the MobileFrontend provided mw.mobileFrontend module manager (and avoid adopting webpack at this time) Replace usages of mw.mobileFrontend.require with local require and module.exports (compatible with RL or Node implementation) Changes: * Notifications modules are merged into skins.minerva.scripts and initialised via a client side check. * new file overlayManager for exporting an overlayManager singleton rather than being hidden inside resources/skins.minerva.scripts/init.js * All M.define/M.requires swapped out for require where possible The `define` method is now forbidden in the repo. Bug: T212944 Change-Id: I44790dd3fc6fe42bb502d79c39c4081c223bf2b1 --- .eslintrc.json | 4 ++ components/ToggleList/ToggleList.js | 8 +-- includes/MinervaHooks.php | 16 +++--- includes/skins/SkinMinerva.php | 4 -- resources/skins.minerva.options/categories.js | 2 +- resources/skins.minerva.scripts/AB.js | 2 +- .../NotificationBadge.js | 4 +- resources/skins.minerva.scripts/TitleUtil.js | 10 ++-- resources/skins.minerva.scripts/Toolbar.js | 8 +-- resources/skins.minerva.scripts/UriUtil.js | 8 +-- .../downloadPageAction.js | 10 +++- resources/skins.minerva.scripts/init.js | 36 +++++++++--- .../skins.minerva.scripts/initLogging.js | 10 ++-- resources/skins.minerva.scripts/menu.js | 55 +++++++++---------- .../skins.minerva.scripts/menu/MainMenu.js | 2 +- .../skins.minerva.scripts/mobileRedirect.js | 11 +--- .../notifications.js} | 11 ++-- .../skins.minerva.scripts/overlayManager.js | 6 ++ .../page-issues/index.js | 10 ++-- .../page-issues/overlay/IssueList.js | 4 +- .../page-issues/overlay/IssueNotice.js | 2 +- .../page-issues/overlay/pageIssuesOverlay.js | 4 +- .../page/PageIssueLearnMoreLink.js | 6 +- .../page-issues/page/PageIssueLink.js | 6 +- .../page-issues/page/pageIssueFormatter.js | 12 ++-- .../page-issues/parser.js | 4 +- resources/skins.minerva.scripts/preInit.js | 12 ++-- resources/skins.minerva.scripts/references.js | 5 +- resources/skins.minerva.scripts/search.js | 7 ++- resources/skins.minerva.talk/init.js | 5 +- skin.json | 47 +++------------- tests/qunit/skins.minerva.scripts/AB.test.js | 2 +- .../NotificationBadge.test.js | 5 +- .../skins.minerva.scripts/TitleUtil.test.js | 6 +- .../skins.minerva.scripts/UriUtil.test.js | 6 +- .../downloadPageAction.test.js | 5 +- tests/qunit/skins.minerva.scripts/index.js | 15 +++++ .../index.test.js} | 2 +- .../parser.test.js} | 6 +- tests/qunit/skins.minerva.scripts/stubs.js | 4 -- .../step_definitions/notification_steps.js | 2 +- 41 files changed, 198 insertions(+), 186 deletions(-) rename resources/{skins.minerva.notifications.badge => skins.minerva.scripts}/NotificationBadge.js (94%) rename resources/{skins.minerva.notifications/init.js => skins.minerva.scripts/notifications.js} (93%) create mode 100644 resources/skins.minerva.scripts/overlayManager.js rename tests/qunit/{skins.minerva.notifications.badge => skins.minerva.scripts}/NotificationBadge.test.js (89%) create mode 100644 tests/qunit/skins.minerva.scripts/index.js rename tests/qunit/skins.minerva.scripts/{pageIssues.test.js => page-issues/index.test.js} (93%) rename tests/qunit/skins.minerva.scripts/{pageIssuesParser.test.js => page-issues/parser.test.js} (97%) delete mode 100644 tests/qunit/skins.minerva.scripts/stubs.js diff --git a/.eslintrc.json b/.eslintrc.json index 81db53f..63c7580 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -15,6 +15,10 @@ "rules": { "no-restricted-properties": [ "error", + { + "property": "define", + "message": "The method `define` if used with mw.mobileFrontend is deprecated. Please use `module.exports`." + }, { "property": "done", "message": "The method `done` if used with Deferred objects is incompatible with ES6 Promises. Please use `then`." diff --git a/components/ToggleList/ToggleList.js b/components/ToggleList/ToggleList.js index 558799c..af763ed 100644 --- a/components/ToggleList/ToggleList.js +++ b/components/ToggleList/ToggleList.js @@ -1,4 +1,4 @@ -( function ( M ) { +( function () { var /** The component selector. */ selector = '.toggle-list', @@ -91,9 +91,9 @@ checkbox.setAttribute( 'aria-expanded', ( !!checkbox.checked ).toString() ); } - M.define( 'skins.minerva.scripts/ToggleList', Object.freeze( { + module.exports = Object.freeze( { selector: selector, render: render, bind: bind - } ) ); -}( mw.mobileFrontend ) ); + } ); +}() ); diff --git a/includes/MinervaHooks.php b/includes/MinervaHooks.php index e174863..ad6e4fc 100644 --- a/includes/MinervaHooks.php +++ b/includes/MinervaHooks.php @@ -111,17 +111,19 @@ class MinervaHooks { $testModule = [ 'dependencies' => [ 'mobile.startup', - 'skins.minerva.notifications.badge', 'mediawiki.user', 'mediawiki.experiments' ], + 'templates' => [ + "badge.mustache" => "includes/skins/userNotifications.mustache", + ], 'localBasePath' => dirname( __DIR__ ), 'remoteSkinPath' => 'MinervaNeue', 'targets' => [ 'mobile', 'desktop' ], - 'scripts' => [ + 'packageFiles' => [ // additional scaffolding (minus initialisation scripts) - 'tests/qunit/skins.minerva.scripts/stubs.js', - + 'tests/qunit/skins.minerva.scripts/index.js', + 'resources/skins.minerva.scripts/NotificationBadge.js', 'resources/skins.minerva.scripts/page-issues/parser.js', 'resources/skins.minerva.scripts/downloadPageAction.js', 'resources/skins.minerva.scripts/AB.js', @@ -136,12 +138,12 @@ class MinervaHooks { 'resources/skins.minerva.scripts/TitleUtil.js', // test files 'tests/qunit/skins.minerva.scripts/downloadPageAction.test.js', - 'tests/qunit/skins.minerva.scripts/pageIssuesParser.test.js', + 'tests/qunit/skins.minerva.scripts/page-issues/parser.test.js', 'tests/qunit/skins.minerva.scripts/AB.test.js', - 'tests/qunit/skins.minerva.scripts/pageIssues.test.js', + 'tests/qunit/skins.minerva.scripts/page-issues/index.test.js', 'tests/qunit/skins.minerva.scripts/UriUtil.test.js', 'tests/qunit/skins.minerva.scripts/TitleUtil.test.js', - 'tests/qunit/skins.minerva.notifications.badge/NotificationBadge.test.js' + 'tests/qunit/skins.minerva.scripts/NotificationBadge.test.js' ], ]; diff --git a/includes/skins/SkinMinerva.php b/includes/skins/SkinMinerva.php index a2f06ef..9bd65ea 100644 --- a/includes/skins/SkinMinerva.php +++ b/includes/skins/SkinMinerva.php @@ -829,10 +829,6 @@ class SkinMinerva extends SkinTemplate { $modules[] = 'skins.minerva.watchstar'; } - if ( $user->isLoggedIn() && $this->useEcho() ) { - $modules[] = 'skins.minerva.notifications'; - } - // TalkOverlay feature if ( $this->getUserPageHelper()->isUserPage() || diff --git a/resources/skins.minerva.options/categories.js b/resources/skins.minerva.options/categories.js index b269b6f..1a497a6 100644 --- a/resources/skins.minerva.options/categories.js +++ b/resources/skins.minerva.options/categories.js @@ -4,7 +4,7 @@ module.exports = function () { mobile = M.require( 'mobile.startup' ), loader = mobile.rlModuleLoader, features = mw.config.get( 'wgMinervaFeatures', {} ), - overlayManager = M.require( 'skins.minerva.scripts/overlayManager' ), + overlayManager = require( 'skins.minerva.scripts' ).overlayManager, eventBus = mobile.eventBusSingleton, isAnon = mw.user.isAnon(); diff --git a/resources/skins.minerva.scripts/AB.js b/resources/skins.minerva.scripts/AB.js index 62f8eba..f8cd578 100644 --- a/resources/skins.minerva.scripts/AB.js +++ b/resources/skins.minerva.scripts/AB.js @@ -73,5 +73,5 @@ }; } - M.define( 'skins.minerva.scripts/AB', AB ); + module.exports = AB; }( mw.mobileFrontend, mw.experiments ) ); diff --git a/resources/skins.minerva.notifications.badge/NotificationBadge.js b/resources/skins.minerva.scripts/NotificationBadge.js similarity index 94% rename from resources/skins.minerva.notifications.badge/NotificationBadge.js rename to resources/skins.minerva.scripts/NotificationBadge.js index 19df955..3ac08f1 100644 --- a/resources/skins.minerva.notifications.badge/NotificationBadge.js +++ b/resources/skins.minerva.scripts/NotificationBadge.js @@ -58,7 +58,7 @@ } mfExtend( NotificationBadge, View, { - template: mw.template.get( 'skins.minerva.notifications.badge', 'badge.mustache' ), + template: mw.template.get( 'skins.minerva.scripts', 'badge.mustache' ), /** * Update the notification count * @memberof NotificationBadge @@ -88,5 +88,5 @@ } } ); - M.define( 'skins.minerva.notifications/NotificationBadge', NotificationBadge ); + module.exports = NotificationBadge; }( mw.mobileFrontend ) ); diff --git a/resources/skins.minerva.scripts/TitleUtil.js b/resources/skins.minerva.scripts/TitleUtil.js index 868eb18..b08980a 100644 --- a/resources/skins.minerva.scripts/TitleUtil.js +++ b/resources/skins.minerva.scripts/TitleUtil.js @@ -3,8 +3,8 @@ // of a SiteInfo, it still becomes a public API. If it lives where used, it becomes a copy and paste // implementation where each copy can deviate but deletion is easy. See additional discussion in // T218358 and I95b08e77eece5cd4dae62f6f237d492d6b0fe42b. -( function ( M ) { - var UriUtil = M.require( 'skins.minerva.scripts/UriUtil' ); +( function () { + var UriUtil = require( './UriUtil.js' ); /** * Returns the decoded wiki page title referenced by the passed link as a string when parsable. @@ -132,7 +132,7 @@ return length === ( ( 'oldid' in uri.query ? 1 : 0 ) + ( 'title' in uri.query ? 1 : 0 ) ); } - M.define( 'skins.minerva.scripts/TitleUtil', { + module.exports = { newFromUri: newFromUri - } ); -}( mw.mobileFrontend ) ); + }; +}() ); diff --git a/resources/skins.minerva.scripts/Toolbar.js b/resources/skins.minerva.scripts/Toolbar.js index 3667705..2262e20 100644 --- a/resources/skins.minerva.scripts/Toolbar.js +++ b/resources/skins.minerva.scripts/Toolbar.js @@ -1,8 +1,8 @@ ( function ( M ) { var mobile = M.require( 'mobile.startup' ), - ToggleList = M.require( 'skins.minerva.scripts/ToggleList' ), - downloadPageAction = M.require( 'skins.minerva.scripts/downloadPageAction' ), + ToggleList = require( '../../components/ToggleList/ToggleList.js' ), + downloadPageAction = require( './downloadPageAction.js' ).downloadPageAction, Icon = mobile.Icon, skin = M.require( 'mobile.init/skin' ), /** The top level menu. */ @@ -105,9 +105,9 @@ } } - M.define( 'skins.minerva.scripts/Toolbar', { + module.exports = { selector: toolbarSelector, bind: bind, render: render - } ); + }; }( mw.mobileFrontend ) ); diff --git a/resources/skins.minerva.scripts/UriUtil.js b/resources/skins.minerva.scripts/UriUtil.js index 2def8b8..448852f 100644 --- a/resources/skins.minerva.scripts/UriUtil.js +++ b/resources/skins.minerva.scripts/UriUtil.js @@ -1,4 +1,4 @@ -( function ( M ) { +( function () { /** * Compares the default Uri host, usually `window.location.host`, and `mw.Uri.host`. Equivalence * tests internal linkage, a mismatch may indicate an external link. Interwiki links are @@ -28,7 +28,7 @@ return uri.host === mw.Uri().host; } - M.define( 'skins.minerva.scripts/UriUtil', { + module.exports = { isInternal: isInternal - } ); -}( mw.mobileFrontend ) ); + }; +}() ); diff --git a/resources/skins.minerva.scripts/downloadPageAction.js b/resources/skins.minerva.scripts/downloadPageAction.js index 4212136..df3e689 100644 --- a/resources/skins.minerva.scripts/downloadPageAction.js +++ b/resources/skins.minerva.scripts/downloadPageAction.js @@ -158,7 +158,11 @@ } } - M.define( 'skins.minerva.scripts/test/getOnClickHandler', getOnClickHandler ); - M.define( 'skins.minerva.scripts/test/isAvailable', isAvailable ); - M.define( 'skins.minerva.scripts/downloadPageAction', downloadPageAction ); + module.exports = { + downloadPageAction: downloadPageAction, + test: { + isAvailable: isAvailable, + getOnClickHandler: getOnClickHandler + } + }; }( mw.mobileFrontend, mw.track, mw.msg ) ); diff --git a/resources/skins.minerva.scripts/init.js b/resources/skins.minerva.scripts/init.js index ad5fdf2..541de33 100644 --- a/resources/skins.minerva.scripts/init.js +++ b/resources/skins.minerva.scripts/init.js @@ -4,15 +4,20 @@ PageGateway = mobile.PageGateway, toast = mobile.toast, time = mobile.time, - TitleUtil = M.require( 'skins.minerva.scripts/TitleUtil' ), - issues = M.require( 'skins.minerva.scripts/pageIssues' ), - Toolbar = M.require( 'skins.minerva.scripts/Toolbar' ), + notifications = require( './notifications.js' ), + preInit = require( './preInit.js' ), + initLogging = require( './initLogging.js' ), + mobileRedirect = require( './mobileRedirect.js' ), + search = require( './search.js' ), + references = require( './references.js' ), + TitleUtil = require( './TitleUtil.js' ), + issues = require( './page-issues/index.js' ), + Toolbar = require( './Toolbar.js' ), router = require( 'mediawiki.router' ), - OverlayManager = mobile.OverlayManager, CtaDrawer = mobile.CtaDrawer, Button = mobile.Button, Anchor = mobile.Anchor, - overlayManager = OverlayManager.getSingleton(), + overlayManager = require( './overlayManager.js' ), currentPage = mobile.currentPage(), currentPageHTMLParser = mobile.currentPageHTMLParser(), $redLinks = currentPageHTMLParser.getRedLinks(), @@ -334,6 +339,18 @@ $( function () { var toolbarElement = document.querySelector( Toolbar.selector ); + // Init: + // - main menu closes when you click outside of it + // - redirects show a toast. + preInit(); + // - logging + initLogging(); + // - references + references(); + // - search + search(); + // - mobile redirect + mobileRedirect(); // Update anything else that needs enhancing (e.g. watchlist) initModifiedInfo(); initRegistrationInfo(); @@ -351,7 +368,12 @@ if ( !currentPage.isMissing ) { issues.init( overlayManager, currentPageHTMLParser ); } + // If Echo is installed (using config as a proxy) and user is logged in init notifications + if ( !mw.user.isAnon() && mw.config.get( 'wgEchoMaxNotificationCount' ) !== undefined ) { + notifications(); + } } ); - - M.define( 'skins.minerva.scripts/overlayManager', overlayManager ); + module.exports = { + overlayManager: overlayManager + }; }( mw.mobileFrontend ) ); diff --git a/resources/skins.minerva.scripts/initLogging.js b/resources/skins.minerva.scripts/initLogging.js index d5f7d9c..ceee507 100644 --- a/resources/skins.minerva.scripts/initLogging.js +++ b/resources/skins.minerva.scripts/initLogging.js @@ -1,9 +1,7 @@ // This initialises EventLogging for main menu and some prominent links in the UI. // This code should only be loaded on the Minerva skin, it does not apply to other skins. -( function ( M ) { - var mainMenu = M.require( 'skins.minerva.scripts/mainMenu' ); +var mainMenu = require( './menu.js' ); - $( function () { - mainMenu.enableLogging(); - } ); -}( mw.mobileFrontend ) ); +module.exports = function () { + mainMenu.enableLogging(); +}; diff --git a/resources/skins.minerva.scripts/menu.js b/resources/skins.minerva.scripts/menu.js index 6a99f14..a0b1114 100644 --- a/resources/skins.minerva.scripts/menu.js +++ b/resources/skins.minerva.scripts/menu.js @@ -1,34 +1,31 @@ -( function ( M ) { - var MainMenu = M.require( 'skins.minerva.scripts/MainMenu' ), - mainMenu = createMainMenu(); +var MainMenu = require( './menu/MainMenu.js' ), + mainMenu = createMainMenu(); - /** - * Creates an instance of the `MainMenu`, using the `wgMinervaMenuData` for configuration. - * - * N.B. that the activator - the UI element that the user must click in order to open the main - * menu - is always `.header .main-menu-button`. - * - * @return {MainMenu} - * - * @ignore - */ - function createMainMenu() { - // Failsafe in case this is not defined e.g. T225423 - var options = mw.config.get( 'wgMinervaMenuData', {} ); +/** + * Creates an instance of the `MainMenu`, using the `wgMinervaMenuData` for configuration. + * + * N.B. that the activator - the UI element that the user must click in order to open the main + * menu - is always `.header .main-menu-button`. + * + * @return {MainMenu} + * + * @ignore + */ +function createMainMenu() { + var options = mw.config.get( 'wgMinervaMenuData', {} ); - options.activator = '.header .main-menu-button'; + options.activator = '.header .main-menu-button'; - return new MainMenu( options ); + return new MainMenu( options ); +} + +$( function () { + // eslint-disable-next-line no-jquery/no-global-selector + if ( !$( '#mw-mf-page-left' ).find( '.menu' ).length ) { + // Now we have a main menu button register it. + mainMenu.registerClickEvents(); + mainMenu.appendTo( '#mw-mf-page-left' ); } +} ); - $( function () { - // eslint-disable-next-line no-jquery/no-global-selector - if ( !$( '#mw-mf-page-left' ).find( '.menu' ).length ) { - // Now we have a main menu button register it. - mainMenu.registerClickEvents(); - mainMenu.appendTo( '#mw-mf-page-left' ); - } - } ); - - M.define( 'skins.minerva.scripts/mainMenu', mainMenu ); -}( mw.mobileFrontend ) ); +module.exports = mainMenu; diff --git a/resources/skins.minerva.scripts/menu/MainMenu.js b/resources/skins.minerva.scripts/menu/MainMenu.js index 96137d2..1679472 100644 --- a/resources/skins.minerva.scripts/menu/MainMenu.js +++ b/resources/skins.minerva.scripts/menu/MainMenu.js @@ -131,6 +131,6 @@ } } ); - M.define( 'skins.minerva.scripts/MainMenu', MainMenu ); + module.exports = MainMenu; }( mw.mobileFrontend ) ); diff --git a/resources/skins.minerva.scripts/mobileRedirect.js b/resources/skins.minerva.scripts/mobileRedirect.js index 10b7198..8e8ed6a 100644 --- a/resources/skins.minerva.scripts/mobileRedirect.js +++ b/resources/skins.minerva.scripts/mobileRedirect.js @@ -1,11 +1,7 @@ /* * Warn people if they're trying to switch to desktop but have cookies disabled. */ - -( function ( M ) { - - var popup = M.require( 'mobile.startup' ).toast; - +module.exports = function () { /** * Checks whether cookies are enabled * @method @@ -36,7 +32,7 @@ */ function desktopViewClick() { if ( !cookiesEnabled() ) { - popup.show( + mw.notify( mw.msg( 'mobile-frontend-cookies-required' ), { type: 'error' } ); @@ -47,5 +43,4 @@ // eslint-disable-next-line no-jquery/no-global-selector $( '#mw-mf-display-toggle' ).on( 'click', desktopViewClick ); - -}( mw.mobileFrontend ) ); +}; diff --git a/resources/skins.minerva.notifications/init.js b/resources/skins.minerva.scripts/notifications.js similarity index 93% rename from resources/skins.minerva.notifications/init.js rename to resources/skins.minerva.scripts/notifications.js index 9d018ac..0942e27 100644 --- a/resources/skins.minerva.notifications/init.js +++ b/resources/skins.minerva.scripts/notifications.js @@ -2,14 +2,15 @@ * This code loads the necessary modules for the notifications overlay, not to be confused * with the Toast notifications defined by common/toast.js. */ -( function ( M ) { +module.exports = function () { var badge, - mainMenu = M.require( 'skins.minerva.scripts/mainMenu' ), + M = mw.mobileFrontend, + mainMenu = require( './menu.js' ), router = require( 'mediawiki.router' ), mobile = M.require( 'mobile.startup' ), util = mobile.util, - NotificationBadge = M.require( 'skins.minerva.notifications/NotificationBadge' ), - overlayManager = M.require( 'skins.minerva.scripts/overlayManager' ), + NotificationBadge = require( './NotificationBadge.js' ), + overlayManager = require( './overlayManager.js' ), initialized = false; function showNotificationOverlay() { @@ -106,4 +107,4 @@ } ); } ); -}( mw.mobileFrontend ) ); +}; diff --git a/resources/skins.minerva.scripts/overlayManager.js b/resources/skins.minerva.scripts/overlayManager.js new file mode 100644 index 0000000..28a3a74 --- /dev/null +++ b/resources/skins.minerva.scripts/overlayManager.js @@ -0,0 +1,6 @@ +var + mobile = mw.mobileFrontend.require( 'mobile.startup' ), + OverlayManager = mobile.OverlayManager, + overlayManager = OverlayManager.getSingleton(); + +module.exports = overlayManager; diff --git a/resources/skins.minerva.scripts/page-issues/index.js b/resources/skins.minerva.scripts/page-issues/index.js index b916dd8..7d5e342 100644 --- a/resources/skins.minerva.scripts/page-issues/index.js +++ b/resources/skins.minerva.scripts/page-issues/index.js @@ -9,9 +9,9 @@ NS_CATEGORY = 14, CURRENT_NS = config.get( 'wgNamespaceNumber' ), features = mw.config.get( 'wgMinervaFeatures', {} ), - pageIssuesParser = M.require( 'skins.minerva.scripts/pageIssuesParser' ), - pageIssuesOverlay = M.require( 'skins.minerva.scripts/pageIssuesOverlay' ), - pageIssueFormatter = M.require( 'skins.minerva.scripts/page-issues/page/pageIssueFormatter' ), + pageIssuesParser = require( './parser.js' ), + pageIssuesOverlay = require( './overlay/pageIssuesOverlay.js' ), + pageIssueFormatter = require( './page/pageIssueFormatter.js' ), // When the query string flag is set force on new treatment. // When wgMinervaPageIssuesNewTreatment is the default this line can be removed. QUERY_STRING_FLAG = mw.util.getParamValue( 'minerva-issues' ), @@ -194,11 +194,11 @@ } ); } - M.define( 'skins.minerva.scripts/pageIssues', { + module.exports = { init: initPageIssues, test: { insertBannersOrNotice: insertBannersOrNotice } - } ); + }; }( mw.mobileFrontend ) ); diff --git a/resources/skins.minerva.scripts/page-issues/overlay/IssueList.js b/resources/skins.minerva.scripts/page-issues/overlay/IssueList.js index 1448568..a19e3d8 100644 --- a/resources/skins.minerva.scripts/page-issues/overlay/IssueList.js +++ b/resources/skins.minerva.scripts/page-issues/overlay/IssueList.js @@ -3,7 +3,7 @@ mobile = M.require( 'mobile.startup' ), mfExtend = mobile.mfExtend, View = mobile.View, - IssueNotice = M.require( 'skins.minerva.scripts/IssueNotice' ); + IssueNotice = require( './IssueNotice.js' ); /** * IssueList @@ -29,5 +29,5 @@ } } ); - M.define( 'skins.minerva.scripts/IssueList', IssueList ); + module.exports = IssueList; }( mw.mobileFrontend ) ); diff --git a/resources/skins.minerva.scripts/page-issues/overlay/IssueNotice.js b/resources/skins.minerva.scripts/page-issues/overlay/IssueNotice.js index cdcaaae..eb8e9a2 100644 --- a/resources/skins.minerva.scripts/page-issues/overlay/IssueNotice.js +++ b/resources/skins.minerva.scripts/page-issues/overlay/IssueNotice.js @@ -22,5 +22,5 @@ this.$el.find( '.issue-notice' ).prepend( this.options.issue.icon.$el ); } } ); - M.define( 'skins.minerva.scripts/IssueNotice', IssueNotice ); + module.exports = IssueNotice; }( mw.mobileFrontend ) ); diff --git a/resources/skins.minerva.scripts/page-issues/overlay/pageIssuesOverlay.js b/resources/skins.minerva.scripts/page-issues/overlay/pageIssuesOverlay.js index cc8da63..39dd622 100644 --- a/resources/skins.minerva.scripts/page-issues/overlay/pageIssuesOverlay.js +++ b/resources/skins.minerva.scripts/page-issues/overlay/pageIssuesOverlay.js @@ -1,7 +1,7 @@ ( function ( M, mwMsg ) { var Overlay = M.require( 'mobile.startup' ).Overlay, - IssueList = M.require( 'skins.minerva.scripts/IssueList' ), + IssueList = require( './IssueList.js' ), KEYWORD_ALL_SECTIONS = 'all', NS_MAIN = 0, NS_TALK = 1, @@ -53,5 +53,5 @@ } } - M.define( 'skins.minerva.scripts/pageIssuesOverlay', pageIssuesOverlay ); + module.exports = pageIssuesOverlay; }( mw.mobileFrontend, mw.msg ) ); diff --git a/resources/skins.minerva.scripts/page-issues/page/PageIssueLearnMoreLink.js b/resources/skins.minerva.scripts/page-issues/page/PageIssueLearnMoreLink.js index 72fc07c..1a173cf 100644 --- a/resources/skins.minerva.scripts/page-issues/page/PageIssueLearnMoreLink.js +++ b/resources/skins.minerva.scripts/page-issues/page/PageIssueLearnMoreLink.js @@ -1,4 +1,4 @@ -( function ( M ) { +( function () { /** * Creates a "read more" button with given text. * @param {string} msg @@ -10,5 +10,5 @@ .text( msg ); } - M.define( 'skins.minerva.scripts/page-issues/page/PageIssueLearnMoreLink', newPageIssueLearnMoreLink ); -}( mw.mobileFrontend ) ); + module.exports = newPageIssueLearnMoreLink; +}() ); diff --git a/resources/skins.minerva.scripts/page-issues/page/PageIssueLink.js b/resources/skins.minerva.scripts/page-issues/page/PageIssueLink.js index 679ba8f..f007e17 100644 --- a/resources/skins.minerva.scripts/page-issues/page/PageIssueLink.js +++ b/resources/skins.minerva.scripts/page-issues/page/PageIssueLink.js @@ -1,4 +1,4 @@ -( function ( M ) { +( function () { /** * Create a link element that opens the issues overlay. * @@ -9,5 +9,5 @@ return $( '' ).addClass( 'cleanup mw-mf-cleanup' ).text( labelText ); } - M.define( 'skins.minerva.scripts/page-issues/page/PageIssueLink', newPageIssueLink ); -}( mw.mobileFrontend ) ); + module.exports = newPageIssueLink; +}() ); diff --git a/resources/skins.minerva.scripts/page-issues/page/pageIssueFormatter.js b/resources/skins.minerva.scripts/page-issues/page/pageIssueFormatter.js index 88d9d25..989d590 100644 --- a/resources/skins.minerva.scripts/page-issues/page/pageIssueFormatter.js +++ b/resources/skins.minerva.scripts/page-issues/page/pageIssueFormatter.js @@ -1,7 +1,7 @@ -( function ( M ) { +( function () { var - newPageIssueLink = M.require( 'skins.minerva.scripts/page-issues/page/PageIssueLink' ), - newPageIssueLearnMoreLink = M.require( 'skins.minerva.scripts/page-issues/page/PageIssueLearnMoreLink' ); + newPageIssueLink = require( './PageIssueLink.js' ), + newPageIssueLearnMoreLink = require( './PageIssueLearnMoreLink.js' ); /** * Modifies the `issue` DOM to create a banner designed for single / multiple issue templates, @@ -44,8 +44,8 @@ $link.insertAfter( $( 'h1#section_0' ) ); } - M.define( 'skins.minerva.scripts/page-issues/page/pageIssueFormatter', { + module.exports = { insertPageIssueBanner: insertPageIssueBanner, insertPageIssueNotice: insertPageIssueNotice - } ); -}( mw.mobileFrontend ) ); + }; +}() ); diff --git a/resources/skins.minerva.scripts/page-issues/parser.js b/resources/skins.minerva.scripts/page-issues/parser.js index 1cdb175..999fad2 100644 --- a/resources/skins.minerva.scripts/page-issues/parser.js +++ b/resources/skins.minerva.scripts/page-issues/parser.js @@ -217,7 +217,7 @@ /** * @module skins.minerva.scripts/utils */ - M.define( 'skins.minerva.scripts/pageIssuesParser', { + module.exports = { extract: extract, parse: parse, maxSeverity: maxSeverity, @@ -227,6 +227,6 @@ parseType: parseType, parseGroup: parseGroup } - } ); + }; }( mw.mobileFrontend ) ); diff --git a/resources/skins.minerva.scripts/preInit.js b/resources/skins.minerva.scripts/preInit.js index f500365..2d045e6 100644 --- a/resources/skins.minerva.scripts/preInit.js +++ b/resources/skins.minerva.scripts/preInit.js @@ -5,14 +5,12 @@ * @class mw.mobileFrontend * @singleton */ -( function ( M ) { - var skin = M.require( 'mobile.init/skin' ), - mainMenu = M.require( 'skins.minerva.scripts/mainMenu' ), +module.exports = function () { + var M = mw.mobileFrontend, + skin = M.require( 'mobile.init/skin' ), + mainMenu = require( './menu.js' ), toast = M.require( 'mobile.startup' ).toast; - // Proxy to MobileFrontend defined skin - M.define( 'skins.minerva.scripts/skin', skin ); - /** * Close navigation if skin is tapped * @param {JQuery.Event} ev @@ -55,4 +53,4 @@ } }( mw.config.get( 'wgRedirectedFrom' ) ) ); /* eslint-enable no-console */ -}( mw.mobileFrontend ) ); +}; diff --git a/resources/skins.minerva.scripts/references.js b/resources/skins.minerva.scripts/references.js index 0cef127..1a72a83 100644 --- a/resources/skins.minerva.scripts/references.js +++ b/resources/skins.minerva.scripts/references.js @@ -1,5 +1,6 @@ -( function ( M ) { +module.exports = function () { var drawer, + M = mw.mobileFrontend, router = require( 'mediawiki.router' ), mobile = M.require( 'mobile.startup' ), currentPage = mobile.currentPage(), @@ -93,4 +94,4 @@ } init(); -}( mw.mobileFrontend ) ); +}; diff --git a/resources/skins.minerva.scripts/search.js b/resources/skins.minerva.scripts/search.js index b056754..ead0fc2 100644 --- a/resources/skins.minerva.scripts/search.js +++ b/resources/skins.minerva.scripts/search.js @@ -1,9 +1,10 @@ -( function ( M ) { +module.exports = function () { var + M = mw.mobileFrontend, mobile = M.require( 'mobile.startup' ), SearchOverlay = mobile.search.SearchOverlay, SearchGateway = mobile.search.SearchGateway, - overlayManager = M.require( 'skins.minerva.scripts/overlayManager' ), + overlayManager = require( './overlayManager.js' ), searchLogger = mobile.search.MobileWebSearchLogger, // eslint-disable-next-line no-jquery/no-global-selector $searchInput = $( '#searchInput' ), @@ -75,4 +76,4 @@ getSearchOverlay().showKeyboard(); } ); -}( mw.mobileFrontend ) ); +}; diff --git a/resources/skins.minerva.talk/init.js b/resources/skins.minerva.talk/init.js index 32ec306..7f8e0ec 100644 --- a/resources/skins.minerva.talk/init.js +++ b/resources/skins.minerva.talk/init.js @@ -11,8 +11,9 @@ $talk = $( '.talk, [rel="discussion"]' ), // use the plain return value here - T128273 title = $talk.attr( 'data-title' ), - overlayManager = M.require( 'skins.minerva.scripts/overlayManager' ), - skin = M.require( 'skins.minerva.scripts/skin' ), + overlayManager = require( 'skins.minerva.scripts' ).overlayManager, + // FIXME: This dependency shouldn't exist + skin = M.require( 'mobile.init/skin' ), inTalkNamespace = false, pageTitle, talkTitle, talkNs, pageNs; diff --git a/skin.json b/skin.json index a0e91d5..f4b7627 100644 --- a/skin.json +++ b/skin.json @@ -455,6 +455,7 @@ "desktop" ], "dependencies": [ + "mediawiki.ui.anchor", "wikimedia.ui", "skins.minerva.mainMenu.icons", "skins.minerva.mainMenu.styles", @@ -472,6 +473,8 @@ "mediawiki.experiments" ], "messages": [ + "echo-badge-count", + "mobile-frontend-notifications-filter", "skin-minerva-issue-learn-more", "mobile-frontend-meta-data-issues", "minerva-meta-data-issues-section-header", @@ -492,11 +495,16 @@ "resources/skins.minerva.scripts/page-issues/overlay/PageIssuesOverlay.less" ], "templates": { + "badge.mustache": "includes/skins/userNotifications.mustache", "IssueNotice.mustache": "resources/skins.minerva.scripts/page-issues/overlay/IssueNotice.mustache", "menu.mustache": "resources/skins.minerva.scripts/menu/menu.mustache", "menuGroup.mustache": "resources/skins.minerva.scripts/menu/menuGroup.mustache" }, - "scripts": [ + "packageFiles": [ + "resources/skins.minerva.scripts/init.js", + "resources/skins.minerva.scripts/NotificationBadge.js", + "resources/skins.minerva.scripts/notifications.js", + "resources/skins.minerva.scripts/overlayManager.js", "resources/skins.minerva.scripts/menu/schema.js", "resources/skins.minerva.scripts/menu/MainMenu.js", "resources/skins.minerva.scripts/menu.js", @@ -516,7 +524,6 @@ "resources/skins.minerva.scripts/TitleUtil.js", "components/ToggleList/ToggleList.js", "resources/skins.minerva.scripts/Toolbar.js", - "resources/skins.minerva.scripts/init.js", "resources/skins.minerva.scripts/initLogging.js", "resources/skins.minerva.scripts/mobileRedirect.js", "resources/skins.minerva.scripts/search.js", @@ -524,42 +531,6 @@ "resources/skins.minerva.scripts/toc.js" ] }, - "skins.minerva.notifications.badge": { - "messages": [ - "echo-badge-count" - ], - "dependencies": [ - "mediawiki.router", - "mobile.startup" - ], - "scripts": [ - "resources/skins.minerva.notifications.badge/NotificationBadge.js" - ], - "templates": { - "badge.mustache": "includes/skins/userNotifications.mustache" - }, - "targets": [ - "mobile", - "desktop" - ] - }, - "skins.minerva.notifications": { - "dependencies": [ - "skins.minerva.notifications.badge", - "mediawiki.ui.anchor", - "skins.minerva.scripts" - ], - "scripts": [ - "resources/skins.minerva.notifications/init.js" - ], - "messages": [ - "mobile-frontend-notifications-filter" - ], - "targets": [ - "mobile", - "desktop" - ] - }, "skins.minerva.options.share.icon": { "class": "ResourceLoaderImageModule", "selector": ".mw-ui-icon-minerva-{name}:before", diff --git a/tests/qunit/skins.minerva.scripts/AB.test.js b/tests/qunit/skins.minerva.scripts/AB.test.js index a57e1be..ebe7d52 100644 --- a/tests/qunit/skins.minerva.scripts/AB.test.js +++ b/tests/qunit/skins.minerva.scripts/AB.test.js @@ -1,6 +1,6 @@ ( function ( M ) { - var AB = M.require( 'skins.minerva.scripts/AB' ), + var AB = require( '../../../resources/skins.minerva.scripts/AB.js' ), util = M.require( 'mobile.startup' ).util, defaultConfig = { testName: 'WME.MinervaABTest', diff --git a/tests/qunit/skins.minerva.notifications.badge/NotificationBadge.test.js b/tests/qunit/skins.minerva.scripts/NotificationBadge.test.js similarity index 89% rename from tests/qunit/skins.minerva.notifications.badge/NotificationBadge.test.js rename to tests/qunit/skins.minerva.scripts/NotificationBadge.test.js index e9fbd52..283346e 100644 --- a/tests/qunit/skins.minerva.notifications.badge/NotificationBadge.test.js +++ b/tests/qunit/skins.minerva.scripts/NotificationBadge.test.js @@ -1,6 +1,6 @@ ( function ( M ) { var OverlayManager = M.require( 'mobile.startup' ).OverlayManager, - NotificationBadge = M.require( 'skins.minerva.notifications/NotificationBadge' ); + NotificationBadge = require( '../../../resources/skins.minerva.scripts/NotificationBadge.js' ); QUnit.module( 'Minerva NotificationBadge', { beforeEach: function () { @@ -32,6 +32,9 @@ this.sandbox.stub( mw.language, 'convertNumber' ) .withArgs( 2 ).returns( '۲' ) .withArgs( 5 ).returns( '۵' ); + this.sandbox.stub( mw, 'message' ) + .withArgs( 'echo-badge-count', '۵' ).returns( { text: function () { return '۵'; } } ) + .withArgs( 'echo-badge-count', '۲' ).returns( { text: function () { return '۲'; } } ); badge = new NotificationBadge( { overlayManager: this.OverlayManager, diff --git a/tests/qunit/skins.minerva.scripts/TitleUtil.test.js b/tests/qunit/skins.minerva.scripts/TitleUtil.test.js index 1fb211f..229d2d5 100644 --- a/tests/qunit/skins.minerva.scripts/TitleUtil.test.js +++ b/tests/qunit/skins.minerva.scripts/TitleUtil.test.js @@ -1,5 +1,5 @@ -( function ( M ) { - var TitleUtil = M.require( 'skins.minerva.scripts/TitleUtil' ); +( function () { + var TitleUtil = require( '../../../resources/skins.minerva.scripts/TitleUtil.js' ); QUnit.module( 'Minerva TitleUtil', QUnit.newMwEnvironment( { setup: function () { @@ -226,4 +226,4 @@ 'mismatching host (2)' ); } ); -}( mw.mobileFrontend ) ); +}() ); diff --git a/tests/qunit/skins.minerva.scripts/UriUtil.test.js b/tests/qunit/skins.minerva.scripts/UriUtil.test.js index 95d9a47..b5f4702 100644 --- a/tests/qunit/skins.minerva.scripts/UriUtil.test.js +++ b/tests/qunit/skins.minerva.scripts/UriUtil.test.js @@ -1,5 +1,5 @@ -( function ( M ) { - var UriUtil = M.require( 'skins.minerva.scripts/UriUtil' ); +( function () { + var UriUtil = require( '../../../resources/skins.minerva.scripts/UriUtil.js' ); QUnit.module( 'Minerva UriUtil', QUnit.newMwEnvironment( { setup: function () { @@ -44,4 +44,4 @@ 'differing subdomains are not internal' ); } ); -}( mw.mobileFrontend ) ); +}() ); diff --git a/tests/qunit/skins.minerva.scripts/downloadPageAction.test.js b/tests/qunit/skins.minerva.scripts/downloadPageAction.test.js index a504be5..0698be3 100644 --- a/tests/qunit/skins.minerva.scripts/downloadPageAction.test.js +++ b/tests/qunit/skins.minerva.scripts/downloadPageAction.test.js @@ -7,8 +7,9 @@ windowChrome = { chrome: true }, downloadIcon = icons.spinner(), windowNotChrome = {}, - getOnClickHandler = M.require( 'skins.minerva.scripts/test/getOnClickHandler' ), - isAvailable = M.require( 'skins.minerva.scripts/test/isAvailable' ), + downloadAction = require( '../../../resources/skins.minerva.scripts/downloadPageAction.js' ), + getOnClickHandler = downloadAction.test.getOnClickHandler, + isAvailable = downloadAction.test.isAvailable, browser = mobile.Browser.getSingleton(), lazyImageLoader = mobile.lazyImages.lazyImageLoader, Page = mobile.Page; diff --git a/tests/qunit/skins.minerva.scripts/index.js b/tests/qunit/skins.minerva.scripts/index.js new file mode 100644 index 0000000..b66db6e --- /dev/null +++ b/tests/qunit/skins.minerva.scripts/index.js @@ -0,0 +1,15 @@ +// Since tests.minerva.scripts does +// not pull in the entire module skins.minerva.scripts +// we have to stub certain templates to make it appear like its been loaded. +mw.template.add( 'skins.minerva.scripts', 'IssueNotice.mustache', '' ); +mw.template.add( 'skins.minerva.scripts', 'badge.mustache', + mw.template.get( 'tests.skins.minerva', 'badge.mustache' ).getSource() ); +module.exports = [ + require( './NotificationBadge.test.js' ), + require( './downloadPageAction.test.js' ), + require( './page-issues/parser.test.js' ), + require( './AB.test.js' ), + require( './page-issues/index.test.js' ), + require( './UriUtil.test.js' ), + require( './TitleUtil.test.js' ) +]; diff --git a/tests/qunit/skins.minerva.scripts/pageIssues.test.js b/tests/qunit/skins.minerva.scripts/page-issues/index.test.js similarity index 93% rename from tests/qunit/skins.minerva.scripts/pageIssues.test.js rename to tests/qunit/skins.minerva.scripts/page-issues/index.test.js index 2be6c6a..198f5c5 100644 --- a/tests/qunit/skins.minerva.scripts/pageIssues.test.js +++ b/tests/qunit/skins.minerva.scripts/page-issues/index.test.js @@ -1,7 +1,7 @@ ( function ( M ) { var mobile = M.require( 'mobile.startup' ), - pageIssues = M.require( 'skins.minerva.scripts/pageIssues' ), + pageIssues = require( '../../../../resources/skins.minerva.scripts/page-issues/index.js' ), insertBannersOrNotice = pageIssues.test.insertBannersOrNotice, OverlayManager = mobile.OverlayManager, PageHTMLParser = mobile.PageHTMLParser, diff --git a/tests/qunit/skins.minerva.scripts/pageIssuesParser.test.js b/tests/qunit/skins.minerva.scripts/page-issues/parser.test.js similarity index 97% rename from tests/qunit/skins.minerva.scripts/pageIssuesParser.test.js rename to tests/qunit/skins.minerva.scripts/page-issues/parser.test.js index 3402b77..a699636 100644 --- a/tests/qunit/skins.minerva.scripts/pageIssuesParser.test.js +++ b/tests/qunit/skins.minerva.scripts/page-issues/parser.test.js @@ -1,6 +1,6 @@ -( function ( M ) { +( function () { var icon = {}, - pageIssuesParser = M.require( 'skins.minerva.scripts/pageIssuesParser' ), + pageIssuesParser = require( '../../../../resources/skins.minerva.scripts/page-issues/parser.js' ), extractMessage = pageIssuesParser.extract; QUnit.module( 'Minerva pageIssuesParser' ); @@ -188,4 +188,4 @@ } ); } ); -}( mw.mobileFrontend ) ); +}() ); diff --git a/tests/qunit/skins.minerva.scripts/stubs.js b/tests/qunit/skins.minerva.scripts/stubs.js deleted file mode 100644 index 0e5cfc5..0000000 --- a/tests/qunit/skins.minerva.scripts/stubs.js +++ /dev/null @@ -1,4 +0,0 @@ -// Since tests.minerva.scripts does -// not pull in the entire module skins.minerva.scripts -// we have to stub certain templates to make it appear like its been loaded. -mw.template.add( 'skins.minerva.scripts', 'IssueNotice.mustache', '' ); diff --git a/tests/selenium/features/step_definitions/notification_steps.js b/tests/selenium/features/step_definitions/notification_steps.js index 5f05281..8f3ca75 100644 --- a/tests/selenium/features/step_definitions/notification_steps.js +++ b/tests/selenium/features/step_definitions/notification_steps.js @@ -9,7 +9,7 @@ const iHaveNoNotifications = () => { }; const iClickOnTheNotificationIcon = () => { - ArticlePage.waitUntilResourceLoaderModuleReady( 'skins.minerva.notifications' ); + ArticlePage.waitUntilResourceLoaderModuleReady( 'skins.minerva.scripts' ); ArticlePage.notifications_button_element.click(); };