@platformos/platformos-check-common 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +92 -0
- package/dist/AugmentedThemeDocset.d.ts +12 -0
- package/dist/AugmentedThemeDocset.js +126 -0
- package/dist/AugmentedThemeDocset.js.map +1 -0
- package/dist/JSONValidator.d.ts +20 -0
- package/dist/JSONValidator.js +76 -0
- package/dist/JSONValidator.js.map +1 -0
- package/dist/checks/app-block-missing-schema/index.d.ts +2 -0
- package/dist/checks/app-block-missing-schema/index.js +46 -0
- package/dist/checks/app-block-missing-schema/index.js.map +1 -0
- package/dist/checks/app-block-valid-tags/index.d.ts +10 -0
- package/dist/checks/app-block-valid-tags/index.js +49 -0
- package/dist/checks/app-block-valid-tags/index.js.map +1 -0
- package/dist/checks/asset-preload/index.d.ts +2 -0
- package/dist/checks/asset-preload/index.js +56 -0
- package/dist/checks/asset-preload/index.js.map +1 -0
- package/dist/checks/asset-size-app-block-css/index.d.ts +6 -0
- package/dist/checks/asset-size-app-block-css/index.js +64 -0
- package/dist/checks/asset-size-app-block-css/index.js.map +1 -0
- package/dist/checks/asset-size-app-block-javascript/index.d.ts +6 -0
- package/dist/checks/asset-size-app-block-javascript/index.js +64 -0
- package/dist/checks/asset-size-app-block-javascript/index.js.map +1 -0
- package/dist/checks/asset-size-css/index.d.ts +6 -0
- package/dist/checks/asset-size-css/index.js +125 -0
- package/dist/checks/asset-size-css/index.js.map +1 -0
- package/dist/checks/asset-size-javascript/index.d.ts +6 -0
- package/dist/checks/asset-size-javascript/index.js +110 -0
- package/dist/checks/asset-size-javascript/index.js.map +1 -0
- package/dist/checks/block-id-usage/index.d.ts +2 -0
- package/dist/checks/block-id-usage/index.js +60 -0
- package/dist/checks/block-id-usage/index.js.map +1 -0
- package/dist/checks/cdn-preconnect/index.d.ts +2 -0
- package/dist/checks/cdn-preconnect/index.js +44 -0
- package/dist/checks/cdn-preconnect/index.js.map +1 -0
- package/dist/checks/content-for-header-modification/index.d.ts +2 -0
- package/dist/checks/content-for-header-modification/index.js +66 -0
- package/dist/checks/content-for-header-modification/index.js.map +1 -0
- package/dist/checks/deprecate-bgsizes/index.d.ts +2 -0
- package/dist/checks/deprecate-bgsizes/index.js +46 -0
- package/dist/checks/deprecate-bgsizes/index.js.map +1 -0
- package/dist/checks/deprecate-lazysizes/index.d.ts +2 -0
- package/dist/checks/deprecate-lazysizes/index.js +52 -0
- package/dist/checks/deprecate-lazysizes/index.js.map +1 -0
- package/dist/checks/deprecated-filter/fixes.d.ts +8 -0
- package/dist/checks/deprecated-filter/fixes.js +205 -0
- package/dist/checks/deprecated-filter/fixes.js.map +1 -0
- package/dist/checks/deprecated-filter/index.d.ts +2 -0
- package/dist/checks/deprecated-filter/index.js +93 -0
- package/dist/checks/deprecated-filter/index.js.map +1 -0
- package/dist/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.d.ts +1 -0
- package/dist/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.js +1347 -0
- package/dist/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.js.map +1 -0
- package/dist/checks/deprecated-fonts-on-sections-and-blocks/index.d.ts +2 -0
- package/dist/checks/deprecated-fonts-on-sections-and-blocks/index.js +156 -0
- package/dist/checks/deprecated-fonts-on-sections-and-blocks/index.js.map +1 -0
- package/dist/checks/deprecated-fonts-on-settings-schema/index.d.ts +2 -0
- package/dist/checks/deprecated-fonts-on-settings-schema/index.js +56 -0
- package/dist/checks/deprecated-fonts-on-settings-schema/index.js.map +1 -0
- package/dist/checks/deprecated-tag/index.d.ts +2 -0
- package/dist/checks/deprecated-tag/index.js +48 -0
- package/dist/checks/deprecated-tag/index.js.map +1 -0
- package/dist/checks/duplicate-content-for-arguments/index.d.ts +2 -0
- package/dist/checks/duplicate-content-for-arguments/index.js +39 -0
- package/dist/checks/duplicate-content-for-arguments/index.js.map +1 -0
- package/dist/checks/duplicate-function-arguments/index.d.ts +2 -0
- package/dist/checks/duplicate-function-arguments/index.js +40 -0
- package/dist/checks/duplicate-function-arguments/index.js.map +1 -0
- package/dist/checks/duplicate-render-partial-arguments/index.d.ts +2 -0
- package/dist/checks/duplicate-render-partial-arguments/index.js +43 -0
- package/dist/checks/duplicate-render-partial-arguments/index.js.map +1 -0
- package/dist/checks/empty-block-content/index.d.ts +2 -0
- package/dist/checks/empty-block-content/index.js +60 -0
- package/dist/checks/empty-block-content/index.js.map +1 -0
- package/dist/checks/graphql/index.d.ts +2 -0
- package/dist/checks/graphql/index.js +58 -0
- package/dist/checks/graphql/index.js.map +1 -0
- package/dist/checks/graphql-variables/index.d.ts +8 -0
- package/dist/checks/graphql-variables/index.js +91 -0
- package/dist/checks/graphql-variables/index.js.map +1 -0
- package/dist/checks/hardcoded-routes/index.d.ts +2 -0
- package/dist/checks/hardcoded-routes/index.js +89 -0
- package/dist/checks/hardcoded-routes/index.js.map +1 -0
- package/dist/checks/img-width-and-height/index.d.ts +2 -0
- package/dist/checks/img-width-and-height/index.js +46 -0
- package/dist/checks/img-width-and-height/index.js.map +1 -0
- package/dist/checks/index.d.ts +8 -0
- package/dist/checks/index.js +154 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/invalid-hash-assign-target/index.d.ts +2 -0
- package/dist/checks/invalid-hash-assign-target/index.js +252 -0
- package/dist/checks/invalid-hash-assign-target/index.js.map +1 -0
- package/dist/checks/json-missing-block/index.d.ts +2 -0
- package/dist/checks/json-missing-block/index.js +48 -0
- package/dist/checks/json-missing-block/index.js.map +1 -0
- package/dist/checks/json-missing-block/missing-block-utils.d.ts +4 -0
- package/dist/checks/json-missing-block/missing-block-utils.js +87 -0
- package/dist/checks/json-missing-block/missing-block-utils.js.map +1 -0
- package/dist/checks/json-syntax-error/index.d.ts +2 -0
- package/dist/checks/json-syntax-error/index.js +92 -0
- package/dist/checks/json-syntax-error/index.js.map +1 -0
- package/dist/checks/liquid-free-settings/index.d.ts +2 -0
- package/dist/checks/liquid-free-settings/index.js +64 -0
- package/dist/checks/liquid-free-settings/index.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidBooleanExpressions.d.ts +3 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidBooleanExpressions.js +23 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidBooleanExpressions.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNode.d.ts +3 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNode.js +136 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNode.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNodeParenthesis.d.ts +3 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNodeParenthesis.js +26 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNodeParenthesis.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidEchoValue.d.ts +3 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidEchoValue.js +59 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidEchoValue.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidFilterName.d.ts +3 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidFilterName.js +66 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidFilterName.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.d.ts +3 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.js +73 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopRange.d.ts +4 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopRange.js +54 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopRange.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidPipeSyntax.d.ts +3 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidPipeSyntax.js +71 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidPipeSyntax.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/MultipleAssignValues.d.ts +3 -0
- package/dist/checks/liquid-html-syntax-error/checks/MultipleAssignValues.js +69 -0
- package/dist/checks/liquid-html-syntax-error/checks/MultipleAssignValues.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/utils.d.ts +15 -0
- package/dist/checks/liquid-html-syntax-error/checks/utils.js +58 -0
- package/dist/checks/liquid-html-syntax-error/checks/utils.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/index.d.ts +2 -0
- package/dist/checks/liquid-html-syntax-error/index.js +131 -0
- package/dist/checks/liquid-html-syntax-error/index.js.map +1 -0
- package/dist/checks/matching-translations/index.d.ts +2 -0
- package/dist/checks/matching-translations/index.js +146 -0
- package/dist/checks/matching-translations/index.js.map +1 -0
- package/dist/checks/metadata-params/index.d.ts +2 -0
- package/dist/checks/metadata-params/index.js +96 -0
- package/dist/checks/metadata-params/index.js.map +1 -0
- package/dist/checks/missing-asset/index.d.ts +2 -0
- package/dist/checks/missing-asset/index.js +44 -0
- package/dist/checks/missing-asset/index.js.map +1 -0
- package/dist/checks/missing-content-for-arguments/index.d.ts +2 -0
- package/dist/checks/missing-content-for-arguments/index.js +36 -0
- package/dist/checks/missing-content-for-arguments/index.js.map +1 -0
- package/dist/checks/missing-template/index.d.ts +6 -0
- package/dist/checks/missing-template/index.js +70 -0
- package/dist/checks/missing-template/index.js.map +1 -0
- package/dist/checks/orphaned-partial/index.d.ts +2 -0
- package/dist/checks/orphaned-partial/index.js +42 -0
- package/dist/checks/orphaned-partial/index.js.map +1 -0
- package/dist/checks/pagination-size/index.d.ts +7 -0
- package/dist/checks/pagination-size/index.js +89 -0
- package/dist/checks/pagination-size/index.js.map +1 -0
- package/dist/checks/parser-blocking-script/index.d.ts +2 -0
- package/dist/checks/parser-blocking-script/index.js +81 -0
- package/dist/checks/parser-blocking-script/index.js.map +1 -0
- package/dist/checks/parser-blocking-script/suggestions.d.ts +4 -0
- package/dist/checks/parser-blocking-script/suggestions.js +22 -0
- package/dist/checks/parser-blocking-script/suggestions.js.map +1 -0
- package/dist/checks/remote-asset/index.d.ts +6 -0
- package/dist/checks/remote-asset/index.js +189 -0
- package/dist/checks/remote-asset/index.js.map +1 -0
- package/dist/checks/reserved-doc-param-names/index.d.ts +2 -0
- package/dist/checks/reserved-doc-param-names/index.js +46 -0
- package/dist/checks/reserved-doc-param-names/index.js.map +1 -0
- package/dist/checks/schema-presets-block-order/index.d.ts +2 -0
- package/dist/checks/schema-presets-block-order/index.js +108 -0
- package/dist/checks/schema-presets-block-order/index.js.map +1 -0
- package/dist/checks/schema-presets-static-blocks/index.d.ts +2 -0
- package/dist/checks/schema-presets-static-blocks/index.js +109 -0
- package/dist/checks/schema-presets-static-blocks/index.js.map +1 -0
- package/dist/checks/static-stylesheet-and-javascript-tags/index.d.ts +2 -0
- package/dist/checks/static-stylesheet-and-javascript-tags/index.js +42 -0
- package/dist/checks/static-stylesheet-and-javascript-tags/index.js.map +1 -0
- package/dist/checks/translation-key-exists/index.d.ts +2 -0
- package/dist/checks/translation-key-exists/index.js +67 -0
- package/dist/checks/translation-key-exists/index.js.map +1 -0
- package/dist/checks/unclosed-html-element/index.d.ts +2 -0
- package/dist/checks/unclosed-html-element/index.js +252 -0
- package/dist/checks/unclosed-html-element/index.js.map +1 -0
- package/dist/checks/undefined-object/index.d.ts +2 -0
- package/dist/checks/undefined-object/index.js +255 -0
- package/dist/checks/undefined-object/index.js.map +1 -0
- package/dist/checks/unique-doc-param-names/index.d.ts +2 -0
- package/dist/checks/unique-doc-param-names/index.js +37 -0
- package/dist/checks/unique-doc-param-names/index.js.map +1 -0
- package/dist/checks/unique-settings-id/index.d.ts +2 -0
- package/dist/checks/unique-settings-id/index.js +69 -0
- package/dist/checks/unique-settings-id/index.js.map +1 -0
- package/dist/checks/unique-settings-id/test-data.d.ts +2 -0
- package/dist/checks/unique-settings-id/test-data.js +1194 -0
- package/dist/checks/unique-settings-id/test-data.js.map +1 -0
- package/dist/checks/unique-static-block-id/index.d.ts +2 -0
- package/dist/checks/unique-static-block-id/index.js +56 -0
- package/dist/checks/unique-static-block-id/index.js.map +1 -0
- package/dist/checks/unknown-filter/index.d.ts +2 -0
- package/dist/checks/unknown-filter/index.js +38 -0
- package/dist/checks/unknown-filter/index.js.map +1 -0
- package/dist/checks/unknown-property/index.d.ts +2 -0
- package/dist/checks/unknown-property/index.js +361 -0
- package/dist/checks/unknown-property/index.js.map +1 -0
- package/dist/checks/unknown-property/property-shape.d.ts +41 -0
- package/dist/checks/unknown-property/property-shape.js +267 -0
- package/dist/checks/unknown-property/property-shape.js.map +1 -0
- package/dist/checks/unrecognized-content-for-arguments/index.d.ts +2 -0
- package/dist/checks/unrecognized-content-for-arguments/index.js +43 -0
- package/dist/checks/unrecognized-content-for-arguments/index.js.map +1 -0
- package/dist/checks/unrecognized-render-partial-arguments/index.d.ts +2 -0
- package/dist/checks/unrecognized-render-partial-arguments/index.js +59 -0
- package/dist/checks/unrecognized-render-partial-arguments/index.js.map +1 -0
- package/dist/checks/unused-assign/index.d.ts +2 -0
- package/dist/checks/unused-assign/index.js +77 -0
- package/dist/checks/unused-assign/index.js.map +1 -0
- package/dist/checks/unused-doc-param/index.d.ts +2 -0
- package/dist/checks/unused-doc-param/index.js +55 -0
- package/dist/checks/unused-doc-param/index.js.map +1 -0
- package/dist/checks/utils.d.ts +22 -0
- package/dist/checks/utils.js +74 -0
- package/dist/checks/utils.js.map +1 -0
- package/dist/checks/valid-block-target/index.d.ts +2 -0
- package/dist/checks/valid-block-target/index.js +99 -0
- package/dist/checks/valid-block-target/index.js.map +1 -0
- package/dist/checks/valid-content-for-argument-types/index.d.ts +2 -0
- package/dist/checks/valid-content-for-argument-types/index.js +35 -0
- package/dist/checks/valid-content-for-argument-types/index.js.map +1 -0
- package/dist/checks/valid-content-for-arguments/index.d.ts +2 -0
- package/dist/checks/valid-content-for-arguments/index.js +82 -0
- package/dist/checks/valid-content-for-arguments/index.js.map +1 -0
- package/dist/checks/valid-doc-param-types/index.d.ts +2 -0
- package/dist/checks/valid-doc-param-types/index.js +61 -0
- package/dist/checks/valid-doc-param-types/index.js.map +1 -0
- package/dist/checks/valid-html-translation/index.d.ts +2 -0
- package/dist/checks/valid-html-translation/index.js +46 -0
- package/dist/checks/valid-html-translation/index.js.map +1 -0
- package/dist/checks/valid-json/index.d.ts +2 -0
- package/dist/checks/valid-json/index.js +36 -0
- package/dist/checks/valid-json/index.js.map +1 -0
- package/dist/checks/valid-local-blocks/index.d.ts +2 -0
- package/dist/checks/valid-local-blocks/index.js +66 -0
- package/dist/checks/valid-local-blocks/index.js.map +1 -0
- package/dist/checks/valid-local-blocks/valid-block-utils.d.ts +13 -0
- package/dist/checks/valid-local-blocks/valid-block-utils.js +74 -0
- package/dist/checks/valid-local-blocks/valid-block-utils.js.map +1 -0
- package/dist/checks/valid-render-partial-argument-types/index.d.ts +2 -0
- package/dist/checks/valid-render-partial-argument-types/index.js +66 -0
- package/dist/checks/valid-render-partial-argument-types/index.js.map +1 -0
- package/dist/checks/valid-schema/index.d.ts +2 -0
- package/dist/checks/valid-schema/index.js +40 -0
- package/dist/checks/valid-schema/index.js.map +1 -0
- package/dist/checks/valid-schema-name/index.d.ts +2 -0
- package/dist/checks/valid-schema-name/index.js +74 -0
- package/dist/checks/valid-schema-name/index.js.map +1 -0
- package/dist/checks/valid-settings-key/index.d.ts +2 -0
- package/dist/checks/valid-settings-key/index.js +90 -0
- package/dist/checks/valid-settings-key/index.js.map +1 -0
- package/dist/checks/valid-static-block-type/index.d.ts +2 -0
- package/dist/checks/valid-static-block-type/index.js +54 -0
- package/dist/checks/valid-static-block-type/index.js.map +1 -0
- package/dist/checks/valid-visible-if/index.d.ts +3 -0
- package/dist/checks/valid-visible-if/index.js +146 -0
- package/dist/checks/valid-visible-if/index.js.map +1 -0
- package/dist/checks/valid-visible-if/visible-if-utils.d.ts +14 -0
- package/dist/checks/valid-visible-if/visible-if-utils.js +125 -0
- package/dist/checks/valid-visible-if/visible-if-utils.js.map +1 -0
- package/dist/checks/variable-name/index.d.ts +6 -0
- package/dist/checks/variable-name/index.js +93 -0
- package/dist/checks/variable-name/index.js.map +1 -0
- package/dist/context-utils.d.ts +15 -0
- package/dist/context-utils.js +185 -0
- package/dist/context-utils.js.map +1 -0
- package/dist/create-safe-check.d.ts +2 -0
- package/dist/create-safe-check.js +15 -0
- package/dist/create-safe-check.js.map +1 -0
- package/dist/disabled-checks/index.d.ts +7 -0
- package/dist/disabled-checks/index.js +145 -0
- package/dist/disabled-checks/index.js.map +1 -0
- package/dist/disabled-checks/test-checks.d.ts +3 -0
- package/dist/disabled-checks/test-checks.js +59 -0
- package/dist/disabled-checks/test-checks.js.map +1 -0
- package/dist/doc-generator/DocBlockGenerator.d.ts +16 -0
- package/dist/doc-generator/DocBlockGenerator.js +464 -0
- package/dist/doc-generator/DocBlockGenerator.js.map +1 -0
- package/dist/doc-generator/index.d.ts +1 -0
- package/dist/doc-generator/index.js +6 -0
- package/dist/doc-generator/index.js.map +1 -0
- package/dist/find-root.d.ts +18 -0
- package/dist/find-root.js +81 -0
- package/dist/find-root.js.map +1 -0
- package/dist/fixes/apply-fix-to-string.d.ts +2 -0
- package/dist/fixes/apply-fix-to-string.js +50 -0
- package/dist/fixes/apply-fix-to-string.js.map +1 -0
- package/dist/fixes/autofix.d.ts +9 -0
- package/dist/fixes/autofix.js +30 -0
- package/dist/fixes/autofix.js.map +1 -0
- package/dist/fixes/corrector.d.ts +0 -0
- package/dist/fixes/corrector.js +2 -0
- package/dist/fixes/corrector.js.map +1 -0
- package/dist/fixes/correctors/base-corrector.d.ts +4 -0
- package/dist/fixes/correctors/base-corrector.js +3 -0
- package/dist/fixes/correctors/base-corrector.js.map +1 -0
- package/dist/fixes/correctors/graphql-corrector.d.ts +56 -0
- package/dist/fixes/correctors/graphql-corrector.js +78 -0
- package/dist/fixes/correctors/graphql-corrector.js.map +1 -0
- package/dist/fixes/correctors/index.d.ts +6 -0
- package/dist/fixes/correctors/index.js +30 -0
- package/dist/fixes/correctors/index.js.map +1 -0
- package/dist/fixes/correctors/json-corrector.d.ts +39 -0
- package/dist/fixes/correctors/json-corrector.js +86 -0
- package/dist/fixes/correctors/json-corrector.js.map +1 -0
- package/dist/fixes/correctors/string-corrector.d.ts +56 -0
- package/dist/fixes/correctors/string-corrector.js +78 -0
- package/dist/fixes/correctors/string-corrector.js.map +1 -0
- package/dist/fixes/index.d.ts +4 -0
- package/dist/fixes/index.js +14 -0
- package/dist/fixes/index.js.map +1 -0
- package/dist/fixes/utils.d.ts +2 -0
- package/dist/fixes/utils.js +9 -0
- package/dist/fixes/utils.js.map +1 -0
- package/dist/ignore.d.ts +2 -0
- package/dist/ignore.js +20 -0
- package/dist/ignore.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +211 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +17 -0
- package/dist/json.js +79 -0
- package/dist/json.js.map +1 -0
- package/dist/jsonc/parse.d.ts +25 -0
- package/dist/jsonc/parse.js +101 -0
- package/dist/jsonc/parse.js.map +1 -0
- package/dist/jsonc/types.d.ts +37 -0
- package/dist/jsonc/types.js +3 -0
- package/dist/jsonc/types.js.map +1 -0
- package/dist/liquid-doc/arguments.d.ts +36 -0
- package/dist/liquid-doc/arguments.js +239 -0
- package/dist/liquid-doc/arguments.js.map +1 -0
- package/dist/liquid-doc/liquidDoc.d.ts +33 -0
- package/dist/liquid-doc/liquidDoc.js +94 -0
- package/dist/liquid-doc/liquidDoc.js.map +1 -0
- package/dist/liquid-doc/utils.d.ts +49 -0
- package/dist/liquid-doc/utils.js +119 -0
- package/dist/liquid-doc/utils.js.map +1 -0
- package/dist/path.d.ts +10 -0
- package/dist/path.js +47 -0
- package/dist/path.js.map +1 -0
- package/dist/tags/content-for.d.ts +3 -0
- package/dist/tags/content-for.js +27 -0
- package/dist/tags/content-for.js.map +1 -0
- package/dist/test/MockFileSystem.d.ts +12 -0
- package/dist/test/MockFileSystem.js +109 -0
- package/dist/test/MockFileSystem.js.map +1 -0
- package/dist/test/MockTheme.d.ts +16 -0
- package/dist/test/MockTheme.js +16 -0
- package/dist/test/MockTheme.js.map +1 -0
- package/dist/test/chai-offer-fix-assertion.d.ts +22 -0
- package/dist/test/chai-offer-fix-assertion.js +20 -0
- package/dist/test/chai-offer-fix-assertion.js.map +1 -0
- package/dist/test/chai-suggest-assertion.d.ts +22 -0
- package/dist/test/chai-suggest-assertion.js +29 -0
- package/dist/test/chai-suggest-assertion.js.map +1 -0
- package/dist/test/contain-offense.d.ts +12 -0
- package/dist/test/contain-offense.js +36 -0
- package/dist/test/contain-offense.js.map +1 -0
- package/dist/test/index.d.ts +3 -0
- package/dist/test/index.js +20 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test/test-helper.d.ts +14 -0
- package/dist/test/test-helper.js +289 -0
- package/dist/test/test-helper.js.map +1 -0
- package/dist/test/test-setup.d.ts +9 -0
- package/dist/test/test-setup.js +26 -0
- package/dist/test/test-setup.js.map +1 -0
- package/dist/to-schema.d.ts +16 -0
- package/dist/to-schema.js +218 -0
- package/dist/to-schema.js.map +1 -0
- package/dist/to-source-code.d.ts +5 -0
- package/dist/to-source-code.js +103 -0
- package/dist/to-source-code.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/schema-prop-factory.d.ts +76 -0
- package/dist/types/schema-prop-factory.js +84 -0
- package/dist/types/schema-prop-factory.js.map +1 -0
- package/dist/types/schemas/index.d.ts +5 -0
- package/dist/types/schemas/index.js +6 -0
- package/dist/types/schemas/index.js.map +1 -0
- package/dist/types/schemas/preset.d.ts +38 -0
- package/dist/types/schemas/preset.js +3 -0
- package/dist/types/schemas/preset.js.map +1 -0
- package/dist/types/schemas/section.d.ts +49 -0
- package/dist/types/schemas/section.js +3 -0
- package/dist/types/schemas/section.js.map +1 -0
- package/dist/types/schemas/setting.d.ts +216 -0
- package/dist/types/schemas/setting.js +3 -0
- package/dist/types/schemas/setting.js.map +1 -0
- package/dist/types/schemas/template.d.ts +30 -0
- package/dist/types/schemas/template.js +3 -0
- package/dist/types/schemas/template.js.map +1 -0
- package/dist/types/schemas/theme-block.d.ts +24 -0
- package/dist/types/schemas/theme-block.js +3 -0
- package/dist/types/schemas/theme-block.js.map +1 -0
- package/dist/types/theme-liquid-docs.d.ts +131 -0
- package/dist/types/theme-liquid-docs.js +3 -0
- package/dist/types/theme-liquid-docs.js.map +1 -0
- package/dist/types/theme-schemas.d.ts +70 -0
- package/dist/types/theme-schemas.js +25 -0
- package/dist/types/theme-schemas.js.map +1 -0
- package/dist/types.d.ts +469 -0
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/array.d.ts +5 -0
- package/dist/utils/array.js +28 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/block.d.ts +22 -0
- package/dist/utils/block.js +179 -0
- package/dist/utils/block.js.map +1 -0
- package/dist/utils/error.d.ts +2 -0
- package/dist/utils/error.js +44 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/file-utils.d.ts +6 -0
- package/dist/utils/file-utils.js +46 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.js +25 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/indexBy.d.ts +5 -0
- package/dist/utils/indexBy.js +15 -0
- package/dist/utils/indexBy.js.map +1 -0
- package/dist/utils/markup.d.ts +2 -0
- package/dist/utils/markup.js +10 -0
- package/dist/utils/markup.js.map +1 -0
- package/dist/utils/memo.d.ts +34 -0
- package/dist/utils/memo.js +61 -0
- package/dist/utils/memo.js.map +1 -0
- package/dist/utils/object.d.ts +1 -0
- package/dist/utils/object.js +7 -0
- package/dist/utils/object.js.map +1 -0
- package/dist/utils/position.d.ts +3 -0
- package/dist/utils/position.js +20 -0
- package/dist/utils/position.js.map +1 -0
- package/dist/utils/types.d.ts +52 -0
- package/dist/utils/types.js +23 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/visitor.d.ts +24 -0
- package/dist/visitor.js +119 -0
- package/dist/visitor.js.map +1 -0
- package/dist/visitors/index.d.ts +2 -0
- package/dist/visitors/index.js +8 -0
- package/dist/visitors/index.js.map +1 -0
- package/dist/visitors/json.d.ts +2 -0
- package/dist/visitors/json.js +39 -0
- package/dist/visitors/json.js.map +1 -0
- package/dist/visitors/liquid.d.ts +2 -0
- package/dist/visitors/liquid.js +39 -0
- package/dist/visitors/liquid.js.map +1 -0
- package/package.json +45 -0
- package/src/AugmentedThemeDocset.spec.ts +148 -0
- package/src/AugmentedThemeDocset.ts +148 -0
- package/src/JSONValidator.ts +82 -0
- package/src/checks/app-block-missing-schema/index.spec.ts +121 -0
- package/src/checks/app-block-missing-schema/index.ts +46 -0
- package/src/checks/app-block-valid-tags/index.spec.ts +96 -0
- package/src/checks/app-block-valid-tags/index.ts +54 -0
- package/src/checks/asset-preload/index.spec.ts +78 -0
- package/src/checks/asset-preload/index.ts +65 -0
- package/src/checks/asset-size-app-block-css/index.spec.ts +88 -0
- package/src/checks/asset-size-app-block-css/index.ts +78 -0
- package/src/checks/asset-size-app-block-javascript/index.spec.ts +66 -0
- package/src/checks/asset-size-app-block-javascript/index.ts +78 -0
- package/src/checks/asset-size-css/index.spec.ts +166 -0
- package/src/checks/asset-size-css/index.ts +160 -0
- package/src/checks/asset-size-javascript/index.spec.ts +184 -0
- package/src/checks/asset-size-javascript/index.ts +144 -0
- package/src/checks/block-id-usage/index.spec.ts +76 -0
- package/src/checks/block-id-usage/index.ts +72 -0
- package/src/checks/cdn-preconnect/index.spec.ts +40 -0
- package/src/checks/cdn-preconnect/index.ts +43 -0
- package/src/checks/content-for-header-modification/index.spec.ts +65 -0
- package/src/checks/content-for-header-modification/index.ts +72 -0
- package/src/checks/deprecate-bgsizes/index.spec.ts +41 -0
- package/src/checks/deprecate-bgsizes/index.ts +49 -0
- package/src/checks/deprecate-lazysizes/index.spec.ts +26 -0
- package/src/checks/deprecate-lazysizes/index.ts +58 -0
- package/src/checks/deprecated-filter/fixes.ts +264 -0
- package/src/checks/deprecated-filter/index.spec.ts +274 -0
- package/src/checks/deprecated-filter/index.ts +113 -0
- package/src/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.ts +1343 -0
- package/src/checks/deprecated-fonts-on-sections-and-blocks/index.spec.ts +613 -0
- package/src/checks/deprecated-fonts-on-sections-and-blocks/index.ts +284 -0
- package/src/checks/deprecated-fonts-on-settings-schema/index.spec.ts +102 -0
- package/src/checks/deprecated-fonts-on-settings-schema/index.ts +66 -0
- package/src/checks/deprecated-tag/index.spec.ts +68 -0
- package/src/checks/deprecated-tag/index.ts +46 -0
- package/src/checks/duplicate-content-for-arguments/index.spec.ts +98 -0
- package/src/checks/duplicate-content-for-arguments/index.ts +43 -0
- package/src/checks/duplicate-function-arguments/index.spec.ts +98 -0
- package/src/checks/duplicate-function-arguments/index.ts +44 -0
- package/src/checks/duplicate-render-partial-arguments/index.spec.ts +120 -0
- package/src/checks/duplicate-render-partial-arguments/index.ts +48 -0
- package/src/checks/empty-block-content/index.spec.ts +117 -0
- package/src/checks/empty-block-content/index.ts +60 -0
- package/src/checks/graphql/index.ts +64 -0
- package/src/checks/graphql-variables/index.ts +113 -0
- package/src/checks/hardcoded-routes/index.spec.ts +58 -0
- package/src/checks/hardcoded-routes/index.ts +100 -0
- package/src/checks/img-width-and-height/index.spec.ts +79 -0
- package/src/checks/img-width-and-height/index.ts +52 -0
- package/src/checks/index.ts +160 -0
- package/src/checks/invalid-hash-assign-target/index.spec.ts +176 -0
- package/src/checks/invalid-hash-assign-target/index.ts +306 -0
- package/src/checks/json-missing-block/index.spec.ts +435 -0
- package/src/checks/json-missing-block/index.ts +56 -0
- package/src/checks/json-missing-block/missing-block-utils.ts +147 -0
- package/src/checks/json-syntax-error/index.spec.ts +64 -0
- package/src/checks/json-syntax-error/index.ts +92 -0
- package/src/checks/liquid-free-settings/index.spec.ts +180 -0
- package/src/checks/liquid-free-settings/index.ts +79 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidBooleanExpression.spec.ts +43 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidBooleanExpressions.ts +29 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidConditionalNode.spec.ts +385 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidConditionalNode.ts +165 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidConditionalNodeParenthesis.spec.ts +52 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidConditionalNodeParenthesis.ts +39 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidEchoValue.spec.ts +108 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidEchoValue.ts +74 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidFilterName.spec.ts +223 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidFilterName.ts +92 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.spec.ts +145 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.ts +116 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidLoopRange.spec.ts +84 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidLoopRange.ts +79 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidPipeSyntax.spec.ts +184 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidPipeSyntax.ts +91 -0
- package/src/checks/liquid-html-syntax-error/checks/MultipleAssignValues.spec.ts +82 -0
- package/src/checks/liquid-html-syntax-error/checks/MultipleAssignValues.ts +86 -0
- package/src/checks/liquid-html-syntax-error/checks/utils.spec.ts +82 -0
- package/src/checks/liquid-html-syntax-error/checks/utils.ts +66 -0
- package/src/checks/liquid-html-syntax-error/index.spec.ts +129 -0
- package/src/checks/liquid-html-syntax-error/index.ts +152 -0
- package/src/checks/matching-translations/index.spec.ts +400 -0
- package/src/checks/matching-translations/index.ts +175 -0
- package/src/checks/metadata-params/index.spec.ts +103 -0
- package/src/checks/metadata-params/index.ts +119 -0
- package/src/checks/missing-asset/index.spec.ts +59 -0
- package/src/checks/missing-asset/index.ts +48 -0
- package/src/checks/missing-content-for-arguments/index.spec.ts +144 -0
- package/src/checks/missing-content-for-arguments/index.ts +46 -0
- package/src/checks/missing-template/index.spec.ts +61 -0
- package/src/checks/missing-template/index.ts +101 -0
- package/src/checks/orphaned-partial/index.spec.ts +58 -0
- package/src/checks/orphaned-partial/index.ts +43 -0
- package/src/checks/pagination-size/index.spec.ts +158 -0
- package/src/checks/pagination-size/index.ts +104 -0
- package/src/checks/parser-blocking-script/index.spec.ts +225 -0
- package/src/checks/parser-blocking-script/index.ts +91 -0
- package/src/checks/parser-blocking-script/suggestions.ts +42 -0
- package/src/checks/remote-asset/index.spec.ts +280 -0
- package/src/checks/remote-asset/index.ts +238 -0
- package/src/checks/reserved-doc-param-names/index.spec.ts +62 -0
- package/src/checks/reserved-doc-param-names/index.ts +57 -0
- package/src/checks/schema-presets-block-order/index.spec.ts +344 -0
- package/src/checks/schema-presets-block-order/index.ts +154 -0
- package/src/checks/schema-presets-static-blocks/index.spec.ts +145 -0
- package/src/checks/schema-presets-static-blocks/index.ts +126 -0
- package/src/checks/static-stylesheet-and-javascript-tags/index.spec.ts +257 -0
- package/src/checks/static-stylesheet-and-javascript-tags/index.ts +48 -0
- package/src/checks/translation-key-exists/index.spec.ts +44 -0
- package/src/checks/translation-key-exists/index.ts +78 -0
- package/src/checks/unclosed-html-element/index.spec.ts +260 -0
- package/src/checks/unclosed-html-element/index.ts +296 -0
- package/src/checks/undefined-object/index.spec.ts +519 -0
- package/src/checks/undefined-object/index.ts +336 -0
- package/src/checks/unique-doc-param-names/index.spec.ts +35 -0
- package/src/checks/unique-doc-param-names/index.ts +39 -0
- package/src/checks/unique-settings-id/index.spec.ts +24 -0
- package/src/checks/unique-settings-id/index.ts +84 -0
- package/src/checks/unique-settings-id/test-data.ts +1191 -0
- package/src/checks/unique-static-block-id/index.spec.ts +55 -0
- package/src/checks/unique-static-block-id/index.ts +60 -0
- package/src/checks/unknown-filter/index.spec.ts +59 -0
- package/src/checks/unknown-filter/index.ts +38 -0
- package/src/checks/unknown-property/index.spec.ts +234 -0
- package/src/checks/unknown-property/index.ts +468 -0
- package/src/checks/unknown-property/property-shape.ts +315 -0
- package/src/checks/unrecognized-content-for-arguments/index.spec.ts +145 -0
- package/src/checks/unrecognized-content-for-arguments/index.ts +55 -0
- package/src/checks/unrecognized-render-partial-arguments/index.spec.ts +184 -0
- package/src/checks/unrecognized-render-partial-arguments/index.ts +76 -0
- package/src/checks/unused-assign/index.spec.ts +160 -0
- package/src/checks/unused-assign/index.ts +87 -0
- package/src/checks/unused-doc-param/index.spec.ts +89 -0
- package/src/checks/unused-doc-param/index.ts +59 -0
- package/src/checks/utils.ts +117 -0
- package/src/checks/valid-block-target/index.spec.ts +1396 -0
- package/src/checks/valid-block-target/index.ts +142 -0
- package/src/checks/valid-content-for-argument-types/index.spec.ts +382 -0
- package/src/checks/valid-content-for-argument-types/index.ts +42 -0
- package/src/checks/valid-content-for-arguments/index.spec.ts +107 -0
- package/src/checks/valid-content-for-arguments/index.ts +98 -0
- package/src/checks/valid-doc-param-types/index.spec.ts +75 -0
- package/src/checks/valid-doc-param-types/index.ts +71 -0
- package/src/checks/valid-html-translation/index.spec.ts +74 -0
- package/src/checks/valid-html-translation/index.ts +45 -0
- package/src/checks/valid-json/index.spec.ts +102 -0
- package/src/checks/valid-json/index.ts +34 -0
- package/src/checks/valid-local-blocks/index.spec.ts +286 -0
- package/src/checks/valid-local-blocks/index.ts +100 -0
- package/src/checks/valid-local-blocks/valid-block-utils.ts +97 -0
- package/src/checks/valid-render-partial-argument-types/index.spec.ts +468 -0
- package/src/checks/valid-render-partial-argument-types/index.ts +89 -0
- package/src/checks/valid-schema/index.spec.ts +174 -0
- package/src/checks/valid-schema/index.ts +41 -0
- package/src/checks/valid-schema-name/index.spec.ts +112 -0
- package/src/checks/valid-schema-name/index.ts +75 -0
- package/src/checks/valid-settings-key/index.spec.ts +321 -0
- package/src/checks/valid-settings-key/index.ts +144 -0
- package/src/checks/valid-static-block-type/index.spec.ts +38 -0
- package/src/checks/valid-static-block-type/index.ts +58 -0
- package/src/checks/valid-visible-if/index.spec.ts +619 -0
- package/src/checks/valid-visible-if/index.ts +184 -0
- package/src/checks/valid-visible-if/visible-if-utils.ts +158 -0
- package/src/checks/variable-name/index.spec.ts +62 -0
- package/src/checks/variable-name/index.ts +115 -0
- package/src/context-utils.spec.ts +103 -0
- package/src/context-utils.ts +220 -0
- package/src/create-safe-check.ts +13 -0
- package/src/disabled-checks/index.spec.ts +262 -0
- package/src/disabled-checks/index.ts +189 -0
- package/src/disabled-checks/test-checks.ts +60 -0
- package/src/find-root.ts +60 -0
- package/src/fixes/apply-fix-to-string.spec.ts +52 -0
- package/src/fixes/apply-fix-to-string.ts +59 -0
- package/src/fixes/autofix.spec.ts +85 -0
- package/src/fixes/autofix.ts +41 -0
- package/src/fixes/corrector.ts +0 -0
- package/src/fixes/correctors/base-corrector.ts +5 -0
- package/src/fixes/correctors/graphql-corrector.ts +78 -0
- package/src/fixes/correctors/index.ts +29 -0
- package/src/fixes/correctors/json-corrector.spec.ts +111 -0
- package/src/fixes/correctors/json-corrector.ts +106 -0
- package/src/fixes/correctors/string-corrector.ts +78 -0
- package/src/fixes/index.ts +4 -0
- package/src/fixes/utils.ts +6 -0
- package/src/ignore.spec.ts +202 -0
- package/src/ignore.ts +23 -0
- package/src/index.spec.ts +8 -0
- package/src/index.ts +234 -0
- package/src/json.spec.ts +140 -0
- package/src/json.ts +81 -0
- package/src/jsonc/parse.spec.ts +118 -0
- package/src/jsonc/parse.ts +121 -0
- package/src/jsonc/types.ts +47 -0
- package/src/liquid-doc/arguments.spec.ts +146 -0
- package/src/liquid-doc/arguments.ts +315 -0
- package/src/liquid-doc/liquidDoc.spec.ts +296 -0
- package/src/liquid-doc/liquidDoc.ts +147 -0
- package/src/liquid-doc/utils.spec.ts +23 -0
- package/src/liquid-doc/utils.ts +125 -0
- package/src/path.ts +45 -0
- package/src/tags/content-for.ts +25 -0
- package/src/test/MockFileSystem.spec.ts +71 -0
- package/src/test/MockFileSystem.ts +87 -0
- package/src/test/MockTheme.ts +17 -0
- package/src/test/chai-offer-fix-assertion.spec.ts +53 -0
- package/src/test/chai-offer-fix-assertion.ts +45 -0
- package/src/test/chai-suggest-assertion.spec.ts +53 -0
- package/src/test/chai-suggest-assertion.ts +62 -0
- package/src/test/contain-offense.spec.ts +74 -0
- package/src/test/contain-offense.ts +54 -0
- package/src/test/index.ts +3 -0
- package/src/test/test-helper.ts +327 -0
- package/src/test/test-setup.ts +36 -0
- package/src/to-schema.ts +231 -0
- package/src/to-source-code.ts +75 -0
- package/src/types/schema-prop-factory.ts +112 -0
- package/src/types/schemas/index.ts +5 -0
- package/src/types/schemas/preset.ts +52 -0
- package/src/types/schemas/section.ts +86 -0
- package/src/types/schemas/setting.ts +320 -0
- package/src/types/schemas/template.ts +34 -0
- package/src/types/schemas/theme-block.ts +34 -0
- package/src/types/theme-liquid-docs.ts +184 -0
- package/src/types/theme-schemas.ts +80 -0
- package/src/types.ts +617 -0
- package/src/utils/array.ts +31 -0
- package/src/utils/block.ts +300 -0
- package/src/utils/error.spec.ts +71 -0
- package/src/utils/error.ts +48 -0
- package/src/utils/file-utils.ts +58 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/indexBy.ts +14 -0
- package/src/utils/markup.ts +10 -0
- package/src/utils/memo.spec.ts +83 -0
- package/src/utils/memo.ts +80 -0
- package/src/utils/object.ts +3 -0
- package/src/utils/position.ts +16 -0
- package/src/utils/types.ts +57 -0
- package/src/visitor.spec.ts +163 -0
- package/src/visitor.ts +161 -0
- package/src/visitors/index.ts +2 -0
- package/src/visitors/json.ts +41 -0
- package/src/visitors/liquid.ts +40 -0
- package/tsconfig.build.json +8 -0
- package/tsconfig.json +31 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import { expect, describe, it } from 'vitest';
|
|
2
|
+
import { runLiquidCheck, applyFix } from '../../../test';
|
|
3
|
+
import { LiquidHTMLSyntaxError } from '..';
|
|
4
|
+
|
|
5
|
+
describe('Module: InvalidConditionalBooleanExpression', () => {
|
|
6
|
+
it('should not report an offense for valid boolean expressions', async () => {
|
|
7
|
+
const testCases = [
|
|
8
|
+
'{% if 1 > 2 %}hello{% endif %}',
|
|
9
|
+
'{% if variable == 5 %}hello{% endif %}',
|
|
10
|
+
"{% if 'abc' contains 'a' %}hello{% endif %}",
|
|
11
|
+
"{% if product.title != '' %}hello{% endif %}",
|
|
12
|
+
'{% if 1 and 2 %}hello{% endif %}',
|
|
13
|
+
'{% if true or false %}hello{% endif %}',
|
|
14
|
+
'{% if 10 > 5 and user.active %}hello{% endif %}',
|
|
15
|
+
'{% if price >= 100 or discount %}hello{% endif %}',
|
|
16
|
+
"{% if user.name contains 'admin' or user.role == 'owner' %}hello{% endif %}",
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
for (const testCase of testCases) {
|
|
20
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
21
|
+
expect(offenses).to.have.length(0);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('should not report an offense for valid single values', async () => {
|
|
26
|
+
const testCases = [
|
|
27
|
+
'{% if variable %}hello{% endif %}',
|
|
28
|
+
'{% if user.active %}hello{% endif %}',
|
|
29
|
+
'{% if true %}hello{% endif %}',
|
|
30
|
+
'{% if false %}hello{% endif %}',
|
|
31
|
+
'{% if 1 %}hello{% endif %}',
|
|
32
|
+
'{% if 0 %}hello{% endif %}',
|
|
33
|
+
"{% if 'string' %}hello{% endif %}",
|
|
34
|
+
'{% if contains %}hello{% endif %}',
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
for (const testCase of testCases) {
|
|
38
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
39
|
+
expect(offenses).to.have.length(0);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should report an offense when parser stops at numbers', async () => {
|
|
44
|
+
const source = '{% if 7 1 > 100 %}hello{% endif %}';
|
|
45
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, source);
|
|
46
|
+
|
|
47
|
+
expect(offenses).to.have.length(1);
|
|
48
|
+
expect(offenses[0].message).to.equal(
|
|
49
|
+
"Syntax is not supported: Expression stops at truthy value '7', and will ignore: '1 > 100'",
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
const fixed = applyFix(source, offenses[0]);
|
|
53
|
+
expect(fixed).to.equal('{% if 7 %}hello{% endif %}');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should report an offense when parser stops at strings', async () => {
|
|
57
|
+
const source = "{% if 'hello' 1 > 100 %}world{% endif %}";
|
|
58
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, source);
|
|
59
|
+
|
|
60
|
+
expect(offenses).to.have.length(1);
|
|
61
|
+
expect(offenses[0].message).to.equal(
|
|
62
|
+
"Syntax is not supported: Expression stops at truthy value ''hello'', and will ignore: '1 > 100'",
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const fixed = applyFix(source, offenses[0]);
|
|
66
|
+
expect(fixed).to.equal("{% if 'hello' %}world{% endif %}");
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should report an offense when parser stops at liquid literals', async () => {
|
|
70
|
+
const testCases = [
|
|
71
|
+
{ source: '{% if true 1 > 0 %}hello{% endif %}', value: 'true' },
|
|
72
|
+
{ source: '{% if false 1 > 0 %}hello{% endif %}', value: 'false' },
|
|
73
|
+
{ source: '{% if nil 6 > 5 %}hello{% endif %}', value: 'nil' },
|
|
74
|
+
{ source: '{% if empty 123 456 %}hello{% endif %}', value: 'empty' },
|
|
75
|
+
{ source: '{% if blank 789 %}hello{% endif %}', value: 'blank' },
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
for (const testCase of testCases) {
|
|
79
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase.source);
|
|
80
|
+
expect(offenses).to.have.length(1);
|
|
81
|
+
expect(offenses[0].message).to.contain(
|
|
82
|
+
`Expression stops at truthy value '${testCase.value}'`,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const fixed = applyFix(testCase.source, offenses[0]);
|
|
86
|
+
expect(fixed).to.equal(`{% if ${testCase.value} %}hello{% endif %}`);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should report offenses in different liquid tag types', async () => {
|
|
91
|
+
const testCases = [
|
|
92
|
+
'{% if 7 1 > 100 %}hello{% endif %}',
|
|
93
|
+
"{% unless 'test' 42 > 0 %}hello{% endunless %}",
|
|
94
|
+
'{% if false %}no{% elsif 7 1 > 100 %}hello{% endif %}',
|
|
95
|
+
];
|
|
96
|
+
|
|
97
|
+
for (const testCase of testCases) {
|
|
98
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
99
|
+
expect(offenses).to.have.length(1);
|
|
100
|
+
expect(offenses[0].message).to.contain('Expression stops at truthy value');
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should report an offense for malformed expression starting with invalid token', async () => {
|
|
105
|
+
const source = '{% if > 2 %}hello{% endif %}';
|
|
106
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, source);
|
|
107
|
+
|
|
108
|
+
expect(offenses).to.have.length(1);
|
|
109
|
+
expect(offenses[0].message).to.equal(
|
|
110
|
+
"Syntax is not supported: Conditional cannot start with '>'. Use a variable or value instead",
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
const fixed = applyFix(source, offenses[0]);
|
|
114
|
+
expect(fixed).to.equal('{% if false %}hello{% endif %}');
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('should report an offense for bare operators with no operands', async () => {
|
|
118
|
+
const testCases = [
|
|
119
|
+
{ source: '{% if > %}hello{% endif %}', token: '>' },
|
|
120
|
+
{ source: '{% if == %}hello{% endif %}', token: '==' },
|
|
121
|
+
{ source: '{% if < %}hello{% endif %}', token: '<' },
|
|
122
|
+
{ source: '{% if != %}hello{% endif %}', token: '!=' },
|
|
123
|
+
{ source: '{% if >= %}hello{% endif %}', token: '>=' },
|
|
124
|
+
{ source: '{% if <= %}hello{% endif %}', token: '<=' },
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
for (const testCase of testCases) {
|
|
128
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase.source);
|
|
129
|
+
expect(offenses).to.have.length(1);
|
|
130
|
+
expect(offenses[0].message).to.contain(`Conditional cannot start with '${testCase.token}'`);
|
|
131
|
+
|
|
132
|
+
const fixed = applyFix(testCase.source, offenses[0]);
|
|
133
|
+
expect(fixed).to.equal('{% if false %}hello{% endif %}');
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('should report an offense for other invalid starting characters', async () => {
|
|
138
|
+
const testCases = [
|
|
139
|
+
{ source: '{% if @ %}hello{% endif %}', token: '@' },
|
|
140
|
+
{ source: '{% if # %}hello{% endif %}', token: '#' },
|
|
141
|
+
{ source: '{% if $ %}hello{% endif %}', token: '$' },
|
|
142
|
+
{ source: '{% if & %}hello{% endif %}', token: '&' },
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
for (const testCase of testCases) {
|
|
146
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase.source);
|
|
147
|
+
expect(offenses).to.have.length(1);
|
|
148
|
+
expect(offenses[0].message).to.contain(`Conditional cannot start with '${testCase.token}'`);
|
|
149
|
+
|
|
150
|
+
const fixed = applyFix(testCase.source, offenses[0]);
|
|
151
|
+
expect(fixed).to.equal('{% if false %}hello{% endif %}');
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('should report an offense for malformed expressions in complex expressions', async () => {
|
|
156
|
+
const testCases = [
|
|
157
|
+
'{% if > 5 and true %}hello{% endif %}',
|
|
158
|
+
'{% if == 2 or false %}hello{% endif %}',
|
|
159
|
+
'{% if < 10 and variable %}hello{% endif %}',
|
|
160
|
+
];
|
|
161
|
+
|
|
162
|
+
for (const testCase of testCases) {
|
|
163
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
164
|
+
expect(offenses).to.have.length(1);
|
|
165
|
+
expect(offenses[0].message).to.contain('Conditional cannot start with');
|
|
166
|
+
|
|
167
|
+
const fixed = applyFix(testCase, offenses[0]);
|
|
168
|
+
expect(fixed).to.equal('{% if false %}hello{% endif %}');
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('should report an offense for trailing tokens after comparison', async () => {
|
|
173
|
+
const source = '{% if 1 == 2 foobar %}hello{% endif %}';
|
|
174
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, source);
|
|
175
|
+
|
|
176
|
+
expect(offenses).to.have.length(1);
|
|
177
|
+
expect(offenses[0].message).to.equal(
|
|
178
|
+
"Syntax is not supported: Conditional is invalid. Anything after '1 == 2' will be ignored",
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
const fixed = applyFix(source, offenses[0]);
|
|
182
|
+
expect(fixed).to.equal('{% if 1 == 2 %}hello{% endif %}');
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it('should report an offense for malformed comparisons like missing quotes', async () => {
|
|
186
|
+
const testCases = [
|
|
187
|
+
{
|
|
188
|
+
source: "{% if 'wat' == 'squat > 2 %}hello{% endif %}",
|
|
189
|
+
description: 'missing closing quote creates trailing comparison',
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
source: "{% if 'wat' == 'squat' > 2 %}hello{% endif %}",
|
|
193
|
+
description: 'extra comparison after valid comparison',
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
source: "{% if price == 'test' != 5 %}hello{% endif %}",
|
|
197
|
+
description: 'chained comparisons without logical operators',
|
|
198
|
+
},
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
for (const testCase of testCases) {
|
|
202
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase.source);
|
|
203
|
+
expect(offenses, `Failed for: ${testCase.description}`).to.have.length(1);
|
|
204
|
+
expect(offenses[0].message).to.contain('Anything after');
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('should report an offense for multiple trailing tokens', async () => {
|
|
209
|
+
const source = '{% if 10 > 4 baz qux %}hello{% endif %}';
|
|
210
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, source);
|
|
211
|
+
|
|
212
|
+
expect(offenses).to.have.length(1);
|
|
213
|
+
expect(offenses[0].message).to.contain('Anything after');
|
|
214
|
+
|
|
215
|
+
const fixed = applyFix(source, offenses[0]);
|
|
216
|
+
expect(fixed).to.equal('{% if 10 > 4 %}hello{% endif %}');
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it('should report an offense for trailing junk with different operators', async () => {
|
|
220
|
+
const testCases = [
|
|
221
|
+
"{% if 'abc' contains 'a' noise %}hello{% endif %}",
|
|
222
|
+
'{% if price <= 50 extra %}hello{% endif %}',
|
|
223
|
+
'{% if count != 0 junk %}hello{% endif %}',
|
|
224
|
+
];
|
|
225
|
+
|
|
226
|
+
for (const testCase of testCases) {
|
|
227
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
228
|
+
expect(offenses).to.have.length(1);
|
|
229
|
+
expect(offenses[0].message).to.contain('Anything after');
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it('should not report an offense for valid logical continuations', async () => {
|
|
234
|
+
const testCases = [
|
|
235
|
+
'{% if 1 > 0 and 2 < 3 %}hello{% endif %}',
|
|
236
|
+
'{% if x == 5 or y != 10 %}hello{% endif %}',
|
|
237
|
+
'{% if price >= 100 and discount %}hello{% endif %}',
|
|
238
|
+
];
|
|
239
|
+
|
|
240
|
+
for (const testCase of testCases) {
|
|
241
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
242
|
+
expect(offenses).to.have.length(0);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it('should not report an offense for truthy values followed by logical operators', async () => {
|
|
247
|
+
const testCases = [
|
|
248
|
+
'{% if true and variable %}hello{% endif %}',
|
|
249
|
+
'{% if false or variable %}hello{% endif %}',
|
|
250
|
+
'{% if 1 and user.active %}hello{% endif %}',
|
|
251
|
+
'{% if 0 or fallback %}hello{% endif %}',
|
|
252
|
+
"{% if 'string' and condition %}hello{% endif %}",
|
|
253
|
+
"{% if 'value' or default %}hello{% endif %}",
|
|
254
|
+
'{% if 42 and check %}hello{% endif %}',
|
|
255
|
+
'{% if 3.14 or backup %}hello{% endif %}',
|
|
256
|
+
'{% if nil and something %}hello{% endif %}',
|
|
257
|
+
'{% if empty or alternative %}hello{% endif %}',
|
|
258
|
+
'{% if blank and other %}hello{% endif %}',
|
|
259
|
+
];
|
|
260
|
+
|
|
261
|
+
for (const testCase of testCases) {
|
|
262
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
263
|
+
expect(offenses).to.have.length(0);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
it('should not report an offense for complex expressions with truthy values and logical operators', async () => {
|
|
268
|
+
const testCases = [
|
|
269
|
+
'{% if true and variable > 5 %}hello{% endif %}',
|
|
270
|
+
"{% if 'test' or user.name == 'admin' %}hello{% endif %}",
|
|
271
|
+
'{% if 42 and price <= 100 %}hello{% endif %}',
|
|
272
|
+
'{% if false or count != 0 %}hello{% endif %}',
|
|
273
|
+
"{% if empty and product.title contains 'sale' %}hello{% endif %}",
|
|
274
|
+
];
|
|
275
|
+
|
|
276
|
+
for (const testCase of testCases) {
|
|
277
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
278
|
+
expect(offenses).to.have.length(0);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
it('should not report an offense for unknown operators errors after values (Liquid catches these)', async () => {
|
|
283
|
+
const testCases = [
|
|
284
|
+
'{% if my_var word > 5 %}hello{% endif %}',
|
|
285
|
+
'{% if jake johnson > 5 %}hello{% endif %}',
|
|
286
|
+
"{% if 'test' invalid > thing %}hello{% endif %}",
|
|
287
|
+
"{% if user.name custom 'admin' %}hello{% endif %}",
|
|
288
|
+
];
|
|
289
|
+
|
|
290
|
+
for (const testCase of testCases) {
|
|
291
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
292
|
+
expect(offenses).to.have.length(0);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it('should not report an offense for unknown operators after variables', async () => {
|
|
297
|
+
const testCases = [
|
|
298
|
+
'{% if variable unknown > 5 %}hello{% endif %}',
|
|
299
|
+
"{% if user.role badop 'admin' %}hello{% endif %}",
|
|
300
|
+
'{% if price fake 100 %}hello{% endif %}',
|
|
301
|
+
'{% if "str" blue == something %}hello{% endif %}',
|
|
302
|
+
'{% if red blue > something %}hello{% endif %}',
|
|
303
|
+
];
|
|
304
|
+
|
|
305
|
+
for (const testCase of testCases) {
|
|
306
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
307
|
+
expect(offenses).to.have.length(0);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
it('should not report an offense for unknown operators in complex expressions', async () => {
|
|
312
|
+
const testCases = [
|
|
313
|
+
"{% if user.active and name fake 'test' %}hello{% endif %}",
|
|
314
|
+
"{% unless 'test' some > thing %}hello{% endunless %}",
|
|
315
|
+
];
|
|
316
|
+
|
|
317
|
+
for (const testCase of testCases) {
|
|
318
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
319
|
+
expect(offenses).to.have.length(0);
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it('should not report an offense for pipe filter expressions', async () => {
|
|
324
|
+
const testCases = ['{% if wat | something == something %}hello{% endif %}'];
|
|
325
|
+
|
|
326
|
+
for (const testCase of testCases) {
|
|
327
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
328
|
+
expect(offenses).to.have.length(0);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
it('should report an offense for misspelled logical operators', async () => {
|
|
333
|
+
const testCases = [
|
|
334
|
+
{
|
|
335
|
+
source: '{% if "wat" == "squat" adn "wat" == "squat" %}hello{% endif %}',
|
|
336
|
+
misspelled: 'adn',
|
|
337
|
+
expectedFix: '"wat" == "squat"',
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
source: '{% if variable > 5 andd other < 10 %}hello{% endif %}',
|
|
341
|
+
misspelled: 'andd',
|
|
342
|
+
expectedFix: 'variable > 5',
|
|
343
|
+
},
|
|
344
|
+
];
|
|
345
|
+
|
|
346
|
+
for (const testCase of testCases) {
|
|
347
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase.source);
|
|
348
|
+
expect(offenses).to.have.length(1);
|
|
349
|
+
expect(offenses[0].message).to.contain('Anything after');
|
|
350
|
+
|
|
351
|
+
const fixed = applyFix(testCase.source, offenses[0]);
|
|
352
|
+
expect(fixed).to.contain(testCase.expectedFix);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
it('should report special message for JavaScript-style operators after literal values', async () => {
|
|
357
|
+
const testCases = [
|
|
358
|
+
'{% if true && false %}hello{% endif %}',
|
|
359
|
+
'{% if false || true %}hello{% endif %}',
|
|
360
|
+
'{% if "hello" && world %}hello{% endif %}',
|
|
361
|
+
'{% if 42 || something %}hello{% endif %}',
|
|
362
|
+
];
|
|
363
|
+
|
|
364
|
+
for (const source of testCases) {
|
|
365
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, source);
|
|
366
|
+
expect(offenses).to.have.length(1);
|
|
367
|
+
expect(offenses[0].message).to.contain(
|
|
368
|
+
"Use 'and'/'or' instead of '&&'/'||' for multiple conditions",
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
it('should NOT report an offense for valid logical operators', async () => {
|
|
374
|
+
const validCases = [
|
|
375
|
+
'{% if price > 100 and discount < 50 %}hello{% endif %}',
|
|
376
|
+
'{% if user.active or user.premium %}hello{% endif %}',
|
|
377
|
+
'{% if x == 1 and y == 2 or z == 3 %}hello{% endif %}',
|
|
378
|
+
];
|
|
379
|
+
|
|
380
|
+
for (const testCase of validCases) {
|
|
381
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, testCase);
|
|
382
|
+
expect(offenses).to.have.length(0);
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
});
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { LiquidBranch, LiquidTag } from '@platformos/liquid-html-parser';
|
|
2
|
+
import { SourceCodeType, Problem } from '../../..';
|
|
3
|
+
import { getValuesInMarkup, INVALID_SYNTAX_MESSAGE } from './utils';
|
|
4
|
+
|
|
5
|
+
type TokenType = 'variable' | keyof typeof TOKEN_PATTERNS;
|
|
6
|
+
|
|
7
|
+
interface Token {
|
|
8
|
+
value: string;
|
|
9
|
+
type: TokenType;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface ExpressionIssue {
|
|
13
|
+
message: string;
|
|
14
|
+
fix: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const TOKEN_PATTERNS = {
|
|
18
|
+
logical: /^(and|or)$/,
|
|
19
|
+
comparison: /^(==|!=|>=|<=|>|<|contains)$/,
|
|
20
|
+
invalid: /^[@#$&]$/,
|
|
21
|
+
literal: /^(['"][^'"]*['"]|\d+(?:\.\d+)?|true|false|nil|empty|blank)$/,
|
|
22
|
+
} as const;
|
|
23
|
+
|
|
24
|
+
function classifyToken(value: string): TokenType {
|
|
25
|
+
for (const [type, pattern] of Object.entries(TOKEN_PATTERNS)) {
|
|
26
|
+
if (pattern.test(value)) {
|
|
27
|
+
return type as TokenType;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return 'variable';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function detectInvalidConditionalNode(
|
|
34
|
+
node: LiquidBranch | LiquidTag,
|
|
35
|
+
): Problem<SourceCodeType.LiquidHtml> | undefined {
|
|
36
|
+
if (!('name' in node) || !node.name) return;
|
|
37
|
+
if (!['if', 'elsif', 'unless'].includes(String(node.name))) return;
|
|
38
|
+
|
|
39
|
+
const markup = node.markup;
|
|
40
|
+
if (typeof markup !== 'string' || !markup.trim()) return;
|
|
41
|
+
|
|
42
|
+
const issue = analyzeConditionalExpression(markup);
|
|
43
|
+
if (!issue) return;
|
|
44
|
+
|
|
45
|
+
const openingTagRange = node.blockStartPosition || node.position;
|
|
46
|
+
const openingTag = node.source.slice(openingTagRange.start, openingTagRange.end);
|
|
47
|
+
const markupOffsetInOpening = openingTag.indexOf(markup);
|
|
48
|
+
if (markupOffsetInOpening < 0) return;
|
|
49
|
+
|
|
50
|
+
const startIndex = openingTagRange.start + markupOffsetInOpening;
|
|
51
|
+
const endIndex = startIndex + markup.length;
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
message: `${INVALID_SYNTAX_MESSAGE}: ${issue.message}`,
|
|
55
|
+
startIndex,
|
|
56
|
+
endIndex,
|
|
57
|
+
fix: (corrector) => {
|
|
58
|
+
corrector.replace(startIndex, endIndex, issue.fix);
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function isValueToken(token: Token): boolean {
|
|
64
|
+
return token.type === 'literal' || token.type === 'variable';
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function isOperatorToken(token: Token): boolean {
|
|
68
|
+
return token.type === 'logical' || token.type === 'comparison';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function checkInvalidStartingToken(tokens: Token[]): ExpressionIssue | null {
|
|
72
|
+
const firstToken = tokens[0];
|
|
73
|
+
if (firstToken.type === 'invalid' || firstToken.type === 'comparison') {
|
|
74
|
+
return {
|
|
75
|
+
message: `Conditional cannot start with '${firstToken.value}'. Use a variable or value instead`,
|
|
76
|
+
fix: 'false',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function checkTrailingTokensAfterComparison(tokens: Token[]): ExpressionIssue | null {
|
|
83
|
+
const COMPARISON_LENGTH = 3;
|
|
84
|
+
const minTokensForTrailing = COMPARISON_LENGTH + 1;
|
|
85
|
+
|
|
86
|
+
for (let i = 0; i <= tokens.length - minTokensForTrailing; i++) {
|
|
87
|
+
const [v1, op, v2] = tokens.slice(i, i + 3);
|
|
88
|
+
const remaining = tokens.slice(i + 3);
|
|
89
|
+
|
|
90
|
+
if (isValueToken(v1) && op.type === 'comparison' && isValueToken(v2)) {
|
|
91
|
+
if (remaining.length > 0) {
|
|
92
|
+
if (remaining[0].type !== 'logical') {
|
|
93
|
+
const validExpr = tokens
|
|
94
|
+
.slice(0, i + 3)
|
|
95
|
+
.map((t) => t.value)
|
|
96
|
+
.join(' ');
|
|
97
|
+
const junk = remaining.map((t) => t.value).join(' ');
|
|
98
|
+
const containsLogicalOperators = /&&|\|\|/.test(junk);
|
|
99
|
+
|
|
100
|
+
if (containsLogicalOperators) {
|
|
101
|
+
return {
|
|
102
|
+
message: `Conditional is invalid. Anything after '${validExpr}' will be ignored. Use 'and'/'or' instead of '&&'/'||' for multiple conditions`,
|
|
103
|
+
fix: validExpr,
|
|
104
|
+
};
|
|
105
|
+
} else {
|
|
106
|
+
return {
|
|
107
|
+
message: `Conditional is invalid. Anything after '${validExpr}' will be ignored`,
|
|
108
|
+
fix: validExpr,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function checkLaxParsingIssues(tokens: Token[]): ExpressionIssue | null {
|
|
119
|
+
for (let i = 0; i < tokens.length - 1; i++) {
|
|
120
|
+
const current = tokens[i];
|
|
121
|
+
const next = tokens[i + 1];
|
|
122
|
+
|
|
123
|
+
if (current.type === 'literal' && !isOperatorToken(next)) {
|
|
124
|
+
const remaining = tokens.slice(i + 1);
|
|
125
|
+
const hasUnknownOperator =
|
|
126
|
+
remaining[0]?.type === 'variable' && remaining.some(isOperatorToken);
|
|
127
|
+
|
|
128
|
+
if (!hasUnknownOperator) {
|
|
129
|
+
const ignored = remaining.map((t) => t.value).join(' ');
|
|
130
|
+
const containsLogicalOperators = /&&|\|\|/.test(ignored);
|
|
131
|
+
|
|
132
|
+
if (containsLogicalOperators) {
|
|
133
|
+
return {
|
|
134
|
+
message: `Expression stops at truthy value '${current.value}', and will ignore: '${ignored}'. Use 'and'/'or' instead of '&&'/'||' for multiple conditions`,
|
|
135
|
+
fix: current.value,
|
|
136
|
+
};
|
|
137
|
+
} else {
|
|
138
|
+
return {
|
|
139
|
+
message: `Expression stops at truthy value '${current.value}', and will ignore: '${ignored}'`,
|
|
140
|
+
fix: current.value,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function analyzeConditionalExpression(markup: string): ExpressionIssue | null {
|
|
150
|
+
const trimmed = markup.trim();
|
|
151
|
+
if (!trimmed) return null;
|
|
152
|
+
|
|
153
|
+
const tokens: Token[] = getValuesInMarkup(trimmed).map(({ value }) => ({
|
|
154
|
+
value,
|
|
155
|
+
type: classifyToken(value),
|
|
156
|
+
}));
|
|
157
|
+
|
|
158
|
+
if (tokens.length === 0) return null;
|
|
159
|
+
|
|
160
|
+
return (
|
|
161
|
+
checkInvalidStartingToken(tokens) ||
|
|
162
|
+
checkTrailingTokensAfterComparison(tokens) ||
|
|
163
|
+
checkLaxParsingIssues(tokens)
|
|
164
|
+
);
|
|
165
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { expect, describe, it } from 'vitest';
|
|
2
|
+
import { applyFix, runLiquidCheck } from '../../../test';
|
|
3
|
+
import { LiquidHTMLSyntaxError } from '../index';
|
|
4
|
+
|
|
5
|
+
describe('detectConditionalNodeUnsupportedParenthesis', async () => {
|
|
6
|
+
it('should not report no unsupported parenthesis in the markup', async () => {
|
|
7
|
+
const testCases = [`{% if condition %}{% endif %}`, `{% if range == (1..2) %}{% endif %}`];
|
|
8
|
+
|
|
9
|
+
for (const sourceCode of testCases) {
|
|
10
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, sourceCode);
|
|
11
|
+
expect(offenses).to.have.length(0);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should report when there are unsupported parenthesis in the markup', async () => {
|
|
16
|
+
const testCases = [
|
|
17
|
+
[
|
|
18
|
+
`{% if (this and that) or other %}{% endif %}`,
|
|
19
|
+
'{% if this and that or other %}{% endif %}',
|
|
20
|
+
],
|
|
21
|
+
[`{% if (a > b) and (c == d) %}{% endif %}`, '{% if a > b and c == d %}{% endif %}'],
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
for (const [sourceCode, expected] of testCases) {
|
|
25
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, sourceCode);
|
|
26
|
+
expect(offenses).to.have.length(1);
|
|
27
|
+
expect(offenses[0].message).to.equal('Syntax is not supported');
|
|
28
|
+
|
|
29
|
+
const fixed = applyFix(sourceCode, offenses[0]);
|
|
30
|
+
expect(fixed).to.equal(expected);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('should report when there are multiple instances of the error', async () => {
|
|
35
|
+
const sourceCode = `{% if (a or c) %}{% endif %} {% if (a == b) %}{% endif %} {% if condition %}{% endif %}`;
|
|
36
|
+
|
|
37
|
+
const offenses = await runLiquidCheck(LiquidHTMLSyntaxError, sourceCode);
|
|
38
|
+
expect(offenses).to.have.length(2);
|
|
39
|
+
expect(offenses[0].message).to.equal('Syntax is not supported');
|
|
40
|
+
expect(offenses[1].message).to.equal('Syntax is not supported');
|
|
41
|
+
|
|
42
|
+
const fixed = applyFix(sourceCode, offenses[0]);
|
|
43
|
+
expect(fixed).to.equal(
|
|
44
|
+
`{% if a or c %}{% endif %} {% if (a == b) %}{% endif %} {% if condition %}{% endif %}`,
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const fixed2 = applyFix(sourceCode, offenses[1]);
|
|
48
|
+
expect(fixed2).to.equal(
|
|
49
|
+
`{% if (a or c) %}{% endif %} {% if a == b %}{% endif %} {% if condition %}{% endif %}`,
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { LiquidTag } from '@platformos/liquid-html-parser';
|
|
2
|
+
import { SourceCodeType, Problem } from '../../..';
|
|
3
|
+
import {
|
|
4
|
+
doesFragmentContainUnsupportedParentheses,
|
|
5
|
+
getFragmentsInMarkup,
|
|
6
|
+
INVALID_SYNTAX_MESSAGE,
|
|
7
|
+
} from './utils';
|
|
8
|
+
|
|
9
|
+
export function detectConditionalNodeUnsupportedParenthesis(
|
|
10
|
+
node: LiquidTag,
|
|
11
|
+
): Problem<SourceCodeType.LiquidHtml> | undefined {
|
|
12
|
+
if (!['if', 'elsif', 'unless'].includes(node.name)) return;
|
|
13
|
+
if (typeof node.markup !== 'string' || !node.markup.trim()) return;
|
|
14
|
+
|
|
15
|
+
const markupIndex = node.source.indexOf(node.markup, node.position.start);
|
|
16
|
+
|
|
17
|
+
const fragments = getFragmentsInMarkup(node.markup);
|
|
18
|
+
|
|
19
|
+
const badFragments = fragments.filter((fragment) =>
|
|
20
|
+
doesFragmentContainUnsupportedParentheses(fragment.value),
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
if (badFragments.length) {
|
|
24
|
+
return {
|
|
25
|
+
message: INVALID_SYNTAX_MESSAGE,
|
|
26
|
+
startIndex: markupIndex,
|
|
27
|
+
endIndex: markupIndex + node.markup.length,
|
|
28
|
+
fix: (corrector) => {
|
|
29
|
+
for (const fragment of badFragments) {
|
|
30
|
+
corrector.replace(
|
|
31
|
+
markupIndex + fragment.index!,
|
|
32
|
+
markupIndex + fragment.index! + fragment.value.length,
|
|
33
|
+
fragment.value.replace(/[\(\)]/g, ''),
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|