eslint-plugin-jsdoc 46.0.0 → 46.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/iterateJsdoc.js +35 -7
- package/dist/iterateJsdoc.js.map +1 -1
- package/dist/rules/importsAsDependencies.js +68 -0
- package/dist/rules/importsAsDependencies.js.map +1 -0
- package/dist/rules/noMissingSyntax.js +5 -12
- package/dist/rules/noMissingSyntax.js.map +1 -1
- package/dist/rules/noRestrictedSyntax.js +7 -18
- package/dist/rules/noRestrictedSyntax.js.map +1 -1
- package/dist/rules/requireReturns.js +19 -1
- package/dist/rules/requireReturns.js.map +1 -1
- package/docs/rules/imports-as-dependencies.md +16 -0
- package/docs/rules/require-returns.md +27 -0
- package/package.json +1 -1
- package/tsconfig.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importsAsDependencies.js","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","_fs","_path","obj","__esModule","default","deps","pkg","JSON","parse","readFileSync","join","process","cwd","Set","dependencies","Object","keys","devDependencies","error","console","log","_default","iterateJsdoc","jsdoc","settings","utils","mode","tag","tags","typeAst","tryParse","type","traverse","nde","has","element","value","replace","reportJSDoc","iterateAllJsdocs","meta","docs","description","url","exports","module"],"sources":["../../src/rules/importsAsDependencies.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\nimport {\n parse,\n traverse,\n tryParse,\n} from '@es-joy/jsdoccomment';\nimport {\n readFileSync,\n} from 'fs';\nimport {\n join,\n} from 'path';\n\n/**\n * @type {Set<string>}\n */\nlet deps;\ntry {\n const pkg = JSON.parse(\n // @ts-expect-error It's ok\n readFileSync(join(process.cwd(), './package.json')),\n );\n deps = new Set([\n ...(pkg.dependencies ?\n Object.keys(pkg.dependencies) :\n // istanbul ignore next\n []),\n ...(pkg.devDependencies ?\n Object.keys(pkg.devDependencies) :\n // istanbul ignore next\n []),\n ]);\n} catch (error) {\n /* eslint-disable no-console -- Inform user */\n // istanbul ignore next\n console.log(error);\n /* eslint-enable no-console -- Inform user */\n}\n\nexport default iterateJsdoc(({\n jsdoc,\n settings,\n utils,\n}) => {\n // istanbul ignore if\n if (!deps) {\n return;\n }\n\n const {\n mode,\n } = settings;\n\n for (const tag of jsdoc.tags) {\n let typeAst;\n try {\n typeAst = mode === 'permissive' ? tryParse(tag.type) : parse(tag.type, mode);\n } catch {\n continue;\n }\n\n traverse(typeAst, (nde) => {\n if (nde.type === 'JsdocTypeImport' && !deps.has(nde.element.value.replace(\n /^(@[^/]+\\/[^/]+|[^/]+).*$/u, '$1',\n ))) {\n utils.reportJSDoc(\n 'import points to package which is not found in dependencies',\n tag,\n );\n }\n });\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports if JSDoc `import()` statements point to a package which is not listed in `dependencies` or `devDependencies`',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/imports-as-dependencies.md#repos-sticky-header',\n },\n type: 'suggestion',\n },\n});\n"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AAKA,IAAAE,GAAA,GAAAF,OAAA;AAGA,IAAAG,KAAA,GAAAH,OAAA;AAEc,SAAAD,uBAAAK,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEd;AACA;AACA;AACA,IAAIG,IAAI;AACR,IAAI;EACF,MAAMC,GAAG,GAAGC,IAAI,CAACC,KAAK;EACpB;EACA,IAAAC,gBAAY,EAAC,IAAAC,UAAI,EAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,CACpD,CAAC;EACDP,IAAI,GAAG,IAAIQ,GAAG,CAAC,CACb,IAAIP,GAAG,CAACQ,YAAY,GAClBC,MAAM,CAACC,IAAI,CAACV,GAAG,CAACQ,YAAY,CAAC;EAC7B;EACA,EAAE,CAAC,EACL,IAAIR,GAAG,CAACW,eAAe,GACrBF,MAAM,CAACC,IAAI,CAACV,GAAG,CAACW,eAAe,CAAC;EAChC;EACA,EAAE,CAAC,CACN,CAAC;AACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;EACd;EACA;EACAC,OAAO,CAACC,GAAG,CAACF,KAAK,CAAC;EAClB;AACF;AAAC,IAAAG,QAAA,GAEc,IAAAC,qBAAY,EAAC,CAAC;EAC3BC,KAAK;EACLC,QAAQ;EACRC;AACF,CAAC,KAAK;EACJ;EACA,IAAI,CAACpB,IAAI,EAAE;IACT;EACF;EAEA,MAAM;IACJqB;EACF,CAAC,GAAGF,QAAQ;EAEZ,KAAK,MAAMG,GAAG,IAAIJ,KAAK,CAACK,IAAI,EAAE;IAC5B,IAAIC,OAAO;IACX,IAAI;MACFA,OAAO,GAAGH,IAAI,KAAK,YAAY,GAAG,IAAAI,sBAAQ,EAACH,GAAG,CAACI,IAAI,CAAC,GAAG,IAAAvB,mBAAK,EAACmB,GAAG,CAACI,IAAI,EAAEL,IAAI,CAAC;IAC9E,CAAC,CAAC,MAAM;MACN;IACF;IAEA,IAAAM,sBAAQ,EAACH,OAAO,EAAGI,GAAG,IAAK;MACzB,IAAIA,GAAG,CAACF,IAAI,KAAK,iBAAiB,IAAI,CAAC1B,IAAI,CAAC6B,GAAG,CAACD,GAAG,CAACE,OAAO,CAACC,KAAK,CAACC,OAAO,CACvE,4BAA4B,EAAE,IAChC,CAAC,CAAC,EAAE;QACFZ,KAAK,CAACa,WAAW,CACf,6DAA6D,EAC7DX,GACF,CAAC;MACH;IACF,CAAC,CAAC;EACJ;AACF,CAAC,EAAE;EACDY,gBAAgB,EAAE,IAAI;EACtBC,IAAI,EAAE;IACJC,IAAI,EAAE;MACJC,WAAW,EAAE,sHAAsH;MACnIC,GAAG,EAAE;IACP,CAAC;IACDZ,IAAI,EAAE;EACR;AACF,CAAC,CAAC;AAAAa,OAAA,CAAAxC,OAAA,GAAAiB,QAAA;AAAAwB,MAAA,CAAAD,OAAA,GAAAA,OAAA,CAAAxC,OAAA"}
|
|
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
|
|
8
|
-
var _esquery = _interopRequireDefault(require("esquery"));
|
|
9
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
9
|
/**
|
|
11
10
|
* @typedef {{
|
|
@@ -46,12 +45,11 @@ const incrementSelector = (state, selector, comment) => {
|
|
|
46
45
|
};
|
|
47
46
|
var _default = (0, _iterateJsdoc.default)(({
|
|
48
47
|
context,
|
|
49
|
-
node,
|
|
50
48
|
info: {
|
|
51
49
|
comment
|
|
52
50
|
},
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
state,
|
|
52
|
+
utils
|
|
55
53
|
}) => {
|
|
56
54
|
if (!context.options[0]) {
|
|
57
55
|
// Handle error later
|
|
@@ -62,14 +60,9 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
62
60
|
* @type {Context[]}
|
|
63
61
|
*/
|
|
64
62
|
const contexts = context.options[0].contexts;
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}) : (!cntxt.context || cntxt.context === 'any' || _esquery.default.matches( /** @type {import('../iterateJsdoc.js').Node} */node, _esquery.default.parse(cntxt.context), undefined, {
|
|
69
|
-
visitorKeys: sourceCode.visitorKeys
|
|
70
|
-
})) && comment === cntxt.comment;
|
|
71
|
-
});
|
|
72
|
-
const contextStr = typeof foundContext === 'object' ? foundContext.context ?? 'any' : String(foundContext);
|
|
63
|
+
const {
|
|
64
|
+
contextStr
|
|
65
|
+
} = utils.findContext(contexts, comment);
|
|
73
66
|
setDefaults(state);
|
|
74
67
|
incrementSelector(state, contextStr, String(comment));
|
|
75
68
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noMissingSyntax.js","names":["_iterateJsdoc","_interopRequireDefault","require","_esquery","obj","__esModule","default","setDefaults","state","selectorMap","incrementSelector","selector","comment","_default","iterateJsdoc","context","node","info","sourceCode","options","contexts","foundContext","find","cntxt","esquery","matches","parse","undefined","visitorKeys","contextStr","String","contextSelected","exit","settings","length","report","loc","end","column","line","start","message","some","contextKey","minimum","Object","values","every","cmmnt","data","matchContext","meta","docs","description","url","fixable","schema","additionalProperties","properties","items","anyOf","type","exports","module"],"sources":["../../src/rules/noMissingSyntax.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\nimport esquery from 'esquery';\n\n/**\n * @typedef {{\n * comment: string,\n * context: string,\n * message: string,\n * minimum: import('../iterateJsdoc.js').Integer\n * }} ContextObject\n */\n\n/**\n * @typedef {string|ContextObject} Context\n */\n\n/**\n * @param {import('../iterateJsdoc.js').StateObject} state\n * @returns {void}\n */\nconst setDefaults = (state) => {\n if (!state.selectorMap) {\n state.selectorMap = {};\n }\n};\n\n/**\n * @param {import('../iterateJsdoc.js').StateObject} state\n * @param {string} selector\n * @param {string} comment\n * @returns {void}\n */\nconst incrementSelector = (state, selector, comment) => {\n if (!state.selectorMap[selector]) {\n state.selectorMap[selector] = {};\n }\n\n if (!state.selectorMap[selector][comment]) {\n state.selectorMap[selector][comment] = 0;\n }\n\n state.selectorMap[selector][comment]++;\n};\n\nexport default iterateJsdoc(({\n context,\n node,\n info: {\n comment,\n },\n sourceCode,\n state,\n}) => {\n if (!context.options[0]) {\n // Handle error later\n return;\n }\n\n /**\n * @type {Context[]}\n */\n const contexts = context.options[0].contexts;\n\n const foundContext = contexts.find((cntxt) => {\n return typeof cntxt === 'string' ?\n esquery.matches(\n /** @type {import('../iterateJsdoc.js').Node} */ (node),\n esquery.parse(cntxt),\n undefined,\n {\n visitorKeys: sourceCode.visitorKeys,\n },\n ) :\n (!cntxt.context || cntxt.context === 'any' ||\n esquery.matches(\n /** @type {import('../iterateJsdoc.js').Node} */ (node),\n esquery.parse(cntxt.context),\n undefined,\n {\n visitorKeys: sourceCode.visitorKeys,\n },\n )) && comment === cntxt.comment;\n });\n\n const contextStr = typeof foundContext === 'object' ?\n foundContext.context ?? 'any' :\n String(foundContext);\n\n setDefaults(state);\n\n incrementSelector(state, contextStr, String(comment));\n}, {\n contextSelected: true,\n exit ({\n context,\n settings,\n state,\n }) {\n if (!context.options.length && !settings.contexts) {\n context.report({\n loc: {\n end: {\n column: 1,\n line: 1,\n },\n start: {\n column: 1,\n line: 1,\n },\n },\n message: 'Rule `no-missing-syntax` is missing a `contexts` option.',\n });\n\n return;\n }\n\n setDefaults(state);\n\n /**\n * @type {Context[]}\n */\n const contexts = (context.options[0] ?? {}).contexts ?? settings?.contexts;\n\n // Report when MISSING\n contexts.some((cntxt) => {\n const contextStr = typeof cntxt === 'object' ? cntxt.context ?? 'any' : cntxt;\n const comment = typeof cntxt === 'string' ? '' : cntxt?.comment;\n\n const contextKey = contextStr === 'any' ? 'undefined' : contextStr;\n\n if (\n (!state.selectorMap[contextKey] ||\n !state.selectorMap[contextKey][comment] ||\n state.selectorMap[contextKey][comment] < (\n // @ts-expect-error comment would need an object, not string\n cntxt?.minimum ?? 1\n )) &&\n (contextStr !== 'any' || Object.values(state.selectorMap).every((cmmnt) => {\n return !cmmnt[comment] || cmmnt[comment] < (\n // @ts-expect-error comment would need an object, not string\n cntxt?.minimum ?? 1\n );\n }))\n ) {\n const message = typeof cntxt === 'string' ?\n 'Syntax is required: {{context}}' :\n cntxt?.message ?? ('Syntax is required: {{context}}' +\n (comment ? ' with {{comment}}' : ''));\n context.report({\n data: {\n comment,\n context: contextStr,\n },\n loc: {\n end: {\n column: 1,\n line: 1,\n },\n start: {\n column: 1,\n line: 1,\n },\n },\n message,\n });\n\n return true;\n }\n\n return false;\n });\n },\n matchContext: true,\n meta: {\n docs: {\n description: 'Reports when certain comment structures are always expected.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-missing-syntax.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n contexts: {\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n comment: {\n type: 'string',\n },\n context: {\n type: 'string',\n },\n message: {\n type: 'string',\n },\n minimum: {\n type: 'integer',\n },\n },\n type: 'object',\n },\n ],\n },\n type: 'array',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"noMissingSyntax.js","names":["_iterateJsdoc","_interopRequireDefault","require","obj","__esModule","default","setDefaults","state","selectorMap","incrementSelector","selector","comment","_default","iterateJsdoc","context","info","utils","options","contexts","contextStr","findContext","String","contextSelected","exit","settings","length","report","loc","end","column","line","start","message","some","cntxt","contextKey","minimum","Object","values","every","cmmnt","data","matchContext","meta","docs","description","url","fixable","schema","additionalProperties","properties","items","anyOf","type","exports","module"],"sources":["../../src/rules/noMissingSyntax.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\n/**\n * @typedef {{\n * comment: string,\n * context: string,\n * message: string,\n * minimum: import('../iterateJsdoc.js').Integer\n * }} ContextObject\n */\n\n/**\n * @typedef {string|ContextObject} Context\n */\n\n/**\n * @param {import('../iterateJsdoc.js').StateObject} state\n * @returns {void}\n */\nconst setDefaults = (state) => {\n if (!state.selectorMap) {\n state.selectorMap = {};\n }\n};\n\n/**\n * @param {import('../iterateJsdoc.js').StateObject} state\n * @param {string} selector\n * @param {string} comment\n * @returns {void}\n */\nconst incrementSelector = (state, selector, comment) => {\n if (!state.selectorMap[selector]) {\n state.selectorMap[selector] = {};\n }\n\n if (!state.selectorMap[selector][comment]) {\n state.selectorMap[selector][comment] = 0;\n }\n\n state.selectorMap[selector][comment]++;\n};\n\nexport default iterateJsdoc(({\n context,\n info: {\n comment,\n },\n state,\n utils,\n}) => {\n if (!context.options[0]) {\n // Handle error later\n return;\n }\n\n /**\n * @type {Context[]}\n */\n const contexts = context.options[0].contexts;\n\n const {\n contextStr,\n } = utils.findContext(contexts, comment);\n\n setDefaults(state);\n\n incrementSelector(state, contextStr, String(comment));\n}, {\n contextSelected: true,\n exit ({\n context,\n settings,\n state,\n }) {\n if (!context.options.length && !settings.contexts) {\n context.report({\n loc: {\n end: {\n column: 1,\n line: 1,\n },\n start: {\n column: 1,\n line: 1,\n },\n },\n message: 'Rule `no-missing-syntax` is missing a `contexts` option.',\n });\n\n return;\n }\n\n setDefaults(state);\n\n /**\n * @type {Context[]}\n */\n const contexts = (context.options[0] ?? {}).contexts ?? settings?.contexts;\n\n // Report when MISSING\n contexts.some((cntxt) => {\n const contextStr = typeof cntxt === 'object' ? cntxt.context ?? 'any' : cntxt;\n const comment = typeof cntxt === 'string' ? '' : cntxt?.comment;\n\n const contextKey = contextStr === 'any' ? 'undefined' : contextStr;\n\n if (\n (!state.selectorMap[contextKey] ||\n !state.selectorMap[contextKey][comment] ||\n state.selectorMap[contextKey][comment] < (\n // @ts-expect-error comment would need an object, not string\n cntxt?.minimum ?? 1\n )) &&\n (contextStr !== 'any' || Object.values(state.selectorMap).every((cmmnt) => {\n return !cmmnt[comment] || cmmnt[comment] < (\n // @ts-expect-error comment would need an object, not string\n cntxt?.minimum ?? 1\n );\n }))\n ) {\n const message = typeof cntxt === 'string' ?\n 'Syntax is required: {{context}}' :\n cntxt?.message ?? ('Syntax is required: {{context}}' +\n (comment ? ' with {{comment}}' : ''));\n context.report({\n data: {\n comment,\n context: contextStr,\n },\n loc: {\n end: {\n column: 1,\n line: 1,\n },\n start: {\n column: 1,\n line: 1,\n },\n },\n message,\n });\n\n return true;\n }\n\n return false;\n });\n },\n matchContext: true,\n meta: {\n docs: {\n description: 'Reports when certain comment structures are always expected.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-missing-syntax.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n contexts: {\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n comment: {\n type: 'string',\n },\n context: {\n type: 'string',\n },\n message: {\n type: 'string',\n },\n minimum: {\n type: 'integer',\n },\n },\n type: 'object',\n },\n ],\n },\n type: 'array',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
|
|
@@ -5,16 +5,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
|
|
8
|
-
var _esquery = _interopRequireDefault(require("esquery"));
|
|
9
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
9
|
var _default = (0, _iterateJsdoc.default)(({
|
|
11
|
-
node,
|
|
12
10
|
context,
|
|
13
11
|
info: {
|
|
14
12
|
comment
|
|
15
13
|
},
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
report,
|
|
15
|
+
utils
|
|
18
16
|
}) => {
|
|
19
17
|
if (!context.options.length) {
|
|
20
18
|
report('Rule `no-restricted-syntax` is missing a `contexts` option.');
|
|
@@ -23,26 +21,17 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
23
21
|
const {
|
|
24
22
|
contexts
|
|
25
23
|
} = context.options[0];
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
*/
|
|
31
|
-
cntxt => {
|
|
32
|
-
return typeof cntxt === 'string' ? _esquery.default.matches( /** @type {import('../iterateJsdoc.js').Node} */node, _esquery.default.parse(cntxt), undefined, {
|
|
33
|
-
visitorKeys: sourceCode.visitorKeys
|
|
34
|
-
}) : (!cntxt.context || cntxt.context === 'any' || _esquery.default.matches( /** @type {import('../iterateJsdoc.js').Node} */node, _esquery.default.parse(cntxt.context), undefined, {
|
|
35
|
-
visitorKeys: sourceCode.visitorKeys
|
|
36
|
-
})) && comment === cntxt.comment;
|
|
37
|
-
});
|
|
24
|
+
const {
|
|
25
|
+
foundContext,
|
|
26
|
+
contextStr
|
|
27
|
+
} = utils.findContext(contexts, comment);
|
|
38
28
|
|
|
39
29
|
// We are not on the *particular* matching context/comment, so don't assume
|
|
40
30
|
// we need reporting
|
|
41
31
|
if (!foundContext) {
|
|
42
32
|
return;
|
|
43
33
|
}
|
|
44
|
-
const
|
|
45
|
-
const message = (foundContext === null || foundContext === void 0 ? void 0 : foundContext.message) ?? 'Syntax is restricted: {{context}}' + (comment ? ' with {{comment}}' : '');
|
|
34
|
+
const message = /** @type {import('../iterateJsdoc.js').ContextObject} */(foundContext === null || foundContext === void 0 ? void 0 : foundContext.message) ?? 'Syntax is restricted: {{context}}' + (comment ? ' with {{comment}}' : '');
|
|
46
35
|
report(message, null, null, comment ? {
|
|
47
36
|
comment,
|
|
48
37
|
context: contextStr
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noRestrictedSyntax.js","names":["_iterateJsdoc","_interopRequireDefault","require","
|
|
1
|
+
{"version":3,"file":"noRestrictedSyntax.js","names":["_iterateJsdoc","_interopRequireDefault","require","obj","__esModule","default","_default","iterateJsdoc","context","info","comment","report","utils","options","length","contexts","foundContext","contextStr","findContext","message","contextSelected","meta","docs","description","url","fixable","schema","additionalProperties","properties","items","anyOf","type","required","nonGlobalSettings","exports","module"],"sources":["../../src/rules/noRestrictedSyntax.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n context,\n info: {\n comment,\n },\n report,\n utils,\n}) => {\n if (!context.options.length) {\n report('Rule `no-restricted-syntax` is missing a `contexts` option.');\n\n return;\n }\n\n const {\n contexts,\n } = context.options[0];\n\n const {\n foundContext,\n contextStr,\n } = utils.findContext(contexts, comment);\n\n // We are not on the *particular* matching context/comment, so don't assume\n // we need reporting\n if (!foundContext) {\n return;\n }\n\n const message = /** @type {import('../iterateJsdoc.js').ContextObject} */ (\n foundContext\n )?.message ??\n 'Syntax is restricted: {{context}}' +\n (comment ? ' with {{comment}}' : '');\n\n report(message, null, null, comment ? {\n comment,\n context: contextStr,\n } : {\n context: contextStr,\n });\n}, {\n contextSelected: true,\n meta: {\n docs: {\n description: 'Reports when certain comment structures are present.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-restricted-syntax.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n contexts: {\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n comment: {\n type: 'string',\n },\n context: {\n type: 'string',\n },\n message: {\n type: 'string',\n },\n },\n type: 'object',\n },\n ],\n },\n type: 'array',\n },\n },\n required: [\n 'contexts',\n ],\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n nonGlobalSettings: true,\n});\n"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA2C,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,IAAAG,QAAA,GAE5B,IAAAC,qBAAY,EAAC,CAAC;EAC3BC,OAAO;EACPC,IAAI,EAAE;IACJC;EACF,CAAC;EACDC,MAAM;EACNC;AACF,CAAC,KAAK;EACJ,IAAI,CAACJ,OAAO,CAACK,OAAO,CAACC,MAAM,EAAE;IAC3BH,MAAM,CAAC,6DAA6D,CAAC;IAErE;EACF;EAEA,MAAM;IACJI;EACF,CAAC,GAAGP,OAAO,CAACK,OAAO,CAAC,CAAC,CAAC;EAEtB,MAAM;IACJG,YAAY;IACZC;EACF,CAAC,GAAGL,KAAK,CAACM,WAAW,CAACH,QAAQ,EAAEL,OAAO,CAAC;;EAExC;EACA;EACA,IAAI,CAACM,YAAY,EAAE;IACjB;EACF;EAEA,MAAMG,OAAO,GAAG,yDAA0D,CACxEH,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CACXG,OAAO,KACR,mCAAmC,IAChCT,OAAO,GAAG,mBAAmB,GAAG,EAAE,CAAC;EAExCC,MAAM,CAACQ,OAAO,EAAE,IAAI,EAAE,IAAI,EAAET,OAAO,GAAG;IACpCA,OAAO;IACPF,OAAO,EAAES;EACX,CAAC,GAAG;IACFT,OAAO,EAAES;EACX,CAAC,CAAC;AACJ,CAAC,EAAE;EACDG,eAAe,EAAE,IAAI;EACrBC,IAAI,EAAE;IACJC,IAAI,EAAE;MACJC,WAAW,EAAE,sDAAsD;MACnEC,GAAG,EAAE;IACP,CAAC;IACDC,OAAO,EAAE,MAAM;IACfC,MAAM,EAAE,CACN;MACEC,oBAAoB,EAAE,KAAK;MAC3BC,UAAU,EAAE;QACVb,QAAQ,EAAE;UACRc,KAAK,EAAE;YACLC,KAAK,EAAE,CACL;cACEC,IAAI,EAAE;YACR,CAAC,EACD;cACEJ,oBAAoB,EAAE,KAAK;cAC3BC,UAAU,EAAE;gBACVlB,OAAO,EAAE;kBACPqB,IAAI,EAAE;gBACR,CAAC;gBACDvB,OAAO,EAAE;kBACPuB,IAAI,EAAE;gBACR,CAAC;gBACDZ,OAAO,EAAE;kBACPY,IAAI,EAAE;gBACR;cACF,CAAC;cACDA,IAAI,EAAE;YACR,CAAC;UAEL,CAAC;UACDA,IAAI,EAAE;QACR;MACF,CAAC;MACDC,QAAQ,EAAE,CACR,UAAU,CACX;MACDD,IAAI,EAAE;IACR,CAAC,CACF;IACDA,IAAI,EAAE;EACR,CAAC;EACDE,iBAAiB,EAAE;AACrB,CAAC,CAAC;AAAAC,OAAA,CAAA7B,OAAA,GAAAC,QAAA;AAAA6B,MAAA,CAAAD,OAAA,GAAAA,OAAA,CAAA7B,OAAA"}
|
|
@@ -33,11 +33,15 @@ const canSkip = utils => {
|
|
|
33
33
|
'interface']) || utils.avoidDocs();
|
|
34
34
|
};
|
|
35
35
|
var _default = (0, _iterateJsdoc.default)(({
|
|
36
|
+
info: {
|
|
37
|
+
comment
|
|
38
|
+
},
|
|
36
39
|
report,
|
|
37
40
|
utils,
|
|
38
41
|
context
|
|
39
42
|
}) => {
|
|
40
43
|
const {
|
|
44
|
+
contexts,
|
|
41
45
|
forceRequireReturn = false,
|
|
42
46
|
forceReturnsWithAsync = false
|
|
43
47
|
} = context.options[0] || {};
|
|
@@ -47,6 +51,17 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
47
51
|
if (canSkip(utils)) {
|
|
48
52
|
return;
|
|
49
53
|
}
|
|
54
|
+
|
|
55
|
+
/** @type {boolean|undefined} */
|
|
56
|
+
let forceRequireReturnContext;
|
|
57
|
+
if (contexts) {
|
|
58
|
+
const {
|
|
59
|
+
foundContext
|
|
60
|
+
} = utils.findContext(contexts, comment);
|
|
61
|
+
if (typeof foundContext === 'object') {
|
|
62
|
+
forceRequireReturnContext = foundContext.forceRequireReturn;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
50
65
|
const tagName = /** @type {string} */utils.getPreferredTagName({
|
|
51
66
|
tagName: 'returns'
|
|
52
67
|
});
|
|
@@ -66,7 +81,7 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
66
81
|
if (!missingReturnTag) {
|
|
67
82
|
return false;
|
|
68
83
|
}
|
|
69
|
-
if (forceRequireReturn && (iteratingFunction || utils.isVirtualFunction())) {
|
|
84
|
+
if ((forceRequireReturn || forceRequireReturnContext) && (iteratingFunction || utils.isVirtualFunction())) {
|
|
70
85
|
return true;
|
|
71
86
|
}
|
|
72
87
|
const isAsync = !iteratingFunction && utils.hasTag('async') || iteratingFunction && utils.isAsync();
|
|
@@ -108,6 +123,9 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
108
123
|
},
|
|
109
124
|
context: {
|
|
110
125
|
type: 'string'
|
|
126
|
+
},
|
|
127
|
+
forceRequireReturn: {
|
|
128
|
+
type: 'boolean'
|
|
111
129
|
}
|
|
112
130
|
},
|
|
113
131
|
type: 'object'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requireReturns.js","names":["_iterateJsdoc","_interopRequireDefault","require","obj","__esModule","default","canSkip","utils","hasATag","avoidDocs","_default","iterateJsdoc","report","context","forceRequireReturn","forceReturnsWithAsync","options","tagName","getPreferredTagName","tags","getTags","length","iteratingFunction","isIteratingFunction","tag","missingReturnTag","shouldReport","isVirtualFunction","isAsync","hasTag","hasValueOrExecutorHasNonEmptyResolveValue","contextDefaults","meta","docs","description","url","schema","additionalProperties","properties","checkConstructors","type","checkGetters","
|
|
1
|
+
{"version":3,"file":"requireReturns.js","names":["_iterateJsdoc","_interopRequireDefault","require","obj","__esModule","default","canSkip","utils","hasATag","avoidDocs","_default","iterateJsdoc","info","comment","report","context","contexts","forceRequireReturn","forceReturnsWithAsync","options","forceRequireReturnContext","foundContext","findContext","tagName","getPreferredTagName","tags","getTags","length","iteratingFunction","isIteratingFunction","tag","missingReturnTag","shouldReport","isVirtualFunction","isAsync","hasTag","hasValueOrExecutorHasNonEmptyResolveValue","contextDefaults","meta","docs","description","url","schema","additionalProperties","properties","checkConstructors","type","checkGetters","items","anyOf","exemptedBy","exports","module"],"sources":["../../src/rules/requireReturns.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\n/**\n * We can skip checking for a return value, in case the documentation is inherited\n * or the method is either a constructor or an abstract method.\n *\n * In either of these cases the return value is optional or not defined.\n * @param {import('../iterateJsdoc.js').Utils} utils\n * a reference to the utils which are used to probe if a tag is present or not.\n * @returns {boolean}\n * true in case deep checking can be skipped; otherwise false.\n */\nconst canSkip = (utils) => {\n return utils.hasATag([\n // inheritdoc implies that all documentation is inherited\n // see https://jsdoc.app/tags-inheritdoc.html\n //\n // Abstract methods are by definition incomplete,\n // so it is not an error if it declares a return value but does not implement it.\n 'abstract',\n 'virtual',\n\n // Constructors do not have a return value by definition (https://jsdoc.app/tags-class.html)\n // So we can bail out here, too.\n 'class',\n 'constructor',\n\n // Return type is specified by type in @type\n 'type',\n\n // This seems to imply a class as well\n 'interface',\n ]) ||\n utils.avoidDocs();\n};\n\nexport default iterateJsdoc(({\n info: {\n comment,\n },\n report,\n utils,\n context,\n}) => {\n const {\n contexts,\n forceRequireReturn = false,\n forceReturnsWithAsync = false,\n } = context.options[0] || {};\n\n // A preflight check. We do not need to run a deep check\n // in case the @returns comment is optional or undefined.\n if (canSkip(utils)) {\n return;\n }\n\n /** @type {boolean|undefined} */\n let forceRequireReturnContext;\n if (contexts) {\n const {\n foundContext,\n } = utils.findContext(contexts, comment);\n if (typeof foundContext === 'object') {\n forceRequireReturnContext = foundContext.forceRequireReturn;\n }\n }\n\n const tagName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'returns',\n }));\n if (!tagName) {\n return;\n }\n\n const tags = utils.getTags(tagName);\n\n if (tags.length > 1) {\n report(`Found more than one @${tagName} declaration.`);\n }\n\n const iteratingFunction = utils.isIteratingFunction();\n\n // In case the code returns something, we expect a return value in JSDoc.\n const [\n tag,\n ] = tags;\n const missingReturnTag = typeof tag === 'undefined' || tag === null;\n\n const shouldReport = () => {\n if (!missingReturnTag) {\n return false;\n }\n\n if ((forceRequireReturn || forceRequireReturnContext) && (\n iteratingFunction || utils.isVirtualFunction()\n )) {\n return true;\n }\n\n const isAsync = !iteratingFunction && utils.hasTag('async') ||\n iteratingFunction && utils.isAsync();\n\n if (forceReturnsWithAsync && isAsync) {\n return true;\n }\n\n return iteratingFunction && utils.hasValueOrExecutorHasNonEmptyResolveValue(\n forceReturnsWithAsync,\n );\n };\n\n if (shouldReport()) {\n report(`Missing JSDoc @${tagName} declaration.`);\n }\n}, {\n contextDefaults: true,\n meta: {\n docs: {\n description: 'Requires that returns are documented.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-returns.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n checkConstructors: {\n default: false,\n type: 'boolean',\n },\n checkGetters: {\n default: true,\n type: 'boolean',\n },\n contexts: {\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n comment: {\n type: 'string',\n },\n context: {\n type: 'string',\n },\n forceRequireReturn: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n },\n type: 'array',\n },\n exemptedBy: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n forceRequireReturn: {\n default: false,\n type: 'boolean',\n },\n forceReturnsWithAsync: {\n default: false,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA2C,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMG,OAAO,GAAIC,KAAK,IAAK;EACzB,OAAOA,KAAK,CAACC,OAAO,CAAC;EACnB;EACA;EACA;EACA;EACA;EACA,UAAU,EACV,SAAS;EAET;EACA;EACA,OAAO,EACP,aAAa;EAEb;EACA,MAAM;EAEN;EACA,WAAW,CACZ,CAAC,IACAD,KAAK,CAACE,SAAS,CAAC,CAAC;AACrB,CAAC;AAAC,IAAAC,QAAA,GAEa,IAAAC,qBAAY,EAAC,CAAC;EAC3BC,IAAI,EAAE;IACJC;EACF,CAAC;EACDC,MAAM;EACNP,KAAK;EACLQ;AACF,CAAC,KAAK;EACJ,MAAM;IACJC,QAAQ;IACRC,kBAAkB,GAAG,KAAK;IAC1BC,qBAAqB,GAAG;EAC1B,CAAC,GAAGH,OAAO,CAACI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;;EAE5B;EACA;EACA,IAAIb,OAAO,CAACC,KAAK,CAAC,EAAE;IAClB;EACF;;EAEA;EACA,IAAIa,yBAAyB;EAC7B,IAAIJ,QAAQ,EAAE;IACZ,MAAM;MACJK;IACF,CAAC,GAAGd,KAAK,CAACe,WAAW,CAACN,QAAQ,EAAEH,OAAO,CAAC;IACxC,IAAI,OAAOQ,YAAY,KAAK,QAAQ,EAAE;MACpCD,yBAAyB,GAAGC,YAAY,CAACJ,kBAAkB;IAC7D;EACF;EAEA,MAAMM,OAAO,GAAG,qBAAuBhB,KAAK,CAACiB,mBAAmB,CAAC;IAC/DD,OAAO,EAAE;EACX,CAAC,CAAE;EACH,IAAI,CAACA,OAAO,EAAE;IACZ;EACF;EAEA,MAAME,IAAI,GAAGlB,KAAK,CAACmB,OAAO,CAACH,OAAO,CAAC;EAEnC,IAAIE,IAAI,CAACE,MAAM,GAAG,CAAC,EAAE;IACnBb,MAAM,CAAE,wBAAuBS,OAAQ,eAAc,CAAC;EACxD;EAEA,MAAMK,iBAAiB,GAAGrB,KAAK,CAACsB,mBAAmB,CAAC,CAAC;;EAErD;EACA,MAAM,CACJC,GAAG,CACJ,GAAGL,IAAI;EACR,MAAMM,gBAAgB,GAAG,OAAOD,GAAG,KAAK,WAAW,IAAIA,GAAG,KAAK,IAAI;EAEnE,MAAME,YAAY,GAAGA,CAAA,KAAM;IACzB,IAAI,CAACD,gBAAgB,EAAE;MACrB,OAAO,KAAK;IACd;IAEA,IAAI,CAACd,kBAAkB,IAAIG,yBAAyB,MAClDQ,iBAAiB,IAAIrB,KAAK,CAAC0B,iBAAiB,CAAC,CAAC,CAC/C,EAAE;MACD,OAAO,IAAI;IACb;IAEA,MAAMC,OAAO,GAAG,CAACN,iBAAiB,IAAIrB,KAAK,CAAC4B,MAAM,CAAC,OAAO,CAAC,IACzDP,iBAAiB,IAAIrB,KAAK,CAAC2B,OAAO,CAAC,CAAC;IAEtC,IAAIhB,qBAAqB,IAAIgB,OAAO,EAAE;MACpC,OAAO,IAAI;IACb;IAEA,OAAON,iBAAiB,IAAIrB,KAAK,CAAC6B,yCAAyC,CACzElB,qBACF,CAAC;EACH,CAAC;EAED,IAAIc,YAAY,CAAC,CAAC,EAAE;IAClBlB,MAAM,CAAE,kBAAiBS,OAAQ,eAAc,CAAC;EAClD;AACF,CAAC,EAAE;EACDc,eAAe,EAAE,IAAI;EACrBC,IAAI,EAAE;IACJC,IAAI,EAAE;MACJC,WAAW,EAAE,uCAAuC;MACpDC,GAAG,EAAE;IACP,CAAC;IACDC,MAAM,EAAE,CACN;MACEC,oBAAoB,EAAE,KAAK;MAC3BC,UAAU,EAAE;QACVC,iBAAiB,EAAE;UACjBxC,OAAO,EAAE,KAAK;UACdyC,IAAI,EAAE;QACR,CAAC;QACDC,YAAY,EAAE;UACZ1C,OAAO,EAAE,IAAI;UACbyC,IAAI,EAAE;QACR,CAAC;QACD9B,QAAQ,EAAE;UACRgC,KAAK,EAAE;YACLC,KAAK,EAAE,CACL;cACEH,IAAI,EAAE;YACR,CAAC,EACD;cACEH,oBAAoB,EAAE,KAAK;cAC3BC,UAAU,EAAE;gBACV/B,OAAO,EAAE;kBACPiC,IAAI,EAAE;gBACR,CAAC;gBACD/B,OAAO,EAAE;kBACP+B,IAAI,EAAE;gBACR,CAAC;gBACD7B,kBAAkB,EAAE;kBAClB6B,IAAI,EAAE;gBACR;cACF,CAAC;cACDA,IAAI,EAAE;YACR,CAAC;UAEL,CAAC;UACDA,IAAI,EAAE;QACR,CAAC;QACDI,UAAU,EAAE;UACVF,KAAK,EAAE;YACLF,IAAI,EAAE;UACR,CAAC;UACDA,IAAI,EAAE;QACR,CAAC;QACD7B,kBAAkB,EAAE;UAClBZ,OAAO,EAAE,KAAK;UACdyC,IAAI,EAAE;QACR,CAAC;QACD5B,qBAAqB,EAAE;UACrBb,OAAO,EAAE,KAAK;UACdyC,IAAI,EAAE;QACR;MACF,CAAC;MACDA,IAAI,EAAE;IACR,CAAC,CACF;IACDA,IAAI,EAAE;EACR;AACF,CAAC,CAAC;AAAAK,OAAA,CAAA9C,OAAA,GAAAK,QAAA;AAAA0C,MAAA,CAAAD,OAAA,GAAAA,OAAA,CAAA9C,OAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<a name="user-content-imports-as-dependencies"></a>
|
|
2
|
+
<a name="imports-as-dependencies"></a>
|
|
3
|
+
### <code>imports-as-dependencies</code>
|
|
4
|
+
|
|
5
|
+
This rule will report an issue if JSDoc `import()` statements point to a package
|
|
6
|
+
which is not listed in `dependencies` or `devDependencies`.
|
|
7
|
+
|
|
8
|
+
|||
|
|
9
|
+
|---|---|
|
|
10
|
+
|Context|everywhere|
|
|
11
|
+
|Tags|``|
|
|
12
|
+
|Recommended|false|
|
|
13
|
+
|Settings||
|
|
14
|
+
|Options||
|
|
15
|
+
|
|
16
|
+
<!-- assertions importsAsDependencies -->
|
|
@@ -634,6 +634,20 @@ export default async function demo() {
|
|
|
634
634
|
return true;
|
|
635
635
|
}
|
|
636
636
|
// Message: Missing JSDoc @returns declaration.
|
|
637
|
+
|
|
638
|
+
/**
|
|
639
|
+
*
|
|
640
|
+
*/
|
|
641
|
+
function quux () {}
|
|
642
|
+
|
|
643
|
+
class Test {
|
|
644
|
+
/**
|
|
645
|
+
*
|
|
646
|
+
*/
|
|
647
|
+
abstract Test(): string;
|
|
648
|
+
}
|
|
649
|
+
// "jsdoc/require-returns": ["error"|"warn", {"contexts":["FunctionDeclaration",{"context":"TSEmptyBodyFunctionExpression","forceRequireReturn":true}]}]
|
|
650
|
+
// Message: Missing JSDoc @returns declaration.
|
|
637
651
|
````
|
|
638
652
|
|
|
639
653
|
|
|
@@ -1160,5 +1174,18 @@ export function readFixture(path: string): void;
|
|
|
1160
1174
|
* Reads a test fixture.
|
|
1161
1175
|
*/
|
|
1162
1176
|
export function readFixture(path: string);
|
|
1177
|
+
|
|
1178
|
+
/**
|
|
1179
|
+
*
|
|
1180
|
+
*/
|
|
1181
|
+
function quux () {}
|
|
1182
|
+
|
|
1183
|
+
class Test {
|
|
1184
|
+
/**
|
|
1185
|
+
* @returns {string} The test value
|
|
1186
|
+
*/
|
|
1187
|
+
abstract Test(): string;
|
|
1188
|
+
}
|
|
1189
|
+
// "jsdoc/require-returns": ["error"|"warn", {"contexts":["FunctionDeclaration",{"context":"TSEmptyBodyFunctionExpression","forceRequireReturn":true}]}]
|
|
1163
1190
|
````
|
|
1164
1191
|
|
package/package.json
CHANGED