From eb704ee1e80d23255e960f91df7f65a35fd3a6dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20S=C3=B8gaard?= <9662430+andershagbard@users.noreply.github.com> Date: Sat, 3 Jan 2026 19:18:05 +0100 Subject: [PATCH 1/4] Remove nested if --- .../src/checks/liquid-free-settings/index.ts | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/packages/theme-check-common/src/checks/liquid-free-settings/index.ts b/packages/theme-check-common/src/checks/liquid-free-settings/index.ts index 592da62ae..718a003c7 100644 --- a/packages/theme-check-common/src/checks/liquid-free-settings/index.ts +++ b/packages/theme-check-common/src/checks/liquid-free-settings/index.ts @@ -40,21 +40,26 @@ export const LiquidFreeSettings: LiquidCheckDefinition = { visit(jsonFile, { Property(schemaNode, ancestors) { - if (isInArrayWithParentKey(ancestors, 'settings') && isLiteralNode(schemaNode.value)) { - const { value, loc } = schemaNode.value; - const propertyValue = schemaNode.key.value; - if ( - typeof value === 'string' && - propertyValue !== 'visible_if' && - value.includes('{%') && - value.includes('%}') - ) { - context.report({ - message: 'Settings values cannot contain liquid logic.', - startIndex: node.blockStartPosition.end + loc!.start.offset, - endIndex: node.blockStartPosition.end + loc!.end.offset, - }); - } + if ( + !isInArrayWithParentKey(ancestors, 'settings') || + !isLiteralNode(schemaNode.value) + ) { + return; + } + + const { value, loc } = schemaNode.value; + const propertyValue = schemaNode.key.value; + if ( + typeof value === 'string' && + propertyValue !== 'visible_if' && + value.includes('{%') && + value.includes('%}') + ) { + context.report({ + message: 'Settings values cannot contain liquid logic.', + startIndex: node.blockStartPosition.end + loc!.start.offset, + endIndex: node.blockStartPosition.end + loc!.end.offset, + }); } }, }); From 60b353a6e8c6f7eddeefe40686beb5d7909a58bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20S=C3=B8gaard?= <9662430+andershagbard@users.noreply.github.com> Date: Sat, 3 Jan 2026 19:18:12 +0100 Subject: [PATCH 2/4] Add test --- .../checks/liquid-free-settings/index.spec.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/theme-check-common/src/checks/liquid-free-settings/index.spec.ts b/packages/theme-check-common/src/checks/liquid-free-settings/index.spec.ts index e58352523..c4d27b11c 100644 --- a/packages/theme-check-common/src/checks/liquid-free-settings/index.spec.ts +++ b/packages/theme-check-common/src/checks/liquid-free-settings/index.spec.ts @@ -51,6 +51,29 @@ describe('LiquidFreeSettings validation', () => { expect(offenses).to.have.length(0); }); + it(`should not report errors for valid settings with liquid type field in ${path} bucket`, async () => { + const theme: MockTheme = { + [`${path}/test-section.liquid`]: ` + {% schema %} + { + "name": "Section name", + "settings": [ + { + "id": "text_value", + "type": "liquid", + "label": "Text Value", + "default": "{% render 'block' %}" + } + ] + } + {% endschema %} + `, + }; + + const offenses = await check(theme, [LiquidFreeSettings]); + expect(offenses).to.have.length(0); + }); + it(`should report an error when settings value contains Liquid logic in ${path} bucket`, async () => { const theme: MockTheme = { [`${path}/test-section.liquid`]: ` From dee837b8651e15d2b29fbfc37a80332584bd4529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20S=C3=B8gaard?= <9662430+andershagbard@users.noreply.github.com> Date: Sat, 3 Jan 2026 19:29:21 +0100 Subject: [PATCH 3/4] Check if the input type is "liquid" --- .../src/checks/liquid-free-settings/index.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/theme-check-common/src/checks/liquid-free-settings/index.ts b/packages/theme-check-common/src/checks/liquid-free-settings/index.ts index 718a003c7..ff74e6e1b 100644 --- a/packages/theme-check-common/src/checks/liquid-free-settings/index.ts +++ b/packages/theme-check-common/src/checks/liquid-free-settings/index.ts @@ -42,7 +42,8 @@ export const LiquidFreeSettings: LiquidCheckDefinition = { Property(schemaNode, ancestors) { if ( !isInArrayWithParentKey(ancestors, 'settings') || - !isLiteralNode(schemaNode.value) + !isLiteralNode(schemaNode.value) || + isLiquidType(ancestors) ) { return; } @@ -72,6 +73,22 @@ function isLiteralNode(node: JSONNode): node is LiteralNode { return node.type === 'Literal'; } +function isLiquidType(ancestors: JSONNode[]): boolean { + return ancestors.some((ancestor) => { + if (ancestor.type !== 'Object') { + return false; + } + + return ancestor.children.some(({ key, value }) => { + if (key.value !== 'type' || !isLiteralNode(value)) { + return false; + } + + return value.value === 'liquid'; + }); + }); +} + function isInArrayWithParentKey(ancestors: JSONNode[], parentKey: string): boolean { return ancestors.some((ancestor, index) => { const parent = ancestors[index - 1]; From c8150a1fd64aeba05b60f686cf942da1caca681a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20S=C3=B8gaard?= <9662430+andershagbard@users.noreply.github.com> Date: Sat, 3 Jan 2026 19:36:22 +0100 Subject: [PATCH 4/4] Add changeset --- .changeset/little-boxes-shave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/little-boxes-shave.md diff --git a/.changeset/little-boxes-shave.md b/.changeset/little-boxes-shave.md new file mode 100644 index 000000000..c80027861 --- /dev/null +++ b/.changeset/little-boxes-shave.md @@ -0,0 +1,5 @@ +--- +'@shopify/theme-check-common': patch +--- + +Allow Liquid in "liquid" input type