From d2f6d9b6fa6874fca2b061ac53c87923a46f9f31 Mon Sep 17 00:00:00 2001 From: angelica-bocanegra <58057927+angelica-bocanegra@users.noreply.github.com> Date: Fri, 23 Apr 2021 23:53:33 +1000 Subject: [PATCH] fix: object-type-curly-spacing should not trim multi-line expressions (#481) Co-authored-by: Angelica Bocanegra --- README.md | 17 +++++- src/rules/objectTypeCurlySpacing.js | 57 ++++++++++--------- .../assertions/objectTypeCurlySpacing.js | 11 +++- 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 7ad3d6f..ae748d3 100644 --- a/README.md +++ b/README.md @@ -2620,6 +2620,10 @@ type obj = {|"foo": "bar" |} type obj = {"foo": "bar", [key: string]: string } // Message: There should be no space before "}". +type obj = { +"foo": "bar", [key: string]: string } +// Message: There should be no space before "}". + type obj = { baz: {"foo": "qux"}, bar: 4} // Message: There should be no space after "{". @@ -2671,7 +2675,18 @@ type obj = { foo: "bar"} type obj = { -foo: "bar"} +foo: "bar" +} + +type obj = { +foo: "bar", +ee: "bar", +} + +type obj = { +foo: "bar", +ee: "bar", + } type obj = {|"foo": "bar"|} diff --git a/src/rules/objectTypeCurlySpacing.js b/src/rules/objectTypeCurlySpacing.js index 76520f5..0c44a16 100644 --- a/src/rules/objectTypeCurlySpacing.js +++ b/src/rules/objectTypeCurlySpacing.js @@ -11,6 +11,10 @@ const meta = { fixable: 'code', }; +const sameLine = (left, right) => { + return left.loc.end.line === right.loc.start.line; +}; + const create = (context) => { const never = (context?.options[0] ?? 'never') === 'never'; const sourceCode = context.getSourceCode(); @@ -31,33 +35,18 @@ const create = (context) => { const spacesBefore = firstInnerToken.range[0] - opener.range[1]; const spacesAfter = closer.range[0] - lastInnerToken.range[1]; - if (never) { - if (spacesBefore) { - if (sourceCode.text[opener?.range[1]] !== '\n') { - context.report({ - data: { - token: opener.value, - }, - fix: spacingFixers.stripSpacesAfter(opener, spacesBefore), - message: 'There should be no space after "{{token}}".', - node, - }); - } - } - if (spacesAfter) { - if (sourceCode.text[closer?.range[0] - 1] !== '\n') { - context.report({ - data: { - token: closer.value, - }, - fix: spacingFixers.stripSpacesBefore(closer, spacesAfter), - message: 'There should be no space before "{{token}}".', - node, - }); - } - } - } else { - if (!spacesBefore) { + // Check the opening brace + if (sameLine(opener, firstInnerToken)) { + if (never && spacesBefore) { + context.report({ + data: { + token: opener.value, + }, + fix: spacingFixers.stripSpacesAfter(opener, spacesBefore), + message: 'There should be no space after "{{token}}".', + node, + }); + } else if (!never && !spacesBefore) { context.report({ data: { token: opener.value, @@ -67,8 +56,20 @@ const create = (context) => { node, }); } + } - if (!spacesAfter) { + // Check the closing brace + if (sameLine(lastInnerToken, closer)) { + if (never && spacesAfter) { + context.report({ + data: { + token: closer.value, + }, + fix: spacingFixers.stripSpacesBefore(closer, spacesAfter), + message: 'There should be no space before "{{token}}".', + node, + }); + } else if (!never && !spacesAfter) { context.report({ data: { token: closer.value, diff --git a/tests/rules/assertions/objectTypeCurlySpacing.js b/tests/rules/assertions/objectTypeCurlySpacing.js index c3fdeab..aa2b523 100644 --- a/tests/rules/assertions/objectTypeCurlySpacing.js +++ b/tests/rules/assertions/objectTypeCurlySpacing.js @@ -37,6 +37,13 @@ export default { ], output: 'type obj = {"foo": "bar", [key: string]: string}', }, + { + code: 'type obj = {\n"foo": "bar", [key: string]: string }', + errors: [ + {message: 'There should be no space before "}".'}, + ], + output: 'type obj = {\n"foo": "bar", [key: string]: string}', + }, { code: 'type obj = { baz: {"foo": "qux"}, bar: 4}', errors: [ @@ -144,7 +151,9 @@ export default { {code: 'type obj = {foo: "bar"}'}, {code: 'type obj = {foo: "bar"\n}'}, {code: 'type obj = {\nfoo: "bar"}'}, - {code: 'type obj = {\nfoo: "bar"}'}, + {code: 'type obj = {\nfoo: "bar"\n}'}, + {code: 'type obj = {\nfoo: "bar",\nee: "bar",\n}'}, + {code: 'type obj = {\nfoo: "bar",\nee: "bar",\n }'}, {code: 'type obj = {|"foo": "bar"|}'}, {code: 'type obj = {"foo": "bar", [key: string]: string}'},