/** * @fileoverview This option sets a specific tab width for your code * @author Dmitriy Shekhovtsov * @author Gyandeep Singh */ "use strict"; //------------------------------------------------------------------------------ // Requirements //------------------------------------------------------------------------------ const rule = require("../../../lib/rules/indent"), { RuleTester } = require("../../../lib/rule-tester"); const fs = require("fs"); const path = require("path"); //------------------------------------------------------------------------------ // Helpers //------------------------------------------------------------------------------ const fixture = fs.readFileSync(path.join(__dirname, "../../fixtures/rules/indent/indent-invalid-fixture-1.js"), "utf8"); const fixedFixture = fs.readFileSync(path.join(__dirname, "../../fixtures/rules/indent/indent-valid-fixture-1.js"), "utf8"); const parser = require("../../fixtures/fixture-parser"); const { unIndent } = require("../../_utils"); /** * Create error message object for failure cases with a single 'found' indentation type * @param {string} providedIndentType indent type of string or tab * @param {Array} providedErrors error info * @returns {Object} returns the error messages collection * @private */ function expectedErrors(providedIndentType, providedErrors) { let indentType; let errors; if (Array.isArray(providedIndentType)) { errors = Array.isArray(providedIndentType[0]) ? providedIndentType : [providedIndentType]; indentType = "space"; } else { errors = Array.isArray(providedErrors[0]) ? providedErrors : [providedErrors]; indentType = providedIndentType; } return errors.map(err => ({ messageId: "wrongIndentation", data: { expected: typeof err[1] === "string" && typeof err[2] === "string" ? err[1] : `${err[1]} ${indentType}${err[1] === 1 ? "" : "s"}`, actual: err[2] }, type: err[3], line: err[0] })); } //------------------------------------------------------------------------------ // Tests //------------------------------------------------------------------------------ const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 8, ecmaFeatures: { jsx: true } } }); ruleTester.run("indent", rule, { valid: [ { code: unIndent` bridge.callHandler( 'getAppVersion', 'test23', function(responseData) { window.ah.mobileAppVersion = responseData; } ); `, options: [2] }, { code: unIndent` bridge.callHandler( 'getAppVersion', 'test23', function(responseData) { window.ah.mobileAppVersion = responseData; }); `, options: [2] }, { code: unIndent` bridge.callHandler( 'getAppVersion', null, function responseCallback(responseData) { window.ah.mobileAppVersion = responseData; } ); `, options: [2] }, { code: unIndent` bridge.callHandler( 'getAppVersion', null, function responseCallback(responseData) { window.ah.mobileAppVersion = responseData; }); `, options: [2] }, { code: unIndent` function doStuff(keys) { _.forEach( keys, key => { doSomething(key); } ); } `, options: [4] }, { code: unIndent` example( function () { console.log('example'); } ); `, options: [4] }, { code: unIndent` let foo = somethingList .filter(x => { return x; }) .map(x => { return 100 * x; }); `, options: [4] }, { code: unIndent` var x = 0 && { a: 1, b: 2 }; `, options: [4] }, { code: unIndent` var x = 0 && \t{ \t\ta: 1, \t\tb: 2 \t}; `, options: ["tab"] }, { code: unIndent` var x = 0 && { a: 1, b: 2 }|| { c: 3, d: 4 }; `, options: [4] }, { code: unIndent` var x = [ 'a', 'b', 'c' ]; `, options: [4] }, { code: unIndent` var x = ['a', 'b', 'c', ]; `, options: [4] }, { code: "var x = 0 && 1;", options: [4] }, { code: "var x = 0 && { a: 1, b: 2 };", options: [4] }, { code: unIndent` var x = 0 && ( 1 ); `, options: [4] }, { code: unIndent` require('http').request({hostname: 'localhost', port: 80}, function(res) { res.end(); }); `, options: [2] }, { code: unIndent` function test() { return client.signUp(email, PASSWORD, { preVerified: true }) .then(function (result) { // hi }) .then(function () { return FunctionalHelpers.clearBrowserState(self, { contentServer: true, contentServer1: true }); }); } `, options: [2] }, { code: unIndent` it('should... some lengthy test description that is forced to be' + 'wrapped into two lines since the line length limit is set', () => { expect(true).toBe(true); }); `, options: [2] }, { code: unIndent` function test() { return client.signUp(email, PASSWORD, { preVerified: true }) .then(function (result) { var x = 1; var y = 1; }, function(err){ var o = 1 - 2; var y = 1 - 2; return true; }) } `, options: [4] }, { // https://github.com/eslint/eslint/issues/11802 code: unIndent` import foo from "foo" ;(() => {})() `, options: [4], parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` function test() { return client.signUp(email, PASSWORD, { preVerified: true }) .then(function (result) { var x = 1; var y = 1; }, function(err){ var o = 1 - 2; var y = 1 - 2; return true; }); } `, options: [4, { MemberExpression: 0 }] }, { code: "// hi", options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` var Command = function() { var fileList = [], files = [] files.concat(fileList) }; `, options: [2, { VariableDeclarator: { var: 2, let: 2, const: 3 } }] }, { code: " ", options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` if(data) { console.log('hi'); b = true;}; `, options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` foo = () => { console.log('hi'); return true;}; `, options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` function test(data) { console.log('hi'); return true;}; `, options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` var test = function(data) { console.log('hi'); }; `, options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` arr.forEach(function(data) { otherdata.forEach(function(zero) { console.log('hi'); }) }); `, options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` a = [ ,3 ] `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` [ ['gzip', 'gunzip'], ['gzip', 'unzip'], ['deflate', 'inflate'], ['deflateRaw', 'inflateRaw'], ].forEach(function(method) { console.log(method); }); `, options: [2, { SwitchCase: 1, VariableDeclarator: 2 }] }, { code: unIndent` test(123, { bye: { hi: [1, { b: 2 } ] } }); `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` var xyz = 2, lmn = [ { a: 1 } ]; `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` lmnn = [{ a: 1 }, { b: 2 }, { x: 2 }]; `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }] }, unIndent` [{ foo: 1 }, { foo: 2 }, { foo: 3 }] `, unIndent` foo([ bar ], [ baz ], [ qux ]); `, { code: unIndent` abc({ test: [ [ c, xyz, 2 ].join(',') ] }); `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` abc = { test: [ [ c, xyz, 2 ] ] }; `, options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` abc( { a: 1, b: 2 } ); `, options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` abc({ a: 1, b: 2 }); `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` var abc = [ c, xyz, { a: 1, b: 2 } ]; `, options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` var abc = [ c, xyz, { a: 1, b: 2 } ]; `, options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` var abc = 5, c = 2, xyz = { a: 1, b: 2 }; `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, unIndent` var x = { a: 1, }, y = { b: 2 } `, unIndent` const x = { a: 1, }, y = { b: 2 } `, unIndent` let x = { a: 1, }, y = { b: 2 } `, unIndent` var foo = { a: 1 }, bar = { b: 2 }; `, unIndent` var foo = { a: 1 }, bar = { b: 2 }, baz = { c: 3 } `, unIndent` const { foo } = 1, bar = 2 `, { code: unIndent` var foo = 1, bar = 2 `, options: [2, { VariableDeclarator: 1 }] }, { code: unIndent` var foo = 1, bar = 2 `, options: [2, { VariableDeclarator: 1 }] }, { code: unIndent` var foo = 1, bar = 2 `, options: [2, { VariableDeclarator: 1 }] }, { code: unIndent` var foo = 1, bar = 2 `, options: [2, { VariableDeclarator: 1 }] }, { code: unIndent` var foo = (1), bar = (2) `, options: [2, { VariableDeclarator: 1 }] }, { code: unIndent` let foo = 'foo', bar = bar; const a = 'a', b = 'b'; `, options: [2, { VariableDeclarator: "first" }] }, { code: unIndent` let foo = 'foo', bar = bar // <-- no semicolon here const a = 'a', b = 'b' // <-- no semicolon here `, options: [2, { VariableDeclarator: "first" }] }, { code: unIndent` var foo = 1, bar = 2, baz = 3 ; `, options: [2, { VariableDeclarator: { var: 2 } }] }, { code: unIndent` var foo = 1, bar = 2, baz = 3 ; `, options: [2, { VariableDeclarator: { var: 2 } }] }, { code: unIndent` var foo = 'foo', bar = bar; `, options: [2, { VariableDeclarator: { var: "first" } }] }, { code: unIndent` var foo = 'foo', bar = 'bar' // <-- no semicolon here `, options: [2, { VariableDeclarator: { var: "first" } }] }, { code: unIndent` let foo = 1, bar = 2, baz `, options: [2, { VariableDeclarator: "first" }] }, { code: unIndent` let foo `, options: [4, { VariableDeclarator: "first" }] }, { code: unIndent` let foo = 1, bar = 2 `, options: [2, { VariableDeclarator: "first" }] }, { code: unIndent` var abc = { a: 1, b: 2 }; `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` var a = new abc({ a: 1, b: 2 }), b = 2; `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` var a = 2, c = { a: 1, b: 2 }, b = 2; `, options: [2, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` var x = 2, y = { a: 1, b: 2 }, b = 2; `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` var e = { a: 1, b: 2 }, b = 2; `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` var a = { a: 1, b: 2 }; `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` function test() { if (true || false){ console.log(val); } } `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, unIndent` var foo = bar || !( baz ); `, unIndent` for (var foo = 1; foo < 10; foo++) {} `, unIndent` for ( var foo = 1; foo < 10; foo++ ) {} `, { code: unIndent` for (var val in obj) if (true) console.log(val); `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` with (a) b(); `, options: [4] }, { code: unIndent` with (a) b(); c(); `, options: [4] }, { code: unIndent` if(true) if (true) if (true) console.log(val); `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` function hi(){ var a = 1; y++; x++; } `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` for(;length > index; index++)if(NO_HOLES || index in self){ x++; } `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` function test(){ switch(length){ case 1: return function(a){ return fn.call(that, a); }; } } `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` var geometry = 2, rotate = 2; `, options: [2, { VariableDeclarator: 0 }] }, { code: unIndent` var geometry, rotate; `, options: [4, { VariableDeclarator: 1 }] }, { code: unIndent` var geometry, \trotate; `, options: ["tab", { VariableDeclarator: 1 }] }, { code: unIndent` var geometry, rotate; `, options: [2, { VariableDeclarator: 1 }] }, { code: unIndent` var geometry, rotate; `, options: [2, { VariableDeclarator: 2 }] }, { code: unIndent` let geometry, rotate; `, options: [2, { VariableDeclarator: 2 }] }, { code: unIndent` const geometry = 2, rotate = 3; `, options: [2, { VariableDeclarator: 2 }] }, { code: unIndent` var geometry, box, face1, face2, colorT, colorB, sprite, padding, maxWidth, height, rotate; `, options: [2, { SwitchCase: 1 }] }, { code: "var geometry, box, face1, face2, colorT, colorB, sprite, padding, maxWidth;", options: [2, { SwitchCase: 1 }] }, { code: unIndent` if (1 < 2){ //hi sd } `, options: [2] }, { code: unIndent` while (1 < 2){ //hi sd } `, options: [2] }, { code: "while (1 < 2) console.log('hi');", options: [2] }, { code: unIndent` [a, boop, c].forEach((index) => { index; }); `, options: [4] }, { code: unIndent` [a, b, c].forEach(function(index){ return index; }); `, options: [4] }, { code: unIndent` [a, b, c].forEach((index) => { index; }); `, options: [4] }, { code: unIndent` [a, b, c].forEach(function(index){ return index; }); `, options: [4] }, { code: unIndent` (foo) .bar([ baz ]); `, options: [4, { MemberExpression: 1 }] }, { code: unIndent` switch (x) { case "foo": a(); break; case "bar": switch (y) { case "1": break; case "2": a = 6; break; } case "test": break; } `, options: [4, { SwitchCase: 1 }] }, { code: unIndent` switch (x) { case "foo": a(); break; case "bar": switch (y) { case "1": break; case "2": a = 6; break; } case "test": break; } `, options: [4, { SwitchCase: 2 }] }, unIndent` switch (a) { case "foo": a(); break; case "bar": switch(x){ case '1': break; case '2': a = 6; break; } } `, unIndent` switch (a) { case "foo": a(); break; case "bar": if(x){ a = 2; } else{ a = 6; } } `, unIndent` switch (a) { case "foo": a(); break; case "bar": if(x){ a = 2; } else a = 6; } `, unIndent` switch (a) { case "foo": a(); break; case "bar": a(); break; case "baz": a(); break; } `, unIndent` switch (0) { } `, unIndent` function foo() { var a = "a"; switch(a) { case "a": return "A"; case "b": return "B"; } } foo(); `, { code: unIndent` switch(value){ case "1": case "2": a(); break; default: a(); break; } switch(value){ case "1": a(); break; case "2": break; default: break; } `, options: [4, { SwitchCase: 1 }] }, unIndent` var obj = {foo: 1, bar: 2}; with (obj) { console.log(foo + bar); } `, unIndent` if (a) { (1 + 2 + 3); // no error on this line } `, "switch(value){ default: a(); break; }", { code: unIndent` import {addons} from 'react/addons' import React from 'react' `, options: [2], parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` import { foo, bar, baz } from 'qux'; `, parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` var foo = 0, bar = 0; baz = 0; export { foo, bar, baz } from 'qux'; `, parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` var a = 1, b = 2, c = 3; `, options: [4] }, { code: unIndent` var a = 1 ,b = 2 ,c = 3; `, options: [4] }, { code: "while (1 < 2) console.log('hi')", options: [2] }, { code: unIndent` function salutation () { switch (1) { case 0: return console.log('hi') case 1: return console.log('hey') } } `, options: [2, { SwitchCase: 1 }] }, { code: unIndent` var items = [ { foo: 'bar' } ]; `, options: [2, { VariableDeclarator: 2 }] }, { code: unIndent` const a = 1, b = 2; const items1 = [ { foo: 'bar' } ]; const items2 = Items( { foo: 'bar' } ); `, options: [2, { VariableDeclarator: 3 }] }, { code: unIndent` const geometry = 2, rotate = 3; var a = 1, b = 2; let light = true, shadow = false; `, options: [2, { VariableDeclarator: { const: 3, let: 2 } }] }, { code: unIndent` const abc = 5, c = 2, xyz = { a: 1, b: 2 }; let abc2 = 5, c2 = 2, xyz2 = { a: 1, b: 2 }; var abc3 = 5, c3 = 2, xyz3 = { a: 1, b: 2 }; `, options: [2, { VariableDeclarator: { var: 2, const: 3 }, SwitchCase: 1 }] }, { code: unIndent` module.exports = { 'Unit tests': { rootPath: './', environment: 'node', tests: [ 'test/test-*.js' ], sources: [ '*.js', 'test/**.js' ] } }; `, options: [2] }, { code: unIndent` foo = bar; `, options: [2] }, { code: unIndent` foo = ( bar ); `, options: [2] }, { code: unIndent` var path = require('path') , crypto = require('crypto') ; `, options: [2] }, unIndent` var a = 1 ,b = 2 ; `, { code: unIndent` export function create (some, argument) { return Object.create({ a: some, b: argument }); }; `, options: [2, { FunctionDeclaration: { parameters: "first" } }], parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` export function create (id, xfilter, rawType, width=defaultWidth, height=defaultHeight, footerHeight=defaultFooterHeight, padding=defaultPadding) { // ... function body, indented two spaces } `, options: [2, { FunctionDeclaration: { parameters: "first" } }], parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` var obj = { foo: function () { return new p() .then(function (ok) { return ok; }, function () { // ignore things }); } }; `, options: [2] }, { code: unIndent` a.b() .c(function(){ var a; }).d.e; `, options: [2] }, { code: unIndent` const YO = 'bah', TE = 'mah' var res, a = 5, b = 4 `, options: [2, { VariableDeclarator: { var: 2, let: 2, const: 3 } }] }, { code: unIndent` const YO = 'bah', TE = 'mah' var res, a = 5, b = 4 if (YO) console.log(TE) `, options: [2, { VariableDeclarator: { var: 2, let: 2, const: 3 } }] }, { code: unIndent` var foo = 'foo', bar = 'bar', baz = function() { } function hello () { } `, options: [2] }, { code: unIndent` var obj = { send: function () { return P.resolve({ type: 'POST' }) .then(function () { return true; }, function () { return false; }); } }; `, options: [2] }, { code: unIndent` var obj = { send: function () { return P.resolve({ type: 'POST' }) .then(function () { return true; }, function () { return false; }); } }; `, options: [2, { MemberExpression: 0 }] }, unIndent` const someOtherFunction = argument => { console.log(argument); }, someOtherValue = 'someOtherValue'; `, { code: unIndent` [ 'a', 'b' ].sort().should.deepEqual([ 'x', 'y' ]); `, options: [2] }, { code: unIndent` var a = 1, B = class { constructor(){} a(){} get b(){} }; `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` var a = 1, B = class { constructor(){} a(){} get b(){} }, c = 3; `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }] }, { code: unIndent` class A{ constructor(){} a(){} get b(){} } `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` var A = class { constructor(){} a(){} get b(){} } `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }] }, { code: unIndent` var a = { some: 1 , name: 2 }; `, options: [2] }, { code: unIndent` a.c = { aa: function() { 'test1'; return 'aa'; } , bb: function() { return this.bb(); } }; `, options: [4] }, { code: unIndent` var a = { actions: [ { name: 'compile' } ] }; `, options: [4, { VariableDeclarator: 0, SwitchCase: 1 }] }, { code: unIndent` var a = [ { name: 'compile' } ]; `, options: [4, { VariableDeclarator: 0, SwitchCase: 1 }] }, unIndent` [[ ], function( foo ) {} ] `, unIndent` define([ 'foo' ], function( bar ) { baz; } ) `, { code: unIndent` const func = function (opts) { return Promise.resolve() .then(() => { [ 'ONE', 'TWO' ].forEach(command => { doSomething(); }); }); }; `, options: [4, { MemberExpression: 0 }] }, { code: unIndent` const func = function (opts) { return Promise.resolve() .then(() => { [ 'ONE', 'TWO' ].forEach(command => { doSomething(); }); }); }; `, options: [4] }, { code: unIndent` var haveFun = function () { SillyFunction( { value: true, }, { _id: true, } ); }; `, options: [4] }, { code: unIndent` var haveFun = function () { new SillyFunction( { value: true, }, { _id: true, } ); }; `, options: [4] }, { code: unIndent` let object1 = { doThing() { return _.chain([]) .map(v => ( { value: true, } )) .value(); } }; `, options: [2] }, { code: unIndent` var foo = { bar: 1, baz: { qux: 2 } }, bar = 1; `, options: [2] }, { code: unIndent` class Foo extends Bar { baz() {} } `, options: [2] }, { code: unIndent` class Foo extends Bar { baz() {} } `, options: [2] }, { code: unIndent` class Foo extends ( Bar ) { baz() {} } `, options: [2] }, { code: unIndent` fs.readdirSync(path.join(__dirname, '../rules')).forEach(name => { files[name] = foo; }); `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` (function(){ function foo(x) { return x + 1; } })(); `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` (function(){ function foo(x) { return x + 1; } })(); `, options: [4, { outerIIFEBody: 2 }] }, { code: unIndent` (function(x, y){ function foo(x) { return x + 1; } })(1, 2); `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` (function(){ function foo(x) { return x + 1; } }()); `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` !function(){ function foo(x) { return x + 1; } }(); `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` !function(){ \t\t\tfunction foo(x) { \t\t\t\treturn x + 1; \t\t\t} }(); `, options: ["tab", { outerIIFEBody: 3 }] }, { code: unIndent` var out = function(){ function fooVar(x) { return x + 1; } }; `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` var ns = function(){ function fooVar(x) { return x + 1; } }(); `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` ns = function(){ function fooVar(x) { return x + 1; } }(); `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` var ns = (function(){ function fooVar(x) { return x + 1; } }(x)); `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` var ns = (function(){ function fooVar(x) { return x + 1; } }(x)); `, options: [4, { outerIIFEBody: 2 }] }, { code: unIndent` var obj = { foo: function() { return true; } }; `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` while ( function() { return true; }()) { x = x + 1; }; `, options: [2, { outerIIFEBody: 20 }] }, { code: unIndent` (() => { function foo(x) { return x + 1; } })(); `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` function foo() { } `, options: ["tab", { outerIIFEBody: 0 }] }, { code: unIndent` ;(() => { function foo(x) { return x + 1; } })(); `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` if(data) { console.log('hi'); } `, options: [2, { outerIIFEBody: 0 }] }, { code: unIndent` (function(x) { return x + 1; })(); `, options: [4, { outerIIFEBody: "off" }] }, { code: unIndent` (function(x) { return x + 1; })(); `, options: [4, { outerIIFEBody: "off" }] }, { code: unIndent` ;(() => { function x(y) { return y + 1; } })(); `, options: [4, { outerIIFEBody: "off" }] }, { code: unIndent` ;(() => { function x(y) { return y + 1; } })(); `, options: [4, { outerIIFEBody: "off" }] }, { code: unIndent` function foo() { } `, options: [4, { outerIIFEBody: "off" }] }, { code: "Buffer.length", options: [4, { MemberExpression: 1 }] }, { code: unIndent` Buffer .indexOf('a') .toString() `, options: [4, { MemberExpression: 1 }] }, { code: unIndent` Buffer. length `, options: [4, { MemberExpression: 1 }] }, { code: unIndent` Buffer .foo .bar `, options: [4, { MemberExpression: 1 }] }, { code: unIndent` Buffer \t.foo \t.bar `, options: ["tab", { MemberExpression: 1 }] }, { code: unIndent` Buffer .foo .bar `, options: [2, { MemberExpression: 2 }] }, unIndent` ( foo .bar ) `, unIndent` ( ( foo .bar ) ) `, unIndent` ( foo ) .bar `, unIndent` ( ( foo ) .bar ) `, unIndent` ( ( foo ) [ ( bar ) ] ) `, unIndent` ( foo[bar] ) .baz `, unIndent` ( (foo.bar) ) .baz `, { code: unIndent` MemberExpression .can .be .turned .off(); `, options: [4, { MemberExpression: "off" }] }, { code: unIndent` foo = bar.baz() .bip(); `, options: [4, { MemberExpression: 1 }] }, unIndent` function foo() { new .target } `, unIndent` function foo() { new. target } `, { code: unIndent` if (foo) { bar(); } else if (baz) { foobar(); } else if (qux) { qux(); } `, options: [2] }, { code: unIndent` function foo(aaa, bbb, ccc, ddd) { bar(); } `, options: [2, { FunctionDeclaration: { parameters: 1, body: 2 } }] }, { code: unIndent` function foo(aaa, bbb, ccc, ddd) { bar(); } `, options: [2, { FunctionDeclaration: { parameters: 3, body: 1 } }] }, { code: unIndent` function foo(aaa, bbb, ccc) { bar(); } `, options: [4, { FunctionDeclaration: { parameters: 1, body: 3 } }] }, { code: unIndent` function foo(aaa, bbb, ccc, ddd, eee, fff) { bar(); } `, options: [2, { FunctionDeclaration: { parameters: "first", body: 1 } }] }, { code: unIndent` function foo(aaa, bbb) { bar(); } `, options: [2, { FunctionDeclaration: { body: 3 } }] }, { code: unIndent` function foo( aaa, bbb) { bar(); } `, options: [2, { FunctionDeclaration: { parameters: "first", body: 2 } }] }, { code: unIndent` var foo = function(aaa, bbb, ccc, ddd) { bar(); } `, options: [2, { FunctionExpression: { parameters: 2, body: 0 } }] }, { code: unIndent` var foo = function(aaa, bbb, ccc) { bar(); } `, options: [2, { FunctionExpression: { parameters: 1, body: 10 } }] }, { code: unIndent` var foo = function(aaa, bbb, ccc, ddd, eee, fff) { bar(); } `, options: [4, { FunctionExpression: { parameters: "first", body: 1 } }] }, { code: unIndent` var foo = function( aaa, bbb, ccc, ddd, eee) { bar(); } `, options: [2, { FunctionExpression: { parameters: "first", body: 3 } }] }, { code: unIndent` foo.bar( baz, qux, function() { qux; } ); `, options: [2, { FunctionExpression: { body: 3 }, CallExpression: { arguments: 3 } }] }, { code: unIndent` function foo() { bar(); \tbaz(); \t \t\t\t \t\t\t \t \tqux(); } `, options: [2] }, { code: unIndent` function foo() { function bar() { baz(); } } `, options: [2, { FunctionDeclaration: { body: 1 } }] }, { code: unIndent` function foo() { bar(); \t\t} `, options: [2] }, { code: unIndent` function foo() { function bar(baz, qux) { foobar(); } } `, options: [2, { FunctionDeclaration: { body: 1, parameters: 2 } }] }, { code: unIndent` (( foo )) `, options: [4] }, // ternary expressions (https://github.com/eslint/eslint/issues/7420) { code: unIndent` foo ? bar : baz `, options: [2] }, { code: unIndent` foo = (bar ? baz : qux ); `, options: [2] }, { code: unIndent` condition ? () => { return true } : condition2 ? () => { return true } : () => { return false } `, options: [2] }, { code: unIndent` condition ? () => { return true } : condition2 ? () => { return true } : () => { return false } `, options: [2, { offsetTernaryExpressions: false }] }, { code: unIndent` condition ? () => { return true } : condition2 ? () => { return true } : () => { return false } `, options: [2, { offsetTernaryExpressions: true }] }, { code: unIndent` condition ? () => { return true } : condition2 ? () => { return true } : () => { return false } `, options: [4, { offsetTernaryExpressions: true }] }, { code: unIndent` condition1 ? condition2 ? Promise.resolve(1) : Promise.resolve(2) : Promise.resolve(3) `, options: [2, { offsetTernaryExpressions: true }] }, { code: unIndent` condition1 ? Promise.resolve(1) : condition2 ? Promise.resolve(2) : Promise.resolve(3) `, options: [2, { offsetTernaryExpressions: true }] }, { code: unIndent` condition \t? () => { \t\t\treturn true \t\t} \t: condition2 \t\t? () => { \t\t\t\treturn true \t\t\t} \t\t: () => { \t\t\t\treturn false \t\t\t} `, options: ["tab", { offsetTernaryExpressions: true }] }, unIndent` [ foo ? bar : baz, qux ]; `, { /* * Checking comments: * https://github.com/eslint/eslint/issues/3845, https://github.com/eslint/eslint/issues/6571 */ code: unIndent` foo(); // Line /* multiline Line */ bar(); // trailing comment `, options: [2] }, { code: unIndent` switch (foo) { case bar: baz(); // call the baz function } `, options: [2, { SwitchCase: 1 }] }, { code: unIndent` switch (foo) { case bar: baz(); // no default } `, options: [2, { SwitchCase: 1 }] }, unIndent` [ // no elements ] `, { /* * Destructuring assignments: * https://github.com/eslint/eslint/issues/6813 */ code: unIndent` var { foo, bar, baz: qux, foobar: baz = foobar } = qux; `, options: [2] }, { code: unIndent` var [ foo, bar, baz, foobar = baz ] = qux; `, options: [2] }, { code: unIndent` const { a } = { a: 1 } `, options: [2] }, { code: unIndent` const { a } = { a: 1 } `, options: [2] }, { code: unIndent` const { a } = { a: 1 }; `, options: [2] }, { code: unIndent` const foo = { bar: 1 } `, options: [2] }, { code: unIndent` const [ a ] = [ 1 ] `, options: [2] }, { // https://github.com/eslint/eslint/issues/7233 code: unIndent` var folder = filePath .foo() .bar; `, options: [2, { MemberExpression: 2 }] }, { code: unIndent` for (const foo of bar) baz(); `, options: [2] }, { code: unIndent` var x = () => 5; `, options: [2] }, unIndent` ( foo )( bar ) `, unIndent` (() => foo )( bar ) `, unIndent` (() => { foo(); })( bar ) `, { // Don't lint the indentation of the first token after a : code: unIndent` ({code: "foo.bar();"}) `, options: [2] }, { // Don't lint the indentation of the first token after a : code: unIndent` ({code: "foo.bar();"}) `, options: [2] }, unIndent` ({ foo: bar }) `, unIndent` ({ [foo]: bar }) `, { // Comments in switch cases code: unIndent` switch (foo) { // comment case study: // comment bar(); case closed: /* multiline comment */ } `, options: [2, { SwitchCase: 1 }] }, { // Comments in switch cases code: unIndent` switch (foo) { // comment case study: // the comment can also be here case closed: } `, options: [2, { SwitchCase: 1 }] }, { // BinaryExpressions with parens code: unIndent` foo && ( bar ) `, options: [4] }, { // BinaryExpressions with parens code: unIndent` foo && (( bar )) `, options: [4] }, { code: unIndent` foo && ( bar ) `, options: [4] }, unIndent` foo && !bar( ) `, unIndent` foo && ![].map(() => { bar(); }) `, { code: unIndent` foo = bar; `, options: [4] }, { code: unIndent` function foo() { var bar = function(baz, qux) { foobar(); }; } `, options: [2, { FunctionExpression: { parameters: 3 } }] }, unIndent` function foo() { return (bar === 1 || bar === 2 && (/Function/.test(grandparent.type))) && directives(parent).indexOf(node) >= 0; } `, { code: unIndent` function foo() { return (foo === bar || ( baz === qux && ( foo === foo || bar === bar || baz === baz ) )) } `, options: [4] }, unIndent` if ( foo === 1 || bar === 1 || // comment (baz === 1 && qux === 1) ) {} `, { code: unIndent` foo = (bar + baz); `, options: [2] }, { code: unIndent` function foo() { return (bar === 1 || bar === 2) && (z === 3 || z === 4); } `, options: [2] }, { code: unIndent` /* comment */ if (foo) { bar(); } `, options: [2] }, { // Comments at the end of if blocks that have `else` blocks can either refer to the lines above or below them code: unIndent` if (foo) { bar(); // Otherwise, if foo is false, do baz. // baz is very important. } else { baz(); } `, options: [2] }, { code: unIndent` function foo() { return ((bar === 1 || bar === 2) && (z === 3 || z === 4)); } `, options: [2] }, { code: unIndent` foo( bar, baz, qux ); `, options: [2, { CallExpression: { arguments: 1 } }] }, { code: unIndent` foo( \tbar, \tbaz, \tqux ); `, options: ["tab", { CallExpression: { arguments: 1 } }] }, { code: unIndent` foo(bar, baz, qux); `, options: [4, { CallExpression: { arguments: 2 } }] }, { code: unIndent` foo( bar, baz, qux ); `, options: [2, { CallExpression: { arguments: 0 } }] }, { code: unIndent` foo(bar, baz, qux ); `, options: [2, { CallExpression: { arguments: "first" } }] }, { code: unIndent` foo(bar, baz, qux, barbaz, barqux, bazqux); `, options: [2, { CallExpression: { arguments: "first" } }] }, { code: unIndent` foo(bar, 1 + 2, !baz, new Car('!') ); `, options: [2, { CallExpression: { arguments: 4 } }] }, unIndent` foo( (bar) ); `, { code: unIndent` foo( (bar) ); `, options: [4, { CallExpression: { arguments: 1 } }] }, // https://github.com/eslint/eslint/issues/7484 { code: unIndent` var foo = function() { return bar( [{ }].concat(baz) ); }; `, options: [2] }, // https://github.com/eslint/eslint/issues/7573 { code: unIndent` return ( foo ); `, parserOptions: { ecmaFeatures: { globalReturn: true } } }, { code: unIndent` return ( foo ) `, parserOptions: { ecmaFeatures: { globalReturn: true } } }, unIndent` var foo = [ bar, baz ] `, unIndent` var foo = [bar, baz, qux ] `, { code: unIndent` var foo = [bar, baz, qux ] `, options: [2, { ArrayExpression: 0 }] }, { code: unIndent` var foo = [bar, baz, qux ] `, options: [2, { ArrayExpression: 8 }] }, { code: unIndent` var foo = [bar, baz, qux ] `, options: [2, { ArrayExpression: "first" }] }, { code: unIndent` var foo = [bar, baz, qux ] `, options: [2, { ArrayExpression: "first" }] }, { code: unIndent` var foo = [ { bar: 1, baz: 2 }, { bar: 3, baz: 4 } ] `, options: [4, { ArrayExpression: 2, ObjectExpression: "first" }] }, { code: unIndent` var foo = { bar: 1, baz: 2 }; `, options: [2, { ObjectExpression: 0 }] }, { code: unIndent` var foo = { foo: 1, bar: 2, baz: 3 } `, options: [2, { ObjectExpression: "first" }] }, { code: unIndent` var foo = [ { foo: 1 } ] `, options: [4, { ArrayExpression: 2 }] }, { code: unIndent` function foo() { [ foo ] } `, options: [2, { ArrayExpression: 4 }] }, { code: "[\n]", options: [2, { ArrayExpression: "first" }] }, { code: "[\n]", options: [2, { ArrayExpression: 1 }] }, { code: "{\n}", options: [2, { ObjectExpression: "first" }] }, { code: "{\n}", options: [2, { ObjectExpression: 1 }] }, { code: unIndent` var foo = [ [ 1 ] ] `, options: [2, { ArrayExpression: "first" }] }, { code: unIndent` var foo = [ 1, [ 2 ] ]; `, options: [2, { ArrayExpression: "first" }] }, { code: unIndent` var foo = bar(1, [ 2, 3 ] ); `, options: [4, { ArrayExpression: "first", CallExpression: { arguments: "first" } }] }, { code: unIndent` var foo = [ ]() `, options: [4, { CallExpression: { arguments: "first" }, ArrayExpression: "first" }] }, // https://github.com/eslint/eslint/issues/7732 { code: unIndent` const lambda = foo => { Object.assign({}, filterName, { display } ); } `, options: [2, { ObjectExpression: 1 }] }, { code: unIndent` const lambda = foo => { Object.assign({}, filterName, { display } ); } `, options: [2, { ObjectExpression: "first" }] }, // https://github.com/eslint/eslint/issues/7733 { code: unIndent` var foo = function() { \twindow.foo('foo', \t\t{ \t\t\tfoo: 'bar', \t\t\tbar: { \t\t\t\tfoo: 'bar' \t\t\t} \t\t} \t); } `, options: ["tab"] }, { code: unIndent` echo = spawn('cmd.exe', ['foo', 'bar', 'baz']); `, options: [2, { ArrayExpression: "first", CallExpression: { arguments: "first" } }] }, { code: unIndent` if (foo) bar(); // Otherwise, if foo is false, do baz. // baz is very important. else { baz(); } `, options: [2] }, { code: unIndent` if ( foo && bar || baz && qux // This line is ignored because BinaryExpressions are not checked. ) { qux(); } `, options: [4] }, unIndent` [ ] || [ ] `, unIndent` ( [ ] || [ ] ) `, unIndent` 1 + ( 1 ) `, unIndent` ( foo && ( bar || baz ) ) `, unIndent` foo || ( bar ) `, unIndent` foo || ( bar ) `, { code: unIndent` var foo = 1; `, options: [4, { VariableDeclarator: 2 }] }, { code: unIndent` var foo = 1, bar = 2; `, options: [4] }, { code: unIndent` switch (foo) { case bar: { baz(); } } `, options: [2, { SwitchCase: 1 }] }, // Template curlies { code: unIndent` \`foo\${ bar}\` `, options: [2] }, { code: unIndent` \`foo\${ \`bar\${ baz}\`}\` `, options: [2] }, { code: unIndent` \`foo\${ \`bar\${ baz }\` }\` `, options: [2] }, { code: unIndent` \`foo\${ ( bar ) }\` `, options: [2] }, unIndent` foo(\` bar \`, { baz: 1 }); `, unIndent` function foo() { \`foo\${bar}baz\${ qux}foo\${ bar}baz\` } `, unIndent` JSON .stringify( { ok: true } ); `, // Don't check AssignmentExpression assignments unIndent` foo = bar = baz; `, unIndent` foo = bar = baz; `, unIndent` function foo() { const template = \`this indentation is not checked because it's part of a template literal.\`; } `, unIndent` function foo() { const template = \`the indentation of a \${ node.type } node is checked.\`; } `, { // https://github.com/eslint/eslint/issues/7320 code: unIndent` JSON .stringify( { test: 'test' } ); `, options: [4, { CallExpression: { arguments: 1 } }] }, unIndent` [ foo, // comment // another comment bar ] `, unIndent` if (foo) { /* comment */ bar(); } `, unIndent` function foo() { return ( 1 ); } `, unIndent` function foo() { return ( 1 ) } `, unIndent` if ( foo && !( bar ) ) {} `, { // https://github.com/eslint/eslint/issues/6007 code: unIndent` var abc = [ ( '' ), def, ] `, options: [2] }, { code: unIndent` var abc = [ ( '' ), ( 'bar' ) ] `, options: [2] }, unIndent` function f() { return asyncCall() .then( 'some string', [ 1, 2, 3 ] ); } `, { // https://github.com/eslint/eslint/issues/6670 code: unIndent` function f() { return asyncCall() .then( 'some string', [ 1, 2, 3 ] ); } `, options: [4, { MemberExpression: 1 }] }, // https://github.com/eslint/eslint/issues/7242 unIndent` var x = [ [1], [2] ] `, unIndent` var y = [ {a: 1}, {b: 2} ] `, unIndent` foo( ) `, { // https://github.com/eslint/eslint/issues/7616 code: unIndent` foo( bar, { baz: 1 } ) `, options: [4, { CallExpression: { arguments: "first" } }] }, "new Foo", "new (Foo)", unIndent` if (Foo) { new Foo } `, { code: unIndent` var foo = 0, bar = 0, baz = 0; export { foo, bar, baz } `, parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` var a = foo ? bar : baz ? qux : foobar ? boop : /*else*/ beep `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` var a = foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` var a = foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` a = foo ? bar : baz ? qux : foobar ? boop : /*else*/ beep `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` a = foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` a = foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` foo( foo ? bar : baz ? qux : foobar ? boop : /*else*/ beep ) `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` function wrap() { return ( foo ? bar : baz ? qux : foobar ? boop : /*else*/ beep ) } `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` function wrap() { return foo ? bar : baz } `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` function wrap() { return ( foo ? bar : baz ) } `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` foo( foo ? bar : baz ) `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` foo(foo ? bar : baz ) `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, options: [4, { flatTernaryExpressions: false }] }, { code: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, options: [4, { flatTernaryExpressions: false }] }, { code: "[,]", options: [2, { ArrayExpression: "first" }] }, { code: "[,]", options: [2, { ArrayExpression: "off" }] }, { code: unIndent` [ , foo ] `, options: [4, { ArrayExpression: "first" }] }, { code: "[sparse, , array];", options: [2, { ArrayExpression: "first" }] }, { code: unIndent` foo.bar('baz', function(err) { qux; }); `, options: [2, { CallExpression: { arguments: "first" } }] }, { code: unIndent` foo.bar(function() { cookies; }).baz(function() { cookies; }); `, options: [2, { MemberExpression: 1 }] }, { code: unIndent` foo.bar().baz(function() { cookies; }).qux(function() { cookies; }); `, options: [2, { MemberExpression: 1 }] }, { code: unIndent` ( { foo: 1, baz: 2 } ); `, options: [2, { ObjectExpression: "first" }] }, { code: unIndent` foo(() => { bar; }, () => { baz; }) `, options: [4, { CallExpression: { arguments: "first" } }] }, { code: unIndent` [ foo, bar ].forEach(function() { baz; }) `, options: [2, { ArrayExpression: "first", MemberExpression: 1 }] }, unIndent` foo = bar[ baz ]; `, { code: unIndent` foo[ bar ]; `, options: [4, { MemberExpression: 1 }] }, { code: unIndent` foo[ ( bar ) ]; `, options: [4, { MemberExpression: 1 }] }, unIndent` if (foo) bar; else if (baz) qux; `, unIndent` if (foo) bar() ; [1, 2, 3].map(baz) `, unIndent` if (foo) ; `, "x => {}", { code: unIndent` import {foo} from 'bar'; `, parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: "import 'foo'", parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` import { foo, bar, baz, } from 'qux'; `, options: [4, { ImportDeclaration: 1 }], parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` import { foo, bar, baz, } from 'qux'; `, options: [4, { ImportDeclaration: 1 }], parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` import { apple as a, banana as b } from 'fruits'; import { cat } from 'animals'; `, options: [4, { ImportDeclaration: "first" }], parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` import { declaration, can, be, turned } from 'off'; `, options: [4, { ImportDeclaration: "off" }], parserOptions: { ecmaVersion: 6, sourceType: "module" } }, // https://github.com/eslint/eslint/issues/8455 unIndent` ( a ) => b => { c } `, unIndent` ( a ) => b => c => d => { e } `, unIndent` ( a ) => ( b ) => { c } `, unIndent` if ( foo ) bar( baz ); `, unIndent` if (foo) { bar(); } `, unIndent` function foo(bar) { baz(); } `, unIndent` () => ({}) `, unIndent` () => (({})) `, unIndent` ( () => ({}) ) `, unIndent` var x = function foop(bar) { baz(); } `, unIndent` var x = (bar) => { baz(); } `, unIndent` class Foo { constructor() { foo(); } bar() { baz(); } } `, unIndent` class Foo extends Bar { constructor() { foo(); } bar() { baz(); } } `, unIndent` ( class Foo { constructor() { foo(); } bar() { baz(); } } ) `, { code: unIndent` switch (foo) { case 1: bar(); } `, options: [4, { SwitchCase: 1 }] }, unIndent` foo .bar(function() { baz }) `, { code: unIndent` foo .bar(function() { baz }) `, options: [4, { MemberExpression: 2 }] }, unIndent` foo [bar](function() { baz }) `, unIndent` foo. bar. baz `, { code: unIndent` foo .bar(function() { baz }) `, options: [4, { MemberExpression: "off" }] }, { code: unIndent` foo .bar(function() { baz }) `, options: [4, { MemberExpression: "off" }] }, { code: unIndent` foo [bar](function() { baz }) `, options: [4, { MemberExpression: "off" }] }, { code: unIndent` foo. bar. baz `, options: [4, { MemberExpression: "off" }] }, { code: unIndent` foo = bar( ).baz( ) `, options: [4, { MemberExpression: "off" }] }, { code: unIndent` foo[ bar ? baz : qux ] `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` function foo() { return foo ? bar : baz } `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` throw foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }] }, { code: unIndent` foo( bar ) ? baz : qux `, options: [4, { flatTernaryExpressions: true }] }, unIndent` foo [ bar ] .baz(function() { quz(); }) `, unIndent` [ foo ][ "map"](function() { qux(); }) `, unIndent` ( a.b(function() { c; }) ) `, unIndent` ( foo ).bar(function() { baz(); }) `, unIndent` new Foo( bar .baz .qux ) `, unIndent` const foo = a.b(), longName = (baz( 'bar', 'bar' )); `, unIndent` const foo = a.b(), longName = (baz( 'bar', 'bar' )); `, unIndent` const foo = a.b(), longName = baz( 'bar', 'bar' ); `, unIndent` const foo = a.b(), longName = baz( 'bar', 'bar' ); `, unIndent` const foo = a.b(), longName = baz( 'bar', 'bar' ); `, unIndent` const foo = a.b(), longName = baz( 'bar', 'bar' ); `, unIndent` const foo = a.b(), longName = ('fff'); `, unIndent` const foo = a.b(), longName = ('fff'); `, unIndent` const foo = a.b(), longName = ('fff'); `, unIndent` const foo = a.b(), longName = ('fff'); `, unIndent` const foo = a.b(), longName = ( 'fff' ); `, unIndent` const foo = a.b(), longName = ( 'fff' ); `, unIndent` const foo = a.b(), longName =( 'fff' ); `, unIndent` const foo = a.b(), longName =( 'fff' ); `, //---------------------------------------------------------------------- // Ignore Unknown Nodes //---------------------------------------------------------------------- { code: unIndent` interface Foo { bar: string; baz: number; } `, parser: parser("unknown-nodes/interface") }, { code: unIndent` namespace Foo { const bar = 3, baz = 2; if (true) { const bax = 3; } } `, parser: parser("unknown-nodes/namespace-valid") }, { code: unIndent` abstract class Foo { public bar() { let aaa = 4, boo; if (true) { boo = 3; } boo = 3 + 2; } } `, parser: parser("unknown-nodes/abstract-class-valid") }, { code: unIndent` function foo() { function bar() { abstract class X { public baz() { if (true) { qux(); } } } } } `, parser: parser("unknown-nodes/functions-with-abstract-class-valid") }, { code: unIndent` namespace Unknown { function foo() { function bar() { abstract class X { public baz() { if (true) { qux(); } } } } } } `, parser: parser("unknown-nodes/namespace-with-functions-with-abstract-class-valid") }, { code: unIndent` type httpMethod = 'GET' | 'POST' | 'PUT'; `, options: [2, { VariableDeclarator: 0 }], parser: parser("unknown-nodes/variable-declarator-type-indent-two-spaces") }, { code: unIndent` type httpMethod = 'GET' | 'POST' | 'PUT'; `, options: [2, { VariableDeclarator: 1 }], parser: parser("unknown-nodes/variable-declarator-type-no-indent") }, unIndent` foo(\`foo \`, { ok: true }, { ok: false }) `, unIndent` foo(tag\`foo \`, { ok: true }, { ok: false } ) `, // https://github.com/eslint/eslint/issues/8815 unIndent` async function test() { const { foo, bar, } = await doSomethingAsync( 1, 2, 3, ); } `, unIndent` function* test() { const { foo, bar, } = yield doSomethingAsync( 1, 2, 3, ); } `, unIndent` ({ a: b } = +foo( bar )); `, unIndent` const { foo, bar, } = typeof foo( 1, 2, 3, ); `, unIndent` const { foo, bar, } = +( foo ); `, //---------------------------------------------------------------------- // JSX tests // https://github.com/eslint/eslint/issues/8425 // Some of the following tests are adapted from the tests in eslint-plugin-react. // License: https://github.com/yannickcr/eslint-plugin-react/blob/7ca9841f22d599f447a27ef5b2a97def9229d6c8/LICENSE //---------------------------------------------------------------------- ";", unIndent` ; `, "var foo = ;", unIndent` var foo = ; `, unIndent` var foo = (); `, unIndent` var foo = ( ); `, unIndent` < Foo a="b" c="d" />; `, unIndent` ; `, unIndent` < Foo a="b" c="d"/>; `, "bar;", unIndent` bar ; `, unIndent` bar ; `, unIndent` bar ; `, unIndent` < a href="foo"> bar ; `, unIndent` bar ; `, unIndent` bar ; `, unIndent` var foo = baz ; `, unIndent` var foo = baz ; `, unIndent` var foo = baz ; `, unIndent` var foo = < a href="bar"> baz ; `, unIndent` var foo = baz ; `, unIndent` var foo = baz `, unIndent` var foo = ( baz ); `, unIndent` var foo = ( baz ); `, unIndent` var foo = ( baz ); `, unIndent` var foo = ( baz ); `, "var foo = baz;", unIndent` { } `, unIndent` { foo } `, unIndent` function foo() { return ( { b.forEach(() => { // comment a = c .d() .e(); }) } ); } `, "", unIndent` `, { code: unIndent` `, options: [2] }, { code: unIndent` `, options: [0] }, { code: unIndent` \t `, options: ["tab"] }, { code: unIndent` function App() { return ; } `, options: [2] }, { code: unIndent` function App() { return ( ); } `, options: [2] }, { code: unIndent` function App() { return ( ); } `, options: [2] }, { code: unIndent` it( (
) ) `, options: [2] }, { code: unIndent` it( (
) ) `, options: [2] }, { code: unIndent` (
) `, options: [2] }, { code: unIndent` { head.title &&

{head.title}

} `, options: [2] }, { code: unIndent` { head.title &&

{head.title}

} `, options: [2] }, { code: unIndent` { head.title && (

{head.title}

) } `, options: [2] }, { code: unIndent` { head.title && (

{head.title}

) } `, options: [2] }, { code: unIndent` [
,
] `, options: [2] }, unIndent`
{ [ , ] }
`, unIndent`
{foo && [ , ] }
`, unIndent`
bar
bar bar {foo} bar
`, unIndent` foo ? : `, unIndent` foo ? : `, unIndent` foo ? : `, unIndent`
{!foo ? : }
`, { code: unIndent` {condition ? : } `, options: [2] }, { code: unIndent` {condition ? : } `, options: [2] }, { code: unIndent` function foo() { {condition ? : } } `, options: [2] }, unIndent` `, { code: unIndent` `, options: [2] }, { code: unIndent` `, options: [0] }, { code: unIndent` `, options: ["tab"] }, unIndent` `, unIndent` `, { code: unIndent` `, options: [2] }, { code: unIndent` `, options: [2] }, { code: unIndent` var x = function() { return } `, options: [2] }, { code: unIndent` var x = `, options: [2] }, { code: unIndent` `, options: [2] }, { code: unIndent` {baz && } `, options: [2] }, { code: unIndent` `, options: ["tab"] }, { code: unIndent` `, options: ["tab"] }, { code: unIndent` `, options: ["tab"] }, { code: unIndent` var x = `, options: ["tab"] }, unIndent` `, unIndent`
unrelated{ foo }
`, unIndent`
unrelated{ foo }
`, unIndent` < foo .bar .baz > foo `, unIndent` < input type= "number" /> `, unIndent` < input type= {'number'} /> `, unIndent` < input type ="number" /> `, unIndent` foo ? ( bar ) : ( baz ) `, unIndent` foo ? (
) : ( ) `, unIndent`
{ /* foo */ }
`, /* * JSX Fragments * https://github.com/eslint/eslint/issues/12208 */ unIndent` <> `, unIndent` < > `, unIndent` <> < /> `, unIndent` <> `, unIndent` < > `, unIndent` < > < /> `, unIndent` < // Comment > `, unIndent` < // Comment > `, unIndent` < // Comment > `, unIndent` <> < // Comment /> `, unIndent` <> < // Comment /> `, unIndent` <> < // Comment /> `, unIndent` <> `, unIndent` <> `, unIndent` <> `, unIndent` < /* Comment */ > `, unIndent` < /* Comment */ > `, unIndent` < /* Comment */ > `, unIndent` < /* * Comment */ > `, unIndent` < /* * Comment */ > `, unIndent` <> < /* Comment */ /> `, unIndent` <> < /* Comment */ /> `, unIndent` <> < /* Comment */ /> `, unIndent` <> < /* Comment */ /> `, unIndent` <> < /* Comment */ /> `, unIndent` <> `, unIndent` <> `, unIndent` <> `, unIndent` <> `, unIndent` <> `, // https://github.com/eslint/eslint/issues/8832 unIndent`
{ ( 1 ) }
`, unIndent` function A() { return (
{ b && (
) }
); } `, unIndent`
foo
bar
`, unIndent` Foo bar 
baz qux. `, unIndent`
`, unIndent`
`, { code: unIndent` a(b , c ) `, options: [2, { CallExpression: { arguments: "off" } }] }, { code: unIndent` a( new B({ c, }) ); `, options: [2, { CallExpression: { arguments: "off" } }] }, { code: unIndent` foo ? bar : baz `, options: [4, { ignoredNodes: ["ConditionalExpression"] }] }, { code: unIndent` class Foo { foo() { bar(); } } `, options: [4, { ignoredNodes: ["ClassBody"] }] }, { code: unIndent` class Foo { foo() { bar(); } } `, options: [4, { ignoredNodes: ["ClassBody", "BlockStatement"] }] }, { code: unIndent` foo({ bar: 1 }, { baz: 2 }, { qux: 3 }) `, options: [4, { ignoredNodes: ["CallExpression > ObjectExpression"] }] }, { code: unIndent` foo .bar `, options: [4, { ignoredNodes: ["MemberExpression"] }] }, { code: unIndent` $(function() { foo(); bar(); }); `, options: [4, { ignoredNodes: ["Program > ExpressionStatement > CallExpression[callee.name='$'] > FunctionExpression > BlockStatement"] }] }, { code: unIndent` `, options: [4, { ignoredNodes: ["JSXOpeningElement"] }] }, { code: unIndent` foo && `, options: [4, { ignoredNodes: ["JSXElement", "JSXOpeningElement"] }] }, { code: unIndent` (function($) { $(function() { foo; }); }()) `, options: [4, { ignoredNodes: ["ExpressionStatement > CallExpression > FunctionExpression.callee > BlockStatement"] }] }, { code: unIndent` const value = ( condition ? valueIfTrue : valueIfFalse ); `, options: [4, { ignoredNodes: ["ConditionalExpression"] }] }, { code: unIndent` var a = 0, b = 0, c = 0; export default foo( a, b, { c } ) `, options: [4, { ignoredNodes: ["ExportDefaultDeclaration > CallExpression > ObjectExpression"] }], parserOptions: { ecmaVersion: 6, sourceType: "module" } }, { code: unIndent` foobar = baz ? qux : boop `, options: [4, { ignoredNodes: ["ConditionalExpression"] }] }, { code: unIndent` \` SELECT \${ foo } FROM THE_DATABASE \` `, options: [4, { ignoredNodes: ["TemplateLiteral"] }] }, { code: unIndent` Text `, options: [4, { ignoredNodes: ["JSXOpeningElement"] }] }, { code: unIndent` { \tvar x = 1, \t y = 2; } `, options: ["tab"] }, { code: unIndent` var x = 1, y = 2; var z; `, options: ["tab", { ignoredNodes: ["VariableDeclarator"] }] }, { code: unIndent` [ foo(), bar ] `, options: ["tab", { ArrayExpression: "first", ignoredNodes: ["CallExpression"] }] }, { code: unIndent` if (foo) { doSomething(); // Intentionally unindented comment doSomethingElse(); } `, options: [4, { ignoreComments: true }] }, { code: unIndent` if (foo) { doSomething(); /* Intentionally unindented comment */ doSomethingElse(); } `, options: [4, { ignoreComments: true }] }, unIndent` const obj = { foo () { return condition ? // comment 1 : 2 } } `, //---------------------------------------------------------------------- // Comment alignment tests //---------------------------------------------------------------------- unIndent` if (foo) { // Comment can align with code immediately above even if "incorrect" alignment doSomething(); } `, unIndent` if (foo) { doSomething(); // Comment can align with code immediately below even if "incorrect" alignment } `, unIndent` if (foo) { // Comment can be in correct alignment even if not aligned with code above/below } `, unIndent` if (foo) { // Comment can be in correct alignment even if gaps between (and not aligned with) code above/below } `, unIndent` [{ foo }, // Comment between nodes { bar }]; `, unIndent` [{ foo }, // Comment between nodes { // comment bar }]; `, unIndent` let foo // comment ;(async () => {})() `, unIndent` let foo // comment ;(async () => {})() `, unIndent` let foo // comment ;(async () => {})() `, unIndent` let foo // comment ;(async () => {})() `, unIndent` let foo /* comment */; (async () => {})() `, unIndent` let foo /* comment */; (async () => {})() `, unIndent` let foo /* comment */; (async () => {})() `, unIndent` let foo /* comment */; (async () => {})() `, unIndent` let foo /* comment */; (async () => {})() `, unIndent` let foo /* comment */; (async () => {})() `, unIndent` // comment ;(async () => {})() `, unIndent` // comment ;(async () => {})() `, unIndent` { let foo // comment ;(async () => {})() } `, unIndent` { let foo // comment ;(async () => {})() } `, unIndent` { // comment ;(async () => {})() } `, unIndent` { // comment ;(async () => {})() } `, unIndent` const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) `, unIndent` const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) `, unIndent` const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) `, unIndent` const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) `, unIndent` const foo = 1 const bar = foo /* comment */; [1, 2, 3].forEach(() => {}) `, unIndent` const foo = 1 const bar = foo /* comment */; [1, 2, 3].forEach(() => {}) `, unIndent` const foo = 1 const bar = foo /* comment */; [1, 2, 3].forEach(() => {}) `, unIndent` const foo = 1 const bar = foo /* comment */; [1, 2, 3].forEach(() => {}) `, unIndent` const foo = 1 const bar = foo /* comment */; [1, 2, 3].forEach(() => {}) `, unIndent` const foo = 1 const bar = foo /* comment */; [1, 2, 3].forEach(() => {}) `, unIndent` /* comment */ ;[1, 2, 3].forEach(() => {}) `, unIndent` /* comment */ ;[1, 2, 3].forEach(() => {}) `, unIndent` { const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) } `, unIndent` { const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) } `, unIndent` { /* comment */ ;[1, 2, 3].forEach(() => {}) } `, unIndent` { /* comment */ ;[1, 2, 3].forEach(() => {}) } `, // import expressions { code: unIndent` import( // before source // after ) `, parserOptions: { ecmaVersion: 2020 } }, // https://github.com/eslint/eslint/issues/12122 { code: unIndent` foo(() => { tag\` multiline template literal \`(() => { bar(); }); }); `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` { tag\` multiline template \${a} \${b} literal \`(() => { bar(); }); } `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo(() => { tagOne\` multiline template literal \${a} \${b} \`(() => { tagTwo\` multiline template literal \`(() => { bar(); }); baz(); }); }); `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` { tagOne\` \${a} \${b} multiline template literal \`(() => { tagTwo\` multiline template literal \`(() => { bar(); }); baz(); }); }; `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` tagOne\`multiline \${a} \${b} template literal \`(() => { foo(); tagTwo\`multiline template literal \`({ bar: 1, baz: 2 }); }); `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` tagOne\`multiline template literal \${a} \${b}\`({ foo: 1, bar: tagTwo\`multiline template literal\`(() => { baz(); }) }); `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo.bar\` template literal \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo.bar.baz\` template literal \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo .bar\` template literal \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo .bar .baz\` template literal \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo.bar\` \${a} \${b} \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo.bar1.bar2\` \${a} \${b} \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo .bar1 .bar2\` \${a} \${b} \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo .bar\` \${a} \${b} \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo .test\` \${a} \${b} \`(() => { baz(); }) `, options: [4, { MemberExpression: 0 }], parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` foo .test\` \${a} \${b} \`(() => { baz(); }) `, options: [4, { MemberExpression: 2 }], parserOptions: { ecmaVersion: 2015 } }, { code: unIndent` const foo = async (arg1, arg2) => { return arg1 + arg2; } `, options: [2, { FunctionDeclaration: { parameters: "first" }, FunctionExpression: { parameters: "first" } }] }, { code: unIndent` const foo = async /* some comments */(arg1, arg2) => { return arg1 + arg2; } `, options: [2, { FunctionDeclaration: { parameters: "first" }, FunctionExpression: { parameters: "first" } }] }, { code: unIndent` const a = async b => {} `, options: [2] }, { code: unIndent` const foo = (arg1, arg2) => async (arr1, arr2) => { return arg1 + arg2; } `, options: [2, { FunctionDeclaration: { parameters: "first" }, FunctionExpression: { parameters: "first" } }] }, { code: unIndent` const foo = async (arg1, arg2) => { return arg1 + arg2; } `, options: [2] }, { code: unIndent` const foo = async /*comments*/(arg1, arg2) => { return arg1 + arg2; } `, options: [2] }, { code: unIndent` const foo = async (arg1, arg2) => { return arg1 + arg2; } `, options: [2, { FunctionDeclaration: { parameters: 4 }, FunctionExpression: { parameters: 4 } }] }, { code: unIndent` const foo = (arg1, arg2) => { return arg1 + arg2; } `, options: [2, { FunctionDeclaration: { parameters: 4 }, FunctionExpression: { parameters: 4 } }] }, { code: unIndent` async function fn(ar1, ar2){} `, options: [2, { FunctionDeclaration: { parameters: "first" }, FunctionExpression: { parameters: "first" } }] }, { code: unIndent` async function /* some comments */ fn(ar1, ar2){} `, options: [2, { FunctionDeclaration: { parameters: "first" }, FunctionExpression: { parameters: "first" } }] }, { code: unIndent` async /* some comments */ function fn(ar1, ar2){} `, options: [2, { FunctionDeclaration: { parameters: "first" }, FunctionExpression: { parameters: "first" } }] }, { code: unIndent` class C { static { foo(); bar(); } } `, options: [2], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { static { foo(); bar(); } } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { static { foo(); bar(); } } `, options: [4, { StaticBlock: { body: 2 } }], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { static { foo(); bar(); } } `, options: [4, { StaticBlock: { body: 0 } }], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { \tstatic { \t\tfoo(); \t\tbar(); \t} } `, options: ["tab"], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { \tstatic { \t\t\tfoo(); \t\t\tbar(); \t} } `, options: ["tab", { StaticBlock: { body: 2 } }], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { static { foo(); bar(); } } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { static { var x, y; } } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { static { var x, y; } } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { static { if (foo) { bar; } } } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { static { { bar; } } } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { static {} static { } static { } } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { static { foo; } static { bar; } } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { x = 1; static { foo; } y = 2; } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { method1(param) { foo; } static { bar; } method2(param) { foo; } } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` function f() { class C { static { foo(); bar(); } } } `, options: [4], parserOptions: { ecmaVersion: 2022 } }, { code: unIndent` class C { method() { foo; } static { bar; } } `, options: [4, { FunctionExpression: { body: 2 }, StaticBlock: { body: 2 } }], parserOptions: { ecmaVersion: 2022 } }, // https://github.com/eslint/eslint/issues/15930 { code: unIndent` if (2 > 1) \tconsole.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: ["tab"] }, { code: unIndent` if (2 > 1) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4] }, { code: unIndent` if (foo) bar(); baz() `, options: [4] }, { code: unIndent` if (foo) bar() ;baz() `, options: [4] }, { code: unIndent` if (foo) bar(); baz(); `, options: [4] }, { code: unIndent` if (foo) bar() ; baz() `, options: [4] }, { code: unIndent` if (foo) bar() ;baz() qux() `, options: [4] }, { code: unIndent` if (foo) bar() ;else baz() `, options: [4] }, { code: unIndent` if (foo) bar() else baz() ;qux() `, options: [4] }, { code: unIndent` if (foo) if (bar) baz() ;qux() `, options: [4] }, { code: unIndent` if (foo) bar() else if (baz) qux() ;quux() `, options: [4] }, { code: unIndent` if (foo) if (bar) baz() else qux() ;quux() `, options: [4] }, { code: unIndent` if (foo) bar() ; baz() `, options: [4] }, { code: unIndent` if (foo) ; baz() `, options: [4] }, { code: unIndent` if (foo) ;baz() `, options: [4] }, { code: unIndent` if (foo); else baz() `, options: [4] }, { code: unIndent` if (foo) ; else baz() `, options: [4] }, { code: unIndent` if (foo) ;else baz() `, options: [4] }, { code: unIndent` do foo(); while (bar) `, options: [4] }, { code: unIndent` do foo() ;while (bar) `, options: [4] }, { code: unIndent` do foo(); while (bar) `, options: [4] }, { code: unIndent` do foo() ;while (bar) `, options: [4] }, { code: unIndent` do; while (foo) `, options: [4] }, { code: unIndent` do ; while (foo) `, options: [4] }, { code: unIndent` do ;while (foo) `, options: [4] }, { code: unIndent` while (2 > 1) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4] }, { code: unIndent` for (;;) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4] }, { code: unIndent` for (a in b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4] }, { code: unIndent` for (a of b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4] }, { code: unIndent` with (a) console.log(b) ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4] }, { code: unIndent` label: for (a of b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4] }, { code: unIndent` label: for (a of b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4] } ], invalid: [ { code: unIndent` var a = b; if (a) { b(); } `, output: unIndent` var a = b; if (a) { b(); } `, options: [2], errors: expectedErrors([[3, 2, 0, "Identifier"]]) }, { code: unIndent` require('http').request({hostname: 'localhost', port: 80}, function(res) { res.end(); }); `, output: unIndent` require('http').request({hostname: 'localhost', port: 80}, function(res) { res.end(); }); `, options: [2], errors: expectedErrors([[2, 2, 18, "Identifier"], [3, 2, 4, "Identifier"], [4, 0, 2, "Punctuator"]]) }, { code: unIndent` if (array.some(function(){ return true; })) { a++; // -> b++; c++; // <- } `, output: unIndent` if (array.some(function(){ return true; })) { a++; // -> b++; c++; // <- } `, options: [2], errors: expectedErrors([[4, 2, 0, "Identifier"], [6, 2, 4, "Identifier"]]) }, { code: unIndent` if (a){ \tb=c; \t\tc=d; e=f; } `, output: unIndent` if (a){ \tb=c; \tc=d; \te=f; } `, options: ["tab"], errors: expectedErrors("tab", [[3, 1, 2, "Identifier"], [4, 1, 0, "Identifier"]]) }, { code: unIndent` if (a){ b=c; c=d; e=f; } `, output: unIndent` if (a){ b=c; c=d; e=f; } `, options: [4], errors: expectedErrors([[3, 4, 6, "Identifier"], [4, 4, 1, "Identifier"]]) }, { code: fixture, output: fixedFixture, options: [2, { SwitchCase: 1, MemberExpression: 1, CallExpression: { arguments: "off" } }], errors: expectedErrors([ [5, 2, 4, "Keyword"], [6, 2, 0, "Line"], [10, 4, 6, "Punctuator"], [11, 2, 4, "Punctuator"], [15, 4, 2, "Identifier"], [16, 2, 4, "Punctuator"], [23, 2, 4, "Punctuator"], [29, 2, 4, "Keyword"], [30, 4, 6, "Identifier"], [36, 4, 6, "Identifier"], [38, 2, 4, "Punctuator"], [39, 4, 2, "Identifier"], [40, 2, 0, "Punctuator"], [54, 2, 4, "Punctuator"], [114, 4, 2, "Keyword"], [120, 4, 6, "Keyword"], [124, 4, 2, "Keyword"], [134, 4, 6, "Keyword"], [138, 2, 3, "Punctuator"], [139, 2, 3, "Punctuator"], [143, 4, 0, "Identifier"], [144, 6, 2, "Punctuator"], [145, 6, 2, "Punctuator"], [151, 4, 6, "Identifier"], [152, 6, 8, "Punctuator"], [153, 6, 8, "Punctuator"], [159, 4, 2, "Identifier"], [161, 4, 6, "Identifier"], [175, 2, 0, "Identifier"], [177, 2, 4, "Identifier"], [189, 2, 0, "Keyword"], [192, 6, 18, "Identifier"], [193, 6, 4, "Identifier"], [195, 6, 8, "Identifier"], [228, 5, 4, "Identifier"], [231, 3, 2, "Punctuator"], [245, 0, 2, "Punctuator"], [248, 0, 2, "Punctuator"], [304, 4, 6, "Identifier"], [306, 4, 8, "Identifier"], [307, 2, 4, "Punctuator"], [308, 2, 4, "Identifier"], [311, 4, 6, "Identifier"], [312, 4, 6, "Identifier"], [313, 4, 6, "Identifier"], [314, 2, 4, "Punctuator"], [315, 2, 4, "Identifier"], [318, 4, 6, "Identifier"], [319, 4, 6, "Identifier"], [320, 4, 6, "Identifier"], [321, 2, 4, "Punctuator"], [322, 2, 4, "Identifier"], [326, 2, 1, "Numeric"], [327, 2, 1, "Numeric"], [328, 2, 1, "Numeric"], [329, 2, 1, "Numeric"], [330, 2, 1, "Numeric"], [331, 2, 1, "Numeric"], [332, 2, 1, "Numeric"], [333, 2, 1, "Numeric"], [334, 2, 1, "Numeric"], [335, 2, 1, "Numeric"], [340, 2, 4, "Identifier"], [341, 2, 0, "Identifier"], [344, 2, 4, "Identifier"], [345, 2, 0, "Identifier"], [348, 2, 4, "Identifier"], [349, 2, 0, "Identifier"], [355, 2, 0, "Identifier"], [357, 2, 4, "Identifier"], [361, 4, 6, "Identifier"], [362, 2, 4, "Punctuator"], [363, 2, 4, "Identifier"], [368, 2, 0, "Keyword"], [370, 2, 4, "Keyword"], [374, 4, 6, "Keyword"], [376, 4, 2, "Keyword"], [383, 2, 0, "Identifier"], [385, 2, 4, "Identifier"], [390, 2, 0, "Identifier"], [392, 2, 4, "Identifier"], [409, 2, 0, "Identifier"], [410, 2, 4, "Identifier"], [416, 2, 0, "Identifier"], [417, 2, 4, "Identifier"], [418, 0, 4, "Punctuator"], [422, 2, 4, "Identifier"], [423, 2, 0, "Identifier"], [427, 2, 6, "Identifier"], [428, 2, 8, "Identifier"], [429, 2, 4, "Identifier"], [430, 0, 4, "Punctuator"], [433, 2, 4, "Identifier"], [434, 0, 4, "Punctuator"], [437, 2, 0, "Identifier"], [438, 0, 4, "Punctuator"], [442, 2, 4, "Identifier"], [443, 2, 4, "Identifier"], [444, 0, 2, "Punctuator"], [451, 2, 0, "Identifier"], [453, 2, 4, "Identifier"], [499, 6, 8, "Punctuator"], [500, 8, 6, "Identifier"], [504, 4, 6, "Punctuator"], [505, 6, 8, "Identifier"], [506, 4, 8, "Punctuator"] ]) }, { code: unIndent` switch(value){ case "1": a(); break; case "2": a(); break; default: a(); break; } `, output: unIndent` switch(value){ case "1": a(); break; case "2": a(); break; default: a(); break; } `, options: [4, { SwitchCase: 1 }], errors: expectedErrors([[4, 8, 4, "Keyword"], [7, 8, 4, "Keyword"]]) }, { code: unIndent` var x = 0 && { a: 1, b: 2 }; `, output: unIndent` var x = 0 && { a: 1, b: 2 }; `, options: [4], errors: expectedErrors([[3, 8, 7, "Identifier"], [4, 8, 10, "Identifier"]]) }, { code: unIndent` switch(value){ case "1": a(); break; case "2": a(); break; default: break; } `, output: unIndent` switch(value){ case "1": a(); break; case "2": a(); break; default: break; } `, options: [4, { SwitchCase: 1 }], errors: expectedErrors([9, 8, 4, "Keyword"]) }, { code: unIndent` switch(value){ case "1": case "2": a(); break; default: break; } switch(value){ case "1": break; case "2": a(); break; default: a(); break; } `, output: unIndent` switch(value){ case "1": case "2": a(); break; default: break; } switch(value){ case "1": break; case "2": a(); break; default: a(); break; } `, options: [4, { SwitchCase: 1 }], errors: expectedErrors([[11, 8, 4, "Keyword"], [14, 8, 4, "Keyword"], [17, 8, 4, "Keyword"]]) }, { code: unIndent` switch(value){ case "1": a(); break; case "2": break; default: break; } `, output: unIndent` switch(value){ case "1": a(); break; case "2": break; default: break; } `, options: [4], errors: expectedErrors([ [3, 4, 8, "Identifier"], [4, 4, 8, "Keyword"], [5, 0, 4, "Keyword"], [6, 4, 8, "Keyword"], [7, 0, 4, "Keyword"], [8, 4, 8, "Keyword"] ]) }, { code: unIndent` var obj = {foo: 1, bar: 2}; with (obj) { console.log(foo + bar); } `, output: unIndent` var obj = {foo: 1, bar: 2}; with (obj) { console.log(foo + bar); } `, errors: expectedErrors([3, 4, 0, "Identifier"]) }, { code: unIndent` switch (a) { case '1': b(); break; default: c(); break; } `, output: unIndent` switch (a) { case '1': b(); break; default: c(); break; } `, options: [4, { SwitchCase: 1 }], errors: expectedErrors([ [2, 4, 0, "Keyword"], [3, 8, 0, "Identifier"], [4, 8, 0, "Keyword"], [5, 4, 0, "Keyword"], [6, 8, 0, "Identifier"], [7, 8, 0, "Keyword"] ]) }, { code: unIndent` var foo = function(){ foo .bar } `, output: unIndent` var foo = function(){ foo .bar } `, options: [4, { MemberExpression: 1 }], errors: expectedErrors( [3, 8, 10, "Punctuator"] ) }, { code: unIndent` ( foo .bar ) `, output: unIndent` ( foo .bar ) `, errors: expectedErrors([3, 8, 4, "Punctuator"]) }, { code: unIndent` var foo = function(){ foo .bar } `, output: unIndent` var foo = function(){ foo .bar } `, options: [4, { MemberExpression: 2 }], errors: expectedErrors( [3, 12, 13, "Punctuator"] ) }, { code: unIndent` var foo = () => { foo .bar } `, output: unIndent` var foo = () => { foo .bar } `, options: [4, { MemberExpression: 2 }], errors: expectedErrors( [3, 12, 13, "Punctuator"] ) }, { code: unIndent` TestClass.prototype.method = function () { return Promise.resolve(3) .then(function (x) { return x; }); }; `, output: unIndent` TestClass.prototype.method = function () { return Promise.resolve(3) .then(function (x) { return x; }); }; `, options: [2, { MemberExpression: 1 }], errors: expectedErrors([3, 4, 6, "Punctuator"]) }, { code: unIndent` while (a) b(); `, output: unIndent` while (a) b(); `, options: [4], errors: expectedErrors([ [2, 4, 0, "Identifier"] ]) }, { code: unIndent` lmn = [{ a: 1 }, { b: 2 }, { x: 2 }]; `, output: unIndent` lmn = [{ a: 1 }, { b: 2 }, { x: 2 }]; `, errors: expectedErrors([ [2, 4, 8, "Identifier"], [3, 0, 4, "Punctuator"], [4, 0, 4, "Punctuator"], [5, 4, 8, "Identifier"], [6, 0, 4, "Punctuator"], [7, 0, 4, "Punctuator"], [8, 4, 8, "Identifier"] ]) }, { code: unIndent` for (var foo = 1; foo < 10; foo++) {} `, output: unIndent` for (var foo = 1; foo < 10; foo++) {} `, errors: expectedErrors([[2, 4, 0, "Identifier"], [3, 4, 0, "Identifier"]]) }, { code: unIndent` for ( var foo = 1; foo < 10; foo++ ) {} `, output: unIndent` for ( var foo = 1; foo < 10; foo++ ) {} `, errors: expectedErrors([[2, 4, 0, "Keyword"], [3, 4, 0, "Identifier"], [4, 4, 0, "Identifier"], [5, 0, 4, "Punctuator"]]) }, { code: unIndent` for (;;) b(); `, output: unIndent` for (;;) b(); `, options: [4], errors: expectedErrors([ [2, 4, 0, "Identifier"] ]) }, { code: unIndent` for (a in x) b(); `, output: unIndent` for (a in x) b(); `, options: [4], errors: expectedErrors([ [2, 4, 0, "Identifier"] ]) }, { code: unIndent` do b(); while(true) `, output: unIndent` do b(); while(true) `, options: [4], errors: expectedErrors([ [2, 4, 0, "Identifier"] ]) }, { code: unIndent` with(a) b(); `, output: unIndent` with(a) b(); `, options: [4], errors: expectedErrors([ [2, 4, 0, "Identifier"] ]) }, { code: unIndent` if(true) b(); `, output: unIndent` if(true) b(); `, options: [4], errors: expectedErrors([ [2, 4, 0, "Identifier"] ]) }, { code: unIndent` var test = { a: 1, b: 2 }; `, output: unIndent` var test = { a: 1, b: 2 }; `, options: [2], errors: expectedErrors([ [2, 2, 6, "Identifier"], [3, 2, 4, "Identifier"], [4, 0, 4, "Punctuator"] ]) }, { code: unIndent` var a = function() { a++; b++; c++; }, b; `, output: unIndent` var a = function() { a++; b++; c++; }, b; `, options: [4], errors: expectedErrors([ [2, 8, 6, "Identifier"], [3, 8, 4, "Identifier"], [4, 8, 10, "Identifier"] ]) }, { code: unIndent` var a = 1, b = 2, c = 3; `, output: unIndent` var a = 1, b = 2, c = 3; `, options: [4], errors: expectedErrors([ [2, 4, 0, "Identifier"], [3, 4, 0, "Identifier"] ]) }, { code: unIndent` [a, b, c].forEach((index) => { index; }); `, output: unIndent` [a, b, c].forEach((index) => { index; }); `, options: [4], errors: expectedErrors([ [3, 4, 8, "Identifier"], [4, 0, 4, "Punctuator"] ]) }, { code: unIndent` [a, b, c].forEach(function(index){ return index; }); `, output: unIndent` [a, b, c].forEach(function(index){ return index; }); `, options: [4], errors: expectedErrors([ [2, 4, 0, "Identifier"], [3, 4, 2, "Keyword"] ]) }, { code: unIndent` [a, b, c].forEach(function(index){ return index; }); `, output: unIndent` [a, b, c].forEach(function(index){ return index; }); `, options: [4], errors: expectedErrors([ [2, 4, 2, "Keyword"] ]) }, { code: unIndent` (foo) .bar([ baz ]); `, output: unIndent` (foo) .bar([ baz ]); `, options: [4, { MemberExpression: 1 }], errors: expectedErrors([[3, 8, 4, "Identifier"], [4, 4, 0, "Punctuator"]]) }, { code: unIndent` var x = ['a', 'b', 'c' ]; `, output: unIndent` var x = ['a', 'b', 'c' ]; `, options: [4], errors: expectedErrors([ [2, 4, 9, "String"], [3, 4, 9, "String"] ]) }, { code: unIndent` var x = [ 'a', 'b', 'c' ]; `, output: unIndent` var x = [ 'a', 'b', 'c' ]; `, options: [4], errors: expectedErrors([ [2, 4, 9, "String"], [3, 4, 9, "String"], [4, 4, 9, "String"] ]) }, { code: unIndent` var x = [ 'a', 'b', 'c', 'd']; `, output: unIndent` var x = [ 'a', 'b', 'c', 'd']; `, options: [4], errors: expectedErrors([ [2, 4, 9, "String"], [3, 4, 9, "String"], [4, 4, 9, "String"], [5, 4, 0, "String"] ]) }, { code: unIndent` var x = [ 'a', 'b', 'c' ]; `, output: unIndent` var x = [ 'a', 'b', 'c' ]; `, options: [4], errors: expectedErrors([ [2, 4, 9, "String"], [3, 4, 9, "String"], [4, 4, 9, "String"], [5, 0, 2, "Punctuator"] ]) }, { code: unIndent` [[ ], function( foo ) {} ] `, output: unIndent` [[ ], function( foo ) {} ] `, errors: expectedErrors([[3, 4, 8, "Identifier"], [4, 0, 4, "Punctuator"]]) }, { code: unIndent` define([ 'foo' ], function( bar ) { baz; } ) `, output: unIndent` define([ 'foo' ], function( bar ) { baz; } ) `, errors: expectedErrors([[4, 4, 8, "Identifier"], [5, 0, 4, "Punctuator"]]) }, { code: unIndent` while (1 < 2) console.log('foo') console.log('bar') `, output: unIndent` while (1 < 2) console.log('foo') console.log('bar') `, options: [2], errors: expectedErrors([ [2, 2, 0, "Identifier"], [3, 0, 2, "Identifier"] ]) }, { code: unIndent` function salutation () { switch (1) { case 0: return console.log('hi') case 1: return console.log('hey') } } `, output: unIndent` function salutation () { switch (1) { case 0: return console.log('hi') case 1: return console.log('hey') } } `, options: [2, { SwitchCase: 1 }], errors: expectedErrors([ [3, 4, 2, "Keyword"] ]) }, { code: unIndent` var geometry, box, face1, face2, colorT, colorB, sprite, padding, maxWidth, height, rotate; `, output: unIndent` var geometry, box, face1, face2, colorT, colorB, sprite, padding, maxWidth, height, rotate; `, options: [2, { SwitchCase: 1 }], errors: expectedErrors([ [2, 2, 0, "Identifier"] ]) }, { code: unIndent` switch (a) { case '1': b(); break; default: c(); break; } `, output: unIndent` switch (a) { case '1': b(); break; default: c(); break; } `, options: [4, { SwitchCase: 2 }], errors: expectedErrors([ [2, 8, 0, "Keyword"], [3, 12, 0, "Identifier"], [4, 12, 0, "Keyword"], [5, 8, 0, "Keyword"], [6, 12, 0, "Identifier"], [7, 12, 0, "Keyword"] ]) }, { code: unIndent` var geometry, rotate; `, output: unIndent` var geometry, rotate; `, options: [2, { VariableDeclarator: 1 }], errors: expectedErrors([ [2, 2, 0, "Identifier"] ]) }, { code: unIndent` var geometry, rotate; `, output: unIndent` var geometry, rotate; `, options: [2, { VariableDeclarator: 2 }], errors: expectedErrors([ [2, 4, 2, "Identifier"] ]) }, { code: unIndent` var geometry, \trotate; `, output: unIndent` var geometry, \t\trotate; `, options: ["tab", { VariableDeclarator: 2 }], errors: expectedErrors("tab", [ [2, 2, 1, "Identifier"] ]) }, { code: unIndent` let geometry, rotate; `, output: unIndent` let geometry, rotate; `, options: [2, { VariableDeclarator: 2 }], errors: expectedErrors([ [2, 4, 2, "Identifier"] ]) }, { code: unIndent` let foo = 'foo', bar = bar; const a = 'a', b = 'b'; `, output: unIndent` let foo = 'foo', bar = bar; const a = 'a', b = 'b'; `, options: [2, { VariableDeclarator: "first" }], errors: expectedErrors([ [2, 4, 2, "Identifier"], [4, 6, 2, "Identifier"] ]) }, { code: unIndent` var foo = 'foo', bar = bar; `, output: unIndent` var foo = 'foo', bar = bar; `, options: [2, { VariableDeclarator: { var: "first" } }], errors: expectedErrors([ [2, 4, 2, "Identifier"] ]) }, { code: unIndent` if(true) if (true) if (true) console.log(val); `, output: unIndent` if(true) if (true) if (true) console.log(val); `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }], errors: expectedErrors([ [4, 6, 4, "Identifier"] ]) }, { code: unIndent` var a = { a: 1, b: 2 } `, output: unIndent` var a = { a: 1, b: 2 } `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }], errors: expectedErrors([ [2, 2, 4, "Identifier"], [3, 2, 4, "Identifier"] ]) }, { code: unIndent` var a = [ a, b ] `, output: unIndent` var a = [ a, b ] `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }], errors: expectedErrors([ [2, 2, 4, "Identifier"], [3, 2, 4, "Identifier"] ]) }, { code: unIndent` let a = [ a, b ] `, output: unIndent` let a = [ a, b ] `, options: [2, { VariableDeclarator: { let: 2 }, SwitchCase: 1 }], errors: expectedErrors([ [2, 2, 4, "Identifier"], [3, 2, 4, "Identifier"] ]) }, { code: unIndent` var a = new Test({ a: 1 }), b = 4; `, output: unIndent` var a = new Test({ a: 1 }), b = 4; `, options: [4], errors: expectedErrors([ [2, 8, 6, "Identifier"], [3, 4, 2, "Punctuator"] ]) }, { code: unIndent` var a = new Test({ a: 1 }), b = 4; const c = new Test({ a: 1 }), d = 4; `, output: unIndent` var a = new Test({ a: 1 }), b = 4; const c = new Test({ a: 1 }), d = 4; `, options: [2, { VariableDeclarator: { var: 2 } }], errors: expectedErrors([ [6, 4, 6, "Identifier"], [7, 2, 4, "Punctuator"], [8, 2, 4, "Identifier"] ]) }, { code: unIndent` var abc = 5, c = 2, xyz = { a: 1, b: 2 }; `, output: unIndent` var abc = 5, c = 2, xyz = { a: 1, b: 2 }; `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }], errors: expectedErrors([6, 6, 7, "Identifier"]) }, { code: unIndent` var abc = { a: 1, b: 2 }; `, output: unIndent` var abc = { a: 1, b: 2 }; `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }], errors: expectedErrors([4, 7, 8, "Identifier"]) }, { code: unIndent` var foo = { bar: 1, baz: { qux: 2 } }, bar = 1; `, output: unIndent` var foo = { bar: 1, baz: { qux: 2 } }, bar = 1; `, options: [2], errors: expectedErrors([[4, 6, 8, "Identifier"], [5, 4, 6, "Punctuator"]]) }, { code: unIndent` var path = require('path') , crypto = require('crypto') ; `, output: unIndent` var path = require('path') , crypto = require('crypto') ; `, options: [2], errors: expectedErrors([ [2, 2, 1, "Punctuator"] ]) }, { code: unIndent` var a = 1 ,b = 2 ; `, output: unIndent` var a = 1 ,b = 2 ; `, errors: expectedErrors([ [2, 4, 3, "Punctuator"] ]) }, { code: unIndent` class A{ constructor(){} a(){} get b(){} } `, output: unIndent` class A{ constructor(){} a(){} get b(){} } `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }], errors: expectedErrors([[2, 4, 2, "Identifier"]]) }, { code: unIndent` var A = class { constructor(){} a(){} get b(){} }; `, output: unIndent` var A = class { constructor(){} a(){} get b(){} }; `, options: [4, { VariableDeclarator: 1, SwitchCase: 1 }], errors: expectedErrors([[2, 4, 2, "Identifier"], [4, 4, 2, "Identifier"]]) }, { code: unIndent` var a = 1, B = class { constructor(){} a(){} get b(){} }; `, output: unIndent` var a = 1, B = class { constructor(){} a(){} get b(){} }; `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }], errors: expectedErrors([[3, 6, 4, "Identifier"]]) }, { code: unIndent` { if(a){ foo(); } else{ bar(); } } `, output: unIndent` { if(a){ foo(); } else{ bar(); } } `, options: [4], errors: expectedErrors([[5, 4, 2, "Keyword"]]) }, { code: unIndent` { if(a){ foo(); } else bar(); } `, output: unIndent` { if(a){ foo(); } else bar(); } `, options: [4], errors: expectedErrors([[5, 4, 2, "Keyword"]]) }, { code: unIndent` { if(a) foo(); else bar(); } `, output: unIndent` { if(a) foo(); else bar(); } `, options: [4], errors: expectedErrors([[4, 4, 2, "Keyword"]]) }, { code: unIndent` (function(){ function foo(x) { return x + 1; } })(); `, output: unIndent` (function(){ function foo(x) { return x + 1; } })(); `, options: [2, { outerIIFEBody: 0 }], errors: expectedErrors([[2, 0, 2, "Keyword"], [3, 2, 4, "Keyword"], [4, 0, 2, "Punctuator"]]) }, { code: unIndent` (function(){ function foo(x) { return x + 1; } })(); `, output: unIndent` (function(){ function foo(x) { return x + 1; } })(); `, options: [4, { outerIIFEBody: 2 }], errors: expectedErrors([[2, 8, 4, "Keyword"], [3, 12, 8, "Keyword"], [4, 8, 4, "Punctuator"]]) }, { code: unIndent` if(data) { console.log('hi'); } `, output: unIndent` if(data) { console.log('hi'); } `, options: [2, { outerIIFEBody: 0 }], errors: expectedErrors([[2, 2, 0, "Identifier"]]) }, { code: unIndent` var ns = function(){ function fooVar(x) { return x + 1; } }(x); `, output: unIndent` var ns = function(){ function fooVar(x) { return x + 1; } }(x); `, options: [4, { outerIIFEBody: 2 }], errors: expectedErrors([[2, 8, 4, "Keyword"], [3, 12, 8, "Keyword"], [4, 8, 4, "Punctuator"]]) }, { code: unIndent` var obj = { foo: function() { return true; }() }; `, output: unIndent` var obj = { foo: function() { return true; }() }; `, options: [2, { outerIIFEBody: 0 }], errors: expectedErrors([[3, 4, 2, "Keyword"]]) }, { code: unIndent` typeof function() { function fooVar(x) { return x + 1; } }(); `, output: unIndent` typeof function() { function fooVar(x) { return x + 1; } }(); `, options: [2, { outerIIFEBody: 2 }], errors: expectedErrors([[2, 2, 4, "Keyword"], [3, 4, 6, "Keyword"], [4, 2, 4, "Punctuator"]]) }, { code: unIndent` { \t!function(x) { \t\t\t\treturn x + 1; \t}() }; `, output: unIndent` { \t!function(x) { \t\treturn x + 1; \t}() }; `, options: ["tab", { outerIIFEBody: 3 }], errors: expectedErrors("tab", [[3, 2, 4, "Keyword"]]) }, { code: unIndent` (function(){ function foo(x) { return x + 1; } })(); `, output: unIndent` (function(){ function foo(x) { return x + 1; } })(); `, options: [4, { outerIIFEBody: "off" }], errors: expectedErrors([[3, 8, 4, "Keyword"]]) }, { code: unIndent` (function(){ function foo(x) { return x + 1; } })(); `, output: unIndent` (function(){ function foo(x) { return x + 1; } })(); `, options: [4, { outerIIFEBody: "off" }], errors: expectedErrors([[3, 4, 0, "Keyword"]]) }, { code: unIndent` (() => { function foo(x) { return x + 1; } })(); `, output: unIndent` (() => { function foo(x) { return x + 1; } })(); `, options: [4, { outerIIFEBody: "off" }], errors: expectedErrors([[3, 8, 4, "Keyword"]]) }, { code: unIndent` (() => { function foo(x) { return x + 1; } })(); `, output: unIndent` (() => { function foo(x) { return x + 1; } })(); `, options: [4, { outerIIFEBody: "off" }], errors: expectedErrors([[3, 4, 0, "Keyword"]]) }, { code: unIndent` Buffer .toString() `, output: unIndent` Buffer .toString() `, options: [4, { MemberExpression: 1 }], errors: expectedErrors([[2, 4, 0, "Punctuator"]]) }, { code: unIndent` Buffer .indexOf('a') .toString() `, output: unIndent` Buffer .indexOf('a') .toString() `, options: [4, { MemberExpression: 1 }], errors: expectedErrors([[3, 4, 0, "Punctuator"]]) }, { code: unIndent` Buffer. length `, output: unIndent` Buffer. length `, options: [4, { MemberExpression: 1 }], errors: expectedErrors([[2, 4, 0, "Identifier"]]) }, { code: unIndent` Buffer. \t\tlength `, output: unIndent` Buffer. \tlength `, options: ["tab", { MemberExpression: 1 }], errors: expectedErrors("tab", [[2, 1, 2, "Identifier"]]) }, { code: unIndent` Buffer .foo .bar `, output: unIndent` Buffer .foo .bar `, options: [2, { MemberExpression: 2 }], errors: expectedErrors([[2, 4, 2, "Punctuator"], [3, 4, 2, "Punctuator"]]) }, { code: unIndent` function foo() { new .target } `, output: unIndent` function foo() { new .target } `, errors: expectedErrors([3, 8, 4, "Punctuator"]) }, { code: unIndent` function foo() { new. target } `, output: unIndent` function foo() { new. target } `, errors: expectedErrors([3, 8, 4, "Identifier"]) }, { // Indentation with multiple else statements: https://github.com/eslint/eslint/issues/6956 code: unIndent` if (foo) bar(); else if (baz) foobar(); else if (qux) qux(); `, output: unIndent` if (foo) bar(); else if (baz) foobar(); else if (qux) qux(); `, options: [2], errors: expectedErrors([3, 0, 2, "Keyword"]) }, { code: unIndent` if (foo) bar(); else if (baz) foobar(); else qux(); `, output: unIndent` if (foo) bar(); else if (baz) foobar(); else qux(); `, options: [2], errors: expectedErrors([3, 0, 2, "Keyword"]) }, { code: unIndent` foo(); if (baz) foobar(); else qux(); `, output: unIndent` foo(); if (baz) foobar(); else qux(); `, options: [2], errors: expectedErrors([[2, 0, 2, "Keyword"], [3, 0, 2, "Keyword"]]) }, { code: unIndent` if (foo) bar(); else if (baz) foobar(); else if (bip) { qux(); } `, output: unIndent` if (foo) bar(); else if (baz) foobar(); else if (bip) { qux(); } `, options: [2], errors: expectedErrors([[3, 0, 5, "Keyword"], [4, 2, 7, "Identifier"], [5, 0, 5, "Punctuator"]]) }, { code: unIndent` if (foo) bar(); else if (baz) { foobar(); } else if (boop) { qux(); } `, output: unIndent` if (foo) bar(); else if (baz) { foobar(); } else if (boop) { qux(); } `, options: [2], errors: expectedErrors([[3, 2, 4, "Identifier"], [4, 0, 5, "Punctuator"], [5, 2, 7, "Identifier"], [6, 0, 5, "Punctuator"]]) }, { code: unIndent` function foo(aaa, bbb, ccc, ddd) { bar(); } `, output: unIndent` function foo(aaa, bbb, ccc, ddd) { bar(); } `, options: [2, { FunctionDeclaration: { parameters: 1, body: 2 } }], errors: expectedErrors([[2, 2, 4, "Identifier"], [3, 4, 6, "Identifier"]]) }, { code: unIndent` function foo(aaa, bbb, ccc, ddd) { bar(); } `, output: unIndent` function foo(aaa, bbb, ccc, ddd) { bar(); } `, options: [2, { FunctionDeclaration: { parameters: 3, body: 1 } }], errors: expectedErrors([[2, 6, 2, "Identifier"], [3, 2, 0, "Identifier"]]) }, { code: unIndent` function foo(aaa, bbb, ccc) { bar(); } `, output: unIndent` function foo(aaa, bbb, ccc) { bar(); } `, options: [4, { FunctionDeclaration: { parameters: 1, body: 3 } }], errors: expectedErrors([[2, 4, 8, "Identifier"], [3, 4, 2, "Identifier"], [4, 12, 6, "Identifier"]]) }, { code: unIndent` function foo(aaa, bbb, ccc, ddd, eee, fff) { bar(); } `, output: unIndent` function foo(aaa, bbb, ccc, ddd, eee, fff) { bar(); } `, options: [2, { FunctionDeclaration: { parameters: "first", body: 1 } }], errors: expectedErrors([[2, 13, 2, "Identifier"], [3, 13, 19, "Identifier"], [4, 2, 3, "Identifier"]]) }, { code: unIndent` function foo(aaa, bbb) { bar(); } `, output: unIndent` function foo(aaa, bbb) { bar(); } `, options: [2, { FunctionDeclaration: { body: 3 } }], errors: expectedErrors([3, 6, 0, "Identifier"]) }, { code: unIndent` function foo( aaa, bbb) { bar(); } `, output: unIndent` function foo( aaa, bbb) { bar(); } `, options: [2, { FunctionDeclaration: { parameters: "first", body: 2 } }], errors: expectedErrors([[2, 2, 0, "Identifier"], [3, 2, 4, "Identifier"], [4, 4, 0, "Identifier"]]) }, { code: unIndent` var foo = function(aaa, bbb, ccc, ddd) { bar(); } `, output: unIndent` var foo = function(aaa, bbb, ccc, ddd) { bar(); } `, options: [2, { FunctionExpression: { parameters: 2, body: 0 } }], errors: expectedErrors([[2, 4, 2, "Identifier"], [4, 4, 6, "Identifier"], [5, 0, 2, "Identifier"]]) }, { code: unIndent` var foo = function(aaa, bbb, ccc) { bar(); } `, output: unIndent` var foo = function(aaa, bbb, ccc) { bar(); } `, options: [2, { FunctionExpression: { parameters: 1, body: 10 } }], errors: expectedErrors([[2, 2, 3, "Identifier"], [3, 2, 1, "Identifier"], [4, 20, 2, "Identifier"]]) }, { code: unIndent` var foo = function(aaa, bbb, ccc, ddd, eee, fff) { bar(); } `, output: unIndent` var foo = function(aaa, bbb, ccc, ddd, eee, fff) { bar(); } `, options: [4, { FunctionExpression: { parameters: "first", body: 1 } }], errors: expectedErrors([[2, 19, 2, "Identifier"], [3, 19, 24, "Identifier"], [4, 4, 8, "Identifier"]]) }, { code: unIndent` var foo = function( aaa, bbb, ccc, ddd, eee) { bar(); } `, output: unIndent` var foo = function( aaa, bbb, ccc, ddd, eee) { bar(); } `, options: [2, { FunctionExpression: { parameters: "first", body: 3 } }], errors: expectedErrors([[2, 2, 0, "Identifier"], [3, 2, 4, "Identifier"], [4, 6, 2, "Identifier"]]) }, { code: unIndent` var foo = bar; \t\t\tvar baz = qux; `, output: unIndent` var foo = bar; var baz = qux; `, options: [2], errors: expectedErrors([2, "0 spaces", "3 tabs", "Keyword"]) }, { code: unIndent` function foo() { \tbar(); baz(); qux(); } `, output: unIndent` function foo() { \tbar(); \tbaz(); \tqux(); } `, options: ["tab"], errors: expectedErrors("tab", [[3, "1 tab", "2 spaces", "Identifier"], [4, "1 tab", "14 spaces", "Identifier"]]) }, { code: unIndent` function foo() { bar(); \t\t} `, output: unIndent` function foo() { bar(); } `, options: [2], errors: expectedErrors([[3, "0 spaces", "2 tabs", "Punctuator"]]) }, { code: unIndent` function foo() { function bar() { baz(); } } `, output: unIndent` function foo() { function bar() { baz(); } } `, options: [2, { FunctionDeclaration: { body: 1 } }], errors: expectedErrors([3, 4, 8, "Identifier"]) }, { code: unIndent` function foo() { function bar(baz, qux) { foobar(); } } `, output: unIndent` function foo() { function bar(baz, qux) { foobar(); } } `, options: [2, { FunctionDeclaration: { body: 1, parameters: 2 } }], errors: expectedErrors([3, 6, 4, "Identifier"]) }, { code: unIndent` function foo() { var bar = function(baz, qux) { foobar(); }; } `, output: unIndent` function foo() { var bar = function(baz, qux) { foobar(); }; } `, options: [2, { FunctionExpression: { parameters: 3 } }], errors: expectedErrors([3, 8, 10, "Identifier"]) }, { code: unIndent` foo.bar( baz, qux, function() { qux; } ); `, output: unIndent` foo.bar( baz, qux, function() { qux; } ); `, options: [2, { FunctionExpression: { body: 3 }, CallExpression: { arguments: 3 } }], errors: expectedErrors([3, 12, 8, "Identifier"]) }, { code: unIndent` { try { } catch (err) { } finally { } } `, output: unIndent` { try { } catch (err) { } finally { } } `, errors: expectedErrors([ [4, 4, 0, "Keyword"], [6, 4, 0, "Keyword"] ]) }, { code: unIndent` { do { } while (true) } `, output: unIndent` { do { } while (true) } `, errors: expectedErrors([4, 4, 0, "Keyword"]) }, { code: unIndent` function foo() { return ( 1 ) } `, output: unIndent` function foo() { return ( 1 ) } `, options: [2], errors: expectedErrors([[4, 2, 4, "Punctuator"]]) }, { code: unIndent` function foo() { return ( 1 ); } `, output: unIndent` function foo() { return ( 1 ); } `, options: [2], errors: expectedErrors([[4, 2, 4, "Punctuator"]]) }, { code: unIndent` function test(){ switch(length){ case 1: return function(a){ return fn.call(that, a); }; } } `, output: unIndent` function test(){ switch(length){ case 1: return function(a){ return fn.call(that, a); }; } } `, options: [2, { VariableDeclarator: 2, SwitchCase: 1 }], errors: expectedErrors([[4, 6, 4, "Keyword"]]) }, { code: unIndent` function foo() { return 1 } `, output: unIndent` function foo() { return 1 } `, options: [2], errors: expectedErrors([[2, 2, 3, "Keyword"]]) }, { code: unIndent` foo( bar, baz, qux); `, output: unIndent` foo( bar, baz, qux); `, options: [2, { CallExpression: { arguments: 1 } }], errors: expectedErrors([[2, 2, 0, "Identifier"], [4, 2, 4, "Identifier"]]) }, { code: unIndent` foo( \tbar, \tbaz); `, output: unIndent` foo( bar, baz); `, options: [2, { CallExpression: { arguments: 2 } }], errors: expectedErrors([[2, "4 spaces", "1 tab", "Identifier"], [3, "4 spaces", "1 tab", "Identifier"]]) }, { code: unIndent` foo(bar, \t\tbaz, \t\tqux); `, output: unIndent` foo(bar, \tbaz, \tqux); `, options: ["tab", { CallExpression: { arguments: 1 } }], errors: expectedErrors("tab", [[2, 1, 2, "Identifier"], [3, 1, 2, "Identifier"]]) }, { code: unIndent` foo(bar, baz, qux); `, output: unIndent` foo(bar, baz, qux); `, options: [2, { CallExpression: { arguments: "first" } }], errors: expectedErrors([2, 4, 9, "Identifier"]) }, { code: unIndent` foo( bar, baz); `, output: unIndent` foo( bar, baz); `, options: [2, { CallExpression: { arguments: "first" } }], errors: expectedErrors([[2, 2, 10, "Identifier"], [3, 2, 4, "Identifier"]]) }, { code: unIndent` foo(bar, 1 + 2, !baz, new Car('!') ); `, output: unIndent` foo(bar, 1 + 2, !baz, new Car('!') ); `, options: [2, { CallExpression: { arguments: 3 } }], errors: expectedErrors([[2, 6, 2, "Numeric"], [3, 6, 14, "Punctuator"], [4, 6, 8, "Keyword"]]) }, // https://github.com/eslint/eslint/issues/7573 { code: unIndent` return ( foo ); `, output: unIndent` return ( foo ); `, parserOptions: { ecmaFeatures: { globalReturn: true } }, errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` return ( foo ) `, output: unIndent` return ( foo ) `, parserOptions: { ecmaFeatures: { globalReturn: true } }, errors: expectedErrors([3, 0, 4, "Punctuator"]) }, // https://github.com/eslint/eslint/issues/7604 { code: unIndent` if (foo) { /* comment */bar(); } `, output: unIndent` if (foo) { /* comment */bar(); } `, errors: expectedErrors([2, 4, 8, "Block"]) }, { code: unIndent` foo('bar', /** comment */{ ok: true }); `, output: unIndent` foo('bar', /** comment */{ ok: true }); `, errors: expectedErrors([2, 4, 8, "Block"]) }, { code: unIndent` foo( (bar) ); `, output: unIndent` foo( (bar) ); `, options: [4, { CallExpression: { arguments: 1 } }], errors: expectedErrors([2, 4, 0, "Punctuator"]) }, { code: unIndent` (( foo )) `, output: unIndent` (( foo )) `, options: [4], errors: expectedErrors([2, 4, 0, "Identifier"]) }, // ternary expressions (https://github.com/eslint/eslint/issues/7420) { code: unIndent` foo ? bar : baz `, output: unIndent` foo ? bar : baz `, options: [2], errors: expectedErrors([[2, 2, 0, "Punctuator"], [3, 2, 4, "Punctuator"]]) }, { code: unIndent` [ foo ? bar : baz, qux ] `, output: unIndent` [ foo ? bar : baz, qux ] `, errors: expectedErrors([5, 4, 8, "Identifier"]) }, { code: unIndent` condition ? () => { return true } : condition2 ? () => { return true } : () => { return false } `, output: unIndent` condition ? () => { return true } : condition2 ? () => { return true } : () => { return false } `, options: [2, { offsetTernaryExpressions: true }], errors: expectedErrors([ [2, 2, 0, "Punctuator"], [3, 6, 0, "Keyword"], [4, 4, 0, "Punctuator"], [5, 2, 0, "Punctuator"], [6, 4, 0, "Punctuator"], [7, 8, 0, "Keyword"], [8, 6, 0, "Punctuator"], [9, 4, 0, "Punctuator"], [10, 8, 0, "Keyword"], [11, 6, 0, "Punctuator"] ]) }, { code: unIndent` condition ? () => { return true } : condition2 ? () => { return true } : () => { return false } `, output: unIndent` condition ? () => { return true } : condition2 ? () => { return true } : () => { return false } `, options: [2, { offsetTernaryExpressions: false }], errors: expectedErrors([ [2, 2, 0, "Punctuator"], [3, 4, 0, "Keyword"], [4, 2, 0, "Punctuator"], [5, 2, 0, "Punctuator"], [6, 4, 0, "Punctuator"], [7, 6, 0, "Keyword"], [8, 4, 0, "Punctuator"], [9, 4, 0, "Punctuator"], [10, 6, 0, "Keyword"], [11, 4, 0, "Punctuator"] ]) }, { /* * Checking comments: * https://github.com/eslint/eslint/issues/6571 */ code: unIndent` foo(); // comment /* multiline comment */ bar(); // trailing comment `, output: unIndent` foo(); // comment /* multiline comment */ bar(); // trailing comment `, options: [2], errors: expectedErrors([[2, 0, 2, "Line"], [3, 0, 4, "Block"], [6, 0, 1, "Line"]]) }, { code: " // comment", output: "// comment", errors: expectedErrors([1, 0, 2, "Line"]) }, { code: unIndent` foo // comment `, output: unIndent` foo // comment `, errors: expectedErrors([2, 0, 2, "Line"]) }, { code: unIndent` // comment foo `, output: unIndent` // comment foo `, errors: expectedErrors([1, 0, 2, "Line"]) }, { code: unIndent` [ // no elements ] `, output: unIndent` [ // no elements ] `, errors: expectedErrors([2, 4, 8, "Line"]) }, { /* * Destructuring assignments: * https://github.com/eslint/eslint/issues/6813 */ code: unIndent` var { foo, bar, baz: qux, foobar: baz = foobar } = qux; `, output: unIndent` var { foo, bar, baz: qux, foobar: baz = foobar } = qux; `, options: [2], errors: expectedErrors([[2, 2, 0, "Identifier"], [4, 2, 4, "Identifier"], [5, 2, 6, "Identifier"], [6, 0, 2, "Punctuator"]]) }, { code: unIndent` const { a } = { a: 1 } `, output: unIndent` const { a } = { a: 1 } `, options: [2], errors: expectedErrors([[4, 2, 4, "Identifier"], [5, 0, 2, "Punctuator"]]) }, { code: unIndent` var foo = [ bar, baz ] `, output: unIndent` var foo = [ bar, baz ] `, errors: expectedErrors([[2, 4, 11, "Identifier"], [3, 4, 2, "Identifier"], [4, 0, 10, "Punctuator"]]) }, { code: unIndent` var foo = [bar, baz, qux ] `, output: unIndent` var foo = [bar, baz, qux ] `, errors: expectedErrors([2, 4, 0, "Identifier"]) }, { code: unIndent` var foo = [bar, baz, qux ] `, output: unIndent` var foo = [bar, baz, qux ] `, options: [2, { ArrayExpression: 0 }], errors: expectedErrors([[2, 0, 2, "Identifier"], [3, 0, 2, "Identifier"]]) }, { code: unIndent` var foo = [bar, baz, qux ] `, output: unIndent` var foo = [bar, baz, qux ] `, options: [2, { ArrayExpression: 8 }], errors: expectedErrors([[2, 16, 2, "Identifier"], [3, 16, 2, "Identifier"]]) }, { code: unIndent` var foo = [bar, baz, qux ] `, output: unIndent` var foo = [bar, baz, qux ] `, options: [2, { ArrayExpression: "first" }], errors: expectedErrors([[2, 11, 4, "Identifier"], [3, 11, 4, "Identifier"]]) }, { code: unIndent` var foo = [bar, baz, qux ] `, output: unIndent` var foo = [bar, baz, qux ] `, options: [2, { ArrayExpression: "first" }], errors: expectedErrors([2, 11, 4, "Identifier"]) }, { code: unIndent` var foo = [ { bar: 1, baz: 2 }, { bar: 3, qux: 4 } ] `, output: unIndent` var foo = [ { bar: 1, baz: 2 }, { bar: 3, qux: 4 } ] `, options: [4, { ArrayExpression: 2, ObjectExpression: "first" }], errors: expectedErrors([[3, 10, 12, "Identifier"], [5, 10, 12, "Identifier"]]) }, { code: unIndent` var foo = { bar: 1, baz: 2 }; `, output: unIndent` var foo = { bar: 1, baz: 2 }; `, options: [2, { ObjectExpression: 0 }], errors: expectedErrors([[2, 0, 2, "Identifier"], [3, 0, 2, "Identifier"]]) }, { code: unIndent` var quux = { foo: 1, bar: 2, baz: 3 } `, output: unIndent` var quux = { foo: 1, bar: 2, baz: 3 } `, options: [2, { ObjectExpression: "first" }], errors: expectedErrors([2, 13, 0, "Identifier"]) }, { code: unIndent` function foo() { [ foo ] } `, output: unIndent` function foo() { [ foo ] } `, options: [2, { ArrayExpression: 4 }], errors: expectedErrors([[2, 2, 4, "Punctuator"], [3, 10, 12, "Identifier"], [4, 2, 4, "Punctuator"]]) }, { code: unIndent` var [ foo, bar, baz, foobar = baz ] = qux; `, output: unIndent` var [ foo, bar, baz, foobar = baz ] = qux; `, options: [2], errors: expectedErrors([[2, 2, 0, "Identifier"], [4, 2, 4, "Identifier"], [5, 2, 6, "Identifier"], [6, 0, 2, "Punctuator"]]) }, { code: unIndent` import { foo, bar, baz } from 'qux'; `, output: unIndent` import { foo, bar, baz } from 'qux'; `, parserOptions: { ecmaVersion: 6, sourceType: "module" }, errors: expectedErrors([[2, 4, 0, "Identifier"], [3, 4, 2, "Identifier"]]) }, { code: unIndent` import { foo, bar, baz, } from 'qux'; `, output: unIndent` import { foo, bar, baz, } from 'qux'; `, options: [4, { ImportDeclaration: "first" }], parserOptions: { ecmaVersion: 6, sourceType: "module" }, errors: expectedErrors([[3, 9, 10, "Identifier"]]) }, { code: unIndent` import { foo, bar, baz, } from 'qux'; `, output: unIndent` import { foo, bar, baz, } from 'qux'; `, options: [2, { ImportDeclaration: 2 }], parserOptions: { ecmaVersion: 6, sourceType: "module" }, errors: expectedErrors([[3, 4, 5, "Identifier"]]) }, { code: unIndent` var foo = 0, bar = 0, baz = 0; export { foo, bar, baz }; `, output: unIndent` var foo = 0, bar = 0, baz = 0; export { foo, bar, baz }; `, parserOptions: { ecmaVersion: 6, sourceType: "module" }, errors: expectedErrors([[3, 4, 0, "Identifier"], [4, 4, 2, "Identifier"]]) }, { code: unIndent` var foo = 0, bar = 0, baz = 0; export { foo, bar, baz } from 'qux'; `, output: unIndent` var foo = 0, bar = 0, baz = 0; export { foo, bar, baz } from 'qux'; `, parserOptions: { ecmaVersion: 6, sourceType: "module" }, errors: expectedErrors([[3, 4, 0, "Identifier"], [4, 4, 2, "Identifier"]]) }, { // https://github.com/eslint/eslint/issues/7233 code: unIndent` var folder = filePath .foo() .bar; `, output: unIndent` var folder = filePath .foo() .bar; `, options: [2, { MemberExpression: 2 }], errors: expectedErrors([[2, 4, 2, "Punctuator"], [3, 4, 6, "Punctuator"]]) }, { code: unIndent` for (const foo of bar) baz(); `, output: unIndent` for (const foo of bar) baz(); `, options: [2], errors: expectedErrors([2, 2, 4, "Identifier"]) }, { code: unIndent` var x = () => 5; `, output: unIndent` var x = () => 5; `, options: [2], errors: expectedErrors([2, 2, 4, "Numeric"]) }, { // BinaryExpressions with parens code: unIndent` foo && ( bar ) `, output: unIndent` foo && ( bar ) `, options: [4], errors: expectedErrors([2, 4, 8, "Identifier"]) }, { code: unIndent` foo && !bar( ) `, output: unIndent` foo && !bar( ) `, errors: expectedErrors([3, 4, 0, "Punctuator"]) }, { code: unIndent` foo && ![].map(() => { bar(); }) `, output: unIndent` foo && ![].map(() => { bar(); }) `, errors: expectedErrors([[3, 8, 4, "Identifier"], [4, 4, 0, "Punctuator"]]) }, { code: unIndent` [ ] || [ ] `, output: unIndent` [ ] || [ ] `, errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` foo || ( bar ) `, output: unIndent` foo || ( bar ) `, errors: expectedErrors([[3, 12, 16, "Identifier"], [4, 8, 12, "Punctuator"]]) }, { code: unIndent` 1 + ( 1 ) `, output: unIndent` 1 + ( 1 ) `, errors: expectedErrors([[3, 4, 8, "Numeric"], [4, 0, 4, "Punctuator"]]) }, // Template curlies { code: unIndent` \`foo\${ bar}\` `, output: unIndent` \`foo\${ bar}\` `, options: [2], errors: expectedErrors([2, 2, 0, "Identifier"]) }, { code: unIndent` \`foo\${ \`bar\${ baz}\`}\` `, output: unIndent` \`foo\${ \`bar\${ baz}\`}\` `, options: [2], errors: expectedErrors([[2, 2, 4, "Template"], [3, 4, 0, "Identifier"]]) }, { code: unIndent` \`foo\${ \`bar\${ baz }\` }\` `, output: unIndent` \`foo\${ \`bar\${ baz }\` }\` `, options: [2], errors: expectedErrors([[2, 2, 4, "Template"], [3, 4, 2, "Identifier"], [4, 2, 4, "Template"], [5, 0, 2, "Template"]]) }, { code: unIndent` \`foo\${ ( bar ) }\` `, output: unIndent` \`foo\${ ( bar ) }\` `, options: [2], errors: expectedErrors([[2, 2, 0, "Punctuator"], [3, 4, 2, "Identifier"], [4, 2, 0, "Punctuator"]]) }, { code: unIndent` function foo() { \`foo\${bar}baz\${ qux}foo\${ bar}baz\` } `, output: unIndent` function foo() { \`foo\${bar}baz\${ qux}foo\${ bar}baz\` } `, errors: expectedErrors([[3, 8, 0, "Identifier"], [4, 8, 2, "Identifier"]]) }, { code: unIndent` function foo() { const template = \`the indentation of a curly element in a \${ node.type } node is checked.\`; } `, output: unIndent` function foo() { const template = \`the indentation of a curly element in a \${ node.type } node is checked.\`; } `, errors: expectedErrors([[4, 4, 8, "Identifier"], [5, 0, 4, "Template"]]) }, { code: unIndent` function foo() { const template = \`this time the closing curly is at the end of the line \${ foo} so the spaces before this line aren't removed.\`; } `, output: unIndent` function foo() { const template = \`this time the closing curly is at the end of the line \${ foo} so the spaces before this line aren't removed.\`; } `, errors: expectedErrors([4, 4, 12, "Identifier"]) }, { /* * https://github.com/eslint/eslint/issues/1801 * Note: This issue also mentioned checking the indentation for the 2 below. However, * this is intentionally ignored because everyone seems to have a different idea of how * BinaryExpressions should be indented. */ code: unIndent` if (true) { a = ( 1 + 2); } `, output: unIndent` if (true) { a = ( 1 + 2); } `, errors: expectedErrors([3, 8, 0, "Numeric"]) }, { // https://github.com/eslint/eslint/issues/3737 code: unIndent` if (true) { for (;;) { b(); } } `, output: unIndent` if (true) { for (;;) { b(); } } `, options: [2], errors: expectedErrors([[2, 2, 4, "Keyword"], [3, 4, 6, "Identifier"]]) }, { // https://github.com/eslint/eslint/issues/6670 code: unIndent` function f() { return asyncCall() .then( 'some string', [ 1, 2, 3 ] ); } `, output: unIndent` function f() { return asyncCall() .then( 'some string', [ 1, 2, 3 ] ); } `, options: [4, { MemberExpression: 1, CallExpression: { arguments: 1 } }], errors: expectedErrors([ [3, 8, 4, "Punctuator"], [4, 12, 15, "String"], [5, 12, 14, "Punctuator"], [6, 16, 14, "Numeric"], [7, 16, 9, "Numeric"], [8, 16, 35, "Numeric"], [9, 12, 22, "Punctuator"], [10, 8, 0, "Punctuator"], [11, 0, 1, "Punctuator"] ]) }, // https://github.com/eslint/eslint/issues/7242 { code: unIndent` var x = [ [1], [2] ] `, output: unIndent` var x = [ [1], [2] ] `, errors: expectedErrors([[2, 4, 6, "Punctuator"], [3, 4, 2, "Punctuator"]]) }, { code: unIndent` var y = [ {a: 1}, {b: 2} ] `, output: unIndent` var y = [ {a: 1}, {b: 2} ] `, errors: expectedErrors([[2, 4, 6, "Punctuator"], [3, 4, 2, "Punctuator"]]) }, { code: unIndent` echo = spawn('cmd.exe', ['foo', 'bar', 'baz']); `, output: unIndent` echo = spawn('cmd.exe', ['foo', 'bar', 'baz']); `, options: [2, { ArrayExpression: "first", CallExpression: { arguments: "first" } }], errors: expectedErrors([[2, 13, 12, "Punctuator"], [3, 14, 13, "String"]]) }, { // https://github.com/eslint/eslint/issues/7522 code: unIndent` foo( ) `, output: unIndent` foo( ) `, errors: expectedErrors([2, 0, 2, "Punctuator"]) }, { // https://github.com/eslint/eslint/issues/7616 code: unIndent` foo( bar, { baz: 1 } ) `, output: unIndent` foo( bar, { baz: 1 } ) `, options: [4, { CallExpression: { arguments: "first" } }], errors: expectedErrors([[2, 4, 8, "Identifier"]]) }, { code: " new Foo", output: "new Foo", errors: expectedErrors([1, 0, 2, "Keyword"]) }, { code: unIndent` var foo = 0, bar = 0, baz = 0; export { foo, bar, baz } `, output: unIndent` var foo = 0, bar = 0, baz = 0; export { foo, bar, baz } `, parserOptions: { ecmaVersion: 6, sourceType: "module" }, errors: expectedErrors([[3, 4, 0, "Identifier"], [4, 4, 8, "Identifier"], [5, 4, 2, "Identifier"]]) }, { code: unIndent` foo ? bar : baz `, output: unIndent` foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }], errors: expectedErrors([3, 4, 0, "Punctuator"]) }, { code: unIndent` foo ? bar : baz `, output: unIndent` foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }], errors: expectedErrors([3, 4, 0, "Identifier"]) }, { code: unIndent` foo ? bar : baz `, output: unIndent` foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }], errors: expectedErrors([3, 4, 2, "Punctuator"]) }, { code: unIndent` foo ? bar : baz `, output: unIndent` foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }], errors: expectedErrors([3, 4, 0, "Identifier"]) }, { code: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, output: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, options: [4, { flatTernaryExpressions: true }], errors: expectedErrors([ [3, 4, 8, "Punctuator"], [4, 4, 12, "Punctuator"] ]) }, { code: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, output: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, options: [4, { flatTernaryExpressions: true }], errors: expectedErrors([ [3, 4, 8, "Identifier"], [4, 4, 12, "Identifier"] ]) }, { code: unIndent` var a = foo ? bar : baz ? qux : foobar ? boop : /*else*/ beep `, output: unIndent` var a = foo ? bar : baz ? qux : foobar ? boop : /*else*/ beep `, options: [4, { flatTernaryExpressions: true }], errors: expectedErrors([ [3, 4, 6, "Identifier"], [4, 4, 2, "Identifier"] ]) }, { code: unIndent` var a = foo ? bar : baz `, output: unIndent` var a = foo ? bar : baz `, options: [4, { flatTernaryExpressions: true }], errors: expectedErrors([ [3, 8, 4, "Punctuator"], [4, 8, 4, "Punctuator"] ]) }, { code: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, output: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, options: [4, { flatTernaryExpressions: false }], errors: expectedErrors([ [3, 8, 4, "Punctuator"], [4, 12, 4, "Punctuator"] ]) }, { code: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, output: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, options: [4, { flatTernaryExpressions: false }], errors: expectedErrors([ [3, 8, 4, "Identifier"], [4, 12, 4, "Identifier"] ]) }, { code: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, output: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, options: [4, { flatTernaryExpressions: false }], errors: expectedErrors([ [4, 8, 4, "Punctuator"], [5, 8, 4, "Punctuator"], [6, 12, 4, "Punctuator"], [7, 12, 4, "Punctuator"] ]) }, { code: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, output: unIndent` foo ? bar : baz ? qux : foobar ? boop : beep `, options: [4, { flatTernaryExpressions: false }], errors: expectedErrors([ [4, 8, 4, "Identifier"], [5, 8, 4, "Identifier"], [6, 12, 4, "Identifier"], [7, 12, 4, "Identifier"] ]) }, { code: unIndent` foo.bar('baz', function(err) { qux; }); `, output: unIndent` foo.bar('baz', function(err) { qux; }); `, options: [2, { CallExpression: { arguments: "first" } }], errors: expectedErrors([2, 2, 10, "Identifier"]) }, { code: unIndent` foo.bar(function() { cookies; }).baz(function() { cookies; }); `, output: unIndent` foo.bar(function() { cookies; }).baz(function() { cookies; }); `, options: [2, { MemberExpression: 1 }], errors: expectedErrors([[4, 2, 4, "Identifier"], [5, 0, 2, "Punctuator"]]) }, { code: unIndent` foo.bar().baz(function() { cookies; }).qux(function() { cookies; }); `, output: unIndent` foo.bar().baz(function() { cookies; }).qux(function() { cookies; }); `, options: [2, { MemberExpression: 1 }], errors: expectedErrors([[4, 2, 4, "Identifier"], [5, 0, 2, "Punctuator"]]) }, { code: unIndent` [ foo, bar ].forEach(function() { baz; }) `, output: unIndent` [ foo, bar ].forEach(function() { baz; }) `, options: [2, { ArrayExpression: "first", MemberExpression: 1 }], errors: expectedErrors([[3, 2, 4, "Identifier"], [4, 0, 2, "Punctuator"]]) }, { code: unIndent` foo[ bar ]; `, output: unIndent` foo[ bar ]; `, options: [4, { MemberExpression: 1 }], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` foo({ bar: 1, baz: 2 }) `, output: unIndent` foo({ bar: 1, baz: 2 }) `, options: [4, { ObjectExpression: "first" }], errors: expectedErrors([[2, 4, 0, "Identifier"], [3, 4, 0, "Identifier"]]) }, { code: unIndent` foo( bar, baz, qux); `, output: unIndent` foo( bar, baz, qux); `, options: [2, { CallExpression: { arguments: "first" } }], errors: expectedErrors([[2, 2, 24, "Identifier"], [3, 2, 24, "Identifier"]]) }, { code: unIndent` if (foo) bar() ; [1, 2, 3].map(baz) `, output: unIndent` if (foo) bar() ; [1, 2, 3].map(baz) `, errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` if (foo) ; `, output: unIndent` if (foo) ; `, errors: expectedErrors([2, 4, 0, "Punctuator"]) }, { code: unIndent` import {foo} from 'bar'; `, output: unIndent` import {foo} from 'bar'; `, parserOptions: { ecmaVersion: 6, sourceType: "module" }, errors: expectedErrors([2, 4, 0, "Identifier"]) }, { code: unIndent` export {foo} from 'bar'; `, output: unIndent` export {foo} from 'bar'; `, parserOptions: { ecmaVersion: 6, sourceType: "module" }, errors: expectedErrors([2, 4, 0, "Identifier"]) }, { code: unIndent` ( a ) => b => { c } `, output: unIndent` ( a ) => b => { c } `, errors: expectedErrors([[4, 4, 8, "Identifier"], [5, 0, 4, "Punctuator"]]) }, { code: unIndent` ( a ) => b => c => d => { e } `, output: unIndent` ( a ) => b => c => d => { e } `, errors: expectedErrors([[4, 4, 8, "Identifier"], [5, 0, 4, "Punctuator"]]) }, { code: unIndent` if ( foo ) bar( baz ); `, output: unIndent` if ( foo ) bar( baz ); `, errors: expectedErrors([[4, 4, 8, "Identifier"], [5, 0, 4, "Punctuator"]]) }, { code: unIndent` ( foo )( bar ) `, output: unIndent` ( foo )( bar ) `, errors: expectedErrors([[4, 4, 8, "Identifier"], [5, 0, 4, "Punctuator"]]) }, { code: unIndent` (() => foo )( bar ) `, output: unIndent` (() => foo )( bar ) `, errors: expectedErrors([[4, 4, 8, "Identifier"], [5, 0, 4, "Punctuator"]]) }, { code: unIndent` (() => { foo(); })( bar ) `, output: unIndent` (() => { foo(); })( bar ) `, errors: expectedErrors([[4, 4, 8, "Identifier"], [5, 0, 4, "Punctuator"]]) }, { code: unIndent` foo. bar. baz `, output: unIndent` foo. bar. baz `, errors: expectedErrors([[2, 4, 2, "Identifier"], [3, 4, 6, "Identifier"]]) }, { code: unIndent` const foo = a.b(), longName = (baz( 'bar', 'bar' )); `, output: unIndent` const foo = a.b(), longName = (baz( 'bar', 'bar' )); `, errors: expectedErrors([[4, 8, 12, "String"], [5, 8, 12, "String"], [6, 4, 8, "Punctuator"]]) }, { code: unIndent` const foo = a.b(), longName = (baz( 'bar', 'bar' )); `, output: unIndent` const foo = a.b(), longName = (baz( 'bar', 'bar' )); `, errors: expectedErrors([[4, 8, 12, "String"], [5, 8, 12, "String"], [6, 4, 8, "Punctuator"]]) }, { code: unIndent` const foo = a.b(), longName =baz( 'bar', 'bar' ); `, output: unIndent` const foo = a.b(), longName =baz( 'bar', 'bar' ); `, errors: expectedErrors([[6, 8, 4, "Punctuator"]]) }, { code: unIndent` const foo = a.b(), longName =( 'fff' ); `, output: unIndent` const foo = a.b(), longName =( 'fff' ); `, errors: expectedErrors([[4, 12, 8, "String"]]) }, //---------------------------------------------------------------------- // Ignore Unknown Nodes //---------------------------------------------------------------------- { code: unIndent` namespace Foo { const bar = 3, baz = 2; if (true) { const bax = 3; } } `, output: unIndent` namespace Foo { const bar = 3, baz = 2; if (true) { const bax = 3; } } `, parser: parser("unknown-nodes/namespace-invalid"), errors: expectedErrors([[3, 8, 4, "Identifier"], [6, 8, 4, "Keyword"]]) }, { code: unIndent` abstract class Foo { public bar() { let aaa = 4, boo; if (true) { boo = 3; } boo = 3 + 2; } } `, output: unIndent` abstract class Foo { public bar() { let aaa = 4, boo; if (true) { boo = 3; } boo = 3 + 2; } } `, parser: parser("unknown-nodes/abstract-class-invalid"), errors: expectedErrors([[4, 12, 8, "Identifier"], [7, 12, 8, "Identifier"], [10, 8, 4, "Identifier"]]) }, { code: unIndent` function foo() { function bar() { abstract class X { public baz() { if (true) { qux(); } } } } } `, output: unIndent` function foo() { function bar() { abstract class X { public baz() { if (true) { qux(); } } } } } `, parser: parser("unknown-nodes/functions-with-abstract-class-invalid"), errors: expectedErrors([ [4, 12, 8, "Keyword"], [5, 16, 8, "Keyword"], [6, 20, 8, "Identifier"], [7, 16, 8, "Punctuator"], [8, 12, 8, "Punctuator"] ]) }, { code: unIndent` namespace Unknown { function foo() { function bar() { abstract class X { public baz() { if (true) { qux(); } } } } } } `, output: unIndent` namespace Unknown { function foo() { function bar() { abstract class X { public baz() { if (true) { qux(); } } } } } } `, parser: parser("unknown-nodes/namespace-with-functions-with-abstract-class-invalid"), errors: expectedErrors([ [3, 8, 4, "Keyword"], [7, 24, 20, "Identifier"] ]) }, //---------------------------------------------------------------------- // JSX tests // Some of the following tests are adapted from the tests in eslint-plugin-react. // License: https://github.com/yannickcr/eslint-plugin-react/blob/7ca9841f22d599f447a27ef5b2a97def9229d6c8/LICENSE //---------------------------------------------------------------------- { code: unIndent` `, output: unIndent` `, errors: expectedErrors([2, 4, 2, "Punctuator"]) }, { code: unIndent` `, output: unIndent` `, options: [2], errors: expectedErrors([2, 2, 4, "Punctuator"]) }, { code: unIndent` `, output: unIndent` \t `, options: ["tab"], errors: expectedErrors([2, "1 tab", "4 spaces", "Punctuator"]) }, { code: unIndent` function App() { return ; } `, output: unIndent` function App() { return ; } `, options: [2], errors: expectedErrors([4, 2, 9, "Punctuator"]) }, { code: unIndent` function App() { return ( ); } `, output: unIndent` function App() { return ( ); } `, options: [2], errors: expectedErrors([4, 2, 4, "Punctuator"]) }, { code: unIndent` function App() { return ( ); } `, output: unIndent` function App() { return ( ); } `, options: [2], errors: expectedErrors([[3, 4, 0, "Punctuator"], [4, 6, 2, "Punctuator"], [5, 4, 0, "Punctuator"]]) }, { code: unIndent` {test} `, output: unIndent` {test} `, errors: expectedErrors([2, 4, 1, "Punctuator"]) }, { code: unIndent` {options.map((option, index) => ( ))} `, output: unIndent` {options.map((option, index) => ( ))} `, errors: expectedErrors([4, 12, 11, "Punctuator"]) }, { code: unIndent` [
,
] `, output: unIndent` [
,
] `, options: [2], errors: expectedErrors([3, 2, 4, "Punctuator"]) }, { code: unIndent` `, output: unIndent` \t `, options: ["tab"], errors: expectedErrors([3, "1 tab", "1 space", "Punctuator"]) }, { /* * Multiline ternary * (colon at the end of the first expression) */ code: unIndent` foo ? : `, output: unIndent` foo ? : `, errors: expectedErrors([3, 4, 0, "Punctuator"]) }, { /* * Multiline ternary * (colon on its own line) */ code: unIndent` foo ? : `, output: unIndent` foo ? : `, errors: expectedErrors([[3, 4, 0, "Punctuator"], [4, 4, 0, "Punctuator"]]) }, { /* * Multiline ternary * (colon at the end of the first expression, parenthesized first expression) */ code: unIndent` foo ? ( ) : `, output: unIndent` foo ? ( ) : `, errors: expectedErrors([4, 4, 0, "Punctuator"]) }, { code: unIndent` `, output: unIndent` `, errors: expectedErrors([2, 4, 2, "JSXIdentifier"]) }, { code: unIndent` `, output: unIndent` `, options: [2], errors: expectedErrors([3, 0, 2, "Punctuator"]) }, { code: unIndent` `, output: unIndent` `, options: [2], errors: expectedErrors([3, 0, 2, "Punctuator"]) }, { code: unIndent` const Button = function(props) { return ( ); }; `, output: unIndent` const Button = function(props) { return ( ); }; `, options: [2], errors: expectedErrors([6, 4, 36, "Punctuator"]) }, { code: unIndent` var x = function() { return } `, output: unIndent` var x = function() { return } `, options: [2], errors: expectedErrors([4, 2, 9, "Punctuator"]) }, { code: unIndent` var x = `, output: unIndent` var x = `, options: [2], errors: expectedErrors([3, 0, 8, "Punctuator"]) }, { code: unIndent` var x = ( ) `, output: unIndent` var x = ( ) `, options: [2], errors: expectedErrors([3, 2, 4, "Punctuator"]) }, { code: unIndent` `, output: unIndent` `, options: ["tab"], errors: expectedErrors("tab", [3, 0, 1, "Punctuator"]) }, { code: unIndent` `, output: unIndent` `, options: ["tab"], errors: expectedErrors("tab", [3, 0, 1, "Punctuator"]) }, { code: unIndent` < foo .bar .baz > foo `, output: unIndent` < foo .bar .baz > foo `, errors: expectedErrors([ [3, 8, 4, "Punctuator"], [4, 8, 4, "Punctuator"], [9, 8, 4, "JSXIdentifier"], [10, 8, 4, "JSXIdentifier"] ]) }, { code: unIndent` < input type= "number" /> `, output: unIndent` < input type= "number" /> `, errors: expectedErrors([4, 8, 4, "JSXText"]) }, { code: unIndent` < input type= {'number'} /> `, output: unIndent` < input type= {'number'} /> `, errors: expectedErrors([4, 8, 4, "Punctuator"]) }, { code: unIndent` < input type ="number" /> `, output: unIndent` < input type ="number" /> `, errors: expectedErrors([4, 8, 4, "Punctuator"]) }, { code: unIndent` foo ? ( bar ) : ( baz ) `, output: unIndent` foo ? ( bar ) : ( baz ) `, errors: expectedErrors([[4, 4, 8, "Identifier"], [5, 0, 4, "Punctuator"]]) }, { code: unIndent` foo ? (
) : ( ) `, output: unIndent` foo ? (
) : ( ) `, errors: expectedErrors([[5, 4, 8, "Punctuator"], [6, 4, 8, "Punctuator"], [7, 0, 4, "Punctuator"]]) }, { code: unIndent`
{ ( 1 ) }
`, output: unIndent`
{ ( 1 ) }
`, errors: expectedErrors([[3, 8, 4, "Punctuator"], [4, 12, 8, "Numeric"], [5, 8, 4, "Punctuator"]]) }, { code: unIndent`
{ /* foo */ }
`, output: unIndent`
{ /* foo */ }
`, errors: expectedErrors([3, 8, 6, "Block"]) }, { code: unIndent`
`, output: unIndent`
`, errors: expectedErrors([2, 4, 0, "Punctuator"]) }, { code: unIndent`
`, output: unIndent`
`, errors: expectedErrors([3, 8, 6, "Punctuator"]) }, { code: unIndent`
foo
bar
`, output: unIndent`
foo
bar
`, errors: expectedErrors([2, 4, 0, "Punctuator"]) }, { code: unIndent` Foo bar  baz qux. `, output: unIndent` Foo bar  baz qux. `, errors: expectedErrors([2, 4, 0, "Punctuator"]) }, /* * JSX Fragments * https://github.com/eslint/eslint/issues/12208 */ { code: unIndent` <> `, output: unIndent` <> `, errors: expectedErrors([2, 4, 0, "Punctuator"]) }, { code: unIndent` < > `, output: unIndent` < > `, errors: expectedErrors([2, 0, 4, "Punctuator"]) }, { code: unIndent` <> < /> `, output: unIndent` <> < /> `, errors: expectedErrors([4, 0, 4, "Punctuator"]) }, { code: unIndent` <> `, output: unIndent` <> `, errors: expectedErrors([4, 0, 4, "Punctuator"]) }, { code: unIndent` < > `, output: unIndent` < > `, errors: expectedErrors([ [2, 0, 4, "Punctuator"], [5, 0, 4, "Punctuator"] ]) }, { code: unIndent` < > < /> `, output: unIndent` < > < /> `, errors: expectedErrors([ [2, 0, 4, "Punctuator"], [5, 0, 4, "Punctuator"] ]) }, { code: unIndent` < // Comment > `, output: unIndent` < // Comment > `, errors: expectedErrors([2, 0, 4, "Punctuator"]) }, { code: unIndent` <> < // Comment /> `, output: unIndent` <> < // Comment /> `, errors: expectedErrors([4, 0, 4, "Punctuator"]) }, { code: unIndent` <> `, output: unIndent` <> `, errors: expectedErrors([4, 0, 4, "Punctuator"]) }, { code: unIndent` < /* Comment */ > `, output: unIndent` < /* Comment */ > `, errors: expectedErrors([2, 0, 4, "Punctuator"]) }, { code: unIndent` <> < /* Comment */ /> `, output: unIndent` <> < /* Comment */ /> `, errors: expectedErrors([4, 0, 4, "Punctuator"]) }, { code: unIndent` <> `, output: unIndent` <> `, errors: expectedErrors([4, 0, 4, "Punctuator"]) }, { code: unIndent` ({ foo }: bar) => baz `, output: unIndent` ({ foo }: bar) => baz `, parser: require.resolve("../../fixtures/parsers/babel-eslint7/object-pattern-with-annotation"), errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` ([ foo ]: bar) => baz `, output: unIndent` ([ foo ]: bar) => baz `, parser: require.resolve("../../fixtures/parsers/babel-eslint7/array-pattern-with-annotation"), errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` ({ foo }: {}) => baz `, output: unIndent` ({ foo }: {}) => baz `, parser: require.resolve("../../fixtures/parsers/babel-eslint7/object-pattern-with-object-annotation"), errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` class Foo { foo() { bar(); } } `, output: unIndent` class Foo { foo() { bar(); } } `, options: [4, { ignoredNodes: ["ClassBody"] }], errors: expectedErrors([3, 4, 0, "Identifier"]) }, { code: unIndent` $(function() { foo(); bar(); foo(function() { baz(); }); }); `, output: unIndent` $(function() { foo(); bar(); foo(function() { baz(); }); }); `, options: [4, { ignoredNodes: ["ExpressionStatement > CallExpression[callee.name='$'] > FunctionExpression > BlockStatement"] }], errors: expectedErrors([7, 4, 0, "Identifier"]) }, { code: unIndent` (function($) { $(function() { foo; }); })() `, output: unIndent` (function($) { $(function() { foo; }); })() `, options: [4, { ignoredNodes: ["ExpressionStatement > CallExpression > FunctionExpression.callee > BlockStatement"] }], errors: expectedErrors([3, 4, 0, "Identifier"]) }, { code: unIndent` if (foo) { doSomething(); // Intentionally unindented comment doSomethingElse(); } `, output: unIndent` if (foo) { doSomething(); // Intentionally unindented comment doSomethingElse(); } `, options: [4, { ignoreComments: false }], errors: expectedErrors([4, 4, 0, "Line"]) }, { code: unIndent` if (foo) { doSomething(); /* Intentionally unindented comment */ doSomethingElse(); } `, output: unIndent` if (foo) { doSomething(); /* Intentionally unindented comment */ doSomethingElse(); } `, options: [4, { ignoreComments: false }], errors: expectedErrors([4, 4, 0, "Block"]) }, { code: unIndent` const obj = { foo () { return condition ? // comment 1 : 2 } } `, output: unIndent` const obj = { foo () { return condition ? // comment 1 : 2 } } `, errors: expectedErrors([4, 12, 8, "Numeric"]) }, //---------------------------------------------------------------------- // Comment alignment tests //---------------------------------------------------------------------- { code: unIndent` if (foo) { // Comment cannot align with code immediately above if there is a whitespace gap doSomething(); } `, output: unIndent` if (foo) { // Comment cannot align with code immediately above if there is a whitespace gap doSomething(); } `, errors: expectedErrors([3, 4, 0, "Line"]) }, { code: unIndent` if (foo) { foo( bar); // Comment cannot align with code immediately below if there is a whitespace gap } `, output: unIndent` if (foo) { foo( bar); // Comment cannot align with code immediately below if there is a whitespace gap } `, errors: expectedErrors([4, 4, 0, "Line"]) }, { code: unIndent` [{ foo }, // Comment between nodes { bar }]; `, output: unIndent` [{ foo }, // Comment between nodes { bar }]; `, errors: expectedErrors([5, 0, 4, "Line"]) }, { code: unIndent` let foo // comment ;(async () => {})() `, output: unIndent` let foo // comment ;(async () => {})() `, errors: expectedErrors([3, 0, 4, "Line"]) }, { code: unIndent` let foo // comment ;(async () => {})() `, output: unIndent` let foo // comment ;(async () => {})() `, errors: expectedErrors([2, 0, 4, "Line"]) }, { code: unIndent` let foo /* comment */; (async () => {})() `, output: unIndent` let foo /* comment */; (async () => {})() `, errors: expectedErrors([3, 4, 0, "Block"]) }, { code: unIndent` // comment ;(async () => {})() `, output: unIndent` // comment ;(async () => {})() `, errors: expectedErrors([1, 0, 4, "Line"]) }, { code: unIndent` // comment ;(async () => {})() `, output: unIndent` // comment ;(async () => {})() `, errors: expectedErrors([1, 0, 4, "Line"]) }, { code: unIndent` { let foo // comment ;(async () => {})() } `, output: unIndent` { let foo // comment ;(async () => {})() } `, errors: expectedErrors([4, 4, 8, "Line"]) }, { code: unIndent` { let foo // comment ;(async () => {})() } `, output: unIndent` { let foo // comment ;(async () => {})() } `, errors: expectedErrors([3, 4, 8, "Line"]) }, { code: unIndent` { let foo /* comment */; (async () => {})() } `, output: unIndent` { let foo /* comment */; (async () => {})() } `, errors: expectedErrors([4, 8, 4, "Block"]) }, { code: unIndent` const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) `, output: unIndent` const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) `, errors: expectedErrors([4, 0, 4, "Block"]) }, { code: unIndent` const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) `, output: unIndent` const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) `, errors: expectedErrors([3, 0, 4, "Block"]) }, { code: unIndent` const foo = 1 const bar = foo /* comment */; [1, 2, 3].forEach(() => {}) `, output: unIndent` const foo = 1 const bar = foo /* comment */; [1, 2, 3].forEach(() => {}) `, errors: expectedErrors([4, 4, 0, "Block"]) }, { code: unIndent` /* comment */ ;[1, 2, 3].forEach(() => {}) `, output: unIndent` /* comment */ ;[1, 2, 3].forEach(() => {}) `, errors: expectedErrors([1, 0, 4, "Block"]) }, { code: unIndent` /* comment */ ;[1, 2, 3].forEach(() => {}) `, output: unIndent` /* comment */ ;[1, 2, 3].forEach(() => {}) `, errors: expectedErrors([1, 0, 4, "Block"]) }, { code: unIndent` { const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) } `, output: unIndent` { const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) } `, errors: expectedErrors([5, 4, 8, "Block"]) }, { code: unIndent` { const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) } `, output: unIndent` { const foo = 1 const bar = foo /* comment */ ;[1, 2, 3].forEach(() => {}) } `, errors: expectedErrors([4, 4, 8, "Block"]) }, { code: unIndent` { const foo = 1 const bar = foo /* comment */; [1, 2, 3].forEach(() => {}) } `, output: unIndent` { const foo = 1 const bar = foo /* comment */; [1, 2, 3].forEach(() => {}) } `, errors: expectedErrors([5, 8, 4, "Block"]) }, // import expressions { code: unIndent` import( source ) `, output: unIndent` import( source ) `, parserOptions: { ecmaVersion: 2020 }, errors: expectedErrors([ [2, 4, 0, "Identifier"], [3, 0, 4, "Punctuator"] ]) }, // https://github.com/eslint/eslint/issues/12122 { code: unIndent` foo(() => { tag\` multiline template\${a} \${b} literal \`(() => { bar(); }); }); `, output: unIndent` foo(() => { tag\` multiline template\${a} \${b} literal \`(() => { bar(); }); }); `, parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [7, 8, 4, "Identifier"] ]) }, { code: unIndent` { tag\` multiline template literal \${a} \${b}\`(() => { bar(); }); } `, output: unIndent` { tag\` multiline template literal \${a} \${b}\`(() => { bar(); }); } `, parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [2, 4, 8, "Identifier"], [7, 8, 12, "Identifier"], [8, 4, 8, "Punctuator"] ]) }, { code: unIndent` foo(() => { tagOne\`\${a} \${b} multiline template literal \`(() => { tagTwo\` multiline template literal \`(() => { bar(); }); baz(); }); }); `, output: unIndent` foo(() => { tagOne\`\${a} \${b} multiline template literal \`(() => { tagTwo\` multiline template literal \`(() => { bar(); }); baz(); }); }); `, parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [7, 8, 12, "Identifier"], [15, 8, 12, "Identifier"], [16, 4, 0, "Punctuator"] ]) }, { code: unIndent` { tagOne\` multiline template literal \${a} \${b}\`(() => { tagTwo\` multiline template literal \`(() => { bar(); }); baz(); }); } `, output: unIndent` { tagOne\` multiline template literal \${a} \${b}\`(() => { tagTwo\` multiline template literal \`(() => { bar(); }); baz(); }); } `, parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [7, 8, 12, "Identifier"], [15, 8, 12, "Identifier"], [16, 4, 0, "Punctuator"] ]) }, { code: unIndent` tagOne\`multiline \${a} \${b} template literal \`(() => { foo(); tagTwo\`multiline template literal \`({ bar: 1, baz: 2 }); }); `, output: unIndent` tagOne\`multiline \${a} \${b} template literal \`(() => { foo(); tagTwo\`multiline template literal \`({ bar: 1, baz: 2 }); }); `, parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [5, 4, 0, "Identifier"], [11, 8, 4, "Identifier"] ]) }, { code: unIndent` tagOne\`multiline template \${a} \${b} literal\`({ foo: 1, bar: tagTwo\`multiline template literal\`(() => { baz(); }) }); `, output: unIndent` tagOne\`multiline template \${a} \${b} literal\`({ foo: 1, bar: tagTwo\`multiline template literal\`(() => { baz(); }) }); `, parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [4, 4, 8, "Identifier"], [5, 4, 0, "Identifier"], [9, 8, 0, "Identifier"] ]) }, { code: unIndent` foo.bar\` template literal \`(() => { baz(); }) `, output: unIndent` foo.bar\` template literal \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [2, 4, 8, "Identifier"] ]) }, { code: unIndent` foo.bar.baz\` template literal \`(() => { baz(); }) `, output: unIndent` foo.bar.baz\` template literal \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [2, 4, 0, "Identifier"], [3, 0, 4, "Punctuator"] ]) }, { code: unIndent` foo .bar\` template literal \`(() => { baz(); }) `, output: unIndent` foo .bar\` template literal \`(() => { baz(); }) `, parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [5, 4, 0, "Punctuator"] ]) }, { code: unIndent` foo .test\` \${a} \${b} \`(() => { bar(); }) `, output: unIndent` foo .test\` \${a} \${b} \`(() => { bar(); }) `, parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [5, 8, 0, "Identifier"] ]) }, { code: unIndent` foo .test\` \${a} \${b} \`(() => { bar(); }) `, output: unIndent` foo .test\` \${a} \${b} \`(() => { bar(); }) `, options: [4, { MemberExpression: 0 }], parserOptions: { ecmaVersion: 2015 }, errors: expectedErrors([ [2, 0, 4, "Punctuator"], [5, 4, 0, "Identifier"], [6, 0, 4, "Punctuator"] ]) }, // Optional chaining { code: unIndent` obj ?.prop ?.[key] ?. [key] `, output: unIndent` obj ?.prop ?.[key] ?. [key] `, options: [4], parserOptions: { ecmaVersion: 2020 }, errors: expectedErrors([ [2, 4, 0, "Punctuator"], [3, 4, 0, "Punctuator"], [4, 4, 0, "Punctuator"], [5, 8, 0, "Punctuator"] ]) }, { code: unIndent` ( longSomething ?.prop ?.[key] ) ?.prop ?.[key] `, output: unIndent` ( longSomething ?.prop ?.[key] ) ?.prop ?.[key] `, options: [4], parserOptions: { ecmaVersion: 2020 }, errors: expectedErrors([ [6, 4, 0, "Punctuator"], [7, 4, 0, "Punctuator"] ]) }, { code: unIndent` obj ?.(arg) ?. (arg) `, output: unIndent` obj ?.(arg) ?. (arg) `, options: [4], parserOptions: { ecmaVersion: 2020 }, errors: expectedErrors([ [2, 4, 0, "Punctuator"], [3, 4, 0, "Punctuator"], [4, 4, 0, "Punctuator"] ]) }, { code: unIndent` ( longSomething ?.(arg) ?.(arg) ) ?.(arg) ?.(arg) `, output: unIndent` ( longSomething ?.(arg) ?.(arg) ) ?.(arg) ?.(arg) `, options: [4], parserOptions: { ecmaVersion: 2020 }, errors: expectedErrors([ [6, 4, 0, "Punctuator"], [7, 4, 0, "Punctuator"] ]) }, { code: unIndent` const foo = async (arg1, arg2) => { return arg1 + arg2; } `, output: unIndent` const foo = async (arg1, arg2) => { return arg1 + arg2; } `, options: [2, { FunctionDeclaration: { parameters: "first" }, FunctionExpression: { parameters: "first" } }], parserOptions: { ecmaVersion: 2020 }, errors: expectedErrors([ [2, 19, 20, "Identifier"] ]) }, { code: unIndent` const a = async b => {} `, output: unIndent` const a = async b => {} `, options: [2], errors: expectedErrors([ [2, 0, 1, "Identifier"] ]) }, { code: unIndent` class C { field1; static field2; } `, output: unIndent` class C { field1; static field2; } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Identifier"], [3, 4, 0, "Keyword"] ]) }, { code: unIndent` class C { field1 = 0 ; static field2 = 0 ; } `, output: unIndent` class C { field1 = 0 ; static field2 = 0 ; } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Identifier"], [3, 8, 0, "Punctuator"], [4, 12, 0, "Numeric"], [5, 12, 0, "Punctuator"], [6, 4, 0, "Keyword"], [7, 8, 0, "Identifier"], [8, 12, 0, "Punctuator"], [9, 16, 0, "Numeric"], [10, 16, 0, "Punctuator"] ]) }, { code: unIndent` class C { [ field1 ] = 0 ; static [ field2 ] = 0 ; [ field3 ] = 0; [field4] = 0; } `, output: unIndent` class C { [ field1 ] = 0 ; static [ field2 ] = 0 ; [ field3 ] = 0; [field4] = 0; } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Punctuator"], [3, 8, 0, "Identifier"], [4, 4, 0, "Punctuator"], [5, 8, 0, "Punctuator"], [6, 12, 0, "Numeric"], [7, 12, 0, "Punctuator"], [8, 4, 0, "Keyword"], [9, 4, 0, "Punctuator"], [10, 8, 0, "Identifier"], [11, 4, 0, "Punctuator"], [12, 8, 0, "Punctuator"], [13, 12, 0, "Numeric"], [14, 12, 0, "Punctuator"], [15, 4, 0, "Punctuator"], [16, 8, 0, "Identifier"], [17, 4, 0, "Punctuator"], [18, 8, 0, "Numeric"], [19, 4, 0, "Punctuator"], [20, 8, 0, "Numeric"] ]) }, { code: unIndent` class C { field1 = ( foo + bar ); } `, output: unIndent` class C { field1 = ( foo + bar ); } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Identifier"], [3, 8, 0, "Identifier"], [5, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { #aaa foo() { return this.#aaa } } `, output: unIndent` class C { #aaa foo() { return this.#aaa } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "PrivateIdentifier"], [3, 4, 0, "Identifier"], [4, 8, 0, "Keyword"], [5, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { foo(); bar(); } } `, output: unIndent` class C { static { foo(); bar(); } } `, options: [2], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 2, 0, "Keyword"], [3, 4, 0, "Identifier"], [4, 4, 0, "Identifier"], [5, 2, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { foo(); bar(); } } `, output: unIndent` class C { static { foo(); bar(); } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Keyword"], [3, 8, 0, "Identifier"], [4, 8, 0, "Identifier"], [5, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { foo(); bar(); } } `, output: unIndent` class C { static { foo(); bar(); } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 8, "Keyword"], [3, 8, 4, "Identifier"], [4, 8, 0, "Identifier"], [5, 4, 8, "Punctuator"] ]) }, { code: unIndent` class C { static { foo(); bar(); } } `, output: unIndent` class C { static { foo(); bar(); } } `, options: [4, { StaticBlock: { body: 2 } }], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Keyword"], [3, 12, 0, "Identifier"], [4, 12, 0, "Identifier"], [5, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { foo(); bar(); } } `, output: unIndent` class C { static { foo(); bar(); } } `, options: [4, { StaticBlock: { body: 0 } }], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Keyword"], [3, 4, 0, "Identifier"], [4, 4, 0, "Identifier"], [5, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { foo(); bar(); } } `, output: unIndent` class C { \tstatic { \t\tfoo(); \t\tbar(); \t} } `, options: ["tab"], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors("tab", [ [2, 1, 0, "Keyword"], [3, 2, 0, "Identifier"], [4, 2, 0, "Identifier"], [5, 1, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { foo(); bar(); } } `, output: unIndent` class C { \tstatic { \t\t\tfoo(); \t\t\tbar(); \t} } `, options: ["tab", { StaticBlock: { body: 2 } }], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors("tab", [ [2, 1, 0, "Keyword"], [3, 3, 0, "Identifier"], [4, 3, 0, "Identifier"], [5, 1, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { foo(); bar(); } } `, output: unIndent` class C { static { foo(); bar(); } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Keyword"], [3, 4, 0, "Punctuator"], [4, 8, 0, "Identifier"], [5, 8, 0, "Identifier"], [6, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { foo(); bar(); } } `, output: unIndent` class C { static { foo(); bar(); } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [3, 4, 8, "Punctuator"], [6, 4, 8, "Punctuator"] ]) }, { code: unIndent` class C { static { var x, y; } } `, output: unIndent` class C { static { var x, y; } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Keyword"], [3, 8, 0, "Keyword"], [4, 12, 0, "Identifier"], [5, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { var x, y; } } `, output: unIndent` class C { static { var x, y; } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Keyword"], [3, 4, 0, "Punctuator"], [4, 8, 0, "Keyword"], [5, 12, 0, "Identifier"], [6, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { if (foo) { bar; } } } `, output: unIndent` class C { static { if (foo) { bar; } } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Keyword"], [3, 8, 0, "Keyword"], [4, 12, 0, "Identifier"], [5, 8, 0, "Punctuator"], [6, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { { bar; } } } `, output: unIndent` class C { static { { bar; } } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Keyword"], [3, 8, 0, "Punctuator"], [4, 12, 0, "Identifier"], [5, 8, 0, "Punctuator"], [6, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { static {} static { } static { } } `, output: unIndent` class C { static {} static { } static { } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Keyword"], [4, 4, 0, "Keyword"], [5, 4, 0, "Punctuator"], [7, 4, 0, "Keyword"], [8, 4, 0, "Punctuator"], [9, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { static { foo; } static { bar; } } `, output: unIndent` class C { static { foo; } static { bar; } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [3, 4, 0, "Keyword"], [4, 8, 4, "Identifier"], [5, 4, 0, "Punctuator"], [7, 4, 0, "Keyword"], [8, 8, 4, "Identifier"], [9, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { x = 1; static { foo; } y = 2; } `, output: unIndent` class C { x = 1; static { foo; } y = 2; } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [3, 4, 0, "Identifier"], [5, 4, 0, "Keyword"], [6, 8, 4, "Identifier"], [7, 4, 0, "Punctuator"], [9, 4, 0, "Identifier"] ]) }, { code: unIndent` class C { method1(param) { foo; } static { bar; } method2(param) { foo; } } `, output: unIndent` class C { method1(param) { foo; } static { bar; } method2(param) { foo; } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [3, 4, 0, "Identifier"], [4, 8, 4, "Identifier"], [5, 4, 0, "Punctuator"], [7, 4, 0, "Keyword"], [8, 8, 4, "Identifier"], [9, 4, 0, "Punctuator"], [11, 4, 0, "Identifier"], [12, 8, 4, "Identifier"], [13, 4, 0, "Punctuator"] ]) }, { code: unIndent` function f() { class C { static { foo(); bar(); } } } `, output: unIndent` function f() { class C { static { foo(); bar(); } } } `, options: [4], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Keyword"], [3, 8, 0, "Keyword"], [4, 12, 0, "Identifier"], [5, 12, 0, "Identifier"], [6, 8, 0, "Punctuator"], [7, 4, 0, "Punctuator"] ]) }, { code: unIndent` class C { method() { foo; } static { bar; } } `, output: unIndent` class C { method() { foo; } static { bar; } } `, options: [4, { FunctionExpression: { body: 2 }, StaticBlock: { body: 2 } }], parserOptions: { ecmaVersion: 2022 }, errors: expectedErrors([ [2, 4, 0, "Identifier"], [3, 12, 0, "Identifier"], [4, 4, 0, "Punctuator"], [5, 4, 0, "Keyword"], [6, 12, 0, "Identifier"], [7, 4, 0, "Punctuator"] ]) }, // https://github.com/eslint/eslint/issues/15930 { code: unIndent` if (2 > 1) \tconsole.log('a') \t;[1, 2, 3].forEach(x=>console.log(x)) `, output: unIndent` if (2 > 1) \tconsole.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: ["tab"], errors: expectedErrors("tab", [3, 0, 1, "Punctuator"]) }, { code: unIndent` if (2 > 1) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, output: unIndent` if (2 > 1) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` if (foo) bar(); baz() `, output: unIndent` if (foo) bar(); baz() `, options: [4], errors: expectedErrors([2, 0, 4, "Identifier"]) }, { code: unIndent` if (foo) bar() ;baz() `, output: unIndent` if (foo) bar() ;baz() `, options: [4], errors: expectedErrors([2, 0, 4, "Punctuator"]) }, { code: unIndent` if (foo) bar(); baz(); `, output: unIndent` if (foo) bar(); baz(); `, options: [4], errors: expectedErrors([3, 0, 4, "Identifier"]) }, { code: unIndent` if (foo) bar() ; baz() `, output: unIndent` if (foo) bar() ; baz() `, options: [4], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` if (foo) bar() ;baz() qux() `, output: unIndent` if (foo) bar() ;baz() qux() `, options: [4], errors: expectedErrors([ [3, 0, 4, "Punctuator"], [4, 0, 4, "Identifier"] ]) }, { code: unIndent` if (foo) bar() ;else baz() `, output: unIndent` if (foo) bar() ;else baz() `, options: [4], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` if (foo) bar() else baz() ;qux() `, output: unIndent` if (foo) bar() else baz() ;qux() `, options: [4], errors: expectedErrors([5, 0, 4, "Punctuator"]) }, { code: unIndent` if (foo) if (bar) baz() ;qux() `, output: unIndent` if (foo) if (bar) baz() ;qux() `, options: [4], errors: expectedErrors([4, 0, 4, "Punctuator"]) }, { code: unIndent` if (foo) bar() else if (baz) qux() ;quux() `, output: unIndent` if (foo) bar() else if (baz) qux() ;quux() `, options: [4], errors: expectedErrors([5, 0, 4, "Punctuator"]) }, { code: unIndent` if (foo) if (bar) baz() else qux() ;quux() `, output: unIndent` if (foo) if (bar) baz() else qux() ;quux() `, options: [4], errors: expectedErrors([6, 0, 4, "Punctuator"]) }, { code: unIndent` if (foo) bar() ; baz() `, output: unIndent` if (foo) bar() ; baz() `, options: [4], errors: expectedErrors([3, 4, 0, "Punctuator"]) }, { code: unIndent` if (foo) ; baz() `, output: unIndent` if (foo) ; baz() `, options: [4], errors: expectedErrors([2, 4, 0, "Punctuator"]) }, { code: unIndent` if (foo) ;baz() `, output: unIndent` if (foo) ;baz() `, options: [4], errors: expectedErrors([2, 0, 4, "Punctuator"]) }, { code: unIndent` if (foo); else baz() `, output: unIndent` if (foo); else baz() `, options: [4], errors: expectedErrors([2, 0, 4, "Keyword"]) }, { code: unIndent` if (foo) ; else baz() `, output: unIndent` if (foo) ; else baz() `, options: [4], errors: expectedErrors([2, 4, 0, "Punctuator"]) }, { code: unIndent` if (foo) ;else baz() `, output: unIndent` if (foo) ;else baz() `, options: [4], errors: expectedErrors([2, 0, 4, "Punctuator"]) }, { code: unIndent` do foo(); while (bar) `, output: unIndent` do foo(); while (bar) `, options: [4], errors: expectedErrors([2, 0, 4, "Keyword"]) }, { code: unIndent` do foo() ;while (bar) `, output: unIndent` do foo() ;while (bar) `, options: [4], errors: expectedErrors([2, 0, 4, "Punctuator"]) }, { code: unIndent` do foo(); while (bar) `, output: unIndent` do foo(); while (bar) `, options: [4], errors: expectedErrors([3, 0, 4, "Keyword"]) }, { code: unIndent` do foo() ;while (bar) `, output: unIndent` do foo() ;while (bar) `, options: [4], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` do; while (foo) `, output: unIndent` do; while (foo) `, options: [4], errors: expectedErrors([2, 0, 4, "Keyword"]) }, { code: unIndent` do ; while (foo) `, output: unIndent` do ; while (foo) `, options: [4], errors: expectedErrors([2, 4, 0, "Punctuator"]) }, { code: unIndent` do ;while (foo) `, output: unIndent` do ;while (foo) `, options: [4], errors: expectedErrors([2, 0, 4, "Punctuator"]) }, { code: unIndent` while (2 > 1) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, output: unIndent` while (2 > 1) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` for (;;) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, output: unIndent` for (;;) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` for (a in b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, output: unIndent` for (a in b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` for (a of b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, output: unIndent` for (a of b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` with (a) console.log(b) ;[1, 2, 3].forEach(x=>console.log(x)) `, output: unIndent` with (a) console.log(b) ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` label: for (a of b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, output: unIndent` label: for (a of b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4], errors: expectedErrors([3, 0, 4, "Punctuator"]) }, { code: unIndent` label: for (a of b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, output: unIndent` label: for (a of b) console.log('a') ;[1, 2, 3].forEach(x=>console.log(x)) `, options: [4], errors: expectedErrors([4, 0, 4, "Punctuator"]) } ] });