From 510df22259e0274b1350a36cad325f86e71e75df Mon Sep 17 00:00:00 2001 From: coderaiser Date: Wed, 1 May 2024 20:28:13 +0300 Subject: [PATCH] feature: @putout/printer: ArrayExpression: [boolean, object] --- .github/workflows/nodejs.yml | 2 +- README.md | 2 +- .../expressions/array-expression/newline.js | 4 ++++ .../fixture/object-inside-array-with-boolean.js | 14 ++++++++++++++ .../object-expression/object-expression.js | 5 +++-- .../object-expression/object-expression.spec.js | 5 +++++ .../expressions/object-pattern/object-pattern.js | 1 + test/fixture.js | 4 ++-- test/print-extension/print-extension.js | 1 - 9 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 lib/tokenize/expressions/object-expression/fixture/object-inside-array-with-boolean.js diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index b0140ae3..cfcf5ceb 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -12,7 +12,7 @@ jobs: node-version: - 18.x - 20.x - - 21.x + - 22.x steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 diff --git a/README.md b/README.md index 9f1ac408..a8490c40 100644 --- a/README.md +++ b/README.md @@ -296,7 +296,7 @@ This is the same as `print('__left')` but more low-level, and supports only obje About speed, for file `speed.js`: ```js -const {readFileSync} = require('fs'); +const {readFileSync} = require('node:fs'); const putout = require('putout'); const parser = require('@babel/parser'); diff --git a/lib/tokenize/expressions/array-expression/newline.js b/lib/tokenize/expressions/array-expression/newline.js index afb3196b..e9d3c674 100644 --- a/lib/tokenize/expressions/array-expression/newline.js +++ b/lib/tokenize/expressions/array-expression/newline.js @@ -43,6 +43,7 @@ const isSimpleAndCall = ([a, b]) => { }; const isBooleanAndSimple = ([a, b]) => isBooleanLiteral(a) && isSimple(b); +const isBooleanAndObject = ([a, b]) => isBooleanLiteral(a) && isObjectExpression(b); const isNullAndSimple = ([a, b]) => isNullLiteral(a) && isSimple(b); const isSimpleAndObject = ([a, b]) => isSimple(a) && isObjectExpression(b); const ONE_LINE = false; @@ -258,6 +259,9 @@ function isIncreaseIndent(path) { if (!elements.length) return false; + if (isBooleanAndObject(elements)) + return true; + if (isInsideCallLoop(path)) return false; diff --git a/lib/tokenize/expressions/object-expression/fixture/object-inside-array-with-boolean.js b/lib/tokenize/expressions/object-expression/fixture/object-inside-array-with-boolean.js new file mode 100644 index 00000000..f333989c --- /dev/null +++ b/lib/tokenize/expressions/object-expression/fixture/object-inside-array-with-boolean.js @@ -0,0 +1,14 @@ +const places = putout.findPlaces(ast, fixture.comment, { + rules: { + 'find/push': [true, { + ignore: true, + }], + }, +}); + +const bools = [ + true, + true, + false, + false, +]; \ No newline at end of file diff --git a/lib/tokenize/expressions/object-expression/object-expression.js b/lib/tokenize/expressions/object-expression/object-expression.js index c3dd19b3..fa43b4e9 100644 --- a/lib/tokenize/expressions/object-expression/object-expression.js +++ b/lib/tokenize/expressions/object-expression/object-expression.js @@ -53,7 +53,8 @@ module.exports.ObjectExpression = (path, printer, semantics) => { const n = properties.length - 1; - maybe.indent.inc(isMemberExpressionCallee(path)); + const memberCallee = isMemberExpressionCallee(path); + maybe.indent.inc(memberCallee); for (const [index, property] of properties.entries()) { if (property.isSpreadElement()) { @@ -94,7 +95,7 @@ module.exports.ObjectExpression = (path, printer, semantics) => { print('}'); maybe.print(parens, ')'); - maybe.indent.dec(isMemberExpressionCallee(path)); + maybe.indent.dec(memberCallee); }; const hasNextLeadingComment = (path) => { diff --git a/lib/tokenize/expressions/object-expression/object-expression.spec.js b/lib/tokenize/expressions/object-expression/object-expression.spec.js index e380a0a3..ecb07b5e 100644 --- a/lib/tokenize/expressions/object-expression/object-expression.spec.js +++ b/lib/tokenize/expressions/object-expression/object-expression.spec.js @@ -100,6 +100,11 @@ test('printer: tokenizer: object-expression: nested call', (t) => { t.end(); }); +test('printer: tokenizer: object-expression: inside array: with boolean', (t) => { + t.print(fixture.objectInsideArrayWithBoolean); + t.end(); +}); + test('printer: tokenizer: object-expression: no-trailing-comma', (t) => { t.print(fixture.objectExpressionNoTrailingComma, { semantics: { diff --git a/lib/tokenize/expressions/object-pattern/object-pattern.js b/lib/tokenize/expressions/object-pattern/object-pattern.js index b6d6d036..d166ebf8 100644 --- a/lib/tokenize/expressions/object-pattern/object-pattern.js +++ b/lib/tokenize/expressions/object-pattern/object-pattern.js @@ -168,6 +168,7 @@ function shouldAddNewline(path, semantics) { const moreLength = moreThenMaxPropertiesLengthInOneLine(path, { maxPropertiesLengthInOneLine, }); + const moreCount = moreThenMaxPropertiesInOneLine(path, { maxPropertiesInOneLine, }); diff --git a/test/fixture.js b/test/fixture.js index 4061b568..f7f00d21 100644 --- a/test/fixture.js +++ b/test/fixture.js @@ -1,7 +1,7 @@ 'use strict'; -const {join} = require('path'); -const {readFileSync} = require('fs'); +const {join} = require('node:path'); +const {readFileSync} = require('node:fs'); const tryCatch = require('try-catch'); const kebabCase = require('just-kebab-case'); diff --git a/test/print-extension/print-extension.js b/test/print-extension/print-extension.js index 86480188..2cdca9b8 100644 --- a/test/print-extension/print-extension.js +++ b/test/print-extension/print-extension.js @@ -25,6 +25,5 @@ module.exports.printExtension = ({fail, equal}) => (fixture, options) => { const expected = `${fixture}\n`; - debugger; return equal(source, expected); };