Skip to content

Commit

Permalink
feat: css-rule-malformed to report missing CSS rule values
Browse files Browse the repository at this point in the history
  • Loading branch information
revelt committed Feb 16, 2021
1 parent e30805c commit 59a3690
Show file tree
Hide file tree
Showing 8 changed files with 158 additions and 25 deletions.
5 changes: 1 addition & 4 deletions packages/emlint/coverage/coverage-summary.json
@@ -1,4 +1 @@
{"total": {"lines":{"total":2492,"covered":809,"skipped":0,"pct":32.46},"statements":{"total":2780,"covered":1071,"skipped":0,"pct":38.53},"functions":{"total":1002,"covered":671,"skipped":0,"pct":66.97},"branches":{"total":2076,"covered":289,"skipped":0,"pct":13.92}}
,"/Users/royston/Documents/__PROJECTS/____libs2/packages/emlint/dist/emlint.esm.js": {"lines":{"total":2486,"covered":805,"skipped":0,"pct":32.38},"functions":{"total":1000,"covered":669,"skipped":0,"pct":66.9},"statements":{"total":2774,"covered":1067,"skipped":0,"pct":38.46},"branches":{"total":2068,"covered":283,"skipped":0,"pct":13.68}}
,"/Users/royston/Documents/__PROJECTS/____libs2/packages/emlint/t-util/util.js": {"lines":{"total":6,"covered":4,"skipped":0,"pct":66.67},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":6,"covered":4,"skipped":0,"pct":66.67},"branches":{"total":8,"covered":6,"skipped":0,"pct":75}}
}
{"total":{"lines":{"total":2496,"covered":2435,"skipped":0,"pct":97.56},"statements":{"total":2784,"covered":2723,"skipped":0,"pct":97.81},"functions":{"total":1003,"covered":996,"skipped":0,"pct":99.3},"branches":{"total":2084,"covered":1973,"skipped":0,"pct":94.67}}}
21 changes: 19 additions & 2 deletions packages/emlint/dist/emlint.cjs.js
Expand Up @@ -10554,7 +10554,7 @@ var trailingSemi = function trailingSemi(context, mode) {
};
};

