From 9d730e9ab53b65ca1dbe9585d05b5b30149d9a73 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 12 Jun 2023 19:06:51 +0300 Subject: [PATCH] feature: @putout/printer: ArrayExpression: maxElementsInOneLine --- README.md | 5 +---- .../array-expression/array-expression.js | 10 +++++----- .../array-expression/array-expression.spec.js | 13 +++++++++++++ ...array-expression-max-elements-in-one-line-fix.js | 4 ++++ .../array-expression-max-elements-in-one-line.js | 1 + 5 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 lib/tokenize/expressions/array-expression/fixture/array-expression-max-elements-in-one-line-fix.js create mode 100644 lib/tokenize/expressions/array-expression/fixture/array-expression-max-elements-in-one-line.js diff --git a/README.md b/README.md index a64bfdf3..98b798e3 100644 --- a/README.md +++ b/README.md @@ -158,10 +158,7 @@ if(a>3)console.log('ok');else console.log('not ok'); Options used to configure logic of output, similar to ESLint rules: -```js - - -``` +- `maxElementsInOneLine` - count of `ArrayExpression` and `ArrayPattern` elements placed in one line. ### `write` diff --git a/lib/tokenize/expressions/array-expression/array-expression.js b/lib/tokenize/expressions/array-expression/array-expression.js index 6493ff1f..c7b29704 100644 --- a/lib/tokenize/expressions/array-expression/array-expression.js +++ b/lib/tokenize/expressions/array-expression/array-expression.js @@ -23,8 +23,6 @@ const { isStringAndMember, } = require('../../is'); -const MAX_ARRAY_ELEMENTS_WHEN_USED_AS_ARGUMENT = 4; - const isForOf = ({parentPath}) => parentPath.isForOfStatement(); const isInsideOneElementArray = ({parentPath}) => parentPath.node.elements.length === 1; @@ -112,7 +110,8 @@ module.exports.ArrayExpression = { before(path, {print}) { print.breakline(); }, - print(path, {print, maybe, indent}) { + print(path, {print, maybe, indent}, semantics) { + const {maxElementsInOneLine} = semantics; const elements = path.get('elements'); const shouldIncreaseIndent = !isIncreaseIndent(path); @@ -123,6 +122,7 @@ module.exports.ArrayExpression = { const isNewLine = isNewlineBetweenElements(path, { elements, + maxElementsInOneLine, }); const n = elements.length - 1; @@ -256,7 +256,7 @@ function isOneSimple(path) { return first.isMemberExpression(); } -function isNewlineBetweenElements(path, {elements}) { +function isNewlineBetweenElements(path, {elements, maxElementsInOneLine}) { if (elements.length > 3 && !isObjectExpression(elements[0])) return true; @@ -287,7 +287,7 @@ function isNewlineBetweenElements(path, {elements}) { if (isSimpleAndCall(elements)) return false; - if (isShortTwoSimplesInsideCall(path, MAX_ARRAY_ELEMENTS_WHEN_USED_AS_ARGUMENT)) + if (isShortTwoSimplesInsideCall(path, maxElementsInOneLine)) return false; if (isTwoStringsDifferentLength(elements)) diff --git a/lib/tokenize/expressions/array-expression/array-expression.spec.js b/lib/tokenize/expressions/array-expression/array-expression.spec.js index 9bcd1290..fbaa2306 100644 --- a/lib/tokenize/expressions/array-expression/array-expression.spec.js +++ b/lib/tokenize/expressions/array-expression/array-expression.spec.js @@ -95,3 +95,16 @@ test('printer: tokenizer: statement: ArrayExpression: space', (t) => { t.equal(result, fixture.arrayExpressionSpaceFix); t.end(); }); + +test('printer: tokenizer: statement: ArrayExpression: maxElementsInOneLine', (t) => { + const ast = parse(fixture.arrayExpressionMaxElementsInOneLine); + + const result = print(ast, { + semantics: { + maxElementsInOneLine: 1, + }, + }); + + t.equal(result, fixture.arrayExpressionMaxElementsInOneLineFix); + t.end(); +}); diff --git a/lib/tokenize/expressions/array-expression/fixture/array-expression-max-elements-in-one-line-fix.js b/lib/tokenize/expressions/array-expression/fixture/array-expression-max-elements-in-one-line-fix.js new file mode 100644 index 00000000..131199da --- /dev/null +++ b/lib/tokenize/expressions/array-expression/fixture/array-expression-max-elements-in-one-line-fix.js @@ -0,0 +1,4 @@ +fn([ + 'hello', + 'world', +]); diff --git a/lib/tokenize/expressions/array-expression/fixture/array-expression-max-elements-in-one-line.js b/lib/tokenize/expressions/array-expression/fixture/array-expression-max-elements-in-one-line.js new file mode 100644 index 00000000..88e15fe6 --- /dev/null +++ b/lib/tokenize/expressions/array-expression/fixture/array-expression-max-elements-in-one-line.js @@ -0,0 +1 @@ +fn(['hello', 'world']) \ No newline at end of file