@@ -1467,6 +1467,32 @@ describe("Linter", () => {
1467
1467
linter.verify(code, config);
1468
1468
assert(spy && spy.calledOnce);
1469
1469
});
1470
+
1471
+ it("variables should be available in global scope with quoted items", () => {
1472
+ const code = `/*${ESLINT_ENV} 'node'*/ function f() {} /*${ESLINT_ENV} "browser", "mocha"*/`;
1473
+ const config = { rules: { checker: "error" } };
1474
+ let spy;
1475
+
1476
+ linter.defineRule("checker", {
1477
+ create(context) {
1478
+ spy = sinon.spy(() => {
1479
+ const scope = context.getScope(),
1480
+ exports = getVariable(scope, "exports"),
1481
+ window = getVariable(scope, "window"),
1482
+ it = getVariable(scope, "it");
1483
+
1484
+ assert.strictEqual(exports.writeable, true);
1485
+ assert.strictEqual(window.writeable, false);
1486
+ assert.strictEqual(it.writeable, false);
1487
+ });
1488
+
1489
+ return { Program: spy };
1490
+ }
1491
+ });
1492
+
1493
+ linter.verify(code, config);
1494
+ assert(spy && spy.calledOnce);
1495
+ });
1470
1496
});
1471
1497
1472
1498
describe("when evaluating code containing /*eslint-env */ block with sloppy whitespace", () => {
@@ -2604,6 +2630,33 @@ describe("Linter", () => {
2604
2630
assert.strictEqual(suppressedMessages.length, 2);
2605
2631
assert.strictEqual(suppressedMessages[0].ruleId, "no-alert");
2606
2632
});
2633
+
2634
+ it("should report a violation with quoted rule names in eslint-disable-line", () => {
2635
+ const code = [
2636
+ "alert('test'); // eslint-disable-line 'no-alert'",
2637
+ "console.log('test');", // here
2638
+ "alert('test'); // eslint-disable-line \"no-alert\""
2639
+ ].join("\n");
2640
+ const config = {
2641
+ rules: {
2642
+ "no-alert": 1,
2643
+ "no-console": 1
2644
+ }
2645
+ };
2646
+
2647
+ const messages = linter.verify(code, config, filename);
2648
+ const suppressedMessages = linter.getSuppressedMessages();
2649
+
2650
+ assert.strictEqual(messages.length, 1);
2651
+ assert.strictEqual(messages[0].ruleId, "no-console");
2652
+ assert.strictEqual(messages[0].line, 2);
2653
+
2654
+ assert.strictEqual(suppressedMessages.length, 2);
2655
+ assert.strictEqual(suppressedMessages[0].ruleId, "no-alert");
2656
+ assert.strictEqual(suppressedMessages[0].line, 1);
2657
+ assert.strictEqual(suppressedMessages[1].ruleId, "no-alert");
2658
+ assert.strictEqual(suppressedMessages[1].line, 3);
2659
+ });
2607
2660
});
2608
2661
2609
2662
describe("eslint-disable-next-line", () => {
@@ -2957,6 +3010,31 @@ describe("Linter", () => {
2957
3010
2958
3011
assert.strictEqual(suppressedMessages.length, 0);
2959
3012
});
3013
+
3014
+ it("should ignore violation of specified rule on next line with quoted rule names", () => {
3015
+ const code = [
3016
+ "// eslint-disable-next-line 'no-alert'",
3017
+ "alert('test');",
3018
+ "// eslint-disable-next-line \"no-alert\"",
3019
+ "alert('test');",
3020
+ "console.log('test');"
3021
+ ].join("\n");
3022
+ const config = {
3023
+ rules: {
3024
+ "no-alert": 1,
3025
+ "no-console": 1
3026
+ }
3027
+ };
3028
+ const messages = linter.verify(code, config, filename);
3029
+ const suppressedMessages = linter.getSuppressedMessages();
3030
+
3031
+ assert.strictEqual(messages.length, 1);
3032
+ assert.strictEqual(messages[0].ruleId, "no-console");
3033
+
3034
+ assert.strictEqual(suppressedMessages.length, 2);
3035
+ assert.strictEqual(suppressedMessages[0].ruleId, "no-alert");
3036
+ assert.strictEqual(suppressedMessages[1].ruleId, "no-alert");
3037
+ });
2960
3038
});
2961
3039
});
2962
3040
@@ -3233,6 +3311,61 @@ describe("Linter", () => {
3233
3311
assert.strictEqual(suppressedMessages[2].ruleId, "no-console");
3234
3312
assert.strictEqual(suppressedMessages[2].line, 6);
3235
3313
});
3314
+
3315
+ it("should report a violation with quoted rule names in eslint-disable", () => {
3316
+ const code = [
3317
+ "/*eslint-disable 'no-alert' */",
3318
+ "alert('test');",
3319
+ "console.log('test');", // here
3320
+ "/*eslint-enable */",
3321
+ "/*eslint-disable \"no-console\" */",
3322
+ "alert('test');", // here
3323
+ "console.log('test');"
3324
+ ].join("\n");
3325
+ const config = { rules: { "no-alert": 1, "no-console": 1 } };
3326
+
3327
+ const messages = linter.verify(code, config, filename);
3328
+ const suppressedMessages = linter.getSuppressedMessages();
3329
+
3330
+ assert.strictEqual(messages.length, 2);
3331
+ assert.strictEqual(messages[0].ruleId, "no-console");
3332
+ assert.strictEqual(messages[1].ruleId, "no-alert");
3333
+
3334
+ assert.strictEqual(suppressedMessages.length, 2);
3335
+ assert.strictEqual(suppressedMessages[0].ruleId, "no-alert");
3336
+ assert.strictEqual(suppressedMessages[1].ruleId, "no-console");
3337
+ });
3338
+
3339
+ it("should report a violation with quoted rule names in eslint-enable", () => {
3340
+ const code = [
3341
+ "/*eslint-disable no-alert, no-console */",
3342
+ "alert('test');",
3343
+ "console.log('test');",
3344
+ "/*eslint-enable 'no-alert'*/",
3345
+ "alert('test');", // here
3346
+ "console.log('test');",
3347
+ "/*eslint-enable \"no-console\"*/",
3348
+ "console.log('test');" // here
3349
+ ].join("\n");
3350
+ const config = { rules: { "no-alert": 1, "no-console": 1 } };
3351
+
3352
+ const messages = linter.verify(code, config, filename);
3353
+ const suppressedMessages = linter.getSuppressedMessages();
3354
+
3355
+ assert.strictEqual(messages.length, 2);
3356
+ assert.strictEqual(messages[0].ruleId, "no-alert");
3357
+ assert.strictEqual(messages[0].line, 5);
3358
+ assert.strictEqual(messages[1].ruleId, "no-console");
3359
+ assert.strictEqual(messages[1].line, 8);
3360
+
3361
+ assert.strictEqual(suppressedMessages.length, 3);
3362
+ assert.strictEqual(suppressedMessages[0].ruleId, "no-alert");
3363
+ assert.strictEqual(suppressedMessages[0].line, 2);
3364
+ assert.strictEqual(suppressedMessages[1].ruleId, "no-console");
3365
+ assert.strictEqual(suppressedMessages[1].line, 3);
3366
+ assert.strictEqual(suppressedMessages[2].ruleId, "no-console");
3367
+ assert.strictEqual(suppressedMessages[2].line, 6);
3368
+ });
3236
3369
});
3237
3370
3238
3371
describe("when evaluating code with comments to enable and disable multiple comma separated rules", () => {
@@ -4813,6 +4946,20 @@ var a = "test2";
4813
4946
output
4814
4947
);
4815
4948
});
4949
+
4950
+ // Test for quoted rule names
4951
+ for (const testcaseForLiteral of [
4952
+ { code: code.replace(/((?:un)?used[\w-]*)/gu, '"$1"'), output: output.replace(/((?:un)?used[\w-]*)/gu, '"$1"') },
4953
+ { code: code.replace(/((?:un)?used[\w-]*)/gu, "'$1'"), output: output.replace(/((?:un)?used[\w-]*)/gu, "'$1'") }
4954
+ ]) {
4955
+ // eslint-disable-next-line no-loop-func -- `linter` is getting updated in beforeEach()
4956
+ it(testcaseForLiteral.code, () => {
4957
+ assert.strictEqual(
4958
+ linter.verifyAndFix(testcaseForLiteral.code, config).output,
4959
+ testcaseForLiteral.output
4960
+ );
4961
+ });
4962
+ }
4816
4963
}
4817
4964
});
4818
4965
});
@@ -13060,6 +13207,60 @@ var a = "test2";
13060
13207
assert.strictEqual(suppressedMessages[1].line, 3);
13061
13208
});
13062
13209
13210
+ it("should report a violation with quoted rule names in eslint-disable", () => {
13211
+ const code = [
13212
+ "/*eslint-disable 'no-alert' */",
13213
+ "alert('test');",
13214
+ "console.log('test');", // here
13215
+ "/*eslint-enable */",
13216
+ "/*eslint-disable \"no-console\" */",
13217
+ "alert('test');", // here
13218
+ "console.log('test');"
13219
+ ].join("\n");
13220
+ const config = { rules: { "no-alert": 1, "no-console": 1 } };
13221
+
13222
+ const messages = linter.verify(code, config, filename);
13223
+ const suppressedMessages = linter.getSuppressedMessages();
13224
+
13225
+ assert.strictEqual(messages.length, 2);
13226
+ assert.strictEqual(messages[0].ruleId, "no-console");
13227
+ assert.strictEqual(messages[1].ruleId, "no-alert");
13228
+
13229
+ assert.strictEqual(suppressedMessages.length, 2);
13230
+ assert.strictEqual(suppressedMessages[0].ruleId, "no-alert");
13231
+ assert.strictEqual(suppressedMessages[1].ruleId, "no-console");
13232
+ });
13233
+
13234
+ it("should report a violation with quoted rule names in eslint-enable", () => {
13235
+ const code = [
13236
+ "/*eslint-disable no-alert, no-console */",
13237
+ "alert('test');",
13238
+ "console.log('test');",
13239
+ "/*eslint-enable 'no-alert'*/",
13240
+ "alert('test');", // here
13241
+ "console.log('test');",
13242
+ "/*eslint-enable \"no-console\"*/",
13243
+ "console.log('test');" // here
13244
+ ].join("\n");
13245
+ const config = { rules: { "no-alert": 1, "no-console": 1 } };
13246
+
13247
+ const messages = linter.verify(code, config, filename);
13248
+ const suppressedMessages = linter.getSuppressedMessages();
13249
+
13250
+ assert.strictEqual(messages.length, 2);
13251
+ assert.strictEqual(messages[0].ruleId, "no-alert");
13252
+ assert.strictEqual(messages[0].line, 5);
13253
+ assert.strictEqual(messages[1].ruleId, "no-console");
13254
+ assert.strictEqual(messages[1].line, 8);
13255
+
13256
+ assert.strictEqual(suppressedMessages.length, 3);
13257
+ assert.strictEqual(suppressedMessages[0].ruleId, "no-alert");
13258
+ assert.strictEqual(suppressedMessages[0].line, 2);
13259
+ assert.strictEqual(suppressedMessages[1].ruleId, "no-console");
13260
+ assert.strictEqual(suppressedMessages[1].line, 3);
13261
+ assert.strictEqual(suppressedMessages[2].ruleId, "no-console");
13262
+ assert.strictEqual(suppressedMessages[2].line, 6);
13263
+ });
13063
13264
});
13064
13265
13065
13266
describe("/*eslint-disable-line*/", () => {
@@ -13293,6 +13494,32 @@ var a = "test2";
13293
13494
assert.strictEqual(suppressedMessages.length, 5);
13294
13495
});
13295
13496
13497
+ it("should report a violation with quoted rule names in eslint-disable-line", () => {
13498
+ const code = [
13499
+ "alert('test'); // eslint-disable-line 'no-alert'",
13500
+ "console.log('test');", // here
13501
+ "alert('test'); // eslint-disable-line \"no-alert\""
13502
+ ].join("\n");
13503
+ const config = {
13504
+ rules: {
13505
+ "no-alert": 1,
13506
+ "no-console": 1
13507
+ }
13508
+ };
13509
+
13510
+ const messages = linter.verify(code, config, filename);
13511
+ const suppressedMessages = linter.getSuppressedMessages();
13512
+
13513
+ assert.strictEqual(messages.length, 1);
13514
+ assert.strictEqual(messages[0].ruleId, "no-console");
13515
+ assert.strictEqual(messages[0].line, 2);
13516
+
13517
+ assert.strictEqual(suppressedMessages.length, 2);
13518
+ assert.strictEqual(suppressedMessages[0].ruleId, "no-alert");
13519
+ assert.strictEqual(suppressedMessages[0].line, 1);
13520
+ assert.strictEqual(suppressedMessages[1].ruleId, "no-alert");
13521
+ assert.strictEqual(suppressedMessages[1].line, 3);
13522
+ });
13296
13523
});
13297
13524
13298
13525
describe("/*eslint-disable-next-line*/", () => {
@@ -13689,6 +13916,31 @@ var a = "test2";
13689
13916
13690
13917
assert.strictEqual(suppressedMessages.length, 0);
13691
13918
});
13919
+
13920
+ it("should ignore violation of specified rule on next line with quoted rule names", () => {
13921
+ const code = [
13922
+ "// eslint-disable-next-line 'no-alert'",
13923
+ "alert('test');",
13924
+ "// eslint-disable-next-line \"no-alert\"",
13925
+ "alert('test');",
13926
+ "console.log('test');"
13927
+ ].join("\n");
13928
+ const config = {
13929
+ rules: {
13930
+ "no-alert": 1,
13931
+ "no-console": 1
13932
+ }
13933
+ };
13934
+ const messages = linter.verify(code, config, filename);
13935
+ const suppressedMessages = linter.getSuppressedMessages();
13936
+
13937
+ assert.strictEqual(messages.length, 1);
13938
+ assert.strictEqual(messages[0].ruleId, "no-console");
13939
+
13940
+ assert.strictEqual(suppressedMessages.length, 2);
13941
+ assert.strictEqual(suppressedMessages[0].ruleId, "no-alert");
13942
+ assert.strictEqual(suppressedMessages[1].ruleId, "no-alert");
13943
+ });
13692
13944
});
13693
13945
13694
13946
describe("descriptions in directive comments", () => {
@@ -15366,6 +15618,20 @@ var a = "test2";
15366
15618
output
15367
15619
);
15368
15620
});
15621
+
15622
+ // Test for quoted rule names
15623
+ for (const testcaseForLiteral of [
15624
+ { code: code.replace(/(test\/[\w-]+)/gu, '"$1"'), output: output.replace(/(test\/[\w-]+)/gu, '"$1"') },
15625
+ { code: code.replace(/(test\/[\w-]+)/gu, "'$1'"), output: output.replace(/(test\/[\w-]+)/gu, "'$1'") }
15626
+ ]) {
15627
+ // eslint-disable-next-line no-loop-func -- `linter` is getting updated in beforeEach()
15628
+ it(testcaseForLiteral.code, () => {
15629
+ assert.strictEqual(
15630
+ linter.verifyAndFix(testcaseForLiteral.code, config).output,
15631
+ testcaseForLiteral.output
15632
+ );
15633
+ });
15634
+ }
15369
15635
}
15370
15636
});
15371
15637
});
0 commit comments