User:Dantman/Extension composer descriptions/Session

From MediaWiki.org
Jump to: navigation, search

It probably won't be very useful, but this is the console session where I put together the report.

Last login: Fri Feb 20 18:44:31 on ttys009
You have new mail.
Daniels-MacBook-Air:~ daniel$ cd /tmp
Daniels-MacBook-Air:tmp daniel$ mkdir exts
Daniels-MacBook-Air:tmp daniel$ cd exts
$ for EXT in AWS cldr WikidataQuality Wikidata WikibaseQuery WikibaseJavaScriptApi WikiEditor Wikibase Validator UserFunctions UniversalLanguageSelector TranslationNotifications Translate SwiftMailer SubPageList SideBarMenu SemanticWatchlist SemanticSignup SemanticSifter SemanticResultFormats SemanticMaps SemanticInterlanguageLinks SemanticMediaWiki SemanticHighcharts SemanticGlossary SemanticExtraSpecialProperties SemanticForms SemanticBreadcrumbLinks Scribunto PubSubHubbub ProofreadPage ParserHooks MixedNamespaceSearchSuggestions MobileFrontend Maps Lingo InviteSignup ImageMap GraphViz GoogleLogin GoogleCustomWikiSearch GitHub Flow Elastica EducationProgram DonationInterface DataTypes ContentTranslation CollapsibleVector CleanChanges BounceHandler Bootstrap Babel ArticleFeedbackv5 AntiSpoof AbuseFilter; do git clone "https://git.wikimedia.org/git/mediawiki/extensions/$EXT.git"; done
<...cut...>
$ ls *
<...cut...>
$ ls */i18n
<...cut...>
$ ls */i18n/en.json
AWS/i18n/en.json				Scribunto/i18n/en.json
AbuseFilter/i18n/en.json			SemanticBreadcrumbLinks/i18n/en.json
ArticleFeedbackv5/i18n/en.json			SemanticExtraSpecialProperties/i18n/en.json
Babel/i18n/en.json				SemanticForms/i18n/en.json
Bootstrap/i18n/en.json				SemanticGlossary/i18n/en.json
BounceHandler/i18n/en.json			SemanticHighcharts/i18n/en.json
CleanChanges/i18n/en.json			SemanticInterlanguageLinks/i18n/en.json
CollapsibleVector/i18n/en.json			SemanticMaps/i18n/en.json
ContentTranslation/i18n/en.json			SemanticMediaWiki/i18n/en.json
EducationProgram/i18n/en.json			SemanticResultFormats/i18n/en.json
Elastica/i18n/en.json				SemanticSifter/i18n/en.json
Flow/i18n/en.json				SemanticSignup/i18n/en.json
GitHub/i18n/en.json				SemanticWatchlist/i18n/en.json
GoogleCustomWikiSearch/i18n/en.json		SideBarMenu/i18n/en.json
GoogleLogin/i18n/en.json			SubPageList/i18n/en.json
GraphViz/i18n/en.json				SwiftMailer/i18n/en.json
ImageMap/i18n/en.json				TranslationNotifications/i18n/en.json
InviteSignup/i18n/en.json			UniversalLanguageSelector/i18n/en.json
Lingo/i18n/en.json				UserFunctions/i18n/en.json
Maps/i18n/en.json				Validator/i18n/en.json
MixedNamespaceSearchSuggestions/i18n/en.json	WikiEditor/i18n/en.json
MobileFrontend/i18n/en.json			WikibaseQuery/i18n/en.json
ParserHooks/i18n/en.json			WikidataQuality/i18n/en.json
ProofreadPage/i18n/en.json			cldr/i18n/en.json
PubSubHubbub/i18n/en.json
$ npm i bluebird
bluebird@2.9.12 node_modules/bluebird
<...cut...>
$ npm i lodash
lodash@3.3.0 node_modules/lodash
$ node-promised
> var Promise = require('bluebird'), fs = Promise.promisifyAll(require('fs')), lo = require('lodash')
undefined
> fs.readdirAsync('.')
[ 'AWS',
  'AbuseFilter',
  'ArticleFeedbackv5',
  'Babel',
  'Bootstrap',
  'BounceHandler',
  'CleanChanges',
  'CollapsibleVector',
  'ContentTranslation',
  'DataTypes',
  'DonationInterface',
  'EducationProgram',
  'Elastica',
  'Flow',
  'GitHub',
  'GoogleCustomWikiSearch',
  'GoogleLogin',
  'GraphViz',
  'ImageMap',
  'InviteSignup',
  'Lingo',
  'Maps',
  'MixedNamespaceSearchSuggestions',
  'MobileFrontend',
  'ParserHooks',
  'ProofreadPage',
  'PubSubHubbub',
  'Scribunto',
  'SemanticBreadcrumbLinks',
  'SemanticExtraSpecialProperties',
  'SemanticForms',
  'SemanticGlossary',
  'SemanticHighcharts',
  'SemanticInterlanguageLinks',
  'SemanticMaps',
  'SemanticMediaWiki',
  'SemanticResultFormats',
  'SemanticSifter',
  'SemanticSignup',
  'SemanticWatchlist',
  'SideBarMenu',
  'SubPageList',
  'SwiftMailer',
  'Translate',
  'TranslationNotifications',
  'UniversalLanguageSelector',
  'UserFunctions',
  'Validator',
  'WikiEditor',
  'Wikibase',
  'WikibaseJavaScriptApi',
  'WikibaseQuery',
  'Wikidata',
  'WikidataQuality',
  'cldr',
  'node_modules' ]
> _.omit(_, 'node_modules')
TypeError: undefined is not a function
    at repl:1:3
    at defaultEval (repl.js:134:27)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> i
> fs.readdirAsync('.')

(^C again to quit)
> [ 'AWS',
  'AbuseFilter',
  'ArticleFeedbackv5',
  'Babel',
  'Bootstrap',
  'BounceHandler',
  'CleanChanges',
  'CollapsibleVector',
  'ContentTranslation',
  'DataTypes',
  'DonationInterface',
  'EducationProgram',
  'Elastica',
  'Flow',
  'GitHub',
  'GoogleCustomWikiSearch',
  'GoogleLogin',
  'GraphViz',
  'ImageMap',
  'InviteSignup',
  'Lingo',
  'Maps',
  'MixedNamespaceSearchSuggestions',
  'MobileFrontend',
  'ParserHooks',
  'ProofreadPage',
  'PubSubHubbub',
  'Scribunto',
  'SemanticBreadcrumbLinks',
  'SemanticExtraSpecialProperties',
  'SemanticForms',
  'SemanticGlossary',
  'SemanticHighcharts',
  'SemanticInterlanguageLinks',
  'SemanticMaps',
  'SemanticMediaWiki',
  'SemanticResultFormats',
  'SemanticSifter',
  'SemanticSignup',
  'SemanticWatchlist',
  'SideBarMenu',
  'SubPageList',
  'SwiftMailer',
  'Translate',
  'TranslationNotifications',
  'UniversalLanguageSelector',
  'UserFunctions',
  'Validator',
  'WikiEditor',
  'Wikibase',
  'WikibaseJavaScriptApi',
  'WikibaseQuery',
  'Wikidata',
  'WikidataQuality',
  'cldr',
  'node_modules' ]
> fs.readdirAsync('.')
[ 'AWS',
  'AbuseFilter',
  'ArticleFeedbackv5',
  'Babel',
  'Bootstrap',
  'BounceHandler',
  'CleanChanges',
  'CollapsibleVector',
  'ContentTranslation',
  'DataTypes',
  'DonationInterface',
  'EducationProgram',
  'Elastica',
  'Flow',
  'GitHub',
  'GoogleCustomWikiSearch',
  'GoogleLogin',
  'GraphViz',
  'ImageMap',
  'InviteSignup',
  'Lingo',
  'Maps',
  'MixedNamespaceSearchSuggestions',
  'MobileFrontend',
  'ParserHooks',
  'ProofreadPage',
  'PubSubHubbub',
  'Scribunto',
  'SemanticBreadcrumbLinks',
  'SemanticExtraSpecialProperties',
  'SemanticForms',
  'SemanticGlossary',
  'SemanticHighcharts',
  'SemanticInterlanguageLinks',
  'SemanticMaps',
  'SemanticMediaWiki',
  'SemanticResultFormats',
  'SemanticSifter',
  'SemanticSignup',
  'SemanticWatchlist',
  'SideBarMenu',
  'SubPageList',
  'SwiftMailer',
  'Translate',
  'TranslationNotifications',
  'UniversalLanguageSelector',
  'UserFunctions',
  'Validator',
  'WikiEditor',
  'Wikibase',
  'WikibaseJavaScriptApi',
  'WikibaseQuery',
  'Wikidata',
  'WikidataQuality',
  'cldr',
  'node_modules' ]
> lo.omit(_, 'node_modules')
{ '0': 'AWS',
  '1': 'AbuseFilter',
  '2': 'ArticleFeedbackv5',
  '3': 'Babel',
  '4': 'Bootstrap',
  '5': 'BounceHandler',
  '6': 'CleanChanges',
  '7': 'CollapsibleVector',
  '8': 'ContentTranslation',
  '9': 'DataTypes',
  '10': 'DonationInterface',
  '11': 'EducationProgram',
  '12': 'Elastica',
  '13': 'Flow',
  '14': 'GitHub',
  '15': 'GoogleCustomWikiSearch',
  '16': 'GoogleLogin',
  '17': 'GraphViz',
  '18': 'ImageMap',
  '19': 'InviteSignup',
  '20': 'Lingo',
  '21': 'Maps',
  '22': 'MixedNamespaceSearchSuggestions',
  '23': 'MobileFrontend',
  '24': 'ParserHooks',
  '25': 'ProofreadPage',
  '26': 'PubSubHubbub',
  '27': 'Scribunto',
  '28': 'SemanticBreadcrumbLinks',
  '29': 'SemanticExtraSpecialProperties',
  '30': 'SemanticForms',
  '31': 'SemanticGlossary',
  '32': 'SemanticHighcharts',
  '33': 'SemanticInterlanguageLinks',
  '34': 'SemanticMaps',
  '35': 'SemanticMediaWiki',
  '36': 'SemanticResultFormats',
  '37': 'SemanticSifter',
  '38': 'SemanticSignup',
  '39': 'SemanticWatchlist',
  '40': 'SideBarMenu',
  '41': 'SubPageList',
  '42': 'SwiftMailer',
  '43': 'Translate',
  '44': 'TranslationNotifications',
  '45': 'UniversalLanguageSelector',
  '46': 'UserFunctions',
  '47': 'Validator',
  '48': 'WikiEditor',
  '49': 'Wikibase',
  '50': 'WikibaseJavaScriptApi',
  '51': 'WikibaseQuery',
  '52': 'Wikidata',
  '53': 'WikidataQuality',
  '54': 'cldr',
  '55': 'node_modules' }
> fs.readdirAsync('.')
[ 'AWS',
  'AbuseFilter',
  'ArticleFeedbackv5',
  'Babel',
  'Bootstrap',
  'BounceHandler',
  'CleanChanges',
  'CollapsibleVector',
  'ContentTranslation',
  'DataTypes',
  'DonationInterface',
  'EducationProgram',
  'Elastica',
  'Flow',
  'GitHub',
  'GoogleCustomWikiSearch',
  'GoogleLogin',
  'GraphViz',
  'ImageMap',
  'InviteSignup',
  'Lingo',
  'Maps',
  'MixedNamespaceSearchSuggestions',
  'MobileFrontend',
  'ParserHooks',
  'ProofreadPage',
  'PubSubHubbub',
  'Scribunto',
  'SemanticBreadcrumbLinks',
  'SemanticExtraSpecialProperties',
  'SemanticForms',
  'SemanticGlossary',
  'SemanticHighcharts',
  'SemanticInterlanguageLinks',
  'SemanticMaps',
  'SemanticMediaWiki',
  'SemanticResultFormats',
  'SemanticSifter',
  'SemanticSignup',
  'SemanticWatchlist',
  'SideBarMenu',
  'SubPageList',
  'SwiftMailer',
  'Translate',
  'TranslationNotifications',
  'UniversalLanguageSelector',
  'UserFunctions',
  'Validator',
  'WikiEditor',
  'Wikibase',
  'WikibaseJavaScriptApi',
  'WikibaseQuery',
  'Wikidata',
  'WikidataQuality',
  'cldr',
  'node_modules' ]
> var dirs = _
undefined
> _.pull(dirs, 'node_modules')
TypeError: Cannot read property 'pull' of undefined
    at repl:1:2
    at defaultEval (repl.js:134:27)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> lo.pull(dirs, 'node_modules')
[ 'AWS',
  'AbuseFilter',
  'ArticleFeedbackv5',
  'Babel',
  'Bootstrap',
  'BounceHandler',
  'CleanChanges',
  'CollapsibleVector',
  'ContentTranslation',
  'DataTypes',
  'DonationInterface',
  'EducationProgram',
  'Elastica',
  'Flow',
  'GitHub',
  'GoogleCustomWikiSearch',
  'GoogleLogin',
  'GraphViz',
  'ImageMap',
  'InviteSignup',
  'Lingo',
  'Maps',
  'MixedNamespaceSearchSuggestions',
  'MobileFrontend',
  'ParserHooks',
  'ProofreadPage',
  'PubSubHubbub',
  'Scribunto',
  'SemanticBreadcrumbLinks',
  'SemanticExtraSpecialProperties',
  'SemanticForms',
  'SemanticGlossary',
  'SemanticHighcharts',
  'SemanticInterlanguageLinks',
  'SemanticMaps',
  'SemanticMediaWiki',
  'SemanticResultFormats',
  'SemanticSifter',
  'SemanticSignup',
  'SemanticWatchlist',
  'SideBarMenu',
  'SubPageList',
  'SwiftMailer',
  'Translate',
  'TranslationNotifications',
  'UniversalLanguageSelector',
  'UserFunctions',
  'Validator',
  'WikiEditor',
  'Wikibase',
  'WikibaseJavaScriptApi',
  'WikibaseQuery',
  'Wikidata',
  'WikidataQuality',
  'cldr' ]
> dirs
[ 'AWS',
  'AbuseFilter',
  'ArticleFeedbackv5',
  'Babel',
  'Bootstrap',
  'BounceHandler',
  'CleanChanges',
  'CollapsibleVector',
  'ContentTranslation',
  'DataTypes',
  'DonationInterface',
  'EducationProgram',
  'Elastica',
  'Flow',
  'GitHub',
  'GoogleCustomWikiSearch',
  'GoogleLogin',
  'GraphViz',
  'ImageMap',
  'InviteSignup',
  'Lingo',
  'Maps',
  'MixedNamespaceSearchSuggestions',
  'MobileFrontend',
  'ParserHooks',
  'ProofreadPage',
  'PubSubHubbub',
  'Scribunto',
  'SemanticBreadcrumbLinks',
  'SemanticExtraSpecialProperties',
  'SemanticForms',
  'SemanticGlossary',
  'SemanticHighcharts',
  'SemanticInterlanguageLinks',
  'SemanticMaps',
  'SemanticMediaWiki',
  'SemanticResultFormats',
  'SemanticSifter',
  'SemanticSignup',
  'SemanticWatchlist',
  'SideBarMenu',
  'SubPageList',
  'SwiftMailer',
  'Translate',
  'TranslationNotifications',
  'UniversalLanguageSelector',
  'UserFunctions',
  'Validator',
  'WikiEditor',
  'Wikibase',
  'WikibaseJavaScriptApi',
  'WikibaseQuery',
  'Wikidata',
  'WikidataQuality',
  'cldr' ]
> Promise.all(dirs).map(function(dir) { return fs.statAsync(dir); }, {concurency: 5})
<...cut...>
> Promise.all(dirs).map(function(dir) { return fs.statAsync(dir); }, {concurency: 5}).call('isDirectory')
TypeError: Object [object Array] has no method 'isDirectory'
    at ensureMethod (/private/tmp/exts/node_modules/bluebird/js/main/call_get.js:75:15)
    at Array.eval (eval at <anonymous> (/private/tmp/exts/node_modules/bluebird/js/main/call_get.js:18:12), <anonymous>:7:13)
    at Array.tryCatcher (/private/tmp/exts/node_modules/bluebird/js/main/util.js:24:31)
    at Promise._settlePromiseFromHandler (/private/tmp/exts/node_modules/bluebird/js/main/promise.js:454:31)
    at Promise._settlePromiseAt (/private/tmp/exts/node_modules/bluebird/js/main/promise.js:530:18)
    at Promise._settlePromises (/private/tmp/exts/node_modules/bluebird/js/main/promise.js:646:14)
    at Async._drainQueue (/private/tmp/exts/node_modules/bluebird/js/main/async.js:79:16)
    at Async._drainQueues (/private/tmp/exts/node_modules/bluebird/js/main/async.js:89:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/private/tmp/exts/node_modules/bluebird/js/main/async.js:14:14)
    at processImmediate [as _immediateCallback] (timers.js:358:17)
> Promise.all(dirs).map(function(dir) { return fs.statAsync(dir).call('isDirectory'); }, {concurency: 5})
[ true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true ]
> Promise.all(dirs).map(function(dir) { return fs.statAsync(path.join(dir, 'composer.json')).call('isFile'); }, {concurency: 5})
[ true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true ]
> Promise.all(dirs).map(function(dir) { return fs.statAsync(path.join(dir, 'i18n/en.json')).call('isFile'); }, {concurency: 5})
Error: ENOENT, stat 'DataTypes/i18n/en.json'
    at Error (native)
