Skip to content

Commit 92dbe5c

Browse files
authored
Merge pull request #278 from golopot/refactor-settings
chore: move utils.<someSetting> to settings.<someSetting>
2 parents e4e63a6 + 482d0a5 commit 92dbe5c

File tree

4 files changed

+91
-150
lines changed

4 files changed

+91
-150
lines changed

src/iterateJsdoc.js

Lines changed: 72 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -25,28 +25,18 @@ const parseComment = (commentNode, indent) => {
2525
const curryUtils = (
2626
node,
2727
jsdoc,
28-
tagNamePreference,
29-
exampleCodeRegex,
30-
rejectExampleCodeRegex,
31-
additionalTagNames,
32-
baseConfig,
33-
configFile,
34-
captionRequired,
35-
matchingFileName,
36-
eslintrcForExamples,
37-
allowInlineConfig,
38-
allowEmptyNamepaths,
39-
reportUnusedDisableDirectives,
40-
noDefaultExampleRules,
41-
overrideReplacesDocs,
42-
implementsReplacesDocs,
43-
augmentsExtendsReplacesDocs,
44-
allowOverrideWithoutParam,
45-
allowImplementsWithoutParam,
46-
allowAugmentsExtendsWithoutParam,
47-
checkSeesForNamepaths,
48-
forceRequireReturn,
49-
avoidExampleOnConstructors,
28+
{
29+
tagNamePreference,
30+
additionalTagNames,
31+
allowEmptyNamepaths,
32+
overrideReplacesDocs,
33+
implementsReplacesDocs,
34+
augmentsExtendsReplacesDocs,
35+
allowOverrideWithoutParam,
36+
allowImplementsWithoutParam,
37+
allowAugmentsExtendsWithoutParam,
38+
checkSeesForNamepaths
39+
},
5040
ancestors,
5141
sourceCode,
5242
context
@@ -81,18 +71,6 @@ const curryUtils = (
8171
return jsdocUtils.getPreferredTagName(name, tagNamePreference);
8272
};
8373

84-
utils.getExampleCodeRegex = () => {
85-
return exampleCodeRegex;
86-
};
87-
88-
utils.getRejectExampleCodeRegex = () => {
89-
return rejectExampleCodeRegex;
90-
};
91-
92-
utils.getMatchingFileName = () => {
93-
return matchingFileName;
94-
};
95-
9674
utils.isValidTag = (name) => {
9775
return jsdocUtils.isValidTag(name, additionalTagNames);
9876
};
@@ -105,34 +83,6 @@ const curryUtils = (
10583
return jsdocUtils.hasTag(jsdoc, name);
10684
};
10785

108-
utils.useEslintrcForExamples = () => {
109-
return eslintrcForExamples;
110-
};
111-
112-
utils.allowInlineConfig = () => {
113-
return allowInlineConfig;
114-
};
115-
116-
utils.reportUnusedDisableDirectives = () => {
117-
return reportUnusedDisableDirectives;
118-
};
119-
120-
utils.hasNoDefaultExampleRules = () => {
121-
return noDefaultExampleRules;
122-
};
123-
124-
utils.getBaseConfig = () => {
125-
return baseConfig;
126-
};
127-
128-
utils.getConfigFile = () => {
129-
return configFile;
130-
};
131-
132-
utils.isCaptionRequired = () => {
133-
return captionRequired;
134-
};
135-
13686
// These settings are deprecated and may be removed in the future along with this method.
13787
utils.avoidDocsParamOnly = () => {
13888
// These three checks are all for deprecated settings and may be removed in the future
@@ -186,10 +136,6 @@ const curryUtils = (
186136
return jsdocUtils.isTagWithType(tagName);
187137
};
188138

189-
utils.avoidExampleOnConstructors = () => {
190-
return avoidExampleOnConstructors;
191-
};
192-
193139
utils.passesEmptyNamepathCheck = (tag) => {
194140
return !tag.name && allowEmptyNamepaths &&
195141
jsdocUtils.isPotentiallyEmptyNamepathTag(tag.tag);
@@ -209,10 +155,6 @@ const curryUtils = (
209155
});
210156
};
211157

212-
utils.isForceRequireReturn = () => {
213-
return forceRequireReturn;
214-
};
215-
216158
utils.filterTags = (filter) => {
217159
return (jsdoc.tags || []).filter(filter);
218160
};
@@ -257,11 +199,65 @@ const curryUtils = (
257199
return utils;
258200
};
259201

202+
const getSettings = (context) => {
203+
const settings = {};
204+
205+
// All rules
206+
settings.ignorePrivate = Boolean(_.get(context, 'settings.jsdoc.ignorePrivate'));
207+
208+
// `check-tag-names` and many require/param rules
209+
settings.tagNamePreference = _.get(context, 'settings.jsdoc.tagNamePreference') || {};
210+
211+
// `check-tag-names` only
212+
settings.additionalTagNames = _.get(context, 'settings.jsdoc.additionalTagNames') || {};
213+
214+
// `check-examples` only
215+
settings.exampleCodeRegex = _.get(context, 'settings.jsdoc.exampleCodeRegex') || null;
216+
settings.rejectExampleCodeRegex = _.get(context, 'settings.jsdoc.rejectExampleCodeRegex') || null;
217+
settings.matchingFileName = _.get(context, 'settings.jsdoc.matchingFileName') || null;
218+
settings.baseConfig = _.get(context, 'settings.jsdoc.baseConfig') || {};
219+
settings.configFile = _.get(context, 'settings.jsdoc.configFile');
220+
settings.eslintrcForExamples = _.get(context, 'settings.jsdoc.eslintrcForExamples') !== false;
221+
settings.allowInlineConfig = _.get(context, 'settings.jsdoc.allowInlineConfig') !== false;
222+
settings.reportUnusedDisableDirectives = _.get(context, 'settings.jsdoc.reportUnusedDisableDirectives') !== false;
223+
settings.captionRequired = Boolean(_.get(context, 'settings.jsdoc.captionRequired'));
224+
settings.noDefaultExampleRules = Boolean(_.get(context, 'settings.jsdoc.noDefaultExampleRules'));
225+
226+
// `require-param`, `require-description`, `require-example`, `require-returns`
227+
settings.overrideReplacesDocs = _.get(context, 'settings.jsdoc.overrideReplacesDocs');
228+
settings.implementsReplacesDocs = _.get(context, 'settings.jsdoc.implementsReplacesDocs');
229+
settings.augmentsExtendsReplacesDocs = _.get(context, 'settings.jsdoc.augmentsExtendsReplacesDocs');
230+
231+
// `require-param` only (deprecated)
232+
settings.allowOverrideWithoutParam = _.get(context, 'settings.jsdoc.allowOverrideWithoutParam');
233+
settings.allowImplementsWithoutParam = _.get(context, 'settings.jsdoc.allowImplementsWithoutParam');
234+
settings.allowAugmentsExtendsWithoutParam = _.get(context, 'settings.jsdoc.allowAugmentsExtendsWithoutParam');
235+
236+
// `valid-types` only
237+
settings.allowEmptyNamepaths = _.get(context, 'settings.jsdoc.allowEmptyNamepaths') !== false;
238+
settings.checkSeesForNamepaths = Boolean(_.get(context, 'settings.jsdoc.checkSeesForNamepaths'));
239+
240+
// `require-returns` only
241+
settings.forceRequireReturn = Boolean(_.get(context, 'settings.jsdoc.forceRequireReturn'));
242+
243+
// `require-example` only
244+
settings.avoidExampleOnConstructors = Boolean(_.get(context, 'settings.jsdoc.avoidExampleOnConstructors'));
245+
246+
return settings;
247+
};
248+
260249
export {
261250
parseComment
262251
};
263252

264-
export default (iterator, opts = {}) => {
253+
/**
254+
* @typedef {ReturnType<typeof curryUtils>} Utils
255+
* @typedef {ReturnType<typeof getSettings>} Settings
256+
*
257+
* @param {(arg: {utils: Utils, settings: Settings}) => any} iterator
258+
* @param {{returns?: any}} opts
259+
*/
260+
export default function iterateJsdoc (iterator, opts = {}) {
265261
return {
266262
/**
267263
* The entrypoint for the JSDoc rule.
@@ -275,46 +271,7 @@ export default (iterator, opts = {}) => {
275271
create (context) {
276272
const sourceCode = context.getSourceCode();
277273

278-
// All rules
279-
const ignorePrivate = Boolean(_.get(context, 'settings.jsdoc.ignorePrivate'));
280-
281-
// `check-tag-names` and many require/param rules
282-
const tagNamePreference = _.get(context, 'settings.jsdoc.tagNamePreference') || {};
283-
284-
// `check-tag-names` only
285-
const additionalTagNames = _.get(context, 'settings.jsdoc.additionalTagNames') || {};
286-
287-
// `check-examples` only
288-
const exampleCodeRegex = _.get(context, 'settings.jsdoc.exampleCodeRegex') || null;
289-
const rejectExampleCodeRegex = _.get(context, 'settings.jsdoc.rejectExampleCodeRegex') || null;
290-
const matchingFileName = _.get(context, 'settings.jsdoc.matchingFileName') || null;
291-
const baseConfig = _.get(context, 'settings.jsdoc.baseConfig') || {};
292-
const configFile = _.get(context, 'settings.jsdoc.configFile');
293-
const eslintrcForExamples = _.get(context, 'settings.jsdoc.eslintrcForExamples') !== false;
294-
const allowInlineConfig = _.get(context, 'settings.jsdoc.allowInlineConfig') !== false;
295-
const reportUnusedDisableDirectives = _.get(context, 'settings.jsdoc.reportUnusedDisableDirectives') !== false;
296-
const captionRequired = Boolean(_.get(context, 'settings.jsdoc.captionRequired'));
297-
const noDefaultExampleRules = Boolean(_.get(context, 'settings.jsdoc.noDefaultExampleRules'));
298-
299-
// `require-param`, `require-description`, `require-example`, `require-returns`
300-
const overrideReplacesDocs = _.get(context, 'settings.jsdoc.overrideReplacesDocs');
301-
const implementsReplacesDocs = _.get(context, 'settings.jsdoc.implementsReplacesDocs');
302-
const augmentsExtendsReplacesDocs = _.get(context, 'settings.jsdoc.augmentsExtendsReplacesDocs');
303-
304-
// `require-param` only (deprecated)
305-
const allowOverrideWithoutParam = _.get(context, 'settings.jsdoc.allowOverrideWithoutParam');
306-
const allowImplementsWithoutParam = _.get(context, 'settings.jsdoc.allowImplementsWithoutParam');
307-
const allowAugmentsExtendsWithoutParam = _.get(context, 'settings.jsdoc.allowAugmentsExtendsWithoutParam');
308-
309-
// `valid-types` only
310-
const allowEmptyNamepaths = _.get(context, 'settings.jsdoc.allowEmptyNamepaths') !== false;
311-
const checkSeesForNamepaths = Boolean(_.get(context, 'settings.jsdoc.checkSeesForNamepaths'));
312-
313-
// `require-returns` only
314-
const forceRequireReturn = Boolean(_.get(context, 'settings.jsdoc.forceRequireReturn'));
315-
316-
// `require-example` only
317-
const avoidExampleOnConstructors = Boolean(_.get(context, 'settings.jsdoc.avoidExampleOnConstructors'));
274+
const settings = getSettings(context);
318275

319276
const checkJsdoc = (node) => {
320277
const jsdocNode = getJSDocComment(sourceCode, node);
@@ -359,34 +316,13 @@ export default (iterator, opts = {}) => {
359316
const utils = curryUtils(
360317
node,
361318
jsdoc,
362-
tagNamePreference,
363-
exampleCodeRegex,
364-
rejectExampleCodeRegex,
365-
additionalTagNames,
366-
baseConfig,
367-
configFile,
368-
captionRequired,
369-
matchingFileName,
370-
eslintrcForExamples,
371-
allowInlineConfig,
372-
allowEmptyNamepaths,
373-
reportUnusedDisableDirectives,
374-
noDefaultExampleRules,
375-
overrideReplacesDocs,
376-
implementsReplacesDocs,
377-
augmentsExtendsReplacesDocs,
378-
allowOverrideWithoutParam,
379-
allowImplementsWithoutParam,
380-
allowAugmentsExtendsWithoutParam,
381-
checkSeesForNamepaths,
382-
forceRequireReturn,
383-
avoidExampleOnConstructors,
319+
settings,
384320
ancestors,
385321
sourceCode
386322
);
387323

388324
if (
389-
ignorePrivate &&
325+
settings.ignorePrivate &&
390326
utils.hasTag('private')
391327
) {
392328
return;
@@ -399,6 +335,7 @@ export default (iterator, opts = {}) => {
399335
jsdocNode,
400336
node,
401337
report,
338+
settings,
402339
sourceCode,
403340
utils
404341
});
@@ -427,4 +364,4 @@ export default (iterator, opts = {}) => {
427364
},
428365
meta: opts.meta
429366
};
430-
};
367+
}

src/rules/checkExamples.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,19 @@ const countChars = (str, ch) => {
1515

1616
export default iterateJsdoc(({
1717
report,
18-
utils
18+
utils,
19+
settings
1920
}) => {
20-
let exampleCodeRegex = utils.getExampleCodeRegex();
21-
let rejectExampleCodeRegex = utils.getRejectExampleCodeRegex();
22-
const noDefaultExampleRules = utils.hasNoDefaultExampleRules();
23-
const eslintrcForExamples = utils.useEslintrcForExamples();
24-
const filename = utils.getMatchingFileName();
25-
const baseConfig = utils.getBaseConfig();
26-
const configFile = utils.getConfigFile();
27-
const allowInlineConfig = utils.allowInlineConfig();
28-
const reportUnusedDisableDirectives = utils.reportUnusedDisableDirectives();
21+
let {exampleCodeRegex, rejectExampleCodeRegex} = settings;
22+
const {
23+
noDefaultExampleRules,
24+
eslintrcForExamples,
25+
matchingFileName: filename,
26+
baseConfig,
27+
configFile,
28+
allowInlineConfig,
29+
reportUnusedDisableDirectives
30+
} = settings;
2931

3032
// Make this configurable?
3133
const rulePaths = [];
@@ -69,7 +71,7 @@ export default iterateJsdoc(({
6971
let source = tag.source.slice(initialTagLength);
7072
const match = source.match(hasCaptionRegex);
7173

72-
if (utils.isCaptionRequired() && !match) {
74+
if (settings.captionRequired && !match) {
7375
report('Caption is expected for examples.', null, tag);
7476
}
7577

src/rules/requireExample.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import iterateJsdoc from '../iterateJsdoc';
44
export default iterateJsdoc(({
55
jsdoc,
66
report,
7-
utils
7+
utils,
8+
settings
89
}) => {
910
if (utils.avoidDocs()) {
1011
return;
@@ -16,7 +17,7 @@ export default iterateJsdoc(({
1617
tag: targetTagName
1718
});
1819

19-
if (utils.avoidExampleOnConstructors() && (
20+
if (settings.avoidExampleOnConstructors && (
2021
utils.hasATag([
2122
'class',
2223
'constructor'

src/rules/requireReturns.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ const canSkip = (utils) => {
3939

4040
export default iterateJsdoc(({
4141
report,
42-
utils
42+
utils,
43+
settings
4344
}) => {
4445
// A preflight check. We do not need to run a deep check
4546
// in case the @returns comment is optional or undefined.
@@ -58,7 +59,7 @@ export default iterateJsdoc(({
5859
const [tag] = tags;
5960
const missingReturnTag = typeof tag === 'undefined' || tag === null;
6061
if (missingReturnTag &&
61-
(utils.hasReturnValue() || utils.isForceRequireReturn())
62+
(utils.hasReturnValue() || settings.forceRequireReturn)
6263
) {
6364
report('Missing JSDoc @' + tagName + ' declaration.');
6465
}

0 commit comments

Comments
 (0)