Skip to content

Commit 815eb00

Browse files
committed
fix(valid-types): report postfix nullable in object or labeled tuple position; fixes jsdoc-type-pratt-parser/jsdoc-type-pratt-parser#62
1 parent 4eaf868 commit 815eb00

File tree

3 files changed

+75
-2
lines changed

3 files changed

+75
-2
lines changed

docs/rules/valid-types.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,22 @@ function quux () {}
471471
*/
472472
function quux () {}
473473
// Message: Invalid name: invalid default value syntax
474+
475+
/**
476+
* @type {{message: string?}}
477+
*/
478+
function quux (items) {
479+
}
480+
// Settings: {"jsdoc":{"mode":"closure"}}
481+
// Message: Syntax error in type: JsdocTypeNullable
482+
483+
/**
484+
* @type {[message: string?]}
485+
*/
486+
function quux (items) {
487+
}
488+
// Settings: {"jsdoc":{"mode":"typescript"}}
489+
// Message: Syntax error in type: JsdocTypeNullable
474490
````
475491

476492

src/rules/validTypes.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,18 +143,35 @@ export default iterateJsdoc(({
143143
};
144144

145145
const validTypeParsing = function (type) {
146+
let parsedTypes;
146147
try {
147148
if (mode === 'permissive') {
148-
tryParse(type);
149+
parsedTypes = tryParse(type);
149150
} else {
150-
parse(type, mode);
151+
parsedTypes = parse(type, mode);
151152
}
152153
} catch {
153154
report(`Syntax error in type: ${type}`, null, tag);
154155

155156
return false;
156157
}
157158

159+
if (mode === 'closure' || mode === 'typescript') {
160+
traverse(parsedTypes, (node) => {
161+
const {
162+
type: typ,
163+
} = node;
164+
165+
if (
166+
(typ === 'JsdocTypeObjectField' || typ === 'JsdocTypeKeyValue') &&
167+
node.right.type === 'JsdocTypeNullable' &&
168+
node.right.meta.position === 'suffix'
169+
) {
170+
report(`Syntax error in type: ${node.right.type}`, null, tag);
171+
}
172+
});
173+
}
174+
158175
return true;
159176
};
160177

test/rules/assertions/validTypes.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,46 @@ export default {
10621062
},
10631063
],
10641064
},
1065+
{
1066+
code: `
1067+
/**
1068+
* @type {{message: string?}}
1069+
*/
1070+
function quux (items) {
1071+
}
1072+
`,
1073+
errors: [
1074+
{
1075+
line: 3,
1076+
message: 'Syntax error in type: JsdocTypeNullable',
1077+
},
1078+
],
1079+
settings: {
1080+
jsdoc: {
1081+
mode: 'closure',
1082+
},
1083+
},
1084+
},
1085+
{
1086+
code: `
1087+
/**
1088+
* @type {[message: string?]}
1089+
*/
1090+
function quux (items) {
1091+
}
1092+
`,
1093+
errors: [
1094+
{
1095+
line: 3,
1096+
message: 'Syntax error in type: JsdocTypeNullable',
1097+
},
1098+
],
1099+
settings: {
1100+
jsdoc: {
1101+
mode: 'typescript',
1102+
},
1103+
},
1104+
},
10651105
],
10661106
valid: [
10671107
{

0 commit comments

Comments
 (0)