diff --git a/.eslintrc.json b/.eslintrc.json
index 7a01e688..5511e9e0 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -3,8 +3,7 @@
"extends": [
"wikimedia/client",
"wikimedia/jquery",
- "wikimedia/mediawiki",
- "wikimedia/jsduck"
+ "wikimedia/mediawiki"
],
"rules": {
"max-len": "off",
diff --git a/jsdoc.json b/jsdoc.json
new file mode 100644
index 00000000..b1a57717
--- /dev/null
+++ b/jsdoc.json
@@ -0,0 +1,20 @@
+{
+ "opts": {
+ "destination": "docs",
+ "package": "package.json",
+ "pedantic": true,
+ "recurse": true
+ },
+ "plugins": [
+ "plugins/markdown"
+ ],
+ "source": {
+ "include": [ "modules" ]
+ },
+ "templates": {
+ "cleverLinks": true,
+ "default": {
+ "useLongnameInNav": true
+ }
+ }
+}
diff --git a/jsduck.external.js b/jsduck.external.js
deleted file mode 100644
index 2dd24633..00000000
--- a/jsduck.external.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * @class jQuery
- *
- */
-
-/**
- * @class jQuery.Event
- *
- */
-
-/**
- * @class jQuery.Promise
- *
- */
-
-/**
- * @class ve.ui.Surface
- *
- */
diff --git a/jsduck.json b/jsduck.json
deleted file mode 100644
index 024956be..00000000
--- a/jsduck.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "--title": "TemplateData - Documentation",
- "--processes": "0",
- "--warnings-exit-nonzero": true,
- "--external": "OO.*",
- "--output": "docs",
- "--": [
- "jsduck.external.js",
- "modules"
- ]
-}
diff --git a/modules/ext.templateDataGenerator.data/Model.js b/modules/ext.templateDataGenerator.data/Model.js
index 4950dabd..9de7b11e 100644
--- a/modules/ext.templateDataGenerator.data/Model.js
+++ b/modules/ext.templateDataGenerator.data/Model.js
@@ -2,7 +2,7 @@
* TemplateData Model
*
* @class
- * @mixins OO.EventEmitter
+ * @mixes OO.EventEmitter
*
* @constructor
*/
diff --git a/modules/ext.templateDataGenerator.editTemplatePage/Dialog.js b/modules/ext.templateDataGenerator.editTemplatePage/Dialog.js
index f2ac7151..59910ef1 100644
--- a/modules/ext.templateDataGenerator.editTemplatePage/Dialog.js
+++ b/modules/ext.templateDataGenerator.editTemplatePage/Dialog.js
@@ -668,6 +668,7 @@ mw.TemplateData.Dialog.prototype.onMapsGroupSelect = function () {
* Stringify objects in the dialog with space of 4, mainly maps objects
*
* @param {Object} object maps object
+ * @return {string} serialized form
*/
mw.TemplateData.Dialog.prototype.stringifyObject = function ( object ) {
return JSON.stringify( object, null, 4 );
@@ -1281,6 +1282,7 @@ mw.TemplateData.Dialog.prototype.importParametersFromTemplateCode = function ()
* Get a process for setting up a window for use.
*
* @param {Object} [data] Dialog opening data
+ * @return {OO.ui.Process} Setup process
*/
mw.TemplateData.Dialog.prototype.getSetupProcess = function ( data ) {
return mw.TemplateData.Dialog.super.prototype.getSetupProcess.call( this, data )
diff --git a/modules/ext.templateDataGenerator.editTemplatePage/widgets/LanguageResultWidget.js b/modules/ext.templateDataGenerator.editTemplatePage/widgets/LanguageResultWidget.js
index f6743b60..909bf330 100644
--- a/modules/ext.templateDataGenerator.editTemplatePage/widgets/LanguageResultWidget.js
+++ b/modules/ext.templateDataGenerator.editTemplatePage/widgets/LanguageResultWidget.js
@@ -30,6 +30,7 @@ OO.inheritClass( mw.TemplateData.LanguageResultWidget, OO.ui.OptionWidget );
*
* @param {string} [query] Query text which matched this result
* @param {string} [matchedProperty] Data property which matched the query text
+ * @return {mw.TemplateData.LanguageResultWidget}
* @chainable
*/
mw.TemplateData.LanguageResultWidget.prototype.updateLabel = function ( query, matchedProperty ) {
diff --git a/modules/ext.templateDataGenerator.editTemplatePage/widgets/ParamSelectWidget.js b/modules/ext.templateDataGenerator.editTemplatePage/widgets/ParamSelectWidget.js
index 8cf48716..aab38c6e 100644
--- a/modules/ext.templateDataGenerator.editTemplatePage/widgets/ParamSelectWidget.js
+++ b/modules/ext.templateDataGenerator.editTemplatePage/widgets/ParamSelectWidget.js
@@ -3,7 +3,7 @@
*
* @class
* @extends OO.ui.SelectWidget
- * @mixins OO.ui.mixin.DraggableGroupElement
+ * @mixes OO.ui.mixin.DraggableGroupElement
*
* @param {Object} config Dialog configuration object
*/
diff --git a/modules/ext.templateDataGenerator.editTemplatePage/widgets/ParamWidget.js b/modules/ext.templateDataGenerator.editTemplatePage/widgets/ParamWidget.js
index 9eca2590..58679840 100644
--- a/modules/ext.templateDataGenerator.editTemplatePage/widgets/ParamWidget.js
+++ b/modules/ext.templateDataGenerator.editTemplatePage/widgets/ParamWidget.js
@@ -3,7 +3,7 @@
*
* @class
* @extends OO.ui.DecoratedOptionWidget
- * @mixins OO.ui.mixin.DraggableElement
+ * @mixes OO.ui.mixin.DraggableElement
*
* @param {Object} data Parameter data
* @param {Object} [config] Configuration object
diff --git a/package-lock.json b/package-lock.json
index f5718280..f70d9276 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -666,6 +666,12 @@
}
}
},
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
"body": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
@@ -762,6 +768,15 @@
"integrity": "sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA==",
"dev": true
},
+ "catharsis": {
+ "version": "0.8.11",
+ "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz",
+ "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.14"
+ }
+ },
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -2326,6 +2341,12 @@
"minimist": "^1.2.5"
}
},
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true
+ },
"grunt": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz",
@@ -3119,6 +3140,51 @@
"esprima": "^4.0.0"
}
},
+ "js2xmlparser": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.1.tgz",
+ "integrity": "sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==",
+ "dev": true,
+ "requires": {
+ "xmlcreate": "^2.0.3"
+ }
+ },
+ "jsdoc": {
+ "version": "3.6.6",
+ "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.6.tgz",
+ "integrity": "sha512-znR99e1BHeyEkSvgDDpX0sTiTu+8aQyDl9DawrkOGZTTW8hv0deIFXx87114zJ7gRaDZKVQD/4tr1ifmJp9xhQ==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.9.4",
+ "bluebird": "^3.7.2",
+ "catharsis": "^0.8.11",
+ "escape-string-regexp": "^2.0.0",
+ "js2xmlparser": "^4.0.1",
+ "klaw": "^3.0.0",
+ "markdown-it": "^10.0.0",
+ "markdown-it-anchor": "^5.2.7",
+ "marked": "^0.8.2",
+ "mkdirp": "^1.0.4",
+ "requizzle": "^0.2.3",
+ "strip-json-comments": "^3.1.0",
+ "taffydb": "2.6.2",
+ "underscore": "~1.10.2"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true
+ }
+ }
+ },
"jsdoctypeparser": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
@@ -3218,6 +3284,15 @@
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true
},
+ "klaw": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
+ "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
"known-css-properties": {
"version": "0.20.0",
"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.20.0.tgz",
@@ -3428,6 +3503,15 @@
"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
"dev": true
},
+ "linkify-it": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
+ "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
+ "dev": true,
+ "requires": {
+ "uc.micro": "^1.0.1"
+ }
+ },
"livereload-js": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
@@ -3554,6 +3638,39 @@
"object-visit": "^1.0.0"
}
},
+ "markdown-it": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz",
+ "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "entities": "~2.0.0",
+ "linkify-it": "^2.0.0",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "dependencies": {
+ "entities": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
+ "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
+ "dev": true
+ }
+ }
+ },
+ "markdown-it-anchor": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz",
+ "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==",
+ "dev": true
+ },
+ "marked": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz",
+ "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==",
+ "dev": true
+ },
"mathml-tag-names": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
@@ -3592,6 +3709,12 @@
"integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==",
"dev": true
},
+ "mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
+ "dev": true
+ },
"meow": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz",
@@ -4430,6 +4553,15 @@
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
"dev": true
},
+ "requizzle": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz",
+ "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.14"
+ }
+ },
"resolve": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
@@ -5296,6 +5428,12 @@
}
}
},
+ "taffydb": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
+ "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=",
+ "dev": true
+ },
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -5431,12 +5569,24 @@
"is-typedarray": "^1.0.0"
}
},
+ "uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+ "dev": true
+ },
"unc-path-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
"dev": true
},
+ "underscore": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz",
+ "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==",
+ "dev": true
+ },
"underscore.string": {
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
@@ -5798,6 +5948,12 @@
"typedarray-to-buffer": "^3.1.5"
}
},
+ "xmlcreate": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz",
+ "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==",
+ "dev": true
+ },
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
diff --git a/package.json b/package.json
index 11459241..1cf9ee23 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
{
"private": true,
"scripts": {
- "test": "grunt test",
- "doc": "jsduck"
+ "doc": "jsdoc -c jsdoc.json",
+ "test": "grunt test"
},
"devDependencies": {
"eslint-config-wikimedia": "0.17.0",
@@ -11,6 +11,7 @@
"grunt-contrib-watch": "1.1.0",
"grunt-eslint": "23.0.0",
"grunt-stylelint": "0.16.0",
+ "jsdoc": "3.6.6",
"stylelint-config-wikimedia": "0.10.3"
}
}