blob: 6b2ff26d278c621e1ea6876981da051fff86c1dc [file] [log] [blame]
"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;
const checkJsDoc = node => {
const jsDocNode = (0, _getJSDocComment.default)(sourceCode, node, settings);
if (jsDocNode) {
return;
}
if (exemptEmptyFunctions) {
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;
}
checkJsDoc(node);
},
ClassDeclaration(node) {
if (!requireOption.ClassDeclaration) {
return;
}
checkJsDoc(node);
},
ClassExpression(node) {
if (!requireOption.ClassExpression) {
return;
}
checkJsDoc(node);
},
FunctionDeclaration(node) {
if (!requireOption.FunctionDeclaration) {
return;
}
checkJsDoc(node);
},
FunctionExpression(node) {
if (requireOption.MethodDefinition && node.parent.type === 'MethodDefinition') {
checkJsDoc(node);
return;
}
if (!requireOption.FunctionExpression) {
return;
}
if (['VariableDeclarator', 'AssignmentExpression', 'ExportDefaultDeclaration'].includes(node.parent.type) || node.parent.type === 'Property' && node === node.parent.value) {
checkJsDoc(node);
}
}
});
},
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