Skip to content

Commit ce54b30

Browse files
committed
fix return code
1 parent 63b7227 commit ce54b30

File tree

4 files changed

+60
-42
lines changed

4 files changed

+60
-42
lines changed

bin/lint-css-duplicates.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#!/usr/bin/env node
22
import lint from '../src/index.js';
33

4-
lint(process.argv[2] || process.cwd());
4+
process.exit(lint(process.argv[2] || process.cwd()) ? 1 : 0);

package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
{
22
"name": "@idrinth/duplicate-style-check",
3-
"version": "1.0.4",
3+
"version": "1.0.5",
44
"description": "A linting tool trying to find duplicated style rules",
55
"type": "module",
6+
"license": "MIT",
7+
"keywords": [
8+
"css",
9+
"lint",
10+
"duplication"
11+
],
612
"scripts": {
713
"tsc": "tsc -p tsconfig.json",
814
"prepublishOnly": "npm run tsc",

src/build-map.ts

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,46 +8,56 @@ interface Rules {
88
}
99
}
1010
}
11-
const handleDeclaration = (selector: string, declaration: css.Declaration, position: css.Position|undefined, media: string, rules: Rules) => {
12-
if (rules[selector]) {
13-
if (rules[selector][media]) {
14-
if (rules[selector][media][declaration.property || '']) {
15-
console.error(`${declaration.property} of ${selector} overwrites a previous definition in line ${position?.line} for media ${media}.`);
16-
}
17-
}
18-
if (media !== '' && rules[selector]['']) {
19-
if (rules[selector][''][declaration.property || ''] && rules[selector][''][declaration.property || ''] === declaration.value || '') {
20-
console.error(`${declaration.property} of ${selector} overwrites a previous definition in line ${position?.line} general with the same value.`);
21-
}
22-
}
11+
const handleDeclaration = (selector: string, declaration: css.Declaration, position: css.Position|undefined, media: string, rules: Rules): boolean => {
12+
let fails = false;
13+
if (rules[selector]) {
14+
if (rules[selector][media]) {
15+
if (rules[selector][media][declaration.property || '']) {
16+
fails = true;
17+
console.error(`${declaration.property} of ${selector} overwrites a previous definition in line ${position?.line} for media ${media}.`);
18+
}
19+
}
20+
if (media !== '' && rules[selector]['']) {
21+
if (rules[selector][''][declaration.property || ''] && rules[selector][''][declaration.property || ''] === declaration.value || '') {
22+
fails = true;
23+
console.error(`${declaration.property} of ${selector} overwrites a previous definition in line ${position?.line} general with the same value.`);
24+
}
2325
}
24-
rules[selector] = rules[selector] || {};
25-
rules[selector][media] = rules[selector][media] || {};
26-
rules[selector][media][declaration.property || ''] = declaration.value || '';
26+
}
27+
rules[selector] = rules[selector] || {};
28+
rules[selector][media] = rules[selector][media] || {};
29+
rules[selector][media][declaration.property || ''] = declaration.value || '';
30+
return fails;
2731
}
2832
const handleRule = (rule: css.Rule, rules: Rules, media: string = '') => {
29-
for (const selector of rule.selectors || []) {
30-
for (const declaration of rule.declarations || []) {
31-
if (declaration.type === 'declaration') {
32-
handleDeclaration(selector, declaration, rule.position?.start, media, rules);
33-
}
34-
}
33+
let fails = false;
34+
for (const selector of rule.selectors || []) {
35+
for (const declaration of rule.declarations || []) {
36+
if (declaration.type === 'declaration') {
37+
fails = handleDeclaration(selector, declaration, rule.position?.start, media, rules) || fails;
38+
}
3539
}
40+
}
41+
return fails;
3642
};
37-
const handleAtRule = (rule: css.Media, rules: Rules) => {
38-
for (const rul of rule.rules || []) {
39-
handleRule(rul, rules, rule.media)
40-
}
43+
const handleAtRule = (rule: css.Media, rules: Rules): boolean => {
44+
let fails = false;
45+
for (const rul of rule.rules || []) {
46+
fails = handleRule(rul, rules, rule.media) || fails;
47+
}
48+
return fails;
4149
};
42-
export default(file: string): void => {
43-
const rules: Rules = {};
44-
console.log(file);
45-
const code = css.parse(readFileSync(file, 'utf8'));
46-
for (const rule of (code.stylesheet?.rules || [])) {
47-
if (rule.type === 'rule') {
48-
handleRule(rule, rules)
49-
} else if(rule.type === 'media') {
50-
handleAtRule(rule, rules);
51-
}
50+
export default(file: string): boolean => {
51+
const rules: Rules = {};
52+
let fails = false;
53+
console.log(file);
54+
const code = css.parse(readFileSync(file, 'utf8'));
55+
for (const rule of (code.stylesheet?.rules || [])) {
56+
if (rule.type === 'rule') {
57+
fails = handleRule(rule, rules) || fails;
58+
} else if(rule.type === 'media') {
59+
fails = handleAtRule(rule, rules) || fails;
5260
}
61+
}
62+
return !fails;
5363
};

src/index.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import {readdirSync} from 'node:fs';
22
import buildMap from './build-map.js';
33

4-
export default (cwd: string) => {
5-
for (const file of readdirSync(cwd, {recursive: true, encoding: 'utf8'})) {
6-
if (file.endsWith('.css') && !file.includes('node_modules') && !file.includes('coverage') && !file.includes('dist')) {
7-
buildMap(cwd + '/' + file);
8-
}
4+
export default (cwd: string): boolean => {
5+
let fails = false;
6+
for (const file of readdirSync(cwd, {recursive: true, encoding: 'utf8'})) {
7+
if (file.endsWith('.css') && !file.includes('node_modules') && !file.includes('coverage') && !file.includes('dist')) {
8+
fails = buildMap(cwd + '/' + file) || fails;
99
}
10+
}
11+
return fails;
1012
}

0 commit comments

Comments
 (0)