Skip to content

Commit 1482f89

Browse files
committed
refactor: easier APIs
1 parent 270fbdc commit 1482f89

File tree

4 files changed

+70
-38
lines changed

4 files changed

+70
-38
lines changed

src/WarnSettings.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const WarnSettings = function () {
55
return {
66
/**
77
* Warn only once for each context and setting
8-
* @param {import('eslint').Rule.RuleContext} context
8+
* @param {{}} context
99
* @param {string} setting
1010
* @returns {boolean}
1111
*/
@@ -16,7 +16,7 @@ const WarnSettings = function () {
1616
},
1717

1818
/**
19-
* @param {import('eslint').Rule.RuleContext} context
19+
* @param {{}} context
2020
* @param {string} setting
2121
* @returns {void}
2222
*/

src/iterateJsdoc.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -629,10 +629,10 @@ const getBasicUtils = (context, {
629629
tagName,
630630
}) => {
631631
const ret = jsdocUtils.getPreferredTagNameSimple(
632-
context,
633-
/** @type {import('./jsdocUtils.js').ParserMode} */ (mode),
634632
tagName,
633+
/** @type {import('./jsdocUtils.js').ParserMode} */ (mode),
635634
tagNamePreference,
635+
context,
636636
);
637637
const isObject = ret && typeof ret === 'object';
638638
if (ret === false || (isObject && !ret.replacement)) {
@@ -1340,8 +1340,10 @@ const getUtils = (
13401340
/** @type {GetPreferredTagName} */
13411341
utils.getPreferredTagName = (args) => {
13421342
return jsdocUtils.getPreferredTagName(
1343-
context, mode, report, tagNamePreference,
1344-
jsdoc, args
1343+
jsdoc, {
1344+
...args,
1345+
context, mode, report, tagNamePreference,
1346+
}
13451347
);
13461348
};
13471349

@@ -1644,8 +1646,10 @@ const getUtils = (
16441646
/** @type {ForEachPreferredTag} */
16451647
utils.forEachPreferredTag = (tagName, arrayHandler, skipReportingBlockedTag) => {
16461648
return jsdocUtils.forEachPreferredTag(
1647-
context, mode, report, tagNamePreference,
1648-
jsdoc, tagName, arrayHandler, skipReportingBlockedTag
1649+
jsdoc, tagName, arrayHandler, {
1650+
skipReportingBlockedTag,
1651+
context, mode, report, tagNamePreference
1652+
}
16491653
);
16501654
};
16511655

src/jsdocUtils.js

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ const modeWarnSettings = WarnSettings();
521521

522522
/**
523523
* @param {ParserMode|undefined} mode
524-
* @param {import('eslint').Rule.RuleContext} context
524+
* @param {Reporter} context
525525
* @returns {import('./tagNames.js').AliasedTags}
526526
*/
527527
const getTagNamesForMode = (mode, context) => {
@@ -602,20 +602,30 @@ const getTagDescription = (tg, returnArray) => {
602602
};
603603

604604
/**
605-
* @param {import('eslint').Rule.RuleContext} context
606-
* @param {ParserMode|undefined} mode
605+
* @typedef {{
606+
* report: (descriptor: import('eslint').Rule.ReportDescriptor) => void
607+
* }} Reporter
608+
*/
609+
610+
/**
607611
* @param {string} name
612+
* @param {ParserMode|undefined} mode
608613
* @param {TagNamePreference} tagPreference
614+
* @param {Reporter} context
609615
* @returns {string|false|{
610616
* message: string;
611617
* replacement?: string|undefined;
612618
* }}
613619
*/
614620
const getPreferredTagNameSimple = (
615-
context,
616-
mode,
617621
name,
622+
mode,
618623
tagPreference = {},
624+
context = {
625+
report () {
626+
// No-op
627+
}
628+
},
619629
) => {
620630
const prefValues = Object.values(tagPreference);
621631
if (prefValues.includes(name) || prefValues.some((prefVal) => {
@@ -718,16 +728,16 @@ const getTags = (jsdoc, tagName) => {
718728
};
719729

720730
/**
721-
* @param {import('eslint').Rule.RuleContext} context
722-
* @param {ParserMode} mode
723-
* @param {import('./iterateJsdoc.js').Report} report
724-
* @param {TagNamePreference} tagNamePreference
725731
* @param {import('./iterateJsdoc.js').JsdocBlockWithInline} jsdoc
726732
* @param {{
727733
* tagName: string,
734+
* context: import('eslint').Rule.RuleContext,
735+
* mode: ParserMode,
736+
* report: import('./iterateJsdoc.js').Report
737+
* tagNamePreference: TagNamePreference
728738
* skipReportingBlockedTag?: boolean,
729739
* allowObjectReturn?: boolean,
730-
* defaultMessage?: string
740+
* defaultMessage?: string,
731741
* }} cfg
732742
* @returns {string|undefined|false|{
733743
* message: string;
@@ -737,13 +747,14 @@ const getTags = (jsdoc, tagName) => {
737747
* tagName: string
738748
* }}
739749
*/
740-
const getPreferredTagName = (context, mode, report, tagNamePreference, jsdoc, {
750+
const getPreferredTagName = (jsdoc, {
741751
tagName,
752+
context, mode, report, tagNamePreference,
742753
skipReportingBlockedTag = false,
743754
allowObjectReturn = false,
744755
defaultMessage = `Unexpected tag \`@${tagName}\``,
745756
}) => {
746-
const ret = getPreferredTagNameSimple(context, mode, tagName, tagNamePreference);
757+
const ret = getPreferredTagNameSimple(tagName, mode, tagNamePreference, context);
747758
const isObject = ret && typeof ret === 'object';
748759
if (hasTag(jsdoc, tagName) && (ret === false || isObject && !ret.replacement)) {
749760
if (skipReportingBlockedTag) {
@@ -763,24 +774,33 @@ const getPreferredTagName = (context, mode, report, tagNamePreference, jsdoc, {
763774
};
764775

765776
/**
766-
* @param {import('eslint').Rule.RuleContext} context
767-
* @param {ParserMode} mode
768-
* @param {import('./iterateJsdoc.js').Report} report
769-
* @param {TagNamePreference} tagNamePreference
770777
* @param {import('./iterateJsdoc.js').JsdocBlockWithInline} jsdoc
771778
* @param {string} tagName
772779
* @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+
* matchingJsdocTag: import('@es-joy/jsdoccomment').JsdocTagWithInline,
781+
* targetTagName: string
782+
* ) => void} arrayHandler
783+
* @param {object} cfg
784+
* @param {import('eslint').Rule.RuleContext} cfg.context
785+
* @param {ParserMode} cfg.mode
786+
* @param {import('./iterateJsdoc.js').Report} cfg.report
787+
* @param {TagNamePreference} cfg.tagNamePreference
788+
* @param {boolean} [cfg.skipReportingBlockedTag]
789+
* @returns {void}
790+
*/
791+
const forEachPreferredTag = (
792+
jsdoc, tagName, arrayHandler,
793+
{
794+
context, mode, report,
795+
tagNamePreference,
796+
skipReportingBlockedTag = false,
797+
}
798+
) => {
780799
const targetTagName = /** @type {string|false} */ (
781-
getPreferredTagName(context, mode, report, tagNamePreference, jsdoc, {
800+
getPreferredTagName(jsdoc, {
782801
skipReportingBlockedTag,
783802
tagName,
803+
context, mode, report, tagNamePreference
784804
})
785805
);
786806
if (!targetTagName ||

test/jsdocUtils.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,32 @@ describe('jsdocUtils', () => {
1212
context('no preferences', () => {
1313
context('alias name', () => {
1414
it('returns the primary tag name', () => {
15-
expect(jsdocUtils.getPreferredTagNameSimple(/** @type {BadArgument} */ ({}), 'jsdoc', 'return')).to.equal('returns');
15+
expect(jsdocUtils.getPreferredTagNameSimple(
16+
'return', 'jsdoc',
17+
)).to.equal('returns');
1618
});
1719
it('works with the constructor tag', () => {
18-
expect(jsdocUtils.getPreferredTagNameSimple(/** @type {BadArgument} */ ({}), 'jsdoc', 'constructor')).to.equal('class');
20+
expect(jsdocUtils.getPreferredTagNameSimple('constructor', 'jsdoc')).to.equal('class');
1921
});
2022
});
2123
it('works with tags that clash with prototype properties', () => {
22-
expect(jsdocUtils.getPreferredTagNameSimple(/** @type {BadArgument} */ ({}), 'jsdoc', 'toString')).to.equal('toString');
24+
expect(jsdocUtils.getPreferredTagNameSimple('toString', 'jsdoc')).to.equal('toString');
2325
});
2426
it('returns the primary tag name', () => {
25-
expect(jsdocUtils.getPreferredTagNameSimple(/** @type {BadArgument} */ ({}), 'jsdoc', 'returns')).to.equal('returns');
27+
expect(jsdocUtils.getPreferredTagNameSimple('returns', 'jsdoc')).to.equal('returns');
2628
});
2729
});
2830
context('with preferences', () => {
2931
it('returns the preferred tag name', () => {
30-
expect(jsdocUtils.getPreferredTagNameSimple(/** @type {BadArgument} */ ({}), 'jsdoc', 'return', /** @type {BadArgument} */ ({
32+
expect(jsdocUtils.getPreferredTagNameSimple('return', 'jsdoc', {
3133
returns: 'return',
32-
}))).to.equal('return');
34+
})).to.equal('return');
35+
});
36+
});
37+
38+
context('with context', () => {
39+
it('returns the preferred tag name', () => {
40+
expect(jsdocUtils.getPreferredTagNameSimple('returns', /** @type {BadArgument} */ ('badArg'))).to.equal('returns');
3341
});
3442
});
3543
});

0 commit comments

Comments
 (0)