- 841ca6d1: Update repository URL for all packages to be case sensitive
- Updated dependencies [841ca6d1]
- @shopify/[email protected]
- Updated dependencies [c85a6131]
- Updated dependencies [913d5386]
- Updated dependencies [931dc9b9]
- @shopify/[email protected]
- @shopify/[email protected]
- Updated dependencies [c74850c8]
- Updated dependencies [c60e61ba]
- Updated dependencies [b31e0f85]
- Updated dependencies [34c2268a]
- @shopify/[email protected]
- Updated dependencies [8e909870]
- Updated dependencies [d7436b4a]
- Updated dependencies [6f1862c8]
- Updated dependencies [d01e657b]
- @shopify/[email protected]
- Updated dependencies [8912fab8]
- Updated dependencies [51ec6a7a]
- @shopify/[email protected]
- Updated dependencies [05ae5ea8]
- Updated dependencies [3e69d732]
- Updated dependencies [26215724]
- Updated dependencies [73758ba1]
- Updated dependencies [5e8a2bfe]
- Updated dependencies [05b928ea]
- Updated dependencies [1083b2bc]
- Updated dependencies [a579d59e]
- Updated dependencies [5a2caaee]
- Updated dependencies [d2b5942a]
- @shopify/[email protected]
- Updated dependencies [16e2f37]
- @shopify/[email protected]
- Updated dependencies [4a18a78]
- @shopify/[email protected]
- Updated dependencies [3f7680e]
- Updated dependencies [add2445]
- Updated dependencies [8a0bf78]
- Updated dependencies [7a6dfe8]
- Updated dependencies [7317830]
- Updated dependencies [c4813ff]
- Updated dependencies [b558bfe]
- Updated dependencies [9a07208]
- Updated dependencies [f09c923]
- @shopify/[email protected]
- 568d53b: Add the
ValidContentForArguments
check
- Updated dependencies [b431db7]
- Updated dependencies [568d53b]
- Updated dependencies [6014dfd]
- @shopify/[email protected]
-
4b574c1: [Breaking] Replace fs-based dependency injections with AbstractFileSystem injection
runChecks(theme, { - getDefaultTranslations, - getDefaultLocale, - getDefaultSchemaLocale, - getDefaultSchemaTranslations, - fileExists, - fileSize, + fs: new FileSystemImpl(), themeDocset, jsonValidationSet, })
- Updated dependencies [4b574c1]
- Updated dependencies [4b574c1]
- Updated dependencies [5fab0e9]
- @shopify/[email protected]
- @shopify/[email protected]
- @shopify/[email protected]
- Updated dependencies [457f9cb]
- Updated dependencies [edb7f2e]
- @shopify/[email protected]
- Updated dependencies [bb79d83]
- @shopify/[email protected]
- Updated dependencies [ff78229]
- @shopify/[email protected]
- Updated dependencies [ec1fbd7]
- @shopify/[email protected]
-
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
fileMatch
overloading ofblocks/*.liquid
files and we needed a way to identify which context you're in.Unfortunately, the JSON schema for
blocks/*.liquid
files 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
context
propertyIn your
.theme-check.yml
files, you can set thecontext
property totheme
orapp
. By default, it'stheme
. Thetheme-check:theme-app-extension
config 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/*.liquid
file match JSON schema overload depending on the context (app
ortheme
), we defined two manifests that describe the schemas required by your solution and define the fileMatch rules:@shopify/theme-check-docs-updater
now 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).
- Updated dependencies [03b41e1]
- Updated dependencies [03b41e1]
- Updated dependencies [03b41e1]
- @shopify/[email protected]
- Updated dependencies [767d223]
- Updated dependencies [767d223]
- @shopify/[email protected]
- Updated dependencies [8e3c7e2]
- Updated dependencies [8e3c7e2]
- Updated dependencies [8e3c7e2]
- @shopify/[email protected]
- @shopify/[email protected]
- Updated dependencies [8710bde]
- @shopify/[email protected]
- @shopify/[email protected]
-
042f1e0: Breaking: internal rename of
schemaValidators
tojsonValidationSet
This breaks the dependencies' public API (for
startServer
andrunChecks
) and requires code changes in those contexts.
- Updated dependencies [042f1e0]
- Updated dependencies [a9ae65f]
- @shopify/[email protected]
- @shopify/[email protected]
- @shopify/[email protected]
- 617b766: Add parser support for trailing commas at the end of Liquid tags and filters
- Updated dependencies [0990c47]
- Updated dependencies [617b766]
- @shopify/[email protected]
- Updated dependencies [8f19b87]
- @shopify/[email protected]
-
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
ParserBlockingJavaScript
andParserBlockingScriptTag
) - For that we reused the
@shopify/liquid-html-parser
we 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.json
file in a theme than aGemfile
).
- The
@shopify/cli
was 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.json
and README cleanups - Updated dependencies [8451075]
- Updated dependencies [8451075]
- @shopify/[email protected]
- 636895f: Make LiquidHTMLSyntaxError more tolerant to unclosed nodes in branching code
- aeb9b3f: Add
UnclosedHTMLElement
check
- Updated dependencies [636895f]
- Updated dependencies [aeb9b3f]
- @shopify/[email protected]
- Updated dependencies [772a1ce]
- Updated dependencies [b05a6a8]
- @shopify/[email protected]
- Updated dependencies [79b0549]
- Updated dependencies [ac1deb4]
- @shopify/[email protected]
- @shopify/[email protected]
- Updated dependencies [d9f3063]
- @shopify/[email protected]
- Updated dependencies [fe54680]
- Updated dependencies [e00c319]
- @shopify/[email protected]
- Updated dependencies [aa33c5f]
- Updated dependencies [0d71145]
- @shopify/[email protected]
- Updated dependencies [96d4d5e]
- Updated dependencies [dacdd9f]
- @shopify/[email protected]
-
2cf7a11: Rename and alias a couple of checks
DeprecatedFilters
->DeprecatedFilter
DeprecatedTags
->DeprecatedTag
- Alias
LiquidHTMLSyntaxError
withSyntaxError
andHtmlParsingError
- Alias
ParserBlockingJavaScript
withParserBlockingScriptTag
- Alias
JSONSyntaxError
withValidJson
- Alias
AssetSizeCSS
withAssetSizeCSSStylesheetTag
- Alias
RemoteAsset
withAssetUrlFilters
- Updated dependencies [2cf7a11]
- Updated dependencies [2cf7a11]
- @shopify/[email protected]
- Updated dependencies [8d35241]
- Updated dependencies [201f30c]
- Updated dependencies [c0298e7]
- Updated dependencies [6fad756]
- Updated dependencies [fc86c91]
- @shopify/[email protected]
- 279a464: Add
RemoteAsset
check
- Updated dependencies [279a464]
- Updated dependencies [d71a5e2]
- @shopify/[email protected]
- Updated dependencies [6c2c00f]
- Updated dependencies [f1a642f]
- @shopify/[email protected]
- Updated dependencies [b7514f4]
- @shopify/[email protected]
- a05aebb: Add
AssetSizeJavascript
check
- Updated dependencies [beeb85f]
- Updated dependencies [a05aebb]
- @shopify/[email protected]
- 14b9ee2: Fixup package.json configs
- Updated dependencies [14b9ee2]
- @shopify/[email protected]
- 12c794a: Add
DeprecatedTag
check
- c00e929: Bug fix for
AssetSizeCSS
: Fixes redundant messages. - c00e929: Bug fix for
AssetSizeAppBlockCSS
: Corrects underlining issues. - c00e929: Bug fix for
AssetUrlFilters
: Reports better messaging. - c00e929: Bug fix for
AssetSizeAppBlockJavascript
: Corrects underlining issues. - Updated dependencies [441a8c5]
- Updated dependencies [c00e929]
- Updated dependencies [972c26c]
- Updated dependencies [25b79f0]
- Updated dependencies [f3cda64]
- Updated dependencies [b1b8366]
- Updated dependencies [c00e929]
- Updated dependencies [c00e929]
- Updated dependencies [12c794a]
- Updated dependencies [b1b8366]
- Updated dependencies [b1b8366]
- Updated dependencies [c00e929]
- @shopify/[email protected]
- Patch bump because it depends on @shopify/prettier-plugin-liquid
- Updated dependencies
- Updated dependencies [5479a63]
- Updated dependencies [5479a63]
- @shopify/[email protected]
- @shopify/[email protected]
- 5ba20bd: Fixed bug for
AssetUrlFilters
check - 5ba20bd: Add
ContentForHeaderModification
check - 5ba20bd: Add
AssetSizeCSS
check - 5ba20bd: Add
AssetSizeAppBlockJavascript
check - 5ba20bd: Add
AssetSizeAppBlockCSS
check
- Updated dependencies [5ba20bd]
- Updated dependencies [5ba20bd]
- Updated dependencies [5ba20bd]
- Updated dependencies [5ba20bd]
- Updated dependencies [5ba20bd]
- @shopify/[email protected]
- 2e73166: Fix the
DocsetEntry
types to better match the theme-liquid-docs json files - Updated dependencies [2e73166]
- @shopify/[email protected]
- e67a16d: Breaking: Dependency injected json schema validators
- Updated dependencies [e67a16d]
- @shopify/[email protected]
- 4db7c7e: Add
UnknownFilter
check - a94f23c: Bump prettier-plugin-liquid to v1.2.1
- Updated dependencies [4db7c7e]
- Updated dependencies [a94f23c]
- @shopify/[email protected]
-
b3ed3b9: Add
ValidSchema
check -
d19500f: Add
AppBlockValidTags
check -
8e76424: Add support for
.theme-check.yml
config 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
require
property 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.
-
extends
can be an array -
extends
can refer to node module dependencies -
extends
also accepts "modern" config identifiers:theme-check:all
for all the checks and with default settingstheme-check:recommended
for the recommended checks and settingstheme-check:theme-app-extension
for theme app extensions
Removed features:
include_categories: []
exclude_categories: []
Replaced features:
require: []
this can be used to load unconventional (or private)theme-check-js
checks. Ruby checks are not supported.
Breaking changes:
-
Custom checks written in Ruby won't work Theme Check in TypeScript
-
The
*
(star) glob inignore
configurations does not capture the forward slash (/
) unless at the end of the pattern.Fix: replace
*
by**
.This comes from a difference between how
minimatch
and Ruby handles file globs.
Extra care has been placed to make the transition as smooth as possible.
-
-
3096e53: Add
ValidHTMLTranslation
check -
daf5189: Add
AssetPreload
check -
6fb9db9: Add
ImgLazyLoading
check
- Updated dependencies [b3ed3b9]
- Updated dependencies [d19500f]
- Updated dependencies [8e76424]
- Updated dependencies [3096e53]
- Updated dependencies [daf5189]
- Updated dependencies [6fb9db9]
- @shopify/[email protected]
- 2f0f941: Add
MissingAsset
check - fd3fc3c: Add
AssetUrlFilters
- 5ae97c9: Add
PaginationSize
check - 85cf8f3: Add
CdnPreconnect
- 051aff1: Introduce
ThemeDocset
andThemeSchemas
dependencies to support core checks
- Updated dependencies [2f0f941]
- Updated dependencies [fd3fc3c]
- Updated dependencies [5ae97c9]
- Updated dependencies [85cf8f3]
- Updated dependencies [051aff1]
- @shopify/[email protected]
- Bump prettier-plugin-liquid to v1.1.0
- Updated dependencies
- @shopify/[email protected]
- 502bad8: Add documentation URLs to checks
- Updated dependencies [502bad8]
- @shopify/[email protected]
- 9e99728: Add
UnusedAssign
- f99c896: Add
LiquidHTMLSyntaxError
- e0c131a: Add
JSONSyntaxError
- e0c131a: Breaking:
SourceCode
can takeast: AST[T] | Error
, whereError
is a parsing error - ccd5146: Add
DeprecatedLazysizes
- c715fbe: Add
ImgWidthAndHeight
- 9e99728: Add
RequiredLayoutThemeObject
- edd8925: Add
DeprecateBgsizes
- 9d3d557: Fix RequiredLayoutThemeObject bugs
- Updated dependencies [cad8e17]
- Updated dependencies [9e99728]
- Updated dependencies [f99c896]
- Updated dependencies [e0c131a]
- Updated dependencies [e0c131a]
- Updated dependencies [ccd5146]
- Updated dependencies [c715fbe]
- Updated dependencies [9e99728]
- Updated dependencies [9d3d557]
- Updated dependencies [edd8925]
- @shopify/[email protected]
- 60c92be: Fix unhandled TranslationKeyExists error
- Updated dependencies [60c92be]
- @shopify/[email protected]
-
71e6b44: Add support for fixes and suggestions
New:
context.report
now 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
Fix
objects.One can implement a
FixApplicator
(a async function that takes aSourceCode
andFix
objects) to apply fixes in different contexts.- In Node.js, we'll implement a
FixApplicator
that applies the fixes to the initial file and then save the changes to disk. - In the Language Server, we'll implement
FixApplicator
s that turn theFix
es intoTextEdit
objects.
New: the top level API now offers the
autofix
function, one that takes aFixApplicator
as argument.This
autofix
function applies all the safe changes (and ignores suggestions). -
- Updated dependencies [71e6b44]
- @shopify/[email protected]
- a8cda19: Add TranslationKeyExists to allChecks array
- Updated dependencies [9f8d47f]
- Updated dependencies [a8cda19]
- @shopify/[email protected]
- 9d419ca: Breaking: change dependency
get defaultLocale
togetDefaultLocale(): Promise<string>
- Updated dependencies [9d419ca]
- @shopify/[email protected]
- 72a9330: Breaking: Add
defaultLocale
dependency - 5329963: Breaking: change signature of
getDefaultTranslations
to return aPromise<Translations>
- Updated dependencies [72a9330]
- Updated dependencies [5329963]
- Updated dependencies [72a9330]
- Updated dependencies [5329963]
- @shopify/[email protected]
- Updated dependencies [4c099d5]
- Updated dependencies [4c099d5]
- @shopify/[email protected]
-
f4a2f27: Simplify public API
Breaking changes:
Theme
isSourceCode<S>[]
instead of{ files: Map<string, SourceCode<S>> }
SourceCode
no longer has arelativePath
propertytoSourceCode
no longer takes arelativePath
as argumentConfig
has aroot
property
-
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
context
object and are usable by checks.Those exists as a lean way to get rid of the assumptions that all files are in the
Theme
object. We should be able to go a long way with these.
- Updated dependencies [f4a2f27]
- Updated dependencies [37fc98a]
- @shopify/[email protected]
- d206674: Move toSourceCode to common for use in language-server-common
- Updated dependencies [d206674]
- @shopify/[email protected]
- 233f00f: Initial release