@wikimedia/resource-modules v3.1.0-0
resource-modules
CLI tool that lints frontend resources in mediawiki extensions. Analyzes the sources and builds a dependency tree from source, and then lints that information with the extension.json ResourceModules declarations.
It assumes the mediawiki extension contains a resources/ folder with the
frontend assets and a extension.json file with a ResourceModules key with
the ResourceLoader configuration.
See T146748 for more information.
Install
You can install it globally and use it from the command line:
npm install -g resource-modules
resource-modules ~/mediawiki-vagrant/mediawiki/extensions/Popups/You can also set it up locally for your project:
npm install --save-dev resource-modules
# Add a script in package.json
# "scripts": {
# "lint": "resource-modules ./"
# }
npm run lintFeatures
- Templates
- Forces usage of
mw.template.getwith string literals (no variables) - Complains when template used in source is not on ResourceModules
- Forces usage of
- i18n messages
- Forces usage of
mw.msgwith string literals - Complains when message used in source is not on its ResourceModule or other modules in the dependency graph
- Forces usage of
- Unused files
- Warns about files not defined in any ResourceModules
- Only warning because there may be files loaded on hooks depending on runtime checks
- Warns about files not defined in any ResourceModules
- MobileFrontend modules (
mw.mobileFrontend.define&mw.mobileFrontend.require)- Complains about unused
M.defines - Checks that
M.required modules areM.defined in some dependency script (in same ResourceModule or a dependency)
- Complains about unused
- MobileFrontend modules (
mw.mobileFrontend.define&mw.mobileFrontend.require)- Complains about unused
M.defines - Checks that
M.required modules areM.defined in some dependency script (in same ResourceModule or a dependency)
- Complains about unused
- Global
mwnamespaces/usages- Tracks global definitions of
mw.X = { ... },mw.X.Y = ...and$.extend( mw.X, { Y: ... } ), from the extension and core. - Tracks usages of
mw.Xin sources - Complains when used
mw.Xglobals are not in previously defined scripts in ResourceModules
- Tracks global definitions of
Disabling linting
Sometimes there are highly dynamic interactions on the code that can't be linted, for example, MobileFrontend using messages defined on VisualEditor, so they aren't in MobileFrontend's extension.json.
In those cases, use // resource-modules-disable-line in the line that is
giving you the lint error to avoid parsing of that line and thus the error.
Example:
// ...
switchToolbar.setup([
{
type: "list",
icon: "edit",
title: mw.msg("visualeditor-mweditmode-tooltip"), //resource-modules-disable-line
include: ["editModeVisual", "editModeSource"]
}
]);Possible future improvements
- Track and lint the broken version of
require/module.exportsthat ResourceLoader exposes (ResourceModule based scope instead of file based scope like in common.js modules) - Lint for messages defined in resource modules not used in sources or dependent sources
- Lint async requires to be correct too
- Automatic restructuring/collapsing of ResourceModules configuration
- Validate template files actually exist
Development
resource-modules requires node.js 6+ and is written in typed javascript using
typescript
npm install
npm start /path/to/mediawiki/extensionTo run the type checker, and tests:
npm testIf you want to run them in watch mode:
npm install -g nodemon
nodemon -e "ts" -w src/ --exec "npm test"To release, first build the artifacts and then publish:
npm run dist
npm version <major|minor|patch>
git push --tags && git push
npm publish