> Promise.all(dirs).map(function(dir) { return fs.statAsync(path.join(dir, 'i18n/en.json')).call('isFile').catch(function(e) { if ( e.code === 'ENOENT' ) { return false; } throw; }); }, {concurency: 5})
SyntaxError: Unexpected token ;
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> Promise.all(dirs).map(function(dir) { return fs.statAsync(path.join(dir, 'i18n/en.json')).call('isFile').catch(function(e) { if ( e.code === 'ENOENT' ) { return false; } throw err; }); }, {concurency: 5})

(^C again to quit)
> [ true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  false,
  false,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  false,
  true,
  true,
  true,
  true,
  true,
  false,
  false,
  true,
  false,
  true,
  true ]
> Promise.all(dirs).map(function(dir) { return fs.statAsync(path.join(dir, 'i18n/en.json')).call('isFile').catch(function(e) { if ( e.code === 'ENOENT' ) { return false; } throw e; }); }, {concurency: 5})

undefined
> [ true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  false,
  false,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  false,
  true,
  true,
  true,
  true,
  true,
  false,
  false,
  true,
  false,
  true,
  true ]
> Promise.all(dirs).map(function(dir) { return fs.statAsync(path.join(dir, 'i18n/en.json')).call('isFile').catch(function(e) { if ( e.code === 'ENOENT' ) { return false; } throw e; }).then(function(isFile) { return { dir: dir, i18n: isFile ? path.join(dir, 'i18n/en.json') : false; }, {concurency: 5})
SyntaxError: Unexpected token ;
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> Promise.all(dirs).map(function(dir) { return fs.statAsync(path.join(dir, 'i18n/en.json')).call('isFile').catch(function(e) { if ( e.code === 'ENOENT' ) { return false; } throw e; }).then(function(isFile) { return { dir: dir, i18n: isFile ? path.join(dir, 'i18n/en.json') : false }; }, {concurency: 5})
... 
> Promise.all(dirs).map(function(dir) { return fs.statAsync(path.join(dir, 'i18n/en.json')).call('isFile').catch(function(e) { if ( e.code === 'ENOENT' ) { return false; } throw e; }).then(function(isFile) { return { dir: dir, i18n: isFile ? path.join(dir, 'i18n/en.json') : false }; }); }, {concurency: 5})
[ { dir: 'AWS', i18n: 'AWS/i18n/en.json' },
  { dir: 'AbuseFilter', i18n: 'AbuseFilter/i18n/en.json' },
  { dir: 'ArticleFeedbackv5',
    i18n: 'ArticleFeedbackv5/i18n/en.json' },
  { dir: 'Babel', i18n: 'Babel/i18n/en.json' },
  { dir: 'Bootstrap', i18n: 'Bootstrap/i18n/en.json' },
  { dir: 'BounceHandler', i18n: 'BounceHandler/i18n/en.json' },
  { dir: 'CleanChanges', i18n: 'CleanChanges/i18n/en.json' },
  { dir: 'CollapsibleVector',
    i18n: 'CollapsibleVector/i18n/en.json' },
  { dir: 'ContentTranslation',
    i18n: 'ContentTranslation/i18n/en.json' },
  { dir: 'DataTypes', i18n: false },
  { dir: 'DonationInterface', i18n: false },
  { dir: 'EducationProgram',
    i18n: 'EducationProgram/i18n/en.json' },
  { dir: 'Elastica', i18n: 'Elastica/i18n/en.json' },
  { dir: 'Flow', i18n: 'Flow/i18n/en.json' },
  { dir: 'GitHub', i18n: 'GitHub/i18n/en.json' },
  { dir: 'GoogleCustomWikiSearch',
    i18n: 'GoogleCustomWikiSearch/i18n/en.json' },
  { dir: 'GoogleLogin', i18n: 'GoogleLogin/i18n/en.json' },
  { dir: 'GraphViz', i18n: 'GraphViz/i18n/en.json' },
  { dir: 'ImageMap', i18n: 'ImageMap/i18n/en.json' },
  { dir: 'InviteSignup', i18n: 'InviteSignup/i18n/en.json' },
  { dir: 'Lingo', i18n: 'Lingo/i18n/en.json' },
  { dir: 'Maps', i18n: 'Maps/i18n/en.json' },
  { dir: 'MixedNamespaceSearchSuggestions',
    i18n: 'MixedNamespaceSearchSuggestions/i18n/en.json' },
  { dir: 'MobileFrontend', i18n: 'MobileFrontend/i18n/en.json' },
  { dir: 'ParserHooks', i18n: 'ParserHooks/i18n/en.json' },
  { dir: 'ProofreadPage', i18n: 'ProofreadPage/i18n/en.json' },
  { dir: 'PubSubHubbub', i18n: 'PubSubHubbub/i18n/en.json' },
  { dir: 'Scribunto', i18n: 'Scribunto/i18n/en.json' },
  { dir: 'SemanticBreadcrumbLinks',
    i18n: 'SemanticBreadcrumbLinks/i18n/en.json' },
  { dir: 'SemanticExtraSpecialProperties',
    i18n: 'SemanticExtraSpecialProperties/i18n/en.json' },
  { dir: 'SemanticForms', i18n: 'SemanticForms/i18n/en.json' },
  { dir: 'SemanticGlossary',
    i18n: 'SemanticGlossary/i18n/en.json' },
  { dir: 'SemanticHighcharts',
    i18n: 'SemanticHighcharts/i18n/en.json' },
  { dir: 'SemanticInterlanguageLinks',
    i18n: 'SemanticInterlanguageLinks/i18n/en.json' },
  { dir: 'SemanticMaps', i18n: 'SemanticMaps/i18n/en.json' },
  { dir: 'SemanticMediaWiki',
    i18n: 'SemanticMediaWiki/i18n/en.json' },
  { dir: 'SemanticResultFormats',
    i18n: 'SemanticResultFormats/i18n/en.json' },
  { dir: 'SemanticSifter', i18n: 'SemanticSifter/i18n/en.json' },
  { dir: 'SemanticSignup', i18n: 'SemanticSignup/i18n/en.json' },
  { dir: 'SemanticWatchlist',
    i18n: 'SemanticWatchlist/i18n/en.json' },
  { dir: 'SideBarMenu', i18n: 'SideBarMenu/i18n/en.json' },
  { dir: 'SubPageList', i18n: 'SubPageList/i18n/en.json' },
  { dir: 'SwiftMailer', i18n: 'SwiftMailer/i18n/en.json' },
  { dir: 'Translate', i18n: false },
  { dir: 'TranslationNotifications',
    i18n: 'TranslationNotifications/i18n/en.json' },
  { dir: 'UniversalLanguageSelector',
    i18n: 'UniversalLanguageSelector/i18n/en.json' },
  { dir: 'UserFunctions', i18n: 'UserFunctions/i18n/en.json' },
  { dir: 'Validator', i18n: 'Validator/i18n/en.json' },
  { dir: 'WikiEditor', i18n: 'WikiEditor/i18n/en.json' },
  { dir: 'Wikibase', i18n: false },
  { dir: 'WikibaseJavaScriptApi', i18n: false },
  { dir: 'WikibaseQuery', i18n: 'WikibaseQuery/i18n/en.json' },
  { dir: 'Wikidata', i18n: false },
  { dir: 'WikidataQuality', i18n: 'WikidataQuality/i18n/en.json' },
  { dir: 'cldr', i18n: 'cldr/i18n/en.json' } ]
> var exts = _
undefined
> _.where(exts, { i18n: false })
TypeError: Cannot read property 'where' of undefined
    at repl:1:2
    at defaultEval (repl.js:134:27)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> lo.where(exts, { i18n: false })
[ { dir: 'DataTypes', i18n: false },
  { dir: 'DonationInterface', i18n: false },
  { dir: 'Translate', i18n: false },
  { dir: 'Wikibase', i18n: false },
  { dir: 'WikibaseJavaScriptApi', i18n: false },
  { dir: 'Wikidata', i18n: false } ]
> Promise.all(exts).map(function(ext) { if ( ext.i18n ) { return fs.read
fs.read               fs.readAsync          fs.readFile           fs.readFileAsync      fs.readFileSync
fs.readFileSyncAsync  fs.readSync           fs.readSyncAsync      fs.readdir            fs.readdirAsync
fs.readdirSync        fs.readdirSyncAsync   fs.readlink           fs.readlinkAsync      fs.readlinkSync
fs.readlinkSyncAsync  

> Promise.all(exts).map(function(ext) { if ( ext.i18n ) { return fs.readF
fs.readFile           fs.readFileAsync      fs.readFileSync       fs.readFileSyncAsync  

> Promise.all(exts).map(function(ext) { if ( ext.i18n ) { return fs.readFileAsync(ext.i18n, 'utf8').then(JSON.parse); }, {concurency: 10}); });
SyntaxError: Unexpected token ,
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> Promise.all(exts).map(function(ext) { if ( ext.i18n ) { return fs.readFileAsync(ext.i18n, 'utf8').then(JSON.parse); } }, {concurency: 10});
<...cut...>
> Promise.all(exts).map(function(ext) { if ( ext.i18n ) { return fs.readFileAsync(ext.i18n, 'utf8').then(JSON.parse).then(function(i18n) { ext.i18nData = i18n; }; } }, {concurency: 10});
SyntaxError: Unexpected token ;
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> Promise.all(exts).map(function(ext) { if ( ext.i18n ) { return fs.readFileAsync(ext.i18n, 'utf8').then(JSON.parse).then(function(i18n) { ext.i18nData = i18n; }); } }, {concurency: 10});
[ undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined ]
> exts
<...cut...>
> lo(exts[1].i18nData).keys().filter(RegExp.pro
RegExp.propertyIsEnumerable  

RegExp.prototype             

> lo(exts[1].i18nData).keys().filter(RegExp.prototype.test.
RegExp.prototype.test.__defineGetter__      RegExp.prototype.test.__defineSetter__
RegExp.prototype.test.__lookupGetter__      RegExp.prototype.test.__lookupSetter__
RegExp.prototype.test.__proto__             RegExp.prototype.test.constructor
RegExp.prototype.test.hasOwnProperty        RegExp.prototype.test.isPrototypeOf
RegExp.prototype.test.propertyIsEnumerable  RegExp.prototype.test.toLocaleString
RegExp.prototype.test.toString              RegExp.prototype.test.valueOf

RegExp.prototype.test.apply                 RegExp.prototype.test.arguments
RegExp.prototype.test.bind                  RegExp.prototype.test.call
RegExp.prototype.test.caller                RegExp.prototype.test.length
RegExp.prototype.test.name                  

> lo(exts[1].i18nData).keys().filter(RegExp.prototype.test.bind(/[-_]desc$/))
<...cut...>
> _.pluck(exts, 'descProp')
TypeError: undefined is not a function
    at repl:1:3
    at defaultEval (repl.js:134:27)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> lo.pluck(exts, 'descProp')
[ [ 'aws-desc' ],
  [ 'abusefilter-desc' ],
  [ 'articlefeedbackv5-special-sort-relevance-desc',
    'articlefeedbackv5-special-sort-helpful-desc',
    'articlefeedbackv5-special-sort-age-desc',
    'articlefeedbackv5-desc' ],
  [ 'babel-desc' ],
  [ 'bootstrap-desc' ],
  [ 'bouncehandler-desc' ],
  [ 'cleanchanges-desc' ],
  [ 'collapsiblevector-desc' ],
  [ 'cx-desc', 'cx-beta-desc', 'cx-create-new-translation-desc' ],
  undefined,
  undefined,
  [ 'educationprogram-desc' ],
  [ 'elastica-desc' ],
  [ 'flow-desc', 'flow-special-desc' ],
  [ 'github-desc' ],
  [ 'gcws-desc' ],
  [ 'googlelogin-desc' ],
  [ 'graphviz-desc',
    'graphviz-category-desc',
    'graphviz-subcategory-desc',
    'graphviz-map-desc' ],
  [ 'imagemap_desc', 'imagemap_invalid_desc' ],
  [ 'is-desc' ],
  [ 'lingo-desc' ],
  [ 'maps-desc' ],
  [ 'mnss-desc' ],
  [ 'mobile-frontend-desc',
    'mobile-frontend-diffview-404-desc',
    'mobile-frontend-fontchanger-desc',
    'mobile-frontend-generic-404-desc',
    'mobile-frontend-history-404-desc',
    'mobile-frontend-languages-404-desc' ],
  [ 'parserhooks-desc' ],
  [ 'proofreadpage_desc' ],
  [ 'pubsubhubbub-desc' ],
  [ 'scribunto-desc',
    'scribunto-common-error-category-desc',
    'scribunto-module-with-errors-category-desc' ],
  [ 'sbl-desc' ],
  [ 'sesp-desc' ],
  [ 'semanticforms-desc', 'sf_category_desc' ],
  [ 'semanticglossary-desc' ],
  [ 'semantichighcharts-desc' ],
  [ 'sil-desc' ],
  [ 'semanticmaps-desc' ],
  [ 'smw-desc' ],
  [ 'srf-desc' ],
  [ 'semanticsifter-desc' ],
  [ 'ses-desc' ],
  [ 'semanticwatchlist-desc' ],
  [ 'sidebarmenu-desc' ],
  [ 'spl-desc' ],
  [ 'swiftmailer-desc' ],
  undefined,
  [ 'translationnotifications-desc' ],
  [ 'uls-desc',
    'uls-betafeature-desc',
    'ext-uls-display-settings-desc',
    'ext-uls-input-settings-desc' ],
  [ 'userfunctions-desc' ],
  [ 'validator-desc' ],
  [ 'wikieditor-desc', 'wikieditor-toolbar-desc' ],
  undefined,
  undefined,
  [ 'wikibasequery-desc' ],
  undefined,
  [ 'wikidataquality-desc' ],
  [ 'cldr-desc' ] ]
> lo.each(exts, function(ext) { if ( ext.descProp && ext.descProp.length === 1; { ext.descProp = ext.descProp[0]; } });
SyntaxError: Unexpected token ;
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> lo.each(exts, function(ext) { if ( ext.descProp && ext.descProp.length === 1; ) { ext.descProp = ext.descProp[0]; } });
SyntaxError: Unexpected token ;
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> lo.each(exts, function(ext) { if ( ext.descProp && ext.descProp.length === 1 ) { ext.descProp = ext.descProp[0]; } });
<...cut...>
> lo.pluck(exts, 'descProp')
[ 'aws-desc',
  'abusefilter-desc',
  [ 'articlefeedbackv5-special-sort-relevance-desc',
    'articlefeedbackv5-special-sort-helpful-desc',
    'articlefeedbackv5-special-sort-age-desc',
    'articlefeedbackv5-desc' ],
  'babel-desc',
  'bootstrap-desc',
  'bouncehandler-desc',
  'cleanchanges-desc',
  'collapsiblevector-desc',
  [ 'cx-desc', 'cx-beta-desc', 'cx-create-new-translation-desc' ],
  undefined,
  undefined,
  'educationprogram-desc',
  'elastica-desc',
  [ 'flow-desc', 'flow-special-desc' ],
  'github-desc',
  'gcws-desc',
  'googlelogin-desc',
  [ 'graphviz-desc',
    'graphviz-category-desc',
    'graphviz-subcategory-desc',
    'graphviz-map-desc' ],
  [ 'imagemap_desc', 'imagemap_invalid_desc' ],
  'is-desc',
  'lingo-desc',
  'maps-desc',
  'mnss-desc',
  [ 'mobile-frontend-desc',
    'mobile-frontend-diffview-404-desc',
    'mobile-frontend-fontchanger-desc',
    'mobile-frontend-generic-404-desc',
    'mobile-frontend-history-404-desc',
    'mobile-frontend-languages-404-desc' ],
  'parserhooks-desc',
  'proofreadpage_desc',
  'pubsubhubbub-desc',
  [ 'scribunto-desc',
    'scribunto-common-error-category-desc',
    'scribunto-module-with-errors-category-desc' ],
  'sbl-desc',
  'sesp-desc',
  [ 'semanticforms-desc', 'sf_category_desc' ],
  'semanticglossary-desc',
  'semantichighcharts-desc',
  'sil-desc',
  'semanticmaps-desc',
  'smw-desc',
  'srf-desc',
  'semanticsifter-desc',
  'ses-desc',
  'semanticwatchlist-desc',
  'sidebarmenu-desc',
  'spl-desc',
  'swiftmailer-desc',
  undefined,
  'translationnotifications-desc',
  [ 'uls-desc',
    'uls-betafeature-desc',
    'ext-uls-display-settings-desc',
    'ext-uls-input-settings-desc' ],
  'userfunctions-desc',
  'validator-desc',
  [ 'wikieditor-desc', 'wikieditor-toolbar-desc' ],
  undefined,
  undefined,
  'wikibasequery-desc',
  undefined,
  'wikidataquality-desc',
  'cldr-desc' ]
> lo.find(exts, { dir: 'ContentTranslation' })
<...cut...>
> var ext = lo.find(exts, { dir: 'ContentTranslation' })
undefined
> ext.i
ext.isPrototypeOf  

ext.i18n           ext.i18nData       

> ext.i1
ext.i18n      ext.i18nData  

> ext.descProp
[ 'cx-desc', 'cx-beta-desc', 'cx-create-new-translation-desc' ]
> ext.descProp = 'cx-desc'
'cx-desc'
> lo.pluck(exts, 'descProp')
[ 'aws-desc',
  'abusefilter-desc',
  [ 'articlefeedbackv5-special-sort-relevance-desc',
    'articlefeedbackv5-special-sort-helpful-desc',
    'articlefeedbackv5-special-sort-age-desc',
    'articlefeedbackv5-desc' ],
  'babel-desc',
  'bootstrap-desc',
  'bouncehandler-desc',
  'cleanchanges-desc',
  'collapsiblevector-desc',
  'cx-desc',
  undefined,
  undefined,
  'educationprogram-desc',
  'elastica-desc',
  [ 'flow-desc', 'flow-special-desc' ],
  'github-desc',
  'gcws-desc',
  'googlelogin-desc',
  [ 'graphviz-desc',
    'graphviz-category-desc',
    'graphviz-subcategory-desc',
    'graphviz-map-desc' ],
  [ 'imagemap_desc', 'imagemap_invalid_desc' ],
  'is-desc',
  'lingo-desc',
  'maps-desc',
  'mnss-desc',
  [ 'mobile-frontend-desc',
    'mobile-frontend-diffview-404-desc',
    'mobile-frontend-fontchanger-desc',
    'mobile-frontend-generic-404-desc',
    'mobile-frontend-history-404-desc',
    'mobile-frontend-languages-404-desc' ],
  'parserhooks-desc',
  'proofreadpage_desc',
  'pubsubhubbub-desc',
  [ 'scribunto-desc',
    'scribunto-common-error-category-desc',
    'scribunto-module-with-errors-category-desc' ],
  'sbl-desc',
  'sesp-desc',
  [ 'semanticforms-desc', 'sf_category_desc' ],
  'semanticglossary-desc',
  'semantichighcharts-desc',
  'sil-desc',
  'semanticmaps-desc',
  'smw-desc',
  'srf-desc',
  'semanticsifter-desc',
  'ses-desc',
  'semanticwatchlist-desc',
  'sidebarmenu-desc',
  'spl-desc',
  'swiftmailer-desc',
  undefined,
  'translationnotifications-desc',
  [ 'uls-desc',
    'uls-betafeature-desc',
    'ext-uls-display-settings-desc',
    'ext-uls-input-settings-desc' ],
  'userfunctions-desc',
  'validator-desc',
  [ 'wikieditor-desc', 'wikieditor-toolbar-desc' ],
  undefined,
  undefined,
  'wikibasequery-desc',
  undefined,
  'wikidataquality-desc',
  'cldr-desc' ]
> var ext = lo.find(exts, { dir: 'WikiEditor' })
undefined
> ext.descProp
[ 'wikieditor-desc', 'wikieditor-toolbar-desc' ]
> ext.descProp = 'wikieditor-desc
SyntaxError: Unexpected token ILLEGAL
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> ext.descProp = 'wikieditor-desc'
'wikieditor-desc'
> var ext = lo.find(exts, { dir: 'UniversalLanguageSelector' })
undefined
> ext.descProp
[ 'uls-desc',
  'uls-betafeature-desc',
  'ext-uls-display-settings-desc',
  'ext-uls-input-settings-desc' ]
> ext.descProp = 'uls-desc'
'uls-desc'
> lo.pluck(exts, 'descProp')
[ 'aws-desc',
  'abusefilter-desc',
  [ 'articlefeedbackv5-special-sort-relevance-desc',
    'articlefeedbackv5-special-sort-helpful-desc',
    'articlefeedbackv5-special-sort-age-desc',
    'articlefeedbackv5-desc' ],
  'babel-desc',
  'bootstrap-desc',
  'bouncehandler-desc',
  'cleanchanges-desc',
  'collapsiblevector-desc',
  'cx-desc',
  undefined,
  undefined,
  'educationprogram-desc',
  'elastica-desc',
  [ 'flow-desc', 'flow-special-desc' ],
  'github-desc',
  'gcws-desc',
  'googlelogin-desc',
  [ 'graphviz-desc',
    'graphviz-category-desc',
    'graphviz-subcategory-desc',
    'graphviz-map-desc' ],
  [ 'imagemap_desc', 'imagemap_invalid_desc' ],
  'is-desc',
  'lingo-desc',
  'maps-desc',
  'mnss-desc',
  [ 'mobile-frontend-desc',
    'mobile-frontend-diffview-404-desc',
    'mobile-frontend-fontchanger-desc',
    'mobile-frontend-generic-404-desc',
    'mobile-frontend-history-404-desc',
    'mobile-frontend-languages-404-desc' ],
  'parserhooks-desc',
  'proofreadpage_desc',
  'pubsubhubbub-desc',
  [ 'scribunto-desc',
    'scribunto-common-error-category-desc',
    'scribunto-module-with-errors-category-desc' ],
  'sbl-desc',
  'sesp-desc',
  [ 'semanticforms-desc', 'sf_category_desc' ],
  'semanticglossary-desc',
  'semantichighcharts-desc',
  'sil-desc',
  'semanticmaps-desc',
  'smw-desc',
  'srf-desc',
  'semanticsifter-desc',
  'ses-desc',
  'semanticwatchlist-desc',
  'sidebarmenu-desc',
  'spl-desc',
  'swiftmailer-desc',
  undefined,
  'translationnotifications-desc',
  'uls-desc',
  'userfunctions-desc',
  'validator-desc',
  'wikieditor-desc',
  undefined,
  undefined,
  'wikibasequery-desc',
  undefined,
  'wikidataquality-desc',
  'cldr-desc' ]
> var ext = lo.find(exts, { dir: 'SemanticForms' })
undefined
> ext.descProp
[ 'semanticforms-desc', 'sf_category_desc' ]
> ext.descProp = 'semanticforms-desc'
'semanticforms-desc'
> var ext = lo.find(exts, { dir: 'MobileFrontend' })
undefined
> ext.descProp
[ 'mobile-frontend-desc',
  'mobile-frontend-diffview-404-desc',
  'mobile-frontend-fontchanger-desc',
  'mobile-frontend-generic-404-desc',
  'mobile-frontend-history-404-desc',
  'mobile-frontend-languages-404-desc' ]
> ext.descProp = 'mobile-frontend-desc'
'mobile-frontend-desc'
> var ext = lo.find(exts, { dir: 'Scribunto' })
undefined
> ext.descProp
[ 'scribunto-desc',
  'scribunto-common-error-category-desc',
  'scribunto-module-with-errors-category-desc' ]
> ext.descProp = 'scribunto-desc'
'scribunto-desc'
> lo.pluck(exts, 'descProp')'
SyntaxError: Unexpected token ILLEGAL
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> lo.pluck(exts, 'descProp')
[ 'aws-desc',
  'abusefilter-desc',
  [ 'articlefeedbackv5-special-sort-relevance-desc',
    'articlefeedbackv5-special-sort-helpful-desc',
    'articlefeedbackv5-special-sort-age-desc',
    'articlefeedbackv5-desc' ],
  'babel-desc',
  'bootstrap-desc',
  'bouncehandler-desc',
  'cleanchanges-desc',
  'collapsiblevector-desc',
  'cx-desc',
  undefined,
  undefined,
  'educationprogram-desc',
  'elastica-desc',
  [ 'flow-desc', 'flow-special-desc' ],
  'github-desc',
  'gcws-desc',
  'googlelogin-desc',
  [ 'graphviz-desc',
    'graphviz-category-desc',
    'graphviz-subcategory-desc',
    'graphviz-map-desc' ],
  [ 'imagemap_desc', 'imagemap_invalid_desc' ],
  'is-desc',
  'lingo-desc',
  'maps-desc',
  'mnss-desc',
  'mobile-frontend-desc',
  'parserhooks-desc',
  'proofreadpage_desc',
  'pubsubhubbub-desc',
  'scribunto-desc',
  'sbl-desc',
  'sesp-desc',
  'semanticforms-desc',
  'semanticglossary-desc',
  'semantichighcharts-desc',
  'sil-desc',
  'semanticmaps-desc',
  'smw-desc',
  'srf-desc',
  'semanticsifter-desc',
  'ses-desc',
  'semanticwatchlist-desc',
  'sidebarmenu-desc',
  'spl-desc',
  'swiftmailer-desc',
  undefined,
  'translationnotifications-desc',
  'uls-desc',
  'userfunctions-desc',
  'validator-desc',
  'wikieditor-desc',
  undefined,
  undefined,
  'wikibasequery-desc',
  undefined,
  'wikidataquality-desc',
  'cldr-desc' ]
> var ext = lo.find(exts, { dir: '' })
> lo.filter(ext, function(ext) { return Array.isArray(ext.descProp); })
[]
> lo.filter(exts, function(ext) { return Array.isArray(ext.descProp); })
<...cut...>
> var toUpdate = _
undefined
> var ext = toUpdate.shift()
undefined
> ext.
ext.__defineGetter__      ext.__defineSetter__      ext.__lookupGetter__      ext.__lookupSetter__
ext.__proto__             ext.constructor           ext.hasOwnProperty        ext.isPrototypeOf
ext.propertyIsEnumerable  ext.toLocaleString        ext.toString              ext.valueOf

ext.descProp              ext.dir                   ext.i18n                  ext.i18nData

> ext.descProp
[ 'articlefeedbackv5-special-sort-relevance-desc',
  'articlefeedbackv5-special-sort-helpful-desc',
  'articlefeedbackv5-special-sort-age-desc',
  'articlefeedbackv5-desc' ]
> ext.descProp =  'articlefeedbackv5-desc'
'articlefeedbackv5-desc'
> ext = toUpdate.shift()
<...cut...>
> ext.descProp =   'flow-desc'
'flow-desc'
> var ext = toUpdate.shift()
undefined
> ext.descProp
[ 'graphviz-desc',
  'graphviz-category-desc',
  'graphviz-subcategory-desc',
  'graphviz-map-desc' ]
> ext.descProp = 'graphviz-desc'
'graphviz-desc'
> var ext = toUpdate.shift(); ext.descProp
[ 'imagemap_desc', 'imagemap_invalid_desc' ]
> ext.descProp = 'imagemap_desc'
'imagemap_desc'
> var ext = toUpdate.shift(); ext.descProp
TypeError: Cannot read property 'descProp' of undefined
    at repl:1:32
    at defaultEval (repl.js:134:27)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> lo.pluck(exts, 'descProp')
[ 'aws-desc',
  'abusefilter-desc',
  'articlefeedbackv5-desc',
  'babel-desc',
  'bootstrap-desc',
  'bouncehandler-desc',
  'cleanchanges-desc',
  'collapsiblevector-desc',
  'cx-desc',
  undefined,
  undefined,
  'educationprogram-desc',
  'elastica-desc',
  'flow-desc',
  'github-desc',
  'gcws-desc',
  'googlelogin-desc',
  'graphviz-desc',
  'imagemap_desc',
  'is-desc',
  'lingo-desc',
  'maps-desc',
  'mnss-desc',
  'mobile-frontend-desc',
  'parserhooks-desc',
  'proofreadpage_desc',
  'pubsubhubbub-desc',
  'scribunto-desc',
  'sbl-desc',
  'sesp-desc',
  'semanticforms-desc',
  'semanticglossary-desc',
  'semantichighcharts-desc',
  'sil-desc',
  'semanticmaps-desc',
  'smw-desc',
  'srf-desc',
  'semanticsifter-desc',
  'ses-desc',
  'semanticwatchlist-desc',
  'sidebarmenu-desc',
  'spl-desc',
  'swiftmailer-desc',
  undefined,
  'translationnotifications-desc',
  'uls-desc',
  'userfunctions-desc',
  'validator-desc',
  'wikieditor-desc',
  undefined,
  undefined,
  'wikibasequery-desc',
  undefined,
  'wikidataquality-desc',
  'cldr-desc' ]
> _.map(exts, function(ext) { if ( ext.i18nData && ext.descProp ) { return ext.i18nData[ext.descProp]; })
SyntaxError: Unexpected token )
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> _.map(exts, function(ext) { if ( ext.i18nData && ext.descProp ) { return ext.i18nData[ext.descProp]; } })
TypeError: [object Array] is not a function
    at Array.map (native)
    at repl:1:3
    at defaultEval (repl.js:134:27)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> _.map(exts, function(ext) { if ( ext.i18nData && ext.descProp ) { return ext.i18nData[ext.descProp]; } });
TypeError: [object Array] is not a function
    at Array.map (native)
    at repl:1:3
    at defaultEval (repl.js:134:27)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> lo.map(exts, function(ext) { if ( ext.i18nData && ext.descProp ) { return ext.i18nData[ext.descProp]; } });
[ 'Plugin for using Amazon Web Services',
  'Applies automatic heuristics to edits',
  'Article feedback',
  'Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates',
  'Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki',
  'Helps in handling email bounces for MediaWiki',
  'More compact display of the [[Special:RecentChanges|recent changes list]]',
  'Enhances the user interface when using the Vector skin',
  'A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools',
  undefined,
  undefined,
  'Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles',
  'Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library',
  'Workflow management system',
  'Allows embedding the contents of files from [https://www.github.com/ GitHub]',
  'Allows integration with Google Custom Search or Google Site Search',
  'Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts',
  'Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images',
  'Allows client-side clickable image maps using <code><imagemap></code> tag',
  'Send email invites',
  'Provides hover-over tool tips on pages from words defined on the [[$1]] page',
  'Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.',
  'Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from',
  'Mobile Frontend',
  'OOP interface for creating MediaWiki parser hooks in a declarative fashion',
  'Allow easy comparison of text to the original scan',
  'Publishes changes to a PubSubHubbub hub',
  'Framework for embedding scripting languages into MediaWiki pages',
  'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter',
  'Adds some extra special properties to all pages',
  'Forms for adding and editing semantic data',
  'A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend',
  'A SMW result format displaying data with the help of the highcharts library',
  'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links',
  'Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension',
  'Making your wiki more accessible - for machines \'\'and\'\' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])',
  'Additional result formats for Semantic MediaWiki queries',
  'Allows to sift through semantic data and displays the result in a filterable view',
  'A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time',
  'Lets users be notified of specific changes to Semantic MediaWiki data',
  'A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus',
  'Allows to list and count subpages',
  'Provides SwiftMailer as alternate mailer',
  undefined,
  'Allows translators to sign up for translation notifications',
  'Gives the user several ways to select a language and to adjust language settings',
  'Enhance parser with user functions',
  'Declarative parameter processing library',
  'Provides an extendable wikitext editing interface and many feature-providing modules',
  undefined,
  undefined,
  'Adds query capabilities to Wikibase',
  undefined,
  'Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.',
  'Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]' ]
> lo.each(exts, function(ext) { if ( ext.i18nData && ext.descProp ) { return ext.i18nData[ext.descProp]; } });
<...cut...>
> lo.each(exts, function(ext) { if ( ext.i18nData && ext.descProp ) { ext.description = ext.i18nData[ext.descProp]; delete ext.i18nData; delete ext.i18n; } });
[ { dir: 'AWS',
    descProp: 'aws-desc',
    description: 'Plugin for using Amazon Web Services' },
  { dir: 'AbuseFilter',
    descProp: 'abusefilter-desc',
    description: 'Applies automatic heuristics to edits' },
  { dir: 'ArticleFeedbackv5',
    descProp: 'articlefeedbackv5-desc',
    description: 'Article feedback' },
  { dir: 'Babel',
    descProp: 'babel-desc',
    description: 'Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates' },
  { dir: 'Bootstrap',
    descProp: 'bootstrap-desc',
    description: 'Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki' },
  { dir: 'BounceHandler',
    descProp: 'bouncehandler-desc',
    description: 'Helps in handling email bounces for MediaWiki' },
  { dir: 'CleanChanges',
    descProp: 'cleanchanges-desc',
    description: 'More compact display of the [[Special:RecentChanges|recent changes list]]' },
  { dir: 'CollapsibleVector',
    descProp: 'collapsiblevector-desc',
    description: 'Enhances the user interface when using the Vector skin' },
  { dir: 'ContentTranslation',
    descProp: 'cx-desc',
    description: 'A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools' },
  { dir: 'DataTypes', i18n: false },
  { dir: 'DonationInterface', i18n: false },
  { dir: 'EducationProgram',
    descProp: 'educationprogram-desc',
    description: 'Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles' },
  { dir: 'Elastica',
    descProp: 'elastica-desc',
    description: 'Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library' },
  { dir: 'Flow',
    descProp: 'flow-desc',
    description: 'Workflow management system' },
  { dir: 'GitHub',
    descProp: 'github-desc',
    description: 'Allows embedding the contents of files from [https://www.github.com/ GitHub]' },
  { dir: 'GoogleCustomWikiSearch',
    descProp: 'gcws-desc',
    description: 'Allows integration with Google Custom Search or Google Site Search' },
  { dir: 'GoogleLogin',
    descProp: 'googlelogin-desc',
    description: 'Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts' },
  { dir: 'GraphViz',
    descProp: 'graphviz-desc',
    description: 'Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images' },
  { dir: 'ImageMap',
    descProp: 'imagemap_desc',
    description: 'Allows client-side clickable image maps using <code><imagemap></code> tag' },
  { dir: 'InviteSignup',
    descProp: 'is-desc',
    description: 'Send email invites' },
  { dir: 'Lingo',
    descProp: 'lingo-desc',
    description: 'Provides hover-over tool tips on pages from words defined on the [[$1]] page' },
  { dir: 'Maps',
    descProp: 'maps-desc',
    description: 'Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.' },
  { dir: 'MixedNamespaceSearchSuggestions',
    descProp: 'mnss-desc',
    description: 'Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from' },
  { dir: 'MobileFrontend',
    descProp: 'mobile-frontend-desc',
    description: 'Mobile Frontend' },
  { dir: 'ParserHooks',
    descProp: 'parserhooks-desc',
    description: 'OOP interface for creating MediaWiki parser hooks in a declarative fashion' },
  { dir: 'ProofreadPage',
    descProp: 'proofreadpage_desc',
    description: 'Allow easy comparison of text to the original scan' },
  { dir: 'PubSubHubbub',
    descProp: 'pubsubhubbub-desc',
    description: 'Publishes changes to a PubSubHubbub hub' },
  { dir: 'Scribunto',
    descProp: 'scribunto-desc',
    description: 'Framework for embedding scripting languages into MediaWiki pages' },
  { dir: 'SemanticBreadcrumbLinks',
    descProp: 'sbl-desc',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter' },
  { dir: 'SemanticExtraSpecialProperties',
    descProp: 'sesp-desc',
    description: 'Adds some extra special properties to all pages' },
  { dir: 'SemanticForms',
    descProp: 'semanticforms-desc',
    description: 'Forms for adding and editing semantic data' },
  { dir: 'SemanticGlossary',
    descProp: 'semanticglossary-desc',
    description: 'A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend' },
  { dir: 'SemanticHighcharts',
    descProp: 'semantichighcharts-desc',
    description: 'A SMW result format displaying data with the help of the highcharts library' },
  { dir: 'SemanticInterlanguageLinks',
    descProp: 'sil-desc',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links' },
  { dir: 'SemanticMaps',
    descProp: 'semanticmaps-desc',
    description: 'Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension' },
  { dir: 'SemanticMediaWiki',
    descProp: 'smw-desc',
    description: 'Making your wiki more accessible - for machines \'\'and\'\' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])' },
  { dir: 'SemanticResultFormats',
    descProp: 'srf-desc',
    description: 'Additional result formats for Semantic MediaWiki queries' },
  { dir: 'SemanticSifter',
    descProp: 'semanticsifter-desc',
    description: 'Allows to sift through semantic data and displays the result in a filterable view' },
  { dir: 'SemanticSignup',
    descProp: 'ses-desc',
    description: 'A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time' },
  { dir: 'SemanticWatchlist',
    descProp: 'semanticwatchlist-desc',
    description: 'Lets users be notified of specific changes to Semantic MediaWiki data' },
  { dir: 'SideBarMenu',
    descProp: 'sidebarmenu-desc',
    description: 'A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus' },
  { dir: 'SubPageList',
    descProp: 'spl-desc',
    description: 'Allows to list and count subpages' },
  { dir: 'SwiftMailer',
    descProp: 'swiftmailer-desc',
    description: 'Provides SwiftMailer as alternate mailer' },
  { dir: 'Translate', i18n: false },
  { dir: 'TranslationNotifications',
    descProp: 'translationnotifications-desc',
    description: 'Allows translators to sign up for translation notifications' },
  { dir: 'UniversalLanguageSelector',
    descProp: 'uls-desc',
    description: 'Gives the user several ways to select a language and to adjust language settings' },
  { dir: 'UserFunctions',
    descProp: 'userfunctions-desc',
    description: 'Enhance parser with user functions' },
  { dir: 'Validator',
    descProp: 'validator-desc',
    description: 'Declarative parameter processing library' },
  { dir: 'WikiEditor',
    descProp: 'wikieditor-desc',
    description: 'Provides an extendable wikitext editing interface and many feature-providing modules' },
  { dir: 'Wikibase', i18n: false },
  { dir: 'WikibaseJavaScriptApi', i18n: false },
  { dir: 'WikibaseQuery',
    descProp: 'wikibasequery-desc',
    description: 'Adds query capabilities to Wikibase' },
  { dir: 'Wikidata', i18n: false },
  { dir: 'WikidataQuality',
    descProp: 'wikidataquality-desc',
    description: 'Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.' },
  { dir: 'cldr',
    descProp: 'cldr-desc',
    description: 'Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]' } ]
> exts
[ { dir: 'AWS',
    descProp: 'aws-desc',
    description: 'Plugin for using Amazon Web Services' },
  { dir: 'AbuseFilter',
    descProp: 'abusefilter-desc',
    description: 'Applies automatic heuristics to edits' },
  { dir: 'ArticleFeedbackv5',
    descProp: 'articlefeedbackv5-desc',
    description: 'Article feedback' },
  { dir: 'Babel',
    descProp: 'babel-desc',
    description: 'Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates' },
  { dir: 'Bootstrap',
    descProp: 'bootstrap-desc',
    description: 'Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki' },
  { dir: 'BounceHandler',
    descProp: 'bouncehandler-desc',
    description: 'Helps in handling email bounces for MediaWiki' },
  { dir: 'CleanChanges',
    descProp: 'cleanchanges-desc',
    description: 'More compact display of the [[Special:RecentChanges|recent changes list]]' },
  { dir: 'CollapsibleVector',
    descProp: 'collapsiblevector-desc',
    description: 'Enhances the user interface when using the Vector skin' },
  { dir: 'ContentTranslation',
    descProp: 'cx-desc',
    description: 'A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools' },
  { dir: 'DataTypes', i18n: false },
  { dir: 'DonationInterface', i18n: false },
  { dir: 'EducationProgram',
    descProp: 'educationprogram-desc',
    description: 'Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles' },
  { dir: 'Elastica',
    descProp: 'elastica-desc',
    description: 'Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library' },
  { dir: 'Flow',
    descProp: 'flow-desc',
    description: 'Workflow management system' },
  { dir: 'GitHub',
    descProp: 'github-desc',
    description: 'Allows embedding the contents of files from [https://www.github.com/ GitHub]' },
  { dir: 'GoogleCustomWikiSearch',
    descProp: 'gcws-desc',
    description: 'Allows integration with Google Custom Search or Google Site Search' },
  { dir: 'GoogleLogin',
    descProp: 'googlelogin-desc',
    description: 'Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts' },
  { dir: 'GraphViz',
    descProp: 'graphviz-desc',
    description: 'Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images' },
  { dir: 'ImageMap',
    descProp: 'imagemap_desc',
    description: 'Allows client-side clickable image maps using <code><imagemap></code> tag' },
  { dir: 'InviteSignup',
    descProp: 'is-desc',
    description: 'Send email invites' },
  { dir: 'Lingo',
    descProp: 'lingo-desc',
    description: 'Provides hover-over tool tips on pages from words defined on the [[$1]] page' },
  { dir: 'Maps',
    descProp: 'maps-desc',
    description: 'Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.' },
  { dir: 'MixedNamespaceSearchSuggestions',
    descProp: 'mnss-desc',
    description: 'Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from' },
  { dir: 'MobileFrontend',
    descProp: 'mobile-frontend-desc',
    description: 'Mobile Frontend' },
  { dir: 'ParserHooks',
    descProp: 'parserhooks-desc',
    description: 'OOP interface for creating MediaWiki parser hooks in a declarative fashion' },
  { dir: 'ProofreadPage',
    descProp: 'proofreadpage_desc',
    description: 'Allow easy comparison of text to the original scan' },
  { dir: 'PubSubHubbub',
    descProp: 'pubsubhubbub-desc',
    description: 'Publishes changes to a PubSubHubbub hub' },
  { dir: 'Scribunto',
    descProp: 'scribunto-desc',
    description: 'Framework for embedding scripting languages into MediaWiki pages' },
  { dir: 'SemanticBreadcrumbLinks',
    descProp: 'sbl-desc',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter' },
  { dir: 'SemanticExtraSpecialProperties',
    descProp: 'sesp-desc',
    description: 'Adds some extra special properties to all pages' },
  { dir: 'SemanticForms',
    descProp: 'semanticforms-desc',
    description: 'Forms for adding and editing semantic data' },
  { dir: 'SemanticGlossary',
    descProp: 'semanticglossary-desc',
    description: 'A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend' },
  { dir: 'SemanticHighcharts',
    descProp: 'semantichighcharts-desc',
    description: 'A SMW result format displaying data with the help of the highcharts library' },
  { dir: 'SemanticInterlanguageLinks',
    descProp: 'sil-desc',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links' },
  { dir: 'SemanticMaps',
    descProp: 'semanticmaps-desc',
    description: 'Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension' },
  { dir: 'SemanticMediaWiki',
    descProp: 'smw-desc',
    description: 'Making your wiki more accessible - for machines \'\'and\'\' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])' },
  { dir: 'SemanticResultFormats',
    descProp: 'srf-desc',
    description: 'Additional result formats for Semantic MediaWiki queries' },
  { dir: 'SemanticSifter',
    descProp: 'semanticsifter-desc',
    description: 'Allows to sift through semantic data and displays the result in a filterable view' },
  { dir: 'SemanticSignup',
    descProp: 'ses-desc',
    description: 'A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time' },
  { dir: 'SemanticWatchlist',
    descProp: 'semanticwatchlist-desc',
    description: 'Lets users be notified of specific changes to Semantic MediaWiki data' },
  { dir: 'SideBarMenu',
    descProp: 'sidebarmenu-desc',
    description: 'A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus' },
  { dir: 'SubPageList',
    descProp: 'spl-desc',
    description: 'Allows to list and count subpages' },
  { dir: 'SwiftMailer',
    descProp: 'swiftmailer-desc',
    description: 'Provides SwiftMailer as alternate mailer' },
  { dir: 'Translate', i18n: false },
  { dir: 'TranslationNotifications',
    descProp: 'translationnotifications-desc',
    description: 'Allows translators to sign up for translation notifications' },
  { dir: 'UniversalLanguageSelector',
    descProp: 'uls-desc',
    description: 'Gives the user several ways to select a language and to adjust language settings' },
  { dir: 'UserFunctions',
    descProp: 'userfunctions-desc',
    description: 'Enhance parser with user functions' },
  { dir: 'Validator',
    descProp: 'validator-desc',
    description: 'Declarative parameter processing library' },
  { dir: 'WikiEditor',
    descProp: 'wikieditor-desc',
    description: 'Provides an extendable wikitext editing interface and many feature-providing modules' },
  { dir: 'Wikibase', i18n: false },
  { dir: 'WikibaseJavaScriptApi', i18n: false },
  { dir: 'WikibaseQuery',
    descProp: 'wikibasequery-desc',
    description: 'Adds query capabilities to Wikibase' },
  { dir: 'Wikidata', i18n: false },
  { dir: 'WikidataQuality',
    descProp: 'wikidataquality-desc',
    description: 'Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.' },
  { dir: 'cldr',
    descProp: 'cldr-desc',
    description: 'Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]' } ]
> lo.where(exts, { description: undefined })
[]
> lo.where(exts, { description: null })
[]
> lo.filter(exts, function(ext) { return !ext.description; })
[ { dir: 'DataTypes', i18n: false },
  { dir: 'DonationInterface', i18n: false },
  { dir: 'Translate', i18n: false },
  { dir: 'Wikibase', i18n: false },
  { dir: 'WikibaseJavaScriptApi', i18n: false },
  { dir: 'Wikidata', i18n: false } ]
> var toUpdate = _
undefined
> var ext = toUpdate.shift()
undefined
> ext.dir
'DataTypes'
> delete ext.i18n;
true
> ext.description = 'Collection of data type definitions'
'Collection of data type definitions'
> var ext = toUpdate.shift(); if ( ext ) { ext.dir; }
'DonationInterface'
> ext
{ dir: 'DonationInterface', i18n: false }
> delete ext.i18n;
true
> "Donation landing page that integrates gateway 
extensions",SyntaxError: Unexpected token ILLEGAL
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> extensions",
> ext.description = "Donation landing page that integrates gateway extensions"
'Donation landing page that integrates gateway extensions'
> var ext = toUpdate.shift(); if ( ext ) { ext.dir; }
'Translate'
> delete ext.i18n;
true
> ext.description = "[[Special:Translate|Special page]] for translating MediaWiki and beyond"
'[[Special:Translate|Special page]] for translating MediaWiki and beyond'
> var ext = toUpdate.shift(); if ( ext ) { ext.dir; }
'Wikibase'
> delete ext.i18n;
true
> ext.description = "Structured data repository"
'Structured data repository'
> var ext = toUpdate.shift(); if ( ext ) { ext.dir; }
'WikibaseJavaScriptApi'
> delete ext.i18n;
true
> ext.description = 'Wikibase API client in JavaScript'
'Wikibase API client in JavaScript'
> var ext = toUpdate.shift(); if ( ext ) { ext.dir; }
'Wikidata'
> ext.description = 'Wikidata extensions build'
'Wikidata extensions build'
> delete ext.i18n;
true
> var ext = toUpdate.shift(); if ( ext ) { ext.dir; }
undefined
> exts
[ { dir: 'AWS',
    descProp: 'aws-desc',
    description: 'Plugin for using Amazon Web Services' },
  { dir: 'AbuseFilter',
    descProp: 'abusefilter-desc',
    description: 'Applies automatic heuristics to edits' },
  { dir: 'ArticleFeedbackv5',
    descProp: 'articlefeedbackv5-desc',
    description: 'Article feedback' },
  { dir: 'Babel',
    descProp: 'babel-desc',
    description: 'Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates' },
  { dir: 'Bootstrap',
    descProp: 'bootstrap-desc',
    description: 'Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki' },
  { dir: 'BounceHandler',
    descProp: 'bouncehandler-desc',
    description: 'Helps in handling email bounces for MediaWiki' },
  { dir: 'CleanChanges',
    descProp: 'cleanchanges-desc',
    description: 'More compact display of the [[Special:RecentChanges|recent changes list]]' },
  { dir: 'CollapsibleVector',
    descProp: 'collapsiblevector-desc',
    description: 'Enhances the user interface when using the Vector skin' },
  { dir: 'ContentTranslation',
    descProp: 'cx-desc',
    description: 'A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools' },
  { dir: 'DataTypes',
    description: 'Collection of data type definitions' },
  { dir: 'DonationInterface',
    description: 'Donation landing page that integrates gateway extensions' },
  { dir: 'EducationProgram',
    descProp: 'educationprogram-desc',
    description: 'Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles' },
  { dir: 'Elastica',
    descProp: 'elastica-desc',
    description: 'Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library' },
  { dir: 'Flow',
    descProp: 'flow-desc',
    description: 'Workflow management system' },
  { dir: 'GitHub',
    descProp: 'github-desc',
    description: 'Allows embedding the contents of files from [https://www.github.com/ GitHub]' },
  { dir: 'GoogleCustomWikiSearch',
    descProp: 'gcws-desc',
    description: 'Allows integration with Google Custom Search or Google Site Search' },
  { dir: 'GoogleLogin',
    descProp: 'googlelogin-desc',
    description: 'Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts' },
  { dir: 'GraphViz',
    descProp: 'graphviz-desc',
    description: 'Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images' },
  { dir: 'ImageMap',
    descProp: 'imagemap_desc',
    description: 'Allows client-side clickable image maps using <code><imagemap></code> tag' },
  { dir: 'InviteSignup',
    descProp: 'is-desc',
    description: 'Send email invites' },
  { dir: 'Lingo',
    descProp: 'lingo-desc',
    description: 'Provides hover-over tool tips on pages from words defined on the [[$1]] page' },
  { dir: 'Maps',
    descProp: 'maps-desc',
    description: 'Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.' },
  { dir: 'MixedNamespaceSearchSuggestions',
    descProp: 'mnss-desc',
    description: 'Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from' },
  { dir: 'MobileFrontend',
    descProp: 'mobile-frontend-desc',
    description: 'Mobile Frontend' },
  { dir: 'ParserHooks',
    descProp: 'parserhooks-desc',
    description: 'OOP interface for creating MediaWiki parser hooks in a declarative fashion' },
  { dir: 'ProofreadPage',
    descProp: 'proofreadpage_desc',
    description: 'Allow easy comparison of text to the original scan' },
  { dir: 'PubSubHubbub',
    descProp: 'pubsubhubbub-desc',
    description: 'Publishes changes to a PubSubHubbub hub' },
  { dir: 'Scribunto',
    descProp: 'scribunto-desc',
    description: 'Framework for embedding scripting languages into MediaWiki pages' },
  { dir: 'SemanticBreadcrumbLinks',
    descProp: 'sbl-desc',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter' },
  { dir: 'SemanticExtraSpecialProperties',
    descProp: 'sesp-desc',
    description: 'Adds some extra special properties to all pages' },
  { dir: 'SemanticForms',
    descProp: 'semanticforms-desc',
    description: 'Forms for adding and editing semantic data' },
  { dir: 'SemanticGlossary',
    descProp: 'semanticglossary-desc',
    description: 'A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend' },
  { dir: 'SemanticHighcharts',
    descProp: 'semantichighcharts-desc',
    description: 'A SMW result format displaying data with the help of the highcharts library' },
  { dir: 'SemanticInterlanguageLinks',
    descProp: 'sil-desc',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links' },
  { dir: 'SemanticMaps',
    descProp: 'semanticmaps-desc',
    description: 'Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension' },
  { dir: 'SemanticMediaWiki',
    descProp: 'smw-desc',
    description: 'Making your wiki more accessible - for machines \'\'and\'\' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])' },
  { dir: 'SemanticResultFormats',
    descProp: 'srf-desc',
    description: 'Additional result formats for Semantic MediaWiki queries' },
  { dir: 'SemanticSifter',
    descProp: 'semanticsifter-desc',
    description: 'Allows to sift through semantic data and displays the result in a filterable view' },
  { dir: 'SemanticSignup',
    descProp: 'ses-desc',
    description: 'A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time' },
  { dir: 'SemanticWatchlist',
    descProp: 'semanticwatchlist-desc',
    description: 'Lets users be notified of specific changes to Semantic MediaWiki data' },
  { dir: 'SideBarMenu',
    descProp: 'sidebarmenu-desc',
    description: 'A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus' },
  { dir: 'SubPageList',
    descProp: 'spl-desc',
    description: 'Allows to list and count subpages' },
  { dir: 'SwiftMailer',
    descProp: 'swiftmailer-desc',
    description: 'Provides SwiftMailer as alternate mailer' },
  { dir: 'Translate',
    description: '[[Special:Translate|Special page]] for translating MediaWiki and beyond' },
  { dir: 'TranslationNotifications',
    descProp: 'translationnotifications-desc',
    description: 'Allows translators to sign up for translation notifications' },
  { dir: 'UniversalLanguageSelector',
    descProp: 'uls-desc',
    description: 'Gives the user several ways to select a language and to adjust language settings' },
  { dir: 'UserFunctions',
    descProp: 'userfunctions-desc',
    description: 'Enhance parser with user functions' },
  { dir: 'Validator',
    descProp: 'validator-desc',
    description: 'Declarative parameter processing library' },
  { dir: 'WikiEditor',
    descProp: 'wikieditor-desc',
    description: 'Provides an extendable wikitext editing interface and many feature-providing modules' },
  { dir: 'Wikibase', description: 'Structured data repository' },
  { dir: 'WikibaseJavaScriptApi',
    description: 'Wikibase API client in JavaScript' },
  { dir: 'WikibaseQuery',
    descProp: 'wikibasequery-desc',
    description: 'Adds query capabilities to Wikibase' },
  { dir: 'Wikidata', description: 'Wikidata extensions build' },
  { dir: 'WikidataQuality',
    descProp: 'wikidataquality-desc',
    description: 'Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.' },
  { dir: 'cldr',
    descProp: 'cldr-desc',
    description: 'Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]' } ]
> lo.each(exts, function(ext) { delete ext.descProp; })
[ { dir: 'AWS',
    description: 'Plugin for using Amazon Web Services' },
  { dir: 'AbuseFilter',
    description: 'Applies automatic heuristics to edits' },
  { dir: 'ArticleFeedbackv5', description: 'Article feedback' },
  { dir: 'Babel',
    description: 'Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates' },
  { dir: 'Bootstrap',
    description: 'Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki' },
  { dir: 'BounceHandler',
    description: 'Helps in handling email bounces for MediaWiki' },
  { dir: 'CleanChanges',
    description: 'More compact display of the [[Special:RecentChanges|recent changes list]]' },
  { dir: 'CollapsibleVector',
    description: 'Enhances the user interface when using the Vector skin' },
  { dir: 'ContentTranslation',
    description: 'A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools' },
  { dir: 'DataTypes',
    description: 'Collection of data type definitions' },
  { dir: 'DonationInterface',
    description: 'Donation landing page that integrates gateway extensions' },
  { dir: 'EducationProgram',
    description: 'Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles' },
  { dir: 'Elastica',
    description: 'Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library' },
  { dir: 'Flow', description: 'Workflow management system' },
  { dir: 'GitHub',
    description: 'Allows embedding the contents of files from [https://www.github.com/ GitHub]' },
  { dir: 'GoogleCustomWikiSearch',
    description: 'Allows integration with Google Custom Search or Google Site Search' },
  { dir: 'GoogleLogin',
    description: 'Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts' },
  { dir: 'GraphViz',
    description: 'Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images' },
  { dir: 'ImageMap',
    description: 'Allows client-side clickable image maps using <code><imagemap></code> tag' },
  { dir: 'InviteSignup', description: 'Send email invites' },
  { dir: 'Lingo',
    description: 'Provides hover-over tool tips on pages from words defined on the [[$1]] page' },
  { dir: 'Maps',
    description: 'Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.' },
  { dir: 'MixedNamespaceSearchSuggestions',
    description: 'Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from' },
  { dir: 'MobileFrontend', description: 'Mobile Frontend' },
  { dir: 'ParserHooks',
    description: 'OOP interface for creating MediaWiki parser hooks in a declarative fashion' },
  { dir: 'ProofreadPage',
    description: 'Allow easy comparison of text to the original scan' },
  { dir: 'PubSubHubbub',
    description: 'Publishes changes to a PubSubHubbub hub' },
  { dir: 'Scribunto',
    description: 'Framework for embedding scripting languages into MediaWiki pages' },
  { dir: 'SemanticBreadcrumbLinks',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter' },
  { dir: 'SemanticExtraSpecialProperties',
    description: 'Adds some extra special properties to all pages' },
  { dir: 'SemanticForms',
    description: 'Forms for adding and editing semantic data' },
  { dir: 'SemanticGlossary',
    description: 'A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend' },
  { dir: 'SemanticHighcharts',
    description: 'A SMW result format displaying data with the help of the highcharts library' },
  { dir: 'SemanticInterlanguageLinks',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links' },
  { dir: 'SemanticMaps',
    description: 'Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension' },
  { dir: 'SemanticMediaWiki',
    description: 'Making your wiki more accessible - for machines \'\'and\'\' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])' },
  { dir: 'SemanticResultFormats',
    description: 'Additional result formats for Semantic MediaWiki queries' },
  { dir: 'SemanticSifter',
    description: 'Allows to sift through semantic data and displays the result in a filterable view' },
  { dir: 'SemanticSignup',
    description: 'A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time' },
  { dir: 'SemanticWatchlist',
    description: 'Lets users be notified of specific changes to Semantic MediaWiki data' },
  { dir: 'SideBarMenu',
    description: 'A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus' },
  { dir: 'SubPageList',
    description: 'Allows to list and count subpages' },
  { dir: 'SwiftMailer',
    description: 'Provides SwiftMailer as alternate mailer' },
  { dir: 'Translate',
    description: '[[Special:Translate|Special page]] for translating MediaWiki and beyond' },
  { dir: 'TranslationNotifications',
    description: 'Allows translators to sign up for translation notifications' },
  { dir: 'UniversalLanguageSelector',
    description: 'Gives the user several ways to select a language and to adjust language settings' },
  { dir: 'UserFunctions',
    description: 'Enhance parser with user functions' },
  { dir: 'Validator',
    description: 'Declarative parameter processing library' },
  { dir: 'WikiEditor',
    description: 'Provides an extendable wikitext editing interface and many feature-providing modules' },
  { dir: 'Wikibase', description: 'Structured data repository' },
  { dir: 'WikibaseJavaScriptApi',
    description: 'Wikibase API client in JavaScript' },
  { dir: 'WikibaseQuery',
    description: 'Adds query capabilities to Wikibase' },
  { dir: 'Wikidata', description: 'Wikidata extensions build' },
  { dir: 'WikidataQuality',
    description: 'Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.' },
  { dir: 'cldr',
    description: 'Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]' } ]
> Promise.all(exts).map(function(ext) { return fs.readF
fs.readFile           fs.readFileAsync      fs.readFileSync       fs.readFileSyncAsync  

> Promise.all(exts).map(function(ext) { return fs.readFile
fs.readFile           fs.readFileAsync      fs.readFileSync       fs.readFileSyncAsync  

> Promise.all(exts).map(function(ext) { return fs.readFileAsync(path.join(ext.dir, 'composer.json').then(JSON.parse); }, {concurency: 10})
SyntaxError: Unexpected token ;
    at Object.exports.createScript (vm.js:44:10)
    at defaultEval (repl.js:117:23)
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Promise.apply (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1122:26)
    at Promise.promise.promiseDispatch (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:752:41)
    at /usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:1337:14
    at flush (/usr/local/lib/node_modules/repl-promised/node_modules/q/q.js:108:17)
    at process._tickDomainCallback (node.js:381:11)
> Promise.all(exts).map(function(ext) { return fs.readFileAsync(path.join(ext.dir, 'composer.json'), 'utf8').then(JSON.parse); }, {concurency: 10});
<...cut...>
> Promise.all(exts).map(function(ext) { return fs.readFileAsync(path.join(ext.dir, 'composer.json'), 'utf8').then(JSON.parse).get('description'); }, {concurency: 10});
[ 'Use Amazon Web Services as a MediaWiki backend',
  'The AbuseFilter extension allows privileged users to set specific controls on actions by users, such as edits, and create automated reactions for certain behaviors.',
  'The Article Feedback Tool, Version 5 is a Wikimedia Foundation project designed to engage readers in the assessment of article quality.',
  'Users can easily indicate their language proficiency on their user page',
  'Provides the Twitter Bootstrap3 web front-end framework to MediaWiki skins and extensions',
  'MediaWiki extension to process emails that bounce using VERP',
  'More compact display of recent changes lists',
  'Improves on the user interface elements of the Vector skin',
  'Allows editors to translate an article from one language to another with the help of translation tools.',
  'PHP library defining the DataTypes\\DataType class of which instances represent a type of value, such as "positive integer" or "percentage".',
  'Wikimedia Foundation payment processing library',
  'Facilitates educational programs by adding various interfaces to manage courses, students, institutions, mentors',
  'Provides the elastica library and a connection layer as a MediaWiki extension',
  'Discussion and collaboration system extension for MediaWiki',
  'Simple MediaWiki extension that allows embedding the content of files hosted in GitHub git repositories',
  'Allow MediaWiki integration with Google Custom Search',
  'Allow users to login to MediaWiki with their Google Account',
  'Online DOT graph renderer and message sequence chart renderer',
  'Allows clickable HTML image maps',
  'Invite users to sign up',
  'Provides hover-over tool tips on wiki pages from terms defined on a wiki page',
  'Adds various mapping features to MediaWiki',
  'Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from.',
  'Provides a mobile-friendly view to MediaWiki',
  'Adds a OOP and declarative parser hook interface on top of MediaWiki',
  'The ProofreadPage extension adds book proofreading capacity to MediaWiki. It can render a book either as a column of OCR text beside a column of scanned images, or broken into its logical organization (such as chapters or poems) using transclusion.',
  'Allows publishing changes to a PubSubHubbub hub',
  'Framework for embedding scripting languages into MediaWiki pages',
  'A Semantic MediaWiki extension to build breadcrumb links from an attributive property filter.',
  'Provides extra special properties for Semantic MediaWiki',
  'An extension, based around Semantic MediaWiki, that allows users to create forms for adding and editing pages that use templates to store semantic data.',
  'A terminology markup extension with a Semantic MediaWiki back-end',
  'Adds the \'highcharts\' result format to SMW',
  'A Semantic Mediawiki extension to create and manage interlanguage links.',
  'Adds geographic capabilities to Semantic MediaWiki',
  'MediaWiki extension that lets you store and query structured data within wiki pages',
  'Additional result formats for Semantic MediaWiki queries',
  'The SemanticSifter extension queries a set of pages and displays the result in a filterable view.',
  'A Semantic Mediawiki extension to support user registration semantically.',
  'A Semantic MediaWiki extension that allows users to use a watchlist for semantic properties.',
  'Allows for a simple sidebar menu which supports infinite number of sub-menus.',
  'SubPageList is a lightweight extension to display lists of subpages',
  'SwiftMailer library for Mediawiki extension SwiftMailer',
  'The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software',
  'Manage communication with translators',
  'The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.',
  'Enhance parser with user functions',
  'MediaWiki wrapper for the ParamProcessor library',
  'WikiEditor is an extendable framework with a set of feature-based modules that improve the user experience of editing.',
  'Structured data repository for MediaWiki',
  'Wikibase API client in JavaScript',
  'Extension to Wikibase Repo that adds the ability to define and execute queries',
  'Wikidata build, including related components used for wikidata.org.',
  'Extension for Wikibase to improve the data quality.',
  'CLDR extension contains local language names for different languages, countries, and currencies extracted from CLDR data' ]
> Promise.all(exts).map(function(ext) { return fs.readFileAsync(path.join(ext.dir, 'composer.json'), 'utf8').then(JSON.parse).get('description').then(function(description) { ext.composerDescription = description; }, {concurency: 10});
... 
> Promise.all(exts).map(function(ext) { return fs.readFileAsync(path.join(ext.dir, 'composer.json'), 'utf8').then(JSON.parse).get('description').then(function(description) { ext.composerDescription = description; }) }, {concurency: 10});

undefined
> jij[ undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined ]
> jij
> exts
[ { dir: 'AWS',
    description: 'Plugin for using Amazon Web Services',
    composerDescription: 'Use Amazon Web Services as a MediaWiki backend' },
  { dir: 'AbuseFilter',
    description: 'Applies automatic heuristics to edits',
    composerDescription: 'The AbuseFilter extension allows privileged users to set specific controls on actions by users, such as edits, and create automated reactions for certain behaviors.' },
  { dir: 'ArticleFeedbackv5',
    description: 'Article feedback',
    composerDescription: 'The Article Feedback Tool, Version 5 is a Wikimedia Foundation project designed to engage readers in the assessment of article quality.' },
  { dir: 'Babel',
    description: 'Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates',
    composerDescription: 'Users can easily indicate their language proficiency on their user page' },
  { dir: 'Bootstrap',
    description: 'Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki',
    composerDescription: 'Provides the Twitter Bootstrap3 web front-end framework to MediaWiki skins and extensions' },
  { dir: 'BounceHandler',
    description: 'Helps in handling email bounces for MediaWiki',
    composerDescription: 'MediaWiki extension to process emails that bounce using VERP' },
  { dir: 'CleanChanges',
    description: 'More compact display of the [[Special:RecentChanges|recent changes list]]',
    composerDescription: 'More compact display of recent changes lists' },
  { dir: 'CollapsibleVector',
    description: 'Enhances the user interface when using the Vector skin',
    composerDescription: 'Improves on the user interface elements of the Vector skin' },
  { dir: 'ContentTranslation',
    description: 'A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools',
    composerDescription: 'Allows editors to translate an article from one language to another with the help of translation tools.' },
  { dir: 'DataTypes',
    description: 'Collection of data type definitions',
    composerDescription: 'PHP library defining the DataTypes\\DataType class of which instances represent a type of value, such as "positive integer" or "percentage".' },
  { dir: 'DonationInterface',
    description: 'Donation landing page that integrates gateway extensions',
    composerDescription: 'Wikimedia Foundation payment processing library' },
  { dir: 'EducationProgram',
    description: 'Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles',
    composerDescription: 'Facilitates educational programs by adding various interfaces to manage courses, students, institutions, mentors' },
  { dir: 'Elastica',
    description: 'Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library',
    composerDescription: 'Provides the elastica library and a connection layer as a MediaWiki extension' },
  { dir: 'Flow',
    description: 'Workflow management system',
    composerDescription: 'Discussion and collaboration system extension for MediaWiki' },
  { dir: 'GitHub',
    description: 'Allows embedding the contents of files from [https://www.github.com/ GitHub]',
    composerDescription: 'Simple MediaWiki extension that allows embedding the content of files hosted in GitHub git repositories' },
  { dir: 'GoogleCustomWikiSearch',
    description: 'Allows integration with Google Custom Search or Google Site Search',
    composerDescription: 'Allow MediaWiki integration with Google Custom Search' },
  { dir: 'GoogleLogin',
    description: 'Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts',
    composerDescription: 'Allow users to login to MediaWiki with their Google Account' },
  { dir: 'GraphViz',
    description: 'Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images',
    composerDescription: 'Online DOT graph renderer and message sequence chart renderer' },
  { dir: 'ImageMap',
    description: 'Allows client-side clickable image maps using <code><imagemap></code> tag',
    composerDescription: 'Allows clickable HTML image maps' },
  { dir: 'InviteSignup',
    description: 'Send email invites',
    composerDescription: 'Invite users to sign up' },
  { dir: 'Lingo',
    description: 'Provides hover-over tool tips on pages from words defined on the [[$1]] page',
    composerDescription: 'Provides hover-over tool tips on wiki pages from terms defined on a wiki page' },
  { dir: 'Maps',
    description: 'Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.',
    composerDescription: 'Adds various mapping features to MediaWiki' },
  { dir: 'MixedNamespaceSearchSuggestions',
    description: 'Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from',
    composerDescription: 'Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from.' },
  { dir: 'MobileFrontend',
    description: 'Mobile Frontend',
    composerDescription: 'Provides a mobile-friendly view to MediaWiki' },
  { dir: 'ParserHooks',
    description: 'OOP interface for creating MediaWiki parser hooks in a declarative fashion',
    composerDescription: 'Adds a OOP and declarative parser hook interface on top of MediaWiki' },
  { dir: 'ProofreadPage',
    description: 'Allow easy comparison of text to the original scan',
    composerDescription: 'The ProofreadPage extension adds book proofreading capacity to MediaWiki. It can render a book either as a column of OCR text beside a column of scanned images, or broken into its logical organization (such as chapters or poems) using transclusion.' },
  { dir: 'PubSubHubbub',
    description: 'Publishes changes to a PubSubHubbub hub',
    composerDescription: 'Allows publishing changes to a PubSubHubbub hub' },
  { dir: 'Scribunto',
    description: 'Framework for embedding scripting languages into MediaWiki pages',
    composerDescription: 'Framework for embedding scripting languages into MediaWiki pages' },
  { dir: 'SemanticBreadcrumbLinks',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter',
    composerDescription: 'A Semantic MediaWiki extension to build breadcrumb links from an attributive property filter.' },
  { dir: 'SemanticExtraSpecialProperties',
    description: 'Adds some extra special properties to all pages',
    composerDescription: 'Provides extra special properties for Semantic MediaWiki' },
  { dir: 'SemanticForms',
    description: 'Forms for adding and editing semantic data',
    composerDescription: 'An extension, based around Semantic MediaWiki, that allows users to create forms for adding and editing pages that use templates to store semantic data.' },
  { dir: 'SemanticGlossary',
    description: 'A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend',
    composerDescription: 'A terminology markup extension with a Semantic MediaWiki back-end' },
  { dir: 'SemanticHighcharts',
    description: 'A SMW result format displaying data with the help of the highcharts library',
    composerDescription: 'Adds the \'highcharts\' result format to SMW' },
  { dir: 'SemanticInterlanguageLinks',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links',
    composerDescription: 'A Semantic Mediawiki extension to create and manage interlanguage links.' },
  { dir: 'SemanticMaps',
    description: 'Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension',
    composerDescription: 'Adds geographic capabilities to Semantic MediaWiki' },
  { dir: 'SemanticMediaWiki',
    description: 'Making your wiki more accessible - for machines \'\'and\'\' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])',
    composerDescription: 'MediaWiki extension that lets you store and query structured data within wiki pages' },
  { dir: 'SemanticResultFormats',
    description: 'Additional result formats for Semantic MediaWiki queries',
    composerDescription: 'Additional result formats for Semantic MediaWiki queries' },
  { dir: 'SemanticSifter',
    description: 'Allows to sift through semantic data and displays the result in a filterable view',
    composerDescription: 'The SemanticSifter extension queries a set of pages and displays the result in a filterable view.' },
  { dir: 'SemanticSignup',
    description: 'A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time',
    composerDescription: 'A Semantic Mediawiki extension to support user registration semantically.' },
  { dir: 'SemanticWatchlist',
    description: 'Lets users be notified of specific changes to Semantic MediaWiki data',
    composerDescription: 'A Semantic MediaWiki extension that allows users to use a watchlist for semantic properties.' },
  { dir: 'SideBarMenu',
    description: 'A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus',
    composerDescription: 'Allows for a simple sidebar menu which supports infinite number of sub-menus.' },
  { dir: 'SubPageList',
    description: 'Allows to list and count subpages',
    composerDescription: 'SubPageList is a lightweight extension to display lists of subpages' },
  { dir: 'SwiftMailer',
    description: 'Provides SwiftMailer as alternate mailer',
    composerDescription: 'SwiftMailer library for Mediawiki extension SwiftMailer' },
  { dir: 'Translate',
    description: '[[Special:Translate|Special page]] for translating MediaWiki and beyond',
    composerDescription: 'The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software' },
  { dir: 'TranslationNotifications',
    description: 'Allows translators to sign up for translation notifications',
    composerDescription: 'Manage communication with translators' },
  { dir: 'UniversalLanguageSelector',
    description: 'Gives the user several ways to select a language and to adjust language settings',
    composerDescription: 'The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.' },
  { dir: 'UserFunctions',
    description: 'Enhance parser with user functions',
    composerDescription: 'Enhance parser with user functions' },
  { dir: 'Validator',
    description: 'Declarative parameter processing library',
    composerDescription: 'MediaWiki wrapper for the ParamProcessor library' },
  { dir: 'WikiEditor',
    description: 'Provides an extendable wikitext editing interface and many feature-providing modules',
    composerDescription: 'WikiEditor is an extendable framework with a set of feature-based modules that improve the user experience of editing.' },
  { dir: 'Wikibase',
    description: 'Structured data repository',
    composerDescription: 'Structured data repository for MediaWiki' },
  { dir: 'WikibaseJavaScriptApi',
    description: 'Wikibase API client in JavaScript',
    composerDescription: 'Wikibase API client in JavaScript' },
  { dir: 'WikibaseQuery',
    description: 'Adds query capabilities to Wikibase',
    composerDescription: 'Extension to Wikibase Repo that adds the ability to define and execute queries' },
  { dir: 'Wikidata',
    description: 'Wikidata extensions build',
    composerDescription: 'Wikidata build, including related components used for wikidata.org.' },
  { dir: 'WikidataQuality',
    description: 'Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.',
    composerDescription: 'Extension for Wikibase to improve the data quality.' },
  { dir: 'cldr',
    description: 'Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]',
    composerDescription: 'CLDR extension contains local language names for different languages, countries, and currencies extracted from CLDR data' } ]
> lo.each(exts, function(ext) { console.log(ext.dir); console.log(ext.description); console.log(ext.composerDescription); console.log(''); })
AWS
Plugin for using Amazon Web Services
Use Amazon Web Services as a MediaWiki backend

AbuseFilter
Applies automatic heuristics to edits
The AbuseFilter extension allows privileged users to set specific controls on actions by users, such as edits, and create automated reactions for certain behaviors.

ArticleFeedbackv5
Article feedback
The Article Feedback Tool, Version 5 is a Wikimedia Foundation project designed to engage readers in the assessment of article quality.

Babel
Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates
Users can easily indicate their language proficiency on their user page

Bootstrap
Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki
Provides the Twitter Bootstrap3 web front-end framework to MediaWiki skins and extensions

BounceHandler
Helps in handling email bounces for MediaWiki
MediaWiki extension to process emails that bounce using VERP

CleanChanges
More compact display of the [[Special:RecentChanges|recent changes list]]
More compact display of recent changes lists

CollapsibleVector
Enhances the user interface when using the Vector skin
Improves on the user interface elements of the Vector skin

ContentTranslation
A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools
Allows editors to translate an article from one language to another with the help of translation tools.

DataTypes
Collection of data type definitions
PHP library defining the DataTypes\DataType class of which instances represent a type of value, such as "positive integer" or "percentage".

DonationInterface
Donation landing page that integrates gateway extensions
Wikimedia Foundation payment processing library

EducationProgram
Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles
Facilitates educational programs by adding various interfaces to manage courses, students, institutions, mentors

Elastica
Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library
Provides the elastica library and a connection layer as a MediaWiki extension

Flow
Workflow management system
Discussion and collaboration system extension for MediaWiki

GitHub
Allows embedding the contents of files from [https://www.github.com/ GitHub]
Simple MediaWiki extension that allows embedding the content of files hosted in GitHub git repositories

GoogleCustomWikiSearch
Allows integration with Google Custom Search or Google Site Search
Allow MediaWiki integration with Google Custom Search

GoogleLogin
Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts
Allow users to login to MediaWiki with their Google Account

GraphViz
Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images
Online DOT graph renderer and message sequence chart renderer

ImageMap
Allows client-side clickable image maps using <code><imagemap></code> tag
Allows clickable HTML image maps

InviteSignup
Send email invites
Invite users to sign up

Lingo
Provides hover-over tool tips on pages from words defined on the [[$1]] page
Provides hover-over tool tips on wiki pages from terms defined on a wiki page

Maps
Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.
Adds various mapping features to MediaWiki

MixedNamespaceSearchSuggestions
Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from
Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from.

MobileFrontend
Mobile Frontend
Provides a mobile-friendly view to MediaWiki

ParserHooks
OOP interface for creating MediaWiki parser hooks in a declarative fashion
Adds a OOP and declarative parser hook interface on top of MediaWiki

ProofreadPage
Allow easy comparison of text to the original scan
The ProofreadPage extension adds book proofreading capacity to MediaWiki. It can render a book either as a column of OCR text beside a column of scanned images, or broken into its logical organization (such as chapters or poems) using transclusion.

PubSubHubbub
Publishes changes to a PubSubHubbub hub
Allows publishing changes to a PubSubHubbub hub

Scribunto
Framework for embedding scripting languages into MediaWiki pages
Framework for embedding scripting languages into MediaWiki pages

SemanticBreadcrumbLinks
A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter
A Semantic MediaWiki extension to build breadcrumb links from an attributive property filter.

SemanticExtraSpecialProperties
Adds some extra special properties to all pages
Provides extra special properties for Semantic MediaWiki

SemanticForms
Forms for adding and editing semantic data
An extension, based around Semantic MediaWiki, that allows users to create forms for adding and editing pages that use templates to store semantic data.

SemanticGlossary
A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend
A terminology markup extension with a Semantic MediaWiki back-end

SemanticHighcharts
A SMW result format displaying data with the help of the highcharts library
Adds the 'highcharts' result format to SMW

SemanticInterlanguageLinks
A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links
A Semantic Mediawiki extension to create and manage interlanguage links.

SemanticMaps
Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension
Adds geographic capabilities to Semantic MediaWiki

SemanticMediaWiki
Making your wiki more accessible - for machines ''and'' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])
MediaWiki extension that lets you store and query structured data within wiki pages

SemanticResultFormats
Additional result formats for Semantic MediaWiki queries
Additional result formats for Semantic MediaWiki queries

SemanticSifter
Allows to sift through semantic data and displays the result in a filterable view
The SemanticSifter extension queries a set of pages and displays the result in a filterable view.

SemanticSignup
A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time
A Semantic Mediawiki extension to support user registration semantically.

SemanticWatchlist
Lets users be notified of specific changes to Semantic MediaWiki data
A Semantic MediaWiki extension that allows users to use a watchlist for semantic properties.

SideBarMenu
A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus
Allows for a simple sidebar menu which supports infinite number of sub-menus.

SubPageList
Allows to list and count subpages
SubPageList is a lightweight extension to display lists of subpages

SwiftMailer
Provides SwiftMailer as alternate mailer
SwiftMailer library for Mediawiki extension SwiftMailer

Translate
[[Special:Translate|Special page]] for translating MediaWiki and beyond
The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software

TranslationNotifications
Allows translators to sign up for translation notifications
Manage communication with translators

UniversalLanguageSelector
Gives the user several ways to select a language and to adjust language settings
The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.

UserFunctions
Enhance parser with user functions
Enhance parser with user functions

Validator
Declarative parameter processing library
MediaWiki wrapper for the ParamProcessor library

WikiEditor
Provides an extendable wikitext editing interface and many feature-providing modules
WikiEditor is an extendable framework with a set of feature-based modules that improve the user experience of editing.

Wikibase
Structured data repository
Structured data repository for MediaWiki

WikibaseJavaScriptApi
Wikibase API client in JavaScript
Wikibase API client in JavaScript

WikibaseQuery
Adds query capabilities to Wikibase
Extension to Wikibase Repo that adds the ability to define and execute queries

Wikidata
Wikidata extensions build
Wikidata build, including related components used for wikidata.org.

WikidataQuality
Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.
Extension for Wikibase to improve the data quality.

cldr
Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]
CLDR extension contains local language names for different languages, countries, and currencies extracted from CLDR data

[ { dir: 'AWS',
    description: 'Plugin for using Amazon Web Services',
    composerDescription: 'Use Amazon Web Services as a MediaWiki backend' },
  { dir: 'AbuseFilter',
    description: 'Applies automatic heuristics to edits',
    composerDescription: 'The AbuseFilter extension allows privileged users to set specific controls on actions by users, such as edits, and create automated reactions for certain behaviors.' },
  { dir: 'ArticleFeedbackv5',
    description: 'Article feedback',
    composerDescription: 'The Article Feedback Tool, Version 5 is a Wikimedia Foundation project designed to engage readers in the assessment of article quality.' },
  { dir: 'Babel',
    description: 'Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates',
    composerDescription: 'Users can easily indicate their language proficiency on their user page' },
  { dir: 'Bootstrap',
    description: 'Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki',
    composerDescription: 'Provides the Twitter Bootstrap3 web front-end framework to MediaWiki skins and extensions' },
  { dir: 'BounceHandler',
    description: 'Helps in handling email bounces for MediaWiki',
    composerDescription: 'MediaWiki extension to process emails that bounce using VERP' },
  { dir: 'CleanChanges',
    description: 'More compact display of the [[Special:RecentChanges|recent changes list]]',
    composerDescription: 'More compact display of recent changes lists' },
  { dir: 'CollapsibleVector',
    description: 'Enhances the user interface when using the Vector skin',
    composerDescription: 'Improves on the user interface elements of the Vector skin' },
  { dir: 'ContentTranslation',
    description: 'A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools',
    composerDescription: 'Allows editors to translate an article from one language to another with the help of translation tools.' },
  { dir: 'DataTypes',
    description: 'Collection of data type definitions',
    composerDescription: 'PHP library defining the DataTypes\\DataType class of which instances represent a type of value, such as "positive integer" or "percentage".' },
  { dir: 'DonationInterface',
    description: 'Donation landing page that integrates gateway extensions',
    composerDescription: 'Wikimedia Foundation payment processing library' },
  { dir: 'EducationProgram',
    description: 'Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles',
    composerDescription: 'Facilitates educational programs by adding various interfaces to manage courses, students, institutions, mentors' },
  { dir: 'Elastica',
    description: 'Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library',
    composerDescription: 'Provides the elastica library and a connection layer as a MediaWiki extension' },
  { dir: 'Flow',
    description: 'Workflow management system',
    composerDescription: 'Discussion and collaboration system extension for MediaWiki' },
  { dir: 'GitHub',
    description: 'Allows embedding the contents of files from [https://www.github.com/ GitHub]',
    composerDescription: 'Simple MediaWiki extension that allows embedding the content of files hosted in GitHub git repositories' },
  { dir: 'GoogleCustomWikiSearch',
    description: 'Allows integration with Google Custom Search or Google Site Search',
    composerDescription: 'Allow MediaWiki integration with Google Custom Search' },
  { dir: 'GoogleLogin',
    description: 'Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts',
    composerDescription: 'Allow users to login to MediaWiki with their Google Account' },
  { dir: 'GraphViz',
    description: 'Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images',
    composerDescription: 'Online DOT graph renderer and message sequence chart renderer' },
  { dir: 'ImageMap',
    description: 'Allows client-side clickable image maps using <code><imagemap></code> tag',
    composerDescription: 'Allows clickable HTML image maps' },
  { dir: 'InviteSignup',
    description: 'Send email invites',
    composerDescription: 'Invite users to sign up' },
  { dir: 'Lingo',
    description: 'Provides hover-over tool tips on pages from words defined on the [[$1]] page',
    composerDescription: 'Provides hover-over tool tips on wiki pages from terms defined on a wiki page' },
  { dir: 'Maps',
    description: 'Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.',
    composerDescription: 'Adds various mapping features to MediaWiki' },
  { dir: 'MixedNamespaceSearchSuggestions',
    description: 'Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from',
    composerDescription: 'Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from.' },
  { dir: 'MobileFrontend',
    description: 'Mobile Frontend',
    composerDescription: 'Provides a mobile-friendly view to MediaWiki' },
  { dir: 'ParserHooks',
    description: 'OOP interface for creating MediaWiki parser hooks in a declarative fashion',
    composerDescription: 'Adds a OOP and declarative parser hook interface on top of MediaWiki' },
  { dir: 'ProofreadPage',
    description: 'Allow easy comparison of text to the original scan',
    composerDescription: 'The ProofreadPage extension adds book proofreading capacity to MediaWiki. It can render a book either as a column of OCR text beside a column of scanned images, or broken into its logical organization (such as chapters or poems) using transclusion.' },
  { dir: 'PubSubHubbub',
    description: 'Publishes changes to a PubSubHubbub hub',
    composerDescription: 'Allows publishing changes to a PubSubHubbub hub' },
  { dir: 'Scribunto',
    description: 'Framework for embedding scripting languages into MediaWiki pages',
    composerDescription: 'Framework for embedding scripting languages into MediaWiki pages' },
  { dir: 'SemanticBreadcrumbLinks',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter',
    composerDescription: 'A Semantic MediaWiki extension to build breadcrumb links from an attributive property filter.' },
  { dir: 'SemanticExtraSpecialProperties',
    description: 'Adds some extra special properties to all pages',
    composerDescription: 'Provides extra special properties for Semantic MediaWiki' },
  { dir: 'SemanticForms',
    description: 'Forms for adding and editing semantic data',
    composerDescription: 'An extension, based around Semantic MediaWiki, that allows users to create forms for adding and editing pages that use templates to store semantic data.' },
  { dir: 'SemanticGlossary',
    description: 'A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend',
    composerDescription: 'A terminology markup extension with a Semantic MediaWiki back-end' },
  { dir: 'SemanticHighcharts',
    description: 'A SMW result format displaying data with the help of the highcharts library',
    composerDescription: 'Adds the \'highcharts\' result format to SMW' },
  { dir: 'SemanticInterlanguageLinks',
    description: 'A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links',
    composerDescription: 'A Semantic Mediawiki extension to create and manage interlanguage links.' },
  { dir: 'SemanticMaps',
    description: 'Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension',
    composerDescription: 'Adds geographic capabilities to Semantic MediaWiki' },
  { dir: 'SemanticMediaWiki',
    description: 'Making your wiki more accessible - for machines \'\'and\'\' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])',
    composerDescription: 'MediaWiki extension that lets you store and query structured data within wiki pages' },
  { dir: 'SemanticResultFormats',
    description: 'Additional result formats for Semantic MediaWiki queries',
    composerDescription: 'Additional result formats for Semantic MediaWiki queries' },
  { dir: 'SemanticSifter',
    description: 'Allows to sift through semantic data and displays the result in a filterable view',
    composerDescription: 'The SemanticSifter extension queries a set of pages and displays the result in a filterable view.' },
  { dir: 'SemanticSignup',
    description: 'A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time',
    composerDescription: 'A Semantic Mediawiki extension to support user registration semantically.' },
  { dir: 'SemanticWatchlist',
    description: 'Lets users be notified of specific changes to Semantic MediaWiki data',
    composerDescription: 'A Semantic MediaWiki extension that allows users to use a watchlist for semantic properties.' },
  { dir: 'SideBarMenu',
    description: 'A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus',
    composerDescription: 'Allows for a simple sidebar menu which supports infinite number of sub-menus.' },
  { dir: 'SubPageList',
    description: 'Allows to list and count subpages',
    composerDescription: 'SubPageList is a lightweight extension to display lists of subpages' },
  { dir: 'SwiftMailer',
    description: 'Provides SwiftMailer as alternate mailer',
    composerDescription: 'SwiftMailer library for Mediawiki extension SwiftMailer' },
  { dir: 'Translate',
    description: '[[Special:Translate|Special page]] for translating MediaWiki and beyond',
    composerDescription: 'The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software' },
  { dir: 'TranslationNotifications',
    description: 'Allows translators to sign up for translation notifications',
    composerDescription: 'Manage communication with translators' },
  { dir: 'UniversalLanguageSelector',
    description: 'Gives the user several ways to select a language and to adjust language settings',
    composerDescription: 'The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.' },
  { dir: 'UserFunctions',
    description: 'Enhance parser with user functions',
    composerDescription: 'Enhance parser with user functions' },
  { dir: 'Validator',
    description: 'Declarative parameter processing library',
    composerDescription: 'MediaWiki wrapper for the ParamProcessor library' },
  { dir: 'WikiEditor',
    description: 'Provides an extendable wikitext editing interface and many feature-providing modules',
    composerDescription: 'WikiEditor is an extendable framework with a set of feature-based modules that improve the user experience of editing.' },
  { dir: 'Wikibase',
    description: 'Structured data repository',
    composerDescription: 'Structured data repository for MediaWiki' },
  { dir: 'WikibaseJavaScriptApi',
    description: 'Wikibase API client in JavaScript',
    composerDescription: 'Wikibase API client in JavaScript' },
  { dir: 'WikibaseQuery',
    description: 'Adds query capabilities to Wikibase',
    composerDescription: 'Extension to Wikibase Repo that adds the ability to define and execute queries' },
  { dir: 'Wikidata',
    description: 'Wikidata extensions build',
    composerDescription: 'Wikidata build, including related components used for wikidata.org.' },
  { dir: 'WikidataQuality',
    description: 'Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.',
    composerDescription: 'Extension for Wikibase to improve the data quality.' },
  { dir: 'cldr',
    description: 'Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]',
    composerDescription: 'CLDR extension contains local language names for different languages, countries, and currencies extracted from CLDR data' } ]
> lo.each(exts, function(ext) { console.log(ext.dir); console.log(ext.description); console.log(ext.composerDescription); console.log(''); }); ''
AWS
Plugin for using Amazon Web Services
Use Amazon Web Services as a MediaWiki backend

AbuseFilter
Applies automatic heuristics to edits
The AbuseFilter extension allows privileged users to set specific controls on actions by users, such as edits, and create automated reactions for certain behaviors.

ArticleFeedbackv5
Article feedback
The Article Feedback Tool, Version 5 is a Wikimedia Foundation project designed to engage readers in the assessment of article quality.

Babel
Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates
Users can easily indicate their language proficiency on their user page

Bootstrap
Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki
Provides the Twitter Bootstrap3 web front-end framework to MediaWiki skins and extensions

BounceHandler
Helps in handling email bounces for MediaWiki
MediaWiki extension to process emails that bounce using VERP

CleanChanges
More compact display of the [[Special:RecentChanges|recent changes list]]
More compact display of recent changes lists

CollapsibleVector
Enhances the user interface when using the Vector skin
Improves on the user interface elements of the Vector skin

ContentTranslation
A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools
Allows editors to translate an article from one language to another with the help of translation tools.

DataTypes
Collection of data type definitions
PHP library defining the DataTypes\DataType class of which instances represent a type of value, such as "positive integer" or "percentage".

DonationInterface
Donation landing page that integrates gateway extensions
Wikimedia Foundation payment processing library

EducationProgram
Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles
Facilitates educational programs by adding various interfaces to manage courses, students, institutions, mentors

Elastica
Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library
Provides the elastica library and a connection layer as a MediaWiki extension

Flow
Workflow management system
Discussion and collaboration system extension for MediaWiki

GitHub
Allows embedding the contents of files from [https://www.github.com/ GitHub]
Simple MediaWiki extension that allows embedding the content of files hosted in GitHub git repositories

GoogleCustomWikiSearch
Allows integration with Google Custom Search or Google Site Search
Allow MediaWiki integration with Google Custom Search

GoogleLogin
Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts
Allow users to login to MediaWiki with their Google Account

GraphViz
Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images
Online DOT graph renderer and message sequence chart renderer

ImageMap
Allows client-side clickable image maps using <code><imagemap></code> tag
Allows clickable HTML image maps

InviteSignup
Send email invites
Invite users to sign up

Lingo
Provides hover-over tool tips on pages from words defined on the [[$1]] page
Provides hover-over tool tips on wiki pages from terms defined on a wiki page

Maps
Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.
Adds various mapping features to MediaWiki

MixedNamespaceSearchSuggestions
Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from
Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from.

MobileFrontend
Mobile Frontend
Provides a mobile-friendly view to MediaWiki

ParserHooks
OOP interface for creating MediaWiki parser hooks in a declarative fashion
Adds a OOP and declarative parser hook interface on top of MediaWiki

ProofreadPage
Allow easy comparison of text to the original scan
The ProofreadPage extension adds book proofreading capacity to MediaWiki. It can render a book either as a column of OCR text beside a column of scanned images, or broken into its logical organization (such as chapters or poems) using transclusion.

PubSubHubbub
Publishes changes to a PubSubHubbub hub
Allows publishing changes to a PubSubHubbub hub

Scribunto
Framework for embedding scripting languages into MediaWiki pages
Framework for embedding scripting languages into MediaWiki pages

SemanticBreadcrumbLinks
A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter
A Semantic MediaWiki extension to build breadcrumb links from an attributive property filter.

SemanticExtraSpecialProperties
Adds some extra special properties to all pages
Provides extra special properties for Semantic MediaWiki

SemanticForms
Forms for adding and editing semantic data
An extension, based around Semantic MediaWiki, that allows users to create forms for adding and editing pages that use templates to store semantic data.

SemanticGlossary
A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend
A terminology markup extension with a Semantic MediaWiki back-end

SemanticHighcharts
A SMW result format displaying data with the help of the highcharts library
Adds the 'highcharts' result format to SMW

SemanticInterlanguageLinks
A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links
A Semantic Mediawiki extension to create and manage interlanguage links.

SemanticMaps
Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension
Adds geographic capabilities to Semantic MediaWiki

SemanticMediaWiki
Making your wiki more accessible - for machines ''and'' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])
MediaWiki extension that lets you store and query structured data within wiki pages

SemanticResultFormats
Additional result formats for Semantic MediaWiki queries
Additional result formats for Semantic MediaWiki queries

SemanticSifter
Allows to sift through semantic data and displays the result in a filterable view
The SemanticSifter extension queries a set of pages and displays the result in a filterable view.

SemanticSignup
A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time
A Semantic Mediawiki extension to support user registration semantically.

SemanticWatchlist
Lets users be notified of specific changes to Semantic MediaWiki data
A Semantic MediaWiki extension that allows users to use a watchlist for semantic properties.

SideBarMenu
A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus
Allows for a simple sidebar menu which supports infinite number of sub-menus.

SubPageList
Allows to list and count subpages
SubPageList is a lightweight extension to display lists of subpages

SwiftMailer
Provides SwiftMailer as alternate mailer
SwiftMailer library for Mediawiki extension SwiftMailer

Translate
[[Special:Translate|Special page]] for translating MediaWiki and beyond
The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software

TranslationNotifications
Allows translators to sign up for translation notifications
Manage communication with translators

UniversalLanguageSelector
Gives the user several ways to select a language and to adjust language settings
The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.

UserFunctions
Enhance parser with user functions
Enhance parser with user functions

Validator
Declarative parameter processing library
MediaWiki wrapper for the ParamProcessor library

WikiEditor
Provides an extendable wikitext editing interface and many feature-providing modules
WikiEditor is an extendable framework with a set of feature-based modules that improve the user experience of editing.

Wikibase
Structured data repository
Structured data repository for MediaWiki

WikibaseJavaScriptApi
Wikibase API client in JavaScript
Wikibase API client in JavaScript

WikibaseQuery
Adds query capabilities to Wikibase
Extension to Wikibase Repo that adds the ability to define and execute queries

Wikidata
Wikidata extensions build
Wikidata build, including related components used for wikidata.org.

WikidataQuality
Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.
Extension for Wikibase to improve the data quality.

cldr
Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]
CLDR extension contains local language names for different languages, countries, and currencies extracted from CLDR data

''
> lo.each(exts, function(ext) { console.log('%s: (%s)', ext.dir, ext.description === ext.composerDescription ? 'same' : 'different'); console.log(ext.description); console.log(ext.composerDescription); console.log(''); }); ''
AWS: (different)
Plugin for using Amazon Web Services
Use Amazon Web Services as a MediaWiki backend

AbuseFilter: (different)
Applies automatic heuristics to edits
The AbuseFilter extension allows privileged users to set specific controls on actions by users, such as edits, and create automated reactions for certain behaviors.

ArticleFeedbackv5: (different)
Article feedback
The Article Feedback Tool, Version 5 is a Wikimedia Foundation project designed to engage readers in the assessment of article quality.

Babel: (different)
Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates
Users can easily indicate their language proficiency on their user page

Bootstrap: (different)
Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki
Provides the Twitter Bootstrap3 web front-end framework to MediaWiki skins and extensions

BounceHandler: (different)
Helps in handling email bounces for MediaWiki
MediaWiki extension to process emails that bounce using VERP

CleanChanges: (different)
More compact display of the [[Special:RecentChanges|recent changes list]]
More compact display of recent changes lists

CollapsibleVector: (different)
Enhances the user interface when using the Vector skin
Improves on the user interface elements of the Vector skin

ContentTranslation: (different)
A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools
Allows editors to translate an article from one language to another with the help of translation tools.

DataTypes: (different)
Collection of data type definitions
PHP library defining the DataTypes\DataType class of which instances represent a type of value, such as "positive integer" or "percentage".

DonationInterface: (different)
Donation landing page that integrates gateway extensions
Wikimedia Foundation payment processing library

EducationProgram: (different)
Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles
Facilitates educational programs by adding various interfaces to manage courses, students, institutions, mentors

Elastica: (different)
Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library
Provides the elastica library and a connection layer as a MediaWiki extension

Flow: (different)
Workflow management system
Discussion and collaboration system extension for MediaWiki

GitHub: (different)
Allows embedding the contents of files from [https://www.github.com/ GitHub]
Simple MediaWiki extension that allows embedding the content of files hosted in GitHub git repositories

GoogleCustomWikiSearch: (different)
Allows integration with Google Custom Search or Google Site Search
Allow MediaWiki integration with Google Custom Search

GoogleLogin: (different)
Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts
Allow users to login to MediaWiki with their Google Account

GraphViz: (different)
Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images
Online DOT graph renderer and message sequence chart renderer

ImageMap: (different)
Allows client-side clickable image maps using <code><imagemap></code> tag
Allows clickable HTML image maps

InviteSignup: (different)
Send email invites
Invite users to sign up

Lingo: (different)
Provides hover-over tool tips on pages from words defined on the [[$1]] page
Provides hover-over tool tips on wiki pages from terms defined on a wiki page

Maps: (different)
Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.
Adds various mapping features to MediaWiki

MixedNamespaceSearchSuggestions: (different)
Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from
Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from.

MobileFrontend: (different)
Mobile Frontend
Provides a mobile-friendly view to MediaWiki

ParserHooks: (different)
OOP interface for creating MediaWiki parser hooks in a declarative fashion
Adds a OOP and declarative parser hook interface on top of MediaWiki

ProofreadPage: (different)
Allow easy comparison of text to the original scan
The ProofreadPage extension adds book proofreading capacity to MediaWiki. It can render a book either as a column of OCR text beside a column of scanned images, or broken into its logical organization (such as chapters or poems) using transclusion.

PubSubHubbub: (different)
Publishes changes to a PubSubHubbub hub
Allows publishing changes to a PubSubHubbub hub

Scribunto: (same)
Framework for embedding scripting languages into MediaWiki pages
Framework for embedding scripting languages into MediaWiki pages

SemanticBreadcrumbLinks: (different)
A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter
A Semantic MediaWiki extension to build breadcrumb links from an attributive property filter.

SemanticExtraSpecialProperties: (different)
Adds some extra special properties to all pages
Provides extra special properties for Semantic MediaWiki

SemanticForms: (different)
Forms for adding and editing semantic data
An extension, based around Semantic MediaWiki, that allows users to create forms for adding and editing pages that use templates to store semantic data.

SemanticGlossary: (different)
A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend
A terminology markup extension with a Semantic MediaWiki back-end

SemanticHighcharts: (different)
A SMW result format displaying data with the help of the highcharts library
Adds the 'highcharts' result format to SMW

SemanticInterlanguageLinks: (different)
A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links
A Semantic Mediawiki extension to create and manage interlanguage links.

SemanticMaps: (different)
Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension
Adds geographic capabilities to Semantic MediaWiki

SemanticMediaWiki: (different)
Making your wiki more accessible - for machines ''and'' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])
MediaWiki extension that lets you store and query structured data within wiki pages

SemanticResultFormats: (same)
Additional result formats for Semantic MediaWiki queries
Additional result formats for Semantic MediaWiki queries

SemanticSifter: (different)
Allows to sift through semantic data and displays the result in a filterable view
The SemanticSifter extension queries a set of pages and displays the result in a filterable view.

SemanticSignup: (different)
A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time
A Semantic Mediawiki extension to support user registration semantically.

SemanticWatchlist: (different)
Lets users be notified of specific changes to Semantic MediaWiki data
A Semantic MediaWiki extension that allows users to use a watchlist for semantic properties.

SideBarMenu: (different)
A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus
Allows for a simple sidebar menu which supports infinite number of sub-menus.

SubPageList: (different)
Allows to list and count subpages
SubPageList is a lightweight extension to display lists of subpages

SwiftMailer: (different)
Provides SwiftMailer as alternate mailer
SwiftMailer library for Mediawiki extension SwiftMailer

Translate: (different)
[[Special:Translate|Special page]] for translating MediaWiki and beyond
The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software

TranslationNotifications: (different)
Allows translators to sign up for translation notifications
Manage communication with translators

UniversalLanguageSelector: (different)
Gives the user several ways to select a language and to adjust language settings
The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.

UserFunctions: (same)
Enhance parser with user functions
Enhance parser with user functions

Validator: (different)
Declarative parameter processing library
MediaWiki wrapper for the ParamProcessor library

WikiEditor: (different)
Provides an extendable wikitext editing interface and many feature-providing modules
WikiEditor is an extendable framework with a set of feature-based modules that improve the user experience of editing.

Wikibase: (different)
Structured data repository
Structured data repository for MediaWiki

WikibaseJavaScriptApi: (same)
Wikibase API client in JavaScript
Wikibase API client in JavaScript

WikibaseQuery: (different)
Adds query capabilities to Wikibase
Extension to Wikibase Repo that adds the ability to define and execute queries

Wikidata: (different)
Wikidata extensions build
Wikidata build, including related components used for wikidata.org.

WikidataQuality: (different)
Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.
Extension for Wikibase to improve the data quality.

cldr: (different)
Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]
CLDR extension contains local language names for different languages, countries, and currencies extracted from CLDR data

''
> lo.each(exts, function(ext) { console.log('%s: (%s)', ext.dir, ext.description === ext.composerDescription ? 'same' : 'different'); console.log('Extension description:'); console.log(ext.description); console.log(ext.composerDescription); console.log(''); }); ''
AWS: (different)
Extension description:
Plugin for using Amazon Web Services
Use Amazon Web Services as a MediaWiki backend

AbuseFilter: (different)
Extension description:
Applies automatic heuristics to edits
The AbuseFilter extension allows privileged users to set specific controls on actions by users, such as edits, and create automated reactions for certain behaviors.

ArticleFeedbackv5: (different)
Extension description:
Article feedback
The Article Feedback Tool, Version 5 is a Wikimedia Foundation project designed to engage readers in the assessment of article quality.

Babel: (different)
Extension description:
Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates
Users can easily indicate their language proficiency on their user page

Bootstrap: (different)
Extension description:
Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki
Provides the Twitter Bootstrap3 web front-end framework to MediaWiki skins and extensions

BounceHandler: (different)
Extension description:
Helps in handling email bounces for MediaWiki
MediaWiki extension to process emails that bounce using VERP

CleanChanges: (different)
Extension description:
More compact display of the [[Special:RecentChanges|recent changes list]]
More compact display of recent changes lists

CollapsibleVector: (different)
Extension description:
Enhances the user interface when using the Vector skin
Improves on the user interface elements of the Vector skin

ContentTranslation: (different)
Extension description:
A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools
Allows editors to translate an article from one language to another with the help of translation tools.

DataTypes: (different)
Extension description:
Collection of data type definitions
PHP library defining the DataTypes\DataType class of which instances represent a type of value, such as "positive integer" or "percentage".

DonationInterface: (different)
Extension description:
Donation landing page that integrates gateway extensions
Wikimedia Foundation payment processing library

EducationProgram: (different)
Extension description:
Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles
Facilitates educational programs by adding various interfaces to manage courses, students, institutions, mentors

Elastica: (different)
Extension description:
Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library
Provides the elastica library and a connection layer as a MediaWiki extension

Flow: (different)
Extension description:
Workflow management system
Discussion and collaboration system extension for MediaWiki

GitHub: (different)
Extension description:
Allows embedding the contents of files from [https://www.github.com/ GitHub]
Simple MediaWiki extension that allows embedding the content of files hosted in GitHub git repositories

GoogleCustomWikiSearch: (different)
Extension description:
Allows integration with Google Custom Search or Google Site Search
Allow MediaWiki integration with Google Custom Search

GoogleLogin: (different)
Extension description:
Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts
Allow users to login to MediaWiki with their Google Account

GraphViz: (different)
Extension description:
Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images
Online DOT graph renderer and message sequence chart renderer

ImageMap: (different)
Extension description:
Allows client-side clickable image maps using <code><imagemap></code> tag
Allows clickable HTML image maps

InviteSignup: (different)
Extension description:
Send email invites
Invite users to sign up

Lingo: (different)
Extension description:
Provides hover-over tool tips on pages from words defined on the [[$1]] page
Provides hover-over tool tips on wiki pages from terms defined on a wiki page

Maps: (different)
Extension description:
Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.
Adds various mapping features to MediaWiki

MixedNamespaceSearchSuggestions: (different)
Extension description:
Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from
Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from.

MobileFrontend: (different)
Extension description:
Mobile Frontend
Provides a mobile-friendly view to MediaWiki

ParserHooks: (different)
Extension description:
OOP interface for creating MediaWiki parser hooks in a declarative fashion
Adds a OOP and declarative parser hook interface on top of MediaWiki

ProofreadPage: (different)
Extension description:
Allow easy comparison of text to the original scan
The ProofreadPage extension adds book proofreading capacity to MediaWiki. It can render a book either as a column of OCR text beside a column of scanned images, or broken into its logical organization (such as chapters or poems) using transclusion.

PubSubHubbub: (different)
Extension description:
Publishes changes to a PubSubHubbub hub
Allows publishing changes to a PubSubHubbub hub

Scribunto: (same)
Extension description:
Framework for embedding scripting languages into MediaWiki pages
Framework for embedding scripting languages into MediaWiki pages

SemanticBreadcrumbLinks: (different)
Extension description:
A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter
A Semantic MediaWiki extension to build breadcrumb links from an attributive property filter.

SemanticExtraSpecialProperties: (different)
Extension description:
Adds some extra special properties to all pages
Provides extra special properties for Semantic MediaWiki

SemanticForms: (different)
Extension description:
Forms for adding and editing semantic data
An extension, based around Semantic MediaWiki, that allows users to create forms for adding and editing pages that use templates to store semantic data.

SemanticGlossary: (different)
Extension description:
A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend
A terminology markup extension with a Semantic MediaWiki back-end

SemanticHighcharts: (different)
Extension description:
A SMW result format displaying data with the help of the highcharts library
Adds the 'highcharts' result format to SMW

SemanticInterlanguageLinks: (different)
Extension description:
A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links
A Semantic Mediawiki extension to create and manage interlanguage links.

SemanticMaps: (different)
Extension description:
Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension
Adds geographic capabilities to Semantic MediaWiki

SemanticMediaWiki: (different)
Extension description:
Making your wiki more accessible - for machines ''and'' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])
MediaWiki extension that lets you store and query structured data within wiki pages

SemanticResultFormats: (same)
Extension description:
Additional result formats for Semantic MediaWiki queries
Additional result formats for Semantic MediaWiki queries

SemanticSifter: (different)
Extension description:
Allows to sift through semantic data and displays the result in a filterable view
The SemanticSifter extension queries a set of pages and displays the result in a filterable view.

SemanticSignup: (different)
Extension description:
A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time
A Semantic Mediawiki extension to support user registration semantically.

SemanticWatchlist: (different)
Extension description:
Lets users be notified of specific changes to Semantic MediaWiki data
A Semantic MediaWiki extension that allows users to use a watchlist for semantic properties.

SideBarMenu: (different)
Extension description:
A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus
Allows for a simple sidebar menu which supports infinite number of sub-menus.

SubPageList: (different)
Extension description:
Allows to list and count subpages
SubPageList is a lightweight extension to display lists of subpages

SwiftMailer: (different)
Extension description:
Provides SwiftMailer as alternate mailer
SwiftMailer library for Mediawiki extension SwiftMailer

Translate: (different)
Extension description:
[[Special:Translate|Special page]] for translating MediaWiki and beyond
The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software

TranslationNotifications: (different)
Extension description:
Allows translators to sign up for translation notifications
Manage communication with translators

UniversalLanguageSelector: (different)
Extension description:
Gives the user several ways to select a language and to adjust language settings
The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.

UserFunctions: (same)
Extension description:
Enhance parser with user functions
Enhance parser with user functions

Validator: (different)
Extension description:
Declarative parameter processing library
MediaWiki wrapper for the ParamProcessor library

WikiEditor: (different)
Extension description:
Provides an extendable wikitext editing interface and many feature-providing modules
WikiEditor is an extendable framework with a set of feature-based modules that improve the user experience of editing.

Wikibase: (different)
Extension description:
Structured data repository
Structured data repository for MediaWiki

WikibaseJavaScriptApi: (same)
Extension description:
Wikibase API client in JavaScript
Wikibase API client in JavaScript

WikibaseQuery: (different)
Extension description:
Adds query capabilities to Wikibase
Extension to Wikibase Repo that adds the ability to define and execute queries

Wikidata: (different)
Extension description:
Wikidata extensions build
Wikidata build, including related components used for wikidata.org.

WikidataQuality: (different)
Extension description:
Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.
Extension for Wikibase to improve the data quality.

cldr: (different)
Extension description:
Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]
CLDR extension contains local language names for different languages, countries, and currencies extracted from CLDR data

''
> lo.each(exts, function(ext) { console.log('=== %s: (%s) ===', ext.dir, ext.description === ext.composerDescription ? 'same' : 'different'); console.log("'''Extension description''':<br>"); console.log(ext.description); console.log(''); console.log("'''Composer description''':<br>"); console.log(ext.composerDescription); console.log(''); }); ''
=== AWS: (different) ===
'''Extension description''':<br>
Plugin for using Amazon Web Services

'''Composer description''':<br>
Use Amazon Web Services as a MediaWiki backend

=== AbuseFilter: (different) ===
'''Extension description''':<br>
Applies automatic heuristics to edits

'''Composer description''':<br>
The AbuseFilter extension allows privileged users to set specific controls on actions by users, such as edits, and create automated reactions for certain behaviors.

=== ArticleFeedbackv5: (different) ===
'''Extension description''':<br>
Article feedback

'''Composer description''':<br>
The Article Feedback Tool, Version 5 is a Wikimedia Foundation project designed to engage readers in the assessment of article quality.

=== Babel: (different) ===
'''Extension description''':<br>
Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates

'''Composer description''':<br>
Users can easily indicate their language proficiency on their user page

=== Bootstrap: (different) ===
'''Extension description''':<br>
Provides the [http://getbootstrap.com/ Bootstrap] framework in the wiki

'''Composer description''':<br>
Provides the Twitter Bootstrap3 web front-end framework to MediaWiki skins and extensions

=== BounceHandler: (different) ===
'''Extension description''':<br>
Helps in handling email bounces for MediaWiki

'''Composer description''':<br>
MediaWiki extension to process emails that bounce using VERP

=== CleanChanges: (different) ===
'''Extension description''':<br>
More compact display of the [[Special:RecentChanges|recent changes list]]

'''Composer description''':<br>
More compact display of recent changes lists

=== CollapsibleVector: (different) ===
'''Extension description''':<br>
Enhances the user interface when using the Vector skin

'''Composer description''':<br>
Improves on the user interface elements of the Vector skin

=== ContentTranslation: (different) ===
'''Extension description''':<br>
A tool that allows editors to translate pages from one language to another with the help of machine translation and other translation tools

'''Composer description''':<br>
Allows editors to translate an article from one language to another with the help of translation tools.

=== DataTypes: (different) ===
'''Extension description''':<br>
Collection of data type definitions

'''Composer description''':<br>
PHP library defining the DataTypes\DataType class of which instances represent a type of value, such as "positive integer" or "percentage".

=== DonationInterface: (different) ===
'''Extension description''':<br>
Donation landing page that integrates gateway extensions

'''Composer description''':<br>
Wikimedia Foundation payment processing library

=== EducationProgram: (different) ===
'''Extension description''':<br>
Facilitates educational programs by adding various interfaces to manage courses, institutions and the various education user roles

'''Composer description''':<br>
Facilitates educational programs by adding various interfaces to manage courses, students, institutions, mentors

=== Elastica: (different) ===
'''Extension description''':<br>
Base [http://www.elasticsearch.org/ Elasticsearch] functionality for other extensions by providing [http://elastica.io/ Elastica] library

'''Composer description''':<br>
Provides the elastica library and a connection layer as a MediaWiki extension

=== Flow: (different) ===
'''Extension description''':<br>
Workflow management system

'''Composer description''':<br>
Discussion and collaboration system extension for MediaWiki

=== GitHub: (different) ===
'''Extension description''':<br>
Allows embedding the contents of files from [https://www.github.com/ GitHub]

'''Composer description''':<br>
Simple MediaWiki extension that allows embedding the content of files hosted in GitHub git repositories

=== GoogleCustomWikiSearch: (different) ===
'''Extension description''':<br>
Allows integration with Google Custom Search or Google Site Search

'''Composer description''':<br>
Allow MediaWiki integration with Google Custom Search

=== GoogleLogin: (different) ===
'''Extension description''':<br>
Provides a [[Special:GoogleLogin|Special page]] to allow users to login with their Google accounts

'''Composer description''':<br>
Allow users to login to MediaWiki with their Google Account

=== GraphViz: (different) ===
'''Extension description''':<br>
Allows embedding [http://www.graphviz.org Graphviz] markup and generates inline images

'''Composer description''':<br>
Online DOT graph renderer and message sequence chart renderer

=== ImageMap: (different) ===
'''Extension description''':<br>
Allows client-side clickable image maps using <code><imagemap></code> tag

'''Composer description''':<br>
Allows clickable HTML image maps

=== InviteSignup: (different) ===
'''Extension description''':<br>
Send email invites

'''Composer description''':<br>
Invite users to sign up

=== Lingo: (different) ===
'''Extension description''':<br>
Provides hover-over tool tips on pages from words defined on the [[$1]] page

'''Composer description''':<br>
Provides hover-over tool tips on wiki pages from terms defined on a wiki page

=== Maps: (different) ===
'''Extension description''':<br>
Enables embedding of dynamic maps into wiki pages, geocoding of addresses and other geographical operations.

'''Composer description''':<br>
Adds various mapping features to MediaWiki

=== MixedNamespaceSearchSuggestions: (different) ===
'''Extension description''':<br>
Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from

'''Composer description''':<br>
Includes suggestions from all content namespaces in the search box, showing from which namespace each suggestion is from.

=== MobileFrontend: (different) ===
'''Extension description''':<br>
Mobile Frontend

'''Composer description''':<br>
Provides a mobile-friendly view to MediaWiki

=== ParserHooks: (different) ===
'''Extension description''':<br>
OOP interface for creating MediaWiki parser hooks in a declarative fashion

'''Composer description''':<br>
Adds a OOP and declarative parser hook interface on top of MediaWiki

=== ProofreadPage: (different) ===
'''Extension description''':<br>
Allow easy comparison of text to the original scan

'''Composer description''':<br>
The ProofreadPage extension adds book proofreading capacity to MediaWiki. It can render a book either as a column of OCR text beside a column of scanned images, or broken into its logical organization (such as chapters or poems) using transclusion.

=== PubSubHubbub: (different) ===
'''Extension description''':<br>
Publishes changes to a PubSubHubbub hub

'''Composer description''':<br>
Allows publishing changes to a PubSubHubbub hub

=== Scribunto: (same) ===
'''Extension description''':<br>
Framework for embedding scripting languages into MediaWiki pages

'''Composer description''':<br>
Framework for embedding scripting languages into MediaWiki pages

=== SemanticBreadcrumbLinks: (different) ===
'''Extension description''':<br>
A [https://semantic-mediawiki.org Semantic MediaWiki] extension to build breadcrumb links from an attributive property filter

'''Composer description''':<br>
A Semantic MediaWiki extension to build breadcrumb links from an attributive property filter.

=== SemanticExtraSpecialProperties: (different) ===
'''Extension description''':<br>
Adds some extra special properties to all pages

'''Composer description''':<br>
Provides extra special properties for Semantic MediaWiki

=== SemanticForms: (different) ===
'''Extension description''':<br>
Forms for adding and editing semantic data

'''Composer description''':<br>
An extension, based around Semantic MediaWiki, that allows users to create forms for adding and editing pages that use templates to store semantic data.

=== SemanticGlossary: (different) ===
'''Extension description''':<br>
A glossary extension with a [http://semantic-mediawiki.org Semantic MediaWiki] backend

'''Composer description''':<br>
A terminology markup extension with a Semantic MediaWiki back-end

=== SemanticHighcharts: (different) ===
'''Extension description''':<br>
A SMW result format displaying data with the help of the highcharts library

'''Composer description''':<br>
Adds the 'highcharts' result format to SMW

=== SemanticInterlanguageLinks: (different) ===
'''Extension description''':<br>
A [https://semantic-mediawiki.org Semantic MediaWiki] extension to create and manage interlanguage links

'''Composer description''':<br>
A Semantic Mediawiki extension to create and manage interlanguage links.

=== SemanticMaps: (different) ===
'''Extension description''':<br>
Provides the ability to view and edit coordinate data stored with the [https://www.semantic-mediawiki.org Semantic MediaWiki] extension

'''Composer description''':<br>
Adds geographic capabilities to Semantic MediaWiki

=== SemanticMediaWiki: (different) ===
'''Extension description''':<br>
Making your wiki more accessible - for machines ''and'' humans ([https://semantic-mediawiki.org/wiki/Help:User_manual online documentation])

'''Composer description''':<br>
MediaWiki extension that lets you store and query structured data within wiki pages

=== SemanticResultFormats: (same) ===
'''Extension description''':<br>
Additional result formats for Semantic MediaWiki queries

'''Composer description''':<br>
Additional result formats for Semantic MediaWiki queries

=== SemanticSifter: (different) ===
'''Extension description''':<br>
Allows to sift through semantic data and displays the result in a filterable view

'''Composer description''':<br>
The SemanticSifter extension queries a set of pages and displays the result in a filterable view.

=== SemanticSignup: (different) ===
'''Extension description''':<br>
A MediaWiki extension built on top of Semantic Forms allowing to populate a user page with semantic data at signup time

'''Composer description''':<br>
A Semantic Mediawiki extension to support user registration semantically.

=== SemanticWatchlist: (different) ===
'''Extension description''':<br>
Lets users be notified of specific changes to Semantic MediaWiki data

'''Composer description''':<br>
A Semantic MediaWiki extension that allows users to use a watchlist for semantic properties.

=== SideBarMenu: (different) ===
'''Extension description''':<br>
A simple sidebar menu parser which creates collapsible/expandable menus and sub-menus

'''Composer description''':<br>
Allows for a simple sidebar menu which supports infinite number of sub-menus.

=== SubPageList: (different) ===
'''Extension description''':<br>
Allows to list and count subpages

'''Composer description''':<br>
SubPageList is a lightweight extension to display lists of subpages

=== SwiftMailer: (different) ===
'''Extension description''':<br>
Provides SwiftMailer as alternate mailer

'''Composer description''':<br>
SwiftMailer library for Mediawiki extension SwiftMailer

=== Translate: (different) ===
'''Extension description''':<br>
[[Special:Translate|Special page]] for translating MediaWiki and beyond

'''Composer description''':<br>
The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software

=== TranslationNotifications: (different) ===
'''Extension description''':<br>
Allows translators to sign up for translation notifications

'''Composer description''':<br>
Manage communication with translators

=== UniversalLanguageSelector: (different) ===
'''Extension description''':<br>
Gives the user several ways to select a language and to adjust language settings

'''Composer description''':<br>
The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.

=== UserFunctions: (same) ===
'''Extension description''':<br>
Enhance parser with user functions

'''Composer description''':<br>
Enhance parser with user functions

=== Validator: (different) ===
'''Extension description''':<br>
Declarative parameter processing library

'''Composer description''':<br>
MediaWiki wrapper for the ParamProcessor library

=== WikiEditor: (different) ===
'''Extension description''':<br>
Provides an extendable wikitext editing interface and many feature-providing modules

'''Composer description''':<br>
WikiEditor is an extendable framework with a set of feature-based modules that improve the user experience of editing.

=== Wikibase: (different) ===
'''Extension description''':<br>
Structured data repository

'''Composer description''':<br>
Structured data repository for MediaWiki

=== WikibaseJavaScriptApi: (same) ===
'''Extension description''':<br>
Wikibase API client in JavaScript

'''Composer description''':<br>
Wikibase API client in JavaScript

=== WikibaseQuery: (different) ===
'''Extension description''':<br>
Adds query capabilities to Wikibase

'''Composer description''':<br>
Extension to Wikibase Repo that adds the ability to define and execute queries

=== Wikidata: (different) ===
'''Extension description''':<br>
Wikidata extensions build

'''Composer description''':<br>
Wikidata build, including related components used for wikidata.org.

=== WikidataQuality: (different) ===
'''Extension description''':<br>
Migrate and improve the usage of constraints by visualizing constraint reports and cross-check data with external databases to ensure the quality of Wikidata.

'''Composer description''':<br>
Extension for Wikibase to improve the data quality.

=== cldr: (different) ===
'''Extension description''':<br>
Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]

'''Composer description''':<br>
CLDR extension contains local language names for different languages, countries, and currencies extracted from CLDR data

''
>