Skip to content

Commit 0eec954

Browse files
authored
@W-19147397 processor updated to filter ssr rule disable warning from original files (#207)
1 parent a83b908 commit 0eec954

File tree

2 files changed

+250
-2
lines changed

2 files changed

+250
-2
lines changed

lib/processors/ssr.js

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,49 @@ module.exports = {
7878
},
7979

8080
postprocess(messages) {
81-
// Return all messages for files that were processed
82-
return messages.flat();
81+
const processedMessages = [];
82+
83+
// Process messages from each file separately
84+
// Per ESLint processor docs: "Each item in the input array corresponds to the part that was returned from the preprocess method"
85+
// https://eslint.org/docs/latest/extend/custom-processors#custom-processor-specification
86+
// messages[0] = original file, messages[1] = virtual .ssrjs file (if created)
87+
messages.forEach((fileMessages, index) => {
88+
if (index === 0) {
89+
// Original file messages - filter out SSR unused-disable warnings
90+
const filteredOriginalMessages = fileMessages.filter((message) => {
91+
// Check if this is an unused eslint-disable directive warning for SSR rules
92+
if (
93+
!message.ruleId &&
94+
message.message &&
95+
message.message.includes('Unused eslint-disable directive')
96+
) {
97+
// Extract all rule names from the message
98+
const ruleMatches = message.message.match(/'([^']+)'/g) || [];
99+
const allRules = ruleMatches.map((rule) => rule.slice(1, -1)); // Remove quotes
100+
101+
// Check if message contains any SSR rules
102+
const ssrRulePattern = /@lwc\/lwc\/ssr-[\w-]+/;
103+
const ssrRules = allRules.filter((rule) => ssrRulePattern.test(rule));
104+
const nonSsrRules = allRules.filter((rule) => !ssrRulePattern.test(rule));
105+
106+
// Only filter out if ALL rules in the message are SSR rules
107+
if (ssrRules.length > 0 && nonSsrRules.length === 0) {
108+
// This unused disable directive warning only contains SSR rules - filter it out
109+
return false;
110+
}
111+
// If mixed rules (SSR + non-SSR), keep the entire message unchanged
112+
// Once developer fixes the non-SSR rule, the SSR rule gets handled automatically
113+
}
114+
return true;
115+
});
116+
processedMessages.push(...filteredOriginalMessages);
117+
} else {
118+
// SSR virtual file messages - keep all messages unchanged
119+
processedMessages.push(...fileMessages);
120+
}
121+
});
122+
123+
return processedMessages;
83124
},
84125
supportsAutofix: true,
85126
};

