blob: d37528e96ee90ae6bf4f363d309a4b05512902c2 [file] [log] [blame]
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _jsdoctypeparser = require("jsdoctypeparser");
var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
var _warnRemovedSettings = _interopRequireDefault(require("../warnRemovedSettings"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const asExpression = /as\s+/u;
var _default = (0, _iterateJsdoc.default)(({
jsdoc,
report,
utils,
context
}) => {
(0, _warnRemovedSettings.default)(context, 'valid-types');
const _ref = context.options[0] || {},
_ref$allowEmptyNamepa = _ref.allowEmptyNamepaths,
allowEmptyNamepaths = _ref$allowEmptyNamepa === void 0 ? true : _ref$allowEmptyNamepa,
_ref$checkSeesForName = _ref.checkSeesForNamepaths,
checkSeesForNamepaths = _ref$checkSeesForName === void 0 ? false : _ref$checkSeesForName;
if (!jsdoc.tags) {
return;
}
jsdoc.tags.forEach(tag => {
const validNamepathParsing = function validNamepathParsing(namepath, tagName) {
try {
(0, _jsdoctypeparser.parse)(namepath);
} catch (error) {
let handled = false;
if (tagName) {
if (['memberof', 'memberof!'].includes(tagName)) {
const endChar = namepath.slice(-1);
if (['#', '.', '~'].includes(endChar)) {
try {
(0, _jsdoctypeparser.parse)(namepath.slice(0, -1));
handled = true;
} catch (memberofError) {// Use the original error for including the whole type
}
}
} else if (tagName === 'borrows') {
const startChar = namepath.charAt();
if (['#', '.', '~'].includes(startChar)) {
try {
(0, _jsdoctypeparser.parse)(namepath.slice(1));
handled = true;
} catch (memberofError) {// Use the original error for including the whole type
}
}
}
}
if (!handled) {
report(`Syntax error in namepath: ${namepath}`, null, tag);
return false;
}
}
return true;
};
const validTypeParsing = function validTypeParsing(type) {
try {
(0, _jsdoctypeparser.parse)(type);
} catch (error) {
report(`Syntax error in type: ${type}`, null, tag);
return false;
}
return true;
};
const hasTypePosition = utils.tagMightHaveTypePosition(tag.tag) && Boolean(tag.type);
const mustHaveTypePosition = utils.tagMustHaveTypePosition(tag.tag);
const hasNameOrNamepathPosition = utils.tagMightHaveNamePosition(tag.tag) && Boolean(tag.name) && !(tag.tag === 'see' && !checkSeesForNamepaths);
const mustHaveNameOrNamepathPosition = utils.tagMustHaveNamePosition(tag.tag) && !allowEmptyNamepaths;
const hasEither = utils.tagMightHaveEitherTypeOrNamePosition(tag.tag) && hasTypePosition || hasNameOrNamepathPosition;
const mustHaveEither = utils.tagMustHaveEitherTypeOrNamePosition(tag.tag);
if (tag.tag === 'borrows') {
const thisNamepath = tag.description.replace(asExpression, '');
if (!asExpression.test(tag.description) || !thisNamepath) {
report(`@borrows must have an "as" expression. Found "${tag.description}"`, null, tag);
return;
}
if (validNamepathParsing(thisNamepath, 'borrows')) {
const thatNamepath = tag.name;
validNamepathParsing(thatNamepath);
}
} else {
if (mustHaveEither && !hasEither && !mustHaveTypePosition) {
report(`Tag @${tag.tag} must have either a type or namepath`, null, tag);
return;
}
if (hasTypePosition) {
validTypeParsing(tag.type);
} else if (mustHaveTypePosition) {
report(`Tag @${tag.tag} must have a type`, null, tag);
}
if (hasNameOrNamepathPosition) {
validNamepathParsing(tag.name, tag.tag);
} else if (mustHaveNameOrNamepathPosition) {
report(`Tag @${tag.tag} must have a name/namepath`, null, tag);
}
}
});
}, {
iterateAllJsdocs: true,
meta: {
schema: [{
additionalProperies: false,
properties: {
allowEmptyNamepaths: {
default: true,
type: 'boolean'
},
checkSeesForNamepaths: {
default: false,
type: 'boolean'
}
},
type: 'object'
}],
type: 'suggestion'
}
});
exports.default = _default;
module.exports = exports.default;
//# sourceMappingURL=validTypes.js.map