Skip to content

Commit 270fbdc

Browse files
committed
refactor: make exports named and move utils to own file for reuse
1 parent 22e3274 commit 270fbdc

File tree

5 files changed

+214
-120
lines changed

5 files changed

+214
-120
lines changed

src/iterateJsdoc.js

Lines changed: 17 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import jsdocUtils from './jsdocUtils.js';
1+
import * as jsdocUtils from './jsdocUtils.js';
22
import {
33
commentHandler,
44
getJSDocComment,
@@ -628,7 +628,7 @@ const getBasicUtils = (context, {
628628
utils.getPreferredTagNameObject = ({
629629
tagName,
630630
}) => {
631-
const ret = jsdocUtils.getPreferredTagName(
631+
const ret = jsdocUtils.getPreferredTagNameSimple(
632632
context,
633633
/** @type {import('./jsdocUtils.js').ParserMode} */ (mode),
634634
tagName,
@@ -783,44 +783,7 @@ const getUtils = (
783783

784784
/** @type {GetTagDescription} */
785785
utils.getTagDescription = (tg, returnArray) => {
786-
/**
787-
* @type {string[]}
788-
*/
789-
const descriptions = [];
790-
tg.source.some(({
791-
tokens: {
792-
end,
793-
lineEnd,
794-
postDelimiter,
795-
tag,
796-
postTag,
797-
name,
798-
type,
799-
description,
800-
},
801-
}) => {
802-
const desc = (
803-
tag && postTag ||
804-
!tag && !name && !type && postDelimiter || ''
805-
806-
// Remove space
807-
).slice(1) +
808-
(description || '') + (lineEnd || '');
809-
810-
if (end) {
811-
if (desc) {
812-
descriptions.push(desc);
813-
}
814-
815-
return true;
816-
}
817-
818-
descriptions.push(desc);
819-
820-
return false;
821-
});
822-
823-
return returnArray ? descriptions : descriptions.join('\n');
786+
return jsdocUtils.getTagDescription(tg, returnArray);
824787
};
825788

826789
/** @type {SetTagDescription} */
@@ -1375,29 +1338,11 @@ const getUtils = (
13751338
};
13761339

13771340
/** @type {GetPreferredTagName} */
1378-
utils.getPreferredTagName = ({
1379-
tagName,
1380-
skipReportingBlockedTag = false,
1381-
allowObjectReturn = false,
1382-
defaultMessage = `Unexpected tag \`@${tagName}\``,
1383-
}) => {
1384-
const ret = jsdocUtils.getPreferredTagName(context, mode, tagName, tagNamePreference);
1385-
const isObject = ret && typeof ret === 'object';
1386-
if (utils.hasTag(tagName) && (ret === false || isObject && !ret.replacement)) {
1387-
if (skipReportingBlockedTag) {
1388-
return {
1389-
blocked: true,
1390-
tagName,
1391-
};
1392-
}
1393-
1394-
const message = isObject && ret.message || defaultMessage;
1395-
report(message, null, utils.getTags(tagName)[0]);
1396-
1397-
return false;
1398-
}
1399-
1400-
return isObject && !allowObjectReturn ? ret.replacement : ret;
1341+
utils.getPreferredTagName = (args) => {
1342+
return jsdocUtils.getPreferredTagName(
1343+
context, mode, report, tagNamePreference,
1344+
jsdoc, args
1345+
);
14011346
};
14021347

14031348
/** @type {IsValidTag} */
@@ -1619,21 +1564,19 @@ const getUtils = (
16191564

16201565
/** @type {GetTags} */
16211566
utils.getTags = (tagName) => {
1622-
return utils.filterTags((item) => {
1623-
return item.tag === tagName;
1624-
});
1567+
return jsdocUtils.getTags(jsdoc, tagName);
16251568
};
16261569

16271570
/** @type {GetPresentTags} */
16281571
utils.getPresentTags = (tagList) => {
1629-
return utils.filterTags((tag) => {
1572+
return jsdocUtils.filterTags(jsdoc, (tag) => {
16301573
return tagList.includes(tag.tag);
16311574
});
16321575
};
16331576

16341577
/** @type {FilterTags} */
16351578
utils.filterTags = (filter) => {
1636-
return jsdoc.tags.filter((tag) => {
1579+
return jsdocUtils.filterTags(jsdoc, (tag) => {
16371580
return filter(tag);
16381581
});
16391582
};
@@ -1699,34 +1642,11 @@ const getUtils = (
16991642
};
17001643

17011644
/** @type {ForEachPreferredTag} */
1702-
utils.forEachPreferredTag = (tagName, arrayHandler, skipReportingBlockedTag = false) => {
1703-
const targetTagName = /** @type {string|false} */ (
1704-
utils.getPreferredTagName({
1705-
skipReportingBlockedTag,
1706-
tagName,
1707-
})
1645+
utils.forEachPreferredTag = (tagName, arrayHandler, skipReportingBlockedTag) => {
1646+
return jsdocUtils.forEachPreferredTag(
1647+
context, mode, report, tagNamePreference,
1648+
jsdoc, tagName, arrayHandler, skipReportingBlockedTag
17081649
);
1709-
if (!targetTagName ||
1710-
skipReportingBlockedTag && targetTagName && typeof targetTagName === 'object'
1711-
) {
1712-
return;
1713-
}
1714-
1715-
const matchingJsdocTags = jsdoc.tags.filter(({
1716-
tag,
1717-
}) => {
1718-
return tag === targetTagName;
1719-
});
1720-
1721-
for (const matchingJsdocTag of matchingJsdocTags) {
1722-
arrayHandler(
1723-
/**
1724-
* @type {import('@es-joy/jsdoccomment').JsdocTagWithInline}
1725-
*/ (
1726-
matchingJsdocTag
1727-
), targetTagName,
1728-
);
1729-
}
17301650
};
17311651

17321652
/** @type {FindContext} */
@@ -2030,8 +1950,8 @@ const iterate = (
20301950
!ruleConfig.checkPrivate && settings.ignorePrivate &&
20311951
(
20321952
utils.hasTag('private') ||
2033-
jsdoc.tags
2034-
.filter(({
1953+
jsdocUtils
1954+
.filterTags(jsdoc, ({
20351955
tag,
20361956
}) => {
20371957
return tag === 'access';

src/jsdocUtils.js

Lines changed: 164 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,52 @@ const getTagNamesForMode = (mode, context) => {
555555
}
556556
};
557557

558+
/**
559+
* @param {import('comment-parser').Spec} tg
560+
* @param {boolean} [returnArray]
561+
* @returns {string[]|string}
562+
*/
563+
const getTagDescription = (tg, returnArray) => {
564+
/**
565+
* @type {string[]}
566+
*/
567+
const descriptions = [];
568+
tg.source.some(({
569+
tokens: {
570+
end,
571+
lineEnd,
572+
postDelimiter,
573+
tag,
574+
postTag,
575+
name,
576+
type,
577+
description,
578+
},
579+
}) => {
580+
const desc = (
581+
tag && postTag ||
582+
!tag && !name && !type && postDelimiter || ''
583+
584+
// Remove space
585+
).slice(1) +
586+
(description || '') + (lineEnd || '');
587+
588+
if (end) {
589+
if (desc) {
590+
descriptions.push(desc);
591+
}
592+
593+
return true;
594+
}
595+
596+
descriptions.push(desc);
597+
598+
return false;
599+
});
600+
601+
return returnArray ? descriptions : descriptions.join('\n');
602+
};
603+
558604
/**
559605
* @param {import('eslint').Rule.RuleContext} context
560606
* @param {ParserMode|undefined} mode
@@ -565,7 +611,7 @@ const getTagNamesForMode = (mode, context) => {
565611
* replacement?: string|undefined;
566612
* }}
567613
*/
568-
const getPreferredTagName = (
614+
const getPreferredTagNameSimple = (
569615
context,
570616
mode,
571617
name,
@@ -649,6 +695,117 @@ const hasTag = (jsdoc, targetTagName) => {
649695
});
650696
};
651697

698+
/**
699+
* @param {import('./iterateJsdoc.js').JsdocBlockWithInline} jsdoc
700+
* @param {(tag: import('@es-joy/jsdoccomment').JsdocTagWithInline) => boolean} filter
701+
* @returns {import('@es-joy/jsdoccomment').JsdocTagWithInline[]}
702+
*/
703+
const filterTags = (jsdoc, filter) => {
704+
return jsdoc.tags.filter((tag) => {
705+
return filter(tag);
706+
});
707+
};
708+
709+
/**
710+
* @param {import('./iterateJsdoc.js').JsdocBlockWithInline} jsdoc
711+
* @param {string} tagName
712+
* @returns {import('comment-parser').Spec[]}
713+
*/
714+
const getTags = (jsdoc, tagName) => {
715+
return filterTags(jsdoc, (item) => {
716+
return item.tag === tagName;
717+
});
718+
};
719+
720+
/**
721+
* @param {import('eslint').Rule.RuleContext} context
722+
* @param {ParserMode} mode
723+
* @param {import('./iterateJsdoc.js').Report} report
724+
* @param {TagNamePreference} tagNamePreference
725+
* @param {import('./iterateJsdoc.js').JsdocBlockWithInline} jsdoc
726+
* @param {{
727+
* tagName: string,
728+
* skipReportingBlockedTag?: boolean,
729+
* allowObjectReturn?: boolean,
730+
* defaultMessage?: string
731+
* }} cfg
732+
* @returns {string|undefined|false|{
733+
* message: string;
734+
* replacement?: string|undefined;
735+
* }|{
736+
* blocked: true,
737+
* tagName: string
738+
* }}
739+
*/
740+
const getPreferredTagName = (context, mode, report, tagNamePreference, jsdoc, {
741+
tagName,
742+
skipReportingBlockedTag = false,
743+
allowObjectReturn = false,
744+
defaultMessage = `Unexpected tag \`@${tagName}\``,
745+
}) => {
746+
const ret = getPreferredTagNameSimple(context, mode, tagName, tagNamePreference);
747+
const isObject = ret && typeof ret === 'object';
748+
if (hasTag(jsdoc, tagName) && (ret === false || isObject && !ret.replacement)) {
749+
if (skipReportingBlockedTag) {
750+
return {
751+
blocked: true,
752+
tagName,
753+
};
754+
}
755+
756+
const message = isObject && ret.message || defaultMessage;
757+
report(message, null, getTags(jsdoc, tagName)[0]);
758+
759+
return false;
760+
}
761+
762+
return isObject && !allowObjectReturn ? ret.replacement : ret;
763+
};
764+
765+
/**
766+
* @param {import('eslint').Rule.RuleContext} context
767+
* @param {ParserMode} mode
768+
* @param {import('./iterateJsdoc.js').Report} report
769+
* @param {TagNamePreference} tagNamePreference
770+
* @param {import('./iterateJsdoc.js').JsdocBlockWithInline} jsdoc
771+
* @param {string} tagName
772+
* @param {(
773+
* matchingJsdocTag: import('@es-joy/jsdoccomment').JsdocTagWithInline,
774+
* targetTagName: string
775+
* ) => void} arrayHandler
776+
* @param {boolean} [skipReportingBlockedTag]
777+
* @returns {void}
778+
*/
779+
const forEachPreferredTag = (context, mode, report, tagNamePreference, jsdoc, tagName, arrayHandler, skipReportingBlockedTag = false) => {
780+
const targetTagName = /** @type {string|false} */ (
781+
getPreferredTagName(context, mode, report, tagNamePreference, jsdoc, {
782+
skipReportingBlockedTag,
783+
tagName,
784+
})
785+
);
786+
if (!targetTagName ||
787+
skipReportingBlockedTag && targetTagName && typeof targetTagName === 'object'
788+
) {
789+
return;
790+
}
791+
792+
const matchingJsdocTags = jsdoc.tags.filter(({
793+
tag,
794+
}) => {
795+
return tag === targetTagName;
796+
});
797+
798+
for (const matchingJsdocTag of matchingJsdocTags) {
799+
arrayHandler(
800+
/**
801+
* @type {import('@es-joy/jsdoccomment').JsdocTagWithInline}
802+
*/ (
803+
matchingJsdocTag
804+
), targetTagName,
805+
);
806+
}
807+
};
808+
652809
/**
653810
* Get all tags, inline tags and inline tags in tags
654811
* @param {import('./iterateJsdoc.js').JsdocBlockWithInline} jsdoc
@@ -1652,19 +1809,24 @@ const getRegexFromString = (regexString, requiredFlags) => {
16521809
return new RegExp(regex, flags);
16531810
};
16541811

1655-
export default {
1812+
export {
16561813
comparePaths,
16571814
dropPathSegmentQuotes,
16581815
enforcedContexts,
16591816
exemptSpeciaMethods,
1817+
filterTags,
16601818
flattenRoots,
1819+
forEachPreferredTag,
16611820
getAllTags,
16621821
getContextObject,
16631822
getFunctionParameterNames,
16641823
getIndent,
16651824
getJsdocTagsDeep,
16661825
getPreferredTagName,
1826+
getPreferredTagNameSimple,
16671827
getRegexFromString,
1828+
getTagDescription,
1829+
getTags,
16681830
getTagsByType,
16691831
getTagStructureForMode,
16701832
hasATag,

0 commit comments

Comments
 (0)