test/lib/processors/ssr.test.js

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,211 @@ describe('JS Meta XML Processor with Capabilities Check', () => {
148148
expect(result[0]).to.deep.equal(input);
149149
});
150150
});
151+
152+
describe('postprocess', () => {
153+
it('should filter out unused eslint-disable directive warnings for SSR rules', () => {
154+
const messages = [
155+
[
156+
// Messages from original file
157+
{
158+
ruleId: null,
159+
message:
160+
"Unused eslint-disable directive (no problems were reported from '@lwc/lwc/ssr-no-node-env')",
161+
line: 1,
162+
column: 1,
163+
severity: 1,
164+
},
165+
{
166+
ruleId: 'no-console',
167+
message: 'Unexpected console statement.',
168+
line: 2,
169+
column: 1,
170+
severity: 2,
171+
},
172+
],
173+
[
174+
// Messages from virtual .ssrjs file
175+
{
176+
ruleId: '@lwc/lwc/ssr-no-node-env',
177+
message: 'process.env usage is not allowed',
178+
line: 3,
179+
column: 1,
180+
severity: 2,
181+
},
182+
],
183+
];
184+
185+
const result = ssrProcessor.postprocess(messages);
186+
187+
expect(result).to.have.lengthOf(2);
188+
// Should keep non-SSR messages
189+
expect(result[0]).to.deep.include({ ruleId: 'no-console' });
190+
expect(result[1]).to.deep.include({ ruleId: '@lwc/lwc/ssr-no-node-env' });
191+
// Should filter out SSR unused disable directive warning
192+
expect(
193+
result.some(
194+
(msg) => msg.message && msg.message.includes("'@lwc/lwc/ssr-no-node-env'"),
195+
),
196+
).to.be.false;
197+
});
198+
199+
it('should keep unused eslint-disable directive warnings for non-SSR rules', () => {
200+
const messages = [
201+
[
202+
// Messages from original file
203+
{
204+
ruleId: null,
205+
message:
206+
"Unused eslint-disable directive (no problems were reported from 'no-console')",
207+
line: 1,
208+
column: 1,
209+
severity: 1,
210+
},
211+
{
212+
ruleId: null,
213+
message:
214+
"Unused eslint-disable directive (no problems were reported from '@lwc/lwc/ssr-no-node-env')",
215+
line: 2,
216+
column: 1,
217+
severity: 1,
218+
},
219+
],
220+
];
221+
222+
const result = ssrProcessor.postprocess(messages);
223+
224+
expect(result).to.have.lengthOf(1);
225+
// Should keep non-SSR unused disable directive warning
226+
expect(result[0].message).to.include("'no-console'");
227+
// Should filter out SSR unused disable directive warning
228+
expect(
229+
result.some(
230+
(msg) => msg.message && msg.message.includes("'@lwc/lwc/ssr-no-node-env'"),
231+
),
232+
).to.be.false;
233+
});
234+
235+
it('should handle multiple SSR rules in unused disable directive warnings', () => {
236+
const messages = [
237+
[
238+
{
239+
ruleId: null,
240+
message:
241+
"Unused eslint-disable directive (no problems were reported from '@lwc/lwc/ssr-no-node-env', '@lwc/lwc/ssr-no-form-factor')",
242+
line: 1,
243+
column: 1,
244+
severity: 1,
245+
},
246+
],
247+
];
248+
249+
const result = ssrProcessor.postprocess(messages);
250+
251+
expect(result).to.have.lengthOf(0);
252+
// Should filter out the entire message since it only contains SSR rules
253+
});
254+
255+
it('should preserve unused disable directive warnings when mixed with non-SSR rules', () => {
256+
const messages = [
257+
[
258+
{
259+
ruleId: null,
260+
message:
261+
"Unused eslint-disable directive (no problems were reported from '@lwc/lwc/ssr-no-node-env', 'no-console')",
262+
line: 1,
263+
column: 1,
264+
severity: 1,
265+
},
266+
],
267+
];
268+
269+
const result = ssrProcessor.postprocess(messages);
270+
271+
expect(result).to.have.lengthOf(1);
272+
// Should keep the entire message unchanged - once developer fixes non-SSR rule, SSR rule gets handled automatically
273+
expect(result[0].message).to.equal(
274+
"Unused eslint-disable directive (no problems were reported from '@lwc/lwc/ssr-no-node-env', 'no-console')",
275+
);
276+
});
277+
278+
it('should handle mixed ordering of SSR and non-SSR rules', () => {
279+
const messages = [
280+
[
281+
{
282+
ruleId: null,
283+
message:
284+
"Unused eslint-disable directive (no problems were reported from '@lwc/lwc/ssr-no-node-env', 'no-console', '@lwc/lwc/ssr-no-form-factor')",
285+
line: 1,
286+
column: 1,
287+
severity: 1,
288+
},
289+
],
290+
];
291+
292+
const result = ssrProcessor.postprocess(messages);
293+
294+
expect(result).to.have.lengthOf(1);
295+
// Should keep the entire message unchanged regardless of rule order
296+
expect(result[0].message).to.equal(
297+
"Unused eslint-disable directive (no problems were reported from '@lwc/lwc/ssr-no-node-env', 'no-console', '@lwc/lwc/ssr-no-form-factor')",
298+
);
299+
});
300+
301+
it('should handle complex mixed rule scenarios', () => {
302+
const messages = [
303+
[
304+
{
305+
ruleId: null,
306+
message:
307+
"Unused eslint-disable directive (no problems were reported from 'no-unused-vars', '@lwc/lwc/ssr-no-node-env', 'prefer-const')",
308+
line: 1,
309+
column: 1,
310+
severity: 1,
311+
},
312+
{
313+
ruleId: null,
314+
message:
315+
"Unused eslint-disable directive (no problems were reported from '@lwc/lwc/ssr-no-restricted-browser-globals')",
316+
line: 2,
317+
column: 1,
318+
severity: 1,
319+
},
320+
],
321+
];
322+
323+
const result = ssrProcessor.postprocess(messages);
324+
325+
expect(result).to.have.lengthOf(1);
326+
// Should keep the first message (mixed rules) unchanged and filter out the second (SSR only)
327+
expect(result[0].message).to.equal(
328+
"Unused eslint-disable directive (no problems were reported from 'no-unused-vars', '@lwc/lwc/ssr-no-node-env', 'prefer-const')",
329+
);
330+
});
331+
332+
it('should pass through all other types of messages unchanged', () => {
333+
const messages = [
334+
[
335+
{
336+
ruleId: 'no-console',
337+
message: 'Unexpected console statement.',
338+
line: 1,
339+
column: 1,
340+
severity: 2,
341+
},
342+
{
343+
ruleId: '@lwc/lwc/valid-api',
344+
message: 'Invalid API usage.',
345+
line: 2,
346+
column: 1,
347+
severity: 2,
348+
},
349+
],
350+
];
351+
352+
const result = ssrProcessor.postprocess(messages);
353+
354+
expect(result).to.have.lengthOf(2);
355+
expect(result).to.deep.equal(messages.flat());
356+
});
357+
});
151358
});

0 commit comments

Comments
 (0)