@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,126 +0,0 @@
|
|
|
1
|
-
import { NamedTags, NodeTypes } from '@platformos/liquid-html-parser';
|
|
2
|
-
import { getLocEnd, getLocStart, nodeAtPath } from '../../json';
|
|
3
|
-
import { getSchema } from '../../to-schema';
|
|
4
|
-
import { ArrayNode, LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
|
|
5
|
-
import { isContentForBlock } from '../../utils/markup';
|
|
6
|
-
|
|
7
|
-
export const SchemaPresetsStaticBlocks: LiquidCheckDefinition = {
|
|
8
|
-
meta: {
|
|
9
|
-
code: 'SchemaPresetsStaticBlocks',
|
|
10
|
-
name: 'Ensure the preset static blocks are used in the liquid',
|
|
11
|
-
docs: {
|
|
12
|
-
description:
|
|
13
|
-
'Warns if a preset static block does not have a corresponding content_for "block" tag.',
|
|
14
|
-
recommended: true,
|
|
15
|
-
url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/schema-presets-static-blocks',
|
|
16
|
-
},
|
|
17
|
-
type: SourceCodeType.LiquidHtml,
|
|
18
|
-
severity: Severity.ERROR,
|
|
19
|
-
schema: {},
|
|
20
|
-
targets: [],
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
create(context) {
|
|
24
|
-
type contentForBlock = {
|
|
25
|
-
id: string;
|
|
26
|
-
type: string;
|
|
27
|
-
};
|
|
28
|
-
type StaticBlock = {
|
|
29
|
-
id: string;
|
|
30
|
-
type: string;
|
|
31
|
-
startIndex: number;
|
|
32
|
-
endIndex: number;
|
|
33
|
-
};
|
|
34
|
-
let contentForBlockList: contentForBlock[] = [];
|
|
35
|
-
let staticBlockList: StaticBlock[] = [];
|
|
36
|
-
let offset: number = 0;
|
|
37
|
-
|
|
38
|
-
function checkStaticBlocks() {
|
|
39
|
-
staticBlockList.forEach((block) => {
|
|
40
|
-
if (
|
|
41
|
-
!contentForBlockList.some(
|
|
42
|
-
(contentBlock) => contentBlock.id === block.id && contentBlock.type === block.type,
|
|
43
|
-
)
|
|
44
|
-
) {
|
|
45
|
-
context.report({
|
|
46
|
-
message: `Static block ${block.id} is missing a corresponding content_for "block" tag.`,
|
|
47
|
-
startIndex: block.startIndex,
|
|
48
|
-
endIndex: block.endIndex,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return {
|
|
55
|
-
async LiquidTag(node) {
|
|
56
|
-
// Early return if not a content_for block tag
|
|
57
|
-
if (node.name !== NamedTags.content_for || !isContentForBlock(node.markup)) return;
|
|
58
|
-
|
|
59
|
-
// Extract id and type from markup args
|
|
60
|
-
const idValue = node.markup.args.find((arg) => arg.name === 'id')?.value;
|
|
61
|
-
const typeArg = node.markup.args.find((arg) => arg.name === 'type')?.value;
|
|
62
|
-
if (!typeArg || typeArg.type !== NodeTypes.String) {
|
|
63
|
-
return; // covered by VariableContentForArguments
|
|
64
|
-
}
|
|
65
|
-
const typeValue = typeArg.value;
|
|
66
|
-
|
|
67
|
-
// Add to list if valid string id
|
|
68
|
-
if (idValue?.type === NodeTypes.String) {
|
|
69
|
-
contentForBlockList.push({ id: idValue.value, type: typeValue });
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
|
|
73
|
-
async LiquidRawTag(node) {
|
|
74
|
-
// when we get the schema tag, get the list of static blocks from each preset
|
|
75
|
-
if (node.name === 'schema' && node.body.kind === 'json') {
|
|
76
|
-
offset = node.blockStartPosition.end;
|
|
77
|
-
const schema = await getSchema(context);
|
|
78
|
-
const { validSchema, ast } = schema ?? {};
|
|
79
|
-
if (!validSchema || validSchema instanceof Error) return;
|
|
80
|
-
if (!ast || ast instanceof Error) return;
|
|
81
|
-
|
|
82
|
-
const presets = validSchema.presets;
|
|
83
|
-
if (!presets) return;
|
|
84
|
-
|
|
85
|
-
presets.forEach((preset, index) => {
|
|
86
|
-
if ('blocks' in preset && preset.blocks) {
|
|
87
|
-
let ast_path: any[] = ['presets', index, 'blocks'];
|
|
88
|
-
// blocks as an array
|
|
89
|
-
if (Array.isArray(preset.blocks)) {
|
|
90
|
-
preset.blocks.forEach((block, block_index) => {
|
|
91
|
-
if (block.static === true && block.id) {
|
|
92
|
-
let node = nodeAtPath(ast, ast_path.concat([block_index]))! as ArrayNode;
|
|
93
|
-
staticBlockList.push({
|
|
94
|
-
id: block.id,
|
|
95
|
-
type: block.type,
|
|
96
|
-
startIndex: offset + getLocStart(node),
|
|
97
|
-
endIndex: offset + getLocEnd(node),
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
// blocks as an object
|
|
103
|
-
else if (typeof preset.blocks === 'object') {
|
|
104
|
-
Object.entries(preset.blocks).forEach(([block_id, block]) => {
|
|
105
|
-
if (block.static === true) {
|
|
106
|
-
let node = nodeAtPath(ast, ast_path.concat(block_id))! as ArrayNode;
|
|
107
|
-
staticBlockList.push({
|
|
108
|
-
id: block_id,
|
|
109
|
-
type: block.type,
|
|
110
|
-
startIndex: offset + getLocStart(node),
|
|
111
|
-
endIndex: offset + getLocEnd(node),
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
|
|
121
|
-
async onCodePathEnd() {
|
|
122
|
-
checkStaticBlocks();
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
},
|
|
126
|
-
};
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
import { check, highlightedOffenses } from '../../test';
|
|
2
|
-
import { expect, describe, it } from 'vitest';
|
|
3
|
-
import { StaticStylesheetAndJavascriptTags } from './index';
|
|
4
|
-
|
|
5
|
-
describe('Module: StaticStylesheetAndJavascriptTags', () => {
|
|
6
|
-
it('should not report errors for static CSS content in stylesheet tags', async () => {
|
|
7
|
-
const theme = {
|
|
8
|
-
'templates/test.liquid': `
|
|
9
|
-
{% stylesheet %}
|
|
10
|
-
.button {
|
|
11
|
-
background-color: blue;
|
|
12
|
-
color: white;
|
|
13
|
-
padding: 10px 20px;
|
|
14
|
-
}
|
|
15
|
-
{% endstylesheet %}
|
|
16
|
-
`,
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
20
|
-
expect(offenses).to.have.length(0);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('should not report errors for static JavaScript content in javascript tags', async () => {
|
|
24
|
-
const theme = {
|
|
25
|
-
'templates/test.liquid': `
|
|
26
|
-
{% javascript %}
|
|
27
|
-
function greet(name) {
|
|
28
|
-
console.log('Hello, ' + name + '!');
|
|
29
|
-
}
|
|
30
|
-
greet('World');
|
|
31
|
-
{% endjavascript %}
|
|
32
|
-
`,
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
36
|
-
expect(offenses).to.have.length(0);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('should report error for liquid variable in stylesheet tag', async () => {
|
|
40
|
-
const theme = {
|
|
41
|
-
'templates/test.liquid': `
|
|
42
|
-
{% stylesheet %}
|
|
43
|
-
.button {
|
|
44
|
-
background-color: {{ settings.button_color }};
|
|
45
|
-
color: white;
|
|
46
|
-
}
|
|
47
|
-
{% endstylesheet %}
|
|
48
|
-
`,
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
52
|
-
expect(offenses).to.have.length(1);
|
|
53
|
-
expect(offenses[0].message).to.equal(
|
|
54
|
-
'Liquid variable found in CSS block. {% stylesheet %} tags should only contain static CSS code.',
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
const highlights = highlightedOffenses(theme, offenses);
|
|
58
|
-
expect(highlights).to.eql(['{{ settings.button_color }}']);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('should report error for liquid variable in javascript tag', async () => {
|
|
62
|
-
const theme = {
|
|
63
|
-
'templates/test.liquid': `
|
|
64
|
-
{% javascript %}
|
|
65
|
-
const apiUrl = '{{ shop.url }}';
|
|
66
|
-
fetch(apiUrl);
|
|
67
|
-
{% endjavascript %}
|
|
68
|
-
`,
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
72
|
-
expect(offenses).to.have.length(1);
|
|
73
|
-
expect(offenses[0].message).to.equal(
|
|
74
|
-
'Liquid variable found in JavaScript block. {% javascript %} tags should only contain static JavaScript code.',
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
const highlights = highlightedOffenses(theme, offenses);
|
|
78
|
-
expect(highlights).to.eql(['{{ shop.url }}']);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('should report error for liquid tag in stylesheet tag', async () => {
|
|
82
|
-
const theme = {
|
|
83
|
-
'templates/test.liquid': `
|
|
84
|
-
{% stylesheet %}
|
|
85
|
-
.button {
|
|
86
|
-
{% if settings.enable_hover %}
|
|
87
|
-
background-color: blue;
|
|
88
|
-
{% endif %}
|
|
89
|
-
}
|
|
90
|
-
{% endstylesheet %}
|
|
91
|
-
`,
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
95
|
-
expect(offenses).to.have.length(1);
|
|
96
|
-
expect(offenses[0].message).to.equal(
|
|
97
|
-
'Liquid tag found in CSS block. {% stylesheet %} tags should only contain static CSS code.',
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
const highlights = highlightedOffenses(theme, offenses);
|
|
101
|
-
expect(highlights).to.eql([
|
|
102
|
-
`{% if settings.enable_hover %}
|
|
103
|
-
background-color: blue;
|
|
104
|
-
{% endif %}`,
|
|
105
|
-
]);
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('should report error for liquid tag in javascript tag', async () => {
|
|
109
|
-
const theme = {
|
|
110
|
-
'templates/test.liquid': `
|
|
111
|
-
{% javascript %}
|
|
112
|
-
{% if settings.enable_analytics %}
|
|
113
|
-
console.log('Analytics enabled');
|
|
114
|
-
{% endif %}
|
|
115
|
-
{% endjavascript %}
|
|
116
|
-
`,
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
120
|
-
expect(offenses).to.have.length(1);
|
|
121
|
-
expect(offenses[0].message).to.equal(
|
|
122
|
-
'Liquid tag found in JavaScript block. {% javascript %} tags should only contain static JavaScript code.',
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
const highlights = highlightedOffenses(theme, offenses);
|
|
126
|
-
expect(highlights).to.eql([
|
|
127
|
-
`{% if settings.enable_analytics %}
|
|
128
|
-
console.log('Analytics enabled');
|
|
129
|
-
{% endif %}`,
|
|
130
|
-
]);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it('should report multiple errors for multiple liquid nodes', async () => {
|
|
134
|
-
const theme = {
|
|
135
|
-
'templates/test.liquid': `
|
|
136
|
-
{% stylesheet %}
|
|
137
|
-
.button {
|
|
138
|
-
background-color: {{ settings.button_color }};
|
|
139
|
-
{% if settings.show_border %}
|
|
140
|
-
border: 1px solid {{ settings.border_color }};
|
|
141
|
-
{% endif %}
|
|
142
|
-
}
|
|
143
|
-
{% endstylesheet %}
|
|
144
|
-
`,
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
148
|
-
expect(offenses).to.have.length(2);
|
|
149
|
-
expect(offenses[0].message).to.include('Liquid variable found in CSS block');
|
|
150
|
-
expect(offenses[1].message).to.include('Liquid tag found in CSS block');
|
|
151
|
-
|
|
152
|
-
const highlights = highlightedOffenses(theme, offenses);
|
|
153
|
-
expect(highlights).to.eql([
|
|
154
|
-
'{{ settings.button_color }}',
|
|
155
|
-
`{% if settings.show_border %}
|
|
156
|
-
border: 1px solid {{ settings.border_color }};
|
|
157
|
-
{% endif %}`,
|
|
158
|
-
]);
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
it('should not report errors for other raw tags like schema', async () => {
|
|
162
|
-
const theme = {
|
|
163
|
-
'sections/test.liquid': `
|
|
164
|
-
{% schema %}
|
|
165
|
-
{
|
|
166
|
-
"name": "Section",
|
|
167
|
-
"settings": [
|
|
168
|
-
{
|
|
169
|
-
"id": "color",
|
|
170
|
-
"type": "color",
|
|
171
|
-
"default": "{{ settings.default_color }}"
|
|
172
|
-
}
|
|
173
|
-
]
|
|
174
|
-
}
|
|
175
|
-
{% endschema %}
|
|
176
|
-
`,
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
180
|
-
expect(offenses).to.have.length(0);
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
it('should not report errors for liquid in regular content outside raw tags', async () => {
|
|
184
|
-
const theme = {
|
|
185
|
-
'templates/test.liquid': `
|
|
186
|
-
<div style="color: {{ settings.text_color }};">
|
|
187
|
-
{% if product.available %}
|
|
188
|
-
<button>Buy now</button>
|
|
189
|
-
{% endif %}
|
|
190
|
-
</div>
|
|
191
|
-
|
|
192
|
-
{% stylesheet %}
|
|
193
|
-
.static-style {
|
|
194
|
-
margin: 10px;
|
|
195
|
-
}
|
|
196
|
-
{% endstylesheet %}
|
|
197
|
-
`,
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
201
|
-
expect(offenses).to.have.length(0);
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it('should report nested raw tags inside stylesheet tags', async () => {
|
|
205
|
-
const theme = {
|
|
206
|
-
'templates/test.liquid': `
|
|
207
|
-
{% stylesheet %}
|
|
208
|
-
/* This should trigger an error */
|
|
209
|
-
{% raw %}
|
|
210
|
-
.nested { color: red; }
|
|
211
|
-
{% endraw %}
|
|
212
|
-
{% endstylesheet %}
|
|
213
|
-
`,
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
217
|
-
expect(offenses).to.have.length(1);
|
|
218
|
-
expect(offenses[0].message).to.include('Liquid tag found in CSS block');
|
|
219
|
-
|
|
220
|
-
const highlights = highlightedOffenses(theme, offenses);
|
|
221
|
-
expect(highlights).to.eql([
|
|
222
|
-
`{% raw %}
|
|
223
|
-
.nested { color: red; }
|
|
224
|
-
{% endraw %}`,
|
|
225
|
-
]);
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
it('should not report offenses for empty stylesheet and javascript blocks', async () => {
|
|
229
|
-
const theme = {
|
|
230
|
-
'templates/test.liquid': `
|
|
231
|
-
{% stylesheet %}
|
|
232
|
-
{% endstylesheet %}
|
|
233
|
-
|
|
234
|
-
{% javascript %}
|
|
235
|
-
{% endjavascript %}
|
|
236
|
-
`,
|
|
237
|
-
};
|
|
238
|
-
|
|
239
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
240
|
-
expect(offenses).to.have.length(0);
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
it('should not report errors for liquid in style tags (different from stylesheet)', async () => {
|
|
244
|
-
const theme = {
|
|
245
|
-
'templates/test.liquid': `
|
|
246
|
-
{% style %}
|
|
247
|
-
.button {
|
|
248
|
-
color: {{ settings.color }};
|
|
249
|
-
}
|
|
250
|
-
{% endstyle %}
|
|
251
|
-
`,
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
const offenses = await check(theme, [StaticStylesheetAndJavascriptTags]);
|
|
255
|
-
expect(offenses).to.have.length(0);
|
|
256
|
-
});
|
|
257
|
-
});
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { NodeTypes } from '@platformos/liquid-html-parser';
|
|
2
|
-
import { LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
|
|
3
|
-
|
|
4
|
-
export const StaticStylesheetAndJavascriptTags: LiquidCheckDefinition = {
|
|
5
|
-
meta: {
|
|
6
|
-
code: 'StaticStylesheetAndJavascriptTags',
|
|
7
|
-
name: 'Reports non static stylesheet and javascript tags',
|
|
8
|
-
docs: {
|
|
9
|
-
description:
|
|
10
|
-
'Reports the usage of Liquid within {% stylesheet %} and {% javascript %} tags, which should only contain static content.',
|
|
11
|
-
recommended: true,
|
|
12
|
-
url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/static-stylesheet-and-javascript-tags',
|
|
13
|
-
},
|
|
14
|
-
type: SourceCodeType.LiquidHtml,
|
|
15
|
-
severity: Severity.ERROR,
|
|
16
|
-
schema: {},
|
|
17
|
-
targets: [],
|
|
18
|
-
},
|
|
19
|
-
|
|
20
|
-
create(context) {
|
|
21
|
-
return {
|
|
22
|
-
async LiquidRawTag(node) {
|
|
23
|
-
if (node.name !== 'stylesheet' && node.name !== 'javascript') {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const liquidNodes = node.body.nodes.filter(
|
|
28
|
-
(childNode) =>
|
|
29
|
-
childNode.type === NodeTypes.LiquidVariableOutput ||
|
|
30
|
-
childNode.type === NodeTypes.LiquidTag ||
|
|
31
|
-
childNode.type === NodeTypes.LiquidRawTag,
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
for (const liquidNode of liquidNodes) {
|
|
35
|
-
const tagType = node.name === 'stylesheet' ? 'CSS' : 'JavaScript';
|
|
36
|
-
const liquidType =
|
|
37
|
-
liquidNode.type === NodeTypes.LiquidVariableOutput ? 'variable' : 'tag';
|
|
38
|
-
|
|
39
|
-
context.report({
|
|
40
|
-
message: `Liquid ${liquidType} found in ${tagType} block. {% ${node.name} %} tags should only contain static ${tagType} code.`,
|
|
41
|
-
startIndex: liquidNode.position.start,
|
|
42
|
-
endIndex: liquidNode.position.end,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
},
|
|
48
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { expect, describe, it } from 'vitest';
|
|
2
|
-
import { UniqueSettingIds } from './index';
|
|
3
|
-
import { highlightedOffenses, runJSONCheck } from '../../test';
|
|
4
|
-
import { invalidJson, validJson } from './test-data';
|
|
5
|
-
|
|
6
|
-
describe('Module: UniqueSettingIds', () => {
|
|
7
|
-
it("Should report an error for duplicate id's in settings_schema (0)", async () => {
|
|
8
|
-
const offenses = await runJSONCheck(UniqueSettingIds, invalidJson, 'file.json');
|
|
9
|
-
|
|
10
|
-
expect(offenses).to.have.length(1);
|
|
11
|
-
expect(offenses[0].message).to.equal('Duplicate setting id found: "nosto_account_id"');
|
|
12
|
-
|
|
13
|
-
const highlights = highlightedOffenses({ 'file.json': invalidJson }, offenses);
|
|
14
|
-
|
|
15
|
-
expect(highlights).to.have.length(1);
|
|
16
|
-
expect(highlights[0]).to.equal('"id": "nosto_account_id"');
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it('should not report any errors for valid file', async () => {
|
|
20
|
-
const offenses = await runJSONCheck(UniqueSettingIds, validJson);
|
|
21
|
-
|
|
22
|
-
expect(offenses).to.be.empty;
|
|
23
|
-
});
|
|
24
|
-
});
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
isArrayNode,
|
|
3
|
-
isLiteralNode,
|
|
4
|
-
isObjectNode,
|
|
5
|
-
isPropertyNode,
|
|
6
|
-
Severity,
|
|
7
|
-
SourceCodeType,
|
|
8
|
-
} from '../../types';
|
|
9
|
-
|
|
10
|
-
import type { ArrayNode, PropertyNode, JSONCheckDefinition } from '../../types';
|
|
11
|
-
|
|
12
|
-
export const UniqueSettingIds: JSONCheckDefinition = {
|
|
13
|
-
meta: {
|
|
14
|
-
code: 'UniqueSettingId',
|
|
15
|
-
name: 'Prevent duplicate Ids in setting_schema',
|
|
16
|
-
docs: {
|
|
17
|
-
description: 'This check is aimed at eliminating duplicate Ids in settings_schema.json',
|
|
18
|
-
recommended: true,
|
|
19
|
-
// url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/valid-schema',
|
|
20
|
-
},
|
|
21
|
-
type: SourceCodeType.JSON,
|
|
22
|
-
severity: Severity.ERROR,
|
|
23
|
-
schema: {},
|
|
24
|
-
targets: [],
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
create(context) {
|
|
28
|
-
return {
|
|
29
|
-
async onCodePathEnd(file) {
|
|
30
|
-
if (isArrayNode(file.ast)) {
|
|
31
|
-
const settingIds: PropertyNode[] = [];
|
|
32
|
-
|
|
33
|
-
/* Find and loop through all of our nodes that have an id value and find their key value */
|
|
34
|
-
for (const child of file.ast.children) {
|
|
35
|
-
if (isObjectNode(child) && child.children) {
|
|
36
|
-
const settingsNode = child.children.find((node) => node.key.value === 'settings');
|
|
37
|
-
|
|
38
|
-
if (settingsNode && settingsNode.value && isArrayNode(settingsNode.value)) {
|
|
39
|
-
for (const setting of settingsNode.value.children) {
|
|
40
|
-
if (isObjectNode(setting) && setting.children) {
|
|
41
|
-
const idNode = setting.children.find((node) => node.key.value === 'id');
|
|
42
|
-
if (isPropertyNode(idNode)) {
|
|
43
|
-
settingIds.push(idNode);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/* Check for dupes */
|
|
52
|
-
const idMap = new Map<string, PropertyNode[]>();
|
|
53
|
-
for (const node of settingIds) {
|
|
54
|
-
if (isLiteralNode(node.value)) {
|
|
55
|
-
const id = node.value.value;
|
|
56
|
-
if (typeof id === 'string') {
|
|
57
|
-
if (!idMap.has(id)) {
|
|
58
|
-
idMap.set(id, []);
|
|
59
|
-
}
|
|
60
|
-
idMap.get(id)!.push(node);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const duplicates: [string, PropertyNode[]][] = Array.from(idMap.entries()).filter(
|
|
66
|
-
([_, nodes]) => nodes.length > 1,
|
|
67
|
-
);
|
|
68
|
-
|
|
69
|
-
if (duplicates.length > 0) {
|
|
70
|
-
for (const [id, nodes] of duplicates) {
|
|
71
|
-
const lastNodeFound = nodes[nodes.length - 1];
|
|
72
|
-
|
|
73
|
-
context.report({
|
|
74
|
-
message: `Duplicate setting id found: "${id}"`,
|
|
75
|
-
startIndex: lastNodeFound.loc.start.offset,
|
|
76
|
-
endIndex: lastNodeFound.loc.end.offset,
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
};
|
|
83
|
-
},
|
|
84
|
-
};
|