var cssRuleMalformed = function cssRuleMalformed(context, mode) {
var cssRuleMalformed = function cssRuleMalformed(context) {
return {
rule: function rule(node) { // 1. catch rules with semicolons missing:
// <style>.a{color:red\n\ntext-align:left
Expand All @@ -10573,7 +10573,7 @@ var cssRuleMalformed = function cssRuleMalformed(context, mode) {

if (properties && properties.length > 1) {
for (var i = properties.length - 1; i--;) {
if (properties[i].semi === null) {
if (properties[i].semi === null && properties[i].value) {
context.report({
ruleId: "css-rule-malformed",
idxFrom: properties[i].start,
Expand All @@ -10600,6 +10600,23 @@ var cssRuleMalformed = function cssRuleMalformed(context, mode) {
ranges: [[node.openingCurlyAt + 1, node.closingCurlyAt]]
}
});
} // 3. catch css properties without values
// <style>.a{color:}</style>
// ^


if (properties && properties.length) {
properties.forEach(function (property) {
if (property.value === null) {
context.report({
ruleId: "css-rule-malformed",
idxFrom: property.start,
idxTo: property.end,
message: "Missing value.",
fix: null
});
}
});
}
}
};
Expand Down
38 changes: 33 additions & 5 deletions packages/emlint/dist/emlint.dev.umd.js
Expand Up @@ -15255,16 +15255,27 @@ function tokenizer(str, originalOpts) {
ifQuoteThenAttrClosingQuote(_i)) {
if (str[_i] === ";") {
property.semi = _i;
} // patch missing .end
}

var temp; // patch missing .end

if (!property.end) {
property.end = property.semi ? property.semi + 1 : _i;
property.end = property.semi ? property.semi + 1 : left(str, _i) + 1;
temp = property.end;
} // push and init and patch up to resume


pushProperty(property);
propertyReset();
propertyReset(); // if there was a whitespace gap, submit it as text token

if (temp && temp < _i) {
pushProperty({
type: "text",
start: temp,
end: _i,
value: str.slice(temp, _i)
});
}
} else {
property.valueStarts = _i;
}
Expand Down Expand Up @@ -44024,7 +44035,7 @@ var trailingSemi = function trailingSemi(context, mode) {
};
};

var cssRuleMalformed = function cssRuleMalformed(context, mode) {
var cssRuleMalformed = function cssRuleMalformed(context) {
return {
rule: function rule(node) { // 1. catch rules with semicolons missing:
// <style>.a{color:red\n\ntext-align:left
Expand All @@ -44043,7 +44054,7 @@ var cssRuleMalformed = function cssRuleMalformed(context, mode) {

if (properties && properties.length > 1) {
for (var i = properties.length - 1; i--;) {
if (properties[i].semi === null) {
if (properties[i].semi === null && properties[i].value) {
context.report({
ruleId: "css-rule-malformed",
idxFrom: properties[i].start,
Expand All @@ -44070,6 +44081,23 @@ var cssRuleMalformed = function cssRuleMalformed(context, mode) {
ranges: [[node.openingCurlyAt + 1, node.closingCurlyAt]]
}
});
} // 3. catch css properties without values
// <style>.a{color:}</style>
// ^


if (properties && properties.length) {
properties.forEach(function (property) {
if (property.value === null) {
context.report({
ruleId: "css-rule-malformed",
idxFrom: property.start,
idxTo: property.end,
message: "Missing value.",
fix: null
});
}
});
}
}
};
Expand Down
21 changes: 19 additions & 2 deletions packages/emlint/dist/emlint.esm.js
Expand Up @@ -10905,7 +10905,7 @@ const trailingSemi = (context, mode) => {
};
};

const cssRuleMalformed = (context, mode) => {
const cssRuleMalformed = context => {
return {
rule(node) { // 1. catch rules with semicolons missing:
// <style>.a{color:red\n\ntext-align:left
Expand All @@ -10920,7 +10920,7 @@ const cssRuleMalformed = (context, mode) => {

if (properties && properties.length > 1) {
for (let i = properties.length - 1; i--;) {
if (properties[i].semi === null) {
if (properties[i].semi === null && properties[i].value) {
context.report({
ruleId: "css-rule-malformed",
idxFrom: properties[i].start,
Expand All @@ -10947,6 +10947,23 @@ const cssRuleMalformed = (context, mode) => {
ranges: [[node.openingCurlyAt + 1, node.closingCurlyAt]]
}
});
} // 3. catch css properties without values
// <style>.a{color:}</style>
// ^


if (properties && properties.length) {
properties.forEach(property => {
if (property.value === null) {
context.report({
ruleId: "css-rule-malformed",
idxFrom: property.start,
idxTo: property.end,
message: `Missing value.`,
fix: null
});
}
});
}
}

Expand Down
2 changes: 1 addition & 1 deletion packages/emlint/dist/emlint.mjs

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions packages/emlint/dist/emlint.umd.js

Large diffs are not rendered by default.

37 changes: 28 additions & 9 deletions packages/emlint/src/rules/css/css-rule-malformed.ts
Expand Up @@ -9,19 +9,17 @@ import { Property } from "../../../../codsen-tokenizer/src/util/util";
// import { right } from "string-left-right";
// import splitByWhitespace from "../../util/splitByWhitespace";

type Mode = "always" | "never";
interface cssRuleMalformed {
(context: Linter, mode: Mode): RuleObjType;
(context: Linter): RuleObjType;
}
const cssRuleMalformed: cssRuleMalformed = (context, mode) => {
const cssRuleMalformed: cssRuleMalformed = (context) => {
return {
rule(node) {
console.log(
`███████████████████████████████████████ cssRuleMalformed() ███████████████████████████████████████`
);
console.log(`022 mode = ${JSON.stringify(mode, null, 4)}`);
console.log(
`024 cssRuleMalformed(): ${`\u001b[${33}m${`node`}\u001b[${39}m`} = ${JSON.stringify(
`022 cssRuleMalformed(): ${`\u001b[${33}m${`node`}\u001b[${39}m`} = ${JSON.stringify(
node,
null,
4
Expand All @@ -45,7 +43,7 @@ const cssRuleMalformed: cssRuleMalformed = (context, mode) => {
) as Property[];
}
console.log(
`048 ${`\u001b[${32}m${`SET`}\u001b[${39}m`} ${`\u001b[${33}m${`properties`}\u001b[${39}m`} = ${JSON.stringify(
`046 ${`\u001b[${32}m${`SET`}\u001b[${39}m`} ${`\u001b[${33}m${`properties`}\u001b[${39}m`} = ${JSON.stringify(
properties as any,
null,
4
Expand All @@ -54,9 +52,9 @@ const cssRuleMalformed: cssRuleMalformed = (context, mode) => {

if (properties && properties.length > 1) {
for (let i = properties.length - 1; i--; ) {
if (properties[i].semi === null) {
if (properties[i].semi === null && properties[i].value) {
console.log(
`059 ${`\u001b[${31}m${`missing semi on ${properties[i].property}`}\u001b[${39}m`}`
`057 ${`\u001b[${31}m${`missing semi on ${properties[i].property}`}\u001b[${39}m`}`
);
context.report({
ruleId: "css-rule-malformed",
Expand Down Expand Up @@ -85,7 +83,7 @@ const cssRuleMalformed: cssRuleMalformed = (context, mode) => {
context.str.slice(node.openingCurlyAt + 1, node.closingCurlyAt).trim()
) {
console.log(
`088 ${`\u001b[${31}m${`something rogue inside ${node.value}`}\u001b[${39}m`}`
`086 ${`\u001b[${31}m${`something rogue inside ${node.value}`}\u001b[${39}m`}`
);
context.report({
ruleId: "css-rule-malformed",
Expand All @@ -103,6 +101,27 @@ const cssRuleMalformed: cssRuleMalformed = (context, mode) => {
},
});
}

// 3. catch css properties without values
// <style>.a{color:}</style>
// ^

if (properties && properties.length) {
properties.forEach((property) => {
if (property.value === null) {
console.log(
`113 ${`\u001b[${31}m${`missing value on ${property.property}`}\u001b[${39}m`}`
);
context.report({
ruleId: "css-rule-malformed",
idxFrom: property.start,
idxTo: property.end,
message: `Missing value.`,
fix: null,
});
}
});
}
},
};
};
Expand Down
55 changes: 55 additions & 0 deletions packages/emlint/test/rules/css/css-rule-malformed.js
Expand Up @@ -166,3 +166,58 @@ tap.test(`05 - two semis, tight`, (t) => {
);
t.end();
});

// value missing
// -----------------------------------------------------------------------------

tap.test(`06 - nothing after semi`, (t) => {
const str = `<style>.a{color:}</style><body>a</body>`;
const linter = new Linter();
const messages = linter.verify(str, {
rules: {
"css-rule-malformed": 2,
},
});
t.equal(applyFixes(str, messages), str, "06.01");
t.match(
messages,
[
{
severity: 2,
ruleId: "css-rule-malformed",
message: "Missing value.",
idxFrom: 10,
idxTo: 16,
fix: null,
},
],
"06.02"
);
t.end();
});

tap.test(`07 - value and semi missing, followed by correct rule`, (t) => {
const str = `<style>.a{ color \n\ntext-align:left;}</style><body>a</body>`;
const linter = new Linter();
const messages = linter.verify(str, {
rules: {
"css-rule-malformed": 2,
},
});
t.equal(applyFixes(str, messages), str, "07.01");
t.match(
messages,
[
{
severity: 2,
ruleId: "css-rule-malformed",
message: "Missing value.",
idxFrom: 11,
idxTo: 16,
fix: null,
},
],
"07.02"
);
t.end();
});

0 comments on commit 59a3690

Please sign in to comment.