UNPKG

eslint-plugin-jsdoc

Version:
166 lines (163 loc) 6.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.cjs")); var _parseImportsExports = require("parse-imports-exports"); var _semver = _interopRequireDefault(require("semver")); var _spdxExpressionParse = _interopRequireDefault(require("spdx-expression-parse")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const allowedKinds = new Set(['class', 'constant', 'event', 'external', 'file', 'function', 'member', 'mixin', 'module', 'namespace', 'typedef']); var _default = exports.default = (0, _iterateJsdoc.default)(({ context, report, settings, utils }) => { const options = context.options[0] || {}; const { allowedAuthors = null, allowedLicenses = null, licensePattern = '/([^\n\r]*)/gv', numericOnlyVariation = false } = options; utils.forEachPreferredTag('version', (jsdocParameter, targetTagName) => { const version = /** @type {string} */utils.getTagDescription(jsdocParameter).trim(); if (!version) { report(`Missing JSDoc @${targetTagName} value.`, null, jsdocParameter); } else if (!_semver.default.valid(version)) { report(`Invalid JSDoc @${targetTagName}: "${utils.getTagDescription(jsdocParameter)}".`, null, jsdocParameter); } }); utils.forEachPreferredTag('kind', (jsdocParameter, targetTagName) => { const kind = /** @type {string} */utils.getTagDescription(jsdocParameter).trim(); if (!kind) { report(`Missing JSDoc @${targetTagName} value.`, null, jsdocParameter); } else if (!allowedKinds.has(kind)) { report(`Invalid JSDoc @${targetTagName}: "${utils.getTagDescription(jsdocParameter)}"; ` + `must be one of: ${[...allowedKinds].join(', ')}.`, null, jsdocParameter); } }); if (numericOnlyVariation) { utils.forEachPreferredTag('variation', (jsdocParameter, targetTagName) => { const variation = /** @type {string} */utils.getTagDescription(jsdocParameter).trim(); if (!variation) { report(`Missing JSDoc @${targetTagName} value.`, null, jsdocParameter); } else if (!Number.isInteger(Number(variation)) || Number(variation) <= 0) { report(`Invalid JSDoc @${targetTagName}: "${utils.getTagDescription(jsdocParameter)}".`, null, jsdocParameter); } }); } utils.forEachPreferredTag('since', (jsdocParameter, targetTagName) => { const version = /** @type {string} */utils.getTagDescription(jsdocParameter).trim(); if (!version) { report(`Missing JSDoc @${targetTagName} value.`, null, jsdocParameter); } else if (!_semver.default.valid(version)) { report(`Invalid JSDoc @${targetTagName}: "${utils.getTagDescription(jsdocParameter)}".`, null, jsdocParameter); } }); utils.forEachPreferredTag('license', (jsdocParameter, targetTagName) => { const licenseRegex = utils.getRegexFromString(licensePattern, 'g'); const matches = /** @type {string} */utils.getTagDescription(jsdocParameter).matchAll(licenseRegex); let positiveMatch = false; for (const match of matches) { const license = match[1] || match[0]; if (license) { positiveMatch = true; } if (!license.trim()) { // Avoid reporting again as empty match if (positiveMatch) { return; } report(`Missing JSDoc @${targetTagName} value.`, null, jsdocParameter); } else if (allowedLicenses) { if (allowedLicenses !== true && !allowedLicenses.includes(license)) { report(`Invalid JSDoc @${targetTagName}: "${license}"; expected one of ${allowedLicenses.join(', ')}.`, null, jsdocParameter); } } else { try { (0, _spdxExpressionParse.default)(license); } catch { report(`Invalid JSDoc @${targetTagName}: "${license}"; expected SPDX expression: https://spdx.org/licenses/.`, null, jsdocParameter); } } } }); if (settings.mode === 'typescript') { utils.forEachPreferredTag('import', tag => { const { description, name, type } = tag; const typePart = type ? `{${type}} ` : ''; const imprt = 'import ' + (description ? `${typePart}${name} ${description}` : `${typePart}${name}`); const importsExports = (0, _parseImportsExports.parseImportsExports)(imprt.trim()); if (importsExports.errors) { report('Bad @import tag', null, tag); } }); } utils.forEachPreferredTag('author', (jsdocParameter, targetTagName) => { const author = /** @type {string} */utils.getTagDescription(jsdocParameter).trim(); if (!author) { report(`Missing JSDoc @${targetTagName} value.`, null, jsdocParameter); } else if (allowedAuthors && !allowedAuthors.includes(author)) { report(`Invalid JSDoc @${targetTagName}: "${utils.getTagDescription(jsdocParameter)}"; expected one of ${allowedAuthors.join(', ')}.`, null, jsdocParameter); } }); }, { iterateAllJsdocs: true, meta: { docs: { description: 'This rule checks the values for a handful of tags: `@version`, `@since`, `@license` and `@author`.', url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-values.md#repos-sticky-header' }, schema: [{ additionalProperties: false, properties: { allowedAuthors: { description: `An array of allowable author values. If absent, only non-whitespace will be checked for.`, items: { type: 'string' }, type: 'array' }, allowedLicenses: { anyOf: [{ items: { type: 'string' }, type: 'array' }, { type: 'boolean' }], description: `An array of allowable license values or \`true\` to allow any license text. If present as an array, will be used in place of [SPDX identifiers](https://spdx.org/licenses/).` }, licensePattern: { description: `A string to be converted into a \`RegExp\` (with \`v\` flag) and whose first parenthetical grouping, if present, will match the portion of the license description to check (if no grouping is present, then the whole portion matched will be used). Defaults to \`/([^\\n\\r]*)/gv\`, i.e., the SPDX expression is expected before any line breaks. Note that the \`/\` delimiters are optional, but necessary to add flags. Defaults to using the \`v\` flag, so to add your own flags, encapsulate your expression as a string, but like a literal, e.g., \`/^mit$/vi\`.`, type: 'string' }, numericOnlyVariation: { description: `Whether to enable validation that \`@variation\` must be a number. Defaults to \`false\`.`, type: 'boolean' } }, type: 'object' }], type: 'suggestion' } }); module.exports = exports.default; //# sourceMappingURL=checkValues.cjs.map