2020-03-31 20:40:00 +08:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
|
|
value: true
|
|
|
|
});
|
|
|
|
exports.default = void 0;
|
|
|
|
|
|
|
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
|
|
|
|
|
|
var _jsdocUtils = _interopRequireDefault(require("../jsdocUtils"));
|
|
|
|
|
|
|
|
var _exportParser = _interopRequireDefault(require("../exportParser"));
|
|
|
|
|
|
|
|
var _getJSDocComment = _interopRequireDefault(require("../eslint/getJSDocComment"));
|
|
|
|
|
|
|
|
var _warnRemovedSettings = _interopRequireDefault(require("../warnRemovedSettings"));
|
|
|
|
|
|
|
|
var _iterateJsdoc = require("../iterateJsdoc");
|
|
|
|
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
|
|
|
|
const OPTIONS_SCHEMA = {
|
|
|
|
additionalProperties: false,
|
|
|
|
properties: {
|
|
|
|
contexts: {
|
|
|
|
items: {
|
|
|
|
type: 'string'
|
|
|
|
},
|
|
|
|
type: 'array'
|
|
|
|
},
|
|
|
|
exemptEmptyFunctions: {
|
|
|
|
default: false,
|
|
|
|
type: 'boolean'
|
|
|
|
},
|
|
|
|
publicOnly: {
|
|
|
|
oneOf: [{
|
|
|
|
default: false,
|
|
|
|
type: 'boolean'
|
|
|
|
}, {
|
|
|
|
additionalProperties: false,
|
|
|
|
default: {},
|
|
|
|
properties: {
|
|
|
|
ancestorsOnly: {
|
|
|
|
type: 'boolean'
|
|
|
|
},
|
|
|
|
cjs: {
|
|
|
|
type: 'boolean'
|
|
|
|
},
|
|
|
|
esm: {
|
|
|
|
type: 'boolean'
|
|
|
|
},
|
|
|
|
window: {
|
|
|
|
type: 'boolean'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
type: 'object'
|
|
|
|
}]
|
|
|
|
},
|
|
|
|
require: {
|
|
|
|
additionalProperties: false,
|
|
|
|
default: {},
|
|
|
|
properties: {
|
|
|
|
ArrowFunctionExpression: {
|
|
|
|
default: false,
|
|
|
|
type: 'boolean'
|
|
|
|
},
|
|
|
|
ClassDeclaration: {
|
|
|
|
default: false,
|
|
|
|
type: 'boolean'
|
|
|
|
},
|
|
|
|
ClassExpression: {
|
|
|
|
default: false,
|
|
|
|
type: 'boolean'
|
|
|
|
},
|
|
|
|
FunctionDeclaration: {
|
|
|
|
default: true,
|
|
|
|
type: 'boolean'
|
|
|
|
},
|
|
|
|
FunctionExpression: {
|
|
|
|
default: false,
|
|
|
|
type: 'boolean'
|
|
|
|
},
|
|
|
|
MethodDefinition: {
|
|
|
|
default: false,
|
|
|
|
type: 'boolean'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
type: 'object'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
type: 'object'
|
|
|
|
};
|
|
|
|
|
|
|
|
const getOption = (context, baseObject, option, key) => {
|
|
|
|
if (!_lodash.default.has(context, `options[0][${option}][${key}]`)) {
|
|
|
|
return baseObject.properties[key].default;
|
|
|
|
}
|
|
|
|
|
|
|
|
return context.options[0][option][key];
|
|
|
|
};
|
|
|
|
|
|
|
|
const getOptions = context => {
|
|
|
|
return {
|
|
|
|
exemptEmptyFunctions: context.options[0] ? context.options[0].exemptEmptyFunctions : false,
|
|
|
|
publicOnly: (baseObj => {
|
|
|
|
const publicOnly = _lodash.default.get(context, 'options[0].publicOnly');
|
|
|
|
|
|
|
|
if (!publicOnly) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return Object.keys(baseObj.properties).reduce((obj, prop) => {
|
|
|
|
const opt = getOption(context, baseObj, 'publicOnly', prop);
|
|
|
|
obj[prop] = opt;
|
|
|
|
return obj;
|
|
|
|
}, {});
|
|
|
|
})(OPTIONS_SCHEMA.properties.publicOnly.oneOf[1]),
|
|
|
|
require: (baseObj => {
|
|
|
|
return Object.keys(baseObj.properties).reduce((obj, prop) => {
|
|
|
|
const opt = getOption(context, baseObj, 'require', prop);
|
|
|
|
obj[prop] = opt;
|
|
|
|
return obj;
|
|
|
|
}, {});
|
|
|
|
})(OPTIONS_SCHEMA.properties.require)
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
var _default = {
|
|
|
|
create(context) {
|
|
|
|
(0, _warnRemovedSettings.default)(context, 'require-jsdoc');
|
|
|
|
const sourceCode = context.getSourceCode();
|
|
|
|
const settings = (0, _iterateJsdoc.getSettings)(context);
|
|
|
|
|
|
|
|
const _getOptions = getOptions(context),
|
|
|
|
requireOption = _getOptions.require,
|
|
|
|
publicOnly = _getOptions.publicOnly,
|
|
|
|
exemptEmptyFunctions = _getOptions.exemptEmptyFunctions;
|
|
|
|
|
2020-03-31 20:57:48 +08:00
|
|
|
const checkJsDoc = node => {
|
2020-03-31 20:40:00 +08:00
|
|
|
const jsDocNode = (0, _getJSDocComment.default)(sourceCode, node, settings);
|
|
|
|
|
|
|
|
if (jsDocNode) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-03-31 20:57:48 +08:00
|
|
|
if (exemptEmptyFunctions) {
|
2020-03-31 20:40:00 +08:00
|
|
|
const functionParameterNames = _jsdocUtils.default.getFunctionParameterNames(node);
|
|
|
|
|
|
|
|
if (!functionParameterNames.length && !_jsdocUtils.default.hasReturnValue(node, context)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const fix = fixer => {
|
|
|
|
// Default to one line break if the `minLines`/`maxLines` settings allow
|
|
|
|
const lines = settings.minLines === 0 && settings.maxLines >= 1 ? 1 : settings.minLines;
|
|
|
|
|
|
|
|
const indent = _jsdocUtils.default.getIndent(sourceCode);
|
|
|
|
|
|
|
|
const insertion = `/**\n${indent}*\n${indent}*/${'\n'.repeat(lines)}${indent.slice(0, -1)}`;
|
|
|
|
const baseNode = ['ExportDefaultDeclaration', 'ExportNamedDeclaration'].includes(node.parent && node.parent.type) ? node.parent : node;
|
|
|
|
return fixer.insertTextBefore(baseNode, insertion);
|
|
|
|
};
|
|
|
|
|
|
|
|
const report = () => {
|
|
|
|
const loc = {
|
|
|
|
end: node.loc.start + 1,
|
|
|
|
start: node.loc.start
|
|
|
|
};
|
|
|
|
context.report({
|
|
|
|
fix,
|
|
|
|
loc,
|
|
|
|
messageId: 'missingJsDoc',
|
|
|
|
node
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
if (publicOnly) {
|
|
|
|
const opt = {
|
|
|
|
ancestorsOnly: Boolean(_lodash.default.get(publicOnly, 'ancestorsOnly', false)),
|
|
|
|
esm: Boolean(_lodash.default.get(publicOnly, 'esm', true)),
|
|
|
|
initModuleExports: Boolean(_lodash.default.get(publicOnly, 'cjs', true)),
|
|
|
|
initWindow: Boolean(_lodash.default.get(publicOnly, 'window', false))
|
|
|
|
};
|
|
|
|
|
|
|
|
const parseResult = _exportParser.default.parse(sourceCode.ast, node, opt);
|
|
|
|
|
|
|
|
const exported = _exportParser.default.isExported(node, parseResult, opt);
|
|
|
|
|
|
|
|
if (exported) {
|
|
|
|
report();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
report();
|
|
|
|
}
|
|
|
|
}; // eslint-disable-next-line fp/no-mutating-assign
|
|
|
|
|
|
|
|
|
|
|
|
return Object.assign(_jsdocUtils.default.getContextObject(_jsdocUtils.default.enforcedContexts(context, []), checkJsDoc), {
|
|
|
|
ArrowFunctionExpression(node) {
|
|
|
|
if (!requireOption.ArrowFunctionExpression) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!['VariableDeclarator', 'ExportDefaultDeclaration'].includes(node.parent.type)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-03-31 20:57:48 +08:00
|
|
|
checkJsDoc(node);
|
2020-03-31 20:40:00 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
ClassDeclaration(node) {
|
|
|
|
if (!requireOption.ClassDeclaration) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
checkJsDoc(node);
|
|
|
|
},
|
|
|
|
|
|
|
|
ClassExpression(node) {
|
|
|
|
if (!requireOption.ClassExpression) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
checkJsDoc(node);
|
|
|
|
},
|
|
|
|
|
|
|
|
FunctionDeclaration(node) {
|
|
|
|
if (!requireOption.FunctionDeclaration) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-03-31 20:57:48 +08:00
|
|
|
checkJsDoc(node);
|
2020-03-31 20:40:00 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
FunctionExpression(node) {
|
|
|
|
if (requireOption.MethodDefinition && node.parent.type === 'MethodDefinition') {
|
2020-03-31 20:57:48 +08:00
|
|
|
checkJsDoc(node);
|
2020-03-31 20:40:00 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!requireOption.FunctionExpression) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (['VariableDeclarator', 'AssignmentExpression', 'ExportDefaultDeclaration'].includes(node.parent.type) || node.parent.type === 'Property' && node === node.parent.value) {
|
2020-03-31 20:57:48 +08:00
|
|
|
checkJsDoc(node);
|
2020-03-31 20:40:00 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
meta: {
|
|
|
|
doc: {
|
|
|
|
category: 'Stylistic Issues',
|
|
|
|
description: 'Require JSDoc comments',
|
|
|
|
recommended: 'true',
|
|
|
|
url: 'https://github.com/gajus/eslint-plugin-jsdoc'
|
|
|
|
},
|
|
|
|
fixable: 'code',
|
|
|
|
messages: {
|
|
|
|
missingJsDoc: 'Missing JSDoc comment.'
|
|
|
|
},
|
|
|
|
schema: [OPTIONS_SCHEMA],
|
|
|
|
type: 'suggestion'
|
|
|
|
}
|
|
|
|
};
|
|
|
|
exports.default = _default;
|
|
|
|
module.exports = exports.default;
|
|
|
|
//# sourceMappingURL=requireJsdoc.js.map
|