@platformos/platformos-check-common 0.0.7 → 0.0.9
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 +16 -0
- package/README.md +4 -4
- package/dist/AugmentedPlatformOSDocset.d.ts +11 -0
- package/dist/AugmentedPlatformOSDocset.js +81 -0
- package/dist/AugmentedPlatformOSDocset.js.map +1 -0
- package/dist/JSONValidator.js +1 -1
- package/dist/JSONValidator.js.map +1 -1
- package/dist/checks/deprecated-filter/index.js +4 -41
- package/dist/checks/deprecated-filter/index.js.map +1 -1
- package/dist/checks/deprecated-tag/index.js +21 -22
- package/dist/checks/deprecated-tag/index.js.map +1 -1
- package/dist/checks/duplicate-function-arguments/index.js +1 -1
- package/dist/checks/duplicate-function-arguments/index.js.map +1 -1
- package/dist/checks/duplicate-render-partial-arguments/index.js +1 -1
- package/dist/checks/duplicate-render-partial-arguments/index.js.map +1 -1
- package/dist/checks/graphql/index.js +1 -1
- package/dist/checks/graphql/index.js.map +1 -1
- package/dist/checks/graphql-variables/index.js +4 -0
- package/dist/checks/graphql-variables/index.js.map +1 -1
- package/dist/checks/img-width-and-height/index.js +1 -1
- package/dist/checks/img-width-and-height/index.js.map +1 -1
- package/dist/checks/index.d.ts +3 -3
- package/dist/checks/index.js +4 -79
- package/dist/checks/index.js.map +1 -1
- package/dist/checks/json-syntax-error/index.js +1 -1
- package/dist/checks/json-syntax-error/index.js.map +1 -1
- package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.js +1 -1
- package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.js.map +1 -1
- package/dist/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.d.ts +19 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.js +79 -0
- package/dist/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/checks/UnknownTag.d.ts +3 -0
- package/dist/checks/liquid-html-syntax-error/checks/UnknownTag.js +32 -0
- package/dist/checks/liquid-html-syntax-error/checks/UnknownTag.js.map +1 -0
- package/dist/checks/liquid-html-syntax-error/index.js +23 -5
- package/dist/checks/liquid-html-syntax-error/index.js.map +1 -1
- package/dist/checks/matching-translations/index.d.ts +2 -2
- package/dist/checks/matching-translations/index.js +114 -90
- package/dist/checks/matching-translations/index.js.map +1 -1
- package/dist/checks/metadata-params/index.js +6 -3
- package/dist/checks/metadata-params/index.js.map +1 -1
- package/dist/checks/missing-asset/index.js +1 -1
- package/dist/checks/missing-asset/index.js.map +1 -1
- package/dist/checks/missing-partial/index.d.ts +6 -0
- package/dist/checks/missing-partial/index.js +70 -0
- package/dist/checks/missing-partial/index.js.map +1 -0
- package/dist/checks/orphaned-partial/index.js +4 -4
- package/dist/checks/orphaned-partial/index.js.map +1 -1
- package/dist/checks/parser-blocking-script/index.js +10 -36
- package/dist/checks/parser-blocking-script/index.js.map +1 -1
- package/dist/checks/parser-blocking-script/suggestions.d.ts +1 -2
- package/dist/checks/parser-blocking-script/suggestions.js +1 -11
- package/dist/checks/parser-blocking-script/suggestions.js.map +1 -1
- package/dist/checks/reserved-doc-param-names/index.js +6 -5
- package/dist/checks/reserved-doc-param-names/index.js.map +1 -1
- package/dist/checks/translation-key-exists/index.js +1 -1
- package/dist/checks/translation-key-exists/index.js.map +1 -1
- package/dist/checks/unclosed-html-element/index.js +5 -1
- package/dist/checks/unclosed-html-element/index.js.map +1 -1
- package/dist/checks/undefined-object/index.js +13 -31
- package/dist/checks/undefined-object/index.js.map +1 -1
- package/dist/checks/unique-doc-param-names/index.js +1 -1
- package/dist/checks/unique-doc-param-names/index.js.map +1 -1
- package/dist/checks/unknown-filter/index.js +3 -3
- package/dist/checks/unknown-filter/index.js.map +1 -1
- package/dist/checks/unknown-property/index.js +1 -1
- package/dist/checks/unknown-property/index.js.map +1 -1
- package/dist/checks/unrecognized-render-partial-arguments/index.js +2 -2
- package/dist/checks/unrecognized-render-partial-arguments/index.js.map +1 -1
- package/dist/checks/unused-assign/index.js +1 -1
- package/dist/checks/unused-assign/index.js.map +1 -1
- package/dist/checks/unused-doc-param/index.js +1 -1
- package/dist/checks/unused-doc-param/index.js.map +1 -1
- package/dist/checks/utils.js +1 -1
- package/dist/checks/utils.js.map +1 -1
- package/dist/checks/valid-content-for-arguments/index.js +1 -1
- package/dist/checks/valid-content-for-arguments/index.js.map +1 -1
- package/dist/checks/valid-doc-param-types/index.js +4 -4
- package/dist/checks/valid-doc-param-types/index.js.map +1 -1
- package/dist/checks/valid-html-translation/index.d.ts +2 -2
- package/dist/checks/valid-html-translation/index.js +4 -4
- package/dist/checks/valid-html-translation/index.js.map +1 -1
- package/dist/checks/valid-json/index.js +1 -1
- package/dist/checks/valid-json/index.js.map +1 -1
- package/dist/checks/valid-render-partial-argument-types/index.js +2 -2
- package/dist/checks/valid-render-partial-argument-types/index.js.map +1 -1
- package/dist/checks/variable-name/index.js +1 -1
- package/dist/checks/variable-name/index.js.map +1 -1
- package/dist/context-utils.d.ts +18 -7
- package/dist/context-utils.js +68 -109
- package/dist/context-utils.js.map +1 -1
- package/dist/disabled-checks/index.js +4 -2
- package/dist/disabled-checks/index.js.map +1 -1
- 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 +7 -10
- package/dist/find-root.js +10 -17
- package/dist/find-root.js.map +1 -1
- package/dist/fixes/autofix.d.ts +4 -4
- package/dist/fixes/autofix.js +2 -2
- package/dist/fixes/autofix.js.map +1 -1
- package/dist/fixes/correctors/index.js +4 -0
- package/dist/fixes/correctors/index.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +50 -17
- package/dist/index.js.map +1 -1
- package/dist/jsonc/parse.d.ts +1 -1
- package/dist/jsonc/parse.js +1 -1
- package/dist/liquid-doc/arguments.d.ts +7 -8
- package/dist/liquid-doc/arguments.js +28 -29
- package/dist/liquid-doc/arguments.js.map +1 -1
- package/dist/liquid-doc/liquidDoc.d.ts +1 -1
- package/dist/liquid-doc/liquidDoc.js.map +1 -1
- package/dist/liquid-doc/utils.d.ts +3 -3
- package/dist/liquid-doc/utils.js +14 -3
- package/dist/liquid-doc/utils.js.map +1 -1
- package/dist/path.d.ts +1 -0
- package/dist/path.js +16 -1
- package/dist/path.js.map +1 -1
- package/{src/test/MockTheme.ts → dist/test/MockApp.d.ts} +2 -3
- package/dist/test/MockApp.js +16 -0
- package/dist/test/MockApp.js.map +1 -0
- package/dist/test/MockFileSystem.d.ts +3 -3
- package/dist/test/MockFileSystem.js +6 -6
- package/dist/test/MockFileSystem.js.map +1 -1
- package/dist/test/index.d.ts +1 -1
- package/dist/test/index.js +1 -1
- package/dist/test/index.js.map +1 -1
- package/dist/test/test-helper.d.ts +10 -9
- package/dist/test/test-helper.js +15 -106
- package/dist/test/test-helper.js.map +1 -1
- package/dist/to-schema.d.ts +1 -1
- package/dist/to-source-code.d.ts +3 -2
- package/dist/to-source-code.js +20 -0
- package/dist/to-source-code.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/platformos-liquid-docs.d.ts +128 -0
- package/dist/types/platformos-liquid-docs.js +3 -0
- package/dist/types/platformos-liquid-docs.js.map +1 -0
- package/dist/types/schemas/index.d.ts +0 -2
- package/dist/types/schemas/index.js.map +1 -1
- package/dist/types.d.ts +26 -67
- package/dist/types.js +3 -5
- package/dist/types.js.map +1 -1
- package/dist/utils/block.js.map +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/yaml/parse.d.ts +5 -0
- package/dist/yaml/parse.js +94 -0
- package/dist/yaml/parse.js.map +1 -0
- package/package.json +4 -3
- package/src/{AugmentedThemeDocset.spec.ts → AugmentedPlatformOSDocset.spec.ts} +47 -34
- package/src/AugmentedPlatformOSDocset.ts +89 -0
- package/src/JSONValidator.ts +1 -1
- package/src/checks/deprecated-filter/index.spec.ts +76 -248
- package/src/checks/deprecated-filter/index.ts +5 -53
- package/src/checks/deprecated-tag/index.spec.ts +85 -34
- package/src/checks/deprecated-tag/index.ts +27 -22
- package/src/checks/duplicate-function-arguments/index.ts +1 -1
- package/src/checks/duplicate-render-partial-arguments/index.spec.ts +12 -12
- package/src/checks/duplicate-render-partial-arguments/index.ts +1 -1
- package/src/checks/graphql/index.ts +1 -1
- package/src/checks/graphql-variables/index.spec.ts +95 -0
- package/src/checks/graphql-variables/index.ts +4 -0
- package/src/checks/img-width-and-height/index.ts +2 -2
- package/src/checks/index.ts +11 -80
- package/src/checks/invalid-hash-assign-target/index.spec.ts +27 -27
- package/src/checks/json-syntax-error/index.ts +2 -2
- package/src/checks/liquid-html-syntax-error/checks/InvalidBooleanExpression.spec.ts +0 -11
- package/src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.spec.ts +1 -2
- package/src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.ts +2 -2
- package/src/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.spec.ts +259 -0
- package/src/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.ts +89 -0
- package/src/checks/liquid-html-syntax-error/checks/UnknownTag.spec.ts +293 -0
- package/src/checks/liquid-html-syntax-error/checks/UnknownTag.ts +43 -0
- package/src/checks/liquid-html-syntax-error/index.spec.ts +1 -6
- package/src/checks/liquid-html-syntax-error/index.ts +26 -5
- package/src/checks/matching-translations/index.spec.ts +187 -354
- package/src/checks/matching-translations/index.ts +117 -107
- package/src/checks/metadata-params/index.ts +6 -8
- package/src/checks/missing-asset/index.ts +1 -1
- package/src/checks/{missing-template → missing-partial}/index.spec.ts +6 -6
- package/src/checks/{missing-template → missing-partial}/index.ts +12 -26
- package/src/checks/orphaned-partial/index.ts +3 -3
- package/src/checks/parser-blocking-script/index.spec.ts +0 -118
- package/src/checks/parser-blocking-script/index.ts +3 -33
- package/src/checks/parser-blocking-script/suggestions.ts +1 -28
- package/src/checks/translation-key-exists/index.ts +1 -1
- package/src/checks/unclosed-html-element/index.ts +5 -1
- package/src/checks/undefined-object/index.spec.ts +32 -111
- package/src/checks/undefined-object/index.ts +15 -34
- package/src/checks/unique-doc-param-names/index.ts +1 -1
- package/src/checks/unknown-filter/index.spec.ts +2 -2
- package/src/checks/unknown-filter/index.ts +3 -3
- package/src/checks/unknown-property/index.ts +1 -1
- package/src/checks/unrecognized-render-partial-arguments/index.spec.ts +5 -5
- package/src/checks/unrecognized-render-partial-arguments/index.ts +2 -5
- package/src/checks/unused-assign/index.spec.ts +0 -30
- package/src/checks/unused-assign/index.ts +2 -2
- package/src/checks/unused-doc-param/index.ts +1 -1
- package/src/checks/utils.ts +1 -1
- package/src/checks/valid-doc-param-types/index.ts +4 -4
- package/src/checks/valid-html-translation/index.spec.ts +42 -32
- package/src/checks/valid-html-translation/index.ts +7 -7
- package/src/checks/valid-json/index.ts +2 -2
- package/src/checks/valid-render-partial-argument-types/index.spec.ts +13 -13
- package/src/checks/valid-render-partial-argument-types/index.ts +2 -5
- package/src/checks/variable-name/index.ts +1 -1
- package/src/context-utils.spec.ts +49 -77
- package/src/context-utils.ts +81 -129
- package/src/disabled-checks/index.spec.ts +26 -26
- package/src/disabled-checks/index.ts +2 -2
- package/src/disabled-checks/test-checks.ts +4 -4
- package/src/find-root.ts +12 -22
- package/src/fixes/autofix.spec.ts +2 -2
- package/src/fixes/autofix.ts +4 -4
- package/src/fixes/correctors/index.ts +4 -0
- package/src/ignore.spec.ts +4 -5
- package/src/index.ts +51 -21
- package/src/jsonc/parse.ts +1 -1
- package/src/liquid-doc/arguments.spec.ts +19 -45
- package/src/liquid-doc/arguments.ts +35 -42
- package/src/liquid-doc/liquidDoc.spec.ts +1 -1
- package/src/liquid-doc/liquidDoc.ts +1 -2
- package/src/liquid-doc/utils.ts +17 -8
- package/src/path.ts +16 -0
- package/src/test/MockApp.ts +17 -0
- package/src/test/MockFileSystem.spec.ts +10 -11
- package/src/test/MockFileSystem.ts +6 -6
- package/src/test/contain-offense.spec.ts +11 -3
- package/src/test/index.ts +1 -1
- package/src/test/test-helper.ts +43 -145
- package/src/to-source-code.ts +20 -1
- package/src/types/{theme-liquid-docs.ts → platformos-liquid-docs.ts} +8 -13
- package/src/types.ts +29 -92
- package/src/utils/index.ts +0 -1
- package/src/visitor.spec.ts +2 -2
- package/src/yaml/parse.ts +111 -0
- package/src/AugmentedThemeDocset.ts +0 -137
- package/src/checks/app-block-missing-schema/index.spec.ts +0 -121
- package/src/checks/app-block-missing-schema/index.ts +0 -46
- package/src/checks/app-block-valid-tags/index.spec.ts +0 -96
- package/src/checks/app-block-valid-tags/index.ts +0 -54
- package/src/checks/asset-preload/index.spec.ts +0 -78
- package/src/checks/asset-preload/index.ts +0 -65
- package/src/checks/asset-size-app-block-css/index.spec.ts +0 -88
- package/src/checks/asset-size-app-block-css/index.ts +0 -78
- package/src/checks/asset-size-app-block-javascript/index.spec.ts +0 -66
- package/src/checks/asset-size-app-block-javascript/index.ts +0 -78
- package/src/checks/asset-size-css/index.spec.ts +0 -166
- package/src/checks/asset-size-css/index.ts +0 -160
- package/src/checks/asset-size-javascript/index.spec.ts +0 -184
- package/src/checks/asset-size-javascript/index.ts +0 -144
- package/src/checks/block-id-usage/index.spec.ts +0 -76
- package/src/checks/block-id-usage/index.ts +0 -72
- package/src/checks/cdn-preconnect/index.spec.ts +0 -40
- package/src/checks/cdn-preconnect/index.ts +0 -43
- package/src/checks/content-for-header-modification/index.spec.ts +0 -65
- package/src/checks/content-for-header-modification/index.ts +0 -72
- package/src/checks/deprecate-bgsizes/index.spec.ts +0 -41
- package/src/checks/deprecate-bgsizes/index.ts +0 -49
- package/src/checks/deprecate-lazysizes/index.spec.ts +0 -26
- package/src/checks/deprecate-lazysizes/index.ts +0 -58
- package/src/checks/deprecated-filter/fixes.ts +0 -264
- package/src/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.ts +0 -1343
- package/src/checks/deprecated-fonts-on-sections-and-blocks/index.spec.ts +0 -613
- package/src/checks/deprecated-fonts-on-sections-and-blocks/index.ts +0 -284
- package/src/checks/deprecated-fonts-on-settings-schema/index.spec.ts +0 -102
- package/src/checks/deprecated-fonts-on-settings-schema/index.ts +0 -66
- package/src/checks/duplicate-content-for-arguments/index.spec.ts +0 -98
- package/src/checks/duplicate-content-for-arguments/index.ts +0 -43
- package/src/checks/empty-block-content/index.spec.ts +0 -117
- package/src/checks/empty-block-content/index.ts +0 -60
- package/src/checks/hardcoded-routes/index.spec.ts +0 -58
- package/src/checks/hardcoded-routes/index.ts +0 -100
- package/src/checks/json-missing-block/index.spec.ts +0 -435
- package/src/checks/json-missing-block/index.ts +0 -56
- package/src/checks/json-missing-block/missing-block-utils.ts +0 -147
- package/src/checks/liquid-free-settings/index.spec.ts +0 -180
- package/src/checks/liquid-free-settings/index.ts +0 -79
- package/src/checks/missing-content-for-arguments/index.spec.ts +0 -144
- package/src/checks/missing-content-for-arguments/index.ts +0 -46
- package/src/checks/pagination-size/index.spec.ts +0 -158
- package/src/checks/pagination-size/index.ts +0 -104
- package/src/checks/remote-asset/index.spec.ts +0 -280
- package/src/checks/remote-asset/index.ts +0 -238
- package/src/checks/reserved-doc-param-names/index.spec.ts +0 -62
- package/src/checks/reserved-doc-param-names/index.ts +0 -57
- package/src/checks/schema-presets-block-order/index.spec.ts +0 -344
- package/src/checks/schema-presets-block-order/index.ts +0 -154
- package/src/checks/schema-presets-static-blocks/index.spec.ts +0 -145
- package/src/checks/schema-presets-static-blocks/index.ts +0 -126
- package/src/checks/static-stylesheet-and-javascript-tags/index.spec.ts +0 -257
- package/src/checks/static-stylesheet-and-javascript-tags/index.ts +0 -48
- package/src/checks/unique-settings-id/index.spec.ts +0 -24
- package/src/checks/unique-settings-id/index.ts +0 -84
- package/src/checks/unique-settings-id/test-data.ts +0 -1191
- package/src/checks/unique-static-block-id/index.spec.ts +0 -55
- package/src/checks/unique-static-block-id/index.ts +0 -60
- package/src/checks/unrecognized-content-for-arguments/index.spec.ts +0 -145
- package/src/checks/unrecognized-content-for-arguments/index.ts +0 -55
- package/src/checks/valid-block-target/index.spec.ts +0 -1396
- package/src/checks/valid-block-target/index.ts +0 -142
- package/src/checks/valid-content-for-argument-types/index.spec.ts +0 -382
- package/src/checks/valid-content-for-argument-types/index.ts +0 -42
- package/src/checks/valid-content-for-arguments/index.spec.ts +0 -107
- package/src/checks/valid-content-for-arguments/index.ts +0 -98
- package/src/checks/valid-local-blocks/index.spec.ts +0 -286
- package/src/checks/valid-local-blocks/index.ts +0 -100
- package/src/checks/valid-local-blocks/valid-block-utils.ts +0 -97
- package/src/checks/valid-schema/index.spec.ts +0 -174
- package/src/checks/valid-schema/index.ts +0 -41
- package/src/checks/valid-schema-name/index.spec.ts +0 -112
- package/src/checks/valid-schema-name/index.ts +0 -75
- package/src/checks/valid-settings-key/index.spec.ts +0 -321
- package/src/checks/valid-settings-key/index.ts +0 -144
- package/src/checks/valid-static-block-type/index.spec.ts +0 -38
- package/src/checks/valid-static-block-type/index.ts +0 -58
- package/src/checks/valid-visible-if/index.spec.ts +0 -619
- package/src/checks/valid-visible-if/index.ts +0 -184
- package/src/checks/valid-visible-if/visible-if-utils.ts +0 -158
- package/src/tags/content-for.ts +0 -25
- package/src/to-schema.ts +0 -231
- package/src/types/schemas/index.ts +0 -5
- package/src/types/schemas/preset.ts +0 -52
- package/src/types/schemas/section.ts +0 -86
- package/src/types/schemas/setting.ts +0 -320
- package/src/types/schemas/template.ts +0 -34
- package/src/types/schemas/theme-block.ts +0 -34
- package/src/types/theme-schemas.ts +0 -80
- package/src/utils/block.ts +0 -300
- package/src/utils/markup.ts +0 -10
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
import { getSchema } from '../../to-schema';
|
|
2
|
-
import {
|
|
3
|
-
JSONNode,
|
|
4
|
-
LiquidCheckDefinition,
|
|
5
|
-
Section,
|
|
6
|
-
Severity,
|
|
7
|
-
Setting,
|
|
8
|
-
Preset,
|
|
9
|
-
SourceCodeType,
|
|
10
|
-
ThemeBlock,
|
|
11
|
-
Context,
|
|
12
|
-
ArrayNode,
|
|
13
|
-
} from '../../types';
|
|
14
|
-
import { getLocEnd, getLocStart, nodeAtPath } from '../../json';
|
|
15
|
-
import { DEPRECATED_FONT_HANDLES } from './deprecated-fonts-data';
|
|
16
|
-
|
|
17
|
-
export const DeprecatedFontsOnSectionsAndBlocks: LiquidCheckDefinition = {
|
|
18
|
-
meta: {
|
|
19
|
-
code: 'DeprecatedFontsOnSectionsAndBlocks',
|
|
20
|
-
name: 'Check for deprecated fonts in section and block schema settings values',
|
|
21
|
-
docs: {
|
|
22
|
-
description: 'Warns on deprecated fonts in section and block schema settings values.',
|
|
23
|
-
recommended: true,
|
|
24
|
-
url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/deprecated-fonts-on-sections-and-blocks',
|
|
25
|
-
},
|
|
26
|
-
type: SourceCodeType.LiquidHtml,
|
|
27
|
-
severity: Severity.WARNING,
|
|
28
|
-
schema: {},
|
|
29
|
-
targets: [],
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
create(context) {
|
|
33
|
-
return {
|
|
34
|
-
async LiquidRawTag(node) {
|
|
35
|
-
if (node.name !== 'schema' || node.body.kind !== 'json') {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const schema = await getSchema(context);
|
|
40
|
-
const { validSchema, ast } = schema ?? {};
|
|
41
|
-
if (!validSchema || validSchema instanceof Error) return;
|
|
42
|
-
if (!ast || ast instanceof Error) return;
|
|
43
|
-
|
|
44
|
-
const offset = node.blockStartPosition.end;
|
|
45
|
-
|
|
46
|
-
// 1st: check schema settings for deprecated fonts
|
|
47
|
-
checkSchemaSettingsForDeprecatedFonts(validSchema, offset, ast, context);
|
|
48
|
-
|
|
49
|
-
// 2nd: check local blocks settings for deprecated fonts
|
|
50
|
-
checkLocalBlocksSettingsForDeprecatedFonts(validSchema, offset, ast, context);
|
|
51
|
-
|
|
52
|
-
// 3rd: check preset settings for deprecated fonts
|
|
53
|
-
await checkPresetsForDeprecatedFonts(validSchema, offset, ast, context);
|
|
54
|
-
|
|
55
|
-
// 4th: check schema default (sections only) for deprecated fonts
|
|
56
|
-
if ('default' in validSchema) {
|
|
57
|
-
await checkSchemaDefaultForDeprecatedFonts(
|
|
58
|
-
validSchema as Section.Schema,
|
|
59
|
-
offset,
|
|
60
|
-
ast,
|
|
61
|
-
context,
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
function checkSchemaSettingsForDeprecatedFonts(
|
|
70
|
-
schema: ThemeBlock.Schema | Section.Schema,
|
|
71
|
-
offset: number,
|
|
72
|
-
ast: JSONNode,
|
|
73
|
-
context: Context<SourceCodeType.LiquidHtml>,
|
|
74
|
-
) {
|
|
75
|
-
const settings = schema.settings;
|
|
76
|
-
if (!settings) return;
|
|
77
|
-
|
|
78
|
-
checkSettingsForDeprecatedFonts(settings, offset, ast, ['settings'], context);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function checkSettingsForDeprecatedFonts(
|
|
82
|
-
settings: Setting.Any[],
|
|
83
|
-
offset: number,
|
|
84
|
-
ast: JSONNode,
|
|
85
|
-
warningAstPath: string[],
|
|
86
|
-
context: Context<SourceCodeType.LiquidHtml>,
|
|
87
|
-
) {
|
|
88
|
-
settings.forEach((setting, index) => {
|
|
89
|
-
if (
|
|
90
|
-
setting.type === 'font_picker' &&
|
|
91
|
-
setting.default &&
|
|
92
|
-
DEPRECATED_FONT_HANDLES.has(setting.default)
|
|
93
|
-
) {
|
|
94
|
-
const currentPath = warningAstPath.concat([String(index), 'default']);
|
|
95
|
-
reportWarning(
|
|
96
|
-
context,
|
|
97
|
-
offset,
|
|
98
|
-
ast as JSONNode,
|
|
99
|
-
currentPath,
|
|
100
|
-
`setting '${setting.id}' is using deprecated font '${setting.default}'`,
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function checkLocalBlocksSettingsForDeprecatedFonts(
|
|
107
|
-
schema: ThemeBlock.Schema | Section.Schema,
|
|
108
|
-
offset: number,
|
|
109
|
-
ast: JSONNode,
|
|
110
|
-
context: Context<SourceCodeType.LiquidHtml>,
|
|
111
|
-
) {
|
|
112
|
-
const blocks = schema.blocks;
|
|
113
|
-
if (!blocks) return;
|
|
114
|
-
|
|
115
|
-
blocks.forEach((block, index) => {
|
|
116
|
-
if ('settings' in block && block.settings) {
|
|
117
|
-
checkSettingsForDeprecatedFonts(
|
|
118
|
-
block.settings as Setting.Any[],
|
|
119
|
-
offset,
|
|
120
|
-
ast,
|
|
121
|
-
['blocks', String(index), 'settings'],
|
|
122
|
-
context,
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
async function checkPresetsForDeprecatedFonts(
|
|
129
|
-
schema: ThemeBlock.Schema | Section.Schema,
|
|
130
|
-
offset: number,
|
|
131
|
-
ast: JSONNode,
|
|
132
|
-
context: Context<SourceCodeType.LiquidHtml>,
|
|
133
|
-
) {
|
|
134
|
-
const presets = schema.presets;
|
|
135
|
-
if (!presets) return;
|
|
136
|
-
|
|
137
|
-
for (const [preset_index, preset] of presets.entries()) {
|
|
138
|
-
const warningAstPath = ['presets', String(preset_index)];
|
|
139
|
-
await checkSettingsAndBlocksForDeprecatedFonts(
|
|
140
|
-
preset.settings ?? {},
|
|
141
|
-
'blocks' in preset ? preset.blocks : undefined,
|
|
142
|
-
schema,
|
|
143
|
-
offset,
|
|
144
|
-
ast,
|
|
145
|
-
warningAstPath,
|
|
146
|
-
context,
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
async function checkSettingsAndBlocksForDeprecatedFonts(
|
|
152
|
-
settings: Setting.Values,
|
|
153
|
-
blocks:
|
|
154
|
-
| Preset.PresetBlockHash
|
|
155
|
-
| Preset.PresetBlockForArray[]
|
|
156
|
-
| Section.DefaultBlock[]
|
|
157
|
-
| undefined,
|
|
158
|
-
schema: ThemeBlock.Schema | Section.Schema,
|
|
159
|
-
offset: number,
|
|
160
|
-
ast: JSONNode,
|
|
161
|
-
warningAstPath: string[],
|
|
162
|
-
context: Context<SourceCodeType.LiquidHtml>,
|
|
163
|
-
) {
|
|
164
|
-
// check settings for deprecated fonts
|
|
165
|
-
if (settings && typeof settings === 'object') {
|
|
166
|
-
Object.entries(settings).forEach(([settingKey, settingValue]) => {
|
|
167
|
-
if (
|
|
168
|
-
isFontPickerType(schema.settings ?? [], settingKey) &&
|
|
169
|
-
DEPRECATED_FONT_HANDLES.has(settingValue as string)
|
|
170
|
-
) {
|
|
171
|
-
const currentPath = warningAstPath.concat(['settings', settingKey]);
|
|
172
|
-
reportWarning(
|
|
173
|
-
context,
|
|
174
|
-
offset,
|
|
175
|
-
ast,
|
|
176
|
-
currentPath,
|
|
177
|
-
`setting '${settingKey}' is using deprecated font '${settingValue}'`,
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// check blocks for deprecated fonts
|
|
184
|
-
if (blocks) {
|
|
185
|
-
await checkBlocksForDeprecatedFonts(blocks, schema, offset, ast, context, warningAstPath);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
async function checkBlocksForDeprecatedFonts(
|
|
190
|
-
blocks: Preset.PresetBlockHash | Preset.PresetBlockForArray[] | Section.DefaultBlock[],
|
|
191
|
-
schema: ThemeBlock.Schema | Section.Schema,
|
|
192
|
-
offset: number,
|
|
193
|
-
ast: JSONNode,
|
|
194
|
-
context: Context<SourceCodeType.LiquidHtml>,
|
|
195
|
-
nodePath: string[],
|
|
196
|
-
) {
|
|
197
|
-
const iterator = Array.isArray(blocks) ? blocks.entries() : Object.entries(blocks!);
|
|
198
|
-
|
|
199
|
-
for (const [keyOrIndex, block] of iterator) {
|
|
200
|
-
const currentPath = nodePath.concat(['blocks', String(keyOrIndex)]);
|
|
201
|
-
|
|
202
|
-
// we'll need the schema to verify that the setting is a font_picker type
|
|
203
|
-
// local blocks don't have a schema coming from the another theme file, we need to get it from the schema of the section
|
|
204
|
-
// look in the schema blocks for the block type, if this block has a name, it's a local block, otherwise, it's a theme block
|
|
205
|
-
let validSchema = null;
|
|
206
|
-
|
|
207
|
-
schema.blocks?.forEach((schemaBlock) => {
|
|
208
|
-
if (schemaBlock.type === block.type && 'name' in schemaBlock) {
|
|
209
|
-
validSchema = schemaBlock;
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
if (!validSchema) {
|
|
214
|
-
const blockSchema = await context.getBlockSchema?.(block.type);
|
|
215
|
-
if (!blockSchema || blockSchema instanceof Error) continue;
|
|
216
|
-
validSchema = blockSchema.validSchema;
|
|
217
|
-
if (!validSchema || validSchema instanceof Error) continue;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// block_value is the hash which can have settings, blocks, etc.
|
|
221
|
-
for (const [settingKey, settingValue] of Object.entries(block.settings ?? {})) {
|
|
222
|
-
if (settingValue && DEPRECATED_FONT_HANDLES.has(settingValue as string)) {
|
|
223
|
-
// Check if the setting is a font_picker
|
|
224
|
-
const isFontPickerSetting = isFontPickerType(validSchema.settings ?? [], settingKey);
|
|
225
|
-
if (isFontPickerSetting) {
|
|
226
|
-
reportWarning(
|
|
227
|
-
context,
|
|
228
|
-
offset,
|
|
229
|
-
ast,
|
|
230
|
-
currentPath.concat(['settings', settingKey]),
|
|
231
|
-
`setting '${settingKey}' is using deprecated font '${settingValue}'`,
|
|
232
|
-
);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
if ('blocks' in block && block.blocks) {
|
|
238
|
-
await checkBlocksForDeprecatedFonts(block.blocks, schema, offset, ast, context, currentPath);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
async function checkSchemaDefaultForDeprecatedFonts(
|
|
244
|
-
schema: Section.Schema,
|
|
245
|
-
offset: number,
|
|
246
|
-
ast: JSONNode,
|
|
247
|
-
context: Context<SourceCodeType.LiquidHtml>,
|
|
248
|
-
) {
|
|
249
|
-
const defaultValues = schema.default;
|
|
250
|
-
if (!defaultValues || typeof defaultValues !== 'object') return;
|
|
251
|
-
|
|
252
|
-
const warningAstPath = ['default'];
|
|
253
|
-
await checkSettingsAndBlocksForDeprecatedFonts(
|
|
254
|
-
defaultValues.settings ?? {},
|
|
255
|
-
'blocks' in defaultValues ? defaultValues.blocks : undefined,
|
|
256
|
-
schema,
|
|
257
|
-
offset,
|
|
258
|
-
ast,
|
|
259
|
-
warningAstPath,
|
|
260
|
-
context,
|
|
261
|
-
);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
function isFontPickerType(settings: Setting.Any[], settingKey: string) {
|
|
265
|
-
return settings.some((setting) => setting.id === settingKey && setting.type === 'font_picker');
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
function reportWarning(
|
|
269
|
-
context: Context<SourceCodeType.LiquidHtml>,
|
|
270
|
-
offset: number,
|
|
271
|
-
ast: JSONNode,
|
|
272
|
-
ast_path: string[],
|
|
273
|
-
message: string,
|
|
274
|
-
fullHighlight: boolean = true,
|
|
275
|
-
) {
|
|
276
|
-
const node = nodeAtPath(ast, ast_path)! as ArrayNode;
|
|
277
|
-
const startIndex = fullHighlight ? offset + getLocStart(node) : offset + getLocEnd(node) - 1; // start to finish of the node or last char of the node
|
|
278
|
-
const endIndex = offset + getLocEnd(node);
|
|
279
|
-
context.report({
|
|
280
|
-
message: message,
|
|
281
|
-
startIndex,
|
|
282
|
-
endIndex,
|
|
283
|
-
});
|
|
284
|
-
}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { DeprecatedFontsOnSettingsSchema } from './index';
|
|
3
|
-
import { runJSONCheck } from '../../test';
|
|
4
|
-
|
|
5
|
-
describe('Module: DeprecatedFontsOnSettingsSchema', () => {
|
|
6
|
-
it('reports a warning when settings_schema.json has a deprecated font', async () => {
|
|
7
|
-
const sourceCode = `[
|
|
8
|
-
{
|
|
9
|
-
"name": "Fonts",
|
|
10
|
-
"settings": [
|
|
11
|
-
{
|
|
12
|
-
"type": "font_picker",
|
|
13
|
-
"id": "heading_font",
|
|
14
|
-
"label": "Heading font",
|
|
15
|
-
"default": "helvetica_n4"
|
|
16
|
-
}
|
|
17
|
-
]
|
|
18
|
-
}
|
|
19
|
-
]`;
|
|
20
|
-
|
|
21
|
-
const offenses = await runJSONCheck(
|
|
22
|
-
DeprecatedFontsOnSettingsSchema,
|
|
23
|
-
sourceCode,
|
|
24
|
-
'config/settings_schema.json',
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
expect(offenses).toHaveLength(1);
|
|
28
|
-
expect(offenses[0].message).toEqual('The font "helvetica_n4" is deprecated');
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('reports no warning when settings_schema.json has non-deprecated fonts', async () => {
|
|
32
|
-
const sourceCode = `[
|
|
33
|
-
{
|
|
34
|
-
"name": "Fonts",
|
|
35
|
-
"settings": [
|
|
36
|
-
{
|
|
37
|
-
"type": "font_picker",
|
|
38
|
-
"id": "heading_font",
|
|
39
|
-
"label": "Heading font",
|
|
40
|
-
"default": "alegreya_n4"
|
|
41
|
-
}
|
|
42
|
-
]
|
|
43
|
-
}
|
|
44
|
-
]`;
|
|
45
|
-
|
|
46
|
-
const offenses = await runJSONCheck(
|
|
47
|
-
DeprecatedFontsOnSettingsSchema,
|
|
48
|
-
sourceCode,
|
|
49
|
-
'config/settings_schema.json',
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
expect(offenses).toHaveLength(0);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('reports no warning for non-font_picker settings', async () => {
|
|
56
|
-
const sourceCode = `[
|
|
57
|
-
{
|
|
58
|
-
"name": "Fonts",
|
|
59
|
-
"settings": [
|
|
60
|
-
{
|
|
61
|
-
"type": "text",
|
|
62
|
-
"id": "heading_text",
|
|
63
|
-
"label": "Heading text",
|
|
64
|
-
"default": "helvetica_n4"
|
|
65
|
-
}
|
|
66
|
-
]
|
|
67
|
-
}
|
|
68
|
-
]`;
|
|
69
|
-
|
|
70
|
-
const offenses = await runJSONCheck(
|
|
71
|
-
DeprecatedFontsOnSettingsSchema,
|
|
72
|
-
sourceCode,
|
|
73
|
-
'config/settings_schema.json',
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
expect(offenses).toHaveLength(0);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('does not run check on files other than settings_schema.json', async () => {
|
|
80
|
-
const sourceCode = `[
|
|
81
|
-
{
|
|
82
|
-
"name": "Fonts",
|
|
83
|
-
"settings": [
|
|
84
|
-
{
|
|
85
|
-
"type": "font_picker",
|
|
86
|
-
"id": "heading_font",
|
|
87
|
-
"label": "Heading font",
|
|
88
|
-
"default": "helvetica_n4"
|
|
89
|
-
}
|
|
90
|
-
]
|
|
91
|
-
}
|
|
92
|
-
]`;
|
|
93
|
-
|
|
94
|
-
const offenses = await runJSONCheck(
|
|
95
|
-
DeprecatedFontsOnSettingsSchema,
|
|
96
|
-
sourceCode,
|
|
97
|
-
'config/other_file.json',
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
expect(offenses).toHaveLength(0);
|
|
101
|
-
});
|
|
102
|
-
});
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
JSONCheckDefinition,
|
|
3
|
-
Severity,
|
|
4
|
-
SourceCodeType,
|
|
5
|
-
isArrayNode,
|
|
6
|
-
isObjectNode,
|
|
7
|
-
} from '../../types';
|
|
8
|
-
import { getLocStart, getLocEnd } from '../../json';
|
|
9
|
-
import { DEPRECATED_FONT_HANDLES } from '../deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data';
|
|
10
|
-
|
|
11
|
-
export const DeprecatedFontsOnSettingsSchema: JSONCheckDefinition = {
|
|
12
|
-
meta: {
|
|
13
|
-
code: 'DeprecatedFontsOnSettingsSchema',
|
|
14
|
-
name: 'Check for deprecated fonts in settings_schema settings values',
|
|
15
|
-
docs: {
|
|
16
|
-
description: 'Warns on deprecated fonts in settings_schema settings values.',
|
|
17
|
-
recommended: true,
|
|
18
|
-
url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/deprecated-fonts-on-settings-schema',
|
|
19
|
-
},
|
|
20
|
-
type: SourceCodeType.JSON,
|
|
21
|
-
severity: Severity.WARNING,
|
|
22
|
-
schema: {},
|
|
23
|
-
targets: [],
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
create(context) {
|
|
27
|
-
const relativePath = context.toRelativePath(context.file.uri);
|
|
28
|
-
if (relativePath !== 'config/settings_schema.json') return {};
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
async Property(node) {
|
|
32
|
-
if (node.key.value === 'settings' && isArrayNode(node.value)) {
|
|
33
|
-
for (const setting of node.value.children) {
|
|
34
|
-
if (isObjectNode(setting)) {
|
|
35
|
-
const typeProperty = setting.children.find((prop) => prop.key.value === 'type');
|
|
36
|
-
if (
|
|
37
|
-
typeProperty &&
|
|
38
|
-
typeProperty.value.type === 'Literal' &&
|
|
39
|
-
typeProperty.value.value === 'font_picker'
|
|
40
|
-
) {
|
|
41
|
-
// Check if this font_picker has a default value that's deprecated
|
|
42
|
-
const defaultProperty = setting.children.find(
|
|
43
|
-
(prop) => prop.key.value === 'default',
|
|
44
|
-
);
|
|
45
|
-
if (
|
|
46
|
-
defaultProperty &&
|
|
47
|
-
defaultProperty.value.type === 'Literal' &&
|
|
48
|
-
typeof defaultProperty.value.value === 'string'
|
|
49
|
-
) {
|
|
50
|
-
const defaultFont = defaultProperty.value.value;
|
|
51
|
-
if (DEPRECATED_FONT_HANDLES.has(defaultFont)) {
|
|
52
|
-
context.report({
|
|
53
|
-
message: `The font "${defaultFont}" is deprecated`,
|
|
54
|
-
startIndex: getLocStart(defaultProperty.value),
|
|
55
|
-
endIndex: getLocEnd(defaultProperty.value),
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
},
|
|
66
|
-
};
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { DuplicateContentForArguments } from '.';
|
|
3
|
-
import { runLiquidCheck, applySuggestions } from '../../test';
|
|
4
|
-
|
|
5
|
-
describe('Module: DuplicateContentForArguments', () => {
|
|
6
|
-
function runCheck(sourceCode: string) {
|
|
7
|
-
return runLiquidCheck(DuplicateContentForArguments, sourceCode);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
describe('detection', () => {
|
|
11
|
-
it('should report duplicate arguments in content_for tags', async () => {
|
|
12
|
-
const sourceCode = `
|
|
13
|
-
{% content_for 'block', type: 'fake-block', param1: 'value1', param2: 'value2', param1: 'value3' %}
|
|
14
|
-
`;
|
|
15
|
-
|
|
16
|
-
const offenses = await runCheck(sourceCode);
|
|
17
|
-
|
|
18
|
-
expect(offenses).toHaveLength(1);
|
|
19
|
-
expect(offenses[0].message).toMatch(/Duplicate argument 'param1'/);
|
|
20
|
-
expect(offenses[0].suggest).toBeDefined();
|
|
21
|
-
expect(offenses[0].suggest!.length).toBe(1);
|
|
22
|
-
expect(offenses[0].suggest![0].message).toBe("Remove duplicate argument 'param1'");
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('should report multiple duplicate arguments in content_for tags', async () => {
|
|
26
|
-
const sourceCode = `
|
|
27
|
-
{% content_for 'block', type: 'fake-block', param1: 'value1', param2: 'value2', param1: 'value3', param2: 'value4', param1: 'value5' %}
|
|
28
|
-
`;
|
|
29
|
-
|
|
30
|
-
const offenses = await runCheck(sourceCode);
|
|
31
|
-
|
|
32
|
-
expect(offenses).toHaveLength(3);
|
|
33
|
-
expect(offenses[0].message).toMatch(/Duplicate argument 'param1'/);
|
|
34
|
-
expect(offenses[0].start.index).toBe(sourceCode.indexOf("param1: 'value3'"));
|
|
35
|
-
expect(offenses[1].message).toMatch(/Duplicate argument 'param2'/);
|
|
36
|
-
expect(offenses[1].start.index).toBe(sourceCode.indexOf("param2: 'value4'"));
|
|
37
|
-
expect(offenses[2].message).toMatch(/Duplicate argument 'param1'/);
|
|
38
|
-
expect(offenses[2].start.index).toBe(sourceCode.indexOf("param1: 'value5'"));
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
describe('suggestions', () => {
|
|
43
|
-
it('should correctly suggest fixing all duplicate arguments except for the first', async () => {
|
|
44
|
-
const sourceCode = `{% content_for 'block', type: 'fake-block', param1: 'value1', param2: 'value2', param1: 'value3', param1: 'value4' %}`;
|
|
45
|
-
const offenses = await runCheck(sourceCode);
|
|
46
|
-
|
|
47
|
-
expect(offenses).toHaveLength(2);
|
|
48
|
-
expect(offenses[0].start.index).toBe(sourceCode.indexOf("param1: 'value3'"));
|
|
49
|
-
expect(offenses[1].start.index).toBe(sourceCode.indexOf("param1: 'value4'"));
|
|
50
|
-
const suggestionResult = applySuggestions(sourceCode, offenses[0]);
|
|
51
|
-
expect(suggestionResult).toEqual([
|
|
52
|
-
`{% content_for 'block', type: 'fake-block', param1: 'value1', param2: 'value2', param1: 'value4' %}`,
|
|
53
|
-
]);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
describe('edge cases', () => {
|
|
58
|
-
it('should not report when there are no duplicate arguments', async () => {
|
|
59
|
-
const sourceCode = `
|
|
60
|
-
{% content_for 'block', type: 'fake-block', param1: 'value1', param2: 'value2', param3: 'value3' %}
|
|
61
|
-
`;
|
|
62
|
-
|
|
63
|
-
const offenses = await runCheck(sourceCode);
|
|
64
|
-
|
|
65
|
-
expect(offenses).toHaveLength(0);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('should not report for variable render tags where partial name is a variable', async () => {
|
|
69
|
-
const sourceCode = `
|
|
70
|
-
{% render my_variable, param1: 'value1', param1: 'value2' %}
|
|
71
|
-
`;
|
|
72
|
-
|
|
73
|
-
const offenses = await runCheck(sourceCode);
|
|
74
|
-
|
|
75
|
-
expect(offenses).toHaveLength(0);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('should handle remove duplicate param when there are multiple render tags', async () => {
|
|
79
|
-
const sourceCode = `
|
|
80
|
-
{% content_for 'block', type: 'fake-block', param1: 'value1', param2: 'value2', param3: 'value3' %}
|
|
81
|
-
{% content_for 'block', type: 'fake-block', param1: 'value4', param2: 'value5', param1: 'value6' %}
|
|
82
|
-
`;
|
|
83
|
-
|
|
84
|
-
const offenses = await runCheck(sourceCode);
|
|
85
|
-
|
|
86
|
-
expect(offenses).toHaveLength(1);
|
|
87
|
-
expect(offenses[0].message).toMatch(/Duplicate argument 'param1'/);
|
|
88
|
-
expect(offenses[0].start.index).toBe(sourceCode.indexOf("param1: 'value6'"));
|
|
89
|
-
const suggestionResult = applySuggestions(sourceCode, offenses[0]);
|
|
90
|
-
expect(suggestionResult).toEqual([
|
|
91
|
-
`
|
|
92
|
-
{% content_for 'block', type: 'fake-block', param1: 'value1', param2: 'value2', param3: 'value3' %}
|
|
93
|
-
{% content_for 'block', type: 'fake-block', param1: 'value4', param2: 'value5' %}
|
|
94
|
-
`,
|
|
95
|
-
]);
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
});
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
|
|
2
|
-
import { ContentForMarkup, LiquidNamedArgument } from '@platformos/liquid-html-parser';
|
|
3
|
-
import { getBlockName, reportDuplicateArguments } from '../../liquid-doc/arguments';
|
|
4
|
-
|
|
5
|
-
export const DuplicateContentForArguments: LiquidCheckDefinition = {
|
|
6
|
-
meta: {
|
|
7
|
-
code: 'DuplicateContentForArguments',
|
|
8
|
-
name: 'Duplicate ContentFor Arguments',
|
|
9
|
-
docs: {
|
|
10
|
-
description:
|
|
11
|
-
'This check ensures that no duplicate argument names are provided when rendering a static block.',
|
|
12
|
-
recommended: true,
|
|
13
|
-
url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/duplicate-content-for-arguments',
|
|
14
|
-
},
|
|
15
|
-
type: SourceCodeType.LiquidHtml,
|
|
16
|
-
severity: Severity.WARNING,
|
|
17
|
-
schema: {},
|
|
18
|
-
targets: [],
|
|
19
|
-
},
|
|
20
|
-
|
|
21
|
-
create(context) {
|
|
22
|
-
return {
|
|
23
|
-
async ContentForMarkup(node: ContentForMarkup) {
|
|
24
|
-
const blockName = getBlockName(node);
|
|
25
|
-
|
|
26
|
-
if (!blockName) return;
|
|
27
|
-
|
|
28
|
-
const encounteredArgNames = new Set<string>();
|
|
29
|
-
const duplicateArgs: LiquidNamedArgument[] = [];
|
|
30
|
-
|
|
31
|
-
for (const param of node.args) {
|
|
32
|
-
if (encounteredArgNames.has(param.name)) {
|
|
33
|
-
duplicateArgs.push(param);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
encounteredArgNames.add(param.name);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
reportDuplicateArguments(context, node, duplicateArgs, blockName);
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
},
|
|
43
|
-
};
|