- 5f098a2d: Temporarily remove
ValidScopedCSSClassfrom the recommended config. The check causes severe save lag in VS Code on larger themes (see #1179) because it re-parses every{% stylesheet %}tag in the theme on every save. It remains available as an opt-in check. Will be re-enabled once the performance issue is resolved.
-
78a55fc0: Introduce new theme-check to detect invalid CSS class usage in HTML
ValidScopedCSSClassdetects invalid CSS classes in HTML if it deems them being out of scope. A CSS class is in-scope if it matches any of the following:- The CSS class is declared in
assets/*.cssfile - The CSS class is declared in the file's
stylesheettag - The CSS class is declared in a direct ancestor's
stylesheettag - The CSS class is declared in a snippet file's
stylesheettag that is rendered by this file or its direct ancestor (recursive)
- The CSS class is declared in
- e10da7cc: Fix UniqueStaticBlockId false positive when same block id is used with different variants
- 020d34fd: Add support for color_palette input type
- 69513792: Allow theme app extensions to use block-level completion items in snippets
- bc8002ba: New theme check to ensure translation values inside of
schematag are valid
- 346cc150: Fix RemoteAsset false positives for hash URLs and variable-based attribute values
- 2df8b65e: Allow Liquid in "liquid" input type
- b1bca3f9: Upgrade prettier to v3 (internal)
- Updated dependencies [b1bca3f9]
- @shopify/liquid-html-parser@2.9.2
- 8f523617: Bump to TypeScript 5
- Updated dependencies [8f523617]
- @shopify/liquid-html-parser@2.9.1
- f00a1620: Remove 'CaptureOnContentForBlock' check — Theme development standards have evolved and changed, and this check has been fully deactivated on major themes. With more intense use blocks, this technique proven as a good approach to avoid duplication and promote reusability
- 450b3f28: Add schema translation go-to-definition support
- 4bcb1126: Add translation key go-to-definition support
- dd1f4c8f: Fix false-positive reporting of UndefinedObject within {% schema %} tags
- 0380e438: Added a new OrphanedSnippet theme check to discover and warn if a snippet isn't referenced anywhere
- 2fb378ca: Add check to find/fix unsupported parenthesis
- 0c0f6c06: Add check for invalid loop arguments for
forandtablerowtags - c2228360: Detect and report invalid ranges in loops
- 2784a83b: Change wording around syntax errors for invalid conditional nodes in Liquid HTML Syntax check
- 39a6e632: Remove AST check on fixed code suggestions
- 1ebf9246: Detect and fix use of boolean expressions
- a7d0e2d0: Find+fix echo tags & variable output with no value
- e1bf12c7: Introduce fix for invalid
assigntag values - 374ff3de: Allow boolean expressions in schema tag
- b226e52c: Fix syntax check for tags where multiple instances of same error occur
- 0bfc7859: Find/fix multiple
echovalues - Updated dependencies [6a1512db]
- Updated dependencies [1ebf9246]
- @shopify/liquid-html-parser@2.9.0
- d605777f: Remove theme-check ValidDocParamNames
- 4ae72589: Introduce "Deprecated Fonts on Settings Schema" check
- f28daa84: [Internal] Fix incorrect references to libraries
- 23992051: Update liquid paginate max limit rule from 50 to 250
- 8ab6a8e7: Update list of deprecated fonts
- a3a513dc: Introduce new DeprecatedFontsOnSectionsAndBlocks check
- ce5cb33a: Gracefully handle files that are not part of a theme
- 649da6df: Introduce check that warn developers that
{% stylesheet %}and{% javascript %}tags only support static content - 444c9edc: Add hardcoded-routes theme check which reports a warning when hardcoded routes are used instead of the routes object
- 4477a6d9: Fix small bug in path.basename
- 606053f1: Fix ValidBlockTarget for blocks in
defaultandpresets- Solves issue so nested blocks inside of
presetsare now validated - Solves issue so block types inside of
defaultare now validated
- Solves issue so nested blocks inside of
- 4d9ba806: Allow
//,/*,*/inside of strings in template JSON
- c3504252: Introduce ability the disable theme checks for the next Liquid statement
- Add
{% # theme-check-disable-next-line %}to disable theme checks on the next Liquid statement - To disable a specific theme-check rule, add the name(s) after
theme-check-disable-next-linein a comma separated format
- Add
- 20625a1b: Fix validation for static blocks in JSON templates
- 83b1b760: No longer lint global objects as invalid parameters in the
ValidDocParamNamescheck
-
a1fa7376: Support LiquidDoc param array types
- LiquidDoc param types supports 1D arrays as param types
- Square brackets are placed after the param type to denote arrays
E.g.
{% doc %} @param {product[]} my_products - an array of products @param {string[]} my_strings - an array of strings {% enddoc %}
- 37f41c6e: For aliased filters, show the docs of the base docset entry
- 7f243690: Fix RemoteAsset false positive for /cdn URLs
- 90577cd2: Fix hover when cursor is directly after a
. - 19f5589b: [internal] Export
getBlockNamehelper utility
- d7949240: Fix bug where self-assigned variables were warned as an offense, even when defined by a @param
-
4d557619: Add
content_forargument theme checks if static block has LiquidDoc- DuplicateContentForArguments - Ensures arguments provided for
content_fortag are unique - MissingContentForArguments - Ensures all required arguments, as per LiquidDoc, are provided
- UnrecognizedContentForArguments - Ensures arguments provided exclusively match LiquidDoc params
- ValidContentForArgumentTypes - Ensures arguments match type defined in LiquidDoc
- DuplicateContentForArguments - Ensures arguments provided for
-
c0f42c37: Restrict LiquidDoc param names in blocks based on
content_fortag params- LiquidDoc inside blocks have limitations on names because
content_fortag uses the following param names:- id
- type
- attributes
- block
- blocks
- class
- context
- inherit
- resource
- resources
- schema
- section
- sections
- settings
- snippet
- snippets
- template
- templates
- LiquidDoc inside blocks have limitations on names because
- 067a75eb: Improve parsing logic around aliases
- aa43656b: [internal] Building blocks to support LiquidDoc for blocks
- dccca5a5: Bugfix ensures
content_forargument theme check allowsclosest.args - 39339f88: visible_if should not warn on use of 'section' in a block file
- 660bd7df: Allow UndefinedObject check on snippets
- c0f42c37: Add reserved parameters to the
content_fortag - Updated dependencies [067a75eb]
- @shopify/liquid-html-parser@2.8.2
- 906455b0: Fix ValidBlockTarget reporting of static block presets
- e75f896d: [Feature] Support more types for LiquidDoc param
- Support liquid objects as LiquidDoc param type
- Object is NOT supported if it is exclusively a global liquid variable
- Object is NOT supported if it is deprecated
- Support liquid objects as LiquidDoc param type
- b6f94d16: Make the ValidVisibleIf check accept boolean literals
- 75c02293: Fix slow render tag theme checks
- 034a803b: Updated UndefinedObject check to recognize variables declared via
@paramwithin doc tags in blocks
- Updated dependencies [7ff54f02]
- @shopify/liquid-html-parser@2.8.1
- 886ee4b1: Update theme blocks to support static arguments only in static blocks without the
contextnamespace - cf51a514: Update UnsupportDocTags check to accept the {% doc %} tag in theme blocks
- d9204c55: Fix: Be less strict about numbers in VariableName
- 3fff76bf: Do not report errors when using a Liquid doc @param name of a non global variable
- Updated dependencies [1a95a190]
- @shopify/liquid-html-parser@2.8.0
- ea9f2451: Reintroduce support for
contextparameters in thecontent_fortag - 6268e838: Allow
recommendationsas a global variable inblocks/
- d42ed610: Fix indentation for multi-line examples and descriptions
- 9ffbe27d: Remove
brandfrom list of metafield owner types being fetched- Brand is removed from ownerType
- https://shopify.dev/docs/api/admin-graphql/latest/queries/metafieldDefinitions
-
8a0393a1: Theme check to ensure liquid doc param names don't collide with reserved words
- Theme check will report a warning if param name collides with global liquid objects
- Theme check will report a warning if param name collides with liquid tags
-
0d96194e: Update MissingRenderSnippetParams to report when alias variable are provided using
with/forsyntax. -
21354237: Update UnrecognizedRenderSnippetParams to report when alias variable are provided using
with/forsyntax. -
c55077e7: Split ValidRenderSnippetParams theme check into MissingRenderSnippetParams and UnrecognizedRenderSnippetParams. This allows them to be disabled independantly.
-
48d4d79e: Update ValidRenderSnippetParamTypes to report when alias variable are provided using
with/forsyntax. -
a851f379: Add DuplicateRenderSnippetParams theme check
Introduces a new theme check to detect and report duplicate parameters in Liquid render tags. The check:
- Identifies duplicate parameter names in render snippets
- Provides suggestions to remove redundant parameters
- dafba833: [Internal] Update
getSnippetDefinitionsandRenderSnippetHoverProviderto account for trimmed newline characters in description and example nodes content. - Updated dependencies [de877551]
- @shopify/liquid-html-parser@2.7.0
-
10493c9d: New
UnusedDocParamtheme-check rule- Theme check will verify that parameters defined within a snippet's
docheader are used within the body
- Theme check will verify that parameters defined within a snippet's
-
f130a78f: Introduce a new theme check which validates the types of parameters passed to snippets against the liquidDoc header.
- Reports type mismatches
- Suggests autofixes (replace with default or remove value)
- Skips type checking for variable lookups
- Skips type checking for unknown parameters
- Skips type checking for unknown types
-
1a4482eb: New theme checks to validate liquid doc params
UniqueDocParamNameswill check if param names are unique within thedoctagValidDocParamTypeswill check if the param types defined in thedoctag are supported
-
79c9f773: Update getSnippetDefinition
definitionproperty to return implicit description if provided.Implicit descriptions are provided as text before any annotations
@are provided. This overrides any@descriptionannotations. -
754f7f66: New theme check to ensure
doctag is only used in snippet files
- 5ad43a8c: Fixed issue with normalize method not working properly on windows due to not replacing backslashes with forward slashes
- dc8c9fda: Add RemoteAsset allowedDomains check to validate CDN and approved domain usage for better performance and developer experience
- beccb69e: Fixed local blocks validation to not consider preset blocks as containing local blocks when a name is present
- Updated dependencies [10493c9d]
- Updated dependencies [79c9f773]
- Updated dependencies [9563715a]
- @shopify/liquid-html-parser@2.6.0
- 0bb780de: Add
ValidVisibleIfcheck to ensurevisible_ifexpressions are well-formed and only reference defined settings keys
- f077a9ec: [internal] Adding list of supported doc tag types
-
fe84a17a: Add ValidRenderSnippetParams check which validates args passed to snippets with LiquidDoc definitions
- Checks that required parameters are provided
- Checks that unknown parameters are not provided
-
055cef77: Theme check verifies if setting key exists within block schemas and section schemas
- Check if the keys inside
presets.[].settingsanddefault.settingsexist assettings.[].idin the same file - Check if the keys inside
presets.[](recursive .blocks.[]).settingsanddefault.blocks.[].settingsexist assettings.[].idinside the referenced block's file
- Check if the keys inside
-
e9c1d98a: Move
getSnippetDefinitionto theme-check-common
- d32afb7f: Improve type adherence of
getSnippetDefinition. The function now returnsundefinedwhen the corresponding properties are empty. - Updated dependencies [c4bbf3b5]
- Updated dependencies [d9dbc265]
- Updated dependencies [2db3047f]
- Updated dependencies [261c2958]
- @shopify/liquid-html-parser@2.5.0
- 2ef93d17: [internal] Add
strictarg forparseJSON. The default schema JSON parsed is more laxed. - Updated dependencies [e57979e0]
- Updated dependencies [8c9f5bcf]
- @shopify/liquid-html-parser@2.4.0
- 841ca6d1: Update repository URL for all packages to be case sensitive
- Updated dependencies [841ca6d1]
- @shopify/liquid-html-parser@2.3.2
- c85a6131: Cache liquidDoc fetch results
- 913d5386: Add unique settings ID validator to prevent duplicate IDs in theme configurations
- 931dc9b9: Add hover support for Liquid snippets using {% doc %} annotations
- Updated dependencies [dd0cd4d2]
- @shopify/liquid-html-parser@2.3.1
- Updated dependencies [ac55577a]
- @shopify/liquid-html-parser@2.3.0
- b31e0f85: [internal] Add
offsetinformation on Schema objects - 34c2268a: This update ensures that the AppBlockMissingSchema theme check will only run on block files on theme app extensions, to avoid errors surfacing when the theme check is incorrectly run on snippets. Renamed the check to make it more accurate (from MissingSchema to AppBlockMissingSchema).
- c74850c8: [Internal] Add template type interfaces
- c60e61ba: [Internal] Add schema raw value to schema node
- d7436b4a: Add
JsonMissingBlockcheck - 6f1862c8: Add
SchemaPresetsStaticBlockscheck - d01e657b: [Internal] Add JSONC support to the AST parser
- 8e909870: Import fix for PropertyNode in JSONMissingBlock.
- 8912fab8: Update Ohm grammar for ContentFor tag to extract arguments correctly Update ValidContentForArguments check to report deprecated context. argument usage
- 51ec6a7a: Add case to
SchemaPresetBlockOrdercheck
- Updated dependencies [8912fab8]
- @shopify/liquid-html-parser@2.2.0
- 05ae5ea8: Added
MissingSchematheme check to identify missing schemas in theme app extensions. - 26215724: Add
EmptyBlockContentCheck - 73758ba1: Add
LiquidFreeSettingscheck - 5e8a2bfe: Add
SchemaPresetsBlockOrdercheck
- 05b928ea: [internal] Rejig how we do JSON completion & Hover
- a579d59e: (internal) Fixup bug in nodeAtPath
- d2b5942a: Add positional attribute to exported Parameter type
- 3e69d732: Update theme check urls
- 1083b2bc: Refactor
ValidBlockTargetandValidLocalBlocks. - 5a2caaee: Import
SectionandThemeBlocktypes. - Updated dependencies [1f54be13]
- @shopify/liquid-html-parser@2.1.2
- 16e2f37: Temporarily disable ValidLocalBlocks
- 4a18a78: Temporarily disable ValidBlockTarget
- 3f7680e: Add the
ValidBlockTargetCheck - 8a0bf78: Add the
ValidLocalBlocksCheck - c4813ff: Add the
BlockIdUsagecheck - 7317830: Add translation checking to
ValidSchemaNamecheck - add2445: [Internal] Add better building blocks for dealing with
{% schema %}content
- 7a6dfe8: Fix weird root URI loading bug
- b558bfe: Fixup
CaptureOnContentForBlockcheck - 9a07208: [Bug fix] Metafield definitions should use
namespace.keyfor auto-completion - f09c923: Moving internal methods around
- Updated dependencies [c4813ff]
- @shopify/liquid-html-parser@2.1.1
-
b431db7: Add
ValidateSchemaNamecheck -
568d53b: Add the
ValidContentForArgumentscheck -
6014dfd: Support metafield auto-completion based on .shopify/metafields.json file
- The metafield definitions can be fetched from Admin API
- The format of the JSON needs to be the following:
{ "<definition_group>": [ { "name": "...", "namespace": "...", "description": "...", "type": { "category": "...", "name": "..." }, }, ... ], ... }The definition group needs to be one of the following:
- 'article'
- 'blog'
- 'brand'
- 'collection'
- 'company'
- 'company_location'
- 'location'
- 'market'
- 'order'
- 'page'
- 'product'
- 'variant'
- 'shop'
- Updated dependencies [568d53b]
- @shopify/liquid-html-parser@2.1.0
-
4b574c1: [Breaking] Replace absolute path concerns with URIs
This implies a couple of changes:
Confignow holds arootUriinstead ofrootpath.loadConfiginjections needs to change their return value accordingly- In checks,
- The context helper
absolutePathhas been replaced bytoUri - The context helper
relativePathhas been replaced bytoRelativePath
- The context helper
SourceCodeobjects now hold auriinstead of apathtoSourceCodenow accepts auriinstead of apath
-
4b574c1: [Breaking] Replace fs-based dependency injections with AbstractFileSystem injection
runChecks(theme, { - getDefaultTranslations, - getDefaultLocale, - getDefaultSchemaLocale, - getDefaultSchemaTranslations, - fileExists, - fileSize, + fs: new FileSystemImpl(), themeDocset, jsonValidationSet, })
- 5fab0e9: (Internal) Add path.basename util
- Updated dependencies [c664d52]
- @shopify/liquid-html-parser@2.0.5
- Updated dependencies [1c73710]
- Updated dependencies [d1f9fef]
- Updated dependencies [70e2241]
- @shopify/liquid-html-parser@2.0.4
- 457f9cb: Add CaptureOnContentForBlock check
- edb7f2e: Standardized variable number formatting
- bb79d83: Add VariableName check
- ff78229: Update 'theme-check-common/src/json.ts' to use 'jsonc-parser'
- ec1fbd7: The comment object should be available to section files
-
03b41e1: Breaking:
jsonValidationSet's schemas public API changeNow takes a function of the following signature:
interface JsonValidationSet = { schemas: (context: 'theme' | 'app') => Promise<SchemaDefinition[]> }
Reason being we want to support
fileMatchoverloading ofblocks/*.liquidfiles and we needed a way to identify which context you're in.Unfortunately, the JSON schema for
blocks/*.liquidfiles in theme app extensions isn't the same one we have in themes. There doesn't seem to be a way to unify them either. -
03b41e1: Theme Check Config files now accept the
contextpropertyIn your
.theme-check.ymlfiles, you can set thecontextproperty tothemeorapp. By default, it'stheme. Thetheme-check:theme-app-extensionconfig sets it toapp.You shouldn't need to care about this. It's there so we can do contextual things internally.
-
03b41e1: Add support for the schemas manifest on Shopify/theme-liquid-docs
Shopify/theme-liquid-docs now supports composable JSON schemas (with relative paths). To solve the
blocks/*.liquidfile match JSON schema overload depending on the context (apportheme), we defined two manifests that describe the schemas required by your solution and define the fileMatch rules:@shopify/theme-check-docs-updaternow reads those manifests and downloads the tree of dependency that they require. We will no longer need to make new theme-tools releases whenever we add new schemas. We'll be able to dev them and their file associations directly from Shopify/theme-liquid-docs and have downstream consumers updated automatically (the same way docs are automatically updated).
-
767d223: Add
ValidJSONcheckThis check validates JSON files against the JSON schemas provided in the
jsonValidationSetprovided there is a file match. -
767d223: Breaking: Redesign
jsonValidationSetpublic API(Only breaking for in-browser packages, node packages are still batteries-included)
Before:
type JsonValidationSet = { sectionSchema(): Promise<string>; translationSchema(): Promise<string>; validateSectionSchema(): Promise<ValidateFunction>; };
After:
type URI = string; type SchemaDefinition = { uri: string; fileMatch?: string[]; schema: Promise<string>; }; type JsonValidationSet = { schemas: SchemaDefinition[]; };
We’re getting rid of ajv and we’ll use vscode-json-languageservice in Theme Check instead. That dependency is required by the language server anyway, might as well reuse it instead of depending on a totally different solution for validation. We'll also get better reporting of Syntax Errors because the parser used by
vscode-json-languageserviceis better.Moreover, this new design leaves space for
$refsupport.
-
8e3c7e2: Add Schema translation checking to
MatchingTranslations -
8e3c7e2: Breaking: add
getDefaultSchema{Locale,Translations}(Factory)?dependenciesTo be used to power
MatchingTranslationsfor Schema translations.To be used to power Schema translations code completion and hover in section and theme block
{% schema %}JSON blobs.
- 8e3c7e2: Unify parseJSON usage
- 8710bde: Fix AssetAppBlock{CSS,JavaScript} bug when cwd != project root
-
042f1e0: Breaking: internal rename of
schemaValidatorstojsonValidationSetThis breaks the browser dependencies public API (for
startServerandrunChecks) and will thus require some code changes in those contexts.The node packages absorb the dependency injection and are not breaking.
-
a9ae65f: Add Language Server and Theme Check support for checkout.liquid objects
- 0990c47: Fix config validation problem that required optional settings
- 617b766: Add parser support for trailing commas at the end of Liquid tags and filters
- Updated dependencies [0990c47]
- Updated dependencies [617b766]
- @shopify/liquid-html-parser@2.0.3
- Fix parsing of
}}inside{% %}and vice-versa - 8f19b87: Bump lodash deps
-
8451075: Theme Check 2.0
Our official release of the next iteration of Theme Check, the linter for Shopify themes.
What is is: A TypeScript rewrite of Theme Check.
But... why? A couple of reasons:
- To lint Liquid files, we prefer one Abstract Syntax Tree (AST) per file. Not one Liquid AST and one HTML AST.
- Theme Check Ruby had weird duplicated checks because of that (such as
ParserBlockingJavaScriptandParserBlockingScriptTag) - For that we reused the
@shopify/liquid-html-parserwe wrote for the prettier plugin. - One tree, two languages.
- Theme Check Ruby had weird duplicated checks because of that (such as
- We wanted to run the linter in the Online Store Code Editor and—unlike WASM or WebSockets—there is no overhead or latency cost to running a TypeScript-based Language Server in a Web Worker.
- Theme developers are Front End developers. If we were to make a Venn diagram, we'd observe that the intersection of Ruby and Theme developers is much smaller than that of JavaScript and Theme developers.
- This makes the TypeScript codebase easier to contribute to.
- This makes the plugin ecosystem more accessible (you're more likely to have a
package.jsonfile in a theme than aGemfile).
- The
@shopify/cliwas rewritten in TypeScript. This made the Ruby integration very problematic.- Windows performance was terrible
- Installation setup was weird, often problematic and complicated
- The VS Code extension required a secondary installation step, and thus lost the ability to automatically self-update
With the move to TypeScript, we believe that it will make it easier for us to ship more robust features faster.
- To lint Liquid files, we prefer one Abstract Syntax Tree (AST) per file. Not one Liquid AST and one HTML AST.
- 8451075:
package.jsonand README cleanups - Updated dependencies [8451075]
- @shopify/liquid-html-parser@2.0.1
- 636895f: Make LiquidHTMLSyntaxError more tolerant to unclosed nodes in branching code
- aeb9b3f: Add
UnclosedHTMLElementcheck
- Updated dependencies [636895f]
- Updated dependencies [636895f]
- @shopify/liquid-html-parser@2.0.0
- 772a1ce: Update
translation-key-existscheck and intelligent code completion to always stay up-to-date with Shopify translation keys
-
b05a6a8: Add support for the following Language Server configurations:
themeCheck.checkOnOpenthemeCheck.checkOnSavethemeCheck.checkOnChange
This is mostly for backward compatibility and to not be annoying :)
- 79b0549: Add
appobject support for theme app extensions - ac1deb4: Improved message reporting for
AssetSize*checks
- Updated dependencies [78813ea]
- @shopify/liquid-html-parser@1.1.1
- d9f3063: Do not report UnusedAssign for variables starting with an underscore
- fe54680: Fix
MissingAssetfalse positives for .css.liquid, .js.liquid and .scss.liquid files - e00c319: Fix false ParserBlockingScript reports for scripts of type module
- aa33c5f: Fix hover, completion and
UndefinedObjectreporting of{% increment var %}and{% decrement var %} - 0d71145: Fix UnusedAssign false positives in raw-like nodes
- Updated dependencies [0d71145]
- @shopify/liquid-html-parser@1.1.0
- 96d4d5e: Re-add
ignoreMissingsupport toMissingTemplate
- dacdd9f: Add blocks/ files contextual completion, hover and UndefinedObject support
-
2cf7a11: Rename and alias a couple of checks
DeprecatedFilters->DeprecatedFilterDeprecatedTags->DeprecatedTag- Alias
LiquidHTMLSyntaxErrorwithSyntaxErrorandHtmlParsingError - Alias
ParserBlockingJavaScriptwithParserBlockingScriptTag - Alias
JSONSyntaxErrorwithValidJson - Alias
AssetSizeCSSwithAssetSizeCSSStylesheetTag - Alias
RemoteAssetwithAssetUrlFilters
-
2cf7a11: Add support for aliases in check configs
- 8d35241: Fix
paginateobject completion, hover andUndefinedObjectreporting - 201f30c: Add support for
{% layout none %} - c0298e7: Fix
recommendationscompletion, hover andUndefinedObjectreporting - 6fad756: Fix
predictive_searchcompletion, hover andUndefinedObjectreporting - fc86c91: Fix
formobject completion, hover andUndefinedObjectreporting
- 279a464: Replace
AssetUrlFilterswithRemoteAsset
- d71a5e2: Fix completion, hover and UndefinedObject reporting of tablerowloop and forloop variables
- 6c2c00f:
UndefinedObjectshould not show any offenses when themeDocset is not given - f1a642f: Improve resilience of theme check pipeline by preventing entire failure if an individual check fails
- b7514f4: Fixup UndefinedObject for sections
- beeb85f: Introduce 'UndefinedObject' check
- a05aebb: Add
AssetSizeJavascriptcheck
- 14b9ee2: Fixup package.json configs
- 441a8c5: Remove
ImgLazyLoading - 972c26c: Introduce 'DeprecatedFilters' check (+ suggestions)
- 25b79f0: Rename LiquidDrop -> LiquidVariableLookup
- 12c794a: Add
DeprecatedTagscheck
- c00e929: Bug fix for
AssetSizeCSS: Fixes redundant messages. - f3cda64: Fixup AppBlock*Checks to not throw errors on missing property
- b1b8366: Fixup AssetUrlFilters node targeting
- c00e929: Bug fix for
AssetSizeAppBlockCSS: Corrects underlining issues. - c00e929: Bug fix for
AssetUrlFilters: Reports better messaging. - b1b8366: Fix RequireThemeObject highlighting
- b1b8366: Fix the recommended and severity values
- c00e929: Bug fix for
AssetSizeAppBlockJavascript: Corrects underlining issues. - Updated dependencies [02f4731]
- @shopify/liquid-html-parser@1.0.0
- Patch bump because it depends on @shopify/prettier-plugin-liquid
- Updated dependencies [5479a63]
- Updated dependencies [5479a63]
- @shopify/prettier-plugin-liquid@1.2.3
- 5ba20bd: Fixed bug for
AssetUrlFilterscheck - 5ba20bd: Add
ContentForHeaderModificationcheck - 5ba20bd: Add
AssetSizeCSScheck - 5ba20bd: Add
AssetSizeAppBlockJavascriptcheck - 5ba20bd: Add
AssetSizeAppBlockCSScheck
- 2e73166: Fix the
DocsetEntrytypes to better match the theme-liquid-docs json files
- e67a16d: Breaking: Dependency injected json schema validators
- 4db7c7e: Add
UnknownFiltercheck - a94f23c: Bump prettier-plugin-liquid to v1.2.1
-
b3ed3b9: Add
ValidSchemacheck -
d19500f: Add
AppBlockValidTagscheck -
8e76424: Add support for
.theme-check.ymlconfig filesNew features:
-
Developers can write their own checks and publish them to npm
Modules that follow the
@scope/theme-check-*ortheme-check-*naming conventions are automatically loaded.The
requireproperty of the configuration file can be used to load checks that do not follow the naming convention.See Creating a Theme Check extension for more info.
-
extendscan be an array -
extendscan refer to node module dependencies -
extendsalso accepts "modern" config identifiers:theme-check:allfor all the checks and with default settingstheme-check:recommendedfor the recommended checks and settingstheme-check:theme-app-extensionfor theme app extensions
Removed features:
include_categories: []exclude_categories: []
Replaced features:
require: []this can be used to load unconventional (or private)theme-check-jschecks. Ruby checks are not supported.
Breaking changes:
-
Custom checks written in Ruby won't work Theme Check in TypeScript
-
The
*(star) glob inignoreconfigurations does not capture the forward slash (/) unless at the end of the pattern.Fix: replace
*by**.This comes from a difference between how
minimatchand Ruby handles file globs.
Extra care has been placed to make the transition as smooth as possible.
-
-
3096e53: Add
ValidHTMLTranslationcheck -
daf5189: Add
AssetPreloadcheck -
6fb9db9: Add
ImgLazyLoadingcheck
- 2f0f941: Add
MissingAssetcheck - fd3fc3c: Add
AssetUrlFilters - 5ae97c9: Add
PaginationSizecheck - 85cf8f3: Add
CdnPreconnect - 051aff1: Introduce
ThemeDocsetandThemeSchemasdependencies to support core checks
- Bump prettier-plugin-liquid to v1.1.0
- 502bad8: Add documentation URLs to checks
-
cad8e17: Introduce API for schema definition
New: The
meta.schemaproperty ofCheckDefinitions accept a key-value pair ofSchemaProp.const schema = { myNumberSetting: SchemaProp.number(10), myStringSetting: SchemaProp.string("default"), myStringArraySetting: SchemaProp.array<string>(["default", "value"]), myBooleanSetting: SchemaProp.boolean(true), myObjectSetting: SchemaProp.object({ age: SchemaProp.number(), name: SchemaProp.string(), company: SchemaProp.object({ name: SchemaProp.string(), }).optional(), }), }; // `<typeof schema>` is required to type `context.settings`. export const SomeCheck: LiquidCheckDefinition<typeof schema> = { meta: { code: "...", name: "...", docs: { /* ... */ }, type: SourceCodeType.LiquidHtml, severity: Severity.ERROR, schema, targets: [], }, create(context) { context.settings.severity; // typed as Severity context.settings.myNumberSetting; // typed as number context.settings.myBooleanSetting; // typed as boolean context.settings.myStringSetting; // typed as string context.settings.myStringArraySetting; // typed as string[] context.settings.myObjectSetting.age; // typed as number | undefined context.settings.myObjectSetting.name; // typed as string context.settings.myObjectSetting.company?.name; // typed as string | undefined return {}; }, };
-
9e99728: Add
UnusedAssign -
f99c896: Add
LiquidHTMLSyntaxError -
e0c131a: Add
JSONSyntaxError -
e0c131a: Breaking:
SourceCodecan takeast: AST[T] | Error, whereErroris a parsing error -
ccd5146: Add
DeprecatedLazysizes -
c715fbe: Add
ImgWidthAndHeight -
9e99728: Add
RequiredLayoutThemeObject -
edd8925: Add
DeprecateBgsizes
- 9d3d557: Fix RequiredLayoutThemeObject bugs
- 60c92be: Fix unhandled TranslationKeyExists error
-
71e6b44: Add support for fixes and suggestions
New:
context.reportnow accepts two new properties:-
fix: Fixer, accepts a callback that is given a corrector and produces transformations that are deemed safe to apply without confirmation on the initial document.- JSON checks will receive a
JSONCorrector(API) - LiquidHTML checks will receive a
StringCorrector(API)
type Fixer<S> = (corrector: Corrector<S>) => void;
- JSON checks will receive a
-
suggest: Suggestion[], accepts an array of Suggestion. Those are like fixes but are not considered safe either because there's multiple ways to fix the problem or because the change requires care.type Suggestion<S> = { message: String; fix: Fixer<S>; };
Example usage:
// A safe change, add a "TODO" translation key context.report({ message: `The translation for '${path}' is missing`, startIndex: closest.loc!.start.offset, endIndex: closest.loc!.end.offset, fix(corrector) { // corrector is inferred to be a JSONCorrector corrector.add(path, 'TODO'); }, }); // An unsafe change, add `defer` or `async` attributes on the script tag context.report({ message: 'Avoid parser blocking scripts by adding `defer` or `async` on this tag', startIndex: node.position.start, endIndex: node.position.end, suggest: [{ message: 'Add defer attribute', fix: corrector => { // corrector is inferred to be a StringCorrector corrector.insert(node.blockStartPosition.end, ' defer') }, }, { message: 'Add async attribute', fix: corrector => { // corrector is inferred to be a StringCorrector corrector.insert(node.blockStartPosition.end, ' async') }; }], })
Under the hood, corrector calls will be converted into a list of
Fixobjects.One can implement a
FixApplicator(a async function that takes aSourceCodeandFixobjects) to apply fixes in different contexts.- In Node.js, we'll implement a
FixApplicatorthat applies the fixes to the initial file and then save the changes to disk. - In the Language Server, we'll implement
FixApplicators that turn theFixes intoTextEditobjects.
New: the top level API now offers the
autofixfunction, one that takes aFixApplicatoras argument.This
autofixfunction applies all the safe changes (and ignores suggestions). -
- 9f8d47f: Fixup Translations type to allow strings
- a8cda19: Add TranslationKeyExists to allChecks array
- 9d419ca: Breaking: change dependency
get defaultLocaletogetDefaultLocale(): Promise<string>
-
72a9330: Breaking: Add
defaultLocaledependency -
5329963: Breaking: create one context per file
The API for creating checks has changed:
- We no longer pass a
fileargument to every method fileis now accessible from theContextobject- We now create one context per file to avoid subtle state bugs
- We no longer pass a
-
72a9330: Add check TranslationKeyExists
-
5329963: Breaking: change signature of
getDefaultTranslationsto return aPromise<Translations>
- 4c099d5: Add check
MissingTemplate - 4c099d5: Consider comments to disable checks (
# theme-check-disable/enable)
-
f4a2f27: Simplify public API
Breaking changes:
ThemeisSourceCode<S>[]instead of{ files: Map<string, SourceCode<S>> }SourceCodeno longer has arelativePathpropertytoSourceCodeno longer takes arelativePathas argumentConfighas arootproperty
-
37fc98a: Add dependencies to public API
fileExists(absolutePath: string): Promise<boolean>returns true when a file existsgetDefaultTranslations(): Promise<JSONObject>returns the parsed JSON contents of the default translations file
These dependencies are now added to the
contextobject and are usable by checks.Those exists as a lean way to get rid of the assumptions that all files are in the
Themeobject. We should be able to go a long way with these.
- d206674: Move toSourceCode to common for use in language-server-common
- 233f00f: Initial release