From ca1bba1932d7b38f4a10bac723320b1df5a54120 Mon Sep 17 00:00:00 2001 From: Maciej Krajowski-Kukiel Date: Fri, 20 Mar 2026 11:36:24 +0100 Subject: [PATCH] preserve pipe for graphql and function --- .../src/printer/print/liquid.ts | 8 ++---- .../src/printer/printer-liquid-html.ts | 13 ++++++++++ .../src/test/liquid-tag-function/fixed.liquid | 17 +++++++++++++ .../src/test/liquid-tag-function/index.liquid | 10 ++++++++ .../src/test/liquid-tag-graphql/fixed.liquid | 25 +++++++++++++++++++ .../src/test/liquid-tag-graphql/index.liquid | 18 +++++++++++++ .../src/test/liquid-tag-graphql/index.spec.ts | 6 +++++ 7 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/fixed.liquid create mode 100644 packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/index.liquid create mode 100644 packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/index.spec.ts diff --git a/packages/prettier-plugin-liquid/src/printer/print/liquid.ts b/packages/prettier-plugin-liquid/src/printer/print/liquid.ts index d0da267..37846fb 100644 --- a/packages/prettier-plugin-liquid/src/printer/print/liquid.ts +++ b/packages/prettier-plugin-liquid/src/printer/print/liquid.ts @@ -196,14 +196,10 @@ function printNamedLiquidBlockStart( return tag(trailingWhitespace); } - case NamedTags.function: { - const markup = node.markup; - const trailingWhitespace = markup.args.length > 0 ? line : ' '; - return tag(trailingWhitespace); - } + case NamedTags.function: case NamedTags.graphql: { const markup = node.markup; - const trailingWhitespace = markup.args.length > 0 ? line : ' '; + const trailingWhitespace = markup.args.length > 0 || markup.filters.length > 0 ? line : ' '; return tag(trailingWhitespace); } diff --git a/packages/prettier-plugin-liquid/src/printer/printer-liquid-html.ts b/packages/prettier-plugin-liquid/src/printer/printer-liquid-html.ts index 7cc74b7..aac1f82 100644 --- a/packages/prettier-plugin-liquid/src/printer/printer-liquid-html.ts +++ b/packages/prettier-plugin-liquid/src/printer/printer-liquid-html.ts @@ -439,6 +439,7 @@ function printNode( ), ); } + if (node.filters.length > 0) appendFilters(doc as Doc[], path, print); return doc; } @@ -455,6 +456,7 @@ function printNode( ), ); } + if (node.filters.length > 0) appendFilters(doc as Doc[], path, print); return doc; } @@ -470,6 +472,7 @@ function printNode( ), ); } + if (node.filters.length > 0) appendFilters(doc as Doc[], path, print); return doc; } @@ -838,6 +841,16 @@ export const printerLiquidHtml3: Printer3 & { }, }; +function appendFilters(doc: Doc[], path: LiquidAstPath, print: (path: LiquidAstPath) => Doc) { + doc.push( + line, + join( + line, + path.map((p) => print(p as LiquidAstPath), 'filters'), + ), + ); +} + function hasOrIsNode(node: N, key: K) { const v = node[key]; // this works because there's no ()[] type that is string | Node, it only diff --git a/packages/prettier-plugin-liquid/src/test/liquid-tag-function/fixed.liquid b/packages/prettier-plugin-liquid/src/test/liquid-tag-function/fixed.liquid index 6743e82..a23afa5 100644 --- a/packages/prettier-plugin-liquid/src/test/liquid-tag-function/fixed.liquid +++ b/packages/prettier-plugin-liquid/src/test/liquid-tag-function/fixed.liquid @@ -28,3 +28,20 @@ It should format dot-access result variable It should format variable partial {% function res = partial_name %} + +It should preserve filters on function tag result (file-based) +{% function res = 'modules/core/api_calls/send', + data: object, + template: 'modules/openai/responses' + | dig: 'results' +%} + +It should preserve filters on function tag with no args +{% function res = 'modules/core/api_calls/send' | dig: 'results' %} + +It should break on long lines with filters +printWidth: 1 +{% function res = 'modules/core/api_calls/send', + data: object + | dig: 'results' +%} diff --git a/packages/prettier-plugin-liquid/src/test/liquid-tag-function/index.liquid b/packages/prettier-plugin-liquid/src/test/liquid-tag-function/index.liquid index 91f9940..1afea28 100644 --- a/packages/prettier-plugin-liquid/src/test/liquid-tag-function/index.liquid +++ b/packages/prettier-plugin-liquid/src/test/liquid-tag-function/index.liquid @@ -25,3 +25,13 @@ It should format dot-access result variable It should format variable partial {% function res = partial_name %} + +It should preserve filters on function tag result (file-based) +{% function res = 'modules/core/api_calls/send', data: object, template: 'modules/openai/responses' | dig: 'results' %} + +It should preserve filters on function tag with no args +{% function res = 'modules/core/api_calls/send' | dig: 'results' %} + +It should break on long lines with filters +printWidth: 1 +{% function res = 'modules/core/api_calls/send', data: object | dig: 'results' %} diff --git a/packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/fixed.liquid b/packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/fixed.liquid new file mode 100644 index 0000000..f4678a6 --- /dev/null +++ b/packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/fixed.liquid @@ -0,0 +1,25 @@ +It should format a basic graphql tag +{% graphql response = 'modules/core/api_calls/send' %} + +It should format graphql tag with named args +{% graphql response = 'modules/core/api_calls/send', data: object %} + +It should preserve filters on graphql tag result (file-based) +{% graphql response = 'modules/core/api_calls/send', + data: object, + template: 'modules/openai/responses' + | dig: 'api_call' +%} + +It should preserve filters on graphql tag with no args +{% graphql response = 'modules/core/api_calls/send' | dig: 'api_call' %} + +It should break on long lines with filters +printWidth: 1 +{% graphql response = 'modules/core/api_calls/send', + data: object + | dig: 'api_call' +%} + +It should format inline graphql tag with filter +{% graphql response | dig: 'results' %}query { test }{% endgraphql %} diff --git a/packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/index.liquid b/packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/index.liquid new file mode 100644 index 0000000..51edfbd --- /dev/null +++ b/packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/index.liquid @@ -0,0 +1,18 @@ +It should format a basic graphql tag +{% graphql response = 'modules/core/api_calls/send' %} + +It should format graphql tag with named args +{% graphql response = 'modules/core/api_calls/send', data: object %} + +It should preserve filters on graphql tag result (file-based) +{% graphql response = 'modules/core/api_calls/send', data: object, template: 'modules/openai/responses' | dig: 'api_call' %} + +It should preserve filters on graphql tag with no args +{% graphql response = 'modules/core/api_calls/send' | dig: 'api_call' %} + +It should break on long lines with filters +printWidth: 1 +{% graphql response = 'modules/core/api_calls/send', data: object | dig: 'api_call' %} + +It should format inline graphql tag with filter +{% graphql response | dig: 'results' %}query { test }{% endgraphql %} diff --git a/packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/index.spec.ts b/packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/index.spec.ts new file mode 100644 index 0000000..29e9e10 --- /dev/null +++ b/packages/prettier-plugin-liquid/src/test/liquid-tag-graphql/index.spec.ts @@ -0,0 +1,6 @@ +import { test } from 'vitest'; +import { assertFormattedEqualsFixed } from '../test-helpers'; + +test('Unit: liquid-tag-graphql', async () => { + await assertFormattedEqualsFixed(__dirname); +});