Skip to content

Commit 2433d6e

Browse files
committed
[PLUTO-1431] sort eslint rules
1 parent 5fd237f commit 2433d6e

File tree

2 files changed

+48
-112
lines changed

2 files changed

+48
-112
lines changed

integration-tests/run.ps1

Lines changed: 23 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -71,63 +71,30 @@ function Normalize-Config {
7171
$output
7272
}
7373
{ $_ -in @('mjs', 'js') } {
74-
# For JavaScript config files (like ESLint), use Node.js to parse and sort JSON objects
75-
if (Get-Command node -ErrorAction SilentlyContinue) {
76-
$tempScript = @"
77-
const fs = require('fs');
78-
let content = fs.readFileSync('$file', 'utf8');
79-
80-
// More sophisticated approach: find and sort the rules object specifically
81-
const sortRulesObject = (str) => {
82-
// Find the rules object
83-
const rulesMatch = str.match(/rules:\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/);
84-
if (rulesMatch) {
85-
const rulesContent = rulesMatch[1];
86-
87-
// Split on commas but be careful about nested objects
88-
const rules = [];
89-
let current = '';
90-
let depth = 0;
91-
let inString = false;
92-
let stringChar = '';
93-
94-
for (let i = 0; i < rulesContent.length; i++) {
95-
const char = rulesContent[i];
96-
current += char;
97-
98-
if (!inString && (char === '\"' || char === \"'\")) {
99-
inString = true;
100-
stringChar = char;
101-
} else if (inString && char === stringChar && rulesContent[i-1] !== '\\\\') {
102-
inString = false;
103-
} else if (!inString) {
104-
if (char === '{') depth++;
105-
else if (char === '}') depth--;
106-
else if (char === ',' && depth === 0) {
107-
rules.push(current.slice(0, -1).trim());
108-
current = '';
109-
}
110-
}
111-
}
112-
if (current.trim()) rules.push(current.trim());
113-
114-
// Sort the rules
115-
rules.sort();
116-
117-
// Reconstruct
118-
const sortedRules = 'rules: {\\n' + rules.map(rule => ' ' + rule).join(',\\n') + '\\n }';
119-
return str.replace(/rules:\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/, sortedRules);
120-
}
121-
return str;
122-
};
123-
124-
console.log(sortRulesObject(content));
125-
"@
126-
$tempScript | node
127-
} else {
128-
# Fallback if Node.js is not available
129-
Get-Content $file
74+
# For JavaScript config files (like ESLint), sort the rule lines within the rules object
75+
$content = Get-Content $file
76+
$output = @()
77+
$inRules = $false
78+
$ruleLines = @()
79+
80+
foreach ($line in $content) {
81+
if ($line -match 'rules: \{') {
82+
$output += $line
83+
$inRules = $true
84+
} elseif ($inRules -and $line -match '^\s*\}') {
85+
# Sort collected rule lines and add them
86+
$output += ($ruleLines | Sort-Object)
87+
$ruleLines = @()
88+
$inRules = $false
89+
$output += $line
90+
} elseif ($inRules) {
91+
# Collect rule lines for sorting
92+
$ruleLines += $line
93+
} else {
94+
$output += $line
95+
}
13096
}
97+
$output
13198
}
13299
{ $_ -in @('rc', 'conf', 'ini', 'xml') } {
133100
Get-Content $file | ForEach-Object {

integration-tests/run.sh

Lines changed: 25 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -24,62 +24,31 @@ normalize_config() {
2424
yq e '.' "$file" | sort
2525
;;
2626
mjs|js)
27-
# For JavaScript config files (like ESLint), use Node.js to parse and sort JSON objects
28-
if command -v node >/dev/null 2>&1; then
29-
node -e "
30-
const fs = require('fs');
31-
let content = fs.readFileSync('$file', 'utf8');
32-
33-
// More sophisticated approach: find and sort the rules object specifically
34-
const sortRulesObject = (str) => {
35-
// Find the rules object
36-
const rulesMatch = str.match(/rules:\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/);
37-
if (rulesMatch) {
38-
const rulesContent = rulesMatch[1];
39-
40-
// Split on commas but be careful about nested objects
41-
const rules = [];
42-
let current = '';
43-
let depth = 0;
44-
let inString = false;
45-
let stringChar = '';
46-
47-
for (let i = 0; i < rulesContent.length; i++) {
48-
const char = rulesContent[i];
49-
current += char;
50-
51-
if (!inString && (char === '\"' || char === \"'\")) {
52-
inString = true;
53-
stringChar = char;
54-
} else if (inString && char === stringChar && rulesContent[i-1] !== '\\\\') {
55-
inString = false;
56-
} else if (!inString) {
57-
if (char === '{') depth++;
58-
else if (char === '}') depth--;
59-
else if (char === ',' && depth === 0) {
60-
rules.push(current.slice(0, -1).trim());
61-
current = '';
62-
}
63-
}
64-
}
65-
if (current.trim()) rules.push(current.trim());
66-
67-
// Sort the rules
68-
rules.sort();
69-
70-
// Reconstruct
71-
const sortedRules = 'rules: {\\n' + rules.map(rule => ' ' + rule).join(',\\n') + '\\n }';
72-
return str.replace(/rules:\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/, sortedRules);
73-
}
74-
return str;
75-
};
76-
77-
console.log(sortRulesObject(content));
78-
"
79-
else
80-
# Fallback if Node.js is not available
81-
cat "$file"
82-
fi
27+
# For JavaScript config files (like ESLint), sort the rule lines within the rules object
28+
awk '
29+
/rules: \{/ {
30+
print;
31+
inRules = 1;
32+
next
33+
}
34+
inRules && /^\s*\}/ {
35+
# Sort collected rules and print them
36+
n = asorti(rules, sortedIndices)
37+
for (i = 1; i <= n; i++) {
38+
print rules[sortedIndices[i]]
39+
}
40+
delete rules
41+
inRules = 0
42+
print
43+
next
44+
}
45+
inRules {
46+
# Collect rule lines for sorting
47+
rules[NR] = $0
48+
next
49+
}
50+
{ print }
51+
' "$file"
8352
;;
8453
rc|conf|ini)
8554
# For other config files, sort values after '=' and keep other lines

0 commit comments

Comments
 (0)