Skip to content

Commit

Permalink
Add types for assignDisabledRanges.js (#4354)
Browse files Browse the repository at this point in the history
* add types to assignDisabledRanges

* add @types/lodash and types for stylelint
  • Loading branch information
vankop authored and hudochenkov committed Oct 15, 2019
1 parent 97809b3 commit 94c7a28
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 20 deletions.
128 changes: 108 additions & 20 deletions lib/assignDisabledRanges.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,19 @@ const ALL_RULES = 'all';
[ruleName: string]: Array<disableRange>
}*/

/** @typedef {import('postcss').Comment} PostcssComment */
/** @typedef {import('postcss').Root} PostcssRoot */
/** @typedef {import('stylelint').PostcssResult} PostcssResult */
/** @typedef {import('stylelint').DisabledRangeObject} DisabledRangeObject */
/** @typedef {import('stylelint').DisabledRange} DisabledRange */

/**
* @param {number} start
* @param {boolean} strictStart
* @param {number} [end]
* @param {boolean} [strictEnd]
* @returns {DisabledRange}
*/
function createDisableRange(
start /*: number*/,
strictStart /*: boolean*/,
Expand All @@ -36,12 +49,23 @@ function createDisableRange(
};
}

// Run it like a plugin ...
/**
* Run it like a plugin ...
* @param {PostcssRoot} root
* @param {PostcssResult} result
* @returns {PostcssResult}
*/
module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$result*/ {
result.stylelint = result.stylelint || {};
result.stylelint = result.stylelint || {
disabledRanges: {},
ruleSeverities: {},
customMessages: {},
};

// Most of the functions below work via side effects mutating
// this object
/**
* Most of the functions below work via side effects mutating this object
* @type {DisabledRangeObject}
*/
const disabledRanges /*: disabledRangeObject*/ = {
all: [],
};
Expand All @@ -51,18 +75,37 @@ module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$re

return result;

/**
* @param {PostcssComment} comment
*/
function processDisableLineCommand(comment /*: postcss$comment*/) {
getCommandRules(disableLineCommand, comment.text).forEach((ruleName) => {
disableLine(comment.source.start.line, ruleName, comment);
});
if (comment.source && comment.source.start) {
const line = comment.source.start.line;

getCommandRules(disableLineCommand, comment.text).forEach((ruleName) => {
disableLine(line, ruleName, comment);
});
}
}

/**
* @param {PostcssComment} comment
*/
function processDisableNextLineCommand(comment /*: postcss$comment*/) {
getCommandRules(disableNextLineCommand, comment.text).forEach((ruleName) => {
disableLine(comment.source.start.line + 1, ruleName, comment);
});
if (comment.source && comment.source.start) {
const line = comment.source.start.line;

getCommandRules(disableNextLineCommand, comment.text).forEach((ruleName) => {
disableLine(line + 1, ruleName, comment);
});
}
}

/**
* @param {number} line
* @param {string} ruleName
* @param {PostcssComment} comment
*/
function disableLine(line /*: number*/, ruleName /*: string*/, comment /*: postcss$comment*/) {
if (ruleIsDisabled(ALL_RULES)) {
throw comment.error('All rules have already been disabled', {
Expand All @@ -89,6 +132,9 @@ module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$re
}
}

/**
* @param {PostcssComment} comment
*/
function processDisableCommand(comment /*: postcss$comment*/) {
getCommandRules(disableCommand, comment.text).forEach((ruleToDisable) => {
const isAllRules = ruleToDisable === ALL_RULES;
Expand All @@ -104,19 +150,32 @@ module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$re
);
}

if (isAllRules) {
Object.keys(disabledRanges).forEach((ruleName) => {
startDisabledRange(comment.source.start.line, ruleName, ruleName === ALL_RULES);
});
} else {
startDisabledRange(comment.source.start.line, ruleToDisable, true);
if (comment.source && comment.source.start) {
const line = comment.source.start.line;

if (isAllRules) {
Object.keys(disabledRanges).forEach((ruleName) => {
startDisabledRange(line, ruleName, ruleName === ALL_RULES);
});
} else {
startDisabledRange(line, ruleToDisable, true);
}
}
});
}

/**
* @param {PostcssComment} comment
*/
function processEnableCommand(comment /*: postcss$comment*/) {
getCommandRules(enableCommand, comment.text).forEach((ruleToEnable) => {
// TODO TYPES
// need fallback if endLine will be undefined
const endLine =
/** @type {number} */ (comment.source && comment.source.end && comment.source.end.line);

if (ruleToEnable === ALL_RULES) {
// @ts-ignore https://github.com/stylelint/stylelint/issues/4328
if (_.values(disabledRanges).every((ranges) => _.isEmpty(ranges) || !!_.last(ranges.end))) {
throw comment.error('No rules have been disabled', {
plugin: 'stylelint',
Expand All @@ -125,7 +184,7 @@ module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$re

Object.keys(disabledRanges).forEach((ruleName) => {
if (!_.get(_.last(disabledRanges[ruleName]), 'end')) {
endDisabledRange(comment.source.end.line, ruleName, ruleName === ALL_RULES);
endDisabledRange(endLine, ruleName, ruleName === ALL_RULES);
}
});

Expand All @@ -139,16 +198,20 @@ module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$re
createDisableRange(start, false, end, false),
);
} else {
disabledRanges[ruleToEnable].push(_.clone(_.last(disabledRanges[ALL_RULES])));
const range = _.clone(_.last(disabledRanges[ALL_RULES]));

if (range) {
disabledRanges[ruleToEnable].push(range);
}
}

endDisabledRange(comment.source.end.line, ruleToEnable, true);
endDisabledRange(endLine, ruleToEnable, true);

return;
}

if (ruleIsDisabled(ruleToEnable)) {
endDisabledRange(comment.source.end.line, ruleToEnable, true);
endDisabledRange(endLine, ruleToEnable, true);

return;
}
Expand All @@ -159,6 +222,9 @@ module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$re
});
}

/**
* @param {PostcssComment} comment
*/
function checkComment(comment /*: postcss$comment*/) {
const text = comment.text;

Expand All @@ -179,6 +245,11 @@ module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$re
}
}

/**
* @param {string} command
* @param {string} fullText
* @returns {string[]}
*/
function getCommandRules(command /*: string*/, fullText /*: string*/) /*: Array<string>*/ {
const rules = _.compact(fullText.slice(command.length).split(',')).map((r) => r.trim());

Expand All @@ -189,13 +260,23 @@ module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$re
return rules;
}

/**
* @param {number} line
* @param {string} ruleName
* @param {boolean} strict
*/
function startDisabledRange(line /*: number*/, ruleName /*: string*/, strict /*: boolean*/) {
const rangeObj = createDisableRange(line, strict);

ensureRuleRanges(ruleName);
disabledRanges[ruleName].push(rangeObj);
}

/**
* @param {number} line
* @param {string} ruleName
* @param {boolean} strict
*/
function endDisabledRange(line /*: number*/, ruleName /*: string*/, strict /*: boolean*/) {
const lastRangeForRule = _.last(disabledRanges[ruleName]);

Expand All @@ -208,6 +289,9 @@ module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$re
lastRangeForRule.strictEnd = strict;
}

/**
* @param {string} ruleName
*/
function ensureRuleRanges(ruleName /*: string*/) {
if (!disabledRanges[ruleName]) {
disabledRanges[ruleName] = disabledRanges.all.map(({ start, end }) =>
Expand All @@ -216,6 +300,10 @@ module.exports = function(root /*: Object*/, result /*: Object*/) /*: postcss$re
}
}

/**
* @param {string} ruleName
* @returns {boolean}
*/
function ruleIsDisabled(ruleName /*: string*/) /*: boolean*/ {
if (disabledRanges[ruleName] === undefined) return false;

Expand Down
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
"v8-compile-cache": "^2.1.0"
},
"devDependencies": {
"@types/lodash": "^4.14.144",
"benchmark": "^2.1.4",
"common-tags": "^1.8.0",
"coveralls": "^3.0.7",
Expand Down
29 changes: 29 additions & 0 deletions types/stylelint/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
declare module 'stylelint' {
import { Result, WarningOptions } from 'postcss';

export type DisabledRange = {
start: number,
strictStart: boolean,
end?: number,
strictEnd?: boolean
};

export type DisabledRangeObject = {
[ruleName: string]: Array<DisabledRange>
};

export type StylelintPostcssResult = {
ruleSeverities: {[k: string]: any},
customMessages: {[k: string]: any},
quiet?: boolean,
disabledRanges: DisabledRangeObject,
ignored?: boolean,
ignoreDisables?: boolean,
stylelintError?: boolean
};

export type PostcssResult = Result & {
stylelint: StylelintPostcssResult,
warn(message: string, options?: WarningOptions & {stylelintType?: string}): void;
};
}

0 comments on commit 94c7a28

Please sign in to comment.