diff --git a/packages/theme-check-common/src/checks/deprecated-fonts-on-settings-data/index.spec.ts b/packages/theme-check-common/src/checks/deprecated-fonts-on-settings-data/index.spec.ts new file mode 100644 index 000000000..648036631 --- /dev/null +++ b/packages/theme-check-common/src/checks/deprecated-fonts-on-settings-data/index.spec.ts @@ -0,0 +1,120 @@ +import { describe, it, expect } from 'vitest'; +import { DeprecatedFontsOnSettingsData } from './index'; +import { runJSONCheck } from '../../test'; + +describe('Module: DeprecatedFontsOnSettingsData', () => { + it('reports a warning when settings_data.json has a deprecated font in current settings', async () => { + const sourceCode = JSON.stringify({ + current: { + heading_font: 'helvetica_n4', + body_font: 'alegreya_n4', + }, + }); + + const offenses = await runJSONCheck( + DeprecatedFontsOnSettingsData, + sourceCode, + 'config/settings_data.json', + ); + + expect(offenses).toHaveLength(1); + expect(offenses[0].message).toEqual('The font "helvetica_n4" is deprecated'); + }); + + it('reports warnings for deprecated fonts in presets', async () => { + const sourceCode = JSON.stringify({ + current: {}, + presets: { + Default: { + heading_font: 'helvetica_n4', + body_font: 'agmena_n4', + }, + }, + }); + + const offenses = await runJSONCheck( + DeprecatedFontsOnSettingsData, + sourceCode, + 'config/settings_data.json', + ); + + expect(offenses).toHaveLength(2); + expect(offenses.map((o) => o.message)).toContain('The font "helvetica_n4" is deprecated'); + expect(offenses.map((o) => o.message)).toContain('The font "agmena_n4" is deprecated'); + }); + + it('reports no warning when settings_data.json has no deprecated fonts', async () => { + const sourceCode = JSON.stringify({ + current: { + heading_font: 'alegreya_n4', + body_font: 'bitter_n4', + }, + }); + + const offenses = await runJSONCheck( + DeprecatedFontsOnSettingsData, + sourceCode, + 'config/settings_data.json', + ); + + expect(offenses).toHaveLength(0); + }); + + it('reports no warning for non-string values', async () => { + const sourceCode = JSON.stringify({ + current: { + show_header: true, + items_per_page: 12, + colors_body_bg: '#ffffff', + }, + }); + + const offenses = await runJSONCheck( + DeprecatedFontsOnSettingsData, + sourceCode, + 'config/settings_data.json', + ); + + expect(offenses).toHaveLength(0); + }); + + it('does not run check on files other than settings_data.json', async () => { + const sourceCode = JSON.stringify({ + current: { + heading_font: 'helvetica_n4', + }, + }); + + const offenses = await runJSONCheck( + DeprecatedFontsOnSettingsData, + sourceCode, + 'config/settings_schema.json', + ); + + expect(offenses).toHaveLength(0); + }); + + it('reports warnings for deprecated fonts deeply nested in preset blocks', async () => { + const sourceCode = JSON.stringify({ + current: { + blocks: { + 'block-id-1': { + type: 'header', + settings: { + heading_font: 'helvetica_n4', + }, + }, + }, + }, + }); + + const offenses = await runJSONCheck( + DeprecatedFontsOnSettingsData, + sourceCode, + 'config/settings_data.json', + ); + + expect(offenses).toHaveLength(1); + expect(offenses[0].message).toEqual('The font "helvetica_n4" is deprecated'); + }); +}); diff --git a/packages/theme-check-common/src/checks/deprecated-fonts-on-settings-data/index.ts b/packages/theme-check-common/src/checks/deprecated-fonts-on-settings-data/index.ts new file mode 100644 index 000000000..27bf6d335 --- /dev/null +++ b/packages/theme-check-common/src/checks/deprecated-fonts-on-settings-data/index.ts @@ -0,0 +1,40 @@ +import { JSONCheckDefinition, Severity, SourceCodeType } from '../../types'; +import { getLocStart, getLocEnd } from '../../json'; +import { DEPRECATED_FONT_HANDLES } from '../deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data'; + +export const DeprecatedFontsOnSettingsData: JSONCheckDefinition = { + meta: { + code: 'DeprecatedFontsOnSettingsData', + name: 'Check for deprecated fonts in settings_data settings values', + docs: { + description: 'Warns on deprecated fonts in settings_data settings values.', + recommended: true, + url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/deprecated-fonts-on-settings-data', + }, + type: SourceCodeType.JSON, + severity: Severity.WARNING, + schema: {}, + targets: [], + }, + + create(context) { + const relativePath = context.toRelativePath(context.file.uri); + if (relativePath !== 'config/settings_data.json') return {}; + + return { + async Property(node) { + if ( + node.value.type === 'Literal' && + typeof node.value.value === 'string' && + DEPRECATED_FONT_HANDLES.has(node.value.value) + ) { + context.report({ + message: `The font "${node.value.value}" is deprecated`, + startIndex: getLocStart(node.value), + endIndex: getLocEnd(node.value), + }); + } + }, + }; + }, +}; diff --git a/packages/theme-check-common/src/checks/index.ts b/packages/theme-check-common/src/checks/index.ts index 7ca5119fa..a565fed88 100644 --- a/packages/theme-check-common/src/checks/index.ts +++ b/packages/theme-check-common/src/checks/index.ts @@ -13,6 +13,7 @@ import { DeprecateBgsizes } from './deprecate-bgsizes'; import { DeprecateLazysizes } from './deprecate-lazysizes'; import { DeprecatedFilter } from './deprecated-filter'; import { DeprecatedFontsOnSectionsAndBlocks } from './deprecated-fonts-on-sections-and-blocks'; +import { DeprecatedFontsOnSettingsData } from './deprecated-fonts-on-settings-data'; import { DeprecatedFontsOnSettingsSchema } from './deprecated-fonts-on-settings-schema'; import { DeprecatedTag } from './deprecated-tag'; import { DuplicateRenderSnippetArguments } from './duplicate-render-snippet-arguments'; @@ -81,6 +82,7 @@ export const allChecks: (LiquidCheckDefinition | JSONCheckDefinition)[] = [ DeprecateLazysizes, DeprecatedFilter, DeprecatedFontsOnSectionsAndBlocks, + DeprecatedFontsOnSettingsData, DeprecatedFontsOnSettingsSchema, DeprecatedTag, DuplicateContentForArguments,