mediawiki-extensions-Echo/extension.json

1188 lines
35 KiB
JSON
Raw Normal View History

{
"name": "Echo",
"author": [
"Andrew Garrett",
"Ryan Kaldari",
"Benny Situ",
"Luke Welling",
"Kunal Mehta",
"Moriel Schottlender",
"Jon Robson",
"Roan Kattouw"
],
"url": "https://www.mediawiki.org/wiki/Extension:Echo",
"descriptionmsg": "echo-desc",
"license-name": "MIT",
"type": "specialpage",
"requires": {
"MediaWiki": ">= 1.37.0"
},
"APIMetaModules": {
"notifications": {
"class": "ApiEchoNotifications",
"services": [ "MainConfig" ]
},
"unreadnotificationpages": {
"class": "ApiEchoUnreadNotificationPages",
"services": [ "PageStore", "TitleFactory" ]
}
},
"APIModules": {
"echomarkread": "ApiEchoMarkRead",
"echomarkseen": "ApiEchoMarkSeen",
"echoarticlereminder": "ApiEchoArticleReminder",
"echomute": {
"class": "ApiEchoMute",
"services": [
"CentralIdLookup",
"UserOptionsManager"
]
}
},
"DefaultUserOptions": {
"echo-email-frequency": 0,
"echo-dont-email-read-notifications": false
},
"ExtensionFunctions": [
"MediaWiki\\Extension\\Notifications\\Hooks::initEchoExtension"
],
"JobClasses": {
"EchoNotificationJob": "EchoNotificationJob",
"EchoNotificationDeleteJob": "EchoNotificationDeleteJob",
"EchoPushNotificationRequest": "MediaWiki\\Extension\\Notifications\\Push\\NotificationRequestJob"
},
"SpecialPages": {
"Notifications": "SpecialNotifications",
"DisplayNotificationsConfiguration": {
"class": "SpecialDisplayNotificationsConfiguration",
"services": [
"EchoAttributeManager",
"UserOptionsManager"
]
},
"NotificationsMarkRead": "SpecialNotificationsMarkRead"
},
"AvailableRights": [
"manage-all-push-subscriptions"
],
"GroupPermissions": {
"push-subscription-manager": {
"manage-all-push-subscriptions": true
}
},
"MessagesDirs": {
"Echo": [
"i18n",
"i18n/api"
]
},
"ExtensionMessagesFiles": {
"EchoAliases": "Echo.alias.php"
},
Dormant mobile notifications overlay lives in Echo This code will be enabled when Iba1d7863171268066bf7597182c57a0a2041497f relinquishes the responsibility for rendering the Echo notification badge and wiring up of the related JS. It makes 3 assumptions: 1) Minerva will expose a VERSION property on the skins.minerva.scripts module to tell Echo it can begin control of the functionality 2) A new hook `SkinMinervaReplaceNotificationsBadge` will run on the server side allowing Echo extension to render the Notifications badge in Minerva. 3) A new client side hook (echo.mobile) will fire whenever the Echo dialog is opened or closed. All code relating to Echo inside MobileFrontend and Minerva is moved here. CSS for the modules is kept in Minerva as skinStyles This code remains dormant until Iba1d7863171268066bf7597182c57a0a2041497f lands. It pre-registers a "to-be-created" hook SkinMinervaReplaceNotificationsBadge that substitutes the Minerva badge. It also watches the export value of skins.minerva.scripts for a VERSION value - when this appears it will take the signal that it should manage the frontend code. In the new system the mobile specific code is limited to the mobile version of Minerva. The desktop version of Echo loads on Minerva desktop - presenting an opportunity in future to consolidate both implementations to use the same component. The mobile version of Vector and Timeless for example will load the mobile overlay (with existing styling issues that we don't need to worry about right now given we don't officially support skins other than Minerva as mobile) Testers: * Check require( 'ext.echo.mobile' )(); inside initMobile inside ext.echo.init does not fire until Iba1d7863171268066bf7597182c57a0a2041497f is checked out. Depends-On: I1a66939d2b596094b419de40b370e79f09c85581 Bug: T221007 Change-Id: I09c27a084100b223662f84de6cbe01bebe1fe774
2019-10-01 20:15:25 +00:00
"QUnitTestModule": {
"localBasePath": "",
"remoteExtPath": "Echo",
tests: Fix QUnit warnings and resolve complex test_NotificationBadge == Problem 1 == As of I09c27a084100b223, tests/qunit/index.js or equiv was used to load test files asynchronously from a using() callback. This was untracked by RL or QUnit, and thus sometimes ended up finishing after the test runner was already done executing all tests. In CI this means the tests are sometimes never loaded and the browser (or Node) process already killed before they even have a chance to arrive. Prior to QUnit 2.17, this was no way of detecting this. As of QUnit 2.17 (core upgraded last week) when running tests manually the following helpful warnings appear in the console: > [warning] Unexpected test after runEnd. > [warning] This is unstable and will fail in QUnit 3.0. > test @ qunit.js > tests/qunit/model/test_mw.echo.dm.SeenTimeModel.js > require There were about 1072 instances of this warning, all from Echo. Fix this problem by removing the async callbacks and specifying the two modules as normal dependencies instead. == Problem 2 == Class NotificationBadge was being loaded in a strange way out of bound. This was a violation of module boundaries and should not be needed other than for a temporary hack or other tech debt. More generally when a test uses `packageFiles` this is a likely sign of tech debt or misunderstandings. Instead, depend on `ext.echo.mobile` and export/import the class as normal. After this, the test module can use `scripts` instead. == Problem 3 == The `ext.echo.mobile` uses a Mustache template which the test was also duplicating a reference to. This is no longer needed now. Due to the `qunit/index.js` file carefully splitting the operations between template assignment and file loading, I wondered whether it was meaning to replace or mock it with something else, but it simply refers to the same file and only does this because it wasn't using the module directly. This is now resolved. If you do need to mock in the future, this can simply be done by assigning `NotificationBadge.prototype.template` from a beforeEach() callback in the test suite, or by supporting it property as a constructor option in NotificationBadge.js and assigning `this.template` there, which is supported by the mobile `View` class already it seems and would follow DI patterns more effectively. == Problem 4 == Most of the Echo tests were ignored sometimes and executed other times. The test for `ext.echo.mobile` in particular though was never executed in CI specifically because: > Undefined module: 'mobile.startup' This became a hard error with this patch, which is fixed by the CI config change with Ie9dabe3269c56fa76db8e51. Bug: T299780 Change-Id: Ie4a87f3b8085fd6ae53ec586c1782cc266d5288a
2022-03-01 23:16:33 +00:00
"dependencies": [
"ext.echo.dm",
"ext.echo.mobile"
],
"scripts": [
Dormant mobile notifications overlay lives in Echo This code will be enabled when Iba1d7863171268066bf7597182c57a0a2041497f relinquishes the responsibility for rendering the Echo notification badge and wiring up of the related JS. It makes 3 assumptions: 1) Minerva will expose a VERSION property on the skins.minerva.scripts module to tell Echo it can begin control of the functionality 2) A new hook `SkinMinervaReplaceNotificationsBadge` will run on the server side allowing Echo extension to render the Notifications badge in Minerva. 3) A new client side hook (echo.mobile) will fire whenever the Echo dialog is opened or closed. All code relating to Echo inside MobileFrontend and Minerva is moved here. CSS for the modules is kept in Minerva as skinStyles This code remains dormant until Iba1d7863171268066bf7597182c57a0a2041497f lands. It pre-registers a "to-be-created" hook SkinMinervaReplaceNotificationsBadge that substitutes the Minerva badge. It also watches the export value of skins.minerva.scripts for a VERSION value - when this appears it will take the signal that it should manage the frontend code. In the new system the mobile specific code is limited to the mobile version of Minerva. The desktop version of Echo loads on Minerva desktop - presenting an opportunity in future to consolidate both implementations to use the same component. The mobile version of Vector and Timeless for example will load the mobile overlay (with existing styling issues that we don't need to worry about right now given we don't officially support skins other than Minerva as mobile) Testers: * Check require( 'ext.echo.mobile' )(); inside initMobile inside ext.echo.init does not fire until Iba1d7863171268066bf7597182c57a0a2041497f is checked out. Depends-On: I1a66939d2b596094b419de40b370e79f09c85581 Bug: T221007 Change-Id: I09c27a084100b223662f84de6cbe01bebe1fe774
2019-10-01 20:15:25 +00:00
"tests/qunit/mobile/test_NotificationBadge.js",
"tests/qunit/model/test_mw.echo.dm.BundleNotificationItem.js",
"tests/qunit/model/test_mw.echo.dm.CrossWikiNotificationItem.js",
"tests/qunit/model/test_mw.echo.dm.FiltersModel.js",
"tests/qunit/model/test_mw.echo.dm.NotificationGroupsList.js",
"tests/qunit/model/test_mw.echo.dm.NotificationItem.js",
"tests/qunit/model/test_mw.echo.dm.NotificationsList.js",
"tests/qunit/model/test_mw.echo.dm.PaginationModel.js",
"tests/qunit/model/test_mw.echo.dm.SeenTimeModel.js",
"tests/qunit/model/test_mw.echo.dm.SourcePagesModel.js",
"tests/qunit/model/test_mw.echo.dm.UnreadNotificationCounter.js"
Dormant mobile notifications overlay lives in Echo This code will be enabled when Iba1d7863171268066bf7597182c57a0a2041497f relinquishes the responsibility for rendering the Echo notification badge and wiring up of the related JS. It makes 3 assumptions: 1) Minerva will expose a VERSION property on the skins.minerva.scripts module to tell Echo it can begin control of the functionality 2) A new hook `SkinMinervaReplaceNotificationsBadge` will run on the server side allowing Echo extension to render the Notifications badge in Minerva. 3) A new client side hook (echo.mobile) will fire whenever the Echo dialog is opened or closed. All code relating to Echo inside MobileFrontend and Minerva is moved here. CSS for the modules is kept in Minerva as skinStyles This code remains dormant until Iba1d7863171268066bf7597182c57a0a2041497f lands. It pre-registers a "to-be-created" hook SkinMinervaReplaceNotificationsBadge that substitutes the Minerva badge. It also watches the export value of skins.minerva.scripts for a VERSION value - when this appears it will take the signal that it should manage the frontend code. In the new system the mobile specific code is limited to the mobile version of Minerva. The desktop version of Echo loads on Minerva desktop - presenting an opportunity in future to consolidate both implementations to use the same component. The mobile version of Vector and Timeless for example will load the mobile overlay (with existing styling issues that we don't need to worry about right now given we don't officially support skins other than Minerva as mobile) Testers: * Check require( 'ext.echo.mobile' )(); inside initMobile inside ext.echo.init does not fire until Iba1d7863171268066bf7597182c57a0a2041497f is checked out. Depends-On: I1a66939d2b596094b419de40b370e79f09c85581 Bug: T221007 Change-Id: I09c27a084100b223662f84de6cbe01bebe1fe774
2019-10-01 20:15:25 +00:00
]
},
"ResourceModules": {
"ext.echo.logger": {
"packageFiles": [
"logger/mw.echo.Logger.js",
{
"name": "logger/config.json",
"callback": "MediaWiki\\Extension\\Notifications\\Hooks::getLoggerConfigVars"
}
],
"dependencies": [
"oojs",
"mediawiki.user"
],
"targets": [
"desktop",
"mobile"
]
},
"ext.echo.ui.desktop": {
"scripts": [
"ui/mw.echo.ui.BadgeLinkWidget.js",
"ui/mw.echo.ui.NotificationBadgeWidget.js"
],
"styles": [
"styles/mw.echo.ui.NotificationBadgeWidget.less"
],
"dependencies": [
"ext.echo.ui",
"ext.echo.styles.badge",
"mediawiki.util",
"mediawiki.api"
],
"targets": [
"desktop"
]
},
"ext.echo.ui": {
"scripts": [
"controller/mw.echo.Controller.js",
"ui/mw.echo.ui.js",
"ui/mw.echo.ui.SortedListWidget.js",
"ui/mw.echo.ui.SubGroupListWidget.js",
"ui/mw.echo.ui.NotificationsListWidget.js",
"ui/mw.echo.ui.PlaceholderItemWidget.js",
"ui/mw.echo.ui.ToggleReadCircleButtonWidget.js",
"ui/mw.echo.ui.NotificationItemWidget.js",
"ui/mw.echo.ui.SingleNotificationItemWidget.js",
"ui/mw.echo.ui.CrossWikiNotificationItemWidget.js",
"ui/mw.echo.ui.BundleNotificationItemWidget.js",
"ui/mw.echo.ui.ClonedNotificationItemWidget.js",
"ui/mw.echo.ui.ActionMenuPopupWidget.js",
"ui/mw.echo.ui.MenuItemWidget.js",
"ui/mw.echo.ui.NotificationsWrapper.js",
"ui/mw.echo.ui.ConfirmationPopupWidget.js",
"ext.echo.moment-hack.js"
],
"styles": [
"styles/mw.echo.ui.mobile.less",
"styles/mw.echo.ui.overlay.less",
"styles/mw.echo.ui.NotificationItemWidget.less",
"styles/mw.echo.ui.ToggleReadCircleButtonWidget.less",
"styles/mw.echo.ui.CrossWikiNotificationItemWidget.less",
"styles/mw.echo.ui.NotificationsListWidget.less",
"styles/mw.echo.ui.PlaceholderItemWidget.less",
"styles/mw.echo.ui.SubGroupListWidget.less",
"styles/mw.echo.ui.ActionMenuPopupWidget.less",
"styles/mw.echo.ui.MenuItemWidget.less",
"styles/mw.echo.ui.NotificationsWrapper.less",
"styles/mw.echo.ui.ConfirmationPopupWidget.less"
],
"skinStyles": {
"modern": [
"styles/mw.echo.ui.overlay.monobook.less"
],
"monobook": [
"styles/mw.echo.ui.overlay.monobook.less"
],
"vector": [
"styles/mw.echo.ui.overlay.vector.less"
],
"vector-2022": [
"styles/mw.echo.ui.overlay.vector.less"
],
"minerva": [
"styles/mw.echo.ui.overlay.minerva.less"
],
"wikimediaapiportal": [
"styles/mw.echo.ui.overlay.wikimediaapiportal.less"
]
},
"dependencies": [
"ext.echo.api",
"ext.echo.dm",
"ext.echo.logger",
"ext.echo.secondaryicons",
"oojs",
"oojs-ui-core",
"oojs-ui-widgets",
"moment",
"mediawiki.jqueryMsg",
"mediawiki.language",
"mediawiki.Title",
"oojs-ui.styles.icons-user",
"oojs-ui.styles.icons-alerts",
"oojs-ui.styles.icons-content",
"oojs-ui.styles.icons-interactions",
"oojs-ui.styles.icons-moderation",
"oojs-ui.styles.icons-movement"
],
"messages": [
"echo-badge-count",
"echo-overlay-link",
"echo-mark-all-as-read",
"echo-mark-wiki-as-read",
"echo-notification-alert",
"echo-notification-notice",
"echo-notification-loginrequired",
"echo-notification-popup-loginrequired",
"notification-link-text-expand-all",
"notification-link-text-collapse-all",
"notification-link-text-expand-alert-count",
"notification-link-text-expand-notice-count",
"notification-link-text-expand-all-count",
"notification-timestamp-ago-seconds",
"notification-timestamp-ago-minutes",
"notification-timestamp-ago-hours",
"notification-timestamp-ago-days",
"notification-timestamp-ago-months",
"notification-timestamp-ago-years",
"notification-timestamp-today",
"notification-timestamp-yesterday",
"echo-notification-markasread",
"echo-notification-markasunread",
"echo-notification-markasread-tooltip",
"echo-notification-more-options-tooltip",
"echo-notification-alert-text-only",
"echo-notification-notice-text-only",
"echo-email-batch-bullet",
"echo-notification-placeholder",
"tooltip-pt-notifications-alert",
"tooltip-pt-notifications-notice",
"mytalk",
"mypreferences",
"sunday",
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday"
],
"targets": [
"desktop",
"mobile"
]
},
"ext.echo.dm": {
"scripts": [
"model/mw.echo.dm.js",
"model/mw.echo.dm.SourcePagesModel.js",
"model/mw.echo.dm.PaginationModel.js",
"model/mw.echo.dm.FiltersModel.js",
"model/mw.echo.dm.SeenTimeModel.js",
"model/mw.echo.dm.ModelManager.js",
"model/mw.echo.dm.SortedList.js",
"model/mw.echo.dm.NotificationItem.js",
"model/mw.echo.dm.CrossWikiNotificationItem.js",
"model/mw.echo.dm.BundleNotificationItem.js",
"model/mw.echo.dm.NotificationsList.js",
"model/mw.echo.dm.NotificationGroupsList.js",
"model/mw.echo.dm.UnreadNotificationCounter.js"
],
"dependencies": [
"oojs",
"ext.echo.init",
"ext.echo.api",
"moment"
],
"messages": [
"echo-api-failure",
"echo-notification-loginrequired",
"echo-api-failure-cross-wiki"
],
"targets": [
"desktop",
"mobile"
]
},
"ext.echo.api": {
"scripts": [
"api/mw.echo.api.js",
"api/mw.echo.api.PromisePrioritizer.js",
"api/mw.echo.api.EchoApi.js",
"api/mw.echo.api.APIHandler.js",
"api/mw.echo.api.LocalAPIHandler.js",
"api/mw.echo.api.ForeignAPIHandler.js",
"api/mw.echo.api.NetworkHandler.js"
],
"dependencies": [
"mediawiki.api",
"mediawiki.ForeignApi",
"oojs"
],
"targets": [
"desktop",
"mobile"
]
},
Dormant mobile notifications overlay lives in Echo This code will be enabled when Iba1d7863171268066bf7597182c57a0a2041497f relinquishes the responsibility for rendering the Echo notification badge and wiring up of the related JS. It makes 3 assumptions: 1) Minerva will expose a VERSION property on the skins.minerva.scripts module to tell Echo it can begin control of the functionality 2) A new hook `SkinMinervaReplaceNotificationsBadge` will run on the server side allowing Echo extension to render the Notifications badge in Minerva. 3) A new client side hook (echo.mobile) will fire whenever the Echo dialog is opened or closed. All code relating to Echo inside MobileFrontend and Minerva is moved here. CSS for the modules is kept in Minerva as skinStyles This code remains dormant until Iba1d7863171268066bf7597182c57a0a2041497f lands. It pre-registers a "to-be-created" hook SkinMinervaReplaceNotificationsBadge that substitutes the Minerva badge. It also watches the export value of skins.minerva.scripts for a VERSION value - when this appears it will take the signal that it should manage the frontend code. In the new system the mobile specific code is limited to the mobile version of Minerva. The desktop version of Echo loads on Minerva desktop - presenting an opportunity in future to consolidate both implementations to use the same component. The mobile version of Vector and Timeless for example will load the mobile overlay (with existing styling issues that we don't need to worry about right now given we don't officially support skins other than Minerva as mobile) Testers: * Check require( 'ext.echo.mobile' )(); inside initMobile inside ext.echo.init does not fire until Iba1d7863171268066bf7597182c57a0a2041497f is checked out. Depends-On: I1a66939d2b596094b419de40b370e79f09c85581 Bug: T221007 Change-Id: I09c27a084100b223662f84de6cbe01bebe1fe774
2019-10-01 20:15:25 +00:00
"ext.echo.mobile": {
"templates": {
"NotificationBadge.mustache": "mobile/NotificationBadge.mustache"
},
"styles": [
"mobile/overlay.less",
"mobile/notificationsFilterOverlay.less"
],
"messages": [
"notifications",
"echo-mobile-notifications-filter-title",
"echo-mark-all-as-read-confirmation"
],
"dependencies": [
"mediawiki.util",
"mediawiki.router",
"ext.echo.ui",
"oojs-ui.styles.icons-interactions"
],
"packageFiles": [
"mobile/notifications.js",
"mobile/list.js",
{
"name": "mobile/config.json",
"callback": "MediaWiki\\Extension\\Notifications\\Hooks::getConfigVars"
},
Dormant mobile notifications overlay lives in Echo This code will be enabled when Iba1d7863171268066bf7597182c57a0a2041497f relinquishes the responsibility for rendering the Echo notification badge and wiring up of the related JS. It makes 3 assumptions: 1) Minerva will expose a VERSION property on the skins.minerva.scripts module to tell Echo it can begin control of the functionality 2) A new hook `SkinMinervaReplaceNotificationsBadge` will run on the server side allowing Echo extension to render the Notifications badge in Minerva. 3) A new client side hook (echo.mobile) will fire whenever the Echo dialog is opened or closed. All code relating to Echo inside MobileFrontend and Minerva is moved here. CSS for the modules is kept in Minerva as skinStyles This code remains dormant until Iba1d7863171268066bf7597182c57a0a2041497f lands. It pre-registers a "to-be-created" hook SkinMinervaReplaceNotificationsBadge that substitutes the Minerva badge. It also watches the export value of skins.minerva.scripts for a VERSION value - when this appears it will take the signal that it should manage the frontend code. In the new system the mobile specific code is limited to the mobile version of Minerva. The desktop version of Echo loads on Minerva desktop - presenting an opportunity in future to consolidate both implementations to use the same component. The mobile version of Vector and Timeless for example will load the mobile overlay (with existing styling issues that we don't need to worry about right now given we don't officially support skins other than Minerva as mobile) Testers: * Check require( 'ext.echo.mobile' )(); inside initMobile inside ext.echo.init does not fire until Iba1d7863171268066bf7597182c57a0a2041497f is checked out. Depends-On: I1a66939d2b596094b419de40b370e79f09c85581 Bug: T221007 Change-Id: I09c27a084100b223662f84de6cbe01bebe1fe774
2019-10-01 20:15:25 +00:00
"mobile/overlay.js",
"mobile/NotificationBadge.js",
"mobile/notificationsFilterOverlay.js"
],
"targets": [
"desktop",
"mobile"
]
},
"ext.echo.init": {
"packageFiles": [
"ext.echo.init.js",
{
"name": "config.json",
"callback": "MediaWiki\\Extension\\Notifications\\Hooks::getConfigVars"
}
],
"dependencies": [
"ext.echo.api",
"mediawiki.jqueryMsg",
"mediawiki.Uri"
],
"messages": [
"echo-badge-count",
"echo-displaysnippet-title",
"parentheses"
],
"targets": [
"desktop",
"mobile"
]
},
"ext.echo.styles.badge": {
"styles": [
"nojs/mw.echo.badge.less"
],
"skinStyles": {
Dormant mobile notifications overlay lives in Echo This code will be enabled when Iba1d7863171268066bf7597182c57a0a2041497f relinquishes the responsibility for rendering the Echo notification badge and wiring up of the related JS. It makes 3 assumptions: 1) Minerva will expose a VERSION property on the skins.minerva.scripts module to tell Echo it can begin control of the functionality 2) A new hook `SkinMinervaReplaceNotificationsBadge` will run on the server side allowing Echo extension to render the Notifications badge in Minerva. 3) A new client side hook (echo.mobile) will fire whenever the Echo dialog is opened or closed. All code relating to Echo inside MobileFrontend and Minerva is moved here. CSS for the modules is kept in Minerva as skinStyles This code remains dormant until Iba1d7863171268066bf7597182c57a0a2041497f lands. It pre-registers a "to-be-created" hook SkinMinervaReplaceNotificationsBadge that substitutes the Minerva badge. It also watches the export value of skins.minerva.scripts for a VERSION value - when this appears it will take the signal that it should manage the frontend code. In the new system the mobile specific code is limited to the mobile version of Minerva. The desktop version of Echo loads on Minerva desktop - presenting an opportunity in future to consolidate both implementations to use the same component. The mobile version of Vector and Timeless for example will load the mobile overlay (with existing styling issues that we don't need to worry about right now given we don't officially support skins other than Minerva as mobile) Testers: * Check require( 'ext.echo.mobile' )(); inside initMobile inside ext.echo.init does not fire until Iba1d7863171268066bf7597182c57a0a2041497f is checked out. Depends-On: I1a66939d2b596094b419de40b370e79f09c85581 Bug: T221007 Change-Id: I09c27a084100b223662f84de6cbe01bebe1fe774
2019-10-01 20:15:25 +00:00
"minerva": [
"nojs/mw.echo.badge.minerva.less"
],
"monobook": [
"nojs/mw.echo.badge.monobook.less"
],
"vector": [
"nojs/mw.echo.badge.vector.less"
],
"vector-2022": [
"nojs/mw.echo.badge.vector.less"
]
},
"targets": [
"desktop",
"mobile"
]
},
"ext.echo.styles.notifications": {
"styles": [
"nojs/mw.echo.notifications.less",
"styles/LabelIconWidget.less"
],
"targets": [
"desktop",
"mobile"
]
},
"ext.echo.styles.alert": {
"styles": [
"nojs/mw.echo.alert.less"
],
"skinStyles": {
"monobook": [
"nojs/mw.echo.alert.monobook.less"
]
},
"targets": [
"desktop",
"mobile"
]
},
"ext.echo.special": {
"scripts": [
"ui/mw.echo.ui.PaginationWidget.js",
"ui/mw.echo.ui.DatedSubGroupListWidget.js",
"ui/mw.echo.ui.DatedNotificationsWidget.js",
"ui/mw.echo.ui.ReadStateButtonSelectWidget.js",
"ui/mw.echo.ui.PageNotificationsOptionWidget.js",
"ui/mw.echo.ui.PageFilterWidget.js",
"ui/mw.echo.ui.CrossWikiUnreadFilterWidget.js",
"ui/mw.echo.ui.NotificationsInboxWidget.js",
"ui/mw.echo.ui.SpecialHelpMenuWidget.js",
"special/ext.echo.special.js"
],
"styles": [
"styles/mw.echo.ui.PaginationWidget.less",
"styles/mw.echo.ui.DatedSubGroupListWidget.less",
"styles/mw.echo.ui.DatedNotificationsWidget.less",
"styles/mw.echo.ui.NotificationsInboxWidget.less",
"styles/mw.echo.ui.PageNotificationsOptionWidget.less",
"styles/mw.echo.ui.PageFilterWidget.less",
"styles/mw.echo.ui.CrossWikiUnreadFilterWidget.less",
"styles/mw.echo.ui.SpecialHelpMenuWidget.less"
],
"skinStyles": {
"minerva": [
"styles/mw.echo.ui.NotificationsInboxWidget.minerva.less"
]
},
"dependencies": [
"ext.echo.ui",
"mediawiki.Uri",
"ext.echo.styles.special"
],
"messages": [
"notification-inbox-filter-read",
"notification-inbox-filter-unread",
"notification-inbox-filter-all",
"echo-notification-placeholder-filters",
"echo-specialpage-pagination-numnotifications",
"echo-specialpage-pagination-range",
"echo-specialpage-pagefilters-title",
"echo-specialpage-pagefilters-subtitle",
"echo-mark-all-as-read",
"echo-learn-more",
"mypreferences",
"echo-specialpage-section-markread",
"echo-specialpage-pagefilterwidget-aria-label",
"echo-specialpage-special-help-menu-widget-aria-label"
],
"targets": [
"desktop",
"mobile"
]
},
"ext.echo.styles.special": {
"styles": [
"nojs/mw.echo.special.less"
],
"targets": [
"desktop",
"mobile"
]
}
},
"ResourceFileModulePaths": {
"localBasePath": "modules",
"remoteExtPath": "Echo/modules"
},
"Hooks": {
"LoadExtensionSchemaUpdates": "MediaWiki\\Extension\\Notifications\\Hooks::onLoadExtensionSchemaUpdates",
"GetPreferences": "MediaWiki\\Extension\\Notifications\\Hooks::getPreferences",
"BeforePageDisplay": "MediaWiki\\Extension\\Notifications\\Hooks::beforePageDisplay",
"ResourceLoaderRegisterModules": "MediaWiki\\Extension\\Notifications\\Hooks::onResourceLoaderRegisterModules",
"UserGroupsChanged": "MediaWiki\\Extension\\Notifications\\Hooks::onUserGroupsChanged",
"LoadUserOptions": "MediaWiki\\Extension\\Notifications\\Hooks::onLoadUserOptions",
"SaveUserOptions": "MediaWiki\\Extension\\Notifications\\Hooks::onSaveUserOptions",
"UserGetDefaultOptions": "MediaWiki\\Extension\\Notifications\\Hooks::onUserGetDefaultOptions",
"UserClearNewTalkNotification": "MediaWiki\\Extension\\Notifications\\Hooks::onUserClearNewTalkNotification",
"EmailUserComplete": "MediaWiki\\Extension\\Notifications\\Hooks::onEmailUserComplete",
"LoginFormValidErrorMessages": "MediaWiki\\Extension\\Notifications\\Hooks::onLoginFormValidErrorMessages",
"OutputPageCheckLastModified": "MediaWiki\\Extension\\Notifications\\Hooks::onOutputPageCheckLastModified",
"ArticleDeleteComplete": "MediaWiki\\Extension\\Notifications\\Hooks::onArticleDeleteComplete",
"ArticleUndelete": "MediaWiki\\Extension\\Notifications\\Hooks::onArticleUndelete",
"UserMergeAccountFields": "MediaWiki\\Extension\\Notifications\\Hooks::onUserMergeAccountFields",
"MergeAccountFromTo": "MediaWiki\\Extension\\Notifications\\Hooks::onMergeAccountFromTo",
"UserMergeAccountDeleteTables": "MediaWiki\\Extension\\Notifications\\Hooks::onUserMergeAccountDeleteTables",
"EchoGetBundleRules": "MediaWiki\\Extension\\Notifications\\Hooks::onEchoGetBundleRules",
"EchoAbortEmailNotification": "MediaWiki\\Extension\\Notifications\\Hooks::onEchoAbortEmailNotification",
"PageSaveComplete": "MediaWiki\\Extension\\Notifications\\Hooks::onPageSaveComplete",
"LocalUserCreated": "MediaWiki\\Extension\\Notifications\\Hooks::onLocalUserCreated",
"RollbackComplete": "MediaWiki\\Extension\\Notifications\\Hooks::onRollbackComplete",
"UserSaveSettings": "MediaWiki\\Extension\\Notifications\\Hooks::onUserSaveSettings",
"AbortTalkPageEmailNotification": "MediaWiki\\Extension\\Notifications\\Hooks::onAbortTalkPageEmailNotification",
"SendWatchlistEmailNotification": "MediaWiki\\Extension\\Notifications\\Hooks::onSendWatchlistEmailNotification",
"GetNewMessagesAlert": "MediaWiki\\Extension\\Notifications\\Hooks::abortNewMessagesAlert",
"LinksUpdateComplete": "MediaWiki\\Extension\\Notifications\\Hooks::onLinksUpdateComplete",
"SpecialMuteModifyFormFields": "MediaWiki\\Extension\\Notifications\\Hooks::onSpecialMuteModifyFormFields",
"RecentChange_save": "main",
"ApiMain::moduleManager": "MediaWiki\\Extension\\Notifications\\Hooks::onApiMainModuleManager",
"SkinTemplateNavigation::Universal": "MediaWiki\\Extension\\Notifications\\Hooks::onSkinTemplateNavigationUniversal"
},
"HookHandlers": {
"main": {
"class": "MediaWiki\\Extension\\Notifications\\Hooks",
"services": [ "MainConfig" ]
}
},
"config": {
"EchoEnableEmailBatch": {
"value": true
},
"EchoUseJobQueue": {
"value": false
},
"EchoEmailFooterAddress": {
"value": ""
},
"EchoCluster": {
"value": false
},
"EchoSharedTrackingDB": {
"value": false
},
"EchoSharedTrackingCluster": {
"value": false
},
"EchoSeenTimeCacheType": {
"value": null
},
"EchoMaxUpdateCount": {
"value": 2000
},
"EchoMaxMentionsCount": {
"value": 50
},
"EchoMentionStatusNotifications": {
"value": false
},
"EchoMentionsOnMultipleSectionEdits": {
"value": true
},
"EchoMentionOnChanges": {
"value": true
},
"EchoBundleEmailInterval": {
"value": 0
},
"DefaultNotifyTypeAvailability": {
"value": {
"web": true,
"email": true
}
},
"NotifyTypeAvailabilityByCategory": {
"value": {
"system-noemail": {
"web": true,
"email": false
},
"system-emailonly": {
"web": false,
"email": true
},
"emailuser": {
"web": true,
"email": false
},
"article-linked": {
"web": true,
"email": false
},
"mention-failure": {
"web": true,
"email": false
},
"mention-success": {
"web": true,
"email": false
},
"thank-you-edit": {
"web": true,
"email": false
}
},
"merge_strategy": "array_plus_2d"
},
"EchoNotifiers": {
"value": {
"web": [
"EchoNotifier",
"notifyWithNotification"
],
"email": [
"EchoNotifier",
"notifyWithEmail"
]
}
},
"EchoAgentBlacklist": {
"value": []
},
"EchoOnWikiBlacklist": {
"value": "Echo-blacklist"
},
"EchoPerUserBlacklist": {
"value": false
},
"EchoPerUserWhitelistFormat": {
"value": "%s/Echo-whitelist"
},
"EchoCrossWikiNotifications": {
"value": false
},
"EchoNotificationCategories": {
"value": {
"system": {
"priority": 9,
"no-dismiss": [
"all"
]
},
"system-noemail": {
"priority": 9,
"no-dismiss": [
"all"
]
},
"system-emailonly": {
"priority": 9,
"no-dismiss": [
"all"
]
},
"user-rights": {
"priority": 9,
"tooltip": "echo-pref-tooltip-user-rights"
},
"other": {
"no-dismiss": [
"all"
]
},
"edit-user-talk": {
"priority": 1,
"no-dismiss": [
"web"
],
"tooltip": "echo-pref-tooltip-edit-user-talk"
},
"reverted": {
"priority": 9,
"tooltip": "echo-pref-tooltip-reverted"
},
"article-linked": {
"priority": 5,
"tooltip": "echo-pref-tooltip-article-linked"
},
"mention": {
"priority": 4,
"tooltip": "echo-pref-tooltip-mention"
},
"mention-failure": {
"priority": 4,
"tooltip": "echo-pref-tooltip-mention-failure"
},
"mention-success": {
"priority": 4,
"tooltip": "echo-pref-tooltip-mention-success"
},
"emailuser": {
"priority": 9,
"tooltip": "echo-pref-tooltip-emailuser"
},
"article-reminder": {
"priority": 1,
"tooltip": "echo-pref-tooltip-article-reminder"
},
"thank-you-edit": {
"priority": 9,
"tooltip": "echo-pref-tooltip-thank-you-edit"
},
"watchlist": {
"priority": 5,
"tooltip": "echo-pref-tooltip-watchlist"
},
"minor-watchlist": {
"priority": 6,
"tooltip": "echo-pref-tooltip-minor-watchlist"
}
},
"merge_strategy": "array_plus_2d"
},
"EchoNotificationIcons": {
"value": {
"watchlist-progressive": {
"path": {
"ltr": "Echo/modules/icons/watchlist-ltr-progressive.svg",
"rtl": "Echo/modules/icons/watchlist-rtl-progressive.svg"
}
},
"placeholder": {
"path": "Echo/modules/icons/notice.svg"
},
"chat": {
"path": {
"ltr": "Echo/modules/icons/speechBubbles-ltr-progressive.svg",
"rtl": "Echo/modules/icons/speechBubbles-rtl-progressive.svg"
}
},
"edit": {
"path": "Echo/modules/icons/edit-progressive.svg"
},
"edit-user-talk": {
"path": "Echo/modules/icons/edit-user-talk-progressive.svg"
},
"linked": {
"path": "Echo/modules/icons/link-progressive.svg"
},
"mention": {
"path": "Echo/modules/icons/mention-progressive.svg"
},
"mention-failure": {
"path": "Echo/modules/icons/mention-failure.svg"
},
"mention-success": {
"path": "Echo/modules/icons/mention-success-constructive.svg"
},
"mention-status-bundle": {
"path": "Echo/modules/icons/mention-status-bundle-progressive.svg"
},
"reviewed": {
"path": "Echo/modules/icons/articleCheck-progressive.svg"
},
"revert": {
"path": "Echo/modules/icons/revert.svg"
},
"user-rights": {
"path": "Echo/modules/icons/user-rights-progressive.svg"
},
"emailuser": {
"path": "Echo/modules/icons/message-constructive.svg"
},
"help": {
"path": {
"ltr": "Echo/modules/icons/helpNotice-ltr.svg",
"rtl": "Echo/modules/icons/helpNotice-rtl.svg"
}
},
"global": {
"path": "Echo/modules/icons/global-progressive.svg"
},
"site": {
"url": false
},
"article-reminder": {
"path": "Echo/modules/icons/global-progressive.svg"
}
},
"merge_strategy": "array_plus_2d"
},
"EchoSecondaryIcons": {
"value": {
"linked": {
"path": "Echo/modules/icons/link-progressive.svg"
},
"changes": {
"path": "Echo/modules/icons/changes.svg"
},
"thanks": {
"path": {
"ltr": "Echo/modules/icons/userTalk-ltr.svg",
"rtl": "Echo/modules/icons/userTalk-rtl.svg"
}
},
"unbell": {
"path": "Echo/modules/icons/unbell.svg"
},
"userSpeechBubble": {
"path": "Echo/modules/icons/user-speech-bubble.svg"
}
},
"merge_strategy": "array_plus_2d"
},
"EchoNotifications": {
"value": {
"welcome": {
"user-locators": [
"EchoUserLocator::locateEventAgent"
],
"canNotifyAgent": true,
"category": "system-noemail",
"group": "positive",
"section": "message",
"presentation-model": "EchoWelcomePresentationModel"
},
"edit-user-talk": {
"presentation-model": "EchoEditUserTalkPresentationModel",
"user-locators": [
"EchoUserLocator::locateTalkPageOwner"
],
"category": "edit-user-talk",
"group": "interactive",
"section": "alert",
"bundle": {
"web": true,
"email": false,
"expandable": true
},
"immediate": true
},
"reverted": {
"presentation-model": "EchoRevertedPresentationModel",
"user-locators": [
[
"EchoUserLocator::locateFromEventExtra",
[
"reverted-user-id"
]
]
],
"category": "reverted",
"group": "negative",
"section": "alert"
},
"page-linked": {
"presentation-model": "EchoPageLinkedPresentationModel",
"user-locators": [
"EchoUserLocator::locateArticleCreator"
],
"category": "article-linked",
"group": "neutral",
"section": "message",
"bundle": {
"web": true,
"email": true,
"expandable": true
}
},
"minor-watchlist-change": {
"user-locators": [
"EchoUserLocator::locateUsersWatchingTitle"
],
"category": "minor-watchlist",
"group": "interactive",
"section": "message",
"presentation-model": "EchoWatchlistChangePresentationModel",
"bundle": {
"web": true,
"email": true,
"expandable": true
}
},
"watchlist-change": {
"user-locators": [
"EchoUserLocator::locateUsersWatchingTitle"
],
"section": "message",
"category": "watchlist",
"group": "interactive",
"presentation-model": "EchoWatchlistChangePresentationModel",
"bundle": {
"web": true,
"email": true,
"expandable": true
}
},
"mention": {
"user-locators": [
[
"EchoUserLocator::locateFromEventExtra",
[
"mentioned-users"
]
]
],
"category": "mention",
"group": "interactive",
"section": "alert",
"presentation-model": "EchoMentionPresentationModel"
},
"mention-summary": {
"user-locators": [
[
"EchoUserLocator::locateFromEventExtra",
[
"mentioned-users"
]
]
],
"category": "mention",
"group": "interactive",
"section": "alert",
"presentation-model": "EchoMentionInSummaryPresentationModel"
},
"mention-failure": {
"user-locators": [
[
"EchoUserLocator::locateEventAgent"
]
],
"canNotifyAgent": true,
"category": "mention-failure",
"bundle": {
"web": true,
"expandable": true
},
"group": "negative",
"section": "alert",
"presentation-model": "EchoMentionStatusPresentationModel"
},
"mention-failure-too-many": {
"user-locators": [
[
"EchoUserLocator::locateEventAgent"
]
],
"canNotifyAgent": true,
"category": "mention-failure",
"group": "negative",
"section": "alert",
"presentation-model": "EchoMentionStatusPresentationModel"
},
"mention-success": {
"user-locators": [
[
"EchoUserLocator::locateEventAgent"
]
],
"canNotifyAgent": true,
"category": "mention-success",
"bundle": {
"web": true,
"expandable": true
},
"group": "positive",
"section": "message",
"presentation-model": "EchoMentionStatusPresentationModel"
},
"user-rights": {
"user-locators": [
[
"EchoUserLocator::locateFromEventExtra",
[
"user"
]
]
],
"category": "user-rights",
"group": "neutral",
"section": "alert",
"presentation-model": "EchoUserRightsPresentationModel"
},
"emailuser": {
"presentation-model": "EchoEmailUserPresentationModel",
"user-locators": [
[
"EchoUserLocator::locateFromEventExtra",
[
"to-user-id"
]
]
],
"category": "emailuser",
"group": "neutral",
"section": "alert"
},
"foreign": {
"presentation-model": "EchoForeignPresentationModel",
"user-locators": [
"EchoUserLocator::locateEventAgent"
],
"category": "foreign",
"group": "positive",
"section": "alert"
},
"thank-you-edit": {
"user-locators": [
"EchoUserLocator::locateEventAgent"
],
"canNotifyAgent": true,
"category": "thank-you-edit",
"group": "positive",
"presentation-model": "EchoEditThresholdPresentationModel",
"section": "message"
},
"article-reminder": {
"user-locators": [
"EchoUserLocator::locateEventAgent"
],
"canNotifyAgent": true,
"category": "article-reminder",
"group": "positive",
"presentation-model": "EchoArticleReminderPresentationModel",
"section": "message"
}
},
"merge_strategy": "array_plus_2d"
},
"EchoCacheVersion": {
"value": "1.12"
},
"EchoEventLoggingVersion": {
"value": "1.12"
},
"EchoEventLoggingSchemas": {
"value": {
"Echo": {
"enabled": false
},
"EchoMail": {
"enabled": false
},
"EchoInteraction": {
"enabled": false
}
},
"merge_strategy": "array_plus_2d"
},
"AllowArticleReminderNotification": {
"value": false,
"description": "This is a feature flag to the Article Reminder notification"
},
"EchoMaxMentionsInEditSummary": {
"value": 0,
"description": "Maximum nubmer of users that will be notified that they were linked from an edit summary or 0 for no notifications"
},
"EchoPollForUpdates": {
"value": 0,
"description": "This is the polling rate i.e. the time after which we check for notifications count on the client side. It also controls whether notification count will be displayed in browser title. If polling rate is 0 this means polling is disabled and notification count is also not shown in browser title"
},
"EchoWatchlistNotifications": {
"value": false,
"description": "Feature flag to enable Echo notifications whenever a page on a user's watchlist is changed, replacing the built-in preference to send emails in that circumstance."
},
"EchoWatchlistEmailOncePerPage": {
"value": true,
"description": "Whether to send email notifications each time a watched page is edited (if false) or only the first time the page is changed before being visited again by the user (if true)"
},
"EchoEnablePush": {
"value": false,
"description": "Whether to enable push notifications"
},
"EchoPushServiceBaseUrl": {
"value": false,
"description": "Request endpoint URL for the push notification service"
},
"EchoPushMaxSubscriptionsPerUser": {
"value": 0,
"description": "Maximum number of push subscriptions that may be stored in the DB at any given time for a single central user ID."
}
},
"attributes": {
"EventLogging": {
"Schemas": {
"EchoInteraction": "/analytics/legacy/echointeraction/1.0.0",
"EchoMail": "/analytics/legacy/echomail/1.0.0"
}
}
},
"manifest_version": 2,
"AutoloadClasses": {
"ApiCrossWiki": "includes/api/ApiCrossWiki.php",
"ApiEchoArticleReminder": "includes/api/ApiEchoArticleReminder.php",
"ApiEchoMarkRead": "includes/api/ApiEchoMarkRead.php",
"ApiEchoMarkSeen": "includes/api/ApiEchoMarkSeen.php",
"ApiEchoMute": "includes/api/ApiEchoMute.php",
"ApiEchoNotifications": "includes/api/ApiEchoNotifications.php",
"ApiEchoUnreadNotificationPages": "includes/api/ApiEchoUnreadNotificationPages.php",
"BackfillUnreadWikis": "maintenance/backfillUnreadWikis.php",
"Bundleable": "includes/Bundleable.php",
"Bundler": "includes/Bundler.php",
"EchoAbstractEntity": "includes/model/AbstractEntity.php",
"EchoAbstractMapper": "includes/mapper/AbstractMapper.php",
"EchoArrayList": "includes/EchoArrayList.php",
"EchoAttributeManager": "includes/AttributeManager.php",
"EchoCachedList": "includes/EchoCachedList.php",
"EchoCallbackIterator": "includes/iterator/CallbackIterator.php",
"EchoCatchableFatalErrorException": "includes/exception/CatchableFatalErrorException.php",
"EchoContainmentList": "includes/EchoContainmentList.php",
"EchoContainmentSet": "includes/EchoContainmentSet.php",
"EchoDataOutputFormatter": "includes/DataOutputFormatter.php",
"EchoDeferredMarkAsDeletedUpdate": "includes/DeferredMarkAsDeletedUpdate.php",
"EchoDiffGroup": "includes/EchoDiffGroup.php",
"EchoDiffParser": "includes/EchoDiffParser.php",
"EchoDiscussionParser": "includes/DiscussionParser.php",
"EchoEditThresholdPresentationModel": "includes/formatters/EditThresholdPresentationModel.php",
"EchoEditUserTalkPresentationModel": "includes/formatters/EditUserTalkPresentationModel.php",
"EchoArticleReminderPresentationModel": "includes/formatters/ArticleReminderPresentationModel.php",
"EchoEmailFormat": "includes/EmailFormat.php",
"EchoEmailFrequency": "includes/EmailFrequency.php",
"EchoEmailUserPresentationModel": "includes/formatters/EmailUserPresentationModel.php",
"EchoEvent": "includes/model/Event.php",
"EchoEventDigestFormatter": "includes/formatters/EchoEventDigestFormatter.php",
"EchoEventFormatter": "includes/formatters/EchoEventFormatter.php",
"EchoEventMapper": "includes/mapper/EventMapper.php",
"EchoEventPresentationModel": "includes/formatters/EventPresentationModel.php",
"EchoFilteredSequentialIterator": "includes/iterator/FilteredSequentialIterator.php",
"EchoFlyoutFormatter": "includes/formatters/EchoFlyoutFormatter.php",
"EchoForeignNotifications": "includes/ForeignNotifications.php",
"EchoForeignPresentationModel": "includes/formatters/EchoForeignPresentationModel.php",
"EchoForeignWikiRequest": "includes/ForeignWikiRequest.php",
"EchoHtmlDigestEmailFormatter": "includes/formatters/EchoHtmlDigestEmailFormatter.php",
"EchoHtmlEmailFormatter": "includes/formatters/EchoHtmlEmailFormatter.php",
"EchoIcon": "includes/formatters/EchoIcon.php",
"EchoLocalCache": "includes/cache/LocalCache.php",
"EchoMentionInSummaryPresentationModel": "includes/formatters/MentionInSummaryPresentationModel.php",
"EchoMentionPresentationModel": "includes/formatters/MentionPresentationModel.php",
"EchoMentionStatusPresentationModel": "includes/formatters/MentionStatusPresentationModel.php",
"EchoModelFormatter": "includes/formatters/EchoModelFormatter.php",
"EchoModerationController": "includes/controller/ModerationController.php",
"EchoMultipleIterator": "includes/iterator/MultipleIterator.php",
"EchoNotRecursiveIterator": "includes/iterator/NotRecursiveIterator.php",
"EchoNotification": "includes/model/Notification.php",
"EchoNotificationController": "includes/controller/NotificationController.php",
"EchoNotificationDeleteJob": "includes/jobs/NotificationDeleteJob.php",
"EchoNotificationJob": "includes/jobs/NotificationJob.php",
"EchoNotificationMapper": "includes/mapper/NotificationMapper.php",
"EchoNotifier": "includes/Notifier.php",
"EchoOnWikiList": "includes/EchoOnWikiList.php",
"EchoPageLinkedPresentationModel": "includes/formatters/PageLinkedPresentationModel.php",
"EchoPlainTextDigestEmailFormatter": "includes/formatters/EchoPlainTextDigestEmailFormatter.php",
"EchoPlainTextEmailFormatter": "includes/formatters/EchoPlainTextEmailFormatter.php",
"EchoPresentationModelSection": "includes/formatters/PresentationModelSection.php",
"EchoRevertedPresentationModel": "includes/formatters/RevertedPresentationModel.php",
"EchoRevisionLocalCache": "includes/cache/RevisionLocalCache.php",
"EchoSeenTime": "includes/SeenTime.php",
"EchoServices": "includes/EchoServices.php",
"EchoSummaryParser": "includes/EchoSummaryParser.php",
"EchoSuppressionRowUpdateGenerator": "includes/schemaUpdate.php",
"EchoTargetPage": "includes/model/TargetPage.php",
"EchoTargetPageMapper": "includes/mapper/TargetPageMapper.php",
"EchoTitleLocalCache": "includes/cache/TitleLocalCache.php",
"EchoUnreadWikis": "includes/UnreadWikis.php",
"EchoUserLocator": "includes/UserLocator.php",
"EchoUserNotificationGateway": "includes/gateway/UserNotificationGateway.php",
"EchoUserRightsPresentationModel": "includes/formatters/UserRightsPresentationModel.php",
"EchoWelcomePresentationModel": "includes/formatters/WelcomePresentationModel.php",
"EchoWatchlistChangePresentationModel": "includes/formatters/WatchlistChangePresentationModel.php",
"GenerateSampleNotifications": "maintenance/generateSampleNotifications.php",
"MWEchoDbFactory": "includes/EchoDbFactory.php",
"MWEchoEmailBatch": "includes/EmailBatch.php",
"MWEchoEventLogging": "includes/EventLogging.php",
"MWEchoNotifUser": "includes/NotifUser.php",
"NotificationPager": "includes/special/NotificationPager.php",
"ProcessEchoEmailBatch": "maintenance/processEchoEmailBatch.php",
"RecomputeNotifCounts": "maintenance/recomputeNotifCounts.php",
"RemoveInvalidNotification": "maintenance/removeInvalidNotification.php",
"RemoveOrphanedEvents": "maintenance/removeOrphanedEvents.php",
"ResourceLoaderEchoImageModule": "includes/ResourceLoaderEchoImageModule.php",
"SpecialDisplayNotificationsConfiguration": "includes/special/SpecialDisplayNotificationsConfiguration.php",
"SpecialNotifications": "includes/special/SpecialNotifications.php",
"SpecialNotificationsFormatter": "includes/formatters/SpecialNotificationsFormatter.php",
"SpecialNotificationsMarkRead": "includes/special/SpecialNotificationsMarkRead.php",
"UpdateEchoSchemaForSuppression": "maintenance/updateEchoSchemaForSuppression.php",
"EchoUpdatePerUserBlacklist": "maintenance/updatePerUserBlacklist.php",
"EchoPush\\PushNotifier": "includes/Push/PushNotifier.php",
"MediaWiki\\Extension\\Notifications\\Push\\PushNotifier": "includes/Push/PushNotifier.php"
},
"AutoloadNamespaces": {
"MediaWiki\\Extension\\Notifications\\": "includes/"
},
"TestAutoloadClasses": {
"EchoAbstractMapperStub": "tests/phpunit/mapper/EchoAbstractMapperStub.php",
"EchoExecuteFirstArgumentStub": "tests/phpunit/mapper/EchoExecuteFirstArgumentStub.php"
},
"ServiceWiringFiles": [
"ServiceWiring.php"
],
"ConfigRegistry": {
"Echo": "GlobalVarConfig::newInstance"
}
}