Skip to content

Commit 8daed5b

Browse files
Exterskybrettz9
authored andcommitted
Add ancestorsOnly option
* also generated fixes for readme assertions with allowOverrideWithoutParam
1 parent b4497fe commit 8daed5b

File tree

5 files changed

+381
-12
lines changed

5 files changed

+381
-12
lines changed

.README/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ Finally, enable all of the rules that you would like to use.
126126

127127
This setting object supports the following keys:
128128

129+
- `ancestorsOnly` - Only check node ancestors to check if node is exported
129130
- `exports` - ESM exports are checked for JSDoc comments
130131
- `modules` - CommonJS exports are checked for JSDoc comments
131132
- `browserEnv` - Populates window variable

README.md

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ Finally, enable all of the rules that you would like to use.
177177

178178
This setting object supports the following keys:
179179

180+
- `ancestorsOnly` - Only check node ancestors to check if node is exported
180181
- `exports` - ESM exports are checked for JSDoc comments
181182
- `modules` - CommonJS exports are checked for JSDoc comments
182183
- `browserEnv` - Populates window variable
@@ -3543,6 +3544,13 @@ module.exports = function quux () {
35433544
// Options: [{"require":{"FunctionExpression":true}}]
35443545
// Message: Missing JSDoc comment.
35453546

3547+
module.exports = function quux () {
3548+
3549+
}
3550+
// Settings: {"jsdoc":{"publicOnly":{"ancestorsOnly":true}}}
3551+
// Options: [{"require":{"FunctionExpression":true}}]
3552+
// Message: Missing JSDoc comment.
3553+
35463554
module.exports = {
35473555
method: function() {
35483556

@@ -3563,6 +3571,17 @@ module.exports = {
35633571
// Options: [{"require":{"FunctionExpression":true}}]
35643572
// Message: Missing JSDoc comment.
35653573

3574+
module.exports = {
3575+
test: {
3576+
test2: function() {
3577+
3578+
}
3579+
}
3580+
}
3581+
// Settings: {"jsdoc":{"publicOnly":{"ancestorsOnly":true}}}
3582+
// Options: [{"require":{"FunctionExpression":true}}]
3583+
// Message: Missing JSDoc comment.
3584+
35663585
const test = module.exports = function () {
35673586

35683587
}
@@ -3619,6 +3638,13 @@ export default function quux () {
36193638
// Options: [{"require":{"FunctionExpression":true}}]
36203639
// Message: Missing JSDoc comment.
36213640

3641+
export default function quux () {
3642+
3643+
}
3644+
// Settings: {"jsdoc":{"publicOnly":{"ancestorsOnly":true}}}
3645+
// Options: [{"require":{"FunctionExpression":true}}]
3646+
// Message: Missing JSDoc comment.
3647+
36223648
function quux () {
36233649

36243650
}
@@ -3634,6 +3660,13 @@ export function test() {
36343660
// Options: [{"require":{"FunctionExpression":true}}]
36353661
// Message: Missing JSDoc comment.
36363662

3663+
export function test() {
3664+
3665+
}
3666+
// Settings: {"jsdoc":{"publicOnly":{"ancestorsOnly":true}}}
3667+
// Options: [{"require":{"FunctionExpression":true}}]
3668+
// Message: Missing JSDoc comment.
3669+
36373670
var test = function () {
36383671

36393672
}
@@ -3657,6 +3690,13 @@ export default class A {
36573690
// Settings: {"jsdoc":{"publicOnly":true}}
36583691
// Options: [{"require":{"ClassDeclaration":true}}]
36593692
// Message: Missing JSDoc comment.
3693+
3694+
export default class A {
3695+
3696+
}
3697+
// Settings: {"jsdoc":{"publicOnly":{"ancestorsOnly":true}}}
3698+
// Options: [{"require":{"ClassDeclaration":true}}]
3699+
// Message: Missing JSDoc comment.
36603700
````
36613701

36623702
The following patterns are not considered problems:
@@ -3928,6 +3968,15 @@ prop: { prop2: test }
39283968
// Settings: {"jsdoc":{"publicOnly":true}}
39293969
// Options: [{"require":{"ArrowFunctionExpression":true}}]
39303970

3971+
const test = () => {
3972+
3973+
}
3974+
module.exports = {
3975+
prop: { prop2: test }
3976+
}
3977+
// Settings: {"jsdoc":{"publicOnly":{"ancestorsOnly":true}}}
3978+
// Options: [{"require":{"ArrowFunctionExpression":true}}]
3979+
39313980
/**
39323981
*
39333982
*/
@@ -4011,6 +4060,15 @@ export default function quux () {
40114060
// Settings: {"jsdoc":{"publicOnly":true}}
40124061
// Options: [{"require":{"FunctionExpression":true}}]
40134062

4063+
/**
4064+
*
4065+
*/
4066+
export default function quux () {
4067+
4068+
}
4069+
// Settings: {"jsdoc":{"publicOnly":{"ancestorsOnly":true}}}
4070+
// Options: [{"require":{"FunctionExpression":true}}]
4071+
40144072
/**
40154073
*
40164074
*/
@@ -4021,6 +4079,13 @@ export default quux;
40214079
// Settings: {"jsdoc":{"publicOnly":true}}
40224080
// Options: [{"require":{"FunctionExpression":true}}]
40234081

4082+
function quux () {
4083+
4084+
}
4085+
export default quux;
4086+
// Settings: {"jsdoc":{"publicOnly":{"ancestorsOnly":true}}}
4087+
// Options: [{"require":{"FunctionExpression":true}}]
4088+
40244089
/**
40254090
*
40264091
*/
@@ -4030,6 +4095,15 @@ export function test() {
40304095
// Settings: {"jsdoc":{"publicOnly":true}}
40314096
// Options: [{"require":{"FunctionExpression":true}}]
40324097

4098+
/**
4099+
*
4100+
*/
4101+
export function test() {
4102+
4103+
}
4104+
// Settings: {"jsdoc":{"publicOnly":{"ancestorsOnly":true}}}
4105+
// Options: [{"require":{"FunctionExpression":true}}]
4106+
40334107
/**
40344108
*
40354109
*/
@@ -4050,6 +4124,15 @@ var test = function () {
40504124
export { test as test2 }
40514125
// Settings: {"jsdoc":{"publicOnly":true}}
40524126
// Options: [{"require":{"FunctionExpression":true}}]
4127+
4128+
/**
4129+
*
4130+
*/
4131+
export default class A {
4132+
4133+
}
4134+
// Settings: {"jsdoc":{"publicOnly":{"ancestorsOnly":true}}}
4135+
// Options: [{"require":{"ClassDeclaration":true}}]
40534136
````
40544137

40554138

@@ -4230,7 +4313,6 @@ The following patterns are considered problems:
42304313
function quux (foo) {
42314314

42324315
}
4233-
// Settings: {"jsdoc":{"allowOverrideWithoutParam":false}}
42344316
// Message: Missing JSDoc @param "foo" declaration.
42354317

42364318
/**
@@ -4256,7 +4338,7 @@ function quux (foo, bar) {
42564338
function quux (foo) {
42574339

42584340
}
4259-
// Settings: {"jsdoc":{"allowImplementsWithoutParam":false}}
4341+
// Settings: {"jsdoc":{"allowOverrideWithoutParam":false}}
42604342
// Message: Missing JSDoc @param "foo" declaration.
42614343

42624344
/**
@@ -4265,6 +4347,7 @@ function quux (foo) {
42654347
function quux (foo) {
42664348

42674349
}
4350+
// Settings: {"jsdoc":{"allowImplementsWithoutParam":false}}
42684351
// Message: Missing JSDoc @param "foo" declaration.
42694352

42704353
/**

src/exportParser.js

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -184,15 +184,20 @@ const initVariables = function (node, globals, opts) {
184184
};
185185

186186
// Populates variable maps using AST
187-
const mapVariables = function (node, globals) {
187+
const mapVariables = function (node, globals, opt) {
188+
const opts = opt || {};
188189
switch (node.type) {
189190
case 'Program': {
190-
node.body.forEach((childNode) => {
191-
mapVariables(childNode, globals);
192-
});
191+
if (opts.ancestorsOnly) {
192+
node.body.forEach((childNode) => {
193+
mapVariables(childNode, globals, opts);
194+
});
195+
} else {
196+
return false;
197+
}
193198
break;
194199
} case 'ExpressionStatement': {
195-
mapVariables(node.expression, globals);
200+
mapVariables(node.expression, globals, opts);
196201
break;
197202
} case 'AssignmentExpression': {
198203
createSymbol(node.left, globals, node.right);
@@ -221,7 +226,7 @@ const mapVariables = function (node, globals) {
221226
}
222227
}
223228
node.specifiers.forEach((specifier) => {
224-
mapVariables(specifier, globals);
229+
mapVariables(specifier, globals, opts);
225230
});
226231
break;
227232
} case 'ExportSpecifier': {
@@ -233,8 +238,12 @@ const mapVariables = function (node, globals) {
233238
} case 'ClassDeclaration': {
234239
createSymbol(node.id, globals, node.body, globals);
235240
break;
241+
} default: {
242+
return false;
236243
}
237244
}
245+
246+
return true;
238247
};
239248

240249
const findNode = function (node, block, cache) {
@@ -300,12 +309,25 @@ const isNodeExported = function (node, globals, opt) {
300309
return false;
301310
};
302311

303-
const parse = function (ast, opt) {
312+
const parseRecursive = function (node, globalVars, opts) {
313+
// Iterate from top using recursion - stop at first processed node from top
314+
if (node.parent) {
315+
if (parseRecursive(node.parent, globalVars, opts)) {
316+
return true;
317+
}
318+
}
319+
320+
return mapVariables(node, globalVars);
321+
};
322+
323+
const parse = function (ast, node, opt) {
304324
const opts = opt || {
325+
ancestorsOnly: false,
305326
exports: true,
306327
initModuleExports: true,
307328
initWindow: true
308329
};
330+
309331
const globalVars = createNode();
310332
if (opts.initModuleExports) {
311333
globalVars.props.module = createNode();
@@ -315,8 +337,13 @@ const parse = function (ast, opt) {
315337
if (opts.initWindow) {
316338
globalVars.props.window = globalVars;
317339
}
318-
initVariables(ast, globalVars, opts);
319-
mapVariables(ast, globalVars);
340+
341+
if (opts.ancestorsOnly) {
342+
parseRecursive(node, globalVars, opts);
343+
} else {
344+
initVariables(ast, globalVars, opts);
345+
mapVariables(ast, globalVars, {ancestorsOnly: true});
346+
}
320347

321348
return {
322349
globalVars

src/rules/requireJsdoc.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,12 @@ export default iterateJsdoc(null, {
103103
const publicOnly = _.get(context, 'settings.jsdoc.publicOnly');
104104
if (publicOnly) {
105105
const opt = {
106+
ancestorsOnly: Boolean(_.get(publicOnly, 'ancestorsOnly', false)),
106107
exports: Boolean(_.get(publicOnly, 'exports', true)),
107108
initModuleExports: Boolean(_.get(publicOnly, 'modules', true)),
108109
initWindow: Boolean(_.get(publicOnly, 'browserEnv', false))
109110
};
110-
const parseResult = exportParser.parse(sourceCode.ast, opt);
111+
const parseResult = exportParser.parse(sourceCode.ast, node, opt);
111112
const exported = exportParser.isExported(node, parseResult, opt);
112113

113114
if (exported && !jsDocNode) {

0 commit comments

Comments
 (0)