forked from public/fvtt-cthulhu-eternal
237 lines
6.6 KiB
JavaScript
237 lines
6.6 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.default = void 0;
|
||
|
var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.cjs"));
|
||
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
||
|
var _default = exports.default = (0, _iterateJsdoc.default)(({
|
||
|
context,
|
||
|
jsdoc,
|
||
|
utils
|
||
|
}) => {
|
||
|
const {
|
||
|
allowMultipleTags = true,
|
||
|
noFinalLineText = true,
|
||
|
noZeroLineText = true,
|
||
|
noSingleLineBlocks = false,
|
||
|
singleLineTags = ['lends', 'type'],
|
||
|
noMultilineBlocks = false,
|
||
|
minimumLengthForMultiline = Number.POSITIVE_INFINITY,
|
||
|
multilineTags = ['*']
|
||
|
} = context.options[0] || {};
|
||
|
const {
|
||
|
source: [{
|
||
|
tokens
|
||
|
}]
|
||
|
} = jsdoc;
|
||
|
const {
|
||
|
description,
|
||
|
tag
|
||
|
} = tokens;
|
||
|
const sourceLength = jsdoc.source.length;
|
||
|
|
||
|
/**
|
||
|
* @param {string} tagName
|
||
|
* @returns {boolean}
|
||
|
*/
|
||
|
const isInvalidSingleLine = tagName => {
|
||
|
return noSingleLineBlocks && (!tagName || !singleLineTags.includes(tagName) && !singleLineTags.includes('*'));
|
||
|
};
|
||
|
if (sourceLength === 1) {
|
||
|
if (!isInvalidSingleLine(tag.slice(1))) {
|
||
|
return;
|
||
|
}
|
||
|
const fixer = () => {
|
||
|
utils.makeMultiline();
|
||
|
};
|
||
|
utils.reportJSDoc('Single line blocks are not permitted by your configuration.', null, fixer, true);
|
||
|
return;
|
||
|
}
|
||
|
const lineChecks = () => {
|
||
|
if (noZeroLineText && (tag || description)) {
|
||
|
const fixer = () => {
|
||
|
const line = {
|
||
|
...tokens
|
||
|
};
|
||
|
utils.emptyTokens(tokens);
|
||
|
const {
|
||
|
tokens: {
|
||
|
delimiter,
|
||
|
start
|
||
|
}
|
||
|
} = jsdoc.source[1];
|
||
|
utils.addLine(1, {
|
||
|
...line,
|
||
|
delimiter,
|
||
|
start
|
||
|
});
|
||
|
};
|
||
|
utils.reportJSDoc('Should have no text on the "0th" line (after the `/**`).', null, fixer);
|
||
|
return;
|
||
|
}
|
||
|
const finalLine = jsdoc.source[jsdoc.source.length - 1];
|
||
|
const finalLineTokens = finalLine.tokens;
|
||
|
if (noFinalLineText && finalLineTokens.description.trim()) {
|
||
|
const fixer = () => {
|
||
|
const line = {
|
||
|
...finalLineTokens
|
||
|
};
|
||
|
line.description = line.description.trimEnd();
|
||
|
const {
|
||
|
delimiter
|
||
|
} = line;
|
||
|
for (const prop of ['delimiter', 'postDelimiter', 'tag', 'type', 'lineEnd', 'postType', 'postTag', 'name', 'postName', 'description']) {
|
||
|
finalLineTokens[(
|
||
|
/**
|
||
|
* @type {"delimiter"|"postDelimiter"|"tag"|"type"|
|
||
|
* "lineEnd"|"postType"|"postTag"|"name"|
|
||
|
* "postName"|"description"}
|
||
|
*/
|
||
|
prop)] = '';
|
||
|
}
|
||
|
utils.addLine(jsdoc.source.length - 1, {
|
||
|
...line,
|
||
|
delimiter,
|
||
|
end: ''
|
||
|
});
|
||
|
};
|
||
|
utils.reportJSDoc('Should have no text on the final line (before the `*/`).', null, fixer);
|
||
|
}
|
||
|
};
|
||
|
if (noMultilineBlocks) {
|
||
|
if (jsdoc.tags.length && (multilineTags.includes('*') || utils.hasATag(multilineTags))) {
|
||
|
lineChecks();
|
||
|
return;
|
||
|
}
|
||
|
if (jsdoc.description.length >= minimumLengthForMultiline) {
|
||
|
lineChecks();
|
||
|
return;
|
||
|
}
|
||
|
if (noSingleLineBlocks && (!jsdoc.tags.length || !utils.filterTags(({
|
||
|
tag: tg
|
||
|
}) => {
|
||
|
return !isInvalidSingleLine(tg);
|
||
|
}).length)) {
|
||
|
utils.reportJSDoc('Multiline jsdoc blocks are prohibited by ' + 'your configuration but fixing would result in a single ' + 'line block which you have prohibited with `noSingleLineBlocks`.');
|
||
|
return;
|
||
|
}
|
||
|
if (jsdoc.tags.length > 1) {
|
||
|
if (!allowMultipleTags) {
|
||
|
utils.reportJSDoc('Multiline jsdoc blocks are prohibited by ' + 'your configuration but the block has multiple tags.');
|
||
|
return;
|
||
|
}
|
||
|
} else if (jsdoc.tags.length === 1 && jsdoc.description.trim()) {
|
||
|
if (!allowMultipleTags) {
|
||
|
utils.reportJSDoc('Multiline jsdoc blocks are prohibited by ' + 'your configuration but the block has a description with a tag.');
|
||
|
return;
|
||
|
}
|
||
|
} else {
|
||
|
const fixer = () => {
|
||
|
jsdoc.source = [{
|
||
|
number: 1,
|
||
|
source: '',
|
||
|
tokens: jsdoc.source.reduce((obj, {
|
||
|
tokens: {
|
||
|
description: desc,
|
||
|
tag: tg,
|
||
|
type: typ,
|
||
|
name: nme,
|
||
|
lineEnd,
|
||
|
postType,
|
||
|
postName,
|
||
|
postTag
|
||
|
}
|
||
|
}) => {
|
||
|
if (typ) {
|
||
|
obj.type = typ;
|
||
|
}
|
||
|
if (tg && typ && nme) {
|
||
|
obj.postType = postType;
|
||
|
}
|
||
|
if (nme) {
|
||
|
obj.name += nme;
|
||
|
}
|
||
|
if (nme && desc) {
|
||
|
obj.postName = postName;
|
||
|
}
|
||
|
obj.description += desc;
|
||
|
const nameOrDescription = obj.description || obj.name;
|
||
|
if (nameOrDescription && nameOrDescription.slice(-1) !== ' ') {
|
||
|
obj.description += ' ';
|
||
|
}
|
||
|
obj.lineEnd = lineEnd;
|
||
|
|
||
|
// Already filtered for multiple tags
|
||
|
obj.tag += tg;
|
||
|
if (tg) {
|
||
|
obj.postTag = postTag || ' ';
|
||
|
}
|
||
|
return obj;
|
||
|
}, utils.seedTokens({
|
||
|
delimiter: '/**',
|
||
|
end: '*/',
|
||
|
postDelimiter: ' '
|
||
|
}))
|
||
|
}];
|
||
|
};
|
||
|
utils.reportJSDoc('Multiline jsdoc blocks are prohibited by ' + 'your configuration.', null, fixer);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
lineChecks();
|
||
|
}, {
|
||
|
iterateAllJsdocs: true,
|
||
|
meta: {
|
||
|
docs: {
|
||
|
description: 'Controls how and whether jsdoc blocks can be expressed as single or multiple line blocks.',
|
||
|
url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/multiline-blocks.md#repos-sticky-header'
|
||
|
},
|
||
|
fixable: 'code',
|
||
|
schema: [{
|
||
|
additionalProperties: false,
|
||
|
properties: {
|
||
|
allowMultipleTags: {
|
||
|
type: 'boolean'
|
||
|
},
|
||
|
minimumLengthForMultiline: {
|
||
|
type: 'integer'
|
||
|
},
|
||
|
multilineTags: {
|
||
|
anyOf: [{
|
||
|
enum: ['*'],
|
||
|
type: 'string'
|
||
|
}, {
|
||
|
items: {
|
||
|
type: 'string'
|
||
|
},
|
||
|
type: 'array'
|
||
|
}]
|
||
|
},
|
||
|
noFinalLineText: {
|
||
|
type: 'boolean'
|
||
|
},
|
||
|
noMultilineBlocks: {
|
||
|
type: 'boolean'
|
||
|
},
|
||
|
noSingleLineBlocks: {
|
||
|
type: 'boolean'
|
||
|
},
|
||
|
noZeroLineText: {
|
||
|
type: 'boolean'
|
||
|
},
|
||
|
singleLineTags: {
|
||
|
items: {
|
||
|
type: 'string'
|
||
|
},
|
||
|
type: 'array'
|
||
|
}
|
||
|
},
|
||
|
type: 'object'
|
||
|
}],
|
||
|
type: 'suggestion'
|
||
|
}
|
||
|
});
|
||
|
module.exports = exports.default;
|
||
|
//# sourceMappingURL=multilineBlocks.cjs.map
|