eslint-plugin-jsdoc
Advanced tools
Comparing version 3.2.0 to 3.3.0
@@ -78,3 +78,13 @@ 'use strict'; | ||
var report = function report(message) { | ||
context.report(jsdocNode, message); | ||
var fixer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; | ||
if (fixer === null) { | ||
context.report(jsdocNode, message); | ||
} else { | ||
context.report({ | ||
fix: fixer, | ||
message, | ||
node: jsdocNode | ||
}); | ||
} | ||
}; | ||
@@ -87,5 +97,7 @@ | ||
functionNode, | ||
indent, | ||
jsdoc, | ||
jsdocNode, | ||
report, | ||
sourceCode, | ||
utils | ||
@@ -92,0 +104,0 @@ }); |
@@ -27,2 +27,4 @@ 'use strict'; | ||
var jsdoc = _ref.jsdoc, | ||
jsdocNode = _ref.jsdocNode, | ||
sourceCode = _ref.sourceCode, | ||
report = _ref.report; | ||
@@ -37,4 +39,8 @@ | ||
if (strictNativeType.toLowerCase() === jsdocTag.type.toLowerCase() && strictNativeType !== jsdocTag.type) { | ||
report('Invalid JSDoc @' + jsdocTag.tag + ' "' + jsdocTag.name + '" type "' + jsdocTag.type + '".'); | ||
var fix = function fix(fixer) { | ||
return fixer.replaceText(jsdocNode, sourceCode.getText(jsdocNode).replace('{' + jsdocTag.type + '}', '{' + strictNativeType + '}')); | ||
}; | ||
report('Invalid JSDoc @' + jsdocTag.tag + ' "' + jsdocTag.name + '" type "' + jsdocTag.type + '".', fix); | ||
return true; | ||
@@ -41,0 +47,0 @@ } |
@@ -20,3 +20,6 @@ 'use strict'; | ||
report = _ref.report, | ||
context = _ref.context; | ||
context = _ref.context, | ||
jsdocNode = _ref.jsdocNode, | ||
sourceCode = _ref.sourceCode, | ||
indent = _ref.indent; | ||
@@ -42,6 +45,26 @@ var always = void 0; | ||
if (!descriptionEndsWithANewline) { | ||
report('There must be a newline after the description of the JSDoc block.'); | ||
report('There must be a newline after the description of the JSDoc block.', function (fixer) { | ||
var sourceLines = sourceCode.getText(jsdocNode).split('\n'); | ||
var lastDescriptionLine = _lodash2.default.findLastIndex(sourceLines, function (line) { | ||
return _lodash2.default.includes(line, _lodash2.default.last(jsdoc.description.split('\n'))); | ||
}); | ||
// Add the new line | ||
sourceLines.splice(lastDescriptionLine + 1, 0, indent + ' * '); | ||
return fixer.replaceText(jsdocNode, sourceLines.join('\n')); | ||
}); | ||
} | ||
} else if (descriptionEndsWithANewline) { | ||
report('There must be no newline after the description of the JSDoc block.'); | ||
report('There must be no newline after the description of the JSDoc block.', function (fixer) { | ||
var sourceLines = sourceCode.getText(jsdocNode).split('\n'); | ||
var lastDescriptionLine = _lodash2.default.findLastIndex(sourceLines, function (line) { | ||
return _lodash2.default.includes(line, _lodash2.default.last(jsdoc.description.split('\n'))); | ||
}); | ||
// Remove the extra line | ||
sourceLines.splice(lastDescriptionLine + 1, 1); | ||
return fixer.replaceText(jsdocNode, sourceLines.join('\n')); | ||
}); | ||
} | ||
@@ -48,0 +71,0 @@ }); |
@@ -21,2 +21,12 @@ 'use strict'; | ||
var extractSentences = function extractSentences(text) { | ||
return text.split(/\.\s*/).filter(function (sentence) { | ||
// Ignore sentences with only whitespaces. | ||
return !/^\s*$/.test(sentence); | ||
}).map(function (sentence) { | ||
// Re-add the dot. | ||
return sentence + '.'; | ||
}); | ||
}; | ||
var isNewLinePrecededByAPeriod = function isNewLinePrecededByAPeriod(text) { | ||
@@ -42,3 +52,7 @@ var lastLineEndsSentence = void 0; | ||
var validateDescription = function validateDescription(description, report) { | ||
var capitalize = function capitalize(str) { | ||
return str.charAt(0).toUpperCase() + str.slice(1); | ||
}; | ||
var validateDescription = function validateDescription(description, report, jsdocNode, sourceCode) { | ||
if (!description) { | ||
@@ -50,16 +64,52 @@ return false; | ||
return _lodash2.default.some(paragraphs, function (paragraph, index) { | ||
if (!isCapitalized(paragraph)) { | ||
if (index === 0) { | ||
report('Description must start with an uppercase character.'); | ||
} else { | ||
report('Paragraph must start with an uppercase character.'); | ||
} | ||
return _lodash2.default.some(paragraphs, function (paragraph) { | ||
var sentences = extractSentences(paragraph); | ||
return true; | ||
if (_lodash2.default.some(sentences, function (sentence) { | ||
return !isCapitalized(sentence); | ||
})) { | ||
report('Sentence should start with an uppercase character.', function (fixer) { | ||
var text = sourceCode.getText(jsdocNode); | ||
var _iteratorNormalCompletion = true; | ||
var _didIteratorError = false; | ||
var _iteratorError = undefined; | ||
try { | ||
for (var _iterator = sentences.filter(function (sentence_) { | ||
return !isCapitalized(sentence_); | ||
})[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | ||
var sentence = _step.value; | ||
var beginning = sentence.split(/\n/)[0]; | ||
text = text.replace(beginning, capitalize(beginning)); | ||
} | ||
} catch (err) { | ||
_didIteratorError = true; | ||
_iteratorError = err; | ||
} finally { | ||
try { | ||
if (!_iteratorNormalCompletion && _iterator.return) { | ||
_iterator.return(); | ||
} | ||
} finally { | ||
if (_didIteratorError) { | ||
throw _iteratorError; | ||
} | ||
} | ||
} | ||
return fixer.replaceText(jsdocNode, text); | ||
}); | ||
} | ||
if (!/\.$/.test(paragraph)) { | ||
report('Sentence must end with a period.'); | ||
report('Sentence must end with a period.', function (fixer) { | ||
var line = _lodash2.default.last(paragraph.split('\n')); | ||
var replacement = sourceCode.getText(jsdocNode).replace(line, line + '.'); | ||
return fixer.replaceText(jsdocNode, replacement); | ||
}); | ||
return true; | ||
@@ -79,6 +129,8 @@ } | ||
exports.default = (0, _iterateJsdoc2.default)(function (_ref) { | ||
var jsdoc = _ref.jsdoc, | ||
report = _ref.report; | ||
var sourceCode = _ref.sourceCode, | ||
jsdoc = _ref.jsdoc, | ||
report = _ref.report, | ||
jsdocNode = _ref.jsdocNode; | ||
if (validateDescription(jsdoc.description, report)) { | ||
if (validateDescription(jsdoc.description, report, jsdocNode, sourceCode)) { | ||
return; | ||
@@ -94,3 +146,3 @@ } | ||
return validateDescription(description, report); | ||
return validateDescription(description, report, jsdocNode, sourceCode); | ||
}); | ||
@@ -97,0 +149,0 @@ }); |
@@ -18,4 +18,6 @@ 'use strict'; | ||
exports.default = (0, _iterateJsdoc2.default)(function (_ref) { | ||
var jsdoc = _ref.jsdoc, | ||
report = _ref.report; | ||
var sourceCode = _ref.sourceCode, | ||
jsdoc = _ref.jsdoc, | ||
report = _ref.report, | ||
jsdocNode = _ref.jsdocNode; | ||
@@ -28,3 +30,7 @@ var jsdocTags = _lodash2.default.filter(jsdoc.tags, { | ||
if (jsdocTag.description && !_lodash2.default.startsWith(jsdocTag.description, '-')) { | ||
report('There must be a hyphen before @param description.'); | ||
report('There must be a hyphen before @param description.', function (fixer) { | ||
var replacement = sourceCode.getText(jsdocNode).replace(jsdocTag.description, '- ' + jsdocTag.description); | ||
return fixer.replaceText(jsdocNode, replacement); | ||
}); | ||
} | ||
@@ -31,0 +37,0 @@ }); |
@@ -1,1 +0,1 @@ | ||
{"author":{"email":"gajus@gajus.com","name":"Gajus Kuizinas","url":"http://gajus.com"},"dependencies":{"comment-parser":"^0.4.2","lodash":"^4.17.4"},"description":"JSDoc linting rules for ESLint.","devDependencies":{"babel-cli":"^6.26.0","babel-plugin-add-module-exports":"^0.2.1","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-env":"^1.6.0","babel-preset-es2015":"^6.24.1","babel-register":"^6.26.0","chai":"^4.1.2","eslint":"^4.7.2","eslint-config-canonical":"^9.3.1","gitdown":"^2.5.1","globby":"^6.1.0","mocha":"^3.5.3","semantic-release":"^8.0.3"},"engines":{"node":">=4"},"keywords":["eslint","plugin","jsdoc"],"license":"BSD-3-Clause","main":"./dist/index.js","name":"eslint-plugin-jsdoc","peerDependencies":{"eslint":">=0.8.0"},"repository":{"type":"git","url":"https://github.com/gajus/eslint-plugin-jsdoc"},"scripts":{"add-assertions":"babel-node --presets es2015 ./bin/readme-assertions","build":"NODE_ENV=production babel ./src --out-dir ./dist --copy-files --source-maps","generate-readme":"gitdown ./.README/README.md --output-file ./README.md && npm run add-assertions","lint":"eslint ./src ./test","test":"mocha --recursive --compilers js:babel-register"},"version":"3.2.0"} | ||
{"author":{"email":"gajus@gajus.com","name":"Gajus Kuizinas","url":"http://gajus.com"},"dependencies":{"comment-parser":"^0.4.2","lodash":"^4.17.4"},"description":"JSDoc linting rules for ESLint.","devDependencies":{"babel-cli":"^6.26.0","babel-plugin-add-module-exports":"^0.2.1","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-env":"^1.6.0","babel-preset-es2015":"^6.24.1","babel-register":"^6.26.0","chai":"^4.1.2","eslint":"^4.7.2","eslint-config-canonical":"^9.3.1","gitdown":"^2.5.1","globby":"^6.1.0","mocha":"^3.5.3","semantic-release":"^8.0.3"},"engines":{"node":">=4"},"keywords":["eslint","plugin","jsdoc"],"license":"BSD-3-Clause","main":"./dist/index.js","name":"eslint-plugin-jsdoc","peerDependencies":{"eslint":">=0.8.0"},"repository":{"type":"git","url":"https://github.com/gajus/eslint-plugin-jsdoc"},"scripts":{"add-assertions":"babel-node --presets es2015 ./bin/readme-assertions","build":"NODE_ENV=production babel ./src --out-dir ./dist --copy-files --source-maps","generate-readme":"gitdown ./.README/README.md --output-file ./README.md && npm run add-assertions","lint":"eslint ./src ./test","test":"mocha --recursive --compilers js:babel-register"},"version":"3.3.0"} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
110